vc 获取当前模块基地址(HMODULE)

本文介绍了一种在DLL和EXE环境中获取当前模块基地址的方法。通过使用GetCurrentModule函数,可以实现DLL内部获取自身模块基地址的需求。此方法利用了VirtualQuery函数配合MEMORY_BASIC_INFORMATION结构体来获取模块加载的基地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用GetModuleHandle可以得到当前进程(exe)的模块加载到内存的基地址,但在DLL调用这个函数依然得到是exe的基地址,因此需要编程实现获取当前调用源地模块基地址。

/*函数:GetCurrentModule
   功能:获取模块自身的基地址,如果在DLL内使用,就是那个dll的模块基地址,如果在exe内调用,
            则是这个exe的基地址(实际上可以说GetModuleHandle(NULL)),在DLL内无法准确获取DLL
			实例句柄(模块基地址),例如入口函数不是在DLLMAIN。
   返回值:模块基地址,HMODULE,其实是个DWORD的地址值
*/
HMODULE __stdcall  GetCurrentModule(VOID);

/*函数:GetCurrentModule
功能:获取模块自身的基地址,如果在DLL内使用,就是那个dll的模块基地址,如果在exe内调用,
则是这个exe的基地址(实际上可以说GetModuleHandle(NULL))
返回值:模块基地址,HMODULE,其实是个DWORD的地址值
*/
HMODULE __stdcall  GetCurrentModule(VOID){
/*没有使用宏判断windows的版本*/
	MEMORY_BASIC_INFORMATION membinfo;
	static int ibase=0;//这里要是静态变量,否则失败
    VirtualQuery(&ibase,&membinfo,sizeof(membinfo));
	return (HMODULE)(DWORD)membinfo.AllocationBase; //可转换为IMAGE_DOS_HEADER(内存中的),本来就是
}


注意:上面的ibase需要声明为static,否则调用VirtualQuery会出错。因为VirtualQuery 无法计算局部栈地址,声明为static 使得变量的地址为当前模块的全局变量,也就是说ibase的地址在dll内是可见的(在整个进程内同样也是)。 然后通过MEMORY_BASIC_INFORMATION::AllocationBase得到模块加载的基地址,也就是模块句柄-HMODULE

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值