protected unsafe bool ReadStream <T>(MINIDUMP_STREAM_TYPE streamToRead, out T streamData) { IntPtr streamPointer; uint streamSize; return(ReadStream <T>(streamToRead, out streamData, out streamPointer, out streamSize)); }
public static bool MiniDumpReadDumpStream(IntPtr pBase, MINIDUMP_STREAM_TYPE type, out IntPtr streamPointer, out uint cbStreamSize) { MINIDUMP_HEADER header = (MINIDUMP_HEADER)Marshal.PtrToStructure(pBase, typeof(MINIDUMP_HEADER)); streamPointer = IntPtr.Zero; cbStreamSize = 0; // todo: throw dump format exception here: if (header.Singature != MINIDUMP_SIGNATURE || (header.Version & 0xffff) != MINIDUMP_VERSION) { return(false); } int sizeOfDirectory = Marshal.SizeOf(typeof(MINIDUMP_DIRECTORY)); long dirs = pBase.ToInt64() + (int)header.StreamDirectoryRva; for (int i = 0; i < (int)header.NumberOfStreams; ++i) { MINIDUMP_DIRECTORY dir = (MINIDUMP_DIRECTORY)Marshal.PtrToStructure(new IntPtr(dirs + i * sizeOfDirectory), typeof(MINIDUMP_DIRECTORY)); if (dir.StreamType != type) { continue; } streamPointer = new IntPtr(pBase.ToInt64() + (int)dir.Rva); cbStreamSize = dir.DataSize; return(true); } return(false); }
/// <summary> /// Get a DumpPointer for the given stream. That can then be used to further decode the stream. /// </summary> /// <param name="type">type of stream to lookup</param> /// <returns>DumpPointer refering into the stream. </returns> private DumpPointer GetStream(MINIDUMP_STREAM_TYPE type) { if (!TryGetStream(type, out DumpPointer stream)) { throw new ClrDiagnosticsException("Dump does not contain a " + type + " stream.", ClrDiagnosticsExceptionKind.CrashDumpError); } return(stream); }
internal MINIDUMP_THREAD_LIST(DumpPointer streamPointer, MINIDUMP_STREAM_TYPE streamType) : base(streamPointer, streamType) { if (streamType != MINIDUMP_STREAM_TYPE.ThreadListStream && streamType != MINIDUMP_STREAM_TYPE.ThreadExListStream) { throw new ClrDiagnosticsException("Only ThreadListStream and ThreadExListStream are supported.", ClrDiagnosticsExceptionKind.CrashDumpError); } }
protected MinidumpArray(DumpPointer streamPointer, MINIDUMP_STREAM_TYPE streamType) { if (streamType != MINIDUMP_STREAM_TYPE.ModuleListStream && streamType != MINIDUMP_STREAM_TYPE.ThreadListStream && streamType != MINIDUMP_STREAM_TYPE.ThreadExListStream) { throw new ClrDiagnosticsException("MinidumpArray does not support this stream type.", ClrDiagnosticsExceptionKind.CrashDumpError); } _streamPointer = streamPointer; }
protected unsafe bool ReadStream <T>(MINIDUMP_STREAM_TYPE streamToRead, out T streamData, out IntPtr streamPointer, out uint streamSize) { streamData = default(T); if (ReadStream(streamToRead, out streamPointer, out streamSize)) { streamData = (T)Marshal.PtrToStructure(streamPointer, typeof(T)); return(true); } return(false); }
/// <summary> /// Get a DumpPointer for the given stream. That can then be used to further decode the stream. /// </summary> /// <param name="type">type of stream to lookup</param> /// <param name="stream">DumpPointer refering into the stream. </param> /// <returns>True if stream was succesfully retrived</returns> private bool TryGetStream(MINIDUMP_STREAM_TYPE type, out DumpPointer stream) { EnsureValid(); bool fOk = DumpNative.MiniDumpReadDumpStream(_view.BaseAddress, type, out IntPtr pStream, out uint cbStreamSize); if (!fOk || IntPtr.Zero == pStream || cbStreamSize < 1) { stream = default; return(false); } stream = DumpPointer.DangerousMakeDumpPointer(pStream, cbStreamSize); return(true); }
protected unsafe bool ReadStream <T>(MINIDUMP_STREAM_TYPE streamToRead, out T streamData, out IntPtr streamPointer, out uint streamSize) { MINIDUMP_DIRECTORY directory = new MINIDUMP_DIRECTORY(); streamData = default(T); streamPointer = IntPtr.Zero; streamSize = 0; try { byte *baseOfView = null; _mappedFileView.AcquirePointer(ref baseOfView); if (baseOfView == null) { throw new Exception("Unable to aquire pointer to memory mapped view"); } if (!NativeMethods.MiniDumpReadDumpStream((IntPtr)baseOfView, streamToRead, ref directory, ref streamPointer, ref streamSize)) { int lastError = Marshal.GetLastWin32Error(); if (lastError == DbgHelpErrors.ERR_ELEMENT_NOT_FOUND) { return(false); } else { throw new Win32Exception(lastError); } } streamData = (T)Marshal.PtrToStructure(streamPointer, typeof(T)); } finally { _mappedFileView.ReleasePointer(); } return(true); }
public MINIDUMP_DIRECTORY ReadStreamType(MINIDUMP_STREAM_TYPE strmType) { MINIDUMP_DIRECTORY dir = new MINIDUMP_DIRECTORY(); var initloc = new MINIDUMP_LOCATION_DESCRIPTOR() { Rva = 0, DataSize = AllocationGranularity }; if (MapStream(initloc) == IntPtr.Zero) { throw new InvalidOperationException("MapViewOfFileFailed"); } var dirPtr = IntPtr.Zero; dir.location = initloc; var _strmPtr = IntPtr.Zero; var _strmSize = 0u; if (MiniDumpReadDumpStream( _addrFileMapping, strmType, ref dirPtr, ref _strmPtr, ref _strmSize )) { dir = Marshal.PtrToStructure <MINIDUMP_DIRECTORY>(dirPtr); } else { dir.streamType = strmType; dir.location.Rva = 0; dir.location.DataSize = 0; } return(dir); }
public MinidumpMemoryChunks(DumpPointer rawStream, MINIDUMP_STREAM_TYPE type) { Count = 0; _memory64List = null; _memoryList = null; _listType = MINIDUMP_STREAM_TYPE.UnusedStream; if (type != MINIDUMP_STREAM_TYPE.MemoryListStream && type != MINIDUMP_STREAM_TYPE.Memory64ListStream) { throw new ClrDiagnosticsException("Type must be either MemoryListStream or Memory64ListStream", ClrDiagnosticsExceptionKind.CrashDumpError); } _listType = type; _dumpStream = rawStream; if (MINIDUMP_STREAM_TYPE.Memory64ListStream == type) { InitFromMemory64List(); } else { InitFromMemoryList(); } }
private static extern bool MiniDumpReadDumpStream( IntPtr BaseOfDump, MINIDUMP_STREAM_TYPE StreamNumber, ref MINIDUMP_DIRECTORY Dir, ref IntPtr StreamPointer, ref uint StreamSize);
public static extern bool MiniDumpReadDumpStream( IntPtr BaseOfDump, MINIDUMP_STREAM_TYPE StreamNumber, ref IntPtr DirPtr, ref IntPtr StreamPointer, ref uint StreamSize);