Совместное использование объектов ядра несколькими процессами. Дублирование описателей объектов

Последний механизм совместного использования объектов ядра несколькими процессами требует функции DuplicateHandle:

BOOL DuplicateHandle(

HANDLE hSourceProcessHandle,

HANDLE hSourceHandle,

HANDLE hTargetProcessHandle,

PHANDLE phTargetHandle,

DWORD dwDESIredAccess,

BOOL bInheritHandle,

DWORD dwOptions);

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

Первый и третий параметры функции DuplicateHandleпредставляют собой описатели объектов ядра, специфичные для вызывающего процесса. Кроме того, эти параметры должны идентифицировать объекты ядра “процессы” – функция завершится с ошибкой, если передать описатели на объекты ядра любого другого типа. Объект ядра “процесс” создается при каждой инициализации в системе нового процесса.

Второй параметр hSourceHandlе, - описатель объекта ядра любого типа. Однако его значение специфично не для процесса, вызывающего DuplicateHandle, а для того, на который указывает описатель hSourceHandlе. Параметр phTargetHandle – адрес переменной типа HANDLE, в который возвращается индекс записи с копией описателя из процесса-источника. Значение возвращаемого описателя спецефично для процесса, идентифицируемого параметром hTargetProcessHandle.

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

Параметр dwOptions может быть 0 или любой другой комбинацией двух флагов: DUPLICATE_SAME_ACCESS и DUPLICATE_CLOSE_SOURCE.

Первый флаг подсказывает функции DuplicateHandle: у описателя, получаемого процессом-приемником, должна быть та же маска доступа, что и у описателя в процессе-источнике. Этот флаг заставляет DuplicateHandleигнорировать параметр dwDesiredAccess.

Второй флаг приводит к закрытию описателя в процессе-источнике. Он позволяет процессам обмениваться объектом ядра как эстафетной палочкой. При этом счетчик объекта не меняется. Необходимость использовать этот флаг возникает крайне редко.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: