1. 程式人生 > >windows核心程式設計-程序的控制代碼和如何獲得

windows核心程式設計-程序的控制代碼和如何獲得

程序控制代碼不同於程序核心物件的控制代碼

程序核心物件控制代碼:代表整個程序的

程序控制代碼: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;
}