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_BUFFERlpBytesReturned 为零。

如果 lpOverlapped 参数为 NULL则 lpBytesReturned 不能为 NULL。 即使操作不返回任何输出数据, lpOutBuffer 参数为 NULLDeviceIoControl 也使用 lpBytesReturned。 执行此类操作后, lpBytesReturned 的值毫无意义。

如果 lpOverlapped 不是 NULL则 lpBytesReturned 可以为 NULL。 如果 lpOverlapped 不是 NULL 且操作返回数据,则在重叠操作完成之前, lpBytesReturned 毫无意义。 若要检索返回的字节数,请调用 GetOverlappedResult 函数。 如果 hDevice 参数与 I/O 完成端口相关联,可以通过调用 GetQueuedCompletionStatus 函数来检索返回的字节数。

lpOverlapped [in]

指向 重叠 结构的指针。

如果在未指定FILE_FLAG_OVERLAPPED的情况下打开 hDevice 参数,则忽略 lpOverlapped

如果使用 FILE_FLAG_OVERLAPPED 标志打开 hDevice,则操作将作为重叠 (异步) 操作执行。 在这种情况下, 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 MB。 长度 * ChunkCount 必须小于或等于 16 MB。
SourceFile
一个键,表示要复制数据的源文件。 此密钥是通过 FSCTL_SRV_REQUEST_RESUME_KEY获取的。
ChunkCount
要复制的区块数。 必须大于零且小于或等于 256。
保留
此成员保留供系统使用;不使用。

一个由 ChunkCountSRV_COPYCHUNK 结构构成的数组,每个要复制的区块各有一个。 此数组的长度(以字节为单位)必须为 ChunkCount * sizeof (SRV_COPYCHUNK)
ChunksWritten
如果操作失败, ERROR_INVALID_PARAMETER,此值指示服务器在单个请求中接受的最大区块数,即 256。 否则,此值指示已成功写入的区块数。
ChunkBytesWritten
如果操作失败, ERROR_INVALID_PARAMETER,此值指示服务器允许以单个区块(即 1 MB)写入的最大字节数。 否则,此值指示在发生部分写入) 时未成功 (处理的最后一个区块中成功写入的字节数。
TotalBytesWritten
如果操作失败, ERROR_INVALID_PARAMETER,则此值指示服务器在单个请求中复制的最大字节数,即 16 MB。 否则,此值指示已成功写入的字节数。

 

另请参阅

DeviceIoControl

FSCTL_SRV_REQUEST_RESUME_KEY