进程包括两部分,一个是内核对象,一个是地址空间。系统通过内核对象对进程进行管理,地址空间包括所有可执行文件和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"),(H