Windows XP下有几种获取进程名的方法,现在总结如下:
1. 通过EPROCESS结构查找
系统中存在一个描述所有活动进程信息的链表,通过NtQueryInformationProcess可以获取该链表,并检索这个活动链表,找到目标进程的EPROCESS结构。在该EPROCESS结构中找进程环境块(PEB)中的映像信息,即模块列表。从而可以枚举到进程所使用到的exe模块,也就是进程名了。
这个方法需要对EPROCESS结构比较熟悉,并且了解内核信息。因此使用这个方法比较复杂。
2. PSAPI函数
PSAPI中有一些函数用于对系统作快照,并获取进程相关信息。使用PSAPI获取系统中正在运行的进程名时,首先需要获取进程句柄。通用的方法是使用EnumProcesses获取系统中正在运新的所有进程ID,然后调用OpenProcess以PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限打开进程,将得到的进程句柄用于EnumProcessModules的参数获取该进程的所有模块。一般来说,第一个模块就是进程的exe模块。
这里的目标是获取本进程名,因此可以采用GetCurrentPocess简单的获取本进程的伪句柄,然后使用EnumProcessModules获取进程所有加载的模块。
这个方法比较简单!
3. GetModuleBaseName
根据MSDN,该函数用于获取指定模块的基本的名称,原型如下:
DWORD
GetModuleBaseName(
HANDLE hProcess,
HMODULE hModule,
LPTSTR lpBaseName,
DWORD nSize
);
另外部分参数的说明如下:
hProcess
[in] Handle to the process that contains the module. If this
parameter is NULL, GetModuleBaseName uses the current
process.
hModule
[in] Handle to the module. If this parameter is NULL, this returns
the name of the file used to create the calling process.
测试发现,hProcess不能使用实参NULL。取hModule为NULL的时候,能够获取创建进程的模块名,也就是进程名。
阅读(1880) | 评论(0) | 转发(0) |