Freigeben über


FltInitializePushLock-Funktion (fltkernel.h)

Die FltInitializePushLock-Routine initialisiert eine Pushsperrvariable.

Syntax

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Parameter

[out] PushLock

Zeiger auf den vom Aufrufer bereitgestellten Speicher, der mindestens der Wert von sizeof(EX_PUSH_LOCK) sein muss, damit die zu initialisierende Pushsperre-Variable initialisiert wird. Der Speicher muss 4-Byte auf 32-Bit-Plattformen ausgerichtet und 8 Byte auf 64-Bit-Plattformen ausgerichtet sein.

Rückgabewert

Keine

Bemerkungen

Pushsperren sind selten eine gute Wahl für Dateisystem-Minifilter. Wie im Folgenden beschrieben, können einige ihrer Merkmale mit der naturgemäßen Wiedereinsteiger-Natur von Dateisystemen nicht kompatibel sein.

Pushsperren ähneln ERESOURCE-Strukturen (auch als "Ressourcen" bezeichnet) auf folgende Weise:

  • Pushsperren können für die Synchronisierung von einer Gruppe von Threads verwendet werden.
  • Pushsperren können für freigegebenen oder exklusiven Zugriff erworben werden.
  • Obwohl der Aufrufer den Speicher für die Pushsperrvariable bereitstellt, ist die EX_PUSH_LOCK-Struktur undurchsichtig: Die Member sind für die Systemverwendung reserviert.
Pushsperren haben im Vergleich zu ERESOURCE-Strukturen die folgenden Nachteile:
  • Der Algorithmus zum Gewähren des exklusiven Zugriffs ist nicht für alle Threads fair. Wenn ein hoher Grad an Exklusivsperrkonflikten besteht, gibt es keine Garantie für die Reihenfolge, in der Threads exklusiver Zugriff gewährt wird.
  • Es gibt keine Unterstützungsroutinen zum Ermitteln des aktuellen Besitzers einer Pushsperre zur Laufzeit. (Benutzer von ERESOURCE-Strukturen können Routinen wie ExIsResourceAcquiredExclusiveLite aufrufen, um zu bestimmen, ob der aktuelle Thread exklusiven Zugriff auf die Ressource hat.)
  • Aus dem gleichen Grund gibt es keine Unterstützungserweiterungen, um den aktuellen Besitzer einer Pushsperre zur Debugzeit zu bestimmen und somit Deadlocks zu diagnostizieren. (Benutzer von ERESOURCE-Strukturen können die !locks Erweiterung in kd oder windbg verwenden, um dies herauszufinden.)
  • Es gibt keine Unterstützung für die Treiberüberprüfung, um die frühzeitige Diagnose von Deadlocks durch Pushsperren zu unterstützen.
  • Exklusive Pushsperren können nicht rekursiv abgerufen werden.
Pushsperren bieten die folgenden Vorteile gegenüber ERESOURCE-Strukturen:
  • Wenn Pushsperren meist für den gemeinsamen Zugriff erworben werden, sind sie effizienter als ERESOURCE-Strukturen.
  • Der Speicher für Pushsperren kann aus einem ausgelagerten oder nicht ausgelagerten Pool zugeordnet werden. ERESOURCE-Strukturen dürfen nur aus einem nicht auslagerten Pool zugeordnet werden.
  • EX_PUSH_LOCK Strukturen sind viel kleiner als ERESOURCE-Strukturen.
Sofern keiner dieser Vorteile überzeugend ist, ist ERESOURCE in der Regel die robustere und verwaltbarere Lösung für das Synchronisierungsproblem mit Lese-/Schreibzugriff.

Um eine Pushsperre für exklusiven Zugriff zu erhalten, rufen Sie FltAcquirePushLockExclusive auf.

Rufen Sie FltAcquirePushLockShared auf, um eine Pushsperre für den gemeinsamen Zugriff zu erhalten.

Rufen Sie FltReleasePushLock auf, um eine Pushsperre freizugeben.

Um eine Pushsperre zu löschen, rufen Sie FltDeletePushLock auf.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Diese Routine ist unter Microsoft Windows XP SP2, Microsoft Windows Server 2003 SP1 und höher verfügbar.
Zielplattform Universell
Header fltkernel.h (fltkernel.h einschließen)
Bibliothek FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Weitere Informationen

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock