From 02cc55e707750fd6614d5536124dbf7793ea3824 Mon Sep 17 00:00:00 2001 From: Vadim Lopatin Date: Wed, 25 Feb 2015 15:04:32 +0300 Subject: [PATCH] mago support --- dlangide.visualdproj | 15 + src/ddebug/windows/mago.d | 70 +- src/ddebug/windows/msdbg.d | 5457 ++++++++++++++++++++++++++++++++++++ 3 files changed, 5476 insertions(+), 66 deletions(-) create mode 100644 src/ddebug/windows/msdbg.d diff --git a/dlangide.visualdproj b/dlangide.visualdproj index 5555eaf..734db22 100644 --- a/dlangide.visualdproj +++ b/dlangide.visualdproj @@ -8,10 +8,12 @@ 0 0 0 + 0 0 0 0 0 + 0 1 0 0 @@ -44,8 +46,12 @@ 0 2 0 + 0 + 0 0 0 + $(CC) -c + 1 $(DMDInstallDir)windows\bin\dmd.exe $(SolutionDir)/src $(SolutionDir)/3rdparty $(SolutionDir)/3rdparty/libpng/source $(SolutionDir)/../DerelictGL3/source $(SolutionDir)/../DerelictUtil/source $(SolutionDir)/../DerelictFT/source $(SolutionDir)/../DerelictSDL2/source $(SolutionDir)/../de_image/source/interfaces $(SolutionDir)/../de_image/source/png $(SolutionDir)/../dlib $(SolutionDir)/../libdparse/src views views/res views/res/i18n views/res/mdpi @@ -89,6 +95,7 @@ $(OutDir)\$(ProjectName).exe 1 + 2 -profile @@ -102,10 +109,12 @@ 0 0 0 + 0 0 0 0 0 + 0 0 1 0 @@ -138,8 +147,12 @@ 0 2 0 + 0 + 0 0 0 + $(CC) -c + 1 $(DMDInstallDir)windows\bin\dmd.exe $(SolutionDir)/src $(SolutionDir)/3rdparty $(SolutionDir)/3rdparty/libpng/source $(SolutionDir)/../DerelictGL3/source $(SolutionDir)/../DerelictUtil/source $(SolutionDir)/../DerelictFT/source $(SolutionDir)/../DerelictSDL2/source $(SolutionDir)/../de_image/source/interfaces $(SolutionDir)/../de_image/source/png $(SolutionDir)/../dlib views views/res views/res/i18n views/res/mdpi @@ -183,6 +196,7 @@ $(OutDir)\$(ProjectName).exe 1 + 1 @@ -202,6 +216,7 @@ + diff --git a/src/ddebug/windows/mago.d b/src/ddebug/windows/mago.d index 3f9070b..76a035d 100644 --- a/src/ddebug/windows/mago.d +++ b/src/ddebug/windows/mago.d @@ -1,76 +1,13 @@ module ddebug.windows.mago; +version(Windows): version(USE_MAGO): +import ddebug.windows.msdbg; import dlangui.core.logger; -//import core.stdc.stdio; -//import core.stdc.stdlib; -import win32.windows; -import win32.objbase; -import win32.oaidl; -import win32.wtypes; -const GUID CLSID_MAGO = {0xE348A53A, 0x470A, 0x4A70, [0x9B, 0x55, 0x1E, 0x02, 0xF3, 0x52, 0x79, 0x0D]}; +//const GUID CLSID_MAGO = {0xE348A53A, 0x470A, 0x4A70, [0x9B, 0x55, 0x1E, 0x02, 0xF3, 0x52, 0x79, 0x0D]}; const GUID IID_MAGO_NATIVE_ENGINE = {0x97348AC0, 0x2B6B, 0x4B99, [0xA2, 0x45, 0x4C, 0x7E, 0x2C, 0x09, 0xD4, 0x03]}; -const GUID IID_IDebugEngine2 = {0xba105b52, 0x12f1, 0x4038, [0xae, 0x64, 0xd9, 0x57, 0x85, 0x87, 0x4c, 0x47]}; -interface IEnumDebugPrograms2 : IUnknown { -} - -interface IDebugProgram2 : IUnknown { -} - -interface IDebugProgramNode2 : IUnknown { -} - -interface IDebugEventCallback2 : IUnknown { -} - -interface IDebugBreakpointRequest2 : IUnknown { -} - -interface IDebugPendingBreakpoint2 : IUnknown { -} - -interface IDebugEvent2 : IUnknown { -} - -struct EXCEPTION_INFO { -} - -alias ATTACH_REASON = uint; - -interface IDebugEngine2 : IUnknown { -//extern(Windows): - HRESULT EnumPrograms(IEnumDebugPrograms2 ** p); - HRESULT Attach( IDebugProgram2 **rgpPrograms, - IDebugProgramNode2 **rgpProgramNodes, - DWORD celtPrograms, - IDebugEventCallback2 *pCallback, - ATTACH_REASON dwReason); - - HRESULT CreatePendingBreakpoint(IDebugBreakpointRequest2 *pBPRequest, - IDebugPendingBreakpoint2 **ppPendingBP); - - HRESULT SetException(EXCEPTION_INFO *pException); - - HRESULT RemoveSetException( EXCEPTION_INFO *pException); - - HRESULT RemoveAllSetExceptions(REFGUID guidType); - - HRESULT GetEngineId(GUID *pguidEngine); - - HRESULT DestroyProgram(IDebugProgram2 *pProgram); - - HRESULT ContinueFromSynchronousEvent(IDebugEvent2 *pEvent); - - HRESULT SetLocale(WORD wLangID); - - HRESULT SetRegistryRoot(LPCOLESTR pszRegistryRoot); - - HRESULT SetMetric(LPCOLESTR pszMetric, VARIANT varValue); - - HRESULT CauseBreak(); -} void testMago() { HRESULT hr; @@ -99,4 +36,5 @@ void testMago() { GUID eid; debugEngine.GetEngineId(&eid); Log.d("Engine id: ", eid); + } diff --git a/src/ddebug/windows/msdbg.d b/src/ddebug/windows/msdbg.d new file mode 100644 index 0000000..cf7ba60 --- /dev/null +++ b/src/ddebug/windows/msdbg.d @@ -0,0 +1,5457 @@ +// File generated by idl2d from +// msdbg.idl +//module sdk.win32.msdbg; +module ddebug.windows.msdbg; + +version(Windows): +version(USE_MAGO): + + +//import sdk.port.base; +public import win32.windows; +public import win32.wtypes; +public import win32.oaidl; +public import win32.ocidl; +public import win32.objidl; +public import win32.objbase; +//import ddebug.windows.servprov; + +// msdbg.idl : Microsoft Debug API + +// notes: +// +// - define AD7_NO_LIB to exclude library statement +// - define AD7_NO_ENC to exclude ENC interfaces + +//import win32.ocidl; + +//public import sdk.win32.ocidl; +//public import sdk.port.oleidl; +//public import sdk.port.basetsd; + // _BASETSD_H_ + +version(pp_ifdef) /* #ifdef VS_IDL_BUILD */ { +// Just to get rup +public import sdk.port.sdk_version; +} + +const DWORD MSDBG_VERSION = 7126; + +// Use uuid_constant to keep the specified guid constant. This is a note that this guid must be kept constant. +// #define uuid_constant uuid + +// Use uuid_jdate to embed the jdate in the GUID +// #define uuid_jdate(first, jdate, last) uuid_constant(first-jdate-last) + +version(pp_ifdef) /* #ifdef BUILDING_DEBUGGGER_IDL_MAKEAPI */ { +public import sdk.port.ad7.hrc; +} + +/+ interface IDebugCoreServer2; +/ +/+ interface IDebugCoreServer3; +/ +/+ interface IDebugPortSupplier2; +/ +/+ interface IDebugPort2; +/ +/+ interface IDebugPortNotify2; +/ +/+ interface IDebugPortRequest2; +/ +/+ interface IDebugSession2; +/ +/+ interface IDebugSession3; +/ +/+ interface IDebugEngine2; +/ +/+ interface IDebugEngine3; +/ +/+ interface IDebugEventCallback2; +/ +/+ interface IDebugEvent2; +/ +/+ interface IDebugProcess2; +/ +/+ interface IDebugProgram2; +/ +/+ interface IDebugProgramNode2; +/ +/+ interface IDebugThread2; +/ +/+ interface IDebugThread3; +/ +/+ interface IDebugLogicalThread2; +/ +/+ interface IDebugStackFrame2; +/ +/+ interface IDebugMemoryContext2; +/ +/+ interface IDebugCodeContext2; +/ +/+ interface IDebugMemoryBytes2; +/ +/+ interface IDebugDisassemblyStream2; +/ +/+ interface IDebugDocumentContext2; +/ +/+ interface IDebugExpressionContext2; +/ +/+ interface IDebugBreakpointRequest2; +/ +/+ interface IDebugBreakpointResolution2; +/ +/+ interface IDebugBoundBreakpoint2; +/ +/+ interface IDebugPendingBreakpoint2; +/ +/+ interface IDebugErrorBreakpoint2; +/ +/+ interface IDebugExpression2; +/ +/+ interface IDebugModule2; +/ +/+ interface IDebugModule3; +/ +/+ interface IDebugDocument2; +/ +/+ interface IDebugDocumentText2; +/ +/+ interface IDebugDocumentPosition2; +/ +/+ interface IDebugFunctionPosition2; +/ +/+ interface IDebugDocumentTextEvents2; +/ +/+ interface IDebugSimpleProperty2; +/ +/+ interface IDebugMDMUtil2_V7; +/ +/+ interface IDebugReference2; +/ +/+ interface IDebugProperty2; +/ +/+ interface IDebugExceptionCallback2; +/ +/+ interface IEnumDebugProcesses2; +/ +/+ interface IEnumDebugPrograms2; +/ +/+ interface IEnumDebugThreads2; +/ +/+ interface IEnumDebugStackFrames2; +/ +/+ interface IEnumDebugCodeContexts2; +/ +/+ interface IEnumDebugBoundBreakpoints2; +/ +/+ interface IEnumDebugPendingBreakpoints2; +/ +/+ interface IEnumDebugErrorBreakpoints2; +/ +/+ interface IEnumDebugExceptionInfo2; +/ +/+ interface IEnumDebugFrameInfo2; +/ +/+ interface IEnumDebugFrameInfoFilter2; +/ +/+ interface IEnumDebugMachines2__deprecated; +/ +/+ interface IEnumCodePaths2; +/ +/+ interface IEnumDebugModules2; +/ +/+ interface IEnumDebugPortSuppliers2; +/ +/+ interface IEnumDebugPorts2; +/ +/+ interface IEnumDebugReferenceInfo2; +/ +/+ interface IEnumDebugPropertyInfo2; +/ + +/+ interface IDebugProgramPublisher2; +/ +/+ interface IDebugProgramProvider2; +/ +/+ interface IDebugProviderProgramNode2; +/ + +version(pp_ifdef) /* #ifdef AD7_NO_ENC */ { +alias IUnknown IDebugENCUpdate; +} else { + +//public import ddebug.windows.enc; +} + +// #define IDebugMachine2_V7 IDebugCoreServer2 + +extern GUID guidVBLang; +extern GUID guidVBScriptLang; +extern GUID guidJScriptLang; +extern GUID guidCLang; +extern GUID guidCPPLang; +extern GUID guidSQLLang; +extern GUID guidScriptLang; +extern GUID guidSafeCLang; +extern GUID guidJSharpLang; +extern GUID guidManagedCLang; +extern GUID guidManagedCPPLang; +extern GUID guidCausalityBreakpointLang; +extern GUID guidFortranLang; +extern GUID guidMethodIdLang; +extern GUID guidClientScriptLang; + +extern GUID guidScriptEng; +extern GUID guidSQLEng; +extern GUID guidCOMPlusNativeEng; +extern GUID guidCOMPlusOnlyEng; +extern GUID guidNativeOnlyEng; +extern GUID guidMsOrclEng; +extern GUID guidEmbeddedCLREng; +extern GUID guidSQLEng2; +extern GUID guidCOMPlusSQLLocalEng; +extern GUID guidCOMPlusSQLRemoteEng; +extern GUID guidSilverlightEng; +extern GUID GUID_WorkflowDebugEngine; +extern GUID guidMACSilverlightEng; +extern GUID guidCoreSystemClrEng; + +extern GUID guidMicrosoftVendor; + +// Port suppliers +extern GUID guidLocalPortSupplier; +extern GUID guidNativePortSupplier; +extern GUID guidNativePipePortSupplier; +extern GUID guidEmbeddedCLRPortSupplier; + +// IDebugProperty2 GUID filters +extern GUID guidFilterLocals; +extern GUID guidFilterAllLocals; +extern GUID guidFilterArgs; +extern GUID guidFilterLocalsPlusArgs; +extern GUID guidFilterAllLocalsPlusArgs; +extern GUID guidFilterRegisters; +extern GUID guidFilterThis; +extern GUID guidFilterAutoRegisters; + +// GUIDs for GetExtendedInfo +// GUIDs for GetExtendedInfo +extern GUID guidDocument; +// TODO: remove this one once everyone implements IDebugProperty2::GetMemoryContext +extern GUID guidCodeContext; +extern GUID guidCustomViewerSupported; +extern GUID guidSimpleGridViewer; + +extern GUID guidExtendedInfoSlot; +extern GUID guidExtendedInfoSignature; + +// Document checksum algorithms +extern GUID guidSourceHashMD5; +extern GUID guidSourceHashSHA1; + +// Other GUIDs +extern GUID guidMDANotification; + +enum /+ enum_GETNAME_TYPE+/ : DWORD +{ + GN_NAME, // Gets the (as friendly as possible) name of the document or context + GN_FILENAME, // Gets the full path file name (drive+path+filename+ext or as much as possible) of the document or context + GN_BASENAME, // Gets the basename+ext part of the file name + GN_MONIKERNAME, // Gets the unique, monikerized name of the document or context + GN_URL, // Gets the URL name of the document or context + GN_TITLE, // Gets the title of the document if possible. + GN_STARTPAGEURL, +} +alias DWORD enum_GETNAME_TYPE; +alias DWORD GETNAME_TYPE; + +enum /+ enum_TEXT_POSITION_MAX+/ : int +{ + TEXT_POSITION_MAX_LINE = 0xffffffff, + TEXT_POSITION_MAX_COLUMN = 0xffffffff, +} +alias int enum_TEXT_POSITION_MAX; + +struct _tagTEXT_POSITION +{ + DWORD dwLine; + DWORD dwColumn; +} +alias _tagTEXT_POSITION TEXT_POSITION; + +struct tagBSTR_ARRAY +{ + DWORD dwCount; + /+[size_is(dwCount)]+/ BSTR *Members; +} +alias tagBSTR_ARRAY BSTR_ARRAY; + +struct tagCONST_GUID_ARRAY +{ + DWORD dwCount; + /+[size_is(dwCount)]+/ const( GUID)*Members; +} +alias tagCONST_GUID_ARRAY CONST_GUID_ARRAY; + +struct tagGUID_ARRAY +{ + DWORD dwCount; + /+[size_is(dwCount)]+/ GUID *Members; +} +alias tagGUID_ARRAY GUID_ARRAY; + +// ------------------------------------------------------------------ +// IDebugCoreServer2 +const GUID IID_IDebugCoreServer2 = IDebugCoreServer2.iid; + +interface IDebugCoreServer2 : IUnknown +{ + static const GUID iid = { 0x17bf8fa3,0x4c5a,0x49a3,[ 0xb2,0xf8,0x59,0x42,0xe1,0xea,0x28,0x7e ] }; + + HRESULT GetMachineInfo( + in MACHINE_INFO_FIELDS Fields, + /+[out]+/ MACHINE_INFO* pMachineInfo); + + HRESULT GetMachineName( + /+[out]+/ BSTR* pbstrName); + + // Get a port supplier that exists on this machine + HRESULT GetPortSupplier( + in GUID* guidPortSupplier, + /+[out]+/ IDebugPortSupplier2 * ppPortSupplier); + + // Get a port that already exists on this machine + HRESULT GetPort( + in GUID* guidPort, + /+[out]+/ IDebugPort2 * ppPort); + + // Enum all the ports on this machine + HRESULT EnumPorts( + /+[out]+/ IEnumDebugPorts2 * ppEnum); + + // Enum all the port suppliers on this machine + HRESULT EnumPortSuppliers( + /+[out]+/ IEnumDebugPortSuppliers2 * ppEnum); + + HRESULT GetMachineUtilities_V7( + /+[out]+/ IDebugMDMUtil2_V7 * ppUtil); +} +enum /+ enum_MACHINE_INFO_FLAGS+/ : DWORD +{ + MCIFLAG_TERMINAL_SERVICES_AVAILABLE = 0x00000001, +} +alias DWORD enum_MACHINE_INFO_FLAGS; +alias DWORD MACHINE_INFO_FLAGS; +enum /+ enum_MACHINE_INFO_FIELDS+/ : DWORD +{ + MCIF_NAME = 0x00000001, + MCIF_FLAGS = 0x00000002, + + MCIF_ALL = 0x00000003, +} +alias DWORD enum_MACHINE_INFO_FIELDS; +alias DWORD MACHINE_INFO_FIELDS; +struct tagMACHINE_INFO +{ + // Valid fields + MACHINE_INFO_FIELDS Fields; + // Machine name + BSTR bstrName; + // Flags + MACHINE_INFO_FLAGS Flags; +} +alias tagMACHINE_INFO MACHINE_INFO;; + +const GUID IID_IDebugCoreServer3 = IDebugCoreServer3.iid; + +interface IDebugCoreServer3 : IDebugCoreServer2 +{ + static const GUID iid = { 0x12c1180e,0xc257,0x4485,[ 0x98,0x00,0xaf,0x48,0x4b,0x69,0x97,0x13 ] }; + + HRESULT GetServerName( + /+[out]+/ BSTR *pbstrName); + + HRESULT GetServerFriendlyName( + /+[out]+/ BSTR *pbstrName); + + HRESULT EnableAutoAttach( + /+[ size_is (celtSpecificEngines), ptr]+/ in GUID* rgguidSpecificEngines, + in DWORD celtSpecificEngines, + /+[ ptr]+/ in LPCOLESTR pszStartPageUrl, + /+[out]+/ BSTR* pbstrSessionId); + + HRESULT DiagnoseWebDebuggingError( + /+[ ptr]+/ in LPCWSTR pszUrl); + + HRESULT CreateInstanceInServer( + /+[ ptr]+/ in LPCWSTR szDll, + in WORD wLangId, + in CLSID* clsidObject, + in IID* riid, + /+[out, iid_is(riid)]+/ void **ppvObject); + + HRESULT QueryIsLocal( + ); + + HRESULT GetConnectionProtocol( + /+[out]+/ CONNECTION_PROTOCOL *pProtocol); + + HRESULT DisableAutoAttach( + ); +} +enum /+ tagCONNECTION_PROTOCOL+/ +{ + CONNECTION_NONE = 0, + CONNECTION_UNKNOWN = 1, + CONNECTION_LOCAL = 2, + CONNECTION_PIPE = 3, + CONNECTION_TCPIP = 4, + CONNECTION_HTTP = 5, + CONNECTION_OTHER = 6 +} +alias int tagCONNECTION_PROTOCOL; +alias int CONNECTION_PROTOCOL;; + +// ------------------------------------------------------------------ +// IDebugMachine2_V7 +// +// This interface has been renamed since more than one remote debugging +// host (msvsmon) can be running on a machine +// #define IDebugMachine2_V7 IDebugCoreServer2 +alias IID_IDebugCoreServer2 IID_IDebugMachine2_V7; + +// ------------------------------------------------------------------ +// IDebugMachineEx2_V7 +// This interface was added after the Office 10 Fork +const GUID IID_IDebugMachineEx2_V7 = IDebugMachineEx2_V7.iid; + +interface IDebugMachineEx2_V7 : IUnknown +{ + static const GUID iid = { 0xae27b230,0xa0bf,0x47ff,[ 0xa2,0xd1,0x22,0xc2,0x9a,0x17,0x8e,0xac ] }; + HRESULT EnableAutoAttachOnProgramCreate( + in LPCWSTR pszProcessNames, // process names seperated by semicolons ex: "foo.exe;bar.exe;bigname.exe" + in GUID* guidEngine, // auto attach when 'guidEngine' is added to the process, use GUID_NULL for 'any engine' + in LPCWSTR pszSessionId, // session id to attach to + /+[out]+/ DWORD* pdwCookie); // cookie returned that is used to call 'DisableAutoAttachOnEvent' + + HRESULT DisableAutoAttachOnEvent( + in DWORD dwCookie); + + // Get a port supplier that exists on this machine + HRESULT GetPortSupplierEx( + in LPCOLESTR wstrRegistryRoot, + in GUID* guidPortSupplier, + /+[out]+/ IDebugPortSupplier2 * ppPortSupplier); + + // Get a port that already exists on this machine + HRESULT GetPortEx( + in LPCOLESTR wstrRegistryRoot, + in GUID* guidPort, + /+[out]+/ IDebugPort2 * ppPort); + + // Enum all the ports on this machine + HRESULT EnumPortsEx( + in LPCOLESTR wstrRegistryRoot, + /+[out]+/ IEnumDebugPorts2 * ppEnum); + + // Enum all the port suppliers on this machine + HRESULT EnumPortSuppliersEx( + in LPCOLESTR wstrRegistryRoot, + /+[out]+/ IEnumDebugPortSuppliers2 * ppEnum); +}; + +// -------------------------------------------------------- +// IDebugPortSupplier2 + +const GUID IID_IDebugPortSupplier2 = IDebugPortSupplier2.iid; + +interface IDebugPortSupplier2 : IUnknown +{ + static const GUID iid = { 0x53f68191,0x7b2f,0x4f14,[ 0x8e,0x55,0x40,0xb1,0xb6,0xe5,0xdf,0x66 ] }; + HRESULT GetPortSupplierName( + /+[out]+/ BSTR* pbstrName); + + HRESULT GetPortSupplierId( + /+[out]+/ GUID* pguidPortSupplier); + + // Get a port from this port supplier + HRESULT GetPort( + in GUID* guidPort, + /+[out]+/ IDebugPort2 * ppPort); + + // Enum the ports that already exist + HRESULT EnumPorts( + /+[out]+/ IEnumDebugPorts2 * ppEnum); + + // Does this port supplier support adding new ports? S_OK == yes; S_FALSE == no + HRESULT CanAddPort(); + + // Add a port + HRESULT AddPort( + /+[in]+/ IDebugPortRequest2 pRequest, + /+[out]+/ IDebugPort2 * ppPort); + + // Remove a port + HRESULT RemovePort( + /+[in]+/ IDebugPort2 pPort); +}; + +// -------------------------------------------------------- +// IDebugPortSupplier3 +const GUID IID_IDebugPortSupplier3 = IDebugPortSupplier3.iid; + +interface IDebugPortSupplier3 : IDebugPortSupplier2 +{ + static const GUID iid = { 0x5b5eec44,0x51aa,0x4210,[ 0xb8,0x4f,0x19,0x38,0xb8,0x57,0x6d,0x8d ] }; + // Can the port supplier remember new ports? S_OK == yes; S_FALSE == no + HRESULT CanPersistPorts(); + + // Enum the ports that the SDM remembered for the port supplier + HRESULT EnumPersistedPorts( + in BSTR_ARRAY PortNames, + /+[out]+/ IEnumDebugPorts2 * ppEnum); +}; + +// -------------------------------------------------------- +// IDebugPortPicker +const GUID IID_IDebugPortPicker = IDebugPortPicker.iid; + +interface IDebugPortPicker : IUnknown +{ + static const GUID iid = { 0x8d6eed60,0x2737,0x4425,[ 0xb3,0x8a,0x49,0x0e,0xf2,0x73,0xac,0xbb ] }; + // SetSite() will be called before any other methods are called + HRESULT SetSite(/+[in]+/ IServiceProvider pSP); + + // Display a dialog that allows the user to select a port. + // A return value of S_FALSE (or a return value of S_OK with the + // BSTR set to NULL) indicates that the user canceled the dialog. + HRESULT DisplayPortPicker( + in HWND hwndParentDialog, + /+[out]+/ BSTR* pbstrPortId); +}; + +// -------------------------------------------------------- +// IDebugPortSupplierDescription2 +const GUID IID_IDebugPortSupplierDescription2 = IDebugPortSupplierDescription2.iid; + +interface IDebugPortSupplierDescription2 : IUnknown +{ + static const GUID iid = { 0xd0785faa,0x91d7,0x4ca2,[ 0xa3,0x02,0x65,0x55,0x48,0x77,0x19,0xf7 ] }; + + // Get an extended description of the port supplier + HRESULT GetDescription( + /+[out]+/ PORT_SUPPLIER_DESCRIPTION_FLAGS *pdwFlags, + /+[out]+/ BSTR *pbstrText + ); +} +enum /+ enum_PORT_SUPPLIER_DESCRIPTION_FLAGS+/ : DWORD +{ + PSDFLAG_SHOW_WARNING_ICON = 0x00000001 +} +alias DWORD enum_PORT_SUPPLIER_DESCRIPTION_FLAGS; +alias DWORD PORT_SUPPLIER_DESCRIPTION_FLAGS;; + +// -------------------------------------------------------- +// IDebugPort2 + +const GUID IID_IDebugPort2 = IDebugPort2.iid; + +interface IDebugPort2 : IUnknown +{ + static const GUID iid = { 0x79293cc8,0xd9d9,0x43f5,[ 0x97,0xad,0x0b,0xcc,0x5a,0x68,0x87,0x76 ] }; + + HRESULT GetPortName( + /+[out]+/ BSTR* pbstrName); + + HRESULT GetPortId( + /+[out]+/ GUID* pguidPort); + + // Get the request used to create this port (if available) + HRESULT GetPortRequest( + /+[out]+/ IDebugPortRequest2 * ppRequest); + + // Get the port supplier that supplied this port + HRESULT GetPortSupplier( + /+[out]+/ IDebugPortSupplier2 * ppSupplier); + + // Get an IDebugProcess2 for a PID running on this port + HRESULT GetProcess( + in AD_PROCESS_ID ProcessId, + /+[out]+/ IDebugProcess2 * ppProcess); + + // Enum all the processes running on this port + HRESULT EnumProcesses( + /+[out]+/ IEnumDebugProcesses2 * ppEnum); +} +enum /+ enum_AD_PROCESS_ID+/ : DWORD +{ + AD_PROCESS_ID_SYSTEM, + AD_PROCESS_ID_GUID +} +alias DWORD enum_AD_PROCESS_ID; +alias DWORD AD_PROCESS_ID_TYPE; +union AD_PROCESS_ID /+switch(AD_PROCESS_ID_TYPE ProcessIdType) ProcessId +/ { + /+[case AD_PROCESS_ID_SYSTEM:]+/ + DWORD dwProcessId; + /+[case AD_PROCESS_ID_GUID:]+/ + GUID guidProcessId; + /+[default:]+/ + DWORD dwUnused; };; + +// -------------------------------------------------------- +// IDebugDefaultPort2 + +const GUID IID_IDebugDefaultPort2 = IDebugDefaultPort2.iid; + +interface IDebugDefaultPort2 : IDebugPort2 +{ + static const GUID iid = { 0x302f0f55,0x1ede,0x4777,[ 0x9b,0x38,0x11,0x5e,0x1f,0x22,0x9d,0x56 ] }; + HRESULT GetPortNotify( + /+[out]+/ IDebugPortNotify2 *ppPortNotify); + + HRESULT GetServer( + /+[out]+/ IDebugCoreServer3 *ppServer); + + HRESULT QueryIsLocal( + ); +}; + +// -------------------------------------------------------- +// IDebugWindowsComputerPort2 + +const GUID IID_IDebugWindowsComputerPort2 = IDebugWindowsComputerPort2.iid; + +interface IDebugWindowsComputerPort2 : IUnknown +{ + static const GUID iid = { 0x5fbb8ed3,0xecdb,0x412a,[ 0xbf,0xa3,0x3a,0x54,0xbe,0xb5,0xb2,0xd1 ] }; + + HRESULT GetComputerInfo( + /+[out]+/ COMPUTER_INFO * pInfo); +} +struct tagCOMPUTER_INFO +{ + // PROCESSOR_ARCHITECTURE_INTEL (0), PROCESSOR_ARCHITECTURE_IA64 (6), or PROCESSOR_ARCHITECTURE_AMD64 (9) + WORD wProcessorArchitecture; + // See MSDN. Important value is VER_SUITE_TERMINAL + WORD wSuiteMask; + // { platform id -- 1 for 9x, 2 for NT, major version, minor version, service pack major } + DWORD dwOperatingSystemVersion; +} +alias tagCOMPUTER_INFO COMPUTER_INFO;; + +// -------------------------------------------------------- +// IDebugPortRequest2 +const GUID IID_IDebugPortRequest2 = IDebugPortRequest2.iid; + +interface IDebugPortRequest2 : IUnknown +{ + static const GUID iid = { 0x8d36beb8,0x9bfe,0x47dd,[ 0xa1,0x1b,0x7b,0xa1,0xde,0x18,0xe4,0x49 ] }; + HRESULT GetPortName( + /+[out]+/ BSTR* pbstrPortName); +}; + +// ------------------------------------------------------------------ +// IDebugPortNotify2 +const GUID IID_IDebugPortNotify2 = IDebugPortNotify2.iid; + +interface IDebugPortNotify2 : IUnknown +{ + static const GUID iid = { 0xfb8d2032,0x2858,0x414c,[ 0x83,0xd9,0xf7,0x32,0x66,0x4e,0x0c,0x7a ] }; + HRESULT AddProgramNode( + /+[in]+/ IDebugProgramNode2 pProgramNode); + + HRESULT RemoveProgramNode( + /+[in]+/ IDebugProgramNode2 pProgramNode); +}; + +// ------------------------------------------------------------------ +// IDebugPortEvents2 +const GUID IID_IDebugPortEvents2 = IDebugPortEvents2.iid; + +interface IDebugPortEvents2 : IUnknown +{ + static const GUID iid = { 0x564fa275,0x12e1,0x4b5f,[ 0x83,0x16,0x4d,0x79,0xbc,0xef,0x72,0x46 ] }; + HRESULT Event( + /+[in]+/ IDebugCoreServer2 pServer, + /+[in]+/ IDebugPort2 pPort, + /+[in]+/ IDebugProcess2 pProcess, + /+[in]+/ IDebugProgram2 pProgram, + /+[in]+/ IDebugEvent2 pEvent, + in IID* riidEvent); +}; + +// ------------------------------------------------------------------ +// IDebugMDMUtil2_V7 +const GUID IID_IDebugMDMUtil2_V7 = IDebugMDMUtil2_V7.iid; + +interface IDebugMDMUtil2_V7 : IUnknown +{ + static const GUID iid = { 0xf3062547,0x43d8,0x4dc2,[ 0xb1,0x8e,0xe1,0x46,0x0f,0xf2,0xc4,0x22 ] }; + // For the following methods guidEngine specifies the debug engine the + // call applies to. Use GUID_NULL to specify all engines. + + // Add or remove a process that the VM should NOT ever debug + // (i.e. DON'T use the debugger interpreter loop for a specified process). + HRESULT AddPIDToIgnore( + in GUID* guidEngine, + in DWORD dwPid); + HRESULT RemovePIDToIgnore( + in GUID* guidEngine, + in DWORD dwPid); + + // Add or remove a process that the VM should debug + // (i.e. DO use the debugger interpreter loop for a specified process). + HRESULT AddPIDToDebug( + in GUID* guidEngine, + in DWORD dwPid); + HRESULT RemovePIDToDebug( + in GUID* guidEngine, + in DWORD dwPid); + + alias DWORD DYNDEBUGFLAGS; + enum /+ enum_DYNDEBUGFLAGS+/ : int +{ + DYNDEBUG_ATTACH = 1, + DYNDEBUG_JIT = 2, + DYNDEBUG_REMOTEJIT = 4 +} +alias int enum_DYNDEBUGFLAGS; + + // Access to dynamic debugging flags (JIT, attach, ...). + // Settings are on a per Engine basis for the entire machine. + // Users of these two APIs should always call GetDynamicDebuggingFlags, + // set or clear specific bits, then call SetDynamicDebuggingFlags + HRESULT SetDynamicDebuggingFlags( + in GUID* guidEngine, + in DYNDEBUGFLAGS dwFlags); + HRESULT GetDynamicDebuggingFlags( + in GUID* guidEngine, + /+[out]+/ DYNDEBUGFLAGS *pdwFlags); + + // Set the clsid as the default JIT Server + HRESULT SetDefaultJITServer( + in CLSID* clsidJITServer); + // Retrieve the default JIT Server (CLSID_NULL if there isn't one) + HRESULT GetDefaultJITServer( + /+[out]+/ CLSID *pClsidJITServer); + // Register debug engines for a JIT debugger. + // arrRemoteFlags may be NULL if remote JIT is not supported for any engine. + // arrguidEngines and arrRemoteFlags are ignored if fRegister is FALSE. + HRESULT RegisterJITDebugEngines( + in CLSID* clsidJITServer, + /+[size_is (celtEngs)]+/ in GUID *arrguidEngines, + /+[ptr ,size_is(celtEngs)]+/ in BOOL *arrRemoteFlags, + in DWORD celtEngs, + in BOOL fRegister); + + enum DWORD S_UNKNOWN = 0x3; + + // Should the VM use the debugger loop for this pid? + HRESULT CanDebugPID( + in GUID* guidEngine, + in DWORD pid); +} + +const GUID IID_IDebugMDMUtil3_V7 = IDebugMDMUtil3_V7.iid; + +interface IDebugMDMUtil3_V7 : IDebugMDMUtil2_V7 +{ + static const GUID iid = { 0xaf598dea,0xce92,0x443b,[ 0xa0,0xb5,0x99,0x92,0xff,0x66,0x0b,0xc4 ] }; + + HRESULT DiagnoseScriptDebuggingError( + in DWORD dwDebuggeeProcessId); + + HRESULT DiagnoseWebDebuggingError( + in WEB_DEBUG_TYPE dwWebType, + /+[ ptr]+/ in LPCWSTR pszUrl); + + HRESULT DiagnoseASPDebugging( + /+[ ptr]+/ in LPCWSTR szASPUserAccount + ); +} +enum + { + WEB_DEBUG_ASP_NET = 0x0001, + }; +alias DWORD WEB_DEBUG_TYPE;; + +// ------------------------------------------------------------------ +// IDebugSession2 +const GUID IID_IDebugSession2 = IDebugSession2.iid; + +// avoid using enc +interface IDebugENCUpdate : IUnknown { +} + +interface IDebugSession2 : IUnknown +{ + static const GUID iid = { 0x8948300f,0x8bd5,0x4728,[ 0xa1,0xd8,0x83,0xd1,0x72,0x29,0x5a,0x9d ] }; + + HRESULT GetName( + /+[out]+/ BSTR* pbstrName); + + HRESULT SetName( + in LPCOLESTR pszName); + + HRESULT EnumProcesses( + /+[out]+/ IEnumDebugProcesses2 * ppEnum); + + HRESULT Launch( + /+[ ptr]+/ in LPCOLESTR pszMachine, + /+[in]+/ IDebugPort2 pPort, + /+[ ptr]+/ in LPCOLESTR pszExe, + /+[ ptr]+/ in LPCOLESTR pszArgs, + /+[ ptr]+/ in LPCOLESTR pszDir, + /+[ ptr]+/ in BSTR bstrEnv, + /+[ ptr]+/ in LPCOLESTR pszOptions, + in LAUNCH_FLAGS dwLaunchFlags, + in DWORD hStdInput, + in DWORD hStdOutput, + in DWORD hStdError, + in GUID* guidLaunchingEngine, + /+[in]+/ IDebugEventCallback2 pCallback, + /+[ size_is (celtSpecificEngines)]+/ in GUID* rgguidSpecificEngines, + in DWORD celtSpecificEngines, + /+[out]+/ IDebugProcess2 * ppProcess); + + HRESULT RegisterJITServer( + in CLSID* clsidJITServer); + + HRESULT Terminate( + in BOOL fForce); + + HRESULT Detach(); + + HRESULT CauseBreak(); + + HRESULT CreatePendingBreakpoint( + /+[in]+/ IDebugBreakpointRequest2 pBPRequest, + /+[out]+/ IDebugPendingBreakpoint2 * ppPendingBP); + + HRESULT EnumPendingBreakpoints( + /+[in]+/ IDebugProgram2 pProgram, + /+[ ptr]+/ in LPCOLESTR pszProgram, + /+[out]+/ IEnumDebugPendingBreakpoints2 * ppEnumBPs); + + HRESULT EnumMachines__deprecated( + /+[out]+/ IEnumDebugMachines2__deprecated * ppEnum); + + HRESULT ConnectToServer( + /+[ ptr]+/ in LPCOLESTR szServerName, + /+[out]+/ IDebugCoreServer2 * ppServer); + + HRESULT DisconnectServer( + /+[in]+/ IDebugCoreServer2 pServer); + + HRESULT ShutdownSession(); + + HRESULT EnumCodeContexts( + /+[in]+/ IDebugProgram2 pProgram, + /+[in]+/ IDebugDocumentPosition2 pDocPos, + /+[out]+/ IEnumDebugCodeContexts2 *ppEnum); + + HRESULT SetException( + in EXCEPTION_INFO* pException); + + HRESULT EnumSetExceptions( + /+[in]+/ IDebugProgram2 pProgram, + /+[ ptr]+/ in LPCOLESTR pszProgram, + // Either guidLang or guidEng + in GUID* guidType, + /+[out]+/ IEnumDebugExceptionInfo2 * ppEnum); + + HRESULT RemoveSetException( + in EXCEPTION_INFO* pException); + + HRESULT RemoveAllSetExceptions( + // Either guidLang or guidEng + in GUID* guidType); + + // The top-level default exceptions are pseudo-exceptions that describe the + // default exception handling behavior for a given language or runtime architecture. + // Example: "C++": EXCEPTION_STOP_SECOND_CHANCE + // EXCEPTION_STOP_FIRST_CHANCE_USE_PARENT and EXCEPTION_STOP_SECOND_CHANCE_USE_PARENT + // are invalid for these top-level pseudo-exceptions. + HRESULT EnumDefaultExceptions( + /+[ ptr]+/ in EXCEPTION_INFO* pParentException, + /+[out]+/ IEnumDebugExceptionInfo2 * ppEnum); + + HRESULT GetENCUpdate( + /+[in]+/ IDebugProgram2 pProgram, + /+[out]+/ IDebugENCUpdate** ppUpdate); + + HRESULT SetLocale( + in WORD wLangID); + + HRESULT SetRegistryRoot( + /+[ ptr]+/ in LPCOLESTR pszRegistryRoot); + + HRESULT IsAlive(); + + HRESULT ClearAllSessionThreadStackFrames(); + + HRESULT __deprecated_GetSessionId( + /+[in]+/ IDebugEventCallback2 pCallback, + /+[ size_is (celtSpecificEngines), ptr]+/ in GUID* rgguidSpecificEngines, + in DWORD celtSpecificEngines, + /+[ ptr]+/ in LPCOLESTR pszStartPageUrl, + /+[out]+/ BSTR* pbstrSessionId); + + HRESULT SetEngineMetric( + in GUID* guidEngine, + in LPCOLESTR pszMetric, + in VARIANT varValue); + + HRESULT SetStoppingModel( + in STOPPING_MODEL dwStoppingModel); + + HRESULT GetStoppingModel( + /+[out]+/ STOPPING_MODEL* pdwStoppingModel); + + HRESULT __deprecated_RegisterSessionWithServer( + in LPCOLESTR pwszServerName); +} +enum /+ enum_LAUNCH_FLAGS+/ : DWORD +{ + // Launch the process for debugging + LAUNCH_DEBUG = 0x0000, + // Launch the process without debugging it + LAUNCH_NODEBUG = 0x0001, + // Launch the process with EnC enabled. + LAUNCH_ENABLE_ENC = 0x0002, + // Launch the process and merge the environment + LAUNCH_MERGE_ENV = 0x0004 +} +alias DWORD enum_LAUNCH_FLAGS; +alias DWORD LAUNCH_FLAGS; +enum /+ enum_EXCEPTION_STATE+/ : DWORD +{ + EXCEPTION_NONE = 0x0000, + EXCEPTION_STOP_FIRST_CHANCE = 0x0001, + EXCEPTION_STOP_SECOND_CHANCE = 0x0002, + EXCEPTION_STOP_USER_FIRST_CHANCE = 0x0010, + EXCEPTION_STOP_USER_UNCAUGHT = 0x0020, + + // These are no longer used: + EXCEPTION_STOP_FIRST_CHANCE_USE_PARENT = 0x0004, + EXCEPTION_STOP_SECOND_CHANCE_USE_PARENT = 0x0008, + EXCEPTION_STOP_USER_FIRST_CHANCE_USE_PARENT = 0x0040, + EXCEPTION_STOP_USER_UNCAUGHT_USE_PARENT = 0x0080, + + EXCEPTION_STOP_ALL = 0x00FF, + + EXCEPTION_CANNOT_BE_CONTINUED = 0x0100, + + // the following flags are for exception types only + EXCEPTION_CODE_SUPPORTED = 0x1000, + EXCEPTION_CODE_DISPLAY_IN_HEX = 0x2000, + EXCEPTION_JUST_MY_CODE_SUPPORTED = 0x4000, + EXCEPTION_MANAGED_DEBUG_ASSISTANT = 0x8000, +} +alias DWORD enum_EXCEPTION_STATE; +alias DWORD EXCEPTION_STATE; +struct tagEXCEPTION_INFO +{ + IDebugProgram2 pProgram; + BSTR bstrProgramName; + BSTR bstrExceptionName; + DWORD dwCode; + EXCEPTION_STATE dwState; + // Either guidLang or guidEng + GUID guidType; +} +alias tagEXCEPTION_INFO EXCEPTION_INFO; +enum /+ enum_STOPPING_MODEL+/ : DWORD +{ + STOPPING_MODEL_STOP_ALL = 0x0001, + STOPPING_MODEL_STOP_ONE = 0x0002, +} +alias DWORD enum_STOPPING_MODEL; +alias DWORD STOPPING_MODEL;; + +// Support for JustMyCode +struct _JMC_CODE_SPEC +{ + BOOL fIsUserCode; // TRUE implies "user" code + BSTR bstrModuleName; +} +alias _JMC_CODE_SPEC JMC_CODE_SPEC; + +// ------------------------------------------------------------------ +// IDebugSession3 +const GUID IID_IDebugSession3 = IDebugSession3.iid; + +interface IDebugSession3 : IDebugSession2 +{ + static const GUID iid = { 0xBBF74DB9,0x39D5,0x406e,[ 0x8B,0xC3,0x3B,0xA9,0xDD,0x34,0xC0,0x2E ] }; + + // szSymbolSearchPath uses the unicode delimiting character to seperate + // search paths. + HRESULT SetSymbolPath( + /+[ ptr]+/ in LPCOLESTR szSymbolSearchPath, + /+[ ptr]+/ in LPCOLESTR szSymbolCachePath, + in LOAD_SYMBOLS_FLAGS Flags); + + // Load symbols for all modules that do not have them Returns S_OK if at + // least one module loaded symbols returns S_FALSE if no modules loaded symbols. + HRESULT LoadSymbols(); + + HRESULT RegisterCallback( + /+[in]+/ IDebugEventCallback2 pCallback); + + HRESULT ConnectToServerEx( + /+[ ptr]+/ in LPCOLESTR szServerName, + in CONNECT_REASON ConnectReason, + /+[out]+/ IDebugCoreServer3 * ppServer); + + // Pass on the JustMyCode info to the engines + HRESULT SetJustMyCodeState( + in BOOL fUpdate, // TRUE = update; FALSE = reset (ignore everything sent earlier) + in DWORD dwModules, // count + /+[ size_is (dwModules), ptr]+/ in JMC_CODE_SPEC* rgJMCSpec); // array of info about modules + + // Get the most recently used server names + HRESULT GetRecentServerNames( + /+[out]+/ BSTR_ARRAY *pServers); + + // Set how many server names should be remembered + HRESULT SetMaxRecentServerNames( + in DWORD dwNewMax); + + HRESULT InitializeFeatures( + in SESSION_FEATURES EnabledFeatures + ); + + HRESULT SetAllExceptions( + in EXCEPTION_STATE dwState + ); + + // return E_FAIL if we are breaking on specific exceptions + HRESULT GetStateForAllExceptions( + /+[out]+/ EXCEPTION_STATE *pdwState + ); + + HRESULT AddExceptionCallback( + in EXCEPTION_INFO* pException, + /+[in]+/ IDebugExceptionCallback2 pCallback + ); + + HRESULT RemoveExceptionCallback( + in EXCEPTION_INFO* pException, + /+[in]+/ IDebugExceptionCallback2 pCallback + ); + + HRESULT BlockingShutdownSession( + in DWORD dwTimeout + ); +} +enum +{ + CONNECT_LOCAL, + CONNECT_ATTACH, + CONNECT_LAUNCH, + CONNECT_WEB_AUTO_ATTACH, + CONNECT_SQL_AUTO_ATTACH, + CONNECT_CAUSALITY, + CONNECT_DIAGNOSE_WEB_ERROR +} +alias int CONNECT_REASON; +enum /+ enum_SESSION_FEATURES+/ : DWORD +{ + FEATURE_REMOTE_DEBUGGING = 0x1, + FEATURE_CAUSALITY = 0x2 +} +alias DWORD enum_SESSION_FEATURES; +alias DWORD SESSION_FEATURES; +alias DWORD LOAD_SYMBOLS_FLAGS;; + +// ------------------------------------------------------------------ +// IDebugEngine2 +const GUID IID_IDebugEngine2 = IDebugEngine2.iid; + +interface IDebugEngine2 : IUnknown +{ + static const GUID iid = { 0xba105b52,0x12f1,0x4038,[ 0xae,0x64,0xd9,0x57,0x85,0x87,0x4c,0x47 ] }; + + HRESULT EnumPrograms( + /+[out]+/ IEnumDebugPrograms2 * ppEnum); + + HRESULT Attach( + /+[ size_is (celtPrograms), length_is(celtPrograms)]+/ /+[in]+/ IDebugProgram2 * rgpPrograms, + /+[ size_is (celtPrograms), length_is(celtPrograms)]+/ /+[in]+/ IDebugProgramNode2 * rgpProgramNodes, + in DWORD celtPrograms, + /+[in]+/ IDebugEventCallback2 pCallback, + in ATTACH_REASON dwReason); + + HRESULT CreatePendingBreakpoint( + /+[in]+/ IDebugBreakpointRequest2 pBPRequest, + /+[out]+/ IDebugPendingBreakpoint2 * ppPendingBP); + + HRESULT SetException( + in EXCEPTION_INFO* pException); + + HRESULT RemoveSetException( + in EXCEPTION_INFO* pException); + + HRESULT RemoveAllSetExceptions( + // Either guidlang or guidEng + in GUID* guidType); + + HRESULT GetEngineId( + /+[out]+/ GUID *pguidEngine); + + HRESULT DestroyProgram( + /+[in]+/ IDebugProgram2 pProgram); + + HRESULT ContinueFromSynchronousEvent( + /+[in]+/ IDebugEvent2 pEvent); + + HRESULT SetLocale( + in WORD wLangID); + + HRESULT SetRegistryRoot( + /+[ ptr]+/ in LPCOLESTR pszRegistryRoot); + + HRESULT SetMetric( + in LPCOLESTR pszMetric, + in VARIANT varValue); + + // These methods were added after the Office fork + HRESULT CauseBreak(); +} +enum /+ enum_ATTACH_REASON+/ : DWORD +{ + // Attaching because we launched the process + // (prog create and thread create can be stopping events; send entry point, not attach complete) + ATTACH_REASON_LAUNCH = 0x0001, + // Attaching because the user requested an attach + // (prog create and thread create cannot be stopping events; send attach complete) + ATTACH_REASON_USER = 0x0002, + // Attaching because we're already debugging the process + // (prog create and thread create can be stopping events; send attach complete) + ATTACH_REASON_AUTO = 0x0003, +} +alias DWORD enum_ATTACH_REASON; +alias DWORD ATTACH_REASON;; + +// ------------------------------------------------------------------ +// IDebugEngineLaunch2 +const GUID IID_IDebugEngineLaunch2 = IDebugEngineLaunch2.iid; + +interface IDebugEngineLaunch2 : IUnknown +{ + static const GUID iid = { 0xc7c1462f,0x9736,0x466c,[ 0xb2,0xc1,0xb6,0xb2,0xde,0xdb,0xf4,0xa7 ] }; + HRESULT LaunchSuspended( + /+[ ptr]+/ in LPCOLESTR pszServer, + /+[in]+/ IDebugPort2 pPort, + /+[ ptr]+/ in LPCOLESTR pszExe, + /+[ ptr]+/ in LPCOLESTR pszArgs, + /+[ ptr]+/ in LPCOLESTR pszDir, + /+[ ptr]+/ in BSTR bstrEnv, + /+[ ptr]+/ in LPCOLESTR pszOptions, + in LAUNCH_FLAGS dwLaunchFlags, + in DWORD hStdInput, + in DWORD hStdOutput, + in DWORD hStdError, + /+[in]+/ IDebugEventCallback2 pCallback, + /+[out]+/ IDebugProcess2 *ppProcess); + + HRESULT ResumeProcess( + /+[in]+/ IDebugProcess2 pProcess); + + HRESULT CanTerminateProcess( + /+[in]+/ IDebugProcess2 pProcess); + + HRESULT TerminateProcess( + /+[in]+/ IDebugProcess2 pProcess); +}; + +// ------------------------------------------------------------------ +// IDebugEngine3 +const GUID IID_IDebugEngine3 = IDebugEngine3.iid; + +interface IDebugEngine3 : IDebugEngine2 +{ + static const GUID iid = { 0xA60384F6,0x3712,0x4cb3,[ 0xBC,0x46,0x81,0xE6,0x40,0x2F,0xEE,0x99 ] }; + // szSymbolSearchPath uses the unicode delimiting character to seperate + // search paths. + HRESULT SetSymbolPath( + in LPCOLESTR szSymbolSearchPath, + in LPCOLESTR szSymbolCachePath, + in LOAD_SYMBOLS_FLAGS Flags); + + // Load symbols for all modules that do not have any Returns S_OK if at + // least one module loaded symbols returns S_FALSE if no modules loaded symbols. + HRESULT LoadSymbols(); + + // Pass on the JustMyCode info to the engines + HRESULT SetJustMyCodeState( + in BOOL fUpdate, // TRUE = update; FALSE = reset (ignore everything sent earlier) + in DWORD dwModules, // count + /+[ size_is (dwModules), ptr]+/ in JMC_CODE_SPEC* rgJMCSpec); // array of info about modules + + // Pass the guid of the engine from the METRICs. + HRESULT SetEngineGuid( + in GUID *guidEngine); + + HRESULT SetAllExceptions( + in EXCEPTION_STATE dwState); +} + +// ------------------------------------------------------------------ +// IDebugEventCallback2 +const GUID IID_IDebugEventCallback2 = IDebugEventCallback2.iid; + +interface IDebugEventCallback2 : IUnknown +{ + static const GUID iid = { 0xade2eeb9,0xfc85,0x4f5b,[ 0xb5,0xd9,0xd4,0x31,0xb4,0xaa,0xc3,0x1a ] }; + + HRESULT Event( + /+[in]+/ IDebugEngine2 pEngine, + /+[in]+/ IDebugProcess2 pProcess, + /+[in]+/ IDebugProgram2 pProgram, + /+[in]+/ IDebugThread2 pThread, + /+[in]+/ IDebugEvent2 pEvent, + in IID* riidEvent, + in DWORD dwAttrib); +} +enum /+ enum_EVENTATTRIBUTES+/ : DWORD +{ + // The event is asynchronous; no reply is necessary + EVENT_ASYNCHRONOUS = 0x0000, + // The event is synchronous; reply via IDebugEngine2::ContinueFromSynchronousEvent + EVENT_SYNCHRONOUS = 0x0001, + // The event is stopping; reply via IDebugThread2::ContinueFromStoppingEvent + EVENT_STOPPING = 0x0002, + EVENT_ASYNC_STOP = 0x0002, // (not currently supported) + EVENT_SYNC_STOP = 0x0003, + // The event is sent immediately and synchronously to the IDE + // (even if the IDE is currently handling an event) + EVENT_IMMEDIATE = 0x0004, + // The event is for expression evaluation + EVENT_EXPRESSION_EVALUATION = 0x0008 +} +alias DWORD enum_EVENTATTRIBUTES; +alias DWORD EVENTATTRIBUTES;; + +// ------------------------------------------------------------------ +// IDebugSettingsCallback2 + +const GUID IID_IDebugSettingsCallback2 = IDebugSettingsCallback2.iid; + +interface IDebugSettingsCallback2 : IUnknown +{ + static const GUID iid = { 0x050b1813,0x91db,0x47a0,[ 0x89,0x87,0xfc,0x55,0xbd,0xd6,0x36,0x2b ] }; + HRESULT GetMetricGuid( + in LPCWSTR pszType, + in GUID* guidSection, + in LPCWSTR pszMetric, + /+[out]+/ GUID* pguidValue + ); + + HRESULT GetMetricDword( + in LPCWSTR pszType, + in GUID* guidSection, + in LPCWSTR pszMetric, + /+[out]+/ DWORD* pdwValue + ); + + HRESULT GetEEMetricString( + in GUID* guidLang, + in GUID* guidVendor, + in LPCWSTR pszMetric, + /+[out]+/ BSTR* pbstrValue + ); + + HRESULT GetEEMetricGuid( + in GUID* guidLang, + in GUID* guidVendor, + in LPCWSTR pszMetric, + /+[out]+/ GUID* pguidValue + ); + + HRESULT GetEEMetricFile( + in GUID* guidLang, + in GUID* guidVendor, + in LPCWSTR pszMetric, + /+[out]+/ BSTR* pbstrValue + ); + + HRESULT EnumEEs( + in DWORD celtBuffer, + /+[in, out, ptr, size_is(celtBuffer), length_is(*pceltEEs)]+/ GUID* rgguidLang, + /+[in, out, ptr, size_is(celtBuffer), length_is(*pceltEEs)]+/ GUID* rgguidVendor, + /+[in, out]+/ DWORD* pceltEEs + ); + + HRESULT GetEEMetricDword( + in GUID* guidLang, + in GUID* guidVendor, + in LPCWSTR pszMetric, + /+[out]+/ DWORD* pdwValue + ); + + HRESULT GetEELocalObject( + in GUID* guidLang, + in GUID* guidVendor, + in LPCWSTR pszMetric, + /+[out]+/ IUnknown * ppUnk + ); + + HRESULT GetMetricString( + in LPCWSTR pszType, + in GUID* guidSection, + in LPCWSTR pszMetric, + /+[out]+/ BSTR* pbstrValue + ); +}; + +// ------------------------------------------------------------------ +// IDebugEvent2 +const GUID IID_IDebugEvent2 = IDebugEvent2.iid; + +interface IDebugEvent2 : IUnknown +{ + static const GUID iid = { 0x423238d6,0xda42,0x4989,[ 0x96,0xfb,0x6b,0xba,0x26,0xe7,0x2e,0x09 ] }; + HRESULT GetAttributes( + /+[out]+/ DWORD* pdwAttrib); +}; + +// ------------------------------------------------------------------ +// IDebugSessionCreateEvent2 +const GUID IID_IDebugSessionCreateEvent2 = IDebugSessionCreateEvent2.iid; + +interface IDebugSessionCreateEvent2 : IUnknown +{ + static const GUID iid = { 0x2c2b15b7,0xfc6d,0x45b3,[ 0x96,0x22,0x29,0x66,0x5d,0x96,0x4a,0x76 ] }; +}; + +// ------------------------------------------------------------------ +// IDebugSessionDestroyEvent2 +const GUID IID_IDebugSessionDestroyEvent2 = IDebugSessionDestroyEvent2.iid; + +interface IDebugSessionDestroyEvent2 : IUnknown +{ + static const GUID iid = { 0xf199b2c2,0x88fe,0x4c5d,[ 0xa0,0xfd,0xaa,0x04,0x6b,0x0d,0xc0,0xdc ] }; +}; + +// ------------------------------------------------------------------ +// IDebugEngineCreateEvent2 +const GUID IID_IDebugEngineCreateEvent2 = IDebugEngineCreateEvent2.iid; + +interface IDebugEngineCreateEvent2 : IUnknown +{ + static const GUID iid = { 0xfe5b734c,0x759d,0x4e59,[ 0xab,0x04,0xf1,0x03,0x34,0x3b,0xdd,0x06 ] }; + HRESULT GetEngine( + /+[out]+/ IDebugEngine2 *pEngine); +}; + +// ------------------------------------------------------------------ +// IDebugProcessCreateEvent2 +const GUID IID_IDebugProcessCreateEvent2 = IDebugProcessCreateEvent2.iid; + +interface IDebugProcessCreateEvent2 : IUnknown +{ + static const GUID iid = { 0xbac3780f,0x04da,0x4726,[ 0x90,0x1c,0xba,0x6a,0x46,0x33,0xe1,0xca ] }; +}; + +// ------------------------------------------------------------------ +// IDebugProcessDestroyEvent2 +const GUID IID_IDebugProcessDestroyEvent2 = IDebugProcessDestroyEvent2.iid; + +interface IDebugProcessDestroyEvent2 : IUnknown +{ + static const GUID iid = { 0x3e2a0832,0x17e1,0x4886,[ 0x8c,0x0e,0x20,0x4d,0xa2,0x42,0x99,0x5f ] }; +}; + +// ------------------------------------------------------------------ +// IDebugProgramCreateEvent2 +const GUID IID_IDebugProgramCreateEvent2 = IDebugProgramCreateEvent2.iid; + +interface IDebugProgramCreateEvent2 : IUnknown +{ + static const GUID iid = { 0x96cd11ee,0xecd4,0x4e89,[ 0x95,0x7e,0xb5,0xd4,0x96,0xfc,0x41,0x39 ] }; +}; + +// ------------------------------------------------------------------ +// IDebugProgramDestroyEvent2 +const GUID IID_IDebugProgramDestroyEvent2 = IDebugProgramDestroyEvent2.iid; + +interface IDebugProgramDestroyEvent2 : IUnknown +{ + static const GUID iid = { 0xe147e9e3,0x6440,0x4073,[ 0xa7,0xb7,0xa6,0x55,0x92,0xc7,0x14,0xb5 ] }; + HRESULT GetExitCode( + /+[out]+/ DWORD* pdwExit); +}; + +// ------------------------------------------------------------------ +// IDebugProgramDestroyEventFlags2 +const GUID IID_IDebugProgramDestroyEventFlags2 = IDebugProgramDestroyEventFlags2.iid; + +interface IDebugProgramDestroyEventFlags2 : IUnknown +{ + static const GUID iid = { 0x7e072bee,0x24e7,0x43eb,[ 0x9b,0xce,0x06,0x40,0x2c,0x70,0xe0,0x18 ] }; + + HRESULT GetFlags( + /+[out]+/ PROGRAM_DESTROY_FLAGS* pdwFlags); +} +enum /+ enum_PROGRAM_DESTROY_FLAGS+/ : DWORD +{ + // continue debugging even if no programs are left + PROGRAM_DESTROY_CONTINUE_DEBUGGING = 0x1 +} +alias DWORD enum_PROGRAM_DESTROY_FLAGS; +alias DWORD PROGRAM_DESTROY_FLAGS; + +// ------------------------------------------------------------------ +// IDebugThreadCreateEvent2 +const GUID IID_IDebugThreadCreateEvent2 = IDebugThreadCreateEvent2.iid; + +interface IDebugThreadCreateEvent2 : IUnknown +{ + static const GUID iid = { 0x2090ccfc,0x70c5,0x491d,[ 0xa5,0xe8,0xba,0xd2,0xdd,0x9e,0xe3,0xea ] }; +}; + +// ------------------------------------------------------------------ +// IDebugThreadDestroyEvent2 +const GUID IID_IDebugThreadDestroyEvent2 = IDebugThreadDestroyEvent2.iid; + +interface IDebugThreadDestroyEvent2 : IUnknown +{ + static const GUID iid = { 0x2c3b7532,0xa36f,0x4a6e,[ 0x90,0x72,0x49,0xbe,0x64,0x9b,0x85,0x41 ] }; + HRESULT GetExitCode( + /+[out]+/ DWORD* pdwExit); +}; + +// ------------------------------------------------------------------ +// IDebugLoadCompleteEvent2 +const GUID IID_IDebugLoadCompleteEvent2 = IDebugLoadCompleteEvent2.iid; + +interface IDebugLoadCompleteEvent2 : IUnknown +{ + static const GUID iid = { 0xb1844850,0x1349,0x45d4,[ 0x9f,0x12,0x49,0x52,0x12,0xf5,0xeb,0x0b ] }; +}; + +// ------------------------------------------------------------------ +// IDebugEntryPointEvent2 +const GUID IID_IDebugEntryPointEvent2 = IDebugEntryPointEvent2.iid; + +interface IDebugEntryPointEvent2 : IUnknown +{ + static const GUID iid = { 0xe8414a3e,0x1642,0x48ec,[ 0x82,0x9e,0x5f,0x40,0x40,0xe1,0x6d,0xa9 ] }; +}; + +// ------------------------------------------------------------------ +// IDebugStepCompleteEvent2 +const GUID IID_IDebugStepCompleteEvent2 = IDebugStepCompleteEvent2.iid; + +interface IDebugStepCompleteEvent2 : IUnknown +{ + static const GUID iid = { 0x0f7f24c1,0x74d9,0x4ea6,[ 0xa3,0xea,0x7e,0xdb,0x2d,0x81,0x44,0x1d ] }; +}; + +// ------------------------------------------------------------------ +// IDebugCanStopEvent2 +const GUID IID_IDebugCanStopEvent2 = IDebugCanStopEvent2.iid; + +interface IDebugCanStopEvent2 : IUnknown +{ + static const GUID iid = { 0xb5b0d747,0xd4d2,0x4e2d,[ 0x87,0x2d,0x74,0xda,0x22,0x03,0x78,0x26 ] }; + + HRESULT GetReason( + /+[out]+/ CANSTOP_REASON *pcr); + + HRESULT CanStop( + in BOOL fCanStop); + + HRESULT GetDocumentContext( + /+[out]+/ IDebugDocumentContext2 *ppDocCxt); + + HRESULT GetCodeContext( + /+[out]+/ IDebugCodeContext2 * ppCodeContext); +} +enum /+ enum_CANSTOP_REASON+/ : DWORD +{ + CANSTOP_ENTRYPOINT = 0x0000, + CANSTOP_STEPIN = 0x0001 +} +alias DWORD enum_CANSTOP_REASON; +alias DWORD CANSTOP_REASON;; + +// ------------------------------------------------------------------ +// IDebugBreakEvent2 +const GUID IID_IDebugBreakEvent2 = IDebugBreakEvent2.iid; + +interface IDebugBreakEvent2 : IUnknown +{ + static const GUID iid = { 0xc7405d1d,0xe24b,0x44e0,[ 0xb7,0x07,0xd8,0xa5,0xa4,0xe1,0x64,0x1b ] }; +}; + +// ------------------------------------------------------------------ +// IDebugBreakpointEvent2 +const GUID IID_IDebugBreakpointEvent2 = IDebugBreakpointEvent2.iid; + +interface IDebugBreakpointEvent2 : IUnknown +{ + static const GUID iid = { 0x501c1e21,0xc557,0x48b8,[ 0xba,0x30,0xa1,0xea,0xb0,0xbc,0x4a,0x74 ] }; + HRESULT EnumBreakpoints( + /+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum); +}; + +// ------------------------------------------------------------------ +// IDebugExceptionEvent2 +const GUID IID_IDebugExceptionEvent2 = IDebugExceptionEvent2.iid; + +interface IDebugExceptionEvent2 : IUnknown +{ + static const GUID iid = { 0x51a94113,0x8788,0x4a54,[ 0xae,0x15,0x08,0xb7,0x4f,0xf9,0x22,0xd0 ] }; + HRESULT GetException( + /+[out]+/ EXCEPTION_INFO* pExceptionInfo); + + HRESULT GetExceptionDescription( + /+[out]+/ BSTR* pbstrDescription); + + HRESULT CanPassToDebuggee(); + + HRESULT PassToDebuggee( + in BOOL fPass); +}; + +// based on EXCEPTION_RECORD only Win32/64-agnostic +struct _NATIVE_EXCEPTION_INFO +{ + DWORD ExceptionCode; + DWORD ExceptionFlags; + DWORD NumberOfParameters; + UINT64[15] ExceptionInformation; +} +alias _NATIVE_EXCEPTION_INFO NATIVE_EXCEPTION_INFO; + +// ------------------------------------------------------------------ +// IDebugNativeExceptionInfo +// +// Not an event as such, but QI-able from an IDebugExceptionEvent2 +// to get more information +const GUID IID_IDebugNativeExceptionInfo = IDebugNativeExceptionInfo.iid; + +interface IDebugNativeExceptionInfo : IUnknown +{ + static const GUID iid = { 0x3d320710,0x06c0,0x437b,[ 0xa5,0x5f,0x82,0x6f,0x48,0xcc,0x7e,0xe7 ] }; + HRESULT GetNativeException( + /+[out]+/ NATIVE_EXCEPTION_INFO* pExceptionInfo); +}; + +// ------------------------------------------------------------------ +// IDebugManagedExceptionInfo2 +// +// Not an event as such, but QI-able from an IDebugExceptionEvent2 +// to get more information +const GUID IID_IDebugManagedExceptionInfo2 = IDebugManagedExceptionInfo2.iid; + +interface IDebugManagedExceptionInfo2 : IUnknown +{ + static const GUID iid = { 0xd288564a,0xedb2,0x4214,[ 0x86,0x90,0xff,0x9a,0x82,0x87,0x03,0x79 ] }; + + HRESULT GetExceptionMessage( + /+[out]+/ BSTR* pbstrExceptionMessage); + + HRESULT GetExceptionBoundaryType( + /+[out]+/ EXCEPTION_BOUNDARY_TYPE *pType); +} +enum /+ tagEXCEPTION_BOUNDARY_TYPE+/ : int +{ + EXCEPTION_BOUNDARY_NONE, + EXCEPTION_BOUNDARY_APPDOMAIN, + EXCEPTION_BOUNDARY_UNMANAGED, +} +alias int tagEXCEPTION_BOUNDARY_TYPE; +alias tagEXCEPTION_BOUNDARY_TYPE EXCEPTION_BOUNDARY_TYPE;; + +// ------------------------------------------------------------------ +// IDebugOutputStringEvent2 +const GUID IID_IDebugOutputStringEvent2 = IDebugOutputStringEvent2.iid; + +interface IDebugOutputStringEvent2 : IUnknown +{ + static const GUID iid = { 0x569c4bb1,0x7b82,0x46fc,[ 0xae,0x28,0x45,0x36,0xdd,0xad,0x75,0x3e ] }; + HRESULT GetString( + /+[out]+/ BSTR* pbstrString); +}; + +// ------------------------------------------------------------------ +// IDebugModuleLoadEvent2 +const GUID IID_IDebugModuleLoadEvent2 = IDebugModuleLoadEvent2.iid; + +interface IDebugModuleLoadEvent2 : IUnknown +{ + static const GUID iid = { 0x989db083,0x0d7c,0x40d1,[ 0xa9,0xd9,0x92,0x1b,0xf6,0x11,0xa4,0xb2 ] }; + HRESULT GetModule( + /+[out]+/ IDebugModule2 * pModule, + // Optional message that describes the event + /+[in, out]+/ BSTR* pbstrDebugMessage, + // Set to TRUE if the module's loading; FALSE if unloading + /+[in, out]+/ BOOL* pbLoad); +}; + +// ------------------------------------------------------------------ +// IDebugSymbolSearchEvent2 +const GUID IID_IDebugSymbolSearchEvent2 = IDebugSymbolSearchEvent2.iid; + +interface IDebugSymbolSearchEvent2 : IUnknown +{ + static const GUID iid = { 0x638F7C54,0xC160,0x4c7b,[ 0xB2,0xD0,0xE0,0x33,0x7B,0xC6,0x1F,0x8C ] }; + + // Notify the package that an attempt was made to load symbols + // for pModule + HRESULT GetSymbolSearchInfo( + /+[out]+/ IDebugModule3 * pModule, + // Optional message that describes the event + /+[in, out]+/ BSTR* pbstrDebugMessage, + // Flag denoting if symbols were loaded + /+[out]+/ MODULE_INFO_FLAGS* pdwModuleInfoFlags); +} +enum /+ enum_MODULE_INFO_FLAGS+/ : DWORD +{ + MIF_SYMBOLS_LOADED = 0x0001, +} +alias DWORD enum_MODULE_INFO_FLAGS; +alias DWORD MODULE_INFO_FLAGS;; + +// ------------------------------------------------------------------ +// +// IDebugBeforeSymbolSearchEvent2 +const GUID IID_IDebugBeforeSymbolSearchEvent2 = IDebugBeforeSymbolSearchEvent2.iid; + +interface IDebugBeforeSymbolSearchEvent2 : IUnknown +{ + static const GUID iid = { 0xB15C8149,0x2B81,0x40ae,[ 0x93,0x88,0x62,0xFA,0x27,0x6A,0xE1,0x4C ] }; + HRESULT GetModuleName( + /+[out]+/ BSTR* pbstrModuleName + ); +}; + +// ------------------------------------------------------------------ +// IDebugPropertyCreateEvent2 +const GUID IID_IDebugPropertyCreateEvent2 = IDebugPropertyCreateEvent2.iid; + +interface IDebugPropertyCreateEvent2 : IUnknown +{ + static const GUID iid = { 0xded6d613,0xa3db,0x4e35,[ 0xbb,0x5b,0xa9,0x23,0x91,0x13,0x3f,0x03 ] }; + HRESULT GetDebugProperty( + /+[out]+/ IDebugProperty2 * ppProperty); +}; + +// ------------------------------------------------------------------ +// IDebugPropertyDestroyEvent2 +const GUID IID_IDebugPropertyDestroyEvent2 = IDebugPropertyDestroyEvent2.iid; + +interface IDebugPropertyDestroyEvent2 : IUnknown +{ + static const GUID iid = { 0xf3765f18,0xf395,0x4b8c,[ 0x8e,0x95,0xdc,0xb3,0xfe,0x8e,0x7e,0xc8 ] }; + HRESULT GetDebugProperty( + /+[out]+/ IDebugProperty2 * ppProperty); +}; + +// ------------------------------------------------------------------ +// IDebugBreakpointBoundEvent2 + +const GUID IID_IDebugBreakpointBoundEvent2 = IDebugBreakpointBoundEvent2.iid; + +interface IDebugBreakpointBoundEvent2 : IUnknown +{ + static const GUID iid = { 0x1dddb704,0xcf99,0x4b8a,[ 0xb7,0x46,0xda,0xbb,0x01,0xdd,0x13,0xa0 ] }; + HRESULT GetPendingBreakpoint( + /+[out]+/ IDebugPendingBreakpoint2 * ppPendingBP); + + HRESULT EnumBoundBreakpoints( + /+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum); +}; + +// ------------------------------------------------------------------ +// IDebugBreakpointUnboundEvent2 + +const GUID IID_IDebugBreakpointUnboundEvent2 = IDebugBreakpointUnboundEvent2.iid; + +interface IDebugBreakpointUnboundEvent2 : IUnknown +{ + static const GUID iid = { 0x78d1db4f,0xc557,0x4dc5,[ 0xa2,0xdd,0x53,0x69,0xd2,0x1b,0x1c,0x8c ] }; + + HRESULT GetBreakpoint( + /+[out]+/ IDebugBoundBreakpoint2 * ppBP); + + HRESULT GetReason( + /+[out]+/ BP_UNBOUND_REASON* pdwUnboundReason); +} +enum /+ enum_BP_UNBOUND_REASON+/ : DWORD +{ + BPUR_UNKNOWN = 0x0001, + BPUR_CODE_UNLOADED = 0x0002, + // BPUR_BREAKPOINT_REBIND means the breakpoint is being unbound + // because it is being rebound to a different location. (For example, + // this can happen after an ENC when the breakpoint moves, or if this + // breakpoint was originally bound with a less than perfect file + // name match.) Generally, the IDE will discard any persisted information + // about this breakpoint. + BPUR_BREAKPOINT_REBIND = 0x0003, + // BPUR_BREAKPOINT_ERROR means that the breakpoint was deemed to be in error + // after it was bound. This will happen for managed bps whose condition is + // not valid. + BPUR_BREAKPOINT_ERROR = 0x0004 +} +alias DWORD enum_BP_UNBOUND_REASON; +alias DWORD BP_UNBOUND_REASON;; + +// ------------------------------------------------------------------ +// IDebugBreakpointErrorEvent2 + +const GUID IID_IDebugBreakpointErrorEvent2 = IDebugBreakpointErrorEvent2.iid; + +interface IDebugBreakpointErrorEvent2 : IUnknown +{ + static const GUID iid = { 0xabb0ca42,0xf82b,0x4622,[ 0x84,0xe4,0x69,0x03,0xae,0x90,0xf2,0x10 ] }; + HRESULT GetErrorBreakpoint( + /+[out]+/ IDebugErrorBreakpoint2 * ppErrorBP); +}; + +// ------------------------------------------------------------------ +// IDebugExpressionEvaluationCompleteEvent2 +const GUID IID_IDebugExpressionEvaluationCompleteEvent2 = IDebugExpressionEvaluationCompleteEvent2.iid; + +interface IDebugExpressionEvaluationCompleteEvent2 : IUnknown +{ + static const GUID iid = { 0xc0e13a85,0x238a,0x4800,[ 0x83,0x15,0xd9,0x47,0xc9,0x60,0xa8,0x43 ] }; + HRESULT GetExpression( + /+[out]+/ IDebugExpression2 * ppExpr); + + HRESULT GetResult( + /+[out]+/ IDebugProperty2 * ppResult); +}; + +// ------------------------------------------------------------------ +// IDebugReturnValueEvent2 +const GUID IID_IDebugReturnValueEvent2 = IDebugReturnValueEvent2.iid; + +interface IDebugReturnValueEvent2 : IUnknown +{ + static const GUID iid = { 0x0da4d4cc,0x2d0b,0x410f,[ 0x8d,0x5d,0xb6,0xb7,0x3a,0x5d,0x35,0xd8 ] }; + HRESULT GetReturnValue( + /+[out]+/ IDebugProperty2 * ppReturnValue); +}; + +// ------------------------------------------------------------------ +// IDebugNoSymbolsEvent2 +const GUID IID_IDebugNoSymbolsEvent2 = IDebugNoSymbolsEvent2.iid; + +interface IDebugNoSymbolsEvent2 : IUnknown +{ + static const GUID iid = { 0x3ad4fb48,0x647e,0x4b03,[ 0x9c,0x1e,0x52,0x75,0x4e,0x80,0xc8,0x80 ] }; +}; + +// ------------------------------------------------------------------ +// IDebugProgramNameChangedEvent2 +const GUID IID_IDebugProgramNameChangedEvent2 = IDebugProgramNameChangedEvent2.iid; + +interface IDebugProgramNameChangedEvent2 : IUnknown +{ + static const GUID iid = { 0xe05c2dfd,0x59d5,0x46d3,[ 0xa7,0x1c,0x5d,0x07,0x66,0x5d,0x85,0xaf ] }; +}; + +// ------------------------------------------------------------------ +// IDebugThreadNameChangedEvent2 +const GUID IID_IDebugThreadNameChangedEvent2 = IDebugThreadNameChangedEvent2.iid; + +interface IDebugThreadNameChangedEvent2 : IUnknown +{ + static const GUID iid = { 0x1ef4ef78,0x2c44,0x4b7a,[ 0x84,0x73,0x8f,0x43,0x57,0x61,0x17,0x29 ] }; +}; + +// ------------------------------------------------------------------ +// IDebugMessageEvent2 +const GUID IID_IDebugMessageEvent2 = IDebugMessageEvent2.iid; + +interface IDebugMessageEvent2 : IUnknown +{ + static const GUID iid = { 0x3bdb28cf,0xdbd2,0x4d24,[ 0xaf,0x03,0x01,0x07,0x2b,0x67,0xeb,0x9e ] }; + + HRESULT GetMessage( + /+[out]+/ MESSAGETYPE* pMessageType, + /+[out]+/ BSTR* pbstrMessage, + // Use the MB_* constants + /+[out]+/ DWORD* pdwType, + /+[out]+/ BSTR* pbstrHelpFileName, + /+[out]+/ DWORD* pdwHelpId); + + HRESULT SetResponse( + in DWORD dwResponse); +} +enum /+ enum_MESSAGETYPE+/ : DWORD +{ + // the following values indicate the how to display the message + MT_OUTPUTSTRING = 0x00000001, // output a message to the Output window + MT_MESSAGEBOX = 0x00000002, // display a message box + MT_TYPE_MASK = 0x000000FF, + + // the following values provides reasons for the message + MT_REASON_EXCEPTION = 0x00000100, + MT_REASON_TRACEPOINT = 0x00000200, + MT_REASON_MASK = 0x0000FF00, +} +alias DWORD enum_MESSAGETYPE; +alias DWORD MESSAGETYPE;; + +// ------------------------------------------------------------------ +// IDebugErrorEvent2 +const GUID IID_IDebugErrorEvent2 = IDebugErrorEvent2.iid; + +interface IDebugErrorEvent2 : IUnknown +{ + static const GUID iid = { 0xfdb7a36c,0x8c53,0x41da,[ 0xa3,0x37,0x8b,0xd8,0x6b,0x14,0xd5,0xcb ] }; + // Note: format should be of the form: + // "Unable to stand on my head. %1" + HRESULT GetErrorMessage( + /+[out]+/ MESSAGETYPE* pMessageType, + /+[out]+/ BSTR* pbstrErrorFormat, + /+[out]+/ HRESULT* phrErrorReason, + // Use the MB_* constants + /+[out]+/ DWORD* pdwType, + /+[out]+/ BSTR* pbstrHelpFileName, + /+[out]+/ DWORD* pdwHelpId); +}; + +// ------------------------------------------------------------------ +// IDebugActivateDocumentEvent2 +const GUID IID_IDebugActivateDocumentEvent2 = IDebugActivateDocumentEvent2.iid; + +interface IDebugActivateDocumentEvent2 : IUnknown +{ + static const GUID iid = { 0x58f36c3d,0x7d07,0x4eba,[ 0xa0,0x41,0x62,0xf6,0x3e,0x18,0x80,0x37 ] }; + HRESULT GetDocument( + /+[out]+/ IDebugDocument2 * ppDoc); + + HRESULT GetDocumentContext( + /+[out]+/ IDebugDocumentContext2 * ppDocContext); +}; + +// ------------------------------------------------------------------ +// IDebugInterceptExceptionCompleteEvent2 +const GUID IID_IDebugInterceptExceptionCompleteEvent2 = IDebugInterceptExceptionCompleteEvent2.iid; + +interface IDebugInterceptExceptionCompleteEvent2 : IUnknown +{ + static const GUID iid = { 0x44FCEACA,0x7F56,0x4d2c,[ 0xA6,0x37,0x60,0x05,0x2B,0x1B,0x9C,0xBE ] }; + HRESULT GetInterceptCookie( + /+[out]+/ UINT64* pqwCookie); +}; + +// ------------------------------------------------------------------ +// IDebugAttachCompleteEvent2 +const GUID IID_IDebugAttachCompleteEvent2 = IDebugAttachCompleteEvent2.iid; + +interface IDebugAttachCompleteEvent2 : IUnknown +{ + static const GUID iid = { 0xfe1fd9ea,0x6413,0x4183,[ 0xa6,0x7d,0x58,0x88,0x70,0x01,0x4e,0x97 ] }; +}; + +// ------------------------------------------------------------------ +// IDebugFuncEvalAbortedEvent2 +const GUID IID_IDebugFuncEvalAbortedEvent2 = IDebugFuncEvalAbortedEvent2.iid; + +interface IDebugFuncEvalAbortedEvent2 : IUnknown +{ + static const GUID iid = { 0x3f3be369,0x0b78,0x4511,[ 0x91,0xe5,0x08,0xf9,0xfc,0x5c,0xae,0x0d ] }; + + HRESULT GetAbortResult( + /+[out]+/ FUNC_EVAL_ABORT_RESULT* pResult); + + HRESULT GetFunctionName( + /+[out]+/ BSTR* pbstrFunctionName); +} +enum /+ tagFUNC_EVAL_ABORT_RESULT+/ : int +{ + ABORT_SUCCEEDED = 0, + RUDE_ABORT_SUCCEEDED = 1, + ABORT_FAILED = 2, + ABORT_HUNG = 3, + PROCESS_TERMINATED = 4 +} +alias int tagFUNC_EVAL_ABORT_RESULT; +alias tagFUNC_EVAL_ABORT_RESULT FUNC_EVAL_ABORT_RESULT;; + +// ------------------------------------------------------------------ +// IDebugStopCompleteEvent2 +const GUID IID_IDebugStopCompleteEvent2 = IDebugStopCompleteEvent2.iid; + +interface IDebugStopCompleteEvent2 : IUnknown +{ + static const GUID iid = { 0x3dca9dcd,0xfb09,0x4af1,[ 0xa9,0x26,0x45,0xf2,0x93,0xd4,0x8b,0x2d ] }; +}; + +enum /+ tagEncUnavailableReason+/ : int +{ + ENCUN_NONE, + ENCUN_INTEROP, + ENCUN_SQLCLR, + ENCUN_MINIDUMP, + ENCUN_EMBEDDED, + ENCUN_ATTACH, + ENCUN_WIN64, + ENCUN_STOPONEMODE, + ENCUN_MODULENOTLOADED, + ENCUN_MODULERELOADED, + ENCUN_INRUNMODE, + ENCUN_NOTBUILT, + ENCUN_REMOTE, + ENCUN_SILVERLIGHT, + ENCUN_ENGINE_METRIC_FALSE, + ENCUN_NOT_ALLOWED_FOR_MODULE, + ENCUN_NOT_SUPPORTED_FOR_CLR64_VERSION +} +alias int tagEncUnavailableReason; +alias tagEncUnavailableReason EncUnavailableReason; + +// The VSdebug Package implements this interface. +const GUID IID_IDebugEncNotify = IDebugEncNotify.iid; + +interface IDebugEncNotify : IUnknown +{ + static const GUID iid = { 0x347C45E1,0x5C42,0x4e0e,[ 0x9E,0x15,0xDE,0xFF,0x9C,0xFC,0x78,0x41 ] }; + // This method allows the ENCManager to tell the package that ENC + // is not available as soon as it can be determined rather than waiting for a call from the package. + HRESULT NotifyEncIsUnavailable( + in EncUnavailableReason reason, + in BOOL fEditWasApplied); + + // This method allows the Lang Serice to Notify the package that the Current Statement + // must be updated due to an edit. + HRESULT NotifyEncUpdateCurrentStatement(); + + // This method allows the Lang Service to Notify the package that an edit was attempted + // when the debuggee is in a state that cannot accept changes. + HRESULT NotifyEncEditAttemptedAtInvalidStopState(); + + // This allows the Lang Service or project to tell the package that it prevented + // an edit from occuring. + // The package is responsible for asking the ENC manager why ENC would not be + // allowed at this point. + HRESULT NotifyEncEditDisallowedByProject( + /+[in]+/ IUnknown pProject); +} + +// ------------------------------------------------------------------ +// IDebugSessionEvent2 - implemented by all SDM events (such as session +// create/destroy) +const GUID IID_IDebugSessionEvent2 = IDebugSessionEvent2.iid; + +interface IDebugSessionEvent2 : IUnknown +{ + static const GUID iid = { 0xfd1a378c,0xf117,0x4f43,[ 0x91,0x7c,0xda,0xdc,0xa1,0x30,0x86,0x06 ] }; + HRESULT GetSession( + /+[out]+/ IDebugSession2 *ppSession); +}; + +// ------------------------------------------------------------------ +// IDebugProcess2 +const GUID IID_IDebugProcess2 = IDebugProcess2.iid; + +interface IDebugProcess2 : IUnknown +{ + static const GUID iid = { 0x43286fea,0x6997,0x4543,[ 0x80,0x3e,0x60,0xa2,0x0c,0x47,0x3d,0xe5 ] }; + + HRESULT GetInfo( + in PROCESS_INFO_FIELDS Fields, + /+[out]+/ PROCESS_INFO* pProcessInfo); + + HRESULT EnumPrograms( + /+[out]+/ IEnumDebugPrograms2 * ppEnum); + + HRESULT GetName( + in GETNAME_TYPE gnType, + /+[out]+/ BSTR* pbstrName); + + HRESULT GetServer( + /+[out]+/ IDebugCoreServer2 * ppServer); + + HRESULT Terminate(); + + HRESULT Attach( + /+[in]+/ IDebugEventCallback2 pCallback, + /+[ size_is (celtSpecificEngines)]+/ in GUID* rgguidSpecificEngines, + in DWORD celtSpecificEngines, + /+[out, size_is(celtSpecificEngines), length_is(celtSpecificEngines)]+/ HRESULT* rghrEngineAttach); + + HRESULT CanDetach(); + + HRESULT Detach(); + + HRESULT GetPhysicalProcessId( + /+[out]+/ AD_PROCESS_ID* pProcessId); + + HRESULT GetProcessId( + /+[out]+/ GUID* pguidProcessId); + + HRESULT GetAttachedSessionName( + /+[out]+/ BSTR* pbstrSessionName); + + // Get a list of threads in this process (no duplicates) + HRESULT EnumThreads( + /+[out]+/ IEnumDebugThreads2 * ppEnum); + + HRESULT CauseBreak(); + + HRESULT GetPort( + /+[out]+/ IDebugPort2 * ppPort); +} +enum /+ enum_PROCESS_INFO_FLAGS+/ : DWORD +{ + PIFLAG_SYSTEM_PROCESS = 0x00000001, + PIFLAG_DEBUGGER_ATTACHED = 0x00000002, + // The flags below are only valid in VS8 and above + // and are only set when PIFLAG_DEBUGGER_ATTACHED + // is set. + PIFLAG_PROCESS_STOPPED = 0x00000004, + PIFLAG_PROCESS_RUNNING = 0x00000008, +} +alias DWORD enum_PROCESS_INFO_FLAGS; +alias DWORD PROCESS_INFO_FLAGS; +enum /+ enum_PROCESS_INFO_FIELDS+/ : DWORD +{ + PIF_FILE_NAME = 0x00000001, + PIF_BASE_NAME = 0x00000002, + PIF_TITLE = 0x00000004, + PIF_PROCESS_ID = 0x00000008, + PIF_SESSION_ID = 0x00000010, + PIF_ATTACHED_SESSION_NAME = 0x00000020, + PIF_CREATION_TIME = 0x00000040, + PIF_FLAGS = 0x00000080, + + PIF_ALL = 0x000000ff, +} +alias DWORD enum_PROCESS_INFO_FIELDS; +alias DWORD PROCESS_INFO_FIELDS; +struct tagPROCESS_INFO +{ + // Valid fields + PROCESS_INFO_FIELDS Fields; + // Full path+file name+extension; equivalent to calling GetName(GN_FILENAME, ...) + BSTR bstrFileName; + // File name+extension; equivalent to calling GetName(GN_BASENAME, ...) + BSTR bstrBaseName; + // Title (if one exists); equivalent to calling GetName(GN_TITLE, ...) + BSTR bstrTitle; + // Process id; equivalent to calling GetPhysicalProcessId + AD_PROCESS_ID ProcessId; + // Session id: the system session that this process is running in + DWORD dwSessionId; + // Attached session name (if one exists); equivalent to calling GetAttachedSessionName + BSTR bstrAttachedSessionName; + // Time the process was created + FILETIME CreationTime; + // Flags + PROCESS_INFO_FLAGS Flags; +} +alias tagPROCESS_INFO PROCESS_INFO;; + +const GUID IID_IDebugProcess3 = IDebugProcess3.iid; + +interface IDebugProcess3 : IDebugProcess2 +{ + static const GUID iid = { 0x83ab1712,0x18a6,0x47a1,[ 0x8d,0xa6,0x8c,0x7b,0x0f,0x96,0x09,0x2e ] }; + + // Execute the process. The thread is given so that the debugger + // knows which thread the user is viewing when executing. + HRESULT Execute( + /+[in]+/ IDebugThread2 pThread); + + // Continue the process in whatever state is was previously in. If + // the process was stepping, then continue the step; otherwise, + // continue execution. + HRESULT Continue( + /+[in]+/ IDebugThread2 pThread); + + // Step the process. The thread specified is stepped and all other + // threads in the process run. + HRESULT Step( + /+[in]+/ IDebugThread2 pThread, + in STEPKIND sk, + in STEPUNIT step); + + HRESULT GetDebugReason( + /+[out]+/ DEBUG_REASON *pReason); + + // Provide a way to indicate the HostingProcessLanguage so that the managed + // debug engine can preload the right EE. + HRESULT SetHostingProcessLanguage(in GUID* guidLang); + HRESULT GetHostingProcessLanguage(/+[out]+/ GUID* pguidLang); + + // Provide a mechanism for the Package to explicitly disable ENC. + // EncUnavailableReason is defined in enc.idl + HRESULT DisableENC( + in EncUnavailableReason reason); + HRESULT GetENCAvailableState( + /+[out]+/EncUnavailableReason* preason); + + HRESULT GetEngineFilter( + /+[out]+/ GUID_ARRAY *pEngineArray); +} +enum /+ enum_STEPKIND+/ : DWORD +{ + STEP_INTO, + STEP_OVER, + STEP_OUT, + STEP_BACKWARDS +} +alias DWORD enum_STEPKIND; +alias DWORD STEPKIND; +enum /+ enum_STEPUNIT+/ : DWORD +{ + STEP_STATEMENT, + STEP_LINE, + STEP_INSTRUCTION, +} +alias DWORD enum_STEPUNIT; +alias DWORD STEPUNIT; +enum /+ enum_DEBUG_REASON+/ : DWORD +{ + DEBUG_REASON_ERROR, + DEBUG_REASON_USER_LAUNCHED, + DEBUG_REASON_USER_ATTACHED, + DEBUG_REASON_AUTO_ATTACHED, + DEBUG_REASON_CAUSALITY +} +alias DWORD enum_DEBUG_REASON; +alias DWORD DEBUG_REASON;; + +const GUID IID_IDebugProcessSecurity2 = IDebugProcessSecurity2.iid; + +interface IDebugProcessSecurity2 : IUnknown +{ + static const GUID iid = { 0xfca0c35c,0x4c02,0x432b,[ 0x88,0xf7,0xeb,0x27,0x7b,0xe2,0xba,0x55 ] }; + HRESULT QueryCanSafelyAttach( + ); + + HRESULT GetUserName( + /+[out]+/ BSTR *pbstrUserName + ); +}; + +// ------------------------------------------------------------------ +// IDebugProgram2 +const GUID IID_IDebugProgram2 = IDebugProgram2.iid; + +interface IDebugProgram2 : IUnknown +{ + static const GUID iid = { 0x69d172ef,0xf2c4,0x44e1,[ 0x89,0xf7,0xc8,0x62,0x31,0xe7,0x06,0xe9 ] }; + + HRESULT EnumThreads( + /+[out]+/ IEnumDebugThreads2 * ppEnum); + + HRESULT GetName( + /+[out]+/ BSTR* pbstrName); + + HRESULT GetProcess( + /+[out]+/ IDebugProcess2 * ppProcess); + + HRESULT Terminate(); + + HRESULT Attach( + /+[in]+/ IDebugEventCallback2 pCallback); + + HRESULT CanDetach(); + + HRESULT Detach(); + + HRESULT GetProgramId( + /+[out]+/ GUID* pguidProgramId); + + HRESULT GetDebugProperty( + /+[out]+/ IDebugProperty2 * ppProperty); + + // To execute during an expression evaluation, use IDebugProcess3:: + // Execute. Execution during expression evaluation requires + // a thread so that the correct expression evaluation can be continued. + HRESULT Execute(); + + // Continue, preserving state + HRESULT Continue( + /+[in]+/ IDebugThread2 pThread); + + HRESULT Step( + /+[in]+/ IDebugThread2 pThread, + in STEPKIND sk, + in STEPUNIT step); + + HRESULT CauseBreak(); + + HRESULT GetEngineInfo( + /+[out]+/ BSTR* pbstrEngine, + /+[out]+/ GUID* pguidEngine); + + HRESULT EnumCodeContexts( + /+[in]+/ IDebugDocumentPosition2 pDocPos, + /+[out]+/ IEnumDebugCodeContexts2 * ppEnum); + + HRESULT GetMemoryBytes( + /+[out]+/ IDebugMemoryBytes2 * ppMemoryBytes); + + HRESULT GetDisassemblyStream( + in DISASSEMBLY_STREAM_SCOPE dwScope, + /+[in]+/ IDebugCodeContext2 pCodeContext, + /+[out]+/ IDebugDisassemblyStream2 * ppDisassemblyStream); + + HRESULT EnumModules( + /+[out]+/ IEnumDebugModules2 * ppEnum); + + HRESULT GetENCUpdate( + /+[out]+/ IDebugENCUpdate** ppUpdate); + + HRESULT EnumCodePaths( + /+[ ptr]+/ in LPCOLESTR pszHint, + /+[in]+/ IDebugCodeContext2 pStart, + /+[in]+/ IDebugStackFrame2 pFrame, + in BOOL fSource, + /+[out]+/ IEnumCodePaths2 * ppEnum, + /+[out]+/ IDebugCodeContext2 * ppSafety); + + HRESULT WriteDump( + in DUMPTYPE DumpType, + in LPCOLESTR pszDumpUrl + ); +} +enum /+ enum_DISASSEMBLY_STREAM_SCOPE+/ : DWORD +{ + DSS_HUGE = 0x10000000, + // Get the disasm for the function contained by the code context + DSS_FUNCTION = 0x0001, + // Get the disasm for the module contained by the code context + DSS_MODULE = (DSS_HUGE) | 0x0002, + // Get the disasm for the entire address space + DSS_ALL = (DSS_HUGE) | 0x0003 +} +alias DWORD enum_DISASSEMBLY_STREAM_SCOPE; +alias DWORD DISASSEMBLY_STREAM_SCOPE; +enum /+ enum_DUMPTYPE+/ : DWORD +{ + // "mini" dump of the program state + DUMP_MINIDUMP, + // full dump of the program state + DUMP_FULLDUMP, +} +alias DWORD enum_DUMPTYPE; +alias DWORD DUMPTYPE; +struct tagCODE_PATH +{ + BSTR bstrName; + IDebugCodeContext2 pCode; +} +alias tagCODE_PATH CODE_PATH;; + +// ------------------------------------------------------------------ +// IDebugProgram3 +const GUID IID_IDebugProgram3 = IDebugProgram3.iid; + +interface IDebugProgram3 : IDebugProgram2 +{ + static const GUID iid = { 0x7CF3EC7F,0xAC62,0x4cd6,[ 0xBB,0x30,0x39,0xA4,0x64,0xCB,0x52,0xCB ] }; + // Execute the program. The thread is given so that the debugger + // knows which thread the user is viewing when executing. + HRESULT ExecuteOnThread( + /+[in]+/ IDebugThread2 pThread); +}; + +// ------------------------------------------------------------------ +// IDebugEngineProgram2 +const GUID IID_IDebugEngineProgram2 = IDebugEngineProgram2.iid; + +interface IDebugEngineProgram2 : IUnknown +{ + static const GUID iid = { 0x7ce3e768,0x654d,0x4ba7,[ 0x8d,0x95,0xcd,0xaa,0xc6,0x42,0xb1,0x41 ] }; + + // Stop all threads running in this program + HRESULT Stop(); + + HRESULT WatchForThreadStep( + /+[in]+/ IDebugProgram2 pOriginatingProgram, + in DWORD dwTid, + in BOOL fWatch, + in DWORD dwFrame); + + HRESULT WatchForExpressionEvaluationOnThread( + /+[in]+/ IDebugProgram2 pOriginatingProgram, + in DWORD dwTid, + in DWORD dwEvalFlags, + // pExprCallback must be NULL in V8 and above + /+[in]+/ IDebugEventCallback2 pExprCallback, + in BOOL fWatch); +} +enum /+ enum_WATCHFOREVAL+/ : int +{ + // the program being notified is the leaf program (it owns the leaf frame) + WATCHFOREVAL_LEAF_PROGRAM = 0x10000000 +} +alias int enum_WATCHFOREVAL;; + +// ------------------------------------------------------------------ +// IDebugProgramHost2 +const GUID IID_IDebugProgramHost2 = IDebugProgramHost2.iid; + +interface IDebugProgramHost2 : IUnknown +{ + static const GUID iid = { 0xc99d588f,0x778c,0x44fe,[ 0x8b,0x2e,0x40,0x12,0x4a,0x73,0x88,0x91 ] }; + HRESULT GetHostName( + in DWORD dwType, + /+[out]+/ BSTR* pbstrHostName); + + HRESULT GetHostId( + /+[out]+/ AD_PROCESS_ID* pProcessId); + + HRESULT GetHostMachineName( + /+[out]+/ BSTR* pbstrHostMachineName); +}; + +// ------------------------------------------------------------------ +// IDebugProgramNode2 +const GUID IID_IDebugProgramNode2 = IDebugProgramNode2.iid; + +interface IDebugProgramNode2 : IUnknown +{ + static const GUID iid = { 0x426e255c,0xf1ce,0x4d02,[ 0xa9,0x31,0xf9,0xa2,0x54,0xbf,0x7f,0x0f ] }; + + HRESULT GetProgramName( + /+[out]+/ BSTR* pbstrProgramName); + + HRESULT GetHostName( + in GETHOSTNAME_TYPE dwHostNameType, + /+[out]+/ BSTR* pbstrHostName); + + HRESULT GetHostPid( + /+[out]+/ AD_PROCESS_ID* pHostProcessId); + + // method is no longer used, and does not need to be implemented + HRESULT GetHostMachineName_V7( + /+[out]+/ BSTR* pbstrHostMachineName); + + // method is no longer used, and should not be implemented + HRESULT Attach_V7( + /+[in]+/ IDebugProgram2 pMDMProgram, + /+[in]+/ IDebugEventCallback2 pCallback, + in DWORD dwReason); + + HRESULT GetEngineInfo( + /+[out]+/ BSTR* pbstrEngine, + /+[out]+/ GUID* pguidEngine); + + // method is no longer used, and should not be implemented + HRESULT DetachDebugger_V7(); +} +enum /+ enum_GETHOSTNAME_TYPE+/ : DWORD +{ + GHN_FRIENDLY_NAME, // Gets friendly name of the host + GHN_FILE_NAME, +} +alias DWORD enum_GETHOSTNAME_TYPE; +alias DWORD GETHOSTNAME_TYPE;; + +const GUID IID_IDebugProgramNodeAttach2 = IDebugProgramNodeAttach2.iid; + +interface IDebugProgramNodeAttach2 : IUnknown +{ + static const GUID iid = { 0x73faa608,0x5f87,0x4d2b,[ 0x95,0x51,0x84,0x40,0xb1,0xcb,0xf5,0x4c ] }; + // This is the whidbey replacement for IDebugProgramNode2::Attach. + // This gives a program node a chance to say that it doesn't want + // to be debugged, and to know the program id on the port + // supplier program + HRESULT OnAttach( + in GUID* guidProgramId); +}; + +// ------------------------------------------------------------------ +// IDebugProgramEngines2 +// +// IDebugProgramEngines2 is implemented by program nodes to indicate +// all the possible DEs that can debug this program. Once a DE is +// chosen (via some UI) that choice is registered by calling SetEngine. +// This engine will then be the engine returned by +// IDebugProgramNode::GetEngineInfo. +const GUID IID_IDebugProgramEngines2 = IDebugProgramEngines2.iid; + +interface IDebugProgramEngines2 : IUnknown +{ + static const GUID iid = { 0xfda24a6b,0xb142,0x447d,[ 0xbb,0xbc,0x86,0x54,0xa3,0xd8,0x4f,0x80 ] }; + // In order to determine how many engines there are, call once + // with celtBuffer set to 0 and rgguidEngines set to NULL. This + // function will return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) + // anytime the buffer is too small and *pceltEngines will contain + // the necessary size of the buffer. + HRESULT EnumPossibleEngines( + in DWORD celtBuffer, + /+[in, out, ptr, size_is(celtBuffer), length_is(*pceltEngines)]+/ GUID* rgguidEngines, + /+[in, out]+/ DWORD* pceltEngines); + + // Tell the program/program node which engine to use for debugging this program + HRESULT SetEngine( + in GUID* guidEngine); +}; + +// ------------------------------------------------------------------ +// IDebugCOMPlusProgramNode2 +const GUID IID_IDebugCOMPlusProgramNode2 = IDebugCOMPlusProgramNode2.iid; + +interface IDebugCOMPlusProgramNode2 : IUnknown +{ + static const GUID iid = { 0xd6f7d3d0,0x506a,0x448f,[ 0x87,0x02,0x46,0xeb,0x27,0x45,0xe4,0xfc ] }; + HRESULT GetAppDomainId( + /+[out]+/ ULONG32* pul32Id); +}; + +// ------------------------------------------------------------------ +// IDebugSQLCLRProgramNode2 +const GUID IID_IDebugSQLCLRProgramNode2 = IDebugSQLCLRProgramNode2.iid; + +interface IDebugSQLCLRProgramNode2 : IUnknown +{ + static const GUID iid = { 0xF617DFCB,0x0045,0x4024,[ 0x83,0x7B,0x7A,0xCA,0xD8,0xF4,0xD6,0x7B ] }; + HRESULT GetConnectionId( + /+[out]+/ DWORD* pdwId); +}; + +// ------------------------------------------------------------------ +// IDebugThread2 +const GUID IID_IDebugThread2 = IDebugThread2.iid; + +interface IDebugThread2 : IUnknown +{ + static const GUID iid = { 0xd5168050,0xa57a,0x465c,[ 0xbe,0xa9,0x97,0x4f,0x40,0x5e,0xba,0x13 ] }; + + HRESULT EnumFrameInfo( + in FRAMEINFO_FLAGS dwFieldSpec, + in UINT nRadix, + /+[out]+/ IEnumDebugFrameInfo2 * ppEnum); + + HRESULT GetName( + /+[out]+/ BSTR* pbstrName); + + HRESULT SetThreadName( + in LPCOLESTR pszName); + + HRESULT GetProgram( + /+[out]+/ IDebugProgram2 * ppProgram); + + HRESULT CanSetNextStatement( + /+[in]+/ IDebugStackFrame2 pStackFrame, + /+[in]+/ IDebugCodeContext2 pCodeContext); + + HRESULT SetNextStatement ( + /+[in]+/ IDebugStackFrame2 pStackFrame, + /+[in]+/ IDebugCodeContext2 pCodeContext); + + HRESULT GetThreadId( + /+[out]+/ DWORD* pdwThreadId); + + HRESULT Suspend( + /+[out]+/ DWORD *pdwSuspendCount); + + HRESULT Resume( + /+[out]+/ DWORD *pdwSuspendCount); + + HRESULT GetThreadProperties( + in THREADPROPERTY_FIELDS dwFields, + /+[out]+/ THREADPROPERTIES *ptp); + + HRESULT GetLogicalThread( + /+[in]+/ IDebugStackFrame2 pStackFrame, + /+[out]+/ IDebugLogicalThread2 *ppLogicalThread); +} +enum /+ enum_THREADSTATE+/ : DWORD +{ + // The thread is running + THREADSTATE_RUNNING = 0x0001, + // The thread is stopped because of a breakpoint + THREADSTATE_STOPPED = 0x0002, + // The thread has been created, but is not yet running code + THREADSTATE_FRESH = 0x0003, + // The thread is dead + THREADSTATE_DEAD = 0x0004, + // The thread is frozen (no execution can be performed) + THREADSTATE_FROZEN = 0x0005, +} +alias DWORD enum_THREADSTATE; +alias DWORD THREADSTATE; +enum /+ enum_THREADPROPERTY_FIELDS+/ : DWORD +{ + TPF_ID = 0x0001, + TPF_SUSPENDCOUNT = 0x0002, + TPF_STATE = 0x0004, + TPF_PRIORITY = 0x0008, + TPF_NAME = 0x0010, + TPF_LOCATION = 0x0020, + + TPF_ALLFIELDS = 0xffffffff, +} +alias DWORD enum_THREADPROPERTY_FIELDS; +alias DWORD THREADPROPERTY_FIELDS; +struct _tagTHREADPROPERTIES +{ + THREADPROPERTY_FIELDS dwFields; + DWORD dwThreadId; + DWORD dwSuspendCount; + DWORD dwThreadState; + BSTR bstrPriority; + BSTR bstrName; + BSTR bstrLocation; +} +alias _tagTHREADPROPERTIES THREADPROPERTIES; +enum /+ enum_FRAMEINFO_FLAGS+/ : DWORD +{ + // FRAMEINFO fields + FIF_FUNCNAME = 0x00000001, + FIF_RETURNTYPE = 0x00000002, + FIF_ARGS = 0x00000004, + FIF_LANGUAGE = 0x00000008, + FIF_MODULE = 0x00000010, // The name of the module (m_bstrModule) + FIF_STACKRANGE = 0x00000020, + FIF_FRAME = 0x00000040, + FIF_DEBUGINFO = 0x00000080, + FIF_STALECODE = 0x00000100, + FIF_FLAGS = 0x00000200, + FIF_DEBUG_MODULEP = 0x00000400, // the IDebugModule2* for this frame. (m_pModule) + + // Function name formatting + + // Fill in the m_bstrFuncName field as a single string using all the flags specified below + // Specifying FIF_FUNCNAME | FIF_FUNCNAME_FORMAT | FIF_FUNCNAME_RETURNTYPE | FIF_FUNCNAME_ARGS | FIF_FUNCNAME_ARGS_TYPE | FIF_FUNCNAME_ARGS_NAMES | FIF_FUNCNAME_ARGS_VALUES + // Results in: int CFoo::foo(int x = 1, int y = 2) + + FIF_FUNCNAME_FORMAT = 0x00001000, + // Add the return type to the formatted function name + FIF_FUNCNAME_RETURNTYPE = 0x00002000, + // Add the args to the formatted function name + FIF_FUNCNAME_ARGS = 0x00004000, + // Add the language to the formatted function name + FIF_FUNCNAME_LANGUAGE = 0x00008000, + // Add the module name to the formatted function name + FIF_FUNCNAME_MODULE = 0x00010000, + // Add the number of lines to the end of the function name + FIF_FUNCNAME_LINES = 0x00020000, + // Add the bytes offset to the end of the function name + FIF_FUNCNAME_OFFSET = 0x00040000, + + // Function name argument formatting + + // Format the args in the formatted function name (example: (x = 3, y = 4)) + FIF_FUNCNAME_ARGS_TYPES = 0x00100000, + FIF_FUNCNAME_ARGS_NAMES = 0x00200000, + FIF_FUNCNAME_ARGS_VALUES = 0x00400000, + + FIF_FUNCNAME_ARGS_ALL = 0x00700000, + + // Argument formatting (in m_bstrArgs) + FIF_ARGS_TYPES = 0x01000000, + FIF_ARGS_NAMES = 0x02000000, + FIF_ARGS_VALUES = 0x04000000, + + FIF_ARGS_ALL = 0x07000000, + + // If a client wants to be able to manipulate each arg separately, + // set the FIF_ARGS_NOFORMAT and each FIF_ARGS_* flag will cause a + // null-termianted string to be added to m_bstrArgs. + // m_bstrArgs will then contain a series of null-terminated strings-- + // one string per flag per arg. For example, if the name and value + // flag are set and there are two args x and y, the string would be + // "x3y4". + FIF_ARGS_NOFORMAT = 0x08000000, + + // For argument values, set FIF_ARGS_NO_FUNC_EVAL to turn off + // function (property) evaluation when retrieving argument values. + // This applies to whether arguments are being formatted in + // the function name string or in m_bstrArgs. See also + // FIF_ARGS_NO_TOSTRING. + FIF_ARGS_NO_FUNC_EVAL = 0x10000000, + + // Have the engine to filter user code frames. (Perf) + FIF_FILTER_NON_USER_CODE = 0x20000000, + + // Do not allow ToString() func-evals when returning function arguments. + FIF_ARGS_NO_TOSTRING = 0x40000000, + + // frame info should be gotten from the hosted app-domain + // rather than the hosting process. + FIF_DESIGN_TIME_EXPR_EVAL = 0x80000000, + + // Include all frames + FIF_FILTER_INCLUDE_ALL = 0x00080000 +} +alias DWORD enum_FRAMEINFO_FLAGS; +alias DWORD FRAMEINFO_FLAGS; +enum /+ enum_FRAMEINFO_FLAGS_VALUES+/ : DWORD +{ + FIFV_ANNOTATEDFRAME = 0x00000001, + FIFV_NON_USER_CODE = 0x00000002, + FIFV_CANINTERCEPT_EXCEPTION = 0x00000004, + FIFV_FUNCEVALFRAME = 0x00000008, +} +alias DWORD enum_FRAMEINFO_FLAGS_VALUES; +alias DWORD FRAMEINFO_FLAGS_VALUES; +struct tagFRAMEINFO +{ + FRAMEINFO_FLAGS m_dwValidFields; // which FRAMEINFO fields were successfully initialized + BSTR m_bstrFuncName; // function name + BSTR m_bstrReturnType; // function return type + BSTR m_bstrArgs; // function arguments ( + BSTR m_bstrLanguage; // language name + BSTR m_bstrModule; // module name (i.e. "msvcrt.dll" or "Test.class") + UINT64 m_addrMin; // minimum physical stack address + UINT64 m_addrMax; // maximum physical stack address + IDebugStackFrame2 m_pFrame; // IDebugStackFrame2 object corresponding to this stack frame + IDebugModule2 m_pModule; // Module this frame is in. + BOOL m_fHasDebugInfo; // TRUE if there is debug information in that frame. + BOOL m_fStaleCode; // TRUE if frame corresponds to stale code + DWORD m_dwFlags; +} +alias tagFRAMEINFO FRAMEINFO;; + +// ------------------------------------------------------------------ +// IDebugLogicalThread2 +// {95E4AC61-D37E-4fce-B6C6-C05A80AB946A} +// DEFINE_GUID(<>, +// 0x95e4ac61, 0xd37e, 0x4fce, 0xb6, 0xc6, 0xc0, 0x5a, 0x80, 0xab, 0x94, 0x6a); +const GUID IID_IDebugLogicalThread2 = IDebugLogicalThread2.iid; + +interface IDebugLogicalThread2 : IUnknown +{ + static const GUID iid = { 0x88d2f75b,0xd329,0x4e03,[ 0x9b,0x75,0x20,0x1f,0x77,0x82,0xd8,0xbd ] }; + HRESULT EnumFrameInfo + ( + in FRAMEINFO_FLAGS dwFieldSpec, + in UINT nRadix, + /+[out]+/ IEnumDebugFrameInfo2 * ppEnum + ); +}; + +// ------------------------------------------------------------------ +// IDebugThread3 +// {43D24196-0000-467f-8C6B-9C006922D02F} +const GUID IID_IDebugThread3 = IDebugThread3.iid; + +interface IDebugThread3 : IDebugThread2 +{ + static const GUID iid = { 0x43D24196,0x0000,0x467f,[ 0x8C,0x6B,0x9C,0x00,0x69,0x22,0xD0,0x2F ] }; + // Returns S_OK if there is a current exception, S_FALSE if there isn't. + HRESULT IsCurrentException(); + + // Determines If the leaf frame will remap immeadiately after an apply. + // It cannot determine if the IP is in a finally clause. The user + // must also query IDebugENC2::IsLeafRemapPossible to handle that. + HRESULT CanRemapLeafFrame(); + + // Force the leaf frame to remap. Will only succeed if CanRemapLeafFrame + // would return S_OK. + HRESULT RemapLeafFrame(); +}; + +// ----------------------------------------------------------------------- +// IDebugProperty2 and IDebugReference2 attributes + +enum DBG_ATTRIB_NONE = 0x0000000000000000; +enum DBG_ATTRIB_ALL = 0xffffffffffffffff; + +// Attributes about the object itself + +// The reference/property is expandable +enum DBG_ATTRIB_OBJ_IS_EXPANDABLE = 0x0000000000000001; + +// This property indicates that an id for this object has been created. +enum DBG_ATTRIB_OBJ_HAS_ID = 0x0000000000000002; +// This property indicates that an id for this object can be created. +enum DBG_ATTRIB_OBJ_CAN_HAVE_ID = 0x0000000000000004; + +// Attributes about the value of the object + +// The value of this reference/property is read only +enum DBG_ATTRIB_VALUE_READONLY = 0x0000000000000010; +// The value is an error +enum DBG_ATTRIB_VALUE_ERROR = 0x0000000000000020; +// The evaluation caused a side effect +enum DBG_ATTRIB_VALUE_SIDE_EFFECT = 0x0000000000000040; +// This property is really a container of overloads +enum DBG_ATTRIB_OVERLOADED_CONTAINER = 0x0000000000000080; +// This property is a boolean value +enum DBG_ATTRIB_VALUE_BOOLEAN = 0x0000000000000100; +// If DBG_ATTRIB_VALUE_BOOLEAN is set, +// then this flag indicates whether the boolean value is true or false +enum DBG_ATTRIB_VALUE_BOOLEAN_TRUE = 0x0000000000000200; +// The value for this property is invalid (i.e. has no value) +enum DBG_ATTRIB_VALUE_INVALID = 0x0000000000000400; +// The value for this property is NAT (not a thing) +enum DBG_ATTRIB_VALUE_NAT = 0x0000000000000800; +// The value for this property has possibly been autoexpanded +enum DBG_ATTRIB_VALUE_AUTOEXPANDED = 0x0000000000001000; +// This property indicates an evaluation timed-out +enum DBG_ATTRIB_VALUE_TIMEOUT = 0x0000000000002000; +// This property indicates that this property can be represented by a raw string +enum DBG_ATTRIB_VALUE_RAW_STRING = 0x0000000000004000; +// This property indicates that this property has a custom viewer +enum DBG_ATTRIB_VALUE_CUSTOM_VIEWER = 0x0000000000008000; + +// Attributes that describe field access control +enum DBG_ATTRIB_ACCESS_NONE = 0x0000000000010000; +enum DBG_ATTRIB_ACCESS_PUBLIC = 0x0000000000020000; +enum DBG_ATTRIB_ACCESS_PRIVATE = 0x0000000000040000; +enum DBG_ATTRIB_ACCESS_PROTECTED = 0x0000000000080000; +enum DBG_ATTRIB_ACCESS_FINAL = 0x0000000000100000; + +enum DBG_ATTRIB_ACCESS_ALL = 0x00000000001f0000; + +// Attributes that describe storage types +enum DBG_ATTRIB_STORAGE_NONE = 0x0000000001000000; +enum DBG_ATTRIB_STORAGE_GLOBAL = 0x0000000002000000; +enum DBG_ATTRIB_STORAGE_STATIC = 0x0000000004000000; +enum DBG_ATTRIB_STORAGE_REGISTER = 0x0000000008000000; + +enum DBG_ATTRIB_STORAGE_ALL = 0x000000000f000000; + +// Attributes that describe type modifiers +enum DBG_ATTRIB_TYPE_NONE = 0x0000000100000000; +enum DBG_ATTRIB_TYPE_VIRTUAL = 0x0000000200000000; +enum DBG_ATTRIB_TYPE_CONSTANT = 0x0000000400000000; +enum DBG_ATTRIB_TYPE_SYNCHRONIZED = 0x0000000800000000; +enum DBG_ATTRIB_TYPE_VOLATILE = 0x0000001000000000; + +enum DBG_ATTRIB_TYPE_ALL = 0x0000001f00000000; + +// Attributes that describe the IDebugProperty2 type +enum DBG_ATTRIB_DATA = 0x0000010000000000; +enum DBG_ATTRIB_METHOD = 0x0000020000000000; +enum DBG_ATTRIB_PROPERTY = 0x0000040000000000; +enum DBG_ATTRIB_CLASS = 0x0000080000000000; +enum DBG_ATTRIB_BASECLASS = 0x0000100000000000; +enum DBG_ATTRIB_INTERFACE = 0x0000200000000000; +enum DBG_ATTRIB_INNERCLASS = 0x0000400000000000; +enum DBG_ATTRIB_MOSTDERIVEDCLASS = 0x0000800000000000; + +enum DBG_ATTRIB_CHILD_ALL = 0x0000ff0000000000; + +enum DBG_ATTRIB_MULTI_CUSTOM_VIEWERS = 0x0001000000000000; +enum DBG_ATTRIB_EVENT = 0x0002000000000000; + +alias UINT64 DBG_ATTRIB_FLAGS; + +// ----------------------------------------------------------------------- +// IDebugProperty2 + +enum /+ enum_DEBUGPROP_INFO_FLAGS+/ : DWORD +{ + DEBUGPROP_INFO_FULLNAME = 0x00000001, + DEBUGPROP_INFO_NAME = 0x00000002, + DEBUGPROP_INFO_TYPE = 0x00000004, + DEBUGPROP_INFO_VALUE = 0x00000008, + DEBUGPROP_INFO_ATTRIB = 0x00000010, + DEBUGPROP_INFO_PROP = 0x00000020, + + DEBUGPROP_INFO_VALUE_AUTOEXPAND = 0x00010000, + DEBUGPROP_INFO_NOFUNCEVAL = 0x00020000, // Tell EE not to perform ANY type of func-eval. + DEBUGPROP_INFO_VALUE_RAW = 0x00040000, // Tell EE not to return any beautified values or members. + DEBUGPROP_INFO_VALUE_NO_TOSTRING = 0x00080000, // Tell EE not to return any special synthesized values (ToString() for instance). + DEBUGPROP_INFO_NO_NONPUBLIC_MEMBERS = 0x00100000, // Tell EE to return non-public members for non-user objects. + + DEBUGPROP_INFO_NONE = 0x00000000, + DEBUGPROP_INFO_STANDARD = DEBUGPROP_INFO_ATTRIB | DEBUGPROP_INFO_NAME | DEBUGPROP_INFO_TYPE | DEBUGPROP_INFO_VALUE, + DEBUGPROP_INFO_ALL = 0xffffffff +} +alias DWORD enum_DEBUGPROP_INFO_FLAGS; +alias DWORD DEBUGPROP_INFO_FLAGS; + +struct tagDEBUG_PROPERTY_INFO +{ + DEBUGPROP_INFO_FLAGS dwFields; + BSTR bstrFullName; + BSTR bstrName; + BSTR bstrType; + BSTR bstrValue; + IDebugProperty2 pProperty; + DBG_ATTRIB_FLAGS dwAttrib; +} +alias tagDEBUG_PROPERTY_INFO DEBUG_PROPERTY_INFO; + +struct tagDEBUG_CUSTOM_VIEWER +{ + DWORD dwID; // An ID to differentiate multiple viewers implemented by one guid. + BSTR bstrMenuName; // The text that will appear in the drop-down menu. + BSTR bstrDescription; // A description of the Custom Viewer (NULL if not used) + GUID guidLang; // Language of the providing EE + GUID guidVendor; // Vendor of the providing EE + BSTR bstrMetric; +} +alias tagDEBUG_CUSTOM_VIEWER DEBUG_CUSTOM_VIEWER; + +const GUID IID_IDebugProperty2 = IDebugProperty2.iid; + +interface IDebugProperty2 : IUnknown +{ + static const GUID iid = { 0xa7ee3e7e,0x2dd2,0x4ad7,[ 0x96,0x97,0xf4,0xaa,0xe3,0x42,0x77,0x62 ] }; + // Get the DEBUG_PROPERTY_INFO that describes this property + HRESULT GetPropertyInfo( + in DEBUGPROP_INFO_FLAGS dwFields, + in DWORD dwRadix, + in DWORD dwTimeout, + /+[ ptr , size_is(dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs, + in DWORD dwArgCount, + /+[out]+/ DEBUG_PROPERTY_INFO* pPropertyInfo); + + // Set the value of this property + HRESULT SetValueAsString( + in LPCOLESTR pszValue, + in DWORD dwRadix, + in DWORD dwTimeout); + + // Set the value of this property + HRESULT SetValueAsReference( + /+[ ptr , size_is(dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs, + in DWORD dwArgCount, + /+[in]+/ IDebugReference2 pValue, + in DWORD dwTimeout); + + // Enum the children of this property + HRESULT EnumChildren( + in DEBUGPROP_INFO_FLAGS dwFields, + in DWORD dwRadix, + in GUID* guidFilter, + in DBG_ATTRIB_FLAGS dwAttribFilter, + /+[ ptr]+/ in LPCOLESTR pszNameFilter, + in DWORD dwTimeout, + /+[out]+/ IEnumDebugPropertyInfo2 * ppEnum); + + // Get the parent of this property + HRESULT GetParent( + /+[out]+/ IDebugProperty2 * ppParent); + + // Get the property that describes the derived most property of this property + HRESULT GetDerivedMostProperty( + /+[out]+/ IDebugProperty2 * ppDerivedMost); + + // Get the memory bytes that contains this property + HRESULT GetMemoryBytes( + /+[out]+/ IDebugMemoryBytes2 * ppMemoryBytes); + + // Get a memory context for this property within the memory bytes returned by GetMemoryBytes + HRESULT GetMemoryContext( + /+[out]+/ IDebugMemoryContext2 * ppMemory); + + // Get the size (in bytes) of this property + HRESULT GetSize( + /+[out]+/ DWORD* pdwSize); + + // Get a reference for this property + HRESULT GetReference( + /+[out]+/ IDebugReference2 * ppReference); + + // Get extended info for this property + HRESULT GetExtendedInfo( + in GUID* guidExtendedInfo, + /+[out]+/ VARIANT* pExtendedInfo); +}; + +// Note: This interface is new in 8.0. It is a way for the shell to tell the SDM +// that an IDebugProperty is no longer used. This isn't important for an appartment +// model shell, but is important for a free threaded shell +// #pragma warning(push) +// #pragma warning(disable:28718) +const GUID IID_IDebugSessionProperty2 = IDebugSessionProperty2.iid; + +interface IDebugSessionProperty2 : IDebugProperty3 +{ + static const GUID iid = { 0x72ff2712,0x0bc3,0x4308,[ 0xa9,0x9d,0x26,0xac,0x7e,0xc6,0x8c,0x5f ] }; + HRESULT Close(); + HRESULT GetThread( + /+[out]+/ IDebugThread3 * ppThread); +}; +// #pragma warning(pop) + +// Note: this interface is new in 8.0. Debug engines should implement this interface +// if they need WatchForExpressionEval called in order to destroy an IDebugProperty +const GUID IID_IDebugPropertyClose2 = IDebugPropertyClose2.iid; + +interface IDebugPropertyClose2 : IDebugProperty2 +{ + static const GUID iid = { 0x852c7d42,0x794f,0x43cd,[ 0xa1,0x8f,0xcd,0x40,0xe8,0x3e,0x67,0xcd ] }; + HRESULT Close(); +}; + +// #pragma warning(push) +// #pragma warning(disable:28718) +const GUID IID_IDebugProperty3 = IDebugProperty3.iid; + +interface IDebugProperty3 : IDebugProperty2 +{ + static const GUID iid = { 0x94E1E004,0x0672,0x423d,[ 0xAD,0x62,0x78,0x78,0x3D,0xEF,0x1E,0x76 ] }; + // How long is the underlying string (in chars)? (excludes terminating byte) + HRESULT GetStringCharLength( /+[out]+/ ULONG *pLen ); + + // Get the actual string contents (excludes terminating byte) + HRESULT GetStringChars( + in ULONG buflen, + /+[out, size_is(buflen), length_is(*pceltFetched)]+/ WCHAR *rgString, + /+[out]+/ ULONG *pceltFetched + ); + + // created the id for this object + HRESULT CreateObjectID(); + + // destroy the id for this object + HRESULT DestroyObjectID(); + + // Support for custom visualizers + HRESULT GetCustomViewerCount(/+[out]+/ ULONG* pcelt); + HRESULT GetCustomViewerList(in ULONG celtSkip, in ULONG celtRequested, + /+[out, size_is(celtRequested),length_is(*pceltFetched)]+/ DEBUG_CUSTOM_VIEWER* rgViewers, + /+[out]+/ ULONG* pceltFetched); + + // Set the value of this property + HRESULT SetValueAsStringWithError( + in LPCOLESTR pszValue, + in DWORD dwRadix, + in DWORD dwTimeout, + /+[out]+/ BSTR * errorString); +}; +// #pragma warning(pop) + +// Note: This interface is new in 8.0. It is a way for the shell to be able to +// show a grid of data from an expression. +const GUID IID_IDebugDataGrid = IDebugDataGrid.iid; + +interface IDebugDataGrid : IUnknown +{ + static const GUID iid = { 0x411F3E08,0xE6B1,0x4789,[ 0xAB,0x29,0x75,0x5C,0x52,0xE5,0x2A,0xC4 ] }; + HRESULT GetGridInfo( + /+[out]+/ ULONG *pX, + /+[out]+/ ULONG *pY, + /+[out]+/ BSTR *bpstrTitle + ); + + HRESULT GetGridPropertyInfo( + ULONG x, + ULONG y, + ULONG celtX, + ULONG celtY, + ULONG celtXtimesY, + DEBUGPROP_INFO_FLAGS dwFields, + DWORD dwRadix, + /+[out, size_is(celtXtimesY), length_is(*pceltFetched)]+/ DEBUG_PROPERTY_INFO* rgelt, + /+[out]+/ ULONG* pceltFetched + ); +}; + +// Note: This interface is new in 8.0. Only the SDM needs to implement it +// It is for the shell to ensure extended property evaluation works correctly +// when multiple engines are involved, and to extract a raw interface from a wrapped one +const GUID IID_IDebugPropertySafetyWrapper = IDebugPropertySafetyWrapper.iid; + +interface IDebugPropertySafetyWrapper : IUnknown +{ + static const GUID iid = { 0x7031886B,0x61D2,0x4cb5,[ 0xB9,0x09,0x00,0x38,0x60,0x90,0x73,0x3B ] }; + HRESULT BeforePropertyCall(); + HRESULT AfterPropertyCall(); + HRESULT GetRawProperty( /+[out]+/ IDebugProperty3 * ppProperty); +} + +// ----------------------------------------------------------------------- +// IDebugReference2 + +enum /+ enum_REFERENCE_TYPE+/ : DWORD +{ + // Weak reference + REF_TYPE_WEAK = 0x0001, + // Strong reference + REF_TYPE_STRONG = 0x0002, +} +alias DWORD enum_REFERENCE_TYPE; +alias DWORD REFERENCE_TYPE; + +enum /+ enum_DEBUGREF_INFO_FLAGS+/ : DWORD +{ + DEBUGREF_INFO_NAME = 0x00000001, + DEBUGREF_INFO_TYPE = 0x00000002, + DEBUGREF_INFO_VALUE = 0x00000004, + DEBUGREF_INFO_ATTRIB = 0x00000008, + DEBUGREF_INFO_REFTYPE = 0x00000010, + DEBUGREF_INFO_REF = 0x00000020, + + DEBUGREF_INFO_VALUE_AUTOEXPAND = 0x00010000, + + DEBUGREF_INFO_NONE = 0x00000000, + DEBUGREF_INFO_ALL = 0xffffffff +} +alias DWORD enum_DEBUGREF_INFO_FLAGS; +alias DWORD DEBUGREF_INFO_FLAGS; + +struct tagDEBUG_REFERENCE_INFO +{ + DEBUGREF_INFO_FLAGS dwFields; + BSTR bstrName; + BSTR bstrType; + BSTR bstrValue; + DBG_ATTRIB_FLAGS dwAttrib; + REFERENCE_TYPE dwRefType; + IDebugReference2 pReference; +} +alias tagDEBUG_REFERENCE_INFO DEBUG_REFERENCE_INFO; + +const GUID IID_IDebugReference2 = IDebugReference2.iid; + +interface IDebugReference2 : IUnknown +{ + static const GUID iid = { 0x10b793ac,0x0c47,0x4679,[ 0x84,0x54,0xad,0xb3,0x6f,0x29,0xf8,0x02 ] }; + + // Get the DEBUG_REFERENCE_INFO that describes this reference + HRESULT GetReferenceInfo( + in DEBUGREF_INFO_FLAGS dwFields, + in DWORD dwRadix, + in DWORD dwTimeout, + /+[ size_is (dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs, + in DWORD dwArgCount, + /+[out]+/ DEBUG_REFERENCE_INFO* pReferenceInfo); + + // Set the value of this reference + HRESULT SetValueAsString( + in LPCOLESTR pszValue, + in DWORD dwRadix, + in DWORD dwTimeout); + + // Set the value of this reference + HRESULT SetValueAsReference( + /+[ size_is (dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs, + in DWORD dwArgCount, + /+[in]+/ IDebugReference2 pValue, + in DWORD dwTimeout); + + // Enum the children of this reference + HRESULT EnumChildren( + in DEBUGREF_INFO_FLAGS dwFields, + in DWORD dwRadix, + in DBG_ATTRIB_FLAGS dwAttribFilter, + /+[ ptr]+/ in LPCOLESTR pszNameFilter, + in DWORD dwTimeout, + /+[out]+/ IEnumDebugReferenceInfo2 * ppEnum); + + // Get the parent of this reference + HRESULT GetParent( + /+[out]+/ IDebugReference2 * ppParent); + + // Get the reference that describes the derived most reference of this reference + HRESULT GetDerivedMostReference( + /+[out]+/ IDebugReference2 * ppDerivedMost); + + // Get the memory bytes that contains this reference + HRESULT GetMemoryBytes( + /+[out]+/ IDebugMemoryBytes2 * ppMemoryBytes); + + // Get a memory context for this reference within the memory bytes returned by GetMemoryBytes + HRESULT GetMemoryContext( + /+[out]+/ IDebugMemoryContext2 * ppMemory); + + // Get the size (in bytes) of this reference + HRESULT GetSize( + /+[out]+/ DWORD* pdwSize); + + // Set the reference type (weak or strong) + HRESULT SetReferenceType( + in REFERENCE_TYPE dwRefType); + + // Compare this reference with the one given in the matter given + // result = this cwCompare pReference + HRESULT Compare( + in REFERENCE_COMPARE dwCompare, + /+[in]+/ IDebugReference2 pReference); +} +enum /+ enum_REFERENCE_COMPARE+/ : DWORD +{ + REF_COMPARE_EQUAL = 0x0001, + REF_COMPARE_LESS_THAN = 0x0002, + REF_COMPARE_GREATER_THAN = 0x0003, +} +alias DWORD enum_REFERENCE_COMPARE; +alias DWORD REFERENCE_COMPARE;; + +// ------------------------------------------------------------------ +// IDebugStackFrame2 +const GUID IID_IDebugStackFrame2 = IDebugStackFrame2.iid; + +interface IDebugStackFrame2 : IUnknown +{ + static const GUID iid = { 0x1412926f,0x5dd6,0x4e58,[ 0xb6,0x48,0xe1,0xc6,0x3e,0x01,0x3d,0x51 ] }; + HRESULT GetCodeContext( + /+[out]+/ IDebugCodeContext2 * ppCodeCxt); + + HRESULT GetDocumentContext( + /+[out]+/ IDebugDocumentContext2 * ppCxt); + + HRESULT GetName( + /+[out]+/ BSTR* pbstrName); + + HRESULT GetInfo( + in FRAMEINFO_FLAGS dwFieldSpec, + in UINT nRadix, + /+[out]+/ FRAMEINFO* pFrameInfo); + + // Returns a machine dependent representation of the range of physical addresses + // associated with this stack frame. This is used by the process debug manager to sort + // the stack frames from multiple script engines. By convention, stacks grow down and, + // as such, on architectures where stacks grow up the addresses should be + // twos-complemented. + // NOTE: This implementation will not work for cross-process or cross-machine stacks + HRESULT GetPhysicalStackRange( + /+[out]+/ UINT64* paddrMin, + /+[out]+/ UINT64* paddrMax); + + HRESULT GetExpressionContext( + /+[out]+/ IDebugExpressionContext2 * ppExprCxt); + + HRESULT GetLanguageInfo( + /+[in, out, ptr]+/ BSTR* pbstrLanguage, + /+[in, out, ptr]+/ GUID* pguidLanguage); + + HRESULT GetDebugProperty( + /+[out]+/ IDebugProperty2 * ppProperty); + + // PERF API - Get the count of locals as well as the enumerator + // This API may not be supported by all LEs, so if it fails, use the generic + // approach through GetDebugProperty. However, if this API is supported it + // may save a few cross-process calls + HRESULT EnumProperties( + in DEBUGPROP_INFO_FLAGS dwFields, + in UINT nRadix, + in GUID* guidFilter, + in DWORD dwTimeout, + /+[out]+/ ULONG* pcelt, + /+[out]+/ IEnumDebugPropertyInfo2 * ppEnum); + + HRESULT GetThread( + /+[out]+/ IDebugThread2 * ppThread); +}; + +// ------------------------------------------------------------------ +// IDebugStackFrame3 +// An extension of IDebugStackFrame2 for new debugger features +// supported in VS version 8. +const GUID IID_IDebugStackFrame3 = IDebugStackFrame3.iid; + +interface IDebugStackFrame3 : IDebugStackFrame2 +{ + static const GUID iid = { 0x60DE844B,0x38B1,0x4d87,[ 0xAF,0xE1,0x8C,0xF4,0x96,0x77,0xD3,0xB0 ] }; + + // Install a temporary exception handler at this + // frame that will "handle" the current + // exception on the next call to Execute, Continue, + // or Step. Specific behavior varies by the debug engine/ + // platform/runtime environment. Once the exception + // is "handled" by the temporary handler, an + // IDebugInterceptExceptionCompleteEvent2 will be sent. + // This function is not supported by all debug engines. + HRESULT InterceptCurrentException( + in INTERCEPT_EXCEPTION_ACTION dwFlags, + /+[out]+/ UINT64* pqwCookie); + + // Returns the code context representing the location + // if a stack unwind is done. Note that this doesn't imply + // that a stack unwind can be done to this frame. + // This method isn't supported by all engines currently. + HRESULT GetUnwindCodeContext( + /+[out]+/ IDebugCodeContext2 *ppCodeContext); +} +enum /+ enum_INTERCEPT_EXCEPTION_ACTION+/ : DWORD +{ + IEA_INTERCEPT = 0x0001, + // Cancelling an intercept is not supported in VS8 + IEA_CANCEL_INTERCEPT = 0x0000, +} +alias DWORD enum_INTERCEPT_EXCEPTION_ACTION; +alias DWORD INTERCEPT_EXCEPTION_ACTION;; + +// ------------------------------------------------------------------ +// IDebugMemoryContext2 + +const GUID IID_IDebugMemoryContext2 = IDebugMemoryContext2.iid; + +interface IDebugMemoryContext2 : IUnknown +{ + static const GUID iid = { 0x1ab276dd,0xf27b,0x4445,[ 0x82,0x5d,0x5d,0xf0,0xb4,0xa0,0x4a,0x3a ] }; + + HRESULT GetName( + /+[out]+/ BSTR* pbstrName); + + HRESULT GetInfo( + in CONTEXT_INFO_FIELDS dwFields, + /+[out]+/ CONTEXT_INFO* pInfo); + + HRESULT Add( + in UINT64 dwCount, + /+[out]+/ IDebugMemoryContext2 * ppMemCxt); + + HRESULT Subtract( + in UINT64 dwCount, + /+[out]+/ IDebugMemoryContext2 * ppMemCxt); + + HRESULT Compare( + in CONTEXT_COMPARE compare, + /+[ size_is (dwMemoryContextSetLen), length_is(dwMemoryContextSetLen)]+/ /+[in]+/ IDebugMemoryContext2 * rgpMemoryContextSet, + in DWORD dwMemoryContextSetLen, + /+[out]+/ DWORD* pdwMemoryContext); +} +enum /+ enum_CONTEXT_COMPARE+/ : DWORD +{ + CONTEXT_EQUAL = 0x0001, + CONTEXT_LESS_THAN = 0x0002, + CONTEXT_GREATER_THAN = 0x0003, + CONTEXT_LESS_THAN_OR_EQUAL = 0x0004, + CONTEXT_GREATER_THAN_OR_EQUAL = 0x0005, + CONTEXT_SAME_SCOPE = 0x0006, + CONTEXT_SAME_FUNCTION = 0x0007, + CONTEXT_SAME_MODULE = 0x0008, + CONTEXT_SAME_PROCESS = 0x0009, +} +alias DWORD enum_CONTEXT_COMPARE; +alias DWORD CONTEXT_COMPARE; +enum /+ enum_CONTEXT_INFO_FIELDS+/ : DWORD +{ + CIF_MODULEURL = 0x00000001, + CIF_FUNCTION = 0x00000002, + CIF_FUNCTIONOFFSET = 0x00000004, + CIF_ADDRESS = 0x00000008, + CIF_ADDRESSOFFSET = 0x00000010, + CIF_ADDRESSABSOLUTE = 0x00000020, + + CIF_ALLFIELDS = 0x0000003f, +} +alias DWORD enum_CONTEXT_INFO_FIELDS; +alias DWORD CONTEXT_INFO_FIELDS; +struct _tagCONTEXT_INFO +{ + CONTEXT_INFO_FIELDS dwFields; + BSTR bstrModuleUrl; + BSTR bstrFunction; + TEXT_POSITION posFunctionOffset; + BSTR bstrAddress; + BSTR bstrAddressOffset; + BSTR bstrAddressAbsolute; +} +alias _tagCONTEXT_INFO CONTEXT_INFO;; + +// ------------------------------------------------------------------ +// IDebugCodeContext2 +const GUID IID_IDebugCodeContext2 = IDebugCodeContext2.iid; + +interface IDebugCodeContext2 : IDebugMemoryContext2 +{ + static const GUID iid = { 0xac17b76b,0x2b09,0x419a,[ 0xad,0x5f,0x7d,0x74,0x02,0xda,0x88,0x75 ] }; + HRESULT GetDocumentContext( + /+[out]+/ IDebugDocumentContext2 *ppSrcCxt); + + HRESULT GetLanguageInfo( + /+[in, out, ptr]+/ BSTR* pbstrLanguage, + /+[in, out, ptr]+/ GUID* pguidLanguage); +}; + +// ------------------------------------------------------------------ +// IDebugCodeContext3 +// +// QI from IDebugCodeContext2 +const GUID IID_IDebugCodeContext3 = IDebugCodeContext3.iid; + +interface IDebugCodeContext3 : IDebugCodeContext2 +{ + static const GUID iid = { 0x17c106b9,0x0925,0x42f5,[ 0xae,0x32,0x1f,0xc0,0x19,0x64,0x9c,0x10 ] }; + HRESULT GetModule( + /+[out]+/ IDebugModule2 * ppModule); + + HRESULT GetProcess( + /+[out]+/ IDebugProcess2 * ppProcess); +}; + +// ------------------------------------------------------------------ +// IDebugMemoryBytes2 + +const GUID IID_IDebugMemoryBytes2 = IDebugMemoryBytes2.iid; + +interface IDebugMemoryBytes2 : IUnknown +{ + static const GUID iid = { 0x925837d1,0x3aa1,0x451a,[ 0xb7,0xfe,0xcc,0x04,0xbb,0x42,0xcf,0xb8 ] }; + HRESULT ReadAt( + /+[in]+/ IDebugMemoryContext2 pStartContext, + in DWORD dwCount, + /+[out, size_is(dwCount), length_is(*pdwRead)]+/ BYTE* rgbMemory, + /+[out]+/ DWORD* pdwRead, + /+[in, out, ptr]+/ DWORD* pdwUnreadable); + + HRESULT WriteAt( + /+[in]+/ IDebugMemoryContext2 pStartContext, + in DWORD dwCount, + /+[ size_is (dwCount), length_is(dwCount)]+/ in BYTE* rgbMemory); + + HRESULT GetSize( + /+[out]+/ UINT64* pqwSize); +}; + +// ------------------------------------------------------------------ +// IDebugDisassemblyStream2 + +const GUID IID_IDebugDisassemblyStream2 = IDebugDisassemblyStream2.iid; + +interface IDebugDisassemblyStream2 : IUnknown +{ + static const GUID iid = { 0xe5b017fe,0xdfb0,0x411c,[ 0x82,0x66,0x7c,0x64,0xd6,0xf5,0x19,0xf8 ] }; + + HRESULT Read( + // Set dwInstruction to 0 for !DSS_HUGE address spaces to read the entire address space + in DWORD dwInstructions, + in DISASSEMBLY_STREAM_FIELDS dwFields, + /+[out]+/ DWORD* pdwInstructionsRead, + /+[out, size_is(dwInstructions), length_is(*pdwInstructionsRead)]+/ DisassemblyData* prgDisassembly); + + HRESULT Seek( + in SEEK_START dwSeekStart, + /+[in]+/ IDebugCodeContext2 pCodeContext, + in UINT64 uCodeLocationId, + in INT64 iInstructions); + + // If the code context is outside the scope of code contexts which can be + // disassembled by this stream, but is still a valid code context. then + // *puCodeLocationId should be zero, and the return value is E_CODE_CONTEXT_OUT_OF_SCOPE + HRESULT GetCodeLocationId( + /+[in]+/ IDebugCodeContext2 pCodeContext, + /+[out]+/ UINT64* puCodeLocationId); + + HRESULT GetCodeContext( + in UINT64 uCodeLocationId, + /+[out]+/ IDebugCodeContext2 * ppCodeContext); + + HRESULT GetCurrentLocation( + /+[out]+/ UINT64* puCodeLocationId); + + // implemented by engines that have text documents, but where bstrDocumentUrl + // can not be passed as a filename + HRESULT GetDocument( + in BSTR bstrDocumentUrl, + /+[out]+/ IDebugDocument2 * ppDocument); + + HRESULT GetScope( + /+[out]+/ DISASSEMBLY_STREAM_SCOPE* pdwScope); + + HRESULT GetSize( + /+[out]+/ UINT64 *pnSize); +} +enum /+ enum_DISASSEMBLY_STREAM_FIELDS+/ : DWORD +{ + DSF_ADDRESS = 0x00000001, + DSF_ADDRESSOFFSET = 0x00000002, + DSF_CODEBYTES = 0x00000004, + DSF_OPCODE = 0x00000008, + DSF_OPERANDS = 0x00000010, + DSF_SYMBOL = 0x00000020, + DSF_CODELOCATIONID = 0x00000040, + DSF_POSITION = 0x00000080, + DSF_DOCUMENTURL = 0x00000100, + DSF_BYTEOFFSET = 0x00000200, + DSF_FLAGS = 0x00000400, + + // Use DSF_OPERANDS_SYMBOLS to include symbol names in the bstrOperands field + DSF_OPERANDS_SYMBOLS = 0x00010000, + + DSF_ALL = 0x000107ff, +} +alias DWORD enum_DISASSEMBLY_STREAM_FIELDS; +alias DWORD DISASSEMBLY_STREAM_FIELDS; +enum /+ enum_DISASSEMBLY_FLAGS+/ : DWORD +{ + // Indicates this instruction is in a different document than the previous one + DF_DOCUMENTCHANGE = 0x00000001, + // Indicates this instruction will not be exuecuted + DF_DISABLED = 0x00000002, + // Indicates this instruction is one of the next instructions to be executed + // (there may be more than one) + DF_INSTRUCTION_ACTIVE = 0x00000004, + // Indicates this instruction is really data (not code) + DF_DATA = 0x00000008, + // Indicates this instruction has source + DF_HASSOURCE = 0x00000010, + // Indicates that bstrDocumentUrl contains checksum data + DF_DOCUMENT_CHECKSUM = 0x00000020 +} +alias DWORD enum_DISASSEMBLY_FLAGS; +alias DWORD DISASSEMBLY_FLAGS; +struct tagDisassemblyData +{ + // Indicates which fields are valid + DISASSEMBLY_STREAM_FIELDS dwFields; + // The address for this instruction + BSTR bstrAddress; + // The address as an offset from some starting point (usually function) + BSTR bstrAddressOffset; + // The code bytes for this instruction + BSTR bstrCodeBytes; + // The opcode for this instruction + BSTR bstrOpcode; + // The operands for this instruction + BSTR bstrOperands; + // The symbol name, if any, associated with this address (public symbol, label, etc.) + BSTR bstrSymbol; + // Code location identifier (uCodeLocationId) for this line of disasm. + // They have these properties. + // 1. Unique within the disasm stream + // 2. Ordered in the same way as addresses (iff DisasmLine1.CodeContext.Address > + // DisasmLine2.CodeContext.Address then DisasmLine1.uCodeLocationId > + // DisasmLine2.uCodeLocationId) + // 3. As a consequense of #2, IDs should always increase as one go down the DisasmData array + UINT64 uCodeLocationId; + TEXT_POSITION posBeg; + TEXT_POSITION posEnd; + // For text documents that can be repesented as filenames: + // bstrDocumentUrl is filled in with the file://filename where the source can be found. + // For text documents that cannot be repesented as filenames: + // bstrDocumentUrl is a unique identifier for the document. The debug engine + // must implement 'IDebugDisassemblyStream2::GetDocument' + // For non-text documents: + // bstrDocumentUrl should be left as NULL. A doc context can be obtained from the code + // context + // For Both: + // Note that if bstrDocumentUrl is the same as the bstrDocumentUrl in the previous + // DisassemblyData array element, then bstrDocumentUrl should be NULL, otherwise, + // bstrDocumentUrl should not be NULL (if it is requested) and DF_DOCUMENTCHANGE should be set + // + // If the DF_DOCUMENT_CHECKSUM flag is set, this indicates that the document checksum is stored + // in bstrDocumentUrl after the NULL as a guid indicating the checksum algorithm, + // followed by a DWORD indicating the number of bytes of checksum data, + // followed by the array of bytes denoting the checksum value. + BSTR bstrDocumentUrl; + // The number of bytes this instruction is from the beginning of the line + DWORD dwByteOffset; + // Flags + DISASSEMBLY_FLAGS dwFlags; +} +alias tagDisassemblyData DisassemblyData; +enum /+ enum_SEEK_START+/ : DWORD +{ + SEEK_START_BEGIN = 0x0001, + SEEK_START_END = 0x0002, + SEEK_START_CURRENT = 0x0003, + SEEK_START_CODECONTEXT = 0x0004, + SEEK_START_CODELOCID = 0x0005 +} +alias DWORD enum_SEEK_START; +alias DWORD SEEK_START;; + +// ------------------------------------------------------------------ +// IDebugDocumentContext2 +const GUID IID_IDebugDocumentContext2 = IDebugDocumentContext2.iid; + +interface IDebugDocumentContext2 : IUnknown +{ + static const GUID iid = { 0x931516ad,0xb600,0x419c,[ 0x88,0xfc,0xdc,0xf5,0x18,0x3b,0x5f,0xa9 ] }; + + HRESULT GetDocument( + /+[out]+/ IDebugDocument2 *ppDocument); + + HRESULT GetName( + in GETNAME_TYPE gnType, + /+[out]+/ BSTR *pbstrFileName); + + HRESULT EnumCodeContexts( + /+[out]+/ IEnumDebugCodeContexts2 *ppEnumCodeCxts); + + HRESULT GetLanguageInfo( + /+[in, out, ptr]+/ BSTR* pbstrLanguage, + /+[in, out, ptr]+/ GUID* pguidLanguage); + + HRESULT GetStatementRange( + /+[in, out, ptr]+/ TEXT_POSITION* pBegPosition, + /+[in, out, ptr]+/ TEXT_POSITION* pEndPosition); + + HRESULT GetSourceRange( + /+[in, out, ptr]+/ TEXT_POSITION* pBegPosition, + /+[in, out, ptr]+/ TEXT_POSITION* pEndPosition); + + HRESULT Compare( + in DOCCONTEXT_COMPARE compare, + /+[ size_is (dwDocContextSetLen), length_is(dwDocContextSetLen)]+/ /+[in]+/ IDebugDocumentContext2 * rgpDocContextSet, + in DWORD dwDocContextSetLen, + /+[out]+/ DWORD* pdwDocContext); + + HRESULT Seek( + in int nCount, + /+[out]+/ IDebugDocumentContext2 * ppDocContext); +} +enum /+ enum_DOCCONTEXT_COMPARE+/ : DWORD +{ + DOCCONTEXT_EQUAL = 0x0001, + DOCCONTEXT_LESS_THAN = 0x0002, + DOCCONTEXT_GREATER_THAN = 0x0003, + DOCCONTEXT_SAME_DOCUMENT = 0x0004, +} +alias DWORD enum_DOCCONTEXT_COMPARE; +alias DWORD DOCCONTEXT_COMPARE;; + +// ------------------------------------------------------------------ +// IDebugDocumentChecksum2 +// Get this via QI from an IDebugDocumentContext2. +// +const GUID IID_IDebugDocumentChecksum2 = IDebugDocumentChecksum2.iid; + +interface IDebugDocumentChecksum2 : IUnknown +{ + static const GUID iid = { 0xc1c74db7,0xa3a7,0x40a2,[ 0xa2,0x79,0xa6,0x3b,0xa7,0x56,0xb8,0xb0 ] }; + HRESULT GetChecksumAndAlgorithmId( + /+[out]+/ GUID* pRetVal, + in ULONG cMaxBytes, + /+[out, length_is(*pcNumBytes), size_is(cMaxBytes)]+/ BYTE* pChecksum, + /+[out]+/ ULONG* pcNumBytes + ); +}; + +// ------------------------------------------------------------------ +// IDebugENCDocumentContextUpdate +// +// Get this via QI from an IDebugDocumentContext2. +const GUID IID_IDebugENCDocumentContextUpdate = IDebugENCDocumentContextUpdate.iid; + +interface IDebugENCDocumentContextUpdate : IUnknown +{ + static const GUID iid = { 0xF5637291,0xD779,0x4580,[ 0xA8,0x2C,0x0D,0x52,0x3E,0x7F,0xDC,0xF0 ] }; + HRESULT UpdateDocumentContext( + /+[in]+/ IDebugCodeContext2 pContext, + /+[in]+/ IDebugDocumentContext2 pDocContext); + + HRESULT UpdateStatementPosition( + in TEXT_POSITION posBegStatement, + in TEXT_POSITION posEndStatement); +} + +// ------------------------------------------------------------------ +// IDebugExpressionContext2 +const GUID IID_IDebugExpressionContext2 = IDebugExpressionContext2.iid; + +interface IDebugExpressionContext2 : IUnknown +{ + static const GUID iid = { 0x37a44580,0xd5fc,0x473e,[ 0xa0,0x48,0x21,0x70,0x2e,0xbf,0xc4,0x66 ] }; + + // Get the name of the expression context. The name is the description + // of this expression context. It is usually something that can be parsed + // by an expression evaluator that refers to this exact expression context. + // For C++, the name is "{ function-name, source-file-name, module-file-name }" + HRESULT GetName( + /+[out]+/ BSTR* pbstrName); + + HRESULT ParseText( + in LPCOLESTR pszCode, + in PARSEFLAGS dwFlags, + in UINT nRadix, + /+[out]+/ IDebugExpression2 * ppExpr, + /+[out]+/ BSTR* pbstrError, + /+[out]+/ UINT* pichError); +} +enum /+ enum_PARSEFLAGS+/ : DWORD +{ + // the expression is an expression (not a statement) + PARSE_EXPRESSION = 0x0001, + // the expression might contain function name/parameter signatures, and + // the expression is to be parsed [and later evaluated] as an address + PARSE_FUNCTION_AS_ADDRESS = 0x0002, + // design-time parsing for design-time expression evaluation + PARSE_DESIGN_TIME_EXPR_EVAL = 0x1000 +} +alias DWORD enum_PARSEFLAGS; +alias DWORD PARSEFLAGS;; + +// ------------------------------------------------------------------ +// Breakpoint types + +enum /+ enum_BP_TYPE+/ : DWORD +{ + BPT_NONE = 0x0000, + BPT_CODE = 0x0001, + BPT_DATA = 0x0002, + BPT_SPECIAL = 0x0003, +} +alias DWORD enum_BP_TYPE; +alias DWORD BP_TYPE; + +// ------------------------------------------------------------------ +// Breakpoint request stuff + +enum /+ enum_BP_LOCATION_TYPE+/ : DWORD +{ + BPLT_NONE = 0x00000000, + BPLT_FILE_LINE = 0x00010000, + BPLT_FUNC_OFFSET = 0x00020000, + BPLT_CONTEXT = 0x00030000, + BPLT_STRING = 0x00040000, + BPLT_ADDRESS = 0x00050000, + BPLT_RESOLUTION = 0x00060000, + + BPLT_CODE_FILE_LINE = BPT_CODE | BPLT_FILE_LINE, + BPLT_CODE_FUNC_OFFSET = BPT_CODE | BPLT_FUNC_OFFSET, + BPLT_CODE_CONTEXT = BPT_CODE | BPLT_CONTEXT, + BPLT_CODE_STRING = BPT_CODE | BPLT_STRING, + BPLT_CODE_ADDRESS = BPT_CODE | BPLT_ADDRESS, + BPLT_DATA_STRING = BPT_DATA | BPLT_STRING, + + BPLT_TYPE_MASK = 0x0000FFFF, + BPLT_LOCATION_TYPE_MASK = 0xFFFF0000 +} +alias DWORD enum_BP_LOCATION_TYPE; +alias DWORD BP_LOCATION_TYPE; + +struct _BP_LOCATION_CODE_FILE_LINE +{ + BSTR bstrContext; + IDebugDocumentPosition2 pDocPos; +} +alias _BP_LOCATION_CODE_FILE_LINE BP_LOCATION_CODE_FILE_LINE; + +struct _BP_LOCATION_CODE_FUNC_OFFSET +{ + BSTR bstrContext; + IDebugFunctionPosition2 pFuncPos; +} +alias _BP_LOCATION_CODE_FUNC_OFFSET BP_LOCATION_CODE_FUNC_OFFSET; + +struct _BP_LOCATION_CODE_CONTEXT +{ + IDebugCodeContext2 pCodeContext; +} +alias _BP_LOCATION_CODE_CONTEXT BP_LOCATION_CODE_CONTEXT; + +struct _BP_LOCATION_CODE_STRING +{ + BSTR bstrContext; + BSTR bstrCodeExpr; +} +alias _BP_LOCATION_CODE_STRING BP_LOCATION_CODE_STRING; + +struct _BP_LOCATION_CODE_ADDRESS +{ + BSTR bstrContext; + BSTR bstrModuleUrl; + BSTR bstrFunction; + BSTR bstrAddress; +} +alias _BP_LOCATION_CODE_ADDRESS BP_LOCATION_CODE_ADDRESS; + +struct _BP_LOCATION_DATA_STRING +{ + IDebugThread2 pThread; + BSTR bstrContext; + BSTR bstrDataExpr; + DWORD dwNumElements; +} +alias _BP_LOCATION_DATA_STRING BP_LOCATION_DATA_STRING; + +struct _BP_LOCATION_RESOLUTION +{ + IDebugBreakpointResolution2 pResolution; +} +alias _BP_LOCATION_RESOLUTION BP_LOCATION_RESOLUTION; + +union BP_LOCATION /+switch(BP_LOCATION_TYPE bpLocationType) bpLocation +/ { + /+[case BPLT_CODE_FILE_LINE:]+/ + BP_LOCATION_CODE_FILE_LINE bplocCodeFileLine; + + /+[case BPLT_CODE_FUNC_OFFSET:]+/ + BP_LOCATION_CODE_FUNC_OFFSET bplocCodeFuncOffset; + + /+[case BPLT_CODE_CONTEXT:]+/ + BP_LOCATION_CODE_CONTEXT bplocCodeContext; + + /+[case BPLT_CODE_STRING:]+/ + BP_LOCATION_CODE_STRING bplocCodeString; + + /+[case BPLT_CODE_ADDRESS:]+/ + BP_LOCATION_CODE_ADDRESS bplocCodeAddress; + + /+[case BPLT_DATA_STRING:]+/ + BP_LOCATION_DATA_STRING bplocDataString; + + /+[case BPLT_RESOLUTION:]+/ + BP_LOCATION_RESOLUTION bplocResolution; + + /+[default:]+/ + DWORD unused; }; + +enum /+ enum_BP_PASSCOUNT_STYLE+/ : DWORD +{ + BP_PASSCOUNT_NONE = 0x0000, + BP_PASSCOUNT_EQUAL = 0x0001, + BP_PASSCOUNT_EQUAL_OR_GREATER = 0x0002, + BP_PASSCOUNT_MOD = 0x0003, +} +alias DWORD enum_BP_PASSCOUNT_STYLE; +alias DWORD BP_PASSCOUNT_STYLE; + +struct _BP_PASSCOUNT +{ + DWORD dwPassCount; + BP_PASSCOUNT_STYLE stylePassCount; +} +alias _BP_PASSCOUNT BP_PASSCOUNT; + +enum /+ enum_BP_COND_STYLE+/ : DWORD +{ + BP_COND_NONE = 0x0000, + BP_COND_WHEN_TRUE = 0x0001, + BP_COND_WHEN_CHANGED = 0x0002, +} +alias DWORD enum_BP_COND_STYLE; +alias DWORD BP_COND_STYLE; + +struct _BP_CONDITION +{ + IDebugThread2 pThread; + BP_COND_STYLE styleCondition; + BSTR bstrContext; + BSTR bstrCondition; + UINT nRadix; +} +alias _BP_CONDITION BP_CONDITION; + +enum /+ enum_BP_FLAGS+/ : DWORD +{ + BP_FLAG_NONE = 0x0000, + BP_FLAG_MAP_DOCPOSITION = 0x0001, + + // BP_FLAG_DONT_STOP is used to indicate the + // breakpoint should be processed bt the debug engine, + // but that the debug engine ultimately shouldn't stop + // there (i.e. an IDebugBreakpointEvent2 should not be + // send. This flag is designed to be used primarily with + // tracepoints. + BP_FLAG_DONT_STOP = 0x0002, +} +alias DWORD enum_BP_FLAGS; +alias DWORD BP_FLAGS; + +enum /+ enum_BPREQI_FIELDS+/ : DWORD +{ + BPREQI_BPLOCATION = 0x0001, + BPREQI_LANGUAGE = 0x0002, + BPREQI_PROGRAM = 0x0004, + BPREQI_PROGRAMNAME = 0x0008, + BPREQI_THREAD = 0x0010, + BPREQI_THREADNAME = 0x0020, + BPREQI_PASSCOUNT = 0x0040, + BPREQI_CONDITION = 0x0080, + BPREQI_FLAGS = 0x0100, + BPREQI_ALLOLDFIELDS = 0x01ff, + + // Flags below this point belong to BP_REQUEST_INFO2 + BPREQI_VENDOR = 0x0200, + BPREQI_CONSTRAINT = 0x0400, + BPREQI_TRACEPOINT = 0x0800, + + BPREQI_ALLFIELDS = 0x0fff, +} +alias DWORD enum_BPREQI_FIELDS; +alias DWORD BPREQI_FIELDS; + +struct _BP_REQUEST_INFO +{ + BPREQI_FIELDS dwFields; + GUID guidLanguage; + BP_LOCATION bpLocation; + IDebugProgram2 pProgram; + BSTR bstrProgramName; + IDebugThread2 pThread; + BSTR bstrThreadName; + BP_CONDITION bpCondition; + BP_PASSCOUNT bpPassCount; + BP_FLAGS dwFlags; +} +alias _BP_REQUEST_INFO BP_REQUEST_INFO; + +struct _BP_REQUEST_INFO2 +{ + BPREQI_FIELDS dwFields; + GUID guidLanguage; + BP_LOCATION bpLocation; + IDebugProgram2 pProgram; + BSTR bstrProgramName; + IDebugThread2 pThread; + BSTR bstrThreadName; + BP_CONDITION bpCondition; + BP_PASSCOUNT bpPassCount; + BP_FLAGS dwFlags; + + // guidVector may be NULL while guidLanguage is non-NULL + // This means use all matching languages, regardless of vendor + // for beining this breakpoint. + GUID guidVendor; + // The constraint associated with this breakpoint (may be NULL) + BSTR bstrConstraint; + // The tracepoint associated with this breakpoint (may be NULL) + BSTR bstrTracepoint; +} +alias _BP_REQUEST_INFO2 BP_REQUEST_INFO2; + +// ------------------------------------------------------------------ +// IDebugBreakpointRequest2 + +const GUID IID_IDebugBreakpointRequest2 = IDebugBreakpointRequest2.iid; + +interface IDebugBreakpointRequest2 : IUnknown +{ + static const GUID iid = { 0x6015fd18,0x8257,0x4df3,[ 0xac,0x42,0xf0,0x74,0xde,0xdd,0x4c,0xbd ] }; + HRESULT GetLocationType( + /+[out]+/ BP_LOCATION_TYPE* pBPLocationType); + + HRESULT GetRequestInfo( + in BPREQI_FIELDS dwFields, + /+[out]+/ BP_REQUEST_INFO* pBPRequestInfo); +}; + +struct tagCHECKSUM_DATA +{ + DWORD ByteCount; + /+[size_is(ByteCount)]+/ BYTE* pBytes; +} +alias tagCHECKSUM_DATA CHECKSUM_DATA; + +// ------------------------------------------------------------------ +// IDebugBreakpointChecksumRequest2 +// +// Get this via QI from an IDebugBreakpointRequest2. +const GUID IID_IDebugBreakpointChecksumRequest2 = IDebugBreakpointChecksumRequest2.iid; + +interface IDebugBreakpointChecksumRequest2 : IUnknown +{ + static const GUID iid = { 0x0EA91CF7,0x8542,0x4780,[ 0x8D,0x6B,0x7B,0xD6,0x86,0xCD,0x24,0x71 ] }; + // get the checksum based on the specified algorithm + // pChecksumData->pBytes is allocated by the callee, and should be freed by the caller with CoTaskMemFree + HRESULT GetChecksum(in GUID* guidAlgorithm, + /+[out]+/ CHECKSUM_DATA* pChecksumData); + + HRESULT IsChecksumEnabled(/+[out]+/ BOOL* pfChecksumEnabled); +}; + +// ------------------------------------------------------------------ +// IDebugBreakpointRequest3 + +const GUID IID_IDebugBreakpointRequest3 = IDebugBreakpointRequest3.iid; + +interface IDebugBreakpointRequest3 : IDebugBreakpointRequest2 +{ + static const GUID iid = { 0x5C18A5FE,0x7150,0x4e66,[ 0x82,0x46,0x27,0xBF,0xB0,0xE7,0xBF,0xD9 ] }; + HRESULT GetRequestInfo2( + in BPREQI_FIELDS dwFields, + /+[out]+/ BP_REQUEST_INFO2 * bBPRequestInfo); +}; + +// ------------------------------------------------------------------ +// Breakpoint resolution stuff + +struct _BP_RESOLUTION_CODE +{ + IDebugCodeContext2 pCodeContext; +} +alias _BP_RESOLUTION_CODE BP_RESOLUTION_CODE; + +enum /+ enum_BP_RES_DATA_FLAGS+/ : DWORD +{ + // The data breakpoint is being emulated + // (rather than done via hardware) + BP_RES_DATA_EMULATED = 0x0001, +} +alias DWORD enum_BP_RES_DATA_FLAGS; +alias DWORD BP_RES_DATA_FLAGS; + +struct _BP_RESOLUTION_DATA +{ + BSTR bstrDataExpr; + BSTR bstrFunc; + BSTR bstrImage; + BP_RES_DATA_FLAGS dwFlags; +} +alias _BP_RESOLUTION_DATA BP_RESOLUTION_DATA; + +union BP_RESOLUTION_LOCATION /+switch(BP_TYPE bpType) bpResLocation +/ { + /+[case BPT_CODE:]+/ + BP_RESOLUTION_CODE bpresCode; + + /+[case BPT_DATA:]+/ + BP_RESOLUTION_DATA bpresData; + + /+[default:]+/ + int unused; }; + +enum /+ enum_BPRESI_FIELDS+/ : DWORD +{ + BPRESI_BPRESLOCATION = 0x0001, + BPRESI_PROGRAM = 0x0002, + BPRESI_THREAD = 0x0004, + + BPRESI_ALLFIELDS = 0xffffffff, +} +alias DWORD enum_BPRESI_FIELDS; +alias DWORD BPRESI_FIELDS; + +struct _BP_RESOLUTION_INFO +{ + BPRESI_FIELDS dwFields; + BP_RESOLUTION_LOCATION bpResLocation; + IDebugProgram2 pProgram; + IDebugThread2 pThread; +} +alias _BP_RESOLUTION_INFO BP_RESOLUTION_INFO; + +// ------------------------------------------------------------------ +// IDebugBreakpointResolution2 + +const GUID IID_IDebugBreakpointResolution2 = IDebugBreakpointResolution2.iid; + +interface IDebugBreakpointResolution2 : IUnknown +{ + static const GUID iid = { 0xb7e66f28,0x035a,0x401a,[ 0xaf,0xc7,0x2e,0x30,0x0b,0xd2,0x97,0x11 ] }; + HRESULT GetBreakpointType( + /+[out]+/ BP_TYPE* pBPType); + + HRESULT GetResolutionInfo( + in BPRESI_FIELDS dwFields, + /+[out]+/ BP_RESOLUTION_INFO* pBPResolutionInfo); +}; + +// ------------------------------------------------------------------ +// Error breakpoint stuff + +enum /+ enum_BP_ERROR_TYPE+/ : DWORD +{ + BPET_NONE = 0x00000000, + + BPET_TYPE_WARNING = 0x00000001, + BPET_TYPE_ERROR = 0x00000002, + + BPET_SEV_HIGH = 0x0F000000, + BPET_SEV_GENERAL = 0x07000000, + BPET_SEV_LOW = 0x01000000, + + BPET_TYPE_MASK = 0x0000ffff, + BPET_SEV_MASK = 0xffff0000, + + // Use these contants for describing general warnings and errors + BPET_GENERAL_WARNING = BPET_SEV_GENERAL | BPET_TYPE_WARNING, + BPET_GENERAL_ERROR = BPET_SEV_GENERAL | BPET_TYPE_ERROR, + + BPET_ALL = 0xffffffff, +} +alias DWORD enum_BP_ERROR_TYPE; +alias DWORD BP_ERROR_TYPE; + +enum /+ enum_BPERESI_FIELDS+/ : DWORD +{ + BPERESI_BPRESLOCATION = 0x0001, + BPERESI_PROGRAM = 0x0002, + BPERESI_THREAD = 0x0004, + BPERESI_MESSAGE = 0x0008, + BPERESI_TYPE = 0x0010, + + BPERESI_ALLFIELDS = 0xffffffff, +} +alias DWORD enum_BPERESI_FIELDS; +alias DWORD BPERESI_FIELDS; + +struct _BP_ERROR_RESOLUTION_INFO +{ + BPERESI_FIELDS dwFields; + BP_RESOLUTION_LOCATION bpResLocation; + IDebugProgram2 pProgram; + IDebugThread2 pThread; + BSTR bstrMessage; + BP_ERROR_TYPE dwType; +} +alias _BP_ERROR_RESOLUTION_INFO BP_ERROR_RESOLUTION_INFO; + +// ------------------------------------------------------------------ +// IDebugErrorBreakpointResolution2 + +const GUID IID_IDebugErrorBreakpointResolution2 = IDebugErrorBreakpointResolution2.iid; + +interface IDebugErrorBreakpointResolution2 : IUnknown +{ + static const GUID iid = { 0x603aedf8,0x9575,0x4d30,[ 0xb8,0xca,0x12,0x4d,0x1c,0x98,0xeb,0xd8 ] }; + HRESULT GetBreakpointType( + /+[out]+/ BP_TYPE* pBPType); + + HRESULT GetResolutionInfo( + in BPERESI_FIELDS dwFields, + /+[out]+/ BP_ERROR_RESOLUTION_INFO* pErrorResolutionInfo); +}; + +// ------------------------------------------------------------------ +// IDebugBoundBreakpoint2 + +const GUID IID_IDebugBoundBreakpoint2 = IDebugBoundBreakpoint2.iid; + +interface IDebugBoundBreakpoint2 : IUnknown +{ + static const GUID iid = { 0xd533d975,0x3f32,0x4876,[ 0xab,0xd0,0x6d,0x37,0xfd,0xa5,0x63,0xe7 ] }; + + HRESULT GetPendingBreakpoint( + /+[out]+/ IDebugPendingBreakpoint2 * ppPendingBreakpoint); + + HRESULT GetState( + /+[out]+/ BP_STATE* pState); + + HRESULT GetHitCount( + /+[out]+/ DWORD* pdwHitCount); + + HRESULT GetBreakpointResolution( + /+[out]+/ IDebugBreakpointResolution2 * ppBPResolution); + + HRESULT Enable( + in BOOL fEnable); + + HRESULT SetHitCount( + in DWORD dwHitCount); + + HRESULT SetCondition( + in BP_CONDITION bpCondition); + + HRESULT SetPassCount( + in BP_PASSCOUNT bpPassCount); + + HRESULT Delete(); +} +enum /+ enum_BP_STATE+/ : DWORD +{ + BPS_NONE = 0x0000, + BPS_DELETED = 0x0001, + BPS_DISABLED = 0x0002, + BPS_ENABLED = 0x0003, +} +alias DWORD enum_BP_STATE; +alias DWORD BP_STATE;; + +// ------------------------------------------------------------------ +// IDebugBoundBreakpoint3 + +const GUID IID_IDebugBoundBreakpoint3 = IDebugBoundBreakpoint3.iid; + +interface IDebugBoundBreakpoint3 : IUnknown +{ + static const GUID iid = { 0x60f49115,0xce92,0x4f96,[ 0x8d,0x0a,0x81,0xcc,0xca,0xe4,0xab,0x77 ] }; + HRESULT SetTracepoint( + in LPCOLESTR bpBstrTracepoint, + in BP_FLAGS bpFlags // only BP_FLAG_DONT_STOP is supported + ); +}; + +// ------------------------------------------------------------------ +// IDebugPendingBreakpoint2 + +const GUID IID_IDebugPendingBreakpoint2 = IDebugPendingBreakpoint2.iid; + +interface IDebugPendingBreakpoint2 : IUnknown +{ + static const GUID iid = { 0x6e215ef3,0xe44c,0x44d1,[ 0xb7,0xba,0xb2,0x40,0x1f,0x7d,0xc2,0x3d ] }; + + HRESULT CanBind( + /+[out]+/ IEnumDebugErrorBreakpoints2 * ppErrorEnum); + + HRESULT Bind(); + + HRESULT GetState( + /+[out]+/ PENDING_BP_STATE_INFO* pState); + + HRESULT GetBreakpointRequest( + /+[out]+/ IDebugBreakpointRequest2 * ppBPRequest); + + HRESULT Virtualize( + in BOOL fVirtualize); + + HRESULT Enable( + in BOOL fEnable); + + HRESULT SetCondition( + in BP_CONDITION bpCondition); + + HRESULT SetPassCount( + in BP_PASSCOUNT bpPassCount); + + HRESULT EnumBoundBreakpoints( + /+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum); + + HRESULT EnumErrorBreakpoints( + in BP_ERROR_TYPE bpErrorType, + /+[out]+/ IEnumDebugErrorBreakpoints2 * ppEnum); + + HRESULT Delete(); +} +enum /+ enum_PENDING_BP_STATE+/ : DWORD +{ + PBPS_NONE = 0x0000, + PBPS_DELETED = 0x0001, + PBPS_DISABLED = 0x0002, + PBPS_ENABLED = 0x0003, +} +alias DWORD enum_PENDING_BP_STATE; +alias DWORD PENDING_BP_STATE; +enum /+ enum_PENDING_BP_STATE_FLAGS+/ : DWORD +{ + PBPSF_NONE = 0x0000, + PBPSF_VIRTUALIZED = 0x0001, +} +alias DWORD enum_PENDING_BP_STATE_FLAGS; +alias DWORD PENDING_BP_STATE_FLAGS; +struct _tagPENDING_BP_STATE_INFO +{ + PENDING_BP_STATE state; + PENDING_BP_STATE_FLAGS flags; +} +alias _tagPENDING_BP_STATE_INFO PENDING_BP_STATE_INFO;; + +// ------------------------------------------------------------------ +// IDebugPendingBreakpoint3 + +const GUID IID_IDebugPendingBreakpoint3 = IDebugPendingBreakpoint3.iid; + +interface IDebugPendingBreakpoint3 : IDebugPendingBreakpoint2 +{ + static const GUID iid = { 0x96643d32,0x2624,0x479a,[ 0x9f,0x1a,0x25,0xd0,0x20,0x30,0xdd,0x3b ] }; + HRESULT GetErrorResolutionInfo( + in BPERESI_FIELDS dwFields, + /+[out]+/ BP_ERROR_RESOLUTION_INFO* pErrorResolutionInfo); +}; + +// ------------------------------------------------------------------ +// IDebugErrorBreakpoint2 + +const GUID IID_IDebugErrorBreakpoint2 = IDebugErrorBreakpoint2.iid; + +interface IDebugErrorBreakpoint2 : IUnknown +{ + static const GUID iid = { 0x74570ef7,0x2486,0x4089,[ 0x80,0x0c,0x56,0xe3,0x82,0x9b,0x5c,0xa4 ] }; + HRESULT GetPendingBreakpoint( + /+[out]+/ IDebugPendingBreakpoint2 * ppPendingBreakpoint); + + HRESULT GetBreakpointResolution( + /+[out]+/ IDebugErrorBreakpointResolution2 * ppErrorResolution); +}; + +// ------------------------------------------------------------------ +// IDebugExpression2 +const GUID IID_IDebugExpression2 = IDebugExpression2.iid; + +interface IDebugExpression2 : IUnknown +{ + static const GUID iid = { 0xf7473fd0,0x7f75,0x478d,[ 0x8d,0x85,0xa4,0x85,0x20,0x4e,0x7a,0x2d ] }; + + HRESULT EvaluateAsync( + in EVALFLAGS dwFlags, + // pExprCallback must be NULL in V8 and above + /+[in]+/ IDebugEventCallback2 pExprCallback); + + HRESULT Abort(); + + HRESULT EvaluateSync( + in EVALFLAGS dwFlags, + in DWORD dwTimeout, + // pExprCallback must be NULL in V8 and above + /+[in]+/ IDebugEventCallback2 pExprCallback, + /+[out]+/ IDebugProperty2 * ppResult); +} +enum /+ enum_EVALFLAGS+/ : DWORD +{ + // the return value is interesting + EVAL_RETURNVALUE = 0x0002, + // don't allow side effects + EVAL_NOSIDEEFFECTS = 0x0004, + // stop on breakpoints + EVAL_ALLOWBPS = 0x0008, + // allow error reporting to the host + EVAL_ALLOWERRORREPORT = 0x0010, + // evaluate any functions as address (instead of invoking the function) + EVAL_FUNCTION_AS_ADDRESS = 0x0040, + // don't allow function/property evaluation + EVAL_NOFUNCEVAL = 0x0080, + // don't allow events + EVAL_NOEVENTS = 0x1000, + // design-time expression evaluation + EVAL_DESIGN_TIME_EXPR_EVAL = 0x2000, + // Allow implicit variable creation + EVAL_ALLOW_IMPLICIT_VARS = 0x4000 +} +alias DWORD enum_EVALFLAGS; +alias DWORD EVALFLAGS;; + +// ------------------------------------------------------------------ +// IDebugModule2 +const GUID IID_IDebugModule2 = IDebugModule2.iid; + +interface IDebugModule2 : IUnknown +{ + static const GUID iid = { 0x0fc1cd9a,0xb912,0x405c,[ 0xa0,0x4c,0x43,0xce,0x02,0xcd,0x7d,0xf2 ] }; + + HRESULT GetInfo( + in MODULE_INFO_FIELDS dwFields, + /+[out]+/ MODULE_INFO* pInfo); + + HRESULT ReloadSymbols_Deprecated( + /+[ ptr]+/ in LPCOLESTR pszUrlToSymbols, + /+[out]+/ BSTR* pbstrDebugMessage); +} +enum /+ enum_MODULE_FLAGS+/ : DWORD +{ + MODULE_FLAG_NONE = 0x0000, + MODULE_FLAG_SYSTEM = 0x0001, + MODULE_FLAG_SYMBOLS = 0x0002, + MODULE_FLAG_64BIT = 0x0004, + + // + // If the engine knows a module about optimizations it needs to set + // either of these flags, if it does not the module window will assume + // it does not + // + + MODULE_FLAG_OPTIMIZED = 0x0008, + MODULE_FLAG_UNOPTIMIZED = 0x0010 +} +alias DWORD enum_MODULE_FLAGS; +alias DWORD MODULE_FLAGS; +enum /+ enum_MODULE_INFO_FIELDS+/ : DWORD +{ + MIF_NONE = 0x0000, + MIF_NAME = 0x0001, + MIF_URL = 0x0002, + MIF_VERSION = 0x0004, + MIF_DEBUGMESSAGE = 0x0008, + MIF_LOADADDRESS = 0x0010, + MIF_PREFFEREDADDRESS = 0x0020, + MIF_SIZE = 0x0040, + MIF_LOADORDER = 0x0080, + MIF_TIMESTAMP = 0x0100, + MIF_URLSYMBOLLOCATION = 0x0200, + MIF_FLAGS = 0x0400, + + MIF_ALLFIELDS = 0x07ff, +} +alias DWORD enum_MODULE_INFO_FIELDS; +alias DWORD MODULE_INFO_FIELDS; +struct _tagMODULE_INFO +{ + MODULE_INFO_FIELDS dwValidFields; + BSTR m_bstrName; + BSTR m_bstrUrl; + BSTR m_bstrVersion; + BSTR m_bstrDebugMessage; + UINT64 m_addrLoadAddress; + UINT64 m_addrPreferredLoadAddress; + DWORD m_dwSize; + DWORD m_dwLoadOrder; + FILETIME m_TimeStamp; + BSTR m_bstrUrlSymbolLocation; + MODULE_FLAGS m_dwModuleFlags; +} +alias _tagMODULE_INFO MODULE_INFO;; + +// ------------------------------------------------------------------ +// IDebugModule3 +const GUID IID_IDebugModule3 = IDebugModule3.iid; + +interface IDebugModule3 : IDebugModule2 +{ + static const GUID iid = { 0x245F9D6A,0xE550,0x404d,[ 0x82,0xF1,0xFD,0xB6,0x82,0x81,0x60,0x7A ] }; + + HRESULT GetSymbolInfo( + in SYMBOL_SEARCH_INFO_FIELDS dwFields, + /+[out]+/ MODULE_SYMBOL_SEARCH_INFO* pInfo); + + // LoadSymbols will use the current symbol path to search for + // symbols. The updated IDebugModule3 is sent in an IDebugSymbolSearchEvent2 + HRESULT LoadSymbols(); + + // Returns whether module is user or not + HRESULT IsUserCode( + /+[out]+/ BOOL *pfUser); + + // Sets user status of module + HRESULT SetJustMyCodeState( + in BOOL fIsUserCode); +} +enum /+ enum_SYMBOL_SEARCH_INFO_FIELDS+/ : DWORD +{ + SSIF_NONE = 0x0000, + SSIF_VERBOSE_SEARCH_INFO= 0x0001 +} +alias DWORD enum_SYMBOL_SEARCH_INFO_FIELDS; +alias DWORD SYMBOL_SEARCH_INFO_FIELDS; +struct _tagSYMBOL_SEARCH_INFO +{ + // Details of where symbols were searched for and the result + SYMBOL_SEARCH_INFO_FIELDS dwValidFields; + BSTR bstrVerboseSearchInfo; +} +alias _tagSYMBOL_SEARCH_INFO MODULE_SYMBOL_SEARCH_INFO; + +// +// IDebugSourceServerModule +// +// QI from IDebugModule2 +// +const GUID IID_IDebugSourceServerModule = IDebugSourceServerModule.iid; + +interface IDebugSourceServerModule : IUnknown +{ + static const GUID iid = { 0x492e5541,0x215b,0x4f67,[ 0xad,0x73,0x20,0xf4,0x86,0x14,0x91,0x2e ] }; + // returns the source server data for the module + // caller should free using CoTaskMemFree() + HRESULT GetSourceServerData( + /+[out]+/ ULONG* pDataByteCount, + /+[out, size_is (, *pDataByteCount)]+/ BYTE** ppData); +} + +// ------------------------------------------------------------------ +// IDebugModuleManaged +const GUID IID_IDebugModuleManaged = IDebugModuleManaged.iid; + +interface IDebugModuleManaged : IUnknown +{ + static const GUID iid = { 0x232397F8,0xB232,0x479d,[ 0xB1,0xBB,0x2F,0x04,0x4C,0x70,0xA0,0xF9 ] }; + HRESULT GetMvid( + /+[out]+/ GUID* mvid); +}; + +// ------------------------------------------------------------------ +// IDebugDocument2 +const GUID IID_IDebugDocument2 = IDebugDocument2.iid; + +interface IDebugDocument2 : IUnknown +{ + static const GUID iid = { 0x1606dd73,0x5d5f,0x405c,[ 0xb4,0xf4,0xce,0x32,0xba,0xba,0x25,0x01 ] }; + HRESULT GetName( + in GETNAME_TYPE gnType, + /+[out]+/ BSTR* pbstrFileName); + + HRESULT GetDocumentClassId( + /+[out]+/ CLSID* pclsid); +}; + +// ------------------------------------------------------------------ +// IDebugDocumentText2 +// #pragma warning(push) +// #pragma warning(disable:28718) +const GUID IID_IDebugDocumentText2 = IDebugDocumentText2.iid; + +interface IDebugDocumentText2 : IDebugDocument2 +{ + static const GUID iid = { 0x4b0645aa,0x08ef,0x4cb9,[ 0xad,0xb9,0x03,0x95,0xd6,0xed,0xad,0x35 ] }; + HRESULT GetSize( + /+[in, out, ptr]+/ ULONG* pcNumLines, + /+[in, out, ptr]+/ ULONG* pcNumChars); + + HRESULT GetText( + in TEXT_POSITION pos, + in ULONG cMaxChars, + /+[out, length_is(*pcNumChars), size_is(cMaxChars)]+/ WCHAR* pText, + /+[out]+/ ULONG* pcNumChars); +}; +// #pragma warning(pop) + +// ------------------------------------------------------------------ +// IDebugDocumentPosition2 +const GUID IID_IDebugDocumentPosition2 = IDebugDocumentPosition2.iid; + +interface IDebugDocumentPosition2 : IUnknown +{ + static const GUID iid = { 0xbdde0eee,0x3b8d,0x4c82,[ 0xb5,0x29,0x33,0xf1,0x6b,0x42,0x83,0x2e ] }; + HRESULT GetFileName( + /+[out]+/ BSTR* pbstrFileName); + + HRESULT GetDocument( + /+[out]+/ IDebugDocument2 * ppDoc); + + HRESULT IsPositionInDocument( + /+[in]+/ IDebugDocument2 pDoc); + + HRESULT GetRange( + /+[in, out, ptr]+/ TEXT_POSITION* pBegPosition, + /+[in, out, ptr]+/ TEXT_POSITION* pEndPosition); +}; + +// ------------------------------------------------------------------ +// IDebugDocumentPositionOffset2 +const GUID IID_IDebugDocumentPositionOffset2 = IDebugDocumentPositionOffset2.iid; + +interface IDebugDocumentPositionOffset2 : IUnknown +{ + static const GUID iid = { 0x037edd0f,0x8551,0x4f7f,[ 0x8c,0xa0,0x04,0xd9,0xe2,0x9f,0x53,0x2d ] }; + HRESULT GetRange( + /+[in, out, ptr]+/ DWORD* pdwBegOffset, + /+[in, out, ptr]+/ DWORD* pdwEndOffset); +}; + +// ------------------------------------------------------------------ +// IDebugFunctionPosition2 + +const GUID IID_IDebugFunctionPosition2 = IDebugFunctionPosition2.iid; + +interface IDebugFunctionPosition2 : IUnknown +{ + static const GUID iid = { 0x1ede3b4b,0x35e7,0x4b97,[ 0x81,0x33,0x02,0x84,0x5d,0x60,0x01,0x74 ] }; + HRESULT GetFunctionName( + /+[out]+/ BSTR* pbstrFunctionName); + + HRESULT GetOffset( + /+[in, out, ptr]+/ TEXT_POSITION* pPosition); +}; + +// ------------------------------------------------------------------ +// IDebugDocumentTextEvents2 +const GUID IID_IDebugDocumentTextEvents2 = IDebugDocumentTextEvents2.iid; + +interface IDebugDocumentTextEvents2 : IUnknown +{ + static const GUID iid = { 0x33ec72e3,0x002f,0x4966,[ 0xb9,0x1c,0x5c,0xe2,0xf7,0xba,0x51,0x24 ] }; + + HRESULT onDestroy(); + + HRESULT onInsertText( + in TEXT_POSITION pos, + in DWORD dwNumToInsert); + + HRESULT onRemoveText( + in TEXT_POSITION pos, + in DWORD dwNumToRemove); + + HRESULT onReplaceText( + in TEXT_POSITION pos, + in DWORD dwNumToReplace); + + HRESULT onUpdateTextAttributes( + in TEXT_POSITION pos, + in DWORD dwNumToUpdate); + + HRESULT onUpdateDocumentAttributes( + in TEXT_DOC_ATTR_2 textdocattr); +} +alias DWORD TEXT_DOC_ATTR_2; +const TEXT_DOC_ATTR_2 TEXT_DOC_ATTR_READONLY_2 = 0x00000001;; + +// ------------------------------------------------------------------ +// IDebugQueryEngine2 + +const GUID IID_IDebugQueryEngine2 = IDebugQueryEngine2.iid; + +interface IDebugQueryEngine2 : IUnknown +{ + static const GUID iid = { 0xc989adc9,0xf305,0x4ef5,[ 0x8c,0xa2,0x20,0x89,0x8e,0x8d,0x0e,0x28 ] }; + HRESULT GetEngineInterface( + /+[out]+/ IUnknown * ppUnk); +}; + +//------------------------------------------------------------------- +// IEEHostServices +const GUID IID_IEEHostServices = IEEHostServices.iid; + +interface IEEHostServices : IUnknown +{ + static const GUID iid = { 0xBB7BE481,0xDA8F,0x4b9e,[ 0x89,0xCB,0x0A,0x8D,0xDE,0x6B,0xC5,0xD7 ] }; + HRESULT GetHostValue( + in LPCOLESTR valueCatagory, + in LPCOLESTR valueKind, + /+[out]+/ VARIANT * result); + HRESULT SetHostValue( + in LPCOLESTR valueCatagory, + in LPCOLESTR valueKind, + in VARIANT newValue); +}; + +//------------------------------------------------------------------- +// IDebugCustomViewer +const GUID IID_IDebugCustomViewer = IDebugCustomViewer.iid; + +interface IDebugCustomViewer : IUnknown +{ + static const GUID iid = { 0x6306E526,0x9E02,0x4696,[ 0xBF,0xF9,0x48,0x33,0x8A,0x27,0xF8,0xAF ] }; + HRESULT DisplayValue( + in HWND hwnd, // Parent window. + in DWORD dwID, // ID for custom viewers that support more than one type. + /+[in]+/ IUnknown pHostServices, + /+[in]+/ IDebugProperty3 pDebugProperty); +}; + + const GUID IID_IEEDataStorage = IEEDataStorage.iid; + +interface IEEDataStorage : IUnknown +{ + static const GUID iid = { 0xDCF1F227,0xEC51,0x4680,[ 0x87,0x22,0xC8,0x79,0x6A,0x5F,0x34,0x83 ] }; + HRESULT GetSize(/+[out]+/ ULONG * size); + HRESULT GetData(in ULONG dataSize, + /+[out]+/ ULONG * sizeGotten, + /+[out, size_is(dataSize), length_is(*sizeGotten)]+/ BYTE * data); +}; + + const GUID IID_IPropertyProxyEESide = IPropertyProxyEESide.iid; + +interface IPropertyProxyEESide : IUnknown +{ + static const GUID iid = { 0x579919D2,0x1B10,0x4584,[ 0x96,0x9C,0x3E,0x06,0x5B,0xD3,0xE2,0x2D ] }; + + HRESULT InitSourceDataProvider(/+[out]+/ IEEDataStorage * dataOut); + HRESULT GetManagedViewerCreationData (/+[out]+/ BSTR * assemName, + /+[out]+/ IEEDataStorage * assemBytes, + /+[out]+/ IEEDataStorage * assemPdb, + /+[out]+/ BSTR * className, + /+[out]+/ ASSEMBLYLOCRESOLUTION * alr, + /+[out]+/ BOOL * replacementOk); + HRESULT GetInitialData(/+[out]+/ IEEDataStorage * dataOut); + HRESULT CreateReplacementObject(/+[in]+/ IEEDataStorage dataIn, + /+[out]+/ IEEDataStorage * dataOut); + HRESULT InPlaceUpdateObject(/+[in]+/ IEEDataStorage dataIn, + /+[out]+/ IEEDataStorage * dataOut); + HRESULT ResolveAssemblyReference(in LPCOLESTR assemName, in GETASSEMBLY flags, + /+[out]+/ IEEDataStorage * assemBytes, + /+[out]+/ IEEDataStorage * assemPdb, + /+[out]+/ BSTR * assemLocation, + /+[out]+/ ASSEMBLYLOCRESOLUTION * alr); +} +enum /+ enum_ASSEMBLYLOCRESOLUTION+/ : DWORD +{ + ALR_NAME = 0x0, + ALR_USERDIR = 0x1, + ALR_SHAREDDIR = 0x2, + ALR_REMOTEDIR = 0x4, + ALR_ERROR = 0x8, + ALR_BYTES = 0x10, +} +alias DWORD enum_ASSEMBLYLOCRESOLUTION; +alias DWORD ASSEMBLYLOCRESOLUTION; +enum /+ enum_GETASSEMBLY+/ : DWORD +{ + GA_BYTES = 0x1 , + GA_PDBBYTES = 0x2, + GA_NAME = 0x4, + GA_FLAGS = 0x8, +} +alias DWORD enum_GETASSEMBLY; +alias DWORD GETASSEMBLY;; + + const GUID IID_IPropertyProxyProvider = IPropertyProxyProvider.iid; + +interface IPropertyProxyProvider : IUnknown +{ + static const GUID iid = { 0x30E6C90E,0x757E,0x48cf,[ 0x8D,0xB8,0x20,0xB0,0x61,0xAF,0xBB,0xAE ] }; + HRESULT GetPropertyProxy(in DWORD dwID, + /+[out]+/ IPropertyProxyEESide * proxy); +}; + + const GUID IID_IManagedViewerHost = IManagedViewerHost.iid; + +interface IManagedViewerHost : IUnknown +{ + static const GUID iid = { 0x5968D43D,0xD21E,0x437c,[ 0x9C,0x71,0x77,0xC5,0x2C,0x3E,0x28,0x7A ] }; + HRESULT CreateViewer(in ULONG hwnd, /+[in]+/ IUnknown hostServices, /+[in]+/ IPropertyProxyEESide property); +}; + + const GUID IID_IEELocalObject = IEELocalObject.iid; + +interface IEELocalObject : IUnknown +{ + static const GUID iid = { 0x44F8F85F,0x5514,0x49a3,[ 0x81,0x73,0x6F,0x9C,0x9F,0x1C,0x48,0x32 ] }; + HRESULT SetCallback(IDebugSettingsCallback2 pCallback); +}; + + const GUID IID_IEEAssemblyRefResolveComparer = IEEAssemblyRefResolveComparer.iid; + +interface IEEAssemblyRefResolveComparer : IUnknown +{ + static const GUID iid = { 0x6F1A544C,0xE69E,0x4a52,[ 0x9E,0xA1,0x25,0xC8,0x97,0xB0,0x5B,0xEF ] }; + HRESULT CompareRef(in DWORD cookieFirst, in DWORD cookieSecond, in DWORD cookieTarget, + /+[out]+/ BOOL * firstIsBetter); +}; + + const GUID IID_IEEAssemblyRef = IEEAssemblyRef.iid; + +interface IEEAssemblyRef : IUnknown +{ + static const GUID iid = { 0xAAD20A0E,0x9CD9,0x40ab,[ 0x91,0xB9,0x3C,0x19,0x43,0x56,0x2C,0x84 ] }; + HRESULT GetName(/+[out]+/ BSTR * bstr); + HRESULT GetVersion(/+[out]+/ USHORT * major, + /+[out]+/ USHORT * minor, + /+[out]+/ USHORT * build, + /+[out]+/ USHORT * revision); + HRESULT GetCulture(/+[out]+/ BSTR * bstr); + HRESULT GetPublicKey(/+[out]+/ BSTR * key); +}; + + const GUID IID_IEEHelperObject = IEEHelperObject.iid; + +interface IEEHelperObject : IUnknown +{ + static const GUID iid = { 0x4A3BCDE5,0x5F66,0x4cc8,[ 0x9F,0xA0,0x14,0x27,0x5C,0xCE,0xE6,0x88 ] }; + + HRESULT InitCache(IEEAssemblyRefResolveComparer pResolver); + + HRESULT GetTargetClass(in LPCOLESTR name, in DWORD assemblyCookie, + /+[out]+/ DWORD * cookie, + /+[out]+/ ULONG * valueAttrCount, + /+[out]+/ ULONG * viewerAttrCount, + /+[out]+/ ULONG * visualizerAttrCount); + HRESULT GetTargetAssembly(in LPCOLESTR name, + /+[out]+/ DWORD * cookie); + + HRESULT GetAssembly(in DWORD assemblyCookie, GETASSEMBLY flags, + /+[out]+/ ASSEMBLYFLAGS * flagsOut, + /+[out]+/ BSTR * name, + /+[out]+/ IEEDataStorage * assemBytes, + /+[out]+/ IEEDataStorage * pdbBytes); + + HRESULT GetHostAssembly(GETASSEMBLY flags, + /+[out]+/ IEEDataStorage * assemBytes, + /+[out]+/ IEEDataStorage * pdbBytes); + + HRESULT GetValueAttributeProps(in DWORD classCookie, in ULONG ordinal, + /+[out]+/ BSTR * targetedAssembly, + /+[out]+/ DWORD * assemLocation, + /+[out]+/ BSTR * name, + /+[out]+/ BSTR * value, + /+[out]+/ BSTR * type); + HRESULT GetViewerAttributeProps(in DWORD classCookie, in ULONG ordinal, + /+[out]+/ BSTR * targetedAssembly, + /+[out]+/ DWORD * assemLocation, + /+[out]+/ BSTR * className, + /+[out]+/ DWORD * classAssemLocation); + HRESULT GetVisualizerAttributeProps(in DWORD classCookie, in ULONG ordinal, + /+[out]+/ BSTR * targetedAssembly, + /+[out]+/ DWORD * assemLocation, + /+[out]+/ BSTR * displayClassName, + /+[out]+/ DWORD * displayClassAssemLocation, + /+[out]+/ BSTR * proxyClassName, + /+[out]+/ DWORD * proxyClassAssemLocation, + /+[out]+/ BSTR * description, + /+[out]+/ ULONG * uiType); + HRESULT GetAssemblyRefForCookie(in DWORD cookie, + /+[out]+/ IEEAssemblyRef * ppAssemRef); +} +enum /+ enum_ASSEMBLYFLAGS+/ : DWORD +{ + ASMF_USERDIR = 0x1, + ASMF_SHAREDDIR = 0x2, +} +alias DWORD enum_ASSEMBLYFLAGS; +alias DWORD ASSEMBLYFLAGS;; + +// ------------------------------------------------------------------ +// IDebugExceptionCallback2 +const GUID IID_IDebugExceptionCallback2 = IDebugExceptionCallback2.iid; + +interface IDebugExceptionCallback2 : IUnknown +{ + static const GUID iid = { 0x6f5cfda4,0x47d3,0x4a90,[ 0xa8,0x82,0x14,0x42,0x72,0x37,0xbc,0xee ] }; + // S_OK indicates that we should stop + HRESULT QueryStopOnException( + /+[in]+/ IDebugProcess2 pProcess, + /+[in]+/ IDebugProgram2 pProgram, + /+[in]+/ IDebugThread2 pThread, + /+[in]+/ IDebugExceptionEvent2 pEvent); +}; + +// ------------------------------------------------------------------ +// IEnumDebugProcesses2 +const GUID IID_IEnumDebugProcesses2 = IEnumDebugProcesses2.iid; + +interface IEnumDebugProcesses2 : IUnknown +{ + static const GUID iid = { 0x96c74ef4,0x185d,0x4f9a,[ 0x8a,0x43,0x4d,0x27,0x23,0x75,0x8e,0x0a ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugProcess2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugProcesses2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugPrograms2 +const GUID IID_IEnumDebugPrograms2 = IEnumDebugPrograms2.iid; + +interface IEnumDebugPrograms2 : IUnknown +{ + static const GUID iid = { 0x8d14bca6,0x34ce,0x4efe,[ 0xac,0x7e,0x0a,0xbc,0x61,0xda,0xdb,0x20 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugProgram2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugPrograms2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugThreads2 +const GUID IID_IEnumDebugThreads2 = IEnumDebugThreads2.iid; + +interface IEnumDebugThreads2 : IUnknown +{ + static const GUID iid = { 0x0d30dc12,0xc4f8,0x433d,[ 0x9f,0xcc,0x9f,0xf1,0x17,0xe5,0xe5,0xf4 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugThread2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugThreads2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugStackFrames2 +const GUID IID_IEnumDebugStackFrames2 = IEnumDebugStackFrames2.iid; + +interface IEnumDebugStackFrames2 : IUnknown +{ + static const GUID iid = { 0xcd39102b,0x4b69,0x4495,[ 0x8f,0x29,0xe0,0xb2,0x5c,0x4a,0x88,0x55 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugStackFrame2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugStackFrames2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); + + HRESULT GetIndex( + /+[in]+/ IDebugStackFrame2 pStackFrame, + /+[in, out]+/ ULONG* pIndex); +}; + +// ------------------------------------------------------------------ +// IEnumDebugCodeContexts2 +const GUID IID_IEnumDebugCodeContexts2 = IEnumDebugCodeContexts2.iid; + +interface IEnumDebugCodeContexts2 : IUnknown +{ + static const GUID iid = { 0xad47a80b,0xeda7,0x459e,[ 0xaf,0x82,0x64,0x7c,0xc9,0xfb,0xaa,0x50 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugCodeContext2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugCodeContexts2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugBoundBreakpoints2 + +const GUID IID_IEnumDebugBoundBreakpoints2 = IEnumDebugBoundBreakpoints2.iid; + +interface IEnumDebugBoundBreakpoints2 : IUnknown +{ + static const GUID iid = { 0x0f6b37e0,0xfcfe,0x44d9,[ 0x91,0x12,0x39,0x4c,0xa9,0xb9,0x21,0x14 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugBoundBreakpoint2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugPendingBreakpoints2 + +const GUID IID_IEnumDebugPendingBreakpoints2 = IEnumDebugPendingBreakpoints2.iid; + +interface IEnumDebugPendingBreakpoints2 : IUnknown +{ + static const GUID iid = { 0x70d2dc1e,0x4dcc,0x4786,[ 0xa0,0x72,0x9a,0x3b,0x60,0x0c,0x21,0x6b ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugPendingBreakpoint2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugPendingBreakpoints2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugErrorBreakpoints2 + +const GUID IID_IEnumDebugErrorBreakpoints2 = IEnumDebugErrorBreakpoints2.iid; + +interface IEnumDebugErrorBreakpoints2 : IUnknown +{ + static const GUID iid = { 0xe158f5aa,0x31fe,0x491b,[ 0xa9,0xf6,0xcf,0xf9,0x34,0xb0,0x3a,0x01 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugErrorBreakpoint2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugErrorBreakpoints2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugMachines2__deprecated +const GUID IID_IEnumDebugMachines2__deprecated = IEnumDebugMachines2__deprecated.iid; + +interface IEnumDebugMachines2__deprecated : IUnknown +{ + static const GUID iid = { 0x61d986ec,0x1eac,0x46b6,[ 0x90,0xff,0x40,0x2a,0x00,0x8f,0x15,0xd1 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugCoreServer2 * rgelt, + /+[in, out]+/ ULONG *pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugMachines2__deprecated *ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG *pcelt); +}; + +// #define EnumMachines_V7 EnumMachines__deprecated +// #define IEnumDebugMachines2_V7 IEnumDebugMachines2__deprecated +// #define IID_IEnumDebugMachines2_V7 IID_IEnumDebugMachines2__deprecated + +// ------------------------------------------------------------------ +// IEnumDebugExceptionInfo2 +const GUID IID_IEnumDebugExceptionInfo2 = IEnumDebugExceptionInfo2.iid; + +interface IEnumDebugExceptionInfo2 : IUnknown +{ + static const GUID iid = { 0x8e4bbd34,0xa2f4,0x41ef,[ 0x87,0xb5,0xc5,0x63,0xb4,0xad,0x6e,0xe7 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ EXCEPTION_INFO* rgelt, + /+[in, out]+/ ULONG *pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugExceptionInfo2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugFrameInfo2 +const GUID IID_IEnumDebugFrameInfo2 = IEnumDebugFrameInfo2.iid; + +interface IEnumDebugFrameInfo2 : IUnknown +{ + static const GUID iid = { 0x98bbba48,0x4c4d,0x4fff,[ 0x83,0x40,0x60,0x97,0xbe,0xc9,0xc8,0x94 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ FRAMEINFO* rgelt, + /+[in, out]+/ ULONG *pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugFrameInfo2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +const GUID IID_IEnumDebugSessionFrameInfo2 = IEnumDebugSessionFrameInfo2.iid; + +interface IEnumDebugSessionFrameInfo2 : IEnumDebugFrameInfo2 +{ + static const GUID iid = { 0xef7262c4,0x4a01,0x42a0,[ 0x86,0x58,0x93,0x26,0x67,0xb2,0x75,0x55 ] }; + + HRESULT SetCachePriority( + in SESSION_CACHE_PRIORITY cachePriority); +} +enum /+ enum_SESSION_CACHE_PRIORITY+/ +{ + NORMAL_CACHE_PRIORITY = 0, + HIGH_CACHE_PRIORITY = 1 +} +alias int enum_SESSION_CACHE_PRIORITY; +alias int SESSION_CACHE_PRIORITY;; + +// ------------------------------------------------------------------ +// IEnumDebugFrameInfoFilter2 +const GUID IID_IEnumDebugFrameInfoFilter2 = IEnumDebugFrameInfoFilter2.iid; + +interface IEnumDebugFrameInfoFilter2 : IEnumDebugFrameInfo2 +{ + static const GUID iid = { 0x6CD4FB40,0xF954,0x44e0,[ 0xB8,0xA5,0xA6,0x14,0x48,0x1E,0x08,0x31 ] }; + HRESULT CanFilter( + /+[out]+/ BOOL *pfCanFilter); + + HRESULT IsFiltered( + /+[out]+/ BOOL *pfIsFiltered); +} + +// ------------------------------------------------------------------ +// IEnumCodePaths2 +const GUID IID_IEnumCodePaths2 = IEnumCodePaths2.iid; + +interface IEnumCodePaths2 : IUnknown +{ + static const GUID iid = { 0x9b13f80d,0xcfc6,0x4b78,[ 0x81,0xef,0x1f,0x7c,0xc3,0x3f,0x76,0x39 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ CODE_PATH* rgelt, + /+[in, out]+/ ULONG *pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumCodePaths2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugModules2 +const GUID IID_IEnumDebugModules2 = IEnumDebugModules2.iid; + +interface IEnumDebugModules2 : IUnknown +{ + static const GUID iid = { 0x4c4a2835,0x682e,0x4ce1,[ 0xae,0xbc,0x1e,0x6b,0x3a,0x16,0x5b,0x44 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugModule2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugModules2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugPortSuppliers2 +const GUID IID_IEnumDebugPortSuppliers2 = IEnumDebugPortSuppliers2.iid; + +interface IEnumDebugPortSuppliers2 : IUnknown +{ + static const GUID iid = { 0x59c9dc99,0x3eff,0x4ff3,[ 0xb2,0x01,0x98,0xac,0xd0,0x1b,0x0d,0x87 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugPortSupplier2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugPortSuppliers2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugPorts2 +const GUID IID_IEnumDebugPorts2 = IEnumDebugPorts2.iid; + +interface IEnumDebugPorts2 : IUnknown +{ + static const GUID iid = { 0xbc827c5e,0x99ae,0x4ac8,[ 0x83,0xad,0x2e,0xa5,0xc2,0x03,0x43,0x33 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugPort2 * rgelt, + /+[in, out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugPorts2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugPropertyInfo2 +const GUID IID_IEnumDebugPropertyInfo2 = IEnumDebugPropertyInfo2.iid; + +interface IEnumDebugPropertyInfo2 : IUnknown +{ + static const GUID iid = { 0x6c7072c3,0x3ac4,0x408f,[ 0xa6,0x80,0xfc,0x5a,0x2f,0x96,0x90,0x3e ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ DEBUG_PROPERTY_INFO* rgelt, + /+[out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugPropertyInfo2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IEnumDebugReferenceInfo2 +const GUID IID_IEnumDebugReferenceInfo2 = IEnumDebugReferenceInfo2.iid; + +interface IEnumDebugReferenceInfo2 : IUnknown +{ + static const GUID iid = { 0xe459dd12,0x864f,0x4aaa,[ 0xab,0xc1,0xdc,0xec,0xbc,0x26,0x7f,0x04 ] }; + HRESULT Next( + in ULONG celt, + /+[out, size_is(celt), length_is(*pceltFetched)]+/ DEBUG_REFERENCE_INFO* rgelt, + /+[out]+/ ULONG* pceltFetched); + + HRESULT Skip( + in ULONG celt); + + HRESULT Reset(); + + HRESULT Clone( + /+[out]+/ IEnumDebugReferenceInfo2 * ppEnum); + + HRESULT GetCount( + /+[out]+/ ULONG* pcelt); +}; + +// ------------------------------------------------------------------ +// IDebugProcessQueryProperties +// Extension interface implemented by IDebugProcess2 implementors. +// Enable querying the information about the execution environment +// of a process. +// +const GUID IID_IDebugProcessQueryProperties = IDebugProcessQueryProperties.iid; + +interface IDebugProcessQueryProperties : IUnknown +{ + static const GUID iid = { 0x230A0071,0x62EF,0x4cae,[ 0xAA,0xC0,0x89,0x88,0xC3,0x70,0x24,0xBF ] }; + + HRESULT QueryProperty( + in PROCESS_PROPERTY_TYPE dwPropType, + /+[out]+/ VARIANT *pvarPropValue); + + HRESULT QueryProperties( + in ULONG celt, + /+[ size_is (celt)]+/ in PROCESS_PROPERTY_TYPE *rgdwPropTypes, + /+[out, size_is(celt)]+/ VARIANT *rgtPropValues); +} +enum /+ enum_PROCESS_PROPERTY_TYPE+/ : DWORD +{ + // Return the command line as a VT_BSTR + PROCESS_PROPERTY_COMMAND_LINE = 1, + + // Return the current directory as a VT_BSTR + PROCESS_PROPERTY_CURRENT_DIRECTORY = 2, + + // Return the environment variavles as a VT_BSTR. + // The format is: + // NAME1=VALUE1'\0' + // NAME2=VALUE2'\0' + // ... + // '\0' + PROCESS_PROPERTY_ENVIRONMENT_VARIABLES = 3 +} +alias DWORD enum_PROCESS_PROPERTY_TYPE; +alias DWORD PROCESS_PROPERTY_TYPE;; + +// ------------------------------------------------------------------ +// IDebugRemoteServer2 -- interface to an instance of msvsmon +const GUID IID_IDebugRemoteServer2 = IDebugRemoteServer2.iid; + +interface IDebugRemoteServer2 : IUnknown +{ + static const GUID iid = { 0x3d3ce5c4,0x1508,0x4711,[ 0xa5,0xeb,0xf8,0x48,0xf6,0xe1,0x00,0x72 ] }; + + HRESULT GetRemoteServerName( + /+[out]+/ BSTR *pbstrName); + + HRESULT GetRemoteComputerInfo( + /+[out]+/ COMPUTER_INFO * pInfo + ); + + HRESULT EnumRemoteProcesses( + /+[out]+/ ENUMERATED_PROCESS_ARRAY * pProcessArray + ); + + HRESULT GetRemoteProcessInfo( + in DWORD dwProcessId, + in REMOTE_PROCESS_INFO_FIELDS Fields, + /+[out]+/ REMOTE_PROCESS_INFO *pInfo + ); + + HRESULT CreateRemoteInstance( + /+[ ptr]+/ in LPCWSTR szDll, + in WORD wLangId, + in CLSID* clsidObject, + in IID* riid, + /+[out, iid_is(riid)]+/ void **ppvObject); + + HRESULT WatchForRemoteProcessDestroy( + /+[in]+/ IDebugPortEvents2 pCallback, + /+[in]+/ IDebugProcess2 pProcess, + /+[out]+/ WATCH_COOKIE *pWatchCookie); + + HRESULT CloseRemoteWatchCookie( + in WATCH_COOKIE WatchCookie + ); + + HRESULT TerminateRemoteProcess( + in DWORD dwProcessId + ); + + HRESULT LaunchRemoteProcess( + in PROCESS_LAUNCH_INFO LaunchInfo, + /+[out]+/ DWORD * pdwProcessId, + /+[out]+/ RESUME_COOKIE * pResumeCookie); + + HRESULT CloseRemoteResumeCookie( + in RESUME_COOKIE ResumeCookie); + + HRESULT DiagnoseRemoteWebDebuggingError( + /+[ptr]+/ in LPCWSTR szUrl); +} +enum /+ enum_ENUMERATED_PROCESS_FLAGS+/ : DWORD +{ + EPFLAG_SHOW_SECURITY_WARNING = 0x01, + EPFLAG_SYSTEM_PROCESS = 0x02 +} +alias DWORD enum_ENUMERATED_PROCESS_FLAGS; +alias DWORD ENUMERATED_PROCESS_FLAGS; +enum /+ enum_REMOTE_PROCESS_FLAGS+/ : DWORD +{ + // ENUMERATED_PROCESS_FLAGS can also be passed here + + RPFLAG_DEBUGGER_ATTACH = 0x100, + RPFLAG_SQL_LOADED = 0x200, + RPFLAG_CLR_LOADED = 0x400, + RPFLAG_PROCESS_WOW64 = 0x800, +} +alias DWORD enum_REMOTE_PROCESS_FLAGS; +alias DWORD REMOTE_PROCESS_FLAGS; +enum /+ enum_REMOTE_PROCESS_INFO_FIELDS+/ : DWORD +{ + RPIF_TITLE = 0x01, + RPIF_MODULE_PATH = 0x02, + RPIF_COMMAND_LINE = 0x04, + RPIF_CURRENT_DIRECTORY = 0x08, + RPIF_ENVIRONMENT_VARIABLES = 0x10, + RPIF_USER_NAME = 0x20, + RPIF_SESSION_ID = 0x40, + RPIF_ENUMERATED_FLAGS = 0x80, + RPIF_DEBUGGER_PRESENT_FLAGS = 0x100, + RPIF_PROGRAM_TYPE_FLAGS = 0x200 +} +alias DWORD enum_REMOTE_PROCESS_INFO_FIELDS; +alias DWORD REMOTE_PROCESS_INFO_FIELDS; +struct tagREMOTE_PROCESS_INFO +{ + REMOTE_PROCESS_INFO_FIELDS Fields; + BSTR bstrTitle; + BSTR bstrModulePath; + BSTR bstrCommandLine; + BSTR bstrCurrentDirectory; + BSTR bstrEnvironmentVariables; + BSTR bstrUserName; + DWORD dwSessionId; + REMOTE_PROCESS_FLAGS Flags; +} +alias tagREMOTE_PROCESS_INFO REMOTE_PROCESS_INFO; +struct tagENUMERATED_PROCESS +{ + DWORD dwProcessId; + DWORD dwSessionId; + BSTR bstrUserName; + ENUMERATED_PROCESS_FLAGS dwProcessFlags; +} +alias tagENUMERATED_PROCESS ENUMERATED_PROCESS; +struct tagENUMERATED_PROCESS_ARRAY +{ + DWORD dwCount; + /+[size_is(dwCount)]+/ ENUMERATED_PROCESS *Members; +} +alias tagENUMERATED_PROCESS_ARRAY ENUMERATED_PROCESS_ARRAY; +struct tagPROCESS_LAUNCH_INFO +{ + LPCOLESTR pszExe; + /+[ptr]+/ LPCOLESTR pszArgs; + /+[ptr]+/ LPCOLESTR pszDir; + /+[ptr]+/ BSTR bstrEnv; + BOOL fLaunchSuspended; +} +alias tagPROCESS_LAUNCH_INFO PROCESS_LAUNCH_INFO; +struct tagWATCH_COOKIE +{ + UINT64 val; +} +alias tagWATCH_COOKIE WATCH_COOKIE; +struct tagRESUME_COOKIE +{ + UINT64 val; +} +alias tagRESUME_COOKIE RESUME_COOKIE;; + +// ------------------------------------------------------------------ +// IDebugRemoteServerFactory2 - Implemented on Win9x by Msvsmon +const GUID IID_IDebugRemoteServerFactory2 = IDebugRemoteServerFactory2.iid; + +interface IDebugRemoteServerFactory2 : IUnknown +{ + static const GUID iid = { 0x4a5af829,0xca32,0x4b01,[ 0xaa,0xe4,0x4c,0x53,0xd2,0x60,0xe7,0x5c ] }; + HRESULT CreateServer( + /+[in]+/ IDebugSession2 pSession, + /+[out]+/ IDebugRemoteServer2 *ppRemoteServer + ); +}; + +// ------------------------------------------------------------------ +// IDebugProgramPublisher2 - Implemented by pdm.dll (coclass ProgramPublisher). +// This allows a script or third party program node to be published. These +// program nodes are then accessable from a debugger process using IDebugProgramProvider2 +const GUID IID_IDebugProgramPublisher2 = IDebugProgramPublisher2.iid; + +interface IDebugProgramPublisher2 : IUnknown +{ + static const GUID iid = { 0xa3dddf26,0x7792,0x4544,[ 0xa9,0xa4,0xd4,0xdf,0xb1,0x1c,0xd8,0xf3 ] }; + HRESULT PublishProgramNode( + /+[in]+/ IDebugProgramNode2 pProgramNode); + + HRESULT UnpublishProgramNode( + /+[in]+/ IDebugProgramNode2 pProgramNode); + + HRESULT PublishProgram( + in CONST_GUID_ARRAY Engines, + /+[ ptr]+/ in LPCOLESTR szFriendlyName, + /+[in]+/ IUnknown pDebuggeeInterface + ); + + HRESULT UnpublishProgram( + /+[in]+/ IUnknown pDebuggeeInterface + ); + + HRESULT SetDebuggerPresent( + in BOOL fDebuggerPresent + ); +}; + +// ------------------------------------------------------------------ +// IDebugProgramProvider2 - implemented by a 3rd party engine or by pdm.dll +// (coclass DebugProgramProvider). This allows the sdm to obtain program +// nodes for a running process. +const GUID IID_IDebugProgramProvider2 = IDebugProgramProvider2.iid; + +interface IDebugProgramProvider2 : IUnknown +{ + static const GUID iid = { 0x1959530a,0x8e53,0x4e09,[ 0xad,0x11,0x1b,0x73,0x34,0x81,0x1c,0xad ] }; + + HRESULT GetProviderProcessData( + in PROVIDER_FLAGS Flags, + /+[in]+/ IDebugDefaultPort2 pPort, + in AD_PROCESS_ID processId, + in CONST_GUID_ARRAY EngineFilter, + /+[out]+/ PROVIDER_PROCESS_DATA *pProcess); + + HRESULT GetProviderProgramNode( + in PROVIDER_FLAGS Flags, + /+[in]+/ IDebugDefaultPort2 pPort, + in AD_PROCESS_ID processId, + in GUID* guidEngine, + in UINT64 programId, + /+[out]+/ IDebugProgramNode2 *ppProgramNode); + + HRESULT WatchForProviderEvents( + in PROVIDER_FLAGS Flags, + /+[in]+/ IDebugDefaultPort2 pPort, + in AD_PROCESS_ID processId, + in CONST_GUID_ARRAY EngineFilter, + in GUID* guidLaunchingEngine, + /+[in]+/ IDebugPortNotify2 pEventCallback); + + HRESULT SetLocale( + in WORD wLangID); +} +enum /+ enum_PROVIDER_FLAGS+/ : DWORD +{ + PFLAG_NONE = 0x00, // no flags + PFLAG_REMOTE_PORT = 0x01, // asking for programs on a different machine then devenv + PFLAG_DEBUGGEE = 0x02, // the process is curently being debugged by this devenv + PFLAG_ATTACHED_TO_DEBUGGEE = 0x04, // devenv is attached to the process (didn't launch it) + PFLAG_REASON_WATCH = 0x08, // we are starting to watch for events + PFLAG_GET_PROGRAM_NODES = 0x10, // want the 'ProgramNodes' field + PFLAG_GET_IS_DEBUGGER_PRESENT = 0x20 +} +alias DWORD enum_PROVIDER_FLAGS; +alias DWORD PROVIDER_FLAGS; +enum /+ enum_PROVIDER_FIELDS+/ : DWORD +{ + PFIELD_PROGRAM_NODES = 0x01, + PFIELD_IS_DEBUGGER_PRESENT = 0x02 +} +alias DWORD enum_PROVIDER_FIELDS; +alias DWORD PROVIDER_FIELDS; +struct tagPROGRAM_NODE_ARRAY +{ + DWORD dwCount; + /+[size_is(dwCount)]+/ IDebugProgramNode2 * Members; +} +alias tagPROGRAM_NODE_ARRAY PROGRAM_NODE_ARRAY; +struct tagPROVIDER_PROCESS_DATA +{ + PROVIDER_FIELDS Fields; + PROGRAM_NODE_ARRAY ProgramNodes; + BOOL fIsDebuggerPresent; +} +alias tagPROVIDER_PROCESS_DATA PROVIDER_PROCESS_DATA;; + +// ------------------------------------------------------------------ +// IDebugProviderProgramNode2 - implemented by a 3rd party engine or by pdm.dll. +// This interface is implemented in pdm.dll in the debugger process. It allows +// an engine to retieve an interface from the program node running in the debuggee +// process. +const GUID IID_IDebugProviderProgramNode2 = IDebugProviderProgramNode2.iid; + +interface IDebugProviderProgramNode2 : IUnknown +{ + static const GUID iid = { 0xafdba726,0x047a,0x4b83,[ 0xb8,0xc7,0xd8,0x12,0xfe,0x9c,0xaa,0x5c ] }; + HRESULT UnmarshalDebuggeeInterface( + in IID* riid, + /+[out, iid_is(riid)]+/ void **ppvObject); +}; + +// IDebugFirewallConfigurationCallback2 - implemented by vsdebug, and the SDM (port object). +// This will determine if the Windows Firewall is blocking DCOM, and then take an +// appropriate action +const GUID IID_IDebugFirewallConfigurationCallback2 = IDebugFirewallConfigurationCallback2.iid; + +interface IDebugFirewallConfigurationCallback2 : IUnknown +{ + static const GUID iid = { 0xba3288db,0x224a,0x4fd6,[ 0xa3,0x7e,0x64,0xe7,0xab,0xe9,0xc4,0xa1 ] }; + // Try and configure the firewall (if neccessary) so that the debugger can + // act as a DCOM server. + // Possible return values are S_OK and E_FIREWALL_USER_CANCLED + HRESULT EnsureDCOMUnblocked(); +}; + +// This informs the UI before we do an unsafe attach. This allows the UI to prompt +// the user to decide if the attach should proceed +const GUID IID_IDebugAttachSecurityCallback2 = IDebugAttachSecurityCallback2.iid; + +interface IDebugAttachSecurityCallback2 : IUnknown +{ + static const GUID iid = { 0xa19e7faf,0xcb6f,0x43ba,[ 0xac,0x16,0xbd,0xe9,0x82,0x3d,0x6d,0xd1 ] }; + HRESULT OnUnsafeAttach(/+[in]+/ IDebugProcess2 pProcess); +}; + +// ------------------------------------------------------------------ + +version(all) /* #ifndef AD7_NO_LIB */ { +/+[ + uuid(d191c0d7-4c8b-4a15-a7b3-862dcd8daefb) +]+/ /+ library AD2Lib +/ + //import sdk.port.stdole2; + //import win32.stdole2; + + const GUID CLSID_SDMServer = SDMServer.iid; + +interface SDMServer +{ + static const GUID iid = { 0x5eb7d9f7,0xaf21,0x400e,[ 0xa2,0xc4,0x7f,0xd6,0x39,0x6f,0x86,0x41 ] }; + /+ + /+[default]+/+/ /+ interface IDebugSession2; +/ + }; + + version(pp_ifdef) /* #ifdef DEBUG */ { + alias MsMachineDebugManager_V7_DEBUG MsMachineDebugManager_V7; + alias CLSID_MsMachineDebugManager_V7_DEBUG CLSID_MsMachineDebugManager_V7; + } else { + + alias MsMachineDebugManager_V7_RETAIL MsMachineDebugManager_V7; + alias CLSID_MsMachineDebugManager_V7_RETAIL CLSID_MsMachineDebugManager_V7; + } + + const GUID CLSID_MsMachineDebugManager_V7_RETAIL = MsMachineDebugManager_V7_RETAIL.iid; + +interface MsMachineDebugManager_V7_RETAIL +{ + static const GUID iid = { 0x73b25ffd,0xf501,0x437b,[ 0x8b,0x11,0x7f,0x0d,0xe3,0x83,0x96,0x4f ] }; + /+ + /+[default]+/+/ /+ interface IDebugMachine2_V7; +/ + }; + + const GUID CLSID_MsMachineDebugManager_V7_DEBUG = MsMachineDebugManager_V7_DEBUG.iid; + +interface MsMachineDebugManager_V7_DEBUG +{ + static const GUID iid = { 0x05e1b201,0x493d,0x4678,[ 0xbb,0xcb,0x18,0xd9,0xca,0xf5,0xc0,0xa9 ] }; + /+ + /+[default]+/+/ /+ interface IDebugMachine2_V7; +/ + }; + + version(pp_ifdef) /* #ifdef DEBUG */ { + alias MDMUtilServer_V7_DEBUG MDMUtilServer_V7; + alias CLSID_MDMUtilServer_V7_DEBUG CLSID_MDMUtilServer_V7; + } else { + + alias MDMUtilServer_V7_RETAIL MDMUtilServer_V7; + alias CLSID_MDMUtilServer_V7_RETAIL CLSID_MDMUtilServer_V7; + } + + const GUID CLSID_MDMUtilServer_V7_RETAIL = MDMUtilServer_V7_RETAIL.iid; + +interface MDMUtilServer_V7_RETAIL +{ + static const GUID iid = { 0xb20e899d,0xb079,0x479d,[ 0xa4,0xdc,0x10,0xf7,0x58,0xd9,0xcd,0x9a ] }; + /+ + /+[default]+/+/ /+ interface IDebugMDMUtil2_V7; +/ + }; + + const GUID CLSID_MDMUtilServer_V7_DEBUG = MDMUtilServer_V7_DEBUG.iid; + +interface MDMUtilServer_V7_DEBUG +{ + static const GUID iid = { 0x89370a13,0x3977,0x4e7d,[ 0xae,0xa0,0x0a,0x97,0x51,0xae,0x59,0x6b ] }; + /+ + /+[default]+/+/ /+ interface IDebugMDMUtil2_V7; +/ + }; + + const GUID CLSID_ProgramPublisher = ProgramPublisher.iid; + +interface ProgramPublisher +{ + static const GUID iid = { 0xd04d550d,0x1ea8,0x4e37,[ 0x83,0x0e,0x70,0x0f,0xea,0x44,0x76,0x88 ] }; + /+ + /+[default]+/+/ /+ interface IDebugProgramPublisher2; +/ + }; + + const GUID CLSID_MsProgramProvider = MsProgramProvider.iid; + +interface MsProgramProvider +{ + static const GUID iid = { 0x170ec3fc,0x4e80,0x40ab,[ 0xa8,0x5a,0x55,0x90,0x0c,0x7c,0x70,0xde ] }; + /+ + /+[default]+/+/ /+ interface IDebugProgramProvider2; +/ + }; +; +} +