Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / АОПИ. Глава 2. Конспекты (02_04_19).rtf
Скачиваний:
65
Добавлен:
10.09.2019
Размер:
363.46 Кб
Скачать

Дублирование описателей объектов

BOOL DuplicateHandle(

IN HANDLE hSourceProcessHandle,

IN HANDLE hSourceHandle,

IN HANDLE hTargetProcessHandle,

IN LPHANDLE lpTargetHandle,

IN DWORD dwDesiredAccess,

IN BOOL bInheritHandle,

IN DWORD dwOptions

);

Параметры и описание:

(1) hSourceProcessHandle определяет дескриптор процесса с дескриптором, подлежащим дублированию. Дескриптор должен иметь право доступа PROCESS_DUP_HANDLE.

(2) hSourceHandle определяет дескриптор объекта для дублирования.

(3) hTargetProcessHandle определяет дескриптор процесса, который должен получить дублированный дескриптор. Дескриптор должен иметь право доступа PROCESS_DUP_HANDLE.

(4) lpTargetHandle определяет указатель на переменную, которая получает дубликат дескриптора.

(5) dwDesiredAccess определяет доступ, запрошенный для нового дескриптора. Этот параметр игнорируется, если параметр dwOptions указывает флаг DUPLICATE_SAME_ACCESS. В противном случае флаги, которые можно указать, зависят от типа объекта, дескриптор которого должен быть продублирован.

(6) bInheritHandle определяет переменную, которая указывает, является ли дескриптор наследуемым. Если TRUE, дубликат дескриптора может наследоваться новыми процессами, созданными целевым процессом. Если FALSE, новый дескриптор не может быть унаследован.

(7) dwOptions определяет опции. Этот параметр может быть нулем или любой комбинацией следующих значений:

DUPLICATE_CLOSE_SOURCE (0x00000001)

Закрывает дескриптор в процессе-источнике. Такое задание параметра позволяет процессам обмениваться объектом ядра как эстафетной палочкой. При этом счетчик объекта не меняется.

DUPLICATE_SAME_ACCESS (0x00000002)

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

Возвращаемое значение.

Если функция завершается успешно, возвращаемое значение отлично от нуля (bool: true), иначе возвращаемое значение равно нулю (bool: false).

Описание.

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

1) Процесс-катализатор.

2) Процесс-источник.

3) Процесс-приемник.

Иллюстрация работы функции DuplicateHandle.

Исходное состояние

Процесс-катализатор, вызывающий функцию DuplicateHandle содержит следующую таблицу описателей.

Индекс Указатель Маска Флаги

1 0xF0000000 0x???????? 0x00000000

2 0xF0000010 0x???????? 0x00000000

Первый индекс — объект ядра процесса-источника, имеющего доступ к какому-то объекту ядра.

Второй индекс — объект ядра процесса-приемника, который получит доступ к тому же объекту ядра.

Процесс-источник, имеющий доступ к какому-то объекту ядра, содержит следующую таблицу описателей.

Индекс Указатель Маска Флаги

1 0XF0000000 (неприм.) (неприм.)

2 0xF0000020 0x???????? 0x00000000

Как видно, процесс-источник содержит только одну запись со значением индекса, равным 2.

неприм. — неприменим

0xF0000020 идентифицирует объект ядра любого типа.

Процесс-приемник, который получит доступ к тому же объекту ядра, содержит следующую таблицу описателей.

Индекс Указатель Маска Флаги