#include "precomp.h" #ifdef TESTPROGRAM WINDBG_EXTENSION_APIS ExtensionApis; VOID WinDbgExtensionDllInit( PWINDBG_EXTENSION_APIS lpExtensionApis, USHORT MajorVersion, USHORT MinorVersion ); // // dprintf (ExtensionApis.lpOutputRoutine) // GetExpression (ExtensionApis.lpGetExpressionRoutine) // GetSymbol (ExtensionApis.lpGetSymbolRoutine) // Disassm (ExtensionApis.lpDisasmRoutine) // CheckControlC (ExtensionApis.lpCheckControlCRoutine) // ReadMemory (ExtensionApis.lpReadProcessMemoryRoutine) // WriteMemory (ExtensionApis.lpWriteProcessMemoryRoutine) // GetContext (ExtensionApis.lpGetThreadContextRoutine) // SetContext (ExtensionApis.lpSetThreadContextRoutine) // Ioctl (ExtensionApis.lpIoctlRoutine) // StackTrace (ExtensionApis.lpStackTraceRoutine) // #if 0 // // Dummy global vars for "GetExpression". // UINT g1; UINT g2; #endif // 0 ULONG DummyMyGetExpression ( PCSTR lpExpression ); void setup_dummy_vars(void); ULONG WDBGAPI MyGetExpression ( PCSTR lpExpression ) { return DummyMyGetExpression(lpExpression); } ULONG WDBGAPI MyReadMemory ( ULONG offset, PVOID lpBuffer, ULONG cb, PULONG lpcbBytesRead ) { BOOL fRet = FALSE; _try { CopyMemory(lpBuffer, (void*)offset, cb); *lpcbBytesRead = cb; fRet = TRUE; } _except (EXCEPTION_EXECUTE_HANDLER) { MyDbgPrintf("Read memory exception at 0x%lu[%lu]\n", offset, cb); fRet = FALSE; } return fRet; } ULONG WDBGAPI MyWriteMemory( ULONG offset, LPCVOID lpBuffer, ULONG cb, PULONG lpcbBytesWritten ) { BOOL fRet = FALSE; _try { CopyMemory((void*)offset, lpBuffer, cb); *lpcbBytesWritten = cb; fRet = TRUE; } _except (EXCEPTION_EXECUTE_HANDLER) { fRet = FALSE; } return fRet; } void test_walklist(void); int __cdecl main( int argc, char *argv[] ) { UINT u=0; ExtensionApis.lpOutputRoutine = printf; ExtensionApis.lpGetExpressionRoutine = MyGetExpression; ExtensionApis.lpReadProcessMemoryRoutine = MyReadMemory; ExtensionApis.lpWriteProcessMemoryRoutine = MyWriteMemory; WinDbgExtensionDllInit( &ExtensionApis, 0xc, // MajorVersion, 0x0 // MinorVersion ); // // This sets up some dummy global variables. // setup_dummy_vars(); #if 0 test_walklist(); #else // 0 do { char rgch[256]; printf("> "); u = scanf("%[^\n]", rgch); if (!u || u==EOF) break; // printf("Input = [%s]\n", rgch); if (*rgch == 'q') break; do_aac(rgch); // skip past EOL { char c; u = scanf("%c", &c); } } while (u!=EOF); #endif // 0 return 0; } typedef struct _LIST { struct _LIST *pNext; UINT uKey; } LIST; LIST L3 = {NULL, 0x4000}; LIST L2 = {&L3, 0x3000}; LIST L1 = {&L2, 0X2000}; LIST L0 = {&L1, 0X1000}; ULONG NodeFunc_DumpLIST ( UINT_PTR uNodeAddr, UINT uIndex, void *pvContext ) { LIST L; BOOL fRet = dbgextReadMemory( uNodeAddr, &L, sizeof(L), "LIST" ); if (fRet) { MyDbgPrintf( "LIST[%lu]@0x%08lx = {Next=0x%08lx, Key=0x%lx}\n", uIndex, uNodeAddr, L.pNext, L.uKey ); } return 0; } void test_walklist(void) { UINT uRet = 0; uRet = WalkList( (UINT_PTR) &L0, 0, 0, // 0 start -1,// -1 end NULL, //NodeFunc_DumpAddress, NodeFunc_DumpLIST, "Test list" ); } ULONG DummyMyGetExpression ( PCSTR lpExpression ) { extern void *pvDummyAtmArpGlobalInfo; extern void *pvDummyAtmArpProtocolCharacteristics; extern void *pvDummyAtmArpClientCharacteristics; if (!lstrcmpi(lpExpression, "atmarpc!AtmArpGlobalInfo")) { return (ULONG) pvDummyAtmArpGlobalInfo; } if (!lstrcmpi(lpExpression, "atmarpc!AtmArpProtocolCharacteristics")) { return (ULONG) pvDummyAtmArpProtocolCharacteristics; } if (!lstrcmpi(lpExpression, "atmarpc!AtmArpClientCharacteristics")) { return (ULONG) pvDummyAtmArpClientCharacteristics; } return 0; } #endif // TESTPROGRAM