Bagikan melalui


Menginisialisasi Objek Perangkat

Setelah IoCreateDevice kembali, memberi penelepon penunjuk ke DeviceObject yang berisi pointer ke ekstensi perangkat , driver harus menyiapkan bidang tertentu di objek perangkat untuk perangkat fisik, logis, dan/atau virtual masing-masing.

IoCreateDevice mengatur bidang StackSize dari objek perangkat yang baru dibuat menjadi satu. Pengemudi tingkat terendah dapat mengabaikan bidang ini. Ketika driver tingkat yang lebih tinggi memanggil IoAttachDeviceToDeviceStack untuk melampirkan dirinya ke driver yang lebih rendah berikutnya, rutinitas tersebut secara otomatis mengatur bidang StackSize di objek perangkat ke objek perangkat driver berikutnya yang lebih rendah ditambah satu. Namun, untuk beberapa jenis perangkat, driver tingkat yang lebih tinggi mungkin perlu mengatur bidang StackSize ke nilai yang lebih besar, seperti yang disebutkan dalam dokumentasi khusus perangkat. Mengatur ukuran tumpukan memastikan bahwa IRP yang dikirim ke driver tingkat tinggi akan berisi lokasi tumpukan I/O khusus driver, ditambah jumlah lokasi tumpukan I/O yang tepat untuk semua driver tingkat rendah dalam rangkaian.

IoCreateDevice mengatur bidang AlignmentRequirement dari objek perangkat yang baru dibuat ke ukuran garis cache data prosesor dikurangi satu, untuk memastikan buffer yang digunakan dalam I/O langsung disejajarkan dengan benar. Setelah IoCreateDevice kembali, driver perangkat fisik tingkat terendah harus melakukan hal berikut:

  1. Kurangi satu dari persyaratan perataan perangkat.

  2. Bandingkan hasil langkah 1 dengan nilai objek perangkat saat ini yang sesuai dengan persyaratan penyelarasan .

  3. Jika persyaratan perataan perangkat lebih besar dari yang diharuskan, atur AlignmentRequirement ke hasil langkah 1. Jika tidak, biarkan nilai AlignmentRequirement sebagaimana ditetapkan oleh IoCreateDevice.

Setelah driver tingkat yang lebih tinggi mengaitkan dirinya ke driver lain dengan memanggil IoGetDeviceObjectPointer, driver tingkat yang lebih tinggi harus mengatur bidang AlignmentRequirement dari objek perangkat yang baru dibuat ke tingkat objek perangkat driver yang lebih rendah berikutnya. Sebagai aturan umum, driver tingkat yang lebih tinggi tidak boleh mengubah nilai ini. Jika driver tingkat lebih tinggi memanggil IoAttachDevice atau IoAttachDeviceToDeviceStack, rutinitas tersebut secara otomatis mengatur bidang AlignmentRequirement di objek perangkat ke objek perangkat driver tingkat bawah.

IoGetDeviceObjectPointer mengembalikan pointer ke objek perangkat driver tingkat bawah dan ke objek file terkait. Hanya FSD (atau, mungkin, driver tingkat tertinggi lainnya) yang dapat menggunakan penunjuk objek file yang dikembalikan. Driver perantara yang memanggil IoGetDeviceObjectPointer harus menyimpan pointer objek file ini sehingga dapat di-dereference dengan memanggil ObDereferenceObject ketika driver dilepas.

Setelah FSD memasang volume yang berisi objek file yang mewakili objek perangkat driver yang lebih rendah, driver perantara tidak dapat menghubungkan dirinya di antara sistem file dan driver yang lebih rendah dengan memanggil IoAttachDevice atau IoAttachDeviceToDeviceStack. Selain itu, FSD dapat mengatur anggota SectorSize dari objek perangkat berdasarkan geometri perangkat keras volume dasar ketika dilakukan pemasangan. Untuk informasi selengkapnya, lihat DEVICE_OBJECT.

Driver tingkat menengah atau terendah juga mengatur bendera di Bendera objek perangkat dengan menggunakan operasi OR dengan salah satu dari DO_DIRECT_IO atau DO_BUFFERED_IO di setiap objek perangkat yang dibuatnya. Driver tingkat tertinggi dari perangkat logis atau virtual dapat menghindari pengaturan Flags untuk buffered atau direct I/O jika penulis driver memutuskan bahwa pekerjaan tambahan yang terlibat akan membuahkan hasil dalam performanya yang lebih baik. Driver perantara harus mengatur bidang Flags dari objek perangkatnya agar sesuai dengan objek perangkat driver yang lebih rendah dalam hierarki.

Menyiapkan objek perangkat dengan DO_DIRECT_IO atau DO_BUFFERED_IO di bidang 'Flags' menentukan bagaimana manajer I/O meneruskan akses ke buffer pengguna untuk semua permintaan transfer data yang kemudian dikirim ke driver.

Driver kemudian dapat mengatur nilai dependen perangkat lainnya dalam objek perangkat. Misalnya, driver non-WDM untuk perangkat media yang dapat dilepas harus ATAU Bendera anggota objek perangkat dengan DO_VERIFY_VOLUME jika mereka mendeteksi (atau mencurigai) perubahan media selama operasi I/O. (Lihat Mendukung Media yang Dapat Dihapus untuk informasi selengkapnya.) Driver perangkat yang memerlukan daya masuk harus menggabungkan anggota Flag dengan DO_POWER_INRUSH, dan driver perangkat yang tidak berada pada jalur paging sistem harus menggabungkan anggota Flag dengan DO_POWER_PAGABLE. Fungsi dan driver filter harus menghapus flag DO_DEVICE_INITIALIZING.

Setelah menginisialisasi objek perangkat, driver juga dapat menginisialisasi objek yang didefinisikan oleh Kernel dan struktur data lain yang didefinisikan oleh sistem yang penyimpanannya telah disediakan dalam ekstensi perangkat. Tepatnya ketika driver melakukan tugas-tugas ini tergantung pada perangkatnya, jenis objek, dan/atau sifat data. Secara umum, objek atau struktur data apa pun yang dapat bertahan melalui permintaan mulai dan hentikan PnP dapat diinisialisasi dalam rutinitas AddDevice. Yang memerlukan informasi sumber daya yang diberikan dengan permintaan PnP IRP_MN_START_DEVICE, atau yang mungkin memerlukan perubahan ketika perangkat dihentikan dan/atau dimulai ulang, harus diinisialisasi ketika driver menangani permintaan IRP_MN_START_DEVICE. Untuk informasi lebih lanjut tentang rutinitas AddDevice, lihat Penulisan Rutinitas AddDevice.