Являются ли ручки winapi глобальными? - PullRequest
7 голосов
/ 23 марта 2012

Очень простой вопрос, если я создаю HANDLE в app1.exe и он получает значение 0x01, является ли это значение глобально уникальным?

Или возможно, что когда какой-то другой процесс создает HANDLE, который также имеет значение 0x01.

Если они не уникальны, какую другую конструкцию я могу использовать, чтобы получить уникальный идентификатор, совместимый с дескрипторами (такой, что будет * * * * * очень маловероятно, что HANDLEс этим идентификатором создается в другом месте).

Ответы [ 3 ]

6 голосов
/ 23 марта 2012

Важно понимать, что дескрипторы не являются объектами. Дескрипторы являются указателями (или индексами) на таблицу объектов для каждого процесса. Чтобы ответить на ваш вопрос, РУЧКИ не являются глобально уникальными, но они имеют смысл, чтобы иметь смысл только внутри определенного процесса.

Чтобы любой объект ядра мог быть доступен из другого процесса, вам нужно DuplicateHandle .

Другой способ поделиться объектами между процессами - вызвать CreateProcess с bInheritHandles , установленным в true .

3 голосов
/ 23 марта 2012

Они не уникальны. HANDLE значения являются локальными для текущего процесса. Одно и то же значение может быть недействительным дескриптором или ссылаться на другой объект в другом процессе. Исключением из этого правила являются дескрипторы, унаследованные от родительского процесса.

Единственный способ получить уникальный идентификатор без централизованного реестра - использовать GUID. Но они не совместимы с HANDLE, они 128-битные, а дескрипторы 32 или 64-битные.

2 голосов
/ 23 марта 2012

Используйте DuplicateHandle для передачи дескрипторов между процессами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...