Compartilhar via


Função NtCreateFile (winternl.h)

Cria um novo arquivo ou diretório ou abre um arquivo, dispositivo, diretório ou volume existente.

Essa função é o equivalente do modo de usuário à função ZwCreateFile documentada no WDK (Windows Driver Kit).

Sintaxe

__kernel_entry NTSTATUS NtCreateFile(
  [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]           PVOID              EaBuffer,
  [in]           ULONG              EaLength
);

Parâmetros

[out] FileHandle

Um ponteiro para uma variável que recebe o identificador de arquivo se a chamada for bem-sucedida.

[in] DesiredAccess

O valor ACCESS_MASK que expressa o tipo de acesso que o chamador requer para o arquivo ou diretório. O conjunto de sinalizadores de DesiredAccess definidos pelo sistema determina os direitos de acesso específicos a seguir para objetos de arquivo.

Valor Significado
EXCLUIR
O arquivo pode ser excluído.
FILE_READ_DATA
Os dados podem ser lidos do arquivo.
FILE_READ_ATTRIBUTES
fileAttributes sinalizadores, descritos posteriormente, podem ser lidos.
FILE_READ_EA
Atributos estendidos associados ao arquivo podem ser lidos. Esse sinalizador é irrelevante para drivers intermediários e de dispositivo.
READ_CONTROL
A ACL (lista de controle de acesso) e as informações de propriedade associadas ao arquivo podem ser lidas.
FILE_WRITE_DATA
Os dados podem ser gravados no arquivo.
FILE_WRITE_ATTRIBUTES
sinalizadores FileAttributes podem ser gravados.
FILE_WRITE_EA
Atributos estendidos (EAs) associados ao arquivo podem ser gravados. Esse sinalizador é irrelevante para drivers intermediários e de dispositivo.
FILE_APPEND_DATA
Os dados podem ser acrescentados ao arquivo.
WRITE_DAC
A DACL (lista de controle de acesso discricionário) associada ao arquivo pode ser gravada.
WRITE_OWNER
As informações de propriedade associadas ao arquivo podem ser gravadas.
SINCRONIZAR
O FileHandle retornado pode ser aguardado para sincronizar com a conclusão de uma operação de E/S. Se FileHandle não foi aberto para E/S síncrona, esse valor será ignorado.
FILE_EXECUTE
Os dados podem ser lidos na memória do arquivo usando e/S de paginação do sistema. Esse sinalizador é irrelevante para drivers intermediários e de dispositivo.
  Não especifique FILE_READ_DATA, FILE_WRITE_DATA, FILE_APPEND_DATAou FILE_EXECUTE ao criar ou abrir um diretório.

Os chamadores de NtCreateFile podem especificar um ou uma combinação do seguinte, possivelmente usando um OR bit a bit com sinalizadores compatíveis adicionais da lista de sinalizadores de DesiredAccess anterior, para qualquer objeto de arquivo que não represente um arquivo de diretório.

Valor Significado
FILE_GENERIC_READ
STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE
FILE_GENERIC_WRITE
STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE
FILE_GENERIC_EXECUTE
STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE

O valor FILE_GENERIC_EXECUTE é irrelevante para drivers intermediários e de dispositivo.

Os XXX STANDARD_RIGHTS_são valores predefinidos do sistema usados para impor a segurança em objetos do sistema.

Para abrir ou criar um arquivo de diretório, como também indicado com o parâmetro CreateOptions, os chamadores de NtCreateFile podem especificar um ou uma combinação do seguinte, possivelmente usando um bit-OR com um ou mais sinalizadores compatíveis da lista de sinalizadores DesiredAccess anteriores.

Valor Significado
FILE_LIST_DIRECTORY
Os arquivos no diretório podem ser listados.
FILE_TRAVERSE
O diretório pode ser percorrido: ou seja, pode fazer parte do nome do caminho de um arquivo.

[in] ObjectAttributes

Um ponteiro para uma estrutura já inicializada com InitializeObjectAttributes. Os membros dessa estrutura para um objeto de arquivo incluem o seguinte.

