// // // 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