296 lines
8.4 KiB
C
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
|
|
//================================================================================
|
|
|