Compartir a través de


IOCTL_COPYCHUNK código de control

El código de control IOCTL_COPYCHUNK inicia una copia del lado servidor de un intervalo de datos, también denominado fragmento.

Para realizar esta operación, llame a la función DeviceIoControl con los parámetros siguientes.

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]

Identificador del archivo que es el destino de la operación de copia del lado servidor. Para obtener este identificador, llame a la función CreateFile .

dwIoControlCode [in]

Código de control para la operación. Use IOCTL_COPYCHUNK para esta operación.

lpInBuffer

Puntero al búfer de entrada, una estructura SRV_COPYCHUNK_COPY . Para obtener más información, vea la sección Comentarios.

nInBufferSize [in]

Tamaño del búfer de entrada, en bytes.

lpOutBuffer [out]

Puntero al búfer de salida, una estructura SRV_COPYCHUNK_RESPONSE . Para obtener más información, vea la sección Comentarios.

nOutBufferSize [in]

Tamaño del búfer de salida, en bytes.

lpBytesReturned [out]

Puntero a una variable que recibe el tamaño de los datos almacenados en el búfer de salida, en bytes.

Si el búfer de salida es demasiado pequeño, se produce un error en la llamada, la función GetLastError devuelve ERROR_INSUFFICIENT_BUFFER y lpBytesReturned es cero.

Si el parámetro lpOverlapped es NULL, lpBytesReturned no puede ser NULL. Incluso cuando una operación no devuelve datos de salida y el parámetro lpOutBuffer es NULL, DeviceIoControl usa lpBytesReturned. Después de esta operación, el valor de lpBytesReturned no tiene sentido.

Si lpOverlapped no es NULL, lpBytesReturned puede ser NULL. Si lpOverlapped no es NULL y la operación devuelve datos, lpBytesReturned no tiene sentido hasta que se haya completado la operación superpuesta. Para recuperar el número de bytes devueltos, llame a la función GetOverlappedResult . Si el parámetro hDevice está asociado a un puerto de finalización de E/S, puede recuperar el número de bytes devueltos llamando a la función GetQueuedCompletionStatus .

lpOverlapped [in]

Puntero a una estructura SUPERPUESTA .

Si se abrió el parámetro hDevice sin especificar FILE_FLAG_OVERLAPPED, lpOverlapped se omite.

Si hDevice se abrió con la marca FILE_FLAG_OVERLAPPED , la operación se realiza como una operación superpuesta (asincrónica). En este caso, lpOverlapped debe apuntar a una estructura SUPERPUESTA válida que contenga un identificador para un objeto de evento. De lo contrario, se produce un error en la función de maneras impredecibles.

Para las operaciones superpuestas, DeviceIoControl devuelve inmediatamente y el objeto de evento se señala cuando se ha completado la operación. De lo contrario, la función no devuelve hasta que se haya completado la operación o hasta que se produzca un error.

Valor devuelto

Si la operación se completa correctamente, DeviceIoControl devuelve un valor distinto de cero.

Si se produce un error en la operación o está pendiente, DeviceIoControl devuelve cero. Para obtener información de error extendida, llame a GetLastError.

Comentarios

Este código de control no tiene ningún archivo de encabezado asociado. Debe definir el código de control y las estructuras de datos como se indica a continuación.

#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;

Estos miembros se pueden describir de la siguiente manera.

Miembro Descripción
SourceOffset
Desplazamiento, en bytes, desde el principio del archivo de origen hasta el fragmento que se va a copiar.
DestinationOffset
Desplazamiento, en bytes, desde el principio del archivo de destino hasta la ubicación donde se va a copiar el fragmento.
Longitud
Número de bytes de datos del fragmento que se va a copiar. Debe ser mayor que cero y menor o igual que 1 MB. Longitud * ChunkCount debe ser menor o igual que 16 MB.
SourceFile
Clave que representa el archivo de origen con los datos que se van a copiar. Esta clave se obtiene a través de FSCTL_SRV_REQUEST_RESUME_KEY.
ChunkCount
Número de fragmentos que se van a copiar. Debe ser mayor que cero y menor o igual que 256.
Reservados
Este miembro está reservado para uso del sistema; no use.
Trozo
Matriz de estructuras de SRV_COPYCHUNKChunkCount, una para cada fragmento que se va a copiar. La longitud, en bytes, de esta matriz debe ser ChunkCount * sizeof(SRV_COPYCHUNK).
ChunksWritten
Si se produjo un error en la operación con ERROR_INVALID_PARAMETER, este valor indica el número máximo de fragmentos que el servidor aceptará en una sola solicitud, que es 256. De lo contrario, este valor indica el número de fragmentos que se escribieron correctamente.
ChunkBytesWritten
Si se produjo un error en la operación con ERROR_INVALID_PARAMETER, este valor indica el número máximo de bytes que el servidor permitirá escribir en un único fragmento, que es de 1 MB. De lo contrario, este valor indica el número de bytes que se escribieron correctamente en el último fragmento que no se procesó correctamente (si se produjo una escritura parcial).
TotalBytesWritten
Si se produjo un error en la operación con ERROR_INVALID_PARAMETER, este valor indica el número máximo de bytes que el servidor copiará en una sola solicitud, que es de 16 MB. De lo contrario, este valor indica el número de bytes que se escribieron correctamente.

 

Consulte también

DeviceIoControl

FSCTL_SRV_REQUEST_RESUME_KEY