codice di controllo IOCTL_COPYCHUNK
Il codice di controllo IOCTL_COPYCHUNK avvia una copia lato server di un intervallo di dati, detto anche blocco.
Per eseguire questa operazione, chiamare la funzione DeviceIoControl con i parametri seguenti.
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to device
IOCTL_COPYCHUNK, // dwIoControlCode
(LPVOID) lpInBuffer, // input buffer
(DWORD) nInBufferSize, // size of input buffer
(LPVOID) lpOutBuffer, // output buffer
(DWORD) nOutBufferSize, // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
Parametri
-
hDevice [in]
-
Handle per il file di destinazione dell'operazione di copia sul lato server. Per ottenere questo handle, chiamare la funzione CreateFile .
-
dwIoControlCode [in]
-
Codice di controllo per l'operazione. Usare IOCTL_COPYCHUNK per questa operazione.
-
lpInBuffer
-
Puntatore al buffer di input, una struttura SRV_COPYCHUNK_COPY . Per altre informazioni, vedere la sezione Osservazioni.
-
nInBufferSize [in]
-
Dimensioni del buffer di input, in byte.
-
lpOutBuffer [out]
-
Puntatore al buffer di output, una struttura SRV_COPYCHUNK_RESPONSE . Per altre informazioni, vedere la sezione Osservazioni.
-
nOutBufferSize [in]
-
Dimensioni in byte del buffer di output.
-
lpBytesReturned [out]
-
Puntatore a una variabile che riceve le dimensioni dei dati archiviati nel buffer di output, in byte.
Se il buffer di output è troppo piccolo, la chiamata ha esito negativo, la funzione GetLastError restituisce ERROR_INSUFFICIENT_BUFFER e lpBytesReturned è zero.
Se il parametro lpOverlapped è NULL, lpBytesReturned non può essere NULL. Anche quando un'operazione non restituisce dati di output e il parametro lpOutBuffer è NULL, DeviceIoControl usa lpBytesReturned. Dopo un'operazione di questo tipo, il valore di lpBytesReturned è privo di significato.
Se lpOverlapped non è NULL, lpBytesReturned può essere NULL. Se lpOverlapped non è NULL e l'operazione restituisce dati, lpBytesReturned non ha significato fino al completamento dell'operazione sovrapposta. Per recuperare il numero di byte restituiti, chiamare la funzione GetOverlappedResult . Se il parametro hDevice è associato a una porta di completamento I/O, è possibile recuperare il numero di byte restituiti chiamando la funzione GetQueuedCompletionStatus .
-
lpOverlapped [in]
-
Puntatore a una struttura OVERLAPPED .
Se il parametro hDevice è stato aperto senza specificare FILE_FLAG_OVERLAPPED, lpOverlapped viene ignorato.
Se hDevice è stato aperto con il flag FILE_FLAG_OVERLAPPED , l'operazione viene eseguita come operazione sovrapposta (asincrona). In questo caso , lpOverlapped deve puntare a una struttura OVERLAPPED valida che contiene un handle a un oggetto evento. In caso contrario, la funzione ha esito negativo in modi imprevedibili.
Per le operazioni sovrapposte, DeviceIoControl restituisce immediatamente e l'oggetto evento viene segnalato al termine dell'operazione. In caso contrario, la funzione non restituisce fino al completamento dell'operazione o fino a quando non si verifica un errore.
Valore restituito
Se l'operazione viene completata correttamente, DeviceIoControl restituisce un valore diverso da zero.
Se l'operazione ha esito negativo o è in sospeso, DeviceIoControl restituisce zero. Per informazioni dettagliate sull'errore, chiamare GetLastError.
Osservazioni
Questo codice di controllo non ha alcun file di intestazione associato. È necessario definire il codice di controllo e le strutture di dati come indicato di seguito.
#define IOCTL_COPYCHUNK CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 262, METHOD_BUFFERED, FILE_READ_ACCESS)
typedef struct _SRV_COPYCHUNK {
LARGE_INTEGER SourceOffset;
LARGE_INTEGER DestinationOffset;
ULONG Length;
} SRV_COPYCHUNK, *PSRV_COPYCHUNK;
typedef struct _SRV_COPYCHUNK_COPY {
SRV_RESUME_KEY SourceFile;
ULONG ChunkCount;
ULONG Reserved;
SRV_COPYCHUNK Chunk[1]; // Array
} SRV_COPYCHUNK_COPY, *PSRV_COPYCHUNK_COPY;
typedef struct _SRV_COPYCHUNK_RESPONSE {
ULONG ChunksWritten;
ULONG ChunkBytesWritten;
ULONG TotalBytesWritten;
} SRV_COPYCHUNK_RESPONSE, *PSRV_COPYCHUNK_RESPONSE;
Questi membri possono essere descritti come segue.
Membro | Descrizione |
---|---|
SourceOffset |
Offset, in byte, dall'inizio del file di origine al blocco da copiare. |
DestinationOffset |
Offset, in byte, dall'inizio del file di destinazione al percorso in cui deve essere copiato il blocco. |
Lunghezza |
Numero di byte di dati nel blocco da copiare. Deve essere maggiore di zero e minore o uguale a 1 MB.
Lunghezza * ChunkCount deve essere minore o uguale a 16 MB. |
SourceFile |
Chiave che rappresenta il file di origine con i dati da copiare. Questa chiave viene ottenuta tramite FSCTL_SRV_REQUEST_RESUME_KEY. |
ChunkCount |
Numero di blocchi da copiare. Deve essere maggiore di zero e minore o uguale a 256. |
Riservati |
Questo membro è riservato per l'uso del sistema; non usare. |
Pezzo |
Matrice di strutture ChunkCountSRV_COPYCHUNK , una per ogni blocco da copiare. La lunghezza, in byte, di questa matrice deve essere ChunkCount * sizeof(SRV_COPYCHUNK). |
Blocchi scritti |
Se l'operazione non è riuscita con ERROR_INVALID_PARAMETER, questo valore indica il numero massimo di blocchi che il server accetterà in una singola richiesta, ovvero 256. In caso contrario, questo valore indica il numero di blocchi scritti correttamente. |
ChunkBytesWritten |
Se l'operazione non è riuscita con ERROR_INVALID_PARAMETER, questo valore indica il numero massimo di byte che il server consentirà di scrivere in un singolo blocco, ovvero 1 MB. In caso contrario, questo valore indica il numero di byte scritti correttamente nell'ultimo blocco che non è stato elaborato correttamente (se si è verificata una scrittura parziale). |
TotalBytesWritten |
Se l'operazione non è riuscita con ERROR_INVALID_PARAMETER, questo valore indica il numero massimo di byte che il server copierà in una singola richiesta, ovvero 16 MB. In caso contrario, questo valore indica il numero di byte scritti correttamente. |
Vedi anche