學(xué)習(xí)任務(wù)管理器中進(jìn)程管理部分發(fā)現(xiàn)問題.
      可以使用進(jìn)程枚舉出所有進(jìn)程,但是處理進(jìn)程的時(shí)候總是出現(xiàn)問題,無法操作進(jìn)程,包括訪問,結(jié)束.代碼如下:

 HANDLE hProcess=INVALID_HANDLE_VALUE;
 HANDLE hSnapshot=INVALID_HANDLE_VALUE;
 hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 PROCESSENTRY32 pe;
 Process32First(hSnapshot,&pe);
 do
 {
   // do what you want
  hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);
  if(hProcess==NULL) {
   _stprintf(szTemp,"OpenProcess() fail\n %d\n%s",GetLastError(),pe.szExeFile);
   wsprintf(szExePath,_T("%s"),"not get Process handle OpenProcess()");
  }else if(0==GetModuleFileNameEx((HINSTANCE)hProcess,NULL,szExePath,MAX_PATH))
  {
   _stprintf(szTemp,"GetModuleFileName() fail %d\n%s\n%s",GetLastError(),pe.szExeFile,szExePath);
   wsprintf(szExePath,_T("%s"),"not get Process handle GetModuleFileName()");
  }

  }
 while(Process32Next(hSnapshot,&pe));
 CloseHandle(hSnapshot); 

OpenProcess() 錯(cuò)誤ERROR CODE 5:拒絕訪問.需要取得相應(yīng)的權(quán)限.
OpenProcessToken函數(shù)的功能是打開一個(gè)與一進(jìn)程相聯(lián)系的訪問令牌(access token),它的原型如下:
BOOL OpenProcessToken(
  HANDLE ProcessHandle, 
  DWORD DesiredAccess, 
  PHANDLE TokenHandle
);

如同MSDN上所說,對(duì)于Windows XP Professional,如果一臺(tái)計(jì)算機(jī)加入到一個(gè)工作組中,而且"Force network logons using local accounts to authenticate as Guest"的限制被激活的話,此函數(shù)會(huì)失敗。

另外,如果在調(diào)用的時(shí)候使用了TOKEN_ALL_ACCESS請(qǐng)求,函數(shù)也可能會(huì)失敗。這是因?yàn)門OKEN_ALL_ACCESS可能包含了TOKEN_ADJUST_SESSIONID(在Winnt.h中被定義)。TOKEN_ADJUST_SESSIONID是一個(gè)新的訪問mask,是在Windows 2000和Windows XP中新增的。在Windows NT 4.0中,訪問令牌的訪問控制列表中是沒有這個(gè)值的。所以,如果一個(gè)應(yīng)用程序是使用新的Platform SDK中的Winnt.h但卻在Windows NT 4.0下運(yùn)行的話,在調(diào)用OpenProcessToken()或者OpenThreadToken時(shí)指定了TOKEN_ALL_ACCESS的話,函數(shù)也會(huì)失敗(使用GetLastError()返回的是ERROR_ACCESS_DENIED)。


typedef struct _TOKEN_PRIVILEGES {
  DWORD
PrivilegeCount;
  LUID_AND_ATTRIBUTES
PrivilegeCount;
  LUID_AND_ATTRIBUTES
Privileges[]; } TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;

BOOL AdjustTokenPrivileges(
  HANDLE
TokenHandle,              // handle to token
  BOOL TokenHandle,              // handle to token
  BOOL DisableAllPrivileges,       // disabling option
  PTOKEN_PRIVILEGES NewState,      // privilege information
  DWORD NewState,      // privilege information
  DWORD BufferLength,              // size of buffer
  PTOKEN_PRIVILEGES PreviousState, // original state buffer
  PDWORD PreviousState, // original state buffer
  PDWORD ReturnLength              // required buffer size
);

在枚舉所有進(jìn)程之前獲取操作權(quán)限,就可以避免出錯(cuò)的問題,當(dāng)然參數(shù)要設(shè)置為Enable.

BOOL ProcessPrivilege(BOOL bEnable)
{
 BOOL                   bResult = TRUE;
 HANDLE               hToken=INVALID_HANDLE_VALUE;
 TOKEN_PRIVILEGES     TokenPrivileges;

 if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0)
 {
     printf("OpenProcessToken Error: %d\n",GetLastError());
     bResult = FALSE;
 }
 TokenPrivileges.PrivilegeCount           = 1;
 TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
 LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);
 AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
    if(GetLastError() != ERROR_SUCCESS)
 {
     bResult = FALSE;
 }
 CloseHandle(hToken);
   
 return bResult;
}


THAT'S ALL.