internal static NativeHeapMemoryBlock ReadMemoryBlock(Stream stream, int start, int size) { var fileStream = stream as FileStream; if (fileStream != null) { var block = new NativeHeapMemoryBlock(size); bool fault = true; try { stream.Seek(start, SeekOrigin.Begin); int bytesRead; if (!ReadFile(fileStream.SafeFileHandle, block.Pointer, size, out bytesRead, IntPtr.Zero) || bytesRead != size) { throw new IOException(CodeAnalysisResources.UnableToReadMetadataFile, Marshal.GetLastWin32Error()); } fault = false; } finally { if (fault) { block.Dispose(); } } return(block); } else { var block = new NativeHeapMemoryBlock(size); bool fault = true; try { stream.Seek(start, SeekOrigin.Begin); stream.CopyTo(block.Pointer, size); fault = false; } finally { if (fault) { block.Dispose(); } } return(block); } }
internal static NativeHeapMemoryBlock ReadMemoryBlock(Stream stream, int start, int size) { var fileStream = stream as FileStream; if (fileStream != null) { var block = new NativeHeapMemoryBlock(size); bool fault = true; try { stream.Seek(start, SeekOrigin.Begin); int bytesRead; if (!ReadFile(fileStream.SafeFileHandle, block.Pointer, size, out bytesRead, IntPtr.Zero) || bytesRead != size) { throw new IOException(CodeAnalysisResources.UnableToReadMetadataFile, Marshal.GetLastWin32Error()); } fault = false; } finally { if (fault) { block.Dispose(); } } return block; } else { var block = new NativeHeapMemoryBlock(size); bool fault = true; try { stream.Seek(start, SeekOrigin.Begin); stream.CopyTo(block.Pointer, size); fault = false; } finally { if (fault) { block.Dispose(); } } return block; } }