BOOL DuplicateHandle( HANDLE hSourceProcessHandle, // дескриптор процесса с дескриптором HANDLE hSourceHandle, // дескриптор для дублирования HANDLE hTargetProcessHandle, // дескриптор процесса-назначения LPHANDLE lpTargetHandle, // адрес дескриптора-дубликата DWORD dwDesiredAccess, // доступ к дескриптору-дубликату BOOL bInheritHandle, // флаг наследования дескриптора DWORD dwOptions // необязательные действия );
Параметры:
hSourceProcessHandle | Определяет процесс, содержащий дескриптор для дублирования. Этот дескриптор должен иметь доступ PROCESS_DUP_HANDLE. | ||||||
hSourceHandle | Определяет дескриптор для дублирования. Это дескриптор открытого объекта, который действителен в контексте процесса-источника. | ||||||
hTargetProcessHandle | Определяет процесс, который получает дескриптор-дубликат. Этот дескриптор должен иметь доступ PROCESS_DUP_HANDLE. | ||||||
lpTargetHandle | Адрес переменной, которая получает значение дескриптора-дубликата. Это значение дескриптора действителено в контексте целевого процесса. Если lpTargetHandle равен NULL, функция дублирует дескриптор, но не возвращает значение дескриптора-дубликата. | ||||||
dwDesiredAccess | Определяет доступ, запрашиваемый для нового дескриптора. Этот параметр игнорируется, если параметр dwOptions определяет флаг DUPLICATE_SAME_ACCESS. Иначе, флаг, который может быть определен, зависимит от типа объекта, чей дескриптор будет дублирован. Учтите, что новый дескриптор может иметь больше доступа, чем начальный дескриптор. | ||||||
bInheritHandle | Определяет, будет-ли дескриптор наследуемым. Если TRUE, дескриптор-дубликат может быть наследован новым процессом, созданным конечным процессом. Если FALSE, новый дескриптор не может быть унаследован. | ||||||
dwOptions | Определяет необязательные действия. Этот параметр может быть нулевым, или комбинацией следующих значений:
|
Возвращаемые значения:
При успешном завершении, функция возвращает ненулевое значение.При ошибке возвращается ноль. Для получения дополнительной информации об ошибке, вызовите GetLastError.
Замечания:
DuplicateHandle может быть вызвана или процессом-источником, или целевым процессом. Она также может быть вызвана, когда источник и целевой процесс – это одно и тоже. Например, процесс может вызвать DuplicateHandle для создания ненаследуемого дубликата наследуемого дескриптора, или дескриптор с другим доступом чем у оригинального дескриптора.Дублирующий процесс использует функцию GetCurrentProcess для получения дескриптора на себя. При получении дескриптора другого процесса, он может быть необходим для использования его некоторыми формами межпроцессорного взаимодействия (например, именованые каналы или разделяемые каналы) для соединения идентификатора процесса к дублирующему процессу. Этот идентификатор затем используется в функции OpenProcess для открытия дескриптора.
Если процесс, который вызывает DuplicateHandle, не является целевым процессом, дублирующий процесс должен воспользоваться межпроцессорным взаимодействием для передачи значения дескриптора-дубликата к целевому процессу.
Дескриптор-дубликат – это тот-же дескриптор объекта, что и дескриптор-источник. Это значит, что состояние объекта то же самое для обоих дескрипторов. Например, текущий файл, назначеный для файлового дескриптора, один для обоих дескрипторов.
DuplicateHandle может дублировать дескриптор для следующих объектов:
- Ввод консоли
- Буфер экрана консоли
- Событие
- Файл для устройств комуникации
- Файл планирования
- Мьютекс
- Канал
- Процесс
- Ключ реестра
- Семафор
- Поток