Поделиться через


код элемента управления IOCTL_COPYCHUNK

Управляющий код IOCTL_COPYCHUNK инициирует копию диапазона данных на стороне сервера, также называемую блоком.

Для выполнения этой операции вызовите функцию DeviceIoControl со следующими параметрами.

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]

Дескриптор файла, который является целевым объектом операции копирования на стороне сервера. Чтобы получить этот дескриптор, вызовите функцию CreateFile .

dwIoControlCode [in]

Код элемента управления для операции. Используйте IOCTL_COPYCHUNK для этой операции.

lpInBuffer

Указатель на входной буфер, SRV_COPYCHUNK_COPY структуру. Дополнительные сведения см. в разделе «Примечания».

nInBufferSize [in]

Размер входного буфера в байтах.

lpOutBuffer [out]

Указатель на выходной буфер, SRV_COPYCHUNK_RESPONSE структуру. Дополнительные сведения см. в разделе «Примечания».

nOutBufferSize [in]

Размер выходного буфера в байтах.

lpBytesReturned [out]

Указатель на переменную, которая получает размер данных, хранящихся в выходном буфере, в байтах.

Если выходной буфер слишком мал, вызов завершается ошибкой, функция GetLastError возвращает ERROR_INSUFFICIENT_BUFFER, а значение lpBytesReturned равно нулю.

Если параметр lpOverlapped имеет значение NULL, lpBytesReturned не может иметь значение NULL. Даже если операция не возвращает выходных данных и параметр lpOutBuffer имеет значение NULL, DeviceIoControl использует lpBytesReturned. После такой операции значение lpBytesReturned не имеет смысла.

Если значение lpOverlapped не равно NULL, lpBytesReturned может иметь значение NULL. Если значение lpOverlapped не равно NULL и операция возвращает данные, lpBytesReturned не имеет смысла до завершения перекрывающейся операции. Чтобы получить количество возвращенных байтов, вызовите функцию GetOverlappedResult . Если параметр hDevice связан с портом завершения ввода-вывода, можно получить количество возвращаемых байтов, вызвав функцию GetQueuedCompletionStatus .

lpOverlapped [in]

Указатель на структуру OVERLAPPED .

Если параметр hDevice был открыт без указания FILE_FLAG_OVERLAPPED, lpOverlapped игнорируется.

Если hDevice был открыт с флагом FILE_FLAG_OVERLAPPED , операция выполняется как перекрываемая (асинхронная) операция. В этом случае lpOverlapped должен указывать на допустимую структуру OVERLAPPED , содержащую дескриптор объекта события. В противном случае функция завершается сбоем непредсказуемым образом.

Для перекрывающихся операций DeviceIoControl возвращает немедленно, и объект события получает сигнал о завершении операции. В противном случае функция не возвращается до завершения операции или до возникновения ошибки.

Возвращаемое значение

Если операция завершается успешно, DeviceIoControl возвращает ненулевое значение.

Если операция завершается сбоем или находится в состоянии ожидания, DeviceIoControl возвращает ноль. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Этот код элемента управления не имеет связанного файла заголовка. Код элемента управления и структуры данных необходимо определить следующим образом.

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

Эти элементы можно описать следующим образом.

Член Описание
SourceOffset
Смещение в байтах от начала исходного файла до копируемых фрагментов.
DestinationOffset
Смещение (в байтах) от начала целевого файла до места копирования блока.
Длина
Количество байтов данных в блоке для копирования. Значение должно быть больше нуля и меньше или равно 1 МБ. Длина * Значение Параметра ChunkCount должно быть меньше или равно 16 МБ.
SourceFile
Ключ, представляющий исходный файл с копируемыми данными. Этот ключ получается с помощью FSCTL_SRV_REQUEST_RESUME_KEY.
ChunkCount
Количество копируемых фрагментов. Значение должно быть больше нуля и меньше или равно 256.
Защищены
Этот элемент зарезервирован для использования системой; не использовать.
Блока
Массив chunkCountSRV_COPYCHUNK структур, по одной для каждого копируемых блоков. Длина этого массива в байтах должна иметь значение ChunkCount * sizeof(SRV_COPYCHUNK).
ФрагментыWritten
Если операция завершилась сбоем с ERROR_INVALID_PARAMETER, это значение указывает максимальное количество блоков, которое сервер будет принимать в одном запросе, то есть 256. В противном случае это значение указывает количество блоков, которые были успешно записаны.
ChunkBytesWritten
Если операция завершилась сбоем с ERROR_INVALID_PARAMETER, это значение указывает максимальное число байтов, которое сервер будет записывать в один блок, который составляет 1 МБ. В противном случае это значение указывает количество байтов, которые были успешно записаны в последний блок, который не был успешно обработан (если произошла частичная запись).
TotalBytesWritten
Если операция завершилась сбоем с ERROR_INVALID_PARAMETER, это значение указывает максимальное количество байтов, которое сервер будет копировать в одном запросе, то есть 16 МБ. В противном случае это значение указывает количество байтов, которые были успешно записаны.

 

См. также раздел

DeviceIoControl

FSCTL_SRV_REQUEST_RESUME_KEY