Função NtCopyFileChunk (ntifs.h)

A rotina NtCopyFileChunk copia dados do arquivo de origem para o arquivo de destino.

Sintaxe

__kernel_entry NTSYSCALLAPI NTSTATUS NtCopyFileChunk(
  [in]           HANDLE           SourceHandle,
  [in]           HANDLE           DestHandle,
  [in, optional] HANDLE           Event,
  [out]          PIO_STATUS_BLOCK IoStatusBlock,
  [in]           ULONG            Length,
  [in]           PLARGE_INTEGER   SourceOffset,
  [in]           PLARGE_INTEGER   DestOffset,
  [in, optional] PULONG           SourceKey,
  [in, optional] PULONG           DestKey,
  [in]           ULONG            Flags
);

Parâmetros

[in] SourceHandle

O HANDLE do arquivo de origem a ser lido.

[in] DestHandle

O HANDLE do arquivo de destino. Os dados do arquivo de SourceHandle são copiados para o arquivo de DestHandle. As portas de conclusão podem ser usadas nesse identificador.

[in, optional] Event

Um evento opcional a ser sinalizado quando a operação de cópia for concluída.

[out] IoStatusBlock

Um ponteiro para uma estrutura IO_STATUS_BLOCK que recebe a status de conclusão final e outras informações sobre a operação de cópia.

[in] Length

O comprimento dos dados a serem copiados, em bytes.

[in] SourceOffset

O deslocamento de bytes inicial no arquivo de origem para iniciar a operação de leitura.

[in] DestOffset

O deslocamento de bytes inicial no arquivo de destino para iniciar a operação de gravação.

[in, optional] SourceKey

Uma chave opcional a ser usada se houver oplocks associados ao arquivo de origem.

[in, optional] DestKey

Uma chave opcional a ser usada se houver oplocks associados ao arquivo de destino.

[in] Flags

Sinalizadores opcionais. Atualmente, não há valores de sinalizador válidos.

Retornar valor

NtCopyFileChunk retornará STATUS_SUCCESS se a cópia for concluída com êxito ou um código NTSTATUS, como um dos seguintes:

Código Significado
STATUS_PENDING A cópia está em andamento. Os chamadores devem aguardar o evento ou o objeto de arquivo para obter o status final.
STATUS_[ERROR] Vários erros podem ocorrer semelhantes a NtReadFile e NtWriteFile.

Depois que a gravação concluir a status da operação pode ser determinada examinando o campo Status de IoStatusBlock.

Consulte Comentários para obter detalhes sobre o tratamento de E/S síncrona/assíncrona.

Comentários

NtCopyFileChunk copia dados de um arquivo de origem para um arquivo de destino usando os deslocamentos de arquivo fornecidos para o comprimento solicitado. Se o comprimento ultrapassar o fim do arquivo (EOF) no arquivo de origem, NtCopyFileChunk somente lerá e copiará os dados para o destino até o EOF da origem. Os chamadores podem obter o número real de bytes gravados do IoStatusBlock.

NtCopyFileChunk inclui duas operações de E/S: uma leitura do arquivo de origem e uma gravação no arquivo de destino. Embora cada E/S internamente tenha sua própria conclusão, o evento do chamador (ou identificador de arquivo de destino, se nenhum evento for fornecido) será sinalizado quando a operação de cópia for concluída.

Os arquivos de origem e destino podem ser abertos de forma assíncrona ou síncrona. Embora seja recomendável que os chamadores sejam consistentes entre os dois identificadores, isso não é necessário. Dependendo dos identificadores fornecidos, NtCopyFileChunk retornará em pontos diferentes na operação de cópia, conforme especificado na tabela a seguir.

Identificador de origem Identificador de destino Condições de retorno
Assíncronos Assíncronos Depois que a leitura tiver sido enfileirada com êxito OU se houver erros antes de enfileirar a leitura.
Assíncronos Síncrono Depois que a gravação for concluída OU se houver erros antes da conclusão da gravação.
Síncronos Síncronos Depois que a gravação for concluída OU se houver erros antes da conclusão da gravação.
Síncrono Assíncronos Depois que a gravação tiver sido enfileirada com êxito OU se houver erros antes de enfileirar a gravação.

Se STATUS_PENDING for retornado, o chamado deverá aguardar a conclusão da operação antes de examinar o bloco de status de E/S para a status final. Se STATUS_SUCCESS for retornado ou o bloco de status de E/S indicar êxito, o chamador deverá examinar o IoStatusBlock para determinar quantos bytes foram copiados.

Se um dos arquivos estiver aberto para E/S não armazenada em cache, o chamador deverá garantir que o comprimento solicitado esteja alinhado ao setor com qualquer arquivo aberto como não armazenado em cache. Se ambos, o comprimento deverá ser alinhado com o tamanho do setor maior dos dois.

Todas as operações de leitura e gravação do NtCopyFileChunk terão:

  • O modo solicitante do IRP definido como KernelMode
  • Uma extensão IRP do tipo IopCopyInformationType.

Os filtros não têm acesso diretamente às extensões IRP, mas podem marcar a presença dessa extensão e obter informações de cópia dos dados de retorno de chamada chamando FltGetCopyInformationFromCallbackData.

A E/S rápida não está disponível nesta cópia porque as informações de cópia estão presentes na extensão IRP (e a E/S rápida não cria IRPs).

NtCopyFileChunk é usado internamente pelo CopyFile para a maioria das formas de cópia. As exceções atuais incluem cópias de nuvem, descarregamento de SMB e ODX.

O exemplo a seguir mostra como usar NtCopyFileChunk.


// Input parameters to NtCopyFileChunk. Opening
// the file handles is done using NtCreateFile
// and creating the event is done with CreateEvent.
// This is not shown in this code sample. 

HANDLE sourceHandle; 
HANDLE destHandle; 
HANDLE event; 
IO_STATUS_BLOCK ioStatusBlock; 
ULONG length; 
LARGE_INTEGER sourceOffset; 
LARGE_INTEGER destOffset; 

// Copy the data 

status = NtCopyFileChunk( sourceHandle, 
                          destHandle, 
                          event, 
                          &ioStatusBlock, 
                          length, 
                          &sourceOffset, 
                          &destOffset, 
                          NULL, 
                          NULL, 
                          0 ); 

// Wait for the copy to complete 

if (status == STATUS_PENDING) { 
    status = NtWaitForSingleObject( event, FALSE, NULL ); 

    if (NT_SUCCESS(status)) { 
        status = ioStatusBlock.Status; 
    } 
}

Confira Copiar arquivo no modo kernel e detectar cenários de arquivo de cópia para obter mais informações.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 11, versão 22H2
Cabeçalho ntifs.h
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Confira também

FltGetCopyInformationFromCallbackData

IO_STATUS_BLOCK

NtCreateFile