Mengalokasikan dan Membangun URL
Driver klien USB dapat menggunakan rutinitas driver Windows Driver Model (WDM) untuk mengalokasikan dan memformat URB sebelum mengirim permintaan ke tumpukan driver USB yang disediakan Microsoft.
Driver klien menggunakan URB untuk mengemas semua informasi yang diperlukan oleh driver yang lebih rendah di tumpukan driver USB untuk memproses permintaan. Dalam sistem operasi Windows, URB dijelaskan dalam struktur URB .
Microsoft menyediakan pustaka Rutinitas untuk Driver Klien USB. Dengan menggunakan rutinitas tersebut, driver klien USB dapat membangun permintaan URB untuk operasi tertentu dan meneruskannya ke tumpukan USB. Jika mau, Anda dapat merancang driver klien untuk memanggil rutinitas pustaka untuk operasi yang didukung daripada membangun permintaan URB Anda sendiri.
Alokasi URB di Windows 7 dan Yang Lebih Lama
Untuk mengirim permintaan USB dengan menggunakan rutinitas yang disertakan dalam Windows Driver Kit (WDK) untuk Windows 7 dan versi Windows yang lebih lama, driver klien biasanya mengalokasikan dan mengisi struktur URB , mengaitkan struktur URB dengan IRP baru, dan mengirim IRP ke tumpukan driver USB.
Untuk jenis permintaan tertentu, Microsoft menyediakan rutinitas pembantu (diekspor oleh Usbd.sys) yang mengalokasikan dan memformat struktur URB . Misalnya, USBD_CreateConfigurationRequestEx rutin mengalokasikan memori untuk struktur URB, memformat URB untuk permintaan konfigurasi tertentu, dan mengembalikan alamat struktur URB ke driver klien. Namun, rutinitas pembantu tidak dapat digunakan untuk semua jenis permintaan.
Microsoft juga menyediakan makro yang memformat URL untuk beberapa jenis permintaan. Untuk makro tersebut, driver klien harus mengalokasikan struktur URB dengan memanggil ExAllocatePoolWithTag atau mengalokasikan struktur pada tumpukan. Misalnya, setelah driver klien mengalokasikan URB, driver dapat memanggil UsbBuildSelectConfigurationRequest untuk memformat URB untuk permintaan konfigurasi tertentu atau untuk menghapus konfigurasi.
Untuk permintaan lain, driver klien harus mengalokasikan dan memformat URB secara manual dengan mengatur berbagai anggota struktur URB , tergantung pada jenis permintaan.
Ketika permintaan USB selesai, driver klien harus merilis struktur URB . Jika URB dialokasikan pada tumpukan, URB dirilis ketika keluar dari cakupan. Jika URB dialokasikan di kumpulan non-halaman, driver klien harus memanggil ExFreePool untuk merilis URB.
Alokasi URB di Windows 8
WDK untuk Windows 8 menyediakan pustaka statis baru, Usbdex.lib, yang mengekspor rutinitas untuk mengalokasikan, memformat, dan merilis URL. Selain itu, ada cara baru untuk mengaitkan URB dengan IRP. Rutinitas baru dapat dipanggil oleh driver klien yang menargetkan Windows Vista dan versi Windows yang lebih baru.
Driver klien yang berjalan pada Windows Vista dan yang lebih baru harus menggunakan rutinitas baru sehingga tumpukan driver USB yang mendasar dapat memanfaatkan peningkatan performa dan keandalan tertentu. Peningkatan tersebut berlaku untuk tumpukan driver USB baru yang diperkenalkan di Windows 8 untuk mendukung perangkat USB 3.0 dan pengontrol host. Untuk pengontrol host USB 2.0, Windows memuat versi tumpukan driver yang lebih lama yang tidak mendukung peningkatan. Terlepas dari versi tumpukan driver yang mendasar atau versi protokol yang didukung oleh pengontrol host, Anda harus selalu memanggil rutinitas URB baru.
Sebelum Anda memanggil salah satu rutinitas baru, pastikan Anda memiliki handel USBD untuk pendaftaran driver klien Anda dengan tumpukan driver USB. Untuk mendapatkan handel USBD, panggil USBD_CreateHandle.
Rutinitas berikut tersedia dengan WDK untuk Windows 8. Rutinitas ini didefinisikan dalam Usbdlib.h.
- USBD_UrbAllocate
- USBD_IsochUrbAllocate
- USBD_SelectConfigUrbAllocateAndBuild
- USBD_SelectInterfaceUrbAllocateAndBuild
- USBD_UrbFree
- USBD_AssignUrbToIoStackLocation
Rutinitas alokasi dalam daftar sebelumnya mengembalikan penunjuk ke struktur URB baru, yang dialokasikan oleh tumpukan driver USB. Tergantung pada versi tumpukan driver USB yang dimuat oleh Windows, struktur URB dapat dipasangkan dengan konteks URB buram. Konteks URB adalah blok informasi tentang URB. Anda tidak dapat melihat konten header URB; informasi dimaksudkan untuk digunakan secara internal oleh tumpukan driver USB untuk meningkatkan pelacakan dan pemrosesan URB. Konteks URB hanya digunakan oleh tumpukan driver USB untuk Windows 8. Jika konteks URB tersedia, tumpukan driver USB menggunakannya untuk membuat pemrosesan URB lebih aman dan lebih efisien. Misalnya, tumpukan driver USB harus memastikan bahwa driver klien tidak mengirimkan URB dan kemudian mencoba menggunakan kembali URB yang sama sebelum permintaan pertama selesai. Untuk mendeteksi kesalahan semacam itu, tumpukan driver USB menyimpan informasi status dalam konteks URB. Tanpa informasi status, tumpukan driver USB harus membandingkan URB yang masuk dengan semua URL yang saat ini sedang berlangsung. Informasi status juga digunakan oleh tumpukan driver USB ketika driver klien mencoba untuk merilis URB. Sebelum merilis URB, tumpukan driver USB memverifikasi status untuk memastikan bahwa URB tidak tertunda.
Konteks URB menyediakan mekanisme resmi untuk menyimpan informasi URB tambahan. Menggunakan konteks URB lebih disukai untuk mengalokasikan memori tambahan sesuai kebutuhan atau menyimpan informasi tambahan dalam anggota struktur URB yang dipesan. Tumpukan driver USB mengalokasikan URL dan konteks URB terkait dalam kumpulan non-halaman, sehingga di masa mendatang jika konteks URB yang lebih besar diperlukan, satu-satunya penyesuaian yang diperlukan adalah ukuran alokasi kumpulan.
Migrasi Rutin URB
Tabel berikut ini meringkas perubahan rutinitas URB.
Gunakan huruf besar | Tersedia di WDK untuk Windows 7 dan yang lebih lama | Tersedia di WDK untuk Windows 8 dan yang lebih baru |
---|---|---|
Menargetkan Windows 7 dan versi sistem operasi yang lebih lama | Menargetkan Windows 8 dan versi sistem operasi yang lebih baru | |
Untuk membuat URB... | Driver klien mengalokasikan struktur URB dan memformat struktur tergantung pada permintaan. Driver klien mengalokasikan struktur URB pada tumpukan, atau driver mengalokasikan struktur di kumpulan non-halaman dengan memanggil ExAllocatePoolWithTag. |
Driver klien memanggil USBD_UrbAllocate dan menerima pointer ke struktur URB baru, yang dialokasikan oleh tumpukan driver USB. URB mungkin dikaitkan dengan konteks URB, tergantung pada versi antarmuka USBD dari tumpukan driver USB yang mendasar. |
Untuk membuat URB untuk permintaan konfigurasi-pilih... | Driver klien memanggil rutinitas USBD_CreateConfigurationRequestEx yang mengembalikan pointer ke URB baru yang dibuat dan diformat oleh tumpukan driver USB. | Driver klien memanggil USBD_SelectConfigUrbAllocateAndBuild dan menerima penunjuk ke struktur URB baru, yang dialokasikan dan diformat (untuk permintaan konfigurasi tertentu) oleh tumpukan driver USB. URB mungkin dikaitkan dengan konteks URB, tergantung pada versi antarmuka USBD dari tumpukan driver USB yang mendasar. |
Untuk membuat URB untuk permintaan pilih antarmuka... | Driver klien mengalokasikan struktur URB dan menggunakan struktur _URB_SELECT_INTERFACE untuk menentukan format perintah antarmuka tertentu untuk perangkat USB. | Driver klien memanggil USBD_SelectInterfaceUrbAllocateAndBuild dan menerima penunjuk ke struktur URB baru, yang dialokasikan dan diformat (untuk permintaan antarmuka tertentu) oleh tumpukan driver USB. URB mungkin dikaitkan dengan konteks URB, tergantung pada versi antarmuka USBD dari tumpukan driver USB yang mendasar. |
Untuk mengaitkan URB dengan IRP... | Driver klien mendapatkan pointer ke lokasi tumpukan IRP berikutnya dengan memanggil IoGetNextIrpStackLocation. Kemudian driver klien secara manual mengatur anggota Parameters.Others.Argument1 dari lokasi tumpukan ke alamat struktur URB . | Driver klien mendapatkan pointer ke lokasi tumpukan IRP berikutnya dengan memanggil IoGetNextIrpStackLocation. Kemudian driver klien memanggil USBD_AssignUrbToIoStackLocation untuk mengaitkan URB dengan lokasi tumpukan. |
Untuk merilis URB... | Jika driver klien mengalokasikan URB pada tumpukan, variabel keluar dari cakupan setelah permintaan selesai. Untuk membebaskan struktur URB yang dialokasikan driver klien atau tumpukan driver USB di kumpulan non-halaman, driver klien memanggil ExFreePool. |
Driver klien memanggil USBD_UrbFree. |