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
);
Parâmetros
-
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.
Valor retornado
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.
Comentários
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. |
Confira também