Bagikan melalui


Aturan UsbKmdfIrqlExplicit (kmdf)

Aturan UsbKmdfIrqlExplicit memverifikasi bahwa KMDF DDI dipanggil pada tingkat IRQL yang benar. Aturan ini berlaku untuk semua fungsi EvtIoCallback.

Jika driver Anda memanggil fungsi WdfIoQueueCreate dengan struct WDF_OBJECT_ATTRIBUTES dan objek perangkat yang diteruskan ke DDI ini dibuat menggunakan atribut default (WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE atau VOID WDF_OBJECT_ATTRIBUTES_INIT), maka Anda mungkin perlu memodifikasi driver Anda dengan salah satu cara berikut sehingga Verifier Driver Statis tidak melaporkan cacat yang terkait dengan aturan ini:

Atur atribut perangkat secara eksplisit ke WdfExecutionLevelPassive atau WdfExecutionLevelDispatch dengan mengubah kode driver untuk mengatur atribut dengan memanggil fungsi yang menggunakan struct WDF_OBJECT_ATTRIBUTES sebagai parameter.

Secara eksplisit mengasumsikan/menegaskan demi analisis bahwa WdfExecutionLevelPassive atau WdfExecutionLevelDispatch diatur dalam atribut perangkat dengan menggunakan makro __analysis_assume . Berikut adalah contoh: __analysis_assume(deviceAttributes.ExecutionLevel==WdfExecutionLevelPassive)

Jika driver Anda memproses beberapa IOCTL di PASSIVE_LEVEL dan lainnya di DISPATCH_LEVEL, maka Anda mungkin perlu mengecualikan IOCTL yang diproses pada DISPATCH_LEVEL dari verifikasi. Anda dapat menggunakan __analysis_assume untuk melakukan ini. Berikut adalah contoh: __analysis_assume(IoControlCode != IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE), di mana IOCTL_RH_QUERY_DUMMY_TRANSLATOR_INTERFACE diproses pada DISPATCH_LEVEL di driver EvtIoDeviceControlCallback.

Model driver: KMDF

Cara menguji

Pada waktu kompilasi

Jalankan Pemverifikasi Driver Statis dan tentukan aturan UsbKmdfIrqlExplicit .

Gunakan langkah-langkah berikut untuk menjalankan analisis kode Anda:
  1. Siapkan kode Anda (gunakan deklarasi jenis peran).
  2. Jalankan Pemverifikasi Driver Statis.
  3. Lihat dan analisis hasilnya.

Untuk informasi selengkapnya, lihat Menggunakan Pemverifikasi Driver Statis untuk Menemukan Cacat pada Driver.

Berlaku untuk

WdfUsbInterfaceGetConfiguredPipeWdfUsbInterfaceGetConfiguredSettingIndexWdfUsbInterfaceGetDescriptorWdfUsbInterfaceGetEndpointInformationWdfUsbInterfaceGetInterfaceNumberWdfUsbInterfaceGetNumConfiguredPipesWdfUsbInterfaceGetNumEndpointsWdfUsbInterfaceGetNumSettingsWdfUsbInterfaceSelectSettingWdfUsbTargetDeviceAllocAndQueryStringWdfUsbTargetDeviceCreateWdfUsbTargetDeviceCyclePortSynchronouslyWdfUsbTargetDeviceFormatRequestForControlTransferWdfUsbTargetDeviceFormatRequestForCyclePortWdfUsbTargetDevitceFormatRequestForStringWdfUsbTargetDeviceFormatRequestForUrbWdfUsbTargetDeviceGetDeviceDescriptorWdfUsbTargetDeviceGetInterfaceWdfUsbTargetDevicetNumInterfacesWdfUsbTargetDeviceIsConnectedSynchronousWdfUsbTargetDeviceQueryStringWdfUsbTargetDeviceResetPortSynchronouslyWdfUsbTargetDeviceRetrieveConfigDescriptorWdfUsbTargetDeviceRetrieveCurrentFrameNumberWdfUsbTargetDeviceRetrieveInformationWdfUsbTargetDeviceSelectConfigWdfUsbTargetDeviceSendControlTransferSynchronouslyWdfUsbTargetDeviceSendUrbSynchronouslyWdfUsbTargetDeviceWdmGetConfigurationHandleWdfUsbTargetPipeAbortSynchronouslyWdfUsbTargetPipeConfigContinuousReaderWdfUsbTargetPipeFormatRequestForAbortWdfUsbTargetPipeFormatRequestForReadWdfUsbTargetPipeFormatRequestForResetWdfUsbTargetPipeFormatRequestForUrbWdfUsbTargetPipeFormatRequestForWriteWdfUsbTargetPipeGetInformationWdfUsbTargetPipeGetTypeWdfUsbTargetPipeIsInEndpointWdfUsbTargetPipeIsOutEndpointWdfUsbTargetPipeReadSynchronouslyWdfUsbTargetPipeResetSynchronouslyWdfUsbTargetPipeSendUrbSynchronouslyWdfUsbTargetPipeSetNoMaximumPacketSizeCheckWdfUsbTargetPipeWdmGetPipeHandleWdfUsbTargetPipeWriteSynchronously