2010-02-08 97 views
18

我有進程ID,我想獲得它的進程句柄。如何從進程ID獲取進程句柄?

有沒有可用的API。

我試圖使用OpenProcess,但它返回NULL,並GetLastError = 0。

這我試圖在Vista上。

我想我需要在使用OpenProcess之前啓用SeDebugPrivilege。 但爲了啓用SeDebugPrivilege,我需要獲取它的進程句柄。

+0

你能描述你爲什麼需要這個? – dirkgently 2010-02-08 11:11:49

+0

我已經爲ya添加了調試權限代碼 – bdd 2010-02-08 12:46:27

回答

22
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId); 

您需要驗證您是否使用了有效的進程ID,並且允許您從進程請求的訪問權限。

+0

procId有效。 – anand 2010-02-08 11:14:04

+11

不要求PROCESS_ALL_ACCESS,你不太可能在安全的安裝中獲得。只問你需要什麼。 – 2010-02-08 13:38:10

+5

對,試着要求SYNCHRONIZE,它幾乎不會失敗。然後從那裏提高請求的許可。 – 2010-02-08 19:12:17

9

這是你在找什麼?

HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId); 
CloseHandle(processHandle); 

此外,這裏是一些代碼,我用於設置調試privledge在注入DLL之前。

void Loader::EnableDebugPriv(void) 
{ 
    HANDLE    hToken; 
    LUID    SeDebugNameValue; 
    TOKEN_PRIVILEGES TokenPrivileges; 

    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    { 
     if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue)) 
     { 
      TokenPrivileges.PrivilegeCount    = 1; 
      TokenPrivileges.Privileges[0].Luid   = SeDebugNameValue; 
      TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

      if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) 
      { 
       CloseHandle(hToken); 
      } 
      else 
      { 
       CloseHandle(hToken); 
       throw std::exception("Couldn't adjust token privileges!");    
      } 
     } 
     else 
     { 
      CloseHandle(hToken); 
      throw std::exception("Couldn't look up privilege value!"); 
     } 
    } 
    else 
    { 
     throw std::exception("Couldn't open process token!"); 
    } 
} 

我已經在Windows Vista上成功使用了上述代碼。

+0

這將返回窗口句柄,而不是流程句柄 我正在尋找流程ID爲 – anand 2010-02-08 11:23:17

+1

的流程句柄正如Matt Joiner所說...參見上文。 – bdd 2010-02-08 11:34:45

1

您需要提升的權限。也看類似的問題here

1

我剛剛遇到了與上述完全相同的問題:OpenProcess()== NULL和GetLastError()== 0. 原來是Common Language RunTime Support設置,被設置爲「Pure」應該只是「共同」。花了我很長時間才發現。

對於VS2010 C++轉到 - >項目屬性 - >配置屬性 - > C/C++ - >常規