错误检查 0xC4:DRIVER_VERIFIER_DETECTED_VIOLATION
DRIVER_VERIFIER_DETECTED_VIOLATION 错误检查的值为 0x000000C4。 这是驱动程序验证程序发现的严重错误的常规错误检查代码。 有关详细信息,请参阅启用驱动程序验证程序时处理错误检查。
重要
这篇文章适合程序员阅读。 如果你是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答。
DRIVER_VERIFIER_DETECTED_VIOLATION 参数
参数 1 可确定违规类型。 其余参数的含义随参数 1 的值而变化。 参数值如下表所示。
注意 如果无法查看该表中的所有 5 列,请尝试以下操作:
- 将浏览器窗口扩展到完整大小。
- 将光标放在表中,并使用箭头键向左和向右滚动。
0x00 到 0x70
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x00 | 当前 IRQL | 池类型 | 字节数 | 驱动程序请求零字节池分配。 |
0x01 | 当前 IRQL | 池类型 | 分配的大小(以字节为单位) | 驱动程序尝试使用 IRQL > APC_LEVEL 分配分页内存。 |
0x02 | 当前 IRQL | 池类型 | 分配的大小(以字节为单位) | 驱动程序尝试使用 IRQL > DISPATCH_LEVEL 分配非分页内存。 |
0x03 | 调用方正在尝试分配多个必须成功池的页面,但一个页是该 API 允许的最大值。 | |||
0x10 | 错误地址 | 0 | 0 | 驱动程序试图释放一个没有从分配调用返回的地址。 |
0x11 | 当前 IRQL | 池类型 | 池地址 | 驱动程序尝试使用 IRQL > APC_LEVEL 释放分页池。 |
0x12 | 当前 IRQL | 池类型 | 池地址 | 驱动程序尝试使用 IRQL > DISPATCH_LEVEL 释放非分页池。 |
0x13 或 0x14 | 预留 | 指向池标头的指针 | 池标头内容 | 驱动程序尝试释放已释放的内存池。 |
0x15 | 计时器条目 | 池类型 | 池地址被释放 | 调用方尝试释放的池包含一个活动计时器。 |
0x16 | 预留 | 池地址 | 0 | 驱动程序尝试在错误的地址释放池,或者驱动程序将无效参数传递给内存例程。 |
0X17 | 资源条目 | 池类型 | 池地址被释放 | 调用方尝试释放的池包含一个活动 ERESOURCE。 |
0x30 | 当前 IRQL | 请求的 IRQL | 0 | 驱动程序将无效参数传递给 KeRaiseIrql。 (该参数的值低于当前 IRQL,或者高于 HIGH_LEVEL。这可能是使用未初始化参数的结果。) |
0x31 | 当前 IRQL | 请求的 IRQL | 0:新 IRQL 错误 1:新 IRQL 在 DPC 例程中无效 | 驱动程序将无效参数传递给 KeLowerIrql。 (该参数的值高于当前 IRQL,或者高于 HIGH_LEVEL。这可能是使用未初始化参数的结果。) |
0x32 | 当前 IRQL | 自旋锁地址 | 0 | 驱动程序在除 DISPATCH_LEVEL 以外的 IRQL 上调用 KeReleaseSpinLock。 (这可能是由于自旋锁的双重释放。) |
0x33 | 当前 IRQL | 快速互斥体地址 | 0 | 驱动程序尝试使用 IRQL > APC_LEVEL 获取快速互斥体。 |
0x34 | 当前 IRQL | 线程 APC 禁用计数 | 快速互斥体地址 | 驱动程序尝试在除 APC_LEVEL 以外的 IRQL 上释放快速互斥体。 |
0x35 | 当前 IRQL | 自旋锁地址 | 旧 IRQL | 内核释放了 IRQL 不等于 DISPATCH_LEVEL 的自旋锁。 |
0x36 | 当前 IRQL | 自旋锁编号 | 旧 IRQL | 内核释放了 IRQL 不等于 DISPATCH_LEVEL 的排队自旋锁。 |
0x37 | 当前 IRQL | 线程 APC 禁用计数 | 资源 | 驱动程序试图获取资源,但 APC 未被禁用。 |
0x38 | 当前 IRQL | 线程 APC 禁用计数 | 资源 | 驱动程序试图释放资源,但 APC 未被禁用。 |
0x39 | 当前 IRQL | 线程 APC 禁用计数 | Mutex | 驱动程序试图获取一个“不安全”的互斥体,IRQL 在条目上不等于 APC_LEVEL。 |
0x3A | 当前 IRQL | 线程 APC 禁用计数 | Mutex | 驱动程序试图释放一个“不安全”的互斥体,IRQL 在条目上不等于 APC_LEVEL。 |
0x3B | 当前 IRQL | 要等待的对象 | 超时参数 | 正在以 DISPATCH_LEVEL 或更高级别调用 KeWaitXxx 例程。 |
0x3C | 传递给例程的句柄 | 对象类型 | 0 | 调用 ObReferenceObjectByHandle 的驱动程序的句柄不正确。 |
0x3D | 0 | 0 | 错误资源的地址 | 驱动程序向 ExAcquireResourceExclusive 传递了一个错误(未对齐)资源。 |
0x3E | 0 | 0 | 0 | 对于当前不在临界区的线程,驱动程序调用 KeLeaveCriticalRegion。 |
0x3F | 对象地址 | 新对象引用计数。 -1:取消引用案例 1:引用案例 | 0 | 驱动程序将 ObReferenceObject 应用于引用计数为 0 的对象,或者将 ObDereferenceObject 应用于引用计数为 0 的对象。 |
0x40 | 当前 IRQL | 自旋锁地址 | 0 | 驱动程序使用 IRQL < DISPATCH_LEVEL 调用 KeAcquireSpinLockAtDpcLevel。 |
0x41 | 当前 IRQL | 自旋锁地址 | 0 | 驱动程序使用 IRQL < DISPATCH_LEVEL 调用 KeReleaseSpinLockFromDpcLevel。 |
0x42 | 当前 IRQL | 自旋锁地址 | 0 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 KeAcquireSpinLock。 |
0x51 | 分配的基址 | 超出分配的引用的地址 | 收费字节数 | 驱动程序在写入超过分配结束后试图释放内存。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x52 | 分配的基址 | 哈希条目 | 收费字节数 | 驱动程序在写入超过分配结束后试图释放内存。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x53 | 分配的基址 | 标头 | 预留 | 驱动程序在写入超过分配结束后试图释放内存。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x54 | 分配的基址 | 预留 | 池哈希大小 | 驱动程序在写入超过分配结束后试图释放内存。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x59 | 分配的基址 | Listindex | 预留 | 驱动程序在写入超过分配结束后试图释放内存。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x60 | 从分页池分配的字节数 | 从非分页池分配的字节数 | 未释放的分配总数 | 驱动程序在没有首先释放池分配的情况下正在卸载。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x61 | 从分页池分配的字节数 | 从非分页池分配的字节数 | 未释放的分配总数 | 驱动线程试图在卸载驱动程序时分配池内存。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x62 | 驱动程序的名称 | 预留 | 未释放的分配总数,包括分页池和非分页池 | 驱动程序在没有首先释放池分配的情况下正在卸载。 只有当驱动程序验证程序的“池跟踪”选项处于活动状态时,才会使用此参数进行错误检查。 输入 !verifier 3 drivername.sys,获取有关导致错误检查的泄露分配的信息。 |
0x6F | MDL 地址 | 物理页被锁定 | 系统中最高的物理页面 | 对不在 PFN 数据库中的页面调用 MmProbeAndLockPages。 这通常是一个驱动程序调用这个例程来锁定自己的专用双端口 RAM。 这不仅是不必要的,而且还会损坏具有非连续物理 RAM 的计算机上的内存。 |
0x70 到 0x91
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x70 | 当前 IRQL | MDL 地址 | 访问模式 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 MmProbeAndLockPages。 |
0x71 | 当前 IRQL | MDL 地址 | 进程地址 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 MmProbeAndLockProcessPages。 |
0x72 | 当前 IRQL | MDL 地址 | 进程地址 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 MmProbeAndLockSelectedPages。 |
0x73 | 当前 IRQL | 在 32 位 Windows 中:物理地址的低 32 位 在 64 位 Windows 中:64 位物理地址 | 字节数 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 MmMapIoSpace。 |
0x74 | 当前 IRQL | MDL 地址 | 访问模式 | 驱动程序在内核模式下使用 IRQL > DISPATCH_LEVEL 调用 MmMapLockedPages。 |
0x75 | 当前 IRQL | MDL 地址 | 访问模式 | 驱动程序在用户模式下使用 IRQL > APC_LEVEL 调用 MmMapLockedPages。 |
0x76 | 当前 IRQL | MDL 地址 | 访问模式 | 驱动程序在内核模式下使用 IRQL > DISPATCH_LEVEL 调用 MmMapLockedPagesSpecifyCache。 |
0x77 | 当前 IRQL | MDL 地址 | 访问模式 | 驱动程序在用户模式下使用 IRQL > APC_LEVEL 调用 MmMapLockedPagesSpecifyCache。 |
0x78 | 当前 IRQL | MDL 地址 | 0 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 MmUnlockPages。 |
0x79 | 当前 IRQL | 正在取消映射虚拟地址 | MDL 地址 | 驱动程序在内核模式下使用 IRQL > DISPATCH_LEVEL 调用 MmUnmapLockedPages。 |
0x7A | 当前 IRQL | 正在取消映射虚拟地址 | MDL 地址 | 驱动程序在用户模式下使用 IRQL > APC_LEVEL 调用 MmUnmapLockedPages。 |
0x7B | 当前 IRQL | 正在取消映射虚拟地址 | 字节数 | 驱动程序使用 IRQL > APC_LEVEL 调用 MmUnmapIoSpace。 |
0x7C | MDL 地址 | MDL 标志 | 0 | 驱动程序调用 MmUnlockPages,并传递了一个 MDL,其页面从未成功锁定。 |
0x7D | MDL 地址 | MDL 标志 | 0 | 驱动程序调用 MmUnlockPages,并传递了一个 MDL,其页面来自非分页池。 (这些永远不应该解锁。) |
0x7E | 当前 IRQL | DISPATCH_LEVEL | 0 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 MmAllocatePagesForMdl、MmAllocatePagesForMdlEx 或 MmFreePagesFromMdl。 |
0x7F | 当前 IRQL | MDL 地址 | MDL 标志 | 驱动程序调用 BuildMdlForNonPagedPool,并传递了一个 MDL,其页面来自分页池。 |
0x80 | 当前 IRQL | 事件地址 | 0 | 驱动程序使用 IRQL > DISPATCH_LEVEL 调用 KeSetEvent。 |
0x81 | MDL 地址 | MDL 标志 | 0 | 驱动程序调用 MmMapLockedPages。 (应使用 MmMapLockedPagesSpecifyCache,并将 BugCheckOnFailure 参数设置为 FALSE。) |
0x82 | MDL 地址 | MDL 标志 | 0 | 驱动程序调用 MmMapLockedPagesSpecifyCache,BugCheckOnFailure 参数等于 TRUE。 (此参数应设置为 FALSE。) |
0x83 | 要映射的物理地址范围的开始 | 要映射的字节数 | 未锁定的第一个页帧编号 | 驱动程序调用 MmMapIoSpace ,但没有锁定 MDL 页面。 在进行此调用之前,由要映射的物理地址范围表示的物理页必须已锁定。 |
0x85 | MDL 地址 | 要映射的页数 | 未锁定的第一个页帧编号 | 驱动程序调用 MmMapLockedPages,但没有锁定 MDL 页面。 |
0x89 | MDL 地址 | 指向 MDL 中非内存页的指针 | MDL 中的非内存页码 | MDL 没有标记为“I/O”,但它包含非内存页地址。 |
0x91 | 预留 | 预留 | 预留 | 驱动程序使用操作系统不支持的方法切换堆栈。 扩展内核模式堆栈的唯一支持的方法是使用 KeExpandKernelStackAndCallout。 |
0xA0 到 0x140
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0xA0 | 指向发出读取或写入请求的 IRP 的指针 | 下层设备的设备对象 | 检测到错误的扇区编号 | 在硬盘上检测到循环冗余检查 (CRC) 错误。 只有当驱动程序验证程序的磁盘完整性检查选项处于活动状态时,才会使用此参数进行错误检查。 |
0xA1 | 发出读取或写入请求的 IRP 的副本。 (实际 IRP 已完成)。 | 下层设备的设备对象 | 检测到错误的扇区编号 | 在扇区上检测到 CRC 错误(异步)。 只有当驱动程序验证程序的磁盘完整性检查选项处于活动状态时,才会使用此参数进行错误检查。 |
0xA2 | 发出读取或写入请求的 IRP,或此 IRP 的副本 | 下层设备的设备对象 | 检测到错误的扇区编号 | CRCDISK 校验和副本不匹配。 这可能是分页错误。 只有当驱动程序验证程序的磁盘完整性检查选项处于活动状态时,才会使用此参数进行错误检查。 |
0xB0 | MDL 地址 | MDL 标志 | MDL 标志不正确 | 驱动程序为 MDL 调用 MmProbeAndLockPages,标志不正确。 例如,驱动程序将 MmBuildMdlForNonPagedPool 创建的 MDL 传递给 MmProbeAndLockPages。 |
0xB1 | MDL 地址 | MDL 标志 | MDL 标志不正确 | 驱动程序为 MDL 调用 MmProbeAndLockProcessPages,标志不正确。 例如,驱动程序将 MmBuildMdlForNonPagedPool 创建的 MDL 传递给 MmProbeAndLockProcessPages。 |
0xB2 | MDL 地址 | MDL 标志 | MDL 标志不正确 | 驱动程序为 MDL 调用 MmMapLockedPages,标志不正确。 例如,驱动程序传递的 MDL 已映射到系统地址,或者未锁定到 MmMapLockedPages。 |
0xB3 | MDL 地址 | MDL 标志 | 缺少 MDL 标志(至少应有一个) | 驱动程序为 MDL 调用 MmMapLockedPages,标志不正确。 例如,驱动程序传递了一个未锁定到 MmMapLockedPages 的 MDL。 |
0xB4 | MDL 地址 | MDL 标志 | 意外的部分 MDL 标志 | 驱动程序为部分 MDL 调用了 MmUnlockPages。 部分 MDL 由 IoBuildPartialMdl 创建。 |
0xB5 | MDL 地址 | MDL 标志 | 意外的部分 MDL 标志 | MmUnmapLockedPages 在部分 MDL 上调用(使用 IoBuildPartialMdl 创建)。 |
0xB6 | MDL 地址 | MDL 标志 | 缺少 MDL 标志 | 在未映射到系统地址的 MDL 上调用 MmUnmapLockedPages。 |
0xB7 | 损坏的物理页数。 | 第一个损坏的物理页。 | 最后一个损坏的物理页。 | 系统 BIOS 在休眠转换期间损坏了低物理内存。 |
0xB8 | MDL 地址 | MDL 标志 | 预留 | MDL 描述的页面仍会映射。 驱动程序必须先取消映射页面,然后才能调用 IoFreeMdl。 |
0xB9 | 正在取消映射地址。 | MDL 地址。 | 预留 | 使用错误的用户空间地址调用 MmUnmapLockedPages。 |
0xC0 | IRP 的地址 | 0 | 预留 | 驱动程序调用 IoCallDriver,并禁用中断。 |
0xC1 | 驱动程序调度例程的地址 | 预留 | 预留 | 在中断被禁用的情况下返回了驱动程序调度例程。 |
0xC2 | 0 | 0 | 0 | 中断被禁用后,驱动程序调用快速 I/O 调度例程。 |
0xC3 | 驱动程序快速 I/O 调度例程的地址 | 预留 | 预留 | 在中断被禁用的情况下,返回了驱动程序快速 I/O 调度例程。 |
0xC5 | 驱动程序调度例程的地址 | 当前线程的 APC 禁用计数 | 在调用驱动程序调度例程之前,线程的 APC 禁用计数 | 驱动程序调度例程已更改线程的 APC 禁用计数。 每次驱动程序调用 KeEnterCriticalRegion、FsRtlEnterFileSystem 或获取互斥体时,APC 禁用计数都会递减。 每次驱动程序调用 KeLeaveCriticalRegion、KeReleaseMutex 或 FsRtlExitFileSystem 时,APC 禁用计数都会递增。 由于这些调用应始终成对进行,因此当线程退出时,APC 禁用计数应为零。 负值表示驱动程序已禁用 APC 调用,而未重新启用它们。 正值表示情况恰好相反。 |
0xC6 | 驱动程序快速 I/O 调度例程的地址 | 当前线程的 APC 禁用计数 | 在调用快速 I/O 驱动程序调度例程之前,线程的 APC 禁用计数 | 驱动程序快速 I/O 调度例程已更改线程的 APC 禁用计数。 每次驱动程序调用 KeEnterCriticalRegion、FsRtlEnterFileSystem 或获取互斥体时,APC 禁用计数都会递减。 每次驱动程序调用 KeLeaveCriticalRegion、KeReleaseMutex 或 FsRtlExitFileSystem 时,APC 禁用计数都会递增。 由于这些调用应始终成对进行,因此当线程退出时,APC 禁用计数应为零。 负值表示驱动程序已禁用 APC 调用,而未重新启用它们。 正值表示情况恰好相反。 |
0xCA | 后备列表的地址 | 预留 | 预留 | 驱动程序已尝试重新初始化后备列表。 |
0xCB | 后备列表的地址 | 预留 | 预留 | 驱动程序已尝试删除未初始化的后备列表。 |
0xCC | 后备列表的地址 | 池分配的起始地址 | 池分配的大小 | 驱动程序已尝试释放包含活动后备列表的池分配。 |
0xCD | 后备列表的地址 | 调用方指定的块大小 | 支持的最小块大小 | 驱动程序试图创建一个分配块大小太小的后备列表。 |
0xD0 | ERESOURCE 结构的地址 | 预留 | 预留 | 驱动程序尝试重新初始化 ERESOURCE 结构。 |
0xD1 | ERESOURCE 结构的地址 | 预留 | 预留 | 驱动程序试图删除未初始化的 ERESOURCE 结构。 |
0xD2 | ERESOURCE 结构的地址 | 池分配的起始地址 | 池分配的大小 | 驱动程序试图释放包含活动 ERESOURCE 结构的池分配。 |
0xD5 | 由驱动程序的检查生成版本创建的 IO_REMOVE_LOCK 结构的地址 | 当前 IoReleaseRemoveLock 标记 | 预留 | 当前的 IoReleaseRemoveLock 标记与以前的 IoAcquireRemoveLock 标记不匹配。 如果调用 IoReleaseRemoveLock 的驱动程序不在检查生成中,参数 2 是驱动程序验证程序代表驱动程序创建的影子 IO_REMOVE_LOCK 结构的地址。 在这种情况下,驱动程序使用的 IO_REMOVE_LOCK 结构的地址根本不使用,因为驱动程序验证程序正在替换所有删除锁 API 的锁定地址。 只有当驱动程序验证程序的“I/O 验证”选项处于活动状态时,才会使用此参数进行错误检查。 |
0xD6 | 由驱动程序的检查生成版本创建的 IO_REMOVE_LOCK 结构的地址 | 标记与以前的 IoAcquireRemoveLock 标记不匹配 | 以前的 IoAcquireRemoveLock 标记 | 当前的 IoReleaseRemoveLockAndWait 标记与以前的 IoAcquireRemoveLock 标记不匹配。 如果调用 IoReleaseRemoveLock 的驱动程序不在检查生成中,参数 2 是驱动程序验证程序代表驱动程序创建的影子 IO_REMOVE_LOCK 结构的地址。 在这种情况下,驱动程序使用的 IO_REMOVE_LOCK 结构的地址根本不使用,因为驱动程序验证程序正在替换所有删除锁 API 的锁定地址。 只有当驱动程序验证程序的“I/O 验证”选项处于活动状态时,才会使用此参数进行错误检查。 |
0xD7 | 驱动程序验证程序内部使用的已检查的构建删除锁结构的地址 | 由驱动程序指定的删除锁结构的地址 | 预留 | 即使删除锁调用 IoReleaseRemoveLockAndWait 后,也无法重新初始化,因为其他线程可能仍在使用该锁(通过调用 IoAcquireRemoveLock)。 驱动程序应在其设备扩展内分配删除锁,并对其进行一次初始化。 锁将与设备扩展一起删除。 |
0xDA | 驱动程序的起始地址 | 驱动程序内的 WMI 回调地址 | 预留 | 试图卸载尚未注销其 WMI 回调函数的驱动程序。 |
0xDB | 设备对象的地址 | 预留 | 预留 | 试图删除未从 WMI 中取消注册的设备对象。 |
0xDC | 预留 | 预留 | 预留 | 指定了无效的 RegHandle 值作为函数 EtwUnregister 的参数。 |
0xDD | 调用 EtwRegister 的地址 | 卸载驱动程序的起始地址 | 对于 Windows 8 及更高版本,此参数是 ETW RegHandle 值。 | 尝试在不调用 EtwUnregister 的情况下卸载驱动程序。 |
0xDF | 同步对象地址 | 0 | 0 | 同步对象位于会话地址空间中。 不允许在会话地址空间中使用同步对象,因为它们可以从另一个会话或没有会话虚拟地址空间的系统线程进行操作。 |
0xE0 | 用作参数的用户模式地址 | 用作参数的地址范围的大小(以字节为单位) | 预留 | 调用了一个操作系统内核函数,该函数指定了一个用户模式地址作为参数。 |
0xE1 | 同步对象的地址 | 预留 | 预留 | 发现同步对象的地址无效或可分页。 |
0xE2 | IRP 的地址 | IRP 中存在的用户模式地址 | 预留 | 发现 Irp->RequestorMode 设置为 KernelMode 的 IRP 的成员之一为用户模式地址。 |
0xE3 | API 调用的地址 | 在 API 中用作参数的用户模式地址 | 预留 | 驱动程序用用户模式地址作为参数调用内核模式 ZwXxx 例程。 |
0xE4 | API 调用的地址 | 格式错误的 UNICODE_STRING 结构的地址 | 预留 | 驱动程序用格式错误的 UNICODE_STRING 结构作为参数调用内核模式 ZwXxx 例程。 |
0xE5 | 当前 IRQL | 预留 | 预留 | 在不正确的 IRQL 上调用了内核 API。 |
0xE6 | 进行 Zw API 调用的驱动程序内部的地址 | 当前 IRQL | 特殊内核 APC。 | 内核 Zw API 未在 IRQL = PASSIVE_LEVEL调用,并且启用了特殊内核 APC。 |
0xEA | 当前 IRQL | 线程的 APC 禁用计数 | 推送锁的地址 | 在启用 APC时,驱动程序试图获取推送锁。 |
0xEB | 当前 IRQL | 线程的 APC 禁用计数 | 推送锁的地址 | 在启用 APC时,驱动程序试图释放推送锁。 |
0xF0 | 目标缓冲区的地址 | 源缓冲区的地址 | 要复制的字节数 | 名为 memcpy 函数的驱动程序,其中包含重叠的源缓冲区和目标缓冲区。 |
0xF5 | NULL 句柄的地址 | 对象类型 | 预留 | 驱动程序将 NULL 句柄传递给 ObReferenceObjectByHandle。 |
0xF6 | 正在引用的句柄值 | 当前进程的地址 | 执行错误引用的驱动程序内的地址 | 驱动程序将用户模式句柄引用为内核模式。 |
0xF7 | 调用方指定的句柄值 | 调用方指定的对象类型 | 调用方指定的 AccessMode | 驱动程序正试图在系统进程的上下文中对内核句柄进行用户模式引用。 |
0xFA | 完成例程地址。 | 调用完成例程之前的 IRQL 值 | 调用完成例程后的当前 IRQL 值 | IRP 完成例程返回的 IRQL 与调用该例程的 IRQL 不同。 |
0xFB | 完成例程地址 | 当前线程的 APC 禁用计数 | 线程调用 IRP 完成例程之前的 APC 禁用计数 | 线程的 APC 禁用计数由驱动程序的 IRP 完成例程更改。 每次驱动程序调用 KeEnterCriticalRegion、FsRtlEnterFileSystem 或获取互斥体时,APC 禁用计数都会递减。 每次驱动程序调用 KeLeaveCriticalRegion、KeReleaseMutex 或 FsRtlExitFileSystem 时,APC 禁用计数都会递增。 由于这些调用应始终成对进行,因此当线程退出时,APC 禁用计数应为零。 负值表示驱动程序已禁用 APC 调用,而未重新启用它们。 正值表示情况恰好相反。 |
0xFC | 进行错误 API 调用的驱动程序内部的地址。 | 提供的 ApcContext 值。 | 预留 | 使用不支持的 ApcContext 值调用 ZwNotifyChangeKey(从内核模式)。 |
0x105 到 0x140
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x105 | IRP 的地址 | 0 | 0 | 驱动程序使用 ExFreePool 而不是 IoFreeIrp 来释放 IRP。 |
0x10A | 0 | 0 | 0 | 驱动程序试图向空闲进程对池配额收费。 |
0x10B | 0 | 0 | 0 | 驱动程序试图从 DPC 例程对池配额收费。 这不正确,因为当前进程上下文未定义。 |
0x110 | 中断服务例程的地址 | 执行 ISR 之前保存的扩展上下文的地址 | 扩展上下文的地址在执行 ISR 后保存 | 驱动程序的中断服务例程 (ISR) 已损坏扩展线程上下文。 |
0x111 | 中断服务例程的地址 | 执行 ISR 之前的 IRQL | 执行 ISR 之后的 IRQL | 中断服务例程返回已更改的 IRQL。 |
0x115 | 负责关闭的线程的地址,该线程可能已死锁。 | 0 | 0 | 驱动程序验证程序检测到系统运行时间超过 20 分钟,并且关闭未完成。 |
0x11A | 当前 IRQL | 0 | 0 | 驱动程序在 IRQL > APC_LEVEL 上调用 KeEnterCriticalRegion。 |
0x11B | 当前 IRQL | 0 | 0 | 驱动程序在 IRQL > APC_LEVEL 上调用 KeLeaveCriticalRegion。 |
0x120 | IRQL 值的地址 | 要等待的对象地址 | 超时值的地址 | 线程在 IRQL > DISPATCH_LEVEL 等待。 KeWaitForSingleObject 或 KeWaitForMultipleObjects 的调用方必须在 IRQL <= DISPATCH_LEVEL 运行。 |
0x121 | IRQL 值的地址 | 要等待的对象地址 | 超时值的地址 | 线程在 IRQL 等于 DISPATCH_LEVEL 处等待,并且 Timeout 为 NULL。 KeWaitForSingleObject 或 KeWaitForMultipleObjects 的调用方在 IRQL <= DISPATCH_LEVEL 运行。 如果为 Timeout 提供了 NULL 指针,则调用线程将保持等待状态,直到用信号通知 Object 为止。 |
0x122 | IRQL 值的地址 | 要等待的对象地址 | 超时值的地址 | 线程在 DISPATCH_LEVEL 等待,超时值不等于零 (0)。 如果 Timeout != 0,则 KeWaitForSingleObject 或 KeWaitForMultipleObjects 的调用方必须在 IRQL <= APC_LEVEL 运行。 |
0x123 | 要等待的对象地址 | 0 | 0 | KeWaitForSingleObject 或 KeWaitForMultipleObjects 的调用方将等待指定为 UserMode,但对象在内核堆栈上。 |
0x130 | 工作项的地址 | 0 | 0 | 工作项位于会话地址空间中。 不允许在会话地址空间中使用工作项,因为它们可以从另一个会话或没有会话虚拟地址空间的系统线程进行操作。 |
0x131 | 工作项的地址 | 0 | 0 | 工作项位于可分页内存中。 工作项必须在不可分页内存中,因为内核在 DISPATCH_LEVEL 中使用它们。 |
0x135 | IRP 的地址 | 从 IoCancelIrp 调用到完成此 IRP 之间允许的毫秒数 | 0 | 取消的 IRP 未在预期时间内完成,驱动程序完成已取消的 IRP 花费的时间超过预期。 |
0x13A | 被释放的池块的地址 | 错误值 | 错误值的地址 | 驱动程序已调用 ExFreePool,驱动程序验证程序在用于跟踪池使用情况的内部值之一中检测到错误。 |
0x13B | 被释放的池块的地址 | 错误值的地址 | 指向错误内存页的指针的地址 | 驱动程序已调用 ExFreePool,驱动程序验证程序在用于跟踪池使用情况的内部值之一中检测到错误。 |
0x13C | 被释放的池块的地址 | 错误值 | 错误值的地址 | 驱动程序已调用 ExFreePool,驱动程序验证程序在用于跟踪池使用情况的内部值之一中检测到错误。 |
0x13D | 被释放的池块的地址 | 错误值的地址 | 预期的正确值 | 驱动程序已调用 ExFreePool,驱动程序验证程序在用于跟踪池使用情况的内部值之一中检测到错误。 |
0x13E | 调用方指定的池块地址 | 驱动程序验证程序跟踪的池块地址 | 指向驱动程序验证程序跟踪的池块地址的指针 | ExFreePool 调用方指定的池块地址与驱动程序验证程序跟踪的地址不同。 |
0x13F | 被释放的池块的地址 | 正在释放的字节数 | 指向驱动程序验证程序跟踪的字节数的指针 | 调用 ExFreePool 时释放的内存字节数与驱动程序验证程序跟踪的字节数不同。 |
0x140 | 当前 IRQL | MDL 地址 | 与此 MDL 关联的虚拟地址 | 非锁定 MDL 是由可分页内存或可交易内存生成的。 |
0x141 | 驱动程序请求分配的最高物理地址 | 要分配的字节数 | 0 | 驱动程序明确请求 4GB 以下的物理内存。 |
0x1000 到 0x100B - 死锁
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x1000 | 资源的地址 | 预留 | 预留 | 自死锁:当前线程尝试以递归方式和独占方式获取它只拥有共享的资源。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x1001 | 导致死锁的最终原因的资源的地址 | 预留 | 预留 | 死锁:发现锁层次结构冲突。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 (使用 !deadlock 扩展了解详细信息。) |
0x1002 | 资源的地址 | 预留 | 预留 | 未初始化的资源:在未首先初始化的情况下获取了资源。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x1003 | 死锁释放的资源的地址 | 应首先释放的资源的地址 | 预留 | 意外释放:资源的释放顺序不正确。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x1004 | 资源的地址 | 获取资源的线程的地址 | 当前线程的地址 | 意外线程:错误的线程释放资源。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x1005 | 资源的地址 | 预留 | 预留 | 多次初始化:对资源进行多次初始化。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x1007 | 资源的地址 | 预留 | 预留 | 未获取的资源:资源在被获取之前就被释放了。 只有当驱动程序验证程序的“死锁检测”选项处于活动状态时,才会使用此参数进行错误检查。 |
0x1008 | 锁定地址 | 预留 | 预留 | 驱动程序试图通过使用与此锁类型不匹配的 API 获取锁。 |
0x1009 | 锁定地址 | 预留 | 预留 | 驱动程序试图通过使用与此锁类型不匹配的 API 释放锁。 |
0x100A | 所有者线程地址 | 预留 | 终止的线程拥有锁。 | |
0x100B | 锁定地址 | 所有者线程地址 | 预留 | 已删除的锁仍归线程所有。 |
0x1010 | 向其发出写入 IRP 的设备对象。 | IRP 的地址。 | MDL 描述的缓冲区的系统空间虚拟地址。 | 修改了 Write Irp 的不变 MDL 缓冲区内容。 |
0x1011 | 向其发出写入 IRP 的设备对象。 | IRP 的地址。 | MDL 描述的缓冲区的系统空间虚拟地址。 | Read Irp 的不变 MDL 缓冲区内容在调度期间被修改,或者缓冲区由伪页支持。 |
0x1012 | 指向描述冲突的字符串的指针。 | 此损坏涉及的数据(如果未使用,则为 0)。 | 此损坏涉及的数据(如果未使用,则为 0)。 | 验证程序扩展状态存储检测到损坏。 |
0x1013 | 指向驱动程序对象的指针。 | 指向捕获的原始 I/O 回调的指针。 | 预留(未使用)。 | 验证程序在捕获的原始 I/O 回调中检测到内部损坏。 |
0x2000 到 0x2005 - 代码完整性问题
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x2000 | 检测到错误的驱动程序代码中的地址。 | 池类型。 | 池标记(如果提供)。 | 代码完整性问题:调用方指定了可执行池类型。 (预期:NonPagedPoolNx) |
0x2001 | 检测到错误的驱动程序代码中的地址。 | 页面保护 (WIN32_PROTECTION_MASK)。 | 0 | 代码完整性问题:调用方指定了可执行页面保护。 (预期:清除 PAGE_EXECUTE* 位) |
0x2002 | 检测到错误的驱动程序代码中的地址。 | 页面优先级(MM_PAGE_PRIORITY 逻辑上与 MdlMapping*为 OR)。 | 0 | 代码完整性问题:调用方指定了可执行的 MDL 映射。 (预期: MdlMappingNoExecute) |
0x2003 | 映像文件名(Unicode 字符串)。 | 节标头的地址。 | 节名称(UTF-8 编码字符串)。 | 代码完整性问题:映像包含可执行和可写部分。 |
0x2004 | 映像文件名(Unicode 字符串)。 | 节标头的地址。 | 节名称(UTF-8 编码字符串)。 | 代码完整性问题:映像包含未对齐页面的部分。 |
0x2005 | 映像文件名(Unicode 字符串)。 | IAT 目录。 | 节名称(UTF-8 编码字符串)。 | 代码完整性问题:映像包含位于可执行部分的 IAT。 |
0xA001 到 0xA00D - VM 交换机问题
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0xA001 | 指向 NetBufferList 对象的指针 | 指向虚拟交换机对象的指针(如果为非 Null) | 预留(未使用) | VM 交换机:必须设置调用方提供的 NetBufferList 的 SourceHandle。 请参阅 AllocateNetBufferListForwardingContext 例程。 |
0xA002 | 指向 NetBufferList 对象的指针 | 指向虚拟交换机对象的指针(如果为非 Null)。 | 预留(未使用) | VM 交换机:调用方提供的 NetBufferList 的转发详细信息不是零。 请参阅 AllocateNetBufferListForwardingContext 例程。 |
0xA003 | 指向 NetBufferList 对象的指针 | 指向虚拟交换机对象的指针(如果为非 Null)。 | 预留(未使用) | VM 交换机:调用方提供的 NetBufferList 的数据包标头或路由上下文为 NULL。 请参阅可扩展交换机数据路径的分组管理指南。 |
0xA004 | 无效端口的 ID | NIC 索引 | 指向虚拟交换机对象的指针(如果为非 Null)。 | VM 交换机:调用方指定了无效的端口和 NIC 索引组合。 请参阅 Hyper-V 可扩展交换机端口和网络适配器状态。 |
0xA005 | 指向 NetBufferList 对象的指针 | 指向目标列表的指针。 | 指向虚拟交换机对象的指针(如果为非 Null)。 | VM 交换机:调用方提供了无效的目标。 请参阅 AddNetBufferListDestination 和 UpdateNetBufferListDestinations。 |
0xA006 | 指向 NetBufferList 对象的指针 | 指向虚拟交换机对象的指针(如果为非 Null)。 | 预留(未使用) | VM 交换机:调用方提供了无效的源 NIC 或端口对象。 请参阅 Hyper-V 可扩展交换机端口和网络适配器状态。 |
0xA007 | 指向 NetBufferList 对象的指针 | 指向虚拟交换机对象的指针(如果为非 Null)。 | 预留(未使用) | VM 交换机:调用方提供了无效的目标列表。 请参阅 AddNetBufferListDestination 和 UpdateNetBufferListDestinations。 |
0xA008 | 父 NIC 对象 | NIC 索引 | 指向虚拟交换机对象的指针(如果为非 Null)。 | VM 交换机:在不允许时尝试引用 NIC。 请参阅 Hyper-V 可扩展交换机端口和网络适配器状态。 |
0xA009 | 引用的端口 | 指向虚拟交换机对象的指针(如果为非 Null) | 预留(未使用) | VM 交换机:尝试在不允许时引用端口。 请参阅 Hyper-V 可扩展交换机端口和网络适配器状态。 |
0xA00A | 指向 NetBufferList 对象的指针 | ContextTypeInfo 对象 | 预留(未使用) | VM 交换机:已设置故障上下文。 请参阅 SetNetBufferListSwitchContext。 |
0xA00B | 指向 NetBufferList 对象的指针 | NDIS_SWITCH_REPORT_FILTERED_NBL_FLAGS_* | 指向虚拟交换机对象的指针(如果为非 Null) | VM 交换机:为已删除的 NetBufferList 提供的方向无效。 请参阅 ReportFilteredNetBufferLists。 |
0xA00C | 指向 NetBufferList 对象的指针 | 发送标志值 | 指向虚拟交换机对象的指针(如果为非 Null) | VM 交换机:当设置 NDIS_SEND_FLAGS_SWITCH_SINGLE_SOURCE 标志时,NetBufferList 链具有多个源端口。 请参阅 Hyper-V 可扩展交换机发送和接收标志。 |
0xA00D | 指向 NetBufferList 对象的指针 | 指向虚拟交换机上下文的指针 | 指向虚拟交换机对象的指针(如果为非 Null) | VM 交换机:设置 NDIS_RECEIVE_FLAGS_SWITCH_DESTINATION_GROUP 标志时,链中的一个或多个 NetBufferLists 目标无效。 请参阅 Hyper-V 可扩展交换机发送和接收标志。 |
0xA00E | 指向 NetBufferLists 对象的指针。 | 指向虚拟交换机上下文的指针。 | 指向虚拟交换机对象的指针(如果为非 Null)。 | VM 交换机:设置 VMS_NBL_ROUTING_CONTEXT_FLAG_NO_WNV_PROCESSING 标志时尝试通过 WNV 完成 NetBufferList。 |
0x00020002 到 0x00020022 - DDI 合规性规则冲突
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x00020002 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlApcLte。 该规则指定只有当 IRQL <= APC_LEVEL 时,驱动程序才能调用 ObGetObjectSecurity 和 ObReleaseObjectSecurity。 |
0x00020003 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlDispatch。 IrqlDispatch 规则指定,仅当 IRQL = DISPATCH_LEVEL 时,驱动程序才必须调用某些例程 |
0x00020004 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlExAllocatePool。 IrqlExAllocatePool 规则指定驱动程序仅在 IRQL<=DISPATCH_LEVEL 时调用 ExAllocatePoolWithTag 和 ExAllocatePoolWithTagPriority。 |
0x00020005 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlExApcLte1。 IrqlExApcLte1 规则指定驱动程序仅在 IRQL <= APC_LEVEL 时才调用 ExAcquireFastMutex 和 ExTryToAcquireFastMutex。 |
0x00020006 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlExApcLte2。 IrqlExApcLte2 规则指定驱动程序仅在 IRQL <= APC_LEVEL 时调用某些例程。 |
0x00020007 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlExApcLte3。 IrqlExApcLte3 规则指定,仅当 IRQL <= APC_LEVEL 时,驱动程序才必须调用某些执行支持例程。 |
0x00020008 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlExPassive。 IrqlExPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些执行支持例程。 |
0x00020009 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlIoApcLte。 IrqlIoApcLte 规则指定,仅当 IRQL <= APC_LEVEL 时,驱动程序才必须调用某些 I/O 管理器例程。 |
0x0002000A | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlIoPassive1。 IrqlIoPassive1 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些 I/O 管理器例程。 |
0x0002000B | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlIoPassive2。 IrqlIoPassive2 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些 I/O 管理器例程。 |
0x0002000C | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlIoPassive3。 IrqlIoPassive3 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些 I/O 管理器例程。 |
0x0002000D | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlIoPassive4。 IrqlIoPassive4 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些 I/O 管理器例程。 |
0x0002000E | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlIoPassive5。 IrqlIoPassive5 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些 I/O 管理器例程。 |
0x0002000F | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlKeApcLte1。 IrqlKeApcLte1 规则指定,仅当 IRQL <= APC_LEVEL 时,驱动程序才必须调用某些内核例程。 |
0x00020010 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlKeApcLte2。 IrqlKeApcLte2 规则指定,仅当 IRQL <= APC_LEVEL 时,驱动程序才必须调用某些内核例程。 |
0x00020011 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlKeDispatchLte。 IrqlKeDispatchLte 规则指定,仅当 IRQL <= DISPATCH_LEVEL 时,驱动程序才必须调用某些内核例程。 |
0x00020015 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlKeReleaseSpinLock。 IrqlKeReleaseSpinLock 规则指定,仅当 IRQL = DISPATCH_LEVEL 时,驱动程序才必须调用 KeReleaseSpinLock。 |
0x00020016 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlKeSetEvent。 IrqlKeSetEvent 规则指定,当 Wait 设置为 FALSE 时,仅在 IRQL <= DISPATCH_LEVEL 处调用 KeSetEvent 例程;当 Wait 设置为 TRUE 时,仅在 IRQL <= APC_LEVEL 处调用例程。 |
0x00020019 | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlMmApcLte。 IrqlMmApcLte 规则指定,仅当 IRQL <= APC_LEVEL 时,驱动程序才必须调用某些内存管理器例程。 |
0x0002001A | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlMmDispatch。 IrqlMmDispatch 规则指定,仅当 IRQL = DISPATCH_LEVEL 时,驱动程序才必须调用 MmFreeContiguousMemory。 |
0x0002001B | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlObPassive。 IrqlObPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用 ObReferenceObjectByHandle。 |
0x0002001C | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlPsPassive。 IrqlPsPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用某些进程和线程管理器例程。 |
0x0002001D | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 IrqlReturn。 |
0x0002001E | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlRtlPassive。 IrqlRtlPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL 时,驱动程序才必须调用 RtlDeleteRegistryValue。 |
0x0002001F | 指向描述违反规则条件的字符串的指针。 | 指向规则状态变量的可选指针。 | 预留 | 驱动程序违反了 DDI 合规性规则 IrqlZwPassive。 IrqlZwPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL,驱动程序才必须调用 ZwClose。 |
0x00020022 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 DDI 合规性规则 IrqlIoDispatch。 |
0x00020023 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用)。 | 预留(未使用)。 | 驱动程序违反了 DDI 合规性规则 IrqlIoRtlZwPassive。 IrqlIoRtlZwPassive 规则指定,仅当 IRQL = PASSIVE_LEVEL,驱动程序才调用规则中列出的 DDI。 |
0x00020024 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用)。 | 预留(未使用)。 | 驱动程序违反了 DDI 合规性规则 IrqlNtifsApcPassive。 IrqlNtifsApcPassive 规则指定,仅当驱动程序在 IRQL = PASSIVE_LEVEL 或 IRQL <= APC_LEVEL 执行时,才调用规则中列出的 DDI。 |
0x00020025 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用)。 | 预留(未使用)。 | 驱动程序违反了 Microsoft 内部 DDI 合规性规则 IrqlKeMore。 |
0x00040003 到 0x00043006 - DDI 合规性规则冲突
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x00040003 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 CriticalRegions。 |
0x00040006 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 QueuedSpinLock。 |
0x00040007 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 QueuedSpinLockRelease。 |
0x00040009 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 SpinLock。 |
0x0004000A | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo) | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 SpinlockRelease。 |
0x0004000E | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 GuardedRegions。 |
0x0004100B | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 DDI 合规性规则 RequestedPowerIrp。 |
0x0004100F | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 IoSetCompletionExCompleteIrp。 |
0x00043006 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 DDI 合规性规则 PnpRemove。 |
0x00081001 到 0x00082005 - AVStream 驱动程序合规性规则冲突
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x00081001 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsDeviceMutex。 |
0x00081002 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsStreamPointerClone。 |
0x00081003 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 DDI 合规性规则 KsStreamPointerLock。 |
0x00081004 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsStreamPointerUnlock。 |
0x00081005 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 DDI 合规性规则 KsCallbackReturn。 |
0x00081006 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsIrqlDeviceCallbacks。 |
0x00081007 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsIrqlFilterCallbacks。 |
0x00081008 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsIrqlPinCallbacks。 |
0x00081009 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 DDI 合规性规则 KsIrqlDDIs。 |
0x0008100A | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsFilterMutex。 |
0x0008100B | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsProcessingMutex。 |
0x0008100C | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsInvalidStreamPointer。 |
0x00082001 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsTimedPinSetDeviceState。 |
0x00082002 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsTimedDeviceCallbacks。 |
0x00082003 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsTimedFilterCallbacks。 |
0x00082004 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsTimedPinCallbacks。 |
0x00082005 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 KsTimedProcessingMutex。 |
0x00091001 到 0x0009400C - NDIS DDI 合规性规则冲突
参数 1 | 参数 2 | 参数 3 | 参数 4 | 错误消息的原因 |
---|---|---|---|---|
0x00091001 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 NdisOidComplete。 |
0x00091002 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 NdisOidDoubleComplete。 |
0x0009100E | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 DDI 合规性规则 NdisOidDoubleRequest。 |
0x00092003 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 NdisTimedOidComplete。 |
0x0009200D | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 NdisTimedDataSend。 |
0x0009200F | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 NdisTimedDataHang。 |
0x00092010 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 NdisFilterTimedPauseComplete。 |
0x00092011 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 NdisFilterTimedDataSend。 |
0x00092012 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 NdisFilterTimedDataReceive。 |
0x00093004 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanAssociation。 |
0x00093005 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanConnectionRoaming。 |
0x00093006 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanDisassociation。 |
0x00093101 | 指向描述违反规则条件的字符串的指针。 | 预留(未使用) | 预留(未使用) | 驱动程序违反了 NDIS/WIFI 验证规则 WlanAssert。 |
0x00094007 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanTimedAssociation。 |
0x00094008 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanTimedConnectionRoaming。 |
0x00094009 | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanTimedConnectRequest。 |
0x0009400B | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanTimedLinkQuality。 |
0x0009400C | 指向描述违反规则条件的字符串的指针。 | 内部规则状态的地址(第二个参数为 !ruleinfo)。 | 补充状态的地址(第三个参数为 !ruleinfo)。 | 驱动程序违反了 NDIS/WIFI 验证规则 WlanTimedScan。 |
原因
有关原因的说明,请参阅“参数”章节中每个代码的说明。 可以使用 !analyze -v 扩展获取更多信息。
解决方法
只有当驱动程序验证程序被指示监视一个或多个驱动程序时,才能进行此错误检查。 如果不打算使用驱动程序验证程序,则应将其停用。 还可以考虑删除导致此问题的驱动程序。
如果你是驱动程序编写者,请使用通过此错误检查获得的信息来修复代码中的错误。
有关驱动程序验证程序的完整详细信息,请参阅驱动程序验证程序。
注解
_POOL_TYPE 代码在 Ntddk.h 中枚举。 其中,0(零)表示非分页池,1(一)表示分页池。
(Windows 8 及更高版本的 Windows)如果 DDI 合规性检查导致错误检查,请在驱动程序源代码上运行静态驱动程序验证程序,并指定导致错误检查的 DDI 合规性规则(由参数 1 值标识)。 静态驱动程序验证程序可以帮助在源代码中找到问题的原因。