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
Ninguno
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 remove.
A partir de KMDF 1.11, el controlador puede llamar opcionalmente a WdfDeviceInitSetRemoveLockOptions hacer 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, puede experimentar 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.
Después de que un controlador llame 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, vea Using Remove Locks.
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 | Valor |
---|---|
de la plataforma de destino de | Universal |
versión mínima de KMDF | 1.11 |
encabezado de | wdfdevice.h (incluya Wdf.h) |
biblioteca de | Wdf01000.sys (consulte Control de versiones de la biblioteca de marcos). |
irQL | <= DISPATCH_LEVEL |
reglas de cumplimiento de DDI | DriverCreate(kmdf) |