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.
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) |