Función WdfDeviceInitSetRemoveLockOptions (wdfdevice.h)
[Solo se aplica a KMDF]
El método WdfDeviceInitSetRemoveLockOptions hace que el marco adquiera un bloqueo de eliminación antes de entregar un IRP de cualquier tipo al controlador.
Sintaxis
void WdfDeviceInitSetRemoveLockOptions(
[in] PWDFDEVICE_INIT DeviceInit,
[in] PWDF_REMOVE_LOCK_OPTIONS Options
);
Parámetros
[in] DeviceInit
Puntero proporcionado por el autor de la llamada a una estructura WDFDEVICE_INIT .
[in] Options
Puntero a una estructura de WDF_REMOVE_LOCK_OPTIONS .
Valor devuelto
None
Observaciones
De forma predeterminada, el marco adquiere un bloqueo de eliminación antes de que entregue irP de los siguientes tipos principales al controlador:
- IRP_MJ_PNP
- IRP_MJ_POWER
- IRP_MJ_SYSTEM_CONTROL
Cuando se completa el IRP, el marco libera el bloqueo de eliminación.
A partir de KMDF 1.11, el controlador puede llamar opcionalmente a WdfDeviceInitSetRemoveLockOptions para que el marco adquiera un bloqueo de eliminación antes de entregar todos los tipos IRP, no solo los enumerados anteriormente.
Si el controlador tiene clientes en modo kernel que envían E/S sin sincronizar con el estado PnP del dispositivo, es posible que experimente bloqueos debido a que los IRP de E/S llegan después de quitar el objeto de dispositivo de marco. En este caso, puede llamar a WdfDeviceInitSetRemoveLockOptions. A continuación, cuando un cliente envía una solicitud de E/S al dispositivo:
- Si el dispositivo aún no se ha quitado, el bloqueo de eliminación se adquiere correctamente y se entrega la solicitud. Si la eliminación se produce más adelante, el marco llama a IoReleaseRemoveLockAndWait , que se bloquea hasta que se liberan todas las adquisiciones de bloqueo correctas (se completan las solicitudes de E/S).
- Si el dispositivo ya ha procesado IRP_MN_REMOVE_DEVICE, pero hay una referencia pendiente a un objeto de dispositivo WDM que impide que el dispositivo se libere, el bloqueo de eliminación no se adquiere y el marco completa la solicitud inmediatamente.
Una vez que un controlador llama a WdfDeviceInitSetRemoveLockOptions, la configuración permanece en vigor durante la vigencia del objeto de dispositivo de marco.
Para obtener más información sobre cómo quitar bloqueos, consulte Uso de bloqueos de eliminación.
Ejemplos
En este ejemplo de código se inicializa una estructura de WDF_REMOVE_LOCK_OPTIONS y se llama a WdfDeviceInitSetRemoveLockOptions.
WDF_REMOVE_LOCK_OPTIONS RemoveLockOptions;
WDF_REMOVE_LOCK_OPTIONS_INIT(
&RemoveLockOptions,
WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO
);
WdfDeviceInitSetRemoveLockOptions(
DeviceInit,
&RemoveLockOptions
);
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Universal |
Versión mínima de KMDF | 1.11 |
Encabezado | wdfdevice.h (incluir Wdf.h) |
Library | Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos). |
IRQL | <= DISPATCH_LEVEL |
Reglas de cumplimiento de DDI | DriverCreate(kmdf) |