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