|
|
/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
nbfext.c
Abstract:
This file contains some standard functions for the NBF kernel debugger extensions dll.
Author:
Chaitanya Kodeboyina (Chaitk)
Environment:
User Mode
--*/
#include "precomp.h"
#pragma hdrstop
#include "nbfext.h"
//
// Globals
//
EXT_API_VERSION ApiVersion = { 5, 0, EXT_API_VERSION_NUMBER, 0 }; WINDBG_EXTENSION_APIS ExtensionApis; USHORT SavedMajorVersion; USHORT SavedMinorVersion; BOOLEAN ChkTarget; INT Item;
HANDLE _hInstance; HANDLE _hAdditionalReference; HANDLE _hProcessHeap;
int _Indent = 0; char IndentBuf[ 80 ]={"\0 "};
//
// Standard Functions
//
DllInit( HANDLE hModule, DWORD dwReason, DWORD dwReserved ) { switch (dwReason) { case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH: break;
case DLL_PROCESS_ATTACH: _hInstance = hModule; _hAdditionalReference = NULL; break; }
return TRUE; }
VOID WinDbgExtensionDllInit( PWINDBG_EXTENSION_APIS lpExtensionApis, USHORT MajorVersion, USHORT MinorVersion ) { ExtensionApis = *lpExtensionApis;
SavedMajorVersion = MajorVersion; SavedMinorVersion = MinorVersion; ChkTarget = SavedMajorVersion == 0x0c ? TRUE : FALSE; return; }
DECLARE_API( version ) { #if DBG
PCHAR DebuggerType = "Checked"; #else
PCHAR DebuggerType = "Free"; #endif
dprintf( "%s Extension dll for Build %d debugging %s kernel for Build %d\n", DebuggerType, VER_PRODUCTBUILD, SavedMajorVersion == 0x0c ? "Checked" : "Free", SavedMinorVersion ); }
VOID CheckVersion( VOID ) {
return;
#if DBG
if ((SavedMajorVersion != 0x0c) || (SavedMinorVersion != VER_PRODUCTBUILD)) { dprintf("\r\n*** Extension DLL(%d Checked) does not match target system(%d %s)\r\n\r\n", VER_PRODUCTBUILD, SavedMinorVersion, (SavedMajorVersion==0x0f) ? "Free" : "Checked" ); } #else
if ((SavedMajorVersion != 0x0f) || (SavedMinorVersion != VER_PRODUCTBUILD)) { dprintf("\r\n*** Extension DLL(%d Free) does not match target system(%d %s)\r\n\r\n", VER_PRODUCTBUILD, SavedMinorVersion, (SavedMajorVersion==0x0f) ? "Free" : "Checked" ); } #endif
}
LPEXT_API_VERSION ExtensionApiVersion( VOID ) { return &ApiVersion; }
//
// Exported functions
//
DECLARE_API( help )
/*++
Routine Description:
Command help for NBF debugger extensions.
Arguments:
None
Return Value:
None
--*/
{ dprintf("NBF debugger extension commands:\n\n"); dprintf("\t devs <dbg> - Dump global list of NBF devices\n"); dprintf("\t dev <ptr> <dbg> - Dump an NBF Device Extension\n"); dprintf("\t adrs <ptr> <dbg> - Dump an NBF Address List\n"); dprintf("\t adr <ptr> <dbg> - Dump an NBF Address\n"); dprintf("\t adfs <ptr> <dbg> - Dump an NBF Address File List\n"); dprintf("\t adf <ptr> <dbg> - Dump an NBF Address File\n"); dprintf("\t cons <ptr> <lin> <dbg> - Dump an NBF Connection List\n"); dprintf("\t con <ptr> <dbg> - Dump an NBF Connection\n"); dprintf("\t lnks <ptr> <dbg> - Dump an NBF DLC Link List\n"); dprintf("\t lnk <ptr> <dbg> - Dump an NBF Link\n"); dprintf("\t req <ptr> <dbg> - Dump an NBF Request\n"); dprintf("\t pkt <ptr> <dbg> - Dump an NBF Packet Object\n"); dprintf("\t nhdr <ptr> <dbg> - Dump an NBF Packet Header\n"); /*
dprintf("\t spt <ptr> <dbg> - Dump an NBF Send Packet Tag\n"); dprintf("\t rpt <ptr> <dbg> - Dump an NBF Recv Packet Tag\n"); */ dprintf("\t dlst <ptr> - Dump a d-list from a list entry\n"); dprintf("\t field <struct-code> <struct-addr> <field-prefix> <dbg> \n" "\t - Dump a field in an NBF structure\n"); dprintf("\n"); dprintf("\t <dbg> - 0 (Validate), 1 (Summary), 2 (Normal Shallow),\n"); dprintf("\t 3(Full Shallow), 4(Normal Deep), 5(Full Deep) \n"); dprintf("\n"); dprintf( "Compiled on " __DATE__ " at " __TIME__ "\n" ); return; }
DECLARE_API( field )
/**
Routine Description:
Command that print a specified field in a structure at a particular locn.
Arguments:
args - Memory location of the structure Name of the structure Name of the field
Return Value:
None
--*/
{ CHAR structName[MAX_SYMBOL_LEN]; CHAR fieldName[MAX_SYMBOL_LEN]; ULONG structAddr; ULONG printDetail;
// Initialize arguments to some defaults
structName[0] = 0; structAddr = 0; fieldName[0] = 0; printDetail = NORM_SHAL;
// Get the arguments and direct control
if (*args) { sscanf(args, "%s %x %s %lu", structName, &structAddr, fieldName, &printDetail); }
if (!_stricmp(structName, "dev")) { FieldInDeviceContext(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "adr")) { FieldInAddress(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "adf")) { FieldInAddressFile(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "con")) { FieldInConnection(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "lnk")) { FieldInDlcLink(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "req")) { FieldInRequest(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "pkt")) { FieldInPacket(structAddr, fieldName, printDetail); } else if (!_stricmp(structName, "nhdr")) { FieldInNbfPktHdr(structAddr, fieldName, printDetail); } /*
if (!_stricmp(structName, "spt")) { FieldInSendPacketTag(structAddr, fieldName, printDetail); } if (!_stricmp(structName, "rpt")) { FieldInRecvPacketTag(structAddr, fieldName, printDetail); } */ else { dprintf("Unable to understand structure\n"); } }
DECLARE_API( dlst )
/**
Routine Description:
Print a doubly linked list given list entry
Arguments:
args - Memory location of the list entry Offset of the list entry in struct
Return Value:
None
--*/
{ ULONG listHead = 0; ULONG leOffset = 0; // Get the arguments and direct control
if (*args) { sscanf(args, "%x %x", &listHead, &leOffset); }
PrintListFromListEntry(NULL, listHead, FULL_DEEP); }
|