Condividi tramite


Funzione WdfWaitLockAcquire (wdfsync.h)

[Si applica a KMDF e UMDF]

Il metodo WdfWaitLockAcquire acquisisce un blocco di attesa specificato.

Sintassi

NTSTATUS WdfWaitLockAcquire(
  [in]           WDFWAITLOCK Lock,
  [in, optional] PLONGLONG   Timeout
);

Parametri

[in] Lock

Handle per un oggetto wait-lock del framework, ottenuto da una chiamata precedente a WdfWaitLockCreate.

[in, optional] Timeout

Puntatore facoltativo a un valore di timeout. Il valore di timeout viene specificato nelle unità di tempo di sistema (intervalli di 100 nanosecondi).

Se il puntatore è diverso da NULL, il framework annulla il tentativo di ottenere il blocco se non viene completato entro il periodo di timeout specificato. I valori di timeout possono essere negativi, positivi o zero, come indicato di seguito:

  • Se il valore di timeout è negativo, la scadenza è relativa all'ora di sistema corrente.
  • Se il valore di timeout è positivo, l'ora di scadenza viene specificata come ora assoluta (che è effettivamente relativa all'1 gennaio 1601).
  • Se il valore di timeout è zero, WdfWaitLockAcquire tenta di acquisire il blocco e quindi restituisce immediatamente, indipendentemente dal fatto che abbia acquisito o meno il blocco.
Le scadenze relative non sono interessate da modifiche apportate all'ora di sistema che potrebbero verificarsi entro il periodo di timeout specificato. Le ore di scadenza assolute riflettono le modifiche all'ora di sistema.

Il framework fornisce funzioni di conversione dell'ora che converte i valori temporali in unità di tempo di sistema.

Se il chiamante fornisce un puntatore NULL , il metodo attende per un periodo illimitato fino a quando non ha acquisito il blocco.

Valore restituito

WdfWaitLockAcquire può restituire i valori NTSTATUS seguenti:

Codice restituito Descrizione
STATUS_SUCCESS
Il chiamante ha acquisito il blocco di attesa.
STATUS_TIMEOUT
Intervallo di timeout specificato scaduto prima dell'acquisizione del blocco.
 

Si noti che NT_SUCCESS(status) è uguale a TRUE per tutti questi valori di stato.

Il chiamante non deve controllare il valore restituito se il puntatore timeout è NULL, perché in questo caso WdfWaitLockAcquire restituisce solo dopo che ha acquisito il blocco.

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Commenti

Il metodo WdfWaitLockAcquire non restituisce finché non acquisisce il blocco di attesa o fino alla scadenza del periodo di timeout.

WdfWaitLockAcquire chiama KeEnterCriticalRegion prima di acquisire il blocco di attesa. Di conseguenza, quando il metodo viene restituito, le NORMALI API del kernel sono disabilitate. WdfWaitLockAcquire non modifica l'IRQL del chiamante.

Se il puntatore timeout è NULL o se il valore di timeout non è zero, WdfWaitLockAcquire deve essere chiamato in IRQL = PASSIVE_LEVEL.

Se il valore di timeout è zero, WdfWaitLockAcquire deve essere chiamato in IRQL < DISPATCH_LEVEL. Si noti che questo è in disaccordo con il file di intestazione (wdfsync.h), che indica che questo metodo può essere chiamato in DISPATCH_LEVEL.

Per altre informazioni sui blocchi di attesa, vedere Tecniche di sincronizzazione per i driver Framework-Based.

Esempio

L'esempio di codice seguente acquisisce un blocco di attesa, aggiunge un oggetto dispositivo a una raccolta di oggetti e rilascia il blocco di attesa.

WdfWaitLockAcquire(
                   FilterDeviceCollectionLock,
                   NULL
                   );
status = WdfCollectionAdd(
                          FilterDeviceCollection,
                          deviceHandle
                          );
if (!NT_SUCCESS(status)) {
    addFailed = TRUE;
}
WdfWaitLockRelease(FilterDeviceCollectionLock);

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Versione KMDF minima 1.0
Versione UMDF minima 2,0
Intestazione wdfsync.h (include Wdf.h)
Libreria Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL Vedere la sezione Osservazioni.
Regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfWaitlock(kmdf), WdfWaitlockRelease(kmdf)

Vedi anche

KeEnterCriticalRegion

WdfWaitLockCreate

WdfWaitLockRelease