Verificando o estado oplock de uma operação de IRP_MJ_CREATE
O seguinte só se aplica quando um fluxo existente de um arquivo está sendo aberto (ou seja, os fluxos recém-criados não podem ter oplocks pré-existentes neles).
Nota Ao processar IRP_MJ_CREATE para qualquer oplock, se o acesso desejado não contiver nada além de FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES ou SYNCHRONIZE, o oplock não será interrompido, a menos que FILE_RESERVE_OPFILTER seja especificado. Especificar FILE_RESERVE_OPFILTER sempre resultará em uma quebra de oplock se a criação for bem-sucedida. Para fins de brevidade e simplicidade, a tabela a seguir omite o anterior, pois se aplica a todos os oplocks.
Tipo de solicitação | Condições |
---|---|
Nível 1 |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Nível 2 |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Lote |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Filtrar |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Ler |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Read-Handle |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Leitura-Gravação |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
|
Identificador de leitura/gravação |
Desfeito em IRP_MJ_CREATE quando:
|
Se o oplock estiver quebrado:
|
O sistema de arquivos executa verificações adicionais para oplocks de Lote e Filtro (em vez do pacote oplock em si) ao processar uma operação de IRP_MJ_CREATE, o que afeta se o sistema de arquivos solicita que o pacote oplock execute o processamento de interrupção do oplock. Esse é um caso em que as operações em um fluxo de dados podem afetar os oplocks em outros fluxos de dados do mesmo arquivo (ou seja, os dois últimos itens de lista da lista de critérios a seguir). Se um ou mais dos seguintes critérios forem atendidos, o sistema de arquivos enviará uma solicitação ao pacote oplock para executar o processamento de interrupção do oplock:
Solicite uma interrupção se esta for uma consulta de rede aberta e uma transação KTM estiver presente. Caso contrário, não solicite uma interrupção na consulta de rede aberta.
Se uma operação SUPERSEDE, OVERWRITE ou OVERWRITE_IF for executada em um fluxo de dados alternativo e FILE_SHARE_DELETE não for especificada e houver um oplock lote ou filtro no fluxo de dados primário, solicite uma quebra do oplock lote ou filtro no fluxo de dados primário.
Se uma operação SUPERSEDE, OVERWRITE ou OVERWRITE_IF for executada no fluxo de dados primário e o acesso DELETE tiver sido solicitado e houver oplocks de Lote ou Filtro em qualquer fluxo de dados alternativo, solicite uma quebra dos oplocks lote ou filtro em todos os fluxos de dados alternativos que os tenham.
Quando o sistema de arquivos decide pedir ao pacote oplock para executar o processamento de interrupção de oplock, as regras estabelecidas na tabela anterior se aplicam.
O marcar para interromper os oplocks do Lote e do Filtro ocorre antes que as verificações de acesso de compartilhamento sejam feitas. Isso significa que o oplock lote ou filtro é interrompido mesmo que a solicitação aberta falhe devido a uma violação de compartilhamento.