Bagikan melalui


Menggunakan WinUSB dalam Driver WBDI

Microsoft merekomendasikan agar driver WBDI menggunakan target I/O USB yang dibangun ke dalam Kerangka Kerja Driver Mode Pengguna (UMDF).

Mengatur UmdfDispatcher

File INF yang menginstal driver UMDF harus berisi bagian DDInstall khusus WDF. Jika Anda menggunakan target I/O USB di UMDF, Anda harus mengatur direktif registri UmdfDispatcher dalam bagian DDInstall ini.

Bagian berikut dari WudfBioUsbSample.inx dalam sampel WudfBioUsbSample menunjukkan cara mengatur arahan ini:

[Biometric_Install.NT.Wdf]
KmdfService=WINUSB, WinUsb_Install
UmdfDispatcher=WinUsb
UmdfService=WudfBioUsbSample, WudfBioUsbSample_Install
UmdfServiceOrder=WudfBioUsbSample

Untuk informasi spesifik tentang UmdfDispatcher, lihat Menentukan Arahan INF UmdfDispatcher. Untuk informasi umum tentang arahan registri WDF, lihat Menentukan Arahan WDF.

Permintaan Baca Asinkron Tertunda

WinUsb dapat menangani beberapa permintaan baca yang luar biasa. Perangkat yang memerlukan latensi minimal antara operasi baca selama pemindaian harus menjaga sejumlah permintaan baca asinkron yang tertunda. Jika driver membuat permintaan asinkron, WinUsb mengeluarkan permintaan ini sebelum transfer kembali ke mode pengguna untuk rutinitas penyelesaian permintaan baca sebelumnya.

Anda dapat merujuk ke CBiometricDevice::InitiatePendingRead metode dalam Device.cpp di WudfBioUsbSample untuk melihat contoh kode tentang cara menunggu permintaan baca.

Kode untuk menunggu permintaan baca harus berupa perulangan dari langkah-langkah berikut:

  1. Buat objek memori kerangka kerja yang telah dialokasikan sebelumnya dengan memanggil IWDFDriver::CreatePreallocatedWdfMemory.

  2. Berikan kode panggilan balik dalam rutinitas OnCompletion. Lihat CBiometricDevice::OnCompletion dalam sampel.

  3. Dapatkan pointer ke antarmuka IRequestCallbackRequestCompletion dari objek pemilik.

  4. Daftarkan fungsi panggilan balik dengan memanggil IWDFIoRequest::SetCompletionCallback dan meneruskan penunjuk ke IRequestCallbackRequestCompletion yang diperoleh pada langkah sebelumnya. Kerangka kerja sekarang akan memanggil panggilan balik ketika permintaan I/O selesai.

  5. Panggil IWDFIoRequest::Kirim untuk mengirim permintaan baca ke perangkat.

  6. Proses permintaan baca saat penyelesaian panggilan balik terjadi. Sebelum rutinitas OnCompletion memulai permintaan baca baru yang tertunda, itu harus memeriksa status target I/O. Untuk melakukan ini, kueri IWDFUsbTargetPipe untuk pointer ke antarmuka IWDFIoTargetStateManagement-nya. Kemudian panggil IWDFIoTargetStateManagement::GetState:

    IWDFIoTarget * pTarget
    IWDFIoTargetStateManagement * pStateMgmt = NULL;
    WDF_IO_TARGET_STATE state;
    
    HRESULT hrQI = pTarget->QueryInterface(IID_PPV_ARGS(&pStateMgmt));
    WUDF_TEST_DRIVER_ASSERT((SUCCEEDED(hrQI) && pStateMgmt));
    
    state = pStateMgmt->GetState();
    

Setelah pemindaian selesai, batalkan permintaan baca yang tertunda.

Jika Anda menggunakan target UMDF-USB, Anda dapat mengizinkan permintaan baca tetap tertunda di seluruh power-down dan power-up.

Jika Anda tidak menggunakan target UMDF-USB, driver harus berhenti mengirim permintaan baca yang tertunda di D0Exit dan memulai ulang di D0Entry.

Penangguhan Selektif

Driver WBDI harus mendukung penangguhan selektif USB.

Perangkat yang mendukung bangun sistem dan idle perangkat harus mengaktifkan pengaturan registri untuk ditangguhkan selektif di WinUsb, seperti yang ditunjukkan dalam contoh kode ini dari WudfBioUsbSample.inx:

HKR,,"SystemWakeEnabled",0x00010001,1
HKR,,"DeviceIdleEnabled",0x00010001,1

Tumpukan USB sistem operasi tidak dapat menjamin waktu antara bangun sistem dan kapan driver dapat mulai membaca dari perangkat.

Idealnya, perangkat harus dibiarkan dalam keadaan siap untuk mengambil pemindaian ketika sistem ditangguhkan. Jika pemindaian terjadi saat sistem ditangguhkan, perangkat harus menyimpan data input untuk seluruh pemindaian sidik jari. Ketika sistem bangun, driver kemudian membaca dalam data dari perangkat. Dengan mendukung skenario ini, Anda dapat mengaktifkan skenario bangun dan buka kunci/masuk sistem.