Функция WdfDeviceInitSetRemoveLockOptions (wdfdevice.h)
[Относится только к KMDF]
Метод WdfDeviceInitSetRemoveLockOptions заставляет платформу получить блокировку удаления перед доставкой IRP любого типа в драйвер.
Синтаксис
void WdfDeviceInitSetRemoveLockOptions(
[in] PWDFDEVICE_INIT DeviceInit,
[in] PWDF_REMOVE_LOCK_OPTIONS Options
);
Параметры
[in] DeviceInit
Указатель на структуру WDFDEVICE_INIT , предоставленный вызывающим абонентом.
[in] Options
Указатель на структуру WDF_REMOVE_LOCK_OPTIONS .
Возвращаемое значение
None
Remarks
По умолчанию платформа получает блокировку удаления перед тем, как она доставляет драйверу IRP следующих основных типов:
- IRP_MJ_PNP
- IRP_MJ_POWER
- IRP_MJ_SYSTEM_CONTROL
После завершения IRP платформа снимает блокировку удаления.
Начиная с KMDF 1.11, драйвер может при необходимости вызвать WdfDeviceInitSetRemoveLockOptions , чтобы заставить платформу получить блокировку удаления перед доставкой всех типов IRP, а не только перечисленных выше.
Если у вашего драйвера есть клиенты в режиме ядра, которые отправляют операции ввода-вывода, не синхронизированные с состоянием PnP устройства, могут возникнуть сбои из-за операций irp ввода-вывода, поступающих после удаления объекта устройства платформы. В этом случае можно вызвать WdfDeviceInitSetRemoveLockOptions. Затем, когда клиент отправляет запрос ввода-вывода на устройство:
- Если устройство еще не было удалено, блокировка удаления успешно получается и запрос доставляется. Если удаление произойдет позже, платформа вызывает IoReleaseRemoveLockAndWait , который блокируется до тех пор, пока не будут освобождены все успешные приобретения блокировки (запросы ввода-вывода будут завершены).
- Если устройство уже обработало IRP_MN_REMOVE_DEVICE, но есть необработанные ссылки на объект устройства WDM, препятствующий освобождению устройства, блокировка удаления не будет получена и платформа немедленно завершает запрос.
После вызова драйвера WdfDeviceInitSetRemoveLockOptions параметр остается в силе в течение всего времени существования объекта устройства платформы.
Дополнительные сведения об удалении блокировок см. в разделе Использование функции удаления блокировок.
Примеры
Этот пример кода инициализирует структуру WDF_REMOVE_LOCK_OPTIONS и вызывает WdfDeviceInitSetRemoveLockOptions.
WDF_REMOVE_LOCK_OPTIONS RemoveLockOptions;
WDF_REMOVE_LOCK_OPTIONS_INIT(
&RemoveLockOptions,
WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO
);
WdfDeviceInitSetRemoveLockOptions(
DeviceInit,
&RemoveLockOptions
);
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1.11 |
Верхняя часть | wdfdevice.h (включая Wdf.h) |
Библиотека | Wdf01000.sys (см. раздел Управление версиями библиотеки Платформы). |
IRQL | <= DISPATCH_LEVEL |
Правила соответствия DDI | DriverCreate(kmdf) |