Beispiel #1
0
        public DacLibrary(DataTarget dataTarget, string dacDll)
        {
            if (dataTarget is null)
            {
                throw new ArgumentNullException(nameof(dataTarget));
            }

            if (dataTarget.ClrVersions.Count == 0)
            {
                throw new ClrDiagnosticsException("Process is not a CLR process!");
            }

            IntPtr dacLibrary = DataTarget.PlatformFunctions.LoadLibrary(dacDll);

            if (dacLibrary == IntPtr.Zero)
            {
                throw new ClrDiagnosticsException("Failed to load dac: " + dacLibrary);
            }

            OwningLibrary = new RefCountedFreeLibrary(dacLibrary);

            IntPtr initAddr = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "DAC_PAL_InitializeDLL");

            if (initAddr == IntPtr.Zero)
            {
                initAddr = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "PAL_InitializeDLL");
            }

            if (initAddr != IntPtr.Zero)
            {
                IntPtr dllMain = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "DllMain");
                if (dllMain == IntPtr.Zero)
                {
                    throw new ClrDiagnosticsException("Failed to obtain Dac DllMain");
                }

                DllMain main = (DllMain)Marshal.GetDelegateForFunctionPointer(dllMain, typeof(DllMain));
                main(dacLibrary, 1, IntPtr.Zero);
            }

            IntPtr addr = DataTarget.PlatformFunctions.GetProcAddress(dacLibrary, "CLRDataCreateInstance");

            if (addr == IntPtr.Zero)
            {
                throw new ClrDiagnosticsException("Failed to obtain Dac CLRDataCreateInstance");
            }

            DacDataTarget = new DacDataTargetWrapper(dataTarget);

            CreateDacInstance func = (CreateDacInstance)Marshal.GetDelegateForFunctionPointer(addr, typeof(CreateDacInstance));
            Guid guid = new Guid("5c552ab6-fc09-4cb3-8e36-22fa03c798b7");
            int  res  = func(ref guid, DacDataTarget.IDacDataTarget, out IntPtr iUnk);

            if (res != 0)
            {
                throw new ClrDiagnosticsException($"Failure loading DAC: CreateDacInstance failed 0x{res:x}", ClrDiagnosticsExceptionKind.DacError, res);
            }

            InternalDacPrivateInterface = new ClrDataProcess(this, iUnk);
        }
Beispiel #2
0
        public DacLibrary(DataTarget dataTarget, IntPtr pClrDataProcess)
        {
            if (dataTarget is null)
            {
                throw new ArgumentNullException(nameof(dataTarget));
            }

            if (pClrDataProcess == IntPtr.Zero)
            {
                throw new ArgumentNullException(nameof(pClrDataProcess));
            }

            InternalDacPrivateInterface = new ClrDataProcess(this, pClrDataProcess);
            DacDataTarget = new DacDataTargetWrapper(dataTarget);
        }