Совместное использование объектов ядра несколькими процессами. Дублирование описателей объектов
Последний механизм совместного использования объектов ядра несколькими процессами требует функции 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.
Второй флаг приводит к закрытию описателя в процессе-источнике. Он позволяет процессам обмениваться объектом ядра как эстафетной палочкой. При этом счетчик объекта не меняется. Необходимость использовать этот флаг возникает крайне редко.