예제 #1
0
        public static ImageDebugHeader AddDeterministicEntry(this ImageDebugHeader header)
        {
            var entry = new ImageDebugHeaderEntry(new ImageDebugDirectory {
                Type = ImageDebugType.Deterministic
            }, Empty <byte> .Array);

            if (header == null)
            {
                return(new ImageDebugHeader(entry));
            }

            var entries = new ImageDebugHeaderEntry [header.Entries.Length + 1];

            Array.Copy(header.Entries, entries, header.Entries.Length);
            entries [entries.Length - 1] = entry;
            return(new ImageDebugHeader(entries));
        }
예제 #2
0
        public static ImageDebugHeader Read(BinaryReader reader)
        {
            var entries = new ImageDebugHeaderEntry[reader.ReadByte()];

            for (int i = 0; i < entries.Length; ++i)
            {
                var directory = new ImageDebugDirectory {
                    Characteristics = reader.ReadInt32(),
                    TimeDateStamp   = reader.ReadInt32(),
                    MajorVersion    = reader.ReadInt16(),
                    MinorVersion    = reader.ReadInt16(),
                    Type            = (ImageDebugType)reader.ReadInt32(),
                    SizeOfData      = reader.ReadInt32()
                };
                entries[i] = new ImageDebugHeaderEntry(directory, reader.ReadBytes(directory.SizeOfData));
            }
            return(new ImageDebugHeader(entries));
        }
예제 #3
0
 private void ReadDebugHeader()
 {
     if (image.Debug.IsZero)
     {
         image.DebugHeader = new ImageDebugHeader(Empty <ImageDebugHeaderEntry> .Array);
     }
     else
     {
         MoveTo(image.Debug);
         ImageDebugHeaderEntry[] array = new ImageDebugHeaderEntry[(int)image.Debug.Size / 28];
         for (int i = 0; i < array.Length; i++)
         {
             ImageDebugDirectory imageDebugDirectory = default(ImageDebugDirectory);
             imageDebugDirectory.Characteristics  = ReadInt32();
             imageDebugDirectory.TimeDateStamp    = ReadInt32();
             imageDebugDirectory.MajorVersion     = ReadInt16();
             imageDebugDirectory.MinorVersion     = ReadInt16();
             imageDebugDirectory.Type             = (ImageDebugType)ReadInt32();
             imageDebugDirectory.SizeOfData       = ReadInt32();
             imageDebugDirectory.AddressOfRawData = ReadInt32();
             imageDebugDirectory.PointerToRawData = ReadInt32();
             ImageDebugDirectory imageDebugDirectory2 = imageDebugDirectory;
             if (imageDebugDirectory2.AddressOfRawData == 0)
             {
                 array[i] = new ImageDebugHeaderEntry(imageDebugDirectory2, Empty <byte> .Array);
             }
             else
             {
                 int position = base.Position;
                 try
                 {
                     base.MoveTo((uint)imageDebugDirectory2.PointerToRawData);
                     byte[] data = ReadBytes(imageDebugDirectory2.SizeOfData);
                     array[i] = new ImageDebugHeaderEntry(imageDebugDirectory2, data);
                 }
                 finally
                 {
                     base.Position = position;
                 }
             }
         }
         image.DebugHeader = new ImageDebugHeader(array);
     }
 }
예제 #4
0
파일: ImageReader.cs 프로젝트: pureivan/XIL
        void ReadDebugHeader()
        {
            if (image.Debug.IsZero)
            {
                image.DebugHeader = new ImageDebugHeader(Empty <ImageDebugHeaderEntry> .Array);
                return;
            }

            MoveTo(image.Debug);

            var entries = new ImageDebugHeaderEntry [(int)image.Debug.Size / ImageDebugDirectory.Size];

            for (int i = 0; i < entries.Length; i++)
            {
                var directory = new ImageDebugDirectory {
                    Characteristics  = ReadInt32(),
                    TimeDateStamp    = ReadInt32(),
                    MajorVersion     = ReadInt16(),
                    MinorVersion     = ReadInt16(),
                    Type             = (ImageDebugType)ReadInt32(),
                    SizeOfData       = ReadInt32(),
                    AddressOfRawData = ReadInt32(),
                    PointerToRawData = ReadInt32(),
                };

                if (directory.AddressOfRawData == 0)
                {
                    entries [i] = new ImageDebugHeaderEntry(directory, Empty <byte> .Array);
                    continue;
                }

                var position = Position;
                try {
                    MoveTo((uint)directory.PointerToRawData);
                    var data = ReadBytes(directory.SizeOfData);
                    entries [i] = new ImageDebugHeaderEntry(directory, data);
                } finally {
                    Position = position;
                }
            }

            image.DebugHeader = new ImageDebugHeader(entries);
        }
예제 #5
0
            private static ImageDebugHeaderEntry ProcessEntry(ImageDebugHeaderEntry entry)
            {
                if (entry.Directory.Type != ImageDebugType.CodeView)
                {
                    return(entry);
                }

                var reader = new ByteBuffer(entry.Data);
                var writer = new ByteBuffer();

                var sig = reader.ReadUInt32();

                if (sig != 0x53445352)
                {
                    return(entry);
                }

                writer.WriteUInt32(sig);                  // RSDS
                writer.WriteBytes(reader.ReadBytes(16));  // MVID
                writer.WriteUInt32(reader.ReadUInt32());  // Age

                var length = Array.IndexOf(entry.Data, (byte)0, reader.position) - reader.position;

                var fullPath = Encoding.UTF8.GetString(reader.ReadBytes(length));

                writer.WriteBytes(Encoding.UTF8.GetBytes(Path.GetFileName(fullPath)));
                writer.WriteByte(0);

                var newData = new byte [writer.length];

                Buffer.BlockCopy(writer.buffer, 0, newData, 0, writer.length);

                var directory = entry.Directory;

                directory.SizeOfData = newData.Length;

                return(new ImageDebugHeaderEntry(directory, newData));
            }
예제 #6
0
        private void WriteDebugDirectory()
        {
            int num = (int)BaseStream.Position + debug_header.Entries.Length * 28;

            for (int i = 0; i < debug_header.Entries.Length; i++)
            {
                ImageDebugHeaderEntry imageDebugHeaderEntry = debug_header.Entries[i];
                ImageDebugDirectory   directory             = imageDebugHeaderEntry.Directory;
                base.WriteInt32(directory.Characteristics);
                base.WriteInt32(directory.TimeDateStamp);
                base.WriteInt16(directory.MajorVersion);
                base.WriteInt16(directory.MinorVersion);
                base.WriteInt32((int)directory.Type);
                base.WriteInt32(directory.SizeOfData);
                base.WriteInt32(directory.AddressOfRawData);
                base.WriteInt32(num);
                num += imageDebugHeaderEntry.Data.Length;
            }
            for (int j = 0; j < debug_header.Entries.Length; j++)
            {
                ImageDebugHeaderEntry imageDebugHeaderEntry2 = debug_header.Entries[j];
                base.WriteBytes(imageDebugHeaderEntry2.Data);
            }
        }