进程模块句柄

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;
    }

运行结果: