windows核心编程-进程的句柄和如何获得

本文介绍了Windows系统中进程句柄与进程内核对象句柄的区别,强调进程句柄实为进程模块在地址空间的首地址。重点讨论了如何获取进程句柄,包括使用GetModuleFileName和GetModuleHandleName函数的方法。

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

进程句柄不同于进程内核对象的句柄

进程内核对象句柄:代表整个进程的

进程句柄:exe或者dll装入某个进程的地址空间,有唯一的实例句柄,也可以叫做模块句柄

进程句柄的本质是进程模块在进程地址空间中的首地址!

一:GetModuleFileName

DWORD WINAPI GetModuleFileName(
  _In_opt_ HMODULE hModule, //进程句柄
  _Out_    LPTSTR  lpFilename, //文件名
  _In_     DWORD   nSize //pszPath指向的内存的大小
);

如何获得一个进程或者执行文件的模块名呢

通过GetModuleHandleName函数

二:获得进程句柄

获得进程句柄的方式
1、GetModuleHandle函数
2、WinMain函数的第一个参数hInstance
3、使用extern "C" HANDLE __ImageBase;
GetModuleHandle函数:
1、只检查本进程的地址空间,不检查别的地址空间
2、当参数为NULL时候,这个句柄就是当前程序的起始地址
#include<windows.h>
#include<tchar.h>


extern "C" HANDLE __ImageBase;//这是一个伪变量,可以看成当前模块的起始地址
int main()
{
	HMODULE hModule = GetModuleHandle(L"Kernel32.dll");//获得这个模块的句柄
	_tprintf(L"%0x\n", hModule);

	//CloseHandle(hModule);模块句柄不要释放

	//如何获得当前进程句柄
	HMODULE hCurrent_Module = GetModuleHandle(NULL);//这个句柄就是当前程序的起始地址
	_tprintf(L"%0x\n", hCurrent_Module);

	/*在DLL中用这个好些*/
	_tprintf(L"%0x\n",& __ImageBase);//直接打印全局变量,就可以获得当前模块句柄

	TCHAR filename[MAX_PATH];

	GetModuleFileName(hCurrent_Module, filename, MAX_PATH); //获取文件名路径
	_tprintf(L"%s\n", filename);

	_gettchar();
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值