Compartir a través de


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.
NotaWdfDeviceInitSetRemoveLockOptions no se admite en objetos de control.
 
Normalmente, un controlador llama a función de devolución de llamada WdfDeviceInitSetRemoveLockOp tions desde su EvtDriverDeviceAdd función de devolución de llamada, justo antes de llamar a WdfDeviceCreate.

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)

Consulte también

WDF_REMOVE_LOCK_OPTIONS

WDF_REMOVE_LOCK_OPTIONS_FLAGS

WDF_REMOVE_LOCK_OPTIONS_INIT