Bestätigen von Oplock-Unterbrechungen

Es gibt verschiedene Arten von Bestätigungen, die der Besitzer eines Oplocks zurückgeben kann. Ähnlich wie die Zuteilungsanforderungen werden diese Bestätigungen als Dateisystemsteuerungscodes (d. h. FSCTLs) gesendet. Sie lauten wie folgt:

  • FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

    • Diese FSCTL gibt an, dass der Oplock-Besitzer die Streamsynchronisierung abgeschlossen hat und die Ebene akzeptiert, auf der der Oplock unterbrochen wurde (entweder Level 2 oder None).
  • FSCTL_OPLOCK_BREAK_ACK_NO_2

    • Diese FSCTL gibt an, dass der Oplock-Besitzer die Streamsynchronisierung abgeschlossen hat, aber keinen Oplock der Stufe 2 wünscht. Stattdessen sollte der Oplock auf None (d. a. der Oplock vollständig aufgegeben werden) unterbrochen werden.
  • FSCTL_OPBATCH_ACK_CLOSE_PENDING

    • Bei einem Level 1-Oplock gibt diese FSCTL an, dass der Oplock-Besitzer die Streamsynchronisierung abgeschlossen hat und den Oplock vollständig aufgibt (aus dieser Bestätigung kann kein Oplock der Stufe 2 resultieren).
    • Bei einem Batch- oder Filter-Oplock gibt diese FSCTL an, dass der Oplock-Besitzer den Streamhandle schließen möchte, für den der Oplock gewährt wurde. Blockierte Vorgänge, die auf die Bestätigung des Oplock-Umbruchs warten, warten weiterhin, bis das Handle des oplock-Besitzers geschlossen ist.
  • FSCTL_REQUEST_OPLOCK

    • Durch Angeben REQUEST_OPLOCK_INPUT_FLAG_ACK im Flags-Member der REQUEST_OPLOCK_INPUT_BUFFER-Struktur, die als lpInBuffer-Parameter von DeviceIoControl übergeben wird, wird diese FSCTL verwendet, um Unterbrechungen von Windows 7-Oplocks zu bestätigen. Die Bestätigung ist nur erforderlich, wenn das REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED-Flag im Flags-Member der REQUEST_OPLOCK_OUTPUT_BUFFER Struktur festgelegt ist, die als lpOutBuffer-Parameter von DeviceIoControl übergeben wird. In ähnlicher Weise können FltFsControlFile und ZwFsControlFile verwendet werden, um Windows 7-Oplocks aus dem Kernelmodus zu bestätigen. Weitere Informationen finden Sie unter FSCTL_REQUEST_OPLOCK.

Ein verwandter FSCTL-Code wird FSCTL_OPLOCK_BREAK_NOTIFY. Dieser Code wird verwendet, wenn der Aufrufer benachrichtigt werden möchte, wenn ein Oplock-Umbruch für den angegebenen Stream abgeschlossen ist. Dieser Aufruf kann blockiert werden. Wenn der FSCTL_OPLOCK_BREAK_NOTIFY-Aufruf STATUS_SUCCESS zurückgibt, bedeutet dies folgendes:

  • Kein Oplock gewährt.

  • Zum Zeitpunkt des Aufrufs wurde kein Oplock-Umbruch ausgeführt.

  • Alle oplock-Unterbrechungen, die in Bearbeitung waren, sind jetzt abgeschlossen.

Das Senden einer Bestätigung, wenn keine Bestätigung erwartet wird, ist ein Fehler, und die Bestätigung FSCTL IRP ist mit STATUS_INVALID_OPLOCK_PROTOCOL fehlgeschlagen.

Wenn Sie das Handle der Datei schließen, für die der Oplock-Umbruch angefordert wird, wird der Umbruch implizit bestätigt. Im Fall einer Oplock-Unterbrechung für einen Freigabeverstoß kann der Oplock-Besitzer den Dateihandle schließen, wodurch die Oplock-Unterbrechung bestätigt wird, und eine Freigabeverletzung für den anderen Benutzer der Datei verhindert wird.