DbgEng.h
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:221k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //----------------------------------------------------------------------------
  2. //
  3. // Debugger engine interfaces.
  4. //
  5. // Copyright (c) Microsoft Corporation. All rights reserved.
  6. //
  7. //----------------------------------------------------------------------------
  8. #ifndef __DBGENG_H__
  9. #define __DBGENG_H__
  10. #include <stdarg.h>
  11. #include <objbase.h>
  12. #ifndef _WDBGEXTS_
  13. typedef struct _WINDBG_EXTENSION_APIS32* PWINDBG_EXTENSION_APIS32;
  14. typedef struct _WINDBG_EXTENSION_APIS64* PWINDBG_EXTENSION_APIS64;
  15. #endif
  16. #ifndef _CRASHLIB_
  17. typedef struct _MEMORY_BASIC_INFORMATION64* PMEMORY_BASIC_INFORMATION64;
  18. #endif
  19. #ifdef __cplusplus
  20. extern "C" {
  21. #endif
  22. //----------------------------------------------------------------------------
  23. //
  24. // GUIDs and interface forward declarations.
  25. //
  26. //----------------------------------------------------------------------------
  27. /* f2df5f53-071f-47bd-9de6-5734c3fed689 */
  28. DEFINE_GUID(IID_IDebugAdvanced, 0xf2df5f53, 0x071f, 0x47bd,
  29.             0x9d, 0xe6, 0x57, 0x34, 0xc3, 0xfe, 0xd6, 0x89);
  30. /* 5bd9d474-5975-423a-b88b-65a8e7110e65 */
  31. DEFINE_GUID(IID_IDebugBreakpoint, 0x5bd9d474, 0x5975, 0x423a,
  32.             0xb8, 0x8b, 0x65, 0xa8, 0xe7, 0x11, 0x0e, 0x65);
  33. /* 27fe5639-8407-4f47-8364-ee118fb08ac8 */
  34. DEFINE_GUID(IID_IDebugClient, 0x27fe5639, 0x8407, 0x4f47,
  35.             0x83, 0x64, 0xee, 0x11, 0x8f, 0xb0, 0x8a, 0xc8);
  36. /* edbed635-372e-4dab-bbfe-ed0d2f63be81 */
  37. DEFINE_GUID(IID_IDebugClient2, 0xedbed635, 0x372e, 0x4dab,
  38.         0xbb, 0xfe, 0xed, 0x0d, 0x2f, 0x63, 0xbe, 0x81);
  39. /* 5182e668-105e-416e-ad92-24ef800424ba */
  40. DEFINE_GUID(IID_IDebugControl, 0x5182e668, 0x105e, 0x416e,
  41.             0xad, 0x92, 0x24, 0xef, 0x80, 0x04, 0x24, 0xba);
  42. /* d4366723-44df-4bed-8c7e-4c05424f4588 */
  43. DEFINE_GUID(IID_IDebugControl2, 0xd4366723, 0x44df, 0x4bed,
  44.             0x8c, 0x7e, 0x4c, 0x05, 0x42, 0x4f, 0x45, 0x88);
  45. /* 88f7dfab-3ea7-4c3a-aefb-c4e8106173aa */
  46. DEFINE_GUID(IID_IDebugDataSpaces, 0x88f7dfab, 0x3ea7, 0x4c3a,
  47.             0xae, 0xfb, 0xc4, 0xe8, 0x10, 0x61, 0x73, 0xaa);
  48. /* 7a5e852f-96e9-468f-ac1b-0b3addc4a049 */
  49. DEFINE_GUID(IID_IDebugDataSpaces2, 0x7a5e852f, 0x96e9, 0x468f,
  50.             0xac, 0x1b, 0x0b, 0x3a, 0xdd, 0xc4, 0xa0, 0x49);
  51. /* 337be28b-5036-4d72-b6bf-c45fbb9f2eaa */
  52. DEFINE_GUID(IID_IDebugEventCallbacks, 0x337be28b, 0x5036, 0x4d72,
  53.             0xb6, 0xbf, 0xc4, 0x5f, 0xbb, 0x9f, 0x2e, 0xaa);
  54. /* 9f50e42c-f136-499e-9a97-73036c94ed2d */
  55. DEFINE_GUID(IID_IDebugInputCallbacks, 0x9f50e42c, 0xf136, 0x499e,
  56.             0x9a, 0x97, 0x73, 0x03, 0x6c, 0x94, 0xed, 0x2d);
  57. /* 4bf58045-d654-4c40-b0af-683090f356dc */
  58. DEFINE_GUID(IID_IDebugOutputCallbacks, 0x4bf58045, 0xd654, 0x4c40,
  59.             0xb0, 0xaf, 0x68, 0x30, 0x90, 0xf3, 0x56, 0xdc);
  60. /* ce289126-9e84-45a7-937e-67bb18691493 */
  61. DEFINE_GUID(IID_IDebugRegisters, 0xce289126, 0x9e84, 0x45a7,
  62.             0x93, 0x7e, 0x67, 0xbb, 0x18, 0x69, 0x14, 0x93);
  63. /* f2528316-0f1a-4431-aeed-11d096e1e2ab */
  64. DEFINE_GUID(IID_IDebugSymbolGroup, 0xf2528316, 0x0f1a, 0x4431,
  65.             0xae, 0xed, 0x11, 0xd0, 0x96, 0xe1, 0xe2, 0xab);
  66. /* 8c31e98c-983a-48a5-9016-6fe5d667a950 */
  67. DEFINE_GUID(IID_IDebugSymbols, 0x8c31e98c, 0x983a, 0x48a5,
  68.             0x90, 0x16, 0x6f, 0xe5, 0xd6, 0x67, 0xa9, 0x50);
  69. /* 3a707211-afdd-4495-ad4f-56fecdf8163f */
  70. DEFINE_GUID(IID_IDebugSymbols2, 0x3a707211, 0xafdd, 0x4495,
  71.             0xad, 0x4f, 0x56, 0xfe, 0xcd, 0xf8, 0x16, 0x3f);
  72. /* 6b86fe2c-2c4f-4f0c-9da2-174311acc327 */
  73. DEFINE_GUID(IID_IDebugSystemObjects, 0x6b86fe2c, 0x2c4f, 0x4f0c,
  74.             0x9d, 0xa2, 0x17, 0x43, 0x11, 0xac, 0xc3, 0x27);
  75. /* 0ae9f5ff-1852-4679-b055-494bee6407ee */
  76. DEFINE_GUID(IID_IDebugSystemObjects2, 0x0ae9f5ff, 0x1852, 0x4679,
  77.             0xb0, 0x55, 0x49, 0x4b, 0xee, 0x64, 0x07, 0xee);
  78. typedef interface DECLSPEC_UUID("f2df5f53-071f-47bd-9de6-5734c3fed689")
  79.     IDebugAdvanced* PDEBUG_ADVANCED;
  80. typedef interface DECLSPEC_UUID("5bd9d474-5975-423a-b88b-65a8e7110e65")
  81.     IDebugBreakpoint* PDEBUG_BREAKPOINT;
  82. typedef interface DECLSPEC_UUID("27fe5639-8407-4f47-8364-ee118fb08ac8")
  83.     IDebugClient* PDEBUG_CLIENT;
  84. typedef interface DECLSPEC_UUID("edbed635-372e-4dab-bbfe-ed0d2f63be81")
  85.     IDebugClient2* PDEBUG_CLIENT2;
  86. typedef interface DECLSPEC_UUID("5182e668-105e-416e-ad92-24ef800424ba")
  87.     IDebugControl* PDEBUG_CONTROL;
  88. typedef interface DECLSPEC_UUID("d4366723-44df-4bed-8c7e-4c05424f4588")
  89.     IDebugControl2* PDEBUG_CONTROL2;
  90. typedef interface DECLSPEC_UUID("88f7dfab-3ea7-4c3a-aefb-c4e8106173aa")
  91.     IDebugDataSpaces* PDEBUG_DATA_SPACES;
  92. typedef interface DECLSPEC_UUID("7a5e852f-96e9-468f-ac1b-0b3addc4a049")
  93.     IDebugDataSpaces2* PDEBUG_DATA_SPACES2;
  94. typedef interface DECLSPEC_UUID("337be28b-5036-4d72-b6bf-c45fbb9f2eaa")
  95.     IDebugEventCallbacks* PDEBUG_EVENT_CALLBACKS;
  96. typedef interface DECLSPEC_UUID("9f50e42c-f136-499e-9a97-73036c94ed2d")
  97.     IDebugInputCallbacks* PDEBUG_INPUT_CALLBACKS;
  98. typedef interface DECLSPEC_UUID("4bf58045-d654-4c40-b0af-683090f356dc")
  99.     IDebugOutputCallbacks* PDEBUG_OUTPUT_CALLBACKS;
  100. typedef interface DECLSPEC_UUID("ce289126-9e84-45a7-937e-67bb18691493")
  101.     IDebugRegisters* PDEBUG_REGISTERS;
  102. typedef interface DECLSPEC_UUID("f2528316-0f1a-4431-aeed-11d096e1e2ab")
  103.     IDebugSymbolGroup* PDEBUG_SYMBOL_GROUP;
  104. typedef interface DECLSPEC_UUID("8c31e98c-983a-48a5-9016-6fe5d667a950")
  105.     IDebugSymbols* PDEBUG_SYMBOLS;
  106. typedef interface DECLSPEC_UUID("3a707211-afdd-4495-ad4f-56fecdf8163f")
  107.     IDebugSymbols2* PDEBUG_SYMBOLS2;
  108. typedef interface DECLSPEC_UUID("6b86fe2c-2c4f-4f0c-9da2-174311acc327")
  109.     IDebugSystemObjects* PDEBUG_SYSTEM_OBJECTS;
  110. typedef interface DECLSPEC_UUID("0ae9f5ff-1852-4679-b055-494bee6407ee")
  111.     IDebugSystemObjects2* PDEBUG_SYSTEM_OBJECTS2;
  112. //----------------------------------------------------------------------------
  113. //
  114. // Macros.
  115. //
  116. //----------------------------------------------------------------------------
  117. // Extends a 32-bit address into a 64-bit address.
  118. #define DEBUG_EXTEND64(Addr) ((ULONG64)(LONG64)(LONG)(Addr))
  119.     
  120. //----------------------------------------------------------------------------
  121. //
  122. // Client creation functions.
  123. //
  124. //----------------------------------------------------------------------------
  125. // RemoteOptions specifies connection types and
  126. // their parameters.  Supported strings are:
  127. //    npipe:Server=<Machine>,Pipe=<Pipe name>
  128. //    tcp:Server=<Machine>,Port=<IP port>
  129. STDAPI
  130. DebugConnect(
  131.     IN PCSTR RemoteOptions,
  132.     IN REFIID InterfaceId,
  133.     OUT PVOID* Interface
  134.     );
  135. STDAPI
  136. DebugCreate(
  137.     IN REFIID InterfaceId,
  138.     OUT PVOID* Interface
  139.     );
  140.     
  141. //----------------------------------------------------------------------------
  142. //
  143. // IDebugAdvanced.
  144. //
  145. //----------------------------------------------------------------------------
  146. #undef INTERFACE
  147. #define INTERFACE IDebugAdvanced
  148. DECLARE_INTERFACE_(IDebugAdvanced, IUnknown)
  149. {
  150.     // IUnknown.
  151.     STDMETHOD(QueryInterface)(
  152.         THIS_
  153.         IN REFIID InterfaceId,
  154.         OUT PVOID* Interface
  155.         ) PURE;
  156.     STDMETHOD_(ULONG, AddRef)(
  157.         THIS
  158.         ) PURE;
  159.     STDMETHOD_(ULONG, Release)(
  160.         THIS
  161.         ) PURE;
  162.     // IDebugAdvanced.
  163.     // Get/SetThreadContext offer control over
  164.     // the full processor context for a thread.
  165.     // Higher-level functions, such as the
  166.     // IDebugRegisters interface, allow similar
  167.     // access in simpler and more generic ways.
  168.     // Get/SetThreadContext are useful when
  169.     // large amounts of thread context must
  170.     // be changed and processor-specific code
  171.     // is not a problem.
  172.     STDMETHOD(GetThreadContext)(
  173.         THIS_
  174.         OUT /* align_is(16) */ PVOID Context,
  175.         IN ULONG ContextSize
  176.         ) PURE;
  177.     STDMETHOD(SetThreadContext)(
  178.         THIS_
  179.         IN /* align_is(16) */ PVOID Context,
  180.         IN ULONG ContextSize
  181.         ) PURE;
  182. };
  183.     
  184. //----------------------------------------------------------------------------
  185. //
  186. // IDebugBreakpoint.
  187. //
  188. //----------------------------------------------------------------------------
  189. // Types of breakpoints.
  190. #define DEBUG_BREAKPOINT_CODE 0
  191. #define DEBUG_BREAKPOINT_DATA 1
  192. // Breakpoint flags.
  193. // Go-only breakpoints are only active when
  194. // the engine is in unrestricted execution
  195. // mode.  They do not fire when the engine
  196. // is stepping.
  197. #define DEBUG_BREAKPOINT_GO_ONLY    0x00000001
  198. // A breakpoint is flagged as deferred as long as
  199. // its offset expression cannot be evaluated.
  200. // A deferred breakpoint is not active.
  201. #define DEBUG_BREAKPOINT_DEFERRED   0x00000002
  202. #define DEBUG_BREAKPOINT_ENABLED    0x00000004
  203. // The adder-only flag does not affect breakpoint
  204. // operation.  It is just a marker to restrict
  205. // output and notifications for the breakpoint to
  206. // the client that added the breakpoint.  Breakpoint
  207. // callbacks for adder-only breaks will only be delivered
  208. // to the adding client.  The breakpoint can not
  209. // be enumerated and accessed by other clients.
  210. #define DEBUG_BREAKPOINT_ADDER_ONLY 0x00000008
  211. // Data breakpoint access types.
  212. // Different architectures support different
  213. // sets of these bits.
  214. #define DEBUG_BREAK_READ    0x00000001
  215. #define DEBUG_BREAK_WRITE   0x00000002
  216. #define DEBUG_BREAK_EXECUTE 0x00000004
  217. #define DEBUG_BREAK_IO      0x00000008
  218. // Structure for querying breakpoint information
  219. // all at once.
  220. typedef struct _DEBUG_BREAKPOINT_PARAMETERS
  221. {
  222.     ULONG64 Offset;
  223.     ULONG Id;
  224.     ULONG BreakType;
  225.     ULONG ProcType;
  226.     ULONG Flags;
  227.     ULONG DataSize;
  228.     ULONG DataAccessType;
  229.     ULONG PassCount;
  230.     ULONG CurrentPassCount;
  231.     ULONG MatchThread;
  232.     ULONG CommandSize;
  233.     ULONG OffsetExpressionSize;
  234. } DEBUG_BREAKPOINT_PARAMETERS, *PDEBUG_BREAKPOINT_PARAMETERS;
  235. #undef INTERFACE
  236. #define INTERFACE IDebugBreakpoint
  237. DECLARE_INTERFACE_(IDebugBreakpoint, IUnknown)
  238. {
  239.     // IUnknown.
  240.     STDMETHOD(QueryInterface)(
  241.         THIS_
  242.         IN REFIID InterfaceId,
  243.         OUT PVOID* Interface
  244.         ) PURE;
  245.     STDMETHOD_(ULONG, AddRef)(
  246.         THIS
  247.         ) PURE;
  248.     STDMETHOD_(ULONG, Release)(
  249.         THIS
  250.         ) PURE;
  251.     // IDebugBreakpoint.
  252.     
  253.     // Retrieves debugger engine unique ID
  254.     // for the breakpoint.  This ID is
  255.     // fixed as long as the breakpoint exists
  256.     // but after that may be reused.
  257.     STDMETHOD(GetId)(
  258.         THIS_
  259.         OUT PULONG Id
  260.         ) PURE;
  261.     // Retrieves the type of break and
  262.     // processor type for the breakpoint.
  263.     STDMETHOD(GetType)(
  264.         THIS_
  265.         OUT PULONG BreakType,
  266.         OUT PULONG ProcType
  267.         ) PURE;
  268.     // Returns the client that called AddBreakpoint.
  269.     STDMETHOD(GetAdder)(
  270.         THIS_
  271.         OUT PDEBUG_CLIENT* Adder
  272.         ) PURE;
  273.         
  274.     STDMETHOD(GetFlags)(
  275.         THIS_
  276.         OUT PULONG Flags
  277.         ) PURE;
  278.     // Only certain flags can be changed.  Flags
  279.     // are: GO_ONLY, ENABLE.
  280.     // Sets the given flags.
  281.     STDMETHOD(AddFlags)(
  282.         THIS_
  283.         IN ULONG Flags
  284.         ) PURE;
  285.     // Clears the given flags.
  286.     STDMETHOD(RemoveFlags)(
  287.         THIS_
  288.         IN ULONG Flags
  289.         ) PURE;
  290.     // Sets the flags.
  291.     STDMETHOD(SetFlags)(
  292.         THIS_
  293.         IN ULONG Flags
  294.         ) PURE;
  295.         
  296.     // Controls the offset of the breakpoint.  The
  297.     // interpretation of the offset value depends on
  298.     // the type of breakpoint and its settings.  It
  299.     // may be a code address, a data address, an
  300.     // I/O port, etc.
  301.     STDMETHOD(GetOffset)(
  302.         THIS_
  303.         OUT PULONG64 Offset
  304.         ) PURE;
  305.     STDMETHOD(SetOffset)(
  306.         THIS_
  307.         IN ULONG64 Offset
  308.         ) PURE;
  309.     // Data breakpoint methods will fail is the
  310.     // target platform does not support the
  311.     // parameters used.
  312.     // These methods only function for breakpoints
  313.     // created as data breakpoints.
  314.     STDMETHOD(GetDataParameters)(
  315.         THIS_
  316.         OUT PULONG Size,
  317.         OUT PULONG AccessType
  318.         ) PURE;
  319.     STDMETHOD(SetDataParameters)(
  320.         THIS_
  321.         IN ULONG Size,
  322.         IN ULONG AccessType
  323.         ) PURE;
  324.                     
  325.     // Pass count defaults to one.
  326.     STDMETHOD(GetPassCount)(
  327.         THIS_
  328.         OUT PULONG Count
  329.         ) PURE;
  330.     STDMETHOD(SetPassCount)(
  331.         THIS_
  332.         IN ULONG Count
  333.         ) PURE;
  334.     // Gets the current number of times
  335.     // the breakpoint has been hit since
  336.     // it was last triggered.
  337.     STDMETHOD(GetCurrentPassCount)(
  338.         THIS_
  339.         OUT PULONG Count
  340.         ) PURE;
  341.     // If a match thread is set this breakpoint will
  342.     // only trigger if it occurs on the match thread.
  343.     // Otherwise it triggers for all threads.
  344.     // Thread restrictions are not currently supported
  345.     // in kernel mode.
  346.     STDMETHOD(GetMatchThreadId)(
  347.         THIS_
  348.         OUT PULONG Id
  349.         ) PURE;
  350.     STDMETHOD(SetMatchThreadId)(
  351.         THIS_
  352.         IN ULONG Thread
  353.         ) PURE;
  354.     // The command for a breakpoint is automatically
  355.     // executed by the engine before the event
  356.     // is propagated.  If the breakpoint continues
  357.     // execution the event will begin with a continue
  358.     // status.  If the breakpoint does not continue
  359.     // the event will begin with a break status.
  360.     // This allows breakpoint commands to participate
  361.     // in the normal event status voting.
  362.     // Breakpoint commands are only executed until
  363.     // the first command that alters the execution
  364.     // status, such as g, p and t.
  365.     // Breakpoint commands are removed when the
  366.     // current syntax changes.
  367.     STDMETHOD(GetCommand)(
  368.         THIS_
  369.         OUT OPTIONAL PSTR Buffer,
  370.         IN ULONG BufferSize,
  371.         OUT OPTIONAL PULONG CommandSize
  372.         ) PURE;
  373.     STDMETHOD(SetCommand)(
  374.         THIS_
  375.         IN PCSTR Command
  376.         ) PURE;
  377.     // Offset expressions are evaluated immediately
  378.     // and at module load and unload events.  If the
  379.     // evaluation is successful the breakpoints
  380.     // offset is updated and the breakpoint is
  381.     // handled normally.  If the expression cannot
  382.     // be evaluated the breakpoint is deferred.
  383.     // Currently the only offset expression
  384.     // supported is a module-relative symbol
  385.     // of the form <Module>!<Symbol>.
  386.     STDMETHOD(GetOffsetExpression)(
  387.         THIS_
  388.         OUT OPTIONAL PSTR Buffer,
  389.         IN ULONG BufferSize,
  390.         OUT OPTIONAL PULONG ExpressionSize
  391.         ) PURE;
  392.     STDMETHOD(SetOffsetExpression)(
  393.         THIS_
  394.         IN PCSTR Expression
  395.         ) PURE;
  396.     STDMETHOD(GetParameters)(
  397.         THIS_
  398.         OUT PDEBUG_BREAKPOINT_PARAMETERS Params
  399.         ) PURE;
  400. };
  401. //----------------------------------------------------------------------------
  402. //
  403. // IDebugClient.
  404. //
  405. //----------------------------------------------------------------------------
  406. // Kernel attach flags.
  407. #define DEBUG_ATTACH_KERNEL_CONNECTION 0x00000000
  408. // Attach to the local machine.  If this flag is not set
  409. // a connection is made to a separate target machine using
  410. // the given connection options.
  411. #define DEBUG_ATTACH_LOCAL_KERNEL      0x00000001
  412. // Attach to an eXDI driver.
  413. #define DEBUG_ATTACH_EXDI_DRIVER       0x00000002
  414. // GetRunningProcessSystemIdByExecutableName flags.
  415. // By default the match allows a tail match on
  416. // just the filename.  The match returns the first hit
  417. // even if multiple matches exist.
  418. #define DEBUG_GET_PROC_DEFAULT    0x00000000
  419. // The name must match fully.
  420. #define DEBUG_GET_PROC_FULL_MATCH 0x00000001
  421. // The match must be the only match.
  422. #define DEBUG_GET_PROC_ONLY_MATCH 0x00000002
  423. // GetRunningProcessDescription flags.
  424. #define DEBUG_PROC_DESC_DEFAULT  0x00000000
  425. // Return only filenames, not full paths.
  426. #define DEBUG_PROC_DESC_NO_PATHS 0x00000001
  427. //
  428. // Attach flags.
  429. //
  430. // Call DebugActiveProcess when attaching.
  431. #define DEBUG_ATTACH_DEFAULT     0x00000000
  432. // When attaching to a process just examine
  433. // the process state and suspend the threads.
  434. // DebugActiveProcess is not called so the process
  435. // is not actually being debugged.  This is useful
  436. // for debugging processes holding locks which
  437. // interfere with the operation of DebugActiveProcess
  438. // or in situations where it is not desirable to
  439. // actually set up as a debugger.
  440. #define DEBUG_ATTACH_NONINVASIVE 0x00000001
  441. // Attempt to attach to a process that was abandoned
  442. // when being debugged.  This is only supported in
  443. // some system versions.
  444. // This flag also allows multiple debuggers to
  445. // attach to the same process, which can result
  446. // in numerous problems unless very carefully
  447. // managed.
  448. #define DEBUG_ATTACH_EXISTING    0x00000002
  449. // Process creation flags.
  450. // On Windows Whistler this flag prevents the debug
  451. // heap from being used in the new process.
  452. #define DEBUG_CREATE_PROCESS_NO_DEBUG_HEAP CREATE_UNICODE_ENVIRONMENT
  453. //
  454. // Process options.
  455. //
  456. // Indicates that the debuggee process should be
  457. // automatically detached when the debugger exits.
  458. // A debugger can explicitly detach on exit or this
  459. // flag can be set so that detach occurs regardless
  460. // of how the debugger exits.
  461. // This is only supported on some system versions.
  462. #define DEBUG_PROCESS_DETACH_ON_EXIT    0x00000001
  463. // Indicates that processes created by the current
  464. // process should not be debugged.
  465. // Modifying this flag is only supported on some
  466. // system versions.
  467. #define DEBUG_PROCESS_ONLY_THIS_PROCESS 0x00000002
  468. // ConnectSession flags.
  469. // Default connect.
  470. #define DEBUG_CONNECT_SESSION_DEFAULT     0x00000000
  471. // Do not output the debugger version.
  472. #define DEBUG_CONNECT_SESSION_NO_VERSION  0x00000001
  473. // Do not announce the connection.
  474. #define DEBUG_CONNECT_SESSION_NO_ANNOUNCE 0x00000002
  475. // OutputServers flags.
  476. // Debugger servers from StartSever.
  477. #define DEBUG_SERVERS_DEBUGGER 0x00000001
  478. // Process servers from StartProcessServer.
  479. #define DEBUG_SERVERS_PROCESS  0x00000002
  480. #define DEBUG_SERVERS_ALL      0x00000003
  481. // EndSession flags.
  482. // Perform cleanup for the session.
  483. #define DEBUG_END_PASSIVE          0x00000000
  484. // Actively terminate the session and then perform cleanup.
  485. #define DEBUG_END_ACTIVE_TERMINATE 0x00000001
  486. // If possible, detach from all processes and then perform cleanup.
  487. #define DEBUG_END_ACTIVE_DETACH    0x00000002
  488. // Perform whatever cleanup is possible that doesn't require
  489. // acquiring any locks.  This is useful for situations where
  490. // a thread is currently using the engine but the application
  491. // needs to exit and still wants to give the engine
  492. // the opportunity to clean up as much as possible.
  493. // This may leave the engine in an indeterminate state so
  494. // further engine calls should not be made.
  495. // When making a reentrant EndSession call from a remote
  496. // client it is the callers responsibility to ensure
  497. // that the server can process the request.  It is best
  498. // to avoid making such calls.
  499. #define DEBUG_END_REENTRANT        0x00000003
  500. // Output mask bits.
  501. // Normal output.
  502. #define DEBUG_OUTPUT_NORMAL            0x00000001
  503. // Error output.
  504. #define DEBUG_OUTPUT_ERROR             0x00000002
  505. // Warnings.
  506. #define DEBUG_OUTPUT_WARNING           0x00000004
  507. // Additional output.
  508. #define DEBUG_OUTPUT_VERBOSE           0x00000008
  509. // Prompt output.
  510. #define DEBUG_OUTPUT_PROMPT            0x00000010
  511. // Register dump before prompt.
  512. #define DEBUG_OUTPUT_PROMPT_REGISTERS  0x00000020
  513. // Warnings specific to extension operation.
  514. #define DEBUG_OUTPUT_EXTENSION_WARNING 0x00000040
  515. // Debuggee debug output, such as from OutputDebugString.
  516. #define DEBUG_OUTPUT_DEBUGGEE          0x00000080
  517. // Debuggee-generated prompt, such as from DbgPrompt.
  518. #define DEBUG_OUTPUT_DEBUGGEE_PROMPT   0x00000100
  519. // Internal debugger output, used mainly
  520. // for debugging the debugger.  Output
  521. // may only occur in debug builds.
  522. // KD protocol output.
  523. #define DEBUG_IOUTPUT_KD_PROTOCOL      0x80000000
  524. // Remoting output.
  525. #define DEBUG_IOUTPUT_REMOTING         0x40000000
  526. // Breakpoint output.
  527. #define DEBUG_IOUTPUT_BREAKPOINT       0x20000000
  528. // Event output.
  529. #define DEBUG_IOUTPUT_EVENT            0x10000000
  530. // OutputIdentity flags.
  531. #define DEBUG_OUTPUT_IDENTITY_DEFAULT 0x00000000
  532. #undef INTERFACE
  533. #define INTERFACE IDebugClient
  534. DECLARE_INTERFACE_(IDebugClient, IUnknown)
  535. {
  536.     // IUnknown.
  537.     STDMETHOD(QueryInterface)(
  538.         THIS_
  539.         IN REFIID InterfaceId,
  540.         OUT PVOID* Interface
  541.         ) PURE;
  542.     STDMETHOD_(ULONG, AddRef)(
  543.         THIS
  544.         ) PURE;
  545.     STDMETHOD_(ULONG, Release)(
  546.         THIS
  547.         ) PURE;
  548.     // IDebugClient.
  549.     
  550.     // The following set of methods start
  551.     // the different kinds of debuggees.
  552.     // Begins a debug session using the kernel
  553.     // debugging protocol.  This method selects
  554.     // the protocol as the debuggee communication
  555.     // mechanism but does not initiate the communication
  556.     // itself.
  557.     STDMETHOD(AttachKernel)(
  558.         THIS_
  559.         IN ULONG Flags,
  560.         IN OPTIONAL PCSTR ConnectOptions
  561.         ) PURE;
  562.     STDMETHOD(GetKernelConnectionOptions)(
  563.         THIS_
  564.         OUT OPTIONAL PSTR Buffer,
  565.         IN ULONG BufferSize,
  566.         OUT OPTIONAL PULONG OptionsSize
  567.         ) PURE;
  568.     // Updates the connection options for a live
  569.     // kernel connection.  This can only be used
  570.     // to modify parameters for the connection, not
  571.     // to switch to a completely different kind of
  572.     // connection.
  573.     // This method is reentrant.
  574.     STDMETHOD(SetKernelConnectionOptions)(
  575.         THIS_
  576.         IN PCSTR Options
  577.         ) PURE;
  578.     // Starts a process server for remote
  579.     // user-mode process control.
  580.     // The local process server is server zero.
  581.     STDMETHOD(StartProcessServer)(
  582.         THIS_
  583.         IN ULONG Flags,
  584.         IN PCSTR Options,
  585.         IN PVOID Reserved
  586.         ) PURE;
  587.     STDMETHOD(ConnectProcessServer)(
  588.         THIS_
  589.         IN PCSTR RemoteOptions,
  590.         OUT PULONG64 Server
  591.         ) PURE;
  592.     STDMETHOD(DisconnectProcessServer)(
  593.         THIS_
  594.         IN ULONG64 Server
  595.         ) PURE;
  596.     // Enumerates and describes processes
  597.     // accessible through the given process server.
  598.     STDMETHOD(GetRunningProcessSystemIds)(
  599.         THIS_
  600.         IN ULONG64 Server,
  601.         OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
  602.         IN ULONG Count,
  603.         OUT OPTIONAL PULONG ActualCount
  604.         ) PURE;
  605.     STDMETHOD(GetRunningProcessSystemIdByExecutableName)(
  606.         THIS_
  607.         IN ULONG64 Server,
  608.         IN PCSTR ExeName,
  609.         IN ULONG Flags,
  610.         OUT PULONG Id
  611.         ) PURE;
  612.     STDMETHOD(GetRunningProcessDescription)(
  613.         THIS_
  614.         IN ULONG64 Server,
  615.         IN ULONG SystemId,
  616.         IN ULONG Flags,
  617.         OUT OPTIONAL PSTR ExeName,
  618.         IN ULONG ExeNameSize,
  619.         OUT OPTIONAL PULONG ActualExeNameSize,
  620.         OUT OPTIONAL PSTR Description,
  621.         IN ULONG DescriptionSize,
  622.         OUT OPTIONAL PULONG ActualDescriptionSize
  623.         ) PURE;
  624.     // Attaches to a running user-mode process.
  625.     STDMETHOD(AttachProcess)(
  626.         THIS_
  627.         IN ULONG64 Server,
  628.         IN ULONG ProcessId,
  629.         IN ULONG AttachFlags
  630.         ) PURE;
  631.     // Creates a new user-mode process for debugging.
  632.     // CreateFlags are as given to Win32s CreateProcess.
  633.     // One of DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS
  634.     // must be specified.
  635.     STDMETHOD(CreateProcess)(
  636.         THIS_
  637.         IN ULONG64 Server,
  638.         IN PSTR CommandLine,
  639.         IN ULONG CreateFlags
  640.         ) PURE;
  641.     // Creates or attaches to a user-mode process, or both.
  642.     // If CommandLine is NULL this method operates as
  643.     // AttachProcess does.  If ProcessId is zero it
  644.     // operates as CreateProcess does.  If CommandLine is
  645.     // non-NULL and ProcessId is non-zero the method first
  646.     // starts a process with the given information but
  647.     // in a suspended state.  The engine then attaches to
  648.     // the indicated process.  Once the attach is successful
  649.     // the suspended process is resumed.  This provides
  650.     // synchronization between the new process and the
  651.     // attachment.
  652.     STDMETHOD(CreateProcessAndAttach)(
  653.         THIS_
  654.         IN ULONG64 Server,
  655.         IN OPTIONAL PSTR CommandLine,
  656.         IN ULONG CreateFlags,
  657.         IN ULONG ProcessId,
  658.         IN ULONG AttachFlags
  659.         ) PURE;
  660.     // Gets and sets process control flags.
  661.     STDMETHOD(GetProcessOptions)(
  662.         THIS_
  663.         OUT PULONG Options
  664.         ) PURE;
  665.     STDMETHOD(AddProcessOptions)(
  666.         THIS_
  667.         IN ULONG Options
  668.         ) PURE;
  669.     STDMETHOD(RemoveProcessOptions)(
  670.         THIS_
  671.         IN ULONG Options
  672.         ) PURE;
  673.     STDMETHOD(SetProcessOptions)(
  674.         THIS_
  675.         IN ULONG Options
  676.         ) PURE;
  677.     
  678.     // Opens any kind of user- or kernel-mode dump file
  679.     // and begins a debug session with the information
  680.     // contained within it.
  681.     STDMETHOD(OpenDumpFile)(
  682.         THIS_
  683.         IN PCSTR DumpFile
  684.         ) PURE;
  685.     // Writes a dump file from the current session information.
  686.     // The kind of dump file written is determined by the
  687.     // kind of session and the type qualifier given.
  688.     // For example, if the current session is a kernel
  689.     // debug session (DEBUG_CLASS_KERNEL) and the qualifier
  690.     // is DEBUG_DUMP_SMALL a small kernel dump will be written.
  691.     STDMETHOD(WriteDumpFile)(
  692.         THIS_
  693.         IN PCSTR DumpFile,
  694.         IN ULONG Qualifier
  695.         ) PURE;
  696.     // Indicates that a remote client is ready to
  697.     // begin participating in the current session.
  698.     // HistoryLimit gives a character limit on
  699.     // the amount of output history to be sent.
  700.     STDMETHOD(ConnectSession)(
  701.         THIS_
  702.         IN ULONG Flags,
  703.         IN ULONG HistoryLimit
  704.         ) PURE;
  705.     // Indicates that the engine should start accepting
  706.     // remote connections. Options specifies connection types
  707.     // and their parameters.  Supported strings are:
  708.     //    npipe:Pipe=<Pipe name>
  709.     //    tcp:Port=<IP port>
  710.     STDMETHOD(StartServer)(
  711.         THIS_
  712.         IN PCSTR Options
  713.         ) PURE;
  714.     // List the servers running on the given machine.
  715.     // Uses the line prefix.
  716.     STDMETHOD(OutputServers)(
  717.         THIS_
  718.         IN ULONG OutputControl,
  719.         IN PCSTR Machine,
  720.         IN ULONG Flags
  721.         ) PURE;
  722.     // Attempts to terminate all processes in the debuggers list.
  723.     STDMETHOD(TerminateProcesses)(
  724.         THIS
  725.         ) PURE;
  726.     // Attempts to detach from all processes in the debuggers list.
  727.     // This requires OS support for debugger detach.
  728.     STDMETHOD(DetachProcesses)(
  729.         THIS
  730.         ) PURE;
  731.     // Stops the current debug session.  If a process
  732.     // was created or attached an active EndSession can
  733.     // terminate or detach from it.
  734.     // If a kernel connection was opened it will be closed but the
  735.     // target machine is otherwise unaffected.
  736.     STDMETHOD(EndSession)(
  737.         THIS_
  738.         IN ULONG Flags
  739.         ) PURE;
  740.     // If a process was started and ran to completion
  741.     // this method can be used to retrieve its exit code.
  742.     STDMETHOD(GetExitCode)(
  743.         THIS_
  744.         OUT PULONG Code
  745.         ) PURE;
  746.         
  747.     // Client event callbacks are called on the thread
  748.     // of the client.  In order to give thread
  749.     // execution to the engine for callbacks all
  750.     // client threads should call DispatchCallbacks
  751.     // when they are idle.  Callbacks are only
  752.     // received when a thread calls DispatchCallbacks
  753.     // or WaitForEvent.  WaitForEvent can only be
  754.     // called by the thread that started the debug
  755.     // session so all other client threads should
  756.     // call DispatchCallbacks when possible.
  757.     // DispatchCallbacks returns when ExitDispatch is used
  758.     // to interrupt dispatch or when the timeout expires.
  759.     // DispatchCallbacks dispatches callbacks for all
  760.     // clients associated with the thread calling
  761.     // DispatchCallbacks.
  762.     // DispatchCallbacks returns S_FALSE when the
  763.     // timeout expires.
  764.     STDMETHOD(DispatchCallbacks)(
  765.         THIS_
  766.         IN ULONG Timeout
  767.         ) PURE;
  768.     // ExitDispatch can be used to interrupt callback
  769.     // dispatch when a client thread is needed by the
  770.     // client.  This method is reentrant and can
  771.     // be called from any thread.
  772.     STDMETHOD(ExitDispatch)(
  773.         THIS_
  774.         IN PDEBUG_CLIENT Client
  775.         ) PURE;
  776.     // Clients are specific to the thread that
  777.     // created them.  Calls from other threads
  778.     // fail immediately.  The CreateClient method
  779.     // is a notable exception; it allows creation
  780.     // of a new client for a new thread.
  781.     STDMETHOD(CreateClient)(
  782.         THIS_
  783.         OUT PDEBUG_CLIENT* Client
  784.         ) PURE;
  785.     
  786.     STDMETHOD(GetInputCallbacks)(
  787.         THIS_
  788.         OUT PDEBUG_INPUT_CALLBACKS* Callbacks
  789.         ) PURE;
  790.     STDMETHOD(SetInputCallbacks)(
  791.         THIS_
  792.         IN PDEBUG_INPUT_CALLBACKS Callbacks
  793.         ) PURE;
  794.     
  795.     // Output callback interfaces are described separately.
  796.     STDMETHOD(GetOutputCallbacks)(
  797.         THIS_
  798.         OUT PDEBUG_OUTPUT_CALLBACKS* Callbacks
  799.         ) PURE;
  800.     STDMETHOD(SetOutputCallbacks)(
  801.         THIS_
  802.         IN PDEBUG_OUTPUT_CALLBACKS Callbacks
  803.         ) PURE;
  804.     // Output flags provide control over
  805.     // the distribution of output among clients.
  806.     // Output masks select which output streams
  807.     // should be sent to the output callbacks.
  808.     // Only Output calls with a mask that
  809.     // contains one of the output mask bits
  810.     // will be sent to the output callbacks.
  811.     // These methods are reentrant.
  812.     // If such access is not synchronized
  813.     // disruptions in output may occur.
  814.     STDMETHOD(GetOutputMask)(
  815.         THIS_
  816.         OUT PULONG Mask
  817.         ) PURE;
  818.     STDMETHOD(SetOutputMask)(
  819.         THIS_
  820.         IN ULONG Mask
  821.         ) PURE;
  822.     // These methods allow access to another clients
  823.     // output mask.  They are necessary for changing
  824.     // a clients output mask when it is
  825.     // waiting for events.  These methods are reentrant
  826.     // and can be called from any thread.
  827.     STDMETHOD(GetOtherOutputMask)(
  828.         THIS_
  829.         IN PDEBUG_CLIENT Client,
  830.         OUT PULONG Mask
  831.         ) PURE;
  832.     STDMETHOD(SetOtherOutputMask)(
  833.         THIS_
  834.         IN PDEBUG_CLIENT Client,
  835.         IN ULONG Mask
  836.         ) PURE;
  837.     // Control the width of an output line for
  838.     // commands which produce formatted output.
  839.     // This setting is just a suggestion.
  840.     STDMETHOD(GetOutputWidth)(
  841.         THIS_
  842.         OUT PULONG Columns
  843.         ) PURE;
  844.     STDMETHOD(SetOutputWidth)(
  845.         THIS_
  846.         IN ULONG Columns
  847.         ) PURE;
  848.     // Some of the engines output commands produce
  849.     // multiple lines of output.  A prefix can be
  850.     // set that the engine will automatically output
  851.     // for each line in that case, allowing a caller
  852.     // to control indentation or identifying marks.
  853.     // This is not a general setting for any output
  854.     // with a newline in it.  Methods which use
  855.     // the line prefix are marked in their documentation.
  856.     STDMETHOD(GetOutputLinePrefix)(
  857.         THIS_
  858.         OUT OPTIONAL PSTR Buffer,
  859.         IN ULONG BufferSize,
  860.         OUT OPTIONAL PULONG PrefixSize
  861.         ) PURE;
  862.     STDMETHOD(SetOutputLinePrefix)(
  863.         THIS_
  864.         IN OPTIONAL PCSTR Prefix
  865.         ) PURE;
  866.     // Returns a string describing the machine
  867.     // and user this client represents.  The
  868.     // specific content of the string varies
  869.     // with operating system.  If the client is
  870.     // remotely connected some network information
  871.     // may also be present.
  872.     STDMETHOD(GetIdentity)(
  873.         THIS_
  874.         OUT OPTIONAL PSTR Buffer,
  875.         IN ULONG BufferSize,
  876.         OUT OPTIONAL PULONG IdentitySize
  877.         ) PURE;
  878.     // Format is a printf-like format string
  879.     // with one %s where the identity string should go.
  880.     STDMETHOD(OutputIdentity)(
  881.         THIS_
  882.         IN ULONG OutputControl,
  883.         IN ULONG Flags,
  884.         IN PCSTR Format
  885.         ) PURE;
  886.     // Event callbacks allow a client to
  887.     // receive notification about changes
  888.     // during the debug session.
  889.     STDMETHOD(GetEventCallbacks)(
  890.         THIS_
  891.         OUT PDEBUG_EVENT_CALLBACKS* Callbacks
  892.         ) PURE;
  893.     STDMETHOD(SetEventCallbacks)(
  894.         THIS_
  895.         IN PDEBUG_EVENT_CALLBACKS Callbacks
  896.         ) PURE;
  897.     // The engine sometimes merges compatible callback
  898.     // requests to reduce callback overhead.  This is
  899.     // most noticeable with output as small pieces of
  900.     // output are collected into larger groups to
  901.     // reduce the overall number of output callback calls.
  902.     // A client can use this method to force all pending
  903.     // callbacks to be delivered.  This is rarely necessary.
  904.     STDMETHOD(FlushCallbacks)(
  905.         THIS
  906.         ) PURE;
  907. };
  908. // Per-dump-format control flags.
  909. #define DEBUG_FORMAT_DEFAULT 0x00000000
  910. #define DEBUG_FORMAT_USER_SMALL_FULL_MEMORY 0x00000001
  911. #define DEBUG_FORMAT_USER_SMALL_HANDLE_DATA 0x00000002
  912. //
  913. // Dump information file types.
  914. //
  915. // Single file containing packed page file information.
  916. #define DEBUG_DUMP_FILE_PAGE_FILE_DUMP 0x00000000
  917. #undef INTERFACE
  918. #define INTERFACE IDebugClient2
  919. DECLARE_INTERFACE_(IDebugClient2, IUnknown)
  920. {
  921.     // IUnknown.
  922.     STDMETHOD(QueryInterface)(
  923.         THIS_
  924.         IN REFIID InterfaceId,
  925.         OUT PVOID* Interface
  926.         ) PURE;
  927.     STDMETHOD_(ULONG, AddRef)(
  928.         THIS
  929.         ) PURE;
  930.     STDMETHOD_(ULONG, Release)(
  931.         THIS
  932.         ) PURE;
  933.     // IDebugClient.
  934.     
  935.     // The following set of methods start
  936.     // the different kinds of debuggees.
  937.     // Begins a debug session using the kernel
  938.     // debugging protocol.  This method selects
  939.     // the protocol as the debuggee communication
  940.     // mechanism but does not initiate the communication
  941.     // itself.
  942.     STDMETHOD(AttachKernel)(
  943.         THIS_
  944.         IN ULONG Flags,
  945.         IN OPTIONAL PCSTR ConnectOptions
  946.         ) PURE;
  947.     STDMETHOD(GetKernelConnectionOptions)(
  948.         THIS_
  949.         OUT OPTIONAL PSTR Buffer,
  950.         IN ULONG BufferSize,
  951.         OUT OPTIONAL PULONG OptionsSize
  952.         ) PURE;
  953.     // Updates the connection options for a live
  954.     // kernel connection.  This can only be used
  955.     // to modify parameters for the connection, not
  956.     // to switch to a completely different kind of
  957.     // connection.
  958.     // This method is reentrant.
  959.     STDMETHOD(SetKernelConnectionOptions)(
  960.         THIS_
  961.         IN PCSTR Options
  962.         ) PURE;
  963.     // Starts a process server for remote
  964.     // user-mode process control.
  965.     // The local process server is server zero.
  966.     STDMETHOD(StartProcessServer)(
  967.         THIS_
  968.         IN ULONG Flags,
  969.         IN PCSTR Options,
  970.         IN PVOID Reserved
  971.         ) PURE;
  972.     STDMETHOD(ConnectProcessServer)(
  973.         THIS_
  974.         IN PCSTR RemoteOptions,
  975.         OUT PULONG64 Server
  976.         ) PURE;
  977.     STDMETHOD(DisconnectProcessServer)(
  978.         THIS_
  979.         IN ULONG64 Server
  980.         ) PURE;
  981.     // Enumerates and describes processes
  982.     // accessible through the given process server.
  983.     STDMETHOD(GetRunningProcessSystemIds)(
  984.         THIS_
  985.         IN ULONG64 Server,
  986.         OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
  987.         IN ULONG Count,
  988.         OUT OPTIONAL PULONG ActualCount
  989.         ) PURE;
  990.     STDMETHOD(GetRunningProcessSystemIdByExecutableName)(
  991.         THIS_
  992.         IN ULONG64 Server,
  993.         IN PCSTR ExeName,
  994.         IN ULONG Flags,
  995.         OUT PULONG Id
  996.         ) PURE;
  997.     STDMETHOD(GetRunningProcessDescription)(
  998.         THIS_
  999.         IN ULONG64 Server,
  1000.         IN ULONG SystemId,
  1001.         IN ULONG Flags,
  1002.         OUT OPTIONAL PSTR ExeName,
  1003.         IN ULONG ExeNameSize,
  1004.         OUT OPTIONAL PULONG ActualExeNameSize,
  1005.         OUT OPTIONAL PSTR Description,
  1006.         IN ULONG DescriptionSize,
  1007.         OUT OPTIONAL PULONG ActualDescriptionSize
  1008.         ) PURE;
  1009.     // Attaches to a running user-mode process.
  1010.     STDMETHOD(AttachProcess)(
  1011.         THIS_
  1012.         IN ULONG64 Server,
  1013.         IN ULONG ProcessId,
  1014.         IN ULONG AttachFlags
  1015.         ) PURE;
  1016.     // Creates a new user-mode process for debugging.
  1017.     // CreateFlags are as given to Win32s CreateProcess.
  1018.     // One of DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS
  1019.     // must be specified.
  1020.     STDMETHOD(CreateProcess)(
  1021.         THIS_
  1022.         IN ULONG64 Server,
  1023.         IN PSTR CommandLine,
  1024.         IN ULONG CreateFlags
  1025.         ) PURE;
  1026.     // Creates or attaches to a user-mode process, or both.
  1027.     // If CommandLine is NULL this method operates as
  1028.     // AttachProcess does.  If ProcessId is zero it
  1029.     // operates as CreateProcess does.  If CommandLine is
  1030.     // non-NULL and ProcessId is non-zero the method first
  1031.     // starts a process with the given information but
  1032.     // in a suspended state.  The engine then attaches to
  1033.     // the indicated process.  Once the attach is successful
  1034.     // the suspended process is resumed.  This provides
  1035.     // synchronization between the new process and the
  1036.     // attachment.
  1037.     STDMETHOD(CreateProcessAndAttach)(
  1038.         THIS_
  1039.         IN ULONG64 Server,
  1040.         IN OPTIONAL PSTR CommandLine,
  1041.         IN ULONG CreateFlags,
  1042.         IN ULONG ProcessId,
  1043.         IN ULONG AttachFlags
  1044.         ) PURE;
  1045.     // Gets and sets process control flags.
  1046.     STDMETHOD(GetProcessOptions)(
  1047.         THIS_
  1048.         OUT PULONG Options
  1049.         ) PURE;
  1050.     STDMETHOD(AddProcessOptions)(
  1051.         THIS_
  1052.         IN ULONG Options
  1053.         ) PURE;
  1054.     STDMETHOD(RemoveProcessOptions)(
  1055.         THIS_
  1056.         IN ULONG Options
  1057.         ) PURE;
  1058.     STDMETHOD(SetProcessOptions)(
  1059.         THIS_
  1060.         IN ULONG Options
  1061.         ) PURE;
  1062.     
  1063.     // Opens any kind of user- or kernel-mode dump file
  1064.     // and begins a debug session with the information
  1065.     // contained within it.
  1066.     STDMETHOD(OpenDumpFile)(
  1067.         THIS_
  1068.         IN PCSTR DumpFile
  1069.         ) PURE;
  1070.     // Writes a dump file from the current session information.
  1071.     // The kind of dump file written is determined by the
  1072.     // kind of session and the type qualifier given.
  1073.     // For example, if the current session is a kernel
  1074.     // debug session (DEBUG_CLASS_KERNEL) and the qualifier
  1075.     // is DEBUG_DUMP_SMALL a small kernel dump will be written.
  1076.     STDMETHOD(WriteDumpFile)(
  1077.         THIS_
  1078.         IN PCSTR DumpFile,
  1079.         IN ULONG Qualifier
  1080.         ) PURE;
  1081.     // Indicates that a remote client is ready to
  1082.     // begin participating in the current session.
  1083.     // HistoryLimit gives a character limit on
  1084.     // the amount of output history to be sent.
  1085.     STDMETHOD(ConnectSession)(
  1086.         THIS_
  1087.         IN ULONG Flags,
  1088.         IN ULONG HistoryLimit
  1089.         ) PURE;
  1090.     // Indicates that the engine should start accepting
  1091.     // remote connections. Options specifies connection types
  1092.     // and their parameters.  Supported strings are:
  1093.     //    npipe:Pipe=<Pipe name>
  1094.     //    tcp:Port=<IP port>
  1095.     STDMETHOD(StartServer)(
  1096.         THIS_
  1097.         IN PCSTR Options
  1098.         ) PURE;
  1099.     // List the servers running on the given machine.
  1100.     // Uses the line prefix.
  1101.     STDMETHOD(OutputServers)(
  1102.         THIS_
  1103.         IN ULONG OutputControl,
  1104.         IN PCSTR Machine,
  1105.         IN ULONG Flags
  1106.         ) PURE;
  1107.     // Attempts to terminate all processes in the debuggers list.
  1108.     STDMETHOD(TerminateProcesses)(
  1109.         THIS
  1110.         ) PURE;
  1111.     // Attempts to detach from all processes in the debuggers list.
  1112.     // This requires OS support for debugger detach.
  1113.     STDMETHOD(DetachProcesses)(
  1114.         THIS
  1115.         ) PURE;
  1116.     // Stops the current debug session.  If a process
  1117.     // was created or attached an active EndSession can
  1118.     // terminate or detach from it.
  1119.     // If a kernel connection was opened it will be closed but the
  1120.     // target machine is otherwise unaffected.
  1121.     STDMETHOD(EndSession)(
  1122.         THIS_
  1123.         IN ULONG Flags
  1124.         ) PURE;
  1125.     // If a process was started and ran to completion
  1126.     // this method can be used to retrieve its exit code.
  1127.     STDMETHOD(GetExitCode)(
  1128.         THIS_
  1129.         OUT PULONG Code
  1130.         ) PURE;
  1131.         
  1132.     // Client event callbacks are called on the thread
  1133.     // of the client.  In order to give thread
  1134.     // execution to the engine for callbacks all
  1135.     // client threads should call DispatchCallbacks
  1136.     // when they are idle.  Callbacks are only
  1137.     // received when a thread calls DispatchCallbacks
  1138.     // or WaitForEvent.  WaitForEvent can only be
  1139.     // called by the thread that started the debug
  1140.     // session so all other client threads should
  1141.     // call DispatchCallbacks when possible.
  1142.     // DispatchCallbacks returns when ExitDispatch is used
  1143.     // to interrupt dispatch or when the timeout expires.
  1144.     // DispatchCallbacks dispatches callbacks for all
  1145.     // clients associated with the thread calling
  1146.     // DispatchCallbacks.
  1147.     // DispatchCallbacks returns S_FALSE when the
  1148.     // timeout expires.
  1149.     STDMETHOD(DispatchCallbacks)(
  1150.         THIS_
  1151.         IN ULONG Timeout
  1152.         ) PURE;
  1153.     // ExitDispatch can be used to interrupt callback
  1154.     // dispatch when a client thread is needed by the
  1155.     // client.  This method is reentrant and can
  1156.     // be called from any thread.
  1157.     STDMETHOD(ExitDispatch)(
  1158.         THIS_
  1159.         IN PDEBUG_CLIENT Client
  1160.         ) PURE;
  1161.     // Clients are specific to the thread that
  1162.     // created them.  Calls from other threads
  1163.     // fail immediately.  The CreateClient method
  1164.     // is a notable exception; it allows creation
  1165.     // of a new client for a new thread.
  1166.     STDMETHOD(CreateClient)(
  1167.         THIS_
  1168.         OUT PDEBUG_CLIENT* Client
  1169.         ) PURE;
  1170.     
  1171.     STDMETHOD(GetInputCallbacks)(
  1172.         THIS_
  1173.         OUT PDEBUG_INPUT_CALLBACKS* Callbacks
  1174.         ) PURE;
  1175.     STDMETHOD(SetInputCallbacks)(
  1176.         THIS_
  1177.         IN PDEBUG_INPUT_CALLBACKS Callbacks
  1178.         ) PURE;
  1179.     
  1180.     // Output callback interfaces are described separately.
  1181.     STDMETHOD(GetOutputCallbacks)(
  1182.         THIS_
  1183.         OUT PDEBUG_OUTPUT_CALLBACKS* Callbacks
  1184.         ) PURE;
  1185.     STDMETHOD(SetOutputCallbacks)(
  1186.         THIS_
  1187.         IN PDEBUG_OUTPUT_CALLBACKS Callbacks
  1188.         ) PURE;
  1189.     // Output flags provide control over
  1190.     // the distribution of output among clients.
  1191.     // Output masks select which output streams
  1192.     // should be sent to the output callbacks.
  1193.     // Only Output calls with a mask that
  1194.     // contains one of the output mask bits
  1195.     // will be sent to the output callbacks.
  1196.     // These methods are reentrant.
  1197.     // If such access is not synchronized
  1198.     // disruptions in output may occur.
  1199.     STDMETHOD(GetOutputMask)(
  1200.         THIS_
  1201.         OUT PULONG Mask
  1202.         ) PURE;
  1203.     STDMETHOD(SetOutputMask)(
  1204.         THIS_
  1205.         IN ULONG Mask
  1206.         ) PURE;
  1207.     // These methods allow access to another clients
  1208.     // output mask.  They are necessary for changing
  1209.     // a clients output mask when it is
  1210.     // waiting for events.  These methods are reentrant
  1211.     // and can be called from any thread.
  1212.     STDMETHOD(GetOtherOutputMask)(
  1213.         THIS_
  1214.         IN PDEBUG_CLIENT Client,
  1215.         OUT PULONG Mask
  1216.         ) PURE;
  1217.     STDMETHOD(SetOtherOutputMask)(
  1218.         THIS_
  1219.         IN PDEBUG_CLIENT Client,
  1220.         IN ULONG Mask
  1221.         ) PURE;
  1222.     // Control the width of an output line for
  1223.     // commands which produce formatted output.
  1224.     // This setting is just a suggestion.
  1225.     STDMETHOD(GetOutputWidth)(
  1226.         THIS_
  1227.         OUT PULONG Columns
  1228.         ) PURE;
  1229.     STDMETHOD(SetOutputWidth)(
  1230.         THIS_
  1231.         IN ULONG Columns
  1232.         ) PURE;
  1233.     // Some of the engines output commands produce
  1234.     // multiple lines of output.  A prefix can be
  1235.     // set that the engine will automatically output
  1236.     // for each line in that case, allowing a caller
  1237.     // to control indentation or identifying marks.
  1238.     // This is not a general setting for any output
  1239.     // with a newline in it.  Methods which use
  1240.     // the line prefix are marked in their documentation.
  1241.     STDMETHOD(GetOutputLinePrefix)(
  1242.         THIS_
  1243.         OUT OPTIONAL PSTR Buffer,
  1244.         IN ULONG BufferSize,
  1245.         OUT OPTIONAL PULONG PrefixSize
  1246.         ) PURE;
  1247.     STDMETHOD(SetOutputLinePrefix)(
  1248.         THIS_
  1249.         IN OPTIONAL PCSTR Prefix
  1250.         ) PURE;
  1251.     // Returns a string describing the machine
  1252.     // and user this client represents.  The
  1253.     // specific content of the string varies
  1254.     // with operating system.  If the client is
  1255.     // remotely connected some network information
  1256.     // may also be present.
  1257.     STDMETHOD(GetIdentity)(
  1258.         THIS_
  1259.         OUT OPTIONAL PSTR Buffer,
  1260.         IN ULONG BufferSize,
  1261.         OUT OPTIONAL PULONG IdentitySize
  1262.         ) PURE;
  1263.     // Format is a printf-like format string
  1264.     // with one %s where the identity string should go.
  1265.     STDMETHOD(OutputIdentity)(
  1266.         THIS_
  1267.         IN ULONG OutputControl,
  1268.         IN ULONG Flags,
  1269.         IN PCSTR Format
  1270.         ) PURE;
  1271.     // Event callbacks allow a client to
  1272.     // receive notification about changes
  1273.     // during the debug session.
  1274.     STDMETHOD(GetEventCallbacks)(
  1275.         THIS_
  1276.         OUT PDEBUG_EVENT_CALLBACKS* Callbacks
  1277.         ) PURE;
  1278.     STDMETHOD(SetEventCallbacks)(
  1279.         THIS_
  1280.         IN PDEBUG_EVENT_CALLBACKS Callbacks
  1281.         ) PURE;
  1282.     // The engine sometimes merges compatible callback
  1283.     // requests to reduce callback overhead.  This is
  1284.     // most noticeable with output as small pieces of
  1285.     // output are collected into larger groups to
  1286.     // reduce the overall number of output callback calls.
  1287.     // A client can use this method to force all pending
  1288.     // callbacks to be delivered.  This is rarely necessary.
  1289.     STDMETHOD(FlushCallbacks)(
  1290.         THIS
  1291.         ) PURE;
  1292.     // IDebugClient2.
  1293.     // Functions similarly to WriteDumpFile with
  1294.     // the addition of the ability to specify
  1295.     // per-dump-format write control flags.
  1296.     // Comment is not supported in all formats.
  1297.     STDMETHOD(WriteDumpFile2)(
  1298.         THIS_
  1299.         IN PCSTR DumpFile,
  1300.         IN ULONG Qualifier,
  1301.         IN ULONG FormatFlags,
  1302.         IN OPTIONAL PCSTR Comment
  1303.         ) PURE;
  1304.     // Registers additional files of supporting information
  1305.     // for a dump file open.  This method must be called
  1306.     // before OpenDumpFile is called.
  1307.     // The files registered may be opened at the time
  1308.     // this method is called but generally will not
  1309.     // be used until OpenDumpFile is called.
  1310.     STDMETHOD(AddDumpInformationFile)(
  1311.         THIS_
  1312.         IN PCSTR InfoFile,
  1313.         IN ULONG Type
  1314.         ) PURE;
  1315.     // Requests that the remote process server shut down.
  1316.     STDMETHOD(EndProcessServer)(
  1317.         THIS_
  1318.         IN ULONG64 Server
  1319.         ) PURE;
  1320.     // Waits for a started process server to
  1321.     // exit.  Allows an application running a
  1322.     // process server to monitor the process
  1323.     // server so that it can tell when a remote
  1324.     // client has asked for it to exit.
  1325.     // Returns S_OK if the process server has
  1326.     // shut down and S_FALSE for a timeout.
  1327.     STDMETHOD(WaitForProcessServerEnd)(
  1328.         THIS_
  1329.         IN ULONG Timeout
  1330.         ) PURE;
  1331.     // Returns S_OK if the system is configured
  1332.     // to allow kernel debugging.
  1333.     STDMETHOD(IsKernelDebuggerEnabled)(
  1334.         THIS
  1335.         ) PURE;
  1336.     // Attempts to terminate the current process.
  1337.     // Exit process events for the process may be generated.
  1338.     STDMETHOD(TerminateCurrentProcess)(
  1339.         THIS
  1340.         ) PURE;
  1341.     // Attempts to detach from the current process.
  1342.     // This requires OS support for debugger detach.
  1343.     STDMETHOD(DetachCurrentProcess)(
  1344.         THIS
  1345.         ) PURE;
  1346.     // Removes the process from the debuggers process
  1347.     // list without making any other changes.  The process
  1348.     // will still be marked as being debugged and will
  1349.     // not run.  This allows a debugger to be shut down
  1350.     // and a new debugger attached without taking the
  1351.     // process out of the debugged state.
  1352.     // This is only supported on some system versions.
  1353.     STDMETHOD(AbandonCurrentProcess)(
  1354.         THIS
  1355.         ) PURE;
  1356. };
  1357. //----------------------------------------------------------------------------
  1358. //
  1359. // IDebugControl.
  1360. //
  1361. //----------------------------------------------------------------------------
  1362. // Execution status codes used for waiting,
  1363. // for returning current status and for
  1364. // event method return values.
  1365. #define DEBUG_STATUS_NO_CHANGE      0
  1366. #define DEBUG_STATUS_GO             1
  1367. #define DEBUG_STATUS_GO_HANDLED     2
  1368. #define DEBUG_STATUS_GO_NOT_HANDLED 3
  1369. #define DEBUG_STATUS_STEP_OVER      4
  1370. #define DEBUG_STATUS_STEP_INTO      5
  1371. #define DEBUG_STATUS_BREAK          6
  1372. #define DEBUG_STATUS_NO_DEBUGGEE    7
  1373. #define DEBUG_STATUS_STEP_BRANCH    8
  1374. #define DEBUG_STATUS_IGNORE_EVENT   9
  1375. #define DEBUG_STATUS_MASK           0xf
  1376. // This bit is added in DEBUG_CES_EXECUTION_STATUS
  1377. // notifications when the engines execution status
  1378. // is changing due to operations performed during
  1379. // a wait, such as making synchronous callbacks.  If
  1380. // the bit is not set the execution status is changing
  1381. // due to a wait being satisfied.
  1382. #define DEBUG_STATUS_INSIDE_WAIT 0x100000000
  1383. // Output control flags.
  1384. // Output generated by methods called by this
  1385. // client will be sent only to this clients
  1386. // output callbacks.
  1387. #define DEBUG_OUTCTL_THIS_CLIENT       0x00000000
  1388. // Output will be sent to all clients.
  1389. #define DEBUG_OUTCTL_ALL_CLIENTS       0x00000001
  1390. // Output will be sent to all clients except
  1391. // the client generating the output.
  1392. #define DEBUG_OUTCTL_ALL_OTHER_CLIENTS 0x00000002
  1393. // Output will be discarded immediately and will not
  1394. // be logged or sent to callbacks.
  1395. #define DEBUG_OUTCTL_IGNORE            0x00000003
  1396. // Output will be logged but not sent to callbacks.
  1397. #define DEBUG_OUTCTL_LOG_ONLY          0x00000004
  1398. // All send control bits.
  1399. #define DEBUG_OUTCTL_SEND_MASK         0x00000007
  1400. // Do not place output from this client in
  1401. // the global log file.
  1402. #define DEBUG_OUTCTL_NOT_LOGGED        0x00000008
  1403. // Send output to clients regardless of whether the
  1404. // mask allows it or not.
  1405. #define DEBUG_OUTCTL_OVERRIDE_MASK     0x00000010
  1406. // Special value which means leave the output settings
  1407. // unchanged.
  1408. #define DEBUG_OUTCTL_AMBIENT           0xffffffff
  1409. // Interrupt types.
  1410. // Force a break in if the debuggee is running.
  1411. #define DEBUG_INTERRUPT_ACTIVE  0
  1412. // Notify but do not force a break in.
  1413. #define DEBUG_INTERRUPT_PASSIVE 1
  1414. // Try and get the current engine operation to
  1415. // complete so that the engine will be available
  1416. // again.  If no wait is active this is the same
  1417. // as a passive interrupt.  If a wait is active
  1418. // this will try to cause the wait to fail without
  1419. // breaking in to the debuggee.  There is
  1420. // no guarantee that issuing an exit interrupt
  1421. // will cause the engine to become available
  1422. // as not all operations are arbitrarily
  1423. // interruptible.
  1424. #define DEBUG_INTERRUPT_EXIT    2
  1425. // OutputCurrentState flags.  These flags
  1426. // allow a particular type of information
  1427. // to be displayed but do not guarantee
  1428. // that it will be displayed.  Other global
  1429. // settings may override these flags or
  1430. // the particular state may not be available.
  1431. // For example, source line information may
  1432. // not be present so source line information
  1433. // may not be displayed.
  1434. #define DEBUG_CURRENT_DEFAULT     0x0000000f
  1435. #define DEBUG_CURRENT_SYMBOL      0x00000001
  1436. #define DEBUG_CURRENT_DISASM      0x00000002
  1437. #define DEBUG_CURRENT_REGISTERS   0x00000004
  1438. #define DEBUG_CURRENT_SOURCE_LINE 0x00000008
  1439. // Disassemble flags.
  1440. // Compute the effective address from current register
  1441. // information and display it.
  1442. #define DEBUG_DISASM_EFFECTIVE_ADDRESS 0x00000001
  1443. // If the current disassembly offset has an exact
  1444. // symbol match output the symbol.
  1445. #define DEBUG_DISASM_MATCHING_SYMBOLS  0x00000002
  1446. // Code interpretation levels for stepping
  1447. // and other operations.
  1448. #define DEBUG_LEVEL_SOURCE   0
  1449. #define DEBUG_LEVEL_ASSEMBLY 1
  1450. // Engine control flags.
  1451. #define DEBUG_ENGOPT_IGNORE_DBGHELP_VERSION      0x00000001
  1452. #define DEBUG_ENGOPT_IGNORE_EXTENSION_VERSIONS   0x00000002
  1453. // If neither allow nor disallow is specified
  1454. // the engine will pick one based on what kind
  1455. // of debugging is going on.
  1456. #define DEBUG_ENGOPT_ALLOW_NETWORK_PATHS         0x00000004
  1457. #define DEBUG_ENGOPT_DISALLOW_NETWORK_PATHS      0x00000008
  1458. #define DEBUG_ENGOPT_NETWORK_PATHS               (0x00000004 | 0x00000008)
  1459. // Ignore loader-generated first-chance exceptions.
  1460. #define DEBUG_ENGOPT_IGNORE_LOADER_EXCEPTIONS    0x00000010
  1461. // Break in on a debuggees initial event.  In user-mode
  1462. // this will break at the initial system breakpoint
  1463. // for every created process.  In kernel-mode it
  1464. // will attempt break in on the target at the first
  1465. // WaitForEvent.
  1466. #define DEBUG_ENGOPT_INITIAL_BREAK               0x00000020
  1467. // Break in on the first module load for a debuggee.
  1468. #define DEBUG_ENGOPT_INITIAL_MODULE_BREAK        0x00000040
  1469. // Break in on a debuggees final event.  In user-mode
  1470. // this will break on process exit for every process.
  1471. // In kernel-mode it currently does nothing.
  1472. #define DEBUG_ENGOPT_FINAL_BREAK                 0x00000080
  1473. // By default Execute will repeat the last command
  1474. // if it is given an empty string.  The flags to
  1475. // Execute can override this behavior for a single
  1476. // command or this engine option can be used to
  1477. // change the default globally.
  1478. #define DEBUG_ENGOPT_NO_EXECUTE_REPEAT           0x00000100
  1479. // Disable places in the engine that have fallback
  1480. // code when presented with incomplete information.
  1481. //   1. Fails minidump module loads unless matching
  1482. //      executables can be mapped.
  1483. #define DEBUG_ENGOPT_FAIL_INCOMPLETE_INFORMATION 0x00000200
  1484. // Allow the debugger to manipulate page protections
  1485. // in order to insert code breakpoints on pages that
  1486. // do not have write access.  This option is not on
  1487. // by default as it allows breakpoints to be set
  1488. // in potentially hazardous memory areas.
  1489. #define DEBUG_ENGOPT_ALLOW_READ_ONLY_BREAKPOINTS 0x00000400
  1490. // When using a software (bp/bu) breakpoint in code
  1491. // that will be executed by multiple threads it is
  1492. // possible for breakpoint management to cause the
  1493. // breakpoint to be missed or for spurious single-step
  1494. // exceptions to be generated.  This flag suspends
  1495. // all but the active thread when doing breakpoint
  1496. // management and thereby avoids multithreading
  1497. // problems.  Care must be taken when using it, though,
  1498. // as the suspension of threads can cause deadlocks
  1499. // if the suspended threads are holding resources that
  1500. // the active thread needs.  Additionally, there
  1501. // are still rare situations where problems may
  1502. // occur, but setting this flag corrects nearly
  1503. // all multithreading issues with software breakpoints.
  1504. // Thread-restricted stepping and execution supersedes
  1505. // this flags effect.
  1506. // This flag is ignored in kernel sessions as there
  1507. // is no way to restrict processor execution.
  1508. #define DEBUG_ENGOPT_SYNCHRONIZE_BREAKPOINTS     0x00000800
  1509. // Disallows executing shell commands through the
  1510. // engine with .shell (!!).
  1511. #define DEBUG_ENGOPT_DISALLOW_SHELL_COMMANDS     0x00001000
  1512. #define DEBUG_ENGOPT_ALL                         0x00001FFF
  1513. // General unspecified ID constant.
  1514. #define DEBUG_ANY_ID 0xffffffff
  1515. typedef struct _DEBUG_STACK_FRAME
  1516. {
  1517.     ULONG64 InstructionOffset;
  1518.     ULONG64 ReturnOffset;
  1519.     ULONG64 FrameOffset;
  1520.     ULONG64 StackOffset;
  1521.     ULONG64 FuncTableEntry;
  1522.     ULONG64 Params[4];
  1523.     ULONG64 Reserved[6];
  1524.     BOOL    Virtual;
  1525.     ULONG   FrameNumber;
  1526. } DEBUG_STACK_FRAME, *PDEBUG_STACK_FRAME;
  1527. // OutputStackTrace flags.
  1528. // Display a small number of arguments for each call.
  1529. // These may or may not be the actual arguments depending
  1530. // on the architecture, particular function and
  1531. // point during the execution of the function.
  1532. // If the current code level is assembly arguments
  1533. // are dumped as hex values.  If the code level is
  1534. // source the engine attempts to provide symbolic
  1535. // argument information.
  1536. #define DEBUG_STACK_ARGUMENTS               0x00000001
  1537. // Displays information about the functions
  1538. // frame such as __stdcall arguments, FPO
  1539. // information and whatever else is available.
  1540. #define DEBUG_STACK_FUNCTION_INFO           0x00000002
  1541. // Displays source line information for each
  1542. // frame of the stack trace.
  1543. #define DEBUG_STACK_SOURCE_LINE             0x00000004
  1544. // Show return, previous frame and other relevant address
  1545. // values for each frame.
  1546. #define DEBUG_STACK_FRAME_ADDRESSES         0x00000008
  1547. // Show column names.
  1548. #define DEBUG_STACK_COLUMN_NAMES            0x00000010
  1549. // Show non-volatile register context for each
  1550. // frame.  This is only meaningful for some platforms.
  1551. #define DEBUG_STACK_NONVOLATILE_REGISTERS   0x00000020
  1552. // Show frame numbers
  1553. #define DEBUG_STACK_FRAME_NUMBERS           0x00000040
  1554. // Show parameters with type name
  1555. #define DEBUG_STACK_PARAMETERS              0x00000080
  1556. // Show just return address in stack frame addresses
  1557. #define DEBUG_STACK_FRAME_ADDRESSES_RA_ONLY 0x00000100
  1558. // Classes of debuggee.  Each class
  1559. // has different qualifiers for specific
  1560. // kinds of debuggees.
  1561. #define DEBUG_CLASS_UNINITIALIZED 0
  1562. #define DEBUG_CLASS_KERNEL        1
  1563. #define DEBUG_CLASS_USER_WINDOWS  2
  1564. // Generic dump types.  These can be used
  1565. // with either user or kernel sessions.
  1566. // Session-type-specific aliases are also
  1567. // provided.
  1568. #define DEBUG_DUMP_SMALL   1024
  1569. #define DEBUG_DUMP_DEFAULT 1025
  1570. #define DEBUG_DUMP_FULL    1026
  1571. // Specific types of kernel debuggees.
  1572. #define DEBUG_KERNEL_CONNECTION  0
  1573. #define DEBUG_KERNEL_LOCAL       1
  1574. #define DEBUG_KERNEL_EXDI_DRIVER 2
  1575. #define DEBUG_KERNEL_SMALL_DUMP  DEBUG_DUMP_SMALL
  1576. #define DEBUG_KERNEL_DUMP        DEBUG_DUMP_DEFAULT
  1577. #define DEBUG_KERNEL_FULL_DUMP   DEBUG_DUMP_FULL
  1578. // Specific types of Windows user debuggees.
  1579. #define DEBUG_USER_WINDOWS_PROCESS        0
  1580. #define DEBUG_USER_WINDOWS_PROCESS_SERVER 1
  1581. #define DEBUG_USER_WINDOWS_SMALL_DUMP     DEBUG_DUMP_SMALL
  1582. #define DEBUG_USER_WINDOWS_DUMP           DEBUG_DUMP_DEFAULT
  1583. // Extension flags.
  1584. #define DEBUG_EXTENSION_AT_ENGINE 0x00000000
  1585. // Execute and ExecuteCommandFile flags.
  1586. // These flags only apply to the command
  1587. // text itself; output from the executed
  1588. // command is controlled by the output
  1589. // control parameter.
  1590. // Default execution.  Command is logged
  1591. // but not output.
  1592. #define DEBUG_EXECUTE_DEFAULT    0x00000000
  1593. // Echo commands during execution.  In
  1594. // ExecuteCommandFile also echoes the prompt
  1595. // for each line of the file.
  1596. #define DEBUG_EXECUTE_ECHO       0x00000001
  1597. // Do not log or output commands during execution.
  1598. // Overridden by DEBUG_EXECUTE_ECHO.
  1599. #define DEBUG_EXECUTE_NOT_LOGGED 0x00000002
  1600. // If this flag is not set an empty string
  1601. // to Execute will repeat the last Execute
  1602. // string.
  1603. #define DEBUG_EXECUTE_NO_REPEAT  0x00000004
  1604. // Specific event filter types.  Some event
  1605. // filters have optional arguments to further
  1606. // qualify their operation.
  1607. #define DEBUG_FILTER_CREATE_THREAD       0x00000000
  1608. #define DEBUG_FILTER_EXIT_THREAD         0x00000001
  1609. #define DEBUG_FILTER_CREATE_PROCESS      0x00000002
  1610. #define DEBUG_FILTER_EXIT_PROCESS        0x00000003
  1611. // Argument is the name of a module to break on.
  1612. #define DEBUG_FILTER_LOAD_MODULE         0x00000004
  1613. // Argument is the base address of a specific module to break on.
  1614. #define DEBUG_FILTER_UNLOAD_MODULE       0x00000005
  1615. #define DEBUG_FILTER_SYSTEM_ERROR        0x00000006
  1616. // Initial breakpoint and initial module load are one-shot
  1617. // events that are triggered at the appropriate points in
  1618. // the beginning of a session.  Their commands are executed
  1619. // and then further processing is controlled by the normal
  1620. // exception and load module filters.
  1621. #define DEBUG_FILTER_INITIAL_BREAKPOINT  0x00000007
  1622. #define DEBUG_FILTER_INITIAL_MODULE_LOAD 0x00000008
  1623. // The debug output filter allows the debugger to stop
  1624. // when output is produced so that the code causing
  1625. // output can be tracked down or synchronized with.
  1626. // This filter is not supported for live dual-machine
  1627. // kernel debugging.
  1628. #define DEBUG_FILTER_DEBUGGEE_OUTPUT     0x00000009
  1629. // Event filter execution options.
  1630. // Break in always.
  1631. #define DEBUG_FILTER_BREAK               0x00000000
  1632. // Break in on second-chance exceptions.  For events
  1633. // that are not exceptions this is the same as BREAK.
  1634. #define DEBUG_FILTER_SECOND_CHANCE_BREAK 0x00000001
  1635. // Output a message about the event but continue.
  1636. #define DEBUG_FILTER_OUTPUT              0x00000002
  1637. // Continue the event.
  1638. #define DEBUG_FILTER_IGNORE              0x00000003
  1639. // Used to remove general exception filters.
  1640. #define DEBUG_FILTER_REMOVE              0x00000004
  1641. // Event filter continuation options.  These options are
  1642. // only used when DEBUG_STATUS_GO is used to continue
  1643. // execution.  If a specific go status such as
  1644. // DEBUG_STATUS_GO_NOT_HANDLED is used it controls
  1645. // the continuation.
  1646. #define DEBUG_FILTER_GO_HANDLED          0x00000000
  1647. #define DEBUG_FILTER_GO_NOT_HANDLED      0x00000001
  1648. // Specific event filter settings.
  1649. typedef struct _DEBUG_SPECIFIC_FILTER_PARAMETERS
  1650. {
  1651.     ULONG ExecutionOption;
  1652.     ULONG ContinueOption;
  1653.     ULONG TextSize;
  1654.     ULONG CommandSize;
  1655.     // If ArgumentSize is zero this filter does
  1656.     // not have an argument.  An empty argument for
  1657.     // a filter which does have an argument will take
  1658.     // one byte for the terminator.
  1659.     ULONG ArgumentSize;
  1660. } DEBUG_SPECIFIC_FILTER_PARAMETERS, *PDEBUG_SPECIFIC_FILTER_PARAMETERS;
  1661. // Exception event filter settings.
  1662. typedef struct _DEBUG_EXCEPTION_FILTER_PARAMETERS
  1663. {
  1664.     ULONG ExecutionOption;
  1665.     ULONG ContinueOption;
  1666.     ULONG TextSize;
  1667.     ULONG CommandSize;
  1668.     ULONG SecondCommandSize;
  1669.     ULONG ExceptionCode;
  1670. } DEBUG_EXCEPTION_FILTER_PARAMETERS, *PDEBUG_EXCEPTION_FILTER_PARAMETERS;
  1671. // Wait flags.
  1672. #define DEBUG_WAIT_DEFAULT 0x00000000
  1673. // Last event information structures.
  1674. typedef struct _DEBUG_LAST_EVENT_INFO_BREAKPOINT
  1675. {
  1676.     ULONG Id;
  1677. } DEBUG_LAST_EVENT_INFO_BREAKPOINT, *PDEBUG_LAST_EVENT_INFO_BREAKPOINT;
  1678. typedef struct _DEBUG_LAST_EVENT_INFO_EXCEPTION
  1679. {
  1680.     EXCEPTION_RECORD64 ExceptionRecord;
  1681.     ULONG FirstChance;
  1682. } DEBUG_LAST_EVENT_INFO_EXCEPTION, *PDEBUG_LAST_EVENT_INFO_EXCEPTION;
  1683. typedef struct _DEBUG_LAST_EVENT_INFO_EXIT_THREAD
  1684. {
  1685.     ULONG ExitCode;
  1686. } DEBUG_LAST_EVENT_INFO_EXIT_THREAD, *PDEBUG_LAST_EVENT_INFO_EXIT_THREAD;
  1687. typedef struct _DEBUG_LAST_EVENT_INFO_EXIT_PROCESS
  1688. {
  1689.     ULONG ExitCode;
  1690. } DEBUG_LAST_EVENT_INFO_EXIT_PROCESS, *PDEBUG_LAST_EVENT_INFO_EXIT_PROCESS;
  1691. typedef struct _DEBUG_LAST_EVENT_INFO_LOAD_MODULE
  1692. {
  1693.     ULONG64 Base;
  1694. } DEBUG_LAST_EVENT_INFO_LOAD_MODULE, *PDEBUG_LAST_EVENT_INFO_LOAD_MODULE;
  1695. typedef struct _DEBUG_LAST_EVENT_INFO_UNLOAD_MODULE
  1696. {
  1697.     ULONG64 Base;
  1698. } DEBUG_LAST_EVENT_INFO_UNLOAD_MODULE, *PDEBUG_LAST_EVENT_INFO_UNLOAD_MODULE;
  1699. typedef struct _DEBUG_LAST_EVENT_INFO_SYSTEM_ERROR
  1700. {
  1701.     ULONG Error;
  1702.     ULONG Level;
  1703. } DEBUG_LAST_EVENT_INFO_SYSTEM_ERROR, *PDEBUG_LAST_EVENT_INFO_SYSTEM_ERROR;
  1704. // DEBUG_VALUE types.
  1705. #define DEBUG_VALUE_INVALID      0
  1706. #define DEBUG_VALUE_INT8         1
  1707. #define DEBUG_VALUE_INT16        2
  1708. #define DEBUG_VALUE_INT32        3
  1709. #define DEBUG_VALUE_INT64        4
  1710. #define DEBUG_VALUE_FLOAT32      5
  1711. #define DEBUG_VALUE_FLOAT64      6
  1712. #define DEBUG_VALUE_FLOAT80      7
  1713. #define DEBUG_VALUE_FLOAT82      8
  1714. #define DEBUG_VALUE_FLOAT128     9
  1715. #define DEBUG_VALUE_VECTOR64     10
  1716. #define DEBUG_VALUE_VECTOR128    11
  1717. // Count of type indices.
  1718. #define DEBUG_VALUE_TYPES        12
  1719. #if defined(_MSC_VER)
  1720. #if _MSC_VER >= 800
  1721. #if _MSC_VER >= 1200
  1722. #pragma warning(push)
  1723. #endif
  1724. #pragma warning(disable:4201)    /* Nameless struct/union */
  1725. #endif
  1726. #endif
  1727. // Force the compiler to align DEBUG_VALUE.Type on a four-byte
  1728. // boundary so that it comes out to 32 bytes total.
  1729. #include <pshpack4.h>
  1730. typedef struct _DEBUG_VALUE
  1731. {
  1732.     union
  1733.     {
  1734.         UCHAR I8;
  1735.         USHORT I16;
  1736.         ULONG I32;
  1737.         struct
  1738.         {
  1739.             // Extra NAT indicator for IA64
  1740.             // integer registers.  NAT will
  1741.             // always be false for other CPUs.
  1742.             ULONG64 I64;
  1743.             BOOL Nat;
  1744.         };
  1745.         float F32;
  1746.         double F64;
  1747.         UCHAR F80Bytes[10];
  1748.         UCHAR F82Bytes[11];
  1749.         UCHAR F128Bytes[16];
  1750.         // Vector interpretations.  The actual number
  1751.         // of valid elements depends on the vector length.
  1752.         UCHAR VI8[16];
  1753.         USHORT VI16[8];
  1754.         ULONG VI32[4];
  1755.         ULONG64 VI64[2];
  1756.         float VF32[4];
  1757.         double VF64[2];
  1758.         struct
  1759.         {
  1760.             ULONG LowPart;
  1761.             ULONG HighPart;
  1762.         } I64Parts32;
  1763.         struct
  1764.         {
  1765.             ULONG64 LowPart;
  1766.             LONG64 HighPart;
  1767.         } F128Parts64;
  1768.         // Allows raw byte access to content.  Array
  1769.         // can be indexed for as much data as Type
  1770.         // describes.  This array also serves to pad
  1771.         // the structure out to 32 bytes and reserves
  1772.         // space for future members.
  1773.         UCHAR RawBytes[28];
  1774.     };
  1775.     ULONG Type;
  1776. } DEBUG_VALUE, *PDEBUG_VALUE;
  1777. #include <poppack.h>
  1778. #if defined(_MSC_VER)
  1779. #if _MSC_VER >= 800
  1780. #if _MSC_VER >= 1200
  1781. #pragma warning(pop)
  1782. #else
  1783. #pragma warning(disable:4201)    /* Nameless struct/union */
  1784. #endif
  1785. #endif
  1786. #endif
  1787. #undef INTERFACE
  1788. #define INTERFACE IDebugControl
  1789. DECLARE_INTERFACE_(IDebugControl, IUnknown)
  1790. {
  1791.     // IUnknown.
  1792.     STDMETHOD(QueryInterface)(
  1793.         THIS_
  1794.         IN REFIID InterfaceId,
  1795.         OUT PVOID* Interface
  1796.         ) PURE;
  1797.     STDMETHOD_(ULONG, AddRef)(
  1798.         THIS
  1799.         ) PURE;
  1800.     STDMETHOD_(ULONG, Release)(
  1801.         THIS
  1802.         ) PURE;
  1803.     // IDebugControl.
  1804.     
  1805.     // Checks for a user interrupt, such a Ctrl-C
  1806.     // or stop button.
  1807.     // This method is reentrant.
  1808.     STDMETHOD(GetInterrupt)(
  1809.         THIS
  1810.         ) PURE;
  1811.     // Registers a user interrupt.
  1812.     // This method is reentrant.
  1813.     STDMETHOD(SetInterrupt)(
  1814.         THIS_
  1815.         IN ULONG Flags
  1816.         ) PURE;
  1817.     // Interrupting a user-mode process requires
  1818.     // access to some system resources that the
  1819.     // process may hold itself, preventing the
  1820.     // interrupt from occurring.  The engine
  1821.     // will time-out pending interrupt requests
  1822.     // and simulate an interrupt if necessary.
  1823.     // These methods control the interrupt timeout.
  1824.     STDMETHOD(GetInterruptTimeout)(
  1825.         THIS_
  1826.         OUT PULONG Seconds
  1827.         ) PURE;
  1828.     STDMETHOD(SetInterruptTimeout)(
  1829.         THIS_
  1830.         IN ULONG Seconds
  1831.         ) PURE;
  1832.     STDMETHOD(GetLogFile)(
  1833.         THIS_
  1834.         OUT OPTIONAL PSTR Buffer,
  1835.         IN ULONG BufferSize,
  1836.         OUT OPTIONAL PULONG FileSize,
  1837.         OUT PBOOL Append
  1838.         ) PURE;
  1839.     // Opens a log file which collects all
  1840.     // output.  Output from every client except
  1841.     // those that explicitly disable logging
  1842.     // goes into the log.
  1843.     // Opening a log file closes any log file
  1844.     // already open.
  1845.     STDMETHOD(OpenLogFile)(
  1846.         THIS_
  1847.         IN PCSTR File,
  1848.         IN BOOL Append
  1849.         ) PURE;
  1850.     STDMETHOD(CloseLogFile)(
  1851.         THIS
  1852.         ) PURE;
  1853.     // Controls what output is logged.
  1854.     STDMETHOD(GetLogMask)(
  1855.         THIS_
  1856.         OUT PULONG Mask
  1857.         ) PURE;
  1858.     STDMETHOD(SetLogMask)(
  1859.         THIS_
  1860.         IN ULONG Mask
  1861.         ) PURE;
  1862.             
  1863.     // Input requests input from all clients.
  1864.     // The first input that is returned is used
  1865.     // to satisfy the call.  Other returned
  1866.     // input is discarded.
  1867.     STDMETHOD(Input)(
  1868.         THIS_
  1869.         OUT PSTR Buffer,
  1870.         IN ULONG BufferSize,
  1871.         OUT OPTIONAL PULONG InputSize
  1872.         ) PURE;
  1873.     // This method is used by clients to return
  1874.     // input when it is available.  It will
  1875.     // return S_OK if the input is used to
  1876.     // satisfy an Input call and S_FALSE if
  1877.     // the input is ignored.
  1878.     // This method is reentrant.
  1879.     STDMETHOD(ReturnInput)(
  1880.         THIS_
  1881.         IN PCSTR Buffer
  1882.         ) PURE;
  1883.     
  1884.     // Sends output through clients
  1885.     // output callbacks if the mask is allowed
  1886.     // by the current output control mask and
  1887.     // according to the output distribution
  1888.     // settings.
  1889.     STDMETHODV(Output)(
  1890.         THIS_
  1891.         IN ULONG Mask,
  1892.         IN PCSTR Format,
  1893.         ...
  1894.         ) PURE;
  1895.     STDMETHOD(OutputVaList)(
  1896.         THIS_
  1897.         IN ULONG Mask,
  1898.         IN PCSTR Format,
  1899.         IN va_list Args
  1900.         ) PURE;
  1901.     // The following methods allow direct control
  1902.     // over the distribution of the given output
  1903.     // for situations where something other than
  1904.     // the default is desired.  These methods require
  1905.     // extra work in the engine so they should
  1906.     // only be used when necessary.
  1907.     STDMETHODV(ControlledOutput)(
  1908.         THIS_
  1909.         IN ULONG OutputControl,
  1910.         IN ULONG Mask,
  1911.         IN PCSTR Format,
  1912.         ...
  1913.         ) PURE;
  1914.     STDMETHOD(ControlledOutputVaList)(
  1915.         THIS_
  1916.         IN ULONG OutputControl,
  1917.         IN ULONG Mask,
  1918.         IN PCSTR Format,
  1919.         IN va_list Args
  1920.         ) PURE;
  1921.             
  1922.     // Displays the standard command-line prompt
  1923.     // followed by the given output.  If Format
  1924.     // is NULL no additional output is produced.
  1925.     // Output is produced under the
  1926.     // DEBUG_OUTPUT_PROMPT mask.
  1927.     // This method only outputs the prompt; it
  1928.     // does not get input.
  1929.     STDMETHODV(OutputPrompt)(
  1930.         THIS_
  1931.         IN ULONG OutputControl,
  1932.         IN OPTIONAL PCSTR Format,
  1933.         ...
  1934.         ) PURE;
  1935.     STDMETHOD(OutputPromptVaList)(
  1936.         THIS_
  1937.         IN ULONG OutputControl,
  1938.         IN OPTIONAL PCSTR Format,
  1939.         IN va_list Args
  1940.         ) PURE;
  1941.     // Gets the text that would be displayed by OutputPrompt.
  1942.     STDMETHOD(GetPromptText)(
  1943.         THIS_
  1944.         OUT OPTIONAL PSTR Buffer,
  1945.         IN ULONG BufferSize,
  1946.         OUT OPTIONAL PULONG TextSize
  1947.         ) PURE;
  1948.     // Outputs information about the current
  1949.     // debuggee state such as a register
  1950.     // summary, disassembly at the current PC,
  1951.     // closest symbol and others.
  1952.     // Uses the line prefix.
  1953.     STDMETHOD(OutputCurrentState)(
  1954.         THIS_
  1955.         IN ULONG OutputControl,
  1956.         IN ULONG Flags
  1957.         ) PURE;
  1958.         
  1959.     // Outputs the debugger and extension version
  1960.     // information.  This method is reentrant.
  1961.     // Uses the line prefix.
  1962.     STDMETHOD(OutputVersionInformation)(
  1963.         THIS_
  1964.         IN ULONG OutputControl
  1965.         ) PURE;
  1966.     // In user-mode debugging sessions the
  1967.     // engine will set an event when
  1968.     // exceptions are continued.  This can
  1969.     // be used to synchronize other processes
  1970.     // with the debuggers handling of events.
  1971.     // For example, this is used to support
  1972.     // the e argument to ntsd.
  1973.     STDMETHOD(GetNotifyEventHandle)(
  1974.         THIS_
  1975.         OUT PULONG64 Handle
  1976.         ) PURE;
  1977.     STDMETHOD(SetNotifyEventHandle)(
  1978.         THIS_
  1979.         IN ULONG64 Handle
  1980.         ) PURE;
  1981.     STDMETHOD(Assemble)(
  1982.         THIS_
  1983.         IN ULONG64 Offset,
  1984.         IN PCSTR Instr,
  1985.         OUT PULONG64 EndOffset
  1986.         ) PURE;
  1987.     STDMETHOD(Disassemble)(
  1988.         THIS_
  1989.         IN ULONG64 Offset,
  1990.         IN ULONG Flags,
  1991.         OUT OPTIONAL PSTR Buffer,
  1992.         IN ULONG BufferSize,
  1993.         OUT OPTIONAL PULONG DisassemblySize,
  1994.         OUT PULONG64 EndOffset
  1995.         ) PURE;
  1996.     // Returns the value of the effective address
  1997.     // computed for the last Disassemble, if there
  1998.     // was one.
  1999.     STDMETHOD(GetDisassembleEffectiveOffset)(
  2000.         THIS_
  2001.         OUT PULONG64 Offset
  2002.         ) PURE;
  2003.     // Uses the line prefix if necessary.
  2004.     STDMETHOD(OutputDisassembly)(
  2005.         THIS_
  2006.         IN ULONG OutputControl,
  2007.         IN ULONG64 Offset,
  2008.         IN ULONG Flags,
  2009.         OUT PULONG64 EndOffset
  2010.         ) PURE;
  2011.     // Produces multiple lines of disassembly output.
  2012.     // There will be PreviousLines of disassembly before
  2013.     // the given offset if a valid disassembly exists.
  2014.     // In all, there will be TotalLines of output produced.
  2015.     // The first and last line offsets are returned
  2016.     // specially and all lines offsets can be retrieved
  2017.     // through LineOffsets.  LineOffsets will contain
  2018.     // offsets for each line where disassembly started.
  2019.     // When disassembly of a single instruction takes
  2020.     // multiple lines the initial offset will be followed
  2021.     // by DEBUG_INVALID_OFFSET.
  2022.     // Uses the line prefix.
  2023.     STDMETHOD(OutputDisassemblyLines)(
  2024.         THIS_
  2025.         IN ULONG OutputControl,
  2026.         IN ULONG PreviousLines,
  2027.         IN ULONG TotalLines,
  2028.         IN ULONG64 Offset,
  2029.         IN ULONG Flags,
  2030.         OUT OPTIONAL PULONG OffsetLine,
  2031.         OUT OPTIONAL PULONG64 StartOffset,
  2032.         OUT OPTIONAL PULONG64 EndOffset,
  2033.         OUT OPTIONAL /* size_is(TotalLines) */ PULONG64 LineOffsets
  2034.         ) PURE;
  2035.     // Returns the offset of the start of
  2036.     // the instruction thats the given
  2037.     // delta away from the instruction
  2038.     // at the initial offset.
  2039.     // This routine does not check for
  2040.     // validity of the instruction or
  2041.     // the memory containing it.
  2042.     STDMETHOD(GetNearInstruction)(
  2043.         THIS_
  2044.         IN ULONG64 Offset,
  2045.         IN LONG Delta,
  2046.         OUT PULONG64 NearOffset
  2047.         ) PURE;
  2048.     // Offsets can be passed in as zero to use the current
  2049.     // thread state.
  2050.     STDMETHOD(GetStackTrace)(
  2051.         THIS_
  2052.         IN ULONG64 FrameOffset,
  2053.         IN ULONG64 StackOffset,
  2054.         IN ULONG64 InstructionOffset,
  2055.         OUT /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
  2056.         IN ULONG FramesSize,
  2057.         OUT OPTIONAL PULONG FramesFilled
  2058.         ) PURE;
  2059.     // Does a simple stack trace to determine
  2060.     // what the current return address is.
  2061.     STDMETHOD(GetReturnOffset)(
  2062.         THIS_
  2063.         OUT PULONG64 Offset
  2064.         ) PURE;
  2065.     // If Frames is NULL OutputStackTrace will
  2066.     // use GetStackTrace to get FramesSize frames
  2067.     // and then output them.  The current register
  2068.     // values for frame, stack and instruction offsets
  2069.     // are used.
  2070.     // Uses the line prefix.
  2071.     STDMETHOD(OutputStackTrace)(
  2072.         THIS_
  2073.         IN ULONG OutputControl,
  2074.         IN OPTIONAL /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
  2075.         IN ULONG FramesSize,
  2076.         IN ULONG Flags
  2077.         ) PURE;
  2078.     
  2079.     // Returns information about the debuggee such
  2080.     // as user vs. kernel, dump vs. live, etc.
  2081.     STDMETHOD(GetDebuggeeType)(
  2082.         THIS_
  2083.         OUT PULONG Class,
  2084.         OUT PULONG Qualifier
  2085.         ) PURE;
  2086.     // Returns the type of physical processors in
  2087.     // the machine.
  2088.     // Returns one of the IMAGE_FILE_MACHINE values.
  2089.     STDMETHOD(GetActualProcessorType)(
  2090.         THIS_
  2091.         OUT PULONG Type
  2092.         ) PURE;
  2093.     // Returns the type of processor used in the
  2094.     // current processor context.
  2095.     STDMETHOD(GetExecutingProcessorType)(
  2096.         THIS_
  2097.         OUT PULONG Type
  2098.         ) PURE;
  2099.     // Query all the possible processor types that
  2100.     // may be encountered during this debug session.
  2101.     STDMETHOD(GetNumberPossibleExecutingProcessorTypes)(
  2102.         THIS_
  2103.         OUT PULONG Number
  2104.         ) PURE;
  2105.     STDMETHOD(GetPossibleExecutingProcessorTypes)(
  2106.         THIS_
  2107.         IN ULONG Start,
  2108.         IN ULONG Count,
  2109.         OUT /* size_is(Count) */ PULONG Types
  2110.         ) PURE;
  2111.     // Get the number of actual processors in
  2112.     // the machine.
  2113.     STDMETHOD(GetNumberProcessors)(
  2114.         THIS_
  2115.         OUT PULONG Number
  2116.         ) PURE;
  2117.     // PlatformId is one of the VER_PLATFORM values.
  2118.     // Major and minor are as given in the NT
  2119.     // kernel debugger protocol.
  2120.     // ServicePackString and ServicePackNumber indicate the
  2121.     // system service pack level.  ServicePackNumber is not
  2122.     // available in some sessions where the service pack level
  2123.     // is only expressed as a string.  The service pack information
  2124.     // will be empty if the system does not have a service pack
  2125.     // applied.
  2126.     // The build string is string information identifying the
  2127.     // particular build of the system.  The build string is
  2128.     // empty if the system has no particular identifying
  2129.     // information.
  2130.     STDMETHOD(GetSystemVersion)(
  2131.         THIS_
  2132.         OUT PULONG PlatformId,
  2133.         OUT PULONG Major,
  2134.         OUT PULONG Minor,
  2135.         OUT OPTIONAL PSTR ServicePackString,
  2136.         IN ULONG ServicePackStringSize,
  2137.         OUT OPTIONAL PULONG ServicePackStringUsed,
  2138.         OUT PULONG ServicePackNumber,
  2139.         OUT OPTIONAL PSTR BuildString,
  2140.         IN ULONG BuildStringSize,
  2141.         OUT OPTIONAL PULONG BuildStringUsed
  2142.         ) PURE;
  2143.     // Returns the page size for the currently executing
  2144.     // processor context.  The page size may vary between
  2145.     // processor types.
  2146.     STDMETHOD(GetPageSize)(
  2147.         THIS_
  2148.         OUT PULONG Size
  2149.         ) PURE;
  2150.     // Returns S_OK if the current processor context uses
  2151.     // 64-bit addresses, otherwise S_FALSE.
  2152.     STDMETHOD(IsPointer64Bit)(
  2153.         THIS
  2154.         ) PURE;
  2155.     // Reads the bugcheck data area and returns the
  2156.     // current contents.  This method only works
  2157.     // in kernel debugging sessions.
  2158.     STDMETHOD(ReadBugCheckData)(
  2159.         THIS_
  2160.         OUT PULONG Code,
  2161.         OUT PULONG64 Arg1,
  2162.         OUT PULONG64 Arg2,
  2163.         OUT PULONG64 Arg3,
  2164.         OUT PULONG64 Arg4
  2165.         ) PURE;
  2166.     // Query all the processor types supported by
  2167.     // the engine.  This is a complete list and is
  2168.     // not related to the machine running the engine
  2169.     // or the debuggee.
  2170.     STDMETHOD(GetNumberSupportedProcessorTypes)(
  2171.         THIS_
  2172.         OUT PULONG Number
  2173.         ) PURE;
  2174.     STDMETHOD(GetSupportedProcessorTypes)(
  2175.         THIS_
  2176.         IN ULONG Start,
  2177.         IN ULONG Count,
  2178.         OUT /* size_is(Count) */ PULONG Types
  2179.         ) PURE;
  2180.     // Returns a full, descriptive name and an
  2181.     // abbreviated name for a processor type.
  2182.     STDMETHOD(GetProcessorTypeNames)(
  2183.         THIS_
  2184.         IN ULONG Type,
  2185.         OUT OPTIONAL PSTR FullNameBuffer,
  2186.         IN ULONG FullNameBufferSize,
  2187.         OUT OPTIONAL PULONG FullNameSize,
  2188.         OUT OPTIONAL PSTR AbbrevNameBuffer,
  2189.         IN ULONG AbbrevNameBufferSize,
  2190.         OUT OPTIONAL PULONG AbbrevNameSize
  2191.         ) PURE;
  2192.                 
  2193.     // Gets and sets the type of processor to
  2194.     // use when doing things like setting
  2195.     // breakpoints, accessing registers,
  2196.     // getting stack traces and so on.
  2197.     STDMETHOD(GetEffectiveProcessorType)(
  2198.         THIS_
  2199.         OUT PULONG Type
  2200.         ) PURE;
  2201.     STDMETHOD(SetEffectiveProcessorType)(
  2202.         THIS_
  2203.         IN ULONG Type
  2204.         ) PURE;
  2205.     // Returns information about whether and how
  2206.     // the debuggee is running.  Status will
  2207.     // be GO if the debuggee is running and
  2208.     // BREAK if it isnt.
  2209.     // If no debuggee exists the status is
  2210.     // NO_DEBUGGEE.
  2211.     // This method is reentrant.
  2212.     STDMETHOD(GetExecutionStatus)(
  2213.         THIS_
  2214.         OUT PULONG Status
  2215.         ) PURE;
  2216.     // Changes the execution status of the
  2217.     // engine from stopped to running.
  2218.     // Status must be one of the go or step
  2219.     // status values.
  2220.     STDMETHOD(SetExecutionStatus)(
  2221.         THIS_
  2222.         IN ULONG Status
  2223.         ) PURE;
  2224.         
  2225.     // Controls what code interpretation level the debugger
  2226.     // runs at.  The debugger checks the code level when
  2227.     // deciding whether to step by a source line or
  2228.     // assembly instruction along with other related operations.
  2229.     STDMETHOD(GetCodeLevel)(
  2230.         THIS_
  2231.         OUT PULONG Level
  2232.         ) PURE;
  2233.     STDMETHOD(SetCodeLevel)(
  2234.         THIS_
  2235.         IN ULONG Level
  2236.         ) PURE;
  2237.     // Gets and sets engine control flags.
  2238.     // These methods are reentrant.
  2239.     STDMETHOD(GetEngineOptions)(
  2240.         THIS_
  2241.         OUT PULONG Options
  2242.         ) PURE;
  2243.     STDMETHOD(AddEngineOptions)(
  2244.         THIS_
  2245.         IN ULONG Options
  2246.         ) PURE;
  2247.     STDMETHOD(RemoveEngineOptions)(
  2248.         THIS_
  2249.         IN ULONG Options
  2250.         ) PURE;
  2251.     STDMETHOD(SetEngineOptions)(
  2252.         THIS_
  2253.         IN ULONG Options
  2254.         ) PURE;
  2255.     
  2256.     // Gets and sets control values for
  2257.     // handling system error events.
  2258.     // If the system error level is less
  2259.     // than or equal to the given levels
  2260.     // the error may be displayed and
  2261.     // the default break for the event
  2262.     // may be set.
  2263.     STDMETHOD(GetSystemErrorControl)(
  2264.         THIS_
  2265.         OUT PULONG OutputLevel,
  2266.         OUT PULONG BreakLevel
  2267.         ) PURE;
  2268.     STDMETHOD(SetSystemErrorControl)(
  2269.         THIS_
  2270.         IN ULONG OutputLevel,
  2271.         IN ULONG BreakLevel
  2272.         ) PURE;
  2273.     
  2274.     // The command processor supports simple
  2275.     // string replacement macros in Evaluate and
  2276.     // Execute.  There are currently ten macro
  2277.     // slots available.  Slots 0-9 map to
  2278.     // the command invocations $u0-$u9.
  2279.     STDMETHOD(GetTextMacro)(
  2280.         THIS_
  2281.         IN ULONG Slot,
  2282.         OUT OPTIONAL PSTR Buffer,
  2283.         IN ULONG BufferSize,
  2284.         OUT OPTIONAL PULONG MacroSize
  2285.         ) PURE;
  2286.     STDMETHOD(SetTextMacro)(
  2287.         THIS_
  2288.         IN ULONG Slot,
  2289.         IN PCSTR Macro
  2290.         ) PURE;
  2291.     
  2292.     // Controls the default number radix used
  2293.     // in expressions and commands.
  2294.     STDMETHOD(GetRadix)(
  2295.         THIS_
  2296.         OUT PULONG Radix
  2297.         ) PURE;
  2298.     STDMETHOD(SetRadix)(
  2299.         THIS_
  2300.         IN ULONG Radix
  2301.         ) PURE;
  2302.     // Evaluates the given expression string and
  2303.     // returns the resulting value.
  2304.     // If DesiredType is DEBUG_VALUE_INVALID then
  2305.     // the natural type is used.
  2306.     // RemainderIndex, if provided, is set to the index
  2307.     // of the first character in the input string that was
  2308.     // not used when evaluating the expression.
  2309.     STDMETHOD(Evaluate)(
  2310.         THIS_
  2311.         IN PCSTR Expression,
  2312.         IN ULONG DesiredType,
  2313.         OUT PDEBUG_VALUE Value,
  2314.         OUT OPTIONAL PULONG RemainderIndex
  2315.         ) PURE;
  2316.     // Attempts to convert the input value to a value
  2317.     // of the requested type in the output value.
  2318.     // Conversions can fail if no conversion exists.
  2319.     // Successful conversions may be lossy.
  2320.     STDMETHOD(CoerceValue)(
  2321.         THIS_
  2322.         IN PDEBUG_VALUE In,
  2323.         IN ULONG OutType,
  2324.         OUT PDEBUG_VALUE Out
  2325.         ) PURE;
  2326.     STDMETHOD(CoerceValues)(
  2327.         THIS_
  2328.         IN ULONG Count,
  2329.         IN /* size_is(Count) */ PDEBUG_VALUE In,
  2330.         IN /* size_is(Count) */ PULONG OutTypes,
  2331.         OUT /* size_is(Count) */ PDEBUG_VALUE Out
  2332.         ) PURE;
  2333.     
  2334.     // Executes the given command string.
  2335.     // If the string has multiple commands
  2336.     // Execute will not return until all
  2337.     // of them have been executed.  If this
  2338.     // requires waiting for the debuggee to
  2339.     // execute an internal wait will be done
  2340.     // so Execute can take an arbitrary amount
  2341.     // of time.
  2342.     STDMETHOD(Execute)(
  2343.         THIS_
  2344.         IN ULONG OutputControl,
  2345.         IN PCSTR Command,
  2346.         IN ULONG Flags
  2347.         ) PURE;
  2348.     // Executes the given command file by
  2349.     // reading a line at a time and processing
  2350.     // it with Execute.
  2351.     STDMETHOD(ExecuteCommandFile)(
  2352.         THIS_
  2353.         IN ULONG OutputControl,
  2354.         IN PCSTR CommandFile,
  2355.         IN ULONG Flags
  2356.         ) PURE;
  2357.         
  2358.     // Breakpoint interfaces are described
  2359.     // elsewhere in this section.
  2360.     STDMETHOD(GetNumberBreakpoints)(
  2361.         THIS_
  2362.         OUT PULONG Number
  2363.         ) PURE;
  2364.     // It is possible for this retrieval function to
  2365.     // fail even with an index within the number of
  2366.     // existing breakpoints if the breakpoint is
  2367.     // a private breakpoint.
  2368.     STDMETHOD(GetBreakpointByIndex)(
  2369.         THIS_
  2370.         IN ULONG Index,
  2371.         OUT PDEBUG_BREAKPOINT* Bp
  2372.         ) PURE;
  2373.     STDMETHOD(GetBreakpointById)(
  2374.         THIS_
  2375.         IN ULONG Id,
  2376.         OUT PDEBUG_BREAKPOINT* Bp
  2377.         ) PURE;
  2378.     // If Ids is non-NULL the Count breakpoints
  2379.     // referred to in the Ids array are returned,
  2380.     // otherwise breakpoints from index Start to
  2381.     // Start + Count  1 are returned.
  2382.     STDMETHOD(GetBreakpointParameters)(
  2383.         THIS_
  2384.         IN ULONG Count,
  2385.         IN OPTIONAL /* size_is(Count) */ PULONG Ids,
  2386.         IN ULONG Start,
  2387.         OUT /* size_is(Count) */ PDEBUG_BREAKPOINT_PARAMETERS Params
  2388.         ) PURE;
  2389.     // Breakpoints are created empty and disabled.
  2390.     // When their parameters have been set they
  2391.     // should be enabled by setting the ENABLE flag.
  2392.     // If DesiredId is DEBUG_ANY_ID then the
  2393.     // engine picks an unused ID.  If DesiredId
  2394.     // is any other number the engine attempts
  2395.     // to use the given ID for the breakpoint.
  2396.     // If another breakpoint exists with that ID
  2397.     // the call will fail.
  2398.     STDMETHOD(AddBreakpoint)(
  2399.         THIS_
  2400.         IN ULONG Type,
  2401.         IN ULONG DesiredId,
  2402.         OUT PDEBUG_BREAKPOINT* Bp
  2403.         ) PURE;
  2404.     // Breakpoint interface is invalid after this call.
  2405.     STDMETHOD(RemoveBreakpoint)(
  2406.         THIS_
  2407.         IN PDEBUG_BREAKPOINT Bp
  2408.         ) PURE;
  2409.     // Control and use extension DLLs.
  2410.     STDMETHOD(AddExtension)(
  2411.         THIS_
  2412.         IN PCSTR Path,
  2413.         IN ULONG Flags,
  2414.         OUT PULONG64 Handle
  2415.         ) PURE;
  2416.     STDMETHOD(RemoveExtension)(
  2417.         THIS_
  2418.         IN ULONG64 Handle
  2419.         ) PURE;
  2420.     STDMETHOD(GetExtensionByPath)(
  2421.         THIS_
  2422.         IN PCSTR Path,
  2423.         OUT PULONG64 Handle
  2424.         ) PURE;
  2425.     // If Handle is zero the extension
  2426.     // chain is walked searching for the
  2427.     // function.
  2428.     STDMETHOD(CallExtension)(
  2429.         THIS_
  2430.         IN ULONG64 Handle,
  2431.         IN PCSTR Function,
  2432.         IN OPTIONAL PCSTR Arguments
  2433.         ) PURE;
  2434.     // GetExtensionFunction works like
  2435.     // GetProcAddress on extension DLLs
  2436.     // to allow raw function-call-level
  2437.     // interaction with extension DLLs.
  2438.     // Such functions do not need to
  2439.     // follow the standard extension prototype
  2440.     // if they are not going to be called
  2441.     // through the text extension interface.
  2442.     // _EFN_ is automatically prepended to
  2443.     // the name string given.
  2444.     // This function cannot be called remotely.
  2445.     STDMETHOD(GetExtensionFunction)(
  2446.         THIS_
  2447.         IN ULONG64 Handle,
  2448.         IN PCSTR FuncName,
  2449.         OUT FARPROC* Function
  2450.         ) PURE;
  2451.     // These methods return alternate
  2452.     // extension interfaces in order to allow
  2453.     // interface-style extension DLLs to mix in
  2454.     // older extension calls.
  2455.     // Structure sizes must be initialized before
  2456.     // the call.
  2457.     // These methods cannot be called remotely.
  2458.     STDMETHOD(GetWindbgExtensionApis32)(
  2459.         THIS_
  2460.         IN OUT PWINDBG_EXTENSION_APIS32 Api
  2461.         ) PURE;
  2462.     STDMETHOD(GetWindbgExtensionApis64)(
  2463.         THIS_
  2464.         IN OUT PWINDBG_EXTENSION_APIS64 Api
  2465.         ) PURE;
  2466.     // The engine provides a simple mechanism
  2467.     // to filter common events.  Arbitrarily complicated
  2468.     // filtering can be done by registering event callbacks
  2469.     // but simple event filtering only requires
  2470.     // setting the options of one of the predefined
  2471.     // event filters.
  2472.     // Simple event filters are either for specific
  2473.     // events and therefore have an enumerant or
  2474.     // they are for an exception and are based on
  2475.     // the exceptions code.  Exception filters
  2476.     // are further divided into exceptions specially
  2477.     // handled by the engine, which is a fixed set,
  2478.     // and arbitrary exceptions.
  2479.     // All three groups of filters are indexed together
  2480.     // with the specific filters first, then the specific
  2481.     // exception filters and finally the arbitrary
  2482.     // exception filters.
  2483.     // The first specific exception is the default
  2484.     // exception.  If an exception event occurs for
  2485.     // an exception without settings the default
  2486.     // exception settings are used.
  2487.     STDMETHOD(GetNumberEventFilters)(
  2488.         THIS_
  2489.         OUT PULONG SpecificEvents,
  2490.         OUT PULONG SpecificExceptions,
  2491.         OUT PULONG ArbitraryExceptions
  2492.         ) PURE;
  2493.     // Some filters have descriptive text associated with them.
  2494.     STDMETHOD(GetEventFilterText)(
  2495.         THIS_
  2496.         IN ULONG Index,
  2497.         OUT OPTIONAL PSTR Buffer,
  2498.         IN ULONG BufferSize,
  2499.         OUT OPTIONAL PULONG TextSize
  2500.         ) PURE;
  2501.     // All filters support executing a command when the
  2502.     // event occurs.
  2503.     STDMETHOD(GetEventFilterCommand)(
  2504.         THIS_
  2505.         IN ULONG Index,
  2506.         OUT OPTIONAL PSTR Buffer,
  2507.         IN ULONG BufferSize,
  2508.         OUT OPTIONAL PULONG CommandSize
  2509.         ) PURE;
  2510.     STDMETHOD(SetEventFilterCommand)(
  2511.         THIS_
  2512.         IN ULONG Index,
  2513.         IN PCSTR Command
  2514.         ) PURE;
  2515.     STDMETHOD(GetSpecificFilterParameters)(
  2516.         THIS_
  2517.         IN ULONG Start,
  2518.         IN ULONG Count,
  2519.         OUT /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
  2520.         ) PURE;
  2521.     STDMETHOD(SetSpecificFilterParameters)(
  2522.         THIS_
  2523.         IN ULONG Start,
  2524.         IN ULONG Count,
  2525.         IN /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
  2526.         ) PURE;
  2527.     // Some specific filters have arguments to further
  2528.     // qualify their operation.
  2529.     STDMETHOD(GetSpecificFilterArgument)(
  2530.         THIS_
  2531.         IN ULONG Index,
  2532.         OUT OPTIONAL PSTR Buffer,
  2533.         IN ULONG BufferSize,
  2534.         OUT OPTIONAL PULONG ArgumentSize
  2535.         ) PURE;
  2536.     STDMETHOD(SetSpecificFilterArgument)(
  2537.         THIS_
  2538.         IN ULONG Index,
  2539.         IN PCSTR Argument
  2540.         ) PURE;
  2541.     // If Codes is non-NULL Start is ignored.
  2542.     STDMETHOD(GetExceptionFilterParameters)(
  2543.         THIS_
  2544.         IN ULONG Count,
  2545.         IN OPTIONAL /* size_is(Count) */ PULONG Codes,
  2546.         IN ULONG Start,
  2547.         OUT /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
  2548.         ) PURE;
  2549.     // The codes in the parameter data control the application
  2550.     // of the parameter data.  If a code is not already in
  2551.     // the set of filters it is added.  If the ExecutionOption
  2552.     // for a code is REMOVE then the filter is removed.
  2553.     // Specific exception filters cannot be removed.
  2554.     STDMETHOD(SetExceptionFilterParameters)(
  2555.         THIS_
  2556.         IN ULONG Count,
  2557.         IN /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
  2558.         ) PURE;
  2559.     // Exception filters support an additional command for
  2560.     // second-chance events.
  2561.     STDMETHOD(GetExceptionFilterSecondCommand)(
  2562.         THIS_
  2563.         IN ULONG Index,
  2564.         OUT OPTIONAL PSTR Buffer,
  2565.         IN ULONG BufferSize,
  2566.         OUT OPTIONAL PULONG CommandSize
  2567.         ) PURE;
  2568.     STDMETHOD(SetExceptionFilterSecondCommand)(
  2569.         THIS_
  2570.         IN ULONG Index,
  2571.         IN PCSTR Command
  2572.         ) PURE;
  2573.     // Yields processing to the engine until
  2574.     // an event occurs.  This method may
  2575.     // only be called by the thread that started
  2576.     // the debug session.
  2577.     // When an event occurs the engine carries
  2578.     // out all event processing such as calling
  2579.     // callbacks.
  2580.     // If the callbacks indicate that execution should
  2581.     // break the wait will return, otherwise it
  2582.     // goes back to waiting for a new event.
  2583.     // If the timeout expires, S_FALSE is returned.
  2584.     // The timeout is not currently supported for
  2585.     // kernel debugging.
  2586.     STDMETHOD(WaitForEvent)(
  2587.         THIS_
  2588.         IN ULONG Flags,
  2589.         IN ULONG Timeout
  2590.         ) PURE;
  2591.     // Retrieves information about the last event that occurred.
  2592.     // EventType is one of the event callback mask bits.
  2593.     // ExtraInformation contains additional event-specific
  2594.     // information.  Not all events have additional information.
  2595.     STDMETHOD(GetLastEventInformation)(
  2596.         THIS_
  2597.         OUT PULONG Type,
  2598.         OUT PULONG ProcessId,
  2599.         OUT PULONG ThreadId,
  2600.         OUT OPTIONAL PVOID ExtraInformation,
  2601.         IN ULONG ExtraInformationSize,
  2602.         OUT OPTIONAL PULONG ExtraInformationUsed,
  2603.         OUT OPTIONAL PSTR Description,
  2604.         IN ULONG DescriptionSize,
  2605.         OUT OPTIONAL PULONG DescriptionUsed
  2606.         ) PURE;
  2607. };
  2608. // OutputTextReplacements flags.
  2609. #define DEBUG_OUT_TEXT_REPL_DEFAULT 0x00000000
  2610. #undef INTERFACE
  2611. #define INTERFACE IDebugControl2
  2612. DECLARE_INTERFACE_(IDebugControl2, IUnknown)
  2613. {
  2614.     // IUnknown.
  2615.     STDMETHOD(QueryInterface)(
  2616.         THIS_
  2617.         IN REFIID InterfaceId,
  2618.         OUT PVOID* Interface
  2619.         ) PURE;
  2620.     STDMETHOD_(ULONG, AddRef)(
  2621.         THIS
  2622.         ) PURE;
  2623.     STDMETHOD_(ULONG, Release)(
  2624.         THIS
  2625.         ) PURE;
  2626.     // IDebugControl.
  2627.     
  2628.     // Checks for a user interrupt, such a Ctrl-C
  2629.     // or stop button.
  2630.     // This method is reentrant.
  2631.     STDMETHOD(GetInterrupt)(
  2632.         THIS
  2633.         ) PURE;
  2634.     // Registers a user interrupt.
  2635.     // This method is reentrant.
  2636.     STDMETHOD(SetInterrupt)(
  2637.         THIS_
  2638.         IN ULONG Flags
  2639.         ) PURE;
  2640.     // Interrupting a user-mode process requires
  2641.     // access to some system resources that the
  2642.     // process may hold itself, preventing the
  2643.     // interrupt from occurring.  The engine
  2644.     // will time-out pending interrupt requests
  2645.     // and simulate an interrupt if necessary.
  2646.     // These methods control the interrupt timeout.
  2647.     STDMETHOD(GetInterruptTimeout)(
  2648.         THIS_
  2649.         OUT PULONG Seconds
  2650.         ) PURE;
  2651.     STDMETHOD(SetInterruptTimeout)(
  2652.         THIS_
  2653.         IN ULONG Seconds
  2654.         ) PURE;
  2655.     STDMETHOD(GetLogFile)(
  2656.         THIS_
  2657.         OUT OPTIONAL PSTR Buffer,
  2658.         IN ULONG BufferSize,
  2659.         OUT OPTIONAL PULONG FileSize,
  2660.         OUT PBOOL Append
  2661.         ) PURE;
  2662.     // Opens a log file which collects all
  2663.     // output.  Output from every client except
  2664.     // those that explicitly disable logging
  2665.     // goes into the log.
  2666.     // Opening a log file closes any log file
  2667.     // already open.
  2668.     STDMETHOD(OpenLogFile)(
  2669.         THIS_
  2670.         IN PCSTR File,
  2671.         IN BOOL Append
  2672.         ) PURE;
  2673.     STDMETHOD(CloseLogFile)(
  2674.         THIS
  2675.         ) PURE;
  2676.     // Controls what output is logged.
  2677.     STDMETHOD(GetLogMask)(
  2678.         THIS_
  2679.         OUT PULONG Mask
  2680.         ) PURE;
  2681.     STDMETHOD(SetLogMask)(
  2682.         THIS_
  2683.         IN ULONG Mask
  2684.         ) PURE;
  2685.             
  2686.     // Input requests input from all clients.
  2687.     // The first input that is returned is used
  2688.     // to satisfy the call.  Other returned
  2689.     // input is discarded.
  2690.     STDMETHOD(Input)(
  2691.         THIS_
  2692.         OUT PSTR Buffer,
  2693.         IN ULONG BufferSize,
  2694.         OUT OPTIONAL PULONG InputSize
  2695.         ) PURE;
  2696.     // This method is used by clients to return
  2697.     // input when it is available.  It will
  2698.     // return S_OK if the input is used to
  2699.     // satisfy an Input call and S_FALSE if
  2700.     // the input is ignored.
  2701.     // This method is reentrant.
  2702.     STDMETHOD(ReturnInput)(
  2703.         THIS_
  2704.         IN PCSTR Buffer
  2705.         ) PURE;
  2706.     
  2707.     // Sends output through clients
  2708.     // output callbacks if the mask is allowed
  2709.     // by the current output control mask and
  2710.     // according to the output distribution
  2711.     // settings.
  2712.     STDMETHODV(Output)(
  2713.         THIS_
  2714.         IN ULONG Mask,
  2715.         IN PCSTR Format,
  2716.         ...
  2717.         ) PURE;
  2718.     STDMETHOD(OutputVaList)(
  2719.         THIS_
  2720.         IN ULONG Mask,
  2721.         IN PCSTR Format,
  2722.         IN va_list Args
  2723.         ) PURE;
  2724.     // The following methods allow direct control
  2725.     // over the distribution of the given output
  2726.     // for situations where something other than
  2727.     // the default is desired.  These methods require
  2728.     // extra work in the engine so they should
  2729.     // only be used when necessary.
  2730.     STDMETHODV(ControlledOutput)(
  2731.         THIS_
  2732.         IN ULONG OutputControl,
  2733.         IN ULONG Mask,
  2734.         IN PCSTR Format,
  2735.         ...
  2736.         ) PURE;
  2737.     STDMETHOD(ControlledOutputVaList)(
  2738.         THIS_
  2739.         IN ULONG OutputControl,
  2740.         IN ULONG Mask,
  2741.         IN PCSTR Format,
  2742.         IN va_list Args
  2743.         ) PURE;
  2744.             
  2745.     // Displays the standard command-line prompt
  2746.     // followed by the given output.  If Format
  2747.     // is NULL no additional output is produced.
  2748.     // Output is produced under the
  2749.     // DEBUG_OUTPUT_PROMPT mask.
  2750.     // This method only outputs the prompt; it
  2751.     // does not get input.
  2752.     STDMETHODV(OutputPrompt)(
  2753.         THIS_
  2754.         IN ULONG OutputControl,
  2755.         IN OPTIONAL PCSTR Format,
  2756.         ...
  2757.         ) PURE;
  2758.     STDMETHOD(OutputPromptVaList)(
  2759.         THIS_
  2760.         IN ULONG OutputControl,
  2761.         IN OPTIONAL PCSTR Format,
  2762.         IN va_list Args
  2763.         ) PURE;
  2764.     // Gets the text that would be displayed by OutputPrompt.
  2765.     STDMETHOD(GetPromptText)(
  2766.         THIS_
  2767.         OUT OPTIONAL PSTR Buffer,
  2768.         IN ULONG BufferSize,
  2769.         OUT OPTIONAL PULONG TextSize
  2770.         ) PURE;
  2771.     // Outputs information about the current
  2772.     // debuggee state such as a register
  2773.     // summary, disassembly at the current PC,
  2774.     // closest symbol and others.
  2775.     // Uses the line prefix.
  2776.     STDMETHOD(OutputCurrentState)(
  2777.         THIS_
  2778.         IN ULONG OutputControl,
  2779.         IN ULONG Flags
  2780.         ) PURE;
  2781.         
  2782.     // Outputs the debugger and extension version
  2783.     // information.  This method is reentrant.
  2784.     // Uses the line prefix.
  2785.     STDMETHOD(OutputVersionInformation)(
  2786.         THIS_
  2787.         IN ULONG OutputControl
  2788.         ) PURE;
  2789.     // In user-mode debugging sessions the
  2790.     // engine will set an event when
  2791.     // exceptions are continued.  This can
  2792.     // be used to synchronize other processes
  2793.     // with the debuggers handling of events.
  2794.     // For example, this is used to support
  2795.     // the e argument to ntsd.
  2796.     STDMETHOD(GetNotifyEventHandle)(
  2797.         THIS_
  2798.         OUT PULONG64 Handle
  2799.         ) PURE;
  2800.     STDMETHOD(SetNotifyEventHandle)(
  2801.         THIS_
  2802.         IN ULONG64 Handle
  2803.         ) PURE;
  2804.     STDMETHOD(Assemble)(
  2805.         THIS_
  2806.         IN ULONG64 Offset,
  2807.         IN PCSTR Instr,
  2808.         OUT PULONG64 EndOffset
  2809.         ) PURE;
  2810.     STDMETHOD(Disassemble)(
  2811.         THIS_
  2812.         IN ULONG64 Offset,
  2813.         IN ULONG Flags,
  2814.         OUT OPTIONAL PSTR Buffer,
  2815.         IN ULONG BufferSize,
  2816.         OUT OPTIONAL PULONG DisassemblySize,
  2817.         OUT PULONG64 EndOffset
  2818.         ) PURE;
  2819.     // Returns the value of the effective address
  2820.     // computed for the last Disassemble, if there
  2821.     // was one.
  2822.     STDMETHOD(GetDisassembleEffectiveOffset)(
  2823.         THIS_
  2824.         OUT PULONG64 Offset
  2825.         ) PURE;
  2826.     // Uses the line prefix if necessary.
  2827.     STDMETHOD(OutputDisassembly)(
  2828.         THIS_
  2829.         IN ULONG OutputControl,
  2830.         IN ULONG64 Offset,
  2831.         IN ULONG Flags,
  2832.         OUT PULONG64 EndOffset
  2833.         ) PURE;
  2834.     // Produces multiple lines of disassembly output.
  2835.     // There will be PreviousLines of disassembly before
  2836.     // the given offset if a valid disassembly exists.
  2837.     // In all, there will be TotalLines of output produced.
  2838.     // The first and last line offsets are returned
  2839.     // specially and all lines offsets can be retrieved
  2840.     // through LineOffsets.  LineOffsets will contain
  2841.     // offsets for each line where disassembly started.
  2842.     // When disassembly of a single instruction takes
  2843.     // multiple lines the initial offset will be followed
  2844.     // by DEBUG_INVALID_OFFSET.
  2845.     // Uses the line prefix.
  2846.     STDMETHOD(OutputDisassemblyLines)(
  2847.         THIS_
  2848.         IN ULONG OutputControl,
  2849.         IN ULONG PreviousLines,
  2850.         IN ULONG TotalLines,
  2851.         IN ULONG64 Offset,
  2852.         IN ULONG Flags,
  2853.         OUT OPTIONAL PULONG OffsetLine,
  2854.         OUT OPTIONAL PULONG64 StartOffset,
  2855.         OUT OPTIONAL PULONG64 EndOffset,
  2856.         OUT OPTIONAL /* size_is(TotalLines) */ PULONG64 LineOffsets
  2857.         ) PURE;
  2858.     // Returns the offset of the start of
  2859.     // the instruction thats the given
  2860.     // delta away from the instruction
  2861.     // at the initial offset.
  2862.     // This routine does not check for
  2863.     // validity of the instruction or
  2864.     // the memory containing it.
  2865.     STDMETHOD(GetNearInstruction)(
  2866.         THIS_
  2867.         IN ULONG64 Offset,
  2868.         IN LONG Delta,
  2869.         OUT PULONG64 NearOffset
  2870.         ) PURE;
  2871.     // Offsets can be passed in as zero to use the current
  2872.     // thread state.
  2873.     STDMETHOD(GetStackTrace)(
  2874.         THIS_
  2875.         IN ULONG64 FrameOffset,
  2876.         IN ULONG64 StackOffset,
  2877.         IN ULONG64 InstructionOffset,
  2878.         OUT /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
  2879.         IN ULONG FramesSize,
  2880.         OUT OPTIONAL PULONG FramesFilled
  2881.         ) PURE;
  2882.     // Does a simple stack trace to determine
  2883.     // what the current return address is.
  2884.     STDMETHOD(GetReturnOffset)(
  2885.         THIS_
  2886.         OUT PULONG64 Offset
  2887.         ) PURE;
  2888.     // If Frames is NULL OutputStackTrace will
  2889.     // use GetStackTrace to get FramesSize frames
  2890.     // and then output them.  The current register
  2891.     // values for frame, stack and instruction offsets
  2892.     // are used.
  2893.     // Uses the line prefix.
  2894.     STDMETHOD(OutputStackTrace)(
  2895.         THIS_
  2896.         IN ULONG OutputControl,
  2897.         IN OPTIONAL /* size_is(FramesSize) */ PDEBUG_STACK_FRAME Frames,
  2898.         IN ULONG FramesSize,
  2899.         IN ULONG Flags
  2900.         ) PURE;
  2901.     
  2902.     // Returns information about the debuggee such
  2903.     // as user vs. kernel, dump vs. live, etc.
  2904.     STDMETHOD(GetDebuggeeType)(
  2905.         THIS_
  2906.         OUT PULONG Class,
  2907.         OUT PULONG Qualifier
  2908.         ) PURE;
  2909.     // Returns the type of physical processors in
  2910.     // the machine.
  2911.     // Returns one of the IMAGE_FILE_MACHINE values.
  2912.     STDMETHOD(GetActualProcessorType)(
  2913.         THIS_
  2914.         OUT PULONG Type
  2915.         ) PURE;
  2916.     // Returns the type of processor used in the
  2917.     // current processor context.
  2918.     STDMETHOD(GetExecutingProcessorType)(
  2919.         THIS_
  2920.         OUT PULONG Type
  2921.         ) PURE;
  2922.     // Query all the possible processor types that
  2923.     // may be encountered during this debug session.
  2924.     STDMETHOD(GetNumberPossibleExecutingProcessorTypes)(
  2925.         THIS_
  2926.         OUT PULONG Number
  2927.         ) PURE;
  2928.     STDMETHOD(GetPossibleExecutingProcessorTypes)(
  2929.         THIS_
  2930.         IN ULONG Start,
  2931.         IN ULONG Count,
  2932.         OUT /* size_is(Count) */ PULONG Types
  2933.         ) PURE;
  2934.     // Get the number of actual processors in
  2935.     // the machine.
  2936.     STDMETHOD(GetNumberProcessors)(
  2937.         THIS_
  2938.         OUT PULONG Number
  2939.         ) PURE;
  2940.     // PlatformId is one of the VER_PLATFORM values.
  2941.     // Major and minor are as given in the NT
  2942.     // kernel debugger protocol.
  2943.     // ServicePackString and ServicePackNumber indicate the
  2944.     // system service pack level.  ServicePackNumber is not
  2945.     // available in some sessions where the service pack level
  2946.     // is only expressed as a string.  The service pack information
  2947.     // will be empty if the system does not have a service pack
  2948.     // applied.
  2949.     // The build string is string information identifying the
  2950.     // particular build of the system.  The build string is
  2951.     // empty if the system has no particular identifying
  2952.     // information.
  2953.     STDMETHOD(GetSystemVersion)(
  2954.         THIS_
  2955.         OUT PULONG PlatformId,
  2956.         OUT PULONG Major,
  2957.         OUT PULONG Minor,
  2958.         OUT OPTIONAL PSTR ServicePackString,
  2959.         IN ULONG ServicePackStringSize,
  2960.         OUT OPTIONAL PULONG ServicePackStringUsed,
  2961.         OUT PULONG ServicePackNumber,
  2962.         OUT OPTIONAL PSTR BuildString,
  2963.         IN ULONG BuildStringSize,
  2964.         OUT OPTIONAL PULONG BuildStringUsed
  2965.         ) PURE;
  2966.     // Returns the page size for the currently executing
  2967.     // processor context.  The page size may vary between
  2968.     // processor types.
  2969.     STDMETHOD(GetPageSize)(
  2970.         THIS_
  2971.         OUT PULONG Size
  2972.         ) PURE;
  2973.     // Returns S_OK if the current processor context uses
  2974.     // 64-bit addresses, otherwise S_FALSE.
  2975.     STDMETHOD(IsPointer64Bit)(
  2976.         THIS
  2977.         ) PURE;
  2978.     // Reads the bugcheck data area and returns the
  2979.     // current contents.  This method only works
  2980.     // in kernel debugging sessions.
  2981.     STDMETHOD(ReadBugCheckData)(
  2982.         THIS_
  2983.         OUT PULONG Code,
  2984.         OUT PULONG64 Arg1,
  2985.         OUT PULONG64 Arg2,
  2986.         OUT PULONG64 Arg3,
  2987.         OUT PULONG64 Arg4
  2988.         ) PURE;
  2989.     // Query all the processor types supported by
  2990.     // the engine.  This is a complete list and is
  2991.     // not related to the machine running the engine
  2992.     // or the debuggee.
  2993.     STDMETHOD(GetNumberSupportedProcessorTypes)(
  2994.         THIS_
  2995.         OUT PULONG Number
  2996.         ) PURE;
  2997.     STDMETHOD(GetSupportedProcessorTypes)(
  2998.         THIS_
  2999.         IN ULONG Start,
  3000.         IN ULONG Count,
  3001.         OUT /* size_is(Count) */ PULONG Types
  3002.         ) PURE;
  3003.     // Returns a full, descriptive name and an
  3004.     // abbreviated name for a processor type.
  3005.     STDMETHOD(GetProcessorTypeNames)(
  3006.         THIS_
  3007.         IN ULONG Type,
  3008.         OUT OPTIONAL PSTR FullNameBuffer,
  3009.         IN ULONG FullNameBufferSize,
  3010.         OUT OPTIONAL PULONG FullNameSize,
  3011.         OUT OPTIONAL PSTR AbbrevNameBuffer,
  3012.         IN ULONG AbbrevNameBufferSize,
  3013.         OUT OPTIONAL PULONG AbbrevNameSize
  3014.         ) PURE;
  3015.                 
  3016.     // Gets and sets the type of processor to
  3017.     // use when doing things like setting
  3018.     // breakpoints, accessing registers,
  3019.     // getting stack traces and so on.
  3020.     STDMETHOD(GetEffectiveProcessorType)(
  3021.         THIS_
  3022.         OUT PULONG Type
  3023.         ) PURE;
  3024.     STDMETHOD(SetEffectiveProcessorType)(
  3025.         THIS_
  3026.         IN ULONG Type
  3027.         ) PURE;
  3028.     // Returns information about whether and how
  3029.     // the debuggee is running.  Status will
  3030.     // be GO if the debuggee is running and
  3031.     // BREAK if it isnt.
  3032.     // If no debuggee exists the status is
  3033.     // NO_DEBUGGEE.
  3034.     // This method is reentrant.
  3035.     STDMETHOD(GetExecutionStatus)(
  3036.         THIS_
  3037.         OUT PULONG Status
  3038.         ) PURE;
  3039.     // Changes the execution status of the
  3040.     // engine from stopped to running.
  3041.     // Status must be one of the go or step
  3042.     // status values.
  3043.     STDMETHOD(SetExecutionStatus)(
  3044.         THIS_
  3045.         IN ULONG Status
  3046.         ) PURE;
  3047.         
  3048.     // Controls what code interpretation level the debugger
  3049.     // runs at.  The debugger checks the code level when
  3050.     // deciding whether to step by a source line or
  3051.     // assembly instruction along with other related operations.
  3052.     STDMETHOD(GetCodeLevel)(
  3053.         THIS_
  3054.         OUT PULONG Level
  3055.         ) PURE;
  3056.     STDMETHOD(SetCodeLevel)(
  3057.         THIS_
  3058.         IN ULONG Level
  3059.         ) PURE;
  3060.     // Gets and sets engine control flags.
  3061.     // These methods are reentrant.
  3062.     STDMETHOD(GetEngineOptions)(
  3063.         THIS_
  3064.         OUT PULONG Options
  3065.         ) PURE;
  3066.     STDMETHOD(AddEngineOptions)(
  3067.         THIS_
  3068.         IN ULONG Options
  3069.         ) PURE;
  3070.     STDMETHOD(RemoveEngineOptions)(
  3071.         THIS_
  3072.         IN ULONG Options
  3073.         ) PURE;
  3074.     STDMETHOD(SetEngineOptions)(
  3075.         THIS_
  3076.         IN ULONG Options
  3077.         ) PURE;
  3078.     
  3079.     // Gets and sets control values for
  3080.     // handling system error events.
  3081.     // If the system error level is less
  3082.     // than or equal to the given levels
  3083.     // the error may be displayed and
  3084.     // the default break for the event
  3085.     // may be set.
  3086.     STDMETHOD(GetSystemErrorControl)(
  3087.         THIS_
  3088.         OUT PULONG OutputLevel,
  3089.         OUT PULONG BreakLevel
  3090.         ) PURE;
  3091.     STDMETHOD(SetSystemErrorControl)(
  3092.         THIS_
  3093.         IN ULONG OutputLevel,
  3094.         IN ULONG BreakLevel
  3095.         ) PURE;
  3096.     
  3097.     // The command processor supports simple
  3098.     // string replacement macros in Evaluate and
  3099.     // Execute.  There are currently ten macro
  3100.     // slots available.  Slots 0-9 map to
  3101.     // the command invocations $u0-$u9.
  3102.     STDMETHOD(GetTextMacro)(
  3103.         THIS_
  3104.         IN ULONG Slot,
  3105.         OUT OPTIONAL PSTR Buffer,
  3106.         IN ULONG BufferSize,
  3107.         OUT OPTIONAL PULONG MacroSize
  3108.         ) PURE;
  3109.     STDMETHOD(SetTextMacro)(
  3110.         THIS_
  3111.         IN ULONG Slot,
  3112.         IN PCSTR Macro
  3113.         ) PURE;
  3114.     
  3115.     // Controls the default number radix used
  3116.     // in expressions and commands.
  3117.     STDMETHOD(GetRadix)(
  3118.         THIS_
  3119.         OUT PULONG Radix
  3120.         ) PURE;
  3121.     STDMETHOD(SetRadix)(
  3122.         THIS_
  3123.         IN ULONG Radix
  3124.         ) PURE;
  3125.     // Evaluates the given expression string and
  3126.     // returns the resulting value.
  3127.     // If DesiredType is DEBUG_VALUE_INVALID then
  3128.     // the natural type is used.
  3129.     // RemainderIndex, if provided, is set to the index
  3130.     // of the first character in the input string that was
  3131.     // not used when evaluating the expression.
  3132.     STDMETHOD(Evaluate)(
  3133.         THIS_
  3134.         IN PCSTR Expression,
  3135.         IN ULONG DesiredType,
  3136.         OUT PDEBUG_VALUE Value,
  3137.         OUT OPTIONAL PULONG RemainderIndex
  3138.         ) PURE;
  3139.     // Attempts to convert the input value to a value
  3140.     // of the requested type in the output value.
  3141.     // Conversions can fail if no conversion exists.
  3142.     // Successful conversions may be lossy.
  3143.     STDMETHOD(CoerceValue)(
  3144.         THIS_
  3145.         IN PDEBUG_VALUE In,
  3146.         IN ULONG OutType,
  3147.         OUT PDEBUG_VALUE Out
  3148.         ) PURE;
  3149.     STDMETHOD(CoerceValues)(
  3150.         THIS_
  3151.         IN ULONG Count,
  3152.         IN /* size_is(Count) */ PDEBUG_VALUE In,
  3153.         IN /* size_is(Count) */ PULONG OutTypes,
  3154.         OUT /* size_is(Count) */ PDEBUG_VALUE Out
  3155.         ) PURE;
  3156.     
  3157.     // Executes the given command string.
  3158.     // If the string has multiple commands
  3159.     // Execute will not return until all
  3160.     // of them have been executed.  If this
  3161.     // requires waiting for the debuggee to
  3162.     // execute an internal wait will be done
  3163.     // so Execute can take an arbitrary amount
  3164.     // of time.
  3165.     STDMETHOD(Execute)(
  3166.         THIS_
  3167.         IN ULONG OutputControl,
  3168.         IN PCSTR Command,
  3169.         IN ULONG Flags
  3170.         ) PURE;
  3171.     // Executes the given command file by
  3172.     // reading a line at a time and processing
  3173.     // it with Execute.
  3174.     STDMETHOD(ExecuteCommandFile)(
  3175.         THIS_
  3176.         IN ULONG OutputControl,
  3177.         IN PCSTR CommandFile,
  3178.         IN ULONG Flags
  3179.         ) PURE;
  3180.         
  3181.     // Breakpoint interfaces are described
  3182.     // elsewhere in this section.
  3183.     STDMETHOD(GetNumberBreakpoints)(
  3184.         THIS_
  3185.         OUT PULONG Number
  3186.         ) PURE;
  3187.     // It is possible for this retrieval function to
  3188.     // fail even with an index within the number of
  3189.     // existing breakpoints if the breakpoint is
  3190.     // a private breakpoint.
  3191.     STDMETHOD(GetBreakpointByIndex)(
  3192.         THIS_
  3193.         IN ULONG Index,
  3194.         OUT PDEBUG_BREAKPOINT* Bp
  3195.         ) PURE;
  3196.     STDMETHOD(GetBreakpointById)(
  3197.         THIS_
  3198.         IN ULONG Id,
  3199.         OUT PDEBUG_BREAKPOINT* Bp
  3200.         ) PURE;
  3201.     // If Ids is non-NULL the Count breakpoints
  3202.     // referred to in the Ids array are returned,
  3203.     // otherwise breakpoints from index Start to
  3204.     // Start + Count  1 are returned.
  3205.     STDMETHOD(GetBreakpointParameters)(
  3206.         THIS_
  3207.         IN ULONG Count,
  3208.         IN OPTIONAL /* size_is(Count) */ PULONG Ids,
  3209.         IN ULONG Start,
  3210.         OUT /* size_is(Count) */ PDEBUG_BREAKPOINT_PARAMETERS Params
  3211.         ) PURE;
  3212.     // Breakpoints are created empty and disabled.
  3213.     // When their parameters have been set they
  3214.     // should be enabled by setting the ENABLE flag.
  3215.     // If DesiredId is DEBUG_ANY_ID then the
  3216.     // engine picks an unused ID.  If DesiredId
  3217.     // is any other number the engine attempts
  3218.     // to use the given ID for the breakpoint.
  3219.     // If another breakpoint exists with that ID
  3220.     // the call will fail.
  3221.     STDMETHOD(AddBreakpoint)(
  3222.         THIS_
  3223.         IN ULONG Type,
  3224.         IN ULONG DesiredId,
  3225.         OUT PDEBUG_BREAKPOINT* Bp
  3226.         ) PURE;
  3227.     // Breakpoint interface is invalid after this call.
  3228.     STDMETHOD(RemoveBreakpoint)(
  3229.         THIS_
  3230.         IN PDEBUG_BREAKPOINT Bp
  3231.         ) PURE;
  3232.     // Control and use extension DLLs.
  3233.     STDMETHOD(AddExtension)(
  3234.         THIS_
  3235.         IN PCSTR Path,
  3236.         IN ULONG Flags,
  3237.         OUT PULONG64 Handle
  3238.         ) PURE;
  3239.     STDMETHOD(RemoveExtension)(
  3240.         THIS_
  3241.         IN ULONG64 Handle
  3242.         ) PURE;
  3243.     STDMETHOD(GetExtensionByPath)(
  3244.         THIS_
  3245.         IN PCSTR Path,
  3246.         OUT PULONG64 Handle
  3247.         ) PURE;
  3248.     // If Handle is zero the extension
  3249.     // chain is walked searching for the
  3250.     // function.
  3251.     STDMETHOD(CallExtension)(
  3252.         THIS_
  3253.         IN ULONG64 Handle,
  3254.         IN PCSTR Function,
  3255.         IN OPTIONAL PCSTR Arguments
  3256.         ) PURE;
  3257.     // GetExtensionFunction works like
  3258.     // GetProcAddress on extension DLLs
  3259.     // to allow raw function-call-level
  3260.     // interaction with extension DLLs.
  3261.     // Such functions do not need to
  3262.     // follow the standard extension prototype
  3263.     // if they are not going to be called
  3264.     // through the text extension interface.
  3265.     // This function cannot be called remotely.
  3266.     STDMETHOD(GetExtensionFunction)(
  3267.         THIS_
  3268.         IN ULONG64 Handle,
  3269.         IN PCSTR FuncName,
  3270.         OUT FARPROC* Function
  3271.         ) PURE;
  3272.     // These methods return alternate
  3273.     // extension interfaces in order to allow
  3274.     // interface-style extension DLLs to mix in
  3275.     // older extension calls.
  3276.     // Structure sizes must be initialized before
  3277.     // the call.
  3278.     // These methods cannot be called remotely.
  3279.     STDMETHOD(GetWindbgExtensionApis32)(
  3280.         THIS_
  3281.         IN OUT PWINDBG_EXTENSION_APIS32 Api
  3282.         ) PURE;
  3283.     STDMETHOD(GetWindbgExtensionApis64)(