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 dalam 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 kemudian 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.

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 isi 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 melepaskan 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.

Penggunaan kasus 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 dalam 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 pemilihan... 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 pemilihan) 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 antarmuka-pilih... 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 pilih antarmuka) 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 melepaskan 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.