/*++ Copyright (c) 1993 Microsoft Corporation Module Name: kdexts.c Abstract: This file contains the generic routines and initialization code for the kernel debugger extensions dll. Author: Nar Ganapathy - 9/21/99 Environment: User Mode --*/ #include #include #include "wdbgexts.h" #include #include // // globals // EXT_API_VERSION ApiVersion = { 3, 5, EXT_API_VERSION_NUMBER, 0 }; WINDBG_EXTENSION_APIS ExtensionApis; ULONG STeip; ULONG STebp; ULONG STesp; USHORT SavedMajorVersion; USHORT SavedMinorVersion; ULONG NpDumpFlags = 0; extern VOID NpDump(IN PVOID Ptr); DllInit( HANDLE hModule, DWORD dwReason, DWORD dwReserved ) { UNREFERENCED_PARAMETER( hModule ); UNREFERENCED_PARAMETER( dwReserved ); switch (dwReason) { case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; case DLL_PROCESS_ATTACH: break; } return TRUE; } VOID WinDbgExtensionDllInit( PWINDBG_EXTENSION_APIS lpExtensionApis, USHORT MajorVersion, USHORT MinorVersion ) { ExtensionApis = *lpExtensionApis; SavedMajorVersion = MajorVersion; SavedMinorVersion = MinorVersion; return; } DECLARE_API( version ) { #if DBG PCHAR DebuggerType = "Checked"; #else PCHAR DebuggerType = "Free"; #endif UNREFERENCED_PARAMETER( args ); UNREFERENCED_PARAMETER( dwProcessor ); UNREFERENCED_PARAMETER( dwCurrentPc ); UNREFERENCED_PARAMETER( hCurrentThread ); UNREFERENCED_PARAMETER( hCurrentProcess ); 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 ) { #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; } BOOLEAN IsHexNumber( const char *szExpression ) { if (!szExpression[0]) { return FALSE ; } for(;*szExpression; szExpression++) { if ((*szExpression)< '0') { return FALSE ; } else if ((*szExpression)> 'f') { return FALSE ; } else if ((*szExpression)>='a') { continue ; } else if ((*szExpression)> 'F') { return FALSE ; } else if ((*szExpression)<='9') { continue ; } else if ((*szExpression)>='A') { continue ; } else { return FALSE ; } } return TRUE ; } DECLARE_API(npcb) { ULONG_PTR ptrToDump; char ExprBuf[256] ; char FlagBuf[256] ; int ret; if (!*args) { dprintf("Usage: !npcb "); return; } ExprBuf[0] = '\0' ; FlagBuf[0] = '\0' ; NpDumpFlags = 0; ret = sscanf(args,"%s %lx", ExprBuf, &NpDumpFlags); if (ret != EOF) { if (IsHexNumber(ExprBuf)) { ret = sscanf(ExprBuf, "%lx", &ptrToDump) ; if (ret == EOF) { ptrToDump = 0; } } else { ptrToDump = GetExpression( ExprBuf ) ; if (ptrToDump == 0) { dprintf("An error occured trying to evaluate the expression\n"); return ; } } NpDump((PVOID)ptrToDump); } else { dprintf("An error occured trying to evaluate the expression\n"); } } VOID NpfskdPrint( PCHAR String, ULONG_PTR Val ) { dprintf("%-50s 0x%x\n",String, Val); } VOID NpfskdPrintString( PCHAR String1, PCHAR String2 ) { dprintf("%-50s %s\n",String1, String2); } VOID NpfskdPrintWideString( PWCHAR String1, PWCHAR String2 ) { dprintf("%-50S %S\n",String1, String2); } BOOLEAN NpfskdReadMemory( PVOID TargetPtr, PVOID LocalPtr, ULONG Length ) { ULONG Result; if (!ReadMemory((ULONG_PTR)TargetPtr, LocalPtr, Length, &Result)) { dprintf("Cannot read memory at 0x%x\n", TargetPtr); return FALSE; } if (Result != Length) { dprintf("Expected length 0x%x != Actual length 0x%x\n", Length, Result); return FALSE; } return TRUE; } ULONG NpfskdCheckControlC() { return (CheckControlC()); }