如果你的公司制造了要针对 Windows Server 2016 进行认证的网络或存储适配器,则存在代码分析 (CA) 和静态驱动程序验证程序 (SDV) 驱动程序源代码错误,这些错误被视为必须修复的错误,以便驱动程序能够针对 Windows Server 2016 成功进行认证。
SDV 用户界面专门针对 NDIS 和网络相关的接口调用突出显示这些错误,这些调用不正确且被视为必须修复项,以便驱动程序能够针对 Windows Server 2016 进行认证。 同时还计划执行存储接口调用,但目前此功能不完善。
CA 用户界面当前不会突出显示它在网络和存储驱动程序源中检测到的错误,这些源存在错误且被视为必须修复项,以便驱动程序能够针对 Windows Server 2016 进行认证。 这项工作计划在 CA 工具的未来版本中进行。
为了使驱动程序能够对 Windows Server 2016 进行认证,已选择用于将网络和存储适配器驱动程序作为必须修复项的 SDV 和 CA 规则条件如下:
- 准确度 – 规则发现错误的误报率较低
- 影响 – 代码错误可能导致数据损坏、挂起或崩溃
- 数据驱动 – 代码错误导致驱动程序崩溃,并作为 Microsoft 联机崩溃分析工具 (OCA) 的一部分进行分析。
- 体验 – 代码错误是 Microsoft 使用的内部栏中包含的错误,具有高影响度和始终要修复的安全问题
- 最少注释 – 对驱动程序源的注释的依赖性很低,以便使 CA 和 SDV 工具正常运行。 但请注意,某些注释是必需的。
对于所有其他规则,可以通过在 MSDN 上进行搜索来查找链接。
为方便起见,链接中有一小段文本,但链接本身通常包含关于正确和错误用法的更多文本和代码示例,以说明所需的更改。
C6001:USING UNINITIALIZED MEMORY
如果在为未初始化的局部变量分配值之前使用了该变量,则会报告此警告。 这可能导致不可预测的结果。
C6011:DEREFERENCING A NULL POINTER
此警告表明正在取消引用空指针。 如果该指针的值无效,则结果是未定义的。
C6014:LEAKING MEMORY
此警告表明指定的指针指向已分配的内存或一些其他尚未释放的已分配资源。
C6063:MISSING_STRING_ARGUMENT_TO_FORMAT_FUNCTION
此问题可能导致故障和缓冲区溢出(如果调用的函数属于 sprintf 系列),还可能导致不正确的输出。
C6214:CAST_HRESULT_TO_BOOL
使用布尔变量来测试 HRESULT 成功还是失败的任何比较都可能导致不正确的结果。
C6215:CAST_BOOL_TO_HRESULT
将布尔类型转换为 HRESULT,然后在测试表达式中使用它会产生不正确的结果。
C6216:COMPILER_INSERTED_CAST_BOOL_TO_HRESULT
对于返回布尔值为 false 的函数,典型失败值是作为 HRESULT 进行测试时的成功状态。 这可能会导致不正确的结果。
C6230:USING_HRESULT_IN_BOOLEAN_CONTEXT
此警告表明正在应出现布尔值结果的上下文(例如 if 语句)中使用裸机 HRESULT。 这可能会产生不正确的结果。
C6248:CREATINGNULLDACL
此警告标识一个调用,该调用将 SECURITY_DESCRIPTOR 的 DACL 字段设置为 NULL,这会向请求该字段的任何用户授予完全访问权限;不对该对象执行常规安全检查。 具有 NULL DACL 的对象的安全描述符可能会被恶意用户更改,这样任何人都无法访问该对象。
C6259:DEADCODEINBITORLIMITEDSWITCH
此警告表明 switch 表达式中按位“与”(&) 比较的结果导致代码无法访问
C6260:USEOFBYTEAREA
此警告表明两个 sizeof 操作的结果已相乘。
C6268:MISPARENTHESIZED_CASTS
此警告表明复杂的 cast 表达式在执行指针算术时可能会涉及优先问题。 在某些情况下,此问题会导致不正确的行为或程序故障。
C6276:CHAR_TO_WCHAR_CAST
此警告表明可能存在从 ANSI 字符串 (char_t*) 强制转换为 UNICODE 字符串 (wchar_t *) 的不正确行为。 将此类字符串与 wcs* 函数库结合使用可能会导致缓冲区溢出和访问冲突。
C6277:CREATEPROCESS_ESCAPE
此警告指示应用程序名称参数为 null 且可执行文件路径名称中可能有空格。 恶意用户可能早前在路径中插入同名的欺诈性可执行文件。
C6281:BITWISERELATIONPRECEDENCEERROR
此警告表明运算符优先级可能存在错误。 这可能会产生不正确的结果。
C6282:ASSIGNMENTREPLACESTEST
此警告表明在测试上下文中检测到了向变量分配常量。
C6284:OBJECT_AS_STRING_ARGUMENT_TO_FORMAT_FUNCTION
此警告表明格式字符串指定了字符串(例如 printf 或 scanf 的 %s 规范),但已传递 C++ 对象。
C6287:REDUNDANTTEST
此警告表明在表达式中检测到了冗余元素。
C6288:MUTUALINCLUSIONOVERANDISFALSE
此警告表明在测试表达式中,正在针对两个不同的常量测试变量,结果取决于两个条件都为 true。
C6289:MUTUALEXCLUSIONOVERORISTRUE
此警告表明在测试表达式中,正在针对两个不同的常量测试变量,结果取决于两个条件中的任一条件为 true。 此值始终为 true。
C6290:LOGICALNOTBITWISEAND
此警告表明在使用运算符或运算符优先级时可能出现混淆。
C6291:LOGICALNOTBITWISEOR
此 ! 运算符产生布尔值结果,而 |(按位“或”)运算符采用两个算术参数。 在不检查代码的情况下,很难判断此问题的严重性
C6293:LOOP_INDEX_GOES_NEGATIVE
此警告表明 for 循环可能不按预期运行。
C6295:INFINITE_LOOP
MSDN 中没有链接
C6296:LOOP_ONLY_EXECUTED_ONCE
此警告表明 for 循环可能不按预期运行
C6299:BITFIELD_TO_BOOL_COMPARISON
此警告表明布尔值与位域等效这一假设不正确。 该比较会产生意外的结果。
C6305:SIZEOF_COUNTOF_MISMATCH
这将导致指针算术的意外缩放。
C6306:INCORRECT_VARARG_FUNCTIONCALL
此警告表明函数调用不正确。
C6308:REALLOCLEAK
此警告表明出现了由于 reallocation 函数使用不当导致的内存泄漏。
C6312:EXCEPTIONCONTINUEEXECUTION
此警告表明在使用常量 EXCEPTION_CONTINUE_EXECUTION。 这可能会导致无限循环。
C6318:EXCEPTIONCONTINUESEARCH
此警告表明,如果此结构化异常处理程序的受保护块中发生异常,则将不会处理此异常,因为在异常筛选器表达式中使用了常量 EXCECPTION_CONTINUE_SEARCH。 此代码等效于不具有异常处理程序块的受保护块,因为未执行处理程序块。
C6328:FORMAT_SIZE_MISMATCH
对于系列名称 isxxx() 中的 C 运行时基于字符例程,传递类型为 char 的参数可能会导致不可预测的结果。
C6384:DIVIDING_SIZEOF_POINTER
此警告表明大小计算可能不正确。
C26110:FAILING TO HOLD LOCK BEFORE CALLING FUNCTION
MSDN 中没有链接
C28126:OBJ_REFERENCE_MODE
驱动程序正在为 AccessMode 参数传递 UserMode 或 KernelMode,而不是使用 Irp->RequestorMode。
C28128:FUNCTION_ASSIGNMENT
驱动程序直接访问了应仅通过使用专用函数访问的结构成员。
C28134:POOL_TAG
MSDN 中没有链接
C28135:KE_WAIT_LOCAL
如果 KeWaitForSingleObject 的第一个参数是局部变量,则 Mode 参数必须是 KernelMode
C28145:MODIFYING_MDL
驱动程序不应修改不透明的 MDL 结构
C28157:IRQL_NOT_USED
函数完成时,至少有一个路径可供驱动程序以不同的 IRQL 在其中执行。
C28158:IRQL_NOT_SET
至少有一个路径中的 IRQL 值未保存在该变量中。
C28163:MUST_NOT_TRY
当在 try/except 块中发现某一函数,但其类型绝不应位于 try/except 块中时,将报告此警告。
C28164:PVOID
当调用应采用指向对象的指针的函数时,如果使用指向指针的指针,则将报告此警告。
C28170:NO_PAGED_CODE
该函数已声明位于分页段中,但未找到PAGED_CODE 和 PAGED_CODE_LOCKED 函数
C28171:MULTIPLE_PAGED_CODE
该函数具有 PAGED_CODE 或 PAGED_CODE_LOCKED 的多个实例
C28719:BANNED_API_USAGE
此警告表明正在使用的函数已被禁止,并且具有更可靠且更安全的替换选项。
C28726:BANNED_API_USAGEL2
此警告表明正在使用的函数已被禁止,并且具有更可靠且更安全的替换选项。
C28735:BANNED_CRIMSON_API_USAGE
此警告表明正在使用的函数已被禁止,并且具有更可靠且更安全的替换选项。 ETW 是替代项
C28736:BANNED_API_ARGUMENT_USAGE
此警告表明正在使用的函数已被禁止,并且具有更可靠且更安全的替换选项。 ETW 是替代项
C28750:BANNED_API_USAGE_LSTRLEN
此警告表明正在使用的函数已被禁止,并且具有更好的替换选项。
C28751:BANNED_API_USAGE_EXALLOCATEPOOL
禁止使用 ExAllocatePool 及其变体。 此警告表明正在使用的函数已被禁止,并且具有更可靠且更安全的替换选项。
以下 CA 输出本身不是错误,而是指示需要一些注释的地方,以便静态驱动程序验证程序尽可能正常运行。
C28168:
此警告通过检查分配到调度表中的每个函数是否带有一个或多个 _Dispatch_type_ 批注,为静态驱动程序验证程序提供支持
C28169:
此警告通过检查分配到调度表中的每个函数是否带有一个或多个 _Dispatch_type_ 批注,为静态驱动程序验证程序提供支持
C28101:
驱动程序模块已推断出当前函数是 <function-type> 函数
C28022:
此函数上的函数类与用于定义它的 typedef 的函数类不匹配。
C28023:
要分配或传递的函数应具有针对至少一个类的 _Function_class_ 批注
C28024:
要分配到的函数指针是用函数类批注的,它未包含在函数类列表中。
C28155:
未使用正确的角色类型声明驱动程序例程
C28208:
函数签名与函数声明不匹配
DoubleComplete
DoubleComplete 规则指定 NDIS 驱动程序不得多次完成对象标识符 (OID) 请求。
DoubleCompleteWorkItem
DoubleCompleteWorkItem 规则指定当工作项延迟完成时,NDIS 驱动程序不得多次完成 OID 请求。
Init_DeRegisterInterrupt
Init_DeRegisterInterrupt 规则指定,如果在 MPInitilize 期间至少调用一次 NdisMRegisterInterruptEx,则 NdisMDeregisterInterruptEx 应在 MPHaltEx 中至少调用一次。
Init_NdisAllocateIoWorkItem
Init_NdisAllocateIoWorkItem 规则指定,如果在 MiniportInitializeEx 期间至少调用一次 NdisAllocateIoWorkItem,则 NdisFreeIoWorkItem 函数应:
- 至少在 MPHaltEx 中调用一次(如果 MiniportInitializeEx 成功)
- 在 MiniportInitializeEx 中调用(如果 MiniportInitializeEx 失败)
Init_RegisterInterrupt
Init_RegisterInterrupt 规则指定,如果初始化过程中或微型端口驱动程序停止期间出现问题,则必须撤消通常在初始化期间发生的中断注册。 如果在 MiniportInitializeEx 期间至少调用一次 NdisMRegisterInterruptEx,则必须在 MiniportHaltEx 中至少调用一次 NdisMDeregisterInterruptEx 函数。
Init_RegisterSG
Init_RegisterSG 规则指定,如果初始化过程中或微型端口驱动程序停止期间出现问题,则必须撤消通常在初始化期间发生的分散收集列表 (SG) 注册。 如果在 MiniportInitializeEx 期间至少调用一次 NdisMRegisterScatterGatherDma,则应在 MiniportHaltEx 中至少调用一次 NdisMDeregisterScatterGatherDma 函数。
Irql_CallManager_Function
Irql_CallManager_Function 规则指定必须在正确的 IRQL 级别调用 NDIS CallManager 的 NDIS 函数。 此规则检查以下 NDIS 函数:
- NdisCmActivateVc
- NdisCmAddPartyComplete
- NdisCmCloseAddressFamilyComplete
- NdisCmCloseCallComplete
- NdisCmDeactivateVc
- NdisCmDeregisterSapComplete
- NdisCmDispatchCallConnected
- NdisCmDispatchIncomingCall
- NdisCmDispatchIncomingCallQoSChange
- NdisCmDispatchIncomingCloseCall
- NdisCmDispatchIncomingDropParty
- NdisCmDropPartyComplete
- NdisCmMakeCallComplete
- NdisCmModifyCallQoSComplete
- NdisCmNotifyCloseAddressFamily
- NdisCmOpenAddressFamilyComplete
- NdisCmRegisterAddressFamilyEx
- NdisCmRegisterSapComplete
Irql_Connection_Function
Irql_Connection_Function 规则指定必须在正确的 IRQL 级别调用协议驱动程序的 NDIS 连接函数。 此规则验证以下 NDIS 函数:
- NdisCoAssignInstanceName
- NdisCoCreateVc
- NdisCoDeleteVc
- NdisCoGetTapiCallId
- NdisCoOidRequest
- NdisCoOidRequestComplete
- NdisCoSendNetBufferLists
Irql_Filter_Driver_Function
Irql_Filter_Driver_Function 规则指定必须在正确的 IRQL 级别调用筛选器驱动程序的 NDIS 函数。 筛选器驱动程序的 NDIS 函数包括以下项:
- NdisFRegisterFilterDriver
- NdisFDeregisterFilterDriver
- NdisFSetAttributes
- NdisFRestartFilter
- NdisFRestartComplete
- NdisFPauseComplete
- NdisFSendNetBufferLists
- NdisFReturnNetBufferLists
- NdisFSendNetBufferListsComplete
- NdisFCancelSendNetBufferLists
- NdisFIndicateReceiveNetBufferLists
- NdisFNetPnPEvent
- NdisFDevicePnPEventNotify
- NdisEnumerateFilterModules
Irql_Gather_DMA_Function
Irql_Gather_DMA_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 分散/聚合 DMA 函数。 此规则验证以下 NDIS 函数:
- NdisMAllocateNetBufferSGList
- NdisMAllocateSharedMemoryAsyncEx
- NdisMDeregisterScatterGatherDma
- NdisMFreeNetBufferSGList
- NdisMRegisterScatterGatherDma
Irql_IM_Function
Irql_IM_Function 规则指定必须在正确的 IRQL 级别调用中间 (IM) 驱动程序的 NDIS 函数。 此规则验证以下 NDIS 函数:
- NdisIMAssociateMiniport
- NdisIMCancelInitializeDeviceInstance
- NdisIMDeInitializeDeviceInstance
- NdisIMGetBindingContext
- NdisIMInitializeDeviceInstanceEx
Irql_Interfaces_Function
Irql_Interfaces_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 网络接口函数。 此规则验证以下 NDIS 网络接口函数:NdisIfAddIfStackEntry
- NdisIfAllocateNetLuidIndex
- NdisIfDeleteIfStackEntry
- NdisIfDeregisterInterface
- NdisIfDeregisterProvider
- NdisIfFreeNetLuidIndex
- NdisIfGetInterfaceIndexFromNetLuid
- NdisIfGetNetLuidFromInterfaceIndex
- NdisIfQueryBindingIfIndex
- NdisIfRegisterInterface
- NdisIfRegisterProvider
Irql_Interrupt_Function
Irql_Interrupt_Function 规则指定必须在正确的 IRQL 级别调用用于中断的 NDIS 函数。 此规则验证以下 NDIS 函数:
- NdisMDeregisterInterruptEx
- NdisMRegisterInterruptEx
Irql_IrqlSetting_Function
Irql_IrqlSetting_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 中断宏。 此规则验证以下 NDIS 宏:
- NDIS_LOWER_IRQL
- NDIS_RAISE_IRQL_TO_DISPATCH”
Irql_MCM_Function
Irql_MCM_Function 规则指定必须在正确的 IRQL 级别调用驱动程序的 NDIS MCM 函数。
Irql_MCO_Function
Irql_MCO_Function 规则指定必须在正确的 IRQL 级别调用微型端口驱动程序的 NDIS MCO DDI。
Irql_Miniport_Driver_Function
Irql_Miniport_Driver_Function 规则指定必须在正确的 IRQL 级别调用微型端口驱动程序的 NDIS 函数。 此规则验证 NDIS 微型端口驱动程序日志记录、NDIS 端口和 NDIS DMA 接口的函数:
- NdisMCreateLog
- NdisMDeregisterDmaChannel
- NdisMDeregisterIoPortRange
- NdisMDeregisterMiniportDriver
- NdisMFlushLog
- NdisMFreePort
- NdisMFreeSharedMemory
- NdisMGetDeviceProperty
- NdisMGetDmaAlignment
- NdisMMapIoSpace
- NdisMPauseComplete
- NdisMQueryAdapterInstanceName
- NdisMReadDmaCounter
- NdisMRegisterDmaChannel
- NdisMRegisterIoPortRange
- NdisMRegisterMiniportDriver
- NdisMRemoveMiniport
- NdisMResetComplete
- NdisMRestartComplete
- NdisMSetMiniportAttributes
- NdisMSetupDmaTransfer
- NdisMSleep
- NdisMUnmapIoSpace
- NdisMUpdateSharedMemory
- NdisMWriteLogData
Irql_Miscellaneous_Function
Irql_Miscellaneous_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 函数。 此规则验证以下函数:
- KeGetCurrentProcessorNumber
- NdisAllocateFromNPagedLookasideList
- NdisAllocateGenericObject
- NdisAllocateIoWorkItem
- NdisAllocateMemoryWithTagPriority
- NdisAnsiStringToUnicodeString
- NdisCloseConfiguration
- NdisCloseFile
- NdisDeleteNPagedLookasideList
- NdisDeregisterDeviceEx
- NdisEqualMemory
- NdisEqualUnicodeString
- NdisFreeGenericObject
- NdisFreeIoWorkItem
- NdisFreeMemory
- NdisFreeSpinLock
- NdisFreeString
- NdisFreeToNPagedLookasideList
- NdisGeneratePartialCancelId
- NdisGetCurrentProcessorCounts
- NdisGetDriverHandle
- NdisGetRoutineAddress
- NdisGetSharedDataAlignment
- NdisGetVersion
- NdisInitAnsiString
- NdisInitializeListHead
- NdisInitializeNPagedLookasideList
- NdisInitializeSListHead
- NdisInitializeString
- NdisInitUnicodeString
- NdisMapFile
- NdisOpenConfigurationEx
- NdisOpenConfigurationKeyByIndex
- NdisOpenConfigurationKeyByName
- NdisOpenFile
- NdisQueryAdapterInstanceName
- NdisQueryDepthSList
- NdisQueueIoWorkItem
- NdisReadConfiguration
- NdisReadNetworkAddress
- NdisReEnumerateProtocolBindings
- NdisSetOptionalHandlers
- NdisSystemProcessorCount
- NdisUnicodeStringToAnsiString
- NdisUnmapFile
- NdisUpcaseUnicodeString
- NdisWaitEvent
- NdisWriteConfiguration
- NdisWriteErrorLogEntry
- NdisWriteEventLogEntry
Irql_NetBuffer_Function
Irql_NetBuffer_Function 规则指定必须在正确的 IRQL 级别调用与 NET_BUFFER 相关的函数。 此规则验证以下 NDIS 函数:
- NdisAdvanceNetBufferDataStart
- NdisAdvanceNetBufferListDataStart
- NdisAllocateCloneNetBufferList
- NdisAllocateFragmentNetBufferList
- NdisAllocateMdl
- NdisAllocateNetBuffer
- NdisAllocateNetBufferAndNetBufferList
- NdisAllocateNetBufferList
- NdisAllocateNetBufferListContext
- NdisAllocateNetBufferListPool
- NdisAllocateNetBufferMdlAndData
- NdisAllocateNetBufferPool
- NdisAllocateReassembledNetBufferList
- NdisCopyFromNetBufferToNetBuffer
- NdisCopyReceiveNetBufferListInfo
- NdisCopySendNetBufferListInfo
- NdisFreeCloneNetBufferList
- NdisFreeFragmentNetBufferList
- NdisFreeMdl
- NdisFreeNetBuffer
- NdisFreeNetBufferList
- NdisFreeNetBufferListContext
- NdisFreeNetBufferListPool
- NdisFreeNetBufferPool
- NdisFreeReassembledNetBufferList
- NdisGetDataBuffer
- NdisGetMdlPhysicalArraySize
- NdisGetPoolFromNetBuffer
- NdisGetPoolFromNetBufferList
- NdisQueryMdl
- NdisQueryMdlOffset
- NdisQueryNetBufferPhysicalCount
- NdisRetreatNetBufferDataStart
- NdisRetreatNetBufferListDataStart
Irql_OID_Function
Irql_OID_Function 规则指定必须在正确的 IRQL 级别调用 NDIS OID 请求 DDI。
Irql_Protocol_Driver_Function
Irql_Protocol_Driver_Function 规则指定必须在正确的 IRQL 级别调用 CoNDIS 客户端的 NDIS 函数。 此规则验证以下 NDIS 函数:
- NdisClAddParty
- NdisClCloseAddressFamily
- NdisClCloseCall
- NdisClDeregisterSap
- NdisClDropParty
- NdisClGetProtocolVcContextFromTapiCallId
- NdisClIncomingCallComplete
- NdisClMakeCall
- NdisClModifyCallQoS
- NdisClNotifyCloseAddressFamilyComplete
- NdisClOpenAddressFamilyEx
- NdisCloseAdapterEx
- NdisClRegisterSap
- NdisCompleteBindAdapterEx
- NdisCompleteNetPnPEvent
- NdisCompleteUnbindAdapterEx
- NdisDeregisterProtocolDriver
- NdisMNetPnPEvent
- NdisOpenAdapterEx
- NdisRegisterProtocolDriver
- NdisUnbindAdapter
Irql_SendRcv_Function
Irql_SendRcv_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 驱动程序的发送和接收函数。
Irql_StatusIndication_Function
Irql_StatusIndication_Function 规则指定必须在正确的 IRQL 级别调用微型端口和筛选器驱动程序的 NDIS 状态指示函数。 此规则验证以下 NDIS 函数:NdisFIndicateStatus 和 NdisMIndicateStatusEx
Irql_Synch_Function
Irql_Synch_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 中断和同步 DDI。
Irql_Timer_Function
Irql_Timer_Function 规则指定必须在正确的 IRQL 级别调用 NDIS 计时器服务函数。 此规则验证以下 NDIS 函数:
- NdisAllocateTimerObject
- NdisCancelTimerObject
- NdisFreeTimerObject
- NdisSetTimerObject
MiniportPause_Return
MiniportPause_Return 规则指定 MiniportPause 回调函数在暂停操作完成时仅返回 NDIS_STATUS_SUCCESS,在微型端口驱动程序处于暂停状态时仅返回 NDIS_STATUS_PENDING。 任何其他返回的状态均无效。
NdisAllocateCloneNetBufferList
此规则检查是否按替换顺序调用 NdisAllocateCloneNetBufferList 和 NdisFreeCloneNetBufferList。 最终目标是确保在 MiniportHaltEx 结束时所有 NetBuffer 都是空闲的。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateCloneNetBufferList_InitFail
此规则检查是否按替换顺序调用 NdisAllocateCloneNetBufferList 和 NdisFreeCloneNetBufferList。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateFragmentNetBufferList
此规则检查是否按替换顺序调用 NdisAllocateFragmentNetBufferList 和 NdisFreeFragmentNetBufferList。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateFragmentNetBufferList_InitFail
此规则检查是否按替换顺序调用 NdisAllocateFragmentNetBufferList 和 NdisFreeFragmentNetBufferList。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateFromNPagedLookasideList
此规则检查是否按替换顺序调用 NdisAllocateFromNPagedLookasideList 和 NdisFreeToNPagedLookasideList。 最终目标是确保释放所有 LookasideList。 此规则使用三种不同的状态。 分配或释放并删除 LookasideList 时,状态发生更改。
NdisAllocateFromNPagedLookasideList_InitFail
此规则检查是否按替换顺序调用 NdisAllocateFromNPagedLookasideList 和 NdisFreeToNPagedLookasideList。 最终目标是确保释放所有 LookasideList。 此规则使用三种不同的状态。 分配或释放 LookasideList 条目时,状态发生更改。
NdisAllocateGenericObject
NdisAllocateGenericObject 规则指定以替换顺序调用 NdisAllocateGenericObject 和 NdisFreeGenericObject。 最终目标是确保在 MiniportHaltEx 结束时释放所有泛型对象。 此规则使用三种不同的状态。 分配或释放 NDIS 泛型对象时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NDIS 泛型对象,则规则将失败。
NdisAllocateMdl
NdisAllocateMdl 规则指定按替换顺序调用 NdisAllocateMdl 和 NdisFreeMdl。 最终目标是确保在 MiniportHaltEx 结束时释放所有 MDL。 此规则使用三种不同的状态。 分配或释放 MDL 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 MDL,则规则会报告问题。
NdisAllocateMemoryWithTagPriority
NdisAllocateMemoryWithTagPriority 规则指定驱动程序在未提供标记的情况下不得调用 NdisAllocateMemoryWithTagPriority。 每个内存分配都应使用唯一的池标记,以确保内核调试程序和驱动程序验证程序能够识别不同的已分配内存块。
NdisAllocateMemoryWithTagPriority_Cleanup
此规则检查是否按替换顺序调用 NdisAllocateMemoryWithTagPriority 和 NdisFreeMemoryWithTagPriority 或 NdisFreeMemory。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateMemoryWithTagPriority_InitFail
此规则检查是否按替换顺序调用 NdisAllocateMemoryWithTagPriority 和 NdisFreeMemoryWithTagPriority 或 NdisFreeMemory。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateNetBuffer
NdisAllocateNetBuffer 规则指定按替换顺序调用 NdisAllocateNetBuffer 和 NdisFreeNetBuffer。 最终目标是确保在 MiniportHaltEx 结束时释放 NET_BUFFER 的所有实例。 此规则使用三种不同的状态。 分配或释放 NET_BUFFER 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NET_BUFFER,则规则会报告问题。
NdisAllocateNetBufferList
此规则检查是否按替换顺序调用 NdisAllocateNetBufferList 和 NdisFreeNetBufferList。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。
NdisAllocateNetBufferList2
此规则检查是否按替换顺序调用 NdisAllocateNetBufferList 和 NdisFreeNetBufferList。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateNetBufferList2_InitFail
此规则检查是否按替换顺序调用 NdisAllocateNetBufferList 和 NdisFreeNetBufferList。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateNetBufferListPool
此规则检查是否按替换顺序调用 NdisAllocateNetBufferListPool 和 NdisFreeNetBufferListPool。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateNetBufferListPool_InitFail
此规则检查是否按替换顺序调用 NdisAllocateNetBufferListPool 和 NdisFreeNetBufferListPool。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateNetBufferList_InitFail
此规则检查是否按替换顺序调用 NdisAllocateNetBufferAndNetBufferList 和 NdisFreeNetBufferList。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer。
NdisAllocateNetBufferMdlAndData
此规则检查是否按替换顺序调用 NdisAllocateNetBufferMdlAndData 和 NdisFreeNetBuffer。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateNetBufferMdlAndData_InitFail
此规则检查是否按替换顺序调用 NdisAllocateNetBufferMdlAndData 和 NdisFreeNetBuffer。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateNetBufferPool
此规则检查是否按替换顺序调用 NdisAllocateNetBufferPool 和 NdisFreeNetBufferListPool。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateNetBufferPool_InitFail
此规则检查是否按替换顺序调用 NdisAllocateNetBufferPool 和 NdisFreeNetBufferListPool。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisAllocateReassembledNetBufferList
此规则检查是否按替换顺序调用 NdisAllocateReassembledNetBufferList 和 NdisFreeReassembledNetBufferList。 最终目标是确保在 MiniportHaltEx 结束时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。 如果在 MiniportHaltEx 退出时仍分配了 NetBuffer,则规则将失败。
NdisAllocateReassembledNetBufferList_InitFail
此规则检查是否按替换顺序调用 NdisAllocateReassembledNetBufferList 和 NdisFreeReassembledNetBufferList。 最终目标是确保在初始化函数失败时释放所有 NetBuffer。 此规则使用三种不同的状态。 分配或释放 NetBuffer 时,状态发生更改。如果在初始化函数失败时仍分配 NetBuffer,则此规则将报告问题。
NdisFDeregisterFilterDriver
筛选器驱动程序必须从其 FilterDriverUnload 例程中调用 NdisFDeregisterFilterDriver。
NdisMDeregisterInterruptEx
NdisMDeregisterInterruptEx 返回控件后,微型端口驱动程序无法调用 NdisMSynchronizeWithInterruptEx 函数。
NdisMFreeSharedMemory
无法从 MiniportShutdownEx 函数调用 NdisMFreeSharedMemory。
NdisMIndicateStatusEx
驱动程序在从 MiniportHaltEx 函数返回后不得调用 NdisMIndicateStatusEx。
NdisMMapIoSpace
只能在 MiniportInitializeEx 的上下文中调用 NdisMMapIoSpace 函数。
NdisMNetPnPEventInOIDRequest
此规则检查 NdisMNetPnPEvent 是否未在 OID 请求的上下文中调用。
NdisMRegisterIoPortRange
微型端口驱动程序从其 MiniportInitializeEx 或 MINIPORT_ADD_DEVICE 函数中调用 NdisMRegisterIoPortRange。 在调用 NdisMRegisterIoPortRange 之前,MiniportInitializeEx 或 MINIPORT_ADD_DEVICE 必须调用 NdisMSetMiniportAttributes。
NdisOpenConfigurationEx
此规则检查是否按替换顺序调用 NdisOpenConfigurationEx 和 NdisCloseConfiguration。 最终目标是确保在 MiniportHaltEx 退出时关闭配置句柄。 此规则使用三种不同的状态。 打开或关闭配置时,状态发生更改。 如果在 MiniportHaltEx 退出时配置句柄仍处于打开状态,则会报告问题。
NdisQueryBindInstanceName
NdisQueryBindInstanceName 为指定易记名称的字符串分配内存。 调用方使用此内存后,必须调用 NdisFreeMemory 函数以释放内存。
NdisReEnumerateProtocolBindings
协议驱动程序无法从 ProtocolBindAdapterEx 或 ProtocolUnbindAdapterEx 函数的上下文中调用 NdisReEnumerateProtocolBindings。 此外,如果 ProtocolNetPnPEvent 的 ProtocolBindingContext 参数不为 NULL,则协议驱动程序无法从 ProtocolNetPnPEvent 函数的上下文中调用 NdisReEnumerateProtocolBindings。 但是,如果 ProtocolBindingContext 为 NULL,则协议驱动程序可以从 ProtocolNetPnPEvent 的上下文中调用 NdisReEnumerateProtocolBindings。 NULL ProtocolBindingContext 值表示事件适用于所有绑定。
PeriodicTimer
PeriodicTimer 规则指定如果在 NdisSetTimerObject 函数的 MillisecondsPeriod 参数中指定了非零值,则 NdisCancelTimerObject 的调用方必须在 IRQL = PASSIVE_LEVEL 时运行。 如果 NdisSetTimerObject 函数的 MillisecondsPeriod 参数为零,则 NdisCancelTimerObject 的调用方可以在 IRQL <= DISPATCH_LEVEL 时运行。
Irqlapclte
IrqlApcLte 规则指定仅当驱动程序在 IRQL <= APC_LEVEL 的情况下执行时,才调用 ObGetObjectSecurity 和 ObReleaseObjectSecurity。
Irqldispatch
IrqlDispatch 规则指定仅当驱动程序在 IRQL = DISPATCH_LEVEL 的情况下执行时才调用以下 DDI:
- FreeAdapterChannel、
- FreeMapRegisters、
- GetScatterGatherList、
- IoAllocateAdapterChannel、
- IoAllocateController、
- IoFreeController、
- IoStartNextPacket、
- KeAcquireSpinLockAtDpcLevel、
- KeInsertByKeyDeviceQueue、
- KeInsertDeviceQueue、
- KeReleaseSpinLockFromDpcLevel、
- KeRemoveByKeyDeviceQueue、
- KeRemoveDeviceQueue、
- PutScatterGatherList
Irqlexallocatepool
IrqlExAllocatePool 规则指定仅当驱动程序在 IRQL <= DISPATCH_LEVEL 的情况下执行时,才调用 ExAllocatePoolWithTag 和 ExAllocatePoolWithTagPriority。 在 DISPATCH_LEVEL 中执行的调用方必须为 PoolType 指定 NonPagedXxx 值。 在 IRQL <= APC_LEVEL 时执行的调用方可以指定任何 POOL_TYPE 值。
Irqlexapclte1
IrqlExApcLte1 规则指定驱动程序仅在 IRQL <= APC_LEVEL 时才调用 ExAcquireFastMutex 和 ExTryToAcquireFastMutex。
Irqlexapclte2
IrqlExApcLte2 规则指定驱动程序仅在 IRQL <= APC_LEVEL 时才调用以下例程:
- CmRegisterCallback、
- CmUnRegisterCallback、
- ExAllocateFromPagedLookasideList、
- ExAllocatePoolWithQuota、
- ExAllocatePoolWithQuotaTag、
- ExDeletePagedLookasideList、
- ExFreeToPagedLookasideList、
- ExInitializePagedLookasideList、
- ExRegisterCallback、
- ExSetTimerResolution、
- ExUnregisterCallback、
- ProbeForRead、
- ProbeForWrite
Irqlexapclte3
IrqlExApcLte3 规则指定驱动程序仅在 IRQL <= APC_LEVEL 时才调用以下执行支持例程:
- ExAcquireResourceExclusiveLite、
- ExAcquireResourceSharedLite、
- ExAcquireSharedStarveExclusive、
- ExAcquireSharedWaitForExclusive、
- ExConvertExclusiveToSharedLite、
- ExDeleteResourceLite
具有与 IRQL 相关的错误的驱动程序可能会导致严重问题,并可能导致计算机崩溃。
Irqlexapclteinline
IrqlExApcLteInline 规则指定仅在适当的 IRQL 级别调用 DDI
irqlexpassive
IrqlExPassive 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 时才调用以下执行支持例程:
- ExCreateCallback、
- ExIsProcessorFeaturePresent、
- ExRaiseAccessViolation、
- ExRaiseDatatypeMisalignment、
- ExRaiseStatus、
- ExUuidCreate
IrqlExPassive 规则还指定驱动程序在 IRQL <= APC_LEVEL 时调用 ExRaiseStatus。
irqlioapclte
IrqlIoApcLte 规则指定仅当驱动程序在 IRQL <= APC_LEVEL 的情况下执行时才调用以下 I/O 管理器例程:
- IoDeleteDevice、
- IoGetInitialStack、
- IoRaiseHardError、
- IoRaiseInformationalHardError
irqliodispatch
IrqlIoDispatch 规则指定仅当驱动程序在 IRQL <= DISPATCH_LEVEL 的情况下执行时才调用以下 I/O 管理器例程:
- IoGetDeviceToVerify、
- IoSetDeviceToVerify。
irqliopassive1
IrqlIoPassive1 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用以下例程:
- IoAttachDevice、
- IoCreateDevice、
- IoSetDeviceInterfaceState
此规则还指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 或 IRQL = APC_LEVEL 的情况下执行时才调用以下例程:IoBuildDeviceIoControlRequest
irqliopassive2
IrqlIoPassive2 规则指定驱动程序仅在 IRQL = PASSIVE_LEVEL 时才调用以下 I/O 管理器例程:
- IoCheckShareAccess、
- IoConnectInterrupt、
- IoCreateController
irqliopassive3
IrqlIoPassive3 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用以下例程:
- IoDetachDevice、
- IoAssignArcName、
- IoRegisterDeviceInterface
irqliopassive4
IrqlIoPassive4 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用以下例程:
- IoCreateFile、
- IoCreateNotificationEvent、
- IoCreateSymbolicLink、
- IoCreateSynchronizationEvent、
- IoCreateUnprotectedSymbolicLink、
- IoDeassignArcName、
- IoDeleteController、
- IoDeleteSymbolicLink、
- IoDisconnectInterrupt
irqliopassive5
IrqlIoPassive5 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用特定的 I/O 管理器例程。
irqlkeapclte1
IrqlKeApcLte1 规则指定仅当驱动程序在 IRQL <= APC_LEVEL 的情况下执行时才调用以下内核例程:
- KeAcquireGuardedMutex、
- KeAcquireGuardedMutexUnsafe、
- KeDelayExecutionThread、
- KeQueryActiveProcessors、
- KeReleaseGuardedMutex、
- KeReleaseGuardedMutexUnsafe、
- KeTryToAcquireGuardedMutex
irqlkeapclte2
IrqlKeApcLte2 规则指定仅当驱动程序在 IRQL <= APC_LEVEL 的情况下执行时才调用以下内核例程:
- KeAreAllApcsDisabled、
- KeAreApcsDisabled、
- KeDeregisterNmiCallback、
- KeEnterCriticalRegion、
- KeEnterGuardedRegion、
- KeLeaveCriticalRegion、
- KeLeaveGuardedRegion、
- KeRegisterNmiCallback
irqlkedispatchlte
IrqlKeDispatchLte 规则指定仅当驱动程序在 IRQL <= DISPATCH_LEVEL 的情况下执行时才调用以下内核例程:
- KeAcquireSpinLock、
- KeCancelTimer、
- KeClearEvent、
- KeFlushIoBuffers、
- KeInitializeDeviceQueue、
- KeInitializeTimer、
- KeInitializeTimerEx、
- KePulseEvent、
- KeRaiseIrqlToDpcLevel、
- KeReadStateEvent、
- KeReadStateTimer、
- KeReleaseMutex、
- KeRemoveEntryDeviceQueue、
- KeResetEvent、
- KeSaveFloatingPointState、
- KeSetTimer、
- KeSetTimerEx
irqlkeraiselower
IrqlKeRaiseLower 规则指定在提升和降低 IRQL 时,驱动程序执行以下操作:
当驱动程序调用 KeRaiseIrql 时,它需要在小于或等于 NewIrql 参数值的 IRQL 下执行。
驱动程序仅在调用 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 后才调用 KeLowerIrql。
此规则允许嵌套调用 KeRaiseIrql、KeRaiseIrqlToDpcLevel 和 KeLowerIrql。
irqlkeraiselower2
IrqlKeRaiseLower2 规则指定驱动程序使用 KeLowerIrql 还原通过上一次调用 KeRaiseIrql 或 KeRaiseIrqlToDpcLevel 提升的原始 IRQL。 此规则允许嵌套调用 KeRaiseIrql、KeRaiseIrqlToDpcLevel 和 KeLowerIrql。
irqlkereleasespinlock
IrqlKeReleaseSpinLock 规则指定仅当驱动程序在 IRQL = DISPATCH_LEVEL 的情况下执行时才调用 KeReleaseSpinLock。 此规则还指定在调用 KeReleaseSpinLock 时的 NewIrql 参数值等于在调用 KeAcquireSpinLock 之前执行驱动程序所采用的 IRQL。 (此值也是 KeAcquireSpinLock 提供的 OldIrql 参数值。)
irqlkewaitformultipleobjects
IrqlKeWaitForMultipleObjects 规则指定 KeWaitForMultipleObjects 例程的调用方必须基于 Timeout 参数在适当的 IRQL 下运行。
IrqlKeWaitForMultipleObjects 例程的调用方可在 IRQL <= DISPATCH_LEVEL 的情况下运行,但以下情况除外:
如果 Timeout <> 0,则 KeWaitForMultipleObjects 例程的调用方必须在 IRQL <= APC_LEVEL 的情况下运行。
如果 Timeout != NULL 且 *Timeout = 0,则 KeWaitForMultipleObjects 例程的调用方必须在 IRQL = DISPATCH_LEVEL 的情况下运行。
如果 Timeout = NULL,或 *Timeout != 0,则 KeWaitForMultipleObjects 例程的调用方必须在 IRQL <= APC_LEVEL 的情况下运行。
irqlkewaitformutexobject
IrqlKeWaitForMutexObject 规则指定驱动程序基于 Timeout 参数值在适当的 IRQL 下调用 KeWaitForMutexObject 例程:
如果 Timeout 指向的值为零,则驱动程序将在 IRQL = DISPATCH_LEVEL 的情况下执行。
如果 Timeout 为 NULL,或指向非零的任何值,则驱动程序将在 IRQL <= APC_LEVEL 的情况下执行。
irqlmmapclte
IrqlMmApcLte 规则指定仅当驱动程序在 IRQL <= APC_LEVEL 的情况下执行时才调用以下内存管理器例程:
- MmAllocateNonCachedMemory、
- MmFreeNonCachedMemory、
- MmAllocatePagesForMdl、
- MmFreePagesFromMdl、
- MmLockPagableDataSection、
- MmLockPagableSectionByHandle、
- MmPageEntireDriver、
- MmResetDriverPaging、
- MmSecureVirtualMemory、
- MmUnlockPagableImageSection、
- MmUnsecureVirtualMemory
irqlmmdispatch
IrqlMmDispatch 规则指定仅当驱动程序在 IRQL <= DISPATCH_LEVEL 的情况下执行时才调用 MmFreeContiguousMemory。
irqlobpassive
IrqlObPassive 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用 ObReferenceObjectByHandle。
irqlpspassive
IrqlPsPassive 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用以下处理结构例程:
- PsCreateSystemThread、
- PsGetVersion、
- PsSetCreateProcessNotifyRoutine、
- PsSetCreateThreadNotifyRoutine、
- PsSetLoadImageNotifyRoutine、
- PsTerminateSystemThread
irqlrtlapc
IrqlRtlApc 规则指定仅当驱动程序在 IRQL <= APC_LEVEL 的情况下执行时才调用 RtlCreateUnicodeString。
irqlrtlpassive
IrqlRtlPassive 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用 RtlDeleteRegistryValue。
irqlrtlpassive2
IrqlRtlPassive 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用 Rtl* 函数。
irqlzwpassive
IrqlZwPassive 规则指定仅当驱动程序在 IRQL = PASSIVE_LEVEL 的情况下执行时才调用 ZwClose。
注意 – 必须修复规则基于查看此 URL (https://msdn.microsoft.com/library/windows/hardware/jj126200(v=vs.85).aspx) 中每条规则的信息
HwStorPortProhibitedDDIs
此规则包含不应在物理 Storport 微型端口驱动程序中调用的 WDM DDI(互锁函数除外)的列表。
StorPortDDIsPortOnly
此规则包含不应在 Storport 微型端口中调用的仅 StorPort 端口 DDI(互锁函数除外)的列表。
StorPortDeprecated
此规则指定驱动程序不调用以下任一已弃用的例程:StorPortValidateRange 或 StorPortLogError。
IrqlDispatch
此规则验证以下例程是否仅在 IRQL = DISPATCH_LEVEL 下调用。
IrqlKeReleaseSpinLock
此规则验证 KeReleaseSpinLock 是否在 IRQL = DISPATCH_LEVEL 下调用。 它还必须将 IRQL 设置为以前的 IRQL 级别。 通常,在执行此调用之前会先调用 KeAcquireSpinLock。
SpChangeIrql
此规则验证 StorPort 回调例程是否以调用它们的相同 IRQL 级别返回。
SpIrql
此规则验证 TdiRegisterPnPHandlers 和 TdiDeregisterPnPHandlers 例程是否仅在 IRQL 低于 DISPATCH_LEVEL 的情况下调用。 但是,如果调用 ExFreeToNPagedLookasideList,则规则通过。
StorPortIrql
StorPortIrql 规则检查 StorPort 例程是否是以正确的 IRQL 级别调用的。
CancelSpinLock
CancelSpinLock 规则 (Storport) 规则验证是否在每次调用 IoAcquireCancelSpinLock 后立即调用 IoReleaseCancelSpinLock。
QueuedSpinLock
QueuedSpinLock 规则验证是否使用 KeReleaseInStackQueuedSpinLock 立即释放使用 KeAcquireInStackQueuedSpinLock 获取的堆栈内排队的自旋锁。 此外,在调度结束或取消例程时,驱动程序不应保留任何锁。
QueuedSpinLockRelease
此规则验证驱动程序是否在未首先通过 KeAcquireInStackQueuedSpinLock 获取锁的情况下不会调用 KeReleaseInStackQueuedSpinLock。
SpinLock
此规则验证是否在调用 KeAcquireSpinLock 后立即调用 KeReleaseSpinlock。 如果驱动程序在释放锁之前再次调用 KeAcquireSpinLockRaiseToDpc 或 KeAcquireSpinLock,则该规则将失败。 此外,在退出调度或取消例程之前,驱动程序必须释放自旋锁。
SpinLockDpc
此规则验证是否在调用 KeAcquireSpinLockRaiseToDpc 后立即调用 KeReleaseSpinlock。 如果驱动程序在释放锁之前再次调用 KeAcquireSpinLock 或 KeAcquireSpinLockRaiseToDpc,则该规则将失败。 此外,在退出调度或取消例程之前,驱动程序必须释放自旋锁。
StorPortMSILock
当且仅当 PORT_CONFIGURATION_INFORMATION (Storport) 结构的 InterruptSynchronizationMode 成员设置为 InterruptSynchronizePerMessage 时,微型端口驱动程序才需要获取消息的 MSI 自旋锁。 此规则验证是否仅当同步模式为 InterruptSynchronizePerMessage 时才调用 StorPortAcquireMSISpinLock。
StorPortSpinLock
此规则验证是否通过 StorPortReleaseSpinLock 立即释放通过 StorPortAcquireSpinLock 获取的锁。 如果微型端口驱动程序尝试获取已经获取的锁,或者如果它尝试释放还未获取的锁,则规则将失败。 此外,在调度结束或取消例程时,驱动程序不应保留任何自旋锁。
StorPortSpinLock3
StorPortSpinLock3 规则验证有关 StorPortAcquireSpinLock 例程的文档中描述的锁定获取层次结构。
SpDuplex
此规则验证此微型端口是否处于全双工模式。 根据 StorPort 微型端口模型构建的任何驱动程序都必须处于全双工模式。 仅应在将现有 SCSI 驱动程序移植到 StorPort 时才使用半双工模式。
SpNoWait
此规则验证是否未在 StartIo 内执行等待或数据分配。
SpReturnValue
此规则验证驱动程序的 HwStorFindAdapter 和 VirtualHwStorFindAdapter 实现是否返回有效状态。 有效状态为以下值之一:SP_RETURN_FOUND、SP_RETURN_ERROR、SP_RETURN_BAD_CONFIG 或 SP_RETURN_NOT_FOUND。
StorPortAllocatePool2
此规则验证微型端口对 StorPortAllocatePool 和 StorPortFreePool 的调用次数是否正确。 如果 StorPortAllocatePool 返回失败 (STOR_STATUS_INSUFFICIENT_RESOURCES),则微型端口不能尝试调用 StorPortFreePool。 此外,在退出回调时,对 StorPortAllocatePool 和 StorPortFreePool 的调用次数必须相等。
StorPortBuildIo
此规则验证如果 StorPort 微型端口的 StorPortBuildIo 例程返回 FALSE,则不会将相关的 SRB 传递到 StartIo。 (在这种情况下,微型端口驱动程序必须通过从 StorPortBuildIo 或其他地方调用通知类型为 RequestComplete 的 StorPortNotification 来完成 SRB)。
StorPortCompleteRequest
此规则验证微型端口是否不调用 StorPortCompleteRequest。 不建议使用 StorPortCompleteRequest;微型端口应改为调用 notificationType = RequestComplete 的 StorPortNotification。
StorPortEnablePassive
此规则验证是否不会从 HwInitialize 以外的任何 StorPort 微型端口驱动程序例程中调用 StorPortEnablePassiveInitialization。
StorPortNotification2
此规则验证对 StorPortNotification 的调用是否仅使用允许的(即记录的)通知类型。
StorPortPassiveFromHwInit
如果可以直接从 HW 适配器控件入口点调用 HW 初始化入口点,则不应在 Storport 驱动程序的 HW 初始化入口点中调用 StorPortEnablePassiveInitialization。
StorPortPerfOpts
此规则验证是否传递到 StorPortInitializePerfOpts 的 PerfConfigData 参数不为 NULL。
StorPortStartIo
永远不能在微型端口的 StartIo 例程中执行等待或数据分配。 如果驱动程序调用 StorPortStallExecution 或涉及耗时操作的其他函数,则该规则将失败。 由于 StartIo 已同步,因此这些调用大部分应已在 BuildIo 中完成。
DoubleExFreePool
此规则验证驱动程序是否不会尝试释放两次同一池内存块。
StorPortVirtualDevice
此规则验证是否在退出 HwStorFindAdapter 例程时,PORT_CONFIGURATION_INFORMATION (Storport) 结构中的 VirtualDevice 字段已设置为 FALSE。 此规则仅适用于物理 StorPort 微型端口。
StorPortVirtualDevice2
此规则验证是否在退出 HwStorFindAdapter 例程时,PORT_CONFIGURATION_INFORMATION (Storport) 结构中的 VirtualDevice 字段已设置为 TRUE。 此规则仅适用于虚拟 StorPort 微型端口。
WithinCriticalRegion
此规则验证是否仅当禁用常规内核 APC 传递时驱动程序才调用某些同步函数。














