public override void ApplyFixup()
            {
                var vtableFixupBuilder = PE.Tasks.Get <VTableFixupBuilder>(true);

                // Fix IA64 stub
                {
                    ulong VA = _codeBlob.RVA + PE.ImageBase;

                    int pos = _codeBlobPos + 32;
                    _codeBlob.Write(ref pos, (ulong)VA);
                }

                // Fix VA of method
                {
                    var fixupBlob = vtableFixupBuilder.DataBlob;

                    ulong VA =
                        (ulong)fixupBlob.RVA +
                        (ulong)PE.ImageBase +
                        (ulong)vtableFixupBuilder.GetFixupOffset(_fixup);

                    int pos = _codeBlobPos + 40;
                    _codeBlob.Write(ref pos, (ulong)VA);
                }
            }
            public override void ApplyFixup()
            {
                var importBuilder = PE.Tasks.Get <ImportBuilder>(true);

                // Fix IA64 stub
                {
                    ulong VA = _blob.RVA + PE.ImageBase;

                    int pos = 32;
                    _blob.Write(ref pos, (ulong)VA);
                }

                // Fix VA of IAT
                {
                    var iatBlob = importBuilder.IATBlob;
                    if (iatBlob == null)
                    {
                        return;
                    }

                    ulong VA =
                        (ulong)iatBlob.RVA +
                        (ulong)PE.ImageBase +
                        (ulong)importBuilder.GetIATOffset(_entry);

                    int pos = 40;
                    _blob.Write(ref pos, (ulong)VA);
                }

                // Set entry point
                PE.AddressOfEntryPoint = _blob.RVA + 32;
            }
        public override void Build()
        {
            if (_table == null || _table.Count == 0)
            {
                return;
            }

            _blob     = new BuildBlob();
            _dataBlob = new BuildBlob();

            int pos     = 0;
            int dataPos = 0;

            for (int i = 0; i < _table.Count; i++)
            {
                var fixup = _table[i];
                if (fixup.Count == 0)
                {
                    continue;
                }

                _blob.Write(ref pos, (uint)dataPos);                 // RVA
                _blob.Write(ref pos, (ushort)fixup.Count);           // Count
                _blob.Write(ref pos, (ushort)fixup.Type);            // Type

                bool is32Bits = ((fixup.Type & VTableFixupType.SlotSize32Bit) == VTableFixupType.SlotSize32Bit);

                for (int j = 0; j < fixup.Count; j++)
                {
                    _dataBlob.Write(ref dataPos, (uint)fixup[j]);

                    if (!is32Bits)
                    {
                        _dataBlob.Write(ref dataPos, (uint)0);
                    }
                }
            }

            // Add fixups
            PE.Fixups.Add(new WriteDataRVAFixup(this));

            // Add blobs
            var section = PE.GetSection(_sectionName);

            section.Blobs.Add(_blob, _blobPriority);

            section = PE.GetSection(_dataSectionName);
            section.Blobs.Add(_dataBlob, _dataBlobPriority);
        }
            public override void ApplyFixup()
            {
                var vtableFixupBuilder = PE.Tasks.Get <VTableFixupBuilder>(true);

                // Fix VA of method
                var fixupBlob = vtableFixupBuilder.DataBlob;

                uint VA =
                    (uint)fixupBlob.RVA +
                    (uint)PE.ImageBase +
                    (uint)vtableFixupBuilder.GetFixupOffset(_fixup);

                int pos = _codeBlobPos + 2;

                _codeBlob.Write(ref pos, (uint)VA);
            }
            public override void ApplyFixup()
            {
                var importBuilder = PE.Tasks.Get <ImportBuilder>(true);

                // Fix VA of IAT
                var iatBlob = importBuilder.IATBlob;

                if (iatBlob == null)
                {
                    return;
                }

                uint VA =
                    (uint)iatBlob.RVA +
                    (uint)PE.ImageBase +
                    (uint)importBuilder.GetIATOffset(_entry);

                int pos = 2;

                _blob.Write(ref pos, (uint)VA);

                // Set entry point
                PE.AddressOfEntryPoint = _blob.RVA;
            }