У меня есть переменная типа HANDLE. Первая переменная HANDLE - это процесс HANDLE (с именем hProcess), который не имеет права доступа PROCESS_QUERY_INFORMATION. Вторая переменная - это процесс HANDLE (с именем hwndProcess), который я открыл с помощью функции OpenProcess и имею право доступа PROCESS_QUERY_INFORMATION. Я уверен, что у обоих процессов должен быть одинаковый дескриптор. Но когда я сравниваю их, как показано ниже, он возвращает false; if (hProcess == hwndProcess) {сделать что-нибудь} Как мне это сделать?
Как сравнить две переменные типа HANDLE
Ответы (3)
Не существует явного способа проверить, относятся ли два дескриптора к одному и тому же процессу. Единственный способ - запросить информацию о процессе и проверить это, например используя GetProcessId
на каждом дескрипторе для проверки идентификаторов процессов.
Если у вас нет необходимых прав доступа для вызова нужных функций запроса, вы можете попробовать вызвать DuplicateHandle
, чтобы получить новый дескриптор с дополнительными правами доступа. Однако, если это не удается, у вас нет возможности узнать, относятся ли дескрипторы к одному и тому же процессу или нет.
hProcess не должен содержать ProcessHandle процесса, который будет закрыт. Он может и будет в большинстве случаев иметь значение NULL. Я делаю что-то подобное, чтобы получить PID завершенных процессов. if((hProcess == NULL) || (hProcess == GetCurrentProcess())){
pid = GetCurrentProcessId();
} else {
pid = ProcessHandleToId(hProcess);
}
Вы уверены, что это проблема с правами доступа и ваша функция не дает сбоя, потому что дескриптор NULL?
В Windows 10 SDK есть CompareObjectHandles (HANDLE, HANDLE), который возвращает TRUE, если дескрипторы относятся к одному и тому же базовому объекту ядра. И вам не нужно беспокоиться о правах доступа.