J'ai pris un exemple de code qui crée une DLL simple à partir du répertoire d'exemples FASM et je l'ajuste à mes besoins. Cependant, quand je fais quelques changements (innocent de mon POV), le fichier binaire généré est corrompu - l'exécution d'un exe qui utilise cette bibliothèque produit le code d'erreur 0xC000007B, soit INVALID_IMAGE_FORMAT.Obtenir une image invalide lors de l'ajustement du code DLL exemple
code DLL:
; DLL creation example
format PE GUI 4.0 DLL
entry DllEntryPoint
include 'win32a.inc'
section '.text' code readable executable
proc DllEntryPoint hinstDLL,fdwReason,lpvReserved
mov eax,TRUE
ret
endp
proc ShowErrorMessage hWnd,dwError
local lpBuffer:DWORD
lea eax,[lpBuffer]
invoke FormatMessage,FORMAT_MESSAGE_ALLOCATE_BUFFER+FORMAT_MESSAGE_FROM_SYSTEM,0,[dwError],LANG_NEUTRAL,eax,0,0
invoke MessageBox,[hWnd],[lpBuffer],NULL,MB_ICONERROR+MB_OK
ret
endp
proc ShowLastError hWnd
ret
endp
section '.idata' import data readable writeable
library kernel,'KERNEL32.DLL',\
user,'USER32.DLL'
import kernel,\
GetLastError,'GetLastError',\
SetLastError,'SetLastError',\
FormatMessage,'FormatMessageA',\
LocalFree,'LocalFree'
import user,\
MessageBox,'MessageBoxA'
section '.edata' export data readable
export 'DLL.DLL',ShowErrorMessage,'ShowErrorMessage',ShowLastError,'ShowLastError'
section '.reloc' fixups data readable discardable
Code Executable:
format PE GUI 4.0
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
jmp ShowLastError
section '.idata' import data readable writeable
library mydll,'DLL.DLL'
import mydll,\
ShowLastError,'ShowLastError'
Quand je change, par exemple,
export 'DLL.DLL',ShowErrorMessage,'ShowErrorMessage',ShowLastError,'ShowLastError'
ligne
à
export 'DLL.DLL',ShowLastError,'ShowLastError'
le code se brise. La même chose se passe si je change ShowErrorMessage
corps juste ret
.
Je suis complètement confus par cela. Est-ce un bug FASM, ou je fais quelque chose de mal?
Ce code ne traite pas du tout de la convention d'appel (en particulier 'stdcall', qui nécessite' DllEntryPoint'). Et il n'est pas sûr de 'JMP' dans une fonction DLL (' ShowLastError'), vous devez le 'INVOKE' à la place, comme les autres fonctions DLL importées que vous utilisez ('FormatMessage' et' MessageBox'). Et surtout parce que 'ShowLastError' prend un paramètre d'entrée que vous ne lui passez pas –
@RemyLebeau la DLL n'est même pas chargée, donc c'est orthogonal à mon problème. – arrowd
il est toujours utile de réparer. En tout cas, le coupable habituel pour 'INVALID_IMAGE_FORMAT' est un processus 32 bits chargeant une DLL 64 bits ou vice versa. est-ce le cas ici? –