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 은 0입니다.
lpOverlapped 매개 변수가 NULL이면 lpBytesReturned은 NULL일 수 없습니다. 작업이 출력 데이터를 반환하지 않고 lpOutBuffer 매개 변수가 NULL인 경우에도 DeviceIoControl 은 lpBytesReturned을 사용합니다. 이러한 작업 후에는 lpBytesReturned의 값이 의미가 없습니다.
lpOverlapped가 NULL이 아닌 경우 lpBytesReturned은 NULL일 수 있습니다. lpOverlapped이 NULL이 아니고 작업이 데이터를 반환하는 경우 겹치는 작업이 완료될 때까지 lpBytesReturned은 의미가 없습니다. 반환된 바이트 수를 검색하려면 GetOverlappedResult 함수를 호출합니다. hDevice 매개 변수가 I/O 완료 포트와 연결된 경우 GetQueuedCompletionStatus 함수를 호출하여 반환된 바이트 수를 검색할 수 있습니다.
-
lpOverlapped [in]
-
OVERLAPPED 구조에 대한 포인터입니다.
FILE_FLAG_OVERLAPPED 지정하지 않고 hDevice 매개 변수를 연 경우 lpOverlapped는 무시됩니다.
FILE_FLAG_OVERLAPPED 플래그를 사용하여 hDevice를 연 경우 작업이 겹치는(비동기) 작업으로 수행됩니다. 이 경우 lpOverlapped는 이벤트 개체에 대한 핸들을 포함하는 유효한 OVERLAPPED 구조를 가리킵니다. 그렇지 않으면 예기치 않은 방식으로 함수가 실패합니다.
겹치는 작업의 경우 DeviceIoControl이 즉시 반환되고, 작업이 완료되면 이벤트 개체에 신호가 전송됩니다. 그렇지 않으면 작업이 완료되거나 오류가 발생할 때까지 함수가 반환되지 않습니다.
반환 값
작업이 성공적으로 완료되면 DeviceIoControl은 0이 아닌 값을 반환합니다.
작업이 실패하거나 보류 중인 경우 DeviceIoControl은 0을 반환합니다. 확장 오류 정보를 가져오려면 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 |
대상 파일의 시작부터 청크를 복사할 위치까지 오프셋(바이트)입니다. |
길이 |
복사할 청크의 데이터 바이트 수입니다. 0보다 크고 1MB보다 작거나 같아야 합니다.
길이 * ChunkCount는 16MB보다 작거나 같아야 합니다. |
SourceFile |
복사할 데이터가 있는 원본 파일을 나타내는 키입니다. 이 키는 FSCTL_SRV_REQUEST_RESUME_KEY 통해 가져옵니다. |
ChunkCount |
복사할 청크 수입니다. 0보다 크고 256보다 작거나 같아야 합니다. |
예약 |
이 멤버는 시스템 사용을 위해 예약되어 있습니다. 를 사용하지 마세요. |
청크 |
ChunkCount의 배열은 복사할 각 청크에 대해 하나씩 구조체를 SRV_COPYCHUNK. 이 배열의 길이(바이트)는 ChunkCount * sizeof(SRV_COPYCHUNK)여야 합니다. |
ChunksWritten |
작업이 ERROR_INVALID_PARAMETER 실패한 경우 이 값은 서버가 단일 요청에서 수락할 최대 청크 수(256개)를 나타냅니다. 그렇지 않으면 이 값은 성공적으로 작성된 청크 수를 나타냅니다. |
ChunkBytesWritten |
ERROR_INVALID_PARAMETER 작업에서 실패한 경우 이 값은 서버가 단일 청크(1MB)로 작성할 수 있는 최대 바이트 수를 나타냅니다. 그렇지 않으면 이 값은 성공적으로 처리되지 않은 마지막 청크에서 성공적으로 작성된 바이트 수를 나타냅니다(부분 쓰기가 발생한 경우). |
TotalBytesWritten |
작업이 ERROR_INVALID_PARAMETER 실패한 경우 이 값은 서버가 단일 요청에서 복사할 최대 바이트 수(16MB)를 나타냅니다. 그렇지 않으면 이 값은 성공적으로 작성된 바이트 수를 나타냅니다. |
추가 정보