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 |