IOCTL_COPYCHUNK código de controle
O código de controle IOCTL_COPYCHUNK inicia uma cópia do lado do servidor de um intervalo de dados, também chamado de parte.
Para executar essa operação, chame a função DeviceIoControl com os parâmetros a seguir.
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
);
-
hDevice [in]
-
Um identificador para o arquivo que é o destino da operação de cópia do lado do servidor. Para obter esse identificador, chame a função CreateFile .
-
dwIoControlCode [in]
-
O código de controle para a operação. Use IOCTL_COPYCHUNK para esta operação.
-
lpInBuffer
-
Um ponteiro para o buffer de entrada, uma estrutura SRV_COPYCHUNK_COPY . Para obter mais informações, consulte a seção Comentários.
-
nInBufferSize [in]
-
O tamanho do buffer de entrada, em bytes.
-
lpOutBuffer [out]
-
Um ponteiro para o buffer de saída, uma estrutura SRV_COPYCHUNK_RESPONSE . Para obter mais informações, consulte a seção Comentários.
-
nOutBufferSize [in]
-
O tamanho do buffer de saída em bytes.
-
lpBytesReturned [out]
-
Um ponteiro para uma variável que recebe o tamanho dos dados armazenados no buffer de saída, em bytes.
Se o buffer de saída for muito pequeno, a chamada falhará, a função GetLastError retornará ERROR_INSUFFICIENT_BUFFER e lpBytesReturned será zero.
Se o parâmetro lpOverlapped for NULL, lpBytesReturned não poderá ser NULL. Mesmo quando uma operação não retorna dados de saída e o parâmetro lpOutBuffer é NULL, DeviceIoControl usa lpBytesReturned. Após essa operação, o valor de lpBytesReturned não tem sentido.
Se lpOverlapped não for NULL, lpBytesReturned poderá ser NULL. Se lpOverlapped não for NULL e a operação retornar dados, lpBytesReturned não terá sentido até que a operação sobreposta seja concluída. Para recuperar o número de bytes retornados, chame a função GetOverlappedResult . Se o parâmetro hDevice estiver associado a uma porta de conclusão de E/S, você poderá recuperar o número de bytes retornados chamando a função GetQueuedCompletionStatus .
-
lpOverlapped [in]
-
Um ponteiro para uma estrutura OVERLAPPED .
Se o parâmetro hDevice foi aberto sem especificar FILE_FLAG_OVERLAPPED, lpOverlapped será ignorado.
Se hDevice tiver sido aberto com o sinalizador FILE_FLAG_OVERLAPPED , a operação será executada como uma operação sobreposta (assíncrona). Nesse caso, lpOverlapped deve apontar para uma estrutura OVERLAPPED válida que contém um identificador para um objeto de evento. Caso contrário, a função falhará de maneiras imprevisíveis.
Para operações sobrepostas, DeviceIoControl retorna imediatamente e o objeto de evento é sinalizado quando a operação é concluída. Caso contrário, a função não retornará até que a operação seja concluída ou até que ocorra um erro.
Se a operação for concluída com êxito, DeviceIoControl retornará um valor diferente de zero.
Se a operação falhar ou estiver pendente, DeviceIoControl retornará zero. Para obter informações de erro estendidas, chame GetLastError.
Esse código de controle não tem nenhum arquivo de cabeçalho associado. Você deve definir o código de controle e as estruturas de dados da seguinte maneira.
#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;
Esses membros podem ser descritos da seguinte maneira.
Membro | Descrição |
---|---|
Sourceoffset |
O deslocamento, em bytes, desde o início do arquivo de origem até a parte a ser copiada. |
Destinationoffset |
O deslocamento, em bytes, desde o início do arquivo de destino até o local em que a parte deve ser copiada. |
Comprimento |
O número de bytes de dados na parte a ser copiada. Deve ser maior que zero e menor ou igual a 1 MB.
Comprimento * ChunkCount deve ser menor ou igual a 16 MB. |
Sourcefile |
Uma chave que representa o arquivo de origem com os dados a serem copiados. Essa chave é obtida por meio de FSCTL_SRV_REQUEST_RESUME_KEY. |
ChunkCount |
O número de partes a serem copiadas. Deve ser maior que zero e menor ou igual a 256. |
Reservados |
Esse membro é reservado para uso do sistema; não use. |
Pedaço |
Uma matriz de estruturas SRV_COPYCHUNKChunkCount, uma para cada parte a ser copiada. O comprimento, em bytes, dessa matriz deve ser ChunkCount * sizeof(SRV_COPYCHUNK). |
Partes Escritas |
Se a operação falhar com ERROR_INVALID_PARAMETER, esse valor indicará o número máximo de partes que o servidor aceitará em uma única solicitação, que é 256. Caso contrário, esse valor indica o número de partes que foram gravadas com êxito. |
ChunkBytesWritten |
Se a operação falhar com ERROR_INVALID_PARAMETER, esse valor indicará o número máximo de bytes que o servidor permitirá que sejam gravados em uma única parte, que é de 1 MB. Caso contrário, esse valor indica o número de bytes que foram gravados com êxito na última parte que não foi processada com êxito (se ocorreu uma gravação parcial). |
TotalBytesWritten |
Se a operação falhar com ERROR_INVALID_PARAMETER, esse valor indicará o número máximo de bytes que o servidor copiará em uma única solicitação, que é de 16 MB. Caso contrário, esse valor indica o número de bytes que foram gravados com êxito. |