Bagikan melalui


Seperangkat aturan RequestProcessing (KMDF)

Gunakan aturan ini untuk memverifikasi bahwa driver Anda menyelesaikan atau membatalkan paket permintaan I/O (IRP) dengan benar.

Di bagian ini

Topik Deskripsi

ChangeQueueState

Aturan ChangeQueueState menetapkan bahwa driver WDF tidak berusaha mengubah status antrean dari beberapa utas secara bersamaan atau tidak memanggil DDI yang mengubah status satu demi satu dari dalam utas yang sama. Fungsi panggilan balik yang mengubah status antrean adalah WdfIoQueueStop, WdfIoQueueStopSynchronously, WdfIoQueuePurge, WdfIoQueuePurgeSynchronously, WdfIoQueueDrain, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurge, dan WdfIoQueueStopAndPurgeSynchronously. Jika DDI ini dipanggil ketika perubahan status Antrean sudah berlangsung, itu akan menyebabkan komputer mengalami crash atau menjadi tidak responsif.

CompleteCanceledReq

Aturan CompleteCanceledReq menentukan bahwa jika permintaan telah dibatalkan, permintaan tidak lagi valid, dan driver tidak boleh menyelesaikannya. Ketika pengemudi membatalkan penandaan permintaan yang sebelumnya ditandai bisa dibatalkan, ia harus memastikan bahwa permintaan tersebut belum dibatalkan. Jika driver tidak melakukan pemeriksaan ini, driver mungkin menyelesaikan permintaan yang telah dibebaskan.

DoubleCompletion

Aturan DoubleCompletion menentukan bahwa driver tidak boleh menyelesaikan permintaan I/O dua kali. Metode berikut tidak boleh dipanggil dua kali berturut-turut untuk permintaan yang sama: WdfRequestComplete, WdfRequestCompleteWithInformation, WdfRequestCompleteWithPriorityBoost.

DoubleCompletionLocal

Aturan DoubleCompletionLocal menentukan bahwa driver tidak boleh menyelesaikan permintaan I/O dua kali.

EvtIoStopCancel

Aturan EvtIoStopCancel menentukan bahwa dalam fungsi panggilan balik EvtIoStop , driver memanggil salah satu metode berikut untuk permintaan I/O yang tidak dapat dibatalkan.

EvtIoStopCompleteOrStopAck

Aturan EvtIoStopCompleteOrStopAck menentukan bahwa dalam fungsi panggilan balik EvtIoStop driver memanggil salah satu metode berikut untuk setiap permintaan I/O yang disajikan oleh kerangka kerja. Jika ini tidak dilakukan, sang driver mungkin memblokir sistem dari memasuki kondisi daya yang lebih rendah.

EvtSurpriseRemoveNoSuspendQueue

Aturan EvtSurpriseRemoveNoSuspendQueue menentukan bahwa Driver WDF tidak boleh menguras, menghentikan, atau membersihkan antrean dari fungsi panggilan balik EvtDeviceSurpriseRemoval , sebagai gantinya fungsi panggilan balik I/O yang dikelola sendiri harus digunakan. Fungsi panggilan balik EvtDeviceSurpriseRemoval tidak disinkronkan dengan jalur power-down.

FileObjectConfigured

Aturan FileObjectConfigured menentukan bahwa panggilan ke metode WdfRequestGetFileObject didahului oleh panggilan ke WdfDeviceInitSetFileObjectConfig.

InternalIoctlReqs

Aturan InternalIoctlReqs menentukan bahwa permintaan IOCTL internal tidak diteruskan ke antarmuka driver perangkat (DDI) pengiriman permintaan KMDF yang tidak sesuai.

InvalidReqAccess

Aturan InvalidReqAccess menentukan bahwa permintaan tidak diakses setelah selesai atau dibatalkan. Aturan ini mungkin tumpang tindih dengan aturan lain, seperti aturan yang memeriksa penyelesaian ganda, atau aturan yang memeriksa permintaan telah ditandai dapat dibatalkan dua kali.

InvalidReqAccessLocal

Aturan InvalidReqAccessLocal menentukan bahwa permintaan yang dibuat secara lokal tidak diakses setelah selesai atau dibatalkan. Aturan ini mungkin tumpang tindih dengan aturan lain, seperti aturan yang memeriksa penyelesaian ganda, atau aturan yang memeriksa permintaan telah ditandai dapat dibatalkan dua kali.

IoctlReqs

Aturan IoctlReqs menentukan bahwa permintaan IOCTL tidak boleh diteruskan ke permintaan KMDF yang tidak sesuai atau mengirim antarmuka driver perangkat (DDI).

MarkCancOnCancReqLocal

