Bagikan melalui


Seperangkat aturan penggunaan DDI (KMDF)

Gunakan aturan ini untuk memverifikasi bahwa driver Anda menggunakan KMDF DDI dengan benar.

Di bagian ini

Topik Deskripsi

BufAfterReqCompletedIoctl

Aturan BufAfterReqCompletedIoctl menentukan bahwa dalam fungsi panggilan balik EvtIoDeviceControl , buffer permintaan I/O yang diambil tidak dapat diakses setelah permintaan I/O selesai.

BufAfterReqCompletedIntIoctl

Aturan BufAfterReqCompletedIntIoctl menentukan bahwa setelah permintaan selesai, buffernya tidak dapat diakses (hanya di dalam fungsi panggilan balik EvtIoInternalDeviceControl ). Buffer diambil dengan memanggil WdfRequestRetrieveOutputBuffer atau WdfRequestRetrieveUnsafeUserOutputBuffer atau WdfRequestRetrieveInputBuffer atau WdfRequestRetrieveUnsafeUserInputBuffer.

BufAfterReqCompletedIntIoctlA

Aturan BufAfterReqCompletedIntIoctlA memverifikasi bahwa setelah permintaan selesai, buffernya tidak dapat diakses (hanya di dalam panggilan balik EvtIoInternalDeviceControl ). Buffer diambil dengan memanggil WdfRequestRetrieveInputBuffer atau WdfRequestRetrieveOutputBuffer atau WdfRequestRetrieveUnsafeUserInputBuffer atau WdfRequestRetrieveUnsafeUserOutputBuffer.

BufAfterReqCompletedIoctlA

Aturan BufAfterReqCompletedIoctlA menentukan bahwa dalam fungsi panggilan balik EvtIoDeviceControl , buffer permintaan I/O yang diambil tidak dapat diakses setelah permintaan I/O selesai.

BufAfterReqCompletedRead

Aturan BufAfterReqCompletedRead menentukan bahwa dalam fungsi panggilan balik EvtIoRead , buffer permintaan I/O yang diambil tidak dapat diakses setelah permintaan I/O selesai. Ada 14 DDI yang berfungsi sebagai metode potensial akses buffer.

BufAfterReqCompletedReadA

Aturan BufAfterReqCompletedReadA menentukan bahwa dalam fungsi panggilan balik EvtIoRead , buffer permintaan I/O yang diambil tidak dapat diakses setelah permintaan I/O selesai. Ada 14 DDI yang berfungsi sebagai kemungkinan metode akses buffer.

BufAfterReqCompletedWrite

Aturan BufAfterReqCompletedWrite menentukan bahwa dalam fungsi panggilan balik EvtIoWrite , buffer permintaan I/O yang diambil tidak dapat diakses setelah permintaan I/O selesai.

BufAfterReqCompletedWriteA

Aturan BufAfterReqCompletedWriteA menentukan bahwa dalam fungsi panggilan balik EvtIoWrite , buffer permintaan I/O yang diambil tidak dapat diakses setelah permintaan I/O selesai.

ChildDeviceInitApi

Aturan ChildDeviceInitApi menentukan bahwa untuk perangkat anak, metode inisialisasi objek perangkat kerangka kerja harus dipanggil sebelum driver memanggil metode WdfDeviceCreate untuk objek perangkat anak.

PerangkatKontrolDihapus

Aturan ControDeviceDeleted menentukan bahwa jika driver PnP membuat objek perangkat kontrol, driver harus menghapus objek perangkat kontrol dalam salah satu fungsi callback pembersihan sebelum driver dibongkar muat.

ControlDeviceInitAPI

Aturan ControlDeviceInitAPI menentukan bahwa WdfControlDeviceInitAllocate dan semua DDI inisialisasi objek perangkat lainnya yang menyiapkan struktur WDFDEVICE_INIT untuk perangkat kontrol harus dipanggil sebelum WdfDeviceCreate untuk perangkat kontrol.

CtlDeviceFinishInitDeviceAdd

Aturan CtlDeviceFinishInitDeviceAdd menentukan bahwa jika driver membuat objek perangkat kontrol dalam fungsi panggilan balik EvtDriverDeviceAdd , ia harus memanggil WdfControlFinishInitializing setelah perangkat dibuat dan sebelum keluar dari fungsi panggilan balik EvtDriverDeviceAdd . Aturan ini tidak berlaku untuk driver non-PnP.

CtlDeviceFinishInitDrEntry

Aturan CtlDeviceFinishInitDrEntry menentukan bahwa jika driver membuat objek perangkat kontrol dalam fungsi panggilan balik DriverEntry , ia harus memanggil WdfControlFinishInitializing setelah perangkat dibuat dan sebelum keluar dari fungsi panggilan balik EvtDriverDeviceAdd . Aturan ini tidak berlaku untuk driver non-PnP.

DeviceCreateFail

Aturan DeviceCreateFail menentukan bahwa EVT_WDF_DRIVER_DEVICE_ADD mengembalikan status kesalahan saat panggilan ke WdfDeviceCreate gagal.

DeviceInitAllocate

Aturan DeviceInitAllocate menentukan bahwa, untuk perangkat PDO atau objek perangkat kontrol, metode inisialisasi objek perangkat kerangka kerja WdfPdoInitAllocate atau WdfControlDeviceInitAllocate harus dipanggil sebelum driver memanggil WdfDeviceCreate.

DeviceInitAPI

Untuk perangkat FDO, metode inisialisasi perangkat dalam kerangka kerja dan metode inisialisasi FDO dalam kerangka kerja harus dipanggil sebelum driver memanggil metode WdfDeviceCreate untuk objek perangkat.

DoubleDeviceInitFree

Aturan DoubleDeviceInitFree menentukan bahwa driver tidak boleh membebaskan struktur inisialisasi perangkat dua kali.

DriverCreate

Aturan DriverCreate menentukan bahwa driver yang menggunakan Kerangka Kerja Driver Mode Kernel (KMDF) harus memanggil metode WdfDriverCreate untuk membuat objek driver kerangka kerja dari dalam rutinitas DriverEntry-nya .

InitFreeDeviceCallback

Aturan InitFreeDeviceCallback menentukan bahwa driver harus memanggil WdfDeviceInitFree jika driver mengalami kesalahan saat menginisialisasi objek perangkat kerangka kerja baru, dan jika driver menerima struktur WDFDEVICE_INIT dari panggilan ke WdfControlDeviceInitAllocate.

InitFreeDeviceCreate

Aturan InitFreeDeviceCreate menentukan bahwa driver harus memanggil WdfDeviceInitFree alih-alih WdfDeviceCreate jika kesalahan terjadi di salah satu metode inisialisasi objek perangkat dan jika driver menerima struktur WDFDEVICE_INIT dari panggilan ke WdfControlDeviceInitAllocate.

InitFreeDeviceCreateType2

Aturan InitFreeDeviceCreateType2 menentukan bahwa driver tidak boleh memanggil WdfDeviceCreate setelah memanggil WdfDeviceInitFree.

InitFreeDeviceCreateType4

Aturan InitFreeDeviceCreateType4 menentukan bahwa driver harus memanggil WdfDeviceInitFree jika driver mengalami kesalahan saat memanggil WdfDeviceCreate dan jika driver menerima struktur WDFDEVICE_INIT dari panggilan ke WdfControlDeviceInitAllocate.

InitFreeNull

Aturan InitFreeNull menentukan bahwa DDI yang menerima PWDFDEVICE_INIT sebagai parameter tidak dapat dipanggil dengan menggunakan penunjuk NULL ke struktur WDFDEVICE_INIT .

MdlAfterReqCompletedIntIoctl

Aturan MdlAfterReqCompletedIntIoctl menentukan bahwa dalam fungsi panggilan balik EvtIoInternalDeviceControl , daftar deskriptor memori (MDL) tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedIntIoctlA

Aturan MdlAfterReqCompletedIntIoctlA menentukan bahwa dalam fungsi panggilan balik EvtIoInternalDeviceControl , daftar deskriptor memori (MDL) tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedIoctl

Aturan MdlAfterReqCompletedIoctl menentukan bahwa dalam fungsi panggilan balik EvtIoDeviceControl , daftar deskriptor memori (MDL) tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedIoctlA

Aturan MdlAfterReqCompletedIoctlA menentukan bahwa dalam fungsi panggilan balik EvtIoDeviceControl , daftar deskriptor memori (MDL) tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedRead

Aturan MdlAfterReqCompletedRead menentukan bahwa dalam fungsi panggilan balik EvtIoRead , objek daftar deskriptor memori (MDL) yang diambil tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedReadA

Aturan MdlAfterReqCompletedReadA menentukan bahwa dalam fungsi panggilan balik EvtIoRead , objek daftar deskriptor memori (MDL) yang diambil tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedWrite

Aturan MdlAfterReqCompletedWrite menentukan bahwa dalam fungsi panggilan balik EvtIoWrite , objek daftar deskriptor memori (MDL) yang diambil tidak dapat diakses setelah permintaan I/O selesai.

MdlAfterReqCompletedWriteA

Aturan MdlAfterReqCompletedWriteA menentukan bahwa dalam fungsi panggilan balik EvtIoWrite , objek daftar deskriptor memori (MDL) yang diambil tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedIntIoctl

Aturan MemAfterReqCompletedIntIoctl menentukan bahwa dalam fungsi panggilan balik EvtIoInternalDeviceControl , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedIntIoctlA

Aturan MemAfterReqCompletedIntIoctlA menentukan bahwa dalam fungsi panggilan balik EvtIoInternalDeviceControl , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedIoctl

Aturan MemAfterReqCompletedIoctl menentukan bahwa dalam fungsi panggilan balik EvtIoDeviceControl , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedIoctlA

Aturan MemAfterReqCompletedIoctlA menentukan bahwa dalam fungsi panggilan balik EvtIoDeviceControl , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedRead

Aturan MemAfterReqCompletedRead menentukan bahwa dalam fungsi panggilan balik EvtIoRead , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedReadA

Aturan MemAfterReqCompletedReadA menentukan bahwa dalam fungsi panggilan balik EvtIoRead , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedWrite

Aturan MemAfterReqCompletedWrite menentukan bahwa dalam fungsi panggilan balik EvtIoWrite , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

MemAfterReqCompletedWriteA

Aturan MemAfterReqCompletedWriteA menentukan bahwa dalam fungsi panggilan balik EvtIoWrite , objek memori kerangka kerja tidak dapat diakses setelah permintaan I/O selesai.

NullCheck

Aturan NullCheck memverifikasi bahwa nilai NULL di dalam kode driver tidak didereferensikan nanti di driver. Aturan ini melaporkan cacat jika salah satu kondisi ini benar:

  • Ada penetapan NULL yang akan didereferensikan kemudian.
  • Ada parameter global untuk prosedur dalam driver yang mungkin bernilai NULL dan yang didereferensikan kemudian, serta ada pemeriksaan secara eksplisit pada driver yang menunjukkan bahwa nilai awal penunjuk tersebut mungkin NULL.

Dengan pelanggaran aturan NullCheck, pernyataan kode yang paling relevan disorot di panel pohon pelacakan. Untuk informasi selengkapnya tentang bekerja dengan output laporan, lihat Laporan Pemverifikasi Driver Statis dan Memahami Penampil Jejak.

PdoDeviceInitAPI

Aturan PdoDeviceInitAPI menentukan bahwa WdfPdoInitAllocate dan semua DDI inisialisasi objek perangkat lainnya yang menyiapkan struktur WDFDEVICE_INIT untuk objek perangkat fisik (PDO) harus dipanggil sebelum driver memanggil WdfDeviceCreate untuk PDO.

PdoInitFreeDeviceCallback

Aturan PdoInitFreeDeviceCallback menentukan bahwa driver harus memanggil WdfDeviceInitFree jika terjadi kesalahan saat driver memanggil fungsi inisialisasi objek perangkat kerangka kerja apa pun.

PdoInitFreeDeviceCreate

Aturan PdoInitFreeDeviceCreate menentukan bahwa driver harus memanggil WdfDeviceInitFree alih-alih WdfDeviceCreate jika kesalahan terjadi di salah satu fungsi inisialisasi objek perangkat dan jika driver menerima struktur WDFDEVICE_INIT dari panggilan ke WdfPdoInitAllocate.

PdoInitFreeDeviceCreateType2

Aturan PdoInitFreeDeviceCreateType2 menentukan bahwa driver tidak boleh memanggil WdfDeviceCreate setelah memanggil WdfDeviceInitFree.

PdoInitFreeDeviceCreateType4

Aturan PdoInitFreeDeviceCreateType4 menentukan bahwa driver harus memanggil WdfDeviceInitFree jika kesalahan terjadi ketika driver memanggil WdfDeviceCreate.

ControlDeviceInitAllocate

Aturan ControlDeviceInitAllocate menentukan bahwa untuk objek perangkat kontrol, driver harus memanggil metode inisialisasi objek perangkat kerangka kerja WdfControlDeviceInitAllocate sebelum driver memanggil WdfDeviceCreate.

InputBufferAPI

Aturan InputBufferAPI menentukan bahwa DDI yang benar untuk pengambilan buffer digunakan dalam fungsi panggilan balik EvtIoRead. Dalam fungsi panggilan balik EvtIoRead , DDI berikut tidak dapat dipanggil untuk pengambilan buffer:

Untuk memilih seperangkat aturan penggunaan DDI

  1. Pilih proyek driver Anda (.vcxProj) di Microsoft Visual Studio. Dari menu Driver, klik Luncurkan Pemverifikasi Driver Statis….

  2. Klik tab Aturan . Di bawah Seperangkat Aturan, pilih DDIUsage.

    Untuk memilih seperangkat aturan default dari jendela prompt perintah pengembang Visual Studio, tentukan DDIUsage.sdv dengan opsi /check . Contohnya:

    msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver dan Perintah Pemverifikasi Driver Statis (MSBuild).