当前位置导航:炫浪网>>网络学院>>网络应用>>服务器架设>>Windows Server

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

源码下载

  一、程序说明

  最近整理文档,发现以前写的《如何在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测试通过。

相关内容
赞助商链接