windows-nt/Source/XPSP1/NT/net/dhcp/server/mm/mmdump.c
2020-09-26 16:20:57 +08:00

296 lines
8.4 KiB
C

//================================================================================
// Copyright (C) 1998 Microsoft Corporation
// Author: RameshV
// Decription: This module just dumps several types of objects to the debugger.
// This can be easily modified to be a ntsd extension etc..
// No separate description is given as this is not supposed to be used for
// regular use. This is just there for diagnostic purposes.
//================================================================================
#include <mm.h>
#include <winbase.h>
#include <array.h>
#include <opt.h>
#include <optl.h>
#include <optclass.h>
#include <bitmask.h>
#include <range.h>
#include <reserve.h>
#include <subnet.h>
#include <optdefl.h>
#include <classdefl.h>
#include <oclassdl.h>
#include <sscope.h>
#include <server.h>
#include <winsock2.h>
#include <stdio.h>
#define TAB do{int i = InitTab ; while(i--) printf("\t"); }while(0)
typedef
VOID
DUMPFUNC( // any phonetic resemblance to "dum fuk" is purely incidental..
IN ULONG InitTab,
IN LPVOID Struct
);
static
VOID
DumpArray(
IN PARRAY Array,
IN ULONG InitTab,
IN DUMPFUNC Func
)
{
ARRAY_LOCATION Loc;
LPVOID ThisElt;
DWORD Err;
for( Err = MemArrayInitLoc(Array, &Loc)
; ERROR_SUCCESS == Err ;
Err = MemArrayNextLoc(Array, &Loc)
) {
ThisElt = NULL;
Err = MemArrayGetElement(Array, &Loc, &ThisElt);
Func(InitTab, ThisElt);
}
if( ERROR_FILE_NOT_FOUND != Err ) {
TAB; printf("Enumeration failure: %ld (0x%08lx)\n", Err, Err);
}
}
#define HEX_CHAR(c) (((c) < 10)?((c)+'0'):((c) - 10 + 'A'))
static
VOID
DumpHex(
IN LPSTR Name,
IN LPBYTE Bytes,
IN ULONG nBytes
)
{
printf("%s ", Name);
while(nBytes--) {
printf("%c%c ", HEX_CHAR(((*Bytes)&0xF0)>>4), HEX_CHAR((*Bytes)&0x0F));
Bytes ++;
}
printf("\n");
}
//BeginExport(function)
VOID
MmDumpOption(
IN ULONG InitTab,
IN PM_OPTION Option
) //EndExport(function)
{
TAB; printf("Option %ld\n", Option->OptId);
InitTab++;
TAB; DumpHex("Option value:", Option->Val, Option->Len);
}
//BeginExport(function)
VOID
MmDumpOptList(
IN ULONG InitTab,
IN PM_OPTLIST OptList
) //EndExport(function)
{
DumpArray(OptList, InitTab, MmDumpOption);
}
//BeginExport(function)
VOID
MmDumpOneClassOptList(
IN ULONG InitTab,
IN PM_ONECLASS_OPTLIST OptList1
) //EndExport(function)
{
TAB; printf("OptList for UserClass %ld Vendor Class %ld\n", OptList1->ClassId, OptList1->VendorId);
InitTab ++;
MmDumpOptList(InitTab, &OptList1->OptList);
}
//BeginExport(function)
VOID
MmDumpOptions(
IN ULONG InitTab,
IN PM_OPTCLASS OptClass
) //EndExport(function)
{
DumpArray(&OptClass->Array, InitTab, MmDumpOneClassOptList);
}
//BeginExport(function)
VOID
MmDumpReservation(
IN ULONG InitTab,
IN PM_RESERVATION Res
) //EndExport(function)
{
TAB; printf("Reservation %s (Type %ld)\n", inet_ntoa(*(struct in_addr *)&Res->Address),Res->Flags);
InitTab++;
TAB; DumpHex("Reservation for", Res->ClientUID, Res->nBytes);
MmDumpOptions(InitTab, &Res->Options);
}
//BeginExport(function)
VOID
MmDumpRange(
IN ULONG InitTab,
IN PM_RANGE Range
) //EndExport(function)
{
TAB; printf("Range: %s to ", inet_ntoa(*(struct in_addr *)&Range->Start));
printf("%s mask (", inet_ntoa(*(struct in_addr *)&Range->End));
printf("%s)\n", inet_ntoa(*(struct in_addr *)&Range->Mask));
}
//BeginExport(function)
VOID
MmDumpExclusion(
IN ULONG InitTab,
IN PM_EXCL Range
) //EndExport(function)
{
TAB; printf("Range: %s to ", inet_ntoa(*(struct in_addr *)&Range->Start));
printf("%s\n", inet_ntoa(*(struct in_addr *)&Range->End));
}
//BeginExport(function)
VOID
MmDumpSubnets(
IN ULONG InitTab,
IN PM_SUBNET Subnet
) //EndExport(function)
{
TAB; printf("Scope %ws : ", Subnet->Name);
if( Subnet->fSubnet ) {
printf("ADDRESS %s ", inet_ntoa(*(struct in_addr*)&Subnet->Address));
printf("MASK %s\n", inet_ntoa(*(struct in_addr*)&Subnet->Mask));
} else {
printf("SCOPEID %ld\n", Subnet->MScopeId);
}
InitTab++;
TAB; printf("Subnet Description: %ws\n", Subnet->Description);
TAB; printf("State/SuperScope/Policy: %ld/%ld/%ld\n", Subnet->State, Subnet->SuperScopeId, Subnet->Policy);
DumpArray(&Subnet->Ranges, InitTab, MmDumpRange);
DumpArray(&Subnet->Exclusions, InitTab, MmDumpExclusion);
MmDumpOptions(InitTab, &Subnet->Options);
DumpArray(&Subnet->Reservations, InitTab, MmDumpReservation);
}
//BeginExport(function)
VOID
MmDumpSscope(
IN ULONG InitTab,
IN PM_SSCOPE Sscope
) //EndExport(function)
{
TAB; printf("SuperScope %ws (%ld) Policy 0x%08lx\n",
Sscope->Name, Sscope->SScopeId, Sscope->Policy
);
}
//BeginExport(function)
VOID
MmDumpOptDef(
IN ULONG InitTab,
IN PM_OPTDEF OptDef
) //EndExport(function)
{
TAB; printf("Option <%ws> %ld\n", OptDef->OptName, OptDef->OptId);
InitTab++;
TAB; printf("Option Comment: %ws\n", OptDef->OptComment);
TAB; DumpHex("Option Default Value:", OptDef->OptVal, OptDef->OptValLen);
}
//BeginExport(function)
VOID
MmDumpOptClassDefListOne(
IN ULONG InitTab,
IN PM_OPTCLASSDEFL_ONE OptDefList1
) //EndExport(function)
{
TAB; printf("Options for UserClass %ld Vendor Class %ld \n",
OptDefList1->ClassId, OptDefList1->VendorId
);
InitTab++;
DumpArray(&OptDefList1->OptDefList.OptDefArray, InitTab, MmDumpOptDef);
}
//BeginExport(function)
VOID
MmDumpOptClassDefList(
IN ULONG InitTab,
IN PM_OPTCLASSDEFLIST OptDefList
) //EndExport(function)
{
DumpArray(&OptDefList->Array, InitTab, MmDumpOptClassDefListOne);
}
//BeginExport(function)
VOID
MmDumpClassDef(
IN ULONG InitTab,
IN PM_CLASSDEF ClassDef
) //EndExport(function)
{
TAB; printf("Class <%ws> Id: %ld, %s\n", ClassDef->Name, ClassDef->ClassId,
ClassDef->IsVendor? "VENDOR CLASS" : "USER CLASS"
);
InitTab ++;
TAB; printf("ClassComment: %ws\n", ClassDef->Comment);
TAB; printf("ClassType/RefCount: %ld/%ld\n", ClassDef->Type, ClassDef->RefCount);
TAB; DumpHex("ClassData:", ClassDef->ActualBytes, ClassDef->nBytes);
}
//BeginExport(function)
VOID
MmDumpClassDefList(
IN ULONG InitTab,
IN PM_CLASSDEFLIST ClassDefList
) //EndExport(function)
{
DumpArray(&ClassDefList->ClassDefArray, InitTab, MmDumpClassDef);
}
//BeginExport(function)
VOID
MmDumpServer(
IN ULONG InitTab, // how much to tab initially..
IN PM_SERVER Server
) //EndExport(function)
{
DWORD Err;
PM_SUBNET ThisSubnet;
PM_MSCOPE ThisMScope;
PM_SSCOPE ThisSScope;
TAB;
printf("Server: %s <%ws>\n", inet_ntoa(*(struct in_addr*)&Server->Address), Server->Name);
InitTab++;
TAB; printf("State: %ld (0x%08lx)\n", Server->State, Server->State);
TAB; printf("Policy: %ld (0x%08lx)\n", Server->Policy, Server->Policy);
MmDumpClassDefList(InitTab, &Server->ClassDefs);
MmDumpOptClassDefList(InitTab, &Server->OptDefs);
MmDumpOptions(InitTab, &Server->Options); // dump classes, option defs, options
DumpArray(&Server->SuperScopes, InitTab, MmDumpSscope);
DumpArray(&Server->Subnets, InitTab, MmDumpSubnets);
DumpArray(&Server->MScopes, InitTab, MmDumpSubnets);
}
//================================================================================
// End of file
//================================================================================