mirror of
https://github.com/goatcorp/Dalamud.git
synced 2026-02-10 18:14:36 +01:00
Replace PeHeader with TerraFX
This commit is contained in:
parent
2b51a2a54e
commit
252b7eeb9b
2 changed files with 17 additions and 403 deletions
|
|
@ -6,6 +6,8 @@ using Dalamud.Configuration.Internal;
|
|||
using Dalamud.Hooking.Internal;
|
||||
using Dalamud.Hooking.Internal.Verification;
|
||||
|
||||
using TerraFX.Interop.Windows;
|
||||
|
||||
namespace Dalamud.Hooking;
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -20,6 +22,8 @@ public abstract class Hook<T> : IDalamudHook where T : Delegate
|
|||
private const ulong IMAGE_ORDINAL_FLAG64 = 0x8000000000000000;
|
||||
// ReSharper disable once InconsistentNaming
|
||||
private const uint IMAGE_ORDINAL_FLAG32 = 0x80000000;
|
||||
// ReSharper disable once InconsistentNaming
|
||||
private const int IMAGE_DIRECTORY_ENTRY_IMPORT = 1;
|
||||
#pragma warning restore SA1310
|
||||
|
||||
private readonly IntPtr address;
|
||||
|
|
@ -124,25 +128,25 @@ public abstract class Hook<T> : IDalamudHook where T : Delegate
|
|||
module ??= Process.GetCurrentProcess().MainModule;
|
||||
if (module == null)
|
||||
throw new InvalidOperationException("Current module is null?");
|
||||
var pDos = (PeHeader.IMAGE_DOS_HEADER*)module.BaseAddress;
|
||||
var pNt = (PeHeader.IMAGE_FILE_HEADER*)(module.BaseAddress + (int)pDos->e_lfanew + 4);
|
||||
var isPe64 = pNt->SizeOfOptionalHeader == Marshal.SizeOf<PeHeader.IMAGE_OPTIONAL_HEADER64>();
|
||||
PeHeader.IMAGE_DATA_DIRECTORY* pDataDirectory;
|
||||
var pDos = (IMAGE_DOS_HEADER*)module.BaseAddress;
|
||||
var pNt = (IMAGE_FILE_HEADER*)(module.BaseAddress + pDos->e_lfanew + 4);
|
||||
var isPe64 = pNt->SizeOfOptionalHeader == Marshal.SizeOf<IMAGE_OPTIONAL_HEADER64>();
|
||||
IMAGE_DATA_DIRECTORY* pDataDirectory;
|
||||
if (isPe64)
|
||||
{
|
||||
var pOpt = (PeHeader.IMAGE_OPTIONAL_HEADER64*)(module.BaseAddress + (int)pDos->e_lfanew + 4 + Marshal.SizeOf<PeHeader.IMAGE_FILE_HEADER>());
|
||||
pDataDirectory = &pOpt->ImportTable;
|
||||
var pOpt = (IMAGE_OPTIONAL_HEADER64*)(module.BaseAddress + pDos->e_lfanew + 4 + Marshal.SizeOf<IMAGE_FILE_HEADER>());
|
||||
pDataDirectory = &pOpt->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
|
||||
}
|
||||
else
|
||||
{
|
||||
var pOpt = (PeHeader.IMAGE_OPTIONAL_HEADER32*)(module.BaseAddress + (int)pDos->e_lfanew + 4 + Marshal.SizeOf<PeHeader.IMAGE_FILE_HEADER>());
|
||||
pDataDirectory = &pOpt->ImportTable;
|
||||
var pOpt = (IMAGE_OPTIONAL_HEADER32*)(module.BaseAddress + pDos->e_lfanew + 4 + Marshal.SizeOf<IMAGE_FILE_HEADER>());
|
||||
pDataDirectory = &pOpt->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
|
||||
}
|
||||
|
||||
var moduleNameLowerWithNullTerminator = (moduleName + "\0").ToLowerInvariant();
|
||||
foreach (ref var importDescriptor in new Span<PeHeader.IMAGE_IMPORT_DESCRIPTOR>(
|
||||
(PeHeader.IMAGE_IMPORT_DESCRIPTOR*)(module.BaseAddress + (int)pDataDirectory->VirtualAddress),
|
||||
(int)(pDataDirectory->Size / Marshal.SizeOf<PeHeader.IMAGE_IMPORT_DESCRIPTOR>())))
|
||||
foreach (ref var importDescriptor in new Span<IMAGE_IMPORT_DESCRIPTOR>(
|
||||
(IMAGE_IMPORT_DESCRIPTOR*)(module.BaseAddress + (int)pDataDirectory->VirtualAddress),
|
||||
(int)(pDataDirectory->Size / Marshal.SizeOf<IMAGE_IMPORT_DESCRIPTOR>())))
|
||||
{
|
||||
// Having all zero values signals the end of the table. We didn't find anything.
|
||||
if (importDescriptor.Characteristics == 0)
|
||||
|
|
@ -248,7 +252,7 @@ public abstract class Hook<T> : IDalamudHook where T : Delegate
|
|||
ObjectDisposedException.ThrowIf(this.IsDisposed, this);
|
||||
}
|
||||
|
||||
private static unsafe IntPtr FromImportHelper32(IntPtr baseAddress, ref PeHeader.IMAGE_IMPORT_DESCRIPTOR desc, ref PeHeader.IMAGE_DATA_DIRECTORY dir, string functionName, uint hintOrOrdinal)
|
||||
private static unsafe IntPtr FromImportHelper32(IntPtr baseAddress, ref IMAGE_IMPORT_DESCRIPTOR desc, ref IMAGE_DATA_DIRECTORY dir, string functionName, uint hintOrOrdinal)
|
||||
{
|
||||
var importLookupsOversizedSpan = new Span<uint>((uint*)(baseAddress + (int)desc.OriginalFirstThunk), (int)((dir.Size - desc.OriginalFirstThunk) / Marshal.SizeOf<int>()));
|
||||
var importAddressesOversizedSpan = new Span<uint>((uint*)(baseAddress + (int)desc.FirstThunk), (int)((dir.Size - desc.FirstThunk) / Marshal.SizeOf<int>()));
|
||||
|
|
@ -298,7 +302,7 @@ public abstract class Hook<T> : IDalamudHook where T : Delegate
|
|||
throw new MissingMethodException("Specified method not found");
|
||||
}
|
||||
|
||||
private static unsafe IntPtr FromImportHelper64(IntPtr baseAddress, ref PeHeader.IMAGE_IMPORT_DESCRIPTOR desc, ref PeHeader.IMAGE_DATA_DIRECTORY dir, string functionName, uint hintOrOrdinal)
|
||||
private static unsafe IntPtr FromImportHelper64(IntPtr baseAddress, ref IMAGE_IMPORT_DESCRIPTOR desc, ref IMAGE_DATA_DIRECTORY dir, string functionName, uint hintOrOrdinal)
|
||||
{
|
||||
var importLookupsOversizedSpan = new Span<ulong>((ulong*)(baseAddress + (int)desc.OriginalFirstThunk), (int)((dir.Size - desc.OriginalFirstThunk) / Marshal.SizeOf<ulong>()));
|
||||
var importAddressesOversizedSpan = new Span<ulong>((ulong*)(baseAddress + (int)desc.FirstThunk), (int)((dir.Size - desc.FirstThunk) / Marshal.SizeOf<ulong>()));
|
||||
|
|
|
|||
|
|
@ -1,390 +0,0 @@
|
|||
using System.Runtime.InteropServices;
|
||||
|
||||
#pragma warning disable
|
||||
namespace Dalamud.Hooking.Internal;
|
||||
|
||||
internal class PeHeader
|
||||
{
|
||||
public struct IMAGE_DOS_HEADER
|
||||
{
|
||||
public UInt16 e_magic;
|
||||
public UInt16 e_cblp;
|
||||
public UInt16 e_cp;
|
||||
public UInt16 e_crlc;
|
||||
public UInt16 e_cparhdr;
|
||||
public UInt16 e_minalloc;
|
||||
public UInt16 e_maxalloc;
|
||||
public UInt16 e_ss;
|
||||
public UInt16 e_sp;
|
||||
public UInt16 e_csum;
|
||||
public UInt16 e_ip;
|
||||
public UInt16 e_cs;
|
||||
public UInt16 e_lfarlc;
|
||||
public UInt16 e_ovno;
|
||||
public UInt16 e_res_0;
|
||||
public UInt16 e_res_1;
|
||||
public UInt16 e_res_2;
|
||||
public UInt16 e_res_3;
|
||||
public UInt16 e_oemid;
|
||||
public UInt16 e_oeminfo;
|
||||
public UInt16 e_res2_0;
|
||||
public UInt16 e_res2_1;
|
||||
public UInt16 e_res2_2;
|
||||
public UInt16 e_res2_3;
|
||||
public UInt16 e_res2_4;
|
||||
public UInt16 e_res2_5;
|
||||
public UInt16 e_res2_6;
|
||||
public UInt16 e_res2_7;
|
||||
public UInt16 e_res2_8;
|
||||
public UInt16 e_res2_9;
|
||||
public UInt32 e_lfanew;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct IMAGE_DATA_DIRECTORY
|
||||
{
|
||||
public UInt32 VirtualAddress;
|
||||
public UInt32 Size;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct IMAGE_OPTIONAL_HEADER32
|
||||
{
|
||||
public UInt16 Magic;
|
||||
public Byte MajorLinkerVersion;
|
||||
public Byte MinorLinkerVersion;
|
||||
public UInt32 SizeOfCode;
|
||||
public UInt32 SizeOfInitializedData;
|
||||
public UInt32 SizeOfUninitializedData;
|
||||
public UInt32 AddressOfEntryPoint;
|
||||
public UInt32 BaseOfCode;
|
||||
public UInt32 BaseOfData;
|
||||
public UInt32 ImageBase;
|
||||
public UInt32 SectionAlignment;
|
||||
public UInt32 FileAlignment;
|
||||
public UInt16 MajorOperatingSystemVersion;
|
||||
public UInt16 MinorOperatingSystemVersion;
|
||||
public UInt16 MajorImageVersion;
|
||||
public UInt16 MinorImageVersion;
|
||||
public UInt16 MajorSubsystemVersion;
|
||||
public UInt16 MinorSubsystemVersion;
|
||||
public UInt32 Win32VersionValue;
|
||||
public UInt32 SizeOfImage;
|
||||
public UInt32 SizeOfHeaders;
|
||||
public UInt32 CheckSum;
|
||||
public UInt16 Subsystem;
|
||||
public UInt16 DllCharacteristics;
|
||||
public UInt32 SizeOfStackReserve;
|
||||
public UInt32 SizeOfStackCommit;
|
||||
public UInt32 SizeOfHeapReserve;
|
||||
public UInt32 SizeOfHeapCommit;
|
||||
public UInt32 LoaderFlags;
|
||||
public UInt32 NumberOfRvaAndSizes;
|
||||
|
||||
public IMAGE_DATA_DIRECTORY ExportTable;
|
||||
public IMAGE_DATA_DIRECTORY ImportTable;
|
||||
public IMAGE_DATA_DIRECTORY ResourceTable;
|
||||
public IMAGE_DATA_DIRECTORY ExceptionTable;
|
||||
public IMAGE_DATA_DIRECTORY CertificateTable;
|
||||
public IMAGE_DATA_DIRECTORY BaseRelocationTable;
|
||||
public IMAGE_DATA_DIRECTORY Debug;
|
||||
public IMAGE_DATA_DIRECTORY Architecture;
|
||||
public IMAGE_DATA_DIRECTORY GlobalPtr;
|
||||
public IMAGE_DATA_DIRECTORY TLSTable;
|
||||
public IMAGE_DATA_DIRECTORY LoadConfigTable;
|
||||
public IMAGE_DATA_DIRECTORY BoundImport;
|
||||
public IMAGE_DATA_DIRECTORY IAT;
|
||||
public IMAGE_DATA_DIRECTORY DelayImportDescriptor;
|
||||
public IMAGE_DATA_DIRECTORY CLRRuntimeHeader;
|
||||
public IMAGE_DATA_DIRECTORY Reserved;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct IMAGE_OPTIONAL_HEADER64
|
||||
{
|
||||
public UInt16 Magic;
|
||||
public Byte MajorLinkerVersion;
|
||||
public Byte MinorLinkerVersion;
|
||||
public UInt32 SizeOfCode;
|
||||
public UInt32 SizeOfInitializedData;
|
||||
public UInt32 SizeOfUninitializedData;
|
||||
public UInt32 AddressOfEntryPoint;
|
||||
public UInt32 BaseOfCode;
|
||||
public UInt64 ImageBase;
|
||||
public UInt32 SectionAlignment;
|
||||
public UInt32 FileAlignment;
|
||||
public UInt16 MajorOperatingSystemVersion;
|
||||
public UInt16 MinorOperatingSystemVersion;
|
||||
public UInt16 MajorImageVersion;
|
||||
public UInt16 MinorImageVersion;
|
||||
public UInt16 MajorSubsystemVersion;
|
||||
public UInt16 MinorSubsystemVersion;
|
||||
public UInt32 Win32VersionValue;
|
||||
public UInt32 SizeOfImage;
|
||||
public UInt32 SizeOfHeaders;
|
||||
public UInt32 CheckSum;
|
||||
public UInt16 Subsystem;
|
||||
public UInt16 DllCharacteristics;
|
||||
public UInt64 SizeOfStackReserve;
|
||||
public UInt64 SizeOfStackCommit;
|
||||
public UInt64 SizeOfHeapReserve;
|
||||
public UInt64 SizeOfHeapCommit;
|
||||
public UInt32 LoaderFlags;
|
||||
public UInt32 NumberOfRvaAndSizes;
|
||||
|
||||
public IMAGE_DATA_DIRECTORY ExportTable;
|
||||
public IMAGE_DATA_DIRECTORY ImportTable;
|
||||
public IMAGE_DATA_DIRECTORY ResourceTable;
|
||||
public IMAGE_DATA_DIRECTORY ExceptionTable;
|
||||
public IMAGE_DATA_DIRECTORY CertificateTable;
|
||||
public IMAGE_DATA_DIRECTORY BaseRelocationTable;
|
||||
public IMAGE_DATA_DIRECTORY Debug;
|
||||
public IMAGE_DATA_DIRECTORY Architecture;
|
||||
public IMAGE_DATA_DIRECTORY GlobalPtr;
|
||||
public IMAGE_DATA_DIRECTORY TLSTable;
|
||||
public IMAGE_DATA_DIRECTORY LoadConfigTable;
|
||||
public IMAGE_DATA_DIRECTORY BoundImport;
|
||||
public IMAGE_DATA_DIRECTORY IAT;
|
||||
public IMAGE_DATA_DIRECTORY DelayImportDescriptor;
|
||||
public IMAGE_DATA_DIRECTORY CLRRuntimeHeader;
|
||||
public IMAGE_DATA_DIRECTORY Reserved;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 1)]
|
||||
public struct IMAGE_FILE_HEADER
|
||||
{
|
||||
public UInt16 Machine;
|
||||
public UInt16 NumberOfSections;
|
||||
public UInt32 TimeDateStamp;
|
||||
public UInt32 PointerToSymbolTable;
|
||||
public UInt32 NumberOfSymbols;
|
||||
public UInt16 SizeOfOptionalHeader;
|
||||
public UInt16 Characteristics;
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
public struct IMAGE_SECTION_HEADER
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
|
||||
public char[] Name;
|
||||
[FieldOffset(8)]
|
||||
public UInt32 VirtualSize;
|
||||
[FieldOffset(12)]
|
||||
public UInt32 VirtualAddress;
|
||||
[FieldOffset(16)]
|
||||
public UInt32 SizeOfRawData;
|
||||
[FieldOffset(20)]
|
||||
public UInt32 PointerToRawData;
|
||||
[FieldOffset(24)]
|
||||
public UInt32 PointerToRelocations;
|
||||
[FieldOffset(28)]
|
||||
public UInt32 PointerToLinenumbers;
|
||||
[FieldOffset(32)]
|
||||
public UInt16 NumberOfRelocations;
|
||||
[FieldOffset(34)]
|
||||
public UInt16 NumberOfLinenumbers;
|
||||
[FieldOffset(36)]
|
||||
public DataSectionFlags Characteristics;
|
||||
|
||||
public string Section
|
||||
{
|
||||
get { return new string(Name); }
|
||||
}
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum DataSectionFlags : uint
|
||||
{
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
TypeReg = 0x00000000,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
TypeDsect = 0x00000001,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
TypeNoLoad = 0x00000002,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
TypeGroup = 0x00000004,
|
||||
/// <summary>
|
||||
/// The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files.
|
||||
/// </summary>
|
||||
TypeNoPadded = 0x00000008,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
TypeCopy = 0x00000010,
|
||||
/// <summary>
|
||||
/// The section contains executable code.
|
||||
/// </summary>
|
||||
ContentCode = 0x00000020,
|
||||
/// <summary>
|
||||
/// The section contains initialized data.
|
||||
/// </summary>
|
||||
ContentInitializedData = 0x00000040,
|
||||
/// <summary>
|
||||
/// The section contains uninitialized data.
|
||||
/// </summary>
|
||||
ContentUninitializedData = 0x00000080,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
LinkOther = 0x00000100,
|
||||
/// <summary>
|
||||
/// The section contains comments or other information. The .drectve section has this type. This is valid for object files only.
|
||||
/// </summary>
|
||||
LinkInfo = 0x00000200,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
TypeOver = 0x00000400,
|
||||
/// <summary>
|
||||
/// The section will not become part of the image. This is valid only for object files.
|
||||
/// </summary>
|
||||
LinkRemove = 0x00000800,
|
||||
/// <summary>
|
||||
/// The section contains COMDAT data. For more information, see section 5.5.6, COMDAT Sections (Object Only). This is valid only for object files.
|
||||
/// </summary>
|
||||
LinkComDat = 0x00001000,
|
||||
/// <summary>
|
||||
/// Reset speculative exceptions handling bits in the TLB entries for this section.
|
||||
/// </summary>
|
||||
NoDeferSpecExceptions = 0x00004000,
|
||||
/// <summary>
|
||||
/// The section contains data referenced through the global pointer (GP).
|
||||
/// </summary>
|
||||
RelativeGP = 0x00008000,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
MemPurgeable = 0x00020000,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
Memory16Bit = 0x00020000,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
MemoryLocked = 0x00040000,
|
||||
/// <summary>
|
||||
/// Reserved for future use.
|
||||
/// </summary>
|
||||
MemoryPreload = 0x00080000,
|
||||
/// <summary>
|
||||
/// Align data on a 1-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align1Bytes = 0x00100000,
|
||||
/// <summary>
|
||||
/// Align data on a 2-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align2Bytes = 0x00200000,
|
||||
/// <summary>
|
||||
/// Align data on a 4-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align4Bytes = 0x00300000,
|
||||
/// <summary>
|
||||
/// Align data on an 8-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align8Bytes = 0x00400000,
|
||||
/// <summary>
|
||||
/// Align data on a 16-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align16Bytes = 0x00500000,
|
||||
/// <summary>
|
||||
/// Align data on a 32-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align32Bytes = 0x00600000,
|
||||
/// <summary>
|
||||
/// Align data on a 64-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align64Bytes = 0x00700000,
|
||||
/// <summary>
|
||||
/// Align data on a 128-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align128Bytes = 0x00800000,
|
||||
/// <summary>
|
||||
/// Align data on a 256-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align256Bytes = 0x00900000,
|
||||
/// <summary>
|
||||
/// Align data on a 512-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align512Bytes = 0x00A00000,
|
||||
/// <summary>
|
||||
/// Align data on a 1024-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align1024Bytes = 0x00B00000,
|
||||
/// <summary>
|
||||
/// Align data on a 2048-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align2048Bytes = 0x00C00000,
|
||||
/// <summary>
|
||||
/// Align data on a 4096-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align4096Bytes = 0x00D00000,
|
||||
/// <summary>
|
||||
/// Align data on an 8192-byte boundary. Valid only for object files.
|
||||
/// </summary>
|
||||
Align8192Bytes = 0x00E00000,
|
||||
/// <summary>
|
||||
/// The section contains extended relocations.
|
||||
/// </summary>
|
||||
LinkExtendedRelocationOverflow = 0x01000000,
|
||||
/// <summary>
|
||||
/// The section can be discarded as needed.
|
||||
/// </summary>
|
||||
MemoryDiscardable = 0x02000000,
|
||||
/// <summary>
|
||||
/// The section cannot be cached.
|
||||
/// </summary>
|
||||
MemoryNotCached = 0x04000000,
|
||||
/// <summary>
|
||||
/// The section is not pageable.
|
||||
/// </summary>
|
||||
MemoryNotPaged = 0x08000000,
|
||||
/// <summary>
|
||||
/// The section can be shared in memory.
|
||||
/// </summary>
|
||||
MemoryShared = 0x10000000,
|
||||
/// <summary>
|
||||
/// The section can be executed as code.
|
||||
/// </summary>
|
||||
MemoryExecute = 0x20000000,
|
||||
/// <summary>
|
||||
/// The section can be read.
|
||||
/// </summary>
|
||||
MemoryRead = 0x40000000,
|
||||
/// <summary>
|
||||
/// The section can be written to.
|
||||
/// </summary>
|
||||
MemoryWrite = 0x80000000
|
||||
}
|
||||
|
||||
[StructLayout(LayoutKind.Explicit)]
|
||||
public struct IMAGE_IMPORT_DESCRIPTOR
|
||||
{
|
||||
[FieldOffset(0)]
|
||||
public uint Characteristics;
|
||||
|
||||
[FieldOffset(0)]
|
||||
public uint OriginalFirstThunk;
|
||||
|
||||
[FieldOffset(4)]
|
||||
public uint TimeDateStamp;
|
||||
|
||||
[FieldOffset(8)]
|
||||
public uint ForwarderChain;
|
||||
|
||||
[FieldOffset(12)]
|
||||
public uint Name;
|
||||
|
||||
[FieldOffset(16)]
|
||||
public uint FirstThunk;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue