FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)

Solicita um bloqueio oportunista (oplock) em um arquivo e reconhece que um oplock foi desfeito.

Para executar essa operação, chame a função DeviceIoControl usando os parâmetros a seguir.

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
);

Comentários

Essa operação é usada apenas por aplicativos cliente que solicitam um bloqueio oportunista (oplock) de um servidor local. Os aplicativos cliente que solicitam bloqueios oportunistas de servidores remotos não devem solicitá-los diretamente— o redirecionador de rede solicita de forma transparente bloqueios oportunistas para o aplicativo. Uma tentativa de usar essa operação para solicitar bloqueios oportunistas de servidores remotos resultará na negação da solicitação.

O código de controle FSCTL_REQUEST_OPLOCK fornece uma funcionalidade mais eficiente do que os seguintes códigos de controle relacionados: FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCK e FSCTL_REQUEST_BATCH_OPLOCK. A solicitação de diferentes níveis de oplock pode ser executada repetidamente no mesmo identificador sem fechar e reabrir o identificador ao usar FSCTL_REQUEST_OPLOCK; os outros códigos de controle exigem que o identificador seja fechado e reaberto com CreateFile para fazer essa alteração. Isso é feito manipulando o membro RequestedOplockLevel da estrutura REQUEST_OPLOCK_INPUT_BUFFER ao emitir novamente o código de controle FSCTL_REQUEST_OPLOCK .

A tabela a seguir resume como a capacidade de cache dos tipos oplock disponíveis de FSCTL_REQUEST_OPLOCK correspondem aos oplocks de nível 2, nível 1 e lote.

Código de controle alternativo Valor equivalente de sinalizadores RequestedOplockLevel Tipo oplock
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

Usar o código de controle FSCTL_REQUEST_OPLOCK com o membro RequestedOplockLevel definido para OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE conceder um oplock do tipo RH. Um oplock RH é semelhante ao oplock de filtro concedido pelo código de controle FSCTL_REQUEST_FILTER_OPLOCK . No entanto, observe que o oplock de filtro permite que apenas um cliente mantenha um oplock em um arquivo por vez; FSCTL_REQUEST_OPLOCK permite que vários clientes por vez tenham o bloqueio RH em um arquivo. Outra diferença é que FSCTL_REQUEST_FILTER_OPLOCK requer uma confirmação de interrupção de oplock antes que as gravações possam ocorrer, em que FSCTL_REQUEST_OPLOCK não ocorre porque a notificação de interrupção do oplock é somente consultoria e as gravações têm permissão para prosseguir sem confirmação. Para obter mais informações, consulte Breaking Oplocks.

Um código de controle FSCTL_REQUEST_OPLOCK falhará se o arquivo for aberto no modo não sobreposto (síncrono).

Para obter as implicações de E/S sobreposta nesta operação, consulte a seção Comentários do tópico DeviceIoControl .

No Windows 8 e no Windows Server 2012, esse código é compatível com as tecnologias a seguir.

Tecnologia Com suporte
Protocolo SMB (SMB) 3.0 Não
TFO (Failover transparente) do SMB 3.0 Não
SMB 3.0 com compartilhamentos de arquivos de expansão (SO) Não
Sistema de arquivos de Volume Compartilhado Clusterizado (CsvFS) Sim
ReFS (Sistema de Arquivos Resiliente) Sim

Além disso, a partir do Windows 8 e do Windows Server 2012, o código de controle FSCTL_REQUEST_OPLOCK pode ser usado para solicitar um oplock em um diretório, bem como um arquivo. Uma solicitação oplock em um diretório pode especificar OPLOCK_LEVEL_CACHE_READ ou OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE no membro RequestedOplockLevel.

Um oplock R ou RH em um diretório é interrompido para Nenhum quando o conteúdo de uma enumeração do diretório é alterado. Por exemplo, adicionar/excluir um arquivo no diretório, alterar o tamanho de um arquivo no diretório, modificar o carimbo de data/hora de um arquivo no diretório etc., quebraria o oplock no diretório. Essa quebra de oplock não requer uma confirmação antes que as alterações no diretório possam ocorrer; é somente consultoria.

Um oplock RH em um diretório é interrompido para R quando o próprio diretório é renomeado ou excluído. Essa quebra de oplock requer uma confirmação antes que a alteração no diretório possa ocorrer.

Requisitos

   
Cliente mínimo com suporte Windows 7 [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 R2 [somente aplicativos da área de trabalho]
Cabeçalho winioctl.h (inclua Windows.h)

Confira também