Leaked source code of windows server 2003
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.
 
 
 
 
 
 

1861 lines
50 KiB

/*++
Copyright (c) 1999 Microsoft Corporation
Module Name:
net\routing\netsh\if\showmib.c
Abstract:
Fns to parse and show MIB information
Author:
v raman
Revision History:
Anand Mahalingam
Dave Thaler
--*/
#include "precomp.h"
#pragma hdrstop
#include <time.h>
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
HANDLE g_hConsole, g_hStdOut;
MIB_OBJECT_PARSER MIBObjectMap[] =
{
{TOKEN_MIB_OBJECT_INTERFACE,1,GetMIBIfIndex},
{TOKEN_MIB_OBJECT_IPSTATS, 0,NULL},
{TOKEN_MIB_OBJECT_IPADDRESS,1,GetMIBIpAddress},
{TOKEN_MIB_OBJECT_IPNET, 2,GetMIBIpNetIndex},
{TOKEN_MIB_OBJECT_ICMP, 0,NULL},
{TOKEN_MIB_OBJECT_TCPSTATS, 0,NULL},
{TOKEN_MIB_OBJECT_TCPCONN, 4,GetMIBTcpConnIndex},
{TOKEN_MIB_OBJECT_UDPSTATS, 0,NULL},
{TOKEN_MIB_OBJECT_UDPCONN, 2,GetMIBUdpConnIndex},
};
ULONG g_ulNumMibObjects = sizeof(MIBObjectMap)/sizeof(MIB_OBJECT_PARSER);
MAGIC_TABLE MIBVar[] = {
{IF_ROW, PrintIfRow},
{IF_TABLE, PrintIfTable},
{IP_STATS, PrintIpStats},
{IP_STATS, PrintIpStats},
{IP_ADDRROW, PrintIpAddrRow},
{IP_ADDRTABLE, PrintIpAddrTable},
{IP_NETROW, PrintIpNetRow},
{IP_NETTABLE, PrintIpNetTable},
{ICMP_STATS, PrintIcmp},
{ICMP_STATS, PrintIcmp},
{TCP_STATS, PrintTcpStats},
{TCP_STATS, PrintTcpStats},
{TCP_ROW, PrintTcpRow},
{TCP_TABLE, PrintTcpTable},
{UDP_STATS, PrintUdpStats},
{UDP_STATS, PrintUdpStats},
{UDP_ROW, PrintUdpRow},
{UDP_TABLE, PrintUdpTable},
};
DWORD
GetMIBIfIndex(
IN PTCHAR *pptcArguments,
IN DWORD dwCurrentIndex,
OUT PDWORD pdwIndices,
OUT PDWORD pdwNumParsed
)
/*++
Routine Description:
Gets the interface index.
Arguments:
pptcArguments - Argument array
dwCurrentIndex - Index of the first argument in array
pdwIndices - Indices specified in command
pdwNumParsed - Number of indices in command
Return Value:
NO_ERROR, ERROR_INVALID_PARAMETER
--*/
{
DWORD dwErr = NO_ERROR;
*pdwNumParsed = 1;
// If index was specified just use it
if (iswdigit(pptcArguments[dwCurrentIndex][0]))
{
pdwIndices[0] = _tcstoul(pptcArguments[dwCurrentIndex],NULL,10);
return NO_ERROR;
}
// Try converting a friendly name to an ifindex
return IfutlGetIfIndexFromFriendlyName( pptcArguments[dwCurrentIndex],
&pdwIndices[0] );
}
DWORD
GetMIBIpAddress(
IN PTCHAR *pptcArguments,
IN DWORD dwCurrentIndex,
OUT PDWORD pdwIndices,
OUT PDWORD pdwNumParsed
)
/*++
Routine Description:
Gets the IP address.
Arguments:
pptcArguments - Argument array
dwCurrentIndex - Index of the first argument in array
pdwIndices - Indices specified in command
pdwNumParsed - Number of indices in command
Return Value:
NO_ERROR
--*/
{
DWORD dwErr = GetIpAddress(pptcArguments[dwCurrentIndex], &pdwIndices[0]);
*pdwNumParsed = 1;
return dwErr;
}
DWORD
GetMIBIpNetIndex(
IN PTCHAR *pptcArguments,
IN DWORD dwCurrentIndex,
OUT PDWORD pdwIndices,
OUT PDWORD pdwNumParsed
)
/*++
Routine Description:
Gets the IP net index
Arguments:
pptcArguments - Argument array
dwCurrentIndex - Index of the first argument in array
pdwIndices - Indices specified in command
pdwNumParsed - Number of indices in command
Return Value:
NO_ERROR
--*/
{
DWORD dwErr;
pdwIndices[0] = _tcstoul(pptcArguments[dwCurrentIndex],NULL,10);
dwErr = GetIpAddress(pptcArguments[dwCurrentIndex + 1], &pdwIndices[1]);
*pdwNumParsed = 2;
return dwErr;
}
DWORD
GetMIBTcpConnIndex(
IN PTCHAR *pptcArguments,
IN DWORD dwCurrentIndex,
OUT PDWORD pdwIndices,
OUT PDWORD pdwNumParsed
)
/*++
Routine Description:
Gets the tco conn index
Arguments:
pptcArguments - Argument array
dwCurrentIndex - Index of the first argument in array
pdwIndices - Indices specified in command
pdwNumParsed - Number of indices in command
Return Value:
NO_ERROR
--*/
{
DWORD dwErr = GetIpAddress(pptcArguments[dwCurrentIndex], &pdwIndices[0]);
if (dwErr isnot NO_ERROR)
{
return dwErr;
}
pdwIndices[1] = htons((WORD)(_tcstoul(pptcArguments[dwCurrentIndex + 1],NULL,10)));
dwErr = GetIpAddress(pptcArguments[dwCurrentIndex + 2], &pdwIndices[2]);
pdwIndices[3] = htons((WORD)(_tcstoul(pptcArguments[dwCurrentIndex + 3],
NULL,10)));
*pdwNumParsed = 4;
return dwErr;
}
DWORD
GetMIBUdpConnIndex(
IN PTCHAR *pptcArguments,
IN DWORD dwCurrentIndex,
OUT PDWORD pdwIndices,
OUT PDWORD pdwNumParsed
)
/*++
Routine Description:
Gets the udp conn index
Arguments:
pptcArguments - Argument array
dwCurrentIndex - Index of the first argument in array
pdwIndices - Indices specified in command
pdwNumParsed - Number of indices in command
Return Value:
NO_ERROR
--*/
{
DWORD dwErr = GetIpAddress(pptcArguments[dwCurrentIndex], &pdwIndices[0]);
pdwIndices[1] = htons((WORD)(_tcstoul(pptcArguments[dwCurrentIndex + 1],
NULL,10)));
*pdwNumParsed = 2;
return dwErr;
}
DWORD
GetIgmpList(IN IPV4_ADDRESS NTEAddr,
OUT IPV4_ADDRESS *pIgmpList,
OUT PULONG dwOutBufLen
);
DWORD
GetPrintJoinRow(
IPV4_ADDRESS ipAddr
)
{
DWORD dwOutBufLen = 0;
IPV4_ADDRESS *pIgmpList = NULL;
DWORD dwStatus;
DWORD i;
dwStatus = GetIgmpList( ipAddr,
pIgmpList,
&dwOutBufLen );
if (dwStatus == ERROR_INSUFFICIENT_BUFFER)
{
pIgmpList = HeapAlloc(GetProcessHeap(), 0, dwOutBufLen);
if (!pIgmpList)
return ERROR_NOT_ENOUGH_MEMORY;
dwStatus = GetIgmpList( ipAddr,
pIgmpList,
&dwOutBufLen );
}
if (dwStatus == STATUS_SUCCESS)
{
WCHAR pwszIfAddr[20], pwszGrAddr[20];
DWORD dwTotal = dwOutBufLen/sizeof(ipAddr);
MakeAddressStringW(pwszIfAddr, ipAddr);
if (!pwszIfAddr)
return ERROR_NOT_ENOUGH_MEMORY;
for (i=0; i<dwTotal; i++)
{
MakeAddressStringW(pwszGrAddr, pIgmpList[i]);
if (!pwszGrAddr)
return ERROR_NOT_ENOUGH_MEMORY;
DisplayMessage( g_hModule,
MSG_MIB_JOIN_ROW,
pwszIfAddr,
pwszGrAddr );
}
}
if (pIgmpList)
HeapFree(GetProcessHeap(), 0, pIgmpList);
return dwStatus;
}
DWORD
GetIPv4Addresses(
IN LPSOCKET_ADDRESS_LIST *ppList)
{
LPSOCKET_ADDRESS_LIST pList = NULL;
ULONG ulSize = 0;
DWORD dwErr;
DWORD dwBytesReturned;
SOCKET s;
*ppList = NULL;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
return WSAGetLastError();
for (;;) {
dwErr = WSAIoctl(s, SIO_ADDRESS_LIST_QUERY, NULL, 0, pList, ulSize,
&dwBytesReturned, NULL, NULL);
if (!dwErr) {
break;
}
if (pList) {
FREE(pList);
pList = NULL;
}
dwErr = WSAGetLastError();
if (dwErr != WSAEFAULT)
break;
pList = MALLOC(dwBytesReturned);
if (!pList) {
dwErr = ERROR_NOT_ENOUGH_MEMORY;
break;
}
ulSize = dwBytesReturned;
}
closesocket(s);
*ppList = pList;
return dwErr;
}
DWORD
HandleIpShowJoins(
IN LPCWSTR pwszMachine,
IN OUT LPWSTR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN LPCVOID pvData,
OUT BOOL *pbDone
)
{
MIB_OPAQUE_QUERY Query;
PMIB_IPADDRTABLE lprpcTable;
DWORD dwOutBufLen = 0 ,
dwNumParsed;
IPV4_ADDRESS *pIgmpList = NULL,
ipAddr;
DWORD dwResult = NO_ERROR,
dwOutEntrySize;
DWORD i;
PMIB_OPAQUE_INFO pRpcInfo;
PWCHAR pszIfAddr;
IFMON_CMD_ARG pArgs[] =
{
{
IFMON_CMD_TYPE_STRING,
{TOKEN_ADDR, FALSE, FALSE},
NULL,
0,
NULL
}
};
do
{
dwResult = IfutlParse( ppwcArguments,
dwCurrentIndex,
dwArgCount,
NULL,
pArgs,
sizeof(pArgs) / sizeof(*pArgs));
if (dwResult)
{
break;
}
DisplayMessage(g_hModule, MSG_MIB_JOIN_HDR);
if (pArgs[0].rgTag.bPresent)
{
// address specified
pszIfAddr = IFMON_CMD_ARG_GetPsz(&pArgs[0]);
dwResult = GetIpAddress( pszIfAddr, &ipAddr );
if (dwResult)
{
break;
}
GetPrintJoinRow(ipAddr);
}
else
{
SOCKET_ADDRESS_LIST *pList;
INT j;
// Get all IPv4 addresses
dwResult = GetIPv4Addresses(&pList);
if (dwResult != NO_ERROR)
break;
// For each IPv4 address
for (j=0; j<pList->iAddressCount; j++)
{
GetPrintJoinRow( ((LPSOCKADDR_IN)pList->Address[j].lpSockaddr)->sin_addr.s_addr );
}
FREE(pList);
}
} while (FALSE);
return dwResult;
}
DWORD
HandleIpMibShowObject(
IN LPCWSTR pwszMachine,
IN OUT LPWSTR *ppwcArguments,
IN DWORD dwCurrentIndex,
IN DWORD dwArgCount,
IN DWORD dwFlags,
IN LPCVOID pvData,
OUT BOOL *pbDone
)
/*++
Routine Description:
Parses command to get MIB object and optional parameters
Arguments:
Return Value:
--*/
{
DWORD dwIndices[MAX_NUM_INDICES];
DWORD dwNumParsed = 0;
PMIB_OPAQUE_QUERY pQuery = NULL;
PMIB_OPAQUE_INFO pRpcInfo;
DWORD dwQuerySize;
BOOL bFound = FALSE,bOptPresent = FALSE;
DWORD dwRefreshRate;
DWORD dwOutEntrySize;
DWORD i,dwResult,dwErr;
DWORD dwMIBIndex, dwIndex;
BOOL bIndex = FALSE, dwType;
DWORD dwRR = 0, dwInd = 0;
HANDLE hMib;
#if 0
TOKEN_VALUE tvMfeTypes[] =
{
{ TOKEN_VALUE_POSITIVE, PositiveMfe },
{ TOKEN_VALUE_NEGATIVE, NegativeMfe },
{ TOKEN_VALUE_BOTH, Both }
};
#endif
if ( ! IfutlIsRouterRunning() )
{
if (g_pwszRouter)
{
DisplayMessage(g_hModule,
MSG_IP_REMOTE_ROUTER_NOT_RUNNING,
g_pwszRouter);
}
else
{
DisplayMessage(g_hModule,
MSG_IP_LOCAL_ROUTER_NOT_RUNNING);
}
return NO_ERROR;
}
//
// Match MIB object
//
ppwcArguments += (dwCurrentIndex-1);
dwArgCount -= (dwCurrentIndex-1);
dwCurrentIndex = 1;
//DEBUG2("In IP MIB Show : %s\n",pptcArguments[0]);
for (i = 0; i < sizeof(MIBObjectMap)/sizeof(MIB_OBJECT_PARSER); i++)
{
if (MatchToken(ppwcArguments[0],MIBObjectMap[i].pwszMIBObj))
{
dwIndex = i;
bFound = TRUE;
break;
}
}
if (!bFound)
{
return ERROR_CMD_NOT_FOUND;
}
#if 0
//
// Special case for MFEs where MFE type is specified
// before index option
//
if ( ( MIBVar[ 2 * dwIndex ].dwId is MCAST_MFE ) ||
( MIBVar[ 2 * dwIndex ].dwId is MCAST_MFE_STATS ) )
{
if ( dwArgCount > 1 )
{
if ( !_wcsnicmp( ppwcArguments[ 1 ], L"TYPE=", 5 ) )
{
wcscpy( ppwcArguments[ 1 ], &ppwcArguments[ 1 ][ 5 ] );
}
dwErr = MatchEnumTag(
g_hModule, ppwcArguments[ 1 ],
NUM_TOKENS_IN_TABLE( tvMfeTypes ), tvMfeTypes,
&dwType
);
}
else
{
dwErr = ERROR_INVALID_PARAMETER;
}
if (dwErr isnot NO_ERROR)
{
return ERROR_INVALID_SYNTAX;
}
dwErr = GetMibTagToken(&ppwcArguments[2],
dwArgCount - 2,
MIBObjectMap[dwIndex].dwMinOptArg,
&dwRR,
&bIndex,
&dwInd);
}
else
#endif
{
dwErr = GetMibTagToken(&ppwcArguments[1],
dwArgCount - 1,
MIBObjectMap[dwIndex].dwMinOptArg,
&dwRR,
&bIndex,
&dwInd);
}
if (dwErr isnot NO_ERROR)
{
return ERROR_INVALID_SYNTAX;
}
if (bIndex)
{
dwMIBIndex = dwIndex * 2;
bOptPresent = TRUE;
}
else
{
dwMIBIndex = dwIndex * 2 + 1;
}
//
// Convert refresh rate to msec
//
dwRR *= 1000;
if (!InitializeConsole(&dwRR, &hMib, &g_hConsole))
{
return ERROR_INIT_DISPLAY;
}
//
// Query the MIB
//
pQuery = NULL;
for ( ; ; )
{
if(dwRR)
{
DisplayMessageToConsole(g_hModule,
g_hConsole,
MSG_CTRL_C_TO_QUIT);
}
// always...
{
if (!(dwMIBIndex % 2))
{
(*MIBObjectMap[dwIndex].pfnMIBObjParser)(ppwcArguments,
1,
dwIndices,
&dwNumParsed);
}
dwQuerySize = ( sizeof( MIB_OPAQUE_QUERY ) - sizeof( DWORD ) ) +
(dwNumParsed) * sizeof(DWORD);
pQuery = (PMIB_OPAQUE_QUERY)HeapAlloc(GetProcessHeap(),
0,
dwQuerySize);
if (pQuery is NULL)
{
dwErr = ERROR_NOT_ENOUGH_MEMORY;
DisplayMessage(g_hModule, MSG_IP_NOT_ENOUGH_MEMORY);
return dwErr;
}
pQuery->dwVarId = MIBVar[dwMIBIndex].dwId;
for( i = 0; i < dwNumParsed; i++ )
{
pQuery->rgdwVarIndex[i] = dwIndices[i];
}
dwResult = MibGet( PID_IP,
IPRTRMGR_PID,
(PVOID) pQuery,
dwQuerySize,
(PVOID *) &pRpcInfo,
&dwOutEntrySize );
if ( dwResult isnot NO_ERROR )
{
DisplayMessage(g_hModule, MSG_IP_DIM_ERROR, dwResult );
return dwResult;
}
if ( pRpcInfo is NULL )
{
DisplayMessage(g_hModule, MSG_IP_NO_ENTRIES );
return dwResult;
}
(*MIBVar[dwMIBIndex].pfnPrintFunction)(g_hMIBServer, pRpcInfo);
MprAdminMIBBufferFree( (PVOID) pRpcInfo );
}
if(pQuery != NULL )
{
HeapFree(GetProcessHeap(),0,pQuery);
}
if (!RefreshConsole(hMib, g_hConsole, dwRR))
{
break;
}
}
return dwResult;
}
VOID
PrintIfTable(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints interface table information
Arguments:
Return Value:
--*/
{
PMIB_IFTABLE lprpcTable = (PMIB_IFTABLE)(prpcInfo->rgbyData);
PTCHAR ptszIfType, ptszOper, ptszAdmin;
TCHAR tszDescr[MAXLEN_IFDESCR + 1], tszIfName[MAX_INTERFACE_NAME_LEN + 1];
TCHAR tszPhysAddr[DISPLAYLEN_PHYSADDR + 1];
WCHAR wszBuffer[MAX_INTERFACE_NAME_LEN+1];
DWORD dwSize;
DWORD dwCount = lprpcTable->dwNumEntries;
DWORD i;
DisplayMessageToConsole(g_hModule,
g_hConsole,
MSG_MIB_IF_HDR);
if ( dwCount is 0 )
{
DisplayMessageToConsole(g_hModule, g_hConsole, MSG_IP_NO_ENTRIES);
return;
}
for(i = 0; i < dwCount; i++)
{
switch(lprpcTable->table[i].dwType)
{
case IF_TYPE_ETHERNET_CSMACD:
{
ptszIfType = MakeString(g_hModule, STRING_ETHERNET);
break;
}
case IF_TYPE_ISO88025_TOKENRING:
{
ptszIfType = MakeString(g_hModule, STRING_TOKENRING);
break;
}
case IF_TYPE_FDDI:
{
ptszIfType = MakeString(g_hModule, STRING_FDDI);
break;
}
case IF_TYPE_PPP:
{
ptszIfType = MakeString(g_hModule, STRING_PPP);
break;
}
case IF_TYPE_SOFTWARE_LOOPBACK:
{
ptszIfType = MakeString(g_hModule, STRING_LOOPBACK);
break;
}
case IF_TYPE_SLIP:
{
ptszIfType = MakeString(g_hModule, STRING_SLIP);
break;
}
case IF_TYPE_OTHER:
default:
{
ptszIfType = MakeString(g_hModule, STRING_OTHER);
break;
}
}
switch(lprpcTable->table[i].dwAdminStatus)
{
case IF_ADMIN_STATUS_UP:
{
ptszAdmin = MakeString(g_hModule, STRING_UP);
break;
}
case IF_ADMIN_STATUS_TESTING:
{
ptszAdmin = MakeString(g_hModule, STRING_TESTING);
break;
}
case IF_ADMIN_STATUS_DOWN:
default:
{
ptszAdmin = MakeString(g_hModule, STRING_DOWN);
break;
}
}
switch(lprpcTable->table[i].dwOperStatus)
{
case IF_OPER_STATUS_UNREACHABLE:
{
ptszOper = MakeString(g_hModule, STRING_UNREACHABLE);
break;
}
case IF_OPER_STATUS_DISCONNECTED:
{
ptszOper = MakeString(g_hModule, STRING_DISCONNECTED);
break;
}
case IF_OPER_STATUS_CONNECTING:
{
ptszOper = MakeString(g_hModule, STRING_CONNECTING);
break;
}
case IF_OPER_STATUS_CONNECTED:
{
ptszOper = MakeString(g_hModule, STRING_CONNECTED);
break;
}
case IF_OPER_STATUS_OPERATIONAL:
{
ptszOper = MakeString(g_hModule, STRING_OPERATIONAL);
break;
}
case IF_OPER_STATUS_NON_OPERATIONAL:
default:
{
ptszOper = MakeString(g_hModule, STRING_NON_OPERATIONAL);
break;
}
}
#ifdef UNICODE
wcscpy(tszIfName, lprpcTable->table[i].wszName);
MultiByteToWideChar(GetConsoleOutputCP(),
0,
lprpcTable->table[i].bDescr,
-1,
tszDescr,
MAXLEN_IFDESCR);
#else
WideCharToMultiByte(GetConsoleOutputCP(),
0,
lprpcTable->table[i].wszName,
-1,
tszIfName,
MAX_INTERFACE_NAME_LEN,
NULL,
NULL);
strcpy(tszDescr,lprpcTable->table[i].bDescr);
#endif
if (lprpcTable->table[i].dwPhysAddrLen == 0)
{
tszPhysAddr[0] = TEXT('\0');
}
else
{
MakeUnicodePhysAddr(tszPhysAddr,
lprpcTable->table[i].bPhysAddr,
lprpcTable->table[i].dwPhysAddrLen);
}
dwSize = sizeof(wszBuffer);
IfutlGetInterfaceDescription( tszIfName, wszBuffer, &dwSize );
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_INTERFACE,
lprpcTable->table[i].dwIndex,
wszBuffer,
tszIfName,
ptszIfType,
lprpcTable->table[i].dwMtu,
lprpcTable->table[i].dwSpeed,
tszPhysAddr,
ptszAdmin,
ptszOper,
lprpcTable->table[i].dwLastChange,
lprpcTable->table[i].dwInOctets,
lprpcTable->table[i].dwInUcastPkts,
lprpcTable->table[i].dwInNUcastPkts,
lprpcTable->table[i].dwInDiscards,
lprpcTable->table[i].dwInErrors,
lprpcTable->table[i].dwInUnknownProtos,
lprpcTable->table[i].dwOutOctets,
lprpcTable->table[i].dwOutUcastPkts,
lprpcTable->table[i].dwOutNUcastPkts,
lprpcTable->table[i].dwOutDiscards,
lprpcTable->table[i].dwOutErrors,
lprpcTable->table[i].dwOutQLen,
tszDescr);
FreeString(ptszIfType);
FreeString(ptszAdmin);
FreeString(ptszOper);
}
}
VOID
PrintIfRow(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints interface row information
Arguments:
Return Value:
--*/
{
PMIB_IFROW ieRow = (PMIB_IFROW)(prpcInfo->rgbyData);
PTCHAR ptszIfType, ptszOper, ptszAdmin;
TCHAR tszDescr[MAXLEN_IFDESCR + 1], tszIfName[MAX_INTERFACE_NAME_LEN + 1];
TCHAR tszPhysAddr[DISPLAYLEN_PHYSADDR + 1];
WCHAR wszBuffer[MAX_INTERFACE_NAME_LEN+1];
DWORD dwSize;
DisplayMessageToConsole(g_hModule,
g_hConsole,
MSG_MIB_IF_HDR);
switch(ieRow->dwType)
{
case IF_TYPE_ETHERNET_CSMACD:
{
ptszIfType = MakeString(g_hModule, STRING_ETHERNET);
break;
}
case IF_TYPE_ISO88025_TOKENRING:
{
ptszIfType = MakeString(g_hModule, STRING_TOKENRING);
break;
}
case IF_TYPE_FDDI:
{
ptszIfType = MakeString(g_hModule, STRING_FDDI);
break;
}
case IF_TYPE_PPP:
{
ptszIfType = MakeString(g_hModule, STRING_PPP);
break;
}
case IF_TYPE_SOFTWARE_LOOPBACK:
{
ptszIfType = MakeString(g_hModule, STRING_LOOPBACK);
break;
}
case IF_TYPE_SLIP:
{
ptszIfType = MakeString(g_hModule, STRING_SLIP);
break;
}
case IF_TYPE_OTHER:
default:
{
ptszIfType = MakeString(g_hModule, STRING_OTHER);
break;
}
}
switch(ieRow->dwAdminStatus)
{
case IF_ADMIN_STATUS_UP:
{
ptszAdmin = MakeString(g_hModule, STRING_UP);
break;
}
case IF_ADMIN_STATUS_TESTING:
{
ptszAdmin = MakeString(g_hModule, STRING_TESTING);
break;
}
case IF_ADMIN_STATUS_DOWN:
default:
{
ptszAdmin = MakeString(g_hModule, STRING_DOWN);
break;
}
}
switch(ieRow->dwOperStatus)
{
case IF_OPER_STATUS_UNREACHABLE:
{
ptszOper = MakeString(g_hModule, STRING_UNREACHABLE);
break;
}
case IF_OPER_STATUS_DISCONNECTED:
{
ptszOper = MakeString(g_hModule, STRING_DISCONNECTED);
break;
}
case IF_OPER_STATUS_CONNECTING:
{
ptszOper = MakeString(g_hModule, STRING_CONNECTING);
break;
}
case IF_OPER_STATUS_CONNECTED:
{
ptszOper = MakeString(g_hModule, STRING_CONNECTED);
break;
}
case IF_OPER_STATUS_OPERATIONAL:
{
ptszOper = MakeString(g_hModule, STRING_OPERATIONAL);
break;
}
case IF_OPER_STATUS_NON_OPERATIONAL:
default:
{
ptszOper = MakeString(g_hModule, STRING_NON_OPERATIONAL);
break;
}
}
#ifdef UNICODE
wcscpy(tszIfName, ieRow->wszName);
MultiByteToWideChar(GetConsoleOutputCP(),
0,
ieRow->bDescr,
-1,
tszDescr,
MAXLEN_IFDESCR);
#else
WideCharToMultiByte(GetConsoleOutputCP(),
0,
ieRow->wszName,
-1,
tszIfName,
MAX_INTERFACE_NAME_LEN,
NULL,
NULL);
strcpy(tszDescr,ieRow->bDescr);
#endif
if (ieRow->dwPhysAddrLen == 0)
{
tszPhysAddr[0] = TEXT('\0');
}
else
{
MakeUnicodePhysAddr(tszPhysAddr,ieRow->bPhysAddr,ieRow->dwPhysAddrLen);
}
dwSize = sizeof(wszBuffer);
IfutlGetInterfaceDescription( tszIfName, wszBuffer, &dwSize );
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_INTERFACE,
ieRow->dwIndex,
wszBuffer,
tszIfName,
ptszIfType,
ieRow->dwMtu,
ieRow->dwSpeed,
tszPhysAddr,
ptszAdmin,
ptszOper,
ieRow->dwLastChange,
ieRow->dwInOctets,
ieRow->dwInUcastPkts,
ieRow->dwInNUcastPkts,
ieRow->dwInDiscards,
ieRow->dwInErrors,
ieRow->dwInUnknownProtos,
ieRow->dwOutOctets,
ieRow->dwOutUcastPkts,
ieRow->dwOutNUcastPkts,
ieRow->dwOutDiscards,
ieRow->dwOutErrors,
ieRow->dwOutQLen,
tszDescr);
FreeString(ptszIfType);
FreeString(ptszAdmin);
FreeString(ptszOper);
}
VOID
PrintIcmp(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints ICMP information.
Arguments:
Return Value:
--*/
{
PMIB_ICMP lprpcIcmp = (PMIB_ICMP)(prpcInfo->rgbyData);
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_ICMP,
lprpcIcmp->stats.icmpInStats.dwMsgs,
lprpcIcmp->stats.icmpInStats.dwErrors,
lprpcIcmp->stats.icmpInStats.dwDestUnreachs,
lprpcIcmp->stats.icmpInStats.dwTimeExcds,
lprpcIcmp->stats.icmpInStats.dwParmProbs,
lprpcIcmp->stats.icmpInStats.dwSrcQuenchs,
lprpcIcmp->stats.icmpInStats.dwRedirects,
lprpcIcmp->stats.icmpInStats.dwEchos,
lprpcIcmp->stats.icmpInStats.dwEchoReps,
lprpcIcmp->stats.icmpInStats.dwTimestamps,
lprpcIcmp->stats.icmpInStats.dwTimestampReps,
lprpcIcmp->stats.icmpInStats.dwAddrMasks,
lprpcIcmp->stats.icmpInStats.dwAddrMaskReps,
lprpcIcmp->stats.icmpOutStats.dwMsgs,
lprpcIcmp->stats.icmpOutStats.dwErrors,
lprpcIcmp->stats.icmpOutStats.dwDestUnreachs,
lprpcIcmp->stats.icmpOutStats.dwTimeExcds,
lprpcIcmp->stats.icmpOutStats.dwParmProbs,
lprpcIcmp->stats.icmpOutStats.dwSrcQuenchs,
lprpcIcmp->stats.icmpOutStats.dwRedirects,
lprpcIcmp->stats.icmpOutStats.dwEchos,
lprpcIcmp->stats.icmpOutStats.dwEchoReps,
lprpcIcmp->stats.icmpOutStats.dwTimestamps,
lprpcIcmp->stats.icmpOutStats.dwTimestampReps,
lprpcIcmp->stats.icmpOutStats.dwAddrMasks,
lprpcIcmp->stats.icmpOutStats.dwAddrMaskReps);
}
VOID
PrintUdpStats(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints UDP statistics.
Arguments:
Return Value:
--*/
{
PMIB_UDPSTATS lprpcUdp = (PMIB_UDPSTATS)(prpcInfo->rgbyData);
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_UDP_STATS,
lprpcUdp->dwInDatagrams,
lprpcUdp->dwNoPorts,
lprpcUdp->dwInErrors,
lprpcUdp->dwOutDatagrams);
}
VOID
PrintUdpTable(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints UDP table information.
Arguments:
Return Value:
--*/
{
PMIB_UDPTABLE lprpcTable = (PMIB_UDPTABLE)(prpcInfo->rgbyData);
TCHAR tszAddr[ADDR_LENGTH + 1];
DWORD i;
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_UDP_ENTRY_HDR);
if(lprpcTable->dwNumEntries is 0)
{
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_IP_NO_ENTRIES);
return;
}
for(i = 0; i < lprpcTable->dwNumEntries; i++)
{
MakeUnicodeIpAddr(tszAddr,
inet_ntoa(*((struct in_addr *)(&lprpcTable->table[i].dwLocalAddr))));
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_UDP_ENTRY,
tszAddr,
ntohs((WORD)lprpcTable->table[i].dwLocalPort));
}
}
VOID
PrintUdpRow(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints UDP row information.
Arguments:
Return Value:
--*/
{
PMIB_UDPROW ueRow = (PMIB_UDPROW)(prpcInfo->rgbyData);
TCHAR tszAddr[ADDR_LENGTH + 1];
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_UDP_ENTRY_HDR);
MakeUnicodeIpAddr(tszAddr,inet_ntoa(*((struct in_addr *)
(&ueRow->dwLocalAddr))));
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_UDP_ENTRY,
tszAddr,
ntohs((WORD)ueRow->dwLocalPort));
}
VOID
PrintTcpStats(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints TCP Statistics
Arguments:
Return Value:
--*/
{
PMIB_TCPSTATS lprpcTcp = (PMIB_TCPSTATS)(prpcInfo->rgbyData);
PTCHAR ptszMaxConn, ptszAlgo;
switch(lprpcTcp->dwRtoAlgorithm)
{
case MIB_TCP_RTO_CONSTANT:
{
ptszAlgo = MakeString(g_hModule, STRING_CONSTANT);
break;
}
case MIB_TCP_RTO_RSRE:
{
ptszAlgo = MakeString(g_hModule, STRING_RSRE);
break;
}
case MIB_TCP_RTO_VANJ:
{
ptszAlgo = MakeString(g_hModule, STRING_VANJ);
break;
}
case MIB_TCP_RTO_OTHER:
default:
{
ptszAlgo = MakeString(g_hModule, STRING_OTHER);
break;
}
}
if(lprpcTcp->dwMaxConn is MIB_TCP_MAXCONN_DYNAMIC)
{
ptszMaxConn = MakeString(g_hModule, STRING_DYNAMIC);
}
else
{
ptszMaxConn = HeapAlloc(GetProcessHeap(),0,20);
if(ptszMaxConn is NULL)
{
return;
}
_stprintf(ptszMaxConn,TEXT("%d"),lprpcTcp->dwMaxConn);
}
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_TCP_STATS,
ptszAlgo,
lprpcTcp->dwRtoMin,
lprpcTcp->dwRtoMax,
ptszMaxConn,
lprpcTcp->dwActiveOpens,
lprpcTcp->dwPassiveOpens,
lprpcTcp->dwAttemptFails,
lprpcTcp->dwEstabResets,
lprpcTcp->dwCurrEstab,
lprpcTcp->dwInSegs,
lprpcTcp->dwOutSegs,
lprpcTcp->dwRetransSegs,
lprpcTcp->dwInErrs,
lprpcTcp->dwOutRsts);
FreeString(ptszAlgo);
if(lprpcTcp->dwMaxConn is MIB_TCP_MAXCONN_DYNAMIC)
{
FreeString(ptszMaxConn);
}
else
{
HeapFree(GetProcessHeap,0,ptszMaxConn);
}
}
VOID
PrintTcpTable(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints TCP table information.
Arguments:
Return Value:
--*/
{
PMIB_TCPTABLE lprpcTable = (PMIB_TCPTABLE)(prpcInfo->rgbyData);
TCHAR tszLAddr[ADDR_LENGTH + 1], tszRAddr[ADDR_LENGTH + 1];
PTCHAR ptszState;
DWORD i;
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_TCP_ENTRY_HDR);
if(lprpcTable->dwNumEntries is 0)
{
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_IP_NO_ENTRIES);
return;
}
for(i = 0; i < lprpcTable->dwNumEntries; i++)
{
switch(lprpcTable->table[i].dwState)
{
case MIB_TCP_STATE_CLOSED:
{
ptszState = MakeString(g_hModule, STRING_CLOSED);
break;
}
case MIB_TCP_STATE_LISTEN:
{
ptszState = MakeString(g_hModule, STRING_LISTEN);
break;
}
case MIB_TCP_STATE_SYN_SENT:
{
ptszState = MakeString(g_hModule, STRING_SYN_SENT);
break;
}
case MIB_TCP_STATE_SYN_RCVD:
{
ptszState = MakeString(g_hModule, STRING_SYN_RCVD);
break;
}
case MIB_TCP_STATE_ESTAB:
{
ptszState = MakeString(g_hModule, STRING_ESTAB);
break;
}
case MIB_TCP_STATE_FIN_WAIT1:
{
ptszState = MakeString(g_hModule, STRING_FIN_WAIT1);
break;
}
case MIB_TCP_STATE_FIN_WAIT2:
{
ptszState = MakeString(g_hModule, STRING_FIN_WAIT2);
break;
}
case MIB_TCP_STATE_CLOSE_WAIT:
{
ptszState = MakeString(g_hModule, STRING_CLOSE_WAIT);
break;
}
case MIB_TCP_STATE_CLOSING:
{
ptszState = MakeString(g_hModule, STRING_CLOSING);
break;
}
case MIB_TCP_STATE_LAST_ACK:
{
ptszState = MakeString(g_hModule, STRING_LAST_ACK);
break;
}
case MIB_TCP_STATE_TIME_WAIT:
{
ptszState = MakeString(g_hModule, STRING_TIME_WAIT);
break;
}
case MIB_TCP_STATE_DELETE_TCB :
{
ptszState = MakeString(g_hModule, STRING_DELETE_TCB);
break;
}
}
MakeUnicodeIpAddr(tszLAddr,
inet_ntoa(*((struct in_addr *)
(&lprpcTable->table[i].dwLocalAddr))));
MakeUnicodeIpAddr(tszRAddr,
inet_ntoa(*((struct in_addr *)
(&lprpcTable->table[i].dwRemoteAddr))));
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_TCP_ENTRY,
tszLAddr,
ntohs((WORD)lprpcTable->table[i].dwLocalPort),
tszRAddr,
ntohs((WORD)lprpcTable->table[i].dwRemotePort),
ptszState);
FreeString(ptszState);
}
}
VOID
PrintTcpRow(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints TCP row information.
Arguments:
Return Value:
--*/
{
PMIB_TCPROW tcteRow = (PMIB_TCPROW)(prpcInfo->rgbyData);
TCHAR tszLAddr[ADDR_LENGTH + 1], tszRAddr[ADDR_LENGTH + 1];
PTCHAR ptszState;
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_TCP_ENTRY_HDR);
switch(tcteRow->dwState)
{
case MIB_TCP_STATE_CLOSED:
{
ptszState = MakeString(g_hModule, STRING_CLOSED);
break;
}
case MIB_TCP_STATE_LISTEN:
{
ptszState = MakeString(g_hModule, STRING_LISTEN);
break;
}
case MIB_TCP_STATE_SYN_SENT:
{
ptszState = MakeString(g_hModule, STRING_SYN_SENT);
break;
}
case MIB_TCP_STATE_SYN_RCVD:
{
ptszState = MakeString(g_hModule, STRING_SYN_RCVD);
break;
}
case MIB_TCP_STATE_ESTAB:
{
ptszState = MakeString(g_hModule, STRING_ESTAB);
break;
}
case MIB_TCP_STATE_FIN_WAIT1:
{
ptszState = MakeString(g_hModule, STRING_FIN_WAIT1);
break;
}
case MIB_TCP_STATE_FIN_WAIT2:
{
ptszState = MakeString(g_hModule, STRING_FIN_WAIT2);
break;
}
case MIB_TCP_STATE_CLOSE_WAIT:
{
ptszState = MakeString(g_hModule, STRING_CLOSE_WAIT);
break;
}
case MIB_TCP_STATE_CLOSING:
{
ptszState = MakeString(g_hModule, STRING_CLOSING);
break;
}
case MIB_TCP_STATE_LAST_ACK:
{
ptszState = MakeString(g_hModule, STRING_LAST_ACK);
break;
}
case MIB_TCP_STATE_TIME_WAIT:
{
ptszState = MakeString(g_hModule, STRING_TIME_WAIT);
break;
}
case MIB_TCP_STATE_DELETE_TCB :
{
ptszState = MakeString(g_hModule, STRING_DELETE_TCB);
break;
}
}
MakeUnicodeIpAddr(tszLAddr, inet_ntoa(*((struct in_addr *)
(&tcteRow->dwLocalAddr))));
MakeUnicodeIpAddr(tszRAddr, inet_ntoa(*((struct in_addr *)
(&tcteRow->dwRemoteAddr))));
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_TCP_ENTRY,
tszLAddr,
ntohs((WORD)tcteRow->dwLocalPort),
tszRAddr,
ntohs((WORD)tcteRow->dwRemotePort),
ptszState);
FreeString(ptszState);
}
VOID
PrintIpStats(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
{
PMIB_IPSTATS lprpcIp = (PMIB_IPSTATS)(prpcInfo->rgbyData);
PTCHAR ptszForw;
if(lprpcIp->dwForwarding is MIB_IP_FORWARDING)
{
ptszForw = MakeString(g_hModule, STRING_ENABLED);
}
else
{
ptszForw = MakeString(g_hModule, STRING_DISABLED);
}
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_STATS,
ptszForw,
lprpcIp->dwDefaultTTL,
lprpcIp->dwInReceives,
lprpcIp->dwInHdrErrors,
lprpcIp->dwInAddrErrors,
lprpcIp->dwForwDatagrams,
lprpcIp->dwInUnknownProtos,
lprpcIp->dwInDiscards,
lprpcIp->dwInDelivers,
lprpcIp->dwOutRequests,
lprpcIp->dwRoutingDiscards,
lprpcIp->dwOutDiscards,
lprpcIp->dwOutNoRoutes,
lprpcIp->dwReasmTimeout,
lprpcIp->dwReasmReqds,
lprpcIp->dwReasmOks,
lprpcIp->dwReasmFails,
lprpcIp->dwFragOks,
lprpcIp->dwFragFails,
lprpcIp->dwFragCreates);
FreeString(ptszForw);
}
VOID
PrintIpAddrTable(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints IP address table.
Arguments:
Return Value:
--*/
{
WCHAR wszFriendlyName[MAX_INTERFACE_NAME_LEN + 1];
PMIB_IPADDRTABLE lprpcTable;
TCHAR tszAddr[ADDR_LENGTH + 1], tszMask[ADDR_LENGTH + 1];
DWORD i, dwErr = NO_ERROR;
lprpcTable = (PMIB_IPADDRTABLE)(prpcInfo->rgbyData);
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_ADDR_HDR);
if(lprpcTable->dwNumEntries is 0)
{
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_IP_NO_ENTRIES);
return;
}
for(i = 0; i < lprpcTable->dwNumEntries; i++)
{
DWORD BufLen;
MakeUnicodeIpAddr(tszAddr,
inet_ntoa(*((struct in_addr *)
(&lprpcTable->table[i].dwAddr))));
MakeUnicodeIpAddr(tszMask,
inet_ntoa(*((struct in_addr *)
(&lprpcTable->table[i].dwMask))));
BufLen = sizeof(wszFriendlyName);
dwErr = IfutlGetFriendlyNameFromIfIndex( hMibServer,
lprpcTable->table[i].dwIndex,
wszFriendlyName,//in bytes. not chars
BufLen );
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_ADDR_ENTRY,
tszAddr,
tszMask,
lprpcTable->table[i].dwBCastAddr,
lprpcTable->table[i].dwReasmSize,
wszFriendlyName
);
}
}
VOID
PrintIpAddrRow(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints IP address table row.
Arguments:
Return Value:
--*/
{
WCHAR wszFriendlyName[MAX_INTERFACE_NAME_LEN + 1];
PMIB_IPADDRROW iaeRow = (PMIB_IPADDRROW)(prpcInfo->rgbyData);
DWORD dwErr = NO_ERROR;
TCHAR tszAddr[ADDR_LENGTH + 1], tszMask[ADDR_LENGTH + 1];
DWORD BufLen;
MakeUnicodeIpAddr(tszAddr,
inet_ntoa(*((struct in_addr *)(&iaeRow->dwAddr))));
MakeUnicodeIpAddr(tszMask,
inet_ntoa(*((struct in_addr *)(&iaeRow->dwMask))));
BufLen = sizeof(wszFriendlyName);
dwErr = IfutlGetFriendlyNameFromIfIndex( hMibServer,
iaeRow->dwIndex,
wszFriendlyName,//in bytes. not chars
BufLen );
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_ADDR_HDR);
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_ADDR_ENTRY,
tszAddr,
tszMask,
iaeRow->dwBCastAddr,
iaeRow->dwReasmSize,
wszFriendlyName );
}
VOID
PrintIpNetTable(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints IP net table information.
Arguments:
Return Value:
--*/
{
WCHAR wszFriendlyName[MAX_INTERFACE_NAME_LEN + 1];
PMIB_IPNETTABLE lprpcTable = (PMIB_IPNETTABLE)(prpcInfo->rgbyData);
TCHAR tszPhysAddr[DISPLAYLEN_PHYSADDR + 1],
tszIpAddr[ADDR_LENGTH + 1];
PTCHAR ptszType;
DWORD i, dwErr = NO_ERROR;
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_NET_HDR);
if(lprpcTable->dwNumEntries is 0)
{
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_IP_NO_ENTRIES);
return;
}
for(i = 0; i < lprpcTable->dwNumEntries; i++)
{
DWORD BufLen;
switch(lprpcTable->table[i].dwType)
{
case MIB_IPNET_TYPE_INVALID:
{
ptszType = MakeString(g_hModule, STRING_INVALID);
break;
}
case MIB_IPNET_TYPE_DYNAMIC:
{
ptszType = MakeString(g_hModule, STRING_DYNAMIC);
break;
}
case MIB_IPNET_TYPE_STATIC:
{
ptszType = MakeString(g_hModule, STRING_STATIC);
break;
}
case MIB_IPNET_TYPE_OTHER:
default:
{
ptszType = MakeString(g_hModule, STRING_OTHER);
break;
}
}
MakeUnicodeIpAddr(tszIpAddr,
inet_ntoa(*((struct in_addr *)
(&lprpcTable->table[i].dwAddr))));
MakeUnicodePhysAddr(tszPhysAddr,
lprpcTable->table[i].bPhysAddr,
lprpcTable->table[i].dwPhysAddrLen);
BufLen = sizeof(wszFriendlyName);
dwErr = IfutlGetFriendlyNameFromIfIndex( hMibServer,
lprpcTable->table[i].dwIndex,
wszFriendlyName,//in bytes. not chars
BufLen);
if (dwErr != NO_ERROR) {
wcscpy(wszFriendlyName, L"?");
}
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_NET_ENTRY,
wszFriendlyName,
tszPhysAddr,
tszIpAddr,
ptszType);
FreeString(ptszType);
}
}
VOID
PrintIpNetRow(
MIB_SERVER_HANDLE hMibServer,
PMIB_OPAQUE_INFO prpcInfo
)
/*++
Routine Description:
Prints IP net row information.
Arguments:
Return Value:
--*/
{
WCHAR wszFriendlyName[MAX_INTERFACE_NAME_LEN + 1];
PMIB_IPNETROW inmeRow = (PMIB_IPNETROW)(prpcInfo->rgbyData);
TCHAR tszPhysAddr[DISPLAYLEN_PHYSADDR + 1],
tszIpAddr[ADDR_LENGTH + 1];
PTCHAR ptszType;
DWORD dwErr = NO_ERROR;
DWORD BufLen;
switch(inmeRow->dwType)
{
case MIB_IPNET_TYPE_INVALID:
{
ptszType = MakeString(g_hModule, STRING_INVALID);
break;
}
case MIB_IPNET_TYPE_DYNAMIC:
{
ptszType = MakeString(g_hModule, STRING_DYNAMIC);
break;
}
case MIB_IPNET_TYPE_STATIC:
{
ptszType = MakeString(g_hModule, STRING_STATIC);
break;
}
case MIB_IPNET_TYPE_OTHER:
default:
{
ptszType = MakeString(g_hModule, STRING_OTHER);
break;
}
}
MakeUnicodeIpAddr(tszIpAddr,
inet_ntoa(*((struct in_addr *)(&inmeRow->dwAddr))));
MakeUnicodePhysAddr(tszPhysAddr,inmeRow->bPhysAddr,inmeRow->dwPhysAddrLen);
BufLen = sizeof(wszFriendlyName);
dwErr = IfutlGetFriendlyNameFromIfIndex( hMibServer,
inmeRow->dwIndex,
wszFriendlyName,
BufLen);//in bytes. not chars
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_NET_HDR);
DisplayMessageToConsole(g_hModule, g_hConsole,MSG_MIB_IP_NET_ENTRY,
wszFriendlyName,
tszPhysAddr,
tszIpAddr,
ptszType);
FreeString(ptszType);
}