程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何在NT下獲取進程的路徑(增補)

如何在NT下獲取進程的路徑(增補)

編輯:關於VC++

一、程序說明

最近整理文檔,發現以前寫的《如何在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測試通過。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved