Compartir a través de


Función NtCopyFileChunk (ntifs.h)

La rutina NtCopyFileChunk copia datos del archivo de origen en el archivo de destino.

Sintaxis

__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

Identificador del archivo de origen que se va a leer.

[in] DestHandle

Identificador del archivo de destino. Los datos del archivo sourceHandle se copian en el archivo de DestHandle. Los puertos de finalización se pueden usar en este identificador.

[in, optional] Event

Evento opcional que se indicará cuando se complete la operación de copia.

[out] IoStatusBlock

Puntero a una estructura de IO_STATUS_BLOCK que recibe el estado de finalización final y otra información sobre la operación de copia.

[in] Length

Longitud de los datos que se van a copiar, en bytes.

[in] SourceOffset

Desplazamiento de bytes inicial dentro del archivo de origen para iniciar la operación de lectura.

[in] DestOffset

Desplazamiento de bytes inicial dentro del archivo de destino para iniciar la operación de escritura.

[in, optional] SourceKey

Una clave opcional que se va a usar si hay interbloqueos asociados al archivo de origen.

[in, optional] DestKey

Una clave opcional que se va a usar si hay interbloqueos asociados al archivo de destino.

[in] Flags

Marcas opcionales. Actualmente no hay valores de marca válidos.

Valor devuelto

NtCopyFileChunk devuelve STATUS_SUCCESS si la copia se ha completado correctamente o un código NTSTATUS, como uno de los siguientes:

Código Significado
STATUS_PENDING La copia está en curso. Los autores de llamadas deben esperar al evento o al objeto de archivo para obtener el estado final.
STATUS_[ERROR] Se pueden producir varios errores similares a NtReadFile y NtWriteFile.

Una vez que la escritura completa el estado de la operación se puede determinar examinando el campo Estado de IoStatusBlock.

Consulte Comentarios para obtener más información sobre el control de E/S sincrónica/asincrónica.

Comentarios

NtCopyFileChunk copia los datos de un archivo de origen en un archivo de destino mediante los desplazamientos de archivo proporcionados para la longitud solicitada. Si la longitud supera el final del archivo (EOF) en el archivo de origen, NtCopyFileChunk solo leerá y copiará los datos en el destino hasta el EOF del origen. Los autores de llamadas pueden obtener el número real de bytes escritos desde IoStatusBlock.

NtCopyFileChunk incluye dos operaciones de E/S: una lectura del archivo de origen y una escritura en el archivo de destino. Aunque cada E/S internamente tiene su propia finalización, el evento del autor de la llamada (o el identificador de archivo de destino si no se proporciona ningún evento) se indicará cuando se complete la operación de copia.

Los archivos de origen y destino se pueden abrir de forma asincrónica o sincrónica. Aunque se recomienda que los autores de llamadas sean coherentes entre los dos identificadores, no es necesario. En función de los identificadores proporcionados, NtCopyFileChunk devolverá en distintos puntos de la operación de copia, tal como se especifica en la tabla siguiente.

Identificador de origen Identificador de destino Condiciones de retorno
Asincrónica Asincrónica Una vez que la lectura se ha puesto en cola correctamente O si hay errores antes de poner en cola la lectura.
Asincrónica Sincrónico Una vez finalizada la escritura, O si hay errores antes de la finalización de la escritura.
Sincrónico Sincrónico Una vez finalizada la escritura, O si hay errores antes de la finalización de la escritura.
Sincrónica Asincrónica Una vez que la escritura se ha puesto en cola correctamente O si hay errores antes de poner en cola la escritura.

Si se devuelve STATUS_PENDING, el llamado debe esperar a que se complete la operación antes de examinar el bloque de estado de E/S para el estado final. Si se devuelve STATUS_SUCCESS o el bloque de estado de E/S indica que el autor de la llamada debe examinar ioStatusBlock para determinar cuántos bytes se copiaron.

Si se abre cualquiera de los archivos para E/S no almacenados en caché, el autor de la llamada debe asegurarse de que la longitud solicitada esté alineada con el sector con el que se abra el archivo como no almacenado en caché. Si ambas, la longitud debe alinearse con el tamaño de sector mayor de los dos.

Todas las operaciones de lectura y escritura de NtCopyFileChunk tendrán:

  • El modo de solicitante del IRP establecido en KernelMode
  • Extensión IRP de tipo IopCopyInformationType.

Los filtros no tienen acceso directamente a las extensiones IRP, pero pueden comprobar la presencia de esta extensión y obtener información de copia de los datos de devolución de llamada llamando a FltGetCopyInformationFromCallbackData.

La E/S rápida no está disponible en esta copia porque la información de copia está presente en la extensión IRP (y la E/S rápida no crea IRP).

CopyFileChunk lo usa internamente CopyFile para la mayoría de los formularios de copia. Las excepciones actuales incluyen copias en la nube, descarga de SMB y ODX.

En el ejemplo siguiente se muestra cómo 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; 
    } 
}

Consulte Escenarios de copia de archivos en modo kernel y detección de escenarios de archivos de copia para obtener más información.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 11, versión 22H2
Encabezado ntifs.h
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Consulte también

FltGetCopyInformationFromCallbackData

IO_STATUS_BLOCK

NtCreateFile