Exemple #1
0
        static Stream GetPortablePdbStream(ImageDebugHeaderEntry entry)
        {
            var compressed_stream = new MemoryStream(entry.Data);
            var reader            = new BinaryStreamReader(compressed_stream);

            reader.ReadInt32();              // signature
            var length = reader.ReadInt32();
            var decompressed_stream = new MemoryStream(length);

            using (var deflate_stream = new DeflateStream(compressed_stream, CompressionMode.Decompress, leaveOpen: true))
                deflate_stream.CopyTo(decompressed_stream);

            return(decompressed_stream);
        }
        private static Stream GetPortablePdbStream(ImageDebugHeaderEntry entry)
        {
            MemoryStream       stream             = new MemoryStream(entry.Data);
            BinaryStreamReader binaryStreamReader = new BinaryStreamReader(stream);

            binaryStreamReader.ReadInt32();
            MemoryStream memoryStream = new MemoryStream(binaryStreamReader.ReadInt32());

            using (DeflateStream deflateStream = new DeflateStream(stream, CompressionMode.Decompress, true))
            {
                deflateStream.CopyTo(memoryStream);
                return(memoryStream);
            }
        }
Exemple #3
0
        public ImageDebugHeader GetDebugHeader()
        {
            ImageDebugHeader pdbDebugHeader = writer.GetDebugHeader();

            var directory = new ImageDebugDirectory {
                Type         = ImageDebugType.EmbeddedPortablePdb,
                MajorVersion = 0x0100,
                MinorVersion = 0x0100,
            };

            var data = new MemoryStream();

            var w = new BinaryStreamWriter(data);

            w.WriteByte(0x4d);
            w.WriteByte(0x50);
            w.WriteByte(0x44);
            w.WriteByte(0x42);

            w.WriteInt32((int)stream.Length);

            stream.Position = 0;

            using (var compress_stream = new DeflateStream(data, CompressionMode.Compress, leaveOpen: true))
                stream.CopyTo(compress_stream);

            directory.SizeOfData = (int)data.Length;

            var debugHeaderEntries = new ImageDebugHeaderEntry [pdbDebugHeader.Entries.Length + 1];

            for (int i = 0; i < pdbDebugHeader.Entries.Length; i++)
            {
                debugHeaderEntries [i] = pdbDebugHeader.Entries [i];
            }
            debugHeaderEntries [debugHeaderEntries.Length - 1] = new ImageDebugHeaderEntry(directory, data.ToArray());

            return(new ImageDebugHeader(debugHeaderEntries));
        }
Exemple #4
0
 public ImageDebugHeader(ImageDebugHeaderEntry entry)
     : this(new [] { entry })
 {
 }
Exemple #5
0
        public ImageDebugHeader GetDebugHeader()
        {
            if (IsEmbedded)
            {
                return(new ImageDebugHeader());
            }

            ImageDebugHeaderEntry codeViewEntry;
            {
                var codeViewDirectory = new ImageDebugDirectory()
                {
                    MajorVersion  = 256,
                    MinorVersion  = 20557,
                    Type          = ImageDebugType.CodeView,
                    TimeDateStamp = (int)pdb_id_stamp,
                };

                var buffer = new ByteBuffer();
                // RSDS
                buffer.WriteUInt32(0x53445352);
                // Module ID
                buffer.WriteBytes(pdb_id_guid.ToByteArray());
                // PDB Age
                buffer.WriteUInt32(1);
                // PDB Path
                var fileName = writer.BaseStream.GetFileName();
                if (string.IsNullOrEmpty(fileName))
                {
                    fileName = module.Assembly.Name.Name + ".pdb";
                }
                buffer.WriteBytes(System.Text.Encoding.UTF8.GetBytes(fileName));
                buffer.WriteByte(0);

                var data = new byte [buffer.length];
                Buffer.BlockCopy(buffer.buffer, 0, data, 0, buffer.length);
                codeViewDirectory.SizeOfData = data.Length;

                codeViewEntry = new ImageDebugHeaderEntry(codeViewDirectory, data);
            }

            ImageDebugHeaderEntry pdbChecksumEntry;

            {
                var pdbChecksumDirectory = new ImageDebugDirectory()
                {
                    MajorVersion  = 1,
                    MinorVersion  = 0,
                    Type          = ImageDebugType.PdbChecksum,
                    TimeDateStamp = 0
                };

                var buffer = new ByteBuffer();
                // SHA256 - Algorithm name
                buffer.WriteBytes(System.Text.Encoding.UTF8.GetBytes("SHA256"));
                buffer.WriteByte(0);

                // Checksum - 32 bytes
                buffer.WriteBytes(pdb_checksum);

                var data = new byte [buffer.length];
                Buffer.BlockCopy(buffer.buffer, 0, data, 0, buffer.length);
                pdbChecksumDirectory.SizeOfData = data.Length;

                pdbChecksumEntry = new ImageDebugHeaderEntry(pdbChecksumDirectory, data);
            }

            return(new ImageDebugHeader(new ImageDebugHeaderEntry [] { codeViewEntry, pdbChecksumEntry }));
        }