Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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 Lebih Rendah Selesai untuk informasi terperinci tentang menggunakan event kernel dan rutin IoCompletion untuk menunda pemrosesan IRP.
Ketika rutinitas DispatchPnP-nya mendapatkan kembali kontrol setelah semua driver yang lebih rendah selesai dengan IRP, driver fungsi melakukan tugas-tugasnya untuk memulai perangkat. Pengandar fungsi memulai perangkat dengan prosedur berikut ini:
Jika driver yang lebih rendah gagal IRP (IoCallDriver mengembalikan kesalahan), jangan lanjutkan pemrosesan IRP. Lakukan pembersihan dan pengembalian yang diperlukan dari rutinitas DispatchPnP (buka langkah terakhir dalam daftar ini).
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 pemetaan ruang I/O, menginisialisasi register perangkat keras, mengatur perangkat dalam status daya D0, dan menghubungkan interupsi dengan IoConnectInterrupt. Jika driver merestart perangkat setelah permintaan IRP_MN_STOP_DEVICE, mungkin perlu memulihkan status perangkat.
Perangkat harus dinyalakan sebelum ada driver yang 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.
Mulai IRP dalam antrian penahanan IRP.
Kosongkan bendera HOLD_NEW_REQUESTS yang ditentukan driver dan mulai RUN dalam antrean penahanan IRP. Driver harus melakukan ini saat memulai perangkat untuk pertama kalinya dan saat memulai ulang perangkat setelah kueri berhenti atau menghentikan IRP. Lihat Menahan IRP yang Masuk Saat Perangkat Dijeda untuk informasi selengkapnya.
[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 menolak permintaan pembuatan yang masuk sebelum semua driver dari perangkat menyelesaikan inisiasi IRP.
Selesaikan IRP.
Rutinitas IoCompletion driver fungsi mengembalikan STATUS_MORE_PROCESSING_REQUIRED, seperti yang dijelaskan dalam Menunda Pemrosesan IRP PnP Hingga Driver 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 oleh manajer PnP kepada perangkat. Driver harus menyimpan salinan setiap daftar sumber daya dalam ekstensi perangkat sebagai bantuan penelusuran kesalahan.
Daftar sumber daya adalah struktur CM_RESOURCE_LIST yang dipasangkan, di mana setiap elemen dari 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:
Salin IrpSp->Parameters.StartDevice.AllocatedResources ke ekstensi perangkat.
Salin IrpSp->Parameters.StartDevice.AllocatedResourcesTranslated ke ekstensi perangkat.
Dalam sebuah perulangan, teliti setiap elemen deskriptor di AllocatedResourcesTranslated. Jika jenis sumber daya deskriptor CmResourceTypeMemory, panggil MmMapIoSpace, dengan melewatkan alamat fisik dan panjang sumber daya yang telah 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 permintaan IRP_MN_START_DEVICE terpaksa untuk gagal.
Lihat Memetakan Alamat Bus-Relative ke Alamat Virtual untuk informasi selengkapnya.