mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
5.4 KiB
220 lines
5.4 KiB
/*++
|
|
|
|
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 <windows.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <winsock2.h>
|
|
#include <iphlpapi.h>
|
|
|
|
typedef enum {
|
|
OpAdd = 1,
|
|
OpDel,
|
|
OpCycle
|
|
} OPERATION;
|
|
|
|
int __cdecl
|
|
wmain(
|
|
int argc,
|
|
WCHAR *argv[]
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
main routine for utility
|
|
|
|
Arguments:
|
|
|
|
-add <Adapter name> <Ip addr>
|
|
-del <NTE context>
|
|
-cycle <Adapter name> <Ip addr>
|
|
|
|
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 <adapter name> address mask\n", argv[0] );
|
|
printf("%ws -cycle <adapter name> address mask <cycle sleep time>\n", argv[0] );
|
|
printf("%ws -del <NTE context>\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 <adapter name> address mask\n", argv[0] );
|
|
return 0;
|
|
}
|
|
else if ( opCode == OpCycle && argc < 6 ) {
|
|
printf("invalid arg: %ws -cycle <adapter name> address mask <cycle sleep time>\n", argv[0] );
|
|
return 0;
|
|
}
|
|
else if ( opCode == OpDel && argc < 3 ) {
|
|
printf("invalid arg: %ws -del <NTE context>\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 */
|