[EXTERN ExitProcess]
[EXTERN FreeLibrary]
[EXTERN GetProcAddress]
[EXTERN LoadLibraryA]
[EXTERN MessageBoxA]
[IMPORT ExitProcess kernel32.dll]
[IMPORT FreeLibrary kernel32.dll]
[IMPORT GetProcAddress kernel32.dll]
[IMPORT LoadLibraryA kernel32.dll]
[IMPORT MessageBoxA user32.dll]
[SEGMENT CODE USE32 CLASS=CODE]
..start
; ==========================
; ==========================
; Charge la dll
push dword DllName
call [LoadLibraryA]
; Si EAX == 0, le chargement a echoue
cmp eax, 0
je LoadLibraryFailed
; ==========================
; Le probleme vient de la
mov hDll, dword eax
; ===============================================================================================
; ===============================================================================================
; Recupere l'adresse de la fonction TestFun grace a GetProcAdress
push dword FuncName
push dword hDll
call [GetProcAddress]
; L'adresse de la fonction se trouve dans eax. Si eax == 0, la fonction a echouee
cmp eax, 0
je GetProcAddressFailed
; ===============================================================================================
; Appel la fonction ( pas de call [eax] sinon sa plante ;-) )
call eax
; ========================================================================================================================
; ========================================================================================================================
; Liberation de la DLL en memoire grace a FreeLibrary
; Comme le handle a deja ete sauvegarde sur la pile, on a plus qu'a appelle FreeLibrary qui se chargera de tout
; (la pile etant redevenu a son etat d'origine apres l'appel a GetProcAddress)
call [FreeLibrary]
cmp eax, 0
je FreeLibFailed
; ========================================================================================================================
; ====================
; ====================
; Fin du programme
push dword 0
call [ExitProcess]
; ====================
; En cas d'echec de LoadLbraryA, on affiche un message d'erreur et on quitte le programme
LoadLibraryFailed:
push dword 0
push dword MsgTitle
push dword MsgFailedText
push dword 0
call [MessageBoxA]
push dword 0
call [ExitProcess]
; En cas d'echec de GetProcAddress, on affiche un message d'erreur et on quitte le programme
GetProcAddressFailed:
push dword 0
push dword MsgTitle2
push dword MsgFailedText
push dword 0
call [MessageBoxA]
push dword 0
call [ExitProcess]
; En cas d'echec de FreeLibrary, on affiche un message d'erreur et on quitte le programme
FreeLibFailed:
push dword 0
push dword MsgTitle3
push dword MsgFailedText
push dword 0
call [MessageBoxA]
push dword 0
call [ExitProcess]
[SEGMENT DATA USE32 CLASS=DATA]
DllName db "PE.dll", 0
FuncName db "TestFunc", 0
MsgTitle db "LoadLibraryA", 0
MsgTitle2 db "GetProcAdress", 0
MsgTitle3 db "FreeLibrary", 0
MsgFailedText db "Chargement échoué", 0
MsgSuccessText db "Chargement effectué", 0
[SEGMENT BSS US32 CLASS=BSS]
hDll: resd 1