windows核心编程学习体会1:获取进程实例句柄

来源:互联网 发布:古代战争 知乎 编辑:程序博客网 时间:2024/05/17 23:00

进程包括两部分,一个是内核对象,一个是地址空间。系统通过内核对象对进程进行管理,地址空间包括所有可执行文件和DLL文件以及动态内存分配。进程地址空间的每一个可执行文件或者DLL文件都被赋予了一个实例句柄,主要通过两个函数获取该实例句柄值:GetModuleHandle()和GetModuleHandleEx(),也可以通过链接器提供的伪变量__ImageBase获取,它指向当前正在运行的的模块的基地址。

注意:_printf()是用于UNICO编码中,printf()是用于ANSI编码中

#include <windows.h>#include "tchar.h"extern "C" const IMAGE_DOS_HEADER __ImageBase;void DumpModule(){// 传递NULL,返回进程的地址空间中的可执行文件的基地址,  // 若调用GetModuleHandle(NULL)的代码在一个DLL中,返回值仍是可执行文件的基地址,而非DLL文件的基地址  //'\r'是回车,'\n'是换行,前者使光标到行首,后者使光标下移一格HMODULE hmodule = GetModuleHandle(NULL);wprintf(TEXT("with GetModuleHandle(NULL) = 0x%x\r\n"),hmodule);// __ImageBase是链接器提供的伪变量,它指向当前正在运行的模块的基地址 wprintf(TEXT("with __ImageBase = 0x%x\r\n"),(HINSTANCE)& __ImageBase);// 使用DumpModule函数作为参数得到当前模块的基地址  // 将GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS做第一个参数,会用第二个参数所在DLL的基地址填写第三个参数 hmodule = NULL;GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,(PCTSTR)DumpModule,&hmodule);wprintf(TEXT("with GetModuleHandleEx = 0x%x\r\n"),hmodule);}int wmain(int argc,TCHAR *argv[]){DumpModule();return 0;}


                                             
0 0