/*++ Copyright (c) 2000, Microsoft Corporation Module Name: irdp.c Abstract: This module implements a utility to manipulate the TCP/IP driver's ICMP router-discovery (IRDP) settings. Author: Abolade Gbadegesin (aboladeg) 11-May-1999 Revision History: --*/ #define _PNP_POWER_ #include #include #include #include #include #include #include #include #include const char IrdpEnabled[] = "IrdpEnabled"; const char IrdpDisabled[] = "IrdpDisabled"; const char IrdpDisabledUseDhcp[] = "IrdpDisabledUseDhcp"; const char Option31On[] = "Option31On"; const char Option31Off[] = "Option31Off"; const char Option31Absent[] = "Option31Absent"; int __cdecl main( int argc, char* argv[] ) { PIP_ADAPTER_INFO AdapterInfo; ANSI_STRING AnsiString; UNICODE_STRING BindList; UCHAR Buffer[4192]; CHAR Device[80] = "\\Device\\"; ULONG Error; ULONG Index; UNICODE_STRING LowerComponent; IP_PNP_RECONFIG_REQUEST Request; ULONG Size; WCHAR Tcpip[] = L"Tcpip"; UNICODE_STRING UpperComponent; ZeroMemory(&Request, sizeof(Request)); Request.version = IP_PNP_RECONFIG_VERSION; if (argc != 4) { Error = TRUE; } else { Error = FALSE; Index = atol(argv[1]); AdapterInfo = (PIP_ADAPTER_INFO)Buffer; Size = sizeof(Buffer); if (GetAdaptersInfo(AdapterInfo, &Size) != NO_ERROR) { Error = TRUE; } else { PIP_ADAPTER_INFO ai; for (ai = AdapterInfo; ai; ai = ai->Next) { if (ai->Index == Index) { strncat(Device, ai->AdapterName, RTL_NUMBER_OF(Device) - strlen(Device) - 1); break; } } if (!ai) { Error = TRUE; } } Request.Flags |= IP_PNP_FLAG_PERFORM_ROUTER_DISCOVERY; if (lstrcmpi(argv[2], IrdpEnabled) == 0) { Request.PerformRouterDiscovery = IP_IRDP_ENABLED; } else if (lstrcmpi(argv[2], IrdpDisabled) == 0) { Request.PerformRouterDiscovery = IP_IRDP_DISABLED; } else if (lstrcmpi(argv[2], IrdpDisabledUseDhcp) == 0) { Request.PerformRouterDiscovery = IP_IRDP_DISABLED_USE_DHCP; } else { Error = TRUE; } if (lstrcmpi(argv[3], Option31On) == 0) { Request.Flags |= IP_PNP_FLAG_DHCP_PERFORM_ROUTER_DISCOVERY; Request.DhcpPerformRouterDiscovery = TRUE; } else if (lstrcmpi(argv[3], Option31Off) == 0) { Request.Flags |= IP_PNP_FLAG_DHCP_PERFORM_ROUTER_DISCOVERY; Request.DhcpPerformRouterDiscovery = FALSE; } else if (lstrcmpi(argv[3], Option31Absent) == 0) { // leave the field blank. } else { Error = TRUE; } } if (Error) { printf("Usage:\n"); printf( "irdp \n" " <%s|%s|%s>\n" " <%s|%s|%s>\n\n", IrdpEnabled, IrdpDisabled, IrdpDisabledUseDhcp, Option31On, Option31Off, Option31Absent ); printf("<%s|%s|%s>:\n", IrdpEnabled, IrdpDisabled, IrdpDisabledUseDhcp); printf(" indicates the local setting for IRDP\n\n"); printf("<%s|%s|%s>:\n", Option31On, Option31Off, Option31Absent); printf(" simulates the setting of DHCP option 31\n\n"); return 0; } printf("Device: %d [%s]\n", Index, Device); RtlInitUnicodeString(&UpperComponent, Tcpip); RtlInitAnsiString(&AnsiString, Device); RtlInitUnicodeString(&LowerComponent, NULL); RtlAnsiStringToUnicodeString(&LowerComponent, &AnsiString, TRUE); RtlInitUnicodeString(&BindList, NULL); Error = NdisHandlePnPEvent( NDIS, RECONFIGURE, &LowerComponent, &UpperComponent, &BindList, &Request, sizeof(Request) ); RtlFreeUnicodeString(&LowerComponent); printf("NdisHandlePnPEvent: %d\n", Error); return 0; }