获取一个特定的应用程序或动态链接库的模块句柄,且这个模块必须已经被加载到调用者的进程空间中,否则调用LoadLibrary。
GetModuleHandle(NULL);
这将返回自身应用程序句柄(好像一直是0x40000000,和GetCurrentProcess(一直是0xFFFFFFFF)是不一样的,一个是模块一个进程,用在不同的地方)即使是在模块内,返回的也是调用它的应用程序的句柄,而不是模块本身的句柄。
要在模块中获得模块本身的句柄,可以通过如下函数获得,该函数通过模块内的函数获得模块的句柄
HMODULE ModuleFromAddress(PVOID pv)
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}
传入的参数为模块内的任意函数
要获得模块内某一导出函数的地址
FARPROC GetProcAddress
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
要获得进程或模块的磁盘文件名,用如下函数
DWORD GetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);
函数参数说明:
HMODULE hModule 装载一个程序实例的句柄。如果该参数为NULL,该函数返回该当前应用程序全路径。
LPTSTR lpFileName 是你存放返回的名字的内存块的指针,是一个输出参数
DWORD nSize,装载到缓冲区lpFileName的最大值
要获得别的进程的全路径 可以用GetModuleFileNameEx 或者命令行 wmic process
获得自身进程id
GetCurrentProcessId
获得其他进程id
1 通过GetWindowThreadProcessId函数:找出某个窗口的创建者(线程或进程),返回创建者的标志符。
DWORD GetWindowThreadProcessId(
HWND hWnd,
LPDWORD lpdwProcessId
);
而获得窗口句柄,可以用FindWindow函数
2 通过快照获得所有进程
//获取对应进程名的ID
DWORD GetSpecifiedProcessId(const char *pszProcessName)
{
DWORD id;
//获得系统快照进程句柄 (通俗的讲, 就是得到当前的所有进程)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0) ;
PROCESSENTRY32 pInfo; //用于保存进程信息的一个数据结构
pInfo.dwSize = sizeof(pInfo);
//从快照中获取进程列表
Process32First(hSnapShot, &pInfo) ; //从第一个进程开始循环
do
{
//这里的 pszProcessName 为你的进程名称
if(strcmp(strlwr(_strdup(pInfo.szExeFile)), pszProcessName) == 0)
{
id = pInfo.th32ProcessID ;
break ;
}
}while(Process32Next(hSnapShot, &pInfo) != FALSE);
return id; //id 就是你要的进程PID 了
}
ps:获得模块句柄的方法
// 取得本进程的模块列表
HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ::GetCurrentProcessId());
// 遍历所有模块,分别对它们调用ReplaceIATEntryInOneMod函数,修改导入地址表
MODULEENTRY32 me = { sizeof(MODULEENTRY32) };
BOOL bOK = ::Module32First(hSnap, &me);
while(bOK)
{
bOK = ::Module32Next(hSnap, &me);
}
::CloseHandle(hSnap);
3 通过句柄获得id
DWORD WINAPI GetProcessId( _In_ HANDLE Process );
GetCurrentProcessId=GetProcessId(GetCurrentProcess);
通过id获得句柄的方法
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId// 进程标示符
);
例如HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, ID );
SetWindowsHookEx 其四个参数分别为钩子类型 钩子函数地址 钩子函数所在DLL的实例句柄 安装钩子后想监控的线程的ID号 (设置ID为0,安装一个全局的钩子)返回参数为钩子句柄