Memulai Perangkat dalam Driver Fungsi

Driver fungsi menetapkan rutinitas IoCompletion , meneruskan permintaan IRP_MN_START_DEVICE ke tumpukan perangkat, dan menunda operasi mulainya sampai semua driver yang lebih rendah selesai dengan IRP. Lihat Menunda Pemrosesan IRP PnP Hingga Driver Yang Lebih Rendah Selesai untuk informasi terperinci tentang menggunakan peristiwa kernel dan rutinitas IoCompletion untuk menunda pemrosesan IRP.

Ketika rutin DispatchPnP-nya mendapatkan kembali kontrol setelah semua driver yang lebih rendah selesai dengan IRP, driver fungsi melakukan tugasnya untuk memulai perangkat. Driver fungsi memulai perangkat dengan prosedur seperti berikut:

  1. Jika driver yang lebih rendah gagal IRP (IoCallDriver mengembalikan kesalahan), jangan terus memproses IRP. Lakukan pembersihan dan pengembalian yang diperlukan dari rutinitas DispatchPnP (buka langkah terakhir dalam daftar ini).

  2. Jika driver yang lebih rendah berhasil memproses IRP, mulai perangkat.

    Langkah-langkah tepat untuk memulai perangkat bervariasi dari perangkat ke perangkat. Langkah-langkah tersebut mungkin termasuk memetakan ruang I/O, menginisialisasi register perangkat keras, mengatur perangkat dalam status daya D0, dan menghubungkan interupsi dengan IoConnectInterrupt. Jika driver memulai ulang perangkat setelah permintaan IRP_MN_STOP_DEVICE , driver mungkin memiliki status perangkat untuk dipulihkan.

    Perangkat harus dinyalakan sebelum driver dapat mengaksesnya. Lihat Menyalakan Perangkat untuk informasi selengkapnya.

    Jika perangkat harus diaktifkan untuk bangun, pemilik kebijakan dayanya (biasanya driver fungsi) harus mengirim IRP tunggu/bangun setelah menyalakan perangkat dan sebelum menyelesaikan permintaan IRP_MN_START_DEVICE . Untuk detailnya, lihat Mengirim IRP Tunggu/Bangun.

  3. Mulai IRP dalam antrean penahanan IRP.

    Kosongkan bendera HOLD_NEW_REQUESTS yang ditentukan driver dan mulai IRP dalam antrean penahanan IRP. Driver harus melakukan ini saat memulai perangkat untuk pertama kalinya dan saat memulai ulang perangkat setelah penghentian kueri atau menghentikan IRP. Lihat Menyimpan IRP Masuk Saat perangkat Dijeda untuk informasi selengkapnya.

  4. [Opsional] Aktifkan antarmuka untuk perangkat dengan memanggil IoSetDeviceInterfaceState.

    Aktifkan antarmuka, jika ada, yang sebelumnya didaftarkan driver dalam rutinitas AddDevice-nya (atau dalam INF atau oleh komponen lain seperti penginstal bersama).

    Pada Windows 2000 dan versi Windows yang lebih baru, manajer PnP tidak mengirim pemberitahuan kedatangan antarmuka perangkat sampai IRP_MN_START_DEVICE IRP selesai, menunjukkan bahwa semua driver untuk perangkat telah menyelesaikan operasi mulai mereka. Manajer PnP juga gagal setiap permintaan pembuatan yang tiba sebelum semua driver untuk perangkat menyelesaikan IRP mulai.

  5. Selesaikan IRP.

    Rutinitas IoCompletion driver fungsi mengembalikan STATUS_MORE_PROCESSING_REQUIRED, seperti yang dijelaskan dalam Menunda Pemrosesan IRP PnP Hingga Driver Yang Lebih Rendah Selesai, sehingga rutinitas DispatchPnP driver fungsi harus memanggil IoCompleteRequest untuk melanjutkan pemrosesan penyelesaian I/O.

    Jika operasi mulai driver fungsi berhasil, driver mengatur Irp-IoStatus.Status> ke STATUS_SUCCESS, memanggil IoCompleteRequest dengan peningkatan prioritas IO_NO_INCREMENT, dan mengembalikan STATUS_SUCCESS dari rutinitas DispatchPnP-nya.

    Jika driver fungsi mengalami kesalahan selama operasi mulai, driver menetapkan status kesalahan di IRP, memanggil IoCompleteRequest dengan IO_NO_INCREMENT, dan mengembalikan kesalahan dari rutinitas DispatchPnP-nya .

    Jika driver yang lebih rendah gagal IRP (IoCallDriver mengembalikan kesalahan), driver fungsi memanggil IoCompleteRequest dengan IO_NO_INCREMENT dan mengembalikan kesalahan IoCallDriver dari rutinitas DispatchPnP-nya . Driver fungsi tidak mengatur Irp-IoStatus.Status> dalam hal ini karena status telah ditetapkan oleh driver yang lebih rendah yang gagal IRP.

Ketika driver fungsi menerima permintaan IRP_MN_START_DEVICE, driver fungsi harus memeriksa struktur di IrpSp-Parameters.StartDevice.AllocatedResources dan IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated, yang masing-masing>> menjelaskan sumber daya mentah dan diterjemahkan, yang telah ditetapkan manajer PnP ke perangkat. Driver harus menyimpan salinan setiap daftar sumber daya di ekstensi perangkat sebagai bantuan penelusuran kesalahan.

Daftar sumber daya dipasangkan CM_RESOURCE_LIST struktur, di mana setiap elemen daftar mentah sesuai dengan elemen yang sama dari daftar yang diterjemahkan. Misalnya, jika AllocatedResources.List[0] menjelaskan rentang port I/O mentah, maka AllocatedResourcesTranslated.List[0] menjelaskan rentang yang sama setelah terjemahan. Setiap sumber daya yang diterjemahkan mencakup alamat fisik dan jenis sumber daya.

Jika driver diberi sumber daya memori yang diterjemahkan (CmResourceTypeMemory), driver harus memanggil MmMapIoSpace untuk memetakan alamat fisik ke alamat virtual tempat ia dapat mengakses pendaftaran perangkat. Agar driver beroperasi secara independen platform, driver harus memeriksa setiap sumber daya yang dikembalikan dan diterjemahkan dan memetakannya, jika perlu.

Driver fungsi harus melakukan hal berikut sebagai respons terhadap IRP_MN_START_DEVICE untuk memastikan akses ke semua sumber daya perangkat:

  1. Salin IrpSp-Parameters.StartDevice.AllocatedResources> ke ekstensi perangkat.

  2. Salin IrpSp-Parameters.StartDevice.AllocatedResourcesTranslated> ke ekstensi perangkat.

  3. Dalam perulangan, periksa setiap elemen deskriptor di AllocatedResourcesTranslated. Jika jenis sumber daya deskriptor adalah CmResourceTypeMemory, panggil MmMapIoSpace, melewati alamat fisik dan panjang sumber daya yang diterjemahkan.

Ketika driver menerima permintaan IRP_MN_STOP_DEVICE, IRP_MN_REMOVE_DEVICE, atau IRP_MN_SURPRISE_REMOVAL , driver harus merilis pemetaan dengan memanggil MmUnmapIoSpace dalam perulangan serupa. Driver juga harus memanggil MmUnmapIoSpace jika harus gagal permintaan IRP_MN_START_DEVICE .

Lihat Memetakan alamat Bus-Relative ke Alamat Virtual untuk informasi selengkapnya.