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

模拟服务器

开发平台:

C/C++

  1.         THIS_
  2.         IN OUT PWINDBG_EXTENSION_APIS64 Api
  3.         ) PURE;
  4.     // The engine provides a simple mechanism
  5.     // to filter common events.  Arbitrarily complicated
  6.     // filtering can be done by registering event callbacks
  7.     // but simple event filtering only requires
  8.     // setting the options of one of the predefined
  9.     // event filters.
  10.     // Simple event filters are either for specific
  11.     // events and therefore have an enumerant or
  12.     // they are for an exception and are based on
  13.     // the exceptions code.  Exception filters
  14.     // are further divided into exceptions specially
  15.     // handled by the engine, which is a fixed set,
  16.     // and arbitrary exceptions.
  17.     // All three groups of filters are indexed together
  18.     // with the specific filters first, then the specific
  19.     // exception filters and finally the arbitrary
  20.     // exception filters.
  21.     // The first specific exception is the default
  22.     // exception.  If an exception event occurs for
  23.     // an exception without settings the default
  24.     // exception settings are used.
  25.     STDMETHOD(GetNumberEventFilters)(
  26.         THIS_
  27.         OUT PULONG SpecificEvents,
  28.         OUT PULONG SpecificExceptions,
  29.         OUT PULONG ArbitraryExceptions
  30.         ) PURE;
  31.     // Some filters have descriptive text associated with them.
  32.     STDMETHOD(GetEventFilterText)(
  33.         THIS_
  34.         IN ULONG Index,
  35.         OUT OPTIONAL PSTR Buffer,
  36.         IN ULONG BufferSize,
  37.         OUT OPTIONAL PULONG TextSize
  38.         ) PURE;
  39.     // All filters support executing a command when the
  40.     // event occurs.
  41.     STDMETHOD(GetEventFilterCommand)(
  42.         THIS_
  43.         IN ULONG Index,
  44.         OUT OPTIONAL PSTR Buffer,
  45.         IN ULONG BufferSize,
  46.         OUT OPTIONAL PULONG CommandSize
  47.         ) PURE;
  48.     STDMETHOD(SetEventFilterCommand)(
  49.         THIS_
  50.         IN ULONG Index,
  51.         IN PCSTR Command
  52.         ) PURE;
  53.     STDMETHOD(GetSpecificFilterParameters)(
  54.         THIS_
  55.         IN ULONG Start,
  56.         IN ULONG Count,
  57.         OUT /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
  58.         ) PURE;
  59.     STDMETHOD(SetSpecificFilterParameters)(
  60.         THIS_
  61.         IN ULONG Start,
  62.         IN ULONG Count,
  63.         IN /* size_is(Count) */ PDEBUG_SPECIFIC_FILTER_PARAMETERS Params
  64.         ) PURE;
  65.     // Some specific filters have arguments to further
  66.     // qualify their operation.
  67.     STDMETHOD(GetSpecificFilterArgument)(
  68.         THIS_
  69.         IN ULONG Index,
  70.         OUT OPTIONAL PSTR Buffer,
  71.         IN ULONG BufferSize,
  72.         OUT OPTIONAL PULONG ArgumentSize
  73.         ) PURE;
  74.     STDMETHOD(SetSpecificFilterArgument)(
  75.         THIS_
  76.         IN ULONG Index,
  77.         IN PCSTR Argument
  78.         ) PURE;
  79.     // If Codes is non-NULL Start is ignored.
  80.     STDMETHOD(GetExceptionFilterParameters)(
  81.         THIS_
  82.         IN ULONG Count,
  83.         IN OPTIONAL /* size_is(Count) */ PULONG Codes,
  84.         IN ULONG Start,
  85.         OUT /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
  86.         ) PURE;
  87.     // The codes in the parameter data control the application
  88.     // of the parameter data.  If a code is not already in
  89.     // the set of filters it is added.  If the ExecutionOption
  90.     // for a code is REMOVE then the filter is removed.
  91.     // Specific exception filters cannot be removed.
  92.     STDMETHOD(SetExceptionFilterParameters)(
  93.         THIS_
  94.         IN ULONG Count,
  95.         IN /* size_is(Count) */ PDEBUG_EXCEPTION_FILTER_PARAMETERS Params
  96.         ) PURE;
  97.     // Exception filters support an additional command for
  98.     // second-chance events.
  99.     STDMETHOD(GetExceptionFilterSecondCommand)(
  100.         THIS_
  101.         IN ULONG Index,
  102.         OUT OPTIONAL PSTR Buffer,
  103.         IN ULONG BufferSize,
  104.         OUT OPTIONAL PULONG CommandSize
  105.         ) PURE;
  106.     STDMETHOD(SetExceptionFilterSecondCommand)(
  107.         THIS_
  108.         IN ULONG Index,
  109.         IN PCSTR Command
  110.         ) PURE;
  111.     // Yields processing to the engine until
  112.     // an event occurs.  This method may
  113.     // only be called by the thread that started
  114.     // the debug session.
  115.     // When an event occurs the engine carries
  116.     // out all event processing such as calling
  117.     // callbacks.
  118.     // If the callbacks indicate that execution should
  119.     // break the wait will return, otherwise it
  120.     // goes back to waiting for a new event.
  121.     // If the timeout expires, S_FALSE is returned.
  122.     // The timeout is not currently supported for
  123.     // kernel debugging.
  124.     STDMETHOD(WaitForEvent)(
  125.         THIS_
  126.         IN ULONG Flags,
  127.         IN ULONG Timeout
  128.         ) PURE;
  129.     // Retrieves information about the last event that occurred.
  130.     // EventType is one of the event callback mask bits.
  131.     // ExtraInformation contains additional event-specific
  132.     // information.  Not all events have additional information.
  133.     STDMETHOD(GetLastEventInformation)(
  134.         THIS_
  135.         OUT PULONG Type,
  136.         OUT PULONG ProcessId,
  137.         OUT PULONG ThreadId,
  138.         OUT OPTIONAL PVOID ExtraInformation,
  139.         IN ULONG ExtraInformationSize,
  140.         OUT OPTIONAL PULONG ExtraInformationUsed,
  141.         OUT OPTIONAL PSTR Description,
  142.         IN ULONG DescriptionSize,
  143.         OUT OPTIONAL PULONG DescriptionUsed
  144.         ) PURE;
  145.     // IDebugControl2.
  146.     STDMETHOD(GetCurrentTimeDate)(
  147.         THIS_
  148.         OUT PULONG TimeDate
  149.         ) PURE;
  150.     // Retrieves the number of seconds since the
  151.     // machine started running.
  152.     STDMETHOD(GetCurrentSystemUpTime)(
  153.         THIS_
  154.         OUT PULONG UpTime
  155.         ) PURE;
  156.     // If the current session is a dump session,
  157.     // retrieves any extended format information.
  158.     STDMETHOD(GetDumpFormatFlags)(
  159.         THIS_
  160.         OUT PULONG FormatFlags
  161.         ) PURE;
  162.     // The debugger has been enhanced to allow
  163.     // arbitrary text replacements in addition
  164.     // to the simple $u0-$u9 text macros.
  165.     // Text replacement takes a given source
  166.     // text in commands and converts it to the
  167.     // given destination text.  Replacements
  168.     // are named by their source text so that
  169.     // only one replacement for a source text
  170.     // string can exist.
  171.     STDMETHOD(GetNumberTextReplacements)(
  172.         THIS_
  173.         OUT PULONG NumRepl
  174.         ) PURE;
  175.     // If SrcText is non-NULL the replacement
  176.     // is looked up by source text, otherwise
  177.     // Index is used to get the Nth replacement.
  178.     STDMETHOD(GetTextReplacement)(
  179.         THIS_
  180.         IN OPTIONAL PCSTR SrcText,
  181.         IN ULONG Index,
  182.         OUT OPTIONAL PSTR SrcBuffer,
  183.         IN ULONG SrcBufferSize,
  184.         OUT OPTIONAL PULONG SrcSize,
  185.         OUT OPTIONAL PSTR DstBuffer,
  186.         IN ULONG DstBufferSize,
  187.         OUT OPTIONAL PULONG DstSize
  188.         ) PURE;
  189.     // Setting the destination text to
  190.     // NULL removes the alias.
  191.     STDMETHOD(SetTextReplacement)(
  192.         THIS_
  193.         IN PCSTR SrcText,
  194.         IN OPTIONAL PCSTR DstText
  195.         ) PURE;
  196.     STDMETHOD(RemoveTextReplacements)(
  197.         THIS
  198.         ) PURE;
  199.     // Outputs the complete list of current
  200.     // replacements.
  201.     STDMETHOD(OutputTextReplacements)(
  202.         THIS_
  203.         IN ULONG OutputControl,
  204.         IN ULONG Flags
  205.         ) PURE;
  206. };
  207. //----------------------------------------------------------------------------
  208. //
  209. // IDebugDataSpaces.
  210. //
  211. //----------------------------------------------------------------------------
  212. // Data space indices for callbacks and other methods.
  213. #define DEBUG_DATA_SPACE_VIRTUAL       0
  214. #define DEBUG_DATA_SPACE_PHYSICAL      1
  215. #define DEBUG_DATA_SPACE_CONTROL       2
  216. #define DEBUG_DATA_SPACE_IO            3
  217. #define DEBUG_DATA_SPACE_MSR           4
  218. #define DEBUG_DATA_SPACE_BUS_DATA      5
  219. #define DEBUG_DATA_SPACE_DEBUGGER_DATA 6
  220. // Count of data spaces.
  221. #define DEBUG_DATA_SPACE_COUNT         7
  222. // Indices for ReadDebuggerData interface
  223. #define DEBUG_DATA_KernBase                              24
  224. #define DEBUG_DATA_BreakpointWithStatusAddr              32
  225. #define DEBUG_DATA_SavedContextAddr                      40
  226. #define DEBUG_DATA_KiCallUserModeAddr                    56
  227. #define DEBUG_DATA_KeUserCallbackDispatcherAddr          64
  228. #define DEBUG_DATA_PsLoadedModuleListAddr                72
  229. #define DEBUG_DATA_PsActiveProcessHeadAddr               80
  230. #define DEBUG_DATA_PspCidTableAddr                       88
  231. #define DEBUG_DATA_ExpSystemResourcesListAddr            96
  232. #define DEBUG_DATA_ExpPagedPoolDescriptorAddr           104
  233. #define DEBUG_DATA_ExpNumberOfPagedPoolsAddr            112
  234. #define DEBUG_DATA_KeTimeIncrementAddr                  120
  235. #define DEBUG_DATA_KeBugCheckCallbackListHeadAddr       128
  236. #define DEBUG_DATA_KiBugcheckDataAddr                   136
  237. #define DEBUG_DATA_IopErrorLogListHeadAddr              144
  238. #define DEBUG_DATA_ObpRootDirectoryObjectAddr           152
  239. #define DEBUG_DATA_ObpTypeObjectTypeAddr                160
  240. #define DEBUG_DATA_MmSystemCacheStartAddr               168
  241. #define DEBUG_DATA_MmSystemCacheEndAddr                 176
  242. #define DEBUG_DATA_MmSystemCacheWsAddr                  184
  243. #define DEBUG_DATA_MmPfnDatabaseAddr                    192
  244. #define DEBUG_DATA_MmSystemPtesStartAddr                200
  245. #define DEBUG_DATA_MmSystemPtesEndAddr                  208
  246. #define DEBUG_DATA_MmSubsectionBaseAddr                 216
  247. #define DEBUG_DATA_MmNumberOfPagingFilesAddr            224
  248. #define DEBUG_DATA_MmLowestPhysicalPageAddr             232
  249. #define DEBUG_DATA_MmHighestPhysicalPageAddr            240
  250. #define DEBUG_DATA_MmNumberOfPhysicalPagesAddr          248
  251. #define DEBUG_DATA_MmMaximumNonPagedPoolInBytesAddr     256
  252. #define DEBUG_DATA_MmNonPagedSystemStartAddr            264
  253. #define DEBUG_DATA_MmNonPagedPoolStartAddr              272
  254. #define DEBUG_DATA_MmNonPagedPoolEndAddr                280
  255. #define DEBUG_DATA_MmPagedPoolStartAddr                 288
  256. #define DEBUG_DATA_MmPagedPoolEndAddr                   296
  257. #define DEBUG_DATA_MmPagedPoolInformationAddr           304
  258. #define DEBUG_DATA_MmPageSize                           312
  259. #define DEBUG_DATA_MmSizeOfPagedPoolInBytesAddr         320
  260. #define DEBUG_DATA_MmTotalCommitLimitAddr               328
  261. #define DEBUG_DATA_MmTotalCommittedPagesAddr            336
  262. #define DEBUG_DATA_MmSharedCommitAddr                   344
  263. #define DEBUG_DATA_MmDriverCommitAddr                   352
  264. #define DEBUG_DATA_MmProcessCommitAddr                  360
  265. #define DEBUG_DATA_MmPagedPoolCommitAddr                368
  266. #define DEBUG_DATA_MmExtendedCommitAddr                 376
  267. #define DEBUG_DATA_MmZeroedPageListHeadAddr             384
  268. #define DEBUG_DATA_MmFreePageListHeadAddr               392
  269. #define DEBUG_DATA_MmStandbyPageListHeadAddr            400
  270. #define DEBUG_DATA_MmModifiedPageListHeadAddr           408
  271. #define DEBUG_DATA_MmModifiedNoWritePageListHeadAddr    416
  272. #define DEBUG_DATA_MmAvailablePagesAddr                 424
  273. #define DEBUG_DATA_MmResidentAvailablePagesAddr         432
  274. #define DEBUG_DATA_PoolTrackTableAddr                   440
  275. #define DEBUG_DATA_NonPagedPoolDescriptorAddr           448
  276. #define DEBUG_DATA_MmHighestUserAddressAddr             456
  277. #define DEBUG_DATA_MmSystemRangeStartAddr               464
  278. #define DEBUG_DATA_MmUserProbeAddressAddr               472
  279. #define DEBUG_DATA_KdPrintCircularBufferAddr            480
  280. #define DEBUG_DATA_KdPrintCircularBufferEndAddr         488
  281. #define DEBUG_DATA_KdPrintWritePointerAddr              496
  282. #define DEBUG_DATA_KdPrintRolloverCountAddr             504
  283. #define DEBUG_DATA_MmLoadedUserImageListAddr            512
  284. #define DEBUG_DATA_NtBuildLabAddr                       520
  285. #define DEBUG_DATA_KiNormalSystemCall                   528
  286. #define DEBUG_DATA_KiProcessorBlockAddr                 536
  287. #define DEBUG_DATA_MmUnloadedDriversAddr                544
  288. #define DEBUG_DATA_MmLastUnloadedDriverAddr             552
  289. #define DEBUG_DATA_MmTriageActionTakenAddr              560
  290. #define DEBUG_DATA_MmSpecialPoolTagAddr                 568
  291. #define DEBUG_DATA_KernelVerifierAddr                   576
  292. #define DEBUG_DATA_MmVerifierDataAddr                   584
  293. #define DEBUG_DATA_MmAllocatedNonPagedPoolAddr          592
  294. #define DEBUG_DATA_MmPeakCommitmentAddr                 600
  295. #define DEBUG_DATA_MmTotalCommitLimitMaximumAddr        608
  296. #define DEBUG_DATA_CmNtCSDVersionAddr                   616
  297. #define DEBUG_DATA_MmPhysicalMemoryBlockAddr            624
  298. #define DEBUG_DATA_PaeEnabled                        100000
  299. #define DEBUG_DATA_SharedUserData                    100008
  300. //
  301. // Processor information structures.
  302. //
  303. typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_ALPHA
  304. {
  305.     ULONG Type;
  306.     ULONG Revision;
  307. } DEBUG_PROCESSOR_IDENTIFICATION_ALPHA, *PDEBUG_PROCESSOR_IDENTIFICATION_ALPHA;
  308. typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_AMD64
  309. {
  310.     ULONG Family;
  311.     ULONG Model;
  312.     ULONG Stepping;
  313.     CHAR  VendorString[16];
  314. } DEBUG_PROCESSOR_IDENTIFICATION_AMD64, *PDEBUG_PROCESSOR_IDENTIFICATION_AMD64;
  315. typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_IA64
  316. {
  317.     ULONG Model;
  318.     ULONG Revision;
  319.     ULONG Family;
  320.     ULONG ArchRev;
  321.     CHAR  VendorString[16];
  322. } DEBUG_PROCESSOR_IDENTIFICATION_IA64, *PDEBUG_PROCESSOR_IDENTIFICATION_IA64;
  323. typedef struct _DEBUG_PROCESSOR_IDENTIFICATION_X86
  324. {
  325.     ULONG Family;
  326.     ULONG Model;
  327.     ULONG Stepping;
  328.     CHAR  VendorString[16];
  329. } DEBUG_PROCESSOR_IDENTIFICATION_X86, *PDEBUG_PROCESSOR_IDENTIFICATION_X86;
  330. typedef union _DEBUG_PROCESSOR_IDENTIFICATION_ALL
  331. {
  332.     DEBUG_PROCESSOR_IDENTIFICATION_ALPHA Alpha;
  333.     DEBUG_PROCESSOR_IDENTIFICATION_AMD64 Amd64;
  334.     DEBUG_PROCESSOR_IDENTIFICATION_IA64  Ia64;
  335.     DEBUG_PROCESSOR_IDENTIFICATION_X86   X86;
  336. } DEBUG_PROCESSOR_IDENTIFICATION_ALL, *PDEBUG_PROCESSOR_IDENTIFICATION_ALL;
  337. // Indices for ReadProcessorSystemData.
  338. #define DEBUG_DATA_KPCR_OFFSET                          0
  339. #define DEBUG_DATA_KPRCB_OFFSET                         1
  340. #define DEBUG_DATA_KTHREAD_OFFSET                       2
  341. #define DEBUG_DATA_BASE_TRANSLATION_VIRTUAL_OFFSET      3
  342. #define DEBUG_DATA_PROCESSOR_IDENTIFICATION             4
  343. #undef INTERFACE
  344. #define INTERFACE IDebugDataSpaces
  345. DECLARE_INTERFACE_(IDebugDataSpaces, IUnknown)
  346. {
  347.     // IUnknown.
  348.     STDMETHOD(QueryInterface)(
  349.         THIS_
  350.         IN REFIID InterfaceId,
  351.         OUT PVOID* Interface
  352.         ) PURE;
  353.     STDMETHOD_(ULONG, AddRef)(
  354.         THIS
  355.         ) PURE;
  356.     STDMETHOD_(ULONG, Release)(
  357.         THIS
  358.         ) PURE;
  359.     // IDebugDataSpaces.
  360.     STDMETHOD(ReadVirtual)(
  361.         THIS_
  362.         IN ULONG64 Offset,
  363.         OUT PVOID Buffer,
  364.         IN ULONG BufferSize,
  365.         OUT OPTIONAL PULONG BytesRead
  366.         ) PURE;
  367.     STDMETHOD(WriteVirtual)(
  368.         THIS_
  369.         IN ULONG64 Offset,
  370.         IN PVOID Buffer,
  371.         IN ULONG BufferSize,
  372.         OUT OPTIONAL PULONG BytesWritten
  373.         ) PURE;
  374.     // SearchVirtual searches the given virtual
  375.     // address range for the given pattern.  PatternSize
  376.     // gives the byte length of the pattern and PatternGranularity
  377.     // controls the granularity of comparisons during
  378.     // the search.
  379.     // For example, a DWORD-granular search would
  380.     // use a pattern granularity of four to search by DWORD
  381.     // increments.
  382.     STDMETHOD(SearchVirtual)(
  383.         THIS_
  384.         IN ULONG64 Offset,
  385.         IN ULONG64 Length,
  386.         IN PVOID Pattern,
  387.         IN ULONG PatternSize,
  388.         IN ULONG PatternGranularity,
  389.         OUT PULONG64 MatchOffset
  390.         ) PURE;
  391.     // These methods are identical to Read/WriteVirtual
  392.     // except that they avoid the kernel virtual memory
  393.     // cache entirely and are therefore useful for reading
  394.     // virtual memory which is inherently volatile, such
  395.     // as memory-mapped device areas, without contaminating
  396.     // or invalidating the cache.
  397.     // In user-mode they are the same as Read/WriteVirtual.
  398.     STDMETHOD(ReadVirtualUncached)(
  399.         THIS_
  400.         IN ULONG64 Offset,
  401.         OUT PVOID Buffer,
  402.         IN ULONG BufferSize,
  403.         OUT OPTIONAL PULONG BytesRead
  404.         ) PURE;
  405.     STDMETHOD(WriteVirtualUncached)(
  406.         THIS_
  407.         IN ULONG64 Offset,
  408.         IN PVOID Buffer,
  409.         IN ULONG BufferSize,
  410.         OUT OPTIONAL PULONG BytesWritten
  411.         ) PURE;
  412.     // The following two methods are convenience
  413.     // methods for accessing pointer values.
  414.     // They automatically convert between native pointers
  415.     // and canonical 64-bit values as necessary.
  416.     // These routines stop at the first failure.
  417.     STDMETHOD(ReadPointersVirtual)(
  418.         THIS_
  419.         IN ULONG Count,
  420.         IN ULONG64 Offset,
  421.         OUT /* size_is(Count) */ PULONG64 Ptrs
  422.         ) PURE;
  423.     STDMETHOD(WritePointersVirtual)(
  424.         THIS_
  425.         IN ULONG Count,
  426.         IN ULONG64 Offset,
  427.         IN /* size_is(Count) */ PULONG64 Ptrs
  428.         ) PURE;
  429.     // All non-virtual data spaces are only
  430.     // available when kernel debugging.
  431.     STDMETHOD(ReadPhysical)(
  432.         THIS_
  433.         IN ULONG64 Offset,
  434.         OUT PVOID Buffer,
  435.         IN ULONG BufferSize,
  436.         OUT OPTIONAL PULONG BytesRead
  437.         ) PURE;
  438.     STDMETHOD(WritePhysical)(
  439.         THIS_
  440.         IN ULONG64 Offset,
  441.         IN PVOID Buffer,
  442.         IN ULONG BufferSize,
  443.         OUT OPTIONAL PULONG BytesWritten
  444.         ) PURE;
  445.     STDMETHOD(ReadControl)(
  446.         THIS_
  447.         IN ULONG Processor,
  448.         IN ULONG64 Offset,
  449.         OUT PVOID Buffer,
  450.         IN ULONG BufferSize,
  451.         OUT OPTIONAL PULONG BytesRead
  452.         ) PURE;
  453.     STDMETHOD(WriteControl)(
  454.         THIS_
  455.         IN ULONG Processor,
  456.         IN ULONG64 Offset,
  457.         IN PVOID Buffer,
  458.         IN ULONG BufferSize,
  459.         OUT OPTIONAL PULONG BytesWritten
  460.         ) PURE;
  461.     STDMETHOD(ReadIo)(
  462.         THIS_
  463.         IN ULONG InterfaceType,
  464.         IN ULONG BusNumber,
  465.         IN ULONG AddressSpace,
  466.         IN ULONG64 Offset,
  467.         OUT PVOID Buffer,
  468.         IN ULONG BufferSize,
  469.         OUT OPTIONAL PULONG BytesRead
  470.         ) PURE;
  471.     STDMETHOD(WriteIo)(
  472.         THIS_
  473.         IN ULONG InterfaceType,
  474.         IN ULONG BusNumber,
  475.         IN ULONG AddressSpace,
  476.         IN ULONG64 Offset,
  477.         IN PVOID Buffer,
  478.         IN ULONG BufferSize,
  479.         OUT OPTIONAL PULONG BytesWritten
  480.         ) PURE;
  481.     STDMETHOD(ReadMsr)(
  482.         THIS_
  483.         IN ULONG Msr,
  484.         OUT PULONG64 Value
  485.         ) PURE;
  486.     STDMETHOD(WriteMsr)(
  487.         THIS_
  488.         IN ULONG Msr,
  489.         IN ULONG64 Value
  490.         ) PURE;
  491.     STDMETHOD(ReadBusData)(
  492.         THIS_
  493.         IN ULONG BusDataType,
  494.         IN ULONG BusNumber,
  495.         IN ULONG SlotNumber,
  496.         IN ULONG Offset,
  497.         OUT PVOID Buffer,
  498.         IN ULONG BufferSize,
  499.         OUT OPTIONAL PULONG BytesRead
  500.         ) PURE;
  501.     STDMETHOD(WriteBusData)(
  502.         THIS_
  503.         IN ULONG BusDataType,
  504.         IN ULONG BusNumber,
  505.         IN ULONG SlotNumber,
  506.         IN ULONG Offset,
  507.         IN PVOID Buffer,
  508.         IN ULONG BufferSize,
  509.         OUT OPTIONAL PULONG BytesWritten
  510.         ) PURE;
  511.     STDMETHOD(CheckLowMemory)(
  512.         THIS
  513.         ) PURE;
  514.     STDMETHOD(ReadDebuggerData)(
  515.         THIS_
  516.         IN ULONG Index,
  517.         OUT PVOID Buffer,
  518.         IN ULONG BufferSize,
  519.         OUT OPTIONAL PULONG DataSize
  520.         ) PURE;
  521.     STDMETHOD(ReadProcessorSystemData)(
  522.         THIS_
  523.         IN ULONG Processor,
  524.         IN ULONG Index,
  525.         OUT PVOID Buffer,
  526.         IN ULONG BufferSize,
  527.         OUT OPTIONAL PULONG DataSize
  528.         ) PURE;
  529. };
  530. //
  531. // Handle data types and structures.
  532. //
  533. #define DEBUG_HANDLE_DATA_TYPE_BASIC        0
  534. #define DEBUG_HANDLE_DATA_TYPE_TYPE_NAME    1
  535. #define DEBUG_HANDLE_DATA_TYPE_OBJECT_NAME  2
  536. #define DEBUG_HANDLE_DATA_TYPE_HANDLE_COUNT 3
  537. typedef struct _DEBUG_HANDLE_DATA_BASIC
  538. {
  539.     ULONG TypeNameSize;
  540.     ULONG ObjectNameSize;
  541.     ULONG Attributes;
  542.     ULONG GrantedAccess;
  543.     ULONG HandleCount;
  544.     ULONG PointerCount;
  545. } DEBUG_HANDLE_DATA_BASIC, *PDEBUG_HANDLE_DATA_BASIC;
  546. #undef INTERFACE
  547. #define INTERFACE IDebugDataSpaces2
  548. DECLARE_INTERFACE_(IDebugDataSpaces2, IUnknown)
  549. {
  550.     // IUnknown.
  551.     STDMETHOD(QueryInterface)(
  552.         THIS_
  553.         IN REFIID InterfaceId,
  554.         OUT PVOID* Interface
  555.         ) PURE;
  556.     STDMETHOD_(ULONG, AddRef)(
  557.         THIS
  558.         ) PURE;
  559.     STDMETHOD_(ULONG, Release)(
  560.         THIS
  561.         ) PURE;
  562.     // IDebugDataSpaces.
  563.     STDMETHOD(ReadVirtual)(
  564.         THIS_
  565.         IN ULONG64 Offset,
  566.         OUT PVOID Buffer,
  567.         IN ULONG BufferSize,
  568.         OUT OPTIONAL PULONG BytesRead
  569.         ) PURE;
  570.     STDMETHOD(WriteVirtual)(
  571.         THIS_
  572.         IN ULONG64 Offset,
  573.         IN PVOID Buffer,
  574.         IN ULONG BufferSize,
  575.         OUT OPTIONAL PULONG BytesWritten
  576.         ) PURE;
  577.     // SearchVirtual searches the given virtual
  578.     // address range for the given pattern.  PatternSize
  579.     // gives the byte length of the pattern and PatternGranularity
  580.     // controls the granularity of comparisons during
  581.     // the search.
  582.     // For example, a DWORD-granular search would
  583.     // use a pattern granularity of four to search by DWORD
  584.     // increments.
  585.     STDMETHOD(SearchVirtual)(
  586.         THIS_
  587.         IN ULONG64 Offset,
  588.         IN ULONG64 Length,
  589.         IN PVOID Pattern,
  590.         IN ULONG PatternSize,
  591.         IN ULONG PatternGranularity,
  592.         OUT PULONG64 MatchOffset
  593.         ) PURE;
  594.     // These methods are identical to Read/WriteVirtual
  595.     // except that they avoid the kernel virtual memory
  596.     // cache entirely and are therefore useful for reading
  597.     // virtual memory which is inherently volatile, such
  598.     // as memory-mapped device areas, without contaminating
  599.     // or invalidating the cache.
  600.     // In user-mode they are the same as Read/WriteVirtual.
  601.     STDMETHOD(ReadVirtualUncached)(
  602.         THIS_
  603.         IN ULONG64 Offset,
  604.         OUT PVOID Buffer,
  605.         IN ULONG BufferSize,
  606.         OUT OPTIONAL PULONG BytesRead
  607.         ) PURE;
  608.     STDMETHOD(WriteVirtualUncached)(
  609.         THIS_
  610.         IN ULONG64 Offset,
  611.         IN PVOID Buffer,
  612.         IN ULONG BufferSize,
  613.         OUT OPTIONAL PULONG BytesWritten
  614.         ) PURE;
  615.     // The following two methods are convenience
  616.     // methods for accessing pointer values.
  617.     // They automatically convert between native pointers
  618.     // and canonical 64-bit values as necessary.
  619.     // These routines stop at the first failure.
  620.     STDMETHOD(ReadPointersVirtual)(
  621.         THIS_
  622.         IN ULONG Count,
  623.         IN ULONG64 Offset,
  624.         OUT /* size_is(Count) */ PULONG64 Ptrs
  625.         ) PURE;
  626.     STDMETHOD(WritePointersVirtual)(
  627.         THIS_
  628.         IN ULONG Count,
  629.         IN ULONG64 Offset,
  630.         IN /* size_is(Count) */ PULONG64 Ptrs
  631.         ) PURE;
  632.     // All non-virtual data spaces are only
  633.     // available when kernel debugging.
  634.     STDMETHOD(ReadPhysical)(
  635.         THIS_
  636.         IN ULONG64 Offset,
  637.         OUT PVOID Buffer,
  638.         IN ULONG BufferSize,
  639.         OUT OPTIONAL PULONG BytesRead
  640.         ) PURE;
  641.     STDMETHOD(WritePhysical)(
  642.         THIS_
  643.         IN ULONG64 Offset,
  644.         IN PVOID Buffer,
  645.         IN ULONG BufferSize,
  646.         OUT OPTIONAL PULONG BytesWritten
  647.         ) PURE;
  648.     STDMETHOD(ReadControl)(
  649.         THIS_
  650.         IN ULONG Processor,
  651.         IN ULONG64 Offset,
  652.         OUT PVOID Buffer,
  653.         IN ULONG BufferSize,
  654.         OUT OPTIONAL PULONG BytesRead
  655.         ) PURE;
  656.     STDMETHOD(WriteControl)(
  657.         THIS_
  658.         IN ULONG Processor,
  659.         IN ULONG64 Offset,
  660.         IN PVOID Buffer,
  661.         IN ULONG BufferSize,
  662.         OUT OPTIONAL PULONG BytesWritten
  663.         ) PURE;
  664.     STDMETHOD(ReadIo)(
  665.         THIS_
  666.         IN ULONG InterfaceType,
  667.         IN ULONG BusNumber,
  668.         IN ULONG AddressSpace,
  669.         IN ULONG64 Offset,
  670.         OUT PVOID Buffer,
  671.         IN ULONG BufferSize,
  672.         OUT OPTIONAL PULONG BytesRead
  673.         ) PURE;
  674.     STDMETHOD(WriteIo)(
  675.         THIS_
  676.         IN ULONG InterfaceType,
  677.         IN ULONG BusNumber,
  678.         IN ULONG AddressSpace,
  679.         IN ULONG64 Offset,
  680.         IN PVOID Buffer,
  681.         IN ULONG BufferSize,
  682.         OUT OPTIONAL PULONG BytesWritten
  683.         ) PURE;
  684.     STDMETHOD(ReadMsr)(
  685.         THIS_
  686.         IN ULONG Msr,
  687.         OUT PULONG64 Value
  688.         ) PURE;
  689.     STDMETHOD(WriteMsr)(
  690.         THIS_
  691.         IN ULONG Msr,
  692.         IN ULONG64 Value
  693.         ) PURE;
  694.     STDMETHOD(ReadBusData)(
  695.         THIS_
  696.         IN ULONG BusDataType,
  697.         IN ULONG BusNumber,
  698.         IN ULONG SlotNumber,
  699.         IN ULONG Offset,
  700.         OUT PVOID Buffer,
  701.         IN ULONG BufferSize,
  702.         OUT OPTIONAL PULONG BytesRead
  703.         ) PURE;
  704.     STDMETHOD(WriteBusData)(
  705.         THIS_
  706.         IN ULONG BusDataType,
  707.         IN ULONG BusNumber,
  708.         IN ULONG SlotNumber,
  709.         IN ULONG Offset,
  710.         IN PVOID Buffer,
  711.         IN ULONG BufferSize,
  712.         OUT OPTIONAL PULONG BytesWritten
  713.         ) PURE;
  714.     STDMETHOD(CheckLowMemory)(
  715.         THIS
  716.         ) PURE;
  717.     STDMETHOD(ReadDebuggerData)(
  718.         THIS_
  719.         IN ULONG Index,
  720.         OUT PVOID Buffer,
  721.         IN ULONG BufferSize,
  722.         OUT OPTIONAL PULONG DataSize
  723.         ) PURE;
  724.     STDMETHOD(ReadProcessorSystemData)(
  725.         THIS_
  726.         IN ULONG Processor,
  727.         IN ULONG Index,
  728.         OUT PVOID Buffer,
  729.         IN ULONG BufferSize,
  730.         OUT OPTIONAL PULONG DataSize
  731.         ) PURE;
  732.     // IDebugDataSpaces2.
  733.     STDMETHOD(VirtualToPhysical)(
  734.         THIS_
  735.         IN ULONG64 Virtual,
  736.         OUT PULONG64 Physical
  737.         ) PURE;
  738.     // Returns the physical addresses for the
  739.     // N levels of the systems paging structures.
  740.     // Level zero is the starting base physical
  741.     // address for virtual translations.
  742.     // Levels one-(N-1) will point to the appropriate
  743.     // paging descriptor for the virtual address at
  744.     // the given level of the paging hierarchy.  The
  745.     // exact number of levels depends on many factors.
  746.     // The last level will be the fully translated
  747.     // physical address, matching what VirtualToPhysical
  748.     // returns.  If the address can only be partially
  749.     // translated S_FALSE is returned.
  750.     STDMETHOD(GetVirtualTranslationPhysicalOffsets)(
  751.         THIS_
  752.         IN ULONG64 Virtual,
  753.         OUT OPTIONAL /* size_is(OffsetsSize) */ PULONG64 Offsets,
  754.         IN ULONG OffsetsSize,
  755.         OUT OPTIONAL PULONG Levels
  756.         ) PURE;
  757.     // System handle data is accessible in certain
  758.     // debug sessions.  The particular data available
  759.     // varies from session to session and platform
  760.     // to platform.
  761.     STDMETHOD(ReadHandleData)(
  762.         THIS_
  763.         IN ULONG64 Handle,
  764.         IN ULONG DataType,
  765.         OUT OPTIONAL PVOID Buffer,
  766.         IN ULONG BufferSize,
  767.         OUT OPTIONAL PULONG DataSize
  768.         ) PURE;
  769.     // Fills memory with the given pattern.
  770.     // The fill stops at the first non-writable byte.
  771.     STDMETHOD(FillVirtual)(
  772.         THIS_
  773.         IN ULONG64 Start,
  774.         IN ULONG Size,
  775.         IN PVOID Pattern,
  776.         IN ULONG PatternSize,
  777.         OUT OPTIONAL PULONG Filled
  778.         ) PURE;
  779.     STDMETHOD(FillPhysical)(
  780.         THIS_
  781.         IN ULONG64 Start,
  782.         IN ULONG Size,
  783.         IN PVOID Pattern,
  784.         IN ULONG PatternSize,
  785.         OUT OPTIONAL PULONG Filled
  786.         ) PURE;
  787.     // Queries virtual memory mapping information given
  788.     // an address similarly to the Win32 API VirtualQuery.
  789.     // MEMORY_BASIC_INFORMATION64 is defined in crash.h.
  790.     // This method currently only works for user-mode sessions.
  791.     STDMETHOD(QueryVirtual)(
  792.         THIS_
  793.         IN ULONG64 Offset,
  794.         OUT PMEMORY_BASIC_INFORMATION64 Info
  795.         ) PURE;
  796. };
  797. //----------------------------------------------------------------------------
  798. //
  799. // IDebugEventCallbacks.
  800. //
  801. //----------------------------------------------------------------------------
  802. // Interest mask bits.
  803. #define DEBUG_EVENT_BREAKPOINT              0x00000001
  804. #define DEBUG_EVENT_EXCEPTION               0x00000002
  805. #define DEBUG_EVENT_CREATE_THREAD           0x00000004
  806. #define DEBUG_EVENT_EXIT_THREAD             0x00000008
  807. #define DEBUG_EVENT_CREATE_PROCESS          0x00000010
  808. #define DEBUG_EVENT_EXIT_PROCESS            0x00000020
  809. #define DEBUG_EVENT_LOAD_MODULE             0x00000040
  810. #define DEBUG_EVENT_UNLOAD_MODULE           0x00000080
  811. #define DEBUG_EVENT_SYSTEM_ERROR            0x00000100
  812. #define DEBUG_EVENT_SESSION_STATUS          0x00000200
  813. #define DEBUG_EVENT_CHANGE_DEBUGGEE_STATE   0x00000400
  814. #define DEBUG_EVENT_CHANGE_ENGINE_STATE     0x00000800
  815. #define DEBUG_EVENT_CHANGE_SYMBOL_STATE     0x00001000
  816. // SessionStatus flags.
  817. // A debuggee has been discovered for the session.
  818. #define DEBUG_SESSION_ACTIVE                       0x00000000
  819. // The session has been ended by EndSession.
  820. #define DEBUG_SESSION_END_SESSION_ACTIVE_TERMINATE 0x00000001
  821. #define DEBUG_SESSION_END_SESSION_ACTIVE_DETACH    0x00000002
  822. #define DEBUG_SESSION_END_SESSION_PASSIVE          0x00000003
  823. // The debuggee has run to completion.  User-mode only.
  824. #define DEBUG_SESSION_END                          0x00000004
  825. // The target machine has rebooted.  Kernel-mode only.
  826. #define DEBUG_SESSION_REBOOT                       0x00000005
  827. // The target machine has hibernated.  Kernel-mode only.
  828. #define DEBUG_SESSION_HIBERNATE                    0x00000006
  829. // The engine was unable to continue the session.
  830. #define DEBUG_SESSION_FAILURE                      0x00000007
  831. // ChangeDebuggeeState flags.
  832. // The debuggees state has changed generally, such
  833. // as when the debuggee has been executing.
  834. // Argument is zero.
  835. #define DEBUG_CDS_ALL       0xffffffff
  836. // Registers have changed.  If only a single register
  837. // changed, argument is the index of the register.
  838. // Otherwise it is DEBUG_ANY_ID.
  839. #define DEBUG_CDS_REGISTERS 0x00000001
  840. // Data spaces have changed.  If only a single
  841. // space was affected, argument is the data
  842. // space.  Otherwise it is DEBUG_ANY_ID.
  843. #define DEBUG_CDS_DATA      0x00000002
  844. // ChangeEngineState flags.
  845. // The engine state has changed generally.
  846. // Argument is zero.
  847. #define DEBUG_CES_ALL                 0xffffffff
  848. // Current thread changed.  This may imply a change
  849. // of process also.  Argument is the ID of the new
  850. // current thread.
  851. #define DEBUG_CES_CURRENT_THREAD      0x00000001
  852. // Effective processor changed.  Argument is the
  853. // new processor type.
  854. #define DEBUG_CES_EFFECTIVE_PROCESSOR 0x00000002
  855. // Breakpoints changed.  If only a single breakpoint
  856. // changed, argument is the ID of the breakpoint.
  857. // Otherwise it is DEBUG_ANY_ID.
  858. #define DEBUG_CES_BREAKPOINTS         0x00000004
  859. // Code interpretation level changed.  Argument is
  860. // the new level.
  861. #define DEBUG_CES_CODE_LEVEL          0x00000008
  862. // Execution status changed.  Argument is the new
  863. // execution status.
  864. #define DEBUG_CES_EXECUTION_STATUS    0x00000010
  865. // Engine options have changed.  Argument is the new
  866. // options value.
  867. #define DEBUG_CES_ENGINE_OPTIONS      0x00000020
  868. // Log file information has changed.  Argument
  869. // is TRUE if a log file was opened and FALSE if
  870. // a log file was closed.
  871. #define DEBUG_CES_LOG_FILE            0x00000040
  872. // Default number radix has changed.  Argument
  873. // is the new radix.
  874. #define DEBUG_CES_RADIX               0x00000080
  875. // Event filters changed.  If only a single filter
  876. // changed the argument is the filter's index,
  877. // otherwise it is DEBUG_ANY_ID.
  878. #define DEBUG_CES_EVENT_FILTERS       0x00000100
  879. // Process options have changed.  Argument is the new
  880. // options value.
  881. #define DEBUG_CES_PROCESS_OPTIONS     0x00000200
  882. // Extensions have been added or removed.
  883. #define DEBUG_CES_EXTENSIONS          0x00000400
  884. // ChangeSymbolState flags.
  885. // Symbol state has changed generally, such
  886. // as after reload operations.  Argument is zero.
  887. #define DEBUG_CSS_ALL            0xffffffff
  888. // Modules have been loaded.  If only a
  889. // single module changed, argument is the
  890. // base address of the module.  Otherwise
  891. // it is zero.
  892. #define DEBUG_CSS_LOADS          0x00000001
  893. // Modules have been unloaded.  If only a
  894. // single module changed, argument is the
  895. // base address of the module.  Otherwise
  896. // it is zero.
  897. #define DEBUG_CSS_UNLOADS        0x00000002
  898. // Current symbol scope changed.
  899. #define DEBUG_CSS_SCOPE          0x00000004
  900. // Paths have changed.
  901. #define DEBUG_CSS_PATHS          0x00000008
  902. // Symbol options have changed.  Argument is the new
  903. // options value.
  904. #define DEBUG_CSS_SYMBOL_OPTIONS 0x00000010
  905. // Type options have changed.  Argument is the new
  906. // options value.
  907. #define DEBUG_CSS_TYPE_OPTIONS   0x00000020
  908. #undef INTERFACE
  909. #define INTERFACE IDebugEventCallbacks
  910. DECLARE_INTERFACE_(IDebugEventCallbacks, IUnknown)
  911. {
  912.     // IUnknown.
  913.     STDMETHOD(QueryInterface)(
  914.         THIS_
  915.         IN REFIID InterfaceId,
  916.         OUT PVOID* Interface
  917.         ) PURE;
  918.     STDMETHOD_(ULONG, AddRef)(
  919.         THIS
  920.         ) PURE;
  921.     STDMETHOD_(ULONG, Release)(
  922.         THIS
  923.         ) PURE;
  924.     // IDebugEventCallbacks.
  925.     
  926.     // The engine calls GetInterestMask once when
  927.     // the event callbacks are set for a client.
  928.     STDMETHOD(GetInterestMask)(
  929.         THIS_
  930.         OUT PULONG Mask
  931.         ) PURE;
  932.     // A breakpoint event is generated when
  933.     // a breakpoint exception is received and
  934.     // it can be mapped to an existing breakpoint.
  935.     // The callback method is given a reference
  936.     // to the breakpoint and should release it when
  937.     // it is done with it.
  938.     STDMETHOD(Breakpoint)(
  939.         THIS_
  940.         IN PDEBUG_BREAKPOINT Bp
  941.         ) PURE;
  942.     // Exceptions include breaks which cannot
  943.     // be mapped to an existing breakpoint
  944.     // instance.
  945.     STDMETHOD(Exception)(
  946.         THIS_
  947.         IN PEXCEPTION_RECORD64 Exception,
  948.         IN ULONG FirstChance
  949.         ) PURE;
  950.     // Any of these values can be zero if they
  951.     // cannot be provided by the engine.
  952.     // Currently the kernel does not return thread
  953.     // or process change events.
  954.     STDMETHOD(CreateThread)(
  955.         THIS_
  956.         IN ULONG64 Handle,
  957.         IN ULONG64 DataOffset,
  958.         IN ULONG64 StartOffset
  959.         ) PURE;
  960.     STDMETHOD(ExitThread)(
  961.         THIS_
  962.         IN ULONG ExitCode
  963.         ) PURE;
  964.     // Any of these values can be zero if they
  965.     // cannot be provided by the engine.
  966.     STDMETHOD(CreateProcess)(
  967.         THIS_
  968.         IN ULONG64 ImageFileHandle,
  969.         IN ULONG64 Handle,
  970.         IN ULONG64 BaseOffset,
  971.         IN ULONG ModuleSize,
  972.         IN PCSTR ModuleName,
  973.         IN PCSTR ImageName,
  974.         IN ULONG CheckSum,
  975.         IN ULONG TimeDateStamp,
  976.         IN ULONG64 InitialThreadHandle,
  977.         IN ULONG64 ThreadDataOffset,
  978.         IN ULONG64 StartOffset
  979.         ) PURE;
  980.     STDMETHOD(ExitProcess)(
  981.         THIS_
  982.         IN ULONG ExitCode
  983.         ) PURE;
  984.     // Any of these values may be zero.
  985.     STDMETHOD(LoadModule)(
  986.         THIS_
  987.         IN ULONG64 ImageFileHandle,
  988.         IN ULONG64 BaseOffset,
  989.         IN ULONG ModuleSize,
  990.         IN PCSTR ModuleName,
  991.         IN PCSTR ImageName,
  992.         IN ULONG CheckSum,
  993.         IN ULONG TimeDateStamp
  994.         ) PURE;
  995.     STDMETHOD(UnloadModule)(
  996.         THIS_
  997.         IN PCSTR ImageBaseName,
  998.         IN ULONG64 BaseOffset
  999.         ) PURE;
  1000.     STDMETHOD(SystemError)(
  1001.         THIS_
  1002.         IN ULONG Error,
  1003.         IN ULONG Level
  1004.         ) PURE;
  1005.     // Session status is synchronous like the other
  1006.     // wait callbacks but it is called as the state
  1007.     // of the session is changing rather than at
  1008.     // specific events so its return value does not
  1009.     // influence waiting.  Implementations should just
  1010.     // return DEBUG_STATUS_NO_CHANGE.
  1011.     // Also, because some of the status
  1012.     // notifications are very early or very
  1013.     // late in the session lifetime there may not be
  1014.     // current processes or threads when the notification
  1015.     // is generated.
  1016.     STDMETHOD(SessionStatus)(
  1017.         THIS_
  1018.         IN ULONG Status
  1019.         ) PURE;
  1020.     // The following callbacks are informational
  1021.     // callbacks notifying the provider about
  1022.     // changes in debug state.  The return value
  1023.     // of these callbacks is ignored.  Implementations
  1024.     // can not call back into the engine.
  1025.     
  1026.     // Debuggee state, such as registers or data spaces,
  1027.     // has changed.
  1028.     STDMETHOD(ChangeDebuggeeState)(
  1029.         THIS_
  1030.         IN ULONG Flags,
  1031.         IN ULONG64 Argument
  1032.         ) PURE;
  1033.     // Engine state has changed.
  1034.     STDMETHOD(ChangeEngineState)(
  1035.         THIS_
  1036.         IN ULONG Flags,
  1037.         IN ULONG64 Argument
  1038.         ) PURE;
  1039.     // Symbol state has changed.
  1040.     STDMETHOD(ChangeSymbolState)(
  1041.         THIS_
  1042.         IN ULONG Flags,
  1043.         IN ULONG64 Argument
  1044.         ) PURE;
  1045. };
  1046. //----------------------------------------------------------------------------
  1047. //
  1048. // IDebugInputCallbacks.
  1049. //
  1050. //----------------------------------------------------------------------------
  1051. #undef INTERFACE
  1052. #define INTERFACE IDebugInputCallbacks
  1053. DECLARE_INTERFACE_(IDebugInputCallbacks, IUnknown)
  1054. {
  1055.     // IUnknown.
  1056.     STDMETHOD(QueryInterface)(
  1057.         THIS_
  1058.         IN REFIID InterfaceId,
  1059.         OUT PVOID* Interface
  1060.         ) PURE;
  1061.     STDMETHOD_(ULONG, AddRef)(
  1062.         THIS
  1063.         ) PURE;
  1064.     STDMETHOD_(ULONG, Release)(
  1065.         THIS
  1066.         ) PURE;
  1067.     // IDebugInputCallbacks.
  1068.     
  1069.     // A call to the StartInput method is a request for
  1070.     // a line of input from any client.  The returned input
  1071.     // should always be zero-terminated.  The buffer size
  1072.     // provided is only a guideline.  A client can return
  1073.     // more if necessary and the engine will truncate it
  1074.     // before returning from IDebugControl::Input.
  1075.     // The return value is ignored.
  1076.     STDMETHOD(StartInput)(
  1077.         THIS_
  1078.         IN ULONG BufferSize
  1079.         ) PURE;
  1080.     // The return value is ignored.
  1081.     STDMETHOD(EndInput)(
  1082.         THIS
  1083.         ) PURE;
  1084. };
  1085. //----------------------------------------------------------------------------
  1086. //
  1087. // IDebugOutputCallbacks.
  1088. //
  1089. //----------------------------------------------------------------------------
  1090. #undef INTERFACE
  1091. #define INTERFACE IDebugOutputCallbacks
  1092. DECLARE_INTERFACE_(IDebugOutputCallbacks, IUnknown)
  1093. {
  1094.     // IUnknown.
  1095.     STDMETHOD(QueryInterface)(
  1096.         THIS_
  1097.         IN REFIID InterfaceId,
  1098.         OUT PVOID* Interface
  1099.         ) PURE;
  1100.     STDMETHOD_(ULONG, AddRef)(
  1101.         THIS
  1102.         ) PURE;
  1103.     STDMETHOD_(ULONG, Release)(
  1104.         THIS
  1105.         ) PURE;
  1106.     // IDebugOutputCallbacks.
  1107.     
  1108.     // This method is only called if the supplied mask
  1109.     // is allowed by the clients output control.
  1110.     // The return value is ignored.
  1111.     STDMETHOD(Output)(
  1112.         THIS_
  1113.         IN ULONG Mask,
  1114.         IN PCSTR Text
  1115.         ) PURE;
  1116. };
  1117. //----------------------------------------------------------------------------
  1118. //
  1119. // IDebugRegisters.
  1120. //
  1121. //----------------------------------------------------------------------------
  1122. #define DEBUG_REGISTER_SUB_REGISTER 0x00000001
  1123. #define DEBUG_REGISTERS_DEFAULT 0x00000000
  1124. #define DEBUG_REGISTERS_INT32   0x00000001
  1125. #define DEBUG_REGISTERS_INT64   0x00000002
  1126. #define DEBUG_REGISTERS_FLOAT   0x00000004
  1127. #define DEBUG_REGISTERS_ALL     0x00000007
  1128. typedef struct _DEBUG_REGISTER_DESCRIPTION
  1129. {
  1130.     // DEBUG_VALUE type.
  1131.     ULONG Type;
  1132.     ULONG Flags;
  1133.     // If this is a subregister the full
  1134.     // registers description index is
  1135.     // given in SubregMaster.  The length, mask
  1136.     // and shift describe how the subregisters
  1137.     // bits fit into the full register.
  1138.     ULONG SubregMaster;
  1139.     ULONG SubregLength;
  1140.     ULONG64 SubregMask;
  1141.     ULONG SubregShift;
  1142.     ULONG Reserved0;
  1143. } DEBUG_REGISTER_DESCRIPTION, *PDEBUG_REGISTER_DESCRIPTION;
  1144. #undef INTERFACE
  1145. #define INTERFACE IDebugRegisters
  1146. DECLARE_INTERFACE_(IDebugRegisters, IUnknown)
  1147. {
  1148.     // IUnknown.
  1149.     STDMETHOD(QueryInterface)(
  1150.         THIS_
  1151.         IN REFIID InterfaceId,
  1152.         OUT PVOID* Interface
  1153.         ) PURE;
  1154.     STDMETHOD_(ULONG, AddRef)(
  1155.         THIS
  1156.         ) PURE;
  1157.     STDMETHOD_(ULONG, Release)(
  1158.         THIS
  1159.         ) PURE;
  1160.     // IDebugRegisters.
  1161.     STDMETHOD(GetNumberRegisters)(
  1162.         THIS_
  1163.         OUT PULONG Number
  1164.         ) PURE;
  1165.     STDMETHOD(GetDescription)(
  1166.         THIS_
  1167.         IN ULONG Register,
  1168.         OUT OPTIONAL PSTR NameBuffer,
  1169.         IN ULONG NameBufferSize,
  1170.         OUT OPTIONAL PULONG NameSize,
  1171.         OUT OPTIONAL PDEBUG_REGISTER_DESCRIPTION Desc
  1172.         ) PURE;
  1173.     STDMETHOD(GetIndexByName)(
  1174.         THIS_
  1175.         IN PCSTR Name,
  1176.         OUT PULONG Index
  1177.         ) PURE;
  1178.     STDMETHOD(GetValue)(
  1179.         THIS_
  1180.         IN ULONG Register,
  1181.         OUT PDEBUG_VALUE Value
  1182.         ) PURE;
  1183.     // SetValue makes a best effort at coercing
  1184.     // the given value into the given registers
  1185.     // value type.  If the given value is larger
  1186.     // than the register can hold the least
  1187.     // significant bits will be dropped.  Float
  1188.     // to int and int to float will be done
  1189.     // if necessary.  Subregister bits will be
  1190.     // inserted into the master register.
  1191.     STDMETHOD(SetValue)(
  1192.         THIS_
  1193.         IN ULONG Register,
  1194.         IN PDEBUG_VALUE Value
  1195.         ) PURE;
  1196.     // Gets Count register values.  If Indices is
  1197.     // non-NULL it must contain Count register
  1198.     // indices which control the registers affected.
  1199.     // If Indices is NULL the registers from Start
  1200.     // to Start + Count  1 are retrieved.
  1201.     STDMETHOD(GetValues)(
  1202.         THIS_
  1203.         IN ULONG Count,
  1204.         IN OPTIONAL /* size_is(Count) */ PULONG Indices,
  1205.         IN ULONG Start,
  1206.         OUT /* size_is(Count) */ PDEBUG_VALUE Values
  1207.         ) PURE;
  1208.     STDMETHOD(SetValues)(
  1209.         THIS_
  1210.         IN ULONG Count,
  1211.         IN OPTIONAL /* size_is(Count) */ PULONG Indices,
  1212.         IN ULONG Start,
  1213.         IN /* size_is(Count) */ PDEBUG_VALUE Values
  1214.         ) PURE;
  1215.         
  1216.     // Outputs a group of registers in a well-formatted
  1217.     // way thats specific to the platforms register set.
  1218.     // Uses the line prefix.
  1219.     STDMETHOD(OutputRegisters)(
  1220.         THIS_
  1221.         IN ULONG OutputControl,
  1222.         IN ULONG Flags
  1223.         ) PURE;
  1224.     // Abstracted pieces of processor information.
  1225.     // The mapping of these values to architectural
  1226.     // registers is architecture-specific and their
  1227.     // interpretation and existence may vary.  They
  1228.     // are intended to be directly compatible with
  1229.     // calls which take this information, such as
  1230.     // stack walking.
  1231.     STDMETHOD(GetInstructionOffset)(
  1232.         THIS_
  1233.         OUT PULONG64 Offset
  1234.         ) PURE;
  1235.     STDMETHOD(GetStackOffset)(
  1236.         THIS_
  1237.         OUT PULONG64 Offset
  1238.         ) PURE;
  1239.     STDMETHOD(GetFrameOffset)(
  1240.         THIS_
  1241.         OUT PULONG64 Offset
  1242.         ) PURE;
  1243. };
  1244. //----------------------------------------------------------------------------
  1245. //
  1246. // IDebugSymbolGroup
  1247. //
  1248. //----------------------------------------------------------------------------
  1249. // OutputSymbols flags.
  1250. // Default output contains <Name>**NAME**<Offset>**OFF**<Value>**VALUE**
  1251. // per symbol.
  1252. #define DEBUG_OUTPUT_SYMBOLS_DEFAULT    0x00000000
  1253. #define DEBUG_OUTPUT_SYMBOLS_NO_NAMES   0x00000001
  1254. #define DEBUG_OUTPUT_SYMBOLS_NO_OFFSETS 0x00000002
  1255. #define DEBUG_OUTPUT_SYMBOLS_NO_VALUES  0x00000004
  1256. #define DEBUG_OUTPUT_SYMBOLS_NO_TYPES   0x00000010
  1257. #define DEBUG_OUTPUT_NAME_END           "**NAME**"
  1258. #define DEBUG_OUTPUT_OFFSET_END         "**OFF**"
  1259. #define DEBUG_OUTPUT_VALUE_END          "**VALUE**"
  1260. #define DEBUG_OUTPUT_TYPE_END           "**TYPE**"
  1261. // DEBUG_SYMBOL_PARAMETERS flags.
  1262. // Cumulative expansion level, takes four bits.
  1263. #define DEBUG_SYMBOL_EXPANSION_LEVEL_MASK 0x0000000f
  1264. // Symbols subelements follow.
  1265. #define DEBUG_SYMBOL_EXPANDED             0x00000010
  1266. // Symbols value is read-only.
  1267. #define DEBUG_SYMBOL_READ_ONLY            0x00000020
  1268. // Symbol subelements are array elements.
  1269. #define DEBUG_SYMBOL_IS_ARRAY             0x00000040
  1270. // Symbol is a float value.
  1271. #define DEBUG_SYMBOL_IS_FLOAT             0x00000080
  1272. // Symbol is a scope argument.
  1273. #define DEBUG_SYMBOL_IS_ARGUMENT          0x00000100
  1274. // Symbol is a scope argument.
  1275. #define DEBUG_SYMBOL_IS_LOCAL             0x00000200
  1276. typedef struct _DEBUG_SYMBOL_PARAMETERS
  1277. {
  1278.     ULONG64 Module;
  1279.     ULONG TypeId;
  1280.     // ParentSymbol may be DEBUG_ANY_ID when unknown.
  1281.     ULONG ParentSymbol;
  1282.     // A subelement of a symbol can be a field, such
  1283.     // as in structs, unions or classes; or an array
  1284.     // element count for arrays.
  1285.     ULONG SubElements;
  1286.     ULONG Flags;
  1287.     ULONG64 Reserved;
  1288. } DEBUG_SYMBOL_PARAMETERS, *PDEBUG_SYMBOL_PARAMETERS;
  1289. #undef INTERFACE
  1290. #define INTERFACE IDebugSymbolGroup
  1291. DECLARE_INTERFACE_(IDebugSymbolGroup, IUnknown)
  1292. {
  1293.     // IUnknown.
  1294.     STDMETHOD(QueryInterface)(
  1295.         THIS_
  1296.         IN REFIID InterfaceId,
  1297.         OUT PVOID* Interface
  1298.         ) PURE;
  1299.     STDMETHOD_(ULONG, AddRef)(
  1300.         THIS
  1301.         ) PURE;
  1302.     STDMETHOD_(ULONG, Release)(
  1303.         THIS
  1304.         ) PURE;
  1305.     // IDebugSymbolGroup.
  1306.     STDMETHOD(GetNumberSymbols)(
  1307.         THIS_
  1308.         OUT PULONG Number
  1309.         ) PURE;
  1310.     STDMETHOD(AddSymbol)(
  1311.         THIS_
  1312.         IN PCSTR Name,
  1313.         OUT PULONG Index
  1314.         ) PURE;
  1315.     STDMETHOD(RemoveSymbolByName)(
  1316.         THIS_
  1317.         IN PCSTR Name
  1318.         ) PURE;
  1319.     STDMETHOD(RemoveSymbolByIndex)(
  1320.         THIS_
  1321.         IN ULONG Index
  1322.         ) PURE;
  1323.     STDMETHOD(GetSymbolName)(
  1324.         THIS_
  1325.         IN ULONG Index,
  1326.         OUT OPTIONAL PSTR Buffer,
  1327.         IN ULONG BufferSize,
  1328.         OUT OPTIONAL PULONG NameSize
  1329.         ) PURE;
  1330.     STDMETHOD(GetSymbolParameters)(
  1331.         THIS_
  1332.         IN ULONG Start,
  1333.         IN ULONG Count,
  1334.         OUT /* size_is(Count) */ PDEBUG_SYMBOL_PARAMETERS Params
  1335.         ) PURE;
  1336.     STDMETHOD(ExpandSymbol)(
  1337.         THIS_
  1338.         IN ULONG Index,
  1339.         IN BOOL Expand
  1340.         ) PURE;
  1341.     // Uses the line prefix.
  1342.     STDMETHOD(OutputSymbols)(
  1343.         THIS_
  1344.         IN ULONG OutputControl,
  1345.         IN ULONG Flags,
  1346.         IN ULONG Start,
  1347.         IN ULONG Count
  1348.         ) PURE;
  1349.     STDMETHOD(WriteSymbol)(
  1350.         THIS_
  1351.         IN ULONG Index,
  1352.         IN PCSTR Value
  1353.         ) PURE;
  1354.     STDMETHOD(OutputAsType)(
  1355.         THIS_
  1356.         IN ULONG Index,
  1357.         IN PCSTR Type
  1358.         ) PURE;
  1359. };
  1360. //----------------------------------------------------------------------------
  1361. //
  1362. // IDebugSymbols.
  1363. //
  1364. //----------------------------------------------------------------------------
  1365. //
  1366. // Information about a module.
  1367. //
  1368. // Flags.
  1369. #define DEBUG_MODULE_LOADED   0x00000000
  1370. #define DEBUG_MODULE_UNLOADED 0x00000001
  1371. // Symbol types.
  1372. #define DEBUG_SYMTYPE_NONE     0
  1373. #define DEBUG_SYMTYPE_COFF     1
  1374. #define DEBUG_SYMTYPE_CODEVIEW 2
  1375. #define DEBUG_SYMTYPE_PDB      3
  1376. #define DEBUG_SYMTYPE_EXPORT   4
  1377. #define DEBUG_SYMTYPE_DEFERRED 5
  1378. #define DEBUG_SYMTYPE_SYM      6
  1379. #define DEBUG_SYMTYPE_DIA      7
  1380. typedef struct _DEBUG_MODULE_PARAMETERS
  1381. {
  1382.     ULONG64 Base;
  1383.     ULONG Size;
  1384.     ULONG TimeDateStamp;
  1385.     ULONG Checksum;
  1386.     ULONG Flags;
  1387.     ULONG SymbolType;
  1388.     ULONG ImageNameSize;
  1389.     ULONG ModuleNameSize;
  1390.     ULONG LoadedImageNameSize;
  1391.     ULONG SymbolFileNameSize;
  1392.     ULONG MappedImageNameSize;
  1393.     ULONG64 Reserved[2];
  1394. } DEBUG_MODULE_PARAMETERS, *PDEBUG_MODULE_PARAMETERS;
  1395. // Scope arguments are function arguments
  1396. // and thus only change when the scope
  1397. // crosses functions.
  1398. #define DEBUG_SCOPE_GROUP_ARGUMENTS 0x00000001
  1399. // Scope locals are locals declared in a particular
  1400. // scope and are only defined within that scope.
  1401. #define DEBUG_SCOPE_GROUP_LOCALS    0x00000002
  1402. // All symbols in the scope.
  1403. #define DEBUG_SCOPE_GROUP_ALL       0x00000003
  1404. // Typed data output control flags.
  1405. #define DEBUG_OUTTYPE_DEFAULT              0x00000000
  1406. #define DEBUG_OUTTYPE_NO_INDENT            0x00000001
  1407. #define DEBUG_OUTTYPE_NO_OFFSET            0x00000002
  1408. #define DEBUG_OUTTYPE_VERBOSE              0x00000004
  1409. #define DEBUG_OUTTYPE_COMPACT_OUTPUT       0x00000008
  1410. #define DEBUG_OUTTYPE_RECURSION_LEVEL(Max) (((Max) & 0xf) << 4)
  1411. #define DEBUG_OUTTYPE_ADDRESS_OF_FIELD     0x00010000
  1412. #define DEBUG_OUTTYPE_ADDRESS_AT_END       0x00020000
  1413. #define DEBUG_OUTTYPE_BLOCK_RECURSE        0x00200000
  1414. // FindSourceFile flags.
  1415. #define DEBUG_FIND_SOURCE_DEFAULT    0x00000000
  1416. // Returns fully-qualified paths only.  If this
  1417. // is not set the path returned may be relative.
  1418. #define DEBUG_FIND_SOURCE_FULL_PATH  0x00000001
  1419. // Scans all the path elements for a match and
  1420. // returns the one that has the most similarity
  1421. // between the given file and the matching element.
  1422. #define DEBUG_FIND_SOURCE_BEST_MATCH 0x00000002
  1423. // A special value marking an offset that should not
  1424. // be treated as a valid offset.  This is only used
  1425. // in special situations where it is unlikely that
  1426. // this value would be a valid offset.
  1427. #define DEBUG_INVALID_OFFSET ((ULONG64)-1)
  1428. #undef INTERFACE
  1429. #define INTERFACE IDebugSymbols
  1430. DECLARE_INTERFACE_(IDebugSymbols, IUnknown)
  1431. {
  1432.     // IUnknown.
  1433.     STDMETHOD(QueryInterface)(
  1434.         THIS_
  1435.         IN REFIID InterfaceId,
  1436.         OUT PVOID* Interface
  1437.         ) PURE;
  1438.     STDMETHOD_(ULONG, AddRef)(
  1439.         THIS
  1440.         ) PURE;
  1441.     STDMETHOD_(ULONG, Release)(
  1442.         THIS
  1443.         ) PURE;
  1444.     // IDebugSymbols.
  1445.     // Controls the symbol options used during
  1446.     // symbol operations.
  1447.     // Uses the same flags as dbghelps SymSetOptions.
  1448.     STDMETHOD(GetSymbolOptions)(
  1449.         THIS_
  1450.         OUT PULONG Options
  1451.         ) PURE;
  1452.     STDMETHOD(AddSymbolOptions)(
  1453.         THIS_
  1454.         IN ULONG Options
  1455.         ) PURE;
  1456.     STDMETHOD(RemoveSymbolOptions)(
  1457.         THIS_
  1458.         IN ULONG Options
  1459.         ) PURE;
  1460.     STDMETHOD(SetSymbolOptions)(
  1461.         THIS_
  1462.         IN ULONG Options
  1463.         ) PURE;
  1464.     
  1465.     STDMETHOD(GetNameByOffset)(
  1466.         THIS_
  1467.         IN ULONG64 Offset,
  1468.         OUT OPTIONAL PSTR NameBuffer,
  1469.         IN ULONG NameBufferSize,
  1470.         OUT OPTIONAL PULONG NameSize,
  1471.         OUT OPTIONAL PULONG64 Displacement
  1472.         ) PURE;
  1473.     // A symbol name may not be unique, particularly
  1474.     // when overloaded functions exist which all
  1475.     // have the same name.  If GetOffsetByName
  1476.     // finds multiple matches for the name it
  1477.     // can return any one of them.  In that
  1478.     // case it will return S_FALSE to indicate
  1479.     // that ambiguity was arbitrarily resolved.
  1480.     // A caller can then use SearchSymbols to
  1481.     // find all of the matches if it wishes to
  1482.     // perform different disambiguation.
  1483.     STDMETHOD(GetOffsetByName)(
  1484.         THIS_
  1485.         IN PCSTR Symbol,
  1486.         OUT PULONG64 Offset
  1487.         ) PURE;
  1488.     // GetNearNameByOffset returns symbols
  1489.     // located near the symbol closest to
  1490.     // to the offset, such as the previous
  1491.     // or next symbol.  If Delta is zero it
  1492.     // operates identically to GetNameByOffset.
  1493.     // If Delta is nonzero and such a symbol
  1494.     // does not exist an error is returned.
  1495.     // The next symbol, if one exists, will
  1496.     // always have a higher offset than the
  1497.     // input offset so the displacement is
  1498.     // always negative.  The situation is
  1499.     // reversed for the previous symbol.
  1500.     STDMETHOD(GetNearNameByOffset)(
  1501.         THIS_
  1502.         IN ULONG64 Offset,
  1503.         IN LONG Delta,
  1504.         OUT OPTIONAL PSTR NameBuffer,
  1505.         IN ULONG NameBufferSize,
  1506.         OUT OPTIONAL PULONG NameSize,
  1507.         OUT OPTIONAL PULONG64 Displacement
  1508.         ) PURE;
  1509.             
  1510.     STDMETHOD(GetLineByOffset)(
  1511.         THIS_
  1512.         IN ULONG64 Offset,
  1513.         OUT OPTIONAL PULONG Line,
  1514.         OUT OPTIONAL PSTR FileBuffer,
  1515.         IN ULONG FileBufferSize,
  1516.         OUT OPTIONAL PULONG FileSize,
  1517.         OUT OPTIONAL PULONG64 Displacement
  1518.         ) PURE;
  1519.     STDMETHOD(GetOffsetByLine)(
  1520.         THIS_
  1521.         IN ULONG Line,
  1522.         IN PCSTR File,
  1523.         OUT PULONG64 Offset
  1524.         ) PURE;
  1525.     // Enumerates the engines list of modules
  1526.     // loaded for the current process.  This may
  1527.     // or may not match the system module list
  1528.     // for the process.  Reload can be used to
  1529.     // synchronize the engines list with the system
  1530.     // if necessary.
  1531.     // Some sessions also track recently unloaded
  1532.     // code modules for help in analyzing failures
  1533.     // where an attempt is made to call unloaded code.
  1534.     // These modules are indexed after the loaded
  1535.     // modules.
  1536.     STDMETHOD(GetNumberModules)(
  1537.         THIS_
  1538.         OUT PULONG Loaded,
  1539.         OUT PULONG Unloaded
  1540.         ) PURE;
  1541.     STDMETHOD(GetModuleByIndex)(
  1542.         THIS_
  1543.         IN ULONG Index,
  1544.         OUT PULONG64 Base
  1545.         ) PURE;
  1546.     // The module name may not be unique.
  1547.     // This method returns the first match.
  1548.     STDMETHOD(GetModuleByModuleName)(
  1549.         THIS_
  1550.         IN PCSTR Name,
  1551.         IN ULONG StartIndex,
  1552.         OUT OPTIONAL PULONG Index,
  1553.         OUT OPTIONAL PULONG64 Base
  1554.         ) PURE;
  1555.     // Offset can be any offset within
  1556.     // the module extent.  Extents may
  1557.     // not be unique when including unloaded
  1558.     // drivers.  This method returns the
  1559.     // first match.
  1560.     STDMETHOD(GetModuleByOffset)(
  1561.         THIS_
  1562.         IN ULONG64 Offset,
  1563.         IN ULONG StartIndex,
  1564.         OUT OPTIONAL PULONG Index,
  1565.         OUT OPTIONAL PULONG64 Base
  1566.         ) PURE;
  1567.     // If Index is DEBUG_ANY_ID the base address
  1568.     // is used to look up the module instead.
  1569.     STDMETHOD(GetModuleNames)(
  1570.         THIS_
  1571.         IN ULONG Index,
  1572.         IN ULONG64 Base,
  1573.         OUT OPTIONAL PSTR ImageNameBuffer,
  1574.         IN ULONG ImageNameBufferSize,
  1575.         OUT OPTIONAL PULONG ImageNameSize,
  1576.         OUT OPTIONAL PSTR ModuleNameBuffer,
  1577.         IN ULONG ModuleNameBufferSize,
  1578.         OUT OPTIONAL PULONG ModuleNameSize,
  1579.         OUT OPTIONAL PSTR LoadedImageNameBuffer,
  1580.         IN ULONG LoadedImageNameBufferSize,
  1581.         OUT OPTIONAL PULONG LoadedImageNameSize
  1582.         ) PURE;
  1583.     STDMETHOD(GetModuleParameters)(
  1584.         THIS_
  1585.         IN ULONG Count,
  1586.         IN OPTIONAL /* size_is(Count) */ PULONG64 Bases,
  1587.         IN ULONG Start,
  1588.         OUT /* size_is(Count) */ PDEBUG_MODULE_PARAMETERS Params
  1589.         ) PURE;
  1590.     // Looks up the module from a <Module>!<Symbol>
  1591.     // string.
  1592.     STDMETHOD(GetSymbolModule)(
  1593.         THIS_
  1594.         IN PCSTR Symbol,
  1595.         OUT PULONG64 Base
  1596.         ) PURE;
  1597.     // Returns the string name of a type.
  1598.     STDMETHOD(GetTypeName)(
  1599.         THIS_
  1600.         IN ULONG64 Module,
  1601.         IN ULONG TypeId,
  1602.         OUT OPTIONAL PSTR NameBuffer,
  1603.         IN ULONG NameBufferSize,
  1604.         OUT OPTIONAL PULONG NameSize
  1605.         ) PURE;
  1606.     // Returns the ID for a type name.
  1607.     STDMETHOD(GetTypeId)(
  1608.         THIS_
  1609.         IN ULONG64 Module,
  1610.         IN PCSTR Name,
  1611.         OUT PULONG TypeId
  1612.         ) PURE;
  1613.     STDMETHOD(GetTypeSize)(
  1614.         THIS_
  1615.         IN ULONG64 Module,
  1616.         IN ULONG TypeId,
  1617.         OUT PULONG Size
  1618.         ) PURE;
  1619.     // Given a type which can contain members
  1620.     // this method returns the offset of a
  1621.     // particular member within the type.
  1622.     // TypeId should give the container type ID
  1623.     // and Field gives the dot-separated path
  1624.     // to the field of interest.
  1625.     STDMETHOD(GetFieldOffset)(
  1626.         THIS_
  1627.         IN ULONG64 Module,
  1628.         IN ULONG TypeId,
  1629.         IN PCSTR Field,
  1630.         OUT PULONG Offset
  1631.         ) PURE;
  1632.     STDMETHOD(GetSymbolTypeId)(
  1633.         THIS_
  1634.         IN PCSTR Symbol,
  1635.         OUT PULONG TypeId,
  1636.         OUT OPTIONAL PULONG64 Module
  1637.         ) PURE;
  1638.     // As with GetOffsetByName a symbol's
  1639.     // name may be ambiguous.  GetOffsetTypeId
  1640.     // returns the type for the symbol closest
  1641.     // to the given offset and can be used
  1642.     // to avoid ambiguity.
  1643.     STDMETHOD(GetOffsetTypeId)(
  1644.         THIS_
  1645.         IN ULONG64 Offset,
  1646.         OUT PULONG TypeId,
  1647.         OUT OPTIONAL PULONG64 Module
  1648.         ) PURE;
  1649.     // Helpers for virtual and physical data
  1650.     // which combine creation of a location with
  1651.     // the actual operation.
  1652.     STDMETHOD(ReadTypedDataVirtual)(
  1653.         THIS_
  1654.         IN ULONG64 Offset,
  1655.         IN ULONG64 Module,
  1656.         IN ULONG TypeId,
  1657.         OUT PVOID Buffer,
  1658.         IN ULONG BufferSize,
  1659.         OUT OPTIONAL PULONG BytesRead
  1660.         ) PURE;
  1661.     STDMETHOD(WriteTypedDataVirtual)(
  1662.         THIS_
  1663.         IN ULONG64 Offset,
  1664.         IN ULONG64 Module,
  1665.         IN ULONG TypeId,
  1666.         IN PVOID Buffer,
  1667.         IN ULONG BufferSize,
  1668.         OUT OPTIONAL PULONG BytesWritten
  1669.         ) PURE;
  1670.     STDMETHOD(OutputTypedDataVirtual)(
  1671.         THIS_
  1672.         IN ULONG OutputControl,
  1673.         IN ULONG64 Offset,
  1674.         IN ULONG64 Module,
  1675.         IN ULONG TypeId,
  1676.         IN ULONG Flags
  1677.         ) PURE;
  1678.     STDMETHOD(ReadTypedDataPhysical)(
  1679.         THIS_
  1680.         IN ULONG64 Offset,
  1681.         IN ULONG64 Module,
  1682.         IN ULONG TypeId,
  1683.         OUT PVOID Buffer,
  1684.         IN ULONG BufferSize,
  1685.         OUT OPTIONAL PULONG BytesRead
  1686.         ) PURE;
  1687.     STDMETHOD(WriteTypedDataPhysical)(
  1688.         THIS_
  1689.         IN ULONG64 Offset,
  1690.         IN ULONG64 Module,
  1691.         IN ULONG TypeId,
  1692.         IN PVOID Buffer,
  1693.         IN ULONG BufferSize,
  1694.         OUT OPTIONAL PULONG BytesWritten
  1695.         ) PURE;
  1696.     STDMETHOD(OutputTypedDataPhysical)(
  1697.         THIS_
  1698.         IN ULONG OutputControl,
  1699.         IN ULONG64 Offset,
  1700.         IN ULONG64 Module,
  1701.         IN ULONG TypeId,
  1702.         IN ULONG Flags
  1703.         ) PURE;
  1704.             
  1705.     // Function arguments and scope block symbols
  1706.     // can be retrieved relative to currently
  1707.     // executing code.  A caller can provide just
  1708.     // a code offset for scoping purposes and look
  1709.     // up names or the caller can provide a full frame
  1710.     // and look up actual values.  The values for
  1711.     // scoped symbols are best-guess and may or may not
  1712.     // be accurate depending on program optimizations,
  1713.     // the machine architecture, the current point
  1714.     // in the programs execution and so on.
  1715.     // A caller can also provide a complete register
  1716.     // context for setting a scope to a previous
  1717.     // machine state such as a context saved for
  1718.     // an exception.  Usually this isnt necessary
  1719.     // and the current register context is used.
  1720.     STDMETHOD(GetScope)(
  1721.         THIS_
  1722.         OUT OPTIONAL PULONG64 InstructionOffset,
  1723.         OUT OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
  1724.         OUT OPTIONAL PVOID ScopeContext,
  1725.         IN ULONG ScopeContextSize
  1726.         ) PURE;
  1727.     // If ScopeFrame or ScopeContext is non-NULL then
  1728.     // InstructionOffset is ignored.
  1729.     // If ScopeContext is NULL the current
  1730.     // register context is used.
  1731.     // If the scope identified by the given
  1732.     // information is the same as before
  1733.     // SetScope returns S_OK.  If the scope
  1734.     // information changes, such as when the
  1735.     // scope moves between functions or scope
  1736.     // blocks, SetScope returns S_FALSE.
  1737.     STDMETHOD(SetScope)(
  1738.         THIS_
  1739.         IN ULONG64 InstructionOffset,
  1740.         IN OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
  1741.         IN OPTIONAL PVOID ScopeContext,
  1742.         IN ULONG ScopeContextSize
  1743.         ) PURE;
  1744.     // ResetScope clears the scope information
  1745.     // for situations where scoped symbols
  1746.     // mask global symbols or when resetting
  1747.     // from explicit information to the current
  1748.     // information.
  1749.     STDMETHOD(ResetScope)(
  1750.         THIS
  1751.         ) PURE;
  1752.     // A scope symbol is tied to its particular
  1753.     // scope and only is meaningful within the scope.
  1754.     // The returned group can be updated by passing it back
  1755.     // into the method for lower-cost
  1756.     // incremental updates when stepping.
  1757.     STDMETHOD(GetScopeSymbolGroup)(
  1758.         THIS_
  1759.         IN ULONG Flags,
  1760.         IN OPTIONAL PDEBUG_SYMBOL_GROUP Update,
  1761.         OUT PDEBUG_SYMBOL_GROUP* Symbols
  1762.         ) PURE;
  1763.     // Create a new symbol group.
  1764.     STDMETHOD(CreateSymbolGroup)(
  1765.         THIS_
  1766.         OUT PDEBUG_SYMBOL_GROUP* Group
  1767.         ) PURE;
  1768.     // StartSymbolMatch matches symbol names
  1769.     // against the given pattern using simple
  1770.     // regular expressions.  The search results
  1771.     // are iterated through using GetNextSymbolMatch.
  1772.     // When the caller is done examining results
  1773.     // the match should be freed via EndSymbolMatch.
  1774.     // If the match pattern contains a module name
  1775.     // the search is restricted to a single module.
  1776.     // Pattern matching is only done on symbol names,
  1777.     // not module names.
  1778.     // All active symbol match handles are invalidated
  1779.     // when the set of loaded symbols changes.
  1780.     STDMETHOD(StartSymbolMatch)(
  1781.         THIS_
  1782.         IN PCSTR Pattern,
  1783.         OUT PULONG64 Handle
  1784.         ) PURE;
  1785.     // If Buffer is NULL the match does not
  1786.     // advance.
  1787.     STDMETHOD(GetNextSymbolMatch)(
  1788.         THIS_
  1789.         IN ULONG64 Handle,
  1790.         OUT OPTIONAL PSTR Buffer,
  1791.         IN ULONG BufferSize,
  1792.         OUT OPTIONAL PULONG MatchSize,
  1793.         OUT OPTIONAL PULONG64 Offset
  1794.         ) PURE;
  1795.     STDMETHOD(EndSymbolMatch)(
  1796.         THIS_
  1797.         IN ULONG64 Handle
  1798.         ) PURE;
  1799.     
  1800.     STDMETHOD(Reload)(
  1801.         THIS_
  1802.         IN PCSTR Module
  1803.         ) PURE;
  1804.     STDMETHOD(GetSymbolPath)(
  1805.         THIS_
  1806.         OUT OPTIONAL PSTR Buffer,
  1807.         IN ULONG BufferSize,
  1808.         OUT OPTIONAL PULONG PathSize
  1809.         ) PURE;
  1810.     STDMETHOD(SetSymbolPath)(
  1811.         THIS_
  1812.         IN PCSTR Path
  1813.         ) PURE;
  1814.     STDMETHOD(AppendSymbolPath)(
  1815.         THIS_
  1816.         IN PCSTR Addition
  1817.         ) PURE;
  1818.     
  1819.     // Manipulate the path for executable images.
  1820.     // Some dump files need to load executable images
  1821.     // in order to resolve dump information.  This
  1822.     // path controls where the engine looks for
  1823.     // images.
  1824.     STDMETHOD(GetImagePath)(
  1825.         THIS_
  1826.         OUT OPTIONAL PSTR Buffer,
  1827.         IN ULONG BufferSize,
  1828.         OUT OPTIONAL PULONG PathSize
  1829.         ) PURE;
  1830.     STDMETHOD(SetImagePath)(
  1831.         THIS_
  1832.         IN PCSTR Path
  1833.         ) PURE;
  1834.     STDMETHOD(AppendImagePath)(
  1835.         THIS_
  1836.         IN PCSTR Addition
  1837.         ) PURE;
  1838.     // Path routines for source file location
  1839.     // methods.
  1840.     STDMETHOD(GetSourcePath)(
  1841.         THIS_
  1842.         OUT OPTIONAL PSTR Buffer,
  1843.         IN ULONG BufferSize,
  1844.         OUT OPTIONAL PULONG PathSize
  1845.         ) PURE;
  1846.     // Gets the nth part of the source path.
  1847.     STDMETHOD(GetSourcePathElement)(
  1848.         THIS_
  1849.         IN ULONG Index,
  1850.         OUT OPTIONAL PSTR Buffer,
  1851.         IN ULONG BufferSize,
  1852.         OUT OPTIONAL PULONG ElementSize
  1853.         ) PURE;
  1854.     STDMETHOD(SetSourcePath)(
  1855.         THIS_
  1856.         IN PCSTR Path
  1857.         ) PURE;
  1858.     STDMETHOD(AppendSourcePath)(
  1859.         THIS_
  1860.         IN PCSTR Addition
  1861.         ) PURE;
  1862.     // Uses the given file path and the source path
  1863.     // information to try and locate an existing file.
  1864.     // The given file path is merged with elements
  1865.     // of the source path and checked for existence.
  1866.     // If a match is found the element used is returned.
  1867.     // A starting element can be specified to restrict
  1868.     // the search to a subset of the path elements;
  1869.     // this can be useful when checking for multiple
  1870.     // matches along the source path.
  1871.     // The returned element can be 1, indicating
  1872.     // the file was found directly and not on the path.
  1873.     STDMETHOD(FindSourceFile)(
  1874.         THIS_
  1875.         IN ULONG StartElement,
  1876.         IN PCSTR File,
  1877.         IN ULONG Flags,
  1878.         OUT OPTIONAL PULONG FoundElement,
  1879.         OUT OPTIONAL PSTR Buffer,
  1880.         IN ULONG BufferSize,
  1881.         OUT OPTIONAL PULONG FoundSize
  1882.         ) PURE;
  1883.     // Retrieves all the line offset information
  1884.     // for a particular source file.  Buffer is
  1885.     // first intialized to DEBUG_INVALID_OFFSET for
  1886.     // every entry.  Then for each piece of line
  1887.     // symbol information Buffer[Line] set to
  1888.     // Lines offset.  This produces a per-line
  1889.     // map of the offsets for the lines of the
  1890.     // given file.  Line numbers are decremented
  1891.     // for the map so Buffer[0] contains the offset
  1892.     // for line number 1.
  1893.     // If there is no line information at all for
  1894.     // the given file the method fails rather
  1895.     // than returning a map of invalid offsets.
  1896.     STDMETHOD(GetSourceFileLineOffsets)(
  1897.         THIS_
  1898.         IN PCSTR File,
  1899.         OUT OPTIONAL /* size_is(BufferLines) */ PULONG64 Buffer,
  1900.         IN ULONG BufferLines,
  1901.         OUT OPTIONAL PULONG FileLines
  1902.         ) PURE;
  1903. };
  1904. //
  1905. // GetModuleNameString strings.
  1906. //
  1907. #define DEBUG_MODNAME_IMAGE        0x00000000
  1908. #define DEBUG_MODNAME_MODULE       0x00000001
  1909. #define DEBUG_MODNAME_LOADED_IMAGE 0x00000002
  1910. #define DEBUG_MODNAME_SYMBOL_FILE  0x00000003
  1911. #define DEBUG_MODNAME_MAPPED_IMAGE 0x00000004
  1912. //
  1913. // Type options, used with Get/SetTypeOptions.
  1914. //
  1915. // Display PUSHORT and USHORT arrays in UNICODE
  1916. #define DEBUG_TYPEOPTS_UNICODE_DISPLAY 0x00000001
  1917. #undef INTERFACE
  1918. #define INTERFACE IDebugSymbols2
  1919. DECLARE_INTERFACE_(IDebugSymbols2, IUnknown)
  1920. {
  1921.     // IUnknown.
  1922.     STDMETHOD(QueryInterface)(
  1923.         THIS_
  1924.         IN REFIID InterfaceId,
  1925.         OUT PVOID* Interface
  1926.         ) PURE;
  1927.     STDMETHOD_(ULONG, AddRef)(
  1928.         THIS
  1929.         ) PURE;
  1930.     STDMETHOD_(ULONG, Release)(
  1931.         THIS
  1932.         ) PURE;
  1933.     // IDebugSymbols.
  1934.     // Controls the symbol options used during
  1935.     // symbol operations.
  1936.     // Uses the same flags as dbghelps SymSetOptions.
  1937.     STDMETHOD(GetSymbolOptions)(
  1938.         THIS_
  1939.         OUT PULONG Options
  1940.         ) PURE;
  1941.     STDMETHOD(AddSymbolOptions)(
  1942.         THIS_
  1943.         IN ULONG Options
  1944.         ) PURE;
  1945.     STDMETHOD(RemoveSymbolOptions)(
  1946.         THIS_
  1947.         IN ULONG Options
  1948.         ) PURE;
  1949.     STDMETHOD(SetSymbolOptions)(
  1950.         THIS_
  1951.         IN ULONG Options
  1952.         ) PURE;
  1953.     
  1954.     STDMETHOD(GetNameByOffset)(
  1955.         THIS_
  1956.         IN ULONG64 Offset,
  1957.         OUT OPTIONAL PSTR NameBuffer,
  1958.         IN ULONG NameBufferSize,
  1959.         OUT OPTIONAL PULONG NameSize,
  1960.         OUT OPTIONAL PULONG64 Displacement
  1961.         ) PURE;
  1962.     // A symbol name may not be unique, particularly
  1963.     // when overloaded functions exist which all
  1964.     // have the same name.  If GetOffsetByName
  1965.     // finds multiple matches for the name it
  1966.     // can return any one of them.  In that
  1967.     // case it will return S_FALSE to indicate
  1968.     // that ambiguity was arbitrarily resolved.
  1969.     // A caller can then use SearchSymbols to
  1970.     // find all of the matches if it wishes to
  1971.     // perform different disambiguation.
  1972.     STDMETHOD(GetOffsetByName)(
  1973.         THIS_
  1974.         IN PCSTR Symbol,
  1975.         OUT PULONG64 Offset
  1976.         ) PURE;
  1977.     // GetNearNameByOffset returns symbols
  1978.     // located near the symbol closest to
  1979.     // to the offset, such as the previous
  1980.     // or next symbol.  If Delta is zero it
  1981.     // operates identically to GetNameByOffset.
  1982.     // If Delta is nonzero and such a symbol
  1983.     // does not exist an error is returned.
  1984.     // The next symbol, if one exists, will
  1985.     // always have a higher offset than the
  1986.     // input offset so the displacement is
  1987.     // always negative.  The situation is
  1988.     // reversed for the previous symbol.
  1989.     STDMETHOD(GetNearNameByOffset)(
  1990.         THIS_
  1991.         IN ULONG64 Offset,
  1992.         IN LONG Delta,
  1993.         OUT OPTIONAL PSTR NameBuffer,
  1994.         IN ULONG NameBufferSize,
  1995.         OUT OPTIONAL PULONG NameSize,
  1996.         OUT OPTIONAL PULONG64 Displacement
  1997.         ) PURE;
  1998.             
  1999.     STDMETHOD(GetLineByOffset)(
  2000.         THIS_
  2001.         IN ULONG64 Offset,
  2002.         OUT OPTIONAL PULONG Line,
  2003.         OUT OPTIONAL PSTR FileBuffer,
  2004.         IN ULONG FileBufferSize,
  2005.         OUT OPTIONAL PULONG FileSize,
  2006.         OUT OPTIONAL PULONG64 Displacement
  2007.         ) PURE;
  2008.     STDMETHOD(GetOffsetByLine)(
  2009.         THIS_
  2010.         IN ULONG Line,
  2011.         IN PCSTR File,
  2012.         OUT PULONG64 Offset
  2013.         ) PURE;
  2014.     // Enumerates the engines list of modules
  2015.     // loaded for the current process.  This may
  2016.     // or may not match the system module list
  2017.     // for the process.  Reload can be used to
  2018.     // synchronize the engines list with the system
  2019.     // if necessary.
  2020.     // Some sessions also track recently unloaded
  2021.     // code modules for help in analyzing failures
  2022.     // where an attempt is made to call unloaded code.
  2023.     // These modules are indexed after the loaded
  2024.     // modules.
  2025.     STDMETHOD(GetNumberModules)(
  2026.         THIS_
  2027.         OUT PULONG Loaded,
  2028.         OUT PULONG Unloaded
  2029.         ) PURE;
  2030.     STDMETHOD(GetModuleByIndex)(
  2031.         THIS_
  2032.         IN ULONG Index,
  2033.         OUT PULONG64 Base
  2034.         ) PURE;
  2035.     // The module name may not be unique.
  2036.     // This method returns the first match.
  2037.     STDMETHOD(GetModuleByModuleName)(
  2038.         THIS_
  2039.         IN PCSTR Name,
  2040.         IN ULONG StartIndex,
  2041.         OUT OPTIONAL PULONG Index,
  2042.         OUT OPTIONAL PULONG64 Base
  2043.         ) PURE;
  2044.     // Offset can be any offset within
  2045.     // the module extent.  Extents may
  2046.     // not be unique when including unloaded
  2047.     // drivers.  This method returns the
  2048.     // first match.
  2049.     STDMETHOD(GetModuleByOffset)(
  2050.         THIS_
  2051.         IN ULONG64 Offset,
  2052.         IN ULONG StartIndex,
  2053.         OUT OPTIONAL PULONG Index,
  2054.         OUT OPTIONAL PULONG64 Base
  2055.         ) PURE;
  2056.     // If Index is DEBUG_ANY_ID the base address
  2057.     // is used to look up the module instead.
  2058.     STDMETHOD(GetModuleNames)(
  2059.         THIS_
  2060.         IN ULONG Index,
  2061.         IN ULONG64 Base,
  2062.         OUT OPTIONAL PSTR ImageNameBuffer,
  2063.         IN ULONG ImageNameBufferSize,
  2064.         OUT OPTIONAL PULONG ImageNameSize,
  2065.         OUT OPTIONAL PSTR ModuleNameBuffer,
  2066.         IN ULONG ModuleNameBufferSize,
  2067.         OUT OPTIONAL PULONG ModuleNameSize,
  2068.         OUT OPTIONAL PSTR LoadedImageNameBuffer,
  2069.         IN ULONG LoadedImageNameBufferSize,
  2070.         OUT OPTIONAL PULONG LoadedImageNameSize
  2071.         ) PURE;
  2072.     STDMETHOD(GetModuleParameters)(
  2073.         THIS_
  2074.         IN ULONG Count,
  2075.         IN OPTIONAL /* size_is(Count) */ PULONG64 Bases,
  2076.         IN ULONG Start,
  2077.         OUT /* size_is(Count) */ PDEBUG_MODULE_PARAMETERS Params
  2078.         ) PURE;
  2079.     // Looks up the module from a <Module>!<Symbol>
  2080.     // string.
  2081.     STDMETHOD(GetSymbolModule)(
  2082.         THIS_
  2083.         IN PCSTR Symbol,
  2084.         OUT PULONG64 Base
  2085.         ) PURE;
  2086.     // Returns the string name of a type.
  2087.     STDMETHOD(GetTypeName)(
  2088.         THIS_
  2089.         IN ULONG64 Module,
  2090.         IN ULONG TypeId,
  2091.         OUT OPTIONAL PSTR NameBuffer,
  2092.         IN ULONG NameBufferSize,
  2093.         OUT OPTIONAL PULONG NameSize
  2094.         ) PURE;
  2095.     // Returns the ID for a type name.
  2096.     STDMETHOD(GetTypeId)(
  2097.         THIS_
  2098.         IN ULONG64 Module,
  2099.         IN PCSTR Name,
  2100.         OUT PULONG TypeId
  2101.         ) PURE;
  2102.     STDMETHOD(GetTypeSize)(
  2103.         THIS_
  2104.         IN ULONG64 Module,
  2105.         IN ULONG TypeId,
  2106.         OUT PULONG Size
  2107.         ) PURE;
  2108.     // Given a type which can contain members
  2109.     // this method returns the offset of a
  2110.     // particular member within the type.
  2111.     // TypeId should give the container type ID
  2112.     // and Field gives the dot-separated path
  2113.     // to the field of interest.
  2114.     STDMETHOD(GetFieldOffset)(
  2115.         THIS_
  2116.         IN ULONG64 Module,
  2117.         IN ULONG TypeId,
  2118.         IN PCSTR Field,
  2119.         OUT PULONG Offset
  2120.         ) PURE;
  2121.     STDMETHOD(GetSymbolTypeId)(
  2122.         THIS_
  2123.         IN PCSTR Symbol,
  2124.         OUT PULONG TypeId,
  2125.         OUT OPTIONAL PULONG64 Module
  2126.         ) PURE;
  2127.     // As with GetOffsetByName a symbol's
  2128.     // name may be ambiguous.  GetOffsetTypeId
  2129.     // returns the type for the symbol closest
  2130.     // to the given offset and can be used
  2131.     // to avoid ambiguity.
  2132.     STDMETHOD(GetOffsetTypeId)(
  2133.         THIS_
  2134.         IN ULONG64 Offset,
  2135.         OUT PULONG TypeId,
  2136.         OUT OPTIONAL PULONG64 Module
  2137.         ) PURE;
  2138.     // Helpers for virtual and physical data
  2139.     // which combine creation of a location with
  2140.     // the actual operation.
  2141.     STDMETHOD(ReadTypedDataVirtual)(
  2142.         THIS_
  2143.         IN ULONG64 Offset,
  2144.         IN ULONG64 Module,
  2145.         IN ULONG TypeId,
  2146.         OUT PVOID Buffer,
  2147.         IN ULONG BufferSize,
  2148.         OUT OPTIONAL PULONG BytesRead
  2149.         ) PURE;
  2150.     STDMETHOD(WriteTypedDataVirtual)(
  2151.         THIS_
  2152.         IN ULONG64 Offset,
  2153.         IN ULONG64 Module,
  2154.         IN ULONG TypeId,
  2155.         IN PVOID Buffer,
  2156.         IN ULONG BufferSize,
  2157.         OUT OPTIONAL PULONG BytesWritten
  2158.         ) PURE;
  2159.     STDMETHOD(OutputTypedDataVirtual)(
  2160.         THIS_
  2161.         IN ULONG OutputControl,
  2162.         IN ULONG64 Offset,
  2163.         IN ULONG64 Module,
  2164.         IN ULONG TypeId,
  2165.         IN ULONG Flags
  2166.         ) PURE;
  2167.     STDMETHOD(ReadTypedDataPhysical)(
  2168.         THIS_
  2169.         IN ULONG64 Offset,
  2170.         IN ULONG64 Module,
  2171.         IN ULONG TypeId,
  2172.         OUT PVOID Buffer,
  2173.         IN ULONG BufferSize,
  2174.         OUT OPTIONAL PULONG BytesRead
  2175.         ) PURE;
  2176.     STDMETHOD(WriteTypedDataPhysical)(
  2177.         THIS_
  2178.         IN ULONG64 Offset,
  2179.         IN ULONG64 Module,
  2180.         IN ULONG TypeId,
  2181.         IN PVOID Buffer,
  2182.         IN ULONG BufferSize,
  2183.         OUT OPTIONAL PULONG BytesWritten
  2184.         ) PURE;
  2185.     STDMETHOD(OutputTypedDataPhysical)(
  2186.         THIS_
  2187.         IN ULONG OutputControl,
  2188.         IN ULONG64 Offset,
  2189.         IN ULONG64 Module,
  2190.         IN ULONG TypeId,
  2191.         IN ULONG Flags
  2192.         ) PURE;
  2193.             
  2194.     // Function arguments and scope block symbols
  2195.     // can be retrieved relative to currently
  2196.     // executing code.  A caller can provide just
  2197.     // a code offset for scoping purposes and look
  2198.     // up names or the caller can provide a full frame
  2199.     // and look up actual values.  The values for
  2200.     // scoped symbols are best-guess and may or may not
  2201.     // be accurate depending on program optimizations,
  2202.     // the machine architecture, the current point
  2203.     // in the programs execution and so on.
  2204.     // A caller can also provide a complete register
  2205.     // context for setting a scope to a previous
  2206.     // machine state such as a context saved for
  2207.     // an exception.  Usually this isnt necessary
  2208.     // and the current register context is used.
  2209.     STDMETHOD(GetScope)(
  2210.         THIS_
  2211.         OUT OPTIONAL PULONG64 InstructionOffset,
  2212.         OUT OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
  2213.         OUT OPTIONAL PVOID ScopeContext,
  2214.         IN ULONG ScopeContextSize
  2215.         ) PURE;
  2216.     // If ScopeFrame or ScopeContext is non-NULL then
  2217.     // InstructionOffset is ignored.
  2218.     // If ScopeContext is NULL the current
  2219.     // register context is used.
  2220.     // If the scope identified by the given
  2221.     // information is the same as before
  2222.     // SetScope returns S_OK.  If the scope
  2223.     // information changes, such as when the
  2224.     // scope moves between functions or scope
  2225.     // blocks, SetScope returns S_FALSE.
  2226.     STDMETHOD(SetScope)(
  2227.         THIS_
  2228.         IN ULONG64 InstructionOffset,
  2229.         IN OPTIONAL PDEBUG_STACK_FRAME ScopeFrame,
  2230.         IN OPTIONAL PVOID ScopeContext,
  2231.         IN ULONG ScopeContextSize
  2232.         ) PURE;
  2233.     // ResetScope clears the scope information
  2234.     // for situations where scoped symbols
  2235.     // mask global symbols or when resetting
  2236.     // from explicit information to the current
  2237.     // information.
  2238.     STDMETHOD(ResetScope)(
  2239.         THIS
  2240.         ) PURE;
  2241.     // A scope symbol is tied to its particular
  2242.     // scope and only is meaningful within the scope.
  2243.     // The returned group can be updated by passing it back
  2244.     // into the method for lower-cost
  2245.     // incremental updates when stepping.
  2246.     STDMETHOD(GetScopeSymbolGroup)(
  2247.         THIS_
  2248.         IN ULONG Flags,
  2249.         IN OPTIONAL PDEBUG_SYMBOL_GROUP Update,
  2250.         OUT PDEBUG_SYMBOL_GROUP* Symbols
  2251.         ) PURE;
  2252.     // Create a new symbol group.
  2253.     STDMETHOD(CreateSymbolGroup)(
  2254.         THIS_
  2255.         OUT PDEBUG_SYMBOL_GROUP* Group
  2256.         ) PURE;
  2257.     // StartSymbolMatch matches symbol names
  2258.     // against the given pattern using simple
  2259.     // regular expressions.  The search results
  2260.     // are iterated through using GetNextSymbolMatch.
  2261.     // When the caller is done examining results
  2262.     // the match should be freed via EndSymbolMatch.
  2263.     // If the match pattern contains a module name
  2264.     // the search is restricted to a single module.
  2265.     // Pattern matching is only done on symbol names,
  2266.     // not module names.
  2267.     // All active symbol match handles are invalidated
  2268.     // when the set of loaded symbols changes.
  2269.     STDMETHOD(StartSymbolMatch)(
  2270.         THIS_
  2271.         IN PCSTR Pattern,
  2272.         OUT PULONG64 Handle
  2273.         ) PURE;
  2274.     // If Buffer is NULL the match does not
  2275.     // advance.
  2276.     STDMETHOD(GetNextSymbolMatch)(
  2277.         THIS_
  2278.         IN ULONG64 Handle,
  2279.         OUT OPTIONAL PSTR Buffer,
  2280.         IN ULONG BufferSize,
  2281.         OUT OPTIONAL PULONG MatchSize,
  2282.         OUT OPTIONAL PULONG64 Offset
  2283.         ) PURE;
  2284.     STDMETHOD(EndSymbolMatch)(
  2285.         THIS_
  2286.         IN ULONG64 Handle
  2287.         ) PURE;
  2288.     
  2289.     STDMETHOD(Reload)(
  2290.         THIS_
  2291.         IN PCSTR Module
  2292.         ) PURE;
  2293.     STDMETHOD(GetSymbolPath)(
  2294.         THIS_
  2295.         OUT OPTIONAL PSTR Buffer,
  2296.         IN ULONG BufferSize,
  2297.         OUT OPTIONAL PULONG PathSize
  2298.         ) PURE;
  2299.     STDMETHOD(SetSymbolPath)(
  2300.         THIS_
  2301.         IN PCSTR Path
  2302.         ) PURE;
  2303.     STDMETHOD(AppendSymbolPath)(
  2304.         THIS_
  2305.         IN PCSTR Addition
  2306.         ) PURE;
  2307.     
  2308.     // Manipulate the path for executable images.
  2309.     // Some dump files need to load executable images
  2310.     // in order to resolve dump information.  This
  2311.     // path controls where the engine looks for
  2312.     // images.
  2313.     STDMETHOD(GetImagePath)(
  2314.         THIS_
  2315.         OUT OPTIONAL PSTR Buffer,
  2316.         IN ULONG BufferSize,
  2317.         OUT OPTIONAL PULONG PathSize
  2318.         ) PURE;
  2319.     STDMETHOD(SetImagePath)(
  2320.         THIS_
  2321.         IN PCSTR Path
  2322.         ) PURE;
  2323.     STDMETHOD(AppendImagePath)(
  2324.         THIS_
  2325.         IN PCSTR Addition
  2326.         ) PURE;
  2327.     // Path routines for source file location
  2328.     // methods.
  2329.     STDMETHOD(GetSourcePath)(
  2330.         THIS_
  2331.         OUT OPTIONAL PSTR Buffer,
  2332.         IN ULONG BufferSize,
  2333.         OUT OPTIONAL PULONG PathSize
  2334.         ) PURE;
  2335.     // Gets the nth part of the source path.
  2336.     STDMETHOD(GetSourcePathElement)(
  2337.         THIS_
  2338.         IN ULONG Index,
  2339.         OUT OPTIONAL PSTR Buffer,
  2340.         IN ULONG BufferSize,
  2341.         OUT OPTIONAL PULONG ElementSize
  2342.         ) PURE;
  2343.     STDMETHOD(SetSourcePath)(
  2344.         THIS_
  2345.         IN PCSTR Path
  2346.         ) PURE;
  2347.     STDMETHOD(AppendSourcePath)(
  2348.         THIS_
  2349.         IN PCSTR Addition
  2350.         ) PURE;
  2351.     // Uses the given file path and the source path
  2352.     // information to try and locate an existing file.
  2353.     // The given file path is merged with elements
  2354.     // of the source path and checked for existence.
  2355.     // If a match is found the element used is returned.
  2356.     // A starting element can be specified to restrict
  2357.     // the search to a subset of the path elements;
  2358.     // this can be useful when checking for multiple
  2359.     // matches along the source path.
  2360.     // The returned element can be 1, indicating
  2361.     // the file was found directly and not on the path.
  2362.     STDMETHOD(FindSourceFile)(
  2363.         THIS_
  2364.         IN ULONG StartElement,
  2365.         IN PCSTR File,
  2366.         IN ULONG Flags,
  2367.         OUT OPTIONAL PULONG FoundElement,
  2368.         OUT OPTIONAL PSTR Buffer,
  2369.         IN ULONG BufferSize,
  2370.         OUT OPTIONAL PULONG FoundSize
  2371.         ) PURE;
  2372.     // Retrieves all the line offset information
  2373.     // for a particular source file.  Buffer is
  2374.     // first intialized to DEBUG_INVALID_OFFSET for
  2375.     // every entry.  Then for each piece of line
  2376.     // symbol information Buffer[Line] set to
  2377.     // Lines offset.  This produces a per-line
  2378.     // map of the offsets for the lines of the
  2379.     // given file.  Line numbers are decremented
  2380.     // for the map so Buffer[0] contains the offset
  2381.     // for line number 1.
  2382.     // If there is no line information at all for
  2383.     // the given file the method fails rather
  2384.     // than returning a map of invalid offsets.
  2385.     STDMETHOD(GetSourceFileLineOffsets)(
  2386.         THIS_
  2387.         IN PCSTR File,
  2388.         OUT OPTIONAL /* size_is(BufferLines) */ PULONG64 Buffer,
  2389.         IN ULONG BufferLines,
  2390.         OUT OPTIONAL PULONG FileLines
  2391.         ) PURE;
  2392.     // IDebugSymbols2.
  2393.     // If Index is DEBUG_ANY_ID the base address
  2394.     // is used to look up the module instead.
  2395.     // Item is specified as in VerQueryValue.
  2396.     // Module version information is only
  2397.     // available for loaded modules and may
  2398.     // not be available in all debug sessions.
  2399.     STDMETHOD(GetModuleVersionInformation)(
  2400.         THIS_
  2401.         IN ULONG Index,
  2402.         IN ULONG64 Base,
  2403.         IN PCSTR Item,
  2404.         OUT OPTIONAL PVOID Buffer,
  2405.         IN ULONG BufferSize,
  2406.         OUT OPTIONAL PULONG VerInfoSize
  2407.         ) PURE;
  2408.     // Retrieves any available module name string
  2409.     // such as module name or symbol file name.
  2410.     // If Index is DEBUG_ANY_ID the base address
  2411.     // is used to look up the module instead.
  2412.     // If symbols are deferred an error will
  2413.     // be returned.
  2414.     // E_NOINTERFACE may be returned, indicating
  2415.     // no information exists.
  2416.     STDMETHOD(GetModuleNameString)(
  2417.         THIS_
  2418.         IN ULONG Which,
  2419.         IN ULONG Index,
  2420.         IN ULONG64 Base,
  2421.         OUT OPTIONAL PSTR Buffer,
  2422.         IN ULONG BufferSize,
  2423.         OUT OPTIONAL PULONG NameSize
  2424.         ) PURE;
  2425.     // Returns the string name of a constant type.
  2426.     STDMETHOD(GetConstantName)(
  2427.         THIS_
  2428.         IN ULONG64 Module,
  2429.         IN ULONG TypeId,
  2430.         IN ULONG64 Value,
  2431.         OUT OPTIONAL PSTR NameBuffer,
  2432.         IN ULONG NameBufferSize,
  2433.         OUT OPTIONAL PULONG NameSize
  2434.         ) PURE;
  2435.     
  2436.     // Gets name of a field in a struct
  2437.     // FieldNumber is 0 based index of field in a struct
  2438.     // Method fails with E_INVALIDARG if FieldNumber is
  2439.     // too high for the struct fields
  2440.     STDMETHOD(GetFieldName)(
  2441.         THIS_
  2442.         IN ULONG64 Module,
  2443.         IN ULONG TypeId,
  2444.         IN ULONG FieldIndex,
  2445.         OUT OPTIONAL PSTR NameBuffer,
  2446.         IN ULONG NameBufferSize,
  2447.         OUT OPTIONAL PULONG NameSize
  2448.         ) PURE;
  2449.     // Control options for typed values.
  2450.     STDMETHOD(GetTypeOptions)(
  2451.         THIS_
  2452.         OUT PULONG Options
  2453.         ) PURE;
  2454.     STDMETHOD(AddTypeOptions)(
  2455.         THIS_
  2456.         IN ULONG Options
  2457.         ) PURE;
  2458.     STDMETHOD(RemoveTypeOptions)(
  2459.         THIS_
  2460.         IN ULONG Options
  2461.         ) PURE;
  2462.     STDMETHOD(SetTypeOptions)(
  2463.         THIS_
  2464.         IN ULONG Options
  2465.         ) PURE;
  2466. };
  2467. //----------------------------------------------------------------------------
  2468. //
  2469. // IDebugSystemObjects
  2470. //
  2471. //----------------------------------------------------------------------------
  2472. #undef INTERFACE
  2473. #define INTERFACE IDebugSystemObjects
  2474. DECLARE_INTERFACE_(IDebugSystemObjects, IUnknown)
  2475. {
  2476.     // IUnknown.
  2477.     STDMETHOD(QueryInterface)(
  2478.         THIS_
  2479.         IN REFIID InterfaceId,
  2480.         OUT PVOID* Interface
  2481.         ) PURE;
  2482.     STDMETHOD_(ULONG, AddRef)(
  2483.         THIS
  2484.         ) PURE;
  2485.     STDMETHOD_(ULONG, Release)(
  2486.         THIS
  2487.         ) PURE;
  2488.     // IDebugSystemObjects.
  2489.     
  2490.     // In user mode debugging the debugger
  2491.     // tracks all threads and processes and
  2492.     // enumerates them through the following
  2493.     // methods.  When enumerating threads
  2494.     // the threads are enumerated for the current
  2495.     // process.
  2496.     // Kernel mode debugging currently is
  2497.     // limited to enumerating only the threads
  2498.     // assigned to processors, not all of
  2499.     // the threads in the system.  Process
  2500.     // enumeration is limited to a single
  2501.     // virtual process representing kernel space.
  2502.     
  2503.     // Returns the ID of the thread on which
  2504.     // the last event occurred.
  2505.     STDMETHOD(GetEventThread)(
  2506.         THIS_
  2507.         OUT PULONG Id
  2508.         ) PURE;
  2509.     STDMETHOD(GetEventProcess)(
  2510.         THIS_
  2511.         OUT PULONG Id
  2512.         ) PURE;
  2513.     
  2514.     // Controls implicit thread used by the
  2515.     // debug engine.  The debuggers current
  2516.     // thread is just a piece of data held
  2517.     // by the debugger for calls which use
  2518.     // thread-specific information.  In those
  2519.     // calls the debuggers current thread is used.
  2520.     // The debuggers current thread is not related
  2521.     // to any system thread attribute.
  2522.     // IDs for threads are small integer IDs
  2523.     // maintained by the engine.  They are not
  2524.     // related to system thread IDs.
  2525.     STDMETHOD(GetCurrentThreadId)(
  2526.         THIS_
  2527.         OUT PULONG Id
  2528.         ) PURE;
  2529.     STDMETHOD(SetCurrentThreadId)(
  2530.         THIS_
  2531.         IN ULONG Id
  2532.         ) PURE;
  2533.     // The current process is the process
  2534.     // that owns the current thread.
  2535.     STDMETHOD(GetCurrentProcessId)(
  2536.         THIS_
  2537.         OUT PULONG Id
  2538.         ) PURE;
  2539.     // Setting the current process automatically
  2540.     // sets the current thread to the thread that
  2541.     // was last current in that process.
  2542.     STDMETHOD(SetCurrentProcessId)(
  2543.         THIS_
  2544.         IN ULONG Id
  2545.         ) PURE;
  2546.     // Gets the number of threads in the current process.
  2547.     STDMETHOD(GetNumberThreads)(
  2548.         THIS_
  2549.         OUT PULONG Number
  2550.         ) PURE;
  2551.     // Gets thread count information for all processes
  2552.     // and the largest number of threads in a single process.
  2553.     STDMETHOD(GetTotalNumberThreads)(
  2554.         THIS_
  2555.         OUT PULONG Total,
  2556.         OUT PULONG LargestProcess
  2557.         ) PURE;
  2558.     STDMETHOD(GetThreadIdsByIndex)(
  2559.         THIS_
  2560.         IN ULONG Start,
  2561.         IN ULONG Count,
  2562.         OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
  2563.         OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
  2564.         ) PURE;
  2565.     // Gets the debugger ID for the thread
  2566.     // currently running on the given
  2567.     // processor.  Only works in kernel
  2568.     // debugging.
  2569.     STDMETHOD(GetThreadIdByProcessor)(
  2570.         THIS_
  2571.         IN ULONG Processor,
  2572.         OUT PULONG Id
  2573.         ) PURE;
  2574.     // Returns the offset of the current threads
  2575.     // system data structure.  When kernel debugging
  2576.     // this is the offset of the KTHREAD.
  2577.     // When user debugging it is the offset
  2578.     // of the current TEB.
  2579.     STDMETHOD(GetCurrentThreadDataOffset)(
  2580.         THIS_
  2581.         OUT PULONG64 Offset
  2582.         ) PURE;
  2583.     // Looks up a debugger thread ID for the given
  2584.     // system thread data structure.
  2585.     // Currently when kernel debugging this will fail
  2586.     // if the thread is not executing on a processor.
  2587.     STDMETHOD(GetThreadIdByDataOffset)(
  2588.         THIS_
  2589.         IN ULONG64 Offset,
  2590.         OUT PULONG Id
  2591.         ) PURE;
  2592.     // Returns the offset of the current threads
  2593.     // TEB.  In user mode this is equivalent to
  2594.     // the threads data offset.
  2595.     STDMETHOD(GetCurrentThreadTeb)(
  2596.         THIS_
  2597.         OUT PULONG64 Offset
  2598.         ) PURE;
  2599.     // Looks up a debugger thread ID for the given TEB.
  2600.     // Currently when kernel debugging this will fail
  2601.     // if the thread is not executing on a processor.
  2602.     STDMETHOD(GetThreadIdByTeb)(
  2603.         THIS_
  2604.         IN ULONG64 Offset,
  2605.         OUT PULONG Id
  2606.         ) PURE;
  2607.     // Returns the system unique ID for the current thread.
  2608.     // Not currently supported when kernel debugging.
  2609.     STDMETHOD(GetCurrentThreadSystemId)(
  2610.         THIS_
  2611.         OUT PULONG SysId
  2612.         ) PURE;
  2613.     // Looks up a debugger thread ID for the given
  2614.     // system thread ID.
  2615.     // Currently when kernel debugging this will fail
  2616.     // if the thread is not executing on a processor.
  2617.     STDMETHOD(GetThreadIdBySystemId)(
  2618.         THIS_
  2619.         IN ULONG SysId,
  2620.         OUT PULONG Id
  2621.         ) PURE;
  2622.     // Returns the handle of the current thread.
  2623.     // In kernel mode the value returned is the
  2624.     // index of the processor the thread is
  2625.     // executing on plus one.
  2626.     STDMETHOD(GetCurrentThreadHandle)(
  2627.         THIS_
  2628.         OUT PULONG64 Handle
  2629.         ) PURE;
  2630.     // Looks up a debugger thread ID for the given handle.
  2631.     // Currently when kernel debugging this will fail
  2632.     // if the thread is not executing on a processor.
  2633.     STDMETHOD(GetThreadIdByHandle)(
  2634.         THIS_
  2635.         IN ULONG64 Handle,
  2636.         OUT PULONG Id
  2637.         ) PURE;
  2638.     
  2639.     // Currently kernel mode sessions will only have
  2640.     // a single process representing kernel space.
  2641.     STDMETHOD(GetNumberProcesses)(
  2642.         THIS_
  2643.         OUT PULONG Number
  2644.         ) PURE;
  2645.     STDMETHOD(GetProcessIdsByIndex)(
  2646.         THIS_
  2647.         IN ULONG Start,
  2648.         IN ULONG Count,
  2649.         OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
  2650.         OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
  2651.         ) PURE;
  2652.     // Returns the offset of the current processs
  2653.     // system data structure.  When kernel debugging
  2654.     // this is the offset of the KPROCESS of
  2655.     // the process that owns the current thread.
  2656.     // When user debugging it is the offset
  2657.     // of the current PEB.
  2658.     STDMETHOD(GetCurrentProcessDataOffset)(
  2659.         THIS_
  2660.         OUT PULONG64 Offset
  2661.         ) PURE;
  2662.     // Looks up a debugger process ID for the given
  2663.     // system process data structure.
  2664.     // Not currently supported when kernel debugging.
  2665.     STDMETHOD(GetProcessIdByDataOffset)(
  2666.         THIS_
  2667.         IN ULONG64 Offset,
  2668.         OUT PULONG Id
  2669.         ) PURE;
  2670.     // Returns the offset of the current processs
  2671.     // PEB.  In user mode this is equivalent to
  2672.     // the processs data offset.
  2673.     STDMETHOD(GetCurrentProcessPeb)(
  2674.         THIS_
  2675.         OUT PULONG64 Offset
  2676.         ) PURE;
  2677.     // Looks up a debugger process ID for the given PEB.
  2678.     // Not currently supported when kernel debugging.
  2679.     STDMETHOD(GetProcessIdByPeb)(
  2680.         THIS_
  2681.         IN ULONG64 Offset,
  2682.         OUT PULONG Id
  2683.         ) PURE;
  2684.     // Returns the system unique ID for the current process.
  2685.     // Not currently supported when kernel debugging.
  2686.     STDMETHOD(GetCurrentProcessSystemId)(
  2687.         THIS_
  2688.         OUT PULONG SysId
  2689.         ) PURE;
  2690.     // Looks up a debugger process ID for the given
  2691.     // system process ID.
  2692.     // Not currently supported when kernel debugging.
  2693.     STDMETHOD(GetProcessIdBySystemId)(
  2694.         THIS_                                      
  2695.         IN ULONG SysId,
  2696.         OUT PULONG Id
  2697.         ) PURE;
  2698.     // Returns the handle of the current process.
  2699.     // In kernel mode this is the kernel processs
  2700.     // artificial handle used for symbol operations
  2701.     // and so can only be used with dbghelp APIs.
  2702.     STDMETHOD(GetCurrentProcessHandle)(
  2703.         THIS_
  2704.         OUT PULONG64 Handle
  2705.         ) PURE;
  2706.     // Looks up a debugger process ID for the given handle.
  2707.     STDMETHOD(GetProcessIdByHandle)(
  2708.         THIS_
  2709.         IN ULONG64 Handle,
  2710.         OUT PULONG Id
  2711.         ) PURE;
  2712.     // Retrieve the name of the executable loaded
  2713.     // in the process.  This may fail if no executable
  2714.     // was identified.
  2715.     STDMETHOD(GetCurrentProcessExecutableName)(
  2716.         THIS_
  2717.         OUT OPTIONAL PSTR Buffer,
  2718.         IN ULONG BufferSize,
  2719.         OUT OPTIONAL PULONG ExeSize
  2720.         ) PURE;
  2721. };
  2722. #undef INTERFACE
  2723. #define INTERFACE IDebugSystemObjects2
  2724. DECLARE_INTERFACE_(IDebugSystemObjects2, IUnknown)
  2725. {
  2726.     // IUnknown.
  2727.     STDMETHOD(QueryInterface)(
  2728.         THIS_
  2729.         IN REFIID InterfaceId,
  2730.         OUT PVOID* Interface
  2731.         ) PURE;
  2732.     STDMETHOD_(ULONG, AddRef)(
  2733.         THIS
  2734.         ) PURE;
  2735.     STDMETHOD_(ULONG, Release)(
  2736.         THIS
  2737.         ) PURE;
  2738.     // IDebugSystemObjects.
  2739.     
  2740.     // In user mode debugging the debugger
  2741.     // tracks all threads and processes and
  2742.     // enumerates them through the following
  2743.     // methods.  When enumerating threads
  2744.     // the threads are enumerated for the current
  2745.     // process.
  2746.     // Kernel mode debugging currently is
  2747.     // limited to enumerating only the threads
  2748.     // assigned to processors, not all of
  2749.     // the threads in the system.  Process
  2750.     // enumeration is limited to a single
  2751.     // virtual process representing kernel space.
  2752.     
  2753.     // Returns the ID of the thread on which
  2754.     // the last event occurred.
  2755.     STDMETHOD(GetEventThread)(
  2756.         THIS_
  2757.         OUT PULONG Id
  2758.         ) PURE;
  2759.     STDMETHOD(GetEventProcess)(
  2760.         THIS_
  2761.         OUT PULONG Id
  2762.         ) PURE;
  2763.     
  2764.     // Controls implicit thread used by the
  2765.     // debug engine.  The debuggers current
  2766.     // thread is just a piece of data held
  2767.     // by the debugger for calls which use
  2768.     // thread-specific information.  In those
  2769.     // calls the debuggers current thread is used.
  2770.     // The debuggers current thread is not related
  2771.     // to any system thread attribute.
  2772.     // IDs for threads are small integer IDs
  2773.     // maintained by the engine.  They are not
  2774.     // related to system thread IDs.
  2775.     STDMETHOD(GetCurrentThreadId)(
  2776.         THIS_
  2777.         OUT PULONG Id
  2778.         ) PURE;
  2779.     STDMETHOD(SetCurrentThreadId)(
  2780.         THIS_
  2781.         IN ULONG Id
  2782.         ) PURE;
  2783.     // The current process is the process
  2784.     // that owns the current thread.
  2785.     STDMETHOD(GetCurrentProcessId)(
  2786.         THIS_
  2787.         OUT PULONG Id
  2788.         ) PURE;
  2789.     // Setting the current process automatically
  2790.     // sets the current thread to the thread that
  2791.     // was last current in that process.
  2792.     STDMETHOD(SetCurrentProcessId)(
  2793.         THIS_
  2794.         IN ULONG Id
  2795.         ) PURE;
  2796.     // Gets the number of threads in the current process.
  2797.     STDMETHOD(GetNumberThreads)(
  2798.         THIS_
  2799.         OUT PULONG Number
  2800.         ) PURE;
  2801.     // Gets thread count information for all processes
  2802.     // and the largest number of threads in a single process.
  2803.     STDMETHOD(GetTotalNumberThreads)(
  2804.         THIS_
  2805.         OUT PULONG Total,
  2806.         OUT PULONG LargestProcess
  2807.         ) PURE;
  2808.     STDMETHOD(GetThreadIdsByIndex)(
  2809.         THIS_
  2810.         IN ULONG Start,
  2811.         IN ULONG Count,
  2812.         OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
  2813.         OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
  2814.         ) PURE;
  2815.     // Gets the debugger ID for the thread
  2816.     // currently running on the given
  2817.     // processor.  Only works in kernel
  2818.     // debugging.
  2819.     STDMETHOD(GetThreadIdByProcessor)(
  2820.         THIS_
  2821.         IN ULONG Processor,
  2822.         OUT PULONG Id
  2823.         ) PURE;
  2824.     // Returns the offset of the current threads
  2825.     // system data structure.  When kernel debugging
  2826.     // this is the offset of the KTHREAD.
  2827.     // When user debugging it is the offset
  2828.     // of the current TEB.
  2829.     STDMETHOD(GetCurrentThreadDataOffset)(
  2830.         THIS_
  2831.         OUT PULONG64 Offset
  2832.         ) PURE;
  2833.     // Looks up a debugger thread ID for the given
  2834.     // system thread data structure.
  2835.     // Currently when kernel debugging this will fail
  2836.     // if the thread is not executing on a processor.
  2837.     STDMETHOD(GetThreadIdByDataOffset)(
  2838.         THIS_
  2839.         IN ULONG64 Offset,
  2840.         OUT PULONG Id
  2841.         ) PURE;
  2842.     // Returns the offset of the current threads
  2843.     // TEB.  In user mode this is equivalent to
  2844.     // the threads data offset.
  2845.     STDMETHOD(GetCurrentThreadTeb)(
  2846.         THIS_
  2847.         OUT PULONG64 Offset
  2848.         ) PURE;
  2849.     // Looks up a debugger thread ID for the given TEB.
  2850.     // Currently when kernel debugging this will fail
  2851.     // if the thread is not executing on a processor.
  2852.     STDMETHOD(GetThreadIdByTeb)(
  2853.         THIS_
  2854.         IN ULONG64 Offset,
  2855.         OUT PULONG Id
  2856.         ) PURE;
  2857.     // Returns the system unique ID for the current thread.
  2858.     // Not currently supported when kernel debugging.
  2859.     STDMETHOD(GetCurrentThreadSystemId)(
  2860.         THIS_
  2861.         OUT PULONG SysId
  2862.         ) PURE;
  2863.     // Looks up a debugger thread ID for the given
  2864.     // system thread ID.
  2865.     // Currently when kernel debugging this will fail
  2866.     // if the thread is not executing on a processor.
  2867.     STDMETHOD(GetThreadIdBySystemId)(
  2868.         THIS_
  2869.         IN ULONG SysId,
  2870.         OUT PULONG Id
  2871.         ) PURE;
  2872.     // Returns the handle of the current thread.
  2873.     // In kernel mode the value returned is the
  2874.     // index of the processor the thread is
  2875.     // executing on plus one.
  2876.     STDMETHOD(GetCurrentThreadHandle)(
  2877.         THIS_
  2878.         OUT PULONG64 Handle
  2879.         ) PURE;
  2880.     // Looks up a debugger thread ID for the given handle.
  2881.     // Currently when kernel debugging this will fail
  2882.     // if the thread is not executing on a processor.
  2883.     STDMETHOD(GetThreadIdByHandle)(
  2884.         THIS_
  2885.         IN ULONG64 Handle,
  2886.         OUT PULONG Id
  2887.         ) PURE;
  2888.     
  2889.     // Currently kernel mode sessions will only have
  2890.     // a single process representing kernel space.
  2891.     STDMETHOD(GetNumberProcesses)(
  2892.         THIS_
  2893.         OUT PULONG Number
  2894.         ) PURE;
  2895.     STDMETHOD(GetProcessIdsByIndex)(
  2896.         THIS_
  2897.         IN ULONG Start,
  2898.         IN ULONG Count,
  2899.         OUT OPTIONAL /* size_is(Count) */ PULONG Ids,
  2900.         OUT OPTIONAL /* size_is(Count) */ PULONG SysIds
  2901.         ) PURE;
  2902.     // Returns the offset of the current processs
  2903.     // system data structure.  When kernel debugging
  2904.     // this is the offset of the KPROCESS of
  2905.     // the process that owns the current thread.
  2906.     // When user debugging it is the offset
  2907.     // of the current PEB.
  2908.     STDMETHOD(GetCurrentProcessDataOffset)(
  2909.         THIS_
  2910.         OUT PULONG64 Offset
  2911.         ) PURE;
  2912.     // Looks up a debugger process ID for the given
  2913.     // system process data structure.
  2914.     // Not currently supported when kernel debugging.
  2915.     STDMETHOD(GetProcessIdByDataOffset)(
  2916.         THIS_
  2917.         IN ULONG64 Offset,
  2918.         OUT PULONG Id
  2919.         ) PURE;
  2920.     // Returns the offset of the current processs
  2921.     // PEB.  In user mode this is equivalent to
  2922.     // the processs data offset.
  2923.     STDMETHOD(GetCurrentProcessPeb)(
  2924.         THIS_
  2925.         OUT PULONG64 Offset
  2926.         ) PURE;
  2927.     // Looks up a debugger process ID for the given PEB.
  2928.     // Not currently supported when kernel debugging.
  2929.     STDMETHOD(GetProcessIdByPeb)(
  2930.         THIS_
  2931.         IN ULONG64 Offset,
  2932.         OUT PULONG Id
  2933.         ) PURE;
  2934.     // Returns the system unique ID for the current process.
  2935.     // Not currently supported when kernel debugging.
  2936.     STDMETHOD(GetCurrentProcessSystemId)(
  2937.         THIS_
  2938.         OUT PULONG SysId
  2939.         ) PURE;
  2940.     // Looks up a debugger process ID for the given
  2941.     // system process ID.
  2942.     // Not currently supported when kernel debugging.
  2943.     STDMETHOD(GetProcessIdBySystemId)(
  2944.         THIS_                                      
  2945.         IN ULONG SysId,
  2946.         OUT PULONG Id
  2947.         ) PURE;
  2948.     // Returns the handle of the current process.
  2949.     // In kernel mode this is the kernel processs
  2950.     // artificial handle used for symbol operations
  2951.     // and so can only be used with dbghelp APIs.
  2952.     STDMETHOD(GetCurrentProcessHandle)(
  2953.         THIS_
  2954.         OUT PULONG64 Handle
  2955.         ) PURE;
  2956.     // Looks up a debugger process ID for the given handle.
  2957.     STDMETHOD(GetProcessIdByHandle)(
  2958.         THIS_
  2959.         IN ULONG64 Handle,
  2960.         OUT PULONG Id
  2961.         ) PURE;
  2962.     // Retrieve the name of the executable loaded
  2963.     // in the process.  This may fail if no executable
  2964.     // was identified.
  2965.     STDMETHOD(GetCurrentProcessExecutableName)(
  2966.         THIS_
  2967.         OUT OPTIONAL PSTR Buffer,
  2968.         IN ULONG BufferSize,
  2969.         OUT OPTIONAL PULONG ExeSize
  2970.         ) PURE;
  2971.     // IDebugSystemObjects2.
  2972.     // Return the number of seconds that the current
  2973.     // process has been running.
  2974.     STDMETHOD(GetCurrentProcessUpTime)(
  2975.         THIS_
  2976.         OUT PULONG UpTime
  2977.         ) PURE;
  2978.     // During kernel sessions the debugger retrieves
  2979.     // some information from the system thread and process
  2980.     // running on the current processor.  For example,
  2981.     // the debugger will retrieve virtual memory translation
  2982.     // information for when the debugger needs to
  2983.     // carry out its own virtual to physical translations.
  2984.     // Occasionally it can be interesting to perform
  2985.     // similar operations but on a process which isnt
  2986.     // currently running.  The follow methods allow a caller
  2987.     // to override the data offsets used by the debugger
  2988.     // so that other system threads and processes can
  2989.     // be used instead.  These values are defaulted to
  2990.     // the thread and process running on the current
  2991.     // processor each time the debuggee executes or
  2992.     // the current processor changes.
  2993.     // The thread and process settings are independent so
  2994.     // it is possible to refer to a thread in a process
  2995.     // other than the current process and vice versa.
  2996.     // Setting an offset of zero will reload the
  2997.     // default value.
  2998.     STDMETHOD(GetImplicitThreadDataOffset)(
  2999.         THIS_
  3000.         OUT PULONG64 Offset
  3001.         ) PURE;
  3002.     STDMETHOD(SetImplicitThreadDataOffset)(
  3003.         THIS_
  3004.         IN ULONG64 Offset
  3005.         ) PURE;
  3006.     STDMETHOD(GetImplicitProcessDataOffset)(
  3007.         THIS_
  3008.         OUT PULONG64 Offset
  3009.         ) PURE;
  3010.     STDMETHOD(SetImplicitProcessDataOffset)(
  3011.         THIS_
  3012.         IN ULONG64 Offset
  3013.         ) PURE;
  3014. };
  3015. //----------------------------------------------------------------------------
  3016. //
  3017. // Extension callbacks.
  3018. //
  3019. //----------------------------------------------------------------------------
  3020. // Returns a version with the major version in
  3021. // the high word and the minor version in the low word.
  3022. #define DEBUG_EXTENSION_VERSION(Major, Minor) 
  3023.     ((((Major) & 0xffff) << 16) | ((Minor) & 0xffff))
  3024. // Initialization routine.  Called once when the extension DLL
  3025. // is loaded.  Returns a version and returns flags detailing
  3026. // overall qualities of the extension DLL.
  3027. // A session may or may not be active at the time the DLL
  3028. // is loaded so initialization routines should not expect
  3029. // to be able to query session information.
  3030. typedef HRESULT (CALLBACK* PDEBUG_EXTENSION_INITIALIZE)
  3031.     (OUT PULONG Version, OUT PULONG Flags);
  3032. // Exit routine.  Called once just before the extension DLL is
  3033. // unloaded.  As with initialization, a session may or
  3034. // may not be active at the time of the call.
  3035. typedef void (CALLBACK* PDEBUG_EXTENSION_UNINITIALIZE)
  3036.     (void);
  3037. // A debuggee has been discovered for the session.  It
  3038. // is not necessarily halted.
  3039. #define DEBUG_NOTIFY_SESSION_ACTIVE       0x00000000
  3040. // The session no longer has a debuggee.
  3041. #define DEBUG_NOTIFY_SESSION_INACTIVE     0x00000001
  3042. // The debuggee is halted and accessible.
  3043. #define DEBUG_NOTIFY_SESSION_ACCESSIBLE   0x00000002
  3044. // The debuggee is running or inaccessible.
  3045. #define DEBUG_NOTIFY_SESSION_INACCESSIBLE 0x00000003
  3046. typedef void (CALLBACK* PDEBUG_EXTENSION_NOTIFY)
  3047.     (IN ULONG Notify, IN ULONG64 Argument);
  3048. // A PDEBUG_EXTENSION_CALL function can return this code
  3049. // to indicate that it was unable to handle the request
  3050. // and that the search for an extension function should
  3051. // continue down the extension DLL chain.
  3052. // Taken from STATUS_VALIDATE_CONTINUE
  3053. #define DEBUG_EXTENSION_CONTINUE_SEARCH 
  3054.     HRESULT_FROM_NT(0xC0000271L)
  3055. // Every routine in an extension DLL has the following prototype.
  3056. // The extension may be called from multiple clients so it
  3057. // should not cache the client value between calls.
  3058. typedef HRESULT (CALLBACK* PDEBUG_EXTENSION_CALL)
  3059.     (IN PDEBUG_CLIENT Client, IN OPTIONAL PCSTR Args);
  3060. //----------------------------------------------------------------------------
  3061. //
  3062. // Extension functions.
  3063. //
  3064. // Extension functions differ from extension callbacks in that
  3065. // they are arbitrary functions exported from an extension DLL
  3066. // for other code callers instead of for human invocation from
  3067. // debugger commands.  Extension function pointers are retrieved
  3068. // for an extension DLL with IDebugControl::GetExtensionFunction.
  3069. //
  3070. // Extension function names must begin with _EFN_.  Other than that
  3071. // they can have any name and prototype.  Extension functions
  3072. // must be public exports of their extension DLL.  They should
  3073. // have a typedef for their function pointer prototype in an
  3074. // extension header so that callers have a header file to include
  3075. // with a type that allows a correctly-formed invocation of the
  3076. // extension function.
  3077. //
  3078. // The engine does not perform any validation of calls to
  3079. // extension functions.  Once the extension function pointer
  3080. // is retrieved with GetExtensionFunction all calls go
  3081. // directly between the caller and the extension function and
  3082. // are not mediated by the engine.
  3083. //
  3084. //----------------------------------------------------------------------------
  3085. #ifdef __cplusplus
  3086. };
  3087. //----------------------------------------------------------------------------
  3088. //
  3089. // C++ implementation helper classes.
  3090. //
  3091. //----------------------------------------------------------------------------
  3092. #ifndef DEBUG_NO_IMPLEMENTATION
  3093. //
  3094. // DebugBaseEventCallbacks provides a do-nothing base implementation
  3095. // of IDebugEventCallbacks.  A program can derive their own
  3096. // event callbacks class from DebugBaseEventCallbacks and implement
  3097. // only the methods they are interested in.  Programs must be
  3098. // careful to implement GetInterestMask appropriately.
  3099. //
  3100. class DebugBaseEventCallbacks : public IDebugEventCallbacks
  3101. {
  3102. public:
  3103.     // IUnknown.
  3104.     STDMETHOD(QueryInterface)(
  3105.         THIS_
  3106.         IN REFIID InterfaceId,
  3107.         OUT PVOID* Interface
  3108.         )
  3109.     {
  3110.         *Interface = NULL;
  3111. #if _MSC_VER >= 1100
  3112.         if (IsEqualIID(InterfaceId, __uuidof(IUnknown)) ||
  3113.             IsEqualIID(InterfaceId, __uuidof(IDebugEventCallbacks)))
  3114. #else
  3115.         if (IsEqualIID(InterfaceId, IID_IUnknown) ||
  3116.             IsEqualIID(InterfaceId, IID_IDebugEventCallbacks))
  3117. #endif
  3118.         {
  3119.             *Interface = (IDebugEventCallbacks *)this;
  3120.             AddRef();
  3121.             return S_OK;
  3122.         }
  3123.         else
  3124.         {
  3125.             return E_NOINTERFACE;
  3126.         }
  3127.     }
  3128.     // IDebugEventCallbacks.
  3129.     
  3130.     STDMETHOD(Breakpoint)(
  3131.         THIS_
  3132.         IN PDEBUG_BREAKPOINT Bp
  3133.         )
  3134.     {
  3135.         UNREFERENCED_PARAMETER(Bp);
  3136.         return DEBUG_STATUS_NO_CHANGE;
  3137.     }
  3138.     STDMETHOD(Exception)(
  3139.         THIS_
  3140.         IN PEXCEPTION_RECORD64 Exception,
  3141.         IN ULONG FirstChance
  3142.         )
  3143.     {
  3144.         UNREFERENCED_PARAMETER(Exception);
  3145.         UNREFERENCED_PARAMETER(FirstChance);
  3146.         return DEBUG_STATUS_NO_CHANGE;
  3147.     }
  3148.     STDMETHOD(CreateThread)(
  3149.         THIS_
  3150.         IN ULONG64 Handle,
  3151.         IN ULONG64 DataOffset,
  3152.         IN ULONG64 StartOffset
  3153.         )
  3154.     {
  3155.         UNREFERENCED_PARAMETER(Handle);
  3156.         UNREFERENCED_PARAMETER(DataOffset);
  3157.         UNREFERENCED_PARAMETER(StartOffset);
  3158.         return DEBUG_STATUS_NO_CHANGE;
  3159.     }
  3160.     STDMETHOD(ExitThread)(
  3161.         THIS_
  3162.         IN ULONG ExitCode
  3163.         )
  3164.     {
  3165.         UNREFERENCED_PARAMETER(ExitCode);
  3166.         return DEBUG_STATUS_NO_CHANGE;
  3167.     }
  3168.     STDMETHOD(CreateProcess)(
  3169.         THIS_
  3170.         IN ULONG64 ImageFileHandle,
  3171.         IN ULONG64 Handle,
  3172.         IN ULONG64 BaseOffset,
  3173.         IN ULONG ModuleSize,
  3174.         IN PCSTR ModuleName,
  3175.         IN PCSTR ImageName,
  3176.         IN ULONG CheckSum,
  3177.         IN ULONG TimeDateStamp,
  3178.         IN ULONG64 InitialThreadHandle,
  3179.         IN ULONG64 ThreadDataOffset,
  3180.         IN ULONG64 StartOffset
  3181.         )
  3182.     {
  3183.         UNREFERENCED_PARAMETER(ImageFileHandle);
  3184.         UNREFERENCED_PARAMETER(Handle);
  3185.         UNREFERENCED_PARAMETER(BaseOffset);
  3186.         UNREFERENCED_PARAMETER(ModuleSize);
  3187.         UNREFERENCED_PARAMETER(ModuleName);
  3188.         UNREFERENCED_PARAMETER(ImageName);
  3189.         UNREFERENCED_PARAMETER(CheckSum);
  3190.         UNREFERENCED_PARAMETER(TimeDateStamp);
  3191.         UNREFERENCED_PARAMETER(InitialThreadHandle);
  3192.         UNREFERENCED_PARAMETER(ThreadDataOffset);
  3193.         UNREFERENCED_PARAMETER(StartOffset);
  3194.         return DEBUG_STATUS_NO_CHANGE;
  3195.     }
  3196.     STDMETHOD(ExitProcess)(
  3197.         THIS_
  3198.         IN ULONG ExitCode
  3199.         )
  3200.     {
  3201.         UNREFERENCED_PARAMETER(ExitCode);
  3202.         return DEBUG_STATUS_NO_CHANGE;
  3203.     }
  3204.     STDMETHOD(LoadModule)(
  3205.         THIS_
  3206.         IN ULONG64 ImageFileHandle,
  3207.         IN ULONG64 BaseOffset,
  3208.         IN ULONG ModuleSize,
  3209.         IN PCSTR ModuleName,
  3210.         IN PCSTR ImageName,
  3211.         IN ULONG CheckSum,
  3212.         IN ULONG TimeDateStamp
  3213.         )
  3214.     {
  3215.         UNREFERENCED_PARAMETER(ImageFileHandle);
  3216.         UNREFERENCED_PARAMETER(BaseOffset);
  3217.         UNREFERENCED_PARAMETER(ModuleSize);
  3218.         UNREFERENCED_PARAMETER(ModuleName);
  3219.         UNREFERENCED_PARAMETER(ImageName);
  3220.         UNREFERENCED_PARAMETER(CheckSum);
  3221.         UNREFERENCED_PARAMETER(TimeDateStamp);
  3222.         return DEBUG_STATUS_NO_CHANGE;
  3223.     }
  3224.     STDMETHOD(UnloadModule)(
  3225.         THIS_
  3226.         IN PCSTR ImageBaseName,
  3227.         IN ULONG64 BaseOffset
  3228.         )
  3229.     {
  3230.         UNREFERENCED_PARAMETER(ImageBaseName);
  3231.         UNREFERENCED_PARAMETER(BaseOffset);
  3232.         return DEBUG_STATUS_NO_CHANGE;
  3233.     }
  3234.     STDMETHOD(SystemError)(
  3235.         THIS_
  3236.         IN ULONG Error,
  3237.         IN ULONG Level
  3238.         )
  3239.     {
  3240.         UNREFERENCED_PARAMETER(Error);
  3241.         UNREFERENCED_PARAMETER(Level);
  3242.         return DEBUG_STATUS_NO_CHANGE;
  3243.     }
  3244.     STDMETHOD(SessionStatus)(
  3245.         THIS_
  3246.         IN ULONG Status
  3247.         )
  3248.     {
  3249.         UNREFERENCED_PARAMETER(Status);
  3250.         return DEBUG_STATUS_NO_CHANGE;
  3251.     }
  3252.     STDMETHOD(ChangeDebuggeeState)(
  3253.         THIS_
  3254.         IN ULONG Flags,
  3255.         IN ULONG64 Argument
  3256.         )
  3257.     {
  3258.         UNREFERENCED_PARAMETER(Flags);
  3259.         UNREFERENCED_PARAMETER(Argument);
  3260.         return S_OK;
  3261.     }
  3262.     STDMETHOD(ChangeEngineState)(
  3263.         THIS_
  3264.         IN ULONG Flags,
  3265.         IN ULONG64 Argument
  3266.         )
  3267.     {
  3268.         UNREFERENCED_PARAMETER(Flags);
  3269.         UNREFERENCED_PARAMETER(Argument);
  3270.         return S_OK;
  3271.     }
  3272.     STDMETHOD(ChangeSymbolState)(
  3273.         THIS_
  3274.         IN ULONG Flags,
  3275.         IN ULONG64 Argument
  3276.         )
  3277.     {
  3278.         UNREFERENCED_PARAMETER(Flags);
  3279.         UNREFERENCED_PARAMETER(Argument);
  3280.         return S_OK;
  3281.     }
  3282. };
  3283. #endif // #ifndef DEBUG_NO_IMPLEMENTATION
  3284. #endif // #ifdef __cplusplus
  3285. #endif // #ifndef __DBGENG_H__