コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }