Delen via


PE-indeling

Deze specificatie beschrijft de structuur van uitvoerbare bestanden (installatiekopieën) en objectbestanden onder de Windows-familie van besturingssystemen. Deze bestanden worden respectievelijk COFF-bestanden (Portable Executable) en Common Object File Format (COFF) genoemd.

Notitie

Dit document wordt verstrekt voor hulp bij de ontwikkeling van hulpprogramma's en toepassingen voor Windows, maar is niet gegarandeerd een volledige specificatie in alle opzichten. Microsoft behoudt zich het recht voor dit document zonder kennisgeving te wijzigen.

Deze revisie van microsoft Portable Executable en Common Object File Format Specification vervangt alle eerdere revisies van deze specificatie.

Algemene concepten

In dit document wordt de structuur opgegeven van uitvoerbare bestanden (installatiekopieën) en objectbestanden onder de Microsoft Windows-familie van besturingssystemen. Deze bestanden worden respectievelijk COFF-bestanden (Portable Executable) en Common Object File Format (COFF) genoemd. De naam 'Draagbaar uitvoerbaar bestand' verwijst naar het feit dat de indeling niet specifiek is voor architectuur.

Bepaalde concepten die in deze specificatie worden weergegeven, worden beschreven in de volgende tabel:

Naam Beschrijving
kenmerkcertificaat
Een certificaat dat wordt gebruikt om verifieerbare instructies te koppelen aan een installatiekopieën. Een aantal verschillende verifieerbare instructies kan worden gekoppeld aan een bestand; een van de nuttigste is een instructie van een softwarefabrikant die aangeeft wat de berichtsamenvating van de afbeelding naar verwachting is. Een samenvatting van een bericht is vergelijkbaar met een controlesom, behalve dat het zeer moeilijk is om te smeden. Daarom is het erg moeilijk om een bestand te wijzigen om dezelfde berichtsamenvating te hebben als het oorspronkelijke bestand. De instructie kan worden geverifieerd als gemaakt door de fabrikant met behulp van cryptografieschema's met openbare of persoonlijke sleutels. In dit document worden details beschreven over andere kenmerkcertificaten dan voor het toestaan van de invoeging in afbeeldingsbestanden.
datum-/tijdstempel
Een stempel dat wordt gebruikt voor verschillende doeleinden op verschillende plaatsen in een PE- of COFF-bestand. In de meeste gevallen is de indeling van elke stempel hetzelfde als die wordt gebruikt door de tijdfuncties in de C-runtimebibliotheek. Zie de beschrijving van IMAGE_DEBUG_TYPE_REPRO in Foutopsporingstypevoor uitzonderingen. Als de stempelwaarde 0 of 0xFFFFFFFF is, vertegenwoordigt deze geen echte of zinvolle datum-/tijdstempel.
bestandspointer
De locatie van een item in het bestand zelf, voordat deze wordt verwerkt door de linker (in het geval van objectbestanden) of het laadprogramma (in het geval van afbeeldingsbestanden). Met andere woorden, dit is een positie in het bestand zoals opgeslagen op schijf.
linker
Een verwijzing naar de linker die wordt geleverd met Microsoft Visual Studio.
objectbestand
Een bestand dat wordt opgegeven als invoer voor de linker. De linker produceert een afbeeldingsbestand, dat op zijn beurt wordt gebruikt als invoer door het laadprogramma. De term 'objectbestand' impliceert niet noodzakelijkerwijs een verbinding met objectgeoriënteerde programmering.
gereserveerd, moet 0 zijn
Een beschrijving van een veld dat aangeeft dat de waarde van het veld nul moet zijn voor generatoren en consumenten het veld moeten negeren.
Relatief virtueel adres (RVA)
In een afbeeldingsbestand is dit het adres van een item nadat het in het geheugen is geladen, waarbij het basisadres van het afbeeldingsbestand ervan is afgetrokken. De RVA van een item verschilt vrijwel altijd van de positie in het bestand op schijf (bestandsaanwijzer).
In een objectbestand is een RVA minder zinvol omdat er geen geheugenlocaties zijn toegewezen. In dit geval zou een RVA een adres zijn binnen een sectie (verderop in deze tabel beschreven), waarop een herlocatie later wordt toegepast tijdens het koppelen. Voor het gemak moet een compiler alleen de eerste RVA in elke sectie instellen op nul.
afdeling
De basiseenheid van code of gegevens in een PE- of COFF-bestand. Alle code in een objectbestand kan bijvoorbeeld worden gecombineerd binnen één sectie of (afhankelijk van het compilergedrag) elke functie kan een eigen sectie innemen. Met meer secties is er meer bestandsoverhead, maar de linker kan selectiever koppelen in code. Een sectie is vergelijkbaar met een segment in intel 8086-architectuur. Alle onbewerkte gegevens in een sectie moeten aaneengesloten worden geladen. Daarnaast kan een afbeeldingsbestand een aantal secties bevatten, zoals .tls of .reloc, die speciale doeleinden hebben.
Virtueel adres (VA)
Hetzelfde als RVA, behalve dat het basisadres van het afbeeldingsbestand niet wordt afgetrokken. Het adres wordt een VA genoemd omdat Windows een afzonderlijke VA-ruimte voor elk proces maakt, onafhankelijk van fysiek geheugen. Voor vrijwel alle doeleinden moet een VA als slechts een adres worden beschouwd. Een VA is niet zo voorspelbaar als een RVA omdat het laadprogramma de installatiekopieën mogelijk niet op de gewenste locatie laadt.

Overzicht

In de volgende lijst wordt de uitvoerbare indeling van Microsoft PE beschreven, met de basis van de afbeeldingskoptekst bovenaan. De sectie van de MS-DOS 2.0 compatibele EXE-header naar de ongebruikte sectie net voordat de PE-header de MS-DOS 2.0-sectie is en wordt alleen gebruikt voor MS-DOS compatibiliteit.

  • MS-DOS 2.0 compatibele EXE-header

  • ongebruikt

  • OEM-id

    OEM-informatie

    Verschuiving naar PE-header

  • MS-DOS 2.0 Stub Program and Relocation Table

  • ongebruikt

  • PE-koptekst (uitgelijnd op grens van 8 bytes)

  • Sectiekoppen

  • Afbeeldingspagina's:

    gegevens importeren

    exportgegevens

    basisverplaatsingen

    resourcegegevens

In de volgende lijst wordt de indeling van de Microsoft COFF-objectmodule beschreven:

  • Microsoft COFF-header

  • Sectiekoppen

  • Onbewerkte gegevens:

    code

    gegevens

    foutopsporingsgegevens

    Bedrijfsverplaatsingen

Bestandsheaders

De PE-bestandskoptekst bestaat uit een Microsoft-MS-DOS stub, de PE-handtekening, de COFF-bestandskoptekst en een optionele header. Een COFF-objectbestandskoptekst bestaat uit een COFF-bestandskoptekst en een optionele header. In beide gevallen worden de bestandsheaders onmiddellijk gevolgd door sectieheaders.

MS-DOS Stub (alleen afbeelding)

De MS-DOS stub is een geldige toepassing die wordt uitgevoerd onder MS-DOS. Het wordt aan de voorkant van de EXE-installatiekopieën geplaatst. De linker plaatst hier een standaard stub, waarmee het bericht 'Dit programma kan niet worden uitgevoerd in DOS-modus' wordt afgedrukt wanneer de afbeelding wordt uitgevoerd in MS-DOS. De gebruiker kan een andere stub opgeven met behulp van de optie /STUB-linker.

Op locatie 0x3c heeft de stub het bestandsverschil met de PE-handtekening. Met deze informatie kan Windows het installatiekopieënbestand correct uitvoeren, ook al heeft het een MS-DOS stub. Deze bestandsverschil wordt op locatie 0x3c geplaatst tijdens het koppelen.

Handtekening (alleen afbeelding)

Na de MS-DOS stub, op de bestands offset die is opgegeven bij offset 0x3c, is een 4-bytehandtekening die het bestand identificeert als een PE-indeling afbeeldingsbestand. Deze handtekening is PE\0\0 (de letters 'P' en 'E' gevolgd door twee null-bytes).

COFF-bestandskoptekst (object en afbeelding)

Aan het begin van een objectbestand, of direct na de handtekening van een afbeeldingsbestand, is een standaard COFF-bestandskoptekst in de volgende indeling. Houd er rekening mee dat het aantal secties wordt beperkt tot 96 door het Windows-laadprogramma.

Afstand Grootte Veld Beschrijving
0
2
Machine
Het getal dat het type doelmachine aangeeft. Zie Machinetypenvoor meer informatie.
2
2
NumberOfSections
Het aantal secties. Dit geeft de grootte van de sectietabel aan, die direct volgt op de kopteksten.
4
4
TimeDateStamp
De lage 32 bits van het aantal seconden sinds 00:00 januari 1970 (een C-runtimewaarde time_t), wat aangeeft wanneer het bestand is gemaakt.
8
4
PointerToSymbolTable
De bestandsverschuiving van de tabel COFF-symbool of nul als er geen COFF-symbooltabel aanwezig is. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft.
12
4
NumberOfSymbolen
Het aantal vermeldingen in de symbooltabel. Deze gegevens kunnen worden gebruikt om de tekenreekstabel te vinden, die direct volgt op de symbooltabel. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft.
16
2
SizeOfOptionalHeader
De grootte van de optionele header, die vereist is voor uitvoerbare bestanden, maar niet voor objectbestanden. Deze waarde moet nul zijn voor een objectbestand. Zie Optionele koptekst (alleen afbeelding)voor een beschrijving van de koptekstindeling.
18
2
Kenmerken
De vlaggen die de kenmerken van het bestand aangeven. Zie Kenmerkenvoor specifieke markeringswaarden.

Machinetypen

Het veld Machine heeft een van de volgende waarden, waarmee het CPU-type wordt opgegeven. Een afbeeldingsbestand kan alleen worden uitgevoerd op de opgegeven computer of op een systeem dat de opgegeven machine emuleren.

Constant Waarde Beschrijving
IMAGE_FILE_MACHINE_UNKNOWN
0x0
De inhoud van dit veld wordt verondersteld van toepassing te zijn op elk computertype
IMAGE_FILE_MACHINE_ALPHA
0x184
Alfa AXP, 32-bits adresruimte
IMAGE_FILE_MACHINE_ALPHA64
0x284
Alfa 64, 64-bits adresruimte
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33
IMAGE_FILE_MACHINE_AMD64
0x8664
x64
IMAGE_FILE_MACHINE_ARM
0x1c0
ARM little endian
IMAGE_FILE_MACHINE_ARM64
0xaa64
ARM64 little endian
IMAGE_FILE_MACHINE_ARMNT
0x1c4
ARM Duim-2 kleine endian
IMAGE_FILE_MACHINE_AXP64
0x284
AXP 64 (hetzelfde als Alfa 64)
IMAGE_FILE_MACHINE_EBC
0xebc
EFI-bytecode
IMAGE_FILE_MACHINE_I386
0x14c
Intel 386 of hoger processors en compatibele processors
IMAGE_FILE_MACHINE_IA64
0x200
Intel Itanium-processorfamilie
IMAGE_FILE_MACHINE_LOONGARCH32
0x6232
LoongArch 32-bits processorfamilie
IMAGE_FILE_MACHINE_LOONGARCH64
0x6264
LoongArch 64-bits processorfamilie
IMAGE_FILE_MACHINE_M32R
0x9041
Mitsubishi M32R little endian
IMAGE_FILE_MACHINE_MIPS16
0x266
MIPS16
IMAGE_FILE_MACHINE_MIPSFPU
0x366
MIPS met FPU
IMAGE_FILE_MACHINE_MIPSFPU16
0x466
MIPS16 met FPU
IMAGE_FILE_MACHINE_POWERPC
0x1f0
Power PC little endian
IMAGE_FILE_MACHINE_POWERPCFP
0x1f1
Power PC met ondersteuning voor drijvende komma
IMAGE_FILE_MACHINE_R4000
0x166
MIPS little endian
IMAGE_FILE_MACHINE_RISCV32
0x5032
RISC-V 32-bits adresruimte
IMAGE_FILE_MACHINE_RISCV64
0x5064
RISC-V 64-bits adresruimte
IMAGE_FILE_MACHINE_RISCV128
0x5128
RISC-V 128-bits adresruimte
IMAGE_FILE_MACHINE_SH3
0x1a2
Hitachi SH3
IMAGE_FILE_MACHINE_SH3DSP
0x1a3
Hitachi SH3 DSP
IMAGE_FILE_MACHINE_SH4
0x1a6
Hitachi SH4
IMAGE_FILE_MACHINE_SH5
0x1a8
Hitachi SH5
IMAGE_FILE_MACHINE_THUMB
0x1c2
Duim
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS little-endian WCE v2

Kenmerken

Het veld Kenmerken bevat vlaggen die kenmerken van het object- of afbeeldingsbestand aangeven. De volgende vlaggen zijn momenteel gedefinieerd:

Vlag Waarde Beschrijving
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Alleen afbeelding, Windows CE en Microsoft Windows NT en hoger. Dit geeft aan dat het bestand geen basisverplaatsingen bevat en daarom moet worden geladen op het voorkeursbasisadres. Als het basisadres niet beschikbaar is, meldt het laadprogramma een fout. Het standaardgedrag van de linker is het stripen van basisverplaatsingen van uitvoerbare (EXE)-bestanden.
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
Alleen afbeelding. Dit geeft aan dat het afbeeldingsbestand geldig is en kan worden uitgevoerd. Als deze vlag niet is ingesteld, wordt een linkerfout aangegeven.
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004
COFF-regelnummers zijn verwijderd. Deze vlag is afgeschaft en moet nul zijn.
IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008
COFF-symbooltabelvermeldingen voor lokale symbolen zijn verwijderd. Deze vlag is afgeschaft en moet nul zijn.
IMAGE_FILE_AGGRESSIVE_WS_TRIM
0x0010
Verouderd. Het werkset agressief knippen. Deze vlag is afgeschaft voor Windows 2000 en hoger en moet nul zijn.
IMAGE_FILE_LARGE_ADDRESS_ AWARE
0x0020
De toepassing kan > 2 GB-adressen verwerken.
0x0040
Deze vlag is gereserveerd voor toekomstig gebruik.
IMAGE_FILE_BYTES_REVERSED_LO
0x0080
Little endian: de minst significante bit (LSB) gaat vooraf aan de meest significante bit (MSB) in het geheugen. Deze vlag is afgeschaft en moet nul zijn.
IMAGE_FILE_32BIT_MACHINE
0x0100
De machine is gebaseerd op een 32-bits architectuur.
IMAGE_FILE_DEBUG_STRIPPED
0x0200
Foutopsporingsgegevens worden verwijderd uit het afbeeldingsbestand.
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP
0x0400
Als de installatiekopie zich op verwisselbare media bevindt, laadt u deze volledig en kopieert u deze naar het wisselbestand.
IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800
Als de installatiekopie zich op netwerkmedia bevindt, laadt u deze volledig en kopieert u deze naar het wisselbestand.
IMAGE_FILE_SYSTEM
0x1000
Het installatiekopieënbestand is een systeembestand, geen gebruikersprogramma.
IMAGE_FILE_DLL
0x2000
Het afbeeldingsbestand is een DLL (Dynamic Link Library). Dergelijke bestanden worden beschouwd als uitvoerbare bestanden voor bijna alle doeleinden, hoewel ze niet rechtstreeks kunnen worden uitgevoerd.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000
Het bestand mag alleen worden uitgevoerd op een uniprocessorcomputer.
IMAGE_FILE_BYTES_REVERSED_HI
0x8000
Big endian: de MSB gaat vooraf aan de LSB in het geheugen. Deze vlag is afgeschaft en moet nul zijn.

Optionele koptekst (alleen afbeelding)

Elk afbeeldingsbestand heeft een optionele header die informatie aan het laadprogramma biedt. Deze header is optioneel in de zin dat sommige bestanden (met name objectbestanden) deze niet hebben. Voor afbeeldingsbestanden is deze header vereist. Een objectbestand kan een optionele koptekst hebben, maar over het algemeen heeft deze header geen functie in een objectbestand, behalve om de grootte ervan te vergroten.

Houd er rekening mee dat de grootte van de optionele header niet is opgelost. Het veld SizeOfOptionalHeader in de COFF-header moet worden gebruikt om te controleren of een test in het bestand voor een bepaalde gegevensmap niet verder gaat dan SizeOfOptionalHeader-. Zie COFF File Header (Object and Image)voor meer informatie.

De NumberOfRvaAndSizes veld van de optionele header moet ook worden gebruikt om ervoor te zorgen dat er geen test voor een bepaalde gegevensmapvermelding buiten de optionele header valt. Daarnaast is het belangrijk om het optionele magicnummer voor headers te valideren voor de compatibiliteit met opmaak.

Het optionele magic-nummer van de header bepaalt of een afbeelding een PE32- of PE32+ uitvoerbaar bestand is.

Magic number PE-indeling
0x10b
PE32
0x20b
PE32+

PE32+ afbeeldingen maken een 64-bits adresruimte mogelijk terwijl de grootte van de installatiekopieën wordt beperkt tot 2 gigabyte. Andere PE32+ wijzigingen worden behandeld in hun respectieve secties.

De optionele header zelf heeft drie belangrijke onderdelen.

Verschuiving (PE32/PE32+) Grootte (PE32/PE32+) Koptekstonderdeel Beschrijving
0
28/24
Standaardvelden
Velden die zijn gedefinieerd voor alle implementaties van COFF, inclusief UNIX.
28/24
68/88
Windows-specifieke velden
Aanvullende velden ter ondersteuning van specifieke functies van Windows (bijvoorbeeld subsystemen).
96/112
Veranderlijk
Gegevensmappen
Adres-/grootteparen voor speciale tabellen die zijn gevonden in het afbeeldingsbestand en worden gebruikt door het besturingssysteem (bijvoorbeeld de importtabel en de exporttabel).

Optionele standaardvelden voor kopteksten (alleen afbeelding)

De eerste acht velden van de optionele header zijn standaardvelden die zijn gedefinieerd voor elke implementatie van COFF. Deze velden bevatten algemene informatie die handig is voor het laden en uitvoeren van een uitvoerbaar bestand. Ze zijn ongewijzigd voor de PE32+-indeling.

Afstand Grootte Veld Beschrijving
0
2
Magie
Het niet-ondertekende gehele getal dat de status van het afbeeldingsbestand aangeeft. Het meest voorkomende getal is 0x10B, waarmee het wordt aangeduid als een normaal uitvoerbaar bestand. 0x107 identificeert deze als een ROM-installatiekopieën en 0x20B identificeert deze als een uitvoerbaar PE32+-bestand.
2
1
MajorLinkerVersion
Het primaire versienummer van de linker.
3
1
MinorLinkerVersion
Het secundaire versienummer van de linker.
4
4
SizeOfCode
De grootte van de codesectie (tekst) of de som van alle codesecties als er meerdere secties zijn.
8
4
SizeOfInitializedData
De grootte van de geïnitialiseerde gegevenssectie of de som van alle dergelijke secties als er meerdere gegevenssecties zijn.
12
4
SizeOfUninitializedData
De grootte van de niet-geïnitialiseerde gegevenssectie (BSS) of de som van alle dergelijke secties als er meerdere BSS-secties zijn.
16
4
AddressOfEntryPoint
Het adres van het toegangspunt ten opzichte van de basis van de installatiekopieën wanneer het uitvoerbare bestand in het geheugen wordt geladen. Voor programma-installatiekopieën is dit het beginadres. Voor apparaatstuurprogramma's is dit het adres van de initialisatiefunctie. Een toegangspunt is optioneel voor DLL's. Als er geen toegangspunt aanwezig is, moet dit veld nul zijn.
20
4
BaseOfCode
Het adres dat relatief is ten opzichte van de afbeeldingsbasis van de sectie begin van de code wanneer deze in het geheugen wordt geladen.

PE32 bevat dit extra veld, dat ontbreekt in PE32+, na BaseOfCode.

Afstand Grootte Veld Beschrijving
24
4
BaseOfData
Het adres dat relatief is ten opzichte van de afbeeldingsbasis van de sectie begin van gegevens wanneer deze in het geheugen wordt geladen.

Optionele koptekst Windows-Specific velden (alleen afbeelding)

De volgende 21 velden zijn een uitbreiding van de optionele COFF-headerindeling. Ze bevatten aanvullende informatie die vereist is voor de linker en het laadprogramma in Windows.

Verschuiving (PE32/ PE32+) Grootte (PE32/ PE32+) Veld Beschrijving
28/24
4/8
ImageBase
Het voorkeursadres van de eerste byte van de afbeelding wanneer deze in het geheugen wordt geladen; moet een veelvoud van 64 K zijn. De standaardwaarde voor DLL's is 0x10000000. De standaardinstelling voor Windows CE EXEs is 0x00010000. De standaardinstelling voor Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 en Windows Me is 0x00400000.
32/32
4
SectionAlignment
De uitlijning (in bytes) van secties wanneer ze in het geheugen worden geladen. Het moet groter dan of gelijk zijn aan FileAlignment. De standaardwaarde is het paginaformaat voor de architectuur.
36/36
4
FileAlignment
De uitlijningsfactor (in bytes) die wordt gebruikt om de onbewerkte gegevens van secties in het afbeeldingsbestand uit te lijnen. De waarde moet een macht zijn van 2 tussen 512 en 64 K, inclusief. De standaardwaarde is 512. Als de SectionAlignment kleiner is dan de paginagrootte van de architectuur, moet FileAlignment overeenkomen met SectionAlignment.
40/40
2
MajorOperatingSystemVersion
Het primaire versienummer van het vereiste besturingssysteem.
42/42
2
MinorOperatingSystemVersion
Het secundaire versienummer van het vereiste besturingssysteem.
44/44
2
MajorImageVersion
Het primaire versienummer van de installatiekopieën.
46/46
2
MinorImageVersion
Het secundaire versienummer van de installatiekopieën.
48/48
2
MajorSubsystemVersion
Het primaire versienummer van het subsysteem.
50/50
2
MinorSubsystemVersion
Het secundaire versienummer van het subsysteem.
52/52
4
Win32VersionValue
Gereserveerd, moet nul zijn.
56/56
4
SizeOfImage
De grootte (in bytes) van de afbeelding, inclusief alle headers, omdat de afbeelding in het geheugen wordt geladen. Het moet een veelvoud van SectionAlignment zijn.
60/60
4
SizeOfHeaders
De gecombineerde grootte van een MS-DOS stub-, PE-kop- en sectiekoppen afgerond op een veelvoud van FileAlignment.
64/64
4
Checksum
De controlesom van het afbeeldingsbestand. Het algoritme voor het berekenen van de controlesom wordt opgenomen in IMAGHELP.DLL. Hieronder vindt u een controle op validatie tijdens de laadtijd: alle stuurprogramma's, alle DLL's die tijdens het opstarten worden geladen en alle DLL's die in een kritiek Windows-proces worden geladen.
68/68
2
Subsysteem
Het subsysteem dat nodig is om deze installatiekopieën uit te voeren. Zie Windows-subsysteemvoor meer informatie.
70/70
2
DllCharacteristics
Zie DLL-kenmerken verderop in deze specificatie voor meer informatie.
72/72
4/8
SizeOfStackReserve
De grootte van de stack die moet worden gereserveerd. Alleen SizeOfStackCommit wordt doorgevoerd; de rest wordt één pagina tegelijk beschikbaar gesteld totdat de reservegrootte is bereikt.
76/80
4/8
SizeOfStackCommit
De grootte van de stapel die moet worden doorgevoerd.
80/88
4/8
SizeOfHeapReserve
De grootte van de lokale heapruimte die moet worden gereserveerd. Alleen SizeOfHeapCommit wordt doorgevoerd; de rest wordt één pagina tegelijk beschikbaar gesteld totdat de reservegrootte is bereikt.
84/96
4/8
SizeOfHeapCommit
De grootte van de lokale heapruimte die moet worden doorgevoerd.
88/104
4
LoaderFlags
Gereserveerd, moet nul zijn.
92/108
4
NumberOfRvaAndSizes
Het aantal gegevensmapvermeldingen in de rest van de optionele header. Elk beschrijft een locatie en grootte.
Windows-subsysteem

De volgende waarden die zijn gedefinieerd voor het subsysteemveld van de optionele header bepalen welk Windows-subsysteem (indien aanwezig) nodig is om de installatiekopieën uit te voeren.

Constant Waarde Beschrijving
IMAGE_SUBSYSTEM_UNKNOWN
0
Een onbekend subsysteem
IMAGE_SUBSYSTEM_NATIVE
1
Apparaatstuurprogramma's en systeemeigen Windows-processen
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
Het Windows GUI-subsysteem (grafische gebruikersinterface)
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
Het Subsysteem voor Windows-tekens
IMAGE_SUBSYSTEM_OS2_CUI
5
Het subsysteem van het besturingssysteem/2 tekens
IMAGE_SUBSYSTEM_POSIX_CUI
7
Het Posix-tekensubsysteem
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
8
Systeemeigen Win9x-stuurprogramma
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Een EFI-toepassing (Extensible Firmware Interface)
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER
11
Een EFI-stuurprogramma met opstartservices
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER
12
Een EFI-stuurprogramma met runtimeservices
IMAGE_SUBSYSTEM_EFI_ROM
13
Een EFI ROM-afbeelding
IMAGE_SUBSYSTEM_XBOX
14
XBOX
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
Windows-opstarttoepassing.
DLL-kenmerken

De volgende waarden worden gedefinieerd voor het veld DllCharacteristics van de optionele header.

Constant Waarde Beschrijving
0x0001
Gereserveerd, moet nul zijn.
0x0002
Gereserveerd, moet nul zijn.
0x0004
Gereserveerd, moet nul zijn.
0x0008
Gereserveerd, moet nul zijn.
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
Afbeelding kan een hoge entropie 64-bits virtuele adresruimte verwerken.
IMAGE_DLLCHARACTERISTICS_
DYNAMIC_BASE
0x0040
DLL kan tijdens de laadtijd worden verplaatst.
IMAGE_DLLCHARACTERISTICS_
FORCE_INTEGRITY
0x0080
Controles voor code-integriteit worden afgedwongen.
IMAGE_DLLCHARACTERISTICS_
NX_COMPAT
0x0100
Afbeelding is NX-compatibel.
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION
0x0200
Isolatiebewust, maar de installatiekopieën niet isoleren.
IMAGE_DLLCHARACTERISTICS_ NO_SEH
0x0400
Maakt geen gebruik van se-verwerking (Structured Exception). Er kan geen SE-handler worden aangeroepen in deze afbeelding.
IMAGE_DLLCHARACTERISTICS_ NO_BIND
0x0800
Bind de afbeelding niet.
IMAGE_DLLCHARACTERISTICS_APPCONTAINER
0x1000
De installatiekopieën moeten worden uitgevoerd in een AppContainer.
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER
0x2000
Een WDM-chauffeur.
IMAGE_DLLCHARACTERISTICS_GUARD_CF
0x4000
Afbeelding ondersteunt Control Flow Guard.
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE
0x8000
Terminal Server-bewust.

Optionele headergegevensmappen (alleen afbeelding)

Elke gegevensmap geeft het adres en de grootte van een tabel of tekenreeks die door Windows wordt gebruikt. Deze gegevensmapvermeldingen worden allemaal in het geheugen geladen, zodat het systeem deze tijdens runtime kan gebruiken. Een gegevensmap is een veld met 8 bytes met de volgende declaratie:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

Het eerste veld, VirtualAddress, is eigenlijk de RVA van de tabel. De RVA is het adres van de tabel ten opzichte van het basisadres van de afbeelding wanneer de tabel wordt geladen. Het tweede veld geeft de grootte in bytes. De gegevensmappen, die het laatste deel van de optionele header vormen, worden weergegeven in de volgende tabel.

Houd er rekening mee dat het aantal mappen niet is opgelost. Voordat u een specifieke map zoekt, controleert u het veld NumberOfRvaAndSizes in de optionele koptekst.

Neem ook niet aan dat de RVA's in deze tabel verwijzen naar het begin van een sectie of dat de secties die specifieke tabellen bevatten, specifieke namen hebben.

Verschuiving (PE/PE32+) Grootte Veld Beschrijving
96/112
8
Tabel exporteren
Het adres en de grootte van de exporttabel. Zie .edata Section (alleen afbeelding)voor meer informatie.
104/120
8
Tabel importeren
Het adres en de grootte van de importtabel. Zie De sectie .idatavoor meer informatie.
112/128
8
Resourcetabel
Het adres en de grootte van de resourcetabel. Zie The .rsrc Sectionvoor meer informatie.
120/136
8
Uitzonderingstabel
Het adres en de grootte van de uitzonderingstabel. Zie De sectie .pdatavoor meer informatie.
128/144
8
Certificaattabel
Het adres en de grootte van de kenmerkcertificaattabel. Zie De kenmerkcertificaattabel (alleen afbeelding)voor meer informatie.
136/152
8
Basisverplaatsingstabel
Het adres en de grootte van de basisverplaatsingstabel. Zie De .reloc Section (Alleen afbeelding)voor meer informatie.
144/160
8
Debuggen
Het beginadres en de grootte van de foutopsporingsgegevens. Zie de sectie .debug sectionvoor meer informatie.
152/168
8
Architectuur
Gereserveerd, moet 0 zijn
160/176
8
Global Ptr
De RVA van de waarde die moet worden opgeslagen in het globale aanwijzerregister. Het groottelid van deze structuur moet worden ingesteld op nul.
168/184
8
TLS-tabel
Het lokale opslagadres (TLS) van de thread en de grootte van de tabel. Zie De sectie .tlsvoor meer informatie.
176/192
8
Configuratietabel laden
Het adres en de grootte van de loadconfiguratietabel. Zie The Load Configuration Structure (Alleen image)voor meer informatie.
184/200
8
Afhankelijk importeren
Het adres en de grootte van de afhankelijke importtabel.
192/208
8
IAT
Het adres en de grootte van de adrestabel importeren. Zie Adrestabel importerenvoor meer informatie.
200/216
8
Importdescriptor uitstellen
Het vertragingsdescriptoradres en de grootte van de importdescriptor. Zie Delay-Load Tabellen importeren (alleen afbeelding)voor meer informatie.
208/224
8
CLR Runtime-header
Het headeradres en de grootte van de CLR-runtime. Zie De sectie .cormeta (alleen object)voor meer informatie.
216/232
8
Gereserveerd, moet nul zijn

De vermelding certificaattabel verwijst naar een tabel met kenmerkcertificaten. Deze certificaten worden niet in het geheugen geladen als onderdeel van de installatiekopieën. Als zodanig is het eerste veld van deze vermelding, dat normaal gesproken een RVA is, in plaats daarvan een bestandsaanwijzer.

Sectietabel (sectiekoppen)

Elke rij van de sectietabel is in feite een sectiekop. Deze tabel volgt direct de optionele koptekst, indien van toepassing. Deze plaatsing is vereist omdat de bestandskop geen directe aanwijzer naar de sectietabel bevat. In plaats daarvan wordt de locatie van de sectietabel bepaald door de locatie van de eerste byte na de kopteksten te berekenen. Zorg ervoor dat u de grootte van de optionele header gebruikt zoals opgegeven in de bestandskoptekst.

Het aantal vermeldingen in de sectietabel wordt gegeven door het veld NumberOfSections in de bestandskoptekst. Vermeldingen in de sectietabel worden genummerd vanaf één (1). De code- en gegevensgeheugensectievermeldingen staan in de volgorde die wordt gekozen door de linker.

In een afbeeldingsbestand moeten de VA's voor secties worden toegewezen door de linker, zodat ze in oplopende volgorde en aangrenzend zijn en ze een veelvoud van de sectie-uitlijningswaarde in de optionele header moeten zijn.

Elke sectiekop (vermelding in de sectietabel) heeft de volgende indeling, voor een totaal van 40 bytes per vermelding.

Afstand Grootte Veld Beschrijving
0
8
Naam
Een tekenreeks met 8 bytes, met null-padded UTF-8. Als de tekenreeks precies 8 tekens lang is, is er geen afsluit null. Voor langere namen bevat dit veld een slash (/) die wordt gevolgd door een ASCII-weergave van een decimaal getal dat een verschuiving is in de tekenreekstabel. Uitvoerbare afbeeldingen maken geen gebruik van een tekenreekstabel en bieden geen ondersteuning voor sectienamen van meer dan 8 tekens. Lange namen in objectbestanden worden afgekapt als ze worden verzonden naar een uitvoerbaar bestand.
8
4
VirtualSize
De totale grootte van de sectie wanneer deze in het geheugen wordt geladen. Als deze waarde groter is dan SizeOfRawData, wordt de sectie nul opgevuld. Dit veld is alleen geldig voor uitvoerbare afbeeldingen en moet worden ingesteld op nul voor objectbestanden.
12
4
VirtualAddress
Voor uitvoerbare installatiekopieën is het adres van de eerste byte van de sectie ten opzichte van de basis van de installatiekopieën wanneer de sectie in het geheugen wordt geladen. Voor objectbestanden is dit veld het adres van de eerste byte voordat de verplaatsing wordt toegepast; om het eenvoudig te maken, moeten compilers dit instellen op nul. Anders is het een willekeurige waarde die wordt afgetrokken van verschuivingen tijdens de verplaatsing.
16
4
SizeOfRawData
De grootte van de sectie (voor objectbestanden) of de grootte van de geïnitialiseerde gegevens op schijf (voor afbeeldingsbestanden). Voor uitvoerbare afbeeldingen moet dit een veelvoud van FileAlignment uit de optionele header zijn. Als dit kleiner is dan VirtualSize, wordt de rest van de sectie gevuld met nul. Omdat het veld SizeOfRawData wordt afgerond, maar het veld VirtualSize niet is, is het ook mogelijk dat SizeOfRawData groter is dan VirtualSize. Wanneer een sectie alleen niet-geïnitialiseerde gegevens bevat, moet dit veld nul zijn.
20
4
PointerToRawData
De bestandswijzer naar de eerste pagina van de sectie in het COFF-bestand. Voor uitvoerbare afbeeldingen moet dit een veelvoud van FileAlignment uit de optionele header zijn. Voor objectbestanden moet de waarde worden uitgelijnd op een grens van 4 bytes voor de beste prestaties. Wanneer een sectie alleen niet-geïnitialiseerde gegevens bevat, moet dit veld nul zijn.
24
4
PointerToRelocations
De bestandsaanwijzer naar het begin van herlocatievermeldingen voor de sectie. Dit is ingesteld op nul voor uitvoerbare afbeeldingen of als er geen verplaatsingen zijn.
28
4
PointerToLinenumbers
De bestandsaanwijzer naar het begin van regelnummervermeldingen voor de sectie. Dit is ingesteld op nul als er geen COFF-regelnummers zijn. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft.
32
2
NumberOfRelocations
Het aantal herplaatsingsvermeldingen voor de sectie. Dit is ingesteld op nul voor uitvoerbare installatiekopieën.
34
2
NumberOfLinenumbers
Het aantal regelnummers voor de sectie. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft.
36
4
Kenmerken
De vlaggen die de kenmerken van de sectie beschrijven. Zie Sectievlagkenvoor meer informatie.

 

Sectievlagmen

De sectievlaggen in het veld Kenmerken van de sectiekop geven kenmerken van de sectie aan.

Vlag Waarde Beschrijving
0x00000000
Gereserveerd voor toekomstig gebruik.
0x00000001
Gereserveerd voor toekomstig gebruik.
0x00000002
Gereserveerd voor toekomstig gebruik.
0x00000004
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
De sectie mag niet worden opgevuld naar de volgende grens. Deze vlag is verouderd en wordt vervangen door IMAGE_SCN_ALIGN_1BYTES. Dit is alleen geldig voor objectbestanden.
0x00000010
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_CNT_CODE
0x00000020
De sectie bevat uitvoerbare code.
IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040
De sectie bevat geïnitialiseerde gegevens.
IMAGE_SCN_CNT_UNINITIALIZED_ DATA
0x00000080
De sectie bevat niet-geïnitialiseerde gegevens.
IMAGE_SCN_LNK_OTHER
0x00000100
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_LNK_INFO
0x00000200
De sectie bevat opmerkingen of andere informatie. De sectie .drectve heeft dit type. Dit is alleen geldig voor objectbestanden.
0x00000400
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_LNK_REMOVE
0x00000800
De sectie maakt geen deel uit van de afbeelding. Dit is alleen geldig voor objectbestanden.
IMAGE_SCN_LNK_COMDAT
0x00001000
De sectie bevat COMDAT-gegevens. Zie COMDAT-secties (alleen object)voor meer informatie. Dit is alleen geldig voor objectbestanden.
IMAGE_SCN_GPREL
0x00008000
De sectie bevat gegevens waarnaar wordt verwezen via de algemene aanwijzer (GP).
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_MEM_16BIT
0x00020000
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_MEM_LOCKED
0x00040000
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Gereserveerd voor toekomstig gebruik.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
Gegevens uitlijnen op een grens van 1 byte. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
Gegevens uitlijnen op een grens van twee bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_4BYTES
0x00300000
Gegevens uitlijnen op een grens van 4 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_8BYTES
0x00400000
Gegevens uitlijnen op een grens van 8 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_16BYTES
0x00500000
Gegevens uitlijnen op een grens van 16 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_32BYTES
0x00600000
Gegevens uitlijnen op een grens van 32 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_64BYTES
0x00700000
Gegevens uitlijnen op een grens van 64 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_128BYTES
0x00800000
Gegevens uitlijnen op een grens van 128 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_256BYTES
0x00900000
Gegevens uitlijnen op een grens van 256 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_512BYTES
0x00A00000
Gegevens uitlijnen op een grens van 512 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_1024BYTES
0x00B00000
Gegevens uitlijnen op een grens van 1024 bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_2048BYTES
0x00C00000
Gegevens uitlijnen op een grens van 2048-bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_4096BYTES
0x00D00000
Gegevens uitlijnen op een grens van 4096-bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_ALIGN_8192BYTES
0x00E00000
Gegevens uitlijnen op een grens van 8192-bytes. Alleen geldig voor objectbestanden.
IMAGE_SCN_LNK_NRELOC_OVFL
0x01000000
De sectie bevat uitgebreide verplaatsingen.
IMAGE_SCN_MEM_DISCARDABLE
0x02000000
De sectie kan indien nodig worden verwijderd.
IMAGE_SCN_MEM_NOT_CACHED
0x04000000
De sectie kan niet in de cache worden opgeslagen.
IMAGE_SCN_MEM_NOT_PAGED
0x08000000
De sectie kan niet worden gepaginad.
IMAGE_SCN_MEM_SHARED
0x10000000
De sectie kan worden gedeeld in het geheugen.
IMAGE_SCN_MEM_EXECUTE
0x20000000
De sectie kan als code worden uitgevoerd.
IMAGE_SCN_MEM_READ
0x40000000
De sectie kan worden gelezen.
IMAGE_SCN_MEM_WRITE
0x80000000
De sectie kan worden geschreven naar.

 

IMAGE_SCN_LNK_NRELOC_OVFL geeft aan dat het aantal verplaatsingen voor de sectie groter is dan de 16 bits die hiervoor zijn gereserveerd in de sectiekoptekst. Als de bit is ingesteld en het veld NumberOfRelocations in de sectiekop is 0xffff, wordt het werkelijke aantal verplaatsingen opgeslagen in het veld 32-bits VirtualAddress van de eerste herlocatie. Het is een fout als IMAGE_SCN_LNK_NRELOC_OVFL is ingesteld en er minder dan 0xffff verplaatsingen in de sectie zijn.

Gegroepeerde secties (alleen object)

Het "$" teken (dollarteken) heeft een speciale interpretatie in sectienamen in objectbestanden.

Bij het bepalen van de afbeeldingssectie die de inhoud van een objectsectie bevat, verwijdert de linker de '$' en alle tekens die erop volgen. Een objectsectie met de naam .text$X draagt daadwerkelijk bij aan de sectie .text in de afbeelding.

De tekens na de $bepalen echter de volgorde van de bijdragen aan de afbeeldingssectie. Alle bijdragen met dezelfde objectsectienaam worden aan elkaar toegewezen in de afbeelding en de blokken bijdragen worden gesorteerd in lexicale volgorde op objectsectienaam. Daarom komt alles in objectbestanden met de sectienaam .text$X uiteindelijk samen, na de .text$W bijdragen en vóór de .text$Y bijdragen.

De sectienaam in een afbeeldingsbestand bevat nooit een $-teken.

Andere inhoud van het bestand

De gegevensstructuren die tot nu toe zijn beschreven, tot en met de optionele header, bevinden zich allemaal op een vaste offset van het begin van het bestand (of van de PE-header als het bestand een afbeelding is die een MS-DOS stub bevat).

De rest van een COFF-object of afbeeldingsbestand bevat blokken gegevens die niet noodzakelijkerwijs op een specifieke bestandsverschil staan. In plaats daarvan worden de locaties gedefinieerd door aanwijzers in de optionele koptekst of een sectiekop.

Een uitzondering is voor afbeeldingen met een SectionAlignment-waarde van minder dan de paginagrootte van de architectuur (4 K voor Intel x86 en voor MIPS en 8 K voor Itanium). Zie optionele koptekst (alleen afbeelding)voor een beschrijving van SectionAlignment. In dit geval gelden er beperkingen voor de bestandsverrekening van de sectiegegevens, zoals beschreven in sectie 5.1, 'Sectiegegevens'. Een andere uitzondering hierop is dat kenmerkcertificaat- en foutopsporingsgegevens aan het einde van een afbeeldingsbestand moeten worden geplaatst, waarbij de kenmerkcertificaattabel direct voorafgaand aan de sectie voor foutopsporing staat, omdat het laadprogramma deze niet in het geheugen toe wijst. De regel over kenmerkcertificaat en foutopsporingsinformatie is echter niet van toepassing op objectbestanden.

Sectiegegevens

Geïnitialiseerde gegevens voor een sectie bestaan uit eenvoudige blokken bytes. Voor secties die alle nullen bevatten, hoeven de sectiegegevens echter niet te worden opgenomen.

De gegevens voor elke sectie bevinden zich op de bestandsverschil die is opgegeven door het veld PointerToRawData in de sectiekoptekst. De grootte van deze gegevens in het bestand wordt aangegeven door het veld SizeOfRawData. Als SizeOfRawData kleiner is dan VirtualSize, wordt de rest opgevuld met nullen.

In een afbeeldingsbestand moeten de sectiegegevens worden uitgelijnd op een grens zoals opgegeven door het veld FileAlignment in de optionele header. Sectiegegevens moeten worden weergegeven in volgorde van de RVA-waarden voor de bijbehorende secties (zoals de afzonderlijke sectiekoppen in de sectietabel).

Er zijn extra beperkingen voor afbeeldingsbestanden als de waarde SectionAlignment in de optionele header kleiner is dan de paginagrootte van de architectuur. Voor dergelijke bestanden moet de locatie van sectiegegevens in het bestand overeenkomen met de locatie in het geheugen wanneer de afbeelding wordt geladen, zodat de fysieke offset voor sectiegegevens hetzelfde is als de RVA.

COFF-verplaatsingen (alleen object)

Objectbestanden bevatten COFF-verplaatsingen, die aangeven hoe de sectiegegevens moeten worden gewijzigd wanneer ze in het afbeeldingsbestand worden geplaatst en vervolgens in het geheugen worden geladen.

Afbeeldingsbestanden bevatten geen COFF-verplaatsingen, omdat alle symbolen waarnaar wordt verwezen al adressen in een platte adresruimte zijn toegewezen. Een afbeelding bevat informatie over herlocatie in de vorm van basisverplaatsingen in de sectie .reloc (tenzij de afbeelding het kenmerk IMAGE_FILE_RELOCS_STRIPPED heeft). Zie De .reloc Section (Alleen afbeelding)voor meer informatie.

Voor elke sectie in een objectbestand bevat een matrix met records met vaste lengte de COFF-verplaatsingen van de sectie. De positie en lengte van de matrix worden opgegeven in de sectiekoptekst. Elk element van de matrix heeft de volgende indeling.

Afstand Grootte Veld Beschrijving
0
4
VirtualAddress
Het adres van het item waarop verplaatsing wordt toegepast. Dit is de verschuiving vanaf het begin van de sectie, plus de waarde van het rva-/offsetveld van de sectie. Zie sectietabel (sectiekoppen). Als de eerste byte van de sectie bijvoorbeeld een adres van 0x10 heeft, heeft de derde byte een adres van 0x12.
4
4
SymbolTableIndex
Een op nul gebaseerde index in de symbooltabel. Dit symbool geeft het adres dat moet worden gebruikt voor de verplaatsing. Als het opgegeven symbool sectieopslagklasse heeft, is het adres van het symbool het adres met de eerste sectie van dezelfde naam.
8
2
Type
Een waarde die aangeeft welk soort verplaatsing moet worden uitgevoerd. Geldige herlocatietypen zijn afhankelijk van het type machine. Zie type indicatoren.

 

Als het symbool waarnaar wordt verwezen door het veld SymbolTableIndex de opslagklasse IMAGE_SYM_CLASS_SECTION heeft, is het adres van het symbool het begin van de sectie. De sectie bevindt zich meestal in hetzelfde bestand, behalve wanneer het objectbestand deel uitmaakt van een archief (bibliotheek). In dat geval is de sectie te vinden in elk ander objectbestand in het archief met dezelfde naam van het archieflid als het huidige objectbestand. (De relatie met de naam van het archieflid wordt gebruikt bij het koppelen van importtabellen, dat wil gezegd de sectie .idata.)

Type indicatoren

Het veld Type van de herlocatierecord geeft aan welk type verplaatsing moet worden uitgevoerd. Voor elk type machine worden verschillende verplaatsingstypen gedefinieerd.

x64-processors

De volgende herlocatietypeindicatoren worden gedefinieerd voor x64 en compatibele processors.

Constant Waarde Beschrijving
IMAGE_REL_AMD64_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_AMD64_ADDR64
0x0001
De 64-bits VA van het verplaatsingsdoel.
IMAGE_REL_AMD64_ADDR32
0x0002
De 32-bits VA van het verplaatsingsdoel.
IMAGE_REL_AMD64_ADDR32NB
0x0003
Het 32-bits adres zonder een rva (image base).
IMAGE_REL_AMD64_REL32
0x0004
Het relatieve 32-bits adres van de byte na de verplaatsing.
IMAGE_REL_AMD64_REL32_1
0x0005
Het 32-bits adres ten opzichte van byteafstand 1 van de verplaatsing.
IMAGE_REL_AMD64_REL32_2
0x0006
Het 32-bits adres ten opzichte van byteafstand 2 van de verplaatsing.
IMAGE_REL_AMD64_REL32_3
0x0007
Het 32-bits adres ten opzichte van byteafstand 3 van de verplaatsing.
IMAGE_REL_AMD64_REL32_4
0x0008
Het 32-bits adres ten opzichte van byteafstand 4 van de verplaatsing.
IMAGE_REL_AMD64_REL32_5
0x0009
Het 32-bits adres ten opzichte van byteafstand 5 van de verplaatsing.
IMAGE_REL_AMD64_SECTION
0x000A
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_AMD64_SECREL
0x000B
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_AMD64_SECREL7
0x000C
Een 7-bits niet-ondertekende offset van de basis van de sectie die het doel bevat.
IMAGE_REL_AMD64_TOKEN
0x000D
CLR-tokens.
IMAGE_REL_AMD64_SREL32
0x000E
Een 32-bits ondertekende spanafhankelijke waarde die in het object wordt verzonden.
IMAGE_REL_AMD64_PAIR
0x000F
Een paar dat onmiddellijk moet volgen op elke bereikafhankelijke waarde.
IMAGE_REL_AMD64_SSPAN32
0x0010
Een 32-bits ondertekende spanafhankelijke waarde die wordt toegepast tijdens het koppelen.

 

ARM-processors

De volgende indicatoren voor herlocatietypen worden gedefinieerd voor ARM-processors.

Constant Waarde Beschrijving
IMAGE_REL_ARM_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_ARM_ADDR32
0x0001
De 32-bits VA van het doel.
IMAGE_REL_ARM_ADDR32NB
0x0002
De 32-bits RVA van het doel.
IMAGE_REL_ARM_BRANCH24
0x0003
De 24-bits relatieve verplaatsing naar het doel.
IMAGE_REL_ARM_BRANCH11
0x0004
De verwijzing naar een subroutine-aanroep. De verwijzing bestaat uit twee 16-bits instructies met 11-bits offsets.
IMAGE_REL_ARM_REL32
0x000A
Het relatieve 32-bits adres van de byte na de verplaatsing.
IMAGE_REL_ARM_SECTION
0x000E
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_ARM_SECREL
0x000F
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_ARM_MOV32
0x0010
De 32-bits VA van het doel. Deze verplaatsing wordt toegepast met behulp van een MOVW-instructie voor de lage 16 bits gevolgd door een MOVT voor de hoge 16 bits.
IMAGE_REL_THUMB_MOV32
0x0011
De 32-bits VA van het doel. Deze verplaatsing wordt toegepast met behulp van een MOVW-instructie voor de lage 16 bits gevolgd door een MOVT voor de hoge 16 bits.
IMAGE_REL_THUMB_BRANCH20
0x0012
De instructie wordt opgelost met de 21-bits relatieve verplaatsing naar het 2-byte uitgelijnde doel. De minst significante bit van de verplaatsing is altijd nul en wordt niet opgeslagen. Deze verplaatsing komt overeen met een duim-2 32-bits voorwaardelijke B-instructie.
Ongebruikt
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
De instructie is opgelost met de 25-bits relatieve verplaatsing naar het 2-byte uitgelijnde doel. De minst significante bit van de verplaatsing is nul en wordt niet opgeslagen. Deze verplaatsing komt overeen met een Duim-2 B instructie.
IMAGE_REL_THUMB_BLX23
0x0015
De instructie wordt opgelost met de 25-bits relatieve verplaatsing naar het 4-byte uitgelijnde doel. De lage 2 bits van de verplaatsing zijn nul en worden niet opgeslagen.
Deze verplaatsing komt overeen met een Thumb-2 BLX-instructie.
IMAGE_REL_ARM_PAIR
0x0016
De verplaatsing is alleen geldig wanneer deze direct volgt op een ARM_REFHI of THUMB_REFHI. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel.

 

ARM64-processors

De volgende indicatoren voor herlocatietypen worden gedefinieerd voor ARM64-processors.

Constant Waarde Beschrijving
IMAGE_REL_ARM64_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_ARM64_ADDR32
0x0001
De 32-bits VA van het doel.
IMAGE_REL_ARM64_ADDR32NB
0x0002
De 32-bits RVA van het doel.
IMAGE_REL_ARM64_BRANCH26
0x0003
De 26-bits relatieve verplaatsing naar het doel, voor B- en BL-instructies.
IMAGE_REL_ARM64_PAGEBASE_REL21
0x0004
De paginabasis van het doel, voor ADRP-instructies.
IMAGE_REL_ARM64_REL21
0x0005
De 12-bits relatieve verplaatsing naar het doel, voor instructie ADR
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
De 12-bits pagina-offset van het doel, voor instructies ADD/ADDS (direct) met nul shift.
IMAGE_REL_ARM64_PAGEOFFSET_12L
0x0007
De 12-bits pagina-offset van het doel, voor instructie LDR (geïndexeerd, niet-ondertekend onmiddellijk).
IMAGE_REL_ARM64_SECREL
0x0008
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
Bit 0:11 van de sectie-offset van het doel, voor instructies ADD/ADDS (onmiddellijk) met nul shift.
IMAGE_REL_ARM64_SECREL_HIGH12A
0x000A
Bit 12:23 van de sectie-offset van het doel, voor instructies ADD/ADDS (onmiddellijk) met nul shift.
IMAGE_REL_ARM64_SECREL_LOW12L
0x000B
Bit 0:11 van de sectie-offset van het doel, voor instructie LDR (geïndexeerd, niet-ondertekend onmiddellijk).
IMAGE_REL_ARM64_TOKEN
0x000C
CLR-token.
IMAGE_REL_ARM64_SECTION
0x000D
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_ARM64_ADDR64
0x000E
De 64-bits VA van het verplaatsingsdoel.
IMAGE_REL_ARM64_BRANCH19
0x000F
De 19-bits verschuiving naar het verplaatsingsdoel, voor voorwaardelijke B-instructie.
IMAGE_REL_ARM64_BRANCH14
0x0010
De 14-bits verschuiving naar het verplaatsingsdoel, voor instructies TBZ en TBNZ.
IMAGE_REL_ARM64_REL32
0x0011
Het relatieve 32-bits adres van de byte na de verplaatsing.
Processoren van De SuperH van Processor

De volgende indicatoren voor herlocatietypen worden gedefinieerd voor SH3- en SH4-processors. SH5-specifieke verplaatsingen worden vermeld als SHM (SH Media).

Constant Waarde Beschrijving
IMAGE_REL_SH3_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_SH3_DIRECT16
0x0001
Een verwijzing naar de 16-bits locatie die de VA van het doelsymbool bevat.
IMAGE_REL_SH3_DIRECT32
0x0002
De 32-bits VA van het doelsymbool.
IMAGE_REL_SH3_DIRECT8
0x0003
Een verwijzing naar de 8-bits locatie die de VA van het doelsymbool bevat.
IMAGE_REL_SH3_DIRECT8_WORD
0x0004
Een verwijzing naar de 8-bits instructie die de effectieve 16-bits VA van het doelsymbool bevat.
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
Een verwijzing naar de 8-bits instructie die de effectieve 32-bits VA van het doelsymbool bevat.
IMAGE_REL_SH3_DIRECT4
0x0006
Een verwijzing naar de 8-bits locatie waarvan de lage 4 bits de VA van het doelsymbool bevatten.
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
Een verwijzing naar de 8-bits instructie waarvan lage 4 bits de effectieve 16-bits VA van het doelsymbool bevatten.
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
Een verwijzing naar de 8-bits instructie waarvan de lage 4 bits de effectieve 32-bits VA van het doelsymbool bevatten.
IMAGE_REL_SH3_PCREL8_WORD
0x0009
Een verwijzing naar de 8-bits instructie die de effectieve 16-bits relatieve verschuiving van het doelsymbool bevat.
IMAGE_REL_SH3_PCREL8_LONG
0x000A
Een verwijzing naar de 8-bits instructie die de effectieve 32-bits relatieve verschuiving van het doelsymbool bevat.
IMAGE_REL_SH3_PCREL12_WORD
0x000B
Een verwijzing naar de 16-bits instructie waarvan de lage 12 bits de effectieve 16-bits relatieve verschuiving van het doelsymbool bevatten.
IMAGE_REL_SH3_STARTOF_SECTION
0x000C
Een verwijzing naar een 32-bits locatie die de VA is van de sectie die het doelsymbool bevat.
IMAGE_REL_SH3_SIZEOF_SECTION
0x000D
Een verwijzing naar de 32-bits locatie die de grootte is van de sectie die het doelsymbool bevat.
IMAGE_REL_SH3_SECTION
0x000E
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_SH3_SECREL
0x000F
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
De 32-bits RVA van het doelsymbool.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
GP relatief.
IMAGE_REL_SH3_TOKEN
0x0012
CLR-token.
IMAGE_REL_SHM_PCRELPT
0x0013
De verschuiving van de huidige instructie in longwords. Als de NOMODE-bit niet is ingesteld, voegt u de inverse van de lage bit bij bit 32 in om PTA of PTB te selecteren.
IMAGE_REL_SHM_REFLO
0x0014
De lage 16 bits van het 32-bits adres.
IMAGE_REL_SHM_REFHALF
0x0015
De hoge 16 bits van het 32-bits adres.
IMAGE_REL_SHM_RELLO
0x0016
De lage 16 bits van het relatieve adres.
IMAGE_REL_SHM_RELHALF
0x0017
De hoge 16 bits van het relatieve adres.
IMAGE_REL_SHM_PAIR
0x0018
De herlocatie is alleen geldig wanneer deze onmiddellijk volgt op een REFHALF-, RELHALF- of RELLO-herlocatie. Het veld SymbolTableIndex van de verplaatsing bevat een verplaatsing en geen index in de symbooltabel.
IMAGE_REL_SHM_NOMODE
0x8000
De verplaatsing negeert de sectiemodus.

 

IBM PowerPC-processors

De volgende indicatoren voor herlocatietypen worden gedefinieerd voor PowerPC-processors.

Constant Waarde Beschrijving
IMAGE_REL_PPC_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_PPC_ADDR64
0x0001
De 64-bits VA van het doel.
IMAGE_REL_PPC_ADDR32
0x0002
De 32-bits VA van het doel.
IMAGE_REL_PPC_ADDR24
0x0003
De lage 24 bits van de VA van het doel. Dit is alleen geldig wanneer het doelsymbool absoluut is en kan worden uitgebreid tot de oorspronkelijke waarde.
IMAGE_REL_PPC_ADDR16
0x0004
De lage 16 bits van de VA van het doel.
IMAGE_REL_PPC_ADDR14
0x0005
De lage 14 bits van de VA van het doel. Dit is alleen geldig wanneer het doelsymbool absoluut is en kan worden uitgebreid tot de oorspronkelijke waarde.
IMAGE_REL_PPC_REL24
0x0006
Een 24-bits pc-relatieve verschuiving naar de locatie van het symbool.
IMAGE_REL_PPC_REL14
0x0007
Een 14-bits pc-relatieve verschuiving naar de locatie van het symbool.
IMAGE_REL_PPC_ADDR32NB
0x000A
De 32-bits RVA van het doel.
IMAGE_REL_PPC_SECREL
0x000B
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_PPC_SECTION
0x000C
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_PPC_SECREL16
0x000F
De 16-bits offset van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_PPC_REFHI
0x0010
De hoge 16 bits van de 32-bits VA van het doel. Dit wordt gebruikt voor de eerste instructie in een reeks met twee instructies waarmee een volledig adres wordt geladen. Deze verplaatsing moet onmiddellijk worden gevolgd door een PAIR-verplaatsing waarvan SymbolTableIndex een ondertekende 16-bits verplaatsing bevat die wordt toegevoegd aan de bovenste 16 bits die zijn genomen van de locatie die wordt verplaatst.
IMAGE_REL_PPC_REFLO
0x0011
De lage 16 bits van de VA van het doel.
IMAGE_REL_PPC_PAIR
0x0012
Een herlocatie die alleen geldig is wanneer deze onmiddellijk volgt op een REFHI- of SECRELHI-herlocatie. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel.
IMAGE_REL_PPC_SECRELLO
0x0013
De lage 16 bits van de 32-bits offset van het doel vanaf het begin van de sectie.
IMAGE_REL_PPC_GPREL
0x0015
De 16-bits ondertekende verplaatsing van het doel ten opzichte van het GP-register.
IMAGE_REL_PPC_TOKEN
0x0016
Het CLR-token.

 

Intel 386-processors

De volgende herlocatietypeindicatoren worden gedefinieerd voor Intel 386 en compatibele processors.

Constant Waarde Beschrijving
IMAGE_REL_I386_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_I386_DIR16
0x0001
Niet ondersteund.
IMAGE_REL_I386_REL16
0x0002
Niet ondersteund.
IMAGE_REL_I386_DIR32
0x0006
De 32-bits VA van het doel.
IMAGE_REL_I386_DIR32NB
0x0007
De 32-bits RVA van het doel.
IMAGE_REL_I386_SEG12
0x0009
Niet ondersteund.
IMAGE_REL_I386_SECTION
0x000A
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_I386_SECREL
0x000B
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_I386_TOKEN
0x000C
Het CLR-token.
IMAGE_REL_I386_SECREL7
0x000D
Een 7-bits offset van de basis van de sectie die het doel bevat.
IMAGE_REL_I386_REL32
0x0014
De 32-bits relatieve verplaatsing naar het doel. Dit ondersteunt de x86 relatieve vertakking en aanroepinstructies.

 

Intel Itanium Processor Family (IPF)

De volgende herlocatietypeindicatoren worden gedefinieerd voor de Intel Itanium-processorfamilie en compatibele processors. Houd er rekening mee dat verplaatsingen op instructies gebruikmaken van de offset van de bundel en het sleufnummer voor de verplaatsingsverplaatsing.

Constant Waarde Beschrijving
IMAGE_REL_IA64_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_IA64_IMM14
0x0001
De instructieverplaatsing kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres voordat deze in de opgegeven sleuf in de IMM14-bundel wordt ingevoegd. Het verplaatsingsdoel moet absoluut zijn of de afbeelding moet worden vastgezet.
IMAGE_REL_IA64_IMM22
0x0002
De instructieverplaatsing kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres voordat deze in de opgegeven sleuf in de IMM22-bundel wordt ingevoegd. Het verplaatsingsdoel moet absoluut zijn of de afbeelding moet worden vastgezet.
IMAGE_REL_IA64_IMM64
0x0003
Het sleufnummer van deze verplaatsing moet één (1) zijn. De herlocatie kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres voordat deze wordt opgeslagen in alle drie de sleuven van de IMM64-bundel.
IMAGE_REL_IA64_DIR32
0x0004
De 32-bits VA van het doel. Dit wordt alleen ondersteund voor /LARGEADDRESSAWARE:NO-installatiekopieën.
IMAGE_REL_IA64_DIR64
0x0005
De 64-bits VA van het doel.
IMAGE_REL_IA64_PCREL21B
0x0006
De instructie wordt opgelost met de 25-bits relatieve verplaatsing naar het 16-bits uitgelijnde doel. De lage 4 bits van de verplaatsing zijn nul en worden niet opgeslagen.
IMAGE_REL_IA64_PCREL21M
0x0007
De instructie wordt opgelost met de 25-bits relatieve verplaatsing naar het 16-bits uitgelijnde doel. De lage 4 bits van de verplaatsing, die nul zijn, worden niet opgeslagen.
IMAGE_REL_IA64_PCREL21F
0x0008
De LSBs van de verschuiving van deze verplaatsing moeten het sleufnummer bevatten, terwijl de rest het bundeladres is. De bundel is opgelost met de 25-bits relatieve verplaatsing naar het 16-bits uitgelijnde doel. De lage 4 bits van de verplaatsing zijn nul en worden niet opgeslagen.
IMAGE_REL_IA64_GPREL22
0x0009
De instructieverplaatsing kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres en vervolgens een 22-bits GP-relatieve verschuiving die wordt berekend en toegepast op de GPREL22 bundel.
IMAGE_REL_IA64_LTOFF22
0x000A
De instructie is opgelost met de 22-bits GP-relatieve verschuiving naar de letterlijke tabelvermelding van het doelsymbool. De linker maakt deze letterlijke tabelvermelding op basis van deze verplaatsing en de ADDEND-herlocatie die kan volgen.
IMAGE_REL_IA64_SECTION
0x000B
De 16-bits sectieindex van de sectie bevat het doel. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_IA64_SECREL22
0x000C
De instructie is opgelost met de 22-bits offset van het doel vanaf het begin van de sectie. Deze verplaatsing kan onmiddellijk worden gevolgd door een ADDEND-verplaatsing, waarvan het veld Waarde de 32-bits niet-ondertekende verschuiving van het doel vanaf het begin van de sectie bevat.
IMAGE_REL_IA64_SECREL64I
0x000D
Het sleufnummer voor deze verplaatsing moet één (1) zijn. De instructie is opgelost met de 64-bits offset van het doel vanaf het begin van de sectie. Deze verplaatsing kan onmiddellijk worden gevolgd door een ADDEND-verplaatsing waarvan het veld Waarde de 32-bits niet-ondertekende verschuiving van het doel bevat vanaf het begin van de sectie.
IMAGE_REL_IA64_SECREL32
0x000E
Het adres van gegevens dat moet worden opgelost met de 32-bits offset van het doel vanaf het begin van de sectie.
IMAGE_REL_IA64_DIR32NB
0x0010
De 32-bits RVA van het doel.
IMAGE_REL_IA64_SREL14
0x0011
Dit wordt toegepast op een ondertekende 14-bits direct dat het verschil bevat tussen twee herverdeelbare doelen. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden.
IMAGE_REL_IA64_SREL22
0x0012
Dit wordt toegepast op een ondertekende 22-bits direct met het verschil tussen twee herverdeelbare doelen. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden.
IMAGE_REL_IA64_SREL32
0x0013
Dit wordt toegepast op een ondertekende 32-bits direct dat het verschil tussen twee herverdeelbare waarden bevat. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden.
IMAGE_REL_IA64_UREL32
0x0014
Dit wordt toegepast op een niet-ondertekende 32-bits onmiddellijke waarde die het verschil tussen twee herverdeelbare waarden bevat. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden.
IMAGE_REL_IA64_PCREL60X
0x0015
Een 60-bits pc-relatieve fixup die altijd als EEN URL-instructie van een MLX-bundel blijft.
IMAGE_REL_IA64_PCREL60B
0x0016
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MBB-bundel met NOP. B in slot 1 en een 25-bits BR-instructie (met de 4 laagste bits allemaal nul en verwijderd) in sleuf 2.
IMAGE_REL_IA64_PCREL60F
0x0017
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MFB-bundel met NOP. F in slot 1 en een 25-bits (4 laagste bits alle nul en verwijderde) BR-instructie in slot 2.
IMAGE_REL_IA64_PCREL60I
0x0018
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MIB-bundel met NOP. Ik in slot 1 en een 25-bits (4 laagste bits alle nul en verwijderde) BR-instructie in slot 2.
IMAGE_REL_IA64_PCREL60M
0x0019
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MMB-bundel met NOP. M in slot 1 en een 25-bits (4 laagste bits alle nul en verwijderde) BR-instructie in slot 2.
IMAGE_REL_IA64_IMMGPREL64
0x001a
Een 64-bits GP-relatieve fixup.
IMAGE_REL_IA64_TOKEN
0x001b
Een CLR-token.
IMAGE_REL_IA64_GPREL32
0x001c
Een 32-bits GP-relatieve fixup.
IMAGE_REL_IA64_ADDEND
0x001F
De verplaatsing is alleen geldig wanneer deze onmiddellijk volgt op een van de volgende verplaatsingen: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I of SECREL32. De waarde bevat de addend die moet worden toegepast op instructies binnen een bundel, niet voor gegevens.

 

MIPS-processors

De volgende indicatoren voor herlocatietypen worden gedefinieerd voor MIPS-processors.

Constant Waarde Beschrijving
IMAGE_REL_MIPS_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_MIPS_REFHALF
0x0001
De hoge 16 bits van de 32-bits VA van het doel.
IMAGE_REL_MIPS_REFWORD
0x0002
De 32-bits VA van het doel.
IMAGE_REL_MIPS_JMPADDR
0x0003
De lage 26 bits van de VA van het doel. Dit ondersteunt de MIPS J- en JAL-instructies.
IMAGE_REL_MIPS_REFHI
0x0004
De hoge 16 bits van de 32-bits VA van het doel. Dit wordt gebruikt voor de eerste instructie in een reeks met twee instructies waarmee een volledig adres wordt geladen. Deze verplaatsing moet onmiddellijk worden gevolgd door een PAIR-verplaatsing waarvan SymbolTableIndex een ondertekende 16-bits verplaatsing bevat die wordt toegevoegd aan de bovenste 16 bits die worden genomen van de locatie die wordt verplaatst.
IMAGE_REL_MIPS_REFLO
0x0005
De lage 16 bits van de VA van het doel.
IMAGE_REL_MIPS_GPREL
0x0006
Een 16-bits ondertekende verplaatsing van het doel ten opzichte van het GP-register.
IMAGE_REL_MIPS_LITERAL
0x0007
Hetzelfde als IMAGE_REL_MIPS_GPREL.
IMAGE_REL_MIPS_SECTION
0x000A
De 16-bits sectieindex van de sectie bevat het doel. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_MIPS_SECREL
0x000B
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_MIPS_SECRELLO
0x000C
De lage 16 bits van de 32-bits offset van het doel vanaf het begin van de sectie.
IMAGE_REL_MIPS_SECRELHI
0x000D
De hoge 16 bits van de 32-bits offset van het doel vanaf het begin van de sectie. Een IMAGE_REL_MIPS_PAIR verplaatsing moet onmiddellijk volgen. De SymbolTableIndex van de pair-verplaatsing bevat een ondertekende 16-bits verplaatsing die wordt toegevoegd aan de bovenste 16 bits die worden genomen van de locatie die wordt verplaatst.
IMAGE_REL_MIPS_JMPADDR16
0x0010
De lage 26 bits van de VA van het doel. Dit ondersteunt de MIPS16 JAL-instructie.
IMAGE_REL_MIPS_REFWORDNB
0x0022
De 32-bits RVA van het doel.
IMAGE_REL_MIPS_PAIR
0x0025
De herlocatie is alleen geldig wanneer deze direct volgt op een REFHI- of SECRELHI-herlocatie. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel.

 

Mitsubishi M32R

De volgende herlocatietypeindicatoren worden gedefinieerd voor de Mitsubishi M32R-processors.

Constant Waarde Beschrijving
IMAGE_REL_M32R_ABSOLUTE
0x0000
De verplaatsing wordt genegeerd.
IMAGE_REL_M32R_ADDR32
0x0001
De 32-bits VA van het doel.
IMAGE_REL_M32R_ADDR32NB
0x0002
De 32-bits RVA van het doel.
IMAGE_REL_M32R_ADDR24
0x0003
De 24-bits VA van het doel.
IMAGE_REL_M32R_GPREL16
0x0004
De 16-bits offset van het GP-register van het doel.
IMAGE_REL_M32R_PCREL24
0x0005
De 24-bits offset van het programmateller (PC) van het doel, verschoven naar links met 2 bits en sign-extended
IMAGE_REL_M32R_PCREL16
0x0006
De 16-bits verschuiving van het doel van de pc, verschoven naar links met 2 bits en teken-extended
IMAGE_REL_M32R_PCREL8
0x0007
De 8-bits verschuiving van het doel van de pc, verschoven naar links met 2 bits en teken-extended
IMAGE_REL_M32R_REFHALF
0x0008
De 16 MB's van de doel-VA.
IMAGE_REL_M32R_REFHI
0x0009
De 16 MB's van de doel-VA, aangepast voor de LSB-tekenextensie. Dit wordt gebruikt voor de eerste instructie in een twee-instructiereeks waarmee een volledig 32-bits adres wordt geladen. Deze verplaatsing moet onmiddellijk worden gevolgd door een PAIR-verplaatsing waarvan SymbolTableIndex een ondertekende 16-bits verplaatsing bevat die wordt toegevoegd aan de bovenste 16 bits die worden genomen van de locatie die wordt verplaatst.
IMAGE_REL_M32R_REFLO
0x000A
De 16 LSBs van de doel-VA.
IMAGE_REL_M32R_PAIR
0x000B
De herlocatie moet de REFHI-verplaatsing volgen. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel.
IMAGE_REL_M32R_SECTION
0x000C
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens.
IMAGE_REL_M32R_SECREL
0x000D
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads.
IMAGE_REL_M32R_TOKEN
0x000E
Het CLR-token.

 

COFF-regelnummers (afgeschaft)

COFF-regelnummers worden niet meer geproduceerd en worden in de toekomst niet verbruikt.

COFF-regelnummers geven de relatie tussen code- en regelnummers in bronbestanden aan. De Microsoft-indeling voor COFF-regelnummers is vergelijkbaar met standaard-COFF, maar is uitgebreid om één sectie toe te staan om te relateren aan regelnummers in meerdere bronbestanden.

COFF-regelnummers bestaan uit een matrix met records met een vaste lengte. De locatie (bestandsverschil) en de grootte van de matrix worden opgegeven in de sectiekoptekst. Elke regelnummerrecord heeft de volgende notatie.

Afstand Grootte Veld Beschrijving
0
4
Type (*)
Dit is een samenvoeging van twee velden: SymbolTableIndex en VirtualAddress. Of SymbolTableIndex of RVA wordt gebruikt, is afhankelijk van de waarde van het lijnnummer.
4
2
Lijnnummer
Als u geen nul opgeeft, geeft dit veld een regelnummer op basis van één. Wanneer nul wordt het veld Type geïnterpreteerd als een symbooltabelindex voor een functie.

 

Het veld Type is een samenvoeging van twee 4-bytevelden: SymbolTableIndex en VirtualAddress.

Afstand Grootte Veld Beschrijving
0
4
SymbolTableIndex
Wordt gebruikt wanneer lijnnummer nul is: index voor een symbooltabelvermelding voor een functie. Deze indeling wordt gebruikt om de functie aan te geven waarnaar een groep regelnummerrecords verwijst.
0
4
VirtualAddress
Wordt gebruikt als lijnnummer niet-nul is: de RVA van de uitvoerbare code die overeenkomt met de aangegeven bronregel. In een objectbestand bevat dit de VA in de sectie.

 

Een regelnummerrecord kan het veld Regelnummer instellen op nul en verwijzen naar een functiedefinitie in de symbooltabel of als standaardregelnummerinvoer door een positief geheel getal (regelnummer) en het bijbehorende adres in de objectcode te geven.

Een groep regelnummervermeldingen begint altijd met de eerste notatie: de index van een functiesymbool. Als dit de eerste regelnummerrecord in de sectie is, is dit ook de comdat-symboolnaam voor de functie als de vlag COMDAT van de sectie is ingesteld. Zie COMDAT-secties (alleen object). De hulprecord van de functie in de symbooltabel heeft een aanwijzer naar het veld Lijnnummer dat verwijst naar dezelfde regelnummerrecord.

Een record die een functie identificeert, wordt gevolgd door een willekeurig aantal regelnummeritems die werkelijke informatie over het regelnummer geven (dat wil gezegd: vermeldingen met regelnummer groter dan nul). Deze vermeldingen zijn één gebaseerd ten opzichte van het begin van de functie en vertegenwoordigen elke bronregel in de functie, met uitzondering van de eerste regel.

De eerste record voor het regelnummer voor het volgende voorbeeld geeft bijvoorbeeld de functie ReverseSign op (SymbolTableIndex of ReverseSign en Linenumber ingesteld op nul). Vervolgens worden records met de waarden van het regelnummer 1, 2 en 3 gevolgd, die overeenkomen met de bronregels, zoals wordt weergegeven:

// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2:  return -1 * i;
3: }

Tabel COFF-symbool

De symbooltabel in deze sectie wordt overgenomen van de traditionele COFF-indeling. Dit verschilt van microsoft Visual C++ foutopsporingsgegevens. Een bestand kan zowel een COFF-symbooltabel als informatie over foutopsporing in Visual C++ bevatten en de twee worden gescheiden gehouden. Sommige Microsoft-hulpprogramma's gebruiken de symbooltabel voor beperkte maar belangrijke doeleinden, zoals het doorgeven van COMDAT-gegevens aan de linker. Sectienamen en bestandsnamen, evenals code- en gegevenssymbolen, worden weergegeven in de symbooltabel.

De locatie van de symbooltabel wordt aangegeven in de COFF-header.

De symbooltabel is een matrix met records, elke 18 bytes lang. Elke record is een standaard- of hulprecord voor symbolentabellen. Een standaardrecord definieert een symbool of naam en heeft de volgende indeling.

Afstand Grootte Veld Beschrijving
0
8
Naam (*)
De naam van het symbool, vertegenwoordigd door een samenvoeging van drie structuren. Er wordt een matrix van 8 bytes gebruikt als de naam niet langer is dan 8 bytes. Zie symboolnaamweergavevoor meer informatie.
8
4
Waarde
De waarde die is gekoppeld aan het symbool. De interpretatie van dit veld is afhankelijk van SectionNumber en StorageClass. Een typische betekenis is het onvervangbare adres.
12
2
SectionNumber
Het ondertekende gehele getal dat de sectie identificeert, met behulp van een op één gebaseerde index in de sectietabel. Sommige waarden hebben een speciale betekenis, zoals gedefinieerd in sectie 5.4.2, 'Sectienummerwaarden'.
14
2
Type
Een getal dat het type vertegenwoordigt. Microsoft-hulpprogramma's stellen dit veld in op 0x20 (functie) of 0x0 (geen functie). Zie typeweergavevoor meer informatie.
16
1
StorageClass
Een opgesomde waarde die de opslagklasse vertegenwoordigt. Zie Storage Classvoor meer informatie.
17
1
NumberOfAuxSymbolen
Het aantal vermeldingen in de hulpsymbooltabel die volgen op deze record.

 

Nul of meer hulprecords voor symbolentabellen volgen onmiddellijk elke standaardrecord voor symbolentabellen. Meestal volgt echter niet meer dan één hulp-symbooltabelrecord een standaardrecord voor symbolentabellen (met uitzondering van .file records met lange bestandsnamen). Elke hulprecord heeft dezelfde grootte als een standaard-symbooltabelrecord (18 bytes), maar in plaats van een nieuw symbool te definiëren, geeft de hulprecord aanvullende informatie over het laatste gedefinieerde symbool. De keuze van verschillende indelingen die moeten worden gebruikt, is afhankelijk van het veld StorageClass. Momenteel gedefinieerde notaties voor hulptabelrecords voor symbolen worden weergegeven in sectie 5.5, 'Hulpsymboolrecords'.

Hulpprogramma's die COFF-symbooltabellen lezen, moeten hulpsymboolrecords negeren waarvan de interpretatie onbekend is. Hierdoor kan de indeling van de symbooltabel worden uitgebreid om nieuwe hulprecords toe te voegen, zonder dat bestaande hulpprogramma's worden onderbroken.

Weergave van symboolnaam

Het veld ShortName in een symbooltabel bestaat uit 8 bytes die de naam zelf bevatten, als deze niet langer is dan 8 bytes, of het veld ShortName geeft een verschuiving in de tekenreekstabel. Als u wilt bepalen of de naam zelf of een offset wordt opgegeven, test u de eerste 4 bytes voor gelijkheid tot nul.

Volgens de conventie worden de namen behandeld als met nul beëindigde UTF-8 gecodeerde tekenreeksen.

Afstand Grootte Veld Beschrijving
0
8
ShortName
Een matrix van 8 bytes. Deze matrix wordt gevuld met null-waarden aan de rechterkant als de naam kleiner is dan 8 bytes.
0
4
Nullen
Een veld dat is ingesteld op alle nullen als de naam langer is dan 8 bytes.
4
4
Afstand
Een verschuiving in de tekenreekstabel.

 

Waarden voor sectienummer

Normaal gesproken is het veld Sectiewaarde in een symbooltabelvermelding een op één gebaseerde index in de sectietabel. Dit veld is echter een ondertekend geheel getal en kan negatieve waarden aannemen. De volgende waarden, kleiner dan één, hebben speciale betekenissen.

Constant Waarde Beschrijving
IMAGE_SYM_UNDEFINED
0
Er is nog geen sectie toegewezen aan de symboolrecord. Een waarde van nul geeft aan dat een verwijzing naar een extern symbool ergens anders wordt gedefinieerd. Een waarde van niet-nul is een gemeenschappelijk symbool met een grootte die wordt opgegeven door de waarde.
IMAGE_SYM_ABSOLUTE
-1
Het symbool heeft een absolute waarde (niet herverdeelbaar) en is geen adres.
IMAGE_SYM_DEBUG
-2
Het symbool bevat algemene informatie over het type of de foutopsporing, maar komt niet overeen met een sectie. Microsoft-hulpprogramma's gebruiken deze instelling samen met .file records (storage class FILE).

 

Typeweergave

Het veld Type van een symbooltabel bevat 2 bytes, waarbij elke byte typegegevens vertegenwoordigt. De LSB vertegenwoordigt het eenvoudige gegevenstype (basis) en de MSB vertegenwoordigt het complexe type, indien van toepassing:

MSB LSB
Complex type: geen, aanwijzer, functie, matrix.
Basistype: geheel getal, drijvende komma, enzovoort.

 

De volgende waarden worden gedefinieerd voor het basistype, hoewel Microsoft-hulpprogramma's dit veld doorgaans niet gebruiken en de LSB instellen op 0. In plaats daarvan wordt foutopsporingsinformatie in Visual C++ gebruikt om typen aan te geven. De mogelijke COFF-waarden worden hier echter vermeld voor volledigheid.

Constant Waarde Beschrijving
IMAGE_SYM_TYPE_NULL
0
Geen typegegevens of onbekend basistype. Microsoft-hulpprogramma's gebruiken deze instelling
IMAGE_SYM_TYPE_VOID
1
Geen geldig type; gebruikt met ongeldige aanwijzers en functies
IMAGE_SYM_TYPE_CHAR
2
Een teken (ondertekende byte)
IMAGE_SYM_TYPE_SHORT
3
Een geheel getal met 2 bytes dat is ondertekend
IMAGE_SYM_TYPE_INT
4
Een natuurlijk geheel getaltype (normaal gesproken 4 bytes in Windows)
IMAGE_SYM_TYPE_LONG
5
Een geheel getal met 4 bytes dat is ondertekend
IMAGE_SYM_TYPE_FLOAT
6
Een 4-byte-drijvendekommagetal
IMAGE_SYM_TYPE_DOUBLE
7
Een getal van 8 bytes met drijvende komma
IMAGE_SYM_TYPE_STRUCT
8
Een structuur
IMAGE_SYM_TYPE_UNION
9
Een samenvoeging
IMAGE_SYM_TYPE_ENUM
10
Een geïnventariseerd type
IMAGE_SYM_TYPE_MOE
11
Een lid van opsomming (een specifieke waarde)
IMAGE_SYM_TYPE_BYTE
12
Een byte; niet-ondertekend geheel getal van 1 bytes
IMAGE_SYM_TYPE_WORD
13
Een woord; geheel getal met 2 bytes
IMAGE_SYM_TYPE_UINT
14
Een niet-ondertekend geheel getal van natuurlijke grootte (normaal gesproken 4 bytes)
IMAGE_SYM_TYPE_DWORD
15
Een niet-ondertekend geheel getal van 4 bytes

 

De belangrijkste byte geeft aan of het symbool een aanwijzer is naar, functie retourneert of matrix van het basistype dat is opgegeven in de LSB. Microsoft-hulpprogramma's gebruiken dit veld alleen om aan te geven of het symbool een functie is, zodat de slechts twee resulterende waarden 0x0 en 0x20 voor het veld Type. Andere hulpprogramma's kunnen dit veld echter gebruiken om meer informatie te communiceren.

Het is erg belangrijk om het functiekenmerk correct op te geven. Deze informatie is vereist om incrementeel koppelen correct te laten werken. Voor sommige architecturen is de informatie mogelijk vereist voor andere doeleinden.

Constant Waarde Beschrijving
IMAGE_SYM_DTYPE_NULL
0
Geen afgeleid type; het symbool is een eenvoudige scalaire variabele.
IMAGE_SYM_DTYPE_POINTER
1
Het symbool is een aanwijzer naar het basistype.
IMAGE_SYM_DTYPE_FUNCTION
2
Het symbool is een functie die een basistype retourneert.
IMAGE_SYM_DTYPE_ARRAY
3
Het symbool is een matrix van het basistype.

 

Opslagklasse

Het veld StorageClass van de symbooltabel geeft aan welk type definitie een symbool vertegenwoordigt. In de volgende tabel ziet u mogelijke waarden. Het veld StorageClass is een geheel getal van 1 byte dat niet is ondertekend. De speciale waarde -1 moet derhalve worden beschouwd als niet-ondertekende equivalent, 0xFF.

Hoewel in de traditionele COFF-indeling veel waarden voor opslagklasse worden gebruikt, zijn Microsoft-hulpprogramma's afhankelijk van de foutopsporingsindeling van Visual C++ voor de meeste symbolische informatie en gebruiken doorgaans slechts vier opslagklassewaarden: EXTERNAL (2), STATIC (3), FUNCTION (101) en FILE (103). Behalve in de tweede kolomkop hieronder moet 'Waarde' worden gebruikt om het waardeveld van de symboolrecord te betekenen (waarvan de interpretatie afhankelijk is van het getal dat is gevonden als de opslagklasse).

Constant Waarde Beschrijving/interpretatie van het veld Waarde
IMAGE_SYM_CLASS_END_OF_FUNCTION
-1 (0xFF)
Een speciaal symbool dat het einde van de functie aangeeft voor foutopsporing.
IMAGE_SYM_CLASS_NULL
0
Geen toegewezen opslagklasse.
IMAGE_SYM_CLASS_AUTOMATIC
1
De automatische variabele (stack). Het veld Waarde geeft de verschuiving van het stackframe op.
IMAGE_SYM_CLASS_EXTERNAL
2
Een waarde die Microsoft-hulpprogramma's gebruiken voor externe symbolen. Het veld Waarde geeft de grootte aan als het sectienummer IMAGE_SYM_UNDEFINED (0). Als het sectienummer niet nul is, geeft het veld Waarde de verschuiving in de sectie op.
IMAGE_SYM_CLASS_STATIC
3
De verschuiving van het symbool in de sectie. Als het veld Waarde nul is, vertegenwoordigt het symbool een sectienaam.
IMAGE_SYM_CLASS_REGISTER
4
Een registervariabele. Het veld Waarde geeft het registernummer op.
IMAGE_SYM_CLASS_EXTERNAL_DEF
5
Een symbool dat extern is gedefinieerd.
IMAGE_SYM_CLASS_LABEL
6
Een codelabel dat in de module is gedefinieerd. Het veld Waarde geeft de verschuiving van het symbool in de sectie op.
IMAGE_SYM_CLASS_UNDEFINED_LABEL
7
Een verwijzing naar een codelabel dat niet is gedefinieerd.
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
8
Het structuurlid. Het veld Waarde geeft het nde lid op.
IMAGE_SYM_CLASS_ARGUMENT
9
Een formeel argument (parameter) van een functie. Het veld Waarde geeft het nde argument op.
IMAGE_SYM_CLASS_STRUCT_TAG
10
De tagnaamvermelding van de structuur.
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11
Een lid van de vereniging. Het veld Waarde geeft het nde lid op.
IMAGE_SYM_CLASS_UNION_TAG
12
De vermelding tagnaam van Union.
IMAGE_SYM_CLASS_TYPE_DEFINITION
13
Een Typedef-vermelding.
IMAGE_SYM_CLASS_UNDEFINED_STATIC
14
Een statische gegevensdeclaratie.
IMAGE_SYM_CLASS_ENUM_TAG
15
Een opsommingstype tagnaamvermelding.
IMAGE_SYM_CLASS_MEMBER_OF_ENUM
16
Een lid van een opsomming. Het veld Waarde geeft het nde lid op.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
Een registerparameter.
IMAGE_SYM_CLASS_BIT_FIELD
18
Een bitveldverwijzing. Het veld Waarde geeft de nde bit in het bitveld op.
IMAGE_SYM_CLASS_BLOCK
100
Een .bb-record (begin van blok) of .eb (einde van blok). Het veld Waarde is het herbruikbare adres van de codelocatie.
IMAGE_SYM_CLASS_FUNCTION
101
Een waarde die Microsoft-hulpprogramma's gebruiken voor symboolrecords die de omvang van een functie definiëren: beginfunctie (.bf), eindfunctie (.ef) en lijnen in functie (.lf). Voor .lf-records geeft het veld Waarde het aantal bronregels in de functie. Voor .ef-records geeft het veld Waarde de grootte van de functiecode.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
Een einde van de structuurvermelding.
IMAGE_SYM_CLASS_FILE
103
Een waarde die microsoft-hulpprogramma's, evenals de traditionele COFF-indeling, gebruikt voor de record met het bronbestandsymbool. Het symbool wordt gevolgd door hulprecords waarmee het bestand een naam krijgt.
IMAGE_SYM_CLASS_SECTION
104
Een definitie van een sectie (Microsoft-hulpprogramma's gebruiken in plaats daarvan STATISCHE opslagklasse).
IMAGE_SYM_CLASS_WEAK_EXTERNAL
105
Een zwak extern. Zie Hulpindeling 3: Zwakke externenvoor meer informatie.
IMAGE_SYM_CLASS_CLR_TOKEN
107
Een CLR-tokensymbool. De naam is een ASCII-tekenreeks die bestaat uit de hexadecimale waarde van het token. Zie CLR-tokendefinitie (alleen object)voor meer informatie.

 

Hulpsymboolrecords

Hulpsymbooltabelrecords volgen altijd en zijn van toepassing op een standaardtabelrecord. Een hulprecord kan elke indeling hebben die de hulpprogramma's kunnen herkennen, maar er moeten 18 bytes voor deze records worden toegewezen, zodat de symbooltabel wordt onderhouden als een matrix met een normale grootte. Momenteel herkennen Microsoft-hulpprogramma's hulpindelingen voor de volgende soorten records: functiedefinities, begin- en eindsymbolen (.bf en .ef), zwakke externen, bestandsnamen en sectiedefinities.

Het traditionele COFF-ontwerp bevat ook hulprecordindelingen voor matrices en structuren. Microsoft-hulpprogramma's gebruiken deze niet, maar plaats in plaats daarvan die symbolische informatie in de foutopsporingsindeling van Visual C++ in de secties voor foutopsporing.

Hulpindeling 1: functiedefinities

Een symbooltabelrecord markeert het begin van een functiedefinitie als deze al het volgende heeft: een opslagklasse van EXTERNAL (2), een typewaarde die aangeeft dat het een functie is (0x20) en een sectienummer dat groter is dan nul. Houd er rekening mee dat een symbooltabelrecord met een sectienummer UNDEFINED (0) de functie niet definieert en geen hulprecord heeft. Symboolrecords voor functiedefinities worden gevolgd door een hulprecord in de indeling die hieronder wordt beschreven:

Afstand Grootte Veld Beschrijving
0
4
TagIndex
De symbooltabelindex van de bijbehorende symboolrecord .bf (beginfunctie).
4
4
TotalSize
De grootte van de uitvoerbare code voor de functie zelf. Als de functie zich in een eigen sectie bevindt, is de SizeOfRawData in de sectiekop groter of gelijk aan dit veld, afhankelijk van de uitlijningsoverwegingen.
8
4
PointerToLinenumber
De bestandsverschuiving van de eerste COFF-regelnummervermelding voor de functie, of nul als er geen bestaat. Zie COFF-regelnummers (afgeschaft)voor meer informatie.
12
4
PointerToNextFunction
De index van de symbooltabel van de record voor de volgende functie. Als de functie de laatste in de symbooltabel is, wordt dit veld ingesteld op nul.
16
2
Ongebruikt

 

Hulpopmaak 2: .bf- en .ef-symbolen

Voor elke functiedefinitie in de symbooltabel beschrijven drie items het begin, einde en het aantal regels. Elk van deze symbolen heeft de opslagklasse FUNCTION (101):

Een symboolrecord met de naam .bf (beginfunctie). Het veld Waarde wordt niet gebruikt.

Een symboolrecord met de naam .lf (lijnen in functie). Het veld Waarde geeft het aantal regels in de functie.

Een symboolrecord met de naam .ef (einde van functie). Het veld Waarde heeft hetzelfde getal als het veld Totale grootte in de record voor het functiedefinitiesymbool.

De .bf- en EF-symboolrecords (maar niet .lf-records) worden gevolgd door een hulprecord met de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Ongebruikt
4
2
Lijnnummer
Het werkelijke rangnummer (1, 2, 3, enzovoort) in het bronbestand, dat overeenkomt met de .bf- of .ef-record.
6
6
Ongebruikt
12
4
PointerToNextFunction ( alleen .bf)
De index van de symbooltabel van de volgende .bf-symboolrecord. Als de functie de laatste in de symbooltabel is, wordt dit veld ingesteld op nul. Het wordt niet gebruikt voor .ef-records.
16
2
Ongebruikt

 

Hulpindeling 3: Zwakke externen

Zwakke externen zijn een mechanisme voor objectbestanden die flexibiliteit op het moment van koppelen mogelijk maken. Een module kan een niet-opgelost extern symbool (sym1) bevatten, maar kan ook een hulprecord bevatten die aangeeft dat als sym1 niet aanwezig is op het moment van koppeling, een ander extern symbool (sym2) wordt gebruikt om verwijzingen op te lossen.

Als een definitie van sym1 is gekoppeld, wordt een externe verwijzing naar het symbool normaal opgelost. Als een definitie van sym1 niet is gekoppeld, verwijzen alle verwijzingen naar de zwakke externe voor sym1 in plaats daarvan naar sym2. Het externe symbool, sym2, moet altijd worden gekoppeld; doorgaans wordt deze gedefinieerd in de module die de zwakke verwijzing naar sym1 bevat.

Zwakke externe waarden worden vertegenwoordigd door een symbooltabelrecord met de klasse EXTERNAL Storage, UNDEF-sectienummer en een waarde van nul. De zwak-externe symboolrecord wordt gevolgd door een hulprecord met de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
TagIndex
De symbooltabelindex van sym2, het symbool dat moet worden gekoppeld als sym1 niet wordt gevonden.
4
4
Kenmerken
Een waarde van IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY geeft aan dat er geen bibliotheekzoekactie naar sym1 moet worden uitgevoerd.
Een waarde van IMAGE_WEAK_EXTERN_SEARCH_LIBRARY geeft aan dat een bibliotheekzoekactie naar sym1 moet worden uitgevoerd.
Een waarde van IMAGE_WEAK_EXTERN_SEARCH_ALIAS geeft aan dat sym1 een alias is voor sym2.
8
10
Ongebruikt

 

Houd er rekening mee dat het veld Kenmerken niet is gedefinieerd in WINNT. H; In plaats daarvan wordt het veld Totale grootte gebruikt.

Hulpindeling 4: Bestanden

Deze indeling volgt een symbooltabelrecord met opslagklasse FILE (103). De symboolnaam zelf moet .file zijn en de hulprecord die volgt, geeft de naam van een broncodebestand.

Afstand Grootte Veld Beschrijving
0
18
Bestandsnaam
Een ANSI-tekenreeks die de naam van het bronbestand geeft. Dit wordt opgevuld met null-waarden als deze kleiner is dan de maximale lengte.

 

Hulpindeling 5: sectiedefinities

Deze indeling volgt een symbooltabelrecord die een sectie definieert. Een dergelijke record heeft een symboolnaam die de naam is van een sectie (zoals .text of .drectve) en heeft opslagklasse STATIC (3). De hulprecord bevat informatie over de sectie waarnaar deze verwijst. Hierdoor wordt een deel van de informatie in de sectiekop gedupliceerd.

Afstand Grootte Veld Beschrijving
0
4
Lengte
De grootte van sectiegegevens; hetzelfde als SizeOfRawData in de sectieheader.
4
2
NumberOfRelocations
Het aantal herplaatsingsvermeldingen voor de sectie.
6
2
NumberOfLinenumbers
Het aantal regelnummers voor de sectie.
8
4
Checksum
De controlesom voor gemeenschappelijke gegevens. Dit is van toepassing als de vlag IMAGE_SCN_LNK_COMDAT is ingesteld in de koptekst van de sectie. Zie COMDAT-secties (alleen object)voor meer informatie.
12
2
Getal
Eén index in de sectietabel voor de bijbehorende sectie. Dit wordt gebruikt wanneer de comdat-selectie-instelling 5 is.
14
1
Selectie
Het selectienummer COMDAT. Dit is van toepassing als de sectie een COMDAT-sectie is.
15
3
Ongebruikt

 

COMDAT-secties (alleen object)

Het veld Selectie van de aanvullende indeling van de sectiedefinitie is van toepassing als de sectie een COMDAT-sectie is. Een COMDAT-sectie is een sectie die kan worden gedefinieerd door meer dan één objectbestand. (De vlag IMAGE_SCN_LNK_COMDAT is ingesteld in het veld Sectievlagken van de sectiekop.) Het selectieveld bepaalt de manier waarop de linker de meerdere definities van COMDAT-secties oplost.

Het eerste symbool met de sectiewaarde van de sectie COMDAT moet het sectiesymbool zijn. Dit symbool heeft de naam van de sectie, het veld Waarde gelijk aan nul, het sectienummer van de betreffende COMDAT-sectie, het veld Type dat gelijk is aan IMAGE_SYM_TYPE_NULL, het veld Klasse gelijk aan IMAGE_SYM_CLASS_STATIC en één hulprecord. Het tweede symbool heet 'het COMDAT-symbool' en wordt gebruikt door de linker in combinatie met het selectieveld.

De waarden voor het selectieveld worden hieronder weergegeven.

Constant Waarde Beschrijving
IMAGE_COMDAT_SELECT_NODUPLICATES
1
Als dit symbool al is gedefinieerd, geeft de linker een fout 'vermenigvuldigen gedefinieerd symbool' uit.
IMAGE_COMDAT_SELECT_ANY
2
Elke sectie die hetzelfde COMDAT-symbool definieert, kan worden gekoppeld; de rest wordt verwijderd.
IMAGE_COMDAT_SELECT_SAME_SIZE
3
De linker kiest een willekeurige sectie tussen de definities voor dit symbool. Als alle definities niet dezelfde grootte hebben, wordt er een 'vermenigvuldigingssymbool' weergegeven.
IMAGE_COMDAT_SELECT_EXACT_MATCH
4
De linker kiest een willekeurige sectie tussen de definities voor dit symbool. Als alle definities niet exact overeenkomen, wordt er een 'vermenigvuldigen gedefinieerd symbool' weergegeven.
IMAGE_COMDAT_SELECT_ASSOCIATIVE
5
De sectie is gekoppeld als een bepaalde andere COMDAT-sectie is gekoppeld. Deze andere sectie wordt aangegeven door het veld Getal van de hulpsymboolrecord voor de sectiedefinitie. Deze instelling is handig voor definities met onderdelen in meerdere secties (bijvoorbeeld code in een en andere gegevens), maar waarbij alles moet worden gekoppeld of verwijderd als een set. De andere sectie waaraan deze sectie is gekoppeld, moet een COMDAT-sectie zijn, die een andere associatieve COMDAT-sectie kan zijn. De koppelingsketen van een associatieve COMDAT-sectie kan geen lus vormen. De sectiekoppelingsketen moet uiteindelijk naar een COMDAT-sectie komen waarvoor geen IMAGE_COMDAT_SELECT_ASSOCIATIVE set is ingesteld.
IMAGE_COMDAT_SELECT_LARGEST
6
De linker kiest de grootste definitie uit alle definities voor dit symbool. Als meerdere definities deze grootte hebben, is de keuze tussen deze definities willekeurig.

 

CLR-tokendefinitie (alleen object)

Dit hulpsymbool volgt over het algemeen de IMAGE_SYM_CLASS_CLR_TOKEN. Het wordt gebruikt om een token te koppelen aan de naamruimte van de COFF-symbooltabel.

Afstand Grootte Veld Beschrijving
0
1
bAuxType
Moet IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1) zijn.
1
1
bReserved
Gereserveerd, moet nul zijn.
2
4
SymbolTableIndex
De symboolindex van het COFF-symbool waarnaar deze CLR-tokendefinitie verwijst.
6
12
Gereserveerd, moet nul zijn.

 

Tabel COFF-tekenreeks

Direct na de tabel COFF-symbool is de tabel COFF-tekenreeks. De positie van deze tabel wordt gevonden door het adres van de symbooltabel in de COFF-koptekst te nemen en het aantal symbolen toe te voegen dat wordt vermenigvuldigd met de grootte van een symbool.

Aan het begin van de tabel COFF-tekenreeks zijn 4 bytes die de totale grootte (in bytes) van de rest van de tekenreekstabel bevatten. Deze grootte omvat het grootteveld zelf, zodat de waarde op deze locatie 4 zou zijn als er geen tekenreeksen aanwezig waren.

Na de grootte zijn tekenreeksen die null-beëindigd zijn en waarnaar wordt verwezen door symbolen in de tabel COFF-symbolen.

De kenmerkcertificaattabel (alleen afbeelding)

Kenmerkcertificaten kunnen worden gekoppeld aan een installatiekopieën door een kenmerkcertificaattabel toe te voegen. De kenmerkcertificaattabel bestaat uit een set aaneengesloten, quadword-uitgelijnde kenmerkcertificaatvermeldingen. Nulopvulling wordt ingevoegd tussen het oorspronkelijke einde van het bestand en het begin van de kenmerkcertificaattabel om deze uitlijning te bereiken. Elke kenmerkcertificaatvermelding bevat de volgende velden.

Afstand Grootte Veld Beschrijving
0
4
dwLength
Hiermee geeft u de lengte van de kenmerkcertificaatvermelding.
4
2
wRevision
Bevat het versienummer van het certificaat. Zie de volgende tekst voor meer informatie.
6
2
wCertificateType
Hiermee geeft u het type inhoud in bCertificate. Zie de volgende tekst voor meer informatie.
8
Zie het volgende
bCertificate
Bevat een certificaat, zoals een Authenticode-handtekening. Zie de volgende tekst voor meer informatie.

 

De waarde van het virtuele adres uit de vermelding Certificaattabel in de optionele headergegevensmap is een bestandsverschil met de eerste kenmerkcertificaatvermelding. Volgende vermeldingen worden geopend door de dwLength-bytes van die vermelding naar boven af te ronden op een veelvoud van 8 bytes, vanaf het begin van de huidige kenmerkcertificaatvermelding. Dit gaat door totdat de som van de afgeronde dwLength-waarden gelijk is aan de waarde Grootte uit de vermelding Certificatentabel in de optionele headergegevensmap. Als de som van de afgeronde dwLength-waarden niet gelijk is aan de waarde Grootte, is de certificaattabel van het kenmerk of het veld Grootte beschadigd.

Als de certificaattabelvermelding van de optionele headergegevensmap bijvoorbeeld het volgende bevat:

virtual address = 0x5000
size = 0x1000

Het eerste certificaat begint bij offset 0x5000 vanaf het begin van het bestand op schijf. Ga als volgende door alle vermeldingen van het kenmerkcertificaat:

  1. Voeg de dwLength-waarde van het eerste kenmerkcertificaat toe aan de begin offset.
  2. Rond de waarde af van stap 1 naar boven naar het dichtstbijzijnde veelvoud van 8 byte om de verschuiving van de tweede kenmerkcertificaatvermelding te vinden.
  3. Voeg de offsetwaarde van stap 2 toe aan de dwLength-waarde van het tweede kenmerkcertificaat en afronden naar boven naar het dichtstbijzijnde veelvoud van 8 byte om de verschuiving van de derde kenmerkcertificaatvermelding te bepalen.
  4. Herhaal stap 3 voor elk opeenvolgend certificaat totdat de berekende offset gelijk is aan 0x6000 (0x5000 begin + 0x1000 totale grootte), wat aangeeft dat u de hele tabel hebt doorlopen.

U kunt de certificaatvermeldingen ook opsommen door de Win32-ImageEnumerateCertificates functie in een lus aan te roepen. Zie Verwijzingenvoor een koppeling naar de referentiepagina van de functie.

Vermeldingen in de kenmerkcertificaattabel kunnen elk certificaattype bevatten, zolang de vermelding de juiste dwLength-waarde, een unieke wRevision-waarde en een unieke wCertificateType-waarde heeft. Het meest voorkomende type certificaattabelvermelding is een WIN_CERTIFICATE structuur, die wordt gedocumenteerd in Wintrust.h en in de rest van deze sectie wordt besproken.

De opties voor de WIN_CERTIFICATE wRevision-lid omvatten (maar zijn niet beperkt tot) het volgende.

Waarde Naam Notities
0x0100
WIN_CERT_REVISION_1_0
Versie 1, verouderde versie van de Win_Certificate-structuur. Het wordt alleen ondersteund voor het verifiëren van verouderde Authenticode-handtekeningen
0x0200
WIN_CERT_REVISION_2_0
Versie 2 is de huidige versie van de Win_Certificate-structuur.

 

De opties voor de WIN_CERTIFICATE wCertificateType lid omvatten (maar zijn niet beperkt tot) de items in de volgende tabel. Houd er rekening mee dat sommige waarden momenteel niet worden ondersteund.

Waarde Naam Notities
0x0001
WIN_CERT_TYPE_X509
bCertificate bevat een X.509-certificaat
Niet ondersteund
0x0002
WIN_CERT_TYPE_PKCS_SIGNED_DATA
bCertificate bevat een PKCS#7 SignedData-structuur
0x0003
WIN_CERT_TYPE_RESERVED_1
Gereserveerd
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Terminal Server Protocol Stack-certificaatondertekening
Niet ondersteund

 

De WIN_CERTIFICATE structuur bCertificate lid bevat een bytematrix met variabele lengte met het inhoudstype dat is opgegeven door wCertificateType. Het type dat wordt ondersteund door Authenticode, is WIN_CERT_TYPE_PKCS_SIGNED_DATA, een PKCS#7 SignedData structuur. Zie Windows Authenticode Portable Executable Signature Formatvoor meer informatie over de authenticode-indeling voor digitale handtekeningen.

Als de bCertificate inhoud niet eindigt op een quadwordgrens, wordt de vermelding van het kenmerkcertificaat opgevuld met nullen, vanaf het einde van bCertificate naar de volgende quadwordgrens.

De dwLength waarde is de lengte van de voltooide WIN_CERTIFICATE structuur en wordt berekend als:

dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)

Deze lengte moet de grootte bevatten van elke opvulling die wordt gebruikt om te voldoen aan de vereiste dat elke WIN_CERTIFICATE structuur quadword is uitgelijnd:

dwLength += (8 - (dwLength & 7)) & 7;

De grootte van de certificaattabeldie is opgegeven in de certificatentabel vermelding in de optionele headergegevensmappen (alleen afbeelding)- bevat de opvulling.

Zie ImageHlp Functions-voor meer informatie over het gebruik van de ImageHlp-API voor het inventariseren, toevoegen en verwijderen van certificaten uit PE-bestanden.

Certificaatgegevens

Zoals vermeld in de vorige sectie, kunnen de certificaten in de kenmerkcertificaattabel elk certificaattype bevatten. Certificaten die ervoor zorgen dat de integriteit van een PE-bestand een PE-installatiekopieënhash bevat.

Een PE-afbeeldingshash (of bestands-hash) is vergelijkbaar met een bestandscontrolesom omdat het hash-algoritme een berichtsamenvating produceert die is gerelateerd aan de integriteit van een bestand. Er wordt echter een controlesom geproduceerd door een eenvoudig algoritme en wordt voornamelijk gebruikt om te detecteren of een blok geheugen op schijf ongeldig is gegaan en de waarden die daar zijn opgeslagen, zijn beschadigd. Een bestandshash is vergelijkbaar met een controlesom omdat ook bestandsbeschadiging wordt gedetecteerd. In tegenstelling tot de meeste controlesomalgoritmen is het echter erg moeilijk om een bestand te wijzigen zonder de bestandshash te wijzigen van de oorspronkelijke ongewijzigde waarde. Een bestandshash kan dus worden gebruikt om opzettelijke en zelfs subtiele wijzigingen in een bestand te detecteren, zoals die zijn geïntroduceerd door virussen, hackers of Trojaanse paardenprogramma's.

Wanneer de afbeeldingssamenvating is opgenomen in een certificaat, moet bepaalde velden in de PE-installatiekopieën worden uitgesloten, zoals de vermelding Checksum en Certificaattabel in optionele headergegevensmappen. Dit komt doordat de handeling van het toevoegen van een certificaat deze velden wijzigt en ertoe zou leiden dat een andere hash-waarde wordt berekend.

De functie Win32 ImageGetDigestStream biedt een gegevensstroom van een PE-doelbestand waarmee u hash-functies kunt uitvoeren. Deze gegevensstroom blijft consistent wanneer certificaten worden toegevoegd aan of verwijderd uit een PE-bestand. Op basis van de parameters die worden doorgegeven aan ImageGetDigestStream, kunnen andere gegevens uit de PE-installatiekopieën worden weggelaten uit de hashberekening. Zie Verwijzingenvoor een koppeling naar de referentiepagina van de functie.

Delay-Load Tabellen importeren (alleen afbeelding)

Deze tabellen zijn toegevoegd aan de afbeelding ter ondersteuning van een uniform mechanisme voor toepassingen om het laden van een DLL uit te stellen totdat de eerste aanroep in dat DLL-bestand wordt aangeroepen. De indeling van de tabellen komt overeen met die van de traditionele importtabellen die worden beschreven in sectie 6.4, de sectie .idata.". Hier worden slechts enkele details besproken.

De Delay-Load Directory-tabel

De maptabel met vertragingsbelasting is de tegenhanger van de importdirectory-tabel. Deze kan worden opgehaald via de vermelding Delay Import Descriptor in de optionele lijst met headergegevensmappen (offset 200). De tabel is als volgt gerangschikt:

Afstand Grootte Veld Beschrijving
0
4
Kenmerken
Moet nul zijn.
4
4
Naam
De RVA van de naam van het DLL-bestand dat moet worden geladen. De naam bevindt zich in de sectie alleen-lezengegevens van de afbeelding.
8
4
Modulehandgreep
De RVA van de modulehandgreep (in de gegevenssectie van de afbeelding) van het DLL-bestand wordt vertraagd geladen. Het wordt gebruikt voor opslag door de routine die wordt geleverd voor het beheren van vertragingsbelasting.
12
4
Importadrestabel uitstellen
De RVA van de importadrestabel voor vertragingsbelasting. Zie IAT (Import Address Table) uitstellenvoor meer informatie.
16
4
Tabel importnaam uitstellen
De RVA van de tabel met naam van vertragingsbelasting, die de namen bevat van de importbewerkingen die mogelijk moeten worden geladen. Dit komt overeen met de indeling van de tabel importnaam. Zie Hint/Name Tablevoor meer informatie.
20
4
Importtabel voor afhankelijke vertraging
De RVA van de adrestabel voor afhankelijke vertragingsbelasting, indien aanwezig.
24
4
Importtabel uitstellen uitstellen
De RVA van de adrestabel voor het uitladen van vertragingsbelasting, indien aanwezig. Dit is een exacte kopie van de importadrestabel voor vertraging. Als de aanroeper het DLL-bestand ontlaadt, moet deze tabel worden gekopieerd via de importadrestabel voor vertraging, zodat volgende aanroepen naar het DLL-bestand het thunkingmechanisme correct blijven gebruiken.
28
4
Tijdstempel
De tijdstempel van het DLL-bestand waaraan deze afbeelding is gebonden.

 

De tabellen waarnaar in deze gegevensstructuur wordt verwezen, worden geordend en gesorteerd, net zoals hun tegenhangers voor traditionele import. Zie De sectie .idatavoor meer informatie.

Kenmerken

Tot nu toe zijn er geen kenmerkvlagmen gedefinieerd. Met de linker wordt dit veld ingesteld op nul in de afbeelding. Dit veld kan worden gebruikt om de record uit te breiden door de aanwezigheid van nieuwe velden aan te geven, of kan worden gebruikt om gedrag aan te geven voor de vertragings- of laadhulpfuncties.

Naam

De naam van het DLL-bestand dat moet worden vertraagd geladen, bevindt zich in de sectie alleen-lezengegevens van de afbeelding. Er wordt naar verwezen via het veld szName.

Modulehandgreep

De ingang van het DLL-bestand dat moet worden vertraagd geladen, bevindt zich in de gegevenssectie van de afbeelding. Het phmod-veld wijst naar de handgreep. De meegeleverde helper voor vertragingsbelasting gebruikt deze locatie om de ingang op te slaan in de geladen DLL.

Importadrestabel uitstellen

Er wordt naar de importadrestabel (IAT) verwezen door de vertragingsdescriptor voor importeren via het pIAT-veld. De helper voor vertragingsbelasting werkt deze aanwijzers bij met de echte ingangspunten, zodat de donks niet meer in de aanroepende lus zitten. De functiepointers worden geopend met behulp van de expressie pINT->u1.Function.

Tabel importnaam uitstellen

De importnaamtabel (INT) voor vertraging bevat de namen van de importbewerkingen die mogelijk moeten worden geladen. Ze worden op dezelfde manier besteld als de functiepointers in de IAT. Ze bestaan uit dezelfde structuren als de standaard-INT en worden geopend met behulp van de expressie pINT->u1.AddressOfData->Name[0].

Vertraging gebonden importadrestabel en tijdstempel

De vertragingsgebonden importadrestabel (BIAT) is een optionele tabel met IMAGE_THUNK_DATA items die samen met het tijdstempelveld van de maptabel met vertragingsbelasting worden gebruikt door een bindingsfase na het proces.

Importadrestabel uitstellen

De UIAT (Import Address Table) is een optionele tabel met IMAGE_THUNK_DATA items die door de ontladingscode worden gebruikt om een expliciete uitladingsaanvraag af te handelen. Het bestaat uit geïnitialiseerde gegevens in de sectie alleen-lezen die een exacte kopie is van de oorspronkelijke IAT die de code naar de vertragingsbelastings-donks heeft verwezen. Bij het uitladen kan de bibliotheek worden vrijgemaakt, de *phmod gewist en de UIAT die via de IAT is geschreven om alles te herstellen naar de status van de preload.

Speciale secties

Typische COFF-secties bevatten code of gegevens die zonder speciale kennis van de inhoud van de sectie worden linkers en Microsoft Win32-loaders verwerkt. De inhoud is alleen relevant voor de toepassing die wordt gekoppeld of uitgevoerd.

Sommige COFF-secties hebben echter speciale betekenissen wanneer ze worden gevonden in objectbestanden of afbeeldingsbestanden. Hulpprogramma's en loaders herkennen deze secties omdat er speciale vlaggen zijn ingesteld in de sectiekoptekst, omdat speciale locaties in de optionele koptekst van de afbeelding ernaar verwijzen of omdat de sectienaam zelf een speciale functie van de sectie aangeeft. (Zelfs als de sectienaam zelf geen speciale functie van de sectie aangeeft, wordt de sectienaam volgens conventie bepaald, zodat de auteurs van deze specificatie in alle gevallen naar een sectienaam kunnen verwijzen.)

De gereserveerde secties en de bijbehorende kenmerken worden beschreven in de onderstaande tabel, gevolgd door gedetailleerde beschrijvingen voor de sectietypen die worden bewaard in uitvoerbare bestanden en de sectietypen die metagegevens voor extensies bevatten.

Sectienaam Tevreden Kenmerken
.Bss
Niet-geïnitialiseerde gegevens (vrije indeling)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.cormeta
CLR-metagegevens die aangeeft dat het objectbestand beheerde code bevat
IMAGE_SCN_LNK_INFO
.gegevens
Geïnitialiseerde gegevens (vrije indeling)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.debug$F
Gegenereerde FPO-foutopsporingsgegevens (alleen object, alleen x86-architectuur en nu verouderd)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$P
Vooraf gecompileerde foutopsporingstypen (alleen object)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$S
Fouten opsporen in symbolen (alleen object)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$T
Foutopsporingstypen (alleen object)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.drective
Linkeropties
IMAGE_SCN_LNK_INFO
.edata
Tabellen exporteren
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.idata
Tabellen importeren
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.idlsym
Bevat geregistreerde SEH (alleen installatiekopieën) ter ondersteuning van IDL-kenmerken. Zie IDL-kenmerken in Verwijzingen aan het einde van dit onderwerp voor meer informatie.
IMAGE_SCN_LNK_INFO
.pdata
Uitzonderingsinformatie
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.rdata
Alleen-lezen geïnitialiseerde gegevens
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.reloc
Verplaatsingen van afbeeldingen
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.rsrc
Resourcemap
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.sbss
NIET-geïnitialiseerde GP-gegevens (vrije indeling)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL De vlag IMAGE_SCN_GPREL moet alleen worden ingesteld voor IA64-architecturen; deze vlag is niet geldig voor andere architecturen. De vlag IMAGE_SCN_GPREL is alleen bedoeld voor objectbestanden; wanneer dit sectietype wordt weergegeven in een afbeeldingsbestand, mag de vlag IMAGE_SCN_GPREL niet worden ingesteld.
.sdata
GP-relatieve geïnitialiseerde gegevens (vrije indeling)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL De vlag IMAGE_SCN_GPREL moet alleen worden ingesteld voor IA64-architecturen; deze vlag is niet geldig voor andere architecturen. De vlag IMAGE_SCN_GPREL is alleen bedoeld voor objectbestanden; wanneer dit sectietype wordt weergegeven in een afbeeldingsbestand, mag de vlag IMAGE_SCN_GPREL niet worden ingesteld.
.srdata
GP-relatieve alleen-lezen gegevens (vrije indeling)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL De vlag IMAGE_SCN_GPREL moet alleen worden ingesteld voor IA64-architecturen; deze vlag is niet geldig voor andere architecturen. De vlag IMAGE_SCN_GPREL is alleen bedoeld voor objectbestanden; wanneer dit sectietype wordt weergegeven in een afbeeldingsbestand, mag de vlag IMAGE_SCN_GPREL niet worden ingesteld.
.sxdata
Geregistreerde gegevens van uitzonderingshandler (alleen vrije indeling en x86/object)
IMAGE_SCN_LNK_INFO Bevat de symboolindex van elk van de uitzonderingshandlers waarnaar wordt verwezen door de code in dat objectbestand. Het symbool kan zijn voor een UNDEF-symbool of een symbool dat in die module is gedefinieerd.
.Sms
Uitvoerbare code (vrije indeling)
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
.tls
Thread-lokale opslag (alleen object)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.tls$
Thread-lokale opslag (alleen object)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.vsdata
G-relatieve geïnitialiseerde gegevens (alleen gratis indeling en voor ARM-, SH4- en duimarchitecturen)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.xdata
Uitzonderingsinformatie (vrije indeling)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

 

Sommige van de hier vermelde secties zijn gemarkeerd als 'alleen object' of 'alleen afbeelding' om aan te geven dat hun speciale semantiek alleen relevant zijn voor objectbestanden of afbeeldingsbestanden. Een sectie die als 'alleen afbeelding' is gemarkeerd, kan nog steeds worden weergegeven in een objectbestand als een manier om het afbeeldingsbestand in te gaan, maar de sectie heeft geen speciale betekenis voor de linker, alleen voor het laadprogramma voor afbeeldingsbestanden.

De sectie .debug

De sectie .debug wordt gebruikt in objectbestanden om door compiler gegenereerde foutopsporingsgegevens en in afbeeldingsbestanden alle foutopsporingsgegevens te bevatten die worden gegenereerd. In deze sectie wordt de verpakking van foutopsporingsinformatie in object- en afbeeldingsbestanden beschreven.

In de volgende sectie wordt de indeling van de map voor foutopsporing beschreven, die zich overal in de afbeelding kan bevinden. In volgende secties worden de 'groepen' beschreven in objectbestanden die foutopsporingsgegevens bevatten.

De standaardinstelling voor de linker is dat foutopsporingsinformatie niet is toegewezen aan de adresruimte van de afbeelding. Er bestaat alleen een sectie voor foutopsporing wanneer foutopsporingsinformatie is toegewezen in de adresruimte.

Foutopsporingsmap (alleen installatiekopieën)

Afbeeldingsbestanden bevatten een optionele foutopsporingsmap die aangeeft welke vorm van foutopsporingsinformatie aanwezig is en waar deze zich bevindt. Deze map bestaat uit een matrix met foutopsporingsmapvermeldingen waarvan de locatie en grootte worden aangegeven in de optionele afbeeldingskoptekst.

De map voor foutopsporing kan zich in een verwijderbare sectie voor foutopsporing bevinden (indien aanwezig) of kan worden opgenomen in een andere sectie in het afbeeldingsbestand of helemaal niet in een sectie.

Elke foutopsporingsmapvermelding identificeert de locatie en grootte van een blok met foutopsporingsgegevens. De opgegeven RVA kan nul zijn als de foutopsporingsgegevens niet worden gedekt door een sectiekoptekst (dat wil gezegd, deze zich in het afbeeldingsbestand bevindt en niet is toegewezen aan de uitvoeringsadresruimte). Als deze is toegewezen, is de RVA het adres.

Een mapvermelding voor foutopsporing heeft de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Kenmerken
Gereserveerd, moet nul zijn.
4
4
TimeDateStamp
De tijd en datum waarop de foutopsporingsgegevens zijn gemaakt.
8
2
MajorVersion
Het primaire versienummer van de foutopsporingsgegevensindeling.
10
2
MinorVersion
Het secundaire versienummer van de foutopsporingsgegevensindeling.
12
4
Type
De indeling van foutopsporingsgegevens. Dit veld biedt ondersteuning voor meerdere foutopsporingsprogramma's. Zie Foutopsporingstypevoor meer informatie.
16
4
SizeOfData
De grootte van de foutopsporingsgegevens (niet inclusief de foutopsporingsmap zelf).
20
4
AddressOfRawData
Het adres van de foutopsporingsgegevens wanneer deze worden geladen ten opzichte van de installatiekopieënbasis.
24
4
PointerToRawData
De bestandsaanwijzer naar de foutopsporingsgegevens.

 

Foutopsporingstype

De volgende waarden worden gedefinieerd voor het veld Type van de foutopsporingsmapvermelding:

Constant Waarde Beschrijving
IMAGE_DEBUG_TYPE_UNKNOWN
0
Een onbekende waarde die wordt genegeerd door alle hulpprogramma's.
IMAGE_DEBUG_TYPE_COFF
1
De COFF-foutopsporingsgegevens (regelnummers, symbooltabel en tekenreekstabel). Dit type foutopsporingsinformatie wordt ook verwezen naar velden in de bestandsheaders.
IMAGE_DEBUG_TYPE_CODEVIEW
2
De foutopsporingsgegevens van Visual C++ zijn beschikbaar.
IMAGE_DEBUG_TYPE_FPO
3
De informatie over het weglaten van de framepointer (FPO). Deze informatie vertelt het foutopsporingsprogramma hoe u niet-standaard stackframes interpreteert, die het EBP-register gebruiken voor een ander doel dan als frameaanwijzer.
IMAGE_DEBUG_TYPE_MISC
4
De locatie van HET DBG-bestand.
IMAGE_DEBUG_TYPE_EXCEPTION
5
Een kopie van de sectie .pdata.
IMAGE_DEBUG_TYPE_FIXUP
6
Gereserveerd.
IMAGE_DEBUG_TYPE_OMAP_TO_SRC
7
De toewijzing van een RVA in afbeelding aan een RVA in broninstallatiekopieën.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
De toewijzing van een RVA in broninstallatiekopieën aan een RVA in afbeelding.
IMAGE_DEBUG_TYPE_BORLAND
9
Gereserveerd voor Borland.
IMAGE_DEBUG_TYPE_RESERVED10
10
Gereserveerd.
IMAGE_DEBUG_TYPE_CLSID
11
Gereserveerd.
IMAGE_DEBUG_TYPE_REPRO
16
PE-determinisme of reproduceerbaarheid.
Ongedefinieerde
17
Foutopsporingsgegevens worden ingesloten in het PE-bestand op de locatie die is opgegeven door PointerToRawData.
Ongedefinieerde
19
Slaat crypto-hash op voor de inhoud van het symboolbestand dat wordt gebruikt om het PE/COFF-bestand te bouwen.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Uitgebreide DLL-kenmerken bits.

 

Als het veld Type is ingesteld op IMAGE_DEBUG_TYPE_FPO, zijn de onbewerkte gegevens voor foutopsporing een matrix waarin elk lid het stackframe van een functie beschrijft. Niet elke functie in het afbeeldingsbestand moet FPO-gegevens hebben gedefinieerd, ook al is het foutopsporingstype FPO. Deze functies die geen FPO-gegevens hebben, worden ervan uitgegaan dat ze normale stackframes hebben. De indeling voor FPO-gegevens is als volgt:

#define FRAME_FPO   0
#define FRAME_TRAP  1
#define FRAME_TSS   2

typedef struct _FPO_DATA {
    DWORD       ulOffStart;            // offset 1st byte of function code
    DWORD       cbProcSize;            // # bytes in function
    DWORD       cdwLocals;             // # bytes in locals/4
    WORD        cdwParams;             // # bytes in params/4
    WORD        cbProlog : 8;          // # bytes in prolog
    WORD        cbRegs   : 3;          // # regs saved
    WORD        fHasSEH  : 1;          // TRUE if SEH in func
    WORD        fUseBP   : 1;          // TRUE if EBP has been allocated
    WORD        reserved : 1;          // reserved for future use
    WORD        cbFrame  : 2;          // frame type
} FPO_DATA;

De aanwezigheid van een vermelding van het type IMAGE_DEBUG_TYPE_REPRO geeft aan dat het PE-bestand is gebouwd op een manier om determinisme of reproduceerbaarheid te bereiken. Als de invoer niet verandert, is het PE-uitvoerbestand gegarandeerd identiek, ongeacht wanneer of waar de PE wordt geproduceerd. Verschillende datum-/tijdstempelvelden in het PE-bestand worden gevuld met een deel of alle bits van een berekende hash-waarde die PE-bestandsinhoud als invoer gebruikt, en vertegenwoordigen daarom niet langer de werkelijke datum en tijd waarop een PE-bestand of gerelateerde specifieke gegevens in de PE worden geproduceerd. De onbewerkte gegevens van deze foutopsporingsvermelding zijn mogelijk leeg of bevatten een berekende hashwaarde die voorafgaat door een vier-bytewaarde die de lengte van de hash-waarde vertegenwoordigt.

Als het veld Type is ingesteld op IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, bevatten de onbewerkte gegevens voor foutopsporing uitgebreide DLL-kenmerken, naast bits die kunnen worden ingesteld in de optionele header van de afbeelding. Zie DLL-kenmerken in de sectie Optionele koptekst Windows-Specific Velden (alleen afbeelding).

Uitgebreide DLL-kenmerken

De volgende waarden worden gedefinieerd voor de uitgebreide DLL-kenmerken bits.

Constant Waarde Beschrijving
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 Afbeelding is compatibel met Control-flow Enforcement Technology (CET) Shadow Stack.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Alle vertakkingsdoelen in alle secties met afbeeldingscode worden geannoteerd met instructies voor de integriteitsbeveiliging van de forward-edge-controlestroom, zoals x86 CET-Indirect Branch Tracking (IBT) of BTI-instructies (ARM Branch Target Identification). Deze bit wordt niet gebruikt door Windows.

.debug$F (alleen object)

De gegevens in deze sectie zijn vervangen in Visual C++ versie 7.0 en hoger door een uitgebreidere set gegevens die worden verzonden naar een subsectie .debug$S.

Objectbestanden kunnen .debug$F-secties bevatten waarvan de inhoud een of meer FPO_DATA records zijn (informatie over het weglaten van frameaanwijzers). Zie 'IMAGE_DEBUG_TYPE_FPO' in Foutopsporingstype.

De linker herkent deze .debug$F records. Als er foutopsporingsgegevens worden gegenereerd, sorteert de linker de FPO_DATA records op procedure RVA en genereert een foutopsporingsmapvermelding voor deze records.

De compiler mag geen FPO-records genereren voor procedures met een standaardframeindeling.

.debug$S (alleen object)

Deze sectie bevat informatie over foutopsporing in Visual C++ (symbolische informatie).

.debug$P (alleen object)

Deze sectie bevat informatie over foutopsporing in Visual C++ (vooraf gecompileerde informatie). Dit zijn gedeelde typen tussen alle objecten die zijn gecompileerd met behulp van de vooraf gecompileerde header die met dit object is gegenereerd.

.debug$T (alleen object)

Deze sectie bevat informatie over foutopsporing in Visual C++ (type informatie).

Ondersteuning voor Microsoft-foutopsporingsgegevens

De linker voor ondersteuning van foutopsporingsinformatie:

  • Verzamelt alle relevante foutopsporingsgegevens uit de .debug$F, debug$S, .debug$Pen secties .debug$T.

  • Verwerkt die gegevens samen met de door de linker gegenereerde foutopsporingsinformatie in het PDB-bestand en maakt een mapvermelding voor foutopsporing om ernaar te verwijzen.

De sectie .drectve (alleen object)

Een sectie is een instructiesectie als de vlag IMAGE_SCN_LNK_INFO is ingesteld in de koptekst van de sectie en de naam van de .drectve sectie heeft. De linker verwijdert een .drectve sectie na het verwerken van de informatie, zodat de sectie niet wordt weergegeven in het afbeeldingsbestand dat wordt gekoppeld.

Een .drectve sectie bestaat uit een tekenreeks met tekst die kan worden gecodeerd als ANSI of UTF-8. Als de UTF-8 bytevolgordemarkering (BOM, een voorvoegsel van drie bytes dat bestaat uit 0xEF, 0xBB en 0xBF) niet aanwezig is, wordt de tekenreeks van de richtlijn geïnterpreteerd als ANSI. De tekenreeks van de instructie is een reeks linkeropties die worden gescheiden door spaties. Elke optie bevat een afbreekstreepje, de naam van de optie en elk geschikt kenmerk. Als een optie spaties bevat, moet de optie tussen aanhalingstekens staan. De sectie .drectve mag geen verplaatsingen of regelnummers hebben.

De .edata-sectie (alleen afbeelding)

De sectie gegevens exporteren, genaamd .edata, bevat informatie over symbolen waartoe andere afbeeldingen toegang hebben via dynamische koppeling. Geëxporteerde symbolen zijn over het algemeen te vinden in DLL's, maar DLL's kunnen ook symbolen importeren.

Hieronder wordt een overzicht van de algemene structuur van de exportsectie beschreven. De beschreven tabellen zijn meestal aaneengesloten in het bestand in de weergegeven volgorde (hoewel dit niet vereist is). Alleen de exportmaptabel en de exportadrestabel zijn vereist voor het exporteren van symbolen als standaard. (Een rangschikken is een export die rechtstreeks wordt geopend door de index van de exportadrestabel.) De naamwijzertabel, de rangteltabel en de exportnaamtabel bestaan allemaal ter ondersteuning van het gebruik van exportnamen.

Tabelnaam Beschrijving
Maptabel exporteren
Een tabel met slechts één rij (in tegenstelling tot de map voor foutopsporing). Deze tabel geeft de locaties en grootten van de andere exporttabellen aan.
Adrestabel exporteren
Een matrix van RVA's met geëxporteerde symbolen. Dit zijn de werkelijke adressen van de geëxporteerde functies en gegevens in de uitvoerbare code en gegevenssecties. Andere afbeeldingsbestanden kunnen een symbool importeren met behulp van een index in deze tabel (een rangtelwoord) of, optioneel, met behulp van de openbare naam die overeenkomt met het rangnummer als een openbare naam is gedefinieerd.
Naam aanwijzertabel
Een matrix met aanwijzers naar de openbare exportnamen, gesorteerd in oplopende volgorde.
Rangschikktabel
Een matrix van de rangtelwoorden die overeenkomen met leden van de tabel naamaanwijzer. De correspondentie is per positie; Daarom moeten de tabel met de naamwijzer en de rangschikkertabel hetzelfde aantal leden hebben. Elke rangschikk is een index in de exportadrestabel.
Naamtabel exporteren
Een reeks ascii-tekenreeksen die door null zijn beëindigd. Leden van de naam aanwijzertabel wijzen in dit gebied. Deze namen zijn de openbare namen waarmee de symbolen worden geïmporteerd en geëxporteerd; ze zijn niet noodzakelijkerwijs hetzelfde als de privénamen die in het afbeeldingsbestand worden gebruikt.

 

Wanneer een ander afbeeldingsbestand een symbool op naam importeert, zoekt het Win32-laadprogramma de tabel met de naamaanwijzer naar een overeenkomende tekenreeks. Als er een overeenkomende tekenreeks wordt gevonden, wordt de bijbehorende rangschikker geïdentificeerd door het bijbehorende lid in de rangteltabel op te zoeken (dat wil gezegd het lid van de rangteltabel met dezelfde index als de tekenreekspointer die in de tabel met de naamwijzer is gevonden). Het resulterende rangnummer is een index in de exportadrestabel, die de werkelijke locatie van het gewenste symbool geeft. Elk exportsymbool kan worden geopend door een rangschikken.

Wanneer een ander afbeeldingsbestand een symbool importeert op rangtelwoord, is het niet nodig om te zoeken in de tabel met de naamwijzer voor een overeenkomende tekenreeks. Direct gebruik van een rangtel is daarom efficiënter. Een exportnaam is echter gemakkelijker te onthouden en vereist niet dat de gebruiker de tabelindex voor het symbool kent.

Maptabel exporteren

De exportsymboolgegevens beginnen met de exportmaptabel, waarin de rest van de exportsymboolgegevens wordt beschreven. De exportmaptabel bevat adresgegevens die worden gebruikt om importbewerkingen naar de toegangspunten in deze afbeelding op te lossen.

Afstand Grootte Veld Beschrijving
0
4
Vlaggen exporteren
Gereserveerd, moet 0 zijn.
4
4
Tijd-/datumstempel
De tijd en datum waarop de exportgegevens zijn gemaakt.
8
2
Primaire versie
Het primaire versienummer. De primaire en secundaire versienummers kunnen door de gebruiker worden ingesteld.
10
2
Secundaire versie
Het secundaire versienummer.
12
4
Naam RVA
Het adres van de ASCII-tekenreeks die de naam van het DLL-bestand bevat. Dit adres is relatief ten opzichte van de basis van de installatiekopieën.
16
4
Ranglijnbasis
Het beginnummer voor export in deze afbeelding. In dit veld wordt het beginnummer voor de exportadrestabel opgegeven. Het is meestal ingesteld op 1.
20
4
Adrestabelvermeldingen
Het aantal vermeldingen in de exportadrestabel.
24
4
Aantal aanwijzers voor naam
Het aantal vermeldingen in de tabel met de naam aanwijzer. Dit is ook het aantal vermeldingen in de rangteltabel.
28
4
Adrestabel EXPORTEREN RVA
Het adres van de exportadrestabel ten opzichte van de basis van de installatiekopieën.
32
4
Naam aanwijzer RVA
Het adres van de tabel exportnaam aanwijzer, ten opzichte van de basis van de installatiekopieën. De tabelgrootte wordt opgegeven door het veld Aantal aanwijzers.
36
4
Ordinale tabel RVA
Het adres van de rangteltabel ten opzichte van de basis van de afbeelding.

 

Adrestabel exporteren

De exportadrestabel bevat het adres van geëxporteerde toegangspunten en geëxporteerde gegevens en absolute waarden. Een rangnummer wordt gebruikt als index in de tabel met exportadressen.

Elke vermelding in de exportadrestabel is een veld dat een van de twee indelingen in de volgende tabel gebruikt. Als het opgegeven adres zich niet in de exportsectie bevindt (zoals gedefinieerd door het adres en de lengte die worden aangegeven in de optionele header), is het veld een export RVA, een werkelijk adres in code of gegevens. Anders is het veld een doorstuurserver RVA, die een symbool in een andere DLL noemt.

Afstand Grootte Veld Beschrijving
0
4
RVA exporteren
Het adres van het geëxporteerde symbool wanneer het in het geheugen wordt geladen ten opzichte van de basis van de installatiekopieën. Bijvoorbeeld het adres van een geëxporteerde functie.
0
4
Doorstuurserver RVA
De aanwijzer naar een ascii-tekenreeks die door null is beëindigd in de exportsectie. Deze tekenreeks moet zich binnen het bereik bevinden dat wordt opgegeven door de gegevensmapvermelding voor de exporttabel. Zie optionele headergegevensmappen (alleen afbeelding). Deze tekenreeks geeft de DLL-naam en de naam van de export (bijvoorbeeld 'MYDLL.expfunc') of de DLL-naam en het rangnummer van de export (bijvoorbeeld 'MYDLL.#27').

 

Een doorstuurserver RVA exporteert een definitie uit een andere afbeelding, waardoor deze lijkt alsof deze door de huidige afbeelding wordt geëxporteerd. Het symbool wordt dus tegelijkertijd geïmporteerd en geëxporteerd.

In Kernel32.dll in Windows XP wordt de export met de naam HeapAlloc bijvoorbeeld doorgestuurd naar de tekenreeks NTDLL. RtlAllocateHeap." Hierdoor kunnen toepassingen gebruikmaken van de windows XP-specifieke module Ntdll.dll zonder dat er daadwerkelijk importverwijzingen naar worden gebruikt. De importtabel van de toepassing verwijst alleen naar Kernel32.dll. Daarom is de toepassing niet specifiek voor Windows XP en kan deze worden uitgevoerd op elk Win32-systeem.

Tabel naam aanwijzer exporteren

De tabel exportnaamaanwijzer is een matrix met adressen (RVA's) in de exportnaamtabel. De aanwijzers zijn elk 32 bits en zijn relatief ten opzichte van de basis van de installatiekopieën. De aanwijzers worden lexisch geordend om binaire zoekopdrachten toe te staan.

Er wordt alleen een exportnaam gedefinieerd als de tabel met de exportnaamaanwijzer een aanwijzer bevat.

Rangschikktabel exporteren

De export ordinale tabel is een matrix van 16-bits ongevoorbeerde indexen in de exportadrestabel. De rangtelwoorden worden bepaald door het ordinale basisveld van de exportmaptabel. Met andere woorden, de ordinale basis moet worden afgetrokken van de ordinalen om werkelijke indexen te verkrijgen in de exportadrestabel.

De tabel met de exportnaam en de exportordinale tabel vormen twee parallelle matrices die zijn gescheiden om uitlijning van natuurlijke velden mogelijk te maken. Deze twee tabellen werken in feite als één tabel, waarin de kolom Export name Pointer verwijst naar een openbare (geëxporteerde) naam en de kolom Export ordinaal geeft de bijbehorende rangschikker voor die openbare naam. Een lid van de tabel exportnaamaanwijzer en een lid van de exportordinale tabel worden gekoppeld door dezelfde positie (index) in hun respectieve matrices te hebben.

Wanneer de tabel met de exportnaamaanwijzer wordt doorzocht en er een overeenkomende tekenreeks wordt gevonden op positie i, is het algoritme voor het vinden van de RVA van het symbool en de vooringenomen rangschikken:

i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];

rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;

Bij het zoeken naar een symbool met (vertekend) rangschikken, is het algoritme voor het vinden van de RVA van het symbool en de naam:

ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);

rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];

Naamtabel exporteren

De tabel met de exportnaam bevat de werkelijke tekenreeksgegevens waarnaar is verwezen door de tabel exportnaam aanwijzer. De tekenreeksen in deze tabel zijn openbare namen die andere afbeeldingen kunnen gebruiken om de symbolen te importeren. Deze openbare exportnamen zijn niet noodzakelijkerwijs hetzelfde als de namen van privésymbolen die de symbolen hebben in hun eigen afbeeldingsbestand en broncode, hoewel dit wel mogelijk is.

Elk geëxporteerd symbool heeft een rangtelwaarde, die alleen de index in de exportadrestabel is. Het gebruik van exportnamen is echter optioneel. Sommige, alle of geen van de geëxporteerde symbolen kunnen exportnamen hebben. Voor geëxporteerde symbolen die wel exportnamen hebben, werken overeenkomstige vermeldingen in de tabel exportnaamaanwijzer en de rangschikkentabel samen om elke naam te koppelen aan een rangtelwoord.

De structuur van de exportnaamtabel is een reeks ascii-tekenreeksen met variabele lengte die null-beëindigd zijn.

De sectie .idata

Alle afbeeldingsbestanden die symbolen importeren, inclusief vrijwel alle uitvoerbare (EXE)-bestanden, hebben een .idata-sectie. Een typische bestandsindeling voor de importgegevens volgt:

  • Maptabel

    Null-mapvermelding

  • DLL1 Opzoektabel importeren

    Nul

  • DLL2 Opzoektabel importeren

    Nul

  • DLL3 Opzoektabel importeren

    Nul

  • Hint-Name tabel

Maptabel importeren

De importgegevens beginnen met de importmaptabel, waarin de rest van de importgegevens wordt beschreven. De importmaptabel bevat adresgegevens die worden gebruikt om fixupverwijzingen naar de toegangspunten in een DLL-installatiekopieën op te lossen. De importmaptabel bestaat uit een matrix met importmapvermeldingen, één vermelding voor elke DLL waarnaar de afbeelding verwijst. De laatste mapvermelding is leeg (gevuld met null-waarden), wat het einde van de maptabel aangeeft.

Elke importmapvermelding heeft de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Opzoektabel RVA importeren (kenmerken)
De RVA van de importzoektabel. Deze tabel bevat een naam of rangschikk voor elke import. (De naam 'Kenmerken' wordt gebruikt in Winnt.h, maar beschrijft dit veld niet meer.)
4
4
Tijd-/datumstempel
De stempel die is ingesteld op nul totdat de afbeelding is gebonden. Nadat de afbeelding is gebonden, is dit veld ingesteld op de tijd-/gegevensstempel van het DLL-bestand.
8
4
Doorstuurketen
De index van de eerste doorstuurserverreferentie.
12
4
Naam RVA
Het adres van een ASCII-tekenreeks die de naam van het DLL-bestand bevat. Dit adres is relatief ten opzichte van de basis van de installatiekopieën.
16
4
Import Address Table RVA (Thunk Table)
De RVA van de importadrestabel. De inhoud van deze tabel is identiek aan de inhoud van de opzoektabel importeren totdat de afbeelding is gebonden.

 

Opzoektabel importeren

Een opzoektabel importeren is een matrix van 32-bits getallen voor PE32 of een matrix van 64-bits getallen voor PE32+. Elke vermelding maakt gebruik van de bitveldindeling die wordt beschreven in de volgende tabel. In deze indeling is bit 31 de belangrijkste bit voor PE32 en bit 63 is de belangrijkste bit voor PE32+. In de verzameling van deze vermeldingen worden alle importbewerkingen uit een bepaald DLL-bestand beschreven. De laatste vermelding is ingesteld op nul (NULL) om het einde van de tabel aan te geven.

Bit(en) Grootte Bitveld Beschrijving
31/63
1
Rangtelwoord/naamvlag
Als deze bit is ingesteld, importeert u deze op rangtelwoord. Anders importeert u op naam. Bit wordt gemaskeerd als 0x80000000 voor PE32, 0x8000000000000000 voor PE32+.
15-0
16
Rangtelwoord
Een 16-bits rangnummer. Dit veld wordt alleen gebruikt als het bitveld Ordinaal/Name Flag 1 is (import by ordinaal). Bits 30-15 of 62-15 moeten 0 zijn.
30-0
31
Hint/naam tabel RVA
Een 31-bits RVA van een hint-/naamtabelvermelding. Dit veld wordt alleen gebruikt als het bitveld Ordinaal/Naamvlag 0 is (importeren op naam). Voor PE32+ bits moet 62-31 nul zijn.

 

Hint-/naamtabel

Eén hint-/naamtabel volstaat voor de hele importsectie. Elke vermelding in de tabel hint/naam heeft de volgende indeling:

Afstand Grootte Veld Beschrijving
0
2
Tip
Een index in de tabel met de exportnaamaanwijzer. Er wordt eerst geprobeerd een overeenkomst te vinden met deze waarde. Als dit mislukt, wordt een binaire zoekopdracht uitgevoerd in de tabel met exportnamen van het DLL-bestand.
2
veranderlijk
Naam
Een ASCII-tekenreeks die de naam bevat die moet worden geïmporteerd. Dit is de tekenreeks die moet worden vergeleken met de openbare naam in het DLL-bestand. Deze tekenreeks is hoofdlettergevoelig en wordt beëindigd door een null-byte.
*
0 of 1
Opvullen
Een volg-nul-pad-byte die wordt weergegeven na de afsluitende null-byte, indien nodig, om de volgende vermelding op een even grens uit te lijnen.

 

Adrestabel importeren

De structuur en inhoud van de importadrestabel zijn identiek aan die van de importzoektabel totdat het bestand is gebonden. Tijdens de binding worden de vermeldingen in de importadrestabel overschreven met de 32-bits (voor PE32) of 64-bits (voor PE32+) adressen van de symbolen die worden geïmporteerd. Deze adressen zijn de werkelijke geheugenadressen van de symbolen, hoewel ze technisch gezien nog steeds 'virtuele adressen' worden genoemd. Het laadprogramma verwerkt doorgaans de binding.

De sectie .pdata

De sectie .pdata bevat een matrix met functietabelvermeldingen die worden gebruikt voor het verwerken van uitzonderingen. Deze wordt verwezen naar de vermelding in de uitzonderingstabel in de map met afbeeldingsgegevens. De vermeldingen moeten worden gesorteerd op basis van de functieadressen (het eerste veld in elke structuur) voordat ze in de uiteindelijke afbeelding worden verzonden. Het doelplatform bepaalt welke van de drie variaties in de tabelindeling van de functietabel die hieronder worden beschreven, wordt gebruikt.

Voor 32-bits MIPS-installatiekopieën hebben functietabelvermeldingen de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Beginadres
De VA van de bijbehorende functie.
4
4
Eindadres
De VA van het einde van de functie.
8
4
Uitzonderingshandler
De aanwijzer naar de uitzonderingshandler die moet worden uitgevoerd.
12
4
Handlergegevens
De aanwijzer naar aanvullende informatie die moet worden doorgegeven aan de handler.
16
4
Eindadres van Prolog
De VA van het einde van de prolog van de functie.

 

Voor de ARM-, PowerPC-, SH3- en SH4 Windows CE-platforms hebben functietabelvermeldingen de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Beginadres
De VA van de bijbehorende functie.
4
8 bits
Lengte van Prolog
Het aantal instructies in de prolog van de functie.
4
22 bits
Functielengte
Het aantal instructies in de functie.
4
1 bits
32-bits vlag
Als de functie is ingesteld, bestaat deze uit 32-bits instructies. Indien duidelijk, bestaat de functie uit 16-bits instructies.
4
1 bits
Uitzonderingsvlag
Als deze optie is ingesteld, bestaat er een uitzonderingshandler voor de functie. Anders bestaat er geen uitzonderingshandler.

 

Voor x64- en Itanium-platforms hebben functietabelvermeldingen de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Beginadres
De RVA van de overeenkomstige functie.
4
4
Eindadres
De RVA van het einde van de functie.
8
4
Informatie tot rust laten komen
De RVA van de ontspannen informatie.

 

De sectie .reloc (alleen afbeelding)

De tabel basisverplaatsing bevat vermeldingen voor alle basisverplaatsingen in de afbeelding. Het veld Tabel basisverplaatsing in de optionele headergegevensmappen geeft het aantal bytes in de basisverplaatsingstabel. Zie Optionele headergegevensmappen (alleen afbeelding)voor meer informatie. De basisverplaatsingstabel is onderverdeeld in blokken. Elk blok vertegenwoordigt de basisverplaatsingen voor een 4K-pagina. Elk blok moet beginnen op een 32-bits grens.

Het laadprogramma is niet vereist voor het verwerken van basisverplaatsingen die worden opgelost door de linker, tenzij de laadinstallatiekopieën niet kunnen worden geladen op de basis van de installatiekopieën die zijn opgegeven in de PE-header.

Basisverplaatsingsblok

Elk basisverplaatsingsblok begint met de volgende structuur:

Afstand Grootte Veld Beschrijving
0
4
Pagina RVA
De afbeeldingsbasis plus de pagina RVA wordt toegevoegd aan elke offset om de VA te maken waar de basisverplaatsing moet worden toegepast.
4
4
Blokgrootte
Het totale aantal bytes in het basisverplaatsingsblok, inclusief de velden Pagina RVA en Blokgrootte en de velden Type/Verschuiving die volgen.

 

Het veld Blokgrootte wordt gevolgd door een willekeurig aantal velditems type of verschuiving. Elke vermelding is een WORD (2 bytes) en heeft de volgende structuur:

Afstand Grootte Veld Beschrijving
0
4 bits
Type
Opgeslagen in de hoge 4 bits van word, een waarde die aangeeft welk type basisverplaatsing moet worden toegepast. Zie Basisverplaatsingstypenvoor meer informatie.
0
12 bits
Afstand
Opgeslagen in de resterende 12 bits van word, een verschuiving van het beginadres dat is opgegeven in het veld Pagina RVA voor het blok. Deze offset geeft aan waar de basisverplaatsing moet worden toegepast.

 

Als u een basisverplaatsing wilt toepassen, wordt het verschil berekend tussen het voorkeursbasisadres en de basis waarop de afbeelding daadwerkelijk wordt geladen. Als de installatiekopieën op de voorkeursbasis worden geladen, is het verschil nul en hoeven de basisverplaatsingen dus niet te worden toegepast.

Basisverplaatsingstypen

Constant Waarde Beschrijving
IMAGE_REL_BASED_ABSOLUTE
0
De basisverplaatsing wordt overgeslagen. Dit type kan worden gebruikt om een blok te kussen.
IMAGE_REL_BASED_HIGH
1
De basisverplaatsing voegt de hoge 16 bits van het verschil toe aan het 16-bits veld bij verschuiving. Het 16-bits veld vertegenwoordigt de hoge waarde van een 32-bits woord.
IMAGE_REL_BASED_LOW
2
De basisverplaatsing voegt de lage 16 bits van het verschil toe aan het 16-bits veld bij verschuiving. Het 16-bits veld vertegenwoordigt de lage helft van een 32-bits woord.
IMAGE_REL_BASED_HIGHLOW
3
De basisverplaatsing past alle 32 bits van het verschil toe op het 32-bits veld bij verschuiving.
IMAGE_REL_BASED_HIGHADJ
4
De basisverplaatsing voegt de hoge 16 bits van het verschil toe aan het 16-bits veld bij verschuiving. Het 16-bits veld vertegenwoordigt de hoge waarde van een 32-bits woord. De lage 16 bits van de 32-bits waarde worden opgeslagen in het 16-bits woord dat volgt op deze basisverplaatsing. Dit betekent dat deze basisverplaatsing twee sleuven in beslag neemt.
IMAGE_REL_BASED_MIPS_JMPADDR
5
De interpretatie van herlocatie is afhankelijk van het machinetype.
Wanneer het machinetype MIPS is, is de basisverplaatsing van toepassing op een MIPS-jumpinstructie.
IMAGE_REL_BASED_ARM_MOV32
5
Deze verplaatsing is alleen zinvol wanneer het machinetype ARM of Duim is. De basisverplaatsing past het 32-bits adres van een symbool toe op een opeenvolgend MOVW/MOVT instructiepaar.
IMAGE_REL_BASED_RISCV_HIGH20
5
Deze verplaatsing is alleen zinvol wanneer het machinetype RISC-V is. De basisverplaatsing is van toepassing op de hoge 20 bits van een 32-bits absoluut adres.
6
Gereserveerd, moet nul zijn.
IMAGE_REL_BASED_THUMB_MOV32
7
Deze verplaatsing is alleen zinvol wanneer het machinetype Thumb is. De basisverplaatsing past het 32-bits adres van een symbool toe op een opeenvolgend MOVW/MOVT instructiepaar.
IMAGE_REL_BASED_RISCV_LOW12I
7
Deze verplaatsing is alleen zinvol wanneer het machinetype RISC-V is. De basisverplaatsing is van toepassing op de lage 12 bits van een 32-bits absoluut adres dat is gevormd in RISC-V I-type instructieindeling.
IMAGE_REL_BASED_RISCV_LOW12S
8
Deze verplaatsing is alleen zinvol wanneer het machinetype RISC-V is. De basisverplaatsing is van toepassing op de lage 12 bits van een 32-bits absoluut adres dat is gevormd in RISC-V S-type instructieindeling.
IMAGE_REL_BASED_LOONGARCH32_MARK_LA
8
Deze verplaatsing is alleen zinvol wanneer het machinetype LoongArch 32-bits is. De basisverplaatsing is van toepassing op een 32-bits absoluut adres dat is gevormd in twee opeenvolgende instructies.
IMAGE_REL_BASED_LOONGARCH64_MARK_LA
8
Deze verplaatsing is alleen zinvol wanneer het machinetype LoongArch 64-bits is. De basisverplaatsing is van toepassing op een 64-bits absoluut adres dat is gevormd in vier opeenvolgende instructies.
IMAGE_REL_BASED_MIPS_JMPADDR16
9
De verplaatsing is alleen zinvol wanneer het machinetype MIPS is. De basisverplaatsing is van toepassing op een MIPS16-jumpinstructie.
IMAGE_REL_BASED_DIR64
10
De basisverplaatsing past het verschil toe op het 64-bits veld bij verschuiving.

 

De sectie .tls

De sectie .tls biedt directe PE- en COFF-ondersteuning voor lokale opslag voor statische threads (TLS). TLS is een speciale opslagklasse die door Windows wordt ondersteund, waarbij een gegevensobject geen automatische variabele (stack) is, maar lokaal is voor elke afzonderlijke thread waarmee de code wordt uitgevoerd. Daarom kan elke thread een andere waarde onderhouden voor een variabele die is gedeclareerd met behulp van TLS.

Houd er rekening mee dat elke hoeveelheid TLS-gegevens kan worden ondersteund met behulp van de API-aanroepen TlsAlloc, TlsFree, TlsSetValue en TlsGetValue. De PE- of COFF-implementatie is een alternatieve benadering voor het gebruik van de API en heeft het voordeel dat het eenvoudiger is vanuit het oogpunt van programmeurs op hoog niveau. Met deze implementatie kunnen TLS-gegevens worden gedefinieerd en geïnitialiseerd op dezelfde manier als gewone statische variabelen in een programma. In Visual C++ kan bijvoorbeeld een statische TLS-variabele als volgt worden gedefinieerd, zonder de Windows-API te gebruiken:

__declspec (thread) int tlsFlag = 1;

Ter ondersteuning van deze programmeerconstructie geeft de sectie PE en COFF .tls de volgende informatie op: initialisatiegegevens, callback-routines voor initialisatie en beëindiging per thread en de TLS-index, die worden uitgelegd in de volgende discussie.

Notitie

VoorDat Windows Vista statisch gedeclareerd TLS-gegevensobjecten kan alleen worden gebruikt in statisch geladen afbeeldingsbestanden. Dit maakt het onbetrouwbaar om statische TLS-gegevens in een DLL te gebruiken, tenzij u weet dat het DLL-bestand, of iets dat statisch is gekoppeld, nooit dynamisch wordt geladen met de loadlibrary-API-functie. Vanaf Windows Vista zijn echter verbeteringen aangebracht in het Windows-laadprogramma om het dynamisch laden van DLL's met statische TLS beter te ondersteunen. Deze wijziging betekent dat DLL's met statisch gedeclareerde TLS-gegevensobjecten nu betrouwbaarder kunnen worden gebruikt, zelfs als ze dynamisch worden geladen met behulp van LoadLibrary. Het laadprogramma kan TLS-sleuven toewijzen voor dergelijke DLL's tijdens de laadtijd, waarbij de beperkingen in eerdere versies van Windows worden beperkt.

 

Notitie

Verwijzingen naar 32-bits offsets en index-vermenigvuldigers van 4 zijn van toepassing op systemen met 32-bits architecturen. Pas deze indien nodig aan in een systeem op basis van 64-bits architecturen.

Uitvoerbare code opent een statisch TLS-gegevensobject via de volgende stappen:

  1. Tijdens het koppelen stelt de linker het veld Adres van index van de TLS-map in. Dit veld verwijst naar een locatie waar het programma verwacht de TLS-index te ontvangen.

    De Microsoft-runtimebibliotheek faciliteert dit proces door een geheugenafbeelding van de TLS-directory te definiëren en deze de speciale naam '__tls_used' (Intel x86-platformen) of '_tls_used' (andere platforms) te geven. De linker zoekt naar deze geheugeninstallatiekopieën en gebruikt de gegevens daar om de TLS-map te maken. Andere compilers die TLS ondersteunen en met de Microsoft Linker werken, moeten dezelfde techniek gebruiken.

  2. Wanneer een thread wordt gemaakt, communiceert het laadprogramma het adres van de TLS-matrix van de thread door het adres van het threadomgevingsblok (TEB) in de FS-register (voor x86) of GS (voor x64) te plaatsen. Een aanwijzer naar de TLS-matrix bevindt zich op de verschuiving van 0x2C vanaf het begin van TEB. Dit gedrag is specifiek voor Intel x86.

  3. Het laadprogramma wijst de waarde van de TLS-index toe aan de plaats die is aangegeven door het veld Adres van index.

  4. De uitvoerbare code haalt de TLS-index en ook de locatie van de TLS-matrix op.

  5. De code maakt gebruik van de TLS-index en de TLS-matrixlocatie (waarbij de index wordt vermenigvuldigd met 4 en gebruikt als offset voor de matrix) om het adres van het TLS-gegevensgebied voor het opgegeven programma en de module op te halen. Elke thread heeft een eigen TLS-gegevensgebied, maar dit is transparant voor het programma, dat niet hoeft te weten hoe gegevens worden toegewezen voor afzonderlijke threads.

  6. Een afzonderlijk TLS-gegevensobject wordt geopend als een vaste offset in het TLS-gegevensgebied.

De TLS-matrix is een matrix met adressen die het systeem voor elke thread onderhoudt. Elk adres in deze matrix geeft de locatie van TLS-gegevens voor een bepaalde module (EXE of DLL) in het programma. De TLS-index geeft aan welk lid van de matrix moet worden gebruikt. De index is een getal (alleen zinvol voor het systeem) waarmee de module wordt geïdentificeerd.

De TLS-map

De TLS-map heeft de volgende indeling:

Verschuiving (PE32/ PE32+) Grootte (PE32/ PE32+) Veld Beschrijving
0
4/8
Onbewerkte gegevens starten VA
Het beginadres van de TLS-sjabloon. De sjabloon is een blok met gegevens dat wordt gebruikt om TLS-gegevens te initialiseren. Het systeem kopieert al deze gegevens telkens wanneer een thread wordt gemaakt, zodat deze niet beschadigd mag zijn. Houd er rekening mee dat dit adres geen RVA is; het is een adres waarvoor een basisverplaatsing in de sectie .reloc moet zijn.
4/8
4/8
Onbewerkte gegevens einde VA
Het adres van de laatste byte van de TLS, met uitzondering van de opvulling nul. Net als bij het veld Raw Data Start VA is dit een VA, geen RVA.
8/16
4/8
Adres van index
De locatie voor het ontvangen van de TLS-index, die door het laadprogramma wordt toegewezen. Deze locatie bevindt zich in een gewone gegevenssectie, zodat deze een symbolische naam kan krijgen die toegankelijk is voor het programma.
12/24
4/8
Adres van callbacks
De aanwijzer naar een matrix met TLS-callbackfuncties. De matrix is null-beëindigd, dus als er geen callback-functie wordt ondersteund, verwijst dit veld naar 4 bytes ingesteld op nul. Zie TLS Callback Functionsvoor meer informatie over het prototype voor deze functies.
16/32
4
Grootte van nul opvulling
De grootte in bytes van de sjabloon, naast de geïnitialiseerde gegevens die zijn gescheiden door de velden Begin van onbewerkte gegevens en Einde VA van onbewerkte gegevens. De totale sjabloongrootte moet gelijk zijn aan de totale grootte van TLS-gegevens in het afbeeldingsbestand. De nulvulling is de hoeveelheid gegevens die na de geïnitialiseerde niet-nulgegevens komt.
20/36
4
Kenmerken
De vier bits [23:20] beschrijven uitlijningsgegevens. Mogelijke waarden zijn de waarden die zijn gedefinieerd als IMAGE_SCN_ALIGN_*, die ook worden gebruikt om de uitlijning van secties in objectbestanden te beschrijven. De andere 28 bits zijn gereserveerd voor toekomstig gebruik.

 

TLS-callbackfuncties

Het programma kan een of meer TLS-callbackfuncties bieden ter ondersteuning van aanvullende initialisatie en beëindiging voor TLS-gegevensobjecten. Een typisch gebruik voor een dergelijke callback-functie is het aanroepen van constructors en destructors voor objecten.

Hoewel er doorgaans niet meer dan één callback-functie is, wordt een callback geïmplementeerd als een matrix om het mogelijk te maken om indien gewenst extra callbackfuncties toe te voegen. Als er meer dan één callback-functie is, wordt elke functie aangeroepen in de volgorde waarin het adres in de matrix wordt weergegeven. Een null-aanwijzer beëindigt de matrix. Het is perfect geldig om een lege lijst te hebben (geen callback ondersteund), in welk geval de callbackmatrix precies één lid-een null-aanwijzer heeft.

Het prototype voor een callback-functie (die wordt verwezen door een aanwijzer van het type PIMAGE_TLS_CALLBACK) heeft dezelfde parameters als een DLL-invoerpuntfunctie:

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

De gereserveerde parameter moet worden ingesteld op nul. De parameter Reason kan de volgende waarden aannemen:

Montuur Waarde Beschrijving
DLL_PROCESS_ATTACH
1
Er is een nieuw proces gestart, inclusief de eerste thread.
DLL_THREAD_ATTACH
2
Er is een nieuwe thread gemaakt. Deze melding is verzonden voor alle threads, behalve voor de eerste thread.
DLL_THREAD_DETACH
3
Een thread staat op het punt om te worden beëindigd. Deze melding is verzonden voor alle threads, behalve voor de eerste thread.
DLL_PROCESS_DETACH
0
Een proces staat op het punt om te beëindigen, inclusief de oorspronkelijke thread.

 

De structuur van de belastingconfiguratie (alleen installatiekopieën)

De belastingconfiguratiestructuur (IMAGE_LOAD_CONFIG_DIRECTORY) werd voorheen gebruikt in zeer beperkte gevallen in het Windows NT-besturingssysteem zelf om verschillende functies te moeilijk of te groot te beschrijven in de bestandskoptekst of optionele header van de afbeelding. Huidige versies van de Microsoft linker en Windows XP en latere versies van Windows gebruiken een nieuwe versie van deze structuur voor 32-bits x86-systemen die gereserveerde SEH-technologie bevatten. Dit biedt een lijst met veilige gestructureerde uitzonderingshandlers die door het besturingssysteem worden gebruikt tijdens het verzenden van uitzonderingen. Als het handleradres zich in het VA-bereik van een afbeelding bevindt en is gemarkeerd als gereserveerde SEH-bewust (dat wil zeggen, is IMAGE_DLLCHARACTERISTICS_NO_SEH duidelijk in het veld DllCharacteristics van de optionele header, zoals eerder beschreven), moet de handler in de lijst met bekende veilige handlers voor die afbeelding staan. Anders beëindigt het besturingssysteem de toepassing. Dit helpt voorkomen dat de exploit 'x86 exception handler hijacking' die in het verleden is gebruikt om de controle over het besturingssysteem te nemen.

De Microsoft Linker biedt automatisch een standaardconfiguratiestructuur voor belasting om de gereserveerde SEH-gegevens op te nemen. Als de gebruikerscode al een configuratiestructuur voor belasting biedt, moet deze de nieuwe gereserveerde SEH-velden bevatten. Anders kan de linker de gereserveerde SEH-gegevens niet bevatten en wordt de afbeelding niet gemarkeerd als met gereserveerde SEH.

Configuratiemap laden

De gegevensmapvermelding voor een vooraf gereserveerde SEH-belastingconfiguratiestructuur moet een bepaalde grootte van de belastingconfiguratiestructuur opgeven, omdat het besturingssysteemlaadprogramma altijd verwacht dat het een bepaalde waarde is. In dat opzicht is de grootte eigenlijk alleen een versiecontrole. Voor compatibiliteit met Windows XP en eerdere versies van Windows moet de grootte 64 zijn voor x86-installatiekopieën.

Indeling van belastingconfiguratie

De structuur van de belastingconfiguratie heeft de volgende indeling voor 32-bits en 64-bits PE-bestanden:

Afstand Grootte Veld Beschrijving
0
4
Kenmerken
Vlaggen die kenmerken van het bestand aangeven, die momenteel niet worden gebruikt.
4
4
TimeDateStamp
Datum- en tijdstempelwaarde. De waarde wordt weergegeven in het aantal seconden dat is verstreken sinds middernacht (00:00:00), 1 januari 1970, Universal Coordinated Time, volgens de systeemklok. De tijdstempel kan worden afgedrukt met behulp van de C Runtime-tijdfunctie (CRT).
8
2
MajorVersion
Primaire versienummer.
10
2
MinorVersion
Secundair versienummer.
12
4
GlobalFlags Clear
De globale laadlaadvlagken die voor dit proces moeten worden gewist wanneer het laadprogramma het proces start.
16
4
GlobalFlagsSet
De globale laadlaadvlagken die voor dit proces moeten worden ingesteld wanneer het laadprogramma het proces start.
20
4
CriticalSectionDefaultTimeout
De standaardtime-outwaarde die moet worden gebruikt voor de kritieke secties van dit proces die worden afgelaten.
24
4/8
DeCommitFreeBlockThreshold
Geheugen dat moet worden vrijgemaakt voordat het wordt geretourneerd naar het systeem, in bytes.
28/32
4/8
DeCommitTotalFreeThreshold
Totale hoeveelheid vrij geheugen, in bytes.
32/40
4/8
LockPrefixTable
[alleen x86] De VA van een lijst met adressen waarin het LOCK-voorvoegsel wordt gebruikt, zodat ze kunnen worden vervangen door NOP op één processorcomputer.
36/48
4/8
MaximumAllocationSize
Maximale toewijzingsgrootte, in bytes.
40/56
4/8
VirtualMemoryThreshold
Maximale grootte van virtueel geheugen, in bytes.
44/64
4/8
ProcessAffinityMask
Het instellen van dit veld op een niet-nulwaarde is gelijk aan het aanroepen van SetProcessAffinityMask met deze waarde tijdens het opstarten van het proces (alleen.exe)
48/72
4
ProcessHeapFlags
Heap-vlaggen verwerken die overeenkomen met het eerste argument van de functie HeapCreate. Deze vlaggen zijn van toepassing op de proces-heap die wordt gemaakt tijdens het opstarten van het proces.
52/76
2
CSDVersion
De versie-id van het servicepack.
54/78
2
DependentLoadFlags
De standaardlaadvlagmen die worden gebruikt wanneer het besturingssysteem de statisch gekoppelde importbewerkingen van een module oplost.
56/80
4/8
EditList
Gereserveerd voor gebruik door het systeem.
60/88
4/8
SecurityCookie
Een aanwijzer naar een cookie die wordt gebruikt door Visual C++ of GS-implementatie.
64/96
4/8
SEHandlerTable
[alleen x86] De VA van de gesorteerde tabel met RVA's van elke geldige, unieke SE-handler in de afbeelding.
68/104
4/8
SEHandlerCount
[alleen x86] Het aantal unieke handlers in de tabel.
72/112
4/8
GuardCFCheckFunctionPointer
De VA waar de controlefunctiepointer van Flow Guard wordt opgeslagen.
76/120
4/8
GuardCFDispatchFunctionPointer
De VA waar de dispatchfunctiepointer van Control Flow Guard wordt opgeslagen.
80/128
4/8
GuardCFFunctionTable
De VA van de gesorteerde tabel met RVA's van elke functie Control Flow Guard in de afbeelding.
84/136
4/8
GuardCFFunctionCount
Het aantal unieke RVA's in de bovenstaande tabel.
88/144
4
GuardFlags
Gerelateerde vlaggen voor Flow Guard beheren.
92/148
12
CodeIntegrity
Informatie over code-integriteit.
104/160
4/8
GuardAddressTakenIatEntryTable
De VA waar het IAT-adres van Control Flow Guard is opgeslagen.
108/168
4/8
GuardAddressTakenIatEntryCount
Het aantal unieke RVA's in de bovenstaande tabel.
112/176
4/8
GuardLongJumpTargetTable
De VA waar de long jump doeltabel van Control Flow Guard wordt opgeslagen.
116/184
4/8
GuardLongJumpTargetCount
Het aantal unieke RVA's in de bovenstaande tabel.

 

Het veld GuardFlags bevat een combinatie van een of meer van de volgende vlaggen en subvelden:

  • Module voert controlestroomintegriteitscontroles uit met behulp van door het systeem geleverde ondersteuning.

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • Module voert controlestroom- en schrijfintegriteitscontroles uit.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • Module bevat geldige metagegevens van controlestroomdoel.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • Module maakt geen gebruik van de /GS-beveiligingscooky.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • Module biedt ondersteuning voor IAT met alleen-lezenvertraging.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • Importtabel delayload in een eigen .didat-sectie (met niets anders erin) die vrij opnieuw kan worden beveiligd.

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • Module bevat onderdrukte exportgegevens. Dit zorgt er ook voor dat het adres dat de IAT-tabel heeft genomen, ook aanwezig is in de load-configuratie.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • Module maakt onderdrukking van exports mogelijk.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • De module bevat longjmp-doelgegevens.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Masker voor het subveld dat de onderdrukking van de tabelvermeldingen van de Control Flow Guard-functie bevat (dat wil gezegd het extra aantal bytes per tabelvermelding).

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

Daarnaast definieert de Windows SDK winnt.h-header deze macro voor de hoeveelheid bits om de GuardFlags-waarde naar rechts te verplaatsen om de functietabel Control Flow Guard rechts uit te sluiten:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

De sectie .rsrc

Resources worden geïndexeerd door een structuur met binaire sortering op meerdere niveaus. Het algemene ontwerp kan 2**31 niveaus bevatten. Volgens de conventie gebruikt Windows echter drie niveaus:

Typenaamtaal

Een reeks resourcemaptabellen heeft betrekking op alle niveaus op de volgende manier: Elke maptabel wordt gevolgd door een reeks mapvermeldingen die de naam of id (ID) voor dat niveau geven (Type, Naam of Taalniveau) en een adres van een gegevensbeschrijving of een andere maptabel. Als het adres verwijst naar een gegevensbeschrijving, zijn de gegevens een blad in de structuur. Als het adres naar een andere maptabel verwijst, worden in die tabel mapvermeldingen weergegeven op het volgende niveau omlaag.

Het type, de naam en de taal-id's van een blad worden bepaald door het pad dat wordt genomen door maptabellen om het blad te bereiken. De eerste tabel bepaalt type-id, de tweede tabel (waarnaar wordt verwezen door de mapvermelding in de eerste tabel) bepaalt naam-id en de derde tabel bepaalt taal-id.

De algemene structuur van de sectie .rsrc is:

Gegevens Beschrijving
Resourcemaptabellen (en resourcemapvermeldingen)
Een reeks tabellen, één voor elke groep knooppunten in de structuur. Alle knooppunten op het hoogste niveau (Type) worden vermeld in de eerste tabel. Vermeldingen in deze tabel verwijzen naar tabellen op het tweede niveau. Elke structuur op het tweede niveau heeft dezelfde type-id, maar verschillende naam-id's. Bomen op het derde niveau hebben dezelfde type- en naam-id's, maar verschillende taal-id's.
Elke afzonderlijke tabel wordt onmiddellijk gevolgd door mapvermeldingen, waarin elke vermelding een naam of numerieke id heeft en een aanwijzer naar een gegevensbeschrijving of een tabel op het volgende lagere niveau.
Resourcemaptekenreeksen
Twee byte-uitgelijnde Unicode-tekenreeksen, die fungeren als tekenreeksgegevens waarnaar wordt verwezen door mapvermeldingen.
Beschrijving van resourcegegevens
Een matrix met records, waarnaar wordt verwezen door tabellen, die de werkelijke grootte en locatie van de resourcegegevens beschrijven. Deze records zijn de bladeren in de structuur van de resourcebeschrijving.
Resourcegegevens
Onbewerkte gegevens van de resourcesectie. De grootte en locatiegegevens in het veld Resourcegegevensbeschrijvingen scheiden de afzonderlijke regio's van resourcegegevens.

 

Resourcemaptabel

Elke resourcemaptabel heeft de volgende indeling. Deze gegevensstructuur moet worden beschouwd als de kop van een tabel omdat de tabel daadwerkelijk bestaat uit mapvermeldingen (beschreven in sectie 6.9.2, 'Resourcemapvermeldingen') en deze structuur:

Afstand Grootte Veld Beschrijving
0
4
Kenmerken
Resourcevlagmen. Dit veld is gereserveerd voor toekomstig gebruik. Het is momenteel ingesteld op nul.
4
4
Tijd-/datumstempel
Het tijdstip waarop de resourcegegevens zijn gemaakt door de resourcecompilator.
8
2
Primaire versie
Het primaire versienummer, ingesteld door de gebruiker.
10
2
Secundaire versie
Het secundaire versienummer, ingesteld door de gebruiker.
12
2
Aantal naamvermeldingen
Het aantal mapvermeldingen direct na de tabel die tekenreeksen gebruiken om vermeldingen type, naam of taal te identificeren (afhankelijk van het niveau van de tabel).
14
2
Aantal id-vermeldingen
Het aantal mapvermeldingen direct na de naamvermeldingen die numerieke id's gebruiken voor type-, naam- of taalvermeldingen.

 

Resourcemapvermeldingen

