/*++ Copyright (c) 1999 Microsoft Corporation Module Name: ipaddr.c Abstract: add/del ip addresses to an adapter Author: Charlie Wickham (charlwi) 03-Nov-00 Environment: User mode Revision History: --*/ #define UNICODE 1 #define _UNICODE 1 #include #include #include #include #include typedef enum { OpAdd = 1, OpDel, OpCycle } OPERATION; int __cdecl wmain( int argc, WCHAR *argv[] ) /*++ Routine Description: main routine for utility Arguments: -add -del -cycle Return Value: 0 if it worked successfully --*/ { DWORD status; DWORD adapterIndex; struct in_addr ipAddress; struct in_addr ipMask; OPERATION opCode; DWORD nteContext; DWORD nteInstance; HANDLE mprConfig; WCHAR guidName[64] = L"\\DEVICE\\TCPIP_"; if ( argc < 2 ) { printf("%ws -add address mask\n", argv[0] ); printf("%ws -cycle address mask \n", argv[0] ); printf("%ws -del \n", argv[0] ); return 0; } switch (*(argv[1]+1)) { case L'a': case L'A': opCode = OpAdd; break; case L'd': case L'D': opCode = OpDel; break; case L'c': case L'C': opCode = OpCycle; break; default: printf("invalid command: use -add, -del, or -cycle\n"); return 0; } if ( opCode == OpAdd && argc < 5 ) { printf("invalid arg: %ws -add address mask\n", argv[0] ); return 0; } else if ( opCode == OpCycle && argc < 6 ) { printf("invalid arg: %ws -cycle address mask \n", argv[0] ); return 0; } else if ( opCode == OpDel && argc < 3 ) { printf("invalid arg: %ws -del \n", argv[0] ); return 0; } if ( opCode == OpAdd || opCode == OpCycle ) { DWORD byte1; DWORD byte2; DWORD byte3; DWORD byte4; status = MprConfigServerConnect( NULL, &mprConfig ); if ( status != NO_ERROR ) { printf("Can't get handle to MprConfig - %u\n", status ); return status; } status = MprConfigGetGuidName(mprConfig, argv[2], &guidName[14], sizeof(guidName )); if (status != NO_ERROR ) { printf("Can't get GUID name for '%ws' - %u\n", argv[2], status ); } status = GetAdapterIndex( guidName, &adapterIndex ); if ( status != NO_ERROR ) { printf("Error getting adapter index for '%ws' - %u\n", guidName, status); return status; } swscanf(argv[3], L"%u.%u.%u.%u", &byte1, &byte2, &byte3, &byte4); ipAddress.S_un.S_un_b.s_b1 = (CHAR)byte1; ipAddress.S_un.S_un_b.s_b2 = (CHAR)byte2; ipAddress.S_un.S_un_b.s_b3 = (CHAR)byte3; ipAddress.S_un.S_un_b.s_b4 = (CHAR)byte4; swscanf(argv[4], L"%u.%u.%u.%u", &byte1, &byte2, &byte3, &byte4); ipMask.S_un.S_un_b.s_b1 = (CHAR)byte1; ipMask.S_un.S_un_b.s_b2 = (CHAR)byte2; ipMask.S_un.S_un_b.s_b3 = (CHAR)byte3; ipMask.S_un.S_un_b.s_b4 = (CHAR)byte4; } if ( opCode == OpAdd ) { status = AddIPAddress((IPAddr)ipAddress.s_addr, (IPMask)ipMask.s_addr, adapterIndex, &nteContext, &nteInstance); if ( status == NO_ERROR ) { printf("Added IP address %ws with mask %ws to adapter '%ws'\n", argv[3], argv[4], argv[2]); printf("NTE context to use with delete: %u\n", nteContext); } else { printf("Failed to add IP address %ws with mask %ws to adapter '%ws' - %u\n", argv[3], argv[4], argv[2], status); } } else if ( opCode == OpDel ) { nteContext = _wtoi( argv[2] ); status = DeleteIPAddress( nteContext ); printf("Delete status = %u\n", status ); } else if ( opCode == OpCycle ) { DWORD sleepTime = _wtoi( argv[5] ); do { status = AddIPAddress((IPAddr)ipAddress.s_addr, (IPMask)ipMask.s_addr, adapterIndex, &nteContext, &nteInstance); if ( status == NO_ERROR ) { printf("Added IP address %ws with mask %ws to adapter '%ws'\n", argv[3], argv[4], argv[2]); printf("NTE context to use with delete: %u\n", nteContext); } else { printf("Failed to add IP address %ws with mask %ws to adapter '%ws' - %u\n", argv[3], argv[4], argv[2], status); return status; } Sleep( sleepTime * 1000 ); status = DeleteIPAddress( nteContext ); printf("Delete status = %u\n", status ); Sleep( sleepTime * 1000 ); } while ( TRUE ); } return 0; } // wmain /* end ipaddr.c */