Как сравнить две переменные типа HANDLE

У меня есть переменная типа HANDLE. Первая переменная HANDLE - это процесс HANDLE (с именем hProcess), который не имеет права доступа PROCESS_QUERY_INFORMATION. Вторая переменная - это процесс HANDLE (с именем hwndProcess), который я открыл с помощью функции OpenProcess и имею право доступа PROCESS_QUERY_INFORMATION. Я уверен, что у обоих процессов должен быть одинаковый дескриптор. Но когда я сравниваю их, как показано ниже, он возвращает false; if (hProcess == hwndProcess) {сделать что-нибудь} Как мне это сделать?


person Phoenix    schedule 17.08.2010    source источник


Ответы (3)


Не существует явного способа проверить, относятся ли два дескриптора к одному и тому же процессу. Единственный способ - запросить информацию о процессе и проверить это, например используя GetProcessId на каждом дескрипторе для проверки идентификаторов процессов.

Если у вас нет необходимых прав доступа для вызова нужных функций запроса, вы можете попробовать вызвать DuplicateHandle, чтобы получить новый дескриптор с дополнительными правами доступа. Однако, если это не удается, у вас нет возможности узнать, относятся ли дескрипторы к одному и тому же процессу или нет.

person Anthony Williams    schedule 17.08.2010
comment
синтаксис DuplicateHandle ниже. BOOL WINAPI DuplicateHandle (__in HANDLE hSourceProcessHandle, __in HANDLE hSourceHandle, __in HANDLE hTargetProcessHandle, __out LPHANDLE lpTargetHandle, __in DWORD dwDesired__ DWAccess, __in BOOL d, Inherit BOOL d, __in BOOL d, __in BOOL d, Inherit dwDesired DWAccess, __in BOOL d) dwOptions может получить одно из двух следующих значений (DUPLICATE_CLOSE_SOURCE или DUPLICATE_SAME_ACCESS) или любую их комбинацию. теперь я могу присоединить эти значения с помощью тега PROCESS_QUERY_INFORMATION. - person Phoenix; 17.08.2010
comment
Установите для dwOptions значение 0 и установите для dwDesiredAccess требуемые права доступа (например, PROCESS_QUERY_INFORMATION и все, что вам нужно). - person Anthony Williams; 17.08.2010

hProcess не должен содержать ProcessHandle процесса, который будет закрыт. Он может и будет в большинстве случаев иметь значение NULL. Я делаю что-то подобное, чтобы получить PID завершенных процессов.
if((hProcess == NULL) || (hProcess == GetCurrentProcess())){
pid = GetCurrentProcessId();
} else {
pid = ProcessHandleToId(hProcess); }

Вы уверены, что это проблема с правами доступа и ваша функция не дает сбоя, потому что дескриптор NULL?

person christian    schedule 17.08.2010

В Windows 10 SDK есть CompareObjectHandles (HANDLE, HANDLE), который возвращает TRUE, если дескрипторы относятся к одному и тому же базовому объекту ядра. И вам не нужно беспокоиться о правах доступа.

person Matthew    schedule 21.05.2019