Condividi tramite


Funzione WdfDeviceInitSetRemoveLockOptions (wdfdevice.h)

[Si applica solo a KMDF]

Il metodo WdfDeviceInitSetRemoveLockOptions causa l'acquisizione di un blocco di rimozione prima di distribuire un'IRP di qualsiasi tipo al driver.

Sintassi

void WdfDeviceInitSetRemoveLockOptions(
  [in] PWDFDEVICE_INIT          DeviceInit,
  [in] PWDF_REMOVE_LOCK_OPTIONS Options
);

Parametri

[in] DeviceInit

Puntatore fornito dal chiamante a una struttura di WDFDEVICE_INIT .

[in] Options

Puntatore a una struttura di WDF_REMOVE_LOCK_OPTIONS .

Valore restituito

nessuno

Osservazioni

Per impostazione predefinita, il framework acquisisce un blocco di rimozione prima di recapitare irP dei tipi principali seguenti al driver:

IRP_MJ_PNP
IRP_MJ_POWER
IRP_MJ_SYSTEM_CONTROL

Al termine dell'IRP, il framework rilascia il blocco di rimozione.

A partire da KMDF 1.11, il driver può chiamare facoltativamente WdfDeviceInitSetRemoveLockOptions per causare l'acquisizione di un blocco di rimozione prima di distribuire tutti i tipi di IRP, non solo quelli elencati sopra.

Se il driver dispone di client in modalità kernel che inviano i/O non sincronizzati con lo stato PnP del dispositivo, potrebbe verificarsi un arresto anomalo a causa di I/O IRP che arrivano dopo la rimozione dell'oggetto dispositivo framework. In questo caso, è possibile chiamare WdfDeviceInitSetRemoveLockOptions. Quindi, quando un client invia una richiesta di I/O al dispositivo:

  • Se il dispositivo non è ancora stato rimosso, il blocco di rimozione viene acquisito correttamente e la richiesta viene recapitata. Se la rimozione avviene in un secondo momento, il framework chiama IoReleaseRemoveLockAndWait che blocca fino a quando non vengono rilasciate tutte le acquisizioni di blocchi riuscite (le richieste di I/O vengono completate).
  • Se il dispositivo ha già elaborato IRP_MN_REMOVE_DEVICE, ma esiste un riferimento in sospeso a un oggetto dispositivo WDM che impedisce il rilascio del dispositivo, il blocco di rimozione non viene acquisito e il framework completa immediatamente la richiesta.
NotaWdfDeviceInitSetRemoveLockOptions non è supportato negli oggetti di controllo.
 
In genere, un driver chiama WdfDeviceInitSetRemoveLockOptions dall'interno della sua funzione EvtDriverDeviceAdd callback, appena prima di chiamare WdfDeviceCreate.

Dopo che un driver chiama WdfDeviceInitSetRemoveLockOptions, l'impostazione rimane in vigore per la durata dell'oggetto dispositivo framework.

Per altre informazioni sulla rimozione dei blocchi, vedere Uso di blocchi di rimozione.

Esempio

Questo esempio di codice inizializza una struttura WDF_REMOVE_LOCK_OPTIONS e chiama WdfDeviceInitSetRemoveLockOptions.


WDF_REMOVE_LOCK_OPTIONS RemoveLockOptions;

WDF_REMOVE_LOCK_OPTIONS_INIT(
                             &RemoveLockOptions,
                             WDF_REMOVE_LOCK_OPTION_ACQUIRE_FOR_IO
                             );
WdfDeviceInitSetRemoveLockOptions(
                                  DeviceInit,
                                  &RemoveLockOptions
                                  );

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1.11
Intestazione wdfdevice.h (includere Wdf.h)
Libreria Wdf01000.sys (vedere Framework Library Versioning).
IRQL <= DISPATCH_LEVEL
Regole di conformità DDI DriverCreate(kmdf)

Vedi anche

WDF_REMOVE_LOCK_OPTIONS

WDF_REMOVE_LOCK_OPTIONS_FLAGS

WDF_REMOVE_LOCK_OPTIONS_INIT