xbox-kernel/private/inc/xbdm.h
2020-09-30 17:17:25 +02:00

445 lines
13 KiB
C

//
//
// Xbox debug interface functions
// Copyright Microsoft Corporation 2000 - 2001. All Rights Reserved.
//
//
#ifndef _XBDM_H
#define _XBDM_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef XBDBGS
#define DMAPI
#endif
#ifndef DMAPI
#ifdef _XBDM_
#define DMAPI
#else
#define DMAPI __declspec(dllimport)
#endif
#endif
#define DMHRAPI DMAPI HRESULT __stdcall
// Notification types
#define DM_NONE 0
#define DM_BREAK 1
#define DM_DEBUGSTR 2
#define DM_EXEC 3
#define DM_SINGLESTEP 4
#define DM_MODLOAD 5
#define DM_MODUNLOAD 6
#define DM_CREATETHREAD 7
#define DM_DESTROYTHREAD 8
#define DM_EXCEPTION 9
#define DM_CLOCKINT 10
#define DM_ASSERT 12
#define DM_DATABREAK 13
#define DM_RIP 14
#define DM_THREADSWITCH 15
#define DM_SECTIONLOAD 16
#define DM_SECTIONUNLOAD 17
#define DM_FIBER 18
#define DM_NOTIFYMAX 18
#define DM_NOTIFICATIONMASK 0xffffff
#define DM_STOPTHREAD 0x80000000
typedef DWORD (__stdcall *PDM_NOTIFY_FUNCTION)(ULONG dwNotification, DWORD dwParam);
// Break notification structure
typedef struct _DMN_BREAK {
PVOID Address;
DWORD ThreadId;
} DMN_BREAK, *PDMN_BREAK;
// Data breakpoint notification structure {
typedef struct _DMN_DATABREAK {
PVOID Address;
DWORD ThreadId;
DWORD BreakType;
PVOID DataAddress;
} DMN_DATABREAK, *PDMN_DATABREAK;
// Debugstr notification structure
typedef struct _DMN_DEBUGSTR {
DWORD ThreadId;
DWORD Length;
LPCSTR String;
} DMN_DEBUGSTR, *PDMN_DEBUGSTR;
// execution notification values
#define DMN_EXEC_STOP 0
#define DMN_EXEC_START 1
#define DMN_EXEC_REBOOT 2
#define DMN_EXEC_PENDING 3
// Module load notification structure
typedef struct _DMN_MODLOAD {
char Name[MAX_PATH];
PVOID BaseAddress;
ULONG Size;
ULONG TimeStamp;
ULONG CheckSum;
ULONG Flags;
} DMN_MODLOAD, *PDMN_MODLOAD;
#define DMN_MODFLAG_XBE 0x0001
#define DMN_MODFLAG_TLS 0x0002
// Section load/unload notification structure
typedef struct _DMN_SECTIONLOAD {
char Name[MAX_PATH];
PVOID BaseAddress;
ULONG Size;
USHORT Index;
USHORT Flags;
} DMN_SECTIONLOAD, *PDMN_SECTIONLOAD;
#define DMN_SECFLAG_LOADED 0x0001
// thread create notification structure
typedef struct _DMN_CREATETHREAD {
DWORD ThreadId;
PVOID StartAddress;
} DMN_CREATETHREAD, *PDMN_CREATETHREAD;
// fiber create/delete notification structure
typedef struct _DMN_FIBER {
DWORD FiberId;
BOOL Create;
PVOID StartAddress;
} DMN_FIBER, *PDMN_FIBER;
// thread switch notification structure
typedef struct _DMN_THREADSWITCH {
DWORD OldThreadId;
DWORD NewThreadId;
} DMN_THREADSWITCH, *PDMN_THREADSWITCH;
// exception notification
typedef struct _DMN_EXCEPTION {
DWORD ThreadId;
DWORD Code;
PVOID Address;
DWORD Flags;
DWORD Information[2];
} DMN_EXCEPTION, *PDMN_EXCEPTION;
#define DM_EXCEPT_NONCONTINUABLE 1
#define DM_EXCEPT_FIRSTCHANCE 2
// profiling
typedef struct _DMN_PROFINT {
DWORD Eip;
DWORD EFlags;
DWORD SegCs;
} DMN_PROFINT, *PDMN_PROFINT;
// Notification
#define DM_PERSISTENT 1
#define DM_DEBUGSESSION 2
#define DM_ASYNCSESSION 4
typedef struct _DMN_SESSION *PDMN_SESSION;
DMHRAPI DmOpenNotificationSession(DWORD dwFlags, PDMN_SESSION *pSession);
DMHRAPI DmCloseNotificationSession(PDMN_SESSION Session);
DMHRAPI DmNotify(PDMN_SESSION Session, DWORD dwNotification,
PDM_NOTIFY_FUNCTION pfnHandler);
// notification extensions
typedef DWORD (__stdcall *PDM_EXT_NOTIFY_FUNCTION)(LPCSTR szNotification);
DMHRAPI DmRegisterNotificationProcessor(PDMN_SESSION Session, LPCSTR szType,
PDM_EXT_NOTIFY_FUNCTION pfn);
// protocol
#define DEBUGGER_PORT 0x2db
// breakpoint types
#define DMBREAK_NONE 0
#define DMBREAK_WRITE 1
#define DMBREAK_READWRITE 2
#define DMBREAK_EXECUTE 3
#define DMBREAK_FIXED 4
// breakpoint routines
DMHRAPI DmSetBreakpoint(PVOID addr);
DMHRAPI DmRemoveBreakpoint(PVOID addr);
DMHRAPI DmSetInitialBreakpoint(void);
DMHRAPI DmSetDataBreakpoint(PVOID addr, DWORD dwType, DWORD dwSize);
DMHRAPI DmIsBreakpoint(PVOID addr, LPDWORD dwType);
// execution start and stop
DMHRAPI DmStop(void);
DMHRAPI DmGo(void);
DMHRAPI DmHaltThread(DWORD dwThreadId);
DMHRAPI DmContinueThread(DWORD dwThreadId, BOOL fException);
DMHRAPI DmSetupFunctionCall(DWORD dwThreadId);
// debugger
DMAPI BOOL __stdcall DmIsDebuggerPresent(void);
// event stop control
#define DMSTOP_CREATETHREAD 1
#define DMSTOP_FCE 2
#define DMSTOP_DEBUGSTR 4
DMHRAPI DmStopOn(DWORD dwStopFlags, BOOL fStop);
// reboot
#define DMBOOT_WAIT 1
#define DMBOOT_WARM 2
#define DMBOOT_NODEBUG 4
#define DMBOOT_STOP 8
DMHRAPI DmReboot(DWORD dwFlags);
// memory
DMHRAPI DmGetMemory(LPCVOID lpbAddr, DWORD cb, LPVOID lpbBuf,
LPDWORD pcbRet);
DMHRAPI DmSetMemory(LPVOID lpbAddr, DWORD cb, LPCVOID lpbBuf,
LPDWORD pcbRet);
// pool memory
DMAPI PVOID __stdcall DmAllocatePool(ULONG cb);
DMAPI PVOID __stdcall DmAllocatePoolWithTag(ULONG cb, ULONG tag);
DMAPI VOID __stdcall DmFreePool(PVOID p);
// profile interrupts
typedef void (__stdcall *PDMPROFILE_HANDLER)(PDMN_PROFINT);
DMHRAPI DmStartProfile(PHANDLE, ULONG, PDMPROFILE_HANDLER);
DMHRAPI DmStopProfile(HANDLE);
// thread stopped info
typedef struct _DM_THREADSTOP {
DWORD NotifiedReason;
union {
DMN_BREAK Break;
DMN_DATABREAK DataBreak;
DMN_EXCEPTION Exception;
DMN_DEBUGSTR DebugStr;
} u;
} DM_THREADSTOP, *PDM_THREADSTOP;
// thread general info
typedef struct _DM_THREADINFO {
DWORD SuspendCount;
DWORD Priority;
LPVOID TlsBase;
} DM_THREADINFO, *PDM_THREADINFO;
// thread routines
DMHRAPI DmGetThreadList(LPDWORD rgdwThreads, LPDWORD pcThreads);
DMHRAPI DmGetThreadContext(DWORD dwThreadId, PCONTEXT pdmcr);
DMHRAPI DmSetThreadContext(DWORD dwThreadId, PCONTEXT pdmcr);
DMHRAPI DmIsThreadStopped(DWORD dwThreadId, PDM_THREADSTOP pdmts);
DMHRAPI DmGetThreadInfo(DWORD dwThreadId, PDM_THREADINFO pdmti);
DMHRAPI DmSuspendThread(DWORD dwThreadId);
DMHRAPI DmResumeThread(DWORD dwThreadId);
// XTL data
typedef struct _DM_XTLDATA {
DWORD LastErrorOffset;
} DM_XTLDATA, *PDM_XTLDATA;
DMHRAPI DmGetXtlData(PDM_XTLDATA);
// loaded modules and sections
typedef struct _DM_WALK_MODULES *PDM_WALK_MODULES;
DMHRAPI DmWalkLoadedModules(PDM_WALK_MODULES *, PDMN_MODLOAD);
DMHRAPI DmCloseLoadedModules(PDM_WALK_MODULES);
typedef struct _DM_WALK_MODSECT *PDM_WALK_MODSECT;
DMHRAPI DmWalkModuleSections(PDM_WALK_MODSECT *, LPCSTR, PDMN_SECTIONLOAD);
DMHRAPI DmCloseModuleSections(PDM_WALK_MODSECT);
DMHRAPI DmGetModuleLongName(LPCSTR szShortName, LPSTR szLongName, LPDWORD pcch);
// XBE info
typedef struct _DM_XBE {
char LaunchPath[MAX_PATH+1];
DWORD TimeStamp;
DWORD CheckSum;
DWORD StackSize;
} DM_XBE, *PDM_XBE;
DMHRAPI DmGetXbeInfo(LPCSTR szName, PDM_XBE);
// command extension
typedef ULONG (__stdcall *PDM_ENTRYPROC)(ULONG, ULONG, ULONG);
typedef struct _DM_CMDCONT *PDM_CMDCONT;
typedef HRESULT (__stdcall *PDM_CMDCONTPROC)(PDM_CMDCONT pdmcc, LPSTR
szResponse, DWORD cchResponse);
typedef struct _DM_CMDCONT {
PDM_CMDCONTPROC HandlingFunction;
DWORD DataSize;
PVOID Buffer;
DWORD BufferSize;
PVOID CustomData;
DWORD BytesRemaining;
} DM_CMDCONT;
typedef HRESULT (__stdcall *PDM_CMDPROC)(LPCSTR szCommand, LPSTR szResponse,
DWORD cchResponse, PDM_CMDCONT pdmcc);
DMHRAPI DmRegisterCommandProcessor(LPCSTR szProcessor, PDM_CMDPROC pfn);
DMHRAPI DmRegisterCommandProcessorEx(LPCSTR szProcessor, PDM_CMDPROC pfn,
PVOID pfnCreateThread);
#define DmRegisterThreadedCommandProcessor(sz, pfn) \
DmRegisterCommandProcessorEx(sz, pfn, CreateThread)
DMHRAPI DmSendNotificationString(LPCSTR sz);
// per-thread data
DMHRAPI DmThreadUserData(DWORD tid, LPDWORD *ppdwData);
#define DM_CURRENT_THREAD -1
// Dynamic loading of debugger extensions
DMHRAPI DmLoadExtension(LPCSTR szName, PHANDLE phModule, PVOID *pvBase);
DMHRAPI DmUnloadExtension(HANDLE hModule);
DMHRAPI DmGetProcAddress(HANDLE hModule, LPCSTR szProcName, PVOID *ppvRet);
// name functions
DMHRAPI DmGetXboxName(LPSTR, LPDWORD);
DMHRAPI DmSetXboxName(LPCSTR);
// management functions
typedef struct _DM_USER {
char UserName[256];
DWORD AccessPrivileges;
} DM_USER, *PDM_USER;
#define DMPL_PRIV_READ 0x0001
#define DMPL_PRIV_WRITE 0x0002
#define DMPL_PRIV_CONTROL 0x0004
#define DMPL_PRIV_CONFIGURE 0x0008
#define DMPL_PRIV_MANAGE 0x0010
DMHRAPI DmAddUser(LPCSTR szUserName, DWORD dwAccess);
DMHRAPI DmRemoveUser(LPCSTR szUserName);
DMHRAPI DmSetUserAccess(LPCSTR szUserName, DWORD dwAccess);
DMHRAPI DmGetUserAccess(LPCSTR szUserName, LPDWORD lpdwAccess);
typedef struct _DM_WALK_USERS *PDM_WALK_USERS;
DMHRAPI DmWalkUserList(PDM_WALK_USERS *, PDM_USER);
DMHRAPI DmCloseUserList(PDM_WALK_USERS);
DMHRAPI DmEnableSecurity(BOOL fEnable);
DMHRAPI DmIsSecurityEnabled(LPBOOL pfEnabled);
// title to launch
DMHRAPI DmSetTitle(LPCSTR szDir, LPCSTR szTitle, LPCSTR szCmdLine);
// start / stop profile data collection
DMHRAPI DmCAPControl(LPCSTR action);
// performance counters
#define DMCOUNT_FREQUENCY 0x000F
#define DMCOUNT_FREQ100MS 0x0001
#define DMCOUNT_FREQ1SEC 0x000A
#define DMCOUNT_COUNTTYPE 0x0030
#define DMCOUNT_EVENT 0x0010
#define DMCOUNT_VALUE 0x0000
#define DMCOUNT_PRATIO 0x0020
#define DMCOUNT_COUNTSUBTYPE 0x0FC0
// event rates
#define DMCOUNT_PERSEC 0x0040
#define DMCOUNT_PERMSEC 0x0080
#define DMCOUNT_PERFRAME 0x0100
#define DMCOUNT_PERTICK 0x0200
// value types
#define DMCOUNT_AVERAGE 0x0040
typedef struct _DM_COUNTDATA {
LARGE_INTEGER CountValue;
LARGE_INTEGER RateValue;
DWORD CountType;
} DM_COUNTDATA, *PDM_COUNTDATA;
typedef struct _DM_COUNTINFO {
char Name[256];
DWORD Type;
} DM_COUNTINFO, *PDM_COUNTINFO;
DMHRAPI DmOpenPerformanceCounter(LPCSTR szName, HANDLE *phCounter);
DMHRAPI DmQueryPerformanceCounterHandle(HANDLE hCounter, DWORD dwType, PDM_COUNTDATA);
DMHRAPI DmClosePerformanceCounter(HANDLE hCounter);
typedef struct _DM_WALK_COUNTERS *PDM_WALK_COUNTERS;
DMHRAPI DmWalkPerformanceCounters(PDM_WALK_COUNTERS *, PDM_COUNTINFO);
DMHRAPI DmCloseCounters(PDM_WALK_COUNTERS);
DMHRAPI DmEnableGPUCounter(BOOL);
typedef HRESULT (__stdcall *PDM_COUNTPROC)(PLARGE_INTEGER, PLARGE_INTEGER);
#define DMCOUNT_SYNC 0x00010000
#define DMCOUNT_ASYNC32 0x00020000
#define DMCOUNT_ASYNC64 0x00040000
#define DMCOUNT_ASYNC 0x00080000
DMHRAPI DmRegisterPerformanceCounter(LPCSTR szName, DWORD dwType, PVOID);
DMHRAPI DmUnregisterPerformanceCounter(LPCSTR szName);
// error codes
#define FACILITY_XBDM 0x2db
#ifndef MAKE_HRESULT
#define MAKE_HRESULT(sev,fac,code) \
((HRESULT)(((unsigned long)sev<<31)|((unsigned long)fac<<16)|((unsigned long)code)))
#endif
#define XBDM_HRESERR(code) MAKE_HRESULT(1, FACILITY_XBDM, code)
#define XBDM_HRESSUCC(code) MAKE_HRESULT(0, FACILITY_XBDM, code)
#define XBDM_NOERR XBDM_HRESSUCC(0)
#define XBDM_UNDEFINED XBDM_HRESERR(0)
#define XBDM_MAXCONNECT XBDM_HRESERR(1)
#define XBDM_NOSUCHFILE XBDM_HRESERR(2)
#define XBDM_NOMODULE XBDM_HRESERR(3)
#define XBDM_MEMUNMAPPED XBDM_HRESERR(4)
#define XBDM_NOTHREAD XBDM_HRESERR(5)
#define XBDM_CLOCKNOTSET XBDM_HRESERR(6)
#define XBDM_INVALIDCMD XBDM_HRESERR(7)
#define XBDM_NOTSTOPPED XBDM_HRESERR(8)
#define XBDM_MUSTCOPY XBDM_HRESERR(9)
#define XBDM_ALREADYEXISTS XBDM_HRESERR(10)
#define XBDM_DIRNOTEMPTY XBDM_HRESERR(11)
#define XBDM_BADFILENAME XBDM_HRESERR(12)
#define XBDM_CANNOTCREATE XBDM_HRESERR(13)
#define XBDM_CANNOTACCESS XBDM_HRESERR(14)
#define XBDM_DEVICEFULL XBDM_HRESERR(15)
#define XBDM_NOTDEBUGGABLE XBDM_HRESERR(16)
#define XBDM_BADCOUNTTYPE XBDM_HRESERR(17)
#define XBDM_COUNTUNAVAILABLE XBDM_HRESERR(18)
#define XBDM_NOTLOCKED XBDM_HRESERR(20)
#define XBDM_KEYXCHG XBDM_HRESERR(21)
#define XBDM_MUSTBEDEDICATED XBDM_HRESERR(22)
#define XBDM_CANNOTCONNECT XBDM_HRESERR(0x100)
#define XBDM_CONNECTIONLOST XBDM_HRESERR(0x101)
#define XBDM_FILEERROR XBDM_HRESERR(0x103)
#define XBDM_ENDOFLIST XBDM_HRESERR(0x104)
#define XBDM_BUFFER_TOO_SMALL XBDM_HRESERR(0x105)
#define XBDM_NOTXBEFILE XBDM_HRESERR(0x106)
#define XBDM_MEMSETINCOMPLETE XBDM_HRESERR(0x107)
#define XBDM_NOXBOXNAME XBDM_HRESERR(0x108)
#define XBDM_NOERRORSTRING XBDM_HRESERR(0x109)
#define XBDM_CONNECTED XBDM_HRESSUCC(1)
#define XBDM_MULTIRESPONSE XBDM_HRESSUCC(2)
#define XBDM_BINRESPONSE XBDM_HRESSUCC(3)
#define XBDM_READYFORBIN XBDM_HRESSUCC(4)
#define XBDM_DEDICATED XBDM_HRESSUCC(5)
// Call Attributes Profiler Support Function
#define DM_PROFILE_START 1
#define DM_PROFILE_STOP 2
DWORD WINAPI DmProfileControl(DWORD Action, DWORD Parameter);
#ifdef __cplusplus
}
#endif
#endif