Bagikan melalui


Mengelola Antrean dalam Driver WBDI

Driver WBDI harus membuat setidaknya satu antrean untuk menangani beberapa permintaan bersamaan dari layanan. Jika Anda menggunakan UMDF, Anda dapat memanfaatkan dukungan manajemen antreannya.

Di WudfBioUsbSample, kelas CBiometricIoQueue mengimplementasikan antarmuka antrean I/O.

Dalam metode CBiometricIoQueue::Initialize, khususnya, driver meminta objek CBiometricIoQueue pemilik untuk pointer ke antarmuka IQueueCallbackDeviceIoControl yang digunakan kerangka kerja untuk menentukan fungsi panggilan balik peristiwa yang berlangganan driver pada antrean:

if (SUCCEEDED(hr)) 
{
hr = this->QueryInterface(__uuidof(IUnknown), (void **)&unknown);
}

Kemudian driver memanggil IWDFDevice::CreateIoQueue untuk mengonfigurasi antrean I/O default:

hr = FxDevice->CreateIoQueue(unknown,
FALSE,
WdfIoQueueDispatchParallel,
FALSE,
FALSE,
&fxQueue);
BiometricSafeRelease(unknown);

Panggilan menentukan WdfIoQueueDispatchParallel sehingga kerangka kerja akan menyajikan permintaan ke fungsi panggilan balik antrean I/O driver segera setelah permintaan tersedia.

Selanjutnya, driver memanggil IWDFDevice::ConfigureRequestDispatching untuk mengonfigurasi antrean untuk memfilter semua permintaan I/O Perangkat:

hr = FxDevice->ConfigureRequestDispatching(fxQueue,
WdfRequestDeviceIoControl,
TRUE);

Karena driver menentukan WdfRequestDeviceIoControl dalam panggilan ini, driver menyediakan handler OnDeviceIoControl untuk memproses pemberitahuan I/O dari kerangka kerja. Ini dilakukan dalam metode IQueueCallbackDeviceIoControl::OnDeviceIoControl yang merupakan bagian dari parameter "tidak diketahui" dalam panggilan ke CreateIoQueue sebelumnya.

Hanya ada satu permintaan IOCTL_BIOMETRIC_CAPTURE_DATA yang luar biasa pada satu waktu. Driver harus melacak permintaan IOCTL_BIOMETRIC_CAPTURE_DATA, baik dengan menyimpan pointer secara internal ke permintaan yang tertunda atau dengan menggunakan antrean kerangka kerja lain untuk menangani permintaan tersebut.

Dalam sampel, jika ada permintaan I/O yang tertunda, sampel mempertahankan pointer ke permintaan dalam anggota kelas CBiometricDevice, seperti yang didefinisikan dalam Device.h:

IWDFIoRequest *m_PendingRequest;

Saat satu I/O pengumpulan data sensor tertunda, panggilan berikutnya ke IOCTL pengumpulan data akan gagal:

FxRequest->Complete(WINBIO_E_DATA_COLLECTION_IN_PROGRESS);

Ketika permintaan pengambilan selesai atau dibatalkan, nilai ini diatur ke NULL:

IWDFIoRequest *FxRequest = (IWDFIoRequest *)InterlockedExchangePointer((PVOID *)&m_PendingRequest, NULL);