進程模塊句柄

1、注意區別進程模塊句柄和進程內核句柄windows


2、每一個可執行文件或者DLL文件被裝入到某個進程地址空間後,都會有一個惟一的實例句柄,來表示裝入後的可執行文件或者DLL,此時咱們把這個可執行文件或者DLL叫作進程地址空間中的一個模塊。函數

       進程模塊句柄的本質就是當前模塊的起始地址。.net


3、如何獲取進程模塊句柄blog

    a.HMODULE  GetModuleHandle( LPCTSTR   lpModuleName)進程

   1.  若是這個函數的參數是NULL的話,那麼這個函數只返回當前進程的模塊地址!!內存

   2.  在DLL中,調用GetModuleHandle,返回的不是DLL模塊的地址,而是當前進程的模塊地址!jade

   3.  這個函數只檢查本進程地址空間,不檢查別的進程的地址空間。get

得到進程中模塊對應的文件名io

        DWORD GetModuleFileName(
                                   HMODULE        hInstance,//進程句柄
                                   PTSTR               pszPath,//文件名
                                  DWORD             cchPath);//pszPath指向的內存的大小file

    b.WinMain函數中的第一個參數hInstance


4、若是代碼位於DLL文件中,那麼想知道這個DLL文件被裝入進程空間後的模塊地址怎麼辦?

    1.

    extern 「C」 HANDLE __ImageBase;
    int main()
    {
        printf(「%x\n」,&__ImaggeBase);
        return 0;
    }


    2.

    void fun(HMODULE* hModule)
    {
        GetModuleHandleEx(
            GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
            (PCTSTR)fun,&hModule);
    }

 

5、實例

    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    #include <locale.h>
     
    extern "C" HANDLE __ImageBase;
    int _tmain(int argc, _TCHAR* argv[])
    {
        _tsetlocale(LC_ALL,_T("chs"));  //支持中文
     
        _tprintf(L"__ImageBase:%4x \n",&__ImageBase);
     
        HMODULE hMoudle = GetModuleHandle(nullptr);
        _tprintf(L"當前進程模塊句柄爲:%4x \n",hMoudle);
     
        TCHAR fileName[MAX_PATH] = {0};
        GetModuleFileName(hMoudle,fileName,MAX_PATH);
        _tprintf(L"當前進程模塊文件名:%s \n",fileName);
     
     
        _gettchar();
        return 0;
    }

運行結果:

相關文章
相關標籤/搜索