已检验版本 ASSERT

本主题包含驱动程序编写器遇到的常见 断言的列表。

有关如何处理这些断言的一些提示 (和未列出) 的其他提示,请参阅 检查的生成如何指示问题

"例程" 列中列出的例程是驱动程序编写器或系统组件为引发此错误而要调用的最常见的例程。 下面列出的一些例程是驱动程序调用的记录例程。 其他是只有系统组件可以调用的内部例程。 请记住,从驱动程序调用其他某个函数可能会导致调用的函数在内部调用列出的函数之一,进而发出 断言

注意

Windows 10 版本 1803 之前的旧版 Windows 上提供已检查的版本。 使用驱动程序验证程序和 GFlags 等工具在 Windows 的更高版本中检查驱动程序代码。

例程调用 断言文本 含义

IoAllocateMdl

断言 (长度)

所描述的用户缓冲区的长度为零。

IoAttachDeviceToDeviceStack

ASSERT ( sourceExtension- > AttachedTo = = NULL )

(源设备) 连接的设备对象已附加到另一个设备对象。

IoCallDriver

ASSERT ( Irp- > Type = = IO_TYPE_IRP )

PIRP 参数不指向 IRP。

IoCancelIrp

ASSERT ( Irp- > Type = = IO_TYPE_IRP )

PIRP 参数不指向 IRP。

IoCompleteRequest

ASSERT ( Irp- > Type = = IO_TYPE_IRP )

PIRP 参数不指向 IRP。

IoCompleteRequest

断言 (!Irp- > CancelRoutine )

IRP 中存在一个取消例程。

IoCompleteRequest

断言 ( Irp- > IoStatus! = STATUS_PENDING )

尝试使用 STATUS_PENDING 完成 IRP。

IoCompleteRequest

ASSERT ( Irp- > IoStatus! = 0xffffffff )

尝试使用无效的状态代码完成 IRP。

IoCompleteRequest

断言 ( Irp > AuxiliaryBuffer! = NULL )

IRP 正在使用 STATUS_REPARSE,IO_REPARSE_TAG_MOUNT_POINT 完成,辅助缓冲区为 NULL

IoCreateDevice

断言 ( (DriverObject > DRVO_UNLOAD_INVOKED) = = 0 &)

已创建设备对象,但创建它的驱动程序标记为要卸载。

IoFreeIrp

ASSERT ( Irp- > Type = = IO_TYPE_IRP )

PIRP 不指向 IRP。

IoFreeIrp

断言 (IsListEmpty (& (Irp) - > ThreadListEntry) )

正在释放的 IRP 仍在线程的 IRP 列表中,因此仍在使用中。

IoFreeIrp

断言 ( Irp- > CurrentLocation > = irp- > StackCount )

正在释放 IRP,但尚未完成处理此 IRP 的所有驱动程序的 i/o 完成。

IoReuseIrp

ASSERT (Irp- > CancelRoutine = = NULL)

IRP 中还有一个已请求重用的取消例程。

IoReuseIrp

断言 (IsListEmpty (&Irp- > ThreadListEntry) )

正在重用的 IRP 仍在线程的 IRP 列表中,因此仍在使用中。

IoSetHardErrorOrVerifyDevice

断言 ( Irp- > Tail. Thread! = NULL )

IRP 不在任何线程的 IRP 列表上。

IopLoadDriver

ASSERT (driverObject- > MajorFunction [i]! = NULL)

驱动程序将调度入口点设置为DriverEntry例程中的NULL

IopCompleteRequest

ASSERT ( irp- > IoStatus! = 0xffffffff)

IRP 以明显无效的状态完成。

IopCompleteRequest

ASSERT (reparseBuffer- > ReparseTag = = IO_REPARSE_TAG_MOUNT_POINT)

已完成 IRP,状态为 = = STATUS_REPARSE,信息 = = IO_REPARSE_TAG_MOUNT_POINT,但 ReparseTag 不是 MOUNT_POINT 的。

IopCompleteRequest

断言 (reparseBuffer- > ReparseDataLength < MAXIMUM_REPARSE_DATA_BUFFER_SIZE)

已完成 IRP,状态为 = = STATUS_REPARSE,信息 = = IO_REPARSE_TAG_MOUNT_POINT,但返回的标记的长度无效。

IopCompleteRequest

断言 (reparseBuffer > 保留 < MAXIMUM_REPARSE_DATA_BUFFER_SIZE)

已完成 IRP,状态为 = = STATUS_REPARSE,信息 = = IO_REPARSE_TAG_MOUNT_POINT,但返回的标记的长度无效。

IopSynchronousServiceTail

断言 (!Irp- > PendingReturned )

IRP 已标记为挂起,但以状态! = STATUS_PENDING 同步调度返回的例程。

MmProbeAndLockPages

ASSERT (MemoryDescriptorList- > ByteCount! = 0)

传入的 MDL 中的字节计数为零。

MmProbeAndLockPages

断言 ( ( (ULONG) MemoryDescriptorList- > ByteOffset & ~ (PAGE_SIZE) ) = = 0)

MDL 中第一页的偏移量为 > = PAGE_SIZE; mdl 的格式不正确。

MmProbeAndLockPages

断言 ( ( (ULONG_PTR) MemoryDescriptorList > StartVa & (PAGE_SIZE) ) = = 0)

MDL 中的起始 VA 不是页对齐的;MDL 的格式不正确。

MmProbeAndLockPages

断言 ( (MemoryDescriptorList- > MdlFlags & ( MDL_PAGES_LOCKED |MDL_MAPPED_TO_SYSTEM_VA |MDL_SOURCE_IS_NONPAGED_POOL |MDL_PARTIAL |MDL_IO_SPACE) ) = = 0)

