/// <summary> /// Detects if a native module represents a CLR and if so provides the debugging interface /// and versioning information /// </summary> /// <param name="moduleBaseAddress">The native base address of a module which might be a CLR</param> /// <param name="dataTarget">The process abstraction which can be used for inspection</param> /// <param name="libraryProvider">A callback interface for locating version specific debug libraries /// such as mscordbi.dll and mscordacwks.dll</param> /// <param name="maxDebuggerSupportedVersion">The highest version of the CLR/debugging libraries which /// the caller can support</param> /// <param name="version">The version of the CLR detected or null if no CLR was detected</param> /// <param name="flags">Flags which have additional information about the CLR. /// See ClrDebuggingProcessFlags for more details</param> /// <returns>The CLR's debugging interface</returns> public ICorDebugProcess OpenVirtualProcess(ulong moduleBaseAddress, ICorDebugDataTarget dataTarget, ICLRDebuggingLibraryProvider libraryProvider, Version maxDebuggerSupportedVersion, out Version version, out ClrDebuggingProcessFlags flags) { ICorDebugProcess process; int hr = TryOpenVirtualProcess(moduleBaseAddress, dataTarget, libraryProvider, maxDebuggerSupportedVersion, out version, out flags, out process); if (hr < 0) { throw new COMException("Failed to OpenVirtualProcess for module at " + moduleBaseAddress + ".", hr); } return(process); }
/// <summary> /// Version of the above that doesn't throw exceptions on failure /// </summary> public int TryOpenVirtualProcess( ulong moduleBaseAddress, ICorDebugDataTarget dataTarget, ICLRDebuggingLibraryProvider libraryProvider, Version maxDebuggerSupportedVersion, out Version version, out ClrDebuggingProcessFlags flags, out ICorDebugProcess process) { ClrDebuggingVersion maxSupport = new ClrDebuggingVersion(); ClrDebuggingVersion clrVersion = new ClrDebuggingVersion(); maxSupport.StructVersion = 0; maxSupport.Major = (short)maxDebuggerSupportedVersion.Major; maxSupport.Minor = (short)maxDebuggerSupportedVersion.Minor; maxSupport.Build = (short)maxDebuggerSupportedVersion.Build; maxSupport.Revision = (short)maxDebuggerSupportedVersion.Revision; object processIface = null; clrVersion.StructVersion = 0; Guid iid = typeof(ICorDebugProcess).GetGuid(); int result = _clrDebugging.OpenVirtualProcess( moduleBaseAddress, dataTarget, libraryProvider, ref maxSupport, ref iid, out processIface, ref clrVersion, out flags); // This may be set regardless of success/failure version = new Version(clrVersion.Major, clrVersion.Minor, clrVersion.Build, clrVersion.Revision); if (result < 0) { // OpenVirtualProcess failed process = null; return(result); } // Success process = (ICorDebugProcess)processIface; return(0); }
public static ICorDebugProcess CreateICorDebugProcess(ulong baseAddress, ICorDebugDataTarget dataTarget, ICLRDebuggingLibraryProvider libraryProvider) { Debug.Assert(baseAddress != 0); Version version; ClrDebuggingProcessFlags flags; ICorDebugProcess process; int errorCode = new CLRDebugging().TryOpenVirtualProcess(baseAddress, dataTarget, libraryProvider, new Version(4, 6, 0x7fff, 0x7fff), out version, out flags, out process); if (errorCode < 0) { if (((errorCode != -2146231228) && (errorCode != -2146231226)) && (errorCode != -2146231225)) { Marshal.ThrowExceptionForHR(errorCode); } process = null; } return process; }
public CorProcess OpenVirtualProcess(ulong moduleBaseAddress, ICorDebugDataTarget dataTarget, ICLRDebuggingLibraryProvider libraryProvider, Version maxDebuggerSupportedVersion, out Version version, out ClrDebuggingProcessFlags flags) { CorProcess process; int hr = TryOpenVirtualProcess(moduleBaseAddress, dataTarget, libraryProvider, maxDebuggerSupportedVersion, out version, out flags, out process); if (hr < 0) throw new COMException("Failed to OpenVirtualProcess for module at " + moduleBaseAddress + ".", hr); return process; }
public int TryOpenVirtualProcess(ulong moduleBaseAddress, ICorDebugDataTarget dataTarget, ICLRDebuggingLibraryProvider libraryProvider, Version maxDebuggerSupportedVersion, out Version version, out ClrDebuggingProcessFlags flags, out CorProcess process) { ClrDebuggingVersion maxSupport = new ClrDebuggingVersion(); ClrDebuggingVersion clrVersion = new ClrDebuggingVersion(); maxSupport.StructVersion = 0; maxSupport.Major = (short)maxDebuggerSupportedVersion.Major; maxSupport.Minor = (short)maxDebuggerSupportedVersion.Minor; maxSupport.Build = (short)maxDebuggerSupportedVersion.Build; maxSupport.Revision = (short)maxDebuggerSupportedVersion.Revision; object processIface = null; clrVersion.StructVersion = 0; Guid iid = typeof(ICorDebugProcess).GUID; int result = m_CLRDebugging.OpenVirtualProcess(moduleBaseAddress, dataTarget, libraryProvider, ref maxSupport, ref iid, out processIface, ref clrVersion, out flags); // This may be set regardless of success/failure version = new Version(clrVersion.Major, clrVersion.Minor, clrVersion.Build, clrVersion.Revision); if (result < 0) { // OpenVirtualProcess failed process = null; return result; } // Success process = CorProcess.GetCorProcess((ICorDebugProcess)processIface); return 0; }
public static ICorDebugProcess CreateICorDebugProcess(ulong baseAddress, ICorDebugDataTarget dataTarget, ICLRDebuggingLibraryProvider libraryProvider) { Debug.Assert(baseAddress != 0); Version version; ClrDebuggingProcessFlags flags; ICorDebugProcess process; int errorCode = new CLRDebugging().TryOpenVirtualProcess( baseAddress, dataTarget, libraryProvider, new Version(4, 6, 0x7fff, 0x7fff), out version, out flags, out process); if (errorCode < 0) { if (errorCode != -2146231228 && errorCode != -2146231226 && errorCode != -2146231225) { Marshal.ThrowExceptionForHR(errorCode); } process = null; } return(process); }