Valor Significado
de comprimento ULONG
Especifica o número de bytes de ObjectAttributes dados fornecidos. Esse valor deve ser pelo menos sizeof(OBJECT_ATTRIBUTES).
HANDLE RootDirectory
Opcionalmente, especifica um identificador para um diretório obtido por uma chamada anterior para NtCreateFile. Se esse valor for NULL, o membro ObjectName deverá ser uma especificação de arquivo totalmente qualificada que inclua o caminho completo para o arquivo de destino. Se esse valor não forNULL, o membro ObjectName especifica um nome de arquivo relativo a esse diretório.
objectName PUNICODE_STRING
Aponta para uma cadeia de caracteres Unicode em buffer que nomeia o arquivo a ser criado ou aberto. Esse valor deve ser uma especificação de arquivo totalmente qualificada ou o nome de um objeto de dispositivo, a menos que seja o nome de um arquivo relativo ao diretório especificado por rootDirectory. Por exemplo, \Device\Floppy1\myfile.dat ou \?? \B:\myfile.dat pode ser a especificação de arquivo totalmente qualificada, desde que o driver disquete e o sistema de arquivos em excesso já estejam carregados. Para obter mais informações, consulte nomes de arquivo, caminhos e namespaces.
de atributos ULONG
É um conjunto de sinalizadores que controla os atributos de objeto de arquivo. Esse valor pode ser zero ou OBJ_CASE_INSENSITIVE, o que indica que o código de pesquisa de nome deve ignorar o caso do membro ObjectName em vez de executar uma pesquisa de correspondência exata. O valor OBJ_INHERIT é irrelevante para drivers intermediários e de dispositivo.
securityDescriptor PSECURITY_DESCRIPTOR
Opcionalmente, especifica um descritor de segurança a ser aplicado a um arquivo. As ACLs especificadas por esse descritor de segurança são aplicadas ao arquivo somente quando ele é criado. Se o valor for NULL quando um arquivo for criado, a ACL colocada no arquivo dependerá do sistema de arquivos; a maioria dos sistemas de arquivos propaga alguma parte de tal ACL do arquivo de diretório pai combinado com a ACL padrão do chamador. Os drivers intermediários e de dispositivo podem definir esse membro como NULL.
PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService
Especifica os direitos de acesso que um servidor deve receber ao contexto de segurança do cliente. Esse valor não éNULL somente quando uma conexão com um servidor protegido é estabelecida, permitindo que o chamador controle quais partes do contexto de segurança do chamador são disponibilizadas para o servidor e se o servidor tem permissão para representar o chamador.

[out] IoStatusBlock

Um ponteiro para uma variável que recebe o status de conclusão final e informações sobre a operação solicitada. Ao retornar de NtCreateFile, o membro de Informações do contém um dos seguintes valores:

  • FILE_CREATED
  • FILE_OPENED
  • FILE_OVERWRITTEN
  • FILE_SUPERSEDED
  • FILE_EXISTS
  • FILE_DOES_NOT_EXIST

[in, optional] AllocationSize

O tamanho da alocação inicial em bytes para o arquivo. Um valor diferente de zero não tem efeito, a menos que o arquivo esteja sendo criado, substituído ou substituído.

[in] FileAttributes

Os atributos de arquivo. Atributos explicitamente especificados são aplicados somente quando o arquivo é criado, substituído ou, em alguns casos, substituído. Por padrão, esse valor é um FILE_ATTRIBUTE_NORMAL, que pode ser substituído por uma combinação ORed de um ou mais sinalizadores FILE_ATTRIBUTE_xxxx, que são definidos em Wdm.h e NtDdk.h. Para obter uma lista de sinalizadores que podem ser usados com NtCreateFile, consulte CreateFile.

[in] ShareAccess

O tipo de acesso de compartilhamento que o chamador gostaria de usar no arquivo, como zero, ou como uma ou uma combinação dos valores a seguir.

Valor Significado
FILE_SHARE_READ
O arquivo pode ser aberto para acesso de leitura por chamadas de outros threads para NtCreateFile.
FILE_SHARE_WRITE
O arquivo pode ser aberto para acesso de gravação por chamadas de outros threads para NtCreateFile.
FILE_SHARE_DELETE
O arquivo pode ser aberto para excluir o acesso por chamadas de outros threads para NtCreateFile.

Para obter mais informações, consulte o SDK do Windows.

[in] CreateDisposition

Especifica o que fazer, dependendo se o arquivo já existe, como um dos valores a seguir.

Valor Significado
FILE_SUPERSEDE
Se o arquivo já existir, substitua-o pelo arquivo especificado. Se isso não acontecer, crie o arquivo especificado.
FILE_CREATE
Se o arquivo já existir, falhe na solicitação e não crie ou abra o arquivo especificado. Se isso não acontecer, crie o arquivo especificado.
FILE_OPEN
Se o arquivo já existir, abra-o em vez de criar um novo arquivo. Caso contrário, falhe na solicitação e não crie um novo arquivo.
FILE_OPEN_IF
Se o arquivo já existir, abra-o. Se isso não acontecer, crie o arquivo especificado.
FILE_OVERWRITE
Se o arquivo já existir, abra-o e substitua-o. Se isso não acontecer, falhará na solicitação.
FILE_OVERWRITE_IF
Se o arquivo já existir, abra-o e substitua-o. Se isso não acontecer, crie o arquivo especificado.