Aturan MarkCancOnCancReqLocal menentukan bahwa metode WdfRequestMarkCancelable tidak dapat dipanggil dua kali berturut-turut pada permintaan I/O yang sama.

NoIoQueuePurgeSynchronously

Aturan NoIoQueuePurgeSynchronously memverifikasi bahwa driver WDF tidak memanggil fungsi WdfIoQueueStopSynchronously, WdfIoQueueDrainSynchronously, WdfIoQueueStopAndPurgeSynchronously, atau WdfIoQueuePurgeSynchronously dari fungsi callback event objek antrean EvtIO berikut:

OutputBufferAPI

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

ReadReqs

Aturan ReadReqs menentukan bahwa permintaan baca tidak diteruskan ke metode KMDF yang tidak pantas.

ReqCompletionRoutine

Aturan ReqCompletionRoutine menentukan bahwa rutinitas penyelesaian harus ditetapkan sebelum permintaan dikirim ke target I/O.

ReqDelete

Aturan ReqDelete menentukan bahwa permintaan yang dibuat driver tidak diteruskan ke fungsi WdfRequestCompleteXxx . Sebagai gantinya, permintaan harus dihapus setelah selesai.

ReqIsCancOnCancReq

Aturan ReqIsCancOnCancReq menentukan bahwa metode WdfRequestIsCanceled hanya dapat dipanggil berdasarkan permintaan yang tidak ditandai sebagai dapat dibatalkan.

ReqMarkCancelableSend

Aturan ReqMarkCancelableSend menentukan bahwa permintaan yang diteruskan oleh driver tidak ditandai sebagai dapat dibatalkan dengan memanggil WdfRequestMarkCancelable.

RequestCompleted

Aturan DeferredRequestCompleted menentukan bahwa untuk driver non-filter setiap permintaan yang masuk ke antrean I/O default driver harus diselesaikan, kecuali permintaan ditangguhkan atau diteruskan, atau jika WdfRequestStopAcknowledge dijalankan.

RequestFormattedValid

Aturan RequestFormattedValid menentukan bahwa driver memformat semua permintaan, kecuali untuk permintaan WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET, sebelum mengirimkannya ke target I/O.

PermintaanDapatkanStatusValid

Aturan RequestGetStatusValid yang menentukan bahwa WdfRequestGetStatus harus dipanggil untuk permintaan dalam salah satu situasi berikut:

  • Ketika WdfRequestSend mengembalikan kesalahan.
  • Ketika permintaan telah dikirim dengan WDF_REQUEST_SEND_OPTION_SYNCHRONOUS.

RequestSendAndForgetNoFormatting

Aturan RequestSendAndForgetNoFormatting memverifikasi bahwa driver tidak memformat permintaan menggunakan fungsi pemformatan target I/O sebelum mengirimkannya ke target I/O dengan opsi kirim WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

RequestSendAndForgetNoFormatting2

Aturan RequestSendAndForgetNoFormatting2 memverifikasi bahwa driver tidak memformat permintaan menggunakan fungsi pemformatan target I/O sebelum mengirimkannya ke target I/O dengan opsi kirim WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET.

StopAckWithinEvtIoStop

Aturan StopAckWithinEvtIoStop menentukan bahwa fungsi WdfRequestStopAcknowledge hanya dipanggil dari dalam fungsi panggilan balik EvtIoStop .

WdfIoQueueFindRequestFailed

Aturan WdfIoQueueFindRequestFailed menentukan bahwa WdfIoQueueRetrieveFoundRequest atau WdfObjectDereference hanya boleh dipanggil setelah WdfIoQueueFindRequestFailed mengembalikan STATUS_SUCCESS.

#B0 #A1 WdfIoQueueRetrieveFoundRequest #A2 #C3

Aturan WdfIoQueueRetrieveFoundRequest menentukan bahwa metode WdfIoQueueRetrieveFoundRequest hanya dipanggil setelah WdfIoQueueFindRequest dipanggil dan dikembalikan STATUS_SUCCESS dan tidak ada WdfObjectDereference yang dipanggil pada permintaan yang sama.

WdfIoQueueRetrieveNextRequest

Aturan WdfIoQueueRetrieveNextRequest menentukan bahwa WdfIoQueueRetrieveNextRequest tidak dipanggil setelah WdfIoQueueFindRequest dipanggil.

WriteReqs

Aturan WriteReqs menentukan bahwa permintaan tulis tidak diteruskan ke metode KMDF yang tidak pantas.

Untuk memilih seperangkat aturan RequestProcessing

  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 RequestProcessing.

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

    msbuild /t:sdv /p:Inputs="/check:RequestProcessing.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).