Функция WdfIoTargetWdmGetTargetFileHandle (wdfiotarget.h)
[Применимо к KMDF и UMDF]
Метод WdfIoTargetWdmGetTargetFileHandle возвращает дескриптор файла, связанного с указанным удаленным целевым объектом ввода-вывода.
Синтаксис
HANDLE WdfIoTargetWdmGetTargetFileHandle(
[in] WDFIOTARGET IoTarget
);
Параметры
[in] IoTarget
Дескриптор удаленного целевого объекта ввода-вывода. Этот дескриптор был получен из предыдущего вызова WdfIoTargetCreate.
Возвращаемое значение
Если драйвер указал имя объекта при вызове WdfIoTargetOpen, WdfIoTargetWdmGetTargetFileHandle возвращает дескриптор файла, связанный с указанным целевым объектом ввода-вывода. В противном случае WdfIoTargetGetTargetFileHandle возвращает NULL.
Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Замечания
Для KMDF возвращенный дескриптор файла — это дескриптор режима ядра, допустимый в произвольном контексте потока. Сведения о том, как драйвер может использовать этот дескриптор файла, см. в использованиедескриптора файлов.
Дескриптор файла, который возвращает метод WdfIoTargetGetTargetFileHandle, пока драйвер не вызывает WdfIoTargetClose или WdfIoTargetCloseForQueryRemoveили до удаления удаленного целевого объекта ввода-вывода. Если драйвер предоставляет функцию EvtCleanupCallback для удаленного целевого объекта ввода-вывода и если объект удаляется до закрытия удаленного целевого объекта ввода-вывода, указатель действителен до тех пор, пока не будет возвращена функция EvtCleanupCallback.
Если драйвер пытается получить доступ к объекту устройства WDM после его удаления, драйвер может вызвать сбой системы. В примере toastmon показано, как драйвер может предоставить функцию обратного вызова EvtIoTargetQueryRemove, чтобы она была уведомлена об удалении целевого объекта ввода-вывода.
Для UMDF WdfIoTargetWdmGetTargetFileHandle возвращает допустимый ДЕСКРиптор Win32 только в текущем процессе. Устаревший драйвер UMDF (версия 1.x) вызывает вызовы IWDFDevice::RetrieveDeviceName, чтобы получить имя базового устройства в режиме ядра, а затем открывает к нему дескриптор с CreateFile. Затем драйвер может отправлять ввод-вывод непосредственно на более низкие устройства с помощью DeviceIoControl. Начиная с версии UMDF 2.15 драйверы UMDF версии 2 могут открывать локальный целевой объект ввода-вывода по файлу (WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_FILE) и извлекать дескриптор файла с помощью WdfIoTargetGetTargetFileHandle. Платформа открывает и закрывает дескриптор файла при закрытии или удалении удаленного целевого объекта. Дескриптор файла остается допустимым в контракте WdfIoTargetGetTargetFileHandle описано выше.
Предупреждение
Если драйвер UMDF версии 2 вызывает WdfIoTargetGetTargetFileHandle для получения дескриптора Win32 из удаленного целевого объекта, открытого с помощью WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_FILE, не отправляйте перекрывающиеся и асинхронные операции ввода-вывода с api, например DeviceIoControl. Это может завершить процесс размещения драйвера. Если драйвер должен отправить перекрывающиеся операции ввода-вывода, он также должен задать низкоупорядоченный бит hEvent элемента OVERLAPPED структуры. Это связано с тем, что платформа внутренне привязывает дескриптор к порту завершения ввода-вывода. Допустимый дескриптор событий, бит которого имеет низкий порядок, сохраняет завершение ввода-вывода от очереди до порта завершения.
Дополнительные сведения о WdfIoTargetWdmGetTargetFileHandleсм. в получении сведений об общем целевом объекте ввода-вывода.
Дополнительные сведения о целевых объектах ввода-вывода см. в разделе Использование целевых объектов ввода-вывода.
Примеры
В следующем примере кода получается дескриптор файла, связанного с указанным удаленным целевым объектом ввода-вывода.
HANDLE h;
h = WdfIoTargetWdmGetTargetFileHandle(IoTarget);
Устаревший драйвер UMDF (версия 1.x) вызывает вызовы IWDFDevice::RetrieveDeviceName, чтобы получить имя базового устройства в режиме ядра, а затем открыть к нему дескриптор с CreateFile. Затем драйвер отправляет ввод-вывод непосредственно на устройство с помощью DeviceIoControl.
Начиная с версии UMDF 2.15 драйвер открывает локальный целевой объект ввода-вывода по файлу и извлекает его дескриптор. Платформа открывается и закрывает дескриптор файла. Дескриптор файла остается допустимым в контракте WdfIoTargetGetTargetFileHandle.
NTSTATUS status;
WDF_IO_TARGET_OPEN_PARAMS params;
WDFIOTARGET ioTarget = NULL;
HANDLE handle = NULL;
status = WdfIoTargetCreate(Device, &attr, &ioTarget);
if (!NT_SUCCESS(status)) {
// error handling
}
WDF_IO_TARGET_OPEN_PARAMS_INIT_OPEN_BY_FILE(¶ms, NULL);
status = WdfIoTargetOpen(ioTarget, ¶ms);
if (!NT_SUCCESS(status)) {
// error handling
}
handle = WdfIoTargetWdmGetTargetFileHandle(ioTarget);
if (handle == NULL) {
// error handling
}
if (ioTarget != NULL) {
WdfIoTargetClose(ioTarget);
}
// You can now call DeviceIoControl(handle, ...) etc.
// NOTE: See Warning above on submitting overlapped or asynchronous I/O
Требования
Требование | Ценность |
---|---|
целевая платформа | универсальный |
минимальная версия KMDF | 1.0 |
минимальная версия UMDF | 2.15 |
Заголовок | wdfiotarget.h (include Wdf.h) |
Библиотека | Wdf01000.sys (см. управление версиями библиотеки Платформы).) |
IRQL | <=DISPATCH_LEVEL |
правил соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |