进程模块句柄

一、注意区别进程模块句柄进程内核句柄

 

二、每个可执行文件或者DLL文件被装入到某个进程地址空间后,都会有一个唯一的实例句柄,来表示装入后的可执行文件或者DLL,此时我们把这个可执行文件或者DLL叫做进程地址空间中的一个模块。

       进程模块句柄的本质就是当前模块的起始地址

 

三、如何获取进程模块句柄

    a.HMODULE  GetModuleHandle( LPCTSTR   lpModuleName)

 

   1.  如果这个函数的参数是NULL的话,那么这个函数只返回当前进程的模块地址!!

   2.  在DLL中,调用GetModuleHandle,返回的不是DLL模块的地址,而是当前进程的模块地址!

   3.  这个函数只检查本进程地址空间,不检查别的进程的地址空间。

 

获得进程中模块对应的文件名

 

 

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

 

    b.WinMain函数中的第一个参数hInstance

 

四、如果代码位于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);
}



五、实例

 

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


运行结果:


 


转载于:https://www.cnblogs.com/jadeshu/p/10663718.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值