windows - Brug af DLL'er med NASM

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har lavet nogle x86 programmering i Windows med NASM, og jeg har kørt ind i en vis forvirring. Jeg er forvirret over hvorfor jeg skal gøre dette:


extern \_ExitProcess@4


Specielt er jeg forvirret over '\_' og '@ 4'. Jeg ved, at '@ 4' er stakken, men hvorfor er det nødvendigt? Da jeg kiggede i kernel32.dll med en hex editor, så jeg kun 'ExitProcess' ikke '\_ExitProcess @ 4'.


Jeg er også forvirret over, hvorfor C Funktioner ikke behøver understregningen og stakken størrelse som denne:


extern printf


Hvorfor don 't C Funktioner har brug for dekorationer?


Mit tredje spørgsmål er 'Er det sådan jeg skal bruge disse funktioner?' Lige nu linker jeg med de faktiske dll-filer selv.

Bedste reference



  Jeg ved, at '@ 4' er stakken, men hvorfor er det nødvendigt?



For at aktivere linkeren til at rapportere en fatal fejl, hvis din compiler antog den forkerte kaldkonvention for funktionen (dette kan ske, hvis du glemmer at inkludere headerfiler i C og ignorerer alle compiler advarsler eller hvis en erklæring ikke stemmer overens med funktionen i det delte bibliotek).



  Hvorfor don 't C Funktioner har brug for dekorationer?



Funktioner, der bruger cdecl kaldekonventionen, er dekoreret med en enkelt leder (så det ville faktisk være \_printf).


Grunden til, at ingen parameterstørrelse er kodet ind i det dekorerede navn, er, at den, der ringer op, er ansvarlig for både opsætning og nedrivning af stakken, så et argument for fejltælling vil ikke være fatalt for stablingsopsætningen (selvom opkaldsfunktionen måske stadig styrter hvis det er ikke givet de rigtige argumenter, selvfølgelig). Det kan endda være muligt, at argumenttællingen er variabel som i tilfælde af printf.



  Da jeg kiggede i kernel32.dll med en hex-editor, så jeg kun ExitProcess ikke \_ExitProcess@4.



De manglede navne er normalt kortlagt til de egentlige eksporterede navne på DLL'en ved hjælp af definition filer (*.def), som derefter kompileres til *.lib import bibliotek filer, der kan bruges i din linker invokation. Et eksempel på en sådan definitionfil for kernel32.dll er denne. Følgende linje definerer kortlægningen for ExitProcess: [13]


\_ExitProcess@4 = ExitProcess



  Er det sådan, jeg skal bruge disse funktioner?



Jeg kender ikke NASM meget godt, men koden jeg har set så langt angiver normalt det indrettede navn, som i dit eksempel.


Du kan finde flere oplysninger om denne fremragende side om Win32-kaldkonventioner. [14]