Partilhar via


Verificando o estado de Oplock de uma operação IRP_MJ_CREATE

O seguinte só se aplica quando um fluxo existente de um arquivo está sendo aberto (ou seja, fluxos recém-criados não podem ter oplocks pré-existentes neles).

Observação Ao processar IRP_MJ_CREATE para qualquer oplock, se o acesso desejado contiver nada além de FILE_READ_ATTRIBUTES, FILE_WRITE_ATTRIBUTES ou SYNCHRONIZE, o oplock não será quebrado, a menos que FILE_RESERVE_OPFILTER seja especificado. Especificar FILE_RESERVE_OPFILTER sempre resulta em uma interrupção de oplock se a criação for bem-sucedida. Por uma questão de brevidade e simplicidade, a tabela seguinte omite o precedente, uma vez que se aplica a todos os oplocks.

Tipo de Pedido Condições

Nível 1

Interrompido em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT no qual a abertura está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

Se o oplock estiver desfeito:

  • Break to None IF:

    • O sinalizador FILE_RESERVE_OPFILTER está definido

      OU

    • Qualquer um dos seguintes valores de disposição de criação é especificado:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

    SENÃO:

    • Quebra para o Nível 2.
  • Uma confirmação de receção deve ser recebida antes que a operação continue.

Nível 2

Interrompido em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT no qual a abertura está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.
  • E:
    • O sinalizador FILE_RESERVE_OPFILTER está definido

      OU

    • Quaisquer dos seguintes valores de disposição de criação são especificados:
      • FILE_SUPERSEDE
      • SOBRESCREVER_ARQUIVO
      • FILE_SOBRESCREVER_SE

Se o oplock estiver quebrado:

  • Sem interrupção.

  • Nenhum reconhecimento é necessário, a operação prossegue imediatamente.

Lote

Interrompido em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT no qual a abertura está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

Se o oplock estiver quebrado:

  • Break to None IF:

    • O sinalizador FILE_RESERVE_OPFILTER foi definido.

      OU

    • Qualquer um dos seguintes valores de disposição de criação é especificado:
      • FILE_SUPERSEDE
      • SOBRESCREVER_FICHEIRO
      • FILE_OVERWRITE_IF

    SENÃO:

    • Quebra para o Nível 2.
  • Uma confirmação de receção deve ser recebida antes que a operação continue.

Filtro

Quebrado em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que a abertura está a ocorrer é diferente da chave oplock associada ao FILE_OBJECT que detém o oplock.

  • E:
    • Foi solicitado um acesso desejado "gravável" no fluxo, que não foi aberto para acesso FILE_SHARE_READ. Observe que o acesso "gravável" é definido como qualquer atributo diferente de:

      • LEITURA_ATRIBUTOS_FICHEIRO
      • ATRIBUTOS_DE_ESCRITA_DE_ARQUIVO
      • FILE_READ_DATA
      • FILE_READ_EA
      • EXECUTAR_ARQUIVO
      • SINCRONIZAR
      • READ_CONTROL

Se o oplock estiver quebrado:

  • Sem interrupções.

  • Uma confirmação de receção deve ser recebida antes que a operação continue.

Ler

Quebrado em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT no qual a abertura está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

  • E:
    • O sinalizador FILE_RESERVE_OPFILTER está definido

      OU

    • Um dos seguintes valores de disposição de criação é especificado:
      • FILE_SUPERSEDE
      • FILE_OVERWRITE
      • FILE_OVERWRITE_IF

Se o oplock estiver quebrado:

  • Quebra: Nenhuma

  • Nenhum reconhecimento é necessário, a operação prossegue imediatamente.

Read-Handle

Interrompido no IRP_MJ_CREATE quando:

  • O atual conflito aberto com um aberto existente de tal forma que uma violação de compartilhamento ocorreria.

    OU

  • A bandeira FILE_RESERVE_OPFILTER está definida.

    OU

  • Qualquer um dos seguintes valores de disposição de criação é especificado:

    • FILE_SUPERSEDE
    • SOBRESCREVER_ARQUIVO
    • Ficheiro_Sobrescrever_Se

    E (para qualquer uma das três condições acima)

  • A chave oplock associada ao FILE_OBJECT no qual a abertura está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

Se o oplock estiver quebrado:

  • Break to None IF:

    • O flag FILE_RESERVE_OPFILTER está definido.

      OU

    • Qualquer um dos seguintes valores de disposição de criação são especificados:
      • FILE_SUPERSEDE
      • SOBRESCREVER_ARQUIVO
      • ARQUIVO_SOBRESCREVER_SE

    SENÃO:

    • Pausa para ler.
  • Se o oplock quebrou porque o aberto atual entra em conflito com um aberto existente de tal forma que uma violação de compartilhamento ocorreria, um reconhecimento deve ser recebido antes que a operação continue.
  • Se o oplock quebrou por qualquer outro motivo, embora o reconhecimento da quebra seja necessário, a operação continua imediatamente (por exemplo, sem esperar pelo reconhecimento).

Leitura-Gravação

Interrompido em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT no qual a abertura está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

Se o oplock estiver quebrado:

  • Break to None IF:

    • A bandeira FILE_RESERVE_OPFILTER está definida.

      OU

    • Estão especificados os seguintes valores de disposição de criação:
      • FILE_SUPERSEDE
      • SOBRESCREVER_ARQUIVO
      • FILE_OVERWRITE_IF

    SENÃO:

    • Pausa para ler.
  • Uma confirmação de receção deve ser recebida antes que a operação continue.

Ler-Escrever-Manipular

Quebrado em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT onde a abertura está a ocorrer é diferente da chave oplock associada ao FILE_OBJECT que detém o oplock.

Se o oplock estiver quebrado:

  • Break to None IF:

    • O sinalizador FILE_RESERVE_OPFILTER está ativo.

      OU

    • Quaisquer dos seguintes valores de disposição de criação são especificados:
      • FILE_SUPERSEDE
      • SOBRESCREVER_FICHEIRO
      • FILE_OVERWRITE_IF

    SENÃO:

    • Interrompa para Read-Write se o aberto atual entrar em conflito com um aberto existente de tal forma que ocorra uma violação de compartilhamento. Caso contrário, salte para Read-Handle.

  • Uma confirmação de receção deve ser recebida antes que a operação continue.

O sistema de arquivos executa verificações adicionais para oplocks em 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 quebra de oplock. Este é 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 quebra de oplock:

  • Solicite uma pausa se esta for uma consulta de rede aberta e uma transação KTM estiver presente. Caso contrário, não solicite uma pausa na consulta de rede aberta.

  • Se uma operação SUBSTITUIR, SOBRESCREVER ou OVERWRITE_IF for executada num fluxo de dados alternativo e FILE_SHARE_DELETE não for especificado e existir um bloqueio de lote ou filtro no fluxo de dados primário, solicite uma interrupção do bloqueio de lote ou filtro no fluxo de dados primário.

  • Se uma operação SUPERSEDER, SOBRESCREVER ou SOBRESCREVER_SE for executada no fluxo de dados primário e tiver sido solicitado acesso para ELIMINAR, e houver bloqueios de Lote ou Filtro em qualquer fluxo de dados alternativo, solicite a interrupção dos bloqueios de Lote ou Filtro em todos os fluxos de dados alternativos que os possuam.

Quando o sistema de arquivos decide solicitar que o pacote oplock execute o processamento de quebra de oplock, as regras estabelecidas na tabela anterior se aplicam.

A verificação para quebrar oplocks de lote e filtro ocorre antes que as verificações de acesso de compartilhamento sejam realizadas. Isso significa que o bloqueio de lote ou filtro foi interrompido mesmo se a solicitação de abertura acabar falhando devido a uma violação de compartilhamento.