Share via


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

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)

Consulte también

WDF_REMOVE_LOCK_OPTIONS

WDF_REMOVE_LOCK_OPTIONS_FLAGS

WDF_REMOVE_LOCK_OPTIONS_INIT