Функция 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 не поддерживается для объектов элементов управления.
 
Как правило, драйвер вызывает WdfDeviceInitSetRemoveLockOptions из функции обратного вызова EvtDriverDeviceAdd непосредственно перед вызовом WdfDeviceCreate.

После вызова драйвера 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)

См. также раздел

WDF_REMOVE_LOCK_OPTIONS

WDF_REMOVE_LOCK_OPTIONS_FLAGS

WDF_REMOVE_LOCK_OPTIONS_INIT