Bagikan melalui


IOCTL_COPYCHUNK kode kontrol

Kode kontrol IOCTL_COPYCHUNK memulai salinan sisi server dari berbagai data, juga disebut gugus.

Untuk melakukan operasi ini, panggil fungsi DeviceIoControl dengan parameter berikut.

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

Parameter

hDevice [in]

Handel ke file yang merupakan target operasi penyalinan sisi server. Untuk mendapatkan handel ini, panggil fungsi CreateFile .

dwIoControlCode [in]

Kode kontrol untuk operasi. Gunakan IOCTL_COPYCHUNK untuk operasi ini.

lpInBuffer

Penunjuk ke buffer input, struktur SRV_COPYCHUNK_COPY . Untuk informasi selengkapnya, lihat bagian Keterangan.

nInBufferSize [in]

Ukuran buffer input, dalam byte.

lpOutBuffer [out]

Penunjuk ke buffer output, struktur SRV_COPYCHUNK_RESPONSE . Untuk informasi selengkapnya, lihat bagian Keterangan.

nOutBufferSize [in]

Ukuran buffer output, dalam byte.

lpBytesReturned [out]

Penunjuk ke variabel yang menerima ukuran data yang disimpan dalam buffer output, dalam byte.

Jika buffer output terlalu kecil, panggilan gagal, fungsi GetLastError mengembalikan ERROR_INSUFFICIENT_BUFFER, dan lpBytesReturned adalah nol.

Jika parameter lpOverlappedADALAH NULL, lpBytesReturned tidak boleh NULL. Bahkan ketika operasi tidak mengembalikan data output dan parameter lpOutBuffer adalah NULL, DeviceIoControl menggunakan lpBytesReturned. Setelah operasi seperti itu, nilai lpBytesReturned tidak ada artinya.

Jika lpOverlapped bukan NULL, lpBytesReturned bisa NULL. Jika lpOverlapped bukan NULL dan operasi mengembalikan data, lpBytesReturned tidak berarti sampai operasi yang tumpang tindih selesai. Untuk mengambil jumlah byte yang dikembalikan, panggil fungsi GetOverlappedResult . Jika parameter hDevice dikaitkan dengan port penyelesaian I/O, Anda dapat mengambil jumlah byte yang dikembalikan dengan memanggil fungsi GetQueuedCompletionStatus .

lpOverlapped [in]

Penunjuk ke struktur YANG TUMPANG TINDIH .

Jika parameter hDevice dibuka tanpa menentukan FILE_FLAG_OVERLAPPED, lpOverlapped diabaikan.

Jika hDevice dibuka dengan bendera FILE_FLAG_OVERLAPPED , operasi dilakukan sebagai operasi yang tumpang tindih (asinkron). Dalam hal ini, lpOverlapped harus menunjuk ke struktur TUMPANG TINDIH yang valid yang berisi handel ke objek peristiwa. Jika tidak, fungsi gagal dengan cara yang tidak dapat diprediksi.

Untuk operasi yang tumpang tindih, DeviceIoControl segera kembali, dan objek peristiwa disinyalir ketika operasi telah selesai. Jika tidak, fungsi tidak kembali sampai operasi selesai atau sampai terjadi kesalahan.

Mengembalikan nilai

Jika operasi berhasil diselesaikan, DeviceIoControl mengembalikan nilai bukan nol.

Jika operasi gagal atau tertunda, DeviceIoControl mengembalikan nol. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.

Keterangan

Kode kontrol ini tidak memiliki file header terkait. Anda harus menentukan kode kontrol dan struktur data sebagai berikut.

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

Anggota ini dapat digambarkan sebagai berikut.

Anggota Deskripsi
SourceOffset
Offset, dalam byte, dari awal file sumber ke gugus yang akan disalin.
DestinationOffset
Offset, dalam byte, dari awal file target ke lokasi tempat gugus akan disalin.
Panjang
Jumlah byte data dalam gugus yang akan disalin. Harus lebih besar dari nol dan kurang dari atau sama dengan 1 MB. Panjang * ChunkCount harus kurang dari atau sama dengan 16 MB.
SourceFile
Kunci yang mewakili file sumber dengan data yang akan disalin. Kunci ini diperoleh melalui FSCTL_SRV_REQUEST_RESUME_KEY.
ChunkCount
Jumlah potongan yang akan disalin. Harus lebih besar dari nol dan kurang dari atau sama dengan 256.
Dipesan
Anggota ini disediakan untuk penggunaan sistem; jangan gunakan.
Potongan
Array chunkCountSRV_COPYCHUNK struktur, satu untuk setiap gugus yang akan disalin. Panjangnya, dalam byte, dari array ini harus ChunkCount * sizeof(SRV_COPYCHUNK).
Gugus Yang Ditulis
Jika operasi gagal dengan ERROR_INVALID_PARAMETER, nilai ini menunjukkan jumlah maksimum gugus yang akan diterima server dalam satu permintaan, yaitu 256. Jika tidak, nilai ini menunjukkan jumlah gugus yang berhasil ditulis.
ChunkBytesWritten
Jika operasi gagal dengan ERROR_INVALID_PARAMETER, nilai ini menunjukkan jumlah maksimum byte yang akan diizinkan untuk ditulis dalam satu gugus, yaitu 1 MB. Jika tidak, nilai ini menunjukkan jumlah byte yang berhasil ditulis dalam gugus terakhir yang tidak berhasil diproses (jika penulisan parsial terjadi).
TotalBytesWritten
Jika operasi gagal dengan ERROR_INVALID_PARAMETER, nilai ini menunjukkan jumlah maksimum byte yang akan disalin server dalam satu permintaan, yaitu 16 MB. Jika tidak, nilai ini menunjukkan jumlah byte yang berhasil ditulis.

 

Lihat juga

DeviceIoControl

FSCTL_SRV_REQUEST_RESUME_KEY