Condividi tramite


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

Deviceiocontrol

FSCTL_SRV_REQUEST_RESUME_KEY