|
|
/*++
Copyright (c) 1999, Microsoft Corporation
Module Name:
sample\samplemib.c
Abstract:
The file contains functions to display SAMPLE ip protocol's MIB.
--*/
#include "precomp.h"
#pragma hdrstop
VOID PrintGlobalStats( IN HANDLE hConsole, IN HANDLE hMibServer, IN PVOID pvOutput, IN FORMAT fFormat );
VOID PrintIfStats( IN HANDLE hConsole, IN HANDLE hMibServer, IN PVOID pvOutput, IN FORMAT fFormat );
VOID PrintIfBinding( IN HANDLE hConsole, IN HANDLE hMibServer, IN PVOID pvOutput, IN FORMAT fFormat );
MIB_OBJECT_ENTRY rgMibObjectTable[] = { {TOKEN_GLOBALSTATS, IPSAMPLE_GLOBAL_STATS_ID, NULL, 0, PrintGlobalStats}, {TOKEN_IFSTATS, IPSAMPLE_IF_STATS_ID, GetIfIndex, MSG_SAMPLE_MIB_IFSTATS_HEADER, PrintIfStats}, {TOKEN_IFBINDING, IPSAMPLE_IF_BINDING_ID, GetIfIndex, MSG_SAMPLE_MIB_IFBINDING_HEADER, PrintIfBinding}, };
#define MAX_MIB_OBJECTS \
(sizeof(rgMibObjectTable) / sizeof(MIB_OBJECT_ENTRY))
#define MAX_GLOBAL_MIB_OBJECTS 1
VOID PrintGlobalStats( IN HANDLE hConsole, IN HANDLE hMibServer, IN PVOID pvOutput, IN FORMAT fFormat ) /*++
Routine Description: Prints sample global statistics
--*/ { PIPSAMPLE_MIB_GET_OUTPUT_DATA pimgod = ((PIPSAMPLE_MIB_GET_OUTPUT_DATA) pvOutput); PIPSAMPLE_GLOBAL_STATS pGlobalStats = ((PIPSAMPLE_GLOBAL_STATS) pimgod->IMGOD_Buffer); DisplayMessageToConsole(g_hModule, hConsole, MSG_SAMPLE_MIB_GS, pGlobalStats->ulNumInterfaces); }
VOID PrintIfStats( IN HANDLE hConsole, IN HANDLE hMibServer, IN PVOID pvOutput, IN FORMAT fFormat ) /*++
Routine Description: Prints SAMPLE interface statistics
--*/ { PIPSAMPLE_MIB_GET_OUTPUT_DATA pimgod = ((PIPSAMPLE_MIB_GET_OUTPUT_DATA) pvOutput); PIPSAMPLE_IF_STATS pIfStats = ((PIPSAMPLE_IF_STATS) pimgod->IMGOD_Buffer); WCHAR pwszIfName[MAX_INTERFACE_NAME_LEN + 1] = L"\0";
InterfaceNameFromIndex(hMibServer, pimgod->IMGOD_IfIndex, pwszIfName, sizeof(pwszIfName));
DisplayMessageToConsole(g_hModule, hConsole, (fFormat is FORMAT_VERBOSE) ? MSG_SAMPLE_MIB_IFSTATS : MSG_SAMPLE_MIB_IFSTATS_ENTRY, pwszIfName, pIfStats->ulNumPackets); }
VOID PrintIfBinding( IN HANDLE hConsole, IN HANDLE hMibServer, IN PVOID pvOutput, IN FORMAT fFormat ) /*++
Routine Description: Prints SAMPLE interface binding
--*/ { PIPSAMPLE_MIB_GET_OUTPUT_DATA pimgod = ((PIPSAMPLE_MIB_GET_OUTPUT_DATA) pvOutput); PIPSAMPLE_IF_BINDING pIfBinding = ((PIPSAMPLE_IF_BINDING) pimgod->IMGOD_Buffer); WCHAR pwszIfName[MAX_INTERFACE_NAME_LEN + 1] = L"\0"; PWCHAR pwszBindState = L"\0", pwszActiveState = L"\0";
PIPSAMPLE_IP_ADDRESS pBinding = NULL; WCHAR pwszAddress[ADDR_LENGTH + 1] = L"\0", pwszMask[ADDR_LENGTH + 1] = L"\0"; ULONG i; InterfaceNameFromIndex(hMibServer, pimgod->IMGOD_IfIndex, pwszIfName, sizeof(pwszIfName));
pwszBindState = MakeString(g_hModule, ((pIfBinding->dwState&IPSAMPLE_STATE_BOUND) ? STRING_BOUND : STRING_UNBOUND)); pwszActiveState = MakeString(g_hModule, ((pIfBinding->dwState&IPSAMPLE_STATE_ACTIVE) ? STRING_ACTIVE : STRING_INACTIVE));
DisplayMessageToConsole(g_hModule, hConsole, (fFormat is FORMAT_VERBOSE) ? MSG_SAMPLE_MIB_IFBINDING : MSG_SAMPLE_MIB_IFBINDING_ENTRY, pwszIfName, pwszBindState, pwszActiveState);
pBinding = IPSAMPLE_IF_ADDRESS_TABLE(pIfBinding);
for(i = 0; i < pIfBinding->ulCount; i++) { UnicodeIpAddress(pwszAddress, INET_NTOA(pBinding[i].dwAddress)); UnicodeIpAddress(pwszMask, INET_NTOA(pBinding[i].dwMask)); DisplayMessageToConsole(g_hModule, hConsole, MSG_SAMPLE_MIB_IFBINDING_ADDR, pwszAddress, pwszMask); }
if (pwszBindState) FreeString(pwszBindState); if (pwszActiveState) FreeString(pwszActiveState); }
DWORD WINAPI HandleSampleMibShowObject( IN PWCHAR pwszMachineName, IN PWCHAR *ppwcArguments, IN DWORD dwCurrentIndex, IN DWORD dwArgCount, IN DWORD dwFlags, IN MIB_SERVER_HANDLE hMibServer, IN BOOL *pbDone ) /*++
Routine Description: Gets options for SHOW GLOBALSTATS/IFSTATS/IFBINDING A single command handler is used for all MIB objects since there is a lot common in the way processing takes place. However feel free to write a handler per object if u find the code a bit chaotic. --*/ { DWORD dwErr = NO_ERROR; TAG_TYPE pttAllTags[] = { {TOKEN_INDEX, FALSE, FALSE}, // INDEX tag optional
{TOKEN_RR, FALSE, FALSE}, // RR tag optional
}; DWORD pdwTagType[NUM_TAGS_IN_TABLE(pttAllTags)]; DWORD dwNumArg; ULONG i; TAG_TYPE *pttTags; DWORD dwNumTags; BOOL bGlobalObject = FALSE; DWORD dwFirstGlobalArgument = 1; DWORD dwMibObject; BOOL bIndexSpecified = FALSE; DWORD dwIndex = 0; DWORD dwRR = 0; HANDLE hMib, hConsole; MODE mMode; IPSAMPLE_MIB_GET_INPUT_DATA imgid; PIPSAMPLE_MIB_GET_OUTPUT_DATA pimgod; BOOL bSomethingDisplayed = FALSE;
// SAMPLE should be installed for this command to complete
VerifyInstalled(MS_IP_SAMPLE, STRING_PROTO_SAMPLE);
// figure mib object to display
for (i = 0; i < MAX_MIB_OBJECTS; i++) if (MatchToken(ppwcArguments[dwCurrentIndex - 1], rgMibObjectTable[i].pwszObjectName)) break;
dwMibObject = i; if (dwMibObject is MAX_MIB_OBJECTS) return ERROR_CMD_NOT_FOUND; bGlobalObject = (dwMibObject < MAX_GLOBAL_MIB_OBJECTS);
// for global objects, offset tags by index of the first global arguments
pttTags = pttAllTags + bGlobalObject*dwFirstGlobalArgument; dwNumTags = NUM_TAGS_IN_TABLE(pttAllTags) - bGlobalObject*dwFirstGlobalArgument, dwErr = PreprocessCommand(g_hModule, ppwcArguments, dwCurrentIndex, dwArgCount, pttTags, dwNumTags, 0, dwNumTags, pdwTagType); if (dwErr isnot NO_ERROR) return dwErr;
// process all arguments
dwNumArg = dwArgCount - dwCurrentIndex; for (i = 0; i < dwNumArg; i++) { // for global objects, offset tag type by first global argument index
pdwTagType[i] += bGlobalObject*dwFirstGlobalArgument; switch (pdwTagType[i]) { case 0: // tag INDEX
bIndexSpecified = TRUE; dwErr = (*rgMibObjectTable[dwMibObject].pfnGetIndex)( hMibServer, ppwcArguments[i+dwCurrentIndex], &dwIndex); break;
case 1: // tag RR
dwRR = wcstoul(ppwcArguments[i+dwCurrentIndex], NULL, 10); dwRR *= 1000; // convert refresh rate to milliseconds
break;
default: dwErr = ERROR_INVALID_SYNTAX; break; } // switch
if (dwErr isnot NO_ERROR) break ; } // for
// process errors
if (dwErr isnot NO_ERROR) { ProcessError(); return dwErr; }
if (!InitializeConsole(&dwRR, &hMib, &hConsole)) return ERROR_INIT_DISPLAY;
// now display the specified mib object
for(ever) // refresh loop
{ // initialize to default values
bSomethingDisplayed = FALSE; imgid.IMGID_TypeID = rgMibObjectTable[dwMibObject].dwObjectId; imgid.IMGID_IfIndex = 0; mMode = GET_EXACT;
// override defaults for interface objects
if (!bGlobalObject) { if (bIndexSpecified) imgid.IMGID_IfIndex = dwIndex; else mMode = GET_FIRST; }
for(ever) // display all interfaces loop
{ dwErr = MibGet(hMibServer, mMode, (PVOID) &imgid, sizeof(imgid), &pimgod); if (dwErr isnot NO_ERROR) { if ((mMode is GET_NEXT) and (dwErr is ERROR_NO_MORE_ITEMS)) dwErr = NO_ERROR; // not really an error
break; }
// print table heading
if (!bSomethingDisplayed and (mMode isnot GET_EXACT)) { DisplayMessageToConsole( g_hModule, hConsole, rgMibObjectTable[dwMibObject].dwHeaderMessageId); bSomethingDisplayed = TRUE; }
(*rgMibObjectTable[dwMibObject].pfnPrint)(hConsole, hMibServer, (PVOID) pimgod, (mMode is GET_EXACT) ? FORMAT_VERBOSE : FORMAT_TABLE);
// prepare for next request
imgid.IMGID_IfIndex = pimgod->IMGOD_IfIndex; MprAdminMIBBufferFree(pimgod); if (mMode is GET_EXACT) break; else // prepare for next request
mMode = GET_NEXT; } // display all interfaces
if (dwErr isnot NO_ERROR) { dwErr = bSomethingDisplayed ? NO_ERROR : ERROR_OKAY; break; }
if (!RefreshConsole(hMib, hConsole, dwRR)) break; } // refresh
return dwErr; }
|