/// <summary> /// Decompresses a compressed crash report. /// </summary> unsafe private bool DecompressReport(string CompressedReportPath, FCompressedCrashInformation Meta) { string ReportPath = Path.GetDirectoryName(CompressedReportPath); using (FileStream FileStream = File.OpenRead(CompressedReportPath)) { Int32 UncompressedSize = Meta.GetUncompressedSize(); Int32 CompressedSize = Meta.GetCompressedSize(); if (FileStream.Length != CompressedSize) { return(false); } byte[] UncompressedBufferArray = new byte[UncompressedSize]; byte[] CompressedBufferArray = new byte[CompressedSize]; FileStream.Read(CompressedBufferArray, 0, CompressedSize); fixed(byte *UncompressedBufferPtr = UncompressedBufferArray, CompressedBufferPtr = CompressedBufferArray) { bool bResult = UE4UncompressMemoryZLIB((IntPtr)UncompressedBufferPtr, UncompressedSize, (IntPtr)CompressedBufferPtr, CompressedSize); if (!bResult) { CrashReporterProcessServicer.WriteFailure("! ZLibFail: Path=" + ReportPath); return(false); } } MemoryStream MemoryStream = new MemoryStream(UncompressedBufferArray, false); BinaryReader BinaryData = new BinaryReader(MemoryStream); for (int FileIndex = 0; FileIndex < Meta.GetNumberOfFiles(); FileIndex++) { Int32 CurrentFileIndex = BinaryData.ReadInt32(); if (CurrentFileIndex != FileIndex) { CrashReporterProcessServicer.WriteFailure("! ReadFail: Required=" + FileIndex + " Read=" + CurrentFileIndex); return(false); } string Filename = FBinaryReaderHelper.ReadFixedSizeString(BinaryData); Int32 FiledataLength = BinaryData.ReadInt32(); byte[] Filedata = BinaryData.ReadBytes(FiledataLength); File.WriteAllBytes(Path.Combine(ReportPath, Filename), Filedata); } } return(true); }
/// <summary> /// Decompresses a compressed crash report. /// </summary> unsafe static protected bool DecompressReport(string CompressedReportPath, FCompressedCrashInformation Meta) { string ReportPath = Path.GetDirectoryName(CompressedReportPath); using (FileStream FileStream = File.OpenRead(CompressedReportPath)) { Int32 UncompressedSize = Meta.GetUncompressedSize(); Int32 CompressedSize = Meta.GetCompressedSize(); if (FileStream.Length != CompressedSize) { return(false); } byte[] UncompressedBufferArray = new byte[UncompressedSize]; byte[] CompressedBufferArray = new byte[CompressedSize]; FileStream.Read(CompressedBufferArray, 0, CompressedSize); fixed(byte *UncompressedBufferPtr = UncompressedBufferArray, CompressedBufferPtr = CompressedBufferArray) { Int32 UncompressResult = NativeMethods.UE4UncompressMemoryZLIB((IntPtr)UncompressedBufferPtr, UncompressedSize, (IntPtr)CompressedBufferPtr, CompressedSize); if (UncompressResult < 0) { CrashReporterProcessServicer.WriteFailure("! DecompressReport() failed in UE4UncompressMemoryZLIB() with " + NativeMethods.GetUncompressError(UncompressResult)); CrashReporterProcessServicer.WriteFailure("! ZLibFail in DecompressReport(): Path=" + ReportPath); return(false); } } using (BinaryReader BinaryData = new BinaryReader(new MemoryStream(UncompressedBufferArray, false))) { for (int FileIndex = 0; FileIndex < Meta.GetNumberOfFiles(); FileIndex++) { if (!WriteIncomingFile(BinaryData, FileIndex, ReportPath)) { CrashReporterProcessServicer.WriteFailure("! DecompressReport() failed to write file index " + FileIndex + " Path=" + ReportPath); return(false); } } } } return(true); }