Share via


FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)

Richiede un blocco opportunistico (oplock) in un file e riconosce che si è verificata un'interruzione di oplock.

Per eseguire questa operazione, chiamare la funzione DeviceIoControl usando i parametri seguenti.

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

Commenti

Questa operazione viene usata solo dalle applicazioni client che richiedono un blocco opportunistico (oplock) da un server locale. Le applicazioni client che richiedono blocchi opportunistici dai server remoti non devono richiederli direttamente, il reindirizzamento di rete richiede in modo trasparente blocchi opportunistici per l'applicazione. Un tentativo di usare questa operazione per richiedere blocchi opportunistici dai server remoti comporterà la negazione della richiesta.

Il codice di controllo FSCTL_REQUEST_OPLOCK offre funzionalità più efficienti rispetto ai codici di controllo correlati seguenti: FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCK e FSCTL_REQUEST_BATCH_OPLOCK. La richiesta di livelli di oplock diversi può essere eseguita ripetutamente sullo stesso handle senza chiudere e riaprire l'handle quando si usa FSCTL_REQUEST_OPLOCK; gli altri codici di controllo richiedono che l'handle venga chiuso e quindi riaperto con CreateFile per apportare tale modifica. Questa operazione viene eseguita modificando il membro RequestedOplockLevel della struttura REQUEST_OPLOCK_INPUT_BUFFER durante la rimittente del codice di controllo FSCTL_REQUEST_OPLOCK .

Nella tabella seguente viene riepilogato il modo in cui la capacità di memorizzazione nella cache dei tipi di oplock disponibili da FSCTL_REQUEST_OPLOCK corrisponde al livello 2, al livello 1 e agli oplock batch.

Codice di controllo alternativo Valore dei flag RequestedOplockLevel equivalenti Tipo di oplock
FSCTL_REQUEST_BATCH_OPLOCK OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE \| OPLOCK_LEVEL_CACHE_HANDLE LSH
FSCTL_REQUEST_OPLOCK_LEVEL_1 OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE LS
FSCTL_REQUEST_OPLOCK_LEVEL_2 OPLOCK_LEVEL_CACHE_READ R

Usando il codice di controllo FSCTL_REQUEST_OPLOCK con il membro RequestedOplockLevel impostato per OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE concedere un oplock di tipo RH. Un oplock RH è simile al filtro oplock concesso dal codice di controllo FSCTL_REQUEST_FILTER_OPLOCK . Si noti tuttavia che il filtro oplock consente a un solo client di conservare un oplock in un file alla volta; FSCTL_REQUEST_OPLOCK consente a più client alla volta di avere il blocco RH in un file. Un'altra differenza è che FSCTL_REQUEST_FILTER_OPLOCK richiede un riconoscimento di interruzione oplock prima che le scritture possano verificarsi, dove FSCTL_REQUEST_OPLOCK non perché la notifica di interruzione di oplock è consultiva e le scritture possono procedere senza riconoscimento. Per altre informazioni, vedere Interruzione di oplock.

Un codice di controllo FSCTL_REQUEST_OPLOCK ha esito negativo se il file viene aperto in modalità non sovrapposta (sincrono).

Per le implicazioni dell'I/O sovrapposta in questa operazione, vedere la sezione Osservazioni dell'argomento DeviceIoControl .

In Windows 8 e Windows Server 2012 questo codice è supportato dalle tecnologie seguenti.

Tecnologia Supportato
Protocollo SMB (Server Message Block) 3.0 No
Failover trasparente SMB 3.0 (TFO) No
SMB 3.0 con condivisioni file con scalabilità orizzontale (SO) No
File system del volume condiviso del cluster (CsvFS)
File system resiliente (ReFS)

Inoltre, a partire da Windows 8 e Windows Server 2012, il codice di controllo FSCTL_REQUEST_OPLOCK può essere usato per richiedere un oplock in una directory e in un file. Una richiesta di oplock in una directory può specificare OPLOCK_LEVEL_CACHE_READ o OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE nel membro RequestedOplockLevel.

Un oplock R o RH in una directory si interrompe su Nessuna quando il contenuto di un'enumerazione della directory cambierà. Ad esempio, l'aggiunta o l'eliminazione di un file nella directory, la modifica delle dimensioni di un file nella directory, la modifica del timestamp di un file nella directory e così via, interromperà il blocco oplock nella directory. Questa interruzione di oplock non richiede un riconoscimento prima che le modifiche nella directory possano verificarsi; è solo consultivo.

Un oplock RH in una directory si interrompe su R quando la directory stessa viene rinominata o eliminata. Questa interruzione di oplock richiede un riconoscimento prima che la modifica alla directory possa verificarsi.

Requisiti

   
Client minimo supportato Windows 7 [solo app desktop]
Server minimo supportato Windows Server 2008 R2 [solo app desktop]
Intestazione winioctl.h (include Windows.h)

Vedi anche