Compartilhar via


Função ZwCreateFile (wdm.h)

A rotina ZwCreateFile cria um novo arquivo ou abre um arquivo existente.

Sintaxe

NTSYSAPI NTSTATUS ZwCreateFile(
  [out]          PHANDLE            FileHandle,
  [in]           ACCESS_MASK        DesiredAccess,
  [in]           POBJECT_ATTRIBUTES ObjectAttributes,
  [out]          PIO_STATUS_BLOCK   IoStatusBlock,
  [in, optional] PLARGE_INTEGER     AllocationSize,
  [in]           ULONG              FileAttributes,
  [in]           ULONG              ShareAccess,
  [in]           ULONG              CreateDisposition,
  [in]           ULONG              CreateOptions,
  [in, optional] PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

Parâmetros

[out] FileHandle

Um ponteiro para uma variável HANDLE que recebe um identificador para o arquivo.

[in] DesiredAccess

Especifica um valor ACCESS_MASK que determina o acesso solicitado ao objeto . Além dos direitos de acesso definidos para todos os tipos de objetos, o chamador pode especificar qualquer um dos direitos de acesso a seguir, que são específicos dos arquivos.

sinalizador ACCESS_MASK Permite que o chamador faça isso
FILE_READ_DATA Ler dados do arquivo.
FILE_READ_ATTRIBUTES Leia os atributos do arquivo. (Para obter mais informações, consulte a descrição do parâmetro FileAttributes .)
FILE_READ_EA Leia os EAs (atributos estendidos) do arquivo. Esse sinalizador é irrelevante para drivers de dispositivo e intermediários.
FILE_WRITE_DATA Gravar dados no arquivo.
FILE_WRITE_ATTRIBUTES Escreva os atributos do arquivo. (Para obter mais informações, consulte a descrição do parâmetro FileAttributes .)
FILE_WRITE_EA Altere os atributos estendidos (EAs) do arquivo. Esse sinalizador é irrelevante para drivers de dispositivo e intermediários.
FILE_APPEND_DATA Acrescente dados ao arquivo.
FILE_EXECUTE Use a E/S de paginação do sistema para ler dados do arquivo na memória. Esse sinalizador é irrelevante para drivers de dispositivo e intermediários.

Não especifique FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATA ou FILE_EXECUTE ao criar ou abrir um diretório.

O chamador só pode especificar um direito de acesso genérico, GENERIC_XXX, para um arquivo, não um diretório. Os direitos de acesso genéricos correspondem a direitos de acesso específicos, conforme mostrado na tabela a seguir.

Direito de acesso genérico Conjunto de direitos de acesso específicos
GENERIC_READ STANDARD_RIGHTS_READ, FILE_READ_DATA, FILE_READ_ATTRIBUTES, FILE_READ_EA e SYNCHRONIZE.
GENERIC_WRITE STANDARD_RIGHTS_WRITE, FILE_WRITE_DATA, FILE_WRITE_ATTRIBUTES, FILE_WRITE_EA, FILE_APPEND_DATA e SYNCHRONIZE.
GENERIC_EXECUTE STANDARD_RIGHTS_EXECUTE, FILE_EXECUTE, FILE_READ_ATTRIBUTES e SYNCHRONIZE. Esse valor é irrelevante para drivers de dispositivo e intermediários.
GENERIC_ALL FILE_ALL_ACCESS.

Por exemplo, se você especificar GENERIC_READ para um objeto de arquivo, a rotina mapeará esse valor para a máscara de bits FILE_GENERIC_READ de direitos de acesso específicos. Na tabela anterior, os direitos de acesso específicos listados para GENERIC_READ correspondem aos sinalizadores de acesso contidos na máscara de bits FILE_GENERIC_READ.

Se o arquivo for realmente um diretório, o chamador também poderá especificar os seguintes direitos de acesso genéricos.

Sinalizador DesiredAccess Permite que o chamador faça isso
FILE_LIST_DIRECTORY Liste os arquivos no diretório.
FILE_TRAVERSE Percorra o diretório, em outras palavras, inclua o diretório no caminho de um arquivo.

Para obter mais informações sobre direitos de acesso, consulte ACCESS_MASK.

[in] ObjectAttributes

Um ponteiro para uma estrutura OBJECT_ATTRIBUTES que especifica o nome do objeto e outros atributos. Use InitializeObjectAttributes para inicializar essa estrutura. Se o chamador não estiver em execução em um contexto de thread do sistema, ele deverá definir o atributo OBJ_KERNEL_HANDLE quando chamar InitializeObjectAttributes.

[out] IoStatusBlock

Um ponteiro para uma estrutura IO_STATUS_BLOCK que recebe o status de conclusão final e outras informações sobre a operação solicitada. Em particular, o membro Informações recebe um dos seguintes valores:

  • FILE_CREATED

  • FILE_OPENED

  • FILE_OVERWRITTEN

  • FILE_SUPERSEDED

  • FILE_EXISTS

  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

Um ponteiro para um LARGE_INTEGER que contém o tamanho da alocação inicial, em bytes, para um arquivo criado ou substituído. Se AllocationSize for NULL, nenhum tamanho de alocação será especificado. Se nenhum arquivo for criado ou substituído, AllocationSize será ignorado.

[in] FileAttributes

Especifica um ou mais sinalizadores FILE_ATTRIBUTE_XXX , que representam os atributos de arquivo a serem definidos se você criar ou substituir um arquivo. O chamador geralmente especifica FILE_ATTRIBUTE_NORMAL, que define os atributos padrão. Para obter uma lista de sinalizadores FILE_ATTRIBUTE_XXX válidos, consulte a rotina CreateFile . Se nenhum arquivo for criado ou substituído, FileAttributes será ignorado.

[in] ShareAccess

Tipo de acesso de compartilhamento, que é especificado como zero ou qualquer combinação dos sinalizadores a seguir.

Sinalizador ShareAccess Permite que outros threads façam isso
FILE_SHARE_READ Ler o arquivo
FILE_SHARE_WRITE Gravar o arquivo
FILE_SHARE_DELETE Excluir o arquivo

Os drivers intermediários e de dispositivo geralmente definem ShareAccess como zero, o que fornece ao chamador acesso exclusivo ao arquivo aberto.

[in] CreateDisposition

Especifica a ação a ser executada se o arquivo existir ou não. CreateDisposition pode ser um dos valores na tabela a seguir.

Valor CreateDisposition Ação se o arquivo existir Ação se o arquivo não existir
FILE_SUPERSEDE Substitua o arquivo. Crie o arquivo.
FILE_CREATE Retornar um erro. Crie o arquivo.
FILE_OPEN Abra o arquivo. Retornar um erro.
FILE_OPEN_IF Abra o arquivo. Crie o arquivo.
FILE_OVERWRITE Abra o arquivo e substitua-o. Retornar um erro.
FILE_OVERWRITE_IF Abra o arquivo e substitua-o. Crie o arquivo.

[in] CreateOptions

Especifica as opções a serem aplicadas quando o driver cria ou abre o arquivo. Use um ou mais sinalizadores na tabela a seguir.

Sinalizador CreateOptions Significado
FILE_DIRECTORY_FILE O arquivo é um diretório. Os sinalizadores CreateOptions compatíveis são FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO_NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENT e FILE_OPEN_BY_FILE_ID. O parâmetro CreateDisposition deve ser definido como FILE_CREATE, FILE_OPEN ou FILE_OPEN_IF.
FILE_NON_DIRECTORY_FILE O arquivo não é um diretório. O objeto de arquivo a ser aberto pode representar um arquivo de dados; um dispositivo lógico, virtual ou físico; ou um volume.
FILE_WRITE_THROUGH Os serviços do sistema, os drivers do sistema de arquivos e os drivers que gravam dados no arquivo devem realmente transferir os dados para o arquivo antes que qualquer operação de gravação solicitada seja considerada concluída.
FILE_SEQUENTIAL_ONLY Todo o acesso ao arquivo será sequencial.
FILE_RANDOM_ACCESS O acesso ao arquivo pode ser aleatório, portanto, nenhuma operação sequencial de leitura antecipada deve ser executada por drivers do sistema de arquivos ou pelo sistema.
FILE_NO_INTERMEDIATE_BUFFERING O arquivo não pode ser armazenado em cache ou armazenado em buffers internos de um driver. Esse sinalizador é incompatível com o sinalizador de FILE_APPEND_DATA do parâmetro DesiredAccess .
FILE_SYNCHRONOUS_IO_ALERT Todas as operações no arquivo são executadas de forma síncrona. Qualquer espera em nome do chamador está sujeita ao encerramento prematuro de alertas. Esse sinalizador também faz com que o sistema de E/S mantenha o ponteiro de posição do arquivo. Se esse sinalizador estiver definido, o sinalizador SYNCHRONIZE deverá ser definido no parâmetro DesiredAccess .
FILE_SYNCHRONOUS_IO_NONALERT Todas as operações no arquivo são executadas de forma síncrona. As esperas no sistema que sincronizam a fila de E/S e a conclusão não estão sujeitas a alertas. Esse sinalizador também faz com que o sistema de E/S mantenha o contexto de posição do arquivo. Se esse sinalizador estiver definido, o sinalizador SYNCHRONIZE deverá ser definido no parâmetro DesiredAccess .
FILE_CREATE_TREE_CONNECTION Create uma conexão de árvore para esse arquivo para abri-lo pela rede. Esse sinalizador não é usado por drivers intermediários e de dispositivo.
FILE_COMPLETE_IF_OPLOCKED Conclua essa operação imediatamente com um código de êxito alternativo de STATUS_OPLOCK_BREAK_IN_PROGRESS se o arquivo de destino estiver bloqueado oportunista (oplock), em vez de bloquear o thread do chamador. Se o arquivo estiver oplocked, outro chamador já terá acesso ao arquivo. Esse sinalizador não é usado por drivers intermediários e de dispositivo. Para obter informações sobre oplock, consulte Bloqueios oportunistas.
FILE_NO_EA_KNOWLEDGE Se os atributos estendidos (EAs) de um arquivo existente que está sendo aberto indicarem que o chamador deve entender os EAs para interpretar corretamente o arquivo, ZwCreateFile deverá retornar um erro. Esse sinalizador é irrelevante para drivers de dispositivo e intermediários.
FILE_OPEN_REPARSE_POINT Abra um arquivo com um ponto de nova análise e ignore o processamento normal de ponto de nova análise para o arquivo. Para obter mais informações, consulte a seção Comentários a seguir. Para obter informações sobre o ponto de nova análise, consulte Reparse Points.
FILE_DELETE_ON_CLOSE O sistema exclui o arquivo quando o último identificador para o arquivo é passado para ZwClose. Se esse sinalizador estiver definido, o sinalizador DELETE deverá ser definido no parâmetro DesiredAccess .
FILE_OPEN_BY_FILE_ID O nome do arquivo especificado pelo parâmetro ObjectAttributes inclui um número de referência de arquivo binário de 8 bytes ou 16 bytes ou ID de objeto para o arquivo, dependendo do sistema de arquivos, conforme mostrado abaixo. Opcionalmente, um nome de dispositivo seguido por um caractere de barra invertida pode continuar com esses valores binários. Por exemplo, um nome de dispositivo terá o seguinte formato:

?? \C:\FileID
\device\HardDiskVolume1\ObjectID

em que FileID é de 8 bytes e ObjectID é de 16 bytes.

No NTFS, isso pode ser um número de referência de 8 bytes ou 16 bytes ou ID de objeto. Um número de referência de 16 bytes é o mesmo que um número de 8 bytes acolchoados com zeros.

No ReFS, pode ser um número de referência de 8 bytes ou 16 bytes. Um número de 16 bytes não está relacionado a um número de 8 bytes. Não há suporte para IDs de objeto.

Os sistemas de arquivos FAT, ExFAT, UDFS e CDFS não dão suporte a esse sinalizador.

Esse número é atribuído por e específico ao sistema de arquivos específico.

Como o campo filename conterá parcialmente um blob binário, é incorreto supor que essa é uma cadeia de caracteres Unicode válida e, mais importante, pode não ser uma cadeia de caracteres terminada em nulo.
FILE_OPEN_FOR_BACKUP_INTENT O arquivo está sendo aberto para intenção de backup. Portanto, o sistema deve marcar para determinados direitos de acesso e conceder ao chamador o acesso apropriado ao arquivo antes de verificar o parâmetro DesiredAccess no descritor de segurança do arquivo. Esse sinalizador não é usado por drivers intermediários e de dispositivo.
FILE_RESERVE_OPFILTER Esse sinalizador permite que um aplicativo solicite um filtro oplock (bloqueio oportunista) para impedir que outros aplicativos sejam violações de compartilhamento. Se já houver identificadores abertos, a solicitação de criação falhará com STATUS_OPLOCK_NOT_GRANTED. Para obter mais informações, consulte a seção Comentários a seguir. Para obter informações sobre oplock, consulte Bloqueios oportunistas.
FILE_OPEN_REQUIRING_OPLOCK O arquivo está sendo aberto e um bloqueio oportunista (oplock) no arquivo está sendo solicitado como uma única operação atômica. O sistema de arquivos verifica se há oplocks antes de executar a operação de criação e falhará na criação com um código de retorno de STATUS_CANNOT_BREAK_OPLOCK se o resultado for interromper um oplock existente.

O sinalizador FILE_OPEN_REQUIRING_OPLOCK está disponível nos sistemas operacionais Windows 7, Windows Server 2008 R2 e posteriores do Windows.
FILE_SESSION_AWARE O cliente que abre o arquivo ou dispositivo tem reconhecimento de sessão e o acesso por sessão é validado, se necessário.

O sinalizador FILE_SESSION_AWARE está disponível a partir do Windows 8.

[in, optional] EaBuffer

Para drivers intermediários e de dispositivo, esse parâmetro deve ser um ponteiro NULL .

[in] EaLength

Para drivers intermediários e de dispositivo, esse parâmetro deve ser zero.

Retornar valor

ZwCreateFile retorna STATUS_SUCCESS com êxito ou um código de erro NTSTATUS apropriado em caso de falha. No último caso, o chamador pode determinar a causa da falha verificando o parâmetro IoStatusBlock .

ZwCreateFile pode retornar STATUS_FILE_LOCK_CONFLICT como o valor retornado ou no membro Status da estrutura IO_STATUS_BLOCK apontada pelo parâmetro IoStatusBlock . Isso ocorrerá somente se o arquivo de log NTFS estiver cheio e ocorrer um erro enquanto ZwCreateFile tentar lidar com essa situação.

Comentários

ZwCreateFile fornece um identificador que o chamador pode usar para manipular os dados de um arquivo ou o estado e os atributos do objeto de arquivo. Para obter mais informações, consulte Usando arquivos em um driver.

Depois que o identificador apontado por FileHandle não estiver mais em uso, o driver deverá chamar ZwClose para fechá-lo.

Se o chamador não estiver em execução em um contexto de thread do sistema, ele deverá garantir que todos os identificadores que ele cria sejam identificadores privados. Caso contrário, o identificador pode ser acessado pelo processo em cujo contexto o driver está em execução. Para obter mais informações, consulte Identificadores de objeto.

Há duas maneiras alternativas de especificar o nome do arquivo a ser criado ou aberto com ZwCreateFile:

  1. Como um nome de caminho totalmente qualificado, fornecido no membro ObjectName da entrada ObjectAttributes.

  2. Como pathname relativo ao arquivo de diretório representado pelo identificador no membro RootDirectory do ObjectAttributes de entrada.

Definir determinados sinalizadores no parâmetro DesiredAccess resulta nos seguintes efeitos:

  • Para que um chamador sincronize uma conclusão de E/S aguardando o FileHandle retornado, o sinalizador SYNCHRONIZE deve ser definido. Caso contrário, um chamador que seja um dispositivo ou driver intermediário deve sincronizar uma conclusão de E/S usando um objeto de evento.

  • Se o chamador definir apenas os sinalizadores FILE_APPEND_DATA e SYNCHRONIZE, ele poderá gravar somente no final do arquivo e qualquer informação de deslocamento sobre operações de gravação no arquivo será ignorada. O arquivo será estendido automaticamente conforme necessário para esse tipo de operação.

  • Definir o sinalizador FILE_WRITE_DATA para um arquivo também permite que o chamador escreva além do final do arquivo. Novamente, o arquivo é automaticamente estendido conforme necessário.

  • Se o chamador definir apenas os sinalizadores FILE_EXECUTE e SYNCHRONIZE, ele não poderá ler nem gravar dados diretamente no arquivo usando o FileHandle retornado. Ou seja, todas as operações no arquivo ocorrem por meio do pager do sistema em resposta às operações de instrução e acesso a dados. Os drivers intermediários e de dispositivo não devem definir o sinalizador de FILE_EXECUTE.

O parâmetro ShareAccess determina se threads separados podem acessar o mesmo arquivo, possivelmente simultaneamente. Desde que ambos os chamadores tenham os privilégios de acesso apropriados, o arquivo pode ser aberto e compartilhado com êxito. Se o chamador original de ZwCreateFile não especificar FILE_SHARE_READ, FILE_SHARE_WRITE ou FILE_SHARE_DELETE, nenhum outro chamador poderá abrir o arquivo, ou seja, o chamador original receberá acesso exclusivo.

Para abrir um arquivo compartilhado com êxito, os sinalizadores DesiredAccess devem ser compatíveis com os sinalizadores DesiredAccess e ShareAccess de todas as operações abertas anteriores que ainda não foram lançadas por meio de . Ou seja, o DesiredAccess especificado para ZwCreateFile para um determinado arquivo não deve entrar em conflito com os acessos que outros abridores do arquivo não permitiram.

O valor CreateDisposition FILE_SUPERSEDE requer que o chamador tenha acesso DELETE a um objeto de arquivo existente. Nesse caso, uma chamada bem-sucedida para ZwCreateFile com FILE_SUPERSEDE em um arquivo existente exclui efetivamente esse arquivo e recria-o. Isso implica que, se o arquivo já tiver sido aberto por outro thread, ele abriu o arquivo especificando um parâmetro ShareAccess com o sinalizador FILE_SHARE_DELETE definido. Observe que esse tipo de disposição é consistente com o estilo POSIX de substituir arquivos.

Os valores CreateDisposition FILE_OVERWRITE_IF e FILE_SUPERSEDE são semelhantes. Se ZwCreateFile for chamado com um arquivo existente e qualquer um desses valores CreateDisposition , o arquivo será substituído.

Substituir um arquivo é semanticamente equivalente a uma operação de substituição, exceto pelo seguinte:

  • O chamador deve ter acesso de gravação ao arquivo, em vez de excluir o acesso. Isso implica que, se o arquivo já tiver sido aberto por outro thread, ele abriu o arquivo com o sinalizador FILE_SHARE_WRITE definido no ShareAccess de entrada.

  • Os atributos de arquivo especificados são logicamente ORed com aqueles que já estão no arquivo. Isso implica que, se o arquivo já tiver sido aberto por outro thread, um chamador subsequente de ZwCreateFile não poderá desabilitar sinalizadores FileAttributes existentes , mas poderá habilitar sinalizadores adicionais para o mesmo arquivo.

O FILE_DIRECTORY_FILE valor CreateOptions especifica que o arquivo a ser criado ou aberto é um diretório. Quando um arquivo de diretório é criado, o sistema de arquivos cria uma estrutura apropriada no disco para representar um diretório vazio para a estrutura no disco desse sistema de arquivos específico. Se essa opção tiver sido especificada e o arquivo fornecido a ser aberto não for um arquivo de diretório ou se o chamador tiver especificado um valor inconsistente de CreateOptions ou CreateDisposition , a chamada para ZwCreateFile falhará.

O sinalizador FILE_NO_INTERMEDIATE_BUFFERING CreateOptions impede que o sistema de arquivos execute qualquer buffer intermediário em nome do chamador. Especificar esse sinalizador coloca as seguintes restrições nos parâmetros do chamador para outras rotinas de arquivo ZwXxx:

  • Qualquer ByteOffset opcional passado para ZwReadFile ou ZwWriteFile deve ser um múltiplo do tamanho do setor.

  • O Length passado para ZwReadFile ou ZwWriteFile deve ser uma parte integrante do tamanho do setor. Observe que especificar uma operação de leitura para um buffer cujo comprimento é exatamente o tamanho do setor pode resultar em um número menor de bytes significativos sendo transferidos para esse buffer se o final do arquivo foi atingido durante a transferência.

  • Os buffers devem ser alinhados de acordo com o requisito de alinhamento do dispositivo subjacente. Para obter essas informações, chame ZwCreateFile para obter um identificador para o objeto de arquivo que representa o dispositivo físico e passe esse identificador para ZwQueryInformationFile. Para obter uma lista dos valores FILE_XXX_ALIGNMENT do sistema, consulte DEVICE_OBJECT.

  • As chamadas para ZwSetInformationFile com o parâmetro FileInformationClass definido como FilePositionInformation devem especificar um deslocamento que seja um múltiplo do tamanho do setor.

Os sinalizadores FILE_SYNCHRONOUS_IO_ALERT e FILE_SYNCHRONOUS_IO_NONALERT CreateOptions , que são mutuamente exclusivos como seus nomes sugerem, especificam que todas as operações de E/S no arquivo serão síncronas, desde que ocorram por meio do objeto de arquivo referido pelo FileHandle retornado. Toda a E/S em um arquivo desse tipo é serializada em todos os threads usando o identificador retornado. Se um desses sinalizadores CreateOptions estiver definido, o sinalizador SYNCHRONIZE DesiredAccess também deverá ser definido para obrigar o gerenciador de E/S a usar o objeto de arquivo como um objeto de sincronização. Nesses casos, o gerenciador de E/S controla o deslocamento de posição do arquivo atual, que você pode passar para ZwReadFile e ZwWriteFile. Chame ZwQueryInformationFile ou ZwSetInformationFile para obter ou definir essa posição.

Se o sinalizador CreateOptions FILE_OPEN_REPARSE_POINT não for especificado e ZwCreateFile tentar abrir um arquivo com um ponto de nova análise, o processamento normal do ponto de nova análise ocorrerá para o arquivo. Se, por outro lado, o sinalizador FILE_OPEN_REPARSE_POINT for especificado, o processamento normal de nova análise não ocorrerá e ZwCreateFile tentará abrir diretamente o arquivo de ponto de nova análise. Em ambos os casos, se a operação aberta tiver sido bem-sucedida, ZwCreateFile retornará STATUS_SUCCESS; caso contrário, a rotina retorna um código de erro NTSTATUS. ZwCreateFile nunca retorna STATUS_REPARSE.

O sinalizador CreateOptions FILE_OPEN_REQUIRING_OPLOCK elimina o tempo entre quando você abre o arquivo e solicita um oplock que poderia potencialmente permitir que um terceiro abrisse o arquivo e recebesse uma violação de compartilhamento. Um aplicativo pode usar o sinalizador FILE_OPEN_REQUIRING_OPLOCK em ZwCreateFile e solicitar qualquer oplock. Isso garante que um proprietário do oplock seja notificado de qualquer solicitação aberta subsequente que cause uma violação de compartilhamento.

No Windows 7, se outros identificadores existirem no arquivo quando um aplicativo usar o sinalizador FILE_OPEN_REQUIRING_OPLOCK, a operação de criação falhará com STATUS_OPLOCK_NOT_GRANTED. Essa restrição não existe mais começando com Windows 8.

Se essa operação de criação interromper um oplock que já existe no arquivo, definir o sinalizador FILE_OPEN_REQUIRING_OPLOCK fará com que a operação de criação falhe com STATUS_CANNOT_BREAK_OPLOCK. O oplock existente não será quebrado por essa operação de criação.

Um aplicativo que usa o sinalizador FILE_OPEN_REQUIRING_OPLOCK deve solicitar um oplock depois que essa chamada for bem-sucedida ou todas as tentativas subsequentes de abrir o arquivo serão bloqueadas sem o benefício do processamento de oplock normal. Da mesma forma, se essa chamada for bem-sucedida, mas a solicitação oplock subsequente falhar, um aplicativo que usa esse sinalizador deverá fechar seu identificador depois de detectar que a solicitação oplock falhou.

O sinalizador FILE_OPEN_REQUIRING_OPLOCK está disponível nos sistemas operacionais Windows 7, Windows Server 2008 R2 e posteriores do Windows. Os sistemas de arquivos da Microsoft que implementam esse sinalizador no Windows 7 são NTFS, FAT e exFAT.

O sinalizador CreateOptions FILE_RESERVE_OPFILTER permite que um aplicativo solicite um oplock de Nível 1, Lote ou Filtro para impedir que outros aplicativos sejam violações de compartilhamento. No entanto, FILE_RESERVE_OPFILTER só é praticamente útil para oplocks de filtro. Para usá-lo, você deve concluir as seguintes etapas:

  1. Emita uma solicitação de criação com CreateOptions de FILE_RESERVE_OPFILTER, DesiredAccess de exatamente FILE_READ_ATTRIBUTES e ShareAccess de exatamente FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.

    • Se já houver identificadores abertos, a solicitação de criação falhará com STATUS_OPLOCK_NOT_GRANTED e o próximo oplock solicitado também falhará.

    • Se você abrir com mais acesso ou menos compartilhamento, também causará uma falha de STATUS_OPLOCK_NOT_GRANTED.

  2. Se a solicitação de criação for bem-sucedida, solicite um oplock.

  3. Abra outro identificador no arquivo para fazer E/S.

A etapa três torna isso prático apenas para oplocks de filtro. O identificador aberto na etapa 3 pode ter um DesiredAccess que contém um máximo de FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_DATA | FILE_READ_EA | FILE_EXECUTE | SYNCHRONIZE | READ_CONTROL e ainda não quebrar um oplock de Filtro. No entanto, qualquer DesiredAccess maior que FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE interromperá um oplock de Nível 1 ou Lote e tornará o sinalizador FILE_RESERVE_OPFILTER inútil para esses tipos de oplock.

O NTFS é o único sistema de arquivos da Microsoft que implementa FILE_RESERVE_OPFILTER.

Os chamadores de ZwCreateFile devem estar em execução em IRQL = PASSIVE_LEVEL e com APCs de kernel especiais habilitadas.

Se a chamada para essa função ocorrer no modo de usuário, você deverá usar o nome "NtCreateFile" em vez de "ZwCreateFile".

Para chamadas de drivers no modo kernel, as versões NtXxx e ZwXxx de uma rotina dos Serviços do Sistema Nativo do Windows podem se comportar de forma diferente na maneira como lidam e interpretam parâmetros de entrada. Para obter mais informações sobre a relação entre as versões NtXxx e ZwXxx de uma rotina, consulte Usando versões Nt e Zw das rotinas dos Serviços de Sistema Nativo.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL (consulte a seção Comentários)
Regras de conformidade de DDI HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm)

Confira também

ACCESS_MASK

DEVICE_OBJECT

IO_STATUS_BLOCK

InitializeObjectAttributes

Usando versões Nt e Zw das rotinas dos Serviços de Sistema Nativo

ZwClose

ZwOpenFile

ZwQueryInformationFile

ZwReadFile

ZwSetInformationFile

ZwWriteFile

 Bloqueios oportunistas

Pontos de reanálise