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 参数与 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。 否则,此值指示已成功写入的字节数。 |
另请参阅