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

Deviceiocontrol

FSCTL_SRV_REQUEST_RESUME_KEY