Condividi tramite


Funzione NtCopyFileChunk (ntifs.h)

La routine NtCopyFileChunk copia i dati dal file di origine nel file di destinazione.

Sintassi

__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
);

Parametri

[in] SourceHandle

Handle del file di origine da leggere.

[in] DestHandle

HANDLE del file di destinazione. I dati del file sourceHandle sono copiati nel file di DestHandle. Le porte di completamento possono essere usate in questo handle.

[in, optional] Event

Evento facoltativo da segnalare al termine dell'operazione di copia.

[out] IoStatusBlock

Puntatore a una struttura IO_STATUS_BLOCK che riceve lo stato di completamento finale e altre informazioni sull'operazione di copia.

[in] Length

Lunghezza dei dati da copiare, in byte.

[in] SourceOffset

Offset dei byte iniziale all'interno del file di origine per avviare l'operazione di lettura.

[in] DestOffset

Offset dei byte iniziale all'interno del file di destinazione per avviare l'operazione di scrittura.

[in, optional] SourceKey

Chiave facoltativa da utilizzare se sono presenti oplock associati al file di origine.

[in, optional] DestKey

Chiave facoltativa da utilizzare se sono presenti oplock associati al file di destinazione.

[in] Flags

Flag facoltativi. Attualmente non sono presenti valori di flag validi.

Valore restituito

NtCopyFileChunk restituisce STATUS_SUCCESS se la copia è stata completata correttamente o un codice NTSTATUS, ad esempio uno dei seguenti:

Codice Significato
STATUS_PENDING La copia è in corso. I chiamanti devono attendere l'evento o l'oggetto file per ottenere lo stato finale.
STATUS_[ERROR] Possono verificarsi diversi errori simili a NtReadFile e NtWriteFile.

Al termine della scrittura, lo stato dell'operazione può essere determinato esaminando il campo Stato di IoStatusBlock.

Per informazioni dettagliate sulla gestione delle operazioni di I/O sincrone/asincrone, vedere La sezione Osservazioni .

Commenti

NtCopyFileChunk copia i dati da un file di origine in un file di destinazione usando gli offset di file forniti per la lunghezza richiesta. Se la lunghezza supera la fine del file (EOF) nel file di origine, NtCopyFileChunk leggerà e copia i dati nella destinazione fino all'EOF dell'origine. I chiamanti possono ottenere il numero effettivo di byte scritti da IoStatusBlock.

NtCopyFileChunk include due operazioni di I/O: una lettura del file di origine e una scrittura nel file di destinazione. Anche se ogni I/O dispone internamente del proprio completamento, l'evento del chiamante (o l'handle del file di destinazione se non viene fornito alcun evento) verrà segnalato al termine dell'operazione di copia.

I file di origine e di destinazione possono essere aperti in modo asincrono o sincrono. Anche se è consigliabile che i chiamanti siano coerenti tra i due handle, non è obbligatorio. A seconda degli handle forniti, NtCopyFileChunk restituirà in punti diversi nell'operazione di copia, come specificato nella tabella seguente.

Handle di origine Handle di destinazione Condizioni di restituzione
Asincrono Asincrono Dopo che la lettura è stata accodata correttamente oppure se sono presenti errori prima di accodare la lettura.
Asincrono Sincrono Al termine della scrittura OPPURE se sono presenti errori prima del completamento della scrittura.
Sincrono Sincrono Al termine della scrittura OPPURE se sono presenti errori prima del completamento della scrittura.
Sincrono Asincrono Dopo che la scrittura è stata accodata correttamente oppure se sono presenti errori prima di accodare la scrittura.

Se viene restituito STATUS_PENDING, il metodo chiamato deve attendere il completamento dell'operazione prima di esaminare il blocco di stato di I/O per lo stato finale. Se STATUS_SUCCESS viene restituito o il blocco di stato di I/O indica l'esito positivo, il chiamante deve esaminare IoStatusBlock per determinare il numero di byte copiati.

Se uno dei due file viene aperto per operazioni di I/O non memorizzate nella cache, il chiamante deve assicurarsi che la lunghezza richiesta sia allineata al settore con qualsiasi file aperto come non memorizzato nella cache. Se entrambe, la lunghezza deve essere allineata alle dimensioni del settore maggiori dei due.

Tutte le operazioni di lettura e scrittura da NtCopyFileChunk avranno:

  • La modalità richiedente di IRP impostata su KernelMode
  • Estensione IRP di tipo IopCopyInformationType.

I filtri non hanno accesso direttamente alle estensioni IRP, ma possono controllare la presenza di questa estensione e ottenere informazioni di copia dai dati di callback chiamando FltGetCopyInformationFromCallbackData.

I/O veloce non è disponibile in questa copia perché le informazioni di copia sono presenti nell'estensione IRP (e Fast I/O non crea IP).

NtCopyFileChunk viene usato internamente da CopyFile per la maggior parte delle forme di copia. Le eccezioni correnti includono copie cloud, offload SMB e ODX.

Nell'esempio seguente viene illustrato come usare 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; 
    } 
}

Per altre informazioni, vedere Copiare e rilevare scenari di file in modalità kernel .

Requisiti

Requisito Valore
Client minimo supportato Windows 11 versione 22H2
Intestazione ntifs.h
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL

Vedi anche

FltGetCopyInformationFromCallbackData

IO_STATUS_BLOCK

NtCreateFile