예제 #1
0
        public void Write(BinaryStreamWriter writer)
        {
            writer.WriteInt32(Buffs.Count);

            foreach (var buff in Buffs)
            {
                writer.WriteString(buff.Name);
                writer.WriteInt32((int)Buff.BuffCategoryAndIDFromCategoryAndAttributeID(buff.Category, buff.AttributeID));
                writer.WriteInt32((int)buff.Mode);
                writer.WriteInt32(buff.Value);
            }
        }
예제 #2
0
 public void WriteIteratorScopes(StateMachineScopeDebugInformation [] scopes, MethodDebugInformation debug_info)
 {
     Write(CustomMetadataType.IteratorScopes, () => {
         writer.WriteInt32(scopes.Length);
         foreach (var scope in scopes)
         {
             var start = scope.Start.Offset;
             var end   = scope.End.IsEndOfMethod ? debug_info.code_size : scope.End.Offset;
             writer.WriteInt32(start);
             writer.WriteInt32(end - 1);
         }
     });
 }
예제 #3
0
        public ImageDebugHeader GetDebugHeader()
        {
            writer.Dispose();

            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;

            return(new ImageDebugHeader(new [] {
                writer.GetDebugHeader().Entries[0],
                new ImageDebugHeaderEntry(directory, data.ToArray())
            }));
        }
예제 #4
0
        public ImageDebugHeader GetDebugHeader()
        {
            writer.Dispose();
            ImageDebugDirectory imageDebugDirectory = default(ImageDebugDirectory);

            imageDebugDirectory.Type = ImageDebugType.EmbeddedPortablePdb;
            ImageDebugDirectory directory          = imageDebugDirectory;
            MemoryStream        memoryStream       = new MemoryStream();
            BinaryStreamWriter  binaryStreamWriter = new BinaryStreamWriter(memoryStream);

            binaryStreamWriter.WriteByte(77);
            binaryStreamWriter.WriteByte(80);
            binaryStreamWriter.WriteByte(68);
            binaryStreamWriter.WriteByte(66);
            binaryStreamWriter.WriteInt32((int)stream.Length);
            stream.Position = 0L;
            using (DeflateStream destination = new DeflateStream(memoryStream, CompressionMode.Compress, true))
            {
                stream.CopyTo(destination);
            }
            directory.SizeOfData = (int)memoryStream.Length;
            return(new ImageDebugHeader(new ImageDebugHeaderEntry[2]
            {
                writer.GetDebugHeader().Entries[0],
                new ImageDebugHeaderEntry(directory, memoryStream.ToArray())
            }));
        }
예제 #5
0
        public void WriteInt32()
        {
            using (var stream = new MemoryStream())
            {
                var writer = new BinaryStreamWriter(stream);

                writer.WriteUInt32(0x81020304u);
                writer.WriteInt32(-2063202552);

                Assert.Equal(new byte[]
                {
                    0x04, 0x03, 0x02, 0x81,
                    0x08, 0x07, 0x06, 0x85
                }, stream.ToArray());
            }
        }
예제 #6
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));
        }
예제 #7
0
        private void DefineCustomMetadata(PdbMethodSymbols pdbSymbols)
        {
            // Custom PDB metadata
            if (pdbSymbols != null)
            {
                using (var memoryStream = new MemoryStream()) {
                    var metadata = new BinaryStreamWriter(memoryStream);
                    metadata.WriteByte(4);                      // version
                    metadata.WriteByte((byte)1);                // count
                    metadata.WriteInt16(0);                     // padding

                    var metadataStartPosition = metadata.BaseStream.Position;
                    var customMetadataCount   = 0;

                    if (pdbSymbols.IteratorClass != null)
                    {
                        customMetadataCount++;
                        metadata.WriteByte(4);                          // version
                        metadata.WriteByte(4);                          // forward iterator
                        metadata.Align(4);
                        using (new PdbBinaryStreamWriterSizeHelper(metadata)) {
                            metadata.WriteString(pdbSymbols.IteratorClass);
                            metadata.WriteInt16(0);
                            metadata.Align(4);
                        }
                    }

                    if (pdbSymbols.UsingCounts != null)
                    {
                        customMetadataCount++;
                        metadata.WriteByte(4);                          // version
                        metadata.WriteByte(0);                          // using info
                        metadata.Align(4);
                        using (new PdbBinaryStreamWriterSizeHelper(metadata)) {
                            metadata.WriteUInt16((ushort)pdbSymbols.UsingCounts.Count);
                            foreach (var uc in pdbSymbols.UsingCounts)
                            {
                                metadata.WriteUInt16(uc);
                            }
                            metadata.Align(4);
                        }
                    }

                    if (pdbSymbols.MethodWhoseUsingInfoAppliesToThisMethod != null)
                    {
                        customMetadataCount++;
                        metadata.WriteByte(4);                          // version
                        metadata.WriteByte(1);                          // forward info
                        metadata.Align(4);
                        using (new PdbBinaryStreamWriterSizeHelper(metadata)) {
                            metadata.WriteUInt32(pdbSymbols.MethodWhoseUsingInfoAppliesToThisMethod.MetadataToken.ToUInt32());
                        }
                    }

                    if (pdbSymbols.IteratorScopes != null)
                    {
                        customMetadataCount++;
                        metadata.WriteByte(4);                          // version
                        metadata.WriteByte(3);                          // iterator scopes
                        metadata.Align(4);
                        using (new PdbBinaryStreamWriterSizeHelper(metadata)) {
                            metadata.WriteInt32(pdbSymbols.IteratorScopes.Count);
                            foreach (var scope in pdbSymbols.IteratorScopes)
                            {
                                metadata.WriteInt32(scope.Start.Offset);
                                metadata.WriteInt32(scope.End.Offset);
                            }
                        }
                    }

                    if (metadata.BaseStream.Position != metadataStartPosition)
                    {
                        // Update number of entries
                        metadata.Flush();
                        metadata.BaseStream.Position = 1;
                        metadata.WriteByte((byte)customMetadataCount);
                        metadata.Flush();

                        writer.DefineCustomMetadata("MD2", memoryStream.ToArray());
                    }
                }

                // Save back asyncMethodInfo
                if (pdbSymbols.SynchronizationInformation != null)
                {
                    using (var memoryStream = new MemoryStream()) {
                        var metadata = new BinaryStreamWriter(memoryStream);
                        metadata.WriteUInt32(pdbSymbols.SynchronizationInformation.KickoffMethod != null ? pdbSymbols.SynchronizationInformation.KickoffMethod.MetadataToken.ToUInt32() : 0);
                        metadata.WriteUInt32(pdbSymbols.SynchronizationInformation.GeneratedCatchHandlerIlOffset);
                        metadata.WriteUInt32((uint)pdbSymbols.SynchronizationInformation.SynchronizationPoints.Count);
                        foreach (var syncPoint in pdbSymbols.SynchronizationInformation.SynchronizationPoints)
                        {
                            metadata.WriteUInt32(syncPoint.SynchronizeOffset);
                            metadata.WriteUInt32(syncPoint.ContinuationMethod != null ? syncPoint.ContinuationMethod.MetadataToken.ToUInt32() : 0);
                            metadata.WriteUInt32(syncPoint.ContinuationOffset);
                        }

                        writer.DefineCustomMetadata("asyncMethodInfo", memoryStream.ToArray());
                    }
                }
            }
        }