1. 程式人生 > >十年磨一劍,霜刃未曾試!

十年磨一劍,霜刃未曾試!

如果使用 FreeLibrary解除安裝自身DLL的話會出現一個問題,在 FreeLibrary 之後,該 DLL 的地址空間就不再可用了,但這時 EIP 指標仍然會指向 FreeLibrary 的下面一句,於是程式就會崩潰。所幸,Win32 提供了另外的一個 API——FreeLibraryAndExitThread,這個函式能夠在銷燬 DLL 之後直接呼叫 ExitThread,這樣一來 EIP 指標就不會指向非法的地址了。

#include <Windows.h>   
  
HMODULE g_hDll = NULL;   
  
DWORD WINAPI UnloadProc(PVOID param)   
{   
    MessageBox(0,"test","test",0); 
    FreeLibraryAndExitThread(g_hDll,0);   
    return 0;   
}   
   
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, PVOID lpvReserved)   
{   
    if (DLL_PROCESS_ATTACH == fdwReason)   
    {   
        g_hDll = (HMODULE)hinstDLL;   
        HANDLE hThread = CreateThread(NULL, 0, UnloadProc, NULL, 0, NULL);   
        CloseHandle(hThread);   
    }   
    return TRUE;   
}