Как сравнить две переменные типа HANDLE - PullRequest
3 голосов
/ 17 августа 2010

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

Ответы [ 3 ]

5 голосов
/ 17 августа 2010

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

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

0 голосов
/ 21 мая 2019

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

0 голосов
/ 17 августа 2010

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

...