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.
2612 lines
65 KiB
2612 lines
65 KiB
//=============================================================================
|
|
// Copyright (c) 1999 Microsoft Corporation
|
|
// File: ifip.c
|
|
// Abstract:
|
|
// This module implements the if/ip apis
|
|
//
|
|
// Author: K.S.Lokesh (lokeshs@) 8-1-99
|
|
//=============================================================================
|
|
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
#include "ifip.h"
|
|
|
|
//
|
|
// global variables
|
|
//
|
|
|
|
#define IFIP_IFNAME_MASK 0x0001
|
|
#define IFIP_SOURCE_MASK 0X0002
|
|
#define IFIP_ADDR_MASK 0X0004
|
|
#define IFIP_MASK_MASK 0X0008
|
|
#define IFIP_GATEWAY_MASK 0X0010
|
|
#define IFIP_GWMETRIC_MASK 0X0020
|
|
#define IFIP_INDEX_MASK 0X0040
|
|
|
|
#define DHCP 1
|
|
#define STATIC 2
|
|
#define NONE ~0
|
|
#define ALL ~0
|
|
|
|
|
|
// The guid for this context
|
|
//
|
|
GUID g_IfIpGuid = IFIP_GUID;
|
|
|
|
// The commands supported in this context
|
|
//
|
|
|
|
CMD_ENTRY g_IfIpAddCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(IFIP_ADD_IPADDR,IfIpHandleAddAddress,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_ADD_DNS,IfIpHandleAddDns,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_ADD_WINS,IfIpHandleAddWins,CMD_FLAG_LOCAL),
|
|
};
|
|
|
|
CMD_ENTRY g_IfIpSetCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(IFIP_SET_IPADDR,IfIpHandleSetAddress,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_SET_DNS,IfIpHandleSetDns,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_SET_WINS,IfIpHandleSetWins,CMD_FLAG_LOCAL),
|
|
};
|
|
|
|
CMD_ENTRY g_IfIpDelCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(IFIP_DEL_IPADDR,IfIpHandleDelAddress,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_DEL_DNS,IfIpHandleDelDns,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_DEL_WINS,IfIpHandleDelWins,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_DEL_ARPCACHE,IfIpHandleDelArpCache,CMD_FLAG_LOCAL),
|
|
};
|
|
|
|
|
|
CMD_ENTRY g_IfIpShowCmdTable[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(IFIP_SHOW_CONFIG,IfIpHandleShowConfig,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_SHOW_IPADDR,IfIpHandleShowAddress,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_SHOW_OFFLOAD,IfIpHandleShowOffload,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_SHOW_DNS, IfIpHandleShowDns,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY_EX(IFIP_SHOW_WINS, IfIpHandleShowWins,CMD_FLAG_LOCAL),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_INTERFACE, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_IPSTATS, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_IPADDRESS, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_IPNET, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_ICMP, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_TCPSTATS, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_TCPCONN, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_UDPSTATS, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY(IPMIB_SHOW_UDPCONN, HandleIpMibShowObject),
|
|
CREATE_CMD_ENTRY_EX(IPMIB_SHOW_JOINS, HandleIpShowJoins,CMD_FLAG_LOCAL),
|
|
};
|
|
|
|
|
|
CMD_GROUP_ENTRY g_IfIpCmdGroups[] =
|
|
{
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_ADD, g_IfIpAddCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SET, g_IfIpSetCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_DELETE, g_IfIpDelCmdTable),
|
|
CREATE_CMD_GROUP_ENTRY(GROUP_SHOW, g_IfIpShowCmdTable),
|
|
};
|
|
|
|
ULONG g_ulIfIpNumGroups = sizeof(g_IfIpCmdGroups)/sizeof(CMD_GROUP_ENTRY);
|
|
|
|
|
|
CMD_ENTRY g_IfIpTopCmds[] =
|
|
{
|
|
CREATE_CMD_ENTRY_EX(IFIP_RESET, IfIpHandleReset, CMD_FLAG_LOCAL | CMD_FLAG_ONLINE),
|
|
};
|
|
|
|
ULONG g_ulIfIpNumTopCmds = sizeof(g_IfIpTopCmds)/sizeof(CMD_ENTRY);
|
|
|
|
#define DispTokenErrMsg(hModule, dwMsgId, pwszTag, pwszValue) \
|
|
DisplayMessage( hModule, dwMsgId, pwszValue, pwszTag)
|
|
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
IfIpStartHelper(
|
|
IN CONST GUID *pguidParent,
|
|
IN DWORD dwVersion)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Used to initialize the helper.
|
|
|
|
Arguments
|
|
|
|
pguidParent Ifmon's guid
|
|
|
|
Return Value
|
|
|
|
NO_ERROR
|
|
other error code
|
|
--*/
|
|
{
|
|
|
|
DWORD dwErr = NO_ERROR;
|
|
NS_CONTEXT_ATTRIBUTES attMyAttributes;
|
|
|
|
|
|
// Initialize
|
|
//
|
|
ZeroMemory(&attMyAttributes, sizeof(attMyAttributes));
|
|
|
|
attMyAttributes.pwszContext = L"ip";
|
|
attMyAttributes.guidHelper = g_IfIpGuid;
|
|
attMyAttributes.dwVersion = IFIP_VERSION;
|
|
attMyAttributes.dwFlags = 0;
|
|
attMyAttributes.ulNumTopCmds= g_ulIfIpNumTopCmds;
|
|
attMyAttributes.pTopCmds = (CMD_ENTRY (*)[])&g_IfIpTopCmds;
|
|
attMyAttributes.ulNumGroups = g_ulIfIpNumGroups;
|
|
attMyAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_IfIpCmdGroups;
|
|
attMyAttributes.pfnDumpFn = IfIpDump;
|
|
|
|
dwErr = RegisterContext( &attMyAttributes );
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
IfIpDump(
|
|
IN LPCWSTR pwszRouter,
|
|
IN LPWSTR *ppwcArguments,
|
|
IN DWORD dwArgCount,
|
|
IN LPCVOID pvData
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Used when dumping all contexts
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
NO_ERROR
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
HANDLE hFile = (HANDLE)-1;
|
|
|
|
DisplayMessage( g_hModule, DMP_IFIP_HEADER );
|
|
DisplayMessageT(DMP_IFIP_PUSHD);
|
|
|
|
IfIpShowAllInterfaceInfo(pwszRouter, TYPE_IP_ALL, hFile);
|
|
|
|
DisplayMessageT(DMP_IFIP_POPD);
|
|
DisplayMessage( g_hModule, DMP_IFIP_FOOTER );
|
|
|
|
return NO_ERROR;
|
|
}
|
|
|
|
DWORD
|
|
IfIpHandleSetAddress(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
NO_ERROR
|
|
|
|
--*/
|
|
{
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
DWORD dwErr = NO_ERROR,dwRes, dwErrIndex=-1;
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE},
|
|
{TOKEN_SOURCE,FALSE,FALSE},
|
|
{TOKEN_ADDR,FALSE,FALSE},
|
|
{TOKEN_MASK,FALSE,FALSE},
|
|
{TOKEN_GATEWAY,FALSE,FALSE},
|
|
{TOKEN_GWMETRIC,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i, j;
|
|
DWORD dwAddSource, dwAddAddr, dwAddMask, dwAddGateway, dwAddGwmetric;
|
|
PWCHAR pwszAddAddr, pwszAddMask, pwszAddGateway, pwszAddGwmetric;
|
|
BOOL EmptyGateway = FALSE;
|
|
|
|
|
|
// At least interface name & address should be specified.
|
|
|
|
if (dwCurrentIndex +1 >= dwArgCount)
|
|
{
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
case 1:
|
|
{
|
|
//
|
|
// dhcp or static
|
|
//
|
|
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_DHCP, DHCP},
|
|
{TOKEN_VALUE_STATIC,STATIC}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
dwErrIndex = i;
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
dwAddSource = dwRes ;
|
|
dwBitVector |= IFIP_SOURCE_MASK;
|
|
break;
|
|
}
|
|
|
|
|
|
|
|
case 2:
|
|
{
|
|
//
|
|
// ip address for static
|
|
//
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex],
|
|
&dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddAddr = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_ADDR_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
case 3:
|
|
{
|
|
//
|
|
// get mask
|
|
//
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex],
|
|
&dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_NETWORK_MASK(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddMask = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_MASK_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 4:
|
|
{
|
|
//
|
|
// get default gateway addr
|
|
//
|
|
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_NONE, NONE}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr == NO_ERROR) {
|
|
EmptyGateway = TRUE;
|
|
pwszAddGateway = pwszAddGwmetric = NULL;
|
|
}
|
|
else {
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex], &dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
|
|
pwszAddGateway = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
}
|
|
|
|
dwBitVector |= IFIP_GATEWAY_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 5:
|
|
{
|
|
//
|
|
// gwmetric
|
|
//
|
|
|
|
dwAddGwmetric =
|
|
_tcstoul(ppwcArguments[i + dwCurrentIndex], NULL, 10);
|
|
|
|
|
|
if ( dwAddGwmetric > 9999 )
|
|
{
|
|
dwErrIndex = i;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
i = dwNumArg;
|
|
break;
|
|
}
|
|
|
|
pwszAddGwmetric = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_GWMETRIC_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
switch(dwErr)
|
|
{
|
|
case NO_ERROR :
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
if (dwErrIndex != -1)
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[dwErrIndex]].pwszTag,
|
|
ppwcArguments[dwErrIndex + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// error message already printed
|
|
break;
|
|
}
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
|
|
|
|
// interface name should be present
|
|
|
|
if ( !(dwBitVector & IFIP_IFNAME_MASK)) {
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
if ( (dwBitVector & (IFIP_ADDR_MASK|IFIP_MASK_MASK))
|
|
&& (dwAddSource != STATIC))
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
|
|
}
|
|
|
|
if (( (dwBitVector&IFIP_ADDR_MASK) && !(dwBitVector&IFIP_MASK_MASK) )
|
|
||( !(dwBitVector&IFIP_ADDR_MASK) && (dwBitVector&IFIP_MASK_MASK) )
|
|
||( (dwBitVector&IFIP_ADDR_MASK) && !(dwBitVector&IFIP_SOURCE_MASK) )
|
|
||( (dwBitVector&IFIP_GATEWAY_MASK) && !EmptyGateway && !(dwBitVector&IFIP_GWMETRIC_MASK) )
|
|
||( !(dwBitVector&IFIP_GATEWAY_MASK) && (dwBitVector&IFIP_GWMETRIC_MASK) )
|
|
||((dwAddSource==STATIC) && !(dwBitVector&IFIP_ADDR_MASK)
|
|
&& !(dwBitVector&IFIP_GATEWAY_MASK) )
|
|
||( (dwBitVector&IFIP_GWMETRIC_MASK) && EmptyGateway)
|
|
)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
{
|
|
GUID guid;
|
|
|
|
CLSIDFromString(wszInterfaceName, &guid);
|
|
|
|
if (dwAddSource == DHCP) {
|
|
|
|
dwErr = IfIpSetDhcpModeMany(wszIfFriendlyName, &guid, REGISTER_UNCHANGED, TYPE_IPADDR) ;
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
else {
|
|
|
|
if (dwBitVector&IFIP_ADDR_MASK) {
|
|
dwErr = IfIpAddSetAddress(wszIfFriendlyName, &guid, pwszAddAddr, pwszAddMask, SET_FLAG);
|
|
}
|
|
|
|
if ( (dwBitVector&IFIP_GATEWAY_MASK) && (dwErr == NO_ERROR)) {
|
|
dwErr = IfIpAddSetGateway(wszIfFriendlyName, &guid, pwszAddGateway, pwszAddGwmetric, SET_FLAG);
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
if (dwBitVector&IFIP_ADDR_MASK) {
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
if (!(dwBitVector&IFIP_ADDR_MASK) && !(dwBitVector&IFIP_GATEWAY_MASK)) {
|
|
|
|
DisplayMessage(g_hModule, EMSG_STATIC_INPUT);
|
|
|
|
return ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleSetDns(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
|
|
dwErr = IfIpSetMany(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_DNS
|
|
);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleSetWins(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
|
|
dwErr = IfIpSetMany(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_WINS
|
|
);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpSetMany(
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN BOOL *pbDone,
|
|
IN DWORD Type
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
DWORD dwErr = NO_ERROR,dwRes, dwErrIndex=-1;
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE},
|
|
{TOKEN_SOURCE,FALSE,FALSE},
|
|
{TOKEN_ADDR,FALSE,FALSE},
|
|
{TOKEN_REGISTER,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i, j;
|
|
DWORD dwAddSource, dwAddAddr;
|
|
DWORD dwRegisterMode = REGISTER_UNCHANGED;
|
|
PWCHAR pwszAddAddr;
|
|
|
|
|
|
// At least interface name,source should be specified.
|
|
|
|
if (dwCurrentIndex +1 >= dwArgCount)
|
|
{
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
case 1:
|
|
{
|
|
//
|
|
// dhcp or static
|
|
//
|
|
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_DHCP, DHCP},
|
|
{TOKEN_VALUE_STATIC,STATIC}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
dwErrIndex = i;
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
dwAddSource = dwRes ;
|
|
dwBitVector |= IFIP_SOURCE_MASK;
|
|
|
|
//
|
|
// If DHCP, then ADDR argument is not needed, so if the
|
|
// syntax looks right (only one more argument), but we
|
|
// classified the last argument as ADDR, then reclassify
|
|
// it as REGISTER.
|
|
//
|
|
if ((dwRes == DHCP) && (i+2 == dwNumArg) && (pdwTagType[i+1] == 2))
|
|
{
|
|
pdwTagType[i+1] = 3;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
case 2:
|
|
{
|
|
//
|
|
// dns/wins address
|
|
//
|
|
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_NONE, NONE}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr == NO_ERROR) {
|
|
pwszAddAddr = NULL;
|
|
}
|
|
|
|
else {
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex], &dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddAddr = ppwcArguments[i + dwCurrentIndex];
|
|
}
|
|
|
|
dwBitVector |= IFIP_ADDR_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 3:
|
|
{
|
|
//
|
|
// ddns enabled or disabled
|
|
//
|
|
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_NONE, REGISTER_NONE},
|
|
{TOKEN_VALUE_PRIMARY, REGISTER_PRIMARY},
|
|
{TOKEN_VALUE_BOTH, REGISTER_BOTH}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
dwErrIndex = i;
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
dwRegisterMode = dwRes ;
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
switch(dwErr)
|
|
{
|
|
case NO_ERROR :
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
if (dwErrIndex != -1)
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[dwErrIndex]].pwszTag,
|
|
ppwcArguments[dwErrIndex + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// error message already printed
|
|
break;
|
|
}
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
// interface name and source should be present
|
|
|
|
if ( !(dwBitVector & IFIP_IFNAME_MASK)
|
|
|| (! (dwBitVector & IFIP_SOURCE_MASK))) {
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
if ( ((dwBitVector & IFIP_ADDR_MASK) && (dwAddSource != STATIC))
|
|
||(!(dwBitVector & IFIP_ADDR_MASK) && (dwAddSource == STATIC)) )
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
{
|
|
GUID guid;
|
|
|
|
CLSIDFromString(wszInterfaceName, &guid);
|
|
|
|
if (dwAddSource == DHCP) {
|
|
|
|
return IfIpSetDhcpModeMany(wszIfFriendlyName, &guid, dwRegisterMode, Type) ;
|
|
}
|
|
else {
|
|
|
|
return IfIpAddSetDelMany(wszIfFriendlyName, &guid, pwszAddAddr, 0, dwRegisterMode, Type, SET_FLAG);
|
|
}
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleAddAddress(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
DWORD dwErr = NO_ERROR,dwRes, dwErrIndex=-1;
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE},
|
|
{TOKEN_ADDR,FALSE,FALSE},
|
|
{TOKEN_MASK,FALSE,FALSE},
|
|
{TOKEN_GATEWAY,FALSE,FALSE},
|
|
{TOKEN_GWMETRIC,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i, j;
|
|
DWORD dwAddSource, dwAddAddr, dwAddMask, dwAddGateway, dwAddGwmetric;
|
|
PWCHAR pwszAddAddr, pwszAddMask, pwszAddGateway, pwszAddGwmetric;
|
|
|
|
|
|
if (dwCurrentIndex >= dwArgCount)
|
|
{
|
|
// No arguments specified. At least interface name should be specified.
|
|
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 1:
|
|
{
|
|
//
|
|
// ip address for static
|
|
//
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex], &dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddAddr = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_ADDR_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
case 2:
|
|
{
|
|
//
|
|
// get mask
|
|
//
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex], &dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_NETWORK_MASK(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddMask = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_MASK_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 3:
|
|
{
|
|
//
|
|
// get default gateway addr
|
|
//
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex],
|
|
&dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddGateway = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_GATEWAY_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 4:
|
|
{
|
|
//
|
|
// gwmetric
|
|
//
|
|
|
|
dwAddGwmetric =
|
|
_tcstoul(ppwcArguments[i + dwCurrentIndex], NULL, 10);
|
|
|
|
|
|
if ( dwAddGwmetric > 9999 )
|
|
{
|
|
dwErrIndex = i;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
i = dwNumArg;
|
|
break;
|
|
}
|
|
|
|
pwszAddGwmetric = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_GWMETRIC_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
// interface name should be present
|
|
|
|
if (!pttTags[0].bPresent)
|
|
{
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
switch(dwErr)
|
|
{
|
|
case NO_ERROR :
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
if (dwErrIndex != -1)
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[dwErrIndex]].pwszTag,
|
|
ppwcArguments[dwErrIndex + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// error message already printed
|
|
break;
|
|
}
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
|
|
// interface name should be present
|
|
|
|
if ( !(dwBitVector & IFIP_IFNAME_MASK) ) {
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
if (( (dwBitVector&IFIP_ADDR_MASK) && !(dwBitVector&IFIP_MASK_MASK) )
|
|
||( !(dwBitVector&IFIP_ADDR_MASK) && (dwBitVector&IFIP_MASK_MASK) )
|
|
||( (dwBitVector&IFIP_GATEWAY_MASK) && !(dwBitVector&IFIP_GWMETRIC_MASK) )
|
|
||( !(dwBitVector&IFIP_GATEWAY_MASK) && (dwBitVector&IFIP_GWMETRIC_MASK) )
|
|
)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
{
|
|
GUID guid;
|
|
|
|
if (FAILED(CLSIDFromString(wszInterfaceName, &guid))) {
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
if (dwBitVector&IFIP_ADDR_MASK) {
|
|
dwErr = IfIpAddSetAddress(wszIfFriendlyName, &guid, pwszAddAddr, pwszAddMask, ADD_FLAG);
|
|
}
|
|
|
|
if ( (dwBitVector&IFIP_GATEWAY_MASK) && (dwErr == NO_ERROR)) {
|
|
|
|
dwErr = IfIpAddSetGateway(wszIfFriendlyName, &guid, pwszAddGateway, pwszAddGwmetric, ADD_FLAG);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
if (dwBitVector&IFIP_ADDR_MASK) {
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
if (!(dwBitVector&IFIP_ADDR_MASK) && !(dwBitVector&IFIP_GATEWAY_MASK)) {
|
|
|
|
DisplayMessage(g_hModule, EMSG_STATIC_INPUT);
|
|
|
|
return ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
}
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
DWORD
|
|
IfIpHandleAddDns(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
|
|
dwErr = IfIpAddMany(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_DNS
|
|
);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleAddWins(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
|
|
dwErr = IfIpAddMany(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_WINS
|
|
);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpAddMany(
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN BOOL *pbDone,
|
|
IN DWORD Type
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
DWORD dwErr = NO_ERROR,dwRes, dwErrIndex=-1;
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE},
|
|
{TOKEN_ADDR,FALSE,FALSE},
|
|
{TOKEN_INDEX,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i, j;
|
|
DWORD dwAddSource, dwAddAddr, dwAddIndex=~(0);
|
|
PWCHAR pwszAddAddr;
|
|
|
|
|
|
// At least interface name/new address should be specified.
|
|
|
|
if (dwCurrentIndex +1 >= dwArgCount)
|
|
{
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 1:
|
|
{
|
|
//
|
|
// dns/wins address
|
|
//
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex], &dwAddAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwAddAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszAddAddr = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_ADDR_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
|
|
case 2:
|
|
{
|
|
//
|
|
// index
|
|
//
|
|
|
|
dwAddIndex =
|
|
_tcstoul(ppwcArguments[i + dwCurrentIndex], NULL, 10);
|
|
|
|
|
|
if ( (dwAddIndex <= 0 || dwAddIndex > 999) )
|
|
{
|
|
dwErrIndex = i;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
i = dwNumArg;
|
|
break;
|
|
}
|
|
|
|
dwBitVector |= IFIP_INDEX_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
switch(dwErr)
|
|
{
|
|
case NO_ERROR :
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
if (dwErrIndex != -1)
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[dwErrIndex]].pwszTag,
|
|
ppwcArguments[dwErrIndex + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// error message already printed
|
|
break;
|
|
}
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
// interface name and new address should be present
|
|
|
|
if ( !(dwBitVector & IFIP_IFNAME_MASK)
|
|
|| (! (dwBitVector & IFIP_ADDR_MASK))) {
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
{
|
|
GUID guid;
|
|
|
|
CLSIDFromString(wszInterfaceName, &guid);
|
|
|
|
#pragma prefast(suppress:1, "pwszAddAddr is initialized if IFIP_IFNAME_MASK is set")
|
|
return IfIpAddSetDelMany(wszIfFriendlyName, &guid, pwszAddAddr, dwAddIndex, REGISTER_UNCHANGED, Type, ADD_FLAG);
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleDelAddress(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
DWORD dwErr = NO_ERROR,dwRes, dwErrIndex=-1;
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE},
|
|
{TOKEN_ADDR,FALSE,FALSE},
|
|
{TOKEN_GATEWAY,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i, j, Flags = 0;
|
|
PWCHAR pwszDelAddr=NULL, pwszDelGateway=NULL;
|
|
|
|
|
|
// At least interface name and ipaddr/gateway should be specified.
|
|
|
|
if (dwCurrentIndex + 1 >= dwArgCount)
|
|
{
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
|
|
case 0 :
|
|
{
|
|
// get IfName
|
|
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 1:
|
|
{
|
|
//
|
|
// ip address for static
|
|
//
|
|
|
|
ULONG dwDelAddr;
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex],
|
|
&dwDelAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwDelAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
|
|
}
|
|
|
|
pwszDelAddr = ppwcArguments[i + dwCurrentIndex];
|
|
dwBitVector |= IFIP_ADDR_MASK;
|
|
Flags |= TYPE_ADDR;
|
|
|
|
break;
|
|
}
|
|
|
|
case 2:
|
|
{
|
|
//
|
|
// get default gateway addr
|
|
//
|
|
|
|
ULONG dwDelGateway;
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_ALL, ALL}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr == NO_ERROR) {
|
|
pwszDelGateway = NULL;
|
|
}
|
|
else {
|
|
|
|
dwErr = NO_ERROR;
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex],
|
|
&dwDelGateway);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwDelGateway))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszDelGateway = ppwcArguments[i + dwCurrentIndex];
|
|
}
|
|
|
|
dwBitVector |= IFIP_GATEWAY_MASK;
|
|
Flags |= TYPE_GATEWAY;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
|
|
switch(dwErr)
|
|
{
|
|
case NO_ERROR :
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
if (dwErrIndex != -1)
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[dwErrIndex]].pwszTag,
|
|
ppwcArguments[dwErrIndex + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// error message already printed
|
|
break;
|
|
}
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
|
|
// interface name and addr/all should be present
|
|
|
|
if ( !(dwBitVector & IFIP_IFNAME_MASK)
|
|
|| !(dwBitVector & (IFIP_GATEWAY_MASK | IFIP_ADDR_MASK))
|
|
) {
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
{
|
|
GUID guid;
|
|
|
|
CLSIDFromString(wszInterfaceName, &guid);
|
|
|
|
dwErr = IfIpHandleDelIpaddrEx(wszIfFriendlyName, &guid, pwszDelAddr, pwszDelGateway, Flags);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleDelDns(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
dwErr = IfIpDelMany(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_DNS
|
|
);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleDelWins(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr;
|
|
dwErr = IfIpDelMany(
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_WINS
|
|
);
|
|
|
|
RETURN_ERROR_OKAY(dwErr);
|
|
}
|
|
|
|
DWORD
|
|
IfIpDelMany(
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN BOOL *pbDone,
|
|
IN DISPLAY_TYPE Type
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
DWORD dwErr = NO_ERROR,dwRes, dwErrIndex=-1;
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE},
|
|
{TOKEN_ADDR,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i, j;
|
|
PWCHAR pwszDelAddr=NULL;
|
|
|
|
|
|
// At least interface name/address should be specified.
|
|
|
|
if (dwCurrentIndex +1 >= dwArgCount)
|
|
{
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
|
|
case 0 :
|
|
{
|
|
// get IfName
|
|
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
case 1:
|
|
{
|
|
//
|
|
// address
|
|
//
|
|
|
|
ULONG dwDelAddr;
|
|
|
|
TOKEN_VALUE rgEnums[] =
|
|
{{TOKEN_VALUE_ALL, ALL}};
|
|
|
|
dwErr = MatchEnumTag(g_hModule,
|
|
ppwcArguments[i + dwCurrentIndex],
|
|
NUM_TOKENS_IN_TABLE(rgEnums),
|
|
rgEnums,
|
|
&dwRes);
|
|
|
|
if (dwErr == NO_ERROR) {
|
|
pwszDelAddr = NULL;
|
|
}
|
|
else {
|
|
|
|
dwErr = GetIpAddress(ppwcArguments[i + dwCurrentIndex], &dwDelAddr);
|
|
|
|
if((dwErr != NO_ERROR) or CHECK_UNICAST_IP_ADDR(dwDelAddr))
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[i]].pwszTag,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
pwszDelAddr = ppwcArguments[i + dwCurrentIndex];
|
|
}
|
|
|
|
dwBitVector |= IFIP_ADDR_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
i = dwNumArg;
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
|
|
switch(dwErr)
|
|
{
|
|
case NO_ERROR :
|
|
break;
|
|
|
|
case ERROR_INVALID_PARAMETER:
|
|
if (dwErrIndex != -1)
|
|
{
|
|
DispTokenErrMsg(g_hModule,
|
|
EMSG_BAD_OPTION_VALUE,
|
|
pttTags[pdwTagType[dwErrIndex]].pwszTag,
|
|
ppwcArguments[dwErrIndex + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
// error message already printed
|
|
break;
|
|
}
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
|
|
// interface name and address should be present
|
|
|
|
if ( !(dwBitVector & IFIP_IFNAME_MASK)
|
|
|| !(dwBitVector & IFIP_ADDR_MASK)) {
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
{
|
|
GUID guid;
|
|
|
|
CLSIDFromString(wszInterfaceName, &guid);
|
|
|
|
return IfIpAddSetDelMany(wszIfFriendlyName, &guid, pwszDelAddr, 0, REGISTER_UNCHANGED, Type, DEL_FLAG);
|
|
}
|
|
}
|
|
|
|
DWORD
|
|
IfIpHandleShowAddress(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
return IfIpShowMany(
|
|
pwszMachine,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_IPADDR
|
|
);
|
|
}
|
|
|
|
|
|
|
|
DWORD
|
|
IfIpHandleShowConfig(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
return IfIpShowMany(
|
|
pwszMachine,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_IP_ALL
|
|
);
|
|
}
|
|
|
|
DWORD
|
|
IfIpHandleShowOffload(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
return IfIpShowMany(
|
|
pwszMachine,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_OFFLOAD
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleShowDns(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
return IfIpShowMany(
|
|
pwszMachine,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_DNS
|
|
);
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleShowWins(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
return IfIpShowMany(
|
|
pwszMachine,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pbDone,
|
|
TYPE_WINS
|
|
);
|
|
}
|
|
|
|
DWORD
|
|
IfIpShowMany(
|
|
IN LPCWSTR pwszMachineName,
|
|
IN PWCHAR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN BOOL *pbDone,
|
|
IN DISPLAY_TYPE dtType
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr = NO_ERROR;
|
|
ULONG Flags = 0, IfIndex;
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
PWCHAR wszIfFriendlyName = NULL;
|
|
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
TAG_TYPE pttTags[] = {
|
|
{TOKEN_NAME,FALSE,FALSE}};
|
|
|
|
PDWORD pdwTagType;
|
|
DWORD dwNumOpt, dwBitVector=0;
|
|
DWORD dwNumArg, i;
|
|
BOOLEAN bAll = FALSE;
|
|
|
|
//
|
|
// get interface friendly name
|
|
//
|
|
|
|
if (dwCurrentIndex > dwArgCount)
|
|
{
|
|
// No arguments specified. At least interface name should be specified.
|
|
|
|
return ERROR_SHOW_USAGE;
|
|
}
|
|
else if (dwCurrentIndex == dwArgCount)
|
|
{
|
|
// show for all interfaces
|
|
|
|
bAll = TRUE;
|
|
}
|
|
|
|
else {
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
NUM_TAGS_IN_TABLE(pttTags),
|
|
pdwTagType);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
if (dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for ( i = 0; i < dwNumArg; i++)
|
|
{
|
|
switch (pdwTagType[i])
|
|
{
|
|
case 0 :
|
|
{
|
|
dwErr = GetIfNameFromFriendlyName(ppwcArguments[i + dwCurrentIndex],
|
|
wszInterfaceName,&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
DisplayMessage(g_hModule, EMSG_INVALID_INTERFACE,
|
|
ppwcArguments[i + dwCurrentIndex]);
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
break;
|
|
}
|
|
|
|
|
|
wszIfFriendlyName = ppwcArguments[i + dwCurrentIndex];
|
|
|
|
dwBitVector |= IFIP_IFNAME_MASK;
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
break;
|
|
}
|
|
|
|
} //switch
|
|
|
|
if (dwErr != NO_ERROR)
|
|
break ;
|
|
|
|
}
|
|
|
|
|
|
// interface name should be present
|
|
|
|
if (!pttTags[0].bPresent)
|
|
{
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
|
|
if (pdwTagType)
|
|
IfutlFree(pdwTagType);
|
|
|
|
}
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
|
|
//
|
|
// show for all interfaces
|
|
//
|
|
|
|
if (bAll) {
|
|
|
|
dwErr = IfIpShowAllInterfaceInfo(pwszMachineName, dtType, NULL);
|
|
}
|
|
|
|
// show for specified interface
|
|
else {
|
|
|
|
GUID guid;
|
|
|
|
dwErr = IfutlGetIfIndexFromInterfaceName(
|
|
wszInterfaceName,
|
|
&IfIndex);
|
|
|
|
CLSIDFromString(wszInterfaceName, &guid);
|
|
|
|
|
|
dwErr = IfIpShowManyEx(pwszMachineName,
|
|
IfIndex, wszIfFriendlyName, &guid, dtType, NULL);
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
DWORD
|
|
IfIpShowAllInterfaceInfo(
|
|
LPCWSTR pwszMachineName,
|
|
DISPLAY_TYPE dtType,
|
|
HANDLE hFile
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
GUID TmpGuid;
|
|
PWCHAR TmpGuidStr;
|
|
WCHAR wszIfFriendlyName[MAX_INTERFACE_NAME_LEN + 1];
|
|
PIP_INTERFACE_NAME_INFO pTable;
|
|
DWORD dwErr, dwCount, i, dwBufferSize;
|
|
|
|
// get interface index
|
|
|
|
dwErr = NhpAllocateAndGetInterfaceInfoFromStack(
|
|
&pTable,
|
|
&dwCount,
|
|
FALSE,
|
|
GetProcessHeap(),
|
|
0);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
return dwErr;
|
|
|
|
|
|
for (i=0; i<dwCount; i++) {
|
|
|
|
// Don't dump the properties for
|
|
// Demand Dial (IF_CONNECTION_DEMAND),
|
|
// Dial Out (IF_CONNECTION_DEMAND),
|
|
// or Dial in (IF_CONNECTION_PASSIVE) interfaces
|
|
// i.e. dump properties for Dedicated connections only
|
|
if ( pTable[i].ConnectionType != IF_CONNECTION_DEDICATED )
|
|
continue;
|
|
|
|
|
|
// If InterfaceGuid is all Zeros we will use DeviceGuid to get the
|
|
// friendly name
|
|
if ( IsEqualCLSID(&(pTable[i].InterfaceGuid), &GUID_NULL) ) {
|
|
TmpGuid = pTable[i].DeviceGuid;
|
|
}
|
|
else {
|
|
TmpGuid = pTable[i].InterfaceGuid;
|
|
}
|
|
|
|
|
|
// get ifname as a string
|
|
dwErr = StringFromCLSID(&TmpGuid, &TmpGuidStr);
|
|
if (dwErr != S_OK)
|
|
return dwErr;
|
|
|
|
|
|
// get friendly name
|
|
dwBufferSize = sizeof(wszIfFriendlyName);
|
|
IfutlGetInterfaceDescription(TmpGuidStr, wszIfFriendlyName,
|
|
&dwBufferSize);
|
|
|
|
|
|
IfIpShowManyEx(pwszMachineName, pTable[i].Index, wszIfFriendlyName,
|
|
&TmpGuid, dtType, hFile);
|
|
|
|
CoTaskMemFree(TmpGuidStr);
|
|
}
|
|
|
|
return dwErr==S_OK ? NO_ERROR : dwErr;
|
|
}
|
|
|
|
|
|
DWORD
|
|
IfIpHandleDelArpCache(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr, dwCount, i, j, dwNumArg;
|
|
TAG_TYPE Tags[] = {{TOKEN_NAME,FALSE,FALSE}};
|
|
PDWORD pdwTagType;
|
|
WCHAR wszInterfaceName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
|
|
DWORD dwBufferSize = sizeof(wszInterfaceName);
|
|
GUID Guid;
|
|
|
|
PIP_INTERFACE_NAME_INFO pTable;
|
|
|
|
dwErr = NhpAllocateAndGetInterfaceInfoFromStack(&pTable,
|
|
&dwCount,
|
|
FALSE,
|
|
GetProcessHeap(),
|
|
0);
|
|
|
|
if (dwErr != NO_ERROR)
|
|
{
|
|
return dwErr;
|
|
}
|
|
|
|
dwNumArg = dwArgCount - dwCurrentIndex;
|
|
|
|
if(dwNumArg == 0)
|
|
{
|
|
for(i = 0 ; i < dwCount; i++)
|
|
{
|
|
dwErr = FlushIpNetTableFromStack(pTable[i].Index);
|
|
}
|
|
|
|
return ERROR_OKAY;
|
|
}
|
|
|
|
pdwTagType = HeapAlloc(GetProcessHeap(),
|
|
0,
|
|
dwNumArg * sizeof(DWORD));
|
|
|
|
if (pdwTagType is NULL)
|
|
{
|
|
return ERROR_NOT_ENOUGH_MEMORY;
|
|
}
|
|
|
|
dwErr = MatchTagsInCmdLine(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
Tags,
|
|
NUM_TAGS_IN_TABLE(Tags),
|
|
pdwTagType);
|
|
|
|
if(dwErr isnot NO_ERROR)
|
|
{
|
|
IfutlFree(pdwTagType);
|
|
|
|
if(dwErr is ERROR_INVALID_OPTION_TAG)
|
|
{
|
|
return ERROR_INVALID_SYNTAX;
|
|
}
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
for(j = 0; j < dwNumArg; j++)
|
|
{
|
|
switch(pdwTagType[j])
|
|
{
|
|
case 0 :
|
|
{
|
|
dwErr = GetIfNameFromFriendlyName(
|
|
ppwcArguments[j + dwCurrentIndex],
|
|
wszInterfaceName,
|
|
&dwBufferSize);
|
|
|
|
if (dwErr isnot NO_ERROR)
|
|
{
|
|
j = dwNumArg;
|
|
|
|
break;
|
|
}
|
|
|
|
CLSIDFromString(wszInterfaceName, &Guid);
|
|
|
|
for(i = 0; i < dwCount; i ++)
|
|
{
|
|
if(IsEqualGUID(&Guid,
|
|
&(pTable[i].DeviceGuid)))
|
|
{
|
|
FlushIpNetTableFromStack(pTable[i].Index);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(i == dwCount)
|
|
{
|
|
DisplayMessage(g_hModule,
|
|
MSG_NO_SUCH_IF,
|
|
ppwcArguments[j + dwCurrentIndex]);
|
|
|
|
dwErr = ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
j = dwNumArg;
|
|
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(dwErr == NO_ERROR)
|
|
{
|
|
dwErr = ERROR_OKAY;
|
|
}
|
|
|
|
return dwErr;
|
|
|
|
}
|
|
|
|
DWORD
|
|
TrRepair(
|
|
FILE* LogFile
|
|
);
|
|
|
|
DWORD
|
|
IfIpHandleReset(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
/*++
|
|
|
|
Routine Description
|
|
|
|
Arguments
|
|
|
|
Return Value
|
|
|
|
--*/
|
|
{
|
|
DWORD dwErr, i;
|
|
TAG_TYPE pttTags[] = {{TOKEN_NAME,TRUE,FALSE}};
|
|
DWORD rgdwTagType[sizeof(pttTags)/sizeof(TAG_TYPE)];
|
|
PCWSTR pwszLogFileName;
|
|
FILE *LogFile;
|
|
|
|
// Parse arguments
|
|
|
|
dwErr = PreprocessCommand(g_hModule,
|
|
ppwcArguments,
|
|
dwCurrentIndex,
|
|
dwArgCount,
|
|
pttTags,
|
|
sizeof(pttTags)/sizeof(TAG_TYPE),
|
|
0,
|
|
sizeof(pttTags)/sizeof(TAG_TYPE),
|
|
rgdwTagType );
|
|
if (dwErr isnot NO_ERROR) {
|
|
return dwErr;
|
|
}
|
|
|
|
for (i=0; (dwErr == NO_ERROR) && (i<dwArgCount-dwCurrentIndex); i++) {
|
|
switch(rgdwTagType[i]) {
|
|
case 0: // NAME
|
|
pwszLogFileName = ppwcArguments[i + dwCurrentIndex];
|
|
break;
|
|
default:
|
|
dwErr = ERROR_INVALID_SYNTAX;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (dwErr isnot NO_ERROR) {
|
|
return dwErr;
|
|
}
|
|
|
|
// Open the log file for append.
|
|
//
|
|
LogFile = _wfopen(pwszLogFileName, L"a+");
|
|
if (LogFile == NULL) {
|
|
DisplayMessage(g_hModule, EMSG_OPEN_APPEND);
|
|
return ERROR_SUPPRESS_OUTPUT;
|
|
}
|
|
|
|
dwErr = TrRepair(LogFile);
|
|
|
|
fprintf(LogFile, "<completed>\n\n");
|
|
fclose(LogFile);
|
|
|
|
return dwErr;
|
|
}
|
|
|