mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-26 23:23:48 +02:00
874 lines
34 KiB
ObjectPascal
874 lines
34 KiB
ObjectPascal
{ $Id$ }
|
|
{
|
|
---------------------------------------------------------------------------
|
|
fpdbgpetypes.pp - Freepascal debugger - PE types
|
|
---------------------------------------------------------------------------
|
|
|
|
This unit contains the types needed for reading PE images.
|
|
At some time this may go to be part of the rtl ?
|
|
|
|
---------------------------------------------------------------------------
|
|
|
|
@created(Thu May 4th WET 2006)
|
|
@lastmod($Date$)
|
|
@author(Marc Weustink <marc@@dommelstein.nl>)
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Project
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
unit FpDbgPETypes;
|
|
{$mode objfpc}{$H+}{$inline on}
|
|
{$IFDEF INLINE_OFF}{$INLINE OFF}{$ENDIF}
|
|
interface
|
|
{$ifdef windows}
|
|
uses
|
|
Windows;
|
|
{$endif}
|
|
|
|
//
|
|
// Image Format
|
|
//
|
|
|
|
{$IFNDEF windows}
|
|
type
|
|
SHORT = smallint;
|
|
LONG = longint;
|
|
ULONGLONG = qword;
|
|
GUID = system.tguid;
|
|
CLSID = GUID;
|
|
{$endif}
|
|
|
|
|
|
|
|
const
|
|
{$ifdef ENDIAN_LITTLE}
|
|
|
|
IMAGE_DOS_SIGNATURE = $5A4D; // MZ
|
|
IMAGE_OS2_SIGNATURE = $454E; // NE
|
|
IMAGE_OS2_SIGNATURE_LE = $454C; // LE
|
|
IMAGE_VXD_SIGNATURE = $454C; // LE
|
|
IMAGE_NT_SIGNATURE = $00004550; // PE00
|
|
|
|
{$else}
|
|
|
|
IMAGE_DOS_SIGNATURE = $4D5A; // MZ
|
|
IMAGE_OS2_SIGNATURE = $4E45; // NE
|
|
IMAGE_OS2_SIGNATURE_LE = $4C45; // LE
|
|
IMAGE_NT_SIGNATURE = $50450000; // PE00
|
|
|
|
{$endif}
|
|
|
|
{$packrecords 2}
|
|
{$IFNDEF windows}
|
|
type
|
|
_IMAGE_DOS_HEADER = record // DOS .EXE header
|
|
e_magic: WORD; // Magic number
|
|
e_cblp: WORD; // Bytes on last page of file
|
|
e_cp: WORD; // Pages in file
|
|
e_crlc: WORD; // Relocations
|
|
e_cparhdr: WORD; // Size of header in paragraphs
|
|
e_minalloc: WORD; // Minimum extra paragraphs needed
|
|
e_maxalloc: WORD; // Maximum extra paragraphs needed
|
|
e_ss: WORD; // Initial (relative) SS value
|
|
e_sp: WORD; // Initial SP value
|
|
e_csum: WORD; // Checksum
|
|
e_ip: WORD; // Initial IP value
|
|
e_cs: WORD; // Initial (relative) CS value
|
|
e_lfarlc: WORD; // File address of relocation table
|
|
e_ovno: WORD; // Overlay number
|
|
e_res: array[0..3] of WORD; // Reserved words
|
|
e_oemid: WORD; // OEM identifier (for e_oeminfo)
|
|
e_oeminfo: WORD; // OEM information: e_oemid specific
|
|
e_res2: array[0..9] of WORD; // Reserved words
|
|
e_lfanew: LONG; // File address of new exe header
|
|
end;
|
|
IMAGE_DOS_HEADER = _IMAGE_DOS_HEADER;
|
|
TImageDosHeader = _IMAGE_DOS_HEADER;
|
|
PImageDosHeader = ^TImageDosHeader;
|
|
{$ENDIF}
|
|
|
|
type
|
|
_IMAGE_OS2_HEADER = record // OS/2 .EXE header
|
|
ne_magic: WORD; // Magic number
|
|
ne_ver: CHAR; // Version number
|
|
ne_rev: CHAR; // Revision number
|
|
ne_enttab: WORD; // Offset of Entry Table
|
|
ne_cbenttab: WORD; // Number of bytes in Entry Table
|
|
ne_crc: LONG; // Checksum of whole file
|
|
ne_flags: WORD; // Flag word
|
|
ne_autodata: WORD; // Automatic data segment number
|
|
ne_heap: WORD; // Initial heap allocation
|
|
ne_stack: WORD; // Initial stack allocation
|
|
ne_csip: LONG; // Initial CS:IP setting
|
|
ne_sssp: LONG; // Initial SS:SP setting
|
|
ne_cseg: WORD; // Count of file segments
|
|
ne_cmod: WORD; // Entries in Module Reference Table
|
|
ne_cbnrestab: WORD; // Size of non-resident name table
|
|
ne_segtab: WORD; // Offset of Segment Table
|
|
ne_rsrctab: WORD; // Offset of Resource Table
|
|
ne_restab: WORD; // Offset of resident name table
|
|
ne_modtab: WORD; // Offset of Module Reference Table
|
|
ne_imptab: WORD; // Offset of Imported Names Table
|
|
ne_nrestab: LONG; // Offset of Non-resident Names Table
|
|
ne_cmovent: WORD; // Count of movable entries
|
|
ne_align: WORD; // Segment alignment shift count
|
|
ne_cres: WORD; // Count of resource segments
|
|
ne_exetyp: BYTE; // Target Operating system
|
|
ne_flagsothers: BYTE; // Other .EXE flags
|
|
ne_pretthunks: WORD; // offset to return thunks
|
|
ne_psegrefbytes: WORD; // offset to segment ref. bytes
|
|
ne_swaparea: WORD; // Minimum code swap area size
|
|
ne_expver: WORD; // Expected Windows version number
|
|
end;
|
|
IMAGE_OS2_HEADER = _IMAGE_OS2_HEADER;
|
|
TImageOS2Header = _IMAGE_OS2_HEADER;
|
|
PImageOS2Header = ^TImageOS2Header;
|
|
|
|
type
|
|
_IMAGE_VXD_HEADER = record // Windows VXD header
|
|
e32_magic: WORD; // Magic number
|
|
e32_border: BYTE; // The byte ordering for the VXD
|
|
e32_worder: BYTE; // The word ordering for the VXD
|
|
e32_level: DWORD; // The EXE format level for now = 0
|
|
e32_cpu: WORD; // The CPU type
|
|
e32_os: WORD; // The OS type
|
|
e32_ver: DWORD; // Module version
|
|
e32_mflags: DWORD; // Module flags
|
|
e32_mpages: DWORD; // Module # pages
|
|
e32_startobj: DWORD; // Object # for instruction pointer
|
|
e32_eip: DWORD; // Extended instruction pointer
|
|
e32_stackobj: DWORD; // Object # for stack pointer
|
|
e32_esp: DWORD; // Extended stack pointer
|
|
e32_pagesize: DWORD; // VXD page size
|
|
e32_lastpagesize: DWORD; // Last page size in VXD
|
|
e32_fixupsize: DWORD; // Fixup section size
|
|
e32_fixupsum: DWORD; // Fixup section checksum
|
|
e32_ldrsize: DWORD; // Loader section size
|
|
e32_ldrsum: DWORD; // Loader section checksum
|
|
e32_objtab: DWORD; // Object table offset
|
|
e32_objcnt: DWORD; // Number of objects in module
|
|
e32_objmap: DWORD; // Object page map offset
|
|
e32_itermap: DWORD; // Object iterated data map offset
|
|
e32_rsrctab: DWORD; // Offset of Resource Table
|
|
e32_rsrccnt: DWORD; // Number of resource entries
|
|
e32_restab: DWORD; // Offset of resident name table
|
|
e32_enttab: DWORD; // Offset of Entry Table
|
|
e32_dirtab: DWORD; // Offset of Module Directive Table
|
|
e32_dircnt: DWORD; // Number of module directives
|
|
e32_fpagetab: DWORD; // Offset of Fixup Page Table
|
|
e32_frectab: DWORD; // Offset of Fixup Record Table
|
|
e32_impmod: DWORD; // Offset of Import Module Name Table
|
|
e32_impmodcnt: DWORD; // Number of entries in Import Module Name Table
|
|
e32_impproc: DWORD; // Offset of Import Procedure Name Table
|
|
e32_pagesum: DWORD; // Offset of Per-Page Checksum Table
|
|
e32_datapage: DWORD; // Offset of Enumerated Data Pages
|
|
e32_preload: DWORD; // Number of preload pages
|
|
e32_nrestab: DWORD; // Offset of Non-resident Names Table
|
|
e32_cbnrestab: DWORD; // Size of Non-resident Name Table
|
|
e32_nressum: DWORD; // Non-resident Name Table Checksum
|
|
e32_autodata: DWORD; // Object # for automatic data object
|
|
e32_debuginfo: DWORD; // Offset of the debugging information
|
|
e32_debuglen: DWORD; // The length of the debugging info. in bytes
|
|
e32_instpreload: DWORD; // Number of instance pages in preload section of VXD file
|
|
e32_instdemand: DWORD; // Number of instance pages in demand load section of VXD file
|
|
e32_heapsize: DWORD; // Size of heap - for 16-bit apps
|
|
e32_res3: array[0..11] of BYTE; // Reserved words
|
|
e32_winresoff: DWORD;
|
|
e32_winreslen: DWORD;
|
|
e32_devid: WORD; // Device ID for VxD
|
|
e32_ddkver: WORD; // DDK version for VxD
|
|
end;
|
|
IMAGE_VXD_HEADER = _IMAGE_VXD_HEADER;
|
|
TImageVXDHeader = _IMAGE_VXD_HEADER;
|
|
PImageVXDHeader = ^TImageVXDHeader;
|
|
|
|
{$packrecords 4}
|
|
|
|
//
|
|
// File header format.
|
|
//
|
|
|
|
type
|
|
_IMAGE_FILE_HEADER = record
|
|
Machine: WORD;
|
|
NumberOfSections: WORD;
|
|
TimeDateStamp: DWORD;
|
|
PointerToSymbolTable: DWORD;
|
|
NumberOfSymbols: DWORD;
|
|
SizeOfOptionalHeader: WORD;
|
|
Characteristics: WORD;
|
|
end;
|
|
IMAGE_FILE_HEADER = _IMAGE_FILE_HEADER;
|
|
TImageFileHeader = _IMAGE_FILE_HEADER;
|
|
PImageFileHeader = ^TImageFileHeader;
|
|
|
|
const
|
|
IMAGE_SIZEOF_FILE_HEADER = 20;
|
|
|
|
|
|
IMAGE_FILE_RELOCS_STRIPPED = $0001; // Relocation info stripped from file.
|
|
IMAGE_FILE_EXECUTABLE_IMAGE = $0002; // File is executable (i.e. no unresolved externel references).
|
|
IMAGE_FILE_LINE_NUMS_STRIPPED = $0004; // Line nunbers stripped from file.
|
|
IMAGE_FILE_LOCAL_SYMS_STRIPPED = $0008; // Local symbols stripped from file.
|
|
IMAGE_FILE_AGGRESIVE_WS_TRIM = $0010; // Agressively trim working set
|
|
IMAGE_FILE_LARGE_ADDRESS_AWARE = $0020; // App can handle >2gb addresses
|
|
IMAGE_FILE_BYTES_REVERSED_LO = $0080; // Bytes of machine word are reversed.
|
|
IMAGE_FILE_32BIT_MACHINE = $0100; // 32 bit word machine.
|
|
IMAGE_FILE_DEBUG_STRIPPED = $0200; // Debugging info stripped from file in .DBG file
|
|
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400; // If Image is on removable media, copy and run from the swap file.
|
|
IMAGE_FILE_NET_RUN_FROM_SWAP = $0800; // If Image is on Net, copy and run from the swap file.
|
|
IMAGE_FILE_SYSTEM = $1000; // System File.
|
|
IMAGE_FILE_DLL = $2000; // File is a DLL.
|
|
IMAGE_FILE_UP_SYSTEM_ONLY = $4000; // File should only be run on a UP machine
|
|
IMAGE_FILE_BYTES_REVERSED_HI = $8000; // Bytes of machine word are reversed.
|
|
|
|
IMAGE_FILE_MACHINE_UNKNOWN = 0;
|
|
IMAGE_FILE_MACHINE_I386 = $014c; // Intel 386.
|
|
IMAGE_FILE_MACHINE_R3000 = $0162; // MIPS little-endian, $160 big-endian
|
|
IMAGE_FILE_MACHINE_R4000 = $0166; // MIPS little-endian
|
|
IMAGE_FILE_MACHINE_R10000 = $0168; // MIPS little-endian
|
|
IMAGE_FILE_MACHINE_WCEMIPSV2 = $0169; // MIPS little-endian WCE v2
|
|
IMAGE_FILE_MACHINE_ALPHA = $0184; // Alpha_AXP
|
|
IMAGE_FILE_MACHINE_SH3 = $01a2; // SH3 little-endian
|
|
IMAGE_FILE_MACHINE_SH3DSP = $01a3;
|
|
IMAGE_FILE_MACHINE_SH3E = $01a4; // SH3E little-endian
|
|
IMAGE_FILE_MACHINE_SH4 = $01a6; // SH4 little-endian
|
|
IMAGE_FILE_MACHINE_SH5 = $01a8; // SH5
|
|
IMAGE_FILE_MACHINE_ARM = $01c0; // ARM Little-Endian
|
|
IMAGE_FILE_MACHINE_THUMB = $01c2;
|
|
IMAGE_FILE_MACHINE_AM33 = $01d3;
|
|
IMAGE_FILE_MACHINE_POWERPC = $01F0; // IBM PowerPC Little-Endian
|
|
IMAGE_FILE_MACHINE_POWERPCFP = $01f1;
|
|
IMAGE_FILE_MACHINE_IA64 = $0200; // Intel 64
|
|
IMAGE_FILE_MACHINE_MIPS16 = $0266; // MIPS
|
|
IMAGE_FILE_MACHINE_ALPHA64 = $0284; // ALPHA64
|
|
IMAGE_FILE_MACHINE_MIPSFPU = $0366; // MIPS
|
|
IMAGE_FILE_MACHINE_MIPSFPU16 = $0466; // MIPS
|
|
IMAGE_FILE_MACHINE_AXP64 = IMAGE_FILE_MACHINE_ALPHA64;
|
|
IMAGE_FILE_MACHINE_TRICORE = $0520; // Infineon
|
|
IMAGE_FILE_MACHINE_CEF = $0CEF;
|
|
IMAGE_FILE_MACHINE_EBC = $0EBC; // EFI Byte Code
|
|
IMAGE_FILE_MACHINE_AMD64 = $8664; // AMD64 (K8)
|
|
IMAGE_FILE_MACHINE_M32R = $9041; // M32R little-endian
|
|
IMAGE_FILE_MACHINE_CEE = $C0EE;
|
|
|
|
//
|
|
// Directory format.
|
|
//
|
|
|
|
type
|
|
_IMAGE_DATA_DIRECTORY = record
|
|
VirtualAddress: DWORD;
|
|
Size: DWORD;
|
|
end;
|
|
IMAGE_DATA_DIRECTORY = _IMAGE_DATA_DIRECTORY;
|
|
TImageDataDirectory = _IMAGE_DATA_DIRECTORY;
|
|
PImageDataDirectory = ^TImageDataDirectory;
|
|
|
|
|
|
const
|
|
IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16;
|
|
|
|
//
|
|
// Optional header format.
|
|
//
|
|
|
|
type
|
|
_IMAGE_OPTIONAL_HEADER = record
|
|
//
|
|
// Standard fields.
|
|
//
|
|
|
|
Magic: WORD;
|
|
MajorLinkerVersion: BYTE;
|
|
MinorLinkerVersion: BYTE;
|
|
SizeOfCode: DWORD;
|
|
SizeOfInitializedData: DWORD;
|
|
SizeOfUninitializedData: DWORD;
|
|
AddressOfEntryPoint: DWORD;
|
|
BaseOfCode: DWORD;
|
|
BaseOfData: DWORD;
|
|
|
|
//
|
|
// NT additional fields.
|
|
//
|
|
|
|
ImageBase: DWORD;
|
|
SectionAlignment: DWORD;
|
|
FileAlignment: DWORD;
|
|
MajorOperatingSystemVersion: WORD;
|
|
MinorOperatingSystemVersion: WORD;
|
|
MajorImageVersion: WORD;
|
|
MinorImageVersion: WORD;
|
|
MajorSubsystemVersion: WORD;
|
|
MinorSubsystemVersion: WORD;
|
|
Win32VersionValue: DWORD;
|
|
SizeOfImage: DWORD;
|
|
SizeOfHeaders: DWORD;
|
|
CheckSum: DWORD;
|
|
Subsystem: WORD;
|
|
DllCharacteristics: WORD;
|
|
SizeOfStackReserve: DWORD;
|
|
SizeOfStackCommit: DWORD;
|
|
SizeOfHeapReserve: DWORD;
|
|
SizeOfHeapCommit: DWORD;
|
|
LoaderFlags: DWORD;
|
|
NumberOfRvaAndSizes: DWORD;
|
|
DataDirectory: packed array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES-1] of TImageDataDirectory;
|
|
end;
|
|
IMAGE_OPTIONAL_HEADER32 = _IMAGE_OPTIONAL_HEADER;
|
|
TImageOptionalHeader32 = _IMAGE_OPTIONAL_HEADER;
|
|
PImageOptionalHeader32 = ^TImageOptionalHeader32;
|
|
|
|
type
|
|
_IMAGE_ROM_OPTIONAL_HEADER = record
|
|
Magic: WORD;
|
|
MajorLinkerVersion: BYTE;
|
|
MinorLinkerVersion: BYTE;
|
|
SizeOfCode: DWORD;
|
|
SizeOfInitializedData: DWORD;
|
|
SizeOfUninitializedData: DWORD;
|
|
AddressOfEntryPoint: DWORD;
|
|
BaseOfCode: DWORD;
|
|
BaseOfData: DWORD;
|
|
BaseOfBss: DWORD;
|
|
GprMask: DWORD;
|
|
CprMask: array[0..3] of DWORD;
|
|
GpValue: DWORD;
|
|
end;
|
|
IMAGE_ROM_OPTIONAL_HEADER = _IMAGE_ROM_OPTIONAL_HEADER;
|
|
TImageRomOptionalHeader = _IMAGE_ROM_OPTIONAL_HEADER;
|
|
PImageRomOptionalHeader = ^TImageRomOptionalHeader;
|
|
|
|
type
|
|
_IMAGE_OPTIONAL_HEADER64 = record
|
|
Magic: WORD;
|
|
MajorLinkerVersion: BYTE;
|
|
MinorLinkerVersion: BYTE;
|
|
SizeOfCode: DWORD;
|
|
SizeOfInitializedData: DWORD;
|
|
SizeOfUninitializedData: DWORD;
|
|
AddressOfEntryPoint: DWORD;
|
|
BaseOfCode: DWORD;
|
|
ImageBase: ULONGLONG;
|
|
SectionAlignment: DWORD;
|
|
FileAlignment: DWORD;
|
|
MajorOperatingSystemVersion: WORD;
|
|
MinorOperatingSystemVersion: WORD;
|
|
MajorImageVersion: WORD;
|
|
MinorImageVersion: WORD;
|
|
MajorSubsystemVersion: WORD;
|
|
MinorSubsystemVersion: WORD;
|
|
Win32VersionValue: DWORD;
|
|
SizeOfImage: DWORD;
|
|
SizeOfHeaders: DWORD;
|
|
CheckSum: DWORD;
|
|
Subsystem: WORD;
|
|
DllCharacteristics: WORD;
|
|
SizeOfStackReserve: ULONGLONG;
|
|
SizeOfStackCommit: ULONGLONG;
|
|
SizeOfHeapReserve: ULONGLONG;
|
|
SizeOfHeapCommit: ULONGLONG;
|
|
LoaderFlags: DWORD;
|
|
NumberOfRvaAndSizes: DWORD;
|
|
DataDirectory: packed array[0..IMAGE_NUMBEROF_DIRECTORY_ENTRIES-1] of TImageDataDirectory;
|
|
end;
|
|
IMAGE_OPTIONAL_HEADER64 = _IMAGE_OPTIONAL_HEADER64;
|
|
TImageOptionalHeader64 = _IMAGE_OPTIONAL_HEADER64;
|
|
PImageOptionalHeader64 = ^TImageOptionalHeader64;
|
|
|
|
const
|
|
IMAGE_SIZEOF_ROM_OPTIONAL_HEADER = 56;
|
|
IMAGE_SIZEOF_STD_OPTIONAL_HEADER = 28;
|
|
IMAGE_SIZEOF_NT_OPTIONAL32_HEADER = 224;
|
|
IMAGE_SIZEOF_NT_OPTIONAL64_HEADER = 240;
|
|
|
|
IMAGE_NT_OPTIONAL_HDR32_MAGIC = $10b;
|
|
IMAGE_NT_OPTIONAL_HDR64_MAGIC = $20b;
|
|
IMAGE_ROM_OPTIONAL_HDR_MAGIC = $107;
|
|
|
|
{$ifdef WIN64}
|
|
type
|
|
IMAGE_OPTIONAL_HEADER = IMAGE_OPTIONAL_HEADER64;
|
|
TImageOptionalHeader = TImageOptionalHeader64;
|
|
PImagePptionalHeader = PImageOptionalHeader64;
|
|
const
|
|
IMAGE_SIZEOF_NT_OPTIONAL_HEADER = IMAGE_SIZEOF_NT_OPTIONAL64_HEADER;
|
|
IMAGE_NT_OPTIONAL_HDR_MAGIC = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
|
|
{$else}
|
|
type
|
|
IMAGE_OPTIONAL_HEADER = IMAGE_OPTIONAL_HEADER32;
|
|
TImageOptionalHeader = TImageOptionalHeader32;
|
|
PImagePptionalHeader = PImageOptionalHeader32;
|
|
const
|
|
IMAGE_SIZEOF_NT_OPTIONAL_HEADER = IMAGE_SIZEOF_NT_OPTIONAL32_HEADER;
|
|
IMAGE_NT_OPTIONAL_HDR_MAGIC = IMAGE_NT_OPTIONAL_HDR32_MAGIC;
|
|
{$endif}
|
|
|
|
type
|
|
_IMAGE_NT_HEADERS64 = record
|
|
Signature: DWORD;
|
|
FileHeader: TImageFileHeader;
|
|
OptionalHeader: TImageOptionalHeader64;
|
|
end;
|
|
IMAGE_NT_HEADERS64 = _IMAGE_NT_HEADERS64;
|
|
TImageNtHeaders64 = _IMAGE_NT_HEADERS64;
|
|
PImageNtHeaders64 = ^TImageNtHeaders64;
|
|
|
|
_IMAGE_NT_HEADERS32 = record
|
|
Signature: DWORD;
|
|
FileHeader: TImageFileHeader;
|
|
OptionalHeader: TImageOptionalHeader32;
|
|
end;
|
|
IMAGE_NT_HEADERS32 = _IMAGE_NT_HEADERS32;
|
|
TImageNtHeaders32 = _IMAGE_NT_HEADERS32;
|
|
PImageNtHeaders32 = ^TImageNtHeaders32;
|
|
|
|
_IMAGE_ROM_HEADERS = record
|
|
FileHeader: TImageFileHeader;
|
|
OptionalHeader: TImageRomOptionalHeader;
|
|
end;
|
|
IMAGE_ROM_HEADERS = _IMAGE_ROM_HEADERS;
|
|
TImageRomHeaders = _IMAGE_ROM_HEADERS;
|
|
PImageRomHeaders = ^TImageRomHeaders;
|
|
|
|
{$ifdef WIN64}
|
|
IMAGE_NT_HEADERS = IMAGE_NT_HEADERS64;
|
|
TImageNtHeaders = TImageNtHeaders64;
|
|
PImageNtHeaders = PImageNtHeaders64;
|
|
{$else}
|
|
IMAGE_NT_HEADERS = IMAGE_NT_HEADERS32;
|
|
TImageNtHeaders = TImageNtHeaders32;
|
|
PImageNtHeaders = PImageNtHeaders32;
|
|
{$endif}
|
|
|
|
const
|
|
// Subsystem Values
|
|
IMAGE_SUBSYSTEM_UNKNOWN = 0; // Unknown subsystem.
|
|
IMAGE_SUBSYSTEM_NATIVE = 1; // Image doesn't require a subsystem.
|
|
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2; // Image runs in the Windows GUI subsystem.
|
|
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3; // Image runs in the Windows character subsystem.
|
|
IMAGE_SUBSYSTEM_OS2_CUI = 5; // image runs in the OS/2 character subsystem.
|
|
IMAGE_SUBSYSTEM_POSIX_CUI = 7; // image runs in the Posix character subsystem.
|
|
IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8; // image is a native Win9x driver.
|
|
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9; // Image runs in the Windows CE subsystem.
|
|
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10; //
|
|
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11; //
|
|
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12; //
|
|
IMAGE_SUBSYSTEM_EFI_ROM = 13;
|
|
IMAGE_SUBSYSTEM_XBOX = 14;
|
|
|
|
// DllCharacteristics Entries
|
|
|
|
IMAGE_LIBRARY_PROCESS_INIT = $0001; // Reserved.
|
|
IMAGE_LIBRARY_PROCESS_TERM = $0002; // Reserved.
|
|
IMAGE_LIBRARY_THREAD_INIT = $0004; // Reserved.
|
|
IMAGE_LIBRARY_THREAD_TERM = $0008; // Reserved.
|
|
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = $0200; // Image understands isolation and doesn't want it
|
|
IMAGE_DLLCHARACTERISTICS_NO_SEH = $0400; // Image does not use SEH. No SE handler may reside in this image
|
|
IMAGE_DLLCHARACTERISTICS_NO_BIND = $0800; // Do not bind this image.
|
|
// = $1000; // Reserved.
|
|
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = $2000; // Driver uses WDM model
|
|
// = $4000; // Reserved.
|
|
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = $8000;
|
|
|
|
// Directory Entries
|
|
|
|
IMAGE_DIRECTORY_ENTRY_EXPORT = 0; // Export Directory
|
|
IMAGE_DIRECTORY_ENTRY_IMPORT = 1; // Import Directory
|
|
IMAGE_DIRECTORY_ENTRY_RESOURCE = 2; // Resource Directory
|
|
IMAGE_DIRECTORY_ENTRY_EXCEPTION = 3; // Exception Directory
|
|
IMAGE_DIRECTORY_ENTRY_SECURITY = 4; // Security Directory
|
|
IMAGE_DIRECTORY_ENTRY_BASERELOC = 5; // Base Relocation Table
|
|
IMAGE_DIRECTORY_ENTRY_DEBUG = 6; // Debug Directory
|
|
IMAGE_DIRECTORY_ENTRY_COPYRIGHT = 7; // (X86 usage)
|
|
IMAGE_DIRECTORY_ENTRY_ARCHITECTURE = 7; // Architecture Specific Data
|
|
IMAGE_DIRECTORY_ENTRY_GLOBALPTR = 8; // RVA of GP
|
|
IMAGE_DIRECTORY_ENTRY_TLS = 9; // TLS Directory
|
|
IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG = 10; // Load Configuration Directory
|
|
IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT = 11; // Bound Import Directory in headers
|
|
IMAGE_DIRECTORY_ENTRY_IAT = 12; // Import Address Table
|
|
IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT = 13; // Delay Load Import Descriptors
|
|
IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14; // COM Runtime descriptor
|
|
|
|
//
|
|
// Non-COFF Object file header
|
|
//
|
|
|
|
type
|
|
ANON_OBJECT_HEADER = record
|
|
Sig1: WORD; // Must be IMAGE_FILE_MACHINE_UNKNOWN
|
|
Sig2: WORD; // Must be $ffff;
|
|
Version: WORD; // >= 1 (implies the CLSID field is present)
|
|
Machine: WORD;
|
|
TimeDateStamp: DWORD;
|
|
ClassID: CLSID; // Used to invoke CoCreateInstance
|
|
SizeOfData: DWORD; // Size of data that follows the header
|
|
end;
|
|
TAnonObjectHeader = ANON_OBJECT_HEADER;
|
|
PAnonObjectHeader = ^TAnonObjectHeader;
|
|
|
|
//
|
|
// Section header format.
|
|
//
|
|
|
|
const
|
|
IMAGE_SIZEOF_SHORT_NAME = 8;
|
|
|
|
type
|
|
TISHMisc = record
|
|
case Boolean of
|
|
False: (PhysicalAddress: DWORD);
|
|
True: (VirtualSize: DWORD);
|
|
end;
|
|
|
|
_IMAGE_SECTION_HEADER = record
|
|
Name: array[0..IMAGE_SIZEOF_SHORT_NAME-1] of BYTE;
|
|
Misc: TISHMisc;
|
|
VirtualAddress: DWORD;
|
|
SizeOfRawData: DWORD;
|
|
PointerToRawData: DWORD;
|
|
PointerToRelocations: DWORD;
|
|
PointerToLinenumbers: DWORD;
|
|
NumberOfRelocations: WORD;
|
|
NumberOfLinenumbers: WORD;
|
|
Characteristics: DWORD;
|
|
end;
|
|
IMAGE_SECTION_HEADER = _IMAGE_SECTION_HEADER;
|
|
TImageSectionHeader = _IMAGE_SECTION_HEADER;
|
|
PImageSectionHeader = ^TImageSectionHeader;
|
|
|
|
const
|
|
IMAGE_SIZEOF_SECTION_HEADER = 40;
|
|
|
|
//
|
|
// Section characteristics.
|
|
//
|
|
IMAGE_SCN_TYPE_REG = $00000000; // Reserved.
|
|
IMAGE_SCN_TYPE_DSECT = $00000001; // Reserved.
|
|
IMAGE_SCN_TYPE_NOLOAD = $00000002; // Reserved.
|
|
IMAGE_SCN_TYPE_GROUP = $00000004; // Reserved.
|
|
IMAGE_SCN_TYPE_NO_PAD = $00000008; // Reserved.
|
|
IMAGE_SCN_TYPE_COPY = $00000010; // Reserved.
|
|
|
|
IMAGE_SCN_CNT_CODE = $00000020; // Section contains code.
|
|
IMAGE_SCN_CNT_INITIALIZED_DATA = $00000040; // Section contains initialized data.
|
|
IMAGE_SCN_CNT_UNINITIALIZED_DATA = $00000080; // Section contains uninitialized data.
|
|
|
|
IMAGE_SCN_LNK_OTHER = $00000100; // Reserved.
|
|
IMAGE_SCN_LNK_INFO = $00000200; // Section contains comments or some other type of information.
|
|
IMAGE_SCN_TYPE_OVER = $00000400; // Reserved.
|
|
IMAGE_SCN_LNK_REMOVE = $00000800; // Section contents will not become part of image.
|
|
IMAGE_SCN_LNK_COMDAT = $00001000; // Section contents comdat.
|
|
// = $00002000; // Reserved.
|
|
IMAGE_SCN_MEM_PROTECTED = $00004000; // Obsolete
|
|
IMAGE_SCN_NO_DEFER_SPEC_EXC = $00004000; // Reset speculative exceptions handling bits in the TLB entries for this section.
|
|
IMAGE_SCN_GPREL = $00008000; // Section content can be accessed relative to GP
|
|
IMAGE_SCN_MEM_FARDATA = $00008000;
|
|
IMAGE_SCN_MEM_SYSHEAP = $00010000; // Obsolete
|
|
IMAGE_SCN_MEM_PURGEABLE = $00020000;
|
|
IMAGE_SCN_MEM_16BIT = $00020000;
|
|
IMAGE_SCN_MEM_LOCKED = $00040000;
|
|
IMAGE_SCN_MEM_PRELOAD = $00080000;
|
|
|
|
IMAGE_SCN_ALIGN_1BYTES = $00100000; //
|
|
IMAGE_SCN_ALIGN_2BYTES = $00200000; //
|
|
IMAGE_SCN_ALIGN_4BYTES = $00300000; //
|
|
IMAGE_SCN_ALIGN_8BYTES = $00400000; //
|
|
IMAGE_SCN_ALIGN_16BYTES = $00500000; // Default alignment if no others are specified.
|
|
IMAGE_SCN_ALIGN_32BYTES = $00600000; //
|
|
IMAGE_SCN_ALIGN_64BYTES = $00700000; //
|
|
IMAGE_SCN_ALIGN_128BYTES = $00800000; //
|
|
IMAGE_SCN_ALIGN_256BYTES = $00900000; //
|
|
IMAGE_SCN_ALIGN_512BYTES = $00A00000; //
|
|
IMAGE_SCN_ALIGN_1024BYTES = $00B00000; //
|
|
IMAGE_SCN_ALIGN_2048BYTES = $00C00000; //
|
|
IMAGE_SCN_ALIGN_4096BYTES = $00D00000; //
|
|
IMAGE_SCN_ALIGN_8192BYTES = $00E00000; //
|
|
// Unused = $00F00000;
|
|
IMAGE_SCN_ALIGN_MASK = $00F00000;
|
|
|
|
IMAGE_SCN_LNK_NRELOC_OVFL = $01000000; // Section contains extended relocations.
|
|
IMAGE_SCN_MEM_DISCARDABLE = $02000000; // Section can be discarded.
|
|
IMAGE_SCN_MEM_NOT_CACHED = $04000000; // Section is not cachable.
|
|
IMAGE_SCN_MEM_NOT_PAGED = $08000000; // Section is not pageable.
|
|
IMAGE_SCN_MEM_SHARED = $10000000; // Section is shareable.
|
|
IMAGE_SCN_MEM_EXECUTE = $20000000; // Section is executable.
|
|
IMAGE_SCN_MEM_READ = $40000000; // Section is readable.
|
|
IMAGE_SCN_MEM_WRITE = $80000000; // Section is writeable.
|
|
|
|
//
|
|
// TLS Chaacteristic Flags
|
|
//
|
|
IMAGE_SCN_SCALE_INDEX = $00000001; // Tls index is scaled
|
|
|
|
{$packrecords 2}
|
|
|
|
//
|
|
// Symbol format.
|
|
//
|
|
type
|
|
TISName = record
|
|
case Byte of
|
|
0: (ShortName: array[0..7] of Char);
|
|
1: (Name: record
|
|
Short: DWORD;
|
|
Long: DWORD;
|
|
end);
|
|
2: (LongName: array[0..1] of DWORD) ;
|
|
end;
|
|
|
|
_IMAGE_SYMBOL = record
|
|
N: TISName;
|
|
Value: DWORD;
|
|
SectionNumber: SHORT;
|
|
_Type: WORD;
|
|
StorageClass: BYTE;
|
|
NumberOfAuxSymbols: BYTE;
|
|
end;
|
|
IMAGE_SYMBOL = _IMAGE_SYMBOL;
|
|
TImageSymbol = _IMAGE_SYMBOL;
|
|
PImageSymbol = ^TImageSymbol;
|
|
|
|
const
|
|
IMAGE_SIZEOF_SYMBOL = 18;
|
|
|
|
//
|
|
// Section values.
|
|
//
|
|
// Symbols have a section number of the section in which they are
|
|
// defined. Otherwise, section numbers have the following meanings:
|
|
//
|
|
|
|
IMAGE_SYM_UNDEFINED = SHORT(0); // Symbol is undefined or is common.
|
|
IMAGE_SYM_ABSOLUTE = SHORT(-1); // Symbol is an absolute value.
|
|
IMAGE_SYM_DEBUG = SHORT(-2); // Symbol is a special debug item.
|
|
IMAGE_SYM_SECTION_MAX = $FEFF; // Values = $FF00-= $FFFF are special
|
|
|
|
//
|
|
// Type (fundamental) values.
|
|
//
|
|
|
|
IMAGE_SYM_TYPE_NULL = $0000; // no type.
|
|
IMAGE_SYM_TYPE_VOID = $0001; //
|
|
IMAGE_SYM_TYPE_CHAR = $0002; // type character.
|
|
IMAGE_SYM_TYPE_SHORT = $0003; // type short integer.
|
|
IMAGE_SYM_TYPE_INT = $0004; //
|
|
IMAGE_SYM_TYPE_LONG = $0005; //
|
|
IMAGE_SYM_TYPE_FLOAT = $0006; //
|
|
IMAGE_SYM_TYPE_DOUBLE = $0007; //
|
|
IMAGE_SYM_TYPE_STRUCT = $0008; //
|
|
IMAGE_SYM_TYPE_UNION = $0009; //
|
|
IMAGE_SYM_TYPE_ENUM = $000A; // enumeration.
|
|
IMAGE_SYM_TYPE_MOE = $000B; // member of enumeration.
|
|
IMAGE_SYM_TYPE_BYTE = $000C; //
|
|
IMAGE_SYM_TYPE_WORD = $000D; //
|
|
IMAGE_SYM_TYPE_UINT = $000E; //
|
|
IMAGE_SYM_TYPE_DWORD = $000F; //
|
|
IMAGE_SYM_TYPE_PCODE = $8000; //
|
|
//
|
|
// Type (derived) values.
|
|
//
|
|
|
|
IMAGE_SYM_DTYPE_NULL = 0; // no derived type.
|
|
IMAGE_SYM_DTYPE_POINTER = 1; // pointer.
|
|
IMAGE_SYM_DTYPE_FUNCTION = 2; // function.
|
|
IMAGE_SYM_DTYPE_ARRAY = 3; // array.
|
|
|
|
//
|
|
// Storage classes.
|
|
//
|
|
IMAGE_SYM_CLASS_END_OF_FUNCTION = High(BYTE);
|
|
IMAGE_SYM_CLASS_NULL = $0000;
|
|
IMAGE_SYM_CLASS_AUTOMATIC = $0001;
|
|
IMAGE_SYM_CLASS_EXTERNAL = $0002;
|
|
IMAGE_SYM_CLASS_STATIC = $0003;
|
|
IMAGE_SYM_CLASS_REGISTER = $0004;
|
|
IMAGE_SYM_CLASS_EXTERNAL_DEF = $0005;
|
|
IMAGE_SYM_CLASS_LABEL = $0006;
|
|
IMAGE_SYM_CLASS_UNDEFINED_LABEL = $0007;
|
|
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = $0008;
|
|
IMAGE_SYM_CLASS_ARGUMENT = $0009;
|
|
IMAGE_SYM_CLASS_STRUCT_TAG = $000A;
|
|
IMAGE_SYM_CLASS_MEMBER_OF_UNION = $000B;
|
|
IMAGE_SYM_CLASS_UNION_TAG = $000C;
|
|
IMAGE_SYM_CLASS_TYPE_DEFINITION = $000D;
|
|
IMAGE_SYM_CLASS_UNDEFINED_STATIC = $000E;
|
|
IMAGE_SYM_CLASS_ENUM_TAG = $000F;
|
|
IMAGE_SYM_CLASS_MEMBER_OF_ENUM = $0010;
|
|
IMAGE_SYM_CLASS_REGISTER_PARAM = $0011;
|
|
IMAGE_SYM_CLASS_BIT_FIELD = $0012;
|
|
|
|
IMAGE_SYM_CLASS_FAR_EXTERNAL = $0044; //
|
|
|
|
IMAGE_SYM_CLASS_BLOCK = $0064;
|
|
IMAGE_SYM_CLASS_FUNCTION = $0065;
|
|
IMAGE_SYM_CLASS_END_OF_STRUCT = $0066;
|
|
IMAGE_SYM_CLASS_FILE = $0067;
|
|
// new
|
|
IMAGE_SYM_CLASS_SECTION = $0068;
|
|
IMAGE_SYM_CLASS_WEAK_EXTERNAL = $0069;
|
|
|
|
IMAGE_SYM_CLASS_CLR_TOKEN = $006B;
|
|
|
|
// type packing constants
|
|
|
|
N_BTMASK = $000F;
|
|
N_TMASK = $0030;
|
|
N_TMASK1 = $00C0;
|
|
N_TMASK2 = $00F0;
|
|
N_BTSHFT = 4;
|
|
N_TSHIFT = 2;
|
|
|
|
// MACROS
|
|
|
|
// Basic Type of x
|
|
function BTYPE(x: Byte): Byte; inline;
|
|
|
|
// Is x a pointer?
|
|
function ISPTR(x: Byte): Boolean; inline;
|
|
|
|
// Is x a function?
|
|
function ISFCN(x: Byte): Boolean; inline;
|
|
|
|
// Is x an array?
|
|
function ISARY(x: Byte): Boolean; inline;
|
|
|
|
// Is x a structure, union, or enumeration TAG?
|
|
function ISTAG(x: Byte): Boolean; inline;
|
|
|
|
function INCREF(x: Byte): Byte; inline;
|
|
|
|
function DECREF(x: Byte): Byte; inline;
|
|
|
|
//
|
|
// Auxiliary entry format.
|
|
//
|
|
type
|
|
TIASMisc = record
|
|
case Byte of
|
|
0: (
|
|
Linenumber: WORD; // declaration line number
|
|
Size: WORD; // size of struct, union, or enum
|
|
);
|
|
1: (
|
|
LnSz: record
|
|
Linenumber: WORD; // declaration line number
|
|
Size: WORD; // size of struct, union, or enum
|
|
end;
|
|
);
|
|
2: (TotalSize: DWORD);
|
|
end;
|
|
|
|
TIASFcnAry = record
|
|
case Byte of
|
|
0: (
|
|
_Function: record // if ISFCN, tag, or .bb
|
|
PointerToLinenumber: DWORD;
|
|
PointerToNextFunction: DWORD;
|
|
end;
|
|
);
|
|
1: (
|
|
_Array: record // if ISARY, up to 4 dimen.
|
|
Dimension: array[0..3] of WORD;
|
|
end;
|
|
);
|
|
end;
|
|
|
|
_IMAGE_AUX_SYMBOL = record
|
|
case Byte of
|
|
0: (
|
|
Sym: record
|
|
TagIndex: DWORD; // struct, union, or enum tag index
|
|
Misc: TIASMisc;
|
|
FcnAry: TIASFcnAry;
|
|
TvIndex: WORD; // tv index
|
|
end;
|
|
);
|
|
1: (
|
|
_File: record
|
|
Name: array[0..IMAGE_SIZEOF_SYMBOL-1] of BYTE;
|
|
end;
|
|
);
|
|
2: (
|
|
Section: record
|
|
Length: DWORD; // section length
|
|
NumberOfRelocations: WORD; // number of relocation entries
|
|
NumberOfLinenumbers: WORD; // number of line numbers
|
|
CheckSum: DWORD; // checksum for communal
|
|
Number: SHORT; // section number to associate with
|
|
Selection: BYTE; // communal selection type
|
|
end;
|
|
);
|
|
end;
|
|
IMAGE_AUX_SYMBOL = _IMAGE_AUX_SYMBOL;
|
|
TImageAuxSymbol = _IMAGE_AUX_SYMBOL;
|
|
PImageAuxSymbol = ^TImageAuxSymbol;
|
|
|
|
|
|
const
|
|
IMAGE_SIZEOF_AUX_SYMBOL = 18;
|
|
|
|
type
|
|
IMAGE_AUX_SYMBOL_TYPE = (
|
|
IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1
|
|
);
|
|
TImageAuxSymbolType = IMAGE_AUX_SYMBOL_TYPE;
|
|
|
|
{$packRecords 2}
|
|
|
|
type
|
|
IMAGE_AUX_SYMBOL_TOKEN_DEF = record
|
|
bAuxType: BYTE; // IMAGE_AUX_SYMBOL_TYPE
|
|
bReserved: BYTE; // Must be 0
|
|
SymbolTableIndex: DWORD;
|
|
rgbReserved: array [0..11] of BYTE; // Must be 0
|
|
end;
|
|
TImageAuxSymbolTokenDef = IMAGE_AUX_SYMBOL_TOKEN_DEF;
|
|
PImageAuxSymbolTokenDef = ^TImageAuxSymbolTokenDef;
|
|
|
|
{$packrecords 4}
|
|
|
|
implementation
|
|
|
|
function BTYPE(x: Byte): Byte; inline;
|
|
begin
|
|
Result := x and N_BTMASK;
|
|
end;
|
|
|
|
function ISPTR(x: Byte): Boolean; inline;
|
|
begin
|
|
Result := (x and N_TMASK) = (IMAGE_SYM_DTYPE_POINTER shl N_BTSHFT);
|
|
end;
|
|
|
|
function ISFCN(x: Byte): Boolean; inline;
|
|
begin
|
|
Result := (x and N_TMASK) = (IMAGE_SYM_DTYPE_FUNCTION shl N_BTSHFT);
|
|
end;
|
|
|
|
function ISARY(x: Byte): Boolean; inline;
|
|
begin
|
|
Result := (x and N_TMASK) = (IMAGE_SYM_DTYPE_ARRAY shl N_BTSHFT);
|
|
end;
|
|
|
|
function ISTAG(x: Byte): Boolean; inline;
|
|
begin
|
|
Result := (x = IMAGE_SYM_CLASS_STRUCT_TAG) or (x = IMAGE_SYM_CLASS_UNION_TAG) or (x = IMAGE_SYM_CLASS_ENUM_TAG);
|
|
end;
|
|
|
|
function INCREF(x: Byte): Byte; inline;
|
|
begin
|
|
Result := ((x and not N_BTMASK) shl N_TSHIFT) or (IMAGE_SYM_DTYPE_POINTER shl N_BTSHFT) or (x and N_BTMASK);
|
|
end;
|
|
|
|
function DECREF(x: Byte): Byte; inline;
|
|
begin
|
|
Result := ((x shr N_TSHIFT) and not N_BTMASK) or (x and N_BTMASK);
|
|
end;
|
|
|
|
end.
|