/*++ 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 - Dump global list of NBF devices\n"); dprintf("\t dev - Dump an NBF Device Extension\n"); dprintf("\t adrs - Dump an NBF Address List\n"); dprintf("\t adr - Dump an NBF Address\n"); dprintf("\t adfs - Dump an NBF Address File List\n"); dprintf("\t adf - Dump an NBF Address File\n"); dprintf("\t cons - Dump an NBF Connection List\n"); dprintf("\t con - Dump an NBF Connection\n"); dprintf("\t lnks - Dump an NBF DLC Link List\n"); dprintf("\t lnk - Dump an NBF Link\n"); dprintf("\t req - Dump an NBF Request\n"); dprintf("\t pkt - Dump an NBF Packet Object\n"); dprintf("\t nhdr - Dump an NBF Packet Header\n"); /* dprintf("\t spt - Dump an NBF Send Packet Tag\n"); dprintf("\t rpt - Dump an NBF Recv Packet Tag\n"); */ dprintf("\t dlst - Dump a d-list from a list entry\n"); dprintf("\t field \n" "\t - Dump a field in an NBF structure\n"); dprintf("\n"); dprintf("\t - 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); }