[in] CreateOptions

As opções a serem aplicadas ao criar ou abrir o arquivo, como uma combinação compatível dos sinalizadores a seguir.

Valor Significado
FILE_DIRECTORY_FILE
O arquivo que está sendo criado ou aberto é um arquivo de diretório. Com esse sinalizador, o parâmetro CreateDisposition deve ser definido como FILE_CREATE, FILE_OPENou FILE_OPEN_IF. Com esse sinalizador, outros sinalizadores CreateOptions compatíveis incluem apenas o seguinte: FILE_SYNCHRONOUS_IO_ALERT, FILE_SYNCHRONOUS_IO _NONALERT, FILE_WRITE_THROUGH, FILE_OPEN_FOR_BACKUP_INTENTe FILE_OPEN_BY_FILE_ID.
FILE_NON_DIRECTORY_FILE
O arquivo que está sendo aberto não deve ser um arquivo de diretório ou essa chamada falha. O objeto de arquivo que está sendo aberto pode representar um arquivo de dados, um dispositivo lógico, virtual ou físico ou um volume.
FILE_WRITE_THROUGH
Os aplicativos 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. Esse sinalizador será definido automaticamente se o sinalizador CreateOptionsFILE_NO_INTERMEDIATE _BUFFERING estiver definido.
FILE_SEQUENTIAL_ONLY
Todos os acessos ao arquivo são sequenciais.
FILE_RANDOM_ACCESS
Os acessos ao arquivo podem ser aleatórios, portanto, nenhuma operação sequencial de leitura antecipada deve ser executada no arquivo por FSDs ou pelo sistema.
FILE_NO_INTERMEDIATE_BUFFERING
O arquivo não pode ser armazenado em cache ou armazenado em buffer nos buffers internos de um driver. Esse sinalizador é incompatível com o sinalizador deFILE_APPEND_DATA 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 a encerramento prematuro de 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 DesiredAccessSYNCHRONIZE também deverá ser definido.
FILE_SYNCHRONOUS_IO_NONALERT
Todas as operações no arquivo são executadas de forma síncrona. As esperas no sistema para sincronizar 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 DesiredAccessSYNCHRONIZE também deverá ser definido.
FILE_CREATE_TREE_CONNECTION
Crie uma conexão de árvore para esse arquivo para abri-la pela rede. Esse sinalizador não é usado por drivers intermediários e de dispositivo.
FILE_NO_EA_KNOWLEDGE
Se os atributos estendidos em um arquivo existente que está sendo aberto indicarem que o chamador deve entender os EAs para interpretar corretamente o arquivo, falhe essa solicitação porque o chamador não entende como lidar com EAs. Esse sinalizador é irrelevante para drivers intermediários e de dispositivo.
FILE_OPEN_REPARSE_POINT
Abra um arquivo com um ponto de nova análise e ignore o processamento normal do ponto de nova análise para o arquivo. Para obter mais informações, consulte a seção Comentários.
FILE_DELETE_ON_CLOSE
Exclua o arquivo quando o último identificador para ele for passado para NtClose. 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 o número de referência de arquivo de 8 bytes para o arquivo. Esse número é atribuído e específico ao sistema de arquivos específico. Se o arquivo for um ponto de nova análise, o nome do arquivo também incluirá o nome de um dispositivo. Observe que o sistema de arquivos FAT não dá suporte a esse sinalizador. Esse sinalizador não é usado por drivers intermediários e de dispositivo.
FILE_OPEN_FOR_BACKUP_INTENT
O arquivo está sendo aberto para a intenção de backup. Portanto, o sistema deve verificar 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 bloqueio oportunista de filtro ([Bloqueios oportunistas](/windows/win32/fileio/oportunista-locks)) 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.
FILE_OPEN_REQUIRING_OPLOCK
O arquivo está sendo aberto e um bloqueio oportunista ([Bloqueios Oportunistas](/windows/win32/fileio/oportunista-locks)) 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. Para obter mais informações, consulte a seção Comentários.Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Esse sinalizador não tem suporte.

Esse sinalizador tem suporte nos seguintes sistemas de arquivos: NTFS, FAT e exFAT.

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, em vez de bloquear o thread do chamador. Se o arquivo estiver oplocked ([Bloqueios Oportunistas](/windows/win32/fileio/oportunista-locks)), outro chamador já terá acesso ao arquivo. Esse sinalizador não é usado por drivers intermediários e de dispositivo.

