520 lines
12 KiB
C
520 lines
12 KiB
C
/*++
|
|
|
|
Copyright (c) 1992-1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
wdbgexts.h
|
|
|
|
Abstract:
|
|
|
|
This file contains the necessary prototypes and data types for a user
|
|
to write a debugger extension DLL. This header file is also included
|
|
by the NT debuggers (WINDBG & KD).
|
|
|
|
This header file must be included after "windows.h" and "imagehlp.h".
|
|
|
|
Please see the NT DDK documentation for specific information about
|
|
how to write your own debugger extension DLL.
|
|
|
|
Environment:
|
|
|
|
Win32 only.
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _WDBGEXTS_
|
|
#define _WDBGEXTS_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#if !defined(WDBGAPI)
|
|
#define WDBGAPI __stdcall
|
|
#endif
|
|
|
|
#ifndef _WINDEF_
|
|
typedef CONST void far *LPCVOID;
|
|
#endif
|
|
|
|
|
|
typedef
|
|
VOID
|
|
(WDBGAPI*PWINDBG_OUTPUT_ROUTINE)(
|
|
PCSTR lpFormat,
|
|
...
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_GET_EXPRESSION)(
|
|
PCSTR lpExpression
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(WDBGAPI*PWINDBG_GET_SYMBOL)(
|
|
PVOID offset,
|
|
PUCHAR pchBuffer,
|
|
PULONG pDisplacement
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_DISASM)(
|
|
PULONG lpOffset,
|
|
PCSTR lpBuffer,
|
|
ULONG fShowEffectiveAddress
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_CHECK_CONTROL_C)(
|
|
VOID
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_READ_PROCESS_MEMORY_ROUTINE)(
|
|
ULONG offset,
|
|
PVOID lpBuffer,
|
|
ULONG cb,
|
|
PULONG lpcbBytesRead
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_WRITE_PROCESS_MEMORY_ROUTINE)(
|
|
ULONG offset,
|
|
LPCVOID lpBuffer,
|
|
ULONG cb,
|
|
PULONG lpcbBytesWritten
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_GET_THREAD_CONTEXT_ROUTINE)(
|
|
ULONG Processor,
|
|
PCONTEXT lpContext,
|
|
ULONG cbSizeOfContext
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_SET_THREAD_CONTEXT_ROUTINE)(
|
|
ULONG Processor,
|
|
PCONTEXT lpContext,
|
|
ULONG cbSizeOfContext
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_IOCTL_ROUTINE)(
|
|
USHORT IoctlType,
|
|
PVOID lpvData,
|
|
ULONG cbSize
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_OLDKD_READ_PHYSICAL_MEMORY)(
|
|
LARGE_INTEGER address,
|
|
PVOID buffer,
|
|
ULONG count,
|
|
PULONG bytesread
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_OLDKD_WRITE_PHYSICAL_MEMORY)(
|
|
LARGE_INTEGER address,
|
|
PVOID buffer,
|
|
ULONG length,
|
|
PULONG byteswritten
|
|
);
|
|
|
|
|
|
typedef struct _tagEXTSTACKTRACE {
|
|
ULONG FramePointer;
|
|
ULONG ProgramCounter;
|
|
ULONG ReturnAddress;
|
|
ULONG Args[4];
|
|
} EXTSTACKTRACE, *PEXTSTACKTRACE;
|
|
|
|
|
|
typedef
|
|
ULONG
|
|
(*PWINDBG_STACKTRACE_ROUTINE)(
|
|
ULONG FramePointer,
|
|
ULONG StackPointer,
|
|
ULONG ProgramCounter,
|
|
PEXTSTACKTRACE StackFrames,
|
|
ULONG Frames
|
|
);
|
|
|
|
typedef struct _WINDBG_EXTENSION_APIS {
|
|
ULONG nSize;
|
|
PWINDBG_OUTPUT_ROUTINE lpOutputRoutine;
|
|
PWINDBG_GET_EXPRESSION lpGetExpressionRoutine;
|
|
PWINDBG_GET_SYMBOL lpGetSymbolRoutine;
|
|
PWINDBG_DISASM lpDisasmRoutine;
|
|
PWINDBG_CHECK_CONTROL_C lpCheckControlCRoutine;
|
|
PWINDBG_READ_PROCESS_MEMORY_ROUTINE lpReadProcessMemoryRoutine;
|
|
PWINDBG_WRITE_PROCESS_MEMORY_ROUTINE lpWriteProcessMemoryRoutine;
|
|
PWINDBG_GET_THREAD_CONTEXT_ROUTINE lpGetThreadContextRoutine;
|
|
PWINDBG_SET_THREAD_CONTEXT_ROUTINE lpSetThreadContextRoutine;
|
|
PWINDBG_IOCTL_ROUTINE lpIoctlRoutine;
|
|
PWINDBG_STACKTRACE_ROUTINE lpStackTraceRoutine;
|
|
} WINDBG_EXTENSION_APIS, *PWINDBG_EXTENSION_APIS;
|
|
|
|
typedef struct _WINDBG_OLD_EXTENSION_APIS {
|
|
ULONG nSize;
|
|
PWINDBG_OUTPUT_ROUTINE lpOutputRoutine;
|
|
PWINDBG_GET_EXPRESSION lpGetExpressionRoutine;
|
|
PWINDBG_GET_SYMBOL lpGetSymbolRoutine;
|
|
PWINDBG_DISASM lpDisasmRoutine;
|
|
PWINDBG_CHECK_CONTROL_C lpCheckControlCRoutine;
|
|
} WINDBG_OLD_EXTENSION_APIS, *PWINDBG_OLD_EXTENSION_APIS;
|
|
|
|
typedef struct _WINDBG_OLDKD_EXTENSION_APIS {
|
|
ULONG nSize;
|
|
PWINDBG_OUTPUT_ROUTINE lpOutputRoutine;
|
|
PWINDBG_GET_EXPRESSION lpGetExpressionRoutine;
|
|
PWINDBG_GET_SYMBOL lpGetSymbolRoutine;
|
|
PWINDBG_DISASM lpDisasmRoutine;
|
|
PWINDBG_CHECK_CONTROL_C lpCheckControlCRoutine;
|
|
PWINDBG_READ_PROCESS_MEMORY_ROUTINE lpReadVirtualMemRoutine;
|
|
PWINDBG_WRITE_PROCESS_MEMORY_ROUTINE lpWriteVirtualMemRoutine;
|
|
PWINDBG_OLDKD_READ_PHYSICAL_MEMORY lpReadPhysicalMemRoutine;
|
|
PWINDBG_OLDKD_WRITE_PHYSICAL_MEMORY lpWritePhysicalMemRoutine;
|
|
} WINDBG_OLDKD_EXTENSION_APIS, *PWINDBG_OLDKD_EXTENSION_APIS;
|
|
|
|
typedef
|
|
VOID
|
|
(WDBGAPI*PWINDBG_OLD_EXTENSION_ROUTINE)(
|
|
HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
ULONG dwCurrentPc,
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
PCSTR lpArgumentString
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(WDBGAPI*PWINDBG_EXTENSION_ROUTINE)(
|
|
HANDLE hCurrentProcess,
|
|
HANDLE hCurrentThread,
|
|
ULONG dwCurrentPc,
|
|
ULONG dwProcessor,
|
|
PCSTR lpArgumentString
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(WDBGAPI*PWINDBG_OLDKD_EXTENSION_ROUTINE)(
|
|
ULONG dwCurrentPc,
|
|
PWINDBG_OLDKD_EXTENSION_APIS lpExtensionApis,
|
|
PCSTR lpArgumentString
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(WDBGAPI*PWINDBG_EXTENSION_DLL_INIT)(
|
|
PWINDBG_EXTENSION_APIS lpExtensionApis,
|
|
USHORT MajorVersion,
|
|
USHORT MinorVersion
|
|
);
|
|
|
|
typedef
|
|
ULONG
|
|
(WDBGAPI*PWINDBG_CHECK_VERSION)(
|
|
VOID
|
|
);
|
|
|
|
#define EXT_API_VERSION_NUMBER 5
|
|
|
|
typedef struct EXT_API_VERSION {
|
|
USHORT MajorVersion;
|
|
USHORT MinorVersion;
|
|
USHORT Revision;
|
|
USHORT Reserved;
|
|
} EXT_API_VERSION, *LPEXT_API_VERSION;
|
|
|
|
typedef
|
|
LPEXT_API_VERSION
|
|
(WDBGAPI*PWINDBG_EXTENSION_API_VERSION)(
|
|
VOID
|
|
);
|
|
|
|
#define IG_KD_CONTEXT 1
|
|
#define IG_READ_CONTROL_SPACE 2
|
|
#define IG_WRITE_CONTROL_SPACE 3
|
|
#define IG_READ_IO_SPACE 4
|
|
#define IG_WRITE_IO_SPACE 5
|
|
#define IG_READ_PHYSICAL 6
|
|
#define IG_WRITE_PHYSICAL 7
|
|
#define IG_READ_IO_SPACE_EX 8
|
|
#define IG_WRITE_IO_SPACE_EX 9
|
|
#define IG_KSTACK_HELP 10
|
|
#define IG_SET_THREAD 11
|
|
#define IG_READ_MSR 12
|
|
#define IG_WRITE_MSR 13
|
|
|
|
typedef struct _tagPROCESSORINFO {
|
|
USHORT Processor; // current processor
|
|
USHORT NumberProcessors; // total number of processors
|
|
} PROCESSORINFO, *PPROCESSORINFO;
|
|
|
|
typedef struct _tagREADCONTROLSPACE {
|
|
USHORT Processor;
|
|
ULONG Address;
|
|
ULONG BufLen;
|
|
UCHAR Buf[1];
|
|
} READCONTROLSPACE, *PREADCONTROLSPACE;
|
|
|
|
typedef struct _tagIOSPACE {
|
|
ULONG Address;
|
|
ULONG Length; // 1, 2, or 4 bytes
|
|
ULONG Data;
|
|
} IOSPACE, *PIOSPACE;
|
|
|
|
typedef struct _tagIOSPACE_EX {
|
|
ULONG Address;
|
|
ULONG Length; // 1, 2, or 4 bytes
|
|
ULONG Data;
|
|
ULONG InterfaceType;
|
|
ULONG BusNumber;
|
|
ULONG AddressSpace;
|
|
} IOSPACE_EX, *PIOSPACE_EX;
|
|
|
|
typedef struct _tagPHYSICAL {
|
|
LARGE_INTEGER Address;
|
|
ULONG BufLen;
|
|
UCHAR Buf[1];
|
|
} PHYSICAL, *PPHYSICAL;
|
|
|
|
typedef struct _tagREAD_WRITE_MSR {
|
|
ULONG Msr;
|
|
LONGLONG Value;
|
|
} READ_WRITE_MSR, *PREAD_WRITE_MSR;
|
|
|
|
#ifdef __cplusplus
|
|
#define CPPMOD extern "C"
|
|
#else
|
|
#define CPPMOD
|
|
#endif
|
|
|
|
|
|
#define DECLARE_API(s) \
|
|
CPPMOD VOID \
|
|
s( \
|
|
HANDLE hCurrentProcess, \
|
|
HANDLE hCurrentThread, \
|
|
ULONG dwCurrentPc, \
|
|
ULONG dwProcessor, \
|
|
PCSTR args \
|
|
)
|
|
|
|
#ifndef NOEXTAPI
|
|
|
|
#define dprintf (ExtensionApis.lpOutputRoutine)
|
|
#define GetExpression (ExtensionApis.lpGetExpressionRoutine)
|
|
#define GetSymbol (ExtensionApis.lpGetSymbolRoutine)
|
|
#define Disassm (ExtensionApis.lpDisasmRoutine)
|
|
#define CheckControlC (ExtensionApis.lpCheckControlCRoutine)
|
|
#define ReadMemory (ExtensionApis.lpReadProcessMemoryRoutine)
|
|
#define WriteMemory (ExtensionApis.lpWriteProcessMemoryRoutine)
|
|
#define GetContext (ExtensionApis.lpGetThreadContextRoutine)
|
|
#define SetContext (ExtensionApis.lpSetThreadContextRoutine)
|
|
#define Ioctl (ExtensionApis.lpIoctlRoutine)
|
|
#define StackTrace (ExtensionApis.lpStackTraceRoutine)
|
|
|
|
|
|
#define GetKdContext(ppi) \
|
|
Ioctl( IG_KD_CONTEXT, (PVOID)ppi, sizeof(*ppi) )
|
|
|
|
extern WINDBG_EXTENSION_APIS ExtensionApis;
|
|
|
|
__inline VOID
|
|
ReadControlSpace(
|
|
USHORT processor,
|
|
ULONG address,
|
|
PVOID buf,
|
|
ULONG size
|
|
)
|
|
{
|
|
PREADCONTROLSPACE prc;
|
|
prc = (PREADCONTROLSPACE)LocalAlloc(LPTR, sizeof(*prc) + size );
|
|
ZeroMemory( prc->Buf, size );
|
|
prc->Processor = processor;
|
|
prc->Address = (ULONG)address;
|
|
prc->BufLen = size;
|
|
Ioctl( IG_READ_CONTROL_SPACE, (PVOID)prc, sizeof(*prc) + size );
|
|
CopyMemory( buf, prc->Buf, size );
|
|
LocalFree( prc );
|
|
}
|
|
|
|
__inline VOID
|
|
ReadIoSpace(
|
|
ULONG address,
|
|
PULONG data,
|
|
PULONG size
|
|
)
|
|
{
|
|
IOSPACE is;
|
|
is.Address = (ULONG)address;
|
|
is.Length = *size;
|
|
is.Data = 0;
|
|
Ioctl( IG_READ_IO_SPACE, (PVOID)&is, sizeof(is) );
|
|
*data = is.Data;
|
|
*size = is.Length;
|
|
}
|
|
|
|
__inline VOID
|
|
WriteIoSpace(
|
|
ULONG address,
|
|
ULONG data,
|
|
PULONG size
|
|
)
|
|
{
|
|
IOSPACE is;
|
|
is.Address = (ULONG)address;
|
|
is.Length = *size;
|
|
is.Data = data;
|
|
Ioctl( IG_WRITE_IO_SPACE, (PVOID)&is, sizeof(is) );
|
|
*size = is.Length;
|
|
}
|
|
|
|
__inline VOID
|
|
ReadIoSpaceEx(
|
|
ULONG address,
|
|
PULONG data,
|
|
PULONG size,
|
|
ULONG interfacetype,
|
|
ULONG busnumber,
|
|
ULONG addressspace
|
|
)
|
|
{
|
|
IOSPACE_EX is;
|
|
is.Address = (ULONG)address;
|
|
is.Length = *size;
|
|
is.Data = 0;
|
|
is.InterfaceType = interfacetype;
|
|
is.BusNumber = busnumber;
|
|
is.AddressSpace = addressspace;
|
|
Ioctl( IG_READ_IO_SPACE_EX, (PVOID)&is, sizeof(is) );
|
|
*data = is.Data;
|
|
*size = is.Length;
|
|
}
|
|
|
|
__inline VOID
|
|
WriteIoSpaceEx(
|
|
ULONG address,
|
|
ULONG data,
|
|
PULONG size,
|
|
ULONG interfacetype,
|
|
ULONG busnumber,
|
|
ULONG addressspace
|
|
)
|
|
{
|
|
IOSPACE_EX is;
|
|
is.Address = (ULONG)address;
|
|
is.Length = *size;
|
|
is.Data = data;
|
|
is.InterfaceType = interfacetype;
|
|
is.BusNumber = busnumber;
|
|
is.AddressSpace = addressspace;
|
|
Ioctl( IG_WRITE_IO_SPACE_EX, (PVOID)&is, sizeof(is) );
|
|
*size = is.Length;
|
|
}
|
|
|
|
__inline VOID
|
|
ReadPhysical(
|
|
LARGE_INTEGER address,
|
|
PVOID buf,
|
|
ULONG size,
|
|
PULONG sizer
|
|
)
|
|
{
|
|
PPHYSICAL phy;
|
|
phy = (PPHYSICAL)LocalAlloc(LPTR, sizeof(*phy) + size );
|
|
ZeroMemory( phy->Buf, size );
|
|
phy->Address = address;
|
|
phy->BufLen = size;
|
|
Ioctl( IG_READ_PHYSICAL, (PVOID)phy, sizeof(*phy) + size );
|
|
*sizer = phy->BufLen;
|
|
CopyMemory( buf, phy->Buf, *sizer );
|
|
LocalFree( phy );
|
|
}
|
|
|
|
__inline VOID
|
|
WritePhysical(
|
|
LARGE_INTEGER address,
|
|
PVOID buf,
|
|
ULONG size,
|
|
PULONG sizew
|
|
)
|
|
{
|
|
PPHYSICAL phy;
|
|
phy = (PPHYSICAL)LocalAlloc(LPTR, sizeof(*phy) + size );
|
|
ZeroMemory( phy->Buf, size );
|
|
phy->Address = address;
|
|
phy->BufLen = size;
|
|
CopyMemory( phy->Buf, buf, size );
|
|
Ioctl( IG_WRITE_PHYSICAL, (PVOID)phy, sizeof(*phy) + size );
|
|
*sizew = phy->BufLen;
|
|
LocalFree( phy );
|
|
}
|
|
|
|
__inline VOID
|
|
SetThreadForOperation(
|
|
PULONG Thread
|
|
)
|
|
{
|
|
Ioctl(IG_SET_THREAD, (PVOID)Thread, sizeof(ULONG));
|
|
}
|
|
|
|
__inline VOID
|
|
ReadMsr(
|
|
ULONG MsrReg,
|
|
ULONGLONG *MsrValue
|
|
)
|
|
{
|
|
PREAD_WRITE_MSR msr;
|
|
LARGE_INTEGER li;
|
|
|
|
msr = (PREAD_WRITE_MSR)LocalAlloc(LPTR, sizeof(*msr));
|
|
msr->Msr = MsrReg;
|
|
Ioctl( IG_READ_MSR, (PVOID)msr, sizeof(*msr) );
|
|
|
|
*MsrValue = msr->Value;
|
|
LocalFree( msr );
|
|
}
|
|
|
|
__inline VOID
|
|
WriteMsr(
|
|
ULONG MsrReg,
|
|
ULONGLONG MsrValue
|
|
)
|
|
{
|
|
PREAD_WRITE_MSR msr;
|
|
|
|
msr = (PREAD_WRITE_MSR)LocalAlloc(LPTR, sizeof(*msr));
|
|
msr->Msr = MsrReg;
|
|
msr->Value = MsrValue;
|
|
Ioctl( IG_WRITE_MSR, (PVOID)msr, sizeof(*msr) );
|
|
LocalFree( msr );
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _WDBGEXTS_
|