//============================================================================= // 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\n\n"); fclose(LogFile); return dwErr; }