2012-12-10 80 views
0

當我運行我的程序時發生了一些奇怪的事情。當我使用VS 2010中的「Start Without Debugging」選項運行它時,OpenProcess像往常一樣返回進程句柄,但是當我在Windows資源管理器中運行我的程序時,OpenProcess總是返回0?我調用了GetLastError,並在兩種情況下返回6(INVALID_HANDLE_VALUE)。我正在使用Windows XP SP3 有人可以幫我嗎?這是我寫的代碼:與OpenProcess卡住,總是返回0

HANDLE GetProcessHandle(TCHAR* szProcessName) 
{ 
    //Get the snapshot of all processes in the system 
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); 
    if (hSnap == INVALID_HANDLE_VALUE) 
    { 
     return INVALID_HANDLE_VALUE; 
    } 

    PROCESSENTRY32 pe32; 
    pe32.dwSize = sizeof(PROCESSENTRY32); 

    //Get the information of the first process 
    if (!Process32First(hSnap, &pe32)) 
    { 
     CloseHandle(hSnap); 
     return INVALID_HANDLE_VALUE; 
    } 

    //Loop through all processes 
    do 
    { 
     if (_tcscmp(szProcessName, pe32.szExeFile) == 0) 
     { 
      //Got the process ID 
      CloseHandle(hSnap); 
      printf("sz = %s; exe = %s; pid = %d\n", szProcessName, pe32.szExeFile, pe32.th32ProcessID); 
          //Error here, correct PID was found in both case 
      return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); 
     } 
    } 
    while (Process32Next(hSnap, &pe32)); 

    CloseHandle(hSnap); 
    return INVALID_HANDLE_VALUE; 
} 
+1

你確定*你去OpenProcess嗎?您的代碼將錯誤代碼作爲HANDLE值返回,並返回INVALID_HANDLE_VALUE很多。如果您將該函數作爲句柄傳遞給函數... –

+0

INVALID_HANDLE_VALUE == -1,而不是0.我確定我調用了正確的函數! – Name

回答

2

要打開的句柄到另一個地方的過程,並獲得完全訪問權限,您必須啓用SeDebugPrivilege特權。

VS2010有這個特權,但探索沒有。由於你的程序是一個子進程,它將繼承父母的特權。請致電MSDN doc

+0

我不認爲這是正確的。首先,他明確表示,他在不調試的情況下運行程序,但即使他沒有調試,檢查並驗證孩子是否啓用了SE_DEBUG_PRIVILEGE也是微不足道的事情。 –

+0

但是,exe仍然是從VS2010啓動的,這使得exe繼承了VS2010的特權 – Matt

+0

或許;我猜是值得一看的。對於它的價值,我的VS2010沒有啓用SE_DEBUG_PRIVILEGE。 –