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 ke satu. Driver tingkat terendah dapat mengabaikan bidang ini. Ketika driver tingkat yang lebih tinggi memanggil IoAttachDeviceToDeviceStack untuk melampirkan dirinya ke driver yang lebih rendah berikutnya, rutinitas itu 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 dicatat dalam dokumentasi khusus perangkat. Mengatur ukuran tumpukan memastikan bahwa RUNP yang dikirim ke driver tingkat yang lebih tinggi akan berisi lokasi tumpukan I/O khusus driver, ditambah jumlah lokasi tumpukan I/O yang benar untuk semua driver tingkat bawah dalam rantai.

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

  1. Kurangi satu dari persyaratan penyelarasan perangkat.

  2. Bandingkan hasil langkah 1 dengan nilai saat ini dari AlignmentRequirement objek perangkat.

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

Setelah driver tingkat yang lebih tinggi merantai sendiri melalui driver lain dengan memanggil IoGetDeviceObjectPointer, driver tingkat yang lebih tinggi harus mengatur bidang AlignmentRequirement dari objek perangkat yang baru dibuat ke objek perangkat driver tingkat berikutnya. Sebagai aturan umum, driver tingkat yang lebih tinggi tidak boleh mengubah nilai ini. Jika driver tingkat yang 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 baik ke objek perangkat driver tingkat bawah maupun 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 penunjuk objek file ini sehingga dapat didereferensikan dengan memanggil ObDereferenceObject saat driver dibongkar.

Setelah FSD memasang volume yang berisi objek file yang mewakili objek perangkat driver yang lebih rendah, driver perantara tidak dapat merantai dirinya sendiri 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 yang mendasar saat pemasangan terjadi. Untuk informasi selengkapnya, lihat DEVICE_OBJECT.

Driver tingkat menengah atau terendah juga mengatur sedikit di Bendera objek perangkat dengan ORing baik dengan DO_DIRECT_IO atau dengan DO_BUFFERED_IO di setiap objek perangkat yang dibuatnya. Driver tingkat tertinggi dari perangkat logis atau virtual dapat menghindari pengaturan Bendera untuk I/O buffer atau langsung jika penulis driver memutuskan pekerjaan tambahan yang terlibat akan terbayar dalam performa driver yang lebih baik. Driver perantara harus mengatur bidang Bendera objek perangkatnya agar sesuai dengan objek perangkat driver berikutnya yang lebih rendah.

Menyiapkan bidang Bendera objek perangkat dengan DO_DIRECT_IO atau DO_BUFFERED_IO menentukan bagaimana manajer I/O meneruskan akses ke buffer pengguna di 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 anggota Bendera objek perangkat dengan DO_VERIFY_VOLUME jika mereka mendeteksi (atau mencurigai) perubahan media selama operasi I/O. (Lihat Mendukung Media yang Dapat Dilepas untuk informasi selengkapnya.) Driver perangkat yang memerlukan daya inrush harus ATAU anggota Bendera dengan DO_POWER_INRUSH, dan driver perangkat yang tidak berada di jalur halaman sistem harus ATAU anggota Bendera dengan DO_POWER_PAGABLE. Driver fungsi dan filter harus menghapus bendera DO_DEVICE_INITIALIZING.

Setelah menginisialisasi objek perangkat, driver juga dapat menginisialisasi objek yang ditentukan Kernel dan struktur data lain yang ditentukan sistem yang telah menyediakan penyimpanan di 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 IRP_MN_START_DEVICE PnP, atau yang mungkin memerlukan perubahan saat perangkat dihentikan dan/atau dimulai ulang, harus diinisialisasi saat driver menangani permintaan IRP_MN_START_DEVICE . Untuk informasi selengkapnya tentang rutinitas AddDevice , lihat Menulis AddDevice Routine.