FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)
Solicita um bloqueio oportunista (oplock) em um arquivo e reconhece que ocorreu uma quebra de oplock.
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, // 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
);
Observações
Essa operação é usada por aplicativos cliente para solicitar um bloqueio oportunista (oplock) de um servidor local. Os aplicativos cliente não devem solicitar bloqueios oportunistas diretamente de servidores remotos — o redirecionador de rede solicita de forma transparente bloqueios oportunistas para o aplicativo. Usar essa operação para solicitar bloqueios oportunistas de servidores remotos resultará na negação da solicitação.
Se a operação DeviceIoControl retornar o código de erro ERROR_IO_PENDING, a solicitação oplock será concedida. Se ele retornar qualquer outro código de erro, o oplock não foi concedido. Se o código de erro for um valor de aviso, como ERROR_CANNOT_GRANT_REQUESTED_OPLOCK, as informações estendidas poderão estar disponíveis na estrutura REQUEST_OPLOCK_OUTPUT_BUFFER.
Quando um oplock concedido for interrompido, o objeto de evento na estrutura deOVERLAPPED será sinalizado e as informações serão retornadas na estrutura REQUEST_OPLOCK_OUTPUT_BUFFER. O membro de interno da estrutura de OVERLAPPED será definido como um valor NTSTATUS que fornece informações estendidas sobre como o oplock foi quebrado.
SOBREPOSTA. Valor interno | Significado |
---|---|
STATUS_SUCCESS 0x0 |
O oplock foi quebrado por outra operação do sistema de arquivos. |
STATUS_OPLOCK_HANDLE_CLOSED 0x00000216 |
O oplock não está mais em vigor porque o identificador de arquivo usado para solicitá-lo foi fechado. Observe que, se um oplock for interrompido porque o identificador usado para solicitá-lo foi fechado, não haverá necessidade de reconhecer a interrupção, independentemente do tipo oplock. |
STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE 0x00000215 |
O oplock ainda está em vigor, no entanto, ele não está mais associado ao identificador de arquivo que foi usado para solicitá-lo. Um chamador usou um identificador diferente para o arquivo para solicitar um novo oplock, e esse identificador agora possui o oplock. |
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_OPLOCKe 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 de sinalizadores RequestedOplockLevel equivalentes | Tipo de 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
concede 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 de cada vez; FSCTL_REQUEST_OPLOCK permite que vários clientes de cada vez tenham o rh bloqueio 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 da 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 | Suportado |
---|---|
Protocolo SMB (Bloco de Mensagens do Servidor) 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 de Cluster (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 em 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 quebra para Nenhum quando o conteúdo de uma enumeração do diretório seria 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 quebra 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
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Windows 7 [somente aplicativos da área de trabalho] |
servidor com suporte mínimo | Windows Server 2008 R2 [somente aplicativos da área de trabalho] |
cabeçalho | winioctl.h (inclua Windows.h) |
Consulte também
- CreateFile
- DeviceIoControl
- SOBREPOSTOS
- semântica oplock
- bloqueios oportunistas