Tanggung Jawab Opsional DriverEntry
Tergantung pada posisi driver tertentu dalam rantai driver berlapis, sifat perangkat yang mendasar, dan desain driver, rutinitas DriverEntry juga dapat bertanggung jawab atas hal-hal berikut:
Memanggil IoAllocateDriverObjectExtension untuk membuat dan menginisialisasi ekstensi objek driver, jika driver memerlukan penyimpanan untuk data secara luas driver. Ekstensi objek driver adalah struktur data khusus driver. Misalnya, driver mungkin menggunakan ekstensi objek drivernya untuk menyimpan jalur registri atau informasi global lainnya.
Memanggil PsCreateSystemThread untuk membuat utas pekerja eksekutif, jika driver adalah driver tingkat tertinggi (seperti driver sistem file) yang menggunakan utas tersebut. Dalam hal ini, driver juga harus memiliki rutinitas panggilan balik jenis WORKER_THREAD_ROUTINE, yang mengambil parameter PVOID input tunggal.
Mendaftarkan Reinitialize rutinitas. (Lihat Menulis Rutinitas Menginisialisasi Ulang.)
Menangani persyaratan inisialisasi khusus kelas yang berbeda dari yang dibahas di sini, seperti yang mungkin dimiliki miniport atau driver miniclass khusus perangkat yang bekerja bersama dengan driver port atau kelas. Lihat dokumentasi spesifik jenis perangkat di Windows Driver Kit (WDK) untuk detailnya.
Menyediakan Penyimpanan untuk Sumber Daya Sistem
Objek per perangkat harus dialokasikan dalam rutinitas AddDevice atau dalam rutinitas Pengiriman yang menangani permintaan IRP_MN_START_DEVICE PnP, bukan di DriverEntry.
Namun, driver mungkin perlu mengalokasikan memori ruang sistem tambahan untuk penggunaan di seluruh driver lainnya. Jika demikian, rutinitas DriverEntry dapat memanggil satu (atau lebih) rutinitas berikut:
IoAllocateDriverObjectExtension, untuk membuat area konteks yang terkait dengan objek driver
ExAllocatePoolWithTag untuk memori ruang sistem yang di-paged atau tidak di-halaman
MmAllocateNonCachedMemory atau MmAllocateContiguousMemory untuk memori ruang sistem yang tidak disejajarkan cache (digunakan untuk buffer I/O)
Setiap rutinitas DriverEntry dijalankan dalam konteks utas sistem di IRQL = PASSIVE_LEVEL. Oleh karena itu, memori apa pun yang dialokasikan dengan ExAllocatePoolWithTag untuk digunakan secara eksklusif selama inisialisasi dapat berasal dari kumpulan halaman, selama driver tidak mengontrol perangkat yang menyimpan file halaman sistem. Memori yang dialokasikan harus dirilis dengan ExFreePool sebelum DriverEntry mengembalikan kontrol. Namun, driver yang mengatur rutinitas Reinitialize dapat meneruskan pointer ke memori ini ketika memanggil IoRegisterDriverReinitialization, sehingga membuat driver Menginisialisasi ulang rutinitas yang bertanggung jawab untuk membebaskan alokasi memori.
Mengklaim Sumber Daya Perangkat Keras
Driver non-PnP yang lebih lama mengklaim sumber daya dari registri. Driver PnP, di sisi lain, tidak mengklaim sumber daya perangkat dari atau langsung menulis persyaratan sumber daya ke registri. Sebaliknya, driver ini melaporkan persyaratan sebagai respons terhadap runtime integrasi PnP tertentu, sebagai bagian dari proses enumerasi manajer PnP. Driver PnP menerima sumber daya yang dialokasikan dalam permintaan IRP_MN_START_DEVICE PnP.
Driver yang tidak berinteraksi langsung dengan manajer PnP, seperti driver miniport tertentu, mungkin memiliki persyaratan pelaporan yang berbeda yang diberlakukan oleh driver kelas atau port yang berinteraksi dengan manajer PnP. Persyaratan tersebut khusus untuk kelas perangkat. Untuk detail khusus perangkat dan khusus kelas, lihat dokumentasi untuk kelas perangkat yang relevan di Windows Driver Kit (WDK).
Menggunakan Registri
Rutinitas DriverEntry mungkin menggunakan registri untuk mendapatkan beberapa informasi yang diperlukan untuk menginisialisasi driver, atau mungkin mengatur informasi dalam registri untuk driver lain atau subsistem yang dilindungi untuk digunakan. Sifat informasi tergantung pada jenis perangkat. Driver dapat mengakses registri menggunakan rutinitas ZwXxx dan RtlXxx . Parameter RegistryPath rutin DriverEntry menunjuk ke string Unicode yang dihitung yang menentukan jalur ke kunci registri driver, \Registry\Machine\System\CurrentControlSet\Services\*DriverName. Rutinitas harus menyimpan salinan string, bukan pointer itu sendiri, karena pointer tidak lagi valid setelah *DriverEntry kembali.