De mapvermeldingen vormen de rijen van een tabel. Elke resourcemapvermelding heeft de volgende indeling. Of de vermelding een naam of id-vermelding is, wordt aangegeven door de resourcemaptabel, waarmee wordt aangegeven hoeveel naam- en id-vermeldingen er volgen (onthoud dat alle naamvermeldingen voorafgaan aan alle id-vermeldingen voor de tabel). Alle vermeldingen voor de tabel worden in oplopende volgorde gesorteerd: de naamvermeldingen op hoofdlettergevoelige tekenreeks en de id-vermeldingen op numerieke waarde. Verschuivingen zijn relatief ten opzichte van het adres in de IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Zie Peering inside the PE: A Tour of the Win32 Portable Executable File Format voor meer informatie.

Afstand Grootte Veld Beschrijving
0
4
Naamverschil
De verschuiving van een tekenreeks die het invoertype, de naam of de taal-id geeft, afhankelijk van het niveau van de tabel.
0
4
Geheel getal-id
Een 32-bits geheel getal dat de vermelding Type, Naam of Taal-id identificeert.
4
4
Verschuiving van gegevensinvoer
Hoge bit 0. Adres van een resourcegegevensinvoer (een leaf).
4
4
Verschuiving van submap
Hoge bit 1. De lagere 31 bits zijn het adres van een andere resourcemaptabel (het volgende niveau lager).

 

Resourcemaptekenreeks

Het tekenreeksgebied van de resourcemap bestaat uit Unicode-tekenreeksen, die zijn uitgelijnd op woorden. Deze tekenreeksen worden samen opgeslagen na de laatste resourcemapvermelding en vóór de eerste resourcegegevensvermelding. Dit minimaliseert de impact van deze tekenreeksen met variabele lengte op de uitlijning van de mapvermeldingen met vaste grootte. Elke resourcemaptekenreeks heeft de volgende indeling:

Afstand Grootte Veld Beschrijving
0
2
Lengte
De grootte van de tekenreeks, niet inclusief lengteveld zelf.
2
veranderlijk
Unicode-tekenreeks
De Unicode-tekenreeksgegevens met variabele lengte, uitgelijnd.

 

Resourcegegevensinvoer

Elke resourcegegevensvermelding beschrijft een werkelijke eenheid met onbewerkte gegevens in het gebied Resourcegegevens. Een resourcegegevensvermelding heeft de volgende indeling:

Afstand Grootte Veld Beschrijving
0
4
Data RVA
Het adres van een eenheid resourcegegevens in het gebied Resourcegegevens.
4
4
Grootte
De grootte, in bytes, van de resourcegegevens waarnaar wordt verwezen door het veld Data RVA.
8
4
Codepagina
De codepagina die wordt gebruikt voor het decoderen van codepuntwaarden in de resourcegegevens. Normaal gesproken is de codepagina de Unicode-codepagina.
12
4
Gereserveerd, moet 0 zijn.

 

De .cormeta-sectie (alleen object)

CLR-metagegevens worden opgeslagen in deze sectie. Het wordt gebruikt om aan te geven dat het objectbestand beheerde code bevat. De indeling van de metagegevens wordt niet gedocumenteerd, maar kan worden overgedragen aan de CLR-interfaces voor het verwerken van metagegevens.

De sectie .sxdata

De geldige uitzonderingshandlers van een object worden weergegeven in de sectie .sxdata van dat object. De sectie is gemarkeerd als IMAGE_SCN_LNK_INFO. Het bevat de COFF-symboolindex van elke geldige handler, met 4 bytes per index.

Daarnaast markeert de compiler een COFF-object als geregistreerde SEH door het absolute symbool '@feat.00' te verzenden met de LSB van het waardeveld ingesteld op 1. Een COFF-object zonder geregistreerde SEH-handlers zou het symbool '@feat.00' hebben, maar geen sectie .sxdata.

Archiefbestandsindeling (bibliotheek)

De COFF-archiefindeling biedt een standaardmechanisme voor het opslaan van verzamelingen objectbestanden. Deze verzamelingen worden vaak bibliotheken genoemd in programmeerdocumentatie.

De eerste 8 bytes van een archief bestaan uit de bestandshandtekening. De rest van het archief bestaat uit een reeks archiefleden, als volgt:

  • De eerste en tweede leden zijn 'linkerleden'. Elk van deze leden heeft een eigen indeling, zoals beschreven in sectie importnaamtype. Normaal gesproken plaatst een linker informatie in deze archiefleden. De linkerleden bevatten de map van het archief.

  • Het derde lid is het lid 'longnames'. Dit optionele lid bestaat uit een reeks ascii-tekenreeksen met null-beëindiging waarin elke tekenreeks de naam is van een ander archieflid.

  • De rest van het archief bestaat uit standaardleden (objectbestand). Elk van deze leden bevat de inhoud van één objectbestand in zijn geheel.

Een koptekst van een archieflid gaat vooraf aan elk lid. In de volgende lijst ziet u de algemene structuur van een archief:

Handtekening :"!<boog>\n"
Rubriek
1st Linker Member
Rubriek
2nd Linker Member
Rubriek
Lid lange namen
Rubriek
Inhoud van OBJ-bestand 1
(COFF-indeling)
Rubriek
Inhoud van OBJ-bestand 2
(COFF-indeling)

...

Rubriek
Inhoud van OBJ-bestand N
(COFF-indeling)

Archiefbestandshandtekening

De handtekening van het archiefbestand identificeert het bestandstype. Elk hulpprogramma (bijvoorbeeld een linker) dat een archiefbestand als invoer gebruikt, kan het bestandstype controleren door deze handtekening te lezen. De handtekening bestaat uit de volgende ASCII-tekens, waarin elk teken hieronder letterlijk wordt weergegeven, met uitzondering van het teken newline (\n):

!<arch>\n

De Windows SDK winnt.h-header definieert de volgende macro's:

#define IMAGE_ARCHIVE_START_SIZE             8
#define IMAGE_ARCHIVE_START                  "!<arch>\n"
#define IMAGE_ARCHIVE_END                    "`\n"
#define IMAGE_ARCHIVE_PAD                    "\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER          "/               "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER       "//              "
#define IMAGE_ARCHIVE_HYBRIDMAP_MEMBER       "/<HYBRIDMAP>/   "

Kopteksten van archieflid

Elk lid (linker, lange namen of objectbestandslid) wordt voorafgegaan door een koptekst. Een koptekst van een archieflid heeft de volgende indeling, waarin elk veld een ASCII-tekenreeks is die is uitgevuld en opgevuld met spaties aan het einde van het veld. Er is geen null-eindteken in een van deze velden.

Elke koptekst van het lid begint op het eerste even adres na het einde van het vorige archieflid, één byte '\n' (IMAGE_ARCHIVE_PAD) kan worden ingevoegd nadat een archieflid het volgende lid op een even adres start.

Afstand Grootte Veld Beschrijving
0
16
Naam
De naam van het archieflid, waaraan een slash (/) is toegevoegd om de naam te beëindigen. Als het eerste teken een slash is, heeft de naam een speciale interpretatie, zoals beschreven in de volgende tabel.
16
12
Datum
De datum en tijd waarop het archieflid is gemaakt: dit is de ASCII-decimale weergave van het aantal seconden sinds 1-1-1970 UCT.
28
6
Gebruikersnaam
Een ASCII-decimale weergave van de gebruikers-id. Dit veld bevat geen zinvolle waarde op Windows-platforms, omdat alle lege waarden door Microsoft-hulpprogramma's worden verzonden.
34
6
Groeps-id
Een ASCII-decimale weergave van de groeps-id. Dit veld bevat geen zinvolle waarde op Windows-platforms, omdat alle lege waarden door Microsoft-hulpprogramma's worden verzonden.
40
8
Wijze
Een ASCII-octale weergave van de bestandsmodus van het lid. Dit is de ST_MODE waarde van de C-runtimefunctie _wstat.
48
10
Grootte
Een ASCII-decimale weergave van de totale grootte van het archieflid, niet inclusief de grootte van de koptekst.
58
2
Einde van koptekst
De twee bytes (0x60 0x0A) in de C-tekenreeks ''\n' (IMAGE_ARCHIVE_END).

Het veld Naam heeft een van de indelingen die worden weergegeven in de volgende tabel. Zoals eerder vermeld, wordt elk van deze tekenreeksen uitgevuld en opgevuld met volgspaties binnen een veld van 16 bytes:

Inhoud van het veld Naam Beschrijving
naam/
De naam van het archieflid.
/
Het archieflid is een van de twee linkerleden. Beide linkerleden hebben deze naam.
//
Het archieflid is het lid longnames, dat bestaat uit een reeks ascii-tekenreeksen die null zijn beëindigd. Het lid longnames is het derde archieflid en is optioneel.
/n
De naam van het archieflid bevindt zich op offset n binnen het lid longnames. Het getal n is de decimale weergave van de offset. Bijvoorbeeld: '/26' geeft aan dat de naam van het archieflid zich 26 bytes buiten het begin van de inhoud van het lid lange naam bevindt.

 

First Linker Member

De naam van het eerste linkerlid is '/' (IMAGE_ARCHIVE_LINKER_MEMBER). Het eerste linkerlid is opgenomen voor compatibiliteit met eerdere versies. Het wordt niet gebruikt door huidige linkers, maar de indeling moet juist zijn. Dit linkerlid biedt een map met symboolnamen, net als het tweede linkerlid. Voor elk symbool geeft de informatie aan waar het archieflid moet worden gevonden dat het symbool bevat.

Het eerste linkerlid heeft de volgende indeling. Deze informatie wordt weergegeven na de koptekst:

Afstand Grootte Veld Beschrijving
0
4
Aantal symbolen
Niet-ondertekend lang dat het aantal geïndexeerde symbolen bevat. Dit getal wordt opgeslagen in big-endian-indeling. Elk objectbestandslid definieert doorgaans een of meer externe symbolen.
4
4 * n
Offsets
Een matrix van bestandsverschuivingen voor archieflidheaders, waarbij n gelijk is aan het veld Aantal symbolen. Elk getal in de matrix is een niet-ondertekend lang opgeslagen in big-endian-indeling. Voor elk symbool dat in de tekenreekstabel wordt genoemd, geeft het bijbehorende element in de offsetmatrix de locatie van het archieflid dat het symbool bevat.
*
*
Tekenreekstabel
Een reeks null-beëindigde tekenreeksen die alle symbolen in de map een naam geven. Elke tekenreeks begint direct na het null-teken in de vorige tekenreeks. Het aantal tekenreeksen moet gelijk zijn aan de waarde van het veld Aantal symbolen.

 

De elementen in de offsetmatrix moeten in oplopende volgorde worden gerangschikt. Dit betekent dat de symbolen in de tekenreekstabel moeten worden gerangschikt op basis van de volgorde van archiefleden. Alle symbolen in het eerste objectbestandslid moeten bijvoorbeeld worden weergegeven vóór de symbolen in het tweede objectbestand.

Second Linker Member

Net als het eerste linkerlid heeft het tweede linkerlid de naam '/' (IMAGE_ARCHIVE_LINKER_MEMBER). Hoewel beide linkerleden een map met symbolen en archiefleden bevatten, wordt het tweede linkerlid in voorkeur gebruikt voor de eerste door alle huidige linkers. Het tweede linkerlid bevat symboolnamen in lexicale volgorde, waardoor sneller op naam kan worden gezocht.

Het tweede lid heeft de volgende indeling. Deze informatie wordt weergegeven na de koptekst:

Afstand Grootte Veld Beschrijving
0
4
Aantal leden
Een niet-ondertekende lengte die het aantal archiefleden bevat.
4
4 * m
Offsets
Een matrix van bestandsverschuivingen voor archieflidheaders, gerangschikt in oplopende volgorde. Elke offset is een niet-ondertekend lang . Het getal m is gelijk aan de waarde van het veld Aantal leden.
*
4
Aantal symbolen
Een niet-ondertekende lengte die het aantal geïndexeerde symbolen bevat. Elk objectbestandslid definieert doorgaans een of meer externe symbolen.
*
2 * n
Indexen
Een matrix van op 1 gebaseerde indexen (niet-ondertekende korte indexen) die symboolnamen toewijzen aan verschuivingen van archiefleden. Het getal n is gelijk aan het veld Aantal symbolen. Voor elk symbool dat in de tekenreekstabel wordt genoemd, geeft het bijbehorende element in de indexmatrix een index in de offsetmatrix. De offsetmatrix geeft op zijn beurt de locatie van het archieflid dat het symbool bevat.
*
*
Tekenreekstabel
Een reeks null-beëindigde tekenreeksen die alle symbolen in de map een naam geven. Elke tekenreeks begint direct na de null-byte in de vorige tekenreeks. Het aantal tekenreeksen moet gelijk zijn aan de waarde van het veld Aantal symbolen. Deze tabel bevat alle symboolnamen in oplopende lexicale volgorde.

 

Lid lange namen

De naam van het lid longnames is '//' (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Het lid longnames is een reeks tekenreeksen met archieflidnamen. Hier wordt alleen een naam weergegeven als er onvoldoende ruimte is in het veld Naam (16 bytes). Het lid longnames is optioneel. Het kan leeg zijn met alleen een koptekst of het kan volledig afwezig zijn zonder zelfs een koptekst.

De tekenreeksen zijn null-beëindigd. Elke tekenreeks begint direct na de null-byte in de vorige tekenreeks.

Bibliotheekindeling importeren

Traditionele importbibliotheken, d.w.w.v. bibliotheken die de exports uit de ene afbeelding beschrijven voor gebruik door een andere, volgen doorgaans de indeling die wordt beschreven in sectie 7, archiefbestandsindeling (bibliotheek). Het belangrijkste verschil is dat importbibliotheekleden pseudoobjectbestanden bevatten in plaats van echte bestanden, waarin elk lid de sectiebijdragen bevat die nodig zijn om de importtabellen te maken die worden beschreven in sectie 6.4, De sectie .idata De linker genereert dit archief tijdens het bouwen van de exporttoepassing.

De sectiebijdragen voor een import kunnen worden afgeleid van een kleine set informatie. De linker kan de volledige, uitgebreide informatie genereren in de importbibliotheek voor elk lid op het moment dat de bibliotheek is gemaakt of alleen de canonieke informatie naar de bibliotheek schrijven en de toepassing die later gebruikt, de benodigde gegevens laten genereren.

In een importbibliotheek met de lange indeling bevat één lid de volgende informatie:

  • Koptekst archieflid
  • Bestandskoptekst
  • Sectiekoppen
  • Gegevens die overeenkomen met elk van de sectiekoppen
  • Tabel met COFF-symbool
  • Tekenreeksen

Een korte importbibliotheek wordt daarentegen als volgt geschreven:

  • Koptekst archieflid
  • Koptekst importeren
  • Tekenreeks met niet-beëindigde importnaam
  • Tekenreeks met null-beëindigde DLL-naam

Dit is voldoende informatie om de volledige inhoud van het lid op het moment van gebruik nauwkeurig te reconstrueren.

Koptekst importeren

De importheader bevat de volgende velden en offsets:

Afstand Grootte Veld Beschrijving
0
2
Sig1
Moet IMAGE_FILE_MACHINE_UNKNOWN zijn. Zie Machinetypenvoor meer informatie.
2
2
Sig2
Moet 0xFFFF zijn.
4
2
Versie
De structuurversie.
6
2
Machine
Het getal dat het type doelmachine aangeeft. Zie Machinetypenvoor meer informatie.
8
4
Time-Date stempel
De tijd en datum waarop het bestand is gemaakt.
12
4
Grootte van gegevens
De grootte van de tekenreeksen die de koptekst volgen.
16
2
Rangtelwoord/hint
De ordinale waarde of de hint voor het importeren, bepaald door de waarde in het veld Naamtype.
18
2 bits
Type
Het importtype. Zie importtypevoor specifieke waarden en beschrijvingen.
3 bits
Naamtype
Het type importnaam. Zie importnaamtypevoor meer informatie.
11 bits
Gereserveerd
Gereserveerd, moet 0 zijn.

 

Deze structuur wordt gevolgd door twee null-beëindigde tekenreeksen die de naam van het geïmporteerde symbool en het DLL-bestand beschrijven waaruit het is gekomen.

Importtype

De volgende waarden worden gedefinieerd voor het veld Type in de importheader:

Constant Waarde Beschrijving
IMPORT_OBJECT_CODE
0
Uitvoerbare code.
IMPORT_OBJECT_DATA
1
Gegevens.
IMPORT_OBJECT_CONST
2
Opgegeven als CONST in het .def-bestand.

Deze waarden worden gebruikt om te bepalen welke sectiebijdragen moeten worden gegenereerd door het hulpprogramma dat gebruikmaakt van de bibliotheek als deze toegang moet hebben tot die gegevens.

Type importnaam

De naam van het importsymbool met null-beëindiging volgt onmiddellijk de bijbehorende importheader. De volgende waarden worden gedefinieerd voor het veld Naamtype in de importheader. Ze geven aan hoe de naam moet worden gebruikt om de juiste symbolen te genereren die de import vertegenwoordigen:

Constant Waarde Beschrijving
IMPORT_OBJECT_ORDINAL 0 De import is per rangschikkelijk. Dit geeft aan dat de waarde in het veld Ordinaal/Hint van de importheader het rangtelwoord van de import is. Als deze constante niet is opgegeven, moet het veld Rangschikken/Hint altijd worden geïnterpreteerd als de hint van het importeren.
IMPORT_OBJECT_NAME 1 De importnaam is identiek aan de naam van het openbare symbool.
IMPORT_OBJECT_NAME_NOPREFIX 2 De importnaam is de naam van het openbare symbool, maar de voorloopnaam wordt overgeslagen?, @of optioneel _.
IMPORT_OBJECT_NAME_UNDECORATE 3 De importnaam is de naam van het openbare symbool, maar slaat de voorloop ?, @, of optioneel _, over en kapt af bij de eerste @.

Bijlage A: Authenticode PE-afbeeldingshash berekenen

Er worden naar verwachting verschillende kenmerkcertificaten gebruikt om de integriteit van de installatiekopieën te verifiëren. De meest voorkomende is Authenticode-handtekening. Een Authenticode-handtekening kan worden gebruikt om te controleren of de relevante secties van een PE-afbeeldingsbestand op geen enkele manier zijn gewijzigd vanuit het oorspronkelijke formulier van het bestand. Om deze taak uit te voeren, bevatten Authenticode-handtekeningen iets wat een PE-afbeeldingshash wordt genoemd

Wat is een Authenticode PE-installatiekopieënhash?

De hash van de Authenticode PE-installatiekopieën of bestands-hash is vergelijkbaar met een bestandscontrolesom, omdat deze een kleine waarde produceert die betrekking heeft op de integriteit van een bestand. Een controlesom wordt geproduceerd door een eenvoudig algoritme en wordt voornamelijk gebruikt om geheugenfouten te detecteren. Dat wil gezegd, het wordt gebruikt om te detecteren of een blok geheugen op schijf is beschadigd en de waarden die daar zijn opgeslagen, zijn beschadigd. Een bestandshash is vergelijkbaar met een controlesom omdat ook bestandsbeschadiging wordt gedetecteerd. In tegenstelling tot de meeste controlesomalgoritmen is het echter erg moeilijk om een bestand te wijzigen, zodat het dezelfde bestands-hash heeft als het oorspronkelijke (ongewijzigde) formulier. Dat wil zeggen, een controlesom is bedoeld om eenvoudige geheugenfouten te detecteren die leiden tot beschadiging, maar een bestands-hash kan worden gebruikt om opzettelijke en zelfs subtiele wijzigingen in een bestand te detecteren, zoals die zijn geïntroduceerd door virussen, hackers of Trojaanse paardenprogramma's.

In een Authenticode-handtekening wordt de bestandshash digitaal ondertekend met behulp van een persoonlijke sleutel die alleen bekend is bij de ondertekenaar van het bestand. Een softwaregebruiker kan de integriteit van het bestand controleren door de hashwaarde van het bestand te berekenen en deze te vergelijken met de waarde van ondertekende hash in de digitale handtekening Authenticode. Als de bestandshashes niet overeenkomen, is een deel van het bestand dat wordt gedekt door de PE-installatiekopieënhash gewijzigd.

Wat is gedekt in een Authenticode PE-installatiekopieënhash?

Het is niet mogelijk of wenselijk om alle afbeeldingsbestandsgegevens op te nemen in de berekening van de PE-afbeeldingshash. Soms worden er gewoon ongewenste kenmerken weergegeven (bijvoorbeeld foutopsporingsgegevens kunnen niet worden verwijderd uit openbaar vrijgegeven bestanden); soms is het gewoon onmogelijk. Het is bijvoorbeeld niet mogelijk om alle informatie in een afbeeldingsbestand op te nemen in een Authenticode-handtekening, en vervolgens de Authenticode-handtekening die die PE-afbeeldingshash bevat in de PE-afbeelding, in te voegen en later een identieke PE-afbeeldingshash te genereren door alle afbeeldingsbestandsgegevens in de berekening opnieuw op te nemen, omdat het bestand nu de Authenticode-handtekening bevat die niet oorspronkelijk aanwezig was.

Proces voor het genereren van de Authenticode PE-installatiekopieënhash

In deze sectie wordt beschreven hoe een PE-afbeeldingshash wordt berekend en welke onderdelen van de PE-installatiekopieën kunnen worden gewijzigd zonder de Authenticode-handtekening te ongeldig te maken.

Notitie

De PE-installatiekopieënhash voor een specifiek bestand kan worden opgenomen in een afzonderlijk catalogusbestand zonder een kenmerkcertificaat in het gehashte bestand op te nemen. Dit is relevant, omdat het mogelijk wordt om de PE-installatiekopie-hash ongeldig te maken in een authenticode-catalogusbestand door een PE-installatiekopie te wijzigen die geen Authenticode-handtekening bevat.

Alle gegevens in secties van de PE-installatiekopie die zijn opgegeven in de sectietabel, worden in hun geheel gehasht, met uitzondering van de volgende uitsluitingsbereiken:

  • Het veld CheckSum van het bestand van de Windows-specifieke velden van de optionele koptekst. Deze controlesom bevat het hele bestand (inclusief eventuele kenmerkcertificaten in het bestand). In alle waarschijnlijkheid is de controlesom anders dan de oorspronkelijke waarde na het invoegen van de Authenticode-handtekening.

  • informatie met betrekking tot kenmerkcertificaten. De gebieden van de PE-afbeelding die zijn gerelateerd aan de Authenticode-handtekening, worden niet opgenomen in de berekening van de PE-afbeeldingshash omdat Authenticode-handtekeningen kunnen worden toegevoegd aan of verwijderd uit een afbeelding zonder dat dit van invloed is op de algehele integriteit van de afbeelding. Dit is geen probleem, omdat er gebruikersscenario's zijn die afhankelijk zijn van het opnieuw ondertekenen van PE-afbeeldingen of het toevoegen van een tijdstempel. Authenticode sluit de volgende informatie uit van de hashberekening:

    • Het veld Certificaattabel van de optionele headergegevensmappen.

    • De certificaattabel en de bijbehorende certificaten waarnaar wordt verwezen door het veld Certificaattabel dat direct hierboven wordt vermeld.

    Als u de PE-afbeeldingshash wilt berekenen, worden de secties die zijn opgegeven in de sectietabel op adresbereik, georderd en vervolgens de resulterende reeks bytes gehasht, waarbij de uitsluitingsbereiken worden doorgegeven.

  • Informatie verleden van het einde van de laatste sectie. Het gebied voorbij de laatste sectie (gedefinieerd door de hoogste offset) wordt niet gehasht. Dit gebied bevat meestal informatie over foutopsporing. Foutopsporingsinformatie kan over het algemeen worden beschouwd als advies voor foutopsporingsprogramma's; dit heeft geen invloed op de werkelijke integriteit van het uitvoerbare programma. Het is vrij letterlijk mogelijk om foutopsporingsinformatie uit een afbeelding te verwijderen nadat een product is geleverd en niet van invloed is op de functionaliteit van het programma. In feite wordt dit soms gedaan als een schijfbesparende meting. Het is belangrijk te vermelden dat foutopsporingsgegevens in de opgegeven secties van de PE-installatiekopieën niet kunnen worden verwijderd zonder de Authenticode-handtekening te ongeldig te maken.

U kunt de makecert- en signtool-hulpprogramma's in de Windows Platform SDK gebruiken om te experimenteren met het maken en verifiëren van Authenticode-handtekeningen. Zie Naslaginformatie hieronder voor meer informatie.

Verwijzingen

Downloads en hulpprogramma's voor Windows (bevat de Windows SDK)

certificaten maken, weergeven en beheren

Kernel-Mode walkthrough voor ondertekening van programmacode (.doc)

SignTool-

Windows Authenticode Portable Executable Signature Format (.docx)

ImageHlp Functions-