Mendukung klien Kernel-Mode di Driver UMDF
Topik ini menjelaskan bagaimana driver User-Mode Driver Framework (UMDF) mendukung klien mode kernel, mulai dari UMDF versi 2.
Klien mode kernel adalah driver mode kernel yang mengirim permintaan I/O ke driver UMDF Anda. Driver mode kernel mungkin berada di atas driver UMDF, di tumpukan perangkat yang sama, atau mungkin berada di tumpukan perangkat yang berbeda.
Driver mode kernel dapat meneruskan permintaan I/O yang telah diterimanya dari aplikasi mode pengguna, atau dapat membuat permintaan I/O baru dan mengirimkannya ke driver mode pengguna.
Cara mendukung klien mode kernel dalam driver UMDF
Untuk mengaktifkan dukungan driver UMDF untuk klien mode kernel, file INF driver UMDF harus menyertakan arahan UmdfKernelModeClientPolicy dalam INF DDInstall-nya. Bagian WDF .
Kerangka kerja ini menyediakan dua metode yang berguna untuk driver yang mendukung klien mode kernel. Driver dapat memanggil metode WdfRequestGetRequestorMode untuk menentukan apakah permintaan I/O berasal dari mode kernel atau mode pengguna. Jika permintaan I/O berasal dari mode pengguna, driver dapat memanggil WdfRequestIsFromUserModeDriver untuk menentukan apakah permintaan berasal dari aplikasi atau driver mode pengguna lainnya.
Pembatasan driver mode kernel
Driver UMDF dapat memproses permintaan I/O dari driver mode kernel hanya jika driver mode kernel memenuhi persyaratan berikut:
Driver mode kernel harus berjalan di IRQL = PASSIVE_LEVEL saat mengirim permintaan I/O.
Kecuali driver telah mengatur arahan UmdfFileObjectPolicy INF ke AllowNullAndUnknownFileObjects, setiap permintaan I/O yang dikirim driver mode kernel ke driver mode pengguna harus memiliki objek file terkait. Kerangka kerja sebelumnya harus diberi tahu bahwa manajer I/O membuat objek file. (Pemberitahuan tersebut menyebabkan kerangka kerja memanggil fungsi panggilan balik EvtDeviceFileCreate driver mode pengguna, tetapi fungsi panggilan balik tersebut bersifat opsional.)
Permintaan I/O tidak boleh berisi kode fungsi IRP_MJ_INTERNAL_DEVICE_CONTROL .
Buffer permintaan I/O tidak boleh berisi pointer ke informasi tambahan, karena driver mode pengguna tidak dapat mendereferensikan pointer.
Jika permintaan I/O berisi kode kontrol I/O yang menentukan metode akses buffer "tidak ada", driver mode kernel harus mengirim permintaan I/O dalam konteks proses aplikasi yang membuat permintaan I/O. Untuk informasi selengkapnya tentang cara mendukung metode "tidak keduanya" dalam driver UMDF, lihat Mengelola Metode Akses Buffer di Driver UMDF.
Driver UMDF mungkin mengubah data output permintaan I/O, dalam mode pengguna. Oleh karena itu, driver mode kernel harus memvalidasi data output apa pun yang diterimanya dari driver mode pengguna.
Klien mode kernel biasanya harus memvalidasi nilai Informasi yang diteruskan driver UMDF ke WdfRequestCompleteWithInformation. Jika klien adalah driver KMDF, klien dapat memanggil WdfRequestGetCompletionParams untuk mendapatkan informasi ini dalam struktur IO_STATUS_BLOCK.
Biasanya, kerangka kerja tidak memvalidasi nilai informasi yang diteruskan driver UMDF ke WdfRequestCompleteWithInformation. (Parameter ini biasanya menentukan jumlah byte yang ditransfer.) Kerangka kerja memvalidasi nilai informasi hanya untuk buffer output, dan hanya untuk metode akses data I/O yang di-buffer . (Misalnya, kerangka kerja memverifikasi bahwa jumlah byte yang ditransfer tidak melebihi ukuran buffer output dari operasi baca, jika metode akses di-buffer I/O.)