157 lines
4.3 KiB
C++
157 lines
4.3 KiB
C++
|
|
/*++
|
|
|
|
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
|
|
|
|
|