Melakukan manajemen himpunan data driver penyimpanan
Dimulai dengan Windows 7, driver dapat melakukan tindakan manajemen pada himpunan data perangkat. Daftar tindakan manajemen himpunan data (DSM) yang dapat dilakukan pada perangkat penyimpanan ditentukan oleh Microsoft.
Menggunakan IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
Konstanta DEVICE_DSM_ACTION menentukan tindakan. Konstanta ini diteruskan dalam anggota Tindakan dari struktur DEVICE_DSM_INPUT yang terkandung dalam buffer sistem permintaan IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES . Jika tindakan memerlukan parameter tambahan, blok parameter akan segera mengikuti struktur DEVICE_DSM_INPUT, dan ParameterBlockOffset akan menentukan offset dari awal struktur DEVICE_DSM_INPUT tempat blok parameter dimulai. Rentang himpunan data, jika ada, akan segera mengikuti blok parameter, dan DataSetRangesOffset akan menentukan offset dari awal struktur DEVICE_DSM_INPUT di mana rentang dimulai. Struktur buffer sistem diperlihatkan dalam diagram berikut.
Jika tindakan manajemen akan mengembalikan output, penunjuk ke struktur DEVICE_DSM_OUTPUT diteruskan di OutputBuffer IOCTL. Jika tindakan akan mengembalikan output khusus tindakan tambahan, blok output akan segera mengikuti struktur DEVICE_DSM_OUTPUT, dan OutputBlockOffset akan menentukan offset dari awal struktur DEVICE_DSM_OUTPUT di mana blok parameter dimulai. Struktur buffer output diperlihatkan dalam diagram berikut.
Alur proses tindakan DSM
Alur proses tindakan DSM dijelaskan di bawah ini, di mana Pengirim adalah pemohon tindakan dan Handler memproses tindakan yang diminta. Perhatikan bahwa mungkin ada lebih dari satu Handler di tumpukan.
Pengirim menginisialisasi DSM dan mengirimkannya ke Handler pertama di tumpukan dengan melakukan hal berikut:
- Alokasikan dan inisialisasi struktur DEVICE_DSM_DEFINITION dengan definisi yang terkait dengan tindakan.
- Panggil DeviceDsmGetInputLength untuk menentukan ukuran yang diperlukan untuk buffer input tindakan, lalu alokasikan memori untuk buffer ini.
- Panggil DeviceDsmInitializeInput untuk menginisialisasi struktur DSM_DEVICE_INPUT dan, jika tindakan memiliki parameter, blok parameter. Format blok parameter tergantung pada tindakan. Lihat Deskripsi DEVICE_DSM_ACTION untuk detail selengkapnya.
- Jika tindakan memiliki rentang, panggil DeviceDsmAddDataSetRange untuk setiap rentang untuk menambahkan struktur DEVICE_DSM_RANGE ke buffer input.
- Jika DSM memiliki output, panggil DeviceDsmGetOutputLength untuk menentukan ukuran yang diperlukan untuk buffer output tindakan, lalu alokasikan memori untuk buffer ini.
- Kirim permintaan IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES , meneruskan data input yang diinisialisasi dalam buffer sistem IOCTL, bersama dengan buffer output yang dialokasikan, jika ada.
Handler menangani permintaan DSM IOCTL dengan salah satu dari tiga cara:
- Tangani permintaan dan kembalikan dengan output, jika ada.
- Tangani permintaan dan teruskan ke driver bawah berikutnya di tumpukan.
- Teruskan permintaan ke driver bawah berikutnya di tumpukan tanpa menangani DSM.
Catatan
Terlepas dari apakah driver menangani DSM, driver dapat meneruskan permintaan dengan aman hanya jika bit DEVICE_DSM_ACTION yang paling signifikan (DeviceDsmActionFlag_NonDestructive) diatur. Jika DeviceDsmActionFlag_NonDestructivetidak diatur, driver harus kembali dengan kesalahan.
Jika Handler menangani DSM, handler melakukan langkah-langkah berikut:
- Validasi input dengan memanggil DeviceDsmValidateInput.
- Jika input valid, Handler mengekstrak input untuk mendapatkan tindakan. Jika tindakan memiliki blok parameter, Handler memanggil DeviceDsmParameterBlock untuk mendapatkan blok parameter. Jika tindakan memiliki data rentang, Handler memanggil DeviceDsmDataSetRanges untuk mendapatkan penunjuk ke blok rentang himpunan data, lalu melakukan pemrosesan normal pada blok. Blok ini terletak di DataSetRangesOffset dan terdiri dari satu atau beberapa entri berdampingan yang diformat sebagai struktur DEVICE_DSM_RANGE . Panjang, dalam byte, dari rentang himpunan data diatur dalam anggota dataSetRangesLengthdari DEVICE_DSM_INPUT.
- Jika tindakan memerlukan output, Handler memanggil DeviceDsmValidateOutputLength untuk memvalidasi buffer output yang disediakan pengirim. Jika valid, handler menginisialisasi bagian DEVICE_DSM_OUTPUT dari buffer output dengan memanggil DeviceDsmInitializeOutput, dan mengisi blok output dengan output khusus tindakan, jika ada. Handler kemudian menyelesaikan IOCTL dan mengembalikan atau meneruskan IOCTL ke driver berikutnya di tumpukan.
Setelah DSM ditangani dan dikembalikan ke Pengirim, Pengirim memvalidasi output, jika ada, dengan memanggil DeviceDsmValidateOutput. Jika output valid, Pengirim mengekstrak blok output, jika ada, dengan memanggil DeviceDsmOutputBlock.
Untuk detail tentang setiap tindakan DSM tertentu, lihat Deskripsi Tindakan DSM Perangkat.