1

プログラムを実行すると、何か奇妙なことが起こります。VS 2010で[デバッグなしで開始]オプションを使用して実行すると、OpenProcessは通常どおりプロセスハンドルを返しますが、Windowsエクスプローラーでプログラムを実行すると、OpenProcessは常に0を返しますか?!! GetLastErrorを呼び出したところ、どちらの場合も6(INVALID_HANDLE_VALUE)が返されます。Windows XP SP3を使用しています。誰か助けてもらえますか?これが私が書いたコードです:

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;
}
4

1 に答える 1

2

別のローカル プロセスへのハンドルを開き、完全なアクセス権を取得するには、SeDebugPrivilege 特権を有効にする必要があります。

VS2010 にはこの権限がありますが、Explore にはありません。プログラムは子プロセスであるため、親から特権を継承します。

詳細については、このMSDN docを確認してください。

于 2012-12-10T06:46:42.607 に答える