如何获得当前运行模块在进程地址空间的位置

27 篇文章 1 订阅
17 篇文章 0 订阅

(w)WinMain的hInstanceExe参数实际值是一个内存基地址;系统将可执行文件的映像加载到进程地址空间中的这个位置。例如,系统打开可执行文件,并将它加载到地址0x00400000,则(w)WinMain的hInstanceExe参数值为0x00400000.


为了知道一个可执行文件或DLL文件被加载到进程地址空间的什么位置,可以使用GetModuleHandle函数来返回一个句柄/基地址

HMODULE GetModuleHandle(PCTSTR pszModule)

调用这个函数是,要传递一个以0为终止字符的字符串,它指定了已在主调进程的地址空间中加载的一个可执行文件或DLL文件的名称。如果系统找到了可执行文件或DLL文件名称,GetModuleHandle就会返回可执行文件/DLL文件映像加载到基地址。如果没有找到文件,系统将返回NULL。

GetModuleHandle的另一个用法是为pszModule参数传入NULL,这样就可以返回主调进程模块的基地址。如果我们的代码在一个DLL中,那么可利用两种方法来了解代码正在什么模块中运行。第一个办法是利用链接器提供的伪变量__ImageBase,它指向当前正在运行的模块的基地址。这是C语言运行库启动代码在调用我们的(w)WinMain函数时所做的事情。

第二种方法是调用GetMoudleHandleEx,将GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS作为它的第一个参数,将当前函数的地址作为第二个参数。最后一个参数是一个指向HMODULE的指针,GetModuleHandleEx会用传入函数(即第二个参数)所在DLL的基地址来填写该指针。以下代码对这几种方法进行演示。

extern "C" const IMAGE_DOS_HEADER __ImageBase;

void DumpModule()
{
	HMODULE hMoudle = GetModuleHandle(NULL);
	_tprintf(TEXT("with GetModuleHandle(NULL) = 0x%x\r\n"),hMoudle);

	_tprintf(TEXT("with _ImageBase = 0x%x\r\n"),(HINSTANCE)&__ImageBase);

	hMoudle = NULL;
	GetModuleHandleEx(
		GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
		(PCTSTR)DumpModule,
		&hMoudle);
	_tprintf(TEXT("with GetModuleHandleEx = 0x%x\r\n"),hMoudle);
}

int _tmain(int argc, _TCHAR* argv[])
{
	DumpModule();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux 的进程模块主要包含以下模块: 1. 进程调度模块:负责为各个进程分配 CPU 时间片,以及在进程之间进行切换。 2. 内存管理模块:负责为每个进程分配内存空间,并且在需要时对内存空间进行调整。 3. 进程间通信模块:提供各种机制,使得进程之间可以进行通信和数据交换,例如管道、信号、共享内存等。 4. 文件系统模块:为进程提供了对文件和目录的访问,可以读取、写入和执行文件,以及创建、删除和重命名文件和目录等操作。 5. 网络模块:提供了网络通信的功能,使得进程可以进行网络通信和数据传输。 ### 回答2: Linux的进程模块包含以下几个模块: 1. 创建进程模块:包括了创建新进程的相关函数和数据结构,例如`fork`函数和`exec`函数,这些函数用于在当前进程的基础上创建新进程。 2. 进程调度模块:包括了调度进程的相关函数和数据结构,例如调度算法和调度器数据结构,这些函数和数据结构用于决定应该运行哪些进程以及进程的优先级。 3. 进程管理模块:包括了管理进程的相关函数和数据结构,例如进程控制块(PCB)和进程状态等,这些函数和数据结构用于管理进程的各种信息,如进程的状态、资源分配等。 4. 进程通信模块:包括了进程间通信的相关函数和数据结构,例如管道、信号、共享内存和消息队列等,这些函数和数据结构用于实现进程之间的信息交换和数据共享。 5. 进程同步模块:包括了进程同步的相关函数和数据结构,例如互斥锁、信号量和条件变量等,这些函数和数据结构用于控制进程的并发访问和保证共享资源的正确访问。 6. 中断处理模块:包括了处理中断的相关函数和数据结构,例如中断处理程序和中断向量表等,这些函数和数据结构用于响应硬件中断事件并处理相应的中断服务。 综上所述,Linux的进程模块包含了创建进程、调度进程、管理进程进程通信、进程同步和中断处理等多个模块,这些模块共同构成了Linux操作系统中进程管理的核心功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值