IrpTracking 规则集 (WDM)

使用这些规则可以验证驱动程序是否正确跟踪 I/O 请求数据包(IRP),以便在 IRP 未完成时不删除设备。

本节内容

主题 说明

IoReleaseRemoveLockAndWaitOutsideRemoveDevice

IoReleaseRemoveLockAndWaitOutsideRemoveDevice 规则指定不应在具有 PnP 驱动程序IRP_MN_REMOVE_DEVICE IRP_MJ_PNP外部调用 IoReleaseRemoveLockAndWait

NsRemoveLockMnRemove

NsRemoveLockMnRemove 规则验证驱动程序在使用 MinorFunction IRP_MN_REMOVE_DEVICE处理IRP_MJ_PNP时不会返回STATUS_NOT_SUPPORTED。 此规则仅适用于 FDO 和 FIDO 驱动程序。

NsRemoveLockMnSurpriseRemove

NsRemoveLockMnSurpriseRemove 规则验证驱动程序在使用 minorFunction IRP_MN_SUPRI标准版_REMOVAL 处理IRP_MJ_PNP请求时是否不返回STATUS_NOT_SUPPORTED。 此规则仅适用于 FDO 和 FIDO 驱动程序。

NsRemoveLockQueryMnRemove

NsRemoveLockQueryMnRemove 规则验证驱动程序在使用 MinorFunction IRP_MN_QUERY_REMOVE 处理IRP_MJ_PNP时不会返回STATUS_NOT_SUPPORTED。 此规则仅适用于 FDO 和 FIDO 驱动程序。

RemoveLock

RemoveLock 规则指定正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。 此外,在IRP_MJ_PNP或IRP_MJ_POWER例程结束时,驱动程序不应保留 RemoveLock

RemoveLockCheck

RemoveLockCheck 规则验证在使用 MinorFunction IRP_MN_REMOVE_DEVICE 处理IRP_MJ_PNP时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLockAndWait 的调用。

RemoveLockForward

RemoveLockForward 规则验证将 IRP 转发到另一台设备时,是否正确使用了对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForward2

RemoveLockForward2 规则验证在将 IRP 转发到另一台设备时正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardDeviceControl

RemoveLockForwardDeviceControl 规则验证当驱动程序使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardDeviceControl2

RemoveLockForwardDeviceControl2 规则验证当驱动程序使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用。

RemoveLockForwardDeviceControlInternal

RemoveLockForwardDeviceControlInternal 规则验证在使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardDeviceControlInternal2

RemoveLockForwardDeviceControlInternal2 规则验证在使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardRead

RemoveLockForwardRead 规则验证正确使用了对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardRead2

RemoveLockForwardRead2 规则验证在使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardWrite

RemoveLockForwardWrite 规则验证在使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockForwardWrite2

RemoveLockForwardWrite2 规则验证在使用 IoCallDriver 将 IRP 转发到另一台设备时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。

RemoveLockMnRemove

RemoveLockMnRemove 规则验证在使用 MinorFunction IRP_MN_REMOVE_DEVICE处理IRP_MJ_PNP时,是否正确使用了对 IoAcquireRemoveLockIoReleaseRemoveLockAndWait 的调用。

RemoveLockMnRemove2

RemoveLockMnRemove2 规则验证在 IRP 转发到较低驱动程序之前处理IRP_MN_REMOVE_DEVICE请求时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLockAndWait 的调用。

RemoveLockMnSurpriseRemove

RemoveLockMnSurpriseRemove 规则验证在使用 MinorFunction IRP_MN_SUPRI标准版_REMOVAL 处理IRP_MJ_PNP时,是否正确使用了对 IoAcquireRemoveLockIoReleaseRemoveLockAndWait 的调用。 驱动程序应在将 IRP 转发到堆栈之前获取删除锁。

RemoveLockQueryMnRemove

RemoveLockQueryMnRemove 规则验证在使用 MinorFunction IRP_MN_QUERY_REMOVE_DEVICE处理IRP_MJ_PNP时,正确使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。 驱动程序应在将 IRP 转发到堆栈之前获取删除锁。

RemoveLockRelease2

规则 RemoveLockRelease2 验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseCleanup

RemoveLockReleaseCleanup 规则指定在严格交替中使用对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用。 每次对 IoAcquireRemoveLock 的调用都必须具有对 IoReleaseRemoveLock 的匹配调用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseClose

规则 RemoveLockReleaseClose 验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseCreate

RemoveLockReleaseCreate 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseDeviceControl

RemoveLockReleaseDeviceControl 规则验证对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseInternalDeviceControl

RemoveLockReleaseInternalDeviceControl 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleasePnp

RemoveLockReleasePnp 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleasePower

RemoveLockReleasePower 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseRead

RemoveLockReleaseRead 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseShutdown

RemoveLockReleaseShutdown 规则验证对 IoAcquireRemoveLockIoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseSystemControl

RemoveLockReleaseSystemControl 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

RemoveLockReleaseWrite

RemoveLockReleaseWrite 规则验证对 IoAcquireRemoveLock IoReleaseRemoveLock 的调用是否在严格交替中使用。 此外,在调度例程结束时,驱动程序不应保留删除锁。

选择 IrpTracking 规则集

  1. 在 Microsoft Visual Studio 中选择驱动程序项目(.vcxProj)。 在 “驱动程序 ”菜单中,单击“ 启动静态驱动程序验证程序...”

  2. 单击“规则”选项卡。在“规则集”下,选择“IrpTracking”。

    若要从 Visual Studio 开发人员命令提示符窗口中选择默认规则集,请使用 /检查 选项指定 IrpTracking.sdv 例如:

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

    有关详细信息,请参阅使用静态驱动程序验证程序查找驱动程序静态驱动程序验证程序命令中的缺陷(MSBuild)。