如何在NT下获取进程的路径(增补)

 
如何在NT下获取进程的路径——获取NT中系统进程的路径

整理:Ackarlix
下载源代码

一、程序说明

  最近整理文档,发现以前写的《如何在NT下获取进程的路径》一文中还有个问题没有解决:原文中的程序无法获取系统进程的路径,如:csrss.exe。记得VCKBASE上有位网友说过一个方法:给枚举的进程增加SE_DEBUG_NAME权限即可,于是在网上找了些资料,解决了原文中的问题。这里要特别感谢那位名叫rovershen的网友!

我自定义了一个函数,用来赋予进程指定的权限(本例为SE_DEBUG_NAME):
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{
      
       TOKEN_PRIVILEGES tkp;
      
       LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
       tkp.PrivilegeCount=1;
       tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
      
       return( (GetLastError()==ERROR_SUCCESS) );
      
}            
  通过OpenProcessToken函数获得进程(本例为自身进程)访问令牌的句柄,然后调用此函数后就可以像原文那样打开目标进程获取路径了。可以看到:本方法已经成功获取了系统进程csrss.exe的路径。

二、具体实践
//
/ *    ShowProcessPath 2.0
 *     版权所有 (C) 2005 赵春生
 *     2005.09.02
 *     http://timw.yeah.net
 *     http://timw.126.com
 *     本程序适用于:WinNT
 *     代码在Win2000P+SP4 + VC6+SP6测试通过
*/
//
 
#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )
 
//自定义函数:赋予指定特权。这里用来提升程序权限。
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);
 
int main(void)
{     
       DWORD processid[1024],needed,processcount,i;
       HANDLE hProcess;
       HMODULE hModule;
       char path[MAX_PATH] = "",temp[256];
      
       HANDLE hToken;
      
       printf("ShowProcessPath 2.0 with [Process Status API]/n/n");
      
       if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) )
       {
              if (EnablePrivilege(hToken,SE_DEBUG_NAME))
              {
                   
                    EnumProcesses(processid, sizeof(processid), &needed);
                    processcount=needed/sizeof(DWORD);
                   
                    for (i=0;i<processcount;i++)
                    {
                           hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
                                                   false,
                                                   processid[i]);
                           if (hProcess)
                           {
                                  EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
                                  GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
                                  GetShortPathName(path,path,256);
                                  itoa(processid[i],temp,10);
                                  printf("%s --- %s/n",path,temp);
                           }
                           else
                                  printf("Failed!!!/n");
                    }
              }
       }
      
       CloseHandle(hProcess);
       CloseHandle(hModule);
      
       itoa(processcount,temp,10);
       printf("/nProcess Count:%s/n/n",temp);
      
       return 0;
}
 
//
 
BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)
{     
       TOKEN_PRIVILEGES tkp;
      
       LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限
       tkp.PrivilegeCount=1;
       tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
       AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限
      
       return( (GetLastError()==ERROR_SUCCESS) );     
}     
三、以上代码在Win2000P+SP4 + VC6+SP6测试通过。

源码可从我的个人主页下载。
http://timw.yeah.net
http://timw.126.com
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值