Compartilhar via


Função ZwWriteFile (wdm.h)

A rotina ZwWriteFile grava dados em um arquivo aberto.

Sintaxe

NTSYSAPI NTSTATUS ZwWriteFile(
  [in]           HANDLE           FileHandle,
  [in, optional] HANDLE           Event,
  [in, optional] PIO_APC_ROUTINE  ApcRoutine,
  [in, optional] PVOID            ApcContext,
  [out]          PIO_STATUS_BLOCK IoStatusBlock,
  [in]           PVOID            Buffer,
  [in]           ULONG            Length,
  [in, optional] PLARGE_INTEGER   ByteOffset,
  [in, optional] PULONG           Key
);

Parâmetros

[in] FileHandle

Manipule para o objeto de arquivo. Esse identificador é criado por uma chamada bem-sucedida para ZwCreateFile ou ZwOpenFile.

[in, optional] Event

Opcionalmente, um identificador para um objeto de evento a ser definido como o estado sinalizado após a conclusão da operação de gravação. Os drivers intermediários e de dispositivo devem definir esse parâmetro como NULL.

[in, optional] ApcRoutine

Esse parâmetro é reservado. O dispositivo e os drivers intermediários devem definir esse ponteiro como NULL.

[in, optional] ApcContext

Esse parâmetro é reservado. O dispositivo e os drivers intermediários devem definir esse ponteiro como NULL.

[out] IoStatusBlock

Ponteiro para uma estrutura IO_STATUS_BLOCK que recebe a status de conclusão final e informações sobre a operação de gravação solicitada. O membro Information recebe o número de bytes realmente gravados no arquivo.

[in] Buffer

Ponteiro para um buffer alocado pelo chamador que contém os dados a serem gravados no arquivo.

[in] Length

O tamanho, em bytes, do buffer apontado por Buffer.

[in, optional] ByteOffset

Ponteiro para uma variável que especifica o deslocamento de bytes inicial no arquivo para iniciar a operação de gravação. Se Length e ByteOffset especificarem uma operação de gravação após a marca de fim de arquivo atual, ZwWriteFile estenderá automaticamente o arquivo e atualizará a marca de fim do arquivo; todos os bytes que não são gravados explicitamente entre essas marcas de fim de arquivo antigas e novas são definidos como zero.

Se a chamada para ZwCreateFile definir apenas o sinalizador DesiredAccess FILE_APPEND_DATA, ByteOffset será ignorado. Os dados no Buffer fornecido, para Bytes de comprimento , são gravados começando no final atual do arquivo.

Se a chamada para ZwCreateFile definir um dos sinalizadores CreateOptions , FILE_SYNCHRONOUS_IO_ALERT ou FILE_SYNCHRONOUS_IO_NONALERT, o Gerenciador de E/S manterá a posição atual do arquivo. Nesse caso, o chamador de ZwWriteFile pode especificar que o deslocamento de posição do arquivo atual seja usado em vez de um valor ByteOffset explícito. Essa especificação pode ser feita usando um dos seguintes métodos:

  • Especifique um ponteiro para um valor LARGE_INTEGER com o membro HighPart definido como -1 e o membro LowPart definido como o valor definido pelo sistema FILE_USE_FILE_POINTER_POSITION.

  • Passe um ponteiro NULL para ByteOffset.

ZwWriteFile atualiza a posição atual do arquivo adicionando o número de bytes gravados ao concluir a operação de gravação, se estiver usando a posição de arquivo atual mantida pelo Gerenciador de E/S.

Mesmo quando o Gerenciador de E/S está mantendo a posição atual do arquivo, o chamador pode redefinir essa posição passando um valor ByteOffset explícito para ZwWriteFile. Isso altera automaticamente a posição do arquivo atual para esse valor ByteOffset, executa a operação de gravação e atualiza a posição de acordo com o número de bytes realmente gravados. Essa técnica fornece ao chamador um serviço atômico de busca e gravação.

Também é possível fazer com que uma operação de gravação comece no final atual do arquivo especificando para ByteOffset um ponteiro para um valor de LARGE_INTEGER com HighPart definido como -1 e LowPart definido como FILE_WRITE_TO_END_OF_FILE. Isso funciona independentemente de o Gerenciador de E/S manter a posição atual do arquivo.

[in, optional] Key

O dispositivo e os drivers intermediários devem definir esse ponteiro como NULL.

Retornar valor

ZwWriteFile retorna STATUS_SUCCESS com êxito ou o código de erro NTSTATUS apropriado em caso de falha.

Comentários

Os chamadores de ZwWriteFile já devem ter chamado ZwCreateFile com o sinalizador FILE_WRITE_DATA, FILE_APPEND_DATA ou GENERIC_WRITE definido no parâmetro DesiredAccess . Observe que ter apenas FILE_APPEND_DATA acesso a um arquivo não permite que o chamador grave em qualquer lugar no arquivo, exceto na marca de fim do arquivo atual, embora ter FILE_WRITE_DATA acesso a um arquivo não impeça o chamador de gravar para ou além do final de um arquivo.

Se a chamada anterior para ZwCreateFile definir o sinalizador CreateOptions FILE_NO_INTERMEDIATE_BUFFERING, os parâmetros Length e ByteOffset como ZwWriteFile deverão ser um integral do tamanho do setor. Para obter mais informações, consulte ZwCreateFile.

ZwWriteFile inicia a operação de gravação no arquivo em ByteOffset, na posição do arquivo atual ou na marca de fim do arquivo. Ele encerra a operação de gravação quando grava bytes de Comprimento do Buffer. Se necessário, ele estende o comprimento do arquivo e redefine a marca de fim do arquivo.

Se o chamador abriu o arquivo com o sinalizador DesiredAccess SYNCHRONIZE definido, o chamador poderá aguardar que essa rotina defina o FileHandle fornecido como o estado sinalizado.

Os drivers devem chamar ZwWriteFile no contexto do processo do sistema em três casos:

  1. O driver cria o identificador de arquivo que ele passa para ZwWriteFile.

  2. ZwWriteFile notifica o driver de conclusão de E/S por meio de um evento criado pelo driver.

  3. ZwWriteFile notifica o driver de conclusão de E/S por meio de uma rotina de retorno de chamada APC que o driver passa para ZwWriteFile.

Os identificadores de arquivo e evento só são válidos no contexto do processo em que os identificadores são criados. Portanto, para evitar falhas de segurança, o driver deve criar qualquer identificador de arquivo ou evento que ele passe para ZwWriteFile no contexto do processo do sistema em vez do contexto de processo em que o driver está.

Da mesma forma, ZwWriteFile deverá ser chamado no contexto do processo do sistema se notificar o driver de conclusão de E/S por meio de uma APC, pois as APCs sempre são acionadas no contexto do thread que emite a solicitação de E/S. Se o driver chamar ZwWriteFile no contexto de um processo diferente do processo do sistema, o APC poderá ser adiado indefinidamente ou não será acionado, pois o thread de origem pode nunca entrar em um estado de espera alertável.

Para obter mais informações sobre como trabalhar com arquivos, consulte Usando arquivos em um driver.

Os chamadores de ZwWriteFile 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 "NtWriteFile" em vez de "ZwWriteFile".

Para chamadas de drivers de modo kernel, as versões NtXxx e ZwXxx de uma rotina do Windows Native System Services 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 Using Nt and Zw Versions of the Native System Services Routines.

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 da DDI HwStorPortProhibitedDDIs(storport), PowerIrpDDis(wdm)

Confira também

KeInitializeEvent

ZwCreateFile

ZwQueryInformationFile

ZwReadFile

ZwSetInformationFile