Compartilhar via


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:

  • A chave oplock associada ao FILE_OBJECT em que o aberto 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 está definido

      OR

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

    MAIS:

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

Nível 2

Desfeito em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que o aberto está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.
  • E:
    • O sinalizador FILE_RESERVE_OPFILTER está definido

      OR

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

Se o oplock estiver quebrado:

  • Quebre para Nenhum.

  • Nenhuma confirmação é necessária, a operação prossegue imediatamente.

Lote

Desfeito em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que o aberto 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 está definido.

      OR

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

    MAIS:

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

Filtrar

Desfeito em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que o aberto está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

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

      • FILE_READ_ATTRIBUTES
      • FILE_WRITE_ATTRIBUTES
      • FILE_READ_DATA
      • FILE_READ_EA
      • FILE_EXECUTE
      • SYNCHRONIZE
      • READ_CONTROL

Se o oplock estiver quebrado:

  • Quebre para Nenhum.

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

Ler

Desfeito em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que o aberto está ocorrendo é diferente da chave oplock associada ao FILE_OBJECT que possui o oplock.

  • E:
    • O sinalizador FILE_RESERVE_OPFILTER está definido

      OR

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

Se o oplock estiver quebrado:

  • Quebre para Nenhum.

  • Nenhuma confirmação é necessária, a operação prossegue imediatamente.

Read-Handle

Desfeito em IRP_MJ_CREATE quando:

  • A abertura atual está em conflito com um aberto existente, de modo que ocorra uma violação de compartilhamento.

    OR

  • O sinalizador FILE_RESERVE_OPFILTER está definido.

    OR

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

    • FILE_SUPERSEDE
    • FILE_OVERWRITE
    • FILE_OVERWRITE_IF

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

  • A chave oplock associada ao FILE_OBJECT em que o aberto 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 está definido.

      OR

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

    MAIS:

    • Interrompa a leitura.
  • Se o oplock tiver sido quebrado porque a abertura atual está em conflito com um aberto existente, de modo que ocorra uma violação de compartilhamento, uma confirmação deve ser recebida antes que a operação continue.
  • Se o oplock tiver sido interrompido por qualquer outro motivo, embora a confirmação da interrupção seja necessária, a operação continuará imediatamente (por exemplo, sem aguardar a confirmação).

Leitura-Gravação

Desfeito em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que o aberto 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 está definido.

      OR

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

    MAIS:

    • Interrompa a leitura.
  • Uma confirmação deve ser recebida antes que a operação continue.

Identificador de leitura/gravação

Desfeito em IRP_MJ_CREATE quando:

  • A chave oplock associada ao FILE_OBJECT em que o aberto 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 está definido.

      OR

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

    MAIS:

    • Interrompa para Read-Write se o aberto atual entrar em conflito com um aberto existente, de modo que ocorra uma violação de compartilhamento. Caso contrário, interrompa o identificador de leitura.

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

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.