Что-то странное происходит, когда я запускаю свою программу. Когда я запускаю его с помощью параметра «Начать без отладки» в 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;
}
Чтобы открыть дескриптор другого локального процесса и получить права полного доступа, необходимо включить привилегию SeDebugPrivilege.
VS2010 имеет эту привилегию, но исследование не имеет. Поскольку ваша программа является дочерним процессом, она будет наследовать привилегии от родителей.
Для деталей, проверьте это Документ MSDN.
Других решений пока нет …