Funzione FltInitializePushLock (fltkernel.h)

La routine FltInitializePushLock inizializza una variabile di blocco push.

Sintassi

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Parametri

[out] PushLock

Puntatore alla risorsa di archiviazione fornita dal chiamante, che deve essere almeno il valore sizeof(EX_PUSH_LOCK), affinché la variabile di blocco push venga inizializzata. Lo spazio di archiviazione deve essere allineato a 4 byte su piattaforme a 32 bit e allineato a 8 byte su piattaforme a 64 bit.

Valore restituito

nessuno

Osservazioni

I blocchi push sono raramente una scelta ottimale per i minifiltri del file system. Come descritto di seguito, alcune delle loro caratteristiche possono essere incompatibili con la natura intrinsecamente rientrante dei file system.

I blocchi push sono simili alle strutture ERESOURCE (dette anche "risorse") nei modi seguenti:

  • I blocchi push possono essere usati per la sincronizzazione da un set di thread.
  • I blocchi push possono essere acquisiti per l'accesso condiviso o esclusivo.
  • Anche se il chiamante fornisce l'archiviazione per la variabile di blocco push, la struttura EX_PUSH_LOCK è opaca, ovvero i relativi membri sono riservati per l'uso del sistema.
I blocchi push presentano gli svantaggi seguenti rispetto alle strutture ERESOURCE:
  • L'algoritmo per concedere l'accesso esclusivo non è equo a tutti i thread. Se esiste un elevato livello di contesa di blocco esclusivo, non esiste alcuna garanzia sull'ordine in cui ai thread verrà concesso l'accesso esclusivo.
  • Non esistono routine di supporto per determinare il proprietario corrente di un blocco push in fase di esecuzione. Gli utenti delle strutture ERESOURCE possono chiamare routine come ExIsResourceAcquiredExclusiveLite per determinare se il thread corrente ha accesso esclusivo alla risorsa.
  • Per lo stesso motivo non esistono estensioni di supporto per determinare il proprietario corrente di un blocco push in fase di debug e quindi diagnosticare i deadlock. Gli utenti delle strutture ERESOURCE possono usare l'estensione !locks in kd o windbg per scoprirlo.
  • Non è disponibile alcun supporto per la verifica dei driver per facilitare la diagnosi precoce dei deadlock tramite blocchi push.
  • I blocchi push esclusivi non possono essere acquisiti in modo ricorsivo.
I blocchi push offrono i vantaggi seguenti rispetto alle strutture ERESOURCE:
  • Quando i blocchi push vengono acquisiti principalmente per l'accesso condiviso, sono più efficienti delle strutture ERESOURCE.
  • Lo spazio di archiviazione per i blocchi push può essere allocato da un pool di paging o non di paging. Le strutture ERESOURCE devono essere allocate solo da pool non di paging.
  • EX_PUSH_LOCK strutture sono molto più piccole delle strutture ERESOURCE.
A meno che uno di questi vantaggi non sia interessante, ERESOURCE è in genere la soluzione più affidabile e gestibile per il problema di sincronizzazione di lettura/scrittura.

Per acquisire un blocco push per l'accesso esclusivo, chiama FltAcquirePushLockExclusive.

Per acquisire un blocco push per l'accesso condiviso, chiamare FltAcquirePushLockShared.

Per rilasciare un blocco push, chiama FltReleasePushLock.

Per eliminare un blocco push, chiamare FltDeletePushLock.

Requisiti

Requisito Valore
Client minimo supportato Questa routine è disponibile in Microsoft Windows XP SP2, Microsoft Windows Server 2003 SP1 e versioni successive.
Piattaforma di destinazione Universale
Intestazione fltkernel.h (include Fltkernel.h)
Libreria FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Vedi anche

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock