Freigeben über


FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)

Fordert eine opportunistische Sperre (Oplock) für eine Datei an und erkennt an, dass ein Oplockbruch aufgetreten ist.

Rufen Sie zum Ausführen dieses Vorgangs die DeviceIoControl--Funktion mithilfe der folgenden Parameter auf.

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_REQUEST_OPLOCK,             // dwIoControlCode
  (LPVOID) lpInBuffer,              // pointer to REQUEST_OPLOCK_INPUT_BUFFER
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // pointer to REQUEST_OPLOCK_OUTPUT_BUFFER
  (DWORD) nOutBufferSize,           // size of output buffer
  NULL,                             // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

Bemerkungen

Dieser Vorgang wird von Clientanwendungen verwendet, um eine opportunistische Sperre (Oplock) von einem lokalen Server anzufordern. Clientanwendungen dürfen keine opportunistischen Sperren von Remoteservern direkt anfordern – der Netzwerkumleitung fordert transparent opportunistische Sperren für die Anwendung an. Wenn Sie diesen Vorgang verwenden, um opportunistische Sperren von Remoteservern anzufordern, wird die Anforderung verweigert.

Wenn der DeviceIoControl--Vorgang den Fehlercode ERROR_IO_PENDINGzurückgibt, wurde die Oplock-Anforderung erteilt. Wenn ein anderer Fehlercode zurückgegeben wird, wurde der Oplock nicht erteilt. Wenn der Fehlercode ein Warnwert wie ERROR_CANNOT_GRANT_REQUESTED_OPLOCK ist, stehen möglicherweise erweiterte Informationen in der REQUEST_OPLOCK_OUTPUT_BUFFER-Struktur zur Verfügung.

Wenn ein gewährter Oplock unterbrochen wird, wird das Ereignisobjekt in der ÜBERLAPPEND Struktur signalisiert, und Die Informationen werden in der REQUEST_OPLOCK_OUTPUT_BUFFER Struktur zurückgegeben. Der Internal Member der OVERLAPPED-Struktur wird auf einen NTSTATUS-Wert festgelegt, der erweiterte Informationen darüber bereitstellt, wie der Oplock abgebrochen wurde.

ÜBERSCHNITTEN. Interner Wert Bedeutung
STATUS_SUCCESS
0x0
Der Oplock wurde durch einen anderen Dateisystemvorgang unterbrochen.
STATUS_OPLOCK_HANDLE_CLOSED
0x00000216
Der Oplock ist nicht mehr in Kraft, da der zum Anfordern des Vorgangs verwendete Dateihandle geschlossen wurde. Beachten Sie, dass, wenn ein Oplock unterbrochen wird, da der zum Anfordern des Vorgangs verwendete Handle geschlossen wurde, unabhängig vom Oplocktyp keine Bestätigung des Unterbrechungstyps erforderlich ist.
STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE
0x00000215
Der Oplock ist noch in Kraft, ist jedoch nicht mehr mit dem Dateihandle verknüpft, das zum Anfordern des Vorgangs verwendet wurde. Ein Aufrufer hat ein anderes Handle für die Datei verwendet, um einen neuen Oplock anzufordern, und das Handle besitzt jetzt den Oplock.

Der FSCTL_REQUEST_OPLOCK-Steuerelementcode bietet effizientere Funktionen als die folgenden zugehörigen Steuerelementcodes: FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCKund FSCTL_REQUEST_BATCH_OPLOCK. Das Anfordern verschiedener Oplock-Ebenen kann wiederholt auf demselben Handle ausgeführt werden, ohne das Handle zu schließen und erneut zu öffnen, wenn FSCTL_REQUEST_OPLOCKverwendet wird; Die anderen Steuerelementcodes erfordern, dass das Handle geschlossen und dann mit CreateFile- erneut geöffnet wird, um eine solche Änderung vorzunehmen. Dazu wird das RequestedOplockLevel Member der REQUEST_OPLOCK_INPUT_BUFFER Struktur beim erneuten Ausgeben des FSCTL_REQUEST_OPLOCK-Steuerelementcodes manipuliert.

In der folgenden Tabelle wird zusammengefasst, wie die Zwischenspeicherungsfähigkeit von oplock-Typen, die von FSCTL_REQUEST_OPLOCK verfügbar sind, den Oplocks der Ebene 2, Ebene 1 und batch entsprechen.

Alternativer Steuerelementcode Entsprechung RequestedOplockLevel Flags-Wert Oplock-Typ
FSCTL_REQUEST_BATCH_OPLOCK OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE \| OPLOCK_LEVEL_CACHE_HANDLE RWH
FSCTL_REQUEST_OPLOCK_LEVEL_1 OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE RW
FSCTL_REQUEST_OPLOCK_LEVEL_2 OPLOCK_LEVEL_CACHE_READ R

Die Verwendung des FSCTL_REQUEST_OPLOCK Steuerelementcodes mit dem RequestedOplockLevel Member auf OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE gewährt ein Oplock vom Typ RH-. Ein RH-Oplock ähnelt dem vom FSCTL_REQUEST_FILTER_OPLOCK Steuerelementcode gewährten Filter oplock. Beachten Sie jedoch, dass der Filter oplock nur einem Client das Gleichzeitige speichern eines Oplocks für eine Datei zulässt. FSCTL_REQUEST_OPLOCK ermöglicht es mehreren Clients gleichzeitig, die RH- für eine Datei zu sperren. Ein weiterer Unterschied besteht darin, dass FSCTL_REQUEST_FILTER_OPLOCK eine Oplock-Unterbrechungsbestätigung erfordert, bevor Schreibvorgänge auftreten können, wobei FSCTL_REQUEST_OPLOCK nicht, da die Oplock-Unterbrechungsbenachrichtigung schreibgeschützt ist und Schreibvorgänge ohne Bestätigung fortfahren dürfen. Weitere Informationen finden Sie unter Breaking Oplocks.

Ein FSCTL_REQUEST_OPLOCK Steuerelementcode schlägt fehl, wenn die Datei im nicht überlappenden (synchronen) Modus geöffnet wird.

Die Auswirkungen überlappender E/A für diesen Vorgang finden Sie im Abschnitt "Hinweise" des Themas DeviceIoControl.

In Windows 8 und Windows Server 2012 wird dieser Code von den folgenden Technologien unterstützt.

Technologie Abgestützt
Server Message Block (SMB) 3.0-Protokoll Nein
SMB 3.0 Transparent Failover (TFO) Nein
SMB 3.0 mit Skalierungsdateifreigaben (SO) Nein
Freigegebenes Clustervolumedateisystem (CsvFS) Ja
Resilient File System (ReFS) Ja

Ab Windows 8 und Windows Server 2012 kann der FSCTL_REQUEST_OPLOCK Steuerelementcode auch zum Anfordern eines Oplocks in einem Verzeichnis und einer Datei verwendet werden. Eine Oplock-Anforderung in einem Verzeichnis kann entweder OPLOCK_LEVEL_CACHE_READ oder OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE im RequestedOplockLevel-Mitglied angeben.

Ein R- oder RH-Oplock für ein Verzeichnis wird in "None" umgebrochen, wenn sich der Inhalt einer Enumeration des Verzeichnisses ändern würde. Wenn Sie z. B. eine Datei im Verzeichnis hinzufügen/löschen, die Größe einer Datei im Verzeichnis ändern, den Zeitstempel einer Datei im Verzeichnis ändern usw., würde das Oplock im Verzeichnis alle unterbrechen. Diese Oplock-Unterbrechung erfordert keine Bestätigung, bevor die Änderungen im Verzeichnis auftreten können. es ist nur beratend.

Ein RH-Oplock für ein Verzeichnis wird in R umgebrochen, wenn das Verzeichnis selbst umbenannt oder gelöscht wird. Diese Oplock-Unterbrechung erfordert eine Bestätigung, bevor die Änderung des Verzeichnisses erfolgen kann.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 7 [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2008 R2 [nur Desktop-Apps]
Header- winioctl.h (enthalten Windows.h)

Siehe auch