/*++ Copyright (c) 1997 Microsoft Corporation Module Name: regleaks.hxx Abstract: Common stuff for CS debugger extensions Author: UShaji (Adapted from rpc extensions, MarioGo, MazharM, JRoberts) --*/ #ifndef _REGLEAKS_HXX_ #define _REGLEAKS_HXX_ #define MY_DECLARE_API(_x_) \ DECLARE_API( _x_ ) \ { \ DWORD dwAddr; \ INIT_DPRINTF(); \ dwAddr = GetExpression(lpArgumentString); \ if ( !dwAddr ) { \ dprintf("Error: Failure to get address\n"); \ return; \ } \ do_##_x_(dwAddr); \ return;} \ extern WCHAR * ReadProcessChar( unsigned short * Address ); extern PCHAR MapSymbol(DWORD); #define READ(addr, buffer, length) \ b = GetData((addr),(buffer),(length), NULL); \ if (!b) { \ dprintf("Failed to read address %d, %d bytes", (addr), (length)); \ return; \ } \ extern HANDLE ProcessHandle; extern BOOL fKernelDebug; #undef DECLARE_API #define DECLARE_API(s) \ VOID \ s( \ HANDLE hCurrentProcess, \ HANDLE hCurrentThread, \ DWORD dwCurrentPc, \ PWINDBG_EXTENSION_APIS pExtensionApis, \ LPSTR lpArgumentString \ ) // types typedef BOOL (*UEnvReadMemory)( HANDLE, const void*, void*, DWORD, DWORD* ); typedef BOOL (*UEnvWriteMemory)( HANDLE, void*, void*, DWORD, DWORD* ); // forwards BOOL ReadMemoryUserMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead ); BOOL ReadMemoryKernelMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead ); BOOL WriteMemoryUserMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead ); BOOL WriteMemoryKernelMode( HANDLE hProcess, const void* pAddress, void* pBuffer, DWORD dwSize, DWORD* pdwRead ); extern UEnvReadMemory ReadMemoryExt; extern UEnvReadMemory WriteMemoryExt; #define INIT_DPRINTF() { if (!fKernelDebug) \ { \ ExtensionApis = *pExtensionApis; \ ReadMemoryExt = ReadMemoryUserMode; \ WriteMemoryExt = WriteMemoryUserMode; \ } \ ProcessHandle = hCurrentProcess; \ } \ extern WINDBG_EXTENSION_APIS ExtensionApis; #define MIN(x, y) ((x) < (y)) ? x:y extern BOOL GetData(IN DWORD dwAddress, IN LPVOID ptr, IN ULONG size, IN PCSTR type ); #define MAX_SYMBOL_LENGTH (sizeof( IMAGEHLP_SYMBOL ) + 256) typedef struct _TrackObjectData { LIST_ENTRY Links; HKEY hKey; DWORD dwStackDepth; PVOID* rgStack; } TrackObjectData; enum { LEAK_TRACK_FLAG_NONE = 0, LEAK_TRACK_FLAG_USER = 1, LEAK_TRACK_FLAG_ALL = 0xFFFFFFFF }; typedef struct _RegLeakTable { TrackObjectData* pHead; DWORD cKeys; DWORD dwFlags; BOOL bCriticalSectionInitialized; RTL_CRITICAL_SECTION CriticalSection; } RegLeakTable; void TrackObjectDataPrint(TrackObjectData* pKeyData); void RegLeakTableDump(RegLeakTable* pLeakTable); NTSTATUS PrintObjectInfo(HANDLE Handle); /* void GetSymbolForFrame( PVOID pAddress, PUCHAR pchBuffer, DWORD_PTR *pDisplacement );*/ #endif