此函数调用的 MDL 状态不正常。

MmProbeAndLockPages

断言 (NumberOfPagesToLock! = 0)

MDL 介绍了一系列页面,其中包含零页要锁定的页面。

MmProbeAndLockPages

ASSERT (FALSE)

MDL 描述的缓冲区中的页已被锁定到内存中,这种情况很长。

MmUnlockPages

断言 ( (MemoryDescriptorList- > MdlFlags & MDL_PAGES_LOCKED) ! = 0)

包含此 MDL 描述的缓冲区的页未被锁定。

MmUnlockPages

断言 ( (MemoryDescriptorList- > MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) = = 0)

MDL 描述非分页池的缓冲区。

MmUnlockPages

断言 ( (MemoryDescriptorList- > MdlFlags & MDL_PARTIAL) = = 0)

MDL 是通过调用 IoBuildPartialMdl生成的。

MmUnlockPages

ASSERT (MemoryDescriptorList- > ByteCount! = 0)

MDL 描述长度为零字节的缓冲区。

MmUnlockPages

断言 (NumberOfPages! = 0)

MDL 不包含任何页面。

MmUnlockPages

断言 ( (SPFN_NUMBER) > NumberOfLockedPages > = 0)

与 MDL 关联的进程未锁定任何页。

MmUnlockPages

ASSERT ( Page < = MmHighestPhysicalPage)

MDL 中的页面帧指针无效。

MmBuildMdlForNonPagedPool

ASSERT (MemoryDescriptorList- > ByteCount! = 0)

MDL 描述的缓冲区长度为零字节。

MmBuildMdlForNonPagedPool

断言 ( (MemoryDescriptorList- > MdlFlags & (MDL_PAGES_LOCKED |MDL_MAPPED_TO_SYSTEM_VA |MDL_SOURCE_IS_NONPAGED_POOL |MDL_PARTIAL) ) = = 0)

此函数调用的 MDL 状态不正常

MmBuildMdlForNonPagedPool

断言 (NumberOfPages! = 0)

MDL 描述了零页的缓冲区。

MmMapLockedPagesSpecifyCache

ASSERT (MemoryDescriptorList- > ByteCount! = 0)

MDL 长度为零。

MmMapLockedPagesSpecifyCache

断言 ( (MemoryDescriptorList- > MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) = = 0)

此 MDL 描述的缓冲区已映射到内核虚拟地址空间。

MmMapLockedPagesSpecifyCache

断言 ( (MemoryDescriptorList- > MdlFlags & ( MDL_MAPPED_TO_SYSTEM_VA |MDL_SOURCE_IS_NONPAGED_POOL |MDL_PARTIAL_HAS_BEEN_MAPPED) ) = = 0)

此函数调用的 MDL 状态不正常。

MmMapLockedPagesSpecifyCache

断言 ( (MemoryDescriptorList- > MdlFlags & ( MDL_PAGES_LOCKED |MDL_PARTIAL) ) ! = 0)

MDL 未处于此操作的正确状态。

MmMapLockedPagesSpecifyCache

断言 (PointerPte > = = 0)

MDL 描述的缓冲区包含不在内存中的页面。

MmMapLockedPagesSpecifyCache

断言 (Pfn2- > ReferenceCount! = 0)

MDL 描述的缓冲区包含内存中未锁定的页面。

MmUnmapLockedPages

ASSERT (MemoryDescriptorList- > ByteCount! = 0)

MDL 描述长度为零字节的缓冲区。

MmUnmapLockedPages

断言 (MemoryDescriptorList- > MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)

传递给此函数以指定基址的参数指示核心虚拟地址空间中的一个地址,但这并不同意 MDL 中的缓冲区说明。

MmUnmapLockedPages

断言 (PointerPte > = = 1)

MDL 描述的缓冲区中的页面不在内存中。

MmUnmapLockedPages

断言 ( Page = = MI_GET_PAGE_FRAME_FROM_PTE (PointerPte) )

MDL 中的页面帧指针无效。

MmUnmapLockedPages

断言 (Pfn3- > ReferenceCount! = 0)

MDL 描述的缓冲区包含内存中未锁定的页面。

MmMapIoSpace

断言 (PhysicalAddress. Largeint.highpart = = 0)

此功能运行在物理内存不超过 4 GB 的基于 x86 的系统上,但传递给此函数以指定 i/o 空间的高32位的参数为非零值。

MmMapIoSpace

断言 (NumberOfBytes! = 0)

传递给此函数以指定要映射的字节数的参数为零。

MmMapIoSpace

断言 (PointerPte > = = 0)

地址风行一时中的页面不在 i/o 空间。

MmUnmapIoSpace

断言 (NumberOfBytes! = 0)

传递给此函数以指定取消映射的字节数的参数为零。

MmAllocateContiguousMemory

断言 (NumberOfBytes! = 0)

传递给此函数以指定要分配的字节数的参数为零。

MemorySpecifyCache

断言 (NumberOfBytes! = 0)

传递给此函数以指定要分配的字节数的参数为零。

MmAllocateNonCachedMemory

断言 (NumberOfBytes! = 0)

传递给此函数以指定要分配的字节数的参数为零。

MmFreeNonCachedMemory

断言 (NumberOfBytes! = 0)

传递给此函数以指定要释放的字节数的参数为零。

MmFreeNonCachedMemory

断言 (PAGE_ALIGN (BaseAddress) = = BaseAddress)

传递给此函数以指定基址的参数无效。