1 // File generated by idl2d from
2 //   msdbg.idl
3 //module sdk.win32.msdbg;
4 module ddebug.windows.msdbg;
5 
6 version(Windows):
7 version(USE_MAGO):
8 
9 
10 //import sdk.port.base;
11 public import win32.windows;
12 public import win32.wtypes;
13 public import win32.oaidl;
14 public import win32.ocidl;
15 public import win32.objidl;
16 public import win32.objbase;
17 //import ddebug.windows.servprov;
18 
19 // msdbg.idl : Microsoft Debug API
20 
21 // notes:
22 //
23 // - define AD7_NO_LIB to exclude library statement
24 // - define AD7_NO_ENC to exclude ENC interfaces
25 
26 //import win32.ocidl;
27 
28 //public import sdk.win32.ocidl;
29 //public import sdk.port.oleidl;
30 //public import sdk.port.basetsd; 
31  // _BASETSD_H_
32 
33 version(pp_ifdef) /* #ifdef VS_IDL_BUILD */ {
34 // Just to get rup
35 public import sdk.port.sdk_version;
36 } 
37 
38 const DWORD MSDBG_VERSION = 7126;
39 
40 // Use uuid_constant to keep the specified guid constant. This is a note that this guid must be kept constant.
41 // #define uuid_constant uuid
42 
43 // Use uuid_jdate to embed the jdate in the GUID
44 // #define uuid_jdate(first, jdate, last) uuid_constant(first-jdate-last)
45 
46 version(pp_ifdef) /* #ifdef BUILDING_DEBUGGGER_IDL_MAKEAPI */ {
47 public import sdk.port.ad7.hrc;
48 } 
49 
50 /+ interface IDebugCoreServer2; +/
51 /+ interface IDebugCoreServer3; +/
52 /+ interface IDebugPortSupplier2; +/
53 /+ interface IDebugPort2; +/
54 /+ interface IDebugPortNotify2; +/
55 /+ interface IDebugPortRequest2; +/
56 /+ interface IDebugSession2; +/
57 /+ interface IDebugSession3; +/
58 /+ interface IDebugEngine2; +/
59 /+ interface IDebugEngine3; +/
60 /+ interface IDebugEventCallback2; +/
61 /+ interface IDebugEvent2; +/
62 /+ interface IDebugProcess2; +/
63 /+ interface IDebugProgram2; +/
64 /+ interface IDebugProgramNode2; +/
65 /+ interface IDebugThread2; +/
66 /+ interface IDebugThread3; +/
67 /+ interface IDebugLogicalThread2; +/
68 /+ interface IDebugStackFrame2; +/
69 /+ interface IDebugMemoryContext2; +/
70 /+ interface IDebugCodeContext2; +/
71 /+ interface IDebugMemoryBytes2; +/
72 /+ interface IDebugDisassemblyStream2; +/
73 /+ interface IDebugDocumentContext2; +/
74 /+ interface IDebugExpressionContext2; +/
75 /+ interface IDebugBreakpointRequest2; +/
76 /+ interface IDebugBreakpointResolution2; +/
77 /+ interface IDebugBoundBreakpoint2; +/
78 /+ interface IDebugPendingBreakpoint2; +/
79 /+ interface IDebugErrorBreakpoint2; +/
80 /+ interface IDebugExpression2; +/
81 /+ interface IDebugModule2; +/
82 /+ interface IDebugModule3; +/
83 /+ interface IDebugDocument2; +/
84 /+ interface IDebugDocumentText2; +/
85 /+ interface IDebugDocumentPosition2; +/
86 /+ interface IDebugFunctionPosition2; +/
87 /+ interface IDebugDocumentTextEvents2; +/
88 /+ interface IDebugSimpleProperty2; +/
89 /+ interface IDebugMDMUtil2_V7; +/
90 /+ interface IDebugReference2; +/
91 /+ interface IDebugProperty2; +/
92 /+ interface IDebugExceptionCallback2; +/
93 /+ interface IEnumDebugProcesses2; +/
94 /+ interface IEnumDebugPrograms2; +/
95 /+ interface IEnumDebugThreads2; +/
96 /+ interface IEnumDebugStackFrames2; +/
97 /+ interface IEnumDebugCodeContexts2; +/
98 /+ interface IEnumDebugBoundBreakpoints2; +/
99 /+ interface IEnumDebugPendingBreakpoints2; +/
100 /+ interface IEnumDebugErrorBreakpoints2; +/
101 /+ interface IEnumDebugExceptionInfo2; +/
102 /+ interface IEnumDebugFrameInfo2; +/
103 /+ interface IEnumDebugFrameInfoFilter2; +/
104 /+ interface IEnumDebugMachines2__deprecated; +/
105 /+ interface IEnumCodePaths2; +/
106 /+ interface IEnumDebugModules2; +/
107 /+ interface IEnumDebugPortSuppliers2; +/
108 /+ interface IEnumDebugPorts2; +/
109 /+ interface IEnumDebugReferenceInfo2; +/
110 /+ interface IEnumDebugPropertyInfo2; +/
111 
112 /+ interface IDebugProgramPublisher2; +/
113 /+ interface IDebugProgramProvider2; +/
114 /+ interface IDebugProviderProgramNode2; +/ 
115 
116 version(pp_ifdef) /* #ifdef AD7_NO_ENC */ {
117 alias IUnknown IDebugENCUpdate;
118 } else {
119 
120 //public import ddebug.windows.enc;
121 } 
122 
123 // #define IDebugMachine2_V7 IDebugCoreServer2
124 
125 extern GUID guidVBLang;
126 extern GUID guidVBScriptLang;
127 extern GUID guidJScriptLang;
128 extern GUID guidCLang;
129 extern GUID guidCPPLang;
130 extern GUID guidSQLLang;
131 extern GUID guidScriptLang;
132 extern GUID guidSafeCLang;
133 extern GUID guidJSharpLang;
134 extern GUID guidManagedCLang;
135 extern GUID guidManagedCPPLang;
136 extern GUID guidCausalityBreakpointLang;
137 extern GUID guidFortranLang;
138 extern GUID guidMethodIdLang;
139 extern GUID guidClientScriptLang;
140 
141 extern GUID guidScriptEng;
142 extern GUID guidSQLEng;
143 extern GUID guidCOMPlusNativeEng;
144 extern GUID guidCOMPlusOnlyEng;
145 extern GUID guidNativeOnlyEng;
146 extern GUID guidMsOrclEng;
147 extern GUID guidEmbeddedCLREng;
148 extern GUID guidSQLEng2;
149 extern GUID guidCOMPlusSQLLocalEng;
150 extern GUID guidCOMPlusSQLRemoteEng;
151 extern GUID guidSilverlightEng;
152 extern GUID GUID_WorkflowDebugEngine;
153 extern GUID guidMACSilverlightEng;
154 extern GUID guidCoreSystemClrEng;
155 
156 extern GUID guidMicrosoftVendor;
157 
158 // Port suppliers
159 extern GUID guidLocalPortSupplier;
160 extern GUID guidNativePortSupplier;
161 extern GUID guidNativePipePortSupplier;
162 extern GUID guidEmbeddedCLRPortSupplier;
163 
164 // IDebugProperty2 GUID filters
165 extern GUID guidFilterLocals;
166 extern GUID guidFilterAllLocals;
167 extern GUID guidFilterArgs;
168 extern GUID guidFilterLocalsPlusArgs;
169 extern GUID guidFilterAllLocalsPlusArgs;
170 extern GUID guidFilterRegisters;
171 extern GUID guidFilterThis;
172 extern GUID guidFilterAutoRegisters;
173 
174 // GUIDs for GetExtendedInfo
175 // GUIDs for GetExtendedInfo
176 extern GUID guidDocument;
177 // TODO: remove this one once everyone implements IDebugProperty2::GetMemoryContext
178 extern GUID guidCodeContext;
179 extern GUID guidCustomViewerSupported;
180 extern GUID guidSimpleGridViewer;
181 
182 extern GUID guidExtendedInfoSlot;
183 extern GUID guidExtendedInfoSignature;
184 
185 // Document checksum algorithms
186 extern GUID guidSourceHashMD5;
187 extern GUID guidSourceHashSHA1;
188 
189 // Other GUIDs
190 extern GUID guidMDANotification;
191 
192 enum /+ enum_GETNAME_TYPE+/ : DWORD 
193 {
194 	GN_NAME,				// Gets the (as friendly as possible) name of the document or context
195 	GN_FILENAME,			// Gets the full path file name (drive+path+filename+ext or as much as possible) of the document or context
196 	GN_BASENAME,			// Gets the basename+ext part of the file name
197 	GN_MONIKERNAME,			// Gets the unique, monikerized name of the document or context
198 	GN_URL,					// Gets the URL name of the document or context
199 	GN_TITLE,				// Gets the title of the document if possible.
200 	GN_STARTPAGEURL,
201 }
202 alias DWORD enum_GETNAME_TYPE;
203 alias DWORD GETNAME_TYPE;
204 
205 enum /+ enum_TEXT_POSITION_MAX+/ : int 
206 {
207 	TEXT_POSITION_MAX_LINE		= 0xffffffff,
208 	TEXT_POSITION_MAX_COLUMN	= 0xffffffff,
209 }
210 alias int enum_TEXT_POSITION_MAX;
211 
212 struct _tagTEXT_POSITION
213 {
214 	DWORD dwLine;
215 	DWORD dwColumn;
216 }
217 alias _tagTEXT_POSITION TEXT_POSITION;
218 
219 struct tagBSTR_ARRAY
220 {
221 	DWORD dwCount;
222 	/+[size_is(dwCount)]+/ BSTR *Members;
223 }
224 alias tagBSTR_ARRAY BSTR_ARRAY;
225 
226 struct tagCONST_GUID_ARRAY
227 {
228 	DWORD dwCount;
229 	/+[size_is(dwCount)]+/ const( GUID)*Members;
230 }
231 alias tagCONST_GUID_ARRAY CONST_GUID_ARRAY;
232 
233 struct tagGUID_ARRAY
234 {
235 	DWORD dwCount;
236 	/+[size_is(dwCount)]+/ GUID *Members;
237 }
238 alias tagGUID_ARRAY GUID_ARRAY;
239 
240 // ------------------------------------------------------------------
241 // IDebugCoreServer2
242 const GUID IID_IDebugCoreServer2 = IDebugCoreServer2.iid;
243 
244 interface IDebugCoreServer2 : IUnknown
245 {
246     static const GUID iid = { 0x17bf8fa3,0x4c5a,0x49a3,[ 0xb2,0xf8,0x59,0x42,0xe1,0xea,0x28,0x7e ] };
247 
248 	HRESULT GetMachineInfo(
249 		in MACHINE_INFO_FIELDS Fields,
250 		/+[out]+/ MACHINE_INFO* pMachineInfo);
251 
252 	HRESULT GetMachineName(
253 		/+[out]+/ BSTR* pbstrName);
254 
255 	// Get a port supplier that exists on this machine
256 	HRESULT GetPortSupplier(
257 		in GUID* guidPortSupplier,
258 		/+[out]+/ IDebugPortSupplier2 * ppPortSupplier);
259 
260 	// Get a port that already exists on this machine
261 	HRESULT GetPort(
262 		in GUID* guidPort,
263 		/+[out]+/ IDebugPort2 * ppPort);
264 
265 	// Enum all the ports on this machine
266 	HRESULT EnumPorts(
267 		/+[out]+/ IEnumDebugPorts2 * ppEnum);
268 
269 	// Enum all the port suppliers on this machine
270 	HRESULT EnumPortSuppliers(
271 		/+[out]+/ IEnumDebugPortSuppliers2 * ppEnum);
272 
273 	HRESULT GetMachineUtilities_V7(
274 		/+[out]+/ IDebugMDMUtil2_V7 * ppUtil);
275 }
276 enum /+ enum_MACHINE_INFO_FLAGS+/ : DWORD 
277 {
278 		MCIFLAG_TERMINAL_SERVICES_AVAILABLE	= 0x00000001,
279 }
280 alias DWORD enum_MACHINE_INFO_FLAGS;
281 alias DWORD MACHINE_INFO_FLAGS;
282 enum /+ enum_MACHINE_INFO_FIELDS+/ : DWORD 
283 {
284 		MCIF_NAME			= 0x00000001,
285 		MCIF_FLAGS			= 0x00000002,
286 
287 		MCIF_ALL			= 0x00000003,
288 }
289 alias DWORD enum_MACHINE_INFO_FIELDS;
290 alias DWORD MACHINE_INFO_FIELDS;
291 struct tagMACHINE_INFO
292 {
293 		// Valid fields
294 		MACHINE_INFO_FIELDS	Fields;
295 		// Machine name
296 		BSTR				bstrName;
297 		// Flags
298 		MACHINE_INFO_FLAGS	Flags;
299 }
300 alias tagMACHINE_INFO MACHINE_INFO;;
301 
302 const GUID IID_IDebugCoreServer3 = IDebugCoreServer3.iid;
303 
304 interface IDebugCoreServer3 : IDebugCoreServer2
305 {
306     static const GUID iid = { 0x12c1180e,0xc257,0x4485,[ 0x98,0x00,0xaf,0x48,0x4b,0x69,0x97,0x13 ] };
307 
308 	HRESULT GetServerName(
309 		/+[out]+/ BSTR *pbstrName);
310 
311 	HRESULT GetServerFriendlyName(
312 		/+[out]+/ BSTR *pbstrName);		
313 
314 	HRESULT EnableAutoAttach(
315 		/+[ size_is (celtSpecificEngines), ptr]+/ in GUID* rgguidSpecificEngines,
316 		in DWORD celtSpecificEngines,
317 		/+[ ptr]+/ in LPCOLESTR pszStartPageUrl,
318 		/+[out]+/ BSTR* pbstrSessionId);
319 
320 	HRESULT DiagnoseWebDebuggingError(
321 		/+[ ptr]+/ in LPCWSTR pszUrl);
322 
323 	HRESULT CreateInstanceInServer(
324 		/+[ ptr]+/ in LPCWSTR szDll,
325 		in WORD wLangId,
326 		in CLSID* clsidObject,
327 		in IID* riid,
328 		/+[out, iid_is(riid)]+/ void **ppvObject);
329 
330 	HRESULT QueryIsLocal(
331 		);
332 
333 	HRESULT GetConnectionProtocol(
334 		/+[out]+/ CONNECTION_PROTOCOL *pProtocol);
335 
336 	HRESULT DisableAutoAttach(
337 		);
338 }
339 enum /+ tagCONNECTION_PROTOCOL+/
340 {
341 		CONNECTION_NONE = 0,
342 		CONNECTION_UNKNOWN = 1,
343 		CONNECTION_LOCAL = 2,
344 		CONNECTION_PIPE = 3,
345 		CONNECTION_TCPIP = 4,
346 		CONNECTION_HTTP = 5,
347 		CONNECTION_OTHER = 6
348 }
349 alias int tagCONNECTION_PROTOCOL;
350 alias int CONNECTION_PROTOCOL;;
351 
352 // ------------------------------------------------------------------
353 // IDebugMachine2_V7
354 //
355 // This interface has been renamed since more than one remote debugging
356 // host (msvsmon) can be running on a machine
357 // #define IDebugMachine2_V7 IDebugCoreServer2
358 alias IID_IDebugCoreServer2 IID_IDebugMachine2_V7;
359 
360 // ------------------------------------------------------------------
361 // IDebugMachineEx2_V7
362 // This interface was added after the Office 10 Fork
363 const GUID IID_IDebugMachineEx2_V7 = IDebugMachineEx2_V7.iid;
364 
365 interface IDebugMachineEx2_V7 : IUnknown
366 {
367     static const GUID iid = { 0xae27b230,0xa0bf,0x47ff,[ 0xa2,0xd1,0x22,0xc2,0x9a,0x17,0x8e,0xac ] };
368 	HRESULT EnableAutoAttachOnProgramCreate(
369 		in LPCWSTR pszProcessNames,   // process names seperated by semicolons ex: "foo.exe;bar.exe;bigname.exe"
370 		in GUID* guidEngine,        // auto attach when 'guidEngine' is added to the process, use GUID_NULL for 'any engine'
371 		in LPCWSTR pszSessionId,      // session id to attach to
372 		/+[out]+/ DWORD* pdwCookie);        // cookie returned that is used to call 'DisableAutoAttachOnEvent'
373 
374 	HRESULT DisableAutoAttachOnEvent(
375 		in DWORD dwCookie);
376 
377 	// Get a port supplier that exists on this machine
378 	HRESULT GetPortSupplierEx(
379 		in LPCOLESTR wstrRegistryRoot,
380 		in GUID* guidPortSupplier,
381 		/+[out]+/ IDebugPortSupplier2 * ppPortSupplier);
382 
383 	// Get a port that already exists on this machine
384 	HRESULT GetPortEx(
385 		in LPCOLESTR wstrRegistryRoot,
386 		in GUID* guidPort,
387 		/+[out]+/ IDebugPort2 * ppPort);
388 
389 	// Enum all the ports on this machine
390 	HRESULT EnumPortsEx(
391 		in LPCOLESTR wstrRegistryRoot,
392 		/+[out]+/ IEnumDebugPorts2 * ppEnum);
393 
394 	// Enum all the port suppliers on this machine
395 	HRESULT EnumPortSuppliersEx(
396 		in LPCOLESTR wstrRegistryRoot,
397 		/+[out]+/ IEnumDebugPortSuppliers2 * ppEnum);
398 };
399 
400 // --------------------------------------------------------
401 // IDebugPortSupplier2
402 
403 const GUID IID_IDebugPortSupplier2 = IDebugPortSupplier2.iid;
404 
405 interface IDebugPortSupplier2 : IUnknown
406 {
407     static const GUID iid = { 0x53f68191,0x7b2f,0x4f14,[ 0x8e,0x55,0x40,0xb1,0xb6,0xe5,0xdf,0x66 ] };
408 	HRESULT GetPortSupplierName(
409 		/+[out]+/ BSTR* pbstrName);
410 
411 	HRESULT GetPortSupplierId(
412 		/+[out]+/ GUID* pguidPortSupplier);
413 
414 	// Get a port from this port supplier
415 	HRESULT GetPort(
416 		in GUID* guidPort,
417 		/+[out]+/ IDebugPort2 * ppPort);
418 
419 	// Enum the ports that already exist
420 	HRESULT EnumPorts(
421 		/+[out]+/ IEnumDebugPorts2 * ppEnum);
422 
423 	// Does this port supplier support adding new ports? S_OK == yes; S_FALSE == no
424 	HRESULT CanAddPort();
425 
426 	// Add a port
427 	HRESULT AddPort(
428 		/+[in]+/ IDebugPortRequest2 pRequest,
429 		/+[out]+/ IDebugPort2 * ppPort);
430 
431 	// Remove a port
432 	HRESULT RemovePort(
433 		/+[in]+/ IDebugPort2 pPort);
434 };
435 
436 // --------------------------------------------------------
437 // IDebugPortSupplier3
438 const GUID IID_IDebugPortSupplier3 = IDebugPortSupplier3.iid;
439 
440 interface IDebugPortSupplier3 : IDebugPortSupplier2
441 {
442     static const GUID iid = { 0x5b5eec44,0x51aa,0x4210,[ 0xb8,0x4f,0x19,0x38,0xb8,0x57,0x6d,0x8d ] };
443 	// Can the port supplier remember new ports? S_OK == yes; S_FALSE == no
444 	HRESULT CanPersistPorts();
445 	
446 	// Enum the ports that the SDM remembered for the port supplier
447 	HRESULT EnumPersistedPorts(
448 		in BSTR_ARRAY PortNames,
449 		/+[out]+/ IEnumDebugPorts2 * ppEnum);
450 };
451 
452 // --------------------------------------------------------
453 // IDebugPortPicker
454 const GUID IID_IDebugPortPicker = IDebugPortPicker.iid;
455 
456 interface IDebugPortPicker : IUnknown
457 {
458     static const GUID iid = { 0x8d6eed60,0x2737,0x4425,[ 0xb3,0x8a,0x49,0x0e,0xf2,0x73,0xac,0xbb ] };
459 	// SetSite() will be called before any other methods are called
460 	HRESULT SetSite(/+[in]+/ IServiceProvider  pSP);
461 
462 	// Display a dialog that allows the user to select a port.
463 	// A return value of S_FALSE (or a return value of S_OK with the
464 	// BSTR set to NULL) indicates that the user canceled the dialog.
465 	HRESULT DisplayPortPicker(
466 		in HWND hwndParentDialog,
467 		/+[out]+/ BSTR* pbstrPortId);
468 };
469 
470 // --------------------------------------------------------
471 // IDebugPortSupplierDescription2
472 const GUID IID_IDebugPortSupplierDescription2 = IDebugPortSupplierDescription2.iid;
473 
474 interface IDebugPortSupplierDescription2 : IUnknown
475 {
476     static const GUID iid = { 0xd0785faa,0x91d7,0x4ca2,[ 0xa3,0x02,0x65,0x55,0x48,0x77,0x19,0xf7 ] };
477 
478 	// Get an extended description of the port supplier
479 	HRESULT GetDescription(
480 		/+[out]+/ PORT_SUPPLIER_DESCRIPTION_FLAGS *pdwFlags,
481 		/+[out]+/ BSTR *pbstrText
482 		);
483 }
484 enum /+ enum_PORT_SUPPLIER_DESCRIPTION_FLAGS+/ : DWORD 
485 {
486 		PSDFLAG_SHOW_WARNING_ICON	= 0x00000001
487 }
488 alias DWORD enum_PORT_SUPPLIER_DESCRIPTION_FLAGS;
489 alias DWORD PORT_SUPPLIER_DESCRIPTION_FLAGS;;
490 
491 // --------------------------------------------------------
492 // IDebugPort2
493 
494 const GUID IID_IDebugPort2 = IDebugPort2.iid;
495 
496 interface IDebugPort2 : IUnknown
497 {
498     static const GUID iid = { 0x79293cc8,0xd9d9,0x43f5,[ 0x97,0xad,0x0b,0xcc,0x5a,0x68,0x87,0x76 ] };
499 
500 	HRESULT GetPortName(
501 		/+[out]+/ BSTR* pbstrName);
502 
503 	HRESULT GetPortId(
504 		/+[out]+/ GUID* pguidPort);
505 
506 	// Get the request used to create this port (if available)
507 	HRESULT GetPortRequest(
508 		/+[out]+/ IDebugPortRequest2 * ppRequest);
509 
510 	// Get the port supplier that supplied this port
511 	HRESULT GetPortSupplier(
512 		/+[out]+/ IDebugPortSupplier2 * ppSupplier);
513 
514 	// Get an IDebugProcess2 for a PID running on this port
515 	HRESULT GetProcess(
516 		in AD_PROCESS_ID ProcessId,
517 		/+[out]+/ IDebugProcess2 * ppProcess);
518 
519 	// Enum all the processes running on this port
520 	HRESULT EnumProcesses(
521 		/+[out]+/ IEnumDebugProcesses2 * ppEnum);
522 }
523 enum /+ enum_AD_PROCESS_ID+/ : DWORD 
524 {
525 		AD_PROCESS_ID_SYSTEM,
526 		AD_PROCESS_ID_GUID
527 }
528 alias DWORD enum_AD_PROCESS_ID;
529 alias DWORD AD_PROCESS_ID_TYPE;
530 union AD_PROCESS_ID /+switch(AD_PROCESS_ID_TYPE ProcessIdType) ProcessId +/ {
531 		/+[case AD_PROCESS_ID_SYSTEM:]+/
532 			DWORD dwProcessId;
533 		/+[case AD_PROCESS_ID_GUID:]+/
534 			GUID guidProcessId;
535 		/+[default:]+/
536 			DWORD dwUnused; };;
537 
538 // --------------------------------------------------------
539 // IDebugDefaultPort2
540 
541 const GUID IID_IDebugDefaultPort2 = IDebugDefaultPort2.iid;
542 
543 interface IDebugDefaultPort2 : IDebugPort2
544 {
545     static const GUID iid = { 0x302f0f55,0x1ede,0x4777,[ 0x9b,0x38,0x11,0x5e,0x1f,0x22,0x9d,0x56 ] };
546 	HRESULT GetPortNotify(
547 		/+[out]+/ IDebugPortNotify2 *ppPortNotify);
548 
549 	HRESULT GetServer(
550 		/+[out]+/ IDebugCoreServer3 *ppServer);
551 
552 	HRESULT QueryIsLocal(
553 		);
554 };
555 
556 // --------------------------------------------------------
557 // IDebugWindowsComputerPort2
558 
559 const GUID IID_IDebugWindowsComputerPort2 = IDebugWindowsComputerPort2.iid;
560 
561 interface IDebugWindowsComputerPort2 : IUnknown
562 {
563     static const GUID iid = { 0x5fbb8ed3,0xecdb,0x412a,[ 0xbf,0xa3,0x3a,0x54,0xbe,0xb5,0xb2,0xd1 ] };
564 
565 	HRESULT GetComputerInfo(
566 		/+[out]+/ COMPUTER_INFO * pInfo);
567 }
568 struct tagCOMPUTER_INFO
569 {
570 		// PROCESSOR_ARCHITECTURE_INTEL (0), PROCESSOR_ARCHITECTURE_IA64 (6), or PROCESSOR_ARCHITECTURE_AMD64 (9)
571 		WORD wProcessorArchitecture; 
572 		// See MSDN. Important value is VER_SUITE_TERMINAL
573 		WORD wSuiteMask;
574 		// { platform id -- 1 for 9x, 2 for NT, major version, minor version, service pack major }
575 		DWORD dwOperatingSystemVersion;
576 }
577 alias tagCOMPUTER_INFO COMPUTER_INFO;;
578 
579 // --------------------------------------------------------
580 // IDebugPortRequest2
581 const GUID IID_IDebugPortRequest2 = IDebugPortRequest2.iid;
582 
583 interface IDebugPortRequest2 : IUnknown
584 {
585     static const GUID iid = { 0x8d36beb8,0x9bfe,0x47dd,[ 0xa1,0x1b,0x7b,0xa1,0xde,0x18,0xe4,0x49 ] };
586 	HRESULT GetPortName(
587 		/+[out]+/ BSTR* pbstrPortName);
588 };
589 
590 // ------------------------------------------------------------------
591 // IDebugPortNotify2
592 const GUID IID_IDebugPortNotify2 = IDebugPortNotify2.iid;
593 
594 interface IDebugPortNotify2 : IUnknown
595 {
596     static const GUID iid = { 0xfb8d2032,0x2858,0x414c,[ 0x83,0xd9,0xf7,0x32,0x66,0x4e,0x0c,0x7a ] };
597 	HRESULT AddProgramNode(
598 		/+[in]+/ IDebugProgramNode2 pProgramNode);
599 
600 	HRESULT RemoveProgramNode(
601 		/+[in]+/ IDebugProgramNode2 pProgramNode);
602 };
603 
604 // ------------------------------------------------------------------
605 // IDebugPortEvents2
606 const GUID IID_IDebugPortEvents2 = IDebugPortEvents2.iid;
607 
608 interface IDebugPortEvents2 : IUnknown
609 {
610     static const GUID iid = { 0x564fa275,0x12e1,0x4b5f,[ 0x83,0x16,0x4d,0x79,0xbc,0xef,0x72,0x46 ] };
611 	HRESULT Event(
612 		/+[in]+/ IDebugCoreServer2 pServer,
613 		/+[in]+/ IDebugPort2 pPort,
614 		/+[in]+/ IDebugProcess2 pProcess,
615 		/+[in]+/ IDebugProgram2 pProgram,
616 		/+[in]+/ IDebugEvent2 pEvent,
617 		in IID* riidEvent);
618 };
619 
620 // ------------------------------------------------------------------
621 // IDebugMDMUtil2_V7
622 const GUID IID_IDebugMDMUtil2_V7 = IDebugMDMUtil2_V7.iid;
623 
624 interface IDebugMDMUtil2_V7 : IUnknown
625 {
626     static const GUID iid = { 0xf3062547,0x43d8,0x4dc2,[ 0xb1,0x8e,0xe1,0x46,0x0f,0xf2,0xc4,0x22 ] };
627 	// For the following methods guidEngine specifies the debug engine the
628 	// call applies to. Use GUID_NULL to specify all engines.
629 
630 	// Add or remove a process that the VM should NOT ever debug
631 	// (i.e. DON'T use the debugger interpreter loop for a specified process).
632 	HRESULT AddPIDToIgnore(
633 		in GUID* guidEngine,
634 		in DWORD dwPid);
635 	HRESULT RemovePIDToIgnore(
636 		in GUID* guidEngine,
637 		in DWORD dwPid);
638 
639 	// Add or remove a process that the VM should debug
640 	// (i.e. DO use the debugger interpreter loop for a specified process).
641 	HRESULT AddPIDToDebug(
642 		in GUID* guidEngine,
643 		in DWORD dwPid);
644 	HRESULT RemovePIDToDebug(
645 		in GUID* guidEngine,
646 		in DWORD dwPid);
647 
648     alias DWORD DYNDEBUGFLAGS;
649 	enum /+ enum_DYNDEBUGFLAGS+/ : int 
650 {
651 		DYNDEBUG_ATTACH	   = 1,
652 		DYNDEBUG_JIT	   = 2,
653         DYNDEBUG_REMOTEJIT = 4
654 }
655 alias int enum_DYNDEBUGFLAGS;
656 
657     // Access to dynamic debugging flags (JIT, attach, ...).
658     // Settings are  on a per Engine basis for the entire machine.
659 	// Users of these two APIs should always call GetDynamicDebuggingFlags,
660 	//   set or clear specific bits, then call SetDynamicDebuggingFlags
661     HRESULT SetDynamicDebuggingFlags(
662         in GUID* guidEngine,
663         in DYNDEBUGFLAGS dwFlags);
664     HRESULT GetDynamicDebuggingFlags(
665         in GUID* guidEngine,
666         /+[out]+/ DYNDEBUGFLAGS *pdwFlags);
667 
668 	// Set the clsid as the default JIT Server
669     HRESULT SetDefaultJITServer(
670         in CLSID* clsidJITServer);
671     // Retrieve the default JIT Server (CLSID_NULL if there isn't one)
672     HRESULT GetDefaultJITServer(
673         /+[out]+/ CLSID *pClsidJITServer);
674     // Register debug engines for a JIT debugger.
675     // arrRemoteFlags may be NULL if remote JIT is not supported for any engine.
676     // arrguidEngines and arrRemoteFlags are ignored if fRegister is FALSE.
677     HRESULT RegisterJITDebugEngines(
678         in CLSID* clsidJITServer,
679         /+[size_is (celtEngs)]+/ in GUID *arrguidEngines,
680         /+[ptr ,size_is(celtEngs)]+/ in BOOL *arrRemoteFlags,
681         in DWORD celtEngs,
682         in BOOL fRegister);
683 
684     enum DWORD S_UNKNOWN = 0x3;
685 
686 	// Should the VM use the debugger loop for this pid?
687 	HRESULT CanDebugPID(
688 		in GUID* guidEngine,
689 		in DWORD pid);
690 }
691 
692 const GUID IID_IDebugMDMUtil3_V7 = IDebugMDMUtil3_V7.iid;
693 
694 interface IDebugMDMUtil3_V7 : IDebugMDMUtil2_V7
695 {
696     static const GUID iid = { 0xaf598dea,0xce92,0x443b,[ 0xa0,0xb5,0x99,0x92,0xff,0x66,0x0b,0xc4 ] };
697 
698 	HRESULT DiagnoseScriptDebuggingError(
699 		in DWORD dwDebuggeeProcessId);
700 
701 	HRESULT DiagnoseWebDebuggingError(
702 		in WEB_DEBUG_TYPE dwWebType,
703 		/+[ ptr]+/ in LPCWSTR pszUrl);
704 
705 	HRESULT DiagnoseASPDebugging(
706 		/+[ ptr]+/ in LPCWSTR szASPUserAccount
707 		);
708 }
709 enum
710 	{
711 		WEB_DEBUG_ASP_NET				= 0x0001,
712 	};
713 alias DWORD WEB_DEBUG_TYPE;;
714 
715 // ------------------------------------------------------------------
716 // IDebugSession2
717 const GUID IID_IDebugSession2 = IDebugSession2.iid;
718 
719 // avoid using enc
720 interface IDebugENCUpdate : IUnknown {
721 }
722 
723 interface IDebugSession2 : IUnknown
724 {
725     static const GUID iid = { 0x8948300f,0x8bd5,0x4728,[ 0xa1,0xd8,0x83,0xd1,0x72,0x29,0x5a,0x9d ] };
726 
727     HRESULT GetName(
728 		/+[out]+/ BSTR* pbstrName);
729 
730 	HRESULT SetName(
731 		in LPCOLESTR pszName);
732 
733 	HRESULT EnumProcesses(
734 		/+[out]+/ IEnumDebugProcesses2 * ppEnum);
735 
736 	HRESULT Launch(
737 		/+[ ptr]+/ in LPCOLESTR pszMachine,
738 		/+[in]+/ IDebugPort2 pPort,
739 		/+[ ptr]+/ in LPCOLESTR pszExe,
740 		/+[ ptr]+/ in LPCOLESTR pszArgs,
741 		/+[ ptr]+/ in LPCOLESTR pszDir,
742 		/+[ ptr]+/ in BSTR bstrEnv,
743 		/+[ ptr]+/ in LPCOLESTR pszOptions,
744 		in LAUNCH_FLAGS dwLaunchFlags,
745 		in DWORD hStdInput,
746 		in DWORD hStdOutput,
747 		in DWORD hStdError,
748 		in GUID* guidLaunchingEngine,
749 		/+[in]+/ IDebugEventCallback2 pCallback,
750 		/+[ size_is (celtSpecificEngines)]+/ in GUID* rgguidSpecificEngines,
751 		in DWORD celtSpecificEngines,
752 		/+[out]+/ IDebugProcess2 * ppProcess);
753 
754 	HRESULT RegisterJITServer(
755 		in CLSID* clsidJITServer);
756 
757 	HRESULT Terminate(
758 		in BOOL fForce);
759 
760 	HRESULT Detach();
761 
762 	HRESULT CauseBreak();
763 
764 	HRESULT CreatePendingBreakpoint(
765 		/+[in]+/ IDebugBreakpointRequest2 pBPRequest,
766 		/+[out]+/ IDebugPendingBreakpoint2 * ppPendingBP);
767 
768 	HRESULT EnumPendingBreakpoints(
769 		/+[in]+/ IDebugProgram2 pProgram,
770 		/+[ ptr]+/ in LPCOLESTR pszProgram,
771 		/+[out]+/ IEnumDebugPendingBreakpoints2 * ppEnumBPs);
772 
773 	HRESULT EnumMachines__deprecated(
774 		/+[out]+/ IEnumDebugMachines2__deprecated * ppEnum);
775 
776 	HRESULT ConnectToServer(
777 		/+[ ptr]+/ in LPCOLESTR szServerName,
778 		/+[out]+/ IDebugCoreServer2 * ppServer);
779 
780 	HRESULT DisconnectServer(
781 		/+[in]+/ IDebugCoreServer2 pServer);
782 
783 	HRESULT ShutdownSession();
784 
785     HRESULT EnumCodeContexts(
786 		/+[in]+/ IDebugProgram2 pProgram,
787         /+[in]+/ IDebugDocumentPosition2 pDocPos,
788         /+[out]+/ IEnumDebugCodeContexts2 *ppEnum);
789 
790 	HRESULT SetException(
791 		in EXCEPTION_INFO* pException);
792 
793     HRESULT EnumSetExceptions(
794 		/+[in]+/ IDebugProgram2 pProgram,
795 		/+[ ptr]+/ in LPCOLESTR pszProgram,
796 		// Either guidLang or guidEng
797 		in GUID* guidType,
798         /+[out]+/ IEnumDebugExceptionInfo2 * ppEnum);
799 
800 	HRESULT RemoveSetException(
801 		in EXCEPTION_INFO* pException);
802 
803 	HRESULT RemoveAllSetExceptions(
804 		// Either guidLang or guidEng
805 		in GUID* guidType);
806 
807 	// The top-level default exceptions are pseudo-exceptions that describe the
808 	// default exception handling behavior for a given language or runtime architecture.
809 	// Example: "C++": EXCEPTION_STOP_SECOND_CHANCE
810 	// EXCEPTION_STOP_FIRST_CHANCE_USE_PARENT and EXCEPTION_STOP_SECOND_CHANCE_USE_PARENT
811 	// are invalid for these top-level pseudo-exceptions.
812 	HRESULT EnumDefaultExceptions(
813 		/+[ ptr]+/ in EXCEPTION_INFO* pParentException,
814 		/+[out]+/ IEnumDebugExceptionInfo2 * ppEnum);
815 
816 	HRESULT GetENCUpdate(
817 		/+[in]+/ IDebugProgram2 pProgram,
818 		/+[out]+/ IDebugENCUpdate** ppUpdate);
819 
820     HRESULT SetLocale(
821         in WORD wLangID);
822 
823 	HRESULT SetRegistryRoot(
824 		/+[ ptr]+/ in LPCOLESTR pszRegistryRoot);
825 
826 	HRESULT IsAlive();
827 
828     HRESULT ClearAllSessionThreadStackFrames();
829 
830 	HRESULT __deprecated_GetSessionId(
831 		/+[in]+/ IDebugEventCallback2 pCallback,
832 		/+[ size_is (celtSpecificEngines), ptr]+/ in GUID* rgguidSpecificEngines,
833 		in DWORD celtSpecificEngines,
834 		/+[ ptr]+/ in LPCOLESTR pszStartPageUrl,
835 		/+[out]+/ BSTR* pbstrSessionId);
836 
837 	HRESULT SetEngineMetric(
838 		in GUID* guidEngine,
839 		in LPCOLESTR pszMetric,
840 		in VARIANT varValue);
841 
842 	HRESULT SetStoppingModel(
843 		in STOPPING_MODEL dwStoppingModel);
844 
845 	HRESULT GetStoppingModel(
846 		/+[out]+/ STOPPING_MODEL* pdwStoppingModel);
847 
848 	HRESULT __deprecated_RegisterSessionWithServer(
849 		in LPCOLESTR pwszServerName);
850 }
851 enum /+ enum_LAUNCH_FLAGS+/ : DWORD 
852 {
853 		// Launch the process for debugging
854 		LAUNCH_DEBUG			= 0x0000,
855 		// Launch the process without debugging it
856 		LAUNCH_NODEBUG			= 0x0001,
857         // Launch the process with EnC enabled.
858         LAUNCH_ENABLE_ENC       = 0x0002,
859         // Launch the process and merge the environment
860         LAUNCH_MERGE_ENV        = 0x0004
861 }
862 alias DWORD enum_LAUNCH_FLAGS;
863 alias DWORD LAUNCH_FLAGS;
864 enum /+ enum_EXCEPTION_STATE+/ : DWORD 
865 {
866 		EXCEPTION_NONE								= 0x0000,
867 		EXCEPTION_STOP_FIRST_CHANCE					= 0x0001,
868 		EXCEPTION_STOP_SECOND_CHANCE				= 0x0002,
869 		EXCEPTION_STOP_USER_FIRST_CHANCE            = 0x0010,
870 		EXCEPTION_STOP_USER_UNCAUGHT                = 0x0020,
871 
872 		// These are no longer used:
873 		EXCEPTION_STOP_FIRST_CHANCE_USE_PARENT		= 0x0004,
874 		EXCEPTION_STOP_SECOND_CHANCE_USE_PARENT		= 0x0008,
875 		EXCEPTION_STOP_USER_FIRST_CHANCE_USE_PARENT = 0x0040,
876 		EXCEPTION_STOP_USER_UNCAUGHT_USE_PARENT     = 0x0080,
877 
878 		EXCEPTION_STOP_ALL                          = 0x00FF,
879 
880 		EXCEPTION_CANNOT_BE_CONTINUED				= 0x0100,
881 
882 		// the following flags are for exception types only
883 		EXCEPTION_CODE_SUPPORTED                    = 0x1000,
884 		EXCEPTION_CODE_DISPLAY_IN_HEX               = 0x2000,
885 		EXCEPTION_JUST_MY_CODE_SUPPORTED            = 0x4000,
886         EXCEPTION_MANAGED_DEBUG_ASSISTANT           = 0x8000,
887 }
888 alias DWORD enum_EXCEPTION_STATE;
889 alias DWORD EXCEPTION_STATE;
890 struct tagEXCEPTION_INFO
891 {
892 		IDebugProgram2 pProgram;
893 		BSTR bstrProgramName;
894 		BSTR bstrExceptionName;
895 		DWORD dwCode;
896 		EXCEPTION_STATE dwState;
897 		// Either guidLang or guidEng
898 		GUID guidType;
899 }
900 alias tagEXCEPTION_INFO EXCEPTION_INFO;
901 enum /+ enum_STOPPING_MODEL+/ : DWORD 
902 {
903 		STOPPING_MODEL_STOP_ALL	= 0x0001,
904 		STOPPING_MODEL_STOP_ONE	= 0x0002,
905 }
906 alias DWORD enum_STOPPING_MODEL;
907 alias DWORD STOPPING_MODEL;;
908 
909 // Support for JustMyCode
910 struct _JMC_CODE_SPEC
911 {
912 	BOOL fIsUserCode;           // TRUE implies "user" code
913 	BSTR bstrModuleName;
914 }
915 alias _JMC_CODE_SPEC JMC_CODE_SPEC;
916     
917 // ------------------------------------------------------------------
918 // IDebugSession3
919 const GUID IID_IDebugSession3 = IDebugSession3.iid;
920 
921 interface IDebugSession3 : IDebugSession2
922 {
923     static const GUID iid = { 0xBBF74DB9,0x39D5,0x406e,[ 0x8B,0xC3,0x3B,0xA9,0xDD,0x34,0xC0,0x2E ] };
924 
925 	// szSymbolSearchPath uses the unicode delimiting character to seperate
926 	// search paths.
927 	HRESULT SetSymbolPath(
928 		/+[ ptr]+/ in LPCOLESTR szSymbolSearchPath,
929 		/+[ ptr]+/ in LPCOLESTR szSymbolCachePath,
930 		in LOAD_SYMBOLS_FLAGS Flags);
931 
932 	// Load symbols for all modules that do not have them Returns S_OK if at
933 	// least one module loaded symbols returns S_FALSE if no modules loaded symbols.
934 	HRESULT LoadSymbols();
935 
936 	HRESULT RegisterCallback(
937 		/+[in]+/ IDebugEventCallback2 pCallback);
938 
939 	HRESULT ConnectToServerEx(
940 		/+[ ptr]+/ in LPCOLESTR szServerName,
941 		in CONNECT_REASON ConnectReason,
942 		/+[out]+/ IDebugCoreServer3 * ppServer);
943 
944 	// Pass on the JustMyCode info to the engines
945 	HRESULT SetJustMyCodeState(
946 		in BOOL fUpdate,                                  // TRUE = update; FALSE = reset (ignore everything sent earlier)
947 		in DWORD dwModules,                               // count
948 		/+[ size_is (dwModules), ptr]+/ in JMC_CODE_SPEC* rgJMCSpec); // array of info about modules
949 
950 	// Get the most recently used server names
951 	HRESULT GetRecentServerNames(
952 		/+[out]+/ BSTR_ARRAY *pServers);
953 
954 	// Set how many server names should be remembered
955 	HRESULT SetMaxRecentServerNames(
956 		in DWORD dwNewMax);
957 
958 	HRESULT InitializeFeatures(
959 		in SESSION_FEATURES EnabledFeatures
960 		);
961 
962 	HRESULT SetAllExceptions(
963 		in EXCEPTION_STATE dwState
964 		);
965 
966 	// return E_FAIL if we are breaking on specific exceptions
967 	HRESULT GetStateForAllExceptions(
968 		/+[out]+/ EXCEPTION_STATE *pdwState
969 		);
970 
971 	HRESULT AddExceptionCallback(
972 		in EXCEPTION_INFO* pException,
973 		/+[in]+/ IDebugExceptionCallback2 pCallback
974 		);
975 
976 	HRESULT RemoveExceptionCallback(
977 		in EXCEPTION_INFO* pException,
978 		/+[in]+/ IDebugExceptionCallback2 pCallback
979 		);
980 
981 	HRESULT BlockingShutdownSession(
982 		in DWORD dwTimeout
983 		);
984 }
985 enum
986 {
987 		CONNECT_LOCAL,
988 		CONNECT_ATTACH,
989 		CONNECT_LAUNCH,
990 		CONNECT_WEB_AUTO_ATTACH,
991 		CONNECT_SQL_AUTO_ATTACH,
992 		CONNECT_CAUSALITY,
993 		CONNECT_DIAGNOSE_WEB_ERROR
994 }
995 alias int CONNECT_REASON;
996 enum /+ enum_SESSION_FEATURES+/ : DWORD 
997 {
998 		FEATURE_REMOTE_DEBUGGING = 0x1,
999 		FEATURE_CAUSALITY = 0x2
1000 }
1001 alias DWORD enum_SESSION_FEATURES;
1002 alias DWORD SESSION_FEATURES;
1003 alias DWORD LOAD_SYMBOLS_FLAGS;;
1004 
1005 // ------------------------------------------------------------------
1006 // IDebugEngine2
1007 const GUID IID_IDebugEngine2 = IDebugEngine2.iid;
1008 
1009 interface IDebugEngine2 : IUnknown
1010 {
1011     static const GUID iid = { 0xba105b52,0x12f1,0x4038,[ 0xae,0x64,0xd9,0x57,0x85,0x87,0x4c,0x47 ] };
1012 
1013 	HRESULT EnumPrograms(
1014 		/+[out]+/ IEnumDebugPrograms2 * ppEnum);
1015 
1016 	HRESULT Attach(
1017 		/+[ size_is (celtPrograms), length_is(celtPrograms)]+/ /+[in]+/ IDebugProgram2 * rgpPrograms,
1018 		/+[ size_is (celtPrograms), length_is(celtPrograms)]+/ /+[in]+/ IDebugProgramNode2 * rgpProgramNodes,
1019 		in DWORD celtPrograms,
1020 		/+[in]+/ IDebugEventCallback2 pCallback,
1021 		in ATTACH_REASON dwReason);
1022 
1023 	HRESULT CreatePendingBreakpoint(
1024 		/+[in]+/ IDebugBreakpointRequest2 pBPRequest,
1025 		/+[out]+/ IDebugPendingBreakpoint2 * ppPendingBP);
1026 
1027 	HRESULT SetException(
1028 		in EXCEPTION_INFO* pException);
1029 
1030 	HRESULT RemoveSetException(
1031 		in EXCEPTION_INFO* pException);
1032 
1033 	HRESULT RemoveAllSetExceptions(
1034 		// Either guidlang or guidEng
1035 		in GUID* guidType);
1036 
1037 	HRESULT GetEngineId(
1038 		/+[out]+/ GUID *pguidEngine);
1039 
1040 	HRESULT DestroyProgram(
1041 		/+[in]+/ IDebugProgram2 pProgram);
1042 
1043 	HRESULT ContinueFromSynchronousEvent(
1044 		/+[in]+/ IDebugEvent2 pEvent);
1045 
1046 	HRESULT SetLocale(
1047 		in WORD wLangID);
1048 
1049 	HRESULT SetRegistryRoot(
1050 		/+[ ptr]+/ in LPCOLESTR pszRegistryRoot);
1051 
1052 	HRESULT SetMetric(
1053 		in LPCOLESTR pszMetric,
1054 		in VARIANT varValue);
1055 
1056 	// These methods were added after the Office fork
1057 	HRESULT CauseBreak();
1058 }
1059 enum /+ enum_ATTACH_REASON+/ : DWORD 
1060 {
1061 		// Attaching because we launched the process
1062 		// (prog create and thread create can be stopping events; send entry point, not attach complete)
1063 		ATTACH_REASON_LAUNCH	= 0x0001,
1064 		// Attaching because the user requested an attach
1065 		// (prog create and thread create cannot be stopping events; send attach complete)
1066 		ATTACH_REASON_USER		= 0x0002,
1067 		// Attaching because we're already debugging the process
1068 		// (prog create and thread create can be stopping events; send attach complete)
1069 		ATTACH_REASON_AUTO		= 0x0003,
1070 }
1071 alias DWORD enum_ATTACH_REASON;
1072 alias DWORD ATTACH_REASON;;
1073 
1074 // ------------------------------------------------------------------
1075 // IDebugEngineLaunch2
1076 const GUID IID_IDebugEngineLaunch2 = IDebugEngineLaunch2.iid;
1077 
1078 interface IDebugEngineLaunch2 : IUnknown
1079 {
1080     static const GUID iid = { 0xc7c1462f,0x9736,0x466c,[ 0xb2,0xc1,0xb6,0xb2,0xde,0xdb,0xf4,0xa7 ] };
1081 	HRESULT LaunchSuspended(
1082 		/+[ ptr]+/ in LPCOLESTR pszServer,
1083 		/+[in]+/ IDebugPort2 pPort,
1084 		/+[ ptr]+/ in LPCOLESTR pszExe,
1085 		/+[ ptr]+/ in LPCOLESTR pszArgs,
1086 		/+[ ptr]+/ in LPCOLESTR pszDir,
1087 		/+[ ptr]+/ in BSTR bstrEnv,
1088 		/+[ ptr]+/ in LPCOLESTR pszOptions,
1089 		in LAUNCH_FLAGS dwLaunchFlags,
1090 		in DWORD hStdInput,
1091 		in DWORD hStdOutput,
1092 		in DWORD hStdError,
1093 		/+[in]+/ IDebugEventCallback2 pCallback,
1094 		/+[out]+/ IDebugProcess2 *ppProcess);
1095 
1096 	HRESULT ResumeProcess(
1097 	/+[in]+/ IDebugProcess2 pProcess);
1098 
1099 	HRESULT CanTerminateProcess(
1100 		/+[in]+/ IDebugProcess2 pProcess);
1101 
1102 	HRESULT TerminateProcess(
1103 		/+[in]+/ IDebugProcess2 pProcess);
1104 };
1105 
1106 // ------------------------------------------------------------------
1107 // IDebugEngine3
1108 const GUID IID_IDebugEngine3 = IDebugEngine3.iid;
1109 
1110 interface IDebugEngine3 : IDebugEngine2
1111 {
1112     static const GUID iid = { 0xA60384F6,0x3712,0x4cb3,[ 0xBC,0x46,0x81,0xE6,0x40,0x2F,0xEE,0x99 ] };
1113 	// szSymbolSearchPath uses the unicode delimiting character to seperate
1114 	// search paths.
1115 	HRESULT SetSymbolPath(
1116 		in LPCOLESTR szSymbolSearchPath,
1117 		in LPCOLESTR szSymbolCachePath,
1118 		in LOAD_SYMBOLS_FLAGS Flags);
1119 
1120 	// Load symbols for all modules that do not have any Returns S_OK if at
1121 	// least one module loaded symbols returns S_FALSE if no modules loaded symbols.
1122 	HRESULT LoadSymbols();
1123 
1124 	// Pass on the JustMyCode info to the engines
1125 	HRESULT SetJustMyCodeState(
1126 		in BOOL fUpdate,                                      // TRUE = update; FALSE = reset (ignore everything sent earlier)
1127 		in DWORD dwModules,                                   // count
1128 		/+[ size_is (dwModules), ptr]+/ in JMC_CODE_SPEC* rgJMCSpec); // array of info about modules
1129 
1130 	// Pass the guid of the engine from the METRICs.
1131 	HRESULT SetEngineGuid(
1132 		in GUID *guidEngine);
1133 
1134 	HRESULT SetAllExceptions(
1135 		in EXCEPTION_STATE dwState);
1136 }
1137 
1138 // ------------------------------------------------------------------
1139 // IDebugEventCallback2
1140 const GUID IID_IDebugEventCallback2 = IDebugEventCallback2.iid;
1141 
1142 interface IDebugEventCallback2 : IUnknown
1143 {
1144     static const GUID iid = { 0xade2eeb9,0xfc85,0x4f5b,[ 0xb5,0xd9,0xd4,0x31,0xb4,0xaa,0xc3,0x1a ] };
1145 
1146 	HRESULT Event(
1147 		/+[in]+/ IDebugEngine2 pEngine,
1148 		/+[in]+/ IDebugProcess2 pProcess,
1149 		/+[in]+/ IDebugProgram2 pProgram,
1150 		/+[in]+/ IDebugThread2 pThread,
1151 		/+[in]+/ IDebugEvent2 pEvent,
1152 		in IID* riidEvent,
1153 		in DWORD dwAttrib);
1154 }
1155 enum /+ enum_EVENTATTRIBUTES+/ : DWORD 
1156 {
1157 		// The event is asynchronous; no reply is necessary
1158 		EVENT_ASYNCHRONOUS	= 0x0000,
1159 		// The event is synchronous; reply via IDebugEngine2::ContinueFromSynchronousEvent
1160 		EVENT_SYNCHRONOUS	= 0x0001,
1161 		// The event is stopping; reply via IDebugThread2::ContinueFromStoppingEvent
1162 		EVENT_STOPPING		= 0x0002,
1163 		EVENT_ASYNC_STOP	= 0x0002,		// (not currently supported)
1164 		EVENT_SYNC_STOP		= 0x0003,
1165 		// The event is sent immediately and synchronously to the IDE
1166 		// (even if the IDE is currently handling an event)
1167 		EVENT_IMMEDIATE		= 0x0004,
1168 		// The event is for expression evaluation
1169 		EVENT_EXPRESSION_EVALUATION = 0x0008
1170 }
1171 alias DWORD enum_EVENTATTRIBUTES;
1172 alias DWORD EVENTATTRIBUTES;;
1173 
1174 // ------------------------------------------------------------------
1175 // IDebugSettingsCallback2
1176 
1177 const GUID IID_IDebugSettingsCallback2 = IDebugSettingsCallback2.iid;
1178 
1179 interface IDebugSettingsCallback2 : IUnknown
1180 {
1181     static const GUID iid = { 0x050b1813,0x91db,0x47a0,[ 0x89,0x87,0xfc,0x55,0xbd,0xd6,0x36,0x2b ] };
1182 	HRESULT GetMetricGuid(
1183 		in LPCWSTR pszType,
1184 		in GUID* guidSection,
1185 		in LPCWSTR pszMetric,
1186 		/+[out]+/ GUID* pguidValue
1187 		);
1188 
1189 	HRESULT GetMetricDword(
1190 		in LPCWSTR pszType,
1191 		in GUID* guidSection,
1192 		in LPCWSTR pszMetric,
1193 		/+[out]+/ DWORD* pdwValue
1194 		);
1195 
1196 	HRESULT GetEEMetricString(
1197 		in GUID* guidLang,
1198 		in GUID* guidVendor,
1199 		in LPCWSTR pszMetric,
1200 		/+[out]+/ BSTR* pbstrValue
1201 		);
1202 
1203 	HRESULT GetEEMetricGuid(
1204 		in GUID* guidLang,
1205 		in GUID* guidVendor,
1206 		in LPCWSTR pszMetric,
1207 		/+[out]+/ GUID* pguidValue
1208 		);
1209 
1210 	HRESULT GetEEMetricFile(
1211 		in GUID* guidLang,
1212 		in GUID* guidVendor,
1213 		in LPCWSTR pszMetric,
1214 		/+[out]+/ BSTR* pbstrValue
1215 		);
1216 		
1217 	HRESULT EnumEEs(
1218 		in DWORD celtBuffer,
1219 		/+[in, out, ptr, size_is(celtBuffer), length_is(*pceltEEs)]+/ GUID* rgguidLang,
1220 		/+[in, out, ptr, size_is(celtBuffer), length_is(*pceltEEs)]+/ GUID* rgguidVendor,
1221 		/+[in, out]+/ DWORD* pceltEEs
1222 		);
1223 
1224     HRESULT GetEEMetricDword(
1225         in GUID* guidLang,
1226         in GUID* guidVendor,
1227         in LPCWSTR pszMetric,
1228         /+[out]+/ DWORD* pdwValue
1229         );
1230 
1231     HRESULT GetEELocalObject(
1232         in GUID* guidLang,
1233         in GUID* guidVendor,
1234         in LPCWSTR pszMetric,
1235         /+[out]+/ IUnknown * ppUnk
1236     );
1237 
1238 	HRESULT GetMetricString(
1239 		in LPCWSTR pszType,
1240 		in GUID* guidSection,
1241 		in LPCWSTR pszMetric,
1242 		/+[out]+/ BSTR* pbstrValue
1243 		);
1244 };
1245 
1246 // ------------------------------------------------------------------
1247 // IDebugEvent2
1248 const GUID IID_IDebugEvent2 = IDebugEvent2.iid;
1249 
1250 interface IDebugEvent2 : IUnknown
1251 {
1252     static const GUID iid = { 0x423238d6,0xda42,0x4989,[ 0x96,0xfb,0x6b,0xba,0x26,0xe7,0x2e,0x09 ] };
1253 	HRESULT GetAttributes(
1254 		/+[out]+/ DWORD* pdwAttrib);
1255 };
1256 
1257 // ------------------------------------------------------------------
1258 // IDebugSessionCreateEvent2
1259 const GUID IID_IDebugSessionCreateEvent2 = IDebugSessionCreateEvent2.iid;
1260 
1261 interface IDebugSessionCreateEvent2 : IUnknown
1262 {
1263     static const GUID iid = { 0x2c2b15b7,0xfc6d,0x45b3,[ 0x96,0x22,0x29,0x66,0x5d,0x96,0x4a,0x76 ] };
1264 };
1265 
1266 // ------------------------------------------------------------------
1267 // IDebugSessionDestroyEvent2
1268 const GUID IID_IDebugSessionDestroyEvent2 = IDebugSessionDestroyEvent2.iid;
1269 
1270 interface IDebugSessionDestroyEvent2 : IUnknown
1271 {
1272     static const GUID iid = { 0xf199b2c2,0x88fe,0x4c5d,[ 0xa0,0xfd,0xaa,0x04,0x6b,0x0d,0xc0,0xdc ] };
1273 };
1274 
1275 // ------------------------------------------------------------------
1276 // IDebugEngineCreateEvent2
1277 const GUID IID_IDebugEngineCreateEvent2 = IDebugEngineCreateEvent2.iid;
1278 
1279 interface IDebugEngineCreateEvent2 : IUnknown
1280 {
1281     static const GUID iid = { 0xfe5b734c,0x759d,0x4e59,[ 0xab,0x04,0xf1,0x03,0x34,0x3b,0xdd,0x06 ] };
1282 	HRESULT GetEngine(
1283 		/+[out]+/ IDebugEngine2 *pEngine);
1284 };
1285 
1286 // ------------------------------------------------------------------
1287 // IDebugProcessCreateEvent2
1288 const GUID IID_IDebugProcessCreateEvent2 = IDebugProcessCreateEvent2.iid;
1289 
1290 interface IDebugProcessCreateEvent2 : IUnknown
1291 {
1292     static const GUID iid = { 0xbac3780f,0x04da,0x4726,[ 0x90,0x1c,0xba,0x6a,0x46,0x33,0xe1,0xca ] };
1293 };
1294 
1295 // ------------------------------------------------------------------
1296 // IDebugProcessDestroyEvent2
1297 const GUID IID_IDebugProcessDestroyEvent2 = IDebugProcessDestroyEvent2.iid;
1298 
1299 interface IDebugProcessDestroyEvent2 : IUnknown
1300 {
1301     static const GUID iid = { 0x3e2a0832,0x17e1,0x4886,[ 0x8c,0x0e,0x20,0x4d,0xa2,0x42,0x99,0x5f ] };
1302 };
1303 
1304 // ------------------------------------------------------------------
1305 // IDebugProgramCreateEvent2
1306 const GUID IID_IDebugProgramCreateEvent2 = IDebugProgramCreateEvent2.iid;
1307 
1308 interface IDebugProgramCreateEvent2 : IUnknown
1309 {
1310     static const GUID iid = { 0x96cd11ee,0xecd4,0x4e89,[ 0x95,0x7e,0xb5,0xd4,0x96,0xfc,0x41,0x39 ] };
1311 };
1312 
1313 // ------------------------------------------------------------------
1314 // IDebugProgramDestroyEvent2
1315 const GUID IID_IDebugProgramDestroyEvent2 = IDebugProgramDestroyEvent2.iid;
1316 
1317 interface IDebugProgramDestroyEvent2 : IUnknown
1318 {
1319     static const GUID iid = { 0xe147e9e3,0x6440,0x4073,[ 0xa7,0xb7,0xa6,0x55,0x92,0xc7,0x14,0xb5 ] };
1320 	HRESULT GetExitCode(
1321 		/+[out]+/ DWORD* pdwExit);
1322 };
1323 
1324 // ------------------------------------------------------------------
1325 // IDebugProgramDestroyEventFlags2
1326 const GUID IID_IDebugProgramDestroyEventFlags2 = IDebugProgramDestroyEventFlags2.iid;
1327 
1328 interface IDebugProgramDestroyEventFlags2 : IUnknown
1329 {
1330     static const GUID iid = { 0x7e072bee,0x24e7,0x43eb,[ 0x9b,0xce,0x06,0x40,0x2c,0x70,0xe0,0x18 ] };
1331 
1332 	HRESULT GetFlags(
1333 		/+[out]+/ PROGRAM_DESTROY_FLAGS* pdwFlags);
1334 }
1335 enum /+ enum_PROGRAM_DESTROY_FLAGS+/ : DWORD 
1336 {
1337 		// continue debugging even if no programs are left
1338 		PROGRAM_DESTROY_CONTINUE_DEBUGGING = 0x1
1339 }
1340 alias DWORD enum_PROGRAM_DESTROY_FLAGS;
1341 alias DWORD PROGRAM_DESTROY_FLAGS;
1342 
1343 // ------------------------------------------------------------------
1344 // IDebugThreadCreateEvent2
1345 const GUID IID_IDebugThreadCreateEvent2 = IDebugThreadCreateEvent2.iid;
1346 
1347 interface IDebugThreadCreateEvent2 : IUnknown
1348 {
1349     static const GUID iid = { 0x2090ccfc,0x70c5,0x491d,[ 0xa5,0xe8,0xba,0xd2,0xdd,0x9e,0xe3,0xea ] };
1350 };
1351 
1352 // ------------------------------------------------------------------
1353 // IDebugThreadDestroyEvent2
1354 const GUID IID_IDebugThreadDestroyEvent2 = IDebugThreadDestroyEvent2.iid;
1355 
1356 interface IDebugThreadDestroyEvent2 : IUnknown
1357 {
1358     static const GUID iid = { 0x2c3b7532,0xa36f,0x4a6e,[ 0x90,0x72,0x49,0xbe,0x64,0x9b,0x85,0x41 ] };
1359 	HRESULT GetExitCode(
1360 		/+[out]+/ DWORD* pdwExit);
1361 };
1362 
1363 // ------------------------------------------------------------------
1364 // IDebugLoadCompleteEvent2
1365 const GUID IID_IDebugLoadCompleteEvent2 = IDebugLoadCompleteEvent2.iid;
1366 
1367 interface IDebugLoadCompleteEvent2 : IUnknown
1368 {
1369     static const GUID iid = { 0xb1844850,0x1349,0x45d4,[ 0x9f,0x12,0x49,0x52,0x12,0xf5,0xeb,0x0b ] };
1370 };
1371 
1372 // ------------------------------------------------------------------
1373 // IDebugEntryPointEvent2
1374 const GUID IID_IDebugEntryPointEvent2 = IDebugEntryPointEvent2.iid;
1375 
1376 interface IDebugEntryPointEvent2 : IUnknown
1377 {
1378     static const GUID iid = { 0xe8414a3e,0x1642,0x48ec,[ 0x82,0x9e,0x5f,0x40,0x40,0xe1,0x6d,0xa9 ] };
1379 };
1380 
1381 // ------------------------------------------------------------------
1382 // IDebugStepCompleteEvent2
1383 const GUID IID_IDebugStepCompleteEvent2 = IDebugStepCompleteEvent2.iid;
1384 
1385 interface IDebugStepCompleteEvent2 : IUnknown
1386 {
1387     static const GUID iid = { 0x0f7f24c1,0x74d9,0x4ea6,[ 0xa3,0xea,0x7e,0xdb,0x2d,0x81,0x44,0x1d ] };
1388 };
1389 
1390 // ------------------------------------------------------------------
1391 // IDebugCanStopEvent2
1392 const GUID IID_IDebugCanStopEvent2 = IDebugCanStopEvent2.iid;
1393 
1394 interface IDebugCanStopEvent2 : IUnknown
1395 {
1396     static const GUID iid = { 0xb5b0d747,0xd4d2,0x4e2d,[ 0x87,0x2d,0x74,0xda,0x22,0x03,0x78,0x26 ] };
1397 
1398     HRESULT GetReason(
1399         /+[out]+/ CANSTOP_REASON *pcr);
1400 
1401 	HRESULT CanStop(
1402 		in BOOL fCanStop);
1403 
1404 	HRESULT GetDocumentContext(
1405 		/+[out]+/ IDebugDocumentContext2 *ppDocCxt);
1406 
1407 	HRESULT GetCodeContext(
1408 		/+[out]+/ IDebugCodeContext2 * ppCodeContext);
1409 }
1410 enum /+ enum_CANSTOP_REASON+/ : DWORD 
1411 {
1412 		CANSTOP_ENTRYPOINT  = 0x0000,
1413 		CANSTOP_STEPIN      = 0x0001
1414 }
1415 alias DWORD enum_CANSTOP_REASON;
1416 alias DWORD CANSTOP_REASON;;
1417 
1418 // ------------------------------------------------------------------
1419 // IDebugBreakEvent2
1420 const GUID IID_IDebugBreakEvent2 = IDebugBreakEvent2.iid;
1421 
1422 interface IDebugBreakEvent2 : IUnknown
1423 {
1424     static const GUID iid = { 0xc7405d1d,0xe24b,0x44e0,[ 0xb7,0x07,0xd8,0xa5,0xa4,0xe1,0x64,0x1b ] };
1425 };
1426 
1427 // ------------------------------------------------------------------
1428 // IDebugBreakpointEvent2
1429 const GUID IID_IDebugBreakpointEvent2 = IDebugBreakpointEvent2.iid;
1430 
1431 interface IDebugBreakpointEvent2 : IUnknown
1432 {
1433     static const GUID iid = { 0x501c1e21,0xc557,0x48b8,[ 0xba,0x30,0xa1,0xea,0xb0,0xbc,0x4a,0x74 ] };
1434 	HRESULT EnumBreakpoints(
1435 		/+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum);
1436 };
1437 
1438 // ------------------------------------------------------------------
1439 // IDebugExceptionEvent2
1440 const GUID IID_IDebugExceptionEvent2 = IDebugExceptionEvent2.iid;
1441 
1442 interface IDebugExceptionEvent2 : IUnknown
1443 {
1444     static const GUID iid = { 0x51a94113,0x8788,0x4a54,[ 0xae,0x15,0x08,0xb7,0x4f,0xf9,0x22,0xd0 ] };
1445 	HRESULT GetException(
1446 		/+[out]+/ EXCEPTION_INFO* pExceptionInfo);
1447 
1448 	HRESULT GetExceptionDescription(
1449 		/+[out]+/ BSTR* pbstrDescription);
1450 
1451 	HRESULT CanPassToDebuggee();
1452 
1453 	HRESULT PassToDebuggee(
1454 		in BOOL fPass);
1455 };
1456 
1457 // based on EXCEPTION_RECORD only Win32/64-agnostic
1458 struct _NATIVE_EXCEPTION_INFO
1459 {
1460 	DWORD ExceptionCode;
1461 	DWORD ExceptionFlags;
1462 	DWORD NumberOfParameters;
1463 	UINT64[15] ExceptionInformation;
1464 }
1465 alias _NATIVE_EXCEPTION_INFO NATIVE_EXCEPTION_INFO;
1466 
1467 // ------------------------------------------------------------------
1468 // IDebugNativeExceptionInfo
1469 //
1470 // Not an event as such, but QI-able from an IDebugExceptionEvent2
1471 // to get more information
1472 const GUID IID_IDebugNativeExceptionInfo = IDebugNativeExceptionInfo.iid;
1473 
1474 interface IDebugNativeExceptionInfo : IUnknown
1475 {
1476     static const GUID iid = { 0x3d320710,0x06c0,0x437b,[ 0xa5,0x5f,0x82,0x6f,0x48,0xcc,0x7e,0xe7 ] };
1477 	HRESULT GetNativeException(
1478 		/+[out]+/ NATIVE_EXCEPTION_INFO* pExceptionInfo);
1479 };
1480 
1481 // ------------------------------------------------------------------
1482 // IDebugManagedExceptionInfo2
1483 //
1484 // Not an event as such, but QI-able from an IDebugExceptionEvent2
1485 // to get more information
1486 const GUID IID_IDebugManagedExceptionInfo2 = IDebugManagedExceptionInfo2.iid;
1487 
1488 interface IDebugManagedExceptionInfo2 : IUnknown
1489 {
1490     static const GUID iid = { 0xd288564a,0xedb2,0x4214,[ 0x86,0x90,0xff,0x9a,0x82,0x87,0x03,0x79 ] };
1491 
1492     HRESULT GetExceptionMessage(
1493 		/+[out]+/ BSTR* pbstrExceptionMessage);
1494 
1495 	HRESULT GetExceptionBoundaryType(
1496 		/+[out]+/ EXCEPTION_BOUNDARY_TYPE *pType);
1497 }
1498 enum /+ tagEXCEPTION_BOUNDARY_TYPE+/ : int 
1499 { 
1500 		EXCEPTION_BOUNDARY_NONE, 
1501 		EXCEPTION_BOUNDARY_APPDOMAIN, 
1502 		EXCEPTION_BOUNDARY_UNMANAGED,
1503 }
1504 alias int tagEXCEPTION_BOUNDARY_TYPE;
1505 alias  tagEXCEPTION_BOUNDARY_TYPE EXCEPTION_BOUNDARY_TYPE;;
1506 
1507 // ------------------------------------------------------------------
1508 // IDebugOutputStringEvent2
1509 const GUID IID_IDebugOutputStringEvent2 = IDebugOutputStringEvent2.iid;
1510 
1511 interface IDebugOutputStringEvent2 : IUnknown
1512 {
1513     static const GUID iid = { 0x569c4bb1,0x7b82,0x46fc,[ 0xae,0x28,0x45,0x36,0xdd,0xad,0x75,0x3e ] };
1514 	HRESULT GetString(
1515 		/+[out]+/ BSTR* pbstrString);
1516 };
1517 
1518 // ------------------------------------------------------------------
1519 // IDebugModuleLoadEvent2
1520 const GUID IID_IDebugModuleLoadEvent2 = IDebugModuleLoadEvent2.iid;
1521 
1522 interface IDebugModuleLoadEvent2 : IUnknown
1523 {
1524     static const GUID iid = { 0x989db083,0x0d7c,0x40d1,[ 0xa9,0xd9,0x92,0x1b,0xf6,0x11,0xa4,0xb2 ] };
1525 	HRESULT GetModule(
1526 		/+[out]+/ IDebugModule2 * pModule,
1527 		// Optional message that describes the event
1528 		/+[in, out]+/ BSTR* pbstrDebugMessage,
1529 		// Set to TRUE if the module's loading; FALSE if unloading
1530 		/+[in, out]+/ BOOL* pbLoad);
1531 };
1532 
1533 // ------------------------------------------------------------------
1534 // IDebugSymbolSearchEvent2
1535 const GUID IID_IDebugSymbolSearchEvent2 = IDebugSymbolSearchEvent2.iid;
1536 
1537 interface IDebugSymbolSearchEvent2 : IUnknown
1538 {
1539     static const GUID iid = { 0x638F7C54,0xC160,0x4c7b,[ 0xB2,0xD0,0xE0,0x33,0x7B,0xC6,0x1F,0x8C ] };
1540 
1541 	// Notify the package that an attempt was made to load symbols
1542 	// for pModule
1543 	HRESULT GetSymbolSearchInfo(
1544 		/+[out]+/ IDebugModule3 * pModule,
1545 		// Optional message that describes the event
1546 		/+[in, out]+/ BSTR* pbstrDebugMessage,
1547 		// Flag denoting if symbols were loaded
1548 		/+[out]+/ MODULE_INFO_FLAGS* pdwModuleInfoFlags);
1549 }
1550 enum /+ enum_MODULE_INFO_FLAGS+/ : DWORD 
1551 {
1552 		MIF_SYMBOLS_LOADED      = 0x0001,
1553 }
1554 alias DWORD enum_MODULE_INFO_FLAGS;
1555 alias DWORD MODULE_INFO_FLAGS;;
1556 
1557 // ------------------------------------------------------------------
1558 // 
1559 // IDebugBeforeSymbolSearchEvent2
1560 const GUID IID_IDebugBeforeSymbolSearchEvent2 = IDebugBeforeSymbolSearchEvent2.iid;
1561 
1562 interface IDebugBeforeSymbolSearchEvent2 : IUnknown
1563 {
1564     static const GUID iid = { 0xB15C8149,0x2B81,0x40ae,[ 0x93,0x88,0x62,0xFA,0x27,0x6A,0xE1,0x4C ] };
1565 	HRESULT GetModuleName(
1566 		/+[out]+/ BSTR* pbstrModuleName
1567 		);
1568 };
1569 
1570 // ------------------------------------------------------------------
1571 // IDebugPropertyCreateEvent2
1572 const GUID IID_IDebugPropertyCreateEvent2 = IDebugPropertyCreateEvent2.iid;
1573 
1574 interface IDebugPropertyCreateEvent2 : IUnknown
1575 {
1576     static const GUID iid = { 0xded6d613,0xa3db,0x4e35,[ 0xbb,0x5b,0xa9,0x23,0x91,0x13,0x3f,0x03 ] };
1577 	HRESULT GetDebugProperty(
1578 		/+[out]+/ IDebugProperty2 * ppProperty);
1579 };
1580 
1581 // ------------------------------------------------------------------
1582 // IDebugPropertyDestroyEvent2
1583 const GUID IID_IDebugPropertyDestroyEvent2 = IDebugPropertyDestroyEvent2.iid;
1584 
1585 interface IDebugPropertyDestroyEvent2 : IUnknown
1586 {
1587     static const GUID iid = { 0xf3765f18,0xf395,0x4b8c,[ 0x8e,0x95,0xdc,0xb3,0xfe,0x8e,0x7e,0xc8 ] };
1588 	HRESULT GetDebugProperty(
1589 		/+[out]+/ IDebugProperty2 * ppProperty);
1590 };
1591 
1592 // ------------------------------------------------------------------
1593 // IDebugBreakpointBoundEvent2
1594 
1595 const GUID IID_IDebugBreakpointBoundEvent2 = IDebugBreakpointBoundEvent2.iid;
1596 
1597 interface IDebugBreakpointBoundEvent2 : IUnknown
1598 {
1599     static const GUID iid = { 0x1dddb704,0xcf99,0x4b8a,[ 0xb7,0x46,0xda,0xbb,0x01,0xdd,0x13,0xa0 ] };
1600 	HRESULT GetPendingBreakpoint(
1601 		/+[out]+/ IDebugPendingBreakpoint2 * ppPendingBP);
1602 
1603 	HRESULT EnumBoundBreakpoints(
1604 		/+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum);
1605 };
1606 
1607 // ------------------------------------------------------------------
1608 // IDebugBreakpointUnboundEvent2
1609 
1610 const GUID IID_IDebugBreakpointUnboundEvent2 = IDebugBreakpointUnboundEvent2.iid;
1611 
1612 interface IDebugBreakpointUnboundEvent2 : IUnknown
1613 {
1614     static const GUID iid = { 0x78d1db4f,0xc557,0x4dc5,[ 0xa2,0xdd,0x53,0x69,0xd2,0x1b,0x1c,0x8c ] };
1615 
1616 	HRESULT GetBreakpoint(
1617 		/+[out]+/ IDebugBoundBreakpoint2 * ppBP);
1618 
1619     HRESULT GetReason(
1620 		/+[out]+/ BP_UNBOUND_REASON* pdwUnboundReason);
1621 }
1622 enum /+ enum_BP_UNBOUND_REASON+/ : DWORD 
1623 {
1624 		BPUR_UNKNOWN			= 0x0001,
1625 		BPUR_CODE_UNLOADED		= 0x0002,
1626 		// BPUR_BREAKPOINT_REBIND means the breakpoint is being unbound
1627 		// because it is being rebound to a different location. (For example,
1628 		// this can happen after an ENC when the breakpoint moves, or if this
1629 		// breakpoint was originally bound with a less than perfect file
1630 		// name match.) Generally, the IDE will discard any persisted information
1631 		// about this breakpoint.
1632 		BPUR_BREAKPOINT_REBIND	= 0x0003,
1633         // BPUR_BREAKPOINT_ERROR means that the breakpoint was deemed to be in error
1634         // after it was bound.  This will happen for managed bps whose condition is
1635         // not valid.
1636         BPUR_BREAKPOINT_ERROR   = 0x0004
1637 }
1638 alias DWORD enum_BP_UNBOUND_REASON;
1639 alias DWORD BP_UNBOUND_REASON;;
1640 
1641 // ------------------------------------------------------------------
1642 // IDebugBreakpointErrorEvent2
1643 
1644 const GUID IID_IDebugBreakpointErrorEvent2 = IDebugBreakpointErrorEvent2.iid;
1645 
1646 interface IDebugBreakpointErrorEvent2 : IUnknown
1647 {
1648     static const GUID iid = { 0xabb0ca42,0xf82b,0x4622,[ 0x84,0xe4,0x69,0x03,0xae,0x90,0xf2,0x10 ] };
1649 	HRESULT GetErrorBreakpoint(
1650 		/+[out]+/ IDebugErrorBreakpoint2 * ppErrorBP);
1651 };
1652 
1653 // ------------------------------------------------------------------
1654 // IDebugExpressionEvaluationCompleteEvent2
1655 const GUID IID_IDebugExpressionEvaluationCompleteEvent2 = IDebugExpressionEvaluationCompleteEvent2.iid;
1656 
1657 interface IDebugExpressionEvaluationCompleteEvent2 : IUnknown
1658 {
1659     static const GUID iid = { 0xc0e13a85,0x238a,0x4800,[ 0x83,0x15,0xd9,0x47,0xc9,0x60,0xa8,0x43 ] };
1660 	HRESULT GetExpression(
1661 		/+[out]+/ IDebugExpression2 * ppExpr);
1662 
1663 	HRESULT GetResult(
1664 		/+[out]+/ IDebugProperty2 * ppResult);
1665 };
1666 
1667 // ------------------------------------------------------------------
1668 // IDebugReturnValueEvent2
1669 const GUID IID_IDebugReturnValueEvent2 = IDebugReturnValueEvent2.iid;
1670 
1671 interface IDebugReturnValueEvent2 : IUnknown
1672 {
1673     static const GUID iid = { 0x0da4d4cc,0x2d0b,0x410f,[ 0x8d,0x5d,0xb6,0xb7,0x3a,0x5d,0x35,0xd8 ] };
1674 	HRESULT	GetReturnValue(
1675 		/+[out]+/ IDebugProperty2 * ppReturnValue);
1676 };
1677 
1678 // ------------------------------------------------------------------
1679 // IDebugNoSymbolsEvent2
1680 const GUID IID_IDebugNoSymbolsEvent2 = IDebugNoSymbolsEvent2.iid;
1681 
1682 interface IDebugNoSymbolsEvent2 : IUnknown
1683 {
1684     static const GUID iid = { 0x3ad4fb48,0x647e,0x4b03,[ 0x9c,0x1e,0x52,0x75,0x4e,0x80,0xc8,0x80 ] };
1685 };
1686 
1687 // ------------------------------------------------------------------
1688 // IDebugProgramNameChangedEvent2
1689 const GUID IID_IDebugProgramNameChangedEvent2 = IDebugProgramNameChangedEvent2.iid;
1690 
1691 interface IDebugProgramNameChangedEvent2 : IUnknown
1692 {
1693     static const GUID iid = { 0xe05c2dfd,0x59d5,0x46d3,[ 0xa7,0x1c,0x5d,0x07,0x66,0x5d,0x85,0xaf ] };
1694 };
1695 
1696 // ------------------------------------------------------------------
1697 // IDebugThreadNameChangedEvent2
1698 const GUID IID_IDebugThreadNameChangedEvent2 = IDebugThreadNameChangedEvent2.iid;
1699 
1700 interface IDebugThreadNameChangedEvent2 : IUnknown
1701 {
1702     static const GUID iid = { 0x1ef4ef78,0x2c44,0x4b7a,[ 0x84,0x73,0x8f,0x43,0x57,0x61,0x17,0x29 ] };
1703 };
1704 
1705 // ------------------------------------------------------------------
1706 // IDebugMessageEvent2
1707 const GUID IID_IDebugMessageEvent2 = IDebugMessageEvent2.iid;
1708 
1709 interface IDebugMessageEvent2 : IUnknown
1710 {
1711     static const GUID iid = { 0x3bdb28cf,0xdbd2,0x4d24,[ 0xaf,0x03,0x01,0x07,0x2b,0x67,0xeb,0x9e ] };
1712 
1713 	HRESULT GetMessage(
1714 		/+[out]+/ MESSAGETYPE* pMessageType,
1715 		/+[out]+/ BSTR* pbstrMessage,
1716 		// Use the MB_* constants
1717 		/+[out]+/ DWORD* pdwType,
1718 		/+[out]+/ BSTR* pbstrHelpFileName,
1719 		/+[out]+/ DWORD* pdwHelpId);
1720 
1721 	HRESULT SetResponse(
1722 		in DWORD dwResponse);
1723 }
1724 enum /+ enum_MESSAGETYPE+/ : DWORD 
1725 {
1726         // the following values indicate the how to display the message
1727         MT_OUTPUTSTRING      = 0x00000001, // output a message to the Output window
1728         MT_MESSAGEBOX        = 0x00000002, // display a message box 
1729         MT_TYPE_MASK         = 0x000000FF,
1730 
1731         // the following values provides reasons for the message
1732         MT_REASON_EXCEPTION  = 0x00000100,
1733         MT_REASON_TRACEPOINT = 0x00000200,
1734         MT_REASON_MASK       = 0x0000FF00,
1735 }
1736 alias DWORD enum_MESSAGETYPE;
1737 alias DWORD MESSAGETYPE;;
1738 
1739 // ------------------------------------------------------------------
1740 // IDebugErrorEvent2
1741 const GUID IID_IDebugErrorEvent2 = IDebugErrorEvent2.iid;
1742 
1743 interface IDebugErrorEvent2 : IUnknown
1744 {
1745     static const GUID iid = { 0xfdb7a36c,0x8c53,0x41da,[ 0xa3,0x37,0x8b,0xd8,0x6b,0x14,0xd5,0xcb ] };
1746 	// Note: format should be of the form:
1747 	//    "Unable to stand on my head. %1"
1748 	HRESULT GetErrorMessage(
1749 		/+[out]+/ MESSAGETYPE* pMessageType,
1750 		/+[out]+/ BSTR* pbstrErrorFormat,
1751 		/+[out]+/ HRESULT* phrErrorReason,
1752 		// Use the MB_* constants
1753 		/+[out]+/ DWORD* pdwType,
1754 		/+[out]+/ BSTR* pbstrHelpFileName,
1755 		/+[out]+/ DWORD* pdwHelpId);
1756 };
1757 
1758 // ------------------------------------------------------------------
1759 // IDebugActivateDocumentEvent2
1760 const GUID IID_IDebugActivateDocumentEvent2 = IDebugActivateDocumentEvent2.iid;
1761 
1762 interface IDebugActivateDocumentEvent2 : IUnknown
1763 {
1764     static const GUID iid = { 0x58f36c3d,0x7d07,0x4eba,[ 0xa0,0x41,0x62,0xf6,0x3e,0x18,0x80,0x37 ] };
1765 	HRESULT GetDocument(
1766 		/+[out]+/ IDebugDocument2 * ppDoc);
1767 
1768 	HRESULT GetDocumentContext(
1769 		/+[out]+/ IDebugDocumentContext2 * ppDocContext);
1770 };
1771 
1772 // ------------------------------------------------------------------
1773 // IDebugInterceptExceptionCompleteEvent2
1774 const GUID IID_IDebugInterceptExceptionCompleteEvent2 = IDebugInterceptExceptionCompleteEvent2.iid;
1775 
1776 interface IDebugInterceptExceptionCompleteEvent2 : IUnknown
1777 {
1778     static const GUID iid = { 0x44FCEACA,0x7F56,0x4d2c,[ 0xA6,0x37,0x60,0x05,0x2B,0x1B,0x9C,0xBE ] };
1779 	HRESULT GetInterceptCookie(
1780 		/+[out]+/ UINT64* pqwCookie);
1781 };
1782 
1783 // ------------------------------------------------------------------
1784 // IDebugAttachCompleteEvent2
1785 const GUID IID_IDebugAttachCompleteEvent2 = IDebugAttachCompleteEvent2.iid;
1786 
1787 interface IDebugAttachCompleteEvent2 : IUnknown
1788 {
1789     static const GUID iid = { 0xfe1fd9ea,0x6413,0x4183,[ 0xa6,0x7d,0x58,0x88,0x70,0x01,0x4e,0x97 ] };
1790 };
1791 
1792 // ------------------------------------------------------------------
1793 // IDebugFuncEvalAbortedEvent2
1794 const GUID IID_IDebugFuncEvalAbortedEvent2 = IDebugFuncEvalAbortedEvent2.iid;
1795 
1796 interface IDebugFuncEvalAbortedEvent2 : IUnknown
1797 {
1798     static const GUID iid = { 0x3f3be369,0x0b78,0x4511,[ 0x91,0xe5,0x08,0xf9,0xfc,0x5c,0xae,0x0d ] };
1799 
1800 	HRESULT GetAbortResult(
1801 		/+[out]+/ FUNC_EVAL_ABORT_RESULT* pResult);
1802 
1803 	HRESULT GetFunctionName(
1804 		/+[out]+/ BSTR* pbstrFunctionName);
1805 }
1806 enum /+ tagFUNC_EVAL_ABORT_RESULT+/ : int 
1807 {
1808 		ABORT_SUCCEEDED = 0,
1809 		RUDE_ABORT_SUCCEEDED = 1,
1810 		ABORT_FAILED = 2,
1811 		ABORT_HUNG = 3,
1812 		PROCESS_TERMINATED = 4
1813 }
1814 alias int tagFUNC_EVAL_ABORT_RESULT;
1815 alias  tagFUNC_EVAL_ABORT_RESULT FUNC_EVAL_ABORT_RESULT;;
1816 
1817 // ------------------------------------------------------------------
1818 // IDebugStopCompleteEvent2
1819 const GUID IID_IDebugStopCompleteEvent2 = IDebugStopCompleteEvent2.iid;
1820 
1821 interface IDebugStopCompleteEvent2 : IUnknown
1822 {
1823     static const GUID iid = { 0x3dca9dcd,0xfb09,0x4af1,[ 0xa9,0x26,0x45,0xf2,0x93,0xd4,0x8b,0x2d ] };
1824 };
1825 
1826 enum /+ tagEncUnavailableReason+/ : int 
1827 {
1828     ENCUN_NONE,
1829     ENCUN_INTEROP,
1830     ENCUN_SQLCLR,
1831     ENCUN_MINIDUMP,
1832     ENCUN_EMBEDDED,
1833     ENCUN_ATTACH,
1834     ENCUN_WIN64,
1835     ENCUN_STOPONEMODE,
1836     ENCUN_MODULENOTLOADED,
1837     ENCUN_MODULERELOADED,
1838     ENCUN_INRUNMODE,
1839     ENCUN_NOTBUILT,
1840     ENCUN_REMOTE,
1841     ENCUN_SILVERLIGHT,
1842     ENCUN_ENGINE_METRIC_FALSE,
1843     ENCUN_NOT_ALLOWED_FOR_MODULE,
1844     ENCUN_NOT_SUPPORTED_FOR_CLR64_VERSION
1845 }
1846 alias int tagEncUnavailableReason;
1847 alias  tagEncUnavailableReason EncUnavailableReason;
1848 
1849 // The VSdebug Package implements this interface.
1850 const GUID IID_IDebugEncNotify = IDebugEncNotify.iid;
1851 
1852 interface IDebugEncNotify : IUnknown
1853 {
1854     static const GUID iid = { 0x347C45E1,0x5C42,0x4e0e,[ 0x9E,0x15,0xDE,0xFF,0x9C,0xFC,0x78,0x41 ] };
1855 	// This method allows the ENCManager to tell the package that ENC
1856 	// is not available as soon as it can be determined rather than waiting for a call from the package.
1857 	HRESULT NotifyEncIsUnavailable(
1858 		in EncUnavailableReason reason,
1859 		in BOOL fEditWasApplied);
1860 
1861 	// This method allows the Lang Serice to Notify the package that the Current Statement 
1862 	// must be updated due to an edit.
1863 	HRESULT NotifyEncUpdateCurrentStatement();
1864 
1865 	// This method allows the Lang Service to Notify the package that an edit was attempted
1866 	// when the debuggee is in a state that cannot accept changes.
1867 	HRESULT NotifyEncEditAttemptedAtInvalidStopState();
1868 
1869 	// This allows the Lang Service or project to tell the package that it prevented
1870 	// an edit from occuring.
1871 	// The package is responsible for asking the ENC manager why ENC would not be 
1872 	// allowed at this point.
1873 	HRESULT NotifyEncEditDisallowedByProject(
1874 		/+[in]+/ IUnknown pProject);
1875 }
1876 
1877 // ------------------------------------------------------------------
1878 // IDebugSessionEvent2 - implemented by all SDM events (such as session
1879 // create/destroy)
1880 const GUID IID_IDebugSessionEvent2 = IDebugSessionEvent2.iid;
1881 
1882 interface IDebugSessionEvent2 : IUnknown
1883 {
1884     static const GUID iid = { 0xfd1a378c,0xf117,0x4f43,[ 0x91,0x7c,0xda,0xdc,0xa1,0x30,0x86,0x06 ] };
1885 	HRESULT GetSession(
1886 		/+[out]+/ IDebugSession2 *ppSession);
1887 };
1888 
1889 // ------------------------------------------------------------------
1890 // IDebugProcess2
1891 const GUID IID_IDebugProcess2 = IDebugProcess2.iid;
1892 
1893 interface IDebugProcess2 : IUnknown
1894 {
1895     static const GUID iid = { 0x43286fea,0x6997,0x4543,[ 0x80,0x3e,0x60,0xa2,0x0c,0x47,0x3d,0xe5 ] };
1896 
1897 	HRESULT GetInfo(
1898 		in PROCESS_INFO_FIELDS Fields,
1899 		/+[out]+/ PROCESS_INFO* pProcessInfo);
1900 
1901 	HRESULT EnumPrograms(
1902 		/+[out]+/ IEnumDebugPrograms2 * ppEnum);
1903 
1904 	HRESULT GetName(
1905 		in GETNAME_TYPE gnType,
1906 		/+[out]+/ BSTR* pbstrName);
1907 
1908 	HRESULT GetServer(
1909 		/+[out]+/ IDebugCoreServer2 * ppServer);
1910 
1911 	HRESULT Terminate();
1912 
1913 	HRESULT Attach(
1914 		/+[in]+/ IDebugEventCallback2 pCallback,
1915 		/+[ size_is (celtSpecificEngines)]+/ in GUID* rgguidSpecificEngines,
1916 		in DWORD celtSpecificEngines,
1917 		/+[out, size_is(celtSpecificEngines), length_is(celtSpecificEngines)]+/ HRESULT* rghrEngineAttach);
1918 
1919 	HRESULT CanDetach();
1920 
1921 	HRESULT Detach();
1922 
1923 	HRESULT GetPhysicalProcessId(
1924 		/+[out]+/ AD_PROCESS_ID* pProcessId);
1925 
1926 	HRESULT GetProcessId(
1927 		/+[out]+/ GUID* pguidProcessId);
1928 
1929 	HRESULT GetAttachedSessionName(
1930 		/+[out]+/ BSTR* pbstrSessionName);
1931 
1932 	// Get a list of threads in this process (no duplicates)
1933 	HRESULT EnumThreads(
1934 		/+[out]+/ IEnumDebugThreads2 * ppEnum);
1935 
1936 	HRESULT CauseBreak();
1937 
1938 	HRESULT GetPort(
1939 		/+[out]+/ IDebugPort2 * ppPort);
1940 }
1941 enum /+ enum_PROCESS_INFO_FLAGS+/ : DWORD 
1942 {
1943 		PIFLAG_SYSTEM_PROCESS		= 0x00000001,
1944 		PIFLAG_DEBUGGER_ATTACHED	= 0x00000002,
1945 		// The flags below are only valid in VS8 and above
1946 		// and are only set when PIFLAG_DEBUGGER_ATTACHED
1947 		// is set.
1948 		PIFLAG_PROCESS_STOPPED		= 0x00000004,
1949 		PIFLAG_PROCESS_RUNNING		= 0x00000008,
1950 }
1951 alias DWORD enum_PROCESS_INFO_FLAGS;
1952 alias DWORD PROCESS_INFO_FLAGS;
1953 enum /+ enum_PROCESS_INFO_FIELDS+/ : DWORD 
1954 {
1955 		PIF_FILE_NAME				= 0x00000001,
1956 		PIF_BASE_NAME				= 0x00000002,
1957 		PIF_TITLE					= 0x00000004,
1958 		PIF_PROCESS_ID				= 0x00000008,
1959 		PIF_SESSION_ID				= 0x00000010,
1960 		PIF_ATTACHED_SESSION_NAME	= 0x00000020,
1961 		PIF_CREATION_TIME			= 0x00000040,
1962 		PIF_FLAGS					= 0x00000080,
1963 
1964 		PIF_ALL						= 0x000000ff,
1965 }
1966 alias DWORD enum_PROCESS_INFO_FIELDS;
1967 alias DWORD PROCESS_INFO_FIELDS;
1968 struct tagPROCESS_INFO
1969 {
1970 		// Valid fields
1971 		PROCESS_INFO_FIELDS	Fields;
1972 		// Full path+file name+extension; equivalent to calling GetName(GN_FILENAME, ...)
1973 		BSTR				bstrFileName;
1974 		// File name+extension; equivalent to calling GetName(GN_BASENAME, ...)
1975 		BSTR				bstrBaseName;
1976 		// Title (if one exists); equivalent to calling GetName(GN_TITLE, ...)
1977 		BSTR				bstrTitle;
1978 		// Process id; equivalent to calling GetPhysicalProcessId
1979 		AD_PROCESS_ID		ProcessId;
1980 		// Session id: the system session that this process is running in
1981 		DWORD				dwSessionId;
1982 		// Attached session name (if one exists); equivalent to calling GetAttachedSessionName
1983 		BSTR				bstrAttachedSessionName;
1984 		// Time the process was created
1985 		FILETIME			CreationTime;
1986 		// Flags
1987 		PROCESS_INFO_FLAGS	Flags;
1988 }
1989 alias tagPROCESS_INFO PROCESS_INFO;;
1990 
1991 const GUID IID_IDebugProcess3 = IDebugProcess3.iid;
1992 
1993 interface IDebugProcess3 : IDebugProcess2
1994 {
1995     static const GUID iid = { 0x83ab1712,0x18a6,0x47a1,[ 0x8d,0xa6,0x8c,0x7b,0x0f,0x96,0x09,0x2e ] };
1996 
1997 	// Execute the process. The thread is given so that the debugger
1998 	// knows which thread the user is viewing when executing.
1999 	HRESULT Execute(
2000 		/+[in]+/ IDebugThread2 pThread);
2001 
2002 	// Continue the process in whatever state is was previously in. If
2003 	// the process was stepping, then continue the step; otherwise,
2004 	// continue execution.
2005 	HRESULT Continue(
2006 		/+[in]+/ IDebugThread2 pThread);
2007 
2008 	// Step the process. The thread specified is stepped and all other
2009 	// threads in the process run.
2010 	HRESULT Step(
2011 		/+[in]+/ IDebugThread2 pThread,
2012 		in STEPKIND sk,
2013 		in STEPUNIT step);
2014 
2015 	HRESULT GetDebugReason(
2016 		/+[out]+/ DEBUG_REASON *pReason);
2017 
2018 	// Provide a way to indicate the HostingProcessLanguage so that the managed
2019 	// debug engine can preload the right EE.
2020 	HRESULT SetHostingProcessLanguage(in GUID* guidLang);
2021 	HRESULT GetHostingProcessLanguage(/+[out]+/ GUID* pguidLang);
2022 
2023 	// Provide a mechanism for the Package to explicitly disable ENC.
2024 	// EncUnavailableReason is defined in enc.idl
2025 	HRESULT DisableENC(
2026 		in EncUnavailableReason reason);
2027 	HRESULT GetENCAvailableState(
2028 		/+[out]+/EncUnavailableReason* preason);
2029 
2030 	HRESULT GetEngineFilter(
2031 		/+[out]+/ GUID_ARRAY *pEngineArray);
2032 }
2033 enum /+ enum_STEPKIND+/ : DWORD 
2034 {
2035 		STEP_INTO,
2036 		STEP_OVER,
2037 		STEP_OUT,
2038 		STEP_BACKWARDS
2039 }
2040 alias DWORD enum_STEPKIND;
2041 alias DWORD STEPKIND;
2042 enum /+ enum_STEPUNIT+/ : DWORD 
2043 {
2044 		STEP_STATEMENT,
2045 		STEP_LINE,
2046 		STEP_INSTRUCTION,
2047 }
2048 alias DWORD enum_STEPUNIT;
2049 alias DWORD STEPUNIT;
2050 enum /+ enum_DEBUG_REASON+/ : DWORD 
2051 {
2052 		DEBUG_REASON_ERROR,
2053 		DEBUG_REASON_USER_LAUNCHED,
2054 		DEBUG_REASON_USER_ATTACHED,
2055 		DEBUG_REASON_AUTO_ATTACHED,
2056 		DEBUG_REASON_CAUSALITY
2057 }
2058 alias DWORD enum_DEBUG_REASON;
2059 alias DWORD DEBUG_REASON;;
2060 
2061 const GUID IID_IDebugProcessSecurity2 = IDebugProcessSecurity2.iid;
2062 
2063 interface IDebugProcessSecurity2 : IUnknown
2064 {
2065     static const GUID iid = { 0xfca0c35c,0x4c02,0x432b,[ 0x88,0xf7,0xeb,0x27,0x7b,0xe2,0xba,0x55 ] };
2066 	HRESULT QueryCanSafelyAttach(
2067 		);
2068 
2069 	HRESULT GetUserName(
2070 		/+[out]+/ BSTR *pbstrUserName
2071 		);
2072 };
2073 
2074 // ------------------------------------------------------------------
2075 // IDebugProgram2
2076 const GUID IID_IDebugProgram2 = IDebugProgram2.iid;
2077 
2078 interface IDebugProgram2 : IUnknown
2079 {
2080     static const GUID iid = { 0x69d172ef,0xf2c4,0x44e1,[ 0x89,0xf7,0xc8,0x62,0x31,0xe7,0x06,0xe9 ] };
2081 
2082     HRESULT EnumThreads(
2083 		/+[out]+/ IEnumDebugThreads2 * ppEnum);
2084 
2085 	HRESULT GetName(
2086 		/+[out]+/ BSTR* pbstrName);
2087 
2088 	HRESULT GetProcess(
2089 		/+[out]+/ IDebugProcess2 * ppProcess);
2090 
2091 	HRESULT Terminate();
2092 
2093 	HRESULT Attach(
2094 		/+[in]+/ IDebugEventCallback2 pCallback);
2095 
2096 	HRESULT CanDetach();
2097 
2098 	HRESULT Detach();
2099 
2100 	HRESULT GetProgramId(
2101 		/+[out]+/ GUID* pguidProgramId);
2102 
2103 	HRESULT GetDebugProperty(
2104 		/+[out]+/ IDebugProperty2 * ppProperty);
2105 
2106 	// To execute during an expression evaluation, use IDebugProcess3::
2107 	// Execute. Execution during expression evaluation requires
2108 	// a thread so that the correct expression evaluation can be continued.
2109 	HRESULT Execute();
2110 
2111     // Continue, preserving state
2112     HRESULT Continue(
2113         /+[in]+/ IDebugThread2 pThread);
2114 
2115 	HRESULT Step(
2116 		/+[in]+/ IDebugThread2 pThread,
2117 		in STEPKIND sk,
2118 		in STEPUNIT step);
2119 
2120 	HRESULT CauseBreak();
2121 
2122 	HRESULT GetEngineInfo(
2123 		/+[out]+/ BSTR* pbstrEngine,
2124 		/+[out]+/ GUID* pguidEngine);
2125 
2126 	HRESULT EnumCodeContexts(
2127         /+[in]+/ IDebugDocumentPosition2 pDocPos,
2128 		/+[out]+/ IEnumDebugCodeContexts2 * ppEnum);
2129 
2130 	HRESULT GetMemoryBytes(
2131 		/+[out]+/ IDebugMemoryBytes2 * ppMemoryBytes);
2132 
2133 	HRESULT GetDisassemblyStream(
2134 		in DISASSEMBLY_STREAM_SCOPE dwScope,
2135 		/+[in]+/ IDebugCodeContext2 pCodeContext,
2136 		/+[out]+/ IDebugDisassemblyStream2 * ppDisassemblyStream);
2137 
2138 	HRESULT EnumModules(
2139 		/+[out]+/ IEnumDebugModules2 * ppEnum);
2140 
2141 	HRESULT GetENCUpdate(
2142 		/+[out]+/ IDebugENCUpdate** ppUpdate);
2143 
2144 	HRESULT EnumCodePaths(
2145 		/+[ ptr]+/ in LPCOLESTR pszHint,
2146 		/+[in]+/ IDebugCodeContext2 pStart,
2147 		/+[in]+/ IDebugStackFrame2 pFrame,
2148 		in BOOL fSource,
2149 		/+[out]+/ IEnumCodePaths2 * ppEnum,
2150 		/+[out]+/ IDebugCodeContext2 * ppSafety);
2151 
2152 	HRESULT WriteDump(
2153 		in DUMPTYPE DumpType,
2154 		in LPCOLESTR pszDumpUrl
2155 		);
2156 }
2157 enum /+ enum_DISASSEMBLY_STREAM_SCOPE+/ : DWORD 
2158 {
2159 		DSS_HUGE		= 0x10000000,
2160 		// Get the disasm for the function contained by the code context
2161 		DSS_FUNCTION	= 0x0001,		
2162 		// Get the disasm for the module contained by the code context
2163 		DSS_MODULE		= (DSS_HUGE) | 0x0002,
2164 		// Get the disasm for the entire address space
2165 		DSS_ALL			= (DSS_HUGE) | 0x0003
2166 }
2167 alias DWORD enum_DISASSEMBLY_STREAM_SCOPE;
2168 alias DWORD DISASSEMBLY_STREAM_SCOPE;
2169 enum /+ enum_DUMPTYPE+/ : DWORD 
2170 {
2171 		// "mini" dump of the program state
2172 		DUMP_MINIDUMP,
2173 		// full dump of the program state
2174 		DUMP_FULLDUMP,
2175 }
2176 alias DWORD enum_DUMPTYPE;
2177 alias DWORD DUMPTYPE;
2178 struct tagCODE_PATH
2179 {
2180 		BSTR bstrName;
2181 		IDebugCodeContext2 pCode;
2182 }
2183 alias tagCODE_PATH CODE_PATH;;
2184 
2185 // ------------------------------------------------------------------
2186 // IDebugProgram3
2187 const GUID IID_IDebugProgram3 = IDebugProgram3.iid;
2188 
2189 interface IDebugProgram3 : IDebugProgram2
2190 {
2191     static const GUID iid = { 0x7CF3EC7F,0xAC62,0x4cd6,[ 0xBB,0x30,0x39,0xA4,0x64,0xCB,0x52,0xCB ] };
2192 	// Execute the program. The thread is given so that the debugger
2193 	// knows which thread the user is viewing when executing.
2194 	HRESULT ExecuteOnThread(
2195 		/+[in]+/ IDebugThread2 pThread);
2196 };
2197 
2198 // ------------------------------------------------------------------
2199 // IDebugEngineProgram2
2200 const GUID IID_IDebugEngineProgram2 = IDebugEngineProgram2.iid;
2201 
2202 interface IDebugEngineProgram2 : IUnknown
2203 {
2204     static const GUID iid = { 0x7ce3e768,0x654d,0x4ba7,[ 0x8d,0x95,0xcd,0xaa,0xc6,0x42,0xb1,0x41 ] };
2205 
2206 	// Stop all threads running in this program
2207 	HRESULT Stop();
2208 
2209     HRESULT WatchForThreadStep(
2210 		/+[in]+/ IDebugProgram2 pOriginatingProgram,
2211         in DWORD dwTid,
2212         in BOOL fWatch,
2213         in DWORD dwFrame);
2214 
2215 	HRESULT WatchForExpressionEvaluationOnThread(
2216 		/+[in]+/ IDebugProgram2 pOriginatingProgram,
2217 		in DWORD dwTid,
2218 		in DWORD dwEvalFlags,
2219 		// pExprCallback must be NULL in V8 and above
2220 		/+[in]+/ IDebugEventCallback2 pExprCallback,
2221 		in BOOL fWatch);
2222 }
2223 enum /+ enum_WATCHFOREVAL+/ : int 
2224 {
2225 		// the program being notified is the leaf program (it owns the leaf frame)
2226 		WATCHFOREVAL_LEAF_PROGRAM = 0x10000000
2227 }
2228 alias int enum_WATCHFOREVAL;;
2229 
2230 // ------------------------------------------------------------------
2231 // IDebugProgramHost2
2232 const GUID IID_IDebugProgramHost2 = IDebugProgramHost2.iid;
2233 
2234 interface IDebugProgramHost2 : IUnknown
2235 {
2236     static const GUID iid = { 0xc99d588f,0x778c,0x44fe,[ 0x8b,0x2e,0x40,0x12,0x4a,0x73,0x88,0x91 ] };
2237 	HRESULT GetHostName(
2238         in DWORD dwType,
2239 		/+[out]+/ BSTR* pbstrHostName);
2240 
2241 	HRESULT GetHostId(
2242 		/+[out]+/ AD_PROCESS_ID* pProcessId);
2243 
2244 	HRESULT GetHostMachineName(
2245 		/+[out]+/ BSTR* pbstrHostMachineName);
2246 };
2247 
2248 // ------------------------------------------------------------------
2249 // IDebugProgramNode2
2250 const GUID IID_IDebugProgramNode2 = IDebugProgramNode2.iid;
2251 
2252 interface IDebugProgramNode2 : IUnknown
2253 {
2254     static const GUID iid = { 0x426e255c,0xf1ce,0x4d02,[ 0xa9,0x31,0xf9,0xa2,0x54,0xbf,0x7f,0x0f ] };
2255 
2256 	HRESULT GetProgramName(
2257 		/+[out]+/ BSTR* pbstrProgramName);
2258 
2259 	HRESULT GetHostName(
2260 		in GETHOSTNAME_TYPE dwHostNameType,
2261 		/+[out]+/ BSTR* pbstrHostName);
2262 
2263 	HRESULT GetHostPid(
2264 		/+[out]+/ AD_PROCESS_ID* pHostProcessId);
2265 
2266 	// method is no longer used, and does not need to be implemented
2267 	HRESULT GetHostMachineName_V7(
2268 		/+[out]+/ BSTR* pbstrHostMachineName);
2269 
2270 	// method is no longer used, and should not be implemented
2271 	HRESULT Attach_V7(
2272 		/+[in]+/ IDebugProgram2 pMDMProgram,
2273 		/+[in]+/ IDebugEventCallback2 pCallback,
2274 		in DWORD dwReason);
2275 
2276 	HRESULT GetEngineInfo(
2277 		/+[out]+/ BSTR* pbstrEngine,
2278 		/+[out]+/ GUID* pguidEngine);
2279 
2280 	// method is no longer used, and should not be implemented
2281 	HRESULT DetachDebugger_V7();
2282 }
2283 enum /+ enum_GETHOSTNAME_TYPE+/ : DWORD 
2284 {
2285 		GHN_FRIENDLY_NAME,	// Gets friendly name of the host
2286 		GHN_FILE_NAME,
2287 }
2288 alias DWORD enum_GETHOSTNAME_TYPE;
2289 alias DWORD GETHOSTNAME_TYPE;;
2290 
2291 const GUID IID_IDebugProgramNodeAttach2 = IDebugProgramNodeAttach2.iid;
2292 
2293 interface IDebugProgramNodeAttach2 : IUnknown
2294 {
2295     static const GUID iid = { 0x73faa608,0x5f87,0x4d2b,[ 0x95,0x51,0x84,0x40,0xb1,0xcb,0xf5,0x4c ] };
2296 	// This is the whidbey replacement for IDebugProgramNode2::Attach.
2297 	// This gives a program node a chance to say that it doesn't want
2298 	// to be debugged, and to know the program id on the port
2299 	// supplier program
2300 	HRESULT OnAttach(
2301 		in GUID* guidProgramId);
2302 };
2303 
2304 // ------------------------------------------------------------------
2305 // IDebugProgramEngines2
2306 //
2307 // IDebugProgramEngines2 is implemented by program nodes to indicate
2308 // all the possible DEs that can debug this program. Once a DE is
2309 // chosen (via some UI) that choice is registered by calling SetEngine.
2310 // This engine will then be the engine returned by
2311 // IDebugProgramNode::GetEngineInfo.
2312 const GUID IID_IDebugProgramEngines2 = IDebugProgramEngines2.iid;
2313 
2314 interface IDebugProgramEngines2 : IUnknown
2315 {
2316     static const GUID iid = { 0xfda24a6b,0xb142,0x447d,[ 0xbb,0xbc,0x86,0x54,0xa3,0xd8,0x4f,0x80 ] };
2317 	// In order to determine how many engines there are, call once
2318 	// with celtBuffer set to 0 and rgguidEngines set to NULL. This
2319 	// function will return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
2320 	// anytime the buffer is too small and *pceltEngines will contain
2321 	// the necessary size of the buffer.
2322 	HRESULT EnumPossibleEngines(
2323 		in DWORD celtBuffer,
2324 		/+[in, out, ptr, size_is(celtBuffer), length_is(*pceltEngines)]+/ GUID* rgguidEngines,
2325 		/+[in, out]+/ DWORD* pceltEngines);
2326 
2327 	// Tell the program/program node which engine to use for debugging this program
2328 	HRESULT SetEngine(
2329 		in GUID* guidEngine);
2330 };
2331 
2332 // ------------------------------------------------------------------
2333 // IDebugCOMPlusProgramNode2
2334 const GUID IID_IDebugCOMPlusProgramNode2 = IDebugCOMPlusProgramNode2.iid;
2335 
2336 interface IDebugCOMPlusProgramNode2 : IUnknown
2337 {
2338     static const GUID iid = { 0xd6f7d3d0,0x506a,0x448f,[ 0x87,0x02,0x46,0xeb,0x27,0x45,0xe4,0xfc ] };
2339 	HRESULT GetAppDomainId(
2340 		/+[out]+/ ULONG32* pul32Id);
2341 };
2342 
2343 // ------------------------------------------------------------------
2344 // IDebugSQLCLRProgramNode2
2345 const GUID IID_IDebugSQLCLRProgramNode2 = IDebugSQLCLRProgramNode2.iid;
2346 
2347 interface IDebugSQLCLRProgramNode2 : IUnknown
2348 {
2349     static const GUID iid = { 0xF617DFCB,0x0045,0x4024,[ 0x83,0x7B,0x7A,0xCA,0xD8,0xF4,0xD6,0x7B ] };
2350 	HRESULT GetConnectionId(
2351 		/+[out]+/ DWORD* pdwId);
2352 };
2353 
2354 // ------------------------------------------------------------------
2355 // IDebugThread2
2356 const GUID IID_IDebugThread2 = IDebugThread2.iid;
2357 
2358 interface IDebugThread2 : IUnknown
2359 {
2360     static const GUID iid = { 0xd5168050,0xa57a,0x465c,[ 0xbe,0xa9,0x97,0x4f,0x40,0x5e,0xba,0x13 ] };
2361 
2362 	HRESULT EnumFrameInfo(
2363 		in  FRAMEINFO_FLAGS dwFieldSpec,
2364 		in  UINT nRadix,
2365 		/+[out]+/ IEnumDebugFrameInfo2 * ppEnum);
2366 
2367 	HRESULT GetName(
2368 		/+[out]+/ BSTR* pbstrName);
2369 
2370 	HRESULT SetThreadName(
2371 		in LPCOLESTR pszName);
2372 
2373 	HRESULT GetProgram(
2374 		/+[out]+/ IDebugProgram2 * ppProgram);
2375 
2376     HRESULT CanSetNextStatement(
2377 		/+[in]+/ IDebugStackFrame2 pStackFrame,
2378 		/+[in]+/ IDebugCodeContext2 pCodeContext);
2379 
2380 	HRESULT SetNextStatement (
2381 		/+[in]+/ IDebugStackFrame2 pStackFrame,
2382 		/+[in]+/ IDebugCodeContext2 pCodeContext);
2383 
2384 	HRESULT GetThreadId(
2385 		/+[out]+/ DWORD* pdwThreadId);
2386 
2387     HRESULT Suspend(
2388         /+[out]+/ DWORD *pdwSuspendCount);
2389 
2390     HRESULT Resume(
2391         /+[out]+/ DWORD *pdwSuspendCount);
2392 
2393     HRESULT GetThreadProperties(
2394 		in THREADPROPERTY_FIELDS dwFields,
2395         /+[out]+/ THREADPROPERTIES *ptp);
2396 
2397 	HRESULT GetLogicalThread(
2398 		/+[in]+/ IDebugStackFrame2 pStackFrame,
2399 		/+[out]+/ IDebugLogicalThread2 *ppLogicalThread);
2400 }
2401 enum /+ enum_THREADSTATE+/ : DWORD 
2402 {
2403 		// The thread is running
2404 		THREADSTATE_RUNNING		= 0x0001,
2405 		// The thread is stopped because of a breakpoint
2406 		THREADSTATE_STOPPED		= 0x0002,
2407 		// The thread has been created, but is not yet running code
2408 		THREADSTATE_FRESH		= 0x0003,
2409 		// The thread is dead
2410 		THREADSTATE_DEAD		= 0x0004,
2411 		// The thread is frozen (no execution can be performed)
2412 		THREADSTATE_FROZEN		= 0x0005,
2413 }
2414 alias DWORD enum_THREADSTATE;
2415 alias DWORD THREADSTATE;
2416 enum /+ enum_THREADPROPERTY_FIELDS+/ : DWORD 
2417 {
2418 		TPF_ID				= 0x0001,
2419 		TPF_SUSPENDCOUNT	= 0x0002,
2420 		TPF_STATE			= 0x0004,
2421 		TPF_PRIORITY		= 0x0008,
2422 		TPF_NAME			= 0x0010,
2423 		TPF_LOCATION		= 0x0020,
2424 
2425 		TPF_ALLFIELDS		= 0xffffffff,
2426 }
2427 alias DWORD enum_THREADPROPERTY_FIELDS;
2428 alias DWORD THREADPROPERTY_FIELDS;
2429 struct _tagTHREADPROPERTIES
2430 {
2431 		THREADPROPERTY_FIELDS dwFields;
2432         DWORD dwThreadId;
2433         DWORD dwSuspendCount;
2434 		DWORD dwThreadState;
2435         BSTR bstrPriority;
2436         BSTR bstrName;
2437 		BSTR bstrLocation;
2438 }
2439 alias _tagTHREADPROPERTIES THREADPROPERTIES;
2440 enum /+ enum_FRAMEINFO_FLAGS+/ : DWORD 
2441 {
2442 		// FRAMEINFO fields
2443 		FIF_FUNCNAME	        	= 0x00000001,
2444 		FIF_RETURNTYPE	        	= 0x00000002,
2445 		FIF_ARGS		        	= 0x00000004,
2446 		FIF_LANGUAGE	        	= 0x00000008,
2447 		FIF_MODULE		        	= 0x00000010, // The name of the module (m_bstrModule)
2448 		FIF_STACKRANGE	         	= 0x00000020,
2449 		FIF_FRAME		        	= 0x00000040,
2450 		FIF_DEBUGINFO	        	= 0x00000080,
2451 		FIF_STALECODE	        	= 0x00000100,
2452 		FIF_FLAGS			        = 0x00000200,
2453 		FIF_DEBUG_MODULEP           = 0x00000400, // the IDebugModule2* for this frame. (m_pModule)
2454 
2455 		// Function name formatting
2456 
2457 		// Fill in the m_bstrFuncName field as a single string using all the flags specified below
2458         // Specifying FIF_FUNCNAME | FIF_FUNCNAME_FORMAT | FIF_FUNCNAME_RETURNTYPE | FIF_FUNCNAME_ARGS | FIF_FUNCNAME_ARGS_TYPE | FIF_FUNCNAME_ARGS_NAMES | FIF_FUNCNAME_ARGS_VALUES
2459         // Results in: int CFoo::foo(int x = 1, int y = 2)
2460 
2461 		FIF_FUNCNAME_FORMAT         = 0x00001000,
2462         // Add the return type to the formatted function name
2463 		FIF_FUNCNAME_RETURNTYPE     = 0x00002000,
2464         // Add the args to the formatted function name
2465 		FIF_FUNCNAME_ARGS           = 0x00004000,
2466         // Add the language to the formatted function name
2467 		FIF_FUNCNAME_LANGUAGE       = 0x00008000,
2468 		// Add the module name to the formatted function name
2469 		FIF_FUNCNAME_MODULE         = 0x00010000,
2470 		// Add the number of lines to the end of the function name
2471 		FIF_FUNCNAME_LINES          = 0x00020000,
2472 		// Add the bytes offset to the end of the function name
2473 		FIF_FUNCNAME_OFFSET         = 0x00040000,
2474 
2475         // Function name argument formatting
2476 
2477 		// Format the args in the formatted function name (example: (x = 3, y = 4))
2478 		FIF_FUNCNAME_ARGS_TYPES		= 0x00100000,
2479 		FIF_FUNCNAME_ARGS_NAMES		= 0x00200000,
2480 		FIF_FUNCNAME_ARGS_VALUES	= 0x00400000,
2481 
2482         FIF_FUNCNAME_ARGS_ALL       = 0x00700000,
2483 
2484         // Argument formatting (in m_bstrArgs)
2485         FIF_ARGS_TYPES              = 0x01000000,
2486         FIF_ARGS_NAMES              = 0x02000000,
2487         FIF_ARGS_VALUES             = 0x04000000,
2488 
2489         FIF_ARGS_ALL                = 0x07000000,
2490 
2491 		// If a client wants to be able to manipulate each arg separately,
2492 		// set the FIF_ARGS_NOFORMAT and each FIF_ARGS_* flag will cause a
2493 		// null-termianted string to be added to m_bstrArgs.
2494 		// m_bstrArgs will then contain a series of null-terminated strings--
2495 		// one string per flag per arg. For example, if the name and value
2496 		// flag are set and there are two args x and y, the string would be
2497 		// "x<null char>3<null char>y<null char>4<null char>".
2498 		FIF_ARGS_NOFORMAT       	= 0x08000000,
2499 
2500 		// For argument values, set FIF_ARGS_NO_FUNC_EVAL to turn off
2501 		// function (property) evaluation when retrieving argument values.
2502 		// This applies to whether arguments are being formatted in
2503 		// the function name string or in m_bstrArgs.  See also 
2504         // FIF_ARGS_NO_TOSTRING.
2505 		FIF_ARGS_NO_FUNC_EVAL		= 0x10000000,
2506 
2507 		// Have the engine to filter user code frames. (Perf)
2508 		FIF_FILTER_NON_USER_CODE    = 0x20000000,
2509 
2510         // Do not allow ToString() func-evals when returning function arguments.
2511         FIF_ARGS_NO_TOSTRING        = 0x40000000,
2512 
2513 	// frame info should be gotten from the hosted app-domain
2514 	// rather than the hosting process.
2515 	FIF_DESIGN_TIME_EXPR_EVAL   = 0x80000000,
2516 
2517 		// Include all frames
2518 		FIF_FILTER_INCLUDE_ALL     = 0x00080000
2519 }
2520 alias DWORD enum_FRAMEINFO_FLAGS;
2521 alias DWORD FRAMEINFO_FLAGS;
2522 enum /+ enum_FRAMEINFO_FLAGS_VALUES+/ : DWORD 
2523 {
2524 		FIFV_ANNOTATEDFRAME = 0x00000001,
2525         FIFV_NON_USER_CODE  = 0x00000002,
2526         FIFV_CANINTERCEPT_EXCEPTION = 0x00000004,
2527         FIFV_FUNCEVALFRAME = 0x00000008,
2528 }
2529 alias DWORD enum_FRAMEINFO_FLAGS_VALUES;
2530 alias DWORD FRAMEINFO_FLAGS_VALUES;
2531 struct tagFRAMEINFO
2532 {
2533 		FRAMEINFO_FLAGS			m_dwValidFields;	// which FRAMEINFO fields were successfully initialized
2534 		BSTR					m_bstrFuncName;		// function name
2535 		BSTR					m_bstrReturnType;	// function return type
2536 		BSTR					m_bstrArgs;			// function arguments (
2537 		BSTR					m_bstrLanguage;		// language name
2538 		BSTR					m_bstrModule;		// module name (i.e. "msvcrt.dll" or "Test.class")
2539 		UINT64					m_addrMin;			// minimum physical stack address
2540 		UINT64					m_addrMax;			// maximum physical stack address
2541 		IDebugStackFrame2		m_pFrame;			// IDebugStackFrame2 object corresponding to this stack frame
2542 		IDebugModule2			m_pModule;			// Module this frame is in.
2543 		BOOL                    m_fHasDebugInfo;    // TRUE if there is debug information in that frame.
2544 		BOOL					m_fStaleCode;		// TRUE if frame corresponds to stale code
2545 		DWORD					m_dwFlags;
2546 }
2547 alias tagFRAMEINFO FRAMEINFO;;
2548 
2549 // ------------------------------------------------------------------
2550 // IDebugLogicalThread2
2551 // {95E4AC61-D37E-4fce-B6C6-C05A80AB946A}
2552 // DEFINE_GUID(<<name>>,
2553 // 0x95e4ac61, 0xd37e, 0x4fce, 0xb6, 0xc6, 0xc0, 0x5a, 0x80, 0xab, 0x94, 0x6a);
2554 const GUID IID_IDebugLogicalThread2 = IDebugLogicalThread2.iid;
2555 
2556 interface IDebugLogicalThread2 : IUnknown
2557 {
2558     static const GUID iid = { 0x88d2f75b,0xd329,0x4e03,[ 0x9b,0x75,0x20,0x1f,0x77,0x82,0xd8,0xbd ] };
2559 	HRESULT EnumFrameInfo
2560 	(
2561 		in  FRAMEINFO_FLAGS dwFieldSpec,
2562 		in  UINT nRadix,
2563 		/+[out]+/ IEnumDebugFrameInfo2 * ppEnum
2564 	);
2565 };
2566 
2567 // ------------------------------------------------------------------
2568 // IDebugThread3
2569 // {43D24196-0000-467f-8C6B-9C006922D02F}
2570 const GUID IID_IDebugThread3 = IDebugThread3.iid;
2571 
2572 interface IDebugThread3 : IDebugThread2
2573 {
2574     static const GUID iid = { 0x43D24196,0x0000,0x467f,[ 0x8C,0x6B,0x9C,0x00,0x69,0x22,0xD0,0x2F ] };
2575 	// Returns S_OK if there is a current exception, S_FALSE if there isn't.
2576 	HRESULT IsCurrentException();
2577 
2578 	// Determines If the leaf frame will remap immeadiately after an apply.
2579 	// It cannot determine if the IP is in a finally clause.  The user
2580 	// must also query IDebugENC2::IsLeafRemapPossible to handle that.
2581 	HRESULT CanRemapLeafFrame();
2582 	
2583 	// Force the leaf frame to remap.  Will only succeed if CanRemapLeafFrame
2584 	// would return S_OK.
2585 	HRESULT RemapLeafFrame();
2586 }; 
2587 
2588 // -----------------------------------------------------------------------
2589 // IDebugProperty2 and IDebugReference2 attributes
2590 
2591 enum DBG_ATTRIB_NONE =					0x0000000000000000;
2592 enum DBG_ATTRIB_ALL =					0xffffffffffffffff;
2593 
2594 // Attributes about the object itself
2595 
2596 // The reference/property is expandable
2597 enum DBG_ATTRIB_OBJ_IS_EXPANDABLE =		0x0000000000000001;
2598 
2599 // This property indicates that an id for this object has been created.
2600 enum DBG_ATTRIB_OBJ_HAS_ID =            0x0000000000000002;
2601 // This property indicates that an id for this object can be created.
2602 enum DBG_ATTRIB_OBJ_CAN_HAVE_ID =            0x0000000000000004;
2603 
2604 // Attributes about the value of the object
2605 
2606 // The value of this reference/property is read only
2607 enum DBG_ATTRIB_VALUE_READONLY =		0x0000000000000010;
2608 // The value is an error
2609 enum DBG_ATTRIB_VALUE_ERROR =			0x0000000000000020;
2610 // The evaluation caused a side effect
2611 enum DBG_ATTRIB_VALUE_SIDE_EFFECT =		0x0000000000000040;
2612 // This property is really a container of overloads
2613 enum DBG_ATTRIB_OVERLOADED_CONTAINER =	0x0000000000000080;
2614 // This property is a boolean value
2615 enum DBG_ATTRIB_VALUE_BOOLEAN =			0x0000000000000100;
2616 // If DBG_ATTRIB_VALUE_BOOLEAN is set,
2617 // then this flag indicates whether the boolean value is true or false
2618 enum DBG_ATTRIB_VALUE_BOOLEAN_TRUE =	0x0000000000000200;
2619 // The value for this property is invalid (i.e. has no value)
2620 enum DBG_ATTRIB_VALUE_INVALID =			0x0000000000000400;
2621 // The value for this property is NAT (not a thing)
2622 enum DBG_ATTRIB_VALUE_NAT =				0x0000000000000800;
2623 // The value for this property has possibly been autoexpanded
2624 enum DBG_ATTRIB_VALUE_AUTOEXPANDED =	0x0000000000001000;
2625 // This property indicates an evaluation timed-out
2626 enum DBG_ATTRIB_VALUE_TIMEOUT =     	0x0000000000002000;
2627 // This property indicates that this property can be represented by a raw string
2628 enum DBG_ATTRIB_VALUE_RAW_STRING =      0x0000000000004000;
2629 // This property indicates that this property has a custom viewer
2630 enum DBG_ATTRIB_VALUE_CUSTOM_VIEWER =   0x0000000000008000;
2631 
2632 // Attributes that describe field access control
2633 enum DBG_ATTRIB_ACCESS_NONE =			0x0000000000010000;
2634 enum DBG_ATTRIB_ACCESS_PUBLIC =			0x0000000000020000;
2635 enum DBG_ATTRIB_ACCESS_PRIVATE =		0x0000000000040000;
2636 enum DBG_ATTRIB_ACCESS_PROTECTED =		0x0000000000080000;
2637 enum DBG_ATTRIB_ACCESS_FINAL =			0x0000000000100000;
2638 
2639 enum DBG_ATTRIB_ACCESS_ALL =			0x00000000001f0000;
2640 
2641 // Attributes that describe storage types
2642 enum DBG_ATTRIB_STORAGE_NONE =			0x0000000001000000;
2643 enum DBG_ATTRIB_STORAGE_GLOBAL =		0x0000000002000000;
2644 enum DBG_ATTRIB_STORAGE_STATIC =		0x0000000004000000;
2645 enum DBG_ATTRIB_STORAGE_REGISTER =		0x0000000008000000;
2646 
2647 enum DBG_ATTRIB_STORAGE_ALL =			0x000000000f000000;
2648 
2649 // Attributes that describe type modifiers
2650 enum DBG_ATTRIB_TYPE_NONE =				0x0000000100000000;
2651 enum DBG_ATTRIB_TYPE_VIRTUAL =			0x0000000200000000;
2652 enum DBG_ATTRIB_TYPE_CONSTANT =			0x0000000400000000;
2653 enum DBG_ATTRIB_TYPE_SYNCHRONIZED =		0x0000000800000000;
2654 enum DBG_ATTRIB_TYPE_VOLATILE =			0x0000001000000000;
2655 
2656 enum DBG_ATTRIB_TYPE_ALL =				0x0000001f00000000;
2657 
2658 // Attributes that describe the IDebugProperty2 type
2659 enum DBG_ATTRIB_DATA =					0x0000010000000000;
2660 enum DBG_ATTRIB_METHOD =				0x0000020000000000;
2661 enum DBG_ATTRIB_PROPERTY =				0x0000040000000000;
2662 enum DBG_ATTRIB_CLASS =					0x0000080000000000;
2663 enum DBG_ATTRIB_BASECLASS =				0x0000100000000000;
2664 enum DBG_ATTRIB_INTERFACE =				0x0000200000000000;
2665 enum DBG_ATTRIB_INNERCLASS =			0x0000400000000000;
2666 enum DBG_ATTRIB_MOSTDERIVEDCLASS =		0x0000800000000000;
2667 
2668 enum DBG_ATTRIB_CHILD_ALL =				0x0000ff0000000000;
2669 
2670 enum DBG_ATTRIB_MULTI_CUSTOM_VIEWERS =  0x0001000000000000;
2671 enum DBG_ATTRIB_EVENT =                 0x0002000000000000;
2672 
2673 alias UINT64 DBG_ATTRIB_FLAGS;
2674 
2675 // -----------------------------------------------------------------------
2676 // IDebugProperty2
2677 
2678 enum /+ enum_DEBUGPROP_INFO_FLAGS+/ : DWORD 
2679 {
2680 	DEBUGPROP_INFO_FULLNAME					= 0x00000001,
2681 	DEBUGPROP_INFO_NAME						= 0x00000002,
2682 	DEBUGPROP_INFO_TYPE						= 0x00000004,
2683 	DEBUGPROP_INFO_VALUE					= 0x00000008,
2684 	DEBUGPROP_INFO_ATTRIB					= 0x00000010,
2685 	DEBUGPROP_INFO_PROP						= 0x00000020,
2686 
2687 	DEBUGPROP_INFO_VALUE_AUTOEXPAND			= 0x00010000,
2688 	DEBUGPROP_INFO_NOFUNCEVAL				= 0x00020000,   // Tell EE not to perform ANY type of func-eval.
2689 	DEBUGPROP_INFO_VALUE_RAW				= 0x00040000,   // Tell EE not to return any beautified values or members.
2690 	DEBUGPROP_INFO_VALUE_NO_TOSTRING		= 0x00080000,   // Tell EE not to return any special synthesized values (ToString() for instance).
2691 	DEBUGPROP_INFO_NO_NONPUBLIC_MEMBERS		= 0x00100000,   // Tell EE to return non-public members for non-user objects.
2692 
2693 	DEBUGPROP_INFO_NONE					= 0x00000000,
2694 	DEBUGPROP_INFO_STANDARD				= DEBUGPROP_INFO_ATTRIB | DEBUGPROP_INFO_NAME | DEBUGPROP_INFO_TYPE | DEBUGPROP_INFO_VALUE,
2695 	DEBUGPROP_INFO_ALL					= 0xffffffff
2696 }
2697 alias DWORD enum_DEBUGPROP_INFO_FLAGS;
2698 alias DWORD DEBUGPROP_INFO_FLAGS;
2699 
2700 struct tagDEBUG_PROPERTY_INFO
2701 {
2702 	DEBUGPROP_INFO_FLAGS	dwFields;
2703 	BSTR					bstrFullName;
2704 	BSTR					bstrName;
2705 	BSTR					bstrType;
2706 	BSTR					bstrValue;
2707 	IDebugProperty2		pProperty;
2708 	DBG_ATTRIB_FLAGS		dwAttrib;
2709 }
2710 alias tagDEBUG_PROPERTY_INFO DEBUG_PROPERTY_INFO;
2711 
2712 struct tagDEBUG_CUSTOM_VIEWER
2713 {
2714     DWORD dwID;                 // An ID to differentiate multiple viewers implemented by one guid.
2715     BSTR bstrMenuName;          // The text that will appear in the drop-down menu.
2716     BSTR bstrDescription;       // A description of the Custom Viewer (NULL if not used)
2717     GUID guidLang;              // Language of the providing EE
2718     GUID guidVendor;            // Vendor of the providing EE
2719     BSTR bstrMetric;
2720 }
2721 alias tagDEBUG_CUSTOM_VIEWER DEBUG_CUSTOM_VIEWER;
2722 
2723 const GUID IID_IDebugProperty2 = IDebugProperty2.iid;
2724 
2725 interface IDebugProperty2 : IUnknown
2726 {
2727     static const GUID iid = { 0xa7ee3e7e,0x2dd2,0x4ad7,[ 0x96,0x97,0xf4,0xaa,0xe3,0x42,0x77,0x62 ] };
2728 	// Get the DEBUG_PROPERTY_INFO that describes this property
2729 	HRESULT GetPropertyInfo(
2730 		in DEBUGPROP_INFO_FLAGS dwFields,
2731 		in DWORD dwRadix,
2732 		in DWORD dwTimeout,
2733 		/+[ ptr , size_is(dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs,
2734 		in DWORD dwArgCount,
2735 		/+[out]+/ DEBUG_PROPERTY_INFO* pPropertyInfo);
2736 
2737 	// Set the value of this property
2738 	HRESULT SetValueAsString(
2739 		in LPCOLESTR pszValue,
2740 		in DWORD dwRadix,
2741 		in DWORD dwTimeout);
2742 
2743 	// Set the value of this property
2744 	HRESULT SetValueAsReference(
2745 		/+[ ptr , size_is(dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs,
2746 		in DWORD dwArgCount,
2747 		/+[in]+/ IDebugReference2 pValue,
2748 		in DWORD dwTimeout);
2749 
2750 	// Enum the children of this property
2751 	HRESULT EnumChildren(
2752 		in DEBUGPROP_INFO_FLAGS dwFields,
2753 		in DWORD dwRadix,
2754 		in GUID* guidFilter,
2755 		in DBG_ATTRIB_FLAGS dwAttribFilter,
2756 		/+[ ptr]+/ in LPCOLESTR pszNameFilter,
2757 		in DWORD dwTimeout,
2758 		/+[out]+/ IEnumDebugPropertyInfo2 * ppEnum);
2759 
2760 	// Get the parent of this property
2761 	HRESULT GetParent(
2762 		/+[out]+/ IDebugProperty2 * ppParent);
2763 
2764 	// Get the property that describes the derived most property of this property
2765 	HRESULT GetDerivedMostProperty(
2766 		/+[out]+/ IDebugProperty2 * ppDerivedMost);
2767 
2768 	// Get the memory bytes that contains this property
2769 	HRESULT GetMemoryBytes(
2770 		/+[out]+/ IDebugMemoryBytes2 * ppMemoryBytes);
2771 
2772 	// Get a memory context for this property within the memory bytes returned by GetMemoryBytes
2773 	HRESULT GetMemoryContext(
2774 		/+[out]+/ IDebugMemoryContext2 * ppMemory);
2775 
2776 	// Get the size (in bytes) of this property
2777 	HRESULT GetSize(
2778 		/+[out]+/ DWORD* pdwSize);
2779 
2780 	// Get a reference for this property
2781 	HRESULT GetReference(
2782 		/+[out]+/ IDebugReference2 * ppReference);
2783 
2784 	// Get extended info for this property
2785 	HRESULT GetExtendedInfo(
2786 		in GUID* guidExtendedInfo,
2787 		/+[out]+/ VARIANT* pExtendedInfo);
2788 };
2789 
2790 // Note: This interface is new in 8.0. It is a way for the shell to tell the SDM
2791 // that an IDebugProperty is no longer used. This isn't important for an appartment
2792 // model shell, but is important for a free threaded shell
2793 // #pragma warning(push)
2794 // #pragma warning(disable:28718)
2795 const GUID IID_IDebugSessionProperty2 = IDebugSessionProperty2.iid;
2796 
2797 interface IDebugSessionProperty2 : IDebugProperty3
2798 {
2799     static const GUID iid = { 0x72ff2712,0x0bc3,0x4308,[ 0xa9,0x9d,0x26,0xac,0x7e,0xc6,0x8c,0x5f ] };
2800 	HRESULT Close();
2801 	HRESULT GetThread(
2802 		/+[out]+/ IDebugThread3 * ppThread);
2803 };
2804 // #pragma warning(pop)
2805 
2806 // Note: this interface is new in 8.0. Debug engines should implement this interface
2807 // if they need WatchForExpressionEval called in order to destroy an IDebugProperty
2808 const GUID IID_IDebugPropertyClose2 = IDebugPropertyClose2.iid;
2809 
2810 interface IDebugPropertyClose2 : IDebugProperty2
2811 {
2812     static const GUID iid = { 0x852c7d42,0x794f,0x43cd,[ 0xa1,0x8f,0xcd,0x40,0xe8,0x3e,0x67,0xcd ] };
2813 	HRESULT Close();
2814 };
2815 
2816 // #pragma warning(push)
2817 // #pragma warning(disable:28718)
2818 const GUID IID_IDebugProperty3 = IDebugProperty3.iid;
2819 
2820 interface IDebugProperty3 : IDebugProperty2
2821 {
2822     static const GUID iid = { 0x94E1E004,0x0672,0x423d,[ 0xAD,0x62,0x78,0x78,0x3D,0xEF,0x1E,0x76 ] };
2823 	// How long is the underlying string (in chars)? (excludes terminating byte)
2824 	HRESULT GetStringCharLength( /+[out]+/ ULONG *pLen );
2825 
2826 	// Get the actual string contents (excludes terminating byte)
2827 	HRESULT GetStringChars(
2828 		in ULONG buflen,
2829 		/+[out, size_is(buflen), length_is(*pceltFetched)]+/ WCHAR *rgString,
2830 		/+[out]+/ ULONG *pceltFetched
2831 	);
2832 
2833     // created the id for this object
2834     HRESULT CreateObjectID();
2835 
2836     // destroy the id for this object
2837     HRESULT DestroyObjectID();
2838 
2839     // Support for custom visualizers
2840     HRESULT GetCustomViewerCount(/+[out]+/ ULONG* pcelt);
2841     HRESULT GetCustomViewerList(in ULONG celtSkip, in ULONG celtRequested, 
2842 		/+[out, size_is(celtRequested),length_is(*pceltFetched)]+/ DEBUG_CUSTOM_VIEWER* rgViewers, 
2843 		/+[out]+/ ULONG* pceltFetched);
2844 
2845     // Set the value of this property
2846 	HRESULT SetValueAsStringWithError(
2847 		in LPCOLESTR pszValue,
2848 		in DWORD dwRadix,
2849 		in DWORD dwTimeout,
2850         /+[out]+/ BSTR * errorString);
2851 };
2852 // #pragma warning(pop)
2853 
2854 // Note: This interface is new in 8.0.  It is a way for the shell to be able to
2855 //       show a grid of data from an expression.
2856 const GUID IID_IDebugDataGrid = IDebugDataGrid.iid;
2857 
2858 interface IDebugDataGrid : IUnknown
2859 {
2860     static const GUID iid = { 0x411F3E08,0xE6B1,0x4789,[ 0xAB,0x29,0x75,0x5C,0x52,0xE5,0x2A,0xC4 ] };
2861 	HRESULT GetGridInfo(
2862 		/+[out]+/ ULONG *pX,
2863 		/+[out]+/ ULONG *pY,
2864 		/+[out]+/ BSTR *bpstrTitle
2865 		);
2866 
2867 	HRESULT GetGridPropertyInfo(
2868 		ULONG x,
2869 		ULONG y,
2870 		ULONG celtX,
2871 		ULONG celtY,
2872 		ULONG celtXtimesY,
2873 		DEBUGPROP_INFO_FLAGS dwFields,
2874 		DWORD dwRadix,
2875 		/+[out, size_is(celtXtimesY), length_is(*pceltFetched)]+/ DEBUG_PROPERTY_INFO* rgelt,
2876 		/+[out]+/ ULONG* pceltFetched
2877 		);
2878 };
2879 
2880 // Note: This interface is new in 8.0. Only the SDM needs to implement it
2881 // It is for the shell to ensure extended property evaluation works correctly
2882 // when multiple engines are involved, and to extract a raw interface from a wrapped one
2883 const GUID IID_IDebugPropertySafetyWrapper = IDebugPropertySafetyWrapper.iid;
2884 
2885 interface IDebugPropertySafetyWrapper : IUnknown
2886 {
2887     static const GUID iid = { 0x7031886B,0x61D2,0x4cb5,[ 0xB9,0x09,0x00,0x38,0x60,0x90,0x73,0x3B ] };
2888 	HRESULT BeforePropertyCall();
2889 	HRESULT AfterPropertyCall();
2890 	HRESULT GetRawProperty( /+[out]+/ IDebugProperty3 * ppProperty);
2891 }
2892 
2893 // -----------------------------------------------------------------------
2894 // IDebugReference2
2895 
2896 enum /+ enum_REFERENCE_TYPE+/ : DWORD 
2897 {
2898 	// Weak reference
2899 	REF_TYPE_WEAK						= 0x0001,
2900 	// Strong reference
2901 	REF_TYPE_STRONG						= 0x0002,
2902 }
2903 alias DWORD enum_REFERENCE_TYPE;
2904 alias DWORD REFERENCE_TYPE;
2905 
2906 enum /+ enum_DEBUGREF_INFO_FLAGS+/ : DWORD 
2907 {
2908 	DEBUGREF_INFO_NAME					= 0x00000001,
2909 	DEBUGREF_INFO_TYPE					= 0x00000002,
2910 	DEBUGREF_INFO_VALUE					= 0x00000004,
2911 	DEBUGREF_INFO_ATTRIB				= 0x00000008,
2912 	DEBUGREF_INFO_REFTYPE				= 0x00000010,
2913 	DEBUGREF_INFO_REF					= 0x00000020,
2914 
2915 	DEBUGREF_INFO_VALUE_AUTOEXPAND		= 0x00010000,
2916 
2917 	DEBUGREF_INFO_NONE					= 0x00000000,
2918 	DEBUGREF_INFO_ALL					= 0xffffffff
2919 }
2920 alias DWORD enum_DEBUGREF_INFO_FLAGS;
2921 alias DWORD DEBUGREF_INFO_FLAGS;
2922 
2923 struct tagDEBUG_REFERENCE_INFO
2924 {
2925 	DEBUGREF_INFO_FLAGS		dwFields;
2926 	BSTR					bstrName;
2927 	BSTR					bstrType;
2928 	BSTR					bstrValue;
2929 	DBG_ATTRIB_FLAGS		dwAttrib;
2930 	REFERENCE_TYPE			dwRefType;
2931 	IDebugReference2		pReference;
2932 }
2933 alias tagDEBUG_REFERENCE_INFO DEBUG_REFERENCE_INFO;
2934 
2935 const GUID IID_IDebugReference2 = IDebugReference2.iid;
2936 
2937 interface IDebugReference2 : IUnknown
2938 {
2939     static const GUID iid = { 0x10b793ac,0x0c47,0x4679,[ 0x84,0x54,0xad,0xb3,0x6f,0x29,0xf8,0x02 ] };
2940 
2941     // Get the DEBUG_REFERENCE_INFO that describes this reference
2942 	HRESULT GetReferenceInfo(
2943 		in DEBUGREF_INFO_FLAGS dwFields,
2944 		in DWORD dwRadix,
2945 		in DWORD dwTimeout,
2946 		/+[ size_is (dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs,
2947 		in DWORD dwArgCount,
2948 		/+[out]+/ DEBUG_REFERENCE_INFO* pReferenceInfo);
2949 
2950 	// Set the value of this reference
2951 	HRESULT SetValueAsString(
2952 		in LPCOLESTR pszValue,
2953 		in DWORD dwRadix,
2954 		in DWORD dwTimeout);
2955 
2956 	// Set the value of this reference
2957 	HRESULT SetValueAsReference(
2958 		/+[ size_is (dwArgCount), length_is(dwArgCount)]+/ /+[in]+/ IDebugReference2 * rgpArgs,
2959 		in DWORD dwArgCount,
2960 		/+[in]+/ IDebugReference2 pValue,
2961 		in DWORD dwTimeout);
2962 
2963 	// Enum the children of this reference
2964 	HRESULT EnumChildren(
2965 		in DEBUGREF_INFO_FLAGS dwFields,
2966 		in DWORD dwRadix,
2967 		in DBG_ATTRIB_FLAGS dwAttribFilter,
2968 		/+[ ptr]+/ in LPCOLESTR pszNameFilter,
2969 		in DWORD dwTimeout,
2970 		/+[out]+/ IEnumDebugReferenceInfo2 * ppEnum);
2971 
2972 	// Get the parent of this reference
2973 	HRESULT GetParent(
2974 		/+[out]+/ IDebugReference2 * ppParent);
2975 
2976 	// Get the reference that describes the derived most reference of this reference
2977 	HRESULT GetDerivedMostReference(
2978 		/+[out]+/ IDebugReference2 * ppDerivedMost);
2979 
2980 	// Get the memory bytes that contains this reference
2981 	HRESULT GetMemoryBytes(
2982 		/+[out]+/ IDebugMemoryBytes2 * ppMemoryBytes);
2983 
2984 	// Get a memory context for this reference within the memory bytes returned by GetMemoryBytes
2985 	HRESULT GetMemoryContext(
2986 		/+[out]+/ IDebugMemoryContext2 * ppMemory);
2987 
2988 	// Get the size (in bytes) of this reference
2989 	HRESULT GetSize(
2990 		/+[out]+/ DWORD* pdwSize);
2991 
2992 	// Set the reference type (weak or strong)
2993 	HRESULT SetReferenceType(
2994 		in REFERENCE_TYPE dwRefType);
2995 
2996 	// Compare this reference with the one given in the matter given
2997 	// result = this cwCompare pReference
2998 	HRESULT Compare(
2999 		in REFERENCE_COMPARE dwCompare,
3000 		/+[in]+/ IDebugReference2 pReference);
3001 }
3002 enum /+ enum_REFERENCE_COMPARE+/ : DWORD 
3003 {
3004 		REF_COMPARE_EQUAL				= 0x0001,
3005 		REF_COMPARE_LESS_THAN			= 0x0002,
3006 		REF_COMPARE_GREATER_THAN		= 0x0003,
3007 }
3008 alias DWORD enum_REFERENCE_COMPARE;
3009 alias DWORD REFERENCE_COMPARE;;
3010 
3011 // ------------------------------------------------------------------
3012 // IDebugStackFrame2
3013 const GUID IID_IDebugStackFrame2 = IDebugStackFrame2.iid;
3014 
3015 interface IDebugStackFrame2 : IUnknown
3016 {
3017     static const GUID iid = { 0x1412926f,0x5dd6,0x4e58,[ 0xb6,0x48,0xe1,0xc6,0x3e,0x01,0x3d,0x51 ] };
3018 	HRESULT GetCodeContext(
3019 		/+[out]+/ IDebugCodeContext2 * ppCodeCxt);
3020 
3021 	HRESULT GetDocumentContext(
3022 		/+[out]+/ IDebugDocumentContext2 * ppCxt);
3023 
3024 	HRESULT GetName(
3025 		/+[out]+/ BSTR* pbstrName);
3026 
3027 	HRESULT GetInfo(
3028 		in  FRAMEINFO_FLAGS dwFieldSpec,
3029 		in  UINT nRadix,
3030 		/+[out]+/ FRAMEINFO* pFrameInfo);
3031 
3032 	// Returns a machine dependent representation of the range of physical addresses
3033 	// associated with this stack frame. This is used by the process debug manager to sort
3034 	// the stack frames from multiple script engines. By convention, stacks grow down and,
3035 	// as such, on architectures where stacks grow up the addresses should be
3036 	// twos-complemented.
3037 	// NOTE: This implementation will not work for cross-process or cross-machine stacks
3038 	HRESULT GetPhysicalStackRange(
3039 		/+[out]+/ UINT64* paddrMin,
3040 		/+[out]+/ UINT64* paddrMax);
3041 
3042 	HRESULT GetExpressionContext(
3043 		/+[out]+/ IDebugExpressionContext2 * ppExprCxt);
3044 
3045 	HRESULT GetLanguageInfo(
3046 		/+[in, out, ptr]+/ BSTR* pbstrLanguage,
3047 		/+[in, out, ptr]+/ GUID* pguidLanguage);
3048 
3049 	HRESULT GetDebugProperty(
3050 		/+[out]+/ IDebugProperty2 * ppProperty);
3051 
3052 	// PERF API - Get the count of locals as well as the enumerator
3053 	// This API may not be supported by all LEs, so if it fails, use the generic
3054 	// approach through GetDebugProperty.  However, if this API is supported it
3055 	// may save a few cross-process calls
3056 	HRESULT EnumProperties(
3057 		in DEBUGPROP_INFO_FLAGS dwFields,
3058 		in UINT nRadix,
3059 		in GUID* guidFilter,
3060 		in DWORD dwTimeout,
3061 		/+[out]+/ ULONG* pcelt,
3062 		/+[out]+/ IEnumDebugPropertyInfo2 * ppEnum);
3063 
3064 	HRESULT GetThread(
3065 		/+[out]+/ IDebugThread2 * ppThread);
3066 };
3067 
3068 // ------------------------------------------------------------------
3069 // IDebugStackFrame3
3070 // An extension of IDebugStackFrame2 for new debugger features
3071 // supported in VS version 8.
3072 const GUID IID_IDebugStackFrame3 = IDebugStackFrame3.iid;
3073 
3074 interface IDebugStackFrame3 : IDebugStackFrame2
3075 {
3076     static const GUID iid = { 0x60DE844B,0x38B1,0x4d87,[ 0xAF,0xE1,0x8C,0xF4,0x96,0x77,0xD3,0xB0 ] };
3077 
3078 	// Install a temporary exception handler at this
3079 	// frame that will "handle" the current
3080 	// exception on the next call to Execute, Continue,
3081 	// or Step. Specific behavior varies by the debug engine/
3082 	// platform/runtime environment. Once the exception
3083 	// is "handled" by the temporary handler, an
3084 	// IDebugInterceptExceptionCompleteEvent2 will be sent.
3085 	// This function is not supported by all debug engines.
3086 	HRESULT InterceptCurrentException(
3087 		in INTERCEPT_EXCEPTION_ACTION dwFlags,
3088 		/+[out]+/ UINT64* pqwCookie);
3089 
3090 	// Returns the code context representing the location
3091 	// if a stack unwind is done. Note that this doesn't imply 
3092 	// that a stack unwind can be done to this frame.
3093 	// This method isn't supported by all engines currently.
3094 	HRESULT GetUnwindCodeContext(
3095 		/+[out]+/ IDebugCodeContext2 *ppCodeContext);
3096 }
3097 enum /+ enum_INTERCEPT_EXCEPTION_ACTION+/ : DWORD 
3098 {
3099 		IEA_INTERCEPT			= 0x0001,
3100 		// Cancelling an intercept is not supported in VS8
3101 		IEA_CANCEL_INTERCEPT	= 0x0000,
3102 }
3103 alias DWORD enum_INTERCEPT_EXCEPTION_ACTION;
3104 alias DWORD INTERCEPT_EXCEPTION_ACTION;;
3105 
3106 // ------------------------------------------------------------------
3107 // IDebugMemoryContext2
3108 
3109 const GUID IID_IDebugMemoryContext2 = IDebugMemoryContext2.iid;
3110 
3111 interface IDebugMemoryContext2 : IUnknown
3112 {
3113     static const GUID iid = { 0x1ab276dd,0xf27b,0x4445,[ 0x82,0x5d,0x5d,0xf0,0xb4,0xa0,0x4a,0x3a ] };
3114 
3115 	HRESULT GetName(
3116 		/+[out]+/ BSTR* pbstrName);
3117 
3118 	HRESULT GetInfo(
3119 		in CONTEXT_INFO_FIELDS dwFields,
3120 		/+[out]+/ CONTEXT_INFO* pInfo);
3121 
3122 	HRESULT Add(
3123 		in UINT64 dwCount,
3124 		/+[out]+/ IDebugMemoryContext2 * ppMemCxt);
3125 
3126 	HRESULT Subtract(
3127 		in UINT64 dwCount,
3128 		/+[out]+/ IDebugMemoryContext2 * ppMemCxt);
3129 
3130 	HRESULT Compare(
3131 		in CONTEXT_COMPARE compare,
3132 		/+[ size_is (dwMemoryContextSetLen), length_is(dwMemoryContextSetLen)]+/ /+[in]+/ IDebugMemoryContext2 * rgpMemoryContextSet,
3133 		in DWORD dwMemoryContextSetLen,
3134 		/+[out]+/ DWORD* pdwMemoryContext);
3135 }
3136 enum /+ enum_CONTEXT_COMPARE+/ : DWORD 
3137 {
3138 		CONTEXT_EQUAL					= 0x0001,
3139 		CONTEXT_LESS_THAN				= 0x0002,
3140 		CONTEXT_GREATER_THAN			= 0x0003,
3141 		CONTEXT_LESS_THAN_OR_EQUAL		= 0x0004,
3142 		CONTEXT_GREATER_THAN_OR_EQUAL	= 0x0005,
3143 		CONTEXT_SAME_SCOPE				= 0x0006,
3144 		CONTEXT_SAME_FUNCTION			= 0x0007,
3145 		CONTEXT_SAME_MODULE				= 0x0008,
3146 		CONTEXT_SAME_PROCESS			= 0x0009,
3147 }
3148 alias DWORD enum_CONTEXT_COMPARE;
3149 alias DWORD CONTEXT_COMPARE;
3150 enum /+ enum_CONTEXT_INFO_FIELDS+/ : DWORD 
3151 {
3152 		CIF_MODULEURL		= 0x00000001,
3153 		CIF_FUNCTION		= 0x00000002,
3154 		CIF_FUNCTIONOFFSET	= 0x00000004,
3155 		CIF_ADDRESS			= 0x00000008,
3156 		CIF_ADDRESSOFFSET	= 0x00000010,
3157         CIF_ADDRESSABSOLUTE = 0x00000020,
3158 		
3159 		CIF_ALLFIELDS		= 0x0000003f,
3160 }
3161 alias DWORD enum_CONTEXT_INFO_FIELDS;
3162 alias DWORD CONTEXT_INFO_FIELDS;
3163 struct _tagCONTEXT_INFO
3164 {
3165 		CONTEXT_INFO_FIELDS dwFields;
3166 		BSTR bstrModuleUrl;
3167 		BSTR bstrFunction;
3168 		TEXT_POSITION posFunctionOffset;
3169 		BSTR bstrAddress;
3170 		BSTR bstrAddressOffset;
3171         BSTR bstrAddressAbsolute;
3172 }
3173 alias _tagCONTEXT_INFO CONTEXT_INFO;;
3174 
3175 // ------------------------------------------------------------------
3176 // IDebugCodeContext2
3177 const GUID IID_IDebugCodeContext2 = IDebugCodeContext2.iid;
3178 
3179 interface IDebugCodeContext2 : IDebugMemoryContext2
3180 {
3181     static const GUID iid = { 0xac17b76b,0x2b09,0x419a,[ 0xad,0x5f,0x7d,0x74,0x02,0xda,0x88,0x75 ] };
3182 	HRESULT GetDocumentContext(
3183 		/+[out]+/ IDebugDocumentContext2 *ppSrcCxt);
3184 
3185 	HRESULT GetLanguageInfo(
3186 		/+[in, out, ptr]+/ BSTR* pbstrLanguage,
3187 		/+[in, out, ptr]+/ GUID* pguidLanguage);
3188 };
3189 
3190 // ------------------------------------------------------------------
3191 // IDebugCodeContext3
3192 //
3193 // QI from IDebugCodeContext2
3194 const GUID IID_IDebugCodeContext3 = IDebugCodeContext3.iid;
3195 
3196 interface IDebugCodeContext3 : IDebugCodeContext2
3197 {
3198     static const GUID iid = { 0x17c106b9,0x0925,0x42f5,[ 0xae,0x32,0x1f,0xc0,0x19,0x64,0x9c,0x10 ] };
3199 	HRESULT GetModule(
3200 		/+[out]+/ IDebugModule2 * ppModule);
3201 
3202 	HRESULT GetProcess(
3203 		/+[out]+/ IDebugProcess2 * ppProcess);
3204 };
3205 
3206 // ------------------------------------------------------------------
3207 // IDebugMemoryBytes2
3208 
3209 const GUID IID_IDebugMemoryBytes2 = IDebugMemoryBytes2.iid;
3210 
3211 interface IDebugMemoryBytes2 : IUnknown
3212 {
3213     static const GUID iid = { 0x925837d1,0x3aa1,0x451a,[ 0xb7,0xfe,0xcc,0x04,0xbb,0x42,0xcf,0xb8 ] };
3214 	HRESULT ReadAt(
3215 		/+[in]+/ IDebugMemoryContext2 pStartContext,
3216 		in DWORD dwCount,
3217 		/+[out, size_is(dwCount), length_is(*pdwRead)]+/ BYTE* rgbMemory,
3218 		/+[out]+/ DWORD* pdwRead,
3219 		/+[in, out, ptr]+/ DWORD* pdwUnreadable);
3220 
3221 	HRESULT WriteAt(
3222 		/+[in]+/ IDebugMemoryContext2 pStartContext,
3223 		in DWORD dwCount,
3224 		/+[ size_is (dwCount), length_is(dwCount)]+/ in BYTE* rgbMemory);
3225 
3226 	HRESULT GetSize(
3227 		/+[out]+/ UINT64* pqwSize);
3228 };
3229 
3230 // ------------------------------------------------------------------
3231 // IDebugDisassemblyStream2
3232 
3233 const GUID IID_IDebugDisassemblyStream2 = IDebugDisassemblyStream2.iid;
3234 
3235 interface IDebugDisassemblyStream2 : IUnknown
3236 {
3237     static const GUID iid = { 0xe5b017fe,0xdfb0,0x411c,[ 0x82,0x66,0x7c,0x64,0xd6,0xf5,0x19,0xf8 ] };
3238 
3239 	HRESULT Read(
3240 		// Set dwInstruction to 0 for !DSS_HUGE address spaces to read the entire address space
3241 		in DWORD dwInstructions,
3242 		in DISASSEMBLY_STREAM_FIELDS dwFields,
3243 		/+[out]+/ DWORD* pdwInstructionsRead,
3244 		/+[out, size_is(dwInstructions), length_is(*pdwInstructionsRead)]+/ DisassemblyData* prgDisassembly);
3245 
3246 	HRESULT Seek(
3247 		in SEEK_START dwSeekStart,
3248 		/+[in]+/ IDebugCodeContext2 pCodeContext,
3249 		in UINT64 uCodeLocationId,
3250 		in INT64 iInstructions);
3251 
3252 	// If the code context is outside the scope of code contexts which can be
3253 	// disassembled by this stream, but is still a valid code context. then
3254 	// *puCodeLocationId should be zero, and the return value is E_CODE_CONTEXT_OUT_OF_SCOPE
3255 	HRESULT GetCodeLocationId(
3256 		/+[in]+/ IDebugCodeContext2 pCodeContext,
3257 		/+[out]+/ UINT64* puCodeLocationId);
3258 
3259 	HRESULT GetCodeContext(
3260 		in UINT64 uCodeLocationId,
3261 		/+[out]+/ IDebugCodeContext2 * ppCodeContext);
3262 
3263 	HRESULT GetCurrentLocation(
3264 		/+[out]+/ UINT64* puCodeLocationId);		
3265 
3266 	// implemented by engines that have text documents, but where bstrDocumentUrl
3267 	// can not be passed as a filename
3268 	HRESULT GetDocument(
3269 		in BSTR bstrDocumentUrl,
3270 		/+[out]+/ IDebugDocument2 * ppDocument);
3271 
3272 	HRESULT GetScope(
3273 		/+[out]+/ DISASSEMBLY_STREAM_SCOPE* pdwScope);
3274 
3275 	HRESULT GetSize(
3276 		/+[out]+/ UINT64 *pnSize);
3277 }
3278 enum /+ enum_DISASSEMBLY_STREAM_FIELDS+/ : DWORD 
3279 {
3280 		DSF_ADDRESS             = 0x00000001,
3281 		DSF_ADDRESSOFFSET       = 0x00000002,
3282 		DSF_CODEBYTES           = 0x00000004,
3283 		DSF_OPCODE              = 0x00000008,
3284 		DSF_OPERANDS            = 0x00000010,
3285 		DSF_SYMBOL              = 0x00000020,
3286 		DSF_CODELOCATIONID      = 0x00000040,
3287 		DSF_POSITION            = 0x00000080,
3288 		DSF_DOCUMENTURL         = 0x00000100,
3289 		DSF_BYTEOFFSET          = 0x00000200,
3290 		DSF_FLAGS               = 0x00000400,
3291 
3292 		// Use DSF_OPERANDS_SYMBOLS to include symbol names in the bstrOperands field
3293 		DSF_OPERANDS_SYMBOLS    = 0x00010000,
3294 
3295 		DSF_ALL                 = 0x000107ff,
3296 }
3297 alias DWORD enum_DISASSEMBLY_STREAM_FIELDS;
3298 alias DWORD DISASSEMBLY_STREAM_FIELDS;
3299 enum /+ enum_DISASSEMBLY_FLAGS+/ : DWORD 
3300 {
3301 		// Indicates this instruction is in a different document than the previous one
3302 		DF_DOCUMENTCHANGE               = 0x00000001,
3303 		// Indicates this instruction will not be exuecuted
3304 		DF_DISABLED                     = 0x00000002,
3305 		// Indicates this instruction is one of the next instructions to be executed
3306 		// (there may be more than one)
3307 		DF_INSTRUCTION_ACTIVE           = 0x00000004,
3308 		// Indicates this instruction is really data (not code)
3309 		DF_DATA                         = 0x00000008,
3310 		// Indicates this instruction has source
3311 		DF_HASSOURCE                    = 0x00000010,
3312         // Indicates that bstrDocumentUrl contains checksum data
3313         DF_DOCUMENT_CHECKSUM            = 0x00000020
3314 }
3315 alias DWORD enum_DISASSEMBLY_FLAGS;
3316 alias DWORD DISASSEMBLY_FLAGS;
3317 struct tagDisassemblyData
3318 {
3319 		// Indicates which fields are valid
3320 		DISASSEMBLY_STREAM_FIELDS dwFields;
3321 		// The address for this instruction
3322 		BSTR bstrAddress;
3323 		// The address as an offset from some starting point (usually function)
3324 		BSTR bstrAddressOffset;
3325 		// The code bytes for this instruction
3326 		BSTR bstrCodeBytes;
3327 		// The opcode for this instruction
3328 		BSTR bstrOpcode;
3329 		// The operands for this instruction
3330 		BSTR bstrOperands;
3331 		// The symbol name, if any, associated with this address (public symbol, label, etc.)
3332 		BSTR bstrSymbol;
3333 		// Code location identifier (uCodeLocationId) for this line of disasm.
3334 		// They have these properties.
3335 		// 1. Unique within the disasm stream
3336 		// 2. Ordered in the same way as addresses (iff DisasmLine1.CodeContext.Address >
3337 		//    DisasmLine2.CodeContext.Address then DisasmLine1.uCodeLocationId >
3338 		//    DisasmLine2.uCodeLocationId)
3339 		// 3. As a consequense of #2, IDs should always increase as one go down the DisasmData array
3340 		UINT64 uCodeLocationId;
3341 		TEXT_POSITION posBeg;
3342 		TEXT_POSITION posEnd;
3343 		// For text documents that can be repesented as filenames:
3344 		//    bstrDocumentUrl is filled in with the file://filename where the source can be found.
3345 		// For text documents that cannot be repesented as filenames:
3346 		//    bstrDocumentUrl is a unique identifier for the document. The debug engine
3347 		//    must implement 'IDebugDisassemblyStream2::GetDocument'
3348 		// For non-text documents:
3349 		//    bstrDocumentUrl should be left as NULL. A doc context can be obtained from the code
3350 		//    context
3351 		// For Both:
3352 		//    Note that if bstrDocumentUrl is the same as the bstrDocumentUrl in the previous
3353 		//    DisassemblyData array element, then bstrDocumentUrl should be NULL, otherwise,
3354 		//    bstrDocumentUrl should not be NULL (if it is requested) and DF_DOCUMENTCHANGE should be set
3355         //
3356         // If the DF_DOCUMENT_CHECKSUM flag is set, this indicates that the document checksum is stored
3357         // in bstrDocumentUrl after the NULL as a guid indicating the checksum algorithm, 
3358         // followed by a DWORD indicating the number of bytes of checksum data, 
3359         // followed by the array of bytes denoting the checksum value.
3360 		BSTR bstrDocumentUrl;
3361 		// The number of bytes this instruction is from the beginning of the line
3362 		DWORD dwByteOffset;
3363 		// Flags
3364 		DISASSEMBLY_FLAGS dwFlags;
3365 }
3366 alias tagDisassemblyData DisassemblyData;
3367 enum /+ enum_SEEK_START+/ : DWORD 
3368 {
3369 		SEEK_START_BEGIN        = 0x0001,
3370 		SEEK_START_END          = 0x0002,
3371 		SEEK_START_CURRENT      = 0x0003,
3372 		SEEK_START_CODECONTEXT  = 0x0004,
3373                 SEEK_START_CODELOCID    = 0x0005
3374 }
3375 alias DWORD enum_SEEK_START;
3376 alias DWORD SEEK_START;;
3377 
3378 // ------------------------------------------------------------------
3379 // IDebugDocumentContext2
3380 const GUID IID_IDebugDocumentContext2 = IDebugDocumentContext2.iid;
3381 
3382 interface IDebugDocumentContext2 : IUnknown
3383 {
3384     static const GUID iid = { 0x931516ad,0xb600,0x419c,[ 0x88,0xfc,0xdc,0xf5,0x18,0x3b,0x5f,0xa9 ] };
3385 
3386 	HRESULT GetDocument(
3387 		/+[out]+/ IDebugDocument2 *ppDocument);
3388 
3389 	HRESULT GetName(
3390 		in GETNAME_TYPE gnType,
3391 		/+[out]+/ BSTR *pbstrFileName);
3392 
3393 	HRESULT EnumCodeContexts(
3394 		/+[out]+/ IEnumDebugCodeContexts2 *ppEnumCodeCxts);
3395 
3396 	HRESULT GetLanguageInfo(
3397 		/+[in, out, ptr]+/ BSTR* pbstrLanguage,
3398 		/+[in, out, ptr]+/ GUID* pguidLanguage);
3399 
3400 	HRESULT GetStatementRange(
3401 		/+[in, out, ptr]+/ TEXT_POSITION* pBegPosition,
3402 		/+[in, out, ptr]+/ TEXT_POSITION* pEndPosition);
3403 
3404 	HRESULT GetSourceRange(
3405 		/+[in, out, ptr]+/ TEXT_POSITION* pBegPosition,
3406 		/+[in, out, ptr]+/ TEXT_POSITION* pEndPosition);
3407 
3408 	HRESULT Compare(
3409 		in DOCCONTEXT_COMPARE compare,
3410 		/+[ size_is (dwDocContextSetLen), length_is(dwDocContextSetLen)]+/ /+[in]+/ IDebugDocumentContext2 * rgpDocContextSet,
3411 		in DWORD dwDocContextSetLen,
3412 		/+[out]+/ DWORD* pdwDocContext);
3413 
3414 	HRESULT Seek(
3415 		in int nCount,
3416 		/+[out]+/ IDebugDocumentContext2 * ppDocContext);
3417 }
3418 enum /+ enum_DOCCONTEXT_COMPARE+/ : DWORD 
3419 {
3420 		DOCCONTEXT_EQUAL			= 0x0001,
3421 		DOCCONTEXT_LESS_THAN		= 0x0002,
3422 		DOCCONTEXT_GREATER_THAN		= 0x0003,
3423 		DOCCONTEXT_SAME_DOCUMENT	= 0x0004,
3424 }
3425 alias DWORD enum_DOCCONTEXT_COMPARE;
3426 alias DWORD DOCCONTEXT_COMPARE;;
3427 
3428 // ------------------------------------------------------------------
3429 // IDebugDocumentChecksum2
3430 // Get this via QI from an IDebugDocumentContext2.
3431 //
3432 const GUID IID_IDebugDocumentChecksum2 = IDebugDocumentChecksum2.iid;
3433 
3434 interface IDebugDocumentChecksum2 : IUnknown
3435 {
3436     static const GUID iid = { 0xc1c74db7,0xa3a7,0x40a2,[ 0xa2,0x79,0xa6,0x3b,0xa7,0x56,0xb8,0xb0 ] };
3437 	HRESULT GetChecksumAndAlgorithmId(
3438 		/+[out]+/ GUID* pRetVal,
3439 		in ULONG cMaxBytes,
3440 		/+[out, length_is(*pcNumBytes), size_is(cMaxBytes)]+/ BYTE* pChecksum,
3441 		/+[out]+/ ULONG* pcNumBytes
3442 		);
3443 };
3444 
3445 // ------------------------------------------------------------------
3446 // IDebugENCDocumentContextUpdate
3447 //
3448 // Get this via QI from an IDebugDocumentContext2.
3449 const GUID IID_IDebugENCDocumentContextUpdate = IDebugENCDocumentContextUpdate.iid;
3450 
3451 interface IDebugENCDocumentContextUpdate : IUnknown
3452 {
3453     static const GUID iid = { 0xF5637291,0xD779,0x4580,[ 0xA8,0x2C,0x0D,0x52,0x3E,0x7F,0xDC,0xF0 ] };
3454 	HRESULT UpdateDocumentContext(
3455 		/+[in]+/ IDebugCodeContext2 pContext,
3456 		/+[in]+/ IDebugDocumentContext2 pDocContext);
3457 
3458 	HRESULT UpdateStatementPosition(
3459 		in TEXT_POSITION posBegStatement,
3460 		in TEXT_POSITION posEndStatement);
3461 }
3462 
3463 // ------------------------------------------------------------------
3464 // IDebugExpressionContext2
3465 const GUID IID_IDebugExpressionContext2 = IDebugExpressionContext2.iid;
3466 
3467 interface IDebugExpressionContext2 : IUnknown
3468 {
3469     static const GUID iid = { 0x37a44580,0xd5fc,0x473e,[ 0xa0,0x48,0x21,0x70,0x2e,0xbf,0xc4,0x66 ] };
3470 
3471 	// Get the name of the expression context. The name is the description
3472 	// of this expression context. It is usually something that can be parsed
3473 	// by an expression evaluator that refers to this exact expression context.
3474 	// For C++, the name is "{ function-name, source-file-name, module-file-name }"
3475 	HRESULT GetName(
3476 		/+[out]+/ BSTR* pbstrName);
3477 
3478 	HRESULT ParseText(
3479 		in LPCOLESTR pszCode,
3480 		in PARSEFLAGS dwFlags,
3481 		in UINT nRadix,
3482 		/+[out]+/ IDebugExpression2 * ppExpr,
3483 		/+[out]+/ BSTR* pbstrError,
3484 		/+[out]+/ UINT* pichError);
3485 }
3486 enum /+ enum_PARSEFLAGS+/ : DWORD 
3487 {
3488 		// the expression is an expression (not a statement)
3489 		PARSE_EXPRESSION		= 0x0001,
3490 		// the expression might contain function name/parameter signatures, and
3491 		// the expression is to be parsed [and later evaluated] as an address
3492 		PARSE_FUNCTION_AS_ADDRESS = 0x0002,
3493         // design-time parsing for design-time expression evaluation
3494         PARSE_DESIGN_TIME_EXPR_EVAL  = 0x1000
3495 }
3496 alias DWORD enum_PARSEFLAGS;
3497 alias DWORD PARSEFLAGS;;
3498 
3499 // ------------------------------------------------------------------
3500 // Breakpoint types
3501 
3502 enum /+ enum_BP_TYPE+/ : DWORD 
3503 {
3504 	BPT_NONE				= 0x0000,
3505 	BPT_CODE				= 0x0001,
3506 	BPT_DATA				= 0x0002,
3507 	BPT_SPECIAL				= 0x0003,
3508 }
3509 alias DWORD enum_BP_TYPE;
3510 alias DWORD BP_TYPE;
3511 
3512 // ------------------------------------------------------------------
3513 // Breakpoint request stuff
3514 
3515 enum /+ enum_BP_LOCATION_TYPE+/ : DWORD 
3516 {
3517 	BPLT_NONE				= 0x00000000,
3518 	BPLT_FILE_LINE			= 0x00010000,
3519 	BPLT_FUNC_OFFSET		= 0x00020000,
3520 	BPLT_CONTEXT			= 0x00030000,
3521 	BPLT_STRING				= 0x00040000,
3522 	BPLT_ADDRESS			= 0x00050000,
3523 	BPLT_RESOLUTION			= 0x00060000,
3524 
3525 	BPLT_CODE_FILE_LINE		= BPT_CODE | BPLT_FILE_LINE,
3526 	BPLT_CODE_FUNC_OFFSET	= BPT_CODE | BPLT_FUNC_OFFSET,
3527 	BPLT_CODE_CONTEXT		= BPT_CODE | BPLT_CONTEXT,
3528 	BPLT_CODE_STRING		= BPT_CODE | BPLT_STRING,
3529 	BPLT_CODE_ADDRESS		= BPT_CODE | BPLT_ADDRESS,
3530 	BPLT_DATA_STRING		= BPT_DATA | BPLT_STRING,
3531 
3532 	BPLT_TYPE_MASK			= 0x0000FFFF,
3533 	BPLT_LOCATION_TYPE_MASK	= 0xFFFF0000
3534 }
3535 alias DWORD enum_BP_LOCATION_TYPE;
3536 alias DWORD BP_LOCATION_TYPE;
3537 
3538 struct _BP_LOCATION_CODE_FILE_LINE
3539 {
3540 	BSTR bstrContext;
3541 	IDebugDocumentPosition2 pDocPos;
3542 }
3543 alias _BP_LOCATION_CODE_FILE_LINE BP_LOCATION_CODE_FILE_LINE;
3544 
3545 struct _BP_LOCATION_CODE_FUNC_OFFSET
3546 {
3547 	BSTR bstrContext;
3548 	IDebugFunctionPosition2 pFuncPos;
3549 }
3550 alias _BP_LOCATION_CODE_FUNC_OFFSET BP_LOCATION_CODE_FUNC_OFFSET;
3551 
3552 struct _BP_LOCATION_CODE_CONTEXT
3553 {
3554 	IDebugCodeContext2	pCodeContext;
3555 }
3556 alias _BP_LOCATION_CODE_CONTEXT BP_LOCATION_CODE_CONTEXT;
3557 
3558 struct _BP_LOCATION_CODE_STRING
3559 {
3560 	BSTR bstrContext;
3561 	BSTR bstrCodeExpr;
3562 }
3563 alias _BP_LOCATION_CODE_STRING BP_LOCATION_CODE_STRING;
3564 
3565 struct _BP_LOCATION_CODE_ADDRESS
3566 {
3567 	BSTR bstrContext;
3568 	BSTR bstrModuleUrl;
3569 	BSTR bstrFunction;
3570 	BSTR bstrAddress;
3571 }
3572 alias _BP_LOCATION_CODE_ADDRESS BP_LOCATION_CODE_ADDRESS;
3573 
3574 struct _BP_LOCATION_DATA_STRING
3575 {
3576 	IDebugThread2 pThread;
3577 	BSTR bstrContext;
3578 	BSTR bstrDataExpr;
3579 	DWORD dwNumElements;
3580 }
3581 alias _BP_LOCATION_DATA_STRING BP_LOCATION_DATA_STRING;
3582 
3583 struct _BP_LOCATION_RESOLUTION
3584 {
3585 	IDebugBreakpointResolution2 pResolution;
3586 }
3587 alias _BP_LOCATION_RESOLUTION BP_LOCATION_RESOLUTION;
3588 
3589 union BP_LOCATION /+switch(BP_LOCATION_TYPE bpLocationType) bpLocation +/ {
3590 	/+[case BPLT_CODE_FILE_LINE:]+/
3591 		BP_LOCATION_CODE_FILE_LINE bplocCodeFileLine;
3592 
3593 	/+[case BPLT_CODE_FUNC_OFFSET:]+/
3594 		BP_LOCATION_CODE_FUNC_OFFSET bplocCodeFuncOffset;
3595 
3596 	/+[case BPLT_CODE_CONTEXT:]+/
3597 		BP_LOCATION_CODE_CONTEXT bplocCodeContext;
3598 
3599 	/+[case BPLT_CODE_STRING:]+/
3600 		BP_LOCATION_CODE_STRING bplocCodeString;
3601 
3602 	/+[case BPLT_CODE_ADDRESS:]+/
3603 		BP_LOCATION_CODE_ADDRESS bplocCodeAddress;
3604 
3605 	/+[case BPLT_DATA_STRING:]+/
3606 		BP_LOCATION_DATA_STRING bplocDataString;
3607 
3608 	/+[case BPLT_RESOLUTION:]+/
3609 		BP_LOCATION_RESOLUTION bplocResolution;
3610 
3611 	/+[default:]+/
3612 		DWORD unused; };
3613 
3614 enum /+ enum_BP_PASSCOUNT_STYLE+/ : DWORD 
3615 {
3616 	BP_PASSCOUNT_NONE				= 0x0000,
3617 	BP_PASSCOUNT_EQUAL				= 0x0001,
3618 	BP_PASSCOUNT_EQUAL_OR_GREATER	= 0x0002,
3619 	BP_PASSCOUNT_MOD				= 0x0003,
3620 }
3621 alias DWORD enum_BP_PASSCOUNT_STYLE;
3622 alias DWORD BP_PASSCOUNT_STYLE;
3623 
3624 struct _BP_PASSCOUNT
3625 {
3626 	DWORD dwPassCount;
3627 	BP_PASSCOUNT_STYLE stylePassCount;
3628 }
3629 alias _BP_PASSCOUNT BP_PASSCOUNT;
3630 
3631 enum /+ enum_BP_COND_STYLE+/ : DWORD 
3632 {
3633 	BP_COND_NONE					= 0x0000,
3634 	BP_COND_WHEN_TRUE				= 0x0001,
3635 	BP_COND_WHEN_CHANGED			= 0x0002,
3636 }
3637 alias DWORD enum_BP_COND_STYLE;
3638 alias DWORD BP_COND_STYLE;
3639 
3640 struct _BP_CONDITION
3641 {
3642 	IDebugThread2 pThread;
3643 	BP_COND_STYLE styleCondition;
3644 	BSTR bstrContext;
3645 	BSTR bstrCondition;
3646 	UINT nRadix;
3647 }
3648 alias _BP_CONDITION BP_CONDITION;
3649 
3650 enum /+ enum_BP_FLAGS+/ : DWORD 
3651 {
3652 	BP_FLAG_NONE					= 0x0000,
3653 	BP_FLAG_MAP_DOCPOSITION			= 0x0001,
3654 
3655 	// BP_FLAG_DONT_STOP is used to indicate the
3656 	// breakpoint should be processed bt the debug engine,
3657 	// but that the debug engine ultimately shouldn't stop
3658 	// there (i.e. an IDebugBreakpointEvent2 should not be 
3659 	// send.  This flag is designed to be used primarily with
3660 	// tracepoints.
3661 	BP_FLAG_DONT_STOP               = 0x0002,
3662 }
3663 alias DWORD enum_BP_FLAGS;
3664 alias DWORD BP_FLAGS;
3665 
3666 enum /+ enum_BPREQI_FIELDS+/ : DWORD 
3667 {
3668 	BPREQI_BPLOCATION				= 0x0001,
3669 	BPREQI_LANGUAGE					= 0x0002,
3670 	BPREQI_PROGRAM					= 0x0004,
3671 	BPREQI_PROGRAMNAME				= 0x0008,
3672 	BPREQI_THREAD					= 0x0010,
3673 	BPREQI_THREADNAME				= 0x0020,
3674 	BPREQI_PASSCOUNT				= 0x0040,
3675 	BPREQI_CONDITION				= 0x0080,
3676 	BPREQI_FLAGS					= 0x0100,
3677 	BPREQI_ALLOLDFIELDS             = 0x01ff,
3678 	
3679 	// Flags below this point belong to BP_REQUEST_INFO2
3680 	BPREQI_VENDOR                   = 0x0200,
3681 	BPREQI_CONSTRAINT               = 0x0400,
3682 	BPREQI_TRACEPOINT               = 0x0800,
3683 
3684 	BPREQI_ALLFIELDS				= 0x0fff,
3685 }
3686 alias DWORD enum_BPREQI_FIELDS;
3687 alias DWORD BPREQI_FIELDS;
3688 
3689 struct _BP_REQUEST_INFO
3690 {
3691 	BPREQI_FIELDS dwFields;
3692 	GUID guidLanguage;
3693 	BP_LOCATION bpLocation;
3694 	IDebugProgram2 pProgram;
3695 	BSTR bstrProgramName;
3696 	IDebugThread2 pThread;
3697 	BSTR bstrThreadName;
3698 	BP_CONDITION bpCondition;
3699 	BP_PASSCOUNT bpPassCount;
3700 	BP_FLAGS dwFlags;
3701 }
3702 alias _BP_REQUEST_INFO BP_REQUEST_INFO;
3703 
3704 struct _BP_REQUEST_INFO2
3705 {
3706 	BPREQI_FIELDS dwFields;
3707 	GUID guidLanguage;
3708 	BP_LOCATION bpLocation;
3709 	IDebugProgram2 pProgram;
3710 	BSTR bstrProgramName;
3711 	IDebugThread2 pThread;
3712 	BSTR bstrThreadName;
3713 	BP_CONDITION bpCondition;
3714 	BP_PASSCOUNT bpPassCount;
3715 	BP_FLAGS dwFlags;
3716 
3717 	// guidVector may be NULL while guidLanguage is non-NULL
3718 	// This means use all matching languages, regardless of vendor
3719 	// for beining this breakpoint.
3720 	GUID guidVendor;
3721 	// The constraint associated with this breakpoint (may be NULL)
3722 	BSTR bstrConstraint;
3723 	// The tracepoint associated with this breakpoint (may be NULL)
3724 	BSTR bstrTracepoint;
3725 }
3726 alias _BP_REQUEST_INFO2 BP_REQUEST_INFO2;
3727 
3728 // ------------------------------------------------------------------
3729 // IDebugBreakpointRequest2
3730 
3731 const GUID IID_IDebugBreakpointRequest2 = IDebugBreakpointRequest2.iid;
3732 
3733 interface IDebugBreakpointRequest2 : IUnknown
3734 {
3735     static const GUID iid = { 0x6015fd18,0x8257,0x4df3,[ 0xac,0x42,0xf0,0x74,0xde,0xdd,0x4c,0xbd ] };
3736 	HRESULT GetLocationType(
3737 		/+[out]+/ BP_LOCATION_TYPE* pBPLocationType);
3738 
3739 	HRESULT GetRequestInfo(
3740 		in BPREQI_FIELDS dwFields,
3741 		/+[out]+/ BP_REQUEST_INFO* pBPRequestInfo);
3742 };
3743 
3744 struct tagCHECKSUM_DATA
3745 {
3746 	DWORD ByteCount;
3747 	/+[size_is(ByteCount)]+/ BYTE* pBytes;
3748 }
3749 alias tagCHECKSUM_DATA CHECKSUM_DATA;
3750 
3751 // ------------------------------------------------------------------
3752 // IDebugBreakpointChecksumRequest2
3753 //
3754 // Get this via QI from an IDebugBreakpointRequest2.
3755 const GUID IID_IDebugBreakpointChecksumRequest2 = IDebugBreakpointChecksumRequest2.iid;
3756 
3757 interface IDebugBreakpointChecksumRequest2 : IUnknown
3758 {
3759     static const GUID iid = { 0x0EA91CF7,0x8542,0x4780,[ 0x8D,0x6B,0x7B,0xD6,0x86,0xCD,0x24,0x71 ] };
3760     // get the checksum based on the specified algorithm
3761     // pChecksumData->pBytes is allocated by the callee, and should be freed by the caller with CoTaskMemFree
3762     HRESULT GetChecksum(in GUID* guidAlgorithm, 
3763 		/+[out]+/ CHECKSUM_DATA* pChecksumData);
3764 
3765     HRESULT IsChecksumEnabled(/+[out]+/ BOOL* pfChecksumEnabled);
3766 };
3767 
3768 // ------------------------------------------------------------------
3769 // IDebugBreakpointRequest3
3770 
3771 const GUID IID_IDebugBreakpointRequest3 = IDebugBreakpointRequest3.iid;
3772 
3773 interface IDebugBreakpointRequest3 : IDebugBreakpointRequest2
3774 {
3775     static const GUID iid = { 0x5C18A5FE,0x7150,0x4e66,[ 0x82,0x46,0x27,0xBF,0xB0,0xE7,0xBF,0xD9 ] };
3776 	HRESULT GetRequestInfo2(
3777 		in  BPREQI_FIELDS dwFields,
3778 		/+[out]+/ BP_REQUEST_INFO2 * bBPRequestInfo);
3779 };
3780 
3781 // ------------------------------------------------------------------
3782 // Breakpoint resolution stuff
3783 
3784 struct _BP_RESOLUTION_CODE
3785 {
3786 	IDebugCodeContext2	pCodeContext;
3787 }
3788 alias _BP_RESOLUTION_CODE BP_RESOLUTION_CODE;
3789 
3790 enum /+ enum_BP_RES_DATA_FLAGS+/ : DWORD 
3791 {
3792 	// The data breakpoint is being emulated
3793 	// (rather than done via hardware)
3794 	BP_RES_DATA_EMULATED		= 0x0001,
3795 }
3796 alias DWORD enum_BP_RES_DATA_FLAGS;
3797 alias DWORD BP_RES_DATA_FLAGS;
3798 
3799 struct _BP_RESOLUTION_DATA
3800 {
3801 	BSTR bstrDataExpr;
3802 	BSTR bstrFunc;
3803 	BSTR bstrImage;
3804 	BP_RES_DATA_FLAGS dwFlags;
3805 }
3806 alias _BP_RESOLUTION_DATA BP_RESOLUTION_DATA;
3807 	
3808 union BP_RESOLUTION_LOCATION /+switch(BP_TYPE bpType) bpResLocation +/ {
3809 	/+[case BPT_CODE:]+/
3810 		BP_RESOLUTION_CODE bpresCode;
3811 
3812 	/+[case BPT_DATA:]+/
3813 		BP_RESOLUTION_DATA bpresData;
3814 
3815 	/+[default:]+/
3816 		int	unused; };
3817 
3818 enum /+ enum_BPRESI_FIELDS+/ : DWORD 
3819 {
3820 	BPRESI_BPRESLOCATION	= 0x0001,
3821 	BPRESI_PROGRAM			= 0x0002,
3822 	BPRESI_THREAD			= 0x0004,
3823 
3824 	BPRESI_ALLFIELDS		= 0xffffffff,
3825 }
3826 alias DWORD enum_BPRESI_FIELDS;
3827 alias DWORD BPRESI_FIELDS;
3828 
3829 struct _BP_RESOLUTION_INFO
3830 {
3831 	BPRESI_FIELDS dwFields;
3832 	BP_RESOLUTION_LOCATION bpResLocation;
3833 	IDebugProgram2 pProgram;
3834 	IDebugThread2 pThread;
3835 }
3836 alias _BP_RESOLUTION_INFO BP_RESOLUTION_INFO;
3837 
3838 // ------------------------------------------------------------------
3839 // IDebugBreakpointResolution2
3840 
3841 const GUID IID_IDebugBreakpointResolution2 = IDebugBreakpointResolution2.iid;
3842 
3843 interface IDebugBreakpointResolution2 : IUnknown
3844 {
3845     static const GUID iid = { 0xb7e66f28,0x035a,0x401a,[ 0xaf,0xc7,0x2e,0x30,0x0b,0xd2,0x97,0x11 ] };
3846 	HRESULT GetBreakpointType(
3847 		/+[out]+/ BP_TYPE* pBPType);
3848 		
3849 	HRESULT GetResolutionInfo(
3850 		in BPRESI_FIELDS dwFields,
3851 		/+[out]+/ BP_RESOLUTION_INFO* pBPResolutionInfo);
3852 };
3853 
3854 // ------------------------------------------------------------------
3855 // Error breakpoint stuff
3856 
3857 enum /+ enum_BP_ERROR_TYPE+/ : DWORD 
3858 {
3859     BPET_NONE               = 0x00000000,
3860 
3861     BPET_TYPE_WARNING       = 0x00000001,
3862     BPET_TYPE_ERROR         = 0x00000002,
3863 
3864     BPET_SEV_HIGH           = 0x0F000000,
3865     BPET_SEV_GENERAL        = 0x07000000,
3866     BPET_SEV_LOW            = 0x01000000,
3867 
3868     BPET_TYPE_MASK          = 0x0000ffff,
3869     BPET_SEV_MASK           = 0xffff0000,
3870 
3871     // Use these contants for describing general warnings and errors
3872     BPET_GENERAL_WARNING    = BPET_SEV_GENERAL | BPET_TYPE_WARNING,
3873     BPET_GENERAL_ERROR      = BPET_SEV_GENERAL | BPET_TYPE_ERROR,
3874 
3875     BPET_ALL				= 0xffffffff,
3876 }
3877 alias DWORD enum_BP_ERROR_TYPE;
3878 alias DWORD BP_ERROR_TYPE;
3879 
3880 enum /+ enum_BPERESI_FIELDS+/ : DWORD 
3881 {
3882     BPERESI_BPRESLOCATION   = 0x0001,
3883     BPERESI_PROGRAM         = 0x0002,
3884     BPERESI_THREAD          = 0x0004,
3885     BPERESI_MESSAGE         = 0x0008,
3886     BPERESI_TYPE            = 0x0010,
3887 
3888     BPERESI_ALLFIELDS       = 0xffffffff,
3889 }
3890 alias DWORD enum_BPERESI_FIELDS;
3891 alias DWORD BPERESI_FIELDS;
3892 
3893 struct _BP_ERROR_RESOLUTION_INFO
3894 {
3895 	BPERESI_FIELDS dwFields;
3896 	BP_RESOLUTION_LOCATION bpResLocation;
3897 	IDebugProgram2 pProgram;
3898 	IDebugThread2 pThread;
3899 	BSTR bstrMessage;
3900 	BP_ERROR_TYPE dwType;
3901 }
3902 alias _BP_ERROR_RESOLUTION_INFO BP_ERROR_RESOLUTION_INFO;
3903 
3904 // ------------------------------------------------------------------
3905 // IDebugErrorBreakpointResolution2
3906 
3907 const GUID IID_IDebugErrorBreakpointResolution2 = IDebugErrorBreakpointResolution2.iid;
3908 
3909 interface IDebugErrorBreakpointResolution2 : IUnknown
3910 {
3911     static const GUID iid = { 0x603aedf8,0x9575,0x4d30,[ 0xb8,0xca,0x12,0x4d,0x1c,0x98,0xeb,0xd8 ] };
3912 	HRESULT GetBreakpointType(
3913 		/+[out]+/ BP_TYPE* pBPType);
3914 		
3915 	HRESULT GetResolutionInfo(
3916 		in BPERESI_FIELDS dwFields,
3917 		/+[out]+/ BP_ERROR_RESOLUTION_INFO* pErrorResolutionInfo);
3918 };
3919 
3920 // ------------------------------------------------------------------
3921 // IDebugBoundBreakpoint2
3922 
3923 const GUID IID_IDebugBoundBreakpoint2 = IDebugBoundBreakpoint2.iid;
3924 
3925 interface IDebugBoundBreakpoint2 : IUnknown
3926 {
3927     static const GUID iid = { 0xd533d975,0x3f32,0x4876,[ 0xab,0xd0,0x6d,0x37,0xfd,0xa5,0x63,0xe7 ] };
3928 
3929 	HRESULT GetPendingBreakpoint(
3930 		/+[out]+/ IDebugPendingBreakpoint2 * ppPendingBreakpoint);
3931 
3932 	HRESULT GetState(
3933 		/+[out]+/ BP_STATE* pState);
3934 
3935 	HRESULT GetHitCount(
3936 		/+[out]+/ DWORD* pdwHitCount);
3937 
3938 	HRESULT GetBreakpointResolution(
3939 		/+[out]+/ IDebugBreakpointResolution2 * ppBPResolution);
3940 
3941 	HRESULT Enable(
3942 		in BOOL fEnable);
3943 
3944 	HRESULT SetHitCount(
3945 		in DWORD dwHitCount);
3946 
3947 	HRESULT SetCondition(
3948 		in BP_CONDITION bpCondition);
3949 
3950 	HRESULT SetPassCount(
3951 		in BP_PASSCOUNT bpPassCount);
3952 
3953 	HRESULT Delete();
3954 }
3955 enum /+ enum_BP_STATE+/ : DWORD 
3956 {
3957 		BPS_NONE		= 0x0000,
3958 		BPS_DELETED		= 0x0001,
3959 		BPS_DISABLED	= 0x0002,
3960 		BPS_ENABLED		= 0x0003,
3961 }
3962 alias DWORD enum_BP_STATE;
3963 alias DWORD BP_STATE;;
3964 
3965 // ------------------------------------------------------------------
3966 // IDebugBoundBreakpoint3
3967 
3968 const GUID IID_IDebugBoundBreakpoint3 = IDebugBoundBreakpoint3.iid;
3969 
3970 interface IDebugBoundBreakpoint3 : IUnknown
3971 {
3972     static const GUID iid = { 0x60f49115,0xce92,0x4f96,[ 0x8d,0x0a,0x81,0xcc,0xca,0xe4,0xab,0x77 ] };
3973 	HRESULT SetTracepoint(
3974 		in LPCOLESTR bpBstrTracepoint, 
3975         in BP_FLAGS bpFlags    // only BP_FLAG_DONT_STOP is supported
3976         );
3977 };
3978 
3979 // ------------------------------------------------------------------
3980 // IDebugPendingBreakpoint2
3981 
3982 const GUID IID_IDebugPendingBreakpoint2 = IDebugPendingBreakpoint2.iid;
3983 
3984 interface IDebugPendingBreakpoint2 : IUnknown
3985 {
3986     static const GUID iid = { 0x6e215ef3,0xe44c,0x44d1,[ 0xb7,0xba,0xb2,0x40,0x1f,0x7d,0xc2,0x3d ] };
3987 
3988 	HRESULT CanBind(
3989 		/+[out]+/ IEnumDebugErrorBreakpoints2 * ppErrorEnum);
3990 
3991 	HRESULT Bind();
3992 
3993 	HRESULT GetState(
3994 		/+[out]+/ PENDING_BP_STATE_INFO* pState);
3995 
3996 	HRESULT GetBreakpointRequest(
3997 		/+[out]+/ IDebugBreakpointRequest2 * ppBPRequest);
3998 
3999 	HRESULT Virtualize(
4000 		in BOOL fVirtualize);
4001 
4002 	HRESULT Enable(
4003 		in BOOL fEnable);
4004 
4005 	HRESULT SetCondition(
4006 		in BP_CONDITION bpCondition);
4007 
4008 	HRESULT SetPassCount(
4009 		in BP_PASSCOUNT bpPassCount);
4010 
4011 	HRESULT EnumBoundBreakpoints(
4012 		/+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum);
4013 
4014 	HRESULT EnumErrorBreakpoints(
4015 		in BP_ERROR_TYPE bpErrorType,
4016 		/+[out]+/ IEnumDebugErrorBreakpoints2 * ppEnum);
4017 
4018 	HRESULT Delete();
4019 }
4020 enum /+ enum_PENDING_BP_STATE+/ : DWORD 
4021 {
4022 		PBPS_NONE			= 0x0000,
4023 		PBPS_DELETED		= 0x0001,
4024 		PBPS_DISABLED		= 0x0002,
4025 		PBPS_ENABLED		= 0x0003,
4026 }
4027 alias DWORD enum_PENDING_BP_STATE;
4028 alias DWORD PENDING_BP_STATE;
4029 enum /+ enum_PENDING_BP_STATE_FLAGS+/ : DWORD 
4030 {
4031 		PBPSF_NONE			= 0x0000,
4032 		PBPSF_VIRTUALIZED	= 0x0001,
4033 }
4034 alias DWORD enum_PENDING_BP_STATE_FLAGS;
4035 alias DWORD PENDING_BP_STATE_FLAGS;
4036 struct _tagPENDING_BP_STATE_INFO
4037 {
4038 		PENDING_BP_STATE state;
4039 		PENDING_BP_STATE_FLAGS flags;
4040 }
4041 alias _tagPENDING_BP_STATE_INFO PENDING_BP_STATE_INFO;;
4042 
4043 // ------------------------------------------------------------------
4044 // IDebugPendingBreakpoint3
4045 
4046 const GUID IID_IDebugPendingBreakpoint3 = IDebugPendingBreakpoint3.iid;
4047 
4048 interface IDebugPendingBreakpoint3 : IDebugPendingBreakpoint2
4049 {
4050     static const GUID iid = { 0x96643d32,0x2624,0x479a,[ 0x9f,0x1a,0x25,0xd0,0x20,0x30,0xdd,0x3b ] };
4051 	HRESULT GetErrorResolutionInfo(
4052 		in BPERESI_FIELDS dwFields,
4053 		/+[out]+/ BP_ERROR_RESOLUTION_INFO* pErrorResolutionInfo);
4054 };
4055 
4056 // ------------------------------------------------------------------
4057 // IDebugErrorBreakpoint2
4058 
4059 const GUID IID_IDebugErrorBreakpoint2 = IDebugErrorBreakpoint2.iid;
4060 
4061 interface IDebugErrorBreakpoint2 : IUnknown
4062 {
4063     static const GUID iid = { 0x74570ef7,0x2486,0x4089,[ 0x80,0x0c,0x56,0xe3,0x82,0x9b,0x5c,0xa4 ] };
4064 	HRESULT GetPendingBreakpoint(
4065 		/+[out]+/ IDebugPendingBreakpoint2 * ppPendingBreakpoint);
4066 
4067 	HRESULT GetBreakpointResolution(
4068 		/+[out]+/ IDebugErrorBreakpointResolution2 * ppErrorResolution);
4069 };
4070 
4071 // ------------------------------------------------------------------
4072 // IDebugExpression2
4073 const GUID IID_IDebugExpression2 = IDebugExpression2.iid;
4074 
4075 interface IDebugExpression2 : IUnknown
4076 {
4077     static const GUID iid = { 0xf7473fd0,0x7f75,0x478d,[ 0x8d,0x85,0xa4,0x85,0x20,0x4e,0x7a,0x2d ] };
4078 
4079 	HRESULT EvaluateAsync(
4080 		in EVALFLAGS dwFlags,
4081 		// pExprCallback must be NULL in V8 and above
4082 		/+[in]+/ IDebugEventCallback2 pExprCallback);
4083 
4084 	HRESULT Abort();
4085 
4086 	HRESULT EvaluateSync(
4087 		in EVALFLAGS dwFlags,
4088 		in DWORD dwTimeout,
4089 		// pExprCallback must be NULL in V8 and above
4090 		/+[in]+/ IDebugEventCallback2 pExprCallback,
4091 		/+[out]+/ IDebugProperty2 * ppResult);
4092 }
4093 enum /+ enum_EVALFLAGS+/ : DWORD 
4094 {
4095 		// the return value is interesting
4096 		EVAL_RETURNVALUE			= 0x0002,
4097 		// don't allow side effects
4098 		EVAL_NOSIDEEFFECTS			= 0x0004,
4099 		// stop on breakpoints
4100 		EVAL_ALLOWBPS				= 0x0008,
4101 		// allow error reporting to the host
4102 		EVAL_ALLOWERRORREPORT		= 0x0010,
4103 		// evaluate any functions as address (instead of invoking the function)
4104 		EVAL_FUNCTION_AS_ADDRESS	= 0x0040,
4105 		// don't allow function/property evaluation
4106 		EVAL_NOFUNCEVAL				= 0x0080,
4107 		// don't allow events
4108 		EVAL_NOEVENTS				= 0x1000,
4109         // design-time expression evaluation
4110         EVAL_DESIGN_TIME_EXPR_EVAL  = 0x2000,
4111 		// Allow implicit variable creation
4112 		EVAL_ALLOW_IMPLICIT_VARS	= 0x4000
4113 }
4114 alias DWORD enum_EVALFLAGS;
4115 alias DWORD EVALFLAGS;;
4116 
4117 // ------------------------------------------------------------------
4118 // IDebugModule2
4119 const GUID IID_IDebugModule2 = IDebugModule2.iid;
4120 
4121 interface IDebugModule2 : IUnknown
4122 {
4123     static const GUID iid = { 0x0fc1cd9a,0xb912,0x405c,[ 0xa0,0x4c,0x43,0xce,0x02,0xcd,0x7d,0xf2 ] };
4124 
4125 	HRESULT GetInfo(
4126 		in MODULE_INFO_FIELDS dwFields,
4127 		/+[out]+/ MODULE_INFO* pInfo);
4128 	
4129 	HRESULT ReloadSymbols_Deprecated(
4130 		/+[ ptr]+/ in LPCOLESTR pszUrlToSymbols,
4131 		/+[out]+/ BSTR* pbstrDebugMessage);
4132 }
4133 enum /+ enum_MODULE_FLAGS+/ : DWORD 
4134 {
4135 		MODULE_FLAG_NONE		= 0x0000,
4136 		MODULE_FLAG_SYSTEM		= 0x0001,
4137 		MODULE_FLAG_SYMBOLS		= 0x0002,
4138 		MODULE_FLAG_64BIT		= 0x0004,
4139 		 
4140 		//
4141 		// If the engine knows a module about optimizations it needs to set
4142 		// either of these flags, if it does not the module window will assume
4143 		// it does not
4144 		//
4145 		 
4146 		MODULE_FLAG_OPTIMIZED	= 0x0008,
4147 		MODULE_FLAG_UNOPTIMIZED	= 0x0010
4148 }
4149 alias DWORD enum_MODULE_FLAGS;
4150 alias DWORD MODULE_FLAGS;
4151 enum /+ enum_MODULE_INFO_FIELDS+/ : DWORD 
4152 {
4153 		MIF_NONE				= 0x0000,
4154 		MIF_NAME				= 0x0001,
4155 		MIF_URL					= 0x0002,
4156 		MIF_VERSION				= 0x0004,
4157 		MIF_DEBUGMESSAGE		= 0x0008,
4158 		MIF_LOADADDRESS			= 0x0010,
4159 		MIF_PREFFEREDADDRESS	= 0x0020,
4160 		MIF_SIZE				= 0x0040,
4161 		MIF_LOADORDER			= 0x0080,
4162 		MIF_TIMESTAMP			= 0x0100,
4163 		MIF_URLSYMBOLLOCATION	= 0x0200,
4164 		MIF_FLAGS				= 0x0400,
4165 
4166 		MIF_ALLFIELDS			= 0x07ff,
4167 }
4168 alias DWORD enum_MODULE_INFO_FIELDS;
4169 alias DWORD MODULE_INFO_FIELDS;
4170 struct _tagMODULE_INFO
4171 {
4172 		MODULE_INFO_FIELDS dwValidFields;
4173 		BSTR m_bstrName;
4174 		BSTR m_bstrUrl;
4175 		BSTR m_bstrVersion;
4176 		BSTR m_bstrDebugMessage;
4177 		UINT64 m_addrLoadAddress;
4178 		UINT64 m_addrPreferredLoadAddress;
4179 		DWORD m_dwSize;
4180 		DWORD m_dwLoadOrder;
4181 		FILETIME m_TimeStamp;
4182 		BSTR m_bstrUrlSymbolLocation;
4183 		MODULE_FLAGS m_dwModuleFlags;
4184 }
4185 alias _tagMODULE_INFO MODULE_INFO;;
4186 
4187 // ------------------------------------------------------------------
4188 // IDebugModule3
4189 const GUID IID_IDebugModule3 = IDebugModule3.iid;
4190 
4191 interface IDebugModule3 : IDebugModule2
4192 {
4193     static const GUID iid = { 0x245F9D6A,0xE550,0x404d,[ 0x82,0xF1,0xFD,0xB6,0x82,0x81,0x60,0x7A ] };
4194 
4195 	HRESULT GetSymbolInfo(
4196 		in SYMBOL_SEARCH_INFO_FIELDS dwFields,
4197 		/+[out]+/ MODULE_SYMBOL_SEARCH_INFO* pInfo);
4198 	
4199 	// LoadSymbols will use the current symbol path to search for
4200 	// symbols.  The updated IDebugModule3 is sent in an IDebugSymbolSearchEvent2
4201 	HRESULT LoadSymbols();
4202 
4203 	// Returns whether module is user or not
4204 	HRESULT IsUserCode(
4205 		/+[out]+/ BOOL *pfUser);
4206 
4207 	// Sets user status of module
4208 	HRESULT SetJustMyCodeState(
4209 		in BOOL fIsUserCode);
4210 }
4211 enum /+ enum_SYMBOL_SEARCH_INFO_FIELDS+/ : DWORD 
4212 {
4213 		SSIF_NONE				= 0x0000,
4214 		SSIF_VERBOSE_SEARCH_INFO= 0x0001
4215 }
4216 alias DWORD enum_SYMBOL_SEARCH_INFO_FIELDS;
4217 alias DWORD SYMBOL_SEARCH_INFO_FIELDS;
4218 struct _tagSYMBOL_SEARCH_INFO
4219 {
4220 		// Details of where symbols were searched for and the result
4221 		SYMBOL_SEARCH_INFO_FIELDS dwValidFields;
4222 		BSTR bstrVerboseSearchInfo;
4223 }
4224 alias _tagSYMBOL_SEARCH_INFO MODULE_SYMBOL_SEARCH_INFO;
4225 
4226 //
4227 // IDebugSourceServerModule
4228 //
4229 // QI from IDebugModule2 
4230 //
4231 const GUID IID_IDebugSourceServerModule = IDebugSourceServerModule.iid;
4232 
4233 interface IDebugSourceServerModule : IUnknown
4234 {
4235     static const GUID iid = { 0x492e5541,0x215b,0x4f67,[ 0xad,0x73,0x20,0xf4,0x86,0x14,0x91,0x2e ] };
4236  	// returns the source server data for the module
4237 	// caller should free using CoTaskMemFree()
4238 	HRESULT GetSourceServerData(
4239 			/+[out]+/ ULONG* pDataByteCount, 
4240 			/+[out, size_is (, *pDataByteCount)]+/ BYTE** ppData);
4241 }
4242 
4243 // ------------------------------------------------------------------
4244 // IDebugModuleManaged
4245 const GUID IID_IDebugModuleManaged = IDebugModuleManaged.iid;
4246 
4247 interface IDebugModuleManaged : IUnknown
4248 {
4249     static const GUID iid = { 0x232397F8,0xB232,0x479d,[ 0xB1,0xBB,0x2F,0x04,0x4C,0x70,0xA0,0xF9 ] };
4250 	HRESULT GetMvid(
4251 		/+[out]+/ GUID* mvid);
4252 };
4253 
4254 // ------------------------------------------------------------------
4255 // IDebugDocument2
4256 const GUID IID_IDebugDocument2 = IDebugDocument2.iid;
4257 
4258 interface IDebugDocument2 : IUnknown
4259 {
4260     static const GUID iid = { 0x1606dd73,0x5d5f,0x405c,[ 0xb4,0xf4,0xce,0x32,0xba,0xba,0x25,0x01 ] };
4261 	HRESULT GetName(
4262 		in GETNAME_TYPE gnType,
4263 		/+[out]+/ BSTR* pbstrFileName);
4264 
4265 	HRESULT GetDocumentClassId(
4266 		/+[out]+/ CLSID* pclsid);
4267 };
4268 
4269 // ------------------------------------------------------------------
4270 // IDebugDocumentText2
4271 // #pragma warning(push)
4272 // #pragma warning(disable:28718)
4273 const GUID IID_IDebugDocumentText2 = IDebugDocumentText2.iid;
4274 
4275 interface IDebugDocumentText2 : IDebugDocument2
4276 {
4277     static const GUID iid = { 0x4b0645aa,0x08ef,0x4cb9,[ 0xad,0xb9,0x03,0x95,0xd6,0xed,0xad,0x35 ] };
4278 	HRESULT GetSize(
4279 		/+[in, out, ptr]+/ ULONG* pcNumLines,
4280 		/+[in, out, ptr]+/ ULONG* pcNumChars);
4281 
4282 	HRESULT GetText(
4283 		in TEXT_POSITION pos,
4284 		in ULONG cMaxChars,
4285 		/+[out, length_is(*pcNumChars), size_is(cMaxChars)]+/ WCHAR* pText,
4286 		/+[out]+/ ULONG* pcNumChars);
4287 };
4288 // #pragma warning(pop)
4289 
4290 // ------------------------------------------------------------------
4291 // IDebugDocumentPosition2
4292 const GUID IID_IDebugDocumentPosition2 = IDebugDocumentPosition2.iid;
4293 
4294 interface IDebugDocumentPosition2 : IUnknown
4295 {
4296     static const GUID iid = { 0xbdde0eee,0x3b8d,0x4c82,[ 0xb5,0x29,0x33,0xf1,0x6b,0x42,0x83,0x2e ] };
4297 	HRESULT GetFileName(
4298 		/+[out]+/ BSTR* pbstrFileName);
4299 
4300 	HRESULT GetDocument(
4301 		/+[out]+/ IDebugDocument2 * ppDoc);
4302 
4303 	HRESULT IsPositionInDocument(
4304 		/+[in]+/ IDebugDocument2 pDoc);
4305 
4306 	HRESULT GetRange(
4307 		/+[in, out, ptr]+/ TEXT_POSITION* pBegPosition,
4308 		/+[in, out, ptr]+/ TEXT_POSITION* pEndPosition);
4309 };
4310 
4311 // ------------------------------------------------------------------
4312 // IDebugDocumentPositionOffset2
4313 const GUID IID_IDebugDocumentPositionOffset2 = IDebugDocumentPositionOffset2.iid;
4314 
4315 interface IDebugDocumentPositionOffset2 : IUnknown
4316 {
4317     static const GUID iid = { 0x037edd0f,0x8551,0x4f7f,[ 0x8c,0xa0,0x04,0xd9,0xe2,0x9f,0x53,0x2d ] };
4318 	HRESULT GetRange(
4319 		/+[in, out, ptr]+/ DWORD* pdwBegOffset,
4320 		/+[in, out, ptr]+/ DWORD* pdwEndOffset);
4321 };
4322 
4323 // ------------------------------------------------------------------
4324 // IDebugFunctionPosition2
4325 
4326 const GUID IID_IDebugFunctionPosition2 = IDebugFunctionPosition2.iid;
4327 
4328 interface IDebugFunctionPosition2 : IUnknown
4329 {
4330     static const GUID iid = { 0x1ede3b4b,0x35e7,0x4b97,[ 0x81,0x33,0x02,0x84,0x5d,0x60,0x01,0x74 ] };
4331 	HRESULT GetFunctionName(
4332 		/+[out]+/ BSTR* pbstrFunctionName);
4333 
4334 	HRESULT GetOffset(
4335 		/+[in, out, ptr]+/ TEXT_POSITION* pPosition);
4336 };
4337 
4338 // ------------------------------------------------------------------
4339 // IDebugDocumentTextEvents2
4340 const GUID IID_IDebugDocumentTextEvents2 = IDebugDocumentTextEvents2.iid;
4341 
4342 interface IDebugDocumentTextEvents2 : IUnknown
4343 {
4344     static const GUID iid = { 0x33ec72e3,0x002f,0x4966,[ 0xb9,0x1c,0x5c,0xe2,0xf7,0xba,0x51,0x24 ] };
4345 
4346 	HRESULT onDestroy();
4347 
4348 	HRESULT onInsertText(
4349 		in TEXT_POSITION pos,
4350 		in DWORD dwNumToInsert);
4351 
4352 	HRESULT onRemoveText(
4353 		in TEXT_POSITION pos,
4354 		in DWORD dwNumToRemove);
4355 
4356 	HRESULT onReplaceText(
4357 		in TEXT_POSITION pos,
4358 		in DWORD dwNumToReplace);
4359 
4360 	HRESULT onUpdateTextAttributes(
4361 		in TEXT_POSITION pos,
4362 		in DWORD dwNumToUpdate);
4363 
4364 	HRESULT onUpdateDocumentAttributes(
4365 		in TEXT_DOC_ATTR_2 textdocattr);
4366 }
4367 alias DWORD TEXT_DOC_ATTR_2;
4368 const TEXT_DOC_ATTR_2 TEXT_DOC_ATTR_READONLY_2 = 0x00000001;;
4369 
4370 // ------------------------------------------------------------------
4371 // IDebugQueryEngine2
4372 
4373 const GUID IID_IDebugQueryEngine2 = IDebugQueryEngine2.iid;
4374 
4375 interface IDebugQueryEngine2 : IUnknown
4376 {
4377     static const GUID iid = { 0xc989adc9,0xf305,0x4ef5,[ 0x8c,0xa2,0x20,0x89,0x8e,0x8d,0x0e,0x28 ] };
4378 	HRESULT GetEngineInterface(
4379 		/+[out]+/ IUnknown * ppUnk);
4380 };
4381 
4382 //-------------------------------------------------------------------
4383 // IEEHostServices
4384 const GUID IID_IEEHostServices = IEEHostServices.iid;
4385 
4386 interface IEEHostServices : IUnknown
4387 {
4388     static const GUID iid = { 0xBB7BE481,0xDA8F,0x4b9e,[ 0x89,0xCB,0x0A,0x8D,0xDE,0x6B,0xC5,0xD7 ] };
4389 	HRESULT GetHostValue(
4390 		in LPCOLESTR valueCatagory, 
4391 		in LPCOLESTR valueKind, 
4392 		/+[out]+/ VARIANT * result);
4393 	HRESULT SetHostValue(
4394 		in LPCOLESTR valueCatagory, 
4395 		in LPCOLESTR valueKind,
4396 		in VARIANT newValue);
4397 };
4398 
4399 //-------------------------------------------------------------------
4400 // IDebugCustomViewer
4401 const GUID IID_IDebugCustomViewer = IDebugCustomViewer.iid;
4402 
4403 interface IDebugCustomViewer : IUnknown
4404 {
4405     static const GUID iid = { 0x6306E526,0x9E02,0x4696,[ 0xBF,0xF9,0x48,0x33,0x8A,0x27,0xF8,0xAF ] };
4406 	HRESULT DisplayValue(
4407 		in HWND hwnd,                         // Parent window.
4408         in DWORD dwID,                        // ID for custom viewers that support more than one type.
4409         /+[in]+/ IUnknown  pHostServices,
4410 		/+[in]+/ IDebugProperty3 pDebugProperty);
4411 };
4412 
4413     const GUID IID_IEEDataStorage = IEEDataStorage.iid;
4414 
4415 interface IEEDataStorage : IUnknown
4416 {
4417     static const GUID iid = { 0xDCF1F227,0xEC51,0x4680,[ 0x87,0x22,0xC8,0x79,0x6A,0x5F,0x34,0x83 ] };
4418         HRESULT GetSize(/+[out]+/ ULONG * size);
4419         HRESULT GetData(in ULONG dataSize, 
4420 		/+[out]+/ ULONG * sizeGotten, 
4421 		/+[out, size_is(dataSize), length_is(*sizeGotten)]+/ BYTE * data);
4422 };
4423 
4424     const GUID IID_IPropertyProxyEESide = IPropertyProxyEESide.iid;
4425 
4426 interface IPropertyProxyEESide : IUnknown
4427 {
4428     static const GUID iid = { 0x579919D2,0x1B10,0x4584,[ 0x96,0x9C,0x3E,0x06,0x5B,0xD3,0xE2,0x2D ] };
4429 
4430         HRESULT InitSourceDataProvider(/+[out]+/ IEEDataStorage * dataOut);
4431         HRESULT GetManagedViewerCreationData (/+[out]+/ BSTR * assemName, 
4432 		/+[out]+/ IEEDataStorage * assemBytes, 
4433 		/+[out]+/ IEEDataStorage * assemPdb, 
4434 		/+[out]+/ BSTR * className, 
4435 		/+[out]+/ ASSEMBLYLOCRESOLUTION * alr, 
4436 		/+[out]+/ BOOL * replacementOk);
4437         HRESULT GetInitialData(/+[out]+/ IEEDataStorage * dataOut);
4438         HRESULT CreateReplacementObject(/+[in]+/ IEEDataStorage  dataIn, 
4439 		/+[out]+/ IEEDataStorage * dataOut);
4440         HRESULT InPlaceUpdateObject(/+[in]+/ IEEDataStorage  dataIn, 
4441 		/+[out]+/ IEEDataStorage * dataOut);
4442         HRESULT ResolveAssemblyReference(in LPCOLESTR assemName, in GETASSEMBLY flags, 
4443 		/+[out]+/ IEEDataStorage * assemBytes, 
4444 		/+[out]+/ IEEDataStorage * assemPdb, 
4445 		/+[out]+/ BSTR * assemLocation, 
4446 		/+[out]+/ ASSEMBLYLOCRESOLUTION * alr);
4447 }
4448 enum /+ enum_ASSEMBLYLOCRESOLUTION+/ : DWORD 
4449 {
4450             ALR_NAME = 0x0,
4451             ALR_USERDIR = 0x1,
4452             ALR_SHAREDDIR = 0x2,
4453             ALR_REMOTEDIR = 0x4,
4454             ALR_ERROR = 0x8,
4455             ALR_BYTES = 0x10,
4456 }
4457 alias DWORD enum_ASSEMBLYLOCRESOLUTION;
4458 alias DWORD ASSEMBLYLOCRESOLUTION;
4459 enum /+ enum_GETASSEMBLY+/ : DWORD 
4460 {
4461             GA_BYTES = 0x1 ,
4462             GA_PDBBYTES = 0x2,
4463             GA_NAME = 0x4,
4464             GA_FLAGS = 0x8,
4465 }
4466 alias DWORD enum_GETASSEMBLY;
4467 alias DWORD GETASSEMBLY;;
4468 
4469     const GUID IID_IPropertyProxyProvider = IPropertyProxyProvider.iid;
4470 
4471 interface IPropertyProxyProvider : IUnknown
4472 {
4473     static const GUID iid = { 0x30E6C90E,0x757E,0x48cf,[ 0x8D,0xB8,0x20,0xB0,0x61,0xAF,0xBB,0xAE ] };
4474         HRESULT GetPropertyProxy(in DWORD dwID, 
4475 		/+[out]+/ IPropertyProxyEESide * proxy);
4476 };
4477 
4478     const GUID IID_IManagedViewerHost = IManagedViewerHost.iid;
4479 
4480 interface IManagedViewerHost : IUnknown
4481 {
4482     static const GUID iid = { 0x5968D43D,0xD21E,0x437c,[ 0x9C,0x71,0x77,0xC5,0x2C,0x3E,0x28,0x7A ] };
4483         HRESULT CreateViewer(in ULONG hwnd, /+[in]+/ IUnknown  hostServices, /+[in]+/ IPropertyProxyEESide  property);
4484 };
4485 
4486     const GUID IID_IEELocalObject = IEELocalObject.iid;
4487 
4488 interface IEELocalObject : IUnknown
4489 {
4490     static const GUID iid = { 0x44F8F85F,0x5514,0x49a3,[ 0x81,0x73,0x6F,0x9C,0x9F,0x1C,0x48,0x32 ] };
4491         HRESULT SetCallback(IDebugSettingsCallback2  pCallback);
4492 };
4493 
4494     const GUID IID_IEEAssemblyRefResolveComparer = IEEAssemblyRefResolveComparer.iid;
4495 
4496 interface IEEAssemblyRefResolveComparer : IUnknown
4497 {
4498     static const GUID iid = { 0x6F1A544C,0xE69E,0x4a52,[ 0x9E,0xA1,0x25,0xC8,0x97,0xB0,0x5B,0xEF ] };
4499         HRESULT CompareRef(in DWORD cookieFirst, in DWORD cookieSecond, in DWORD cookieTarget, 
4500 		/+[out]+/ BOOL * firstIsBetter);
4501 };
4502 
4503     const GUID IID_IEEAssemblyRef = IEEAssemblyRef.iid;
4504 
4505 interface IEEAssemblyRef : IUnknown
4506 {
4507     static const GUID iid = { 0xAAD20A0E,0x9CD9,0x40ab,[ 0x91,0xB9,0x3C,0x19,0x43,0x56,0x2C,0x84 ] };
4508         HRESULT GetName(/+[out]+/ BSTR * bstr);
4509         HRESULT GetVersion(/+[out]+/ USHORT * major, 
4510 		/+[out]+/ USHORT * minor, 
4511 		/+[out]+/ USHORT * build, 
4512 		/+[out]+/ USHORT * revision);
4513         HRESULT GetCulture(/+[out]+/ BSTR * bstr);
4514         HRESULT GetPublicKey(/+[out]+/ BSTR * key);
4515 };
4516 
4517     const GUID IID_IEEHelperObject = IEEHelperObject.iid;
4518 
4519 interface IEEHelperObject : IUnknown
4520 {
4521     static const GUID iid = { 0x4A3BCDE5,0x5F66,0x4cc8,[ 0x9F,0xA0,0x14,0x27,0x5C,0xCE,0xE6,0x88 ] };
4522 
4523         HRESULT InitCache(IEEAssemblyRefResolveComparer  pResolver);
4524 
4525         HRESULT GetTargetClass(in LPCOLESTR name, in DWORD assemblyCookie, 
4526 		/+[out]+/ DWORD * cookie, 
4527 		/+[out]+/ ULONG * valueAttrCount, 
4528 		/+[out]+/ ULONG * viewerAttrCount, 
4529 		/+[out]+/ ULONG * visualizerAttrCount);
4530         HRESULT GetTargetAssembly(in LPCOLESTR name, 
4531 		/+[out]+/ DWORD * cookie);
4532 
4533         HRESULT GetAssembly(in DWORD assemblyCookie, GETASSEMBLY flags, 
4534 		/+[out]+/ ASSEMBLYFLAGS * flagsOut, 
4535 		/+[out]+/ BSTR * name, 
4536 		/+[out]+/ IEEDataStorage * assemBytes, 
4537 		/+[out]+/ IEEDataStorage * pdbBytes);
4538 
4539         HRESULT GetHostAssembly(GETASSEMBLY flags, 
4540 		/+[out]+/ IEEDataStorage * assemBytes, 
4541 		/+[out]+/ IEEDataStorage * pdbBytes);
4542 
4543         HRESULT GetValueAttributeProps(in DWORD classCookie, in ULONG ordinal, 
4544 		/+[out]+/ BSTR * targetedAssembly, 
4545 		/+[out]+/ DWORD * assemLocation, 
4546 		/+[out]+/ BSTR * name, 
4547 		/+[out]+/ BSTR * value, 
4548 		/+[out]+/ BSTR * type);
4549         HRESULT GetViewerAttributeProps(in DWORD classCookie, in ULONG ordinal, 
4550 		/+[out]+/ BSTR * targetedAssembly, 
4551 		/+[out]+/ DWORD * assemLocation, 
4552 		/+[out]+/ BSTR * className, 
4553 		/+[out]+/ DWORD * classAssemLocation);
4554         HRESULT GetVisualizerAttributeProps(in DWORD classCookie, in ULONG ordinal, 
4555 		/+[out]+/ BSTR * targetedAssembly, 
4556 		/+[out]+/ DWORD * assemLocation, 
4557 		/+[out]+/ BSTR * displayClassName, 
4558 		/+[out]+/ DWORD * displayClassAssemLocation, 
4559 		/+[out]+/ BSTR * proxyClassName, 
4560 		/+[out]+/ DWORD * proxyClassAssemLocation, 
4561 		/+[out]+/ BSTR * description, 
4562 		/+[out]+/ ULONG * uiType);
4563         HRESULT GetAssemblyRefForCookie(in DWORD cookie, 
4564 		/+[out]+/ IEEAssemblyRef * ppAssemRef);
4565 }
4566 enum /+ enum_ASSEMBLYFLAGS+/ : DWORD 
4567 {
4568             ASMF_USERDIR = 0x1,
4569             ASMF_SHAREDDIR = 0x2,
4570 }
4571 alias DWORD enum_ASSEMBLYFLAGS;
4572 alias DWORD ASSEMBLYFLAGS;;
4573 
4574 // ------------------------------------------------------------------
4575 // IDebugExceptionCallback2
4576 const GUID IID_IDebugExceptionCallback2 = IDebugExceptionCallback2.iid;
4577 
4578 interface IDebugExceptionCallback2 : IUnknown
4579 {
4580     static const GUID iid = { 0x6f5cfda4,0x47d3,0x4a90,[ 0xa8,0x82,0x14,0x42,0x72,0x37,0xbc,0xee ] };
4581 	// S_OK indicates that we should stop
4582 	HRESULT QueryStopOnException(
4583 		/+[in]+/ IDebugProcess2 pProcess,
4584 		/+[in]+/ IDebugProgram2 pProgram,
4585 		/+[in]+/ IDebugThread2 pThread,
4586 		/+[in]+/ IDebugExceptionEvent2 pEvent);
4587 };
4588 
4589 // ------------------------------------------------------------------
4590 // IEnumDebugProcesses2
4591 const GUID IID_IEnumDebugProcesses2 = IEnumDebugProcesses2.iid;
4592 
4593 interface IEnumDebugProcesses2 : IUnknown
4594 {
4595     static const GUID iid = { 0x96c74ef4,0x185d,0x4f9a,[ 0x8a,0x43,0x4d,0x27,0x23,0x75,0x8e,0x0a ] };
4596 	HRESULT Next(
4597 		in ULONG celt,
4598 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugProcess2 * rgelt,
4599 		/+[in, out]+/ ULONG* pceltFetched);
4600 
4601 	HRESULT Skip(
4602 		in ULONG celt);
4603 
4604 	HRESULT Reset();
4605 
4606 	HRESULT Clone(
4607 		/+[out]+/ IEnumDebugProcesses2 * ppEnum);
4608 
4609 	HRESULT GetCount(
4610 		/+[out]+/ ULONG* pcelt);
4611 };
4612 
4613 // ------------------------------------------------------------------
4614 // IEnumDebugPrograms2
4615 const GUID IID_IEnumDebugPrograms2 = IEnumDebugPrograms2.iid;
4616 
4617 interface IEnumDebugPrograms2 : IUnknown
4618 {
4619     static const GUID iid = { 0x8d14bca6,0x34ce,0x4efe,[ 0xac,0x7e,0x0a,0xbc,0x61,0xda,0xdb,0x20 ] };
4620 	HRESULT Next(
4621 		in ULONG celt,
4622 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugProgram2 * rgelt,
4623 		/+[in, out]+/ ULONG* pceltFetched);
4624 
4625 	HRESULT Skip(
4626 		in ULONG celt);
4627 
4628 	HRESULT Reset();
4629 
4630 	HRESULT Clone(
4631 		/+[out]+/ IEnumDebugPrograms2 * ppEnum);
4632 
4633 	HRESULT GetCount(
4634 		/+[out]+/ ULONG* pcelt);
4635 };
4636 
4637 // ------------------------------------------------------------------
4638 // IEnumDebugThreads2
4639 const GUID IID_IEnumDebugThreads2 = IEnumDebugThreads2.iid;
4640 
4641 interface IEnumDebugThreads2 : IUnknown
4642 {
4643     static const GUID iid = { 0x0d30dc12,0xc4f8,0x433d,[ 0x9f,0xcc,0x9f,0xf1,0x17,0xe5,0xe5,0xf4 ] };
4644 	HRESULT Next(
4645 		in ULONG celt,
4646 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugThread2 * rgelt,
4647 		/+[in, out]+/ ULONG* pceltFetched);
4648 
4649 	HRESULT Skip(
4650 		in ULONG celt);
4651 
4652 	HRESULT Reset();
4653 
4654 	HRESULT Clone(
4655 		/+[out]+/ IEnumDebugThreads2 * ppEnum);
4656 
4657 	HRESULT GetCount(
4658 		/+[out]+/ ULONG* pcelt);
4659 };
4660 
4661 // ------------------------------------------------------------------
4662 // IEnumDebugStackFrames2
4663 const GUID IID_IEnumDebugStackFrames2 = IEnumDebugStackFrames2.iid;
4664 
4665 interface IEnumDebugStackFrames2 : IUnknown
4666 {
4667     static const GUID iid = { 0xcd39102b,0x4b69,0x4495,[ 0x8f,0x29,0xe0,0xb2,0x5c,0x4a,0x88,0x55 ] };
4668 	HRESULT Next(
4669 		in ULONG celt,
4670 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugStackFrame2 * rgelt,
4671 		/+[in, out]+/ ULONG* pceltFetched);
4672 
4673 	HRESULT Skip(
4674 		in ULONG celt);
4675 
4676 	HRESULT Reset();
4677 
4678 	HRESULT Clone(
4679 		/+[out]+/ IEnumDebugStackFrames2 * ppEnum);
4680 
4681 	HRESULT GetCount(
4682 		/+[out]+/ ULONG* pcelt);
4683 
4684 	HRESULT GetIndex(
4685 		/+[in]+/ IDebugStackFrame2 pStackFrame,
4686 		/+[in, out]+/ ULONG* pIndex);
4687 };
4688 
4689 // ------------------------------------------------------------------
4690 // IEnumDebugCodeContexts2
4691 const GUID IID_IEnumDebugCodeContexts2 = IEnumDebugCodeContexts2.iid;
4692 
4693 interface IEnumDebugCodeContexts2 : IUnknown
4694 {
4695     static const GUID iid = { 0xad47a80b,0xeda7,0x459e,[ 0xaf,0x82,0x64,0x7c,0xc9,0xfb,0xaa,0x50 ] };
4696 	HRESULT Next(
4697 		in ULONG celt,
4698 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugCodeContext2 * rgelt,
4699 		/+[in, out]+/ ULONG* pceltFetched);
4700 
4701 	HRESULT Skip(
4702 		in ULONG celt);
4703 
4704 	HRESULT Reset();
4705 
4706 	HRESULT Clone(
4707 		/+[out]+/ IEnumDebugCodeContexts2 * ppEnum);
4708 
4709 	HRESULT GetCount(
4710 		/+[out]+/ ULONG* pcelt);
4711 };
4712 
4713 // ------------------------------------------------------------------
4714 // IEnumDebugBoundBreakpoints2
4715 
4716 const GUID IID_IEnumDebugBoundBreakpoints2 = IEnumDebugBoundBreakpoints2.iid;
4717 
4718 interface IEnumDebugBoundBreakpoints2 : IUnknown
4719 {
4720     static const GUID iid = { 0x0f6b37e0,0xfcfe,0x44d9,[ 0x91,0x12,0x39,0x4c,0xa9,0xb9,0x21,0x14 ] };
4721 	HRESULT Next(
4722 		in ULONG celt,
4723 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugBoundBreakpoint2 * rgelt,
4724 		/+[in, out]+/ ULONG* pceltFetched);
4725 
4726 	HRESULT Skip(
4727 		in ULONG celt);
4728 
4729 	HRESULT Reset();
4730 
4731 	HRESULT Clone(
4732 		/+[out]+/ IEnumDebugBoundBreakpoints2 * ppEnum);
4733 
4734 	HRESULT GetCount(
4735 		/+[out]+/ ULONG* pcelt);
4736 };
4737 
4738 // ------------------------------------------------------------------
4739 // IEnumDebugPendingBreakpoints2
4740 
4741 const GUID IID_IEnumDebugPendingBreakpoints2 = IEnumDebugPendingBreakpoints2.iid;
4742 
4743 interface IEnumDebugPendingBreakpoints2 : IUnknown
4744 {
4745     static const GUID iid = { 0x70d2dc1e,0x4dcc,0x4786,[ 0xa0,0x72,0x9a,0x3b,0x60,0x0c,0x21,0x6b ] };
4746 	HRESULT Next(
4747 		in ULONG celt,
4748 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugPendingBreakpoint2 * rgelt,
4749 		/+[in, out]+/ ULONG* pceltFetched);
4750 
4751 	HRESULT Skip(
4752 		in ULONG celt);
4753 
4754 	HRESULT Reset();
4755 
4756 	HRESULT Clone(
4757 		/+[out]+/ IEnumDebugPendingBreakpoints2 * ppEnum);
4758 
4759 	HRESULT GetCount(
4760 		/+[out]+/ ULONG* pcelt);
4761 };
4762 
4763 // ------------------------------------------------------------------
4764 // IEnumDebugErrorBreakpoints2
4765 
4766 const GUID IID_IEnumDebugErrorBreakpoints2 = IEnumDebugErrorBreakpoints2.iid;
4767 
4768 interface IEnumDebugErrorBreakpoints2 : IUnknown
4769 {
4770     static const GUID iid = { 0xe158f5aa,0x31fe,0x491b,[ 0xa9,0xf6,0xcf,0xf9,0x34,0xb0,0x3a,0x01 ] };
4771 	HRESULT Next(
4772 		in ULONG celt,
4773 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugErrorBreakpoint2 * rgelt,
4774 		/+[in, out]+/ ULONG* pceltFetched);
4775 
4776 	HRESULT Skip(
4777 		in ULONG celt);
4778 
4779 	HRESULT Reset();
4780 
4781 	HRESULT Clone(
4782 		/+[out]+/ IEnumDebugErrorBreakpoints2 * ppEnum);
4783 
4784 	HRESULT GetCount(
4785 		/+[out]+/ ULONG* pcelt);
4786 };
4787 
4788 // ------------------------------------------------------------------
4789 // IEnumDebugMachines2__deprecated
4790 const GUID IID_IEnumDebugMachines2__deprecated = IEnumDebugMachines2__deprecated.iid;
4791 
4792 interface IEnumDebugMachines2__deprecated : IUnknown
4793 {
4794     static const GUID iid = { 0x61d986ec,0x1eac,0x46b6,[ 0x90,0xff,0x40,0x2a,0x00,0x8f,0x15,0xd1 ] };
4795 	HRESULT Next(
4796 		in ULONG celt,
4797 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugCoreServer2 * rgelt,
4798 		/+[in, out]+/ ULONG *pceltFetched);
4799 
4800 	HRESULT Skip(
4801 		in ULONG celt);
4802 
4803 	HRESULT Reset();
4804 
4805 	HRESULT Clone(
4806 		/+[out]+/ IEnumDebugMachines2__deprecated *ppEnum);
4807 
4808 	HRESULT GetCount(
4809 		/+[out]+/ ULONG *pcelt);
4810 };
4811 
4812 // #define EnumMachines_V7 EnumMachines__deprecated
4813 // #define IEnumDebugMachines2_V7 IEnumDebugMachines2__deprecated
4814 // #define IID_IEnumDebugMachines2_V7 IID_IEnumDebugMachines2__deprecated
4815 
4816 // ------------------------------------------------------------------
4817 // IEnumDebugExceptionInfo2
4818 const GUID IID_IEnumDebugExceptionInfo2 = IEnumDebugExceptionInfo2.iid;
4819 
4820 interface IEnumDebugExceptionInfo2 : IUnknown
4821 {
4822     static const GUID iid = { 0x8e4bbd34,0xa2f4,0x41ef,[ 0x87,0xb5,0xc5,0x63,0xb4,0xad,0x6e,0xe7 ] };
4823     HRESULT Next(
4824         in ULONG celt,
4825 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ EXCEPTION_INFO* rgelt,
4826 		/+[in, out]+/ ULONG *pceltFetched);
4827 
4828 	HRESULT Skip(
4829 		in ULONG celt);
4830 
4831 	HRESULT Reset();
4832 
4833 	HRESULT Clone(
4834 		/+[out]+/ IEnumDebugExceptionInfo2 * ppEnum);
4835 
4836 	HRESULT GetCount(
4837 		/+[out]+/ ULONG* pcelt);
4838 };
4839 
4840 // ------------------------------------------------------------------
4841 // IEnumDebugFrameInfo2
4842 const GUID IID_IEnumDebugFrameInfo2 = IEnumDebugFrameInfo2.iid;
4843 
4844 interface IEnumDebugFrameInfo2 : IUnknown
4845 {
4846     static const GUID iid = { 0x98bbba48,0x4c4d,0x4fff,[ 0x83,0x40,0x60,0x97,0xbe,0xc9,0xc8,0x94 ] };
4847     HRESULT Next(
4848         in ULONG celt,
4849 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ FRAMEINFO* rgelt,
4850 		/+[in, out]+/ ULONG *pceltFetched);
4851 
4852 	HRESULT Skip(
4853 		in ULONG celt);
4854 
4855 	HRESULT Reset();
4856 
4857 	HRESULT Clone(
4858 		/+[out]+/ IEnumDebugFrameInfo2 * ppEnum);
4859 
4860 	HRESULT GetCount(
4861 		/+[out]+/ ULONG* pcelt);
4862 };
4863 
4864 const GUID IID_IEnumDebugSessionFrameInfo2 = IEnumDebugSessionFrameInfo2.iid;
4865 
4866 interface IEnumDebugSessionFrameInfo2 : IEnumDebugFrameInfo2
4867 {
4868     static const GUID iid = { 0xef7262c4,0x4a01,0x42a0,[ 0x86,0x58,0x93,0x26,0x67,0xb2,0x75,0x55 ] };
4869 
4870 	HRESULT SetCachePriority(
4871 		in SESSION_CACHE_PRIORITY cachePriority);
4872 }
4873 enum /+ enum_SESSION_CACHE_PRIORITY+/
4874 {
4875 		NORMAL_CACHE_PRIORITY = 0,
4876 		HIGH_CACHE_PRIORITY = 1
4877 }
4878 alias int enum_SESSION_CACHE_PRIORITY;
4879 alias int SESSION_CACHE_PRIORITY;;
4880 
4881 // ------------------------------------------------------------------
4882 // IEnumDebugFrameInfoFilter2
4883 const GUID IID_IEnumDebugFrameInfoFilter2 = IEnumDebugFrameInfoFilter2.iid;
4884 
4885 interface IEnumDebugFrameInfoFilter2 : IEnumDebugFrameInfo2
4886 {
4887     static const GUID iid = { 0x6CD4FB40,0xF954,0x44e0,[ 0xB8,0xA5,0xA6,0x14,0x48,0x1E,0x08,0x31 ] };
4888     HRESULT CanFilter(
4889         /+[out]+/ BOOL *pfCanFilter);
4890 
4891     HRESULT IsFiltered(
4892         /+[out]+/ BOOL *pfIsFiltered);
4893 }
4894 
4895 // ------------------------------------------------------------------
4896 // IEnumCodePaths2
4897 const GUID IID_IEnumCodePaths2 = IEnumCodePaths2.iid;
4898 
4899 interface IEnumCodePaths2 : IUnknown
4900 {
4901     static const GUID iid = { 0x9b13f80d,0xcfc6,0x4b78,[ 0x81,0xef,0x1f,0x7c,0xc3,0x3f,0x76,0x39 ] };
4902     HRESULT Next(
4903         in ULONG celt,
4904 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ CODE_PATH* rgelt,
4905 		/+[in, out]+/ ULONG *pceltFetched);
4906 
4907 	HRESULT Skip(
4908 		in ULONG celt);
4909 
4910 	HRESULT Reset();
4911 
4912 	HRESULT Clone(
4913 		/+[out]+/ IEnumCodePaths2 * ppEnum);
4914 
4915 	HRESULT GetCount(
4916 		/+[out]+/ ULONG* pcelt);
4917 };
4918 
4919 // ------------------------------------------------------------------
4920 // IEnumDebugModules2
4921 const GUID IID_IEnumDebugModules2 = IEnumDebugModules2.iid;
4922 
4923 interface IEnumDebugModules2 : IUnknown
4924 {
4925     static const GUID iid = { 0x4c4a2835,0x682e,0x4ce1,[ 0xae,0xbc,0x1e,0x6b,0x3a,0x16,0x5b,0x44 ] };
4926     HRESULT Next(
4927         in ULONG celt,
4928 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugModule2 * rgelt,
4929 		/+[in, out]+/ ULONG* pceltFetched);
4930 
4931 	HRESULT Skip(
4932 		in ULONG celt);
4933 
4934 	HRESULT Reset();
4935 
4936 	HRESULT Clone(
4937 		/+[out]+/ IEnumDebugModules2 * ppEnum);
4938 
4939 	HRESULT GetCount(
4940 		/+[out]+/ ULONG* pcelt);
4941 };
4942 
4943 // ------------------------------------------------------------------
4944 // IEnumDebugPortSuppliers2
4945 const GUID IID_IEnumDebugPortSuppliers2 = IEnumDebugPortSuppliers2.iid;
4946 
4947 interface IEnumDebugPortSuppliers2 : IUnknown
4948 {
4949     static const GUID iid = { 0x59c9dc99,0x3eff,0x4ff3,[ 0xb2,0x01,0x98,0xac,0xd0,0x1b,0x0d,0x87 ] };
4950 	HRESULT Next(
4951 		in ULONG celt,
4952 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugPortSupplier2 * rgelt,
4953 		/+[in, out]+/ ULONG* pceltFetched);
4954 
4955 	HRESULT Skip(
4956 		in ULONG celt);
4957 
4958 	HRESULT Reset();
4959 
4960 	HRESULT Clone(
4961 		/+[out]+/ IEnumDebugPortSuppliers2 * ppEnum);
4962 
4963 	HRESULT GetCount(
4964 		/+[out]+/ ULONG* pcelt);
4965 };
4966 
4967 // ------------------------------------------------------------------
4968 // IEnumDebugPorts2
4969 const GUID IID_IEnumDebugPorts2 = IEnumDebugPorts2.iid;
4970 
4971 interface IEnumDebugPorts2 : IUnknown
4972 {
4973     static const GUID iid = { 0xbc827c5e,0x99ae,0x4ac8,[ 0x83,0xad,0x2e,0xa5,0xc2,0x03,0x43,0x33 ] };
4974 	HRESULT Next(
4975 		in ULONG celt,
4976 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ IDebugPort2 * rgelt,
4977 		/+[in, out]+/ ULONG* pceltFetched);
4978 
4979 	HRESULT Skip(
4980 		in ULONG celt);
4981 
4982 	HRESULT Reset();
4983 
4984 	HRESULT Clone(
4985 		/+[out]+/ IEnumDebugPorts2 * ppEnum);
4986 
4987 	HRESULT GetCount(
4988 		/+[out]+/ ULONG* pcelt);
4989 };
4990 
4991 // ------------------------------------------------------------------
4992 // IEnumDebugPropertyInfo2
4993 const GUID IID_IEnumDebugPropertyInfo2 = IEnumDebugPropertyInfo2.iid;
4994 
4995 interface IEnumDebugPropertyInfo2 : IUnknown
4996 {
4997     static const GUID iid = { 0x6c7072c3,0x3ac4,0x408f,[ 0xa6,0x80,0xfc,0x5a,0x2f,0x96,0x90,0x3e ] };
4998     HRESULT Next(
4999         in ULONG celt,
5000 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ DEBUG_PROPERTY_INFO* rgelt,
5001 		/+[out]+/ ULONG* pceltFetched);
5002 
5003 	HRESULT Skip(
5004 		in ULONG celt);
5005 
5006 	HRESULT Reset();
5007 
5008 	HRESULT Clone(
5009 		/+[out]+/ IEnumDebugPropertyInfo2 * ppEnum);
5010 
5011 	HRESULT GetCount(
5012 		/+[out]+/ ULONG* pcelt);
5013 };
5014 
5015 // ------------------------------------------------------------------
5016 // IEnumDebugReferenceInfo2
5017 const GUID IID_IEnumDebugReferenceInfo2 = IEnumDebugReferenceInfo2.iid;
5018 
5019 interface IEnumDebugReferenceInfo2 : IUnknown
5020 {
5021     static const GUID iid = { 0xe459dd12,0x864f,0x4aaa,[ 0xab,0xc1,0xdc,0xec,0xbc,0x26,0x7f,0x04 ] };
5022     HRESULT Next(
5023         in ULONG celt,
5024 		/+[out, size_is(celt), length_is(*pceltFetched)]+/ DEBUG_REFERENCE_INFO* rgelt,
5025 		/+[out]+/ ULONG* pceltFetched);
5026 
5027 	HRESULT Skip(
5028 		in ULONG celt);
5029 
5030 	HRESULT Reset();
5031 
5032 	HRESULT Clone(
5033 		/+[out]+/ IEnumDebugReferenceInfo2 * ppEnum);
5034 
5035 	HRESULT GetCount(
5036 		/+[out]+/ ULONG* pcelt);
5037 };
5038 
5039 // ------------------------------------------------------------------
5040 // IDebugProcessQueryProperties
5041 //   Extension interface implemented by IDebugProcess2 implementors.
5042 //   Enable querying the information about the execution environment
5043 //   of a process.
5044 //
5045 const GUID IID_IDebugProcessQueryProperties = IDebugProcessQueryProperties.iid;
5046 
5047 interface IDebugProcessQueryProperties : IUnknown
5048 {
5049     static const GUID iid = { 0x230A0071,0x62EF,0x4cae,[ 0xAA,0xC0,0x89,0x88,0xC3,0x70,0x24,0xBF ] };
5050 
5051 	HRESULT QueryProperty(
5052 		in PROCESS_PROPERTY_TYPE dwPropType,
5053 		/+[out]+/ VARIANT *pvarPropValue);
5054 
5055     HRESULT QueryProperties(
5056         in ULONG celt,
5057 		/+[ size_is (celt)]+/ in PROCESS_PROPERTY_TYPE *rgdwPropTypes,
5058 		/+[out, size_is(celt)]+/ VARIANT *rgtPropValues);
5059 }
5060 enum /+ enum_PROCESS_PROPERTY_TYPE+/ : DWORD 
5061 {
5062 		// Return the command line as a VT_BSTR
5063 		PROCESS_PROPERTY_COMMAND_LINE = 1,
5064 
5065 		// Return the current directory as a VT_BSTR
5066 		PROCESS_PROPERTY_CURRENT_DIRECTORY = 2,
5067 
5068 		// Return the environment variavles as a VT_BSTR.
5069 		// The format is:
5070 		//   NAME1=VALUE1'\0'
5071 		//   NAME2=VALUE2'\0'
5072 		//   ...
5073 		//   '\0'
5074 		PROCESS_PROPERTY_ENVIRONMENT_VARIABLES = 3
5075 }
5076 alias DWORD enum_PROCESS_PROPERTY_TYPE;
5077 alias DWORD PROCESS_PROPERTY_TYPE;;
5078 
5079 // ------------------------------------------------------------------
5080 // IDebugRemoteServer2 -- interface to an instance of msvsmon
5081 const GUID IID_IDebugRemoteServer2 = IDebugRemoteServer2.iid;
5082 
5083 interface IDebugRemoteServer2 : IUnknown
5084 {
5085     static const GUID iid = { 0x3d3ce5c4,0x1508,0x4711,[ 0xa5,0xeb,0xf8,0x48,0xf6,0xe1,0x00,0x72 ] };
5086 
5087 	HRESULT GetRemoteServerName(
5088 		/+[out]+/ BSTR *pbstrName);
5089 
5090 	HRESULT GetRemoteComputerInfo(
5091 		/+[out]+/ COMPUTER_INFO * pInfo
5092 		);
5093 
5094 	HRESULT EnumRemoteProcesses(
5095 		/+[out]+/ ENUMERATED_PROCESS_ARRAY * pProcessArray
5096 		);
5097 
5098 	HRESULT GetRemoteProcessInfo(
5099 		in DWORD dwProcessId,
5100 		in REMOTE_PROCESS_INFO_FIELDS Fields,
5101 		/+[out]+/ REMOTE_PROCESS_INFO *pInfo
5102 		);
5103 
5104 	HRESULT CreateRemoteInstance(
5105 		/+[ ptr]+/ in LPCWSTR szDll,
5106 		in WORD wLangId,
5107 		in CLSID* clsidObject,
5108 		in IID* riid,
5109 		/+[out, iid_is(riid)]+/ void **ppvObject);
5110 
5111 	HRESULT WatchForRemoteProcessDestroy(
5112 		/+[in]+/ IDebugPortEvents2 pCallback,
5113 		/+[in]+/ IDebugProcess2 pProcess,
5114 		/+[out]+/ WATCH_COOKIE *pWatchCookie);
5115 
5116 	HRESULT CloseRemoteWatchCookie(
5117 		in WATCH_COOKIE WatchCookie
5118 		);
5119 
5120 	HRESULT TerminateRemoteProcess(
5121 		in DWORD dwProcessId
5122 		);
5123 
5124 	HRESULT LaunchRemoteProcess(
5125 		in PROCESS_LAUNCH_INFO LaunchInfo,
5126 		/+[out]+/ DWORD * pdwProcessId,
5127 		/+[out]+/ RESUME_COOKIE * pResumeCookie);
5128 
5129 	HRESULT CloseRemoteResumeCookie(
5130 		in RESUME_COOKIE ResumeCookie);
5131 
5132 	HRESULT DiagnoseRemoteWebDebuggingError(
5133 		/+[ptr]+/ in LPCWSTR szUrl);
5134 }
5135 enum /+ enum_ENUMERATED_PROCESS_FLAGS+/ : DWORD 
5136 {
5137 		EPFLAG_SHOW_SECURITY_WARNING = 0x01,
5138 		EPFLAG_SYSTEM_PROCESS        = 0x02
5139 }
5140 alias DWORD enum_ENUMERATED_PROCESS_FLAGS;
5141 alias DWORD ENUMERATED_PROCESS_FLAGS;
5142 enum /+ enum_REMOTE_PROCESS_FLAGS+/ : DWORD 
5143 {
5144 		// ENUMERATED_PROCESS_FLAGS can also be passed here
5145 
5146 		RPFLAG_DEBUGGER_ATTACH       = 0x100,
5147 		RPFLAG_SQL_LOADED            = 0x200,
5148 		RPFLAG_CLR_LOADED            = 0x400,
5149 		RPFLAG_PROCESS_WOW64         = 0x800,
5150 }
5151 alias DWORD enum_REMOTE_PROCESS_FLAGS;
5152 alias DWORD REMOTE_PROCESS_FLAGS;
5153 enum /+ enum_REMOTE_PROCESS_INFO_FIELDS+/ : DWORD 
5154 {
5155 		RPIF_TITLE                   = 0x01,
5156 		RPIF_MODULE_PATH             = 0x02,
5157 		RPIF_COMMAND_LINE            = 0x04,
5158 		RPIF_CURRENT_DIRECTORY       = 0x08,
5159 		RPIF_ENVIRONMENT_VARIABLES   = 0x10,
5160 		RPIF_USER_NAME               = 0x20,
5161 		RPIF_SESSION_ID              = 0x40,
5162 		RPIF_ENUMERATED_FLAGS        = 0x80,
5163 		RPIF_DEBUGGER_PRESENT_FLAGS  = 0x100,
5164 		RPIF_PROGRAM_TYPE_FLAGS      = 0x200
5165 }
5166 alias DWORD enum_REMOTE_PROCESS_INFO_FIELDS;
5167 alias DWORD REMOTE_PROCESS_INFO_FIELDS;
5168 struct tagREMOTE_PROCESS_INFO
5169 {
5170 		REMOTE_PROCESS_INFO_FIELDS Fields;
5171 		BSTR bstrTitle;
5172 		BSTR bstrModulePath;
5173 		BSTR bstrCommandLine;
5174 		BSTR bstrCurrentDirectory;
5175 		BSTR bstrEnvironmentVariables;
5176 		BSTR bstrUserName;
5177 		DWORD dwSessionId;
5178 		REMOTE_PROCESS_FLAGS Flags;
5179 }
5180 alias tagREMOTE_PROCESS_INFO REMOTE_PROCESS_INFO;
5181 struct tagENUMERATED_PROCESS
5182 {
5183 		DWORD dwProcessId;
5184 		DWORD dwSessionId;
5185 		BSTR bstrUserName;
5186 		ENUMERATED_PROCESS_FLAGS dwProcessFlags;
5187 }
5188 alias tagENUMERATED_PROCESS ENUMERATED_PROCESS;
5189 struct tagENUMERATED_PROCESS_ARRAY
5190 {
5191 		DWORD dwCount;
5192 		/+[size_is(dwCount)]+/ ENUMERATED_PROCESS *Members;
5193 }
5194 alias tagENUMERATED_PROCESS_ARRAY ENUMERATED_PROCESS_ARRAY;
5195 struct tagPROCESS_LAUNCH_INFO
5196 {
5197 		LPCOLESTR pszExe;
5198 		/+[ptr]+/ LPCOLESTR pszArgs;
5199 		/+[ptr]+/ LPCOLESTR pszDir;
5200 		/+[ptr]+/ BSTR bstrEnv;
5201 		BOOL fLaunchSuspended;
5202 }
5203 alias tagPROCESS_LAUNCH_INFO PROCESS_LAUNCH_INFO;
5204 struct tagWATCH_COOKIE
5205 {
5206 		UINT64 val;
5207 }
5208 alias tagWATCH_COOKIE WATCH_COOKIE;
5209 struct tagRESUME_COOKIE
5210 {
5211 		UINT64 val;
5212 }
5213 alias tagRESUME_COOKIE RESUME_COOKIE;;
5214 
5215 // ------------------------------------------------------------------
5216 // IDebugRemoteServerFactory2 - Implemented on Win9x by Msvsmon
5217 const GUID IID_IDebugRemoteServerFactory2 = IDebugRemoteServerFactory2.iid;
5218 
5219 interface IDebugRemoteServerFactory2 : IUnknown
5220 {
5221     static const GUID iid = { 0x4a5af829,0xca32,0x4b01,[ 0xaa,0xe4,0x4c,0x53,0xd2,0x60,0xe7,0x5c ] };
5222 	HRESULT CreateServer(
5223 		/+[in]+/ IDebugSession2 pSession,
5224 		/+[out]+/ IDebugRemoteServer2 *ppRemoteServer
5225 		);
5226 };
5227 
5228 // ------------------------------------------------------------------
5229 // IDebugProgramPublisher2 - Implemented by pdm.dll (coclass ProgramPublisher).
5230 // This allows a script or third party program node to be published. These
5231 // program nodes are then accessable from a debugger process using IDebugProgramProvider2
5232 const GUID IID_IDebugProgramPublisher2 = IDebugProgramPublisher2.iid;
5233 
5234 interface IDebugProgramPublisher2 : IUnknown
5235 {
5236     static const GUID iid = { 0xa3dddf26,0x7792,0x4544,[ 0xa9,0xa4,0xd4,0xdf,0xb1,0x1c,0xd8,0xf3 ] };
5237 	HRESULT PublishProgramNode(
5238 		/+[in]+/  IDebugProgramNode2 pProgramNode);
5239 
5240 	HRESULT UnpublishProgramNode(
5241 		/+[in]+/  IDebugProgramNode2 pProgramNode);
5242 
5243 	HRESULT PublishProgram(
5244 		in  CONST_GUID_ARRAY Engines,
5245 		/+[ ptr]+/ in LPCOLESTR szFriendlyName,
5246 		/+[in]+/  IUnknown pDebuggeeInterface
5247 		);
5248 
5249 	HRESULT UnpublishProgram(
5250 		/+[in]+/  IUnknown pDebuggeeInterface
5251 		);
5252 
5253 	HRESULT SetDebuggerPresent(
5254 		in  BOOL fDebuggerPresent
5255 		);
5256 };
5257 
5258 // ------------------------------------------------------------------
5259 // IDebugProgramProvider2 - implemented by a 3rd party engine or by pdm.dll
5260 // (coclass DebugProgramProvider). This allows the sdm to obtain program
5261 // nodes for a running process.
5262 const GUID IID_IDebugProgramProvider2 = IDebugProgramProvider2.iid;
5263 
5264 interface IDebugProgramProvider2 : IUnknown
5265 {
5266     static const GUID iid = { 0x1959530a,0x8e53,0x4e09,[ 0xad,0x11,0x1b,0x73,0x34,0x81,0x1c,0xad ] };
5267 
5268 	HRESULT GetProviderProcessData(
5269 		in  PROVIDER_FLAGS Flags,
5270 		/+[in]+/  IDebugDefaultPort2 pPort,
5271 		in  AD_PROCESS_ID processId,
5272 		in  CONST_GUID_ARRAY EngineFilter,
5273 		/+[out]+/ PROVIDER_PROCESS_DATA *pProcess);
5274 
5275 	HRESULT GetProviderProgramNode(
5276 		in  PROVIDER_FLAGS Flags,
5277 		/+[in]+/  IDebugDefaultPort2 pPort,
5278 		in  AD_PROCESS_ID processId,
5279 		in GUID* guidEngine,
5280 		in  UINT64 programId,
5281 		/+[out]+/ IDebugProgramNode2 *ppProgramNode);
5282 
5283 	HRESULT WatchForProviderEvents(
5284 		in  PROVIDER_FLAGS Flags,
5285 		/+[in]+/  IDebugDefaultPort2 pPort,
5286 		in  AD_PROCESS_ID processId,
5287 		in  CONST_GUID_ARRAY EngineFilter,
5288 		in GUID* guidLaunchingEngine,
5289 		/+[in]+/  IDebugPortNotify2 pEventCallback);
5290 
5291 	HRESULT SetLocale(
5292 		in WORD wLangID);
5293 }
5294 enum /+ enum_PROVIDER_FLAGS+/ : DWORD 
5295 {
5296 		PFLAG_NONE                     = 0x00,    // no flags
5297 		PFLAG_REMOTE_PORT              = 0x01,    // asking for programs on a different machine then devenv
5298 		PFLAG_DEBUGGEE                 = 0x02,    // the process is curently being debugged by this devenv
5299 		PFLAG_ATTACHED_TO_DEBUGGEE     = 0x04,    // devenv is attached to the process (didn't launch it)
5300 		PFLAG_REASON_WATCH             = 0x08,    // we are starting to watch for events
5301 		PFLAG_GET_PROGRAM_NODES        = 0x10,    // want the 'ProgramNodes' field
5302 		PFLAG_GET_IS_DEBUGGER_PRESENT  = 0x20
5303 }
5304 alias DWORD enum_PROVIDER_FLAGS;
5305 alias DWORD PROVIDER_FLAGS;
5306 enum /+ enum_PROVIDER_FIELDS+/ : DWORD 
5307 {
5308 		PFIELD_PROGRAM_NODES           = 0x01,
5309 		PFIELD_IS_DEBUGGER_PRESENT     = 0x02
5310 }
5311 alias DWORD enum_PROVIDER_FIELDS;
5312 alias DWORD PROVIDER_FIELDS;
5313 struct tagPROGRAM_NODE_ARRAY
5314 {
5315 		DWORD dwCount;
5316 		/+[size_is(dwCount)]+/ IDebugProgramNode2 * Members;
5317 }
5318 alias tagPROGRAM_NODE_ARRAY PROGRAM_NODE_ARRAY;
5319 struct tagPROVIDER_PROCESS_DATA
5320 {
5321 		PROVIDER_FIELDS      Fields;
5322 		PROGRAM_NODE_ARRAY   ProgramNodes;
5323 		BOOL                 fIsDebuggerPresent;
5324 }
5325 alias tagPROVIDER_PROCESS_DATA PROVIDER_PROCESS_DATA;;
5326 
5327 // ------------------------------------------------------------------
5328 // IDebugProviderProgramNode2 - implemented by a 3rd party engine or by pdm.dll.
5329 // This interface is implemented in pdm.dll in the debugger process. It allows
5330 // an engine to retieve an interface from the program node running in the debuggee
5331 // process.
5332 const GUID IID_IDebugProviderProgramNode2 = IDebugProviderProgramNode2.iid;
5333 
5334 interface IDebugProviderProgramNode2 : IUnknown
5335 {
5336     static const GUID iid = { 0xafdba726,0x047a,0x4b83,[ 0xb8,0xc7,0xd8,0x12,0xfe,0x9c,0xaa,0x5c ] };
5337 	HRESULT UnmarshalDebuggeeInterface(
5338 		in IID* riid,
5339 		/+[out, iid_is(riid)]+/ void **ppvObject);
5340 };
5341 
5342 // IDebugFirewallConfigurationCallback2 - implemented by vsdebug, and the SDM (port object). 
5343 // This will determine if the Windows Firewall is blocking DCOM, and then take an 
5344 // appropriate action
5345 const GUID IID_IDebugFirewallConfigurationCallback2 = IDebugFirewallConfigurationCallback2.iid;
5346 
5347 interface IDebugFirewallConfigurationCallback2 : IUnknown
5348 {
5349     static const GUID iid = { 0xba3288db,0x224a,0x4fd6,[ 0xa3,0x7e,0x64,0xe7,0xab,0xe9,0xc4,0xa1 ] };
5350 	// Try and configure the firewall (if neccessary) so that the debugger can
5351 	// act as a DCOM server. 
5352 	// Possible return values are S_OK and E_FIREWALL_USER_CANCLED
5353 	HRESULT EnsureDCOMUnblocked();
5354 };
5355 
5356 // This informs the UI before we do an unsafe attach. This allows the UI to prompt
5357 // the user to decide if the attach should proceed
5358 const GUID IID_IDebugAttachSecurityCallback2 = IDebugAttachSecurityCallback2.iid;
5359 
5360 interface IDebugAttachSecurityCallback2 : IUnknown
5361 {
5362     static const GUID iid = { 0xa19e7faf,0xcb6f,0x43ba,[ 0xac,0x16,0xbd,0xe9,0x82,0x3d,0x6d,0xd1 ] };
5363 	HRESULT OnUnsafeAttach(/+[in]+/ IDebugProcess2 pProcess);
5364 };
5365 
5366 // ------------------------------------------------------------------
5367 
5368 version(all) /* #ifndef AD7_NO_LIB */ {
5369 /+[
5370 	uuid(d191c0d7-4c8b-4a15-a7b3-862dcd8daefb)
5371 ]+/ /+ library AD2Lib +/
5372 	//import sdk.port.stdole2;
5373 	//import win32.stdole2;
5374 
5375 	const GUID CLSID_SDMServer = SDMServer.iid;
5376 
5377 interface SDMServer
5378 {
5379     static const GUID iid = { 0x5eb7d9f7,0xaf21,0x400e,[ 0xa2,0xc4,0x7f,0xd6,0x39,0x6f,0x86,0x41 ] };
5380 		/+
5381 		/+[default]+/+/ /+ interface IDebugSession2; +/
5382 	};
5383 
5384 	version(pp_ifdef) /* #ifdef DEBUG */ {
5385 	alias MsMachineDebugManager_V7_DEBUG MsMachineDebugManager_V7;
5386 	alias CLSID_MsMachineDebugManager_V7_DEBUG CLSID_MsMachineDebugManager_V7;
5387 	} else {
5388 
5389 	alias MsMachineDebugManager_V7_RETAIL MsMachineDebugManager_V7;
5390 	alias CLSID_MsMachineDebugManager_V7_RETAIL CLSID_MsMachineDebugManager_V7;
5391 	} 
5392 
5393 	const GUID CLSID_MsMachineDebugManager_V7_RETAIL = MsMachineDebugManager_V7_RETAIL.iid;
5394 
5395 interface MsMachineDebugManager_V7_RETAIL
5396 {
5397     static const GUID iid = { 0x73b25ffd,0xf501,0x437b,[ 0x8b,0x11,0x7f,0x0d,0xe3,0x83,0x96,0x4f ] };
5398 		/+
5399 		/+[default]+/+/ /+ interface IDebugMachine2_V7; +/
5400 	};
5401 
5402 	const GUID CLSID_MsMachineDebugManager_V7_DEBUG = MsMachineDebugManager_V7_DEBUG.iid;
5403 
5404 interface MsMachineDebugManager_V7_DEBUG
5405 {
5406     static const GUID iid = { 0x05e1b201,0x493d,0x4678,[ 0xbb,0xcb,0x18,0xd9,0xca,0xf5,0xc0,0xa9 ] };
5407 		/+
5408 		/+[default]+/+/ /+ interface IDebugMachine2_V7; +/
5409 	};
5410 
5411 	version(pp_ifdef) /* #ifdef DEBUG */ {
5412 	alias MDMUtilServer_V7_DEBUG MDMUtilServer_V7;
5413 	alias CLSID_MDMUtilServer_V7_DEBUG CLSID_MDMUtilServer_V7;
5414 	} else {
5415 
5416 	alias MDMUtilServer_V7_RETAIL MDMUtilServer_V7;
5417 	alias CLSID_MDMUtilServer_V7_RETAIL CLSID_MDMUtilServer_V7;
5418 	} 
5419 
5420 	const GUID CLSID_MDMUtilServer_V7_RETAIL = MDMUtilServer_V7_RETAIL.iid;
5421 
5422 interface MDMUtilServer_V7_RETAIL
5423 {
5424     static const GUID iid = { 0xb20e899d,0xb079,0x479d,[ 0xa4,0xdc,0x10,0xf7,0x58,0xd9,0xcd,0x9a ] };
5425 		/+
5426 		/+[default]+/+/ /+ interface IDebugMDMUtil2_V7; +/
5427 	};
5428 
5429 	const GUID CLSID_MDMUtilServer_V7_DEBUG = MDMUtilServer_V7_DEBUG.iid;
5430 
5431 interface MDMUtilServer_V7_DEBUG
5432 {
5433     static const GUID iid = { 0x89370a13,0x3977,0x4e7d,[ 0xae,0xa0,0x0a,0x97,0x51,0xae,0x59,0x6b ] };
5434 		/+
5435 		/+[default]+/+/ /+ interface IDebugMDMUtil2_V7; +/
5436 	};
5437 
5438 	const GUID CLSID_ProgramPublisher = ProgramPublisher.iid;
5439 
5440 interface ProgramPublisher
5441 {
5442     static const GUID iid = { 0xd04d550d,0x1ea8,0x4e37,[ 0x83,0x0e,0x70,0x0f,0xea,0x44,0x76,0x88 ] };
5443 		/+
5444 		/+[default]+/+/ /+ interface IDebugProgramPublisher2; +/
5445 	};
5446 
5447 	const GUID CLSID_MsProgramProvider = MsProgramProvider.iid;
5448 
5449 interface MsProgramProvider
5450 {
5451     static const GUID iid = { 0x170ec3fc,0x4e80,0x40ab,[ 0xa8,0x5a,0x55,0x90,0x0c,0x7c,0x70,0xde ] };
5452 		/+
5453 		/+[default]+/+/ /+ interface IDebugProgramProvider2; +/
5454 	};
5455 ;
5456 } 
5457