[in] EaBuffer

Ponteiro para um buffer EA usado para passar atributos estendidos.

Observação Alguns sistemas de arquivos podem não dar suporte a buffers EA.
 

[in] EaLength

Comprimento do buffer EA.

Valor de retorno

NtCreateFile retorna STATUS_SUCCESS ou um status de erro apropriado. Se ele retornar um status de erro, o chamador poderá encontrar mais informações sobre a causa da falha verificando o IoStatusBlock. Para simplificar essa verificação, um aplicativo pode usar as macros NT_SUCCESS, NT_ERRORe NT_WARNING.

Observações

O identificador, fornecido por NtCreateFile, pode ser usado por chamadas subsequentes para manipular dados dentro do arquivo ou do estado ou atributos do objeto de arquivo.

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

  • Como um nome de caminho totalmente qualificado, fornecido no ObjectName membro da entrada ObjectAttributes
  • Como um nome de caminho relativo ao arquivo de diretório representado pelo identificador no membro RootDirectory do de entrada ObjectAttributes

Certas DesiredAccess sinalizadores e combinações de sinalizadores têm os seguintes efeitos:

  • Para um chamador sincronizar uma conclusão de E/S aguardando o FileHandle retornado, o sinalizador SYNCHRONIZE deve ser definido.
  • Passar um zero para desiredFlags não é válido.
  • Se apenas os sinalizadores FILE_APPEND_DATA e SYNCHRONIZE estiverem definidos, o chamador poderá gravar somente no final do arquivo e todas as informações de deslocamento sobre gravações no arquivo serão ignoradas. No entanto, o arquivo é automaticamente estendido conforme necessário para esse tipo de operação de gravação.
  • Definir o sinalizador de FILE_WRITE_DATA para um arquivo também permite que as gravações além do final do arquivo ocorram. O arquivo também é estendido automaticamente para esse tipo de gravação.
  • Se apenas os sinalizadores FILE_EXECUTE e SYNCHRONIZE estiverem definidos, o chamador não poderá ler ou gravar diretamente nenhum dado no arquivo usando oFileHandle retornado, ou seja, todas as operações no arquivo ocorrem por meio do pager do sistema em resposta a instruções e acessos a dados.

O parâmetro ShareAccess determina se threads separados podem acessar o mesmo arquivo, possivelmente simultaneamente. Desde que ambos os abridores de arquivos tenham o privilégio de acessar um arquivo da maneira especificada, o arquivo pode ser aberto e compartilhado com êxito. Se o chamador original do NtCreateFile não especificar FILE_SHARE_READ, FILE_SHARE_WRITEou FILE_SHARE_DELETE, nenhuma outra operação aberta poderá ser executada no arquivo; ou seja, o chamador original recebe acesso exclusivo ao arquivo.

Para que um arquivo compartilhado seja aberto com êxito, o parâmetro desiredAccess solicitado para o arquivo deve ser compatível com as especificações DesiredAccess e ShareAccess de todas as aberturas anteriores que ainda não foram lançadas com NtClose. Ou seja, o parâmetro DesiredAccess especificado para NtCreateFile para um determinado arquivo não deve entrar em conflito com os acessos que outros abridores do arquivo não permitiram.

O valor CreateDispositionFILE_SUPERSEDE requer que o chamador tenha acesso DELETE a um objeto de arquivo existente. Nesse caso, uma chamada bem-sucedida para NtCreateFile com FILE_SUPERSEDE em um arquivo existente exclui efetivamente esse arquivo e o recria. Isso implica que, se o arquivo já tiver sido aberto por outro thread, ele abriu o arquivo especificando um parâmetro ShareAccess com o conjunto de sinalizadores FILE_SHARE_DELETE.

Observe que esse tipo de disposição é consistente com o estilo POSIX de substituição de arquivos. Os valores CreateDispositionFILE_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 de FILE_SHARE_WRITE definido na entrada parâmetro ShareAccess.
  • 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 NtCreateFile não poderá desabilitar sinalizadores de FileAttributes existentes, mas poderá habilitar sinalizadores adicionais para o mesmo arquivo. Observe que esse estilo de substituição de arquivos é consistente com os sistemas operacionais MS-DOS, Windows 3.1 e OS/2.

O valor CreateOptionsFILE_DIRECTORY_FILE especifica que o arquivo a ser criado ou aberto é um arquivo de 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 em disco do 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 CreateOptions ou CreateDisposition inconsistente, a chamada para NtCreateFile falhará.

O sinalizador CreateOptionsFILE_NO_INTERMEDIATE_BUFFERING impede que o sistema de arquivos execute qualquer buffer intermediário em nome do chamador. Especificar esse valor coloca certas restrições nos parâmetros do chamador para outras rotinas de de arquivo deXXXNt , incluindo o seguinte:

  • Qualquer byteOffset opcional passado para a função NtReadFile ou NtWriteFile deve ser parte integrante do tamanho do setor.
  • O de comprimento de passado para NtReadFile ou NtWriteFile, 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 ajustados de acordo com o requisito de alinhamento do dispositivo subjacente. Essas informações podem ser obtidas chamando NtCreateFile para obter um identificador para o objeto de arquivo que representa o dispositivo físico e, em seguida, chamando NtQueryInformationFile com esse identificador. Para obter uma lista do sistema FILE_valores de_ALIGNMENT XXX, consulte a documentação do SDK do Windows.
  • As chamadas para NtSetInformationFile com o parâmetro FileInformationClass definido como FilePositionInformation devem especificar um deslocamento que seja parte integrante do tamanho do setor.
Os sinalizadores CreateOptionsFILE_SYNCHRONOUS_IO_ALERT e FILE_SYNCHRONOUS_IO_NONALERT, que são mutuamente exclusivos como seus nomes sugerem, especificam que todas as operações de E/S no arquivo devem ser síncronas, desde que ocorram por meio do objeto de arquivo referido peloFileHandle retornado. Todas as E/Ss em um arquivo desse tipo são serializadas em todos os threads usando o identificador retornado. Com qualquer um desses CreateOptions, o sinalizador DesiredAccessSYNCHRONIZE deve ser definido para que o Gerenciador de E/S use o objeto de arquivo como um objeto de sincronização. Com qualquer um desses CreateOptions definido, o Gerenciador de E/S mantém o "contexto de posição do arquivo" para o objeto de arquivo, um deslocamento de posição de arquivo interno e atual. Esse deslocamento pode ser usado em chamadas para NtReadFile e NtWriteFile. Sua posição também pode ser consultada ou definida com NtQueryInformationFile e NtSetInformationFile.

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

O sinalizador CreateOptionsFILE_OPEN_REQUIRING_OPLOCK do parâmetro elimina o tempo entre quando você abre o arquivo e solicita um oplock que poderia potencialmente permitir que terceiros abrissem o arquivo, o que causaria uma violação de compartilhamento. Um aplicativo pode usar o sinalizador FILE_OPEN_REQUIRING_OPLOCK com NtCreateFile 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 houver outros identificadores no arquivo quando um aplicativo usar esse sinalizador, a operação de criação falhará com STATUS_OPLOCK_NOT_GRANTED. Essa restrição não existe mais a partir do Windows 8.

Se essa operação de criação interromper um oplock que já existe no arquivo, a configuração do 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á interrompido por essa operação de criação.

Um aplicativo que usa esse sinalizador 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.

Observação o sinalizador FILE_OPEN_REQUIRING_OPLOCK está disponível no Windows 7, windows server 2008 R2 e posteriores sistemas operacionais para os seguintes sistemas de arquivos: NTFS, FAT e exFAT.
 

O sinalizador FILE_RESERVE_OPFILTER do parâmetro CreateOptions permite que um aplicativo solicite um oplock de Nível 1, Lote ou Filtro para impedir que outros aplicativos sejam atingidos por violações de compartilhamento. No entanto, em termos práticos, o FILE_RESERVE_OPFILTER é útil apenas 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 exatamente FILE_READ_ATTRIBUTESe do ShareAccess exatamente (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE). As possíveis falhas são as seguintes:
    • Se já houver identificadores abertos, a solicitação de criação falhará com STATUS_OPLOCK_NOT_GRANTEDe o próximo oplock solicitado também falhará.
    • Se você abrir com mais acesso do que FILE_READ_ATTRIBUTES ou menos compartilhamento do que (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE), a solicitação falhará com 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 três 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 quebra um oplock de filtro. No entanto, qualquer DesiredAccess maior que (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE) quebrará 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.

Para obter mais informações sobre oplocks, consulte Bloqueios oportunistas.

Observe que o arquivo de cabeçalho do WDK NtDef.h é necessário para muitas definições constantes, bem como o InitializeObjectAttributes macro. Você também pode usar as funções LoadLibrary e GetProcAddress para vincular dinamicamente a NtDll.dll.

Requisitos

Requisito Valor
da Plataforma de Destino Windows
cabeçalho winternl.h
biblioteca ntdll.lib
de DLL ntdll.dll