src/Microsoft.Diagnostics.Runtime/DbgEng/DebugControl.cs (164 lines of code) (raw):

// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Microsoft.Diagnostics.Runtime.Utilities; namespace Microsoft.Diagnostics.Runtime.DbgEng { internal sealed unsafe class DebugControl : CallableCOMWrapper { public const int INITIAL_BREAK = 0x20; internal static readonly Guid IID_IDebugControl2 = new("d4366723-44df-4bed-8c7e-4c05424f4588"); private readonly DebugSystemObjects _sys; public DebugControl(RefCountedFreeLibrary library, IntPtr pUnk, DebugSystemObjects sys) : base(library, IID_IDebugControl2, pUnk) { _sys = sys; SuppressRelease(); } private ref readonly IDebugControlVTable VTable => ref Unsafe.AsRef<IDebugControlVTable>(_vtable); public IMAGE_FILE_MACHINE GetEffectiveProcessorType() { using IDisposable holder = _sys.Enter(); int hr = VTable.GetEffectiveProcessorType(Self, out IMAGE_FILE_MACHINE result); if (hr == 0) return result; return IMAGE_FILE_MACHINE.UNKNOWN; } public bool IsPointer64Bit() { using IDisposable holder = _sys.Enter(); int hr = VTable.IsPointer64Bit(Self); return hr == 0; } public HResult WaitForEvent(uint timeout) { using IDisposable holder = _sys.Enter(); return VTable.WaitForEvent(Self, 0, timeout); } public HResult AddEngineOptions(int options) { using IDisposable holder = _sys.Enter(); return VTable.AddEngineOptions(Self, options); } public DEBUG_FORMAT GetDumpFormat() { using IDisposable holder = _sys.Enter(); HResult hr = VTable.GetDumpFormatFlags(Self, out DEBUG_FORMAT result); if (hr) return result; return DEBUG_FORMAT.DEFAULT; } public DEBUG_CLASS_QUALIFIER GetDebuggeeClassQualifier() { using IDisposable holder = _sys.Enter(); HResult hr = VTable.GetDebuggeeType(Self, out _, out DEBUG_CLASS_QUALIFIER result); DebugOnly.Assert(hr.IsOK); return result; } } [StructLayout(LayoutKind.Sequential)] internal readonly unsafe struct IDebugControlVTable { public readonly IntPtr GetInterrupt; public readonly IntPtr SetInterrupt; public readonly IntPtr GetInterruptTimeout; public readonly IntPtr SetInterruptTimeout; public readonly IntPtr GetLogFile; public readonly IntPtr OpenLogFile; public readonly IntPtr CloseLogFile; public readonly IntPtr GetLogMask; public readonly IntPtr SetLogMask; public readonly IntPtr Input; public readonly IntPtr ReturnInput; public readonly IntPtr Output; public readonly IntPtr OutputVaList; public readonly IntPtr ControlledOutput; public readonly IntPtr ControlledOutputVaList; public readonly IntPtr OutputPrompt; public readonly IntPtr OutputPromptVaList; public readonly IntPtr GetPromptText; public readonly IntPtr OutputCurrentState; public readonly IntPtr OutputVersionInformation; public readonly IntPtr GetNotifyEventHandle; public readonly IntPtr SetNotifyEventHandle; public readonly IntPtr Assemble; public readonly IntPtr Disassemble; public readonly IntPtr GetDisassembleEffectiveOffset; public readonly IntPtr OutputDisassembly; public readonly IntPtr OutputDisassemblyLines; public readonly IntPtr GetNearInstruction; public readonly IntPtr GetStackTrace; public readonly IntPtr GetReturnOffset; public readonly IntPtr OutputStackTrace; public readonly delegate* unmanaged[Stdcall]<IntPtr, out uint, out DEBUG_CLASS_QUALIFIER, int> GetDebuggeeType; public readonly IntPtr GetActualProcessorType; public readonly IntPtr GetExecutingProcessorType; public readonly IntPtr GetNumberPossibleExecutingProcessorTypes; public readonly IntPtr GetPossibleExecutingProcessorTypes; public readonly IntPtr GetNumberProcessors; public readonly IntPtr GetSystemVersion; public readonly IntPtr GetPageSize; public readonly delegate* unmanaged[Stdcall]<IntPtr, int> IsPointer64Bit; public readonly IntPtr ReadBugCheckData; public readonly IntPtr GetNumberSupportedProcessorTypes; public readonly IntPtr GetSupportedProcessorTypes; public readonly IntPtr GetProcessorTypeNames; public readonly delegate* unmanaged[Stdcall]<IntPtr, out IMAGE_FILE_MACHINE, int> GetEffectiveProcessorType; public readonly IntPtr SetEffectiveProcessorType; public readonly IntPtr GetExecutionStatus; public readonly IntPtr SetExecutionStatus; public readonly IntPtr GetCodeLevel; public readonly IntPtr SetCodeLevel; public readonly IntPtr GetEngineOptions; public readonly delegate* unmanaged[Stdcall]<IntPtr, int, int> AddEngineOptions; public readonly IntPtr RemoveEngineOptions; public readonly IntPtr SetEngineOptions; public readonly IntPtr GetSystemErrorControl; public readonly IntPtr SetSystemErrorControl; public readonly IntPtr GetTextMacro; public readonly IntPtr SetTextMacro; public readonly IntPtr GetRadix; public readonly IntPtr SetRadix; public readonly IntPtr Evaluate; public readonly IntPtr CoerceValue; public readonly IntPtr CoerceValues; public readonly IntPtr Execute; public readonly IntPtr ExecuteCommandFile; public readonly IntPtr GetNumberBreakpoints; public readonly IntPtr GetBreakpointByIndex; public readonly IntPtr GetBreakpointById; public readonly IntPtr GetBreakpointParameters; public readonly IntPtr AddBreakpoint; public readonly IntPtr RemoveBreakpoint; public readonly IntPtr AddExtension; public readonly IntPtr RemoveExtension; public readonly IntPtr GetExtensionByPath; public readonly IntPtr CallExtension; public readonly IntPtr GetExtensionFunction; public readonly IntPtr GetWindbgExtensionApis32; public readonly IntPtr GetWindbgExtensionApis64; public readonly IntPtr GetNumberEventFilters; public readonly IntPtr GetEventFilterText; public readonly IntPtr GetEventFilterCommand; public readonly IntPtr SetEventFilterCommand; public readonly IntPtr GetSpecificFilterParameters; public readonly IntPtr SetSpecificFilterParameters; public readonly IntPtr GetSpecificEventFilterArgument; public readonly IntPtr SetSpecificEventFilterArgument; public readonly IntPtr GetExceptionFilterParameters; public readonly IntPtr SetExceptionFilterParameters; public readonly IntPtr GetExceptionFilterSecondCommand; public readonly IntPtr SetExceptionFilterSecondCommand; public readonly delegate* unmanaged[Stdcall]<IntPtr, int, uint, int> WaitForEvent; public readonly IntPtr GetLastEventInformation; public readonly IntPtr GetCurrentTimeDate; public readonly IntPtr GetCurrentSystemUpTime; public readonly delegate* unmanaged[Stdcall]<IntPtr, out DEBUG_FORMAT, int> GetDumpFormatFlags; public readonly IntPtr GetNumberTextReplacements; public readonly IntPtr GetTextReplacement; public readonly IntPtr SetTextReplacement; public readonly IntPtr RemoveTextReplacements; public readonly IntPtr OutputTextReplacements; } }