Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1667010
  • 博文数量: 584
  • 博客积分: 13857
  • 博客等级: 上将
  • 技术积分: 11883
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-16 09:34

分类: WINDOWS

2011-08-05 09:06:21

 
 
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的时候,能够获取创建进程的模块名,也就是进程名。
 
阅读(1812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~