已检验版本 ASSERT

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

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

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

注意

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

调用的例程 ASSERT 文本 含义

IoAllocateMdl

ASSERT (长度)

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

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

ASSERT ( !Irp-CancelRoutine> )

IRP 中存在取消例程。

IoCompleteRequest

ASSERT ( Irp-IoStatus.Status> != STATUS_PENDING )

尝试使用 STATUS_PENDING 完成 IRP。

IoCompleteRequest

ASSERT ( Irp-IoStatus.Status> != 0xffffffff )

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

IoCompleteRequest

ASSERT ( Irp-Tail.Overlay.AuxiliaryBuffer> != NULL )

IRP 以STATUS_REPARSE、IO_REPARSE_TAG_MOUNT_POINT完成,辅助缓冲区为 NULL

IoCreateDevice

ASSERT ( (DriverObject-Flags> & DRVO_UNLOAD_INVOKED) == 0)

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

IoFreeIrp

ASSERT ( Irp-Type> == IO_TYPE_IRP )

PIRP 不指向 IRP。

IoFreeIrp

ASSERT (IsListEmpty (& (Irp) -ThreadListEntry>) )

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

IoFreeIrp

ASSERT ( Irp-CurrentLocation>> = Irp-StackCount> )

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

IoReuseIrp

ASSERT (Irp-CancelRoutine> == NULL)

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

IoReuseIrp

ASSERT (IsListEmpty (&Irp-ThreadListEntry>) )

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

IoSetHardErrorOrVerifyDevice

ASSERT ( Irp-Tail.Overlay.Thread> != NULL )

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

IopLoadDriver

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

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

IopCompleteRequest

ASSERT ( irp-IoStatus.Status> != 0xffffffff)

IRP 已完成,状态明显无效。

IopCompleteRequest

ASSERT (reparseBuffer-ReparseTag> == IO_REPARSE_TAG_MOUNT_POINT)

IRP 已完成状态 == STATUS_REPARSE,信息 == IO_REPARSE_TAG_MOUNT_POINT,但 ReparseTag 不适用于MOUNT_POINT。

IopCompleteRequest

ASSERT (reparseBuffer-ReparseDataLength>< MAXIMUM_REPARSE_DATA_BUFFER_SIZE)

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

IopCompleteRequest

ASSERT (reparseBuffer-Reserved>< MAXIMUM_REPARSE_DATA_BUFFER_SIZE)

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

IopSynchronousServiceTail

ASSERT ( !Irp-PendingReturned> )

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

MmProbeAndLockPages

ASSERT (MemoryDescriptorList-ByteCount> != 0)

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

MmProbeAndLockPages

ASSERT ( ( (ULONG) MemoryDescriptorList-ByteOffset> & ~ (PAGE_SIZE - 1) ) == 0)

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

MmProbeAndLockPages

ASSERT ( ( (ULONG_PTR) MemoryDescriptorList-StartVa> & (PAGE_SIZE - 1) ) == 0)

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

MmProbeAndLockPages

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

对于此函数调用,MDL 未处于正确的状态。

MmProbeAndLockPages

ASSERT (NumberOfPagesToLock != 0)

MDL 描述一系列没有要锁定的页。

MmProbeAndLockPages

ASSERT (FALSE)

由 MDL 描述的缓冲区中的页已锁定到内存中的异常多的次数。

MmUnlockPages

ASSERT ( (MemoryDescriptorList-MdlFlags> & MDL_PAGES_LOCKED) != 0)

构成此 MDL 描述的缓冲区的页尚未锁定。

MmUnlockPages

ASSERT ( (MemoryDescriptorList-MdlFlags> & MDL_SOURCE_IS_NONPAGED_POOL) == 0)

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

MmUnlockPages

ASSERT ( (MemoryDescriptorList-MdlFlags> & MDL_PARTIAL) == 0)

MDL 是通过调用 IoBuildPartialMdl 生成的。

MmUnlockPages

ASSERT (MemoryDescriptorList-ByteCount> != 0)

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

MmUnlockPages

ASSERT (NumberOfPages != 0)

MDL 不包含任何页面。

MmUnlockPages

ASSERT ( (SPFN_NUMBER) Process-NumberOfLockedPages>> = 0)

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

MmUnlockPages

ASSERT (页 <= MmHighestPhysicalPage)

MDL 中的页框架指针无效。

MmBuildMdlForNonPagedPool

ASSERT (MemoryDescriptorList-ByteCount> != 0)

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

MmBuildMdlForNonPagedPool

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

此函数调用的 MDL 未处于正确的状态

MmBuildMdlForNonPagedPool

ASSERT (NumberOfPages != 0)

MDL 描述包含零页的缓冲区。

MmMapLockedPagesSpecifyCache

ASSERT (MemoryDescriptorList-ByteCount> != 0)

MDL 的长度为零。

MmMapLockedPagesSpecifyCache

ASSERT ( (MemoryDescriptorList-MdlFlags> & MDL_MAPPED_TO_SYSTEM_VA) == 0)

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

MmMapLockedPagesSpecifyCache

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

对于此函数调用,MDL 未处于正确的状态。

MmMapLockedPagesSpecifyCache

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

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

MmMapLockedPagesSpecifyCache

ASSERT (PointerPte-u.Hard.Valid> == 0)

MDL 描述的缓冲区包含一个不驻留在内存中的页。

MmMapLockedPagesSpecifyCache

ASSERT (Pfn2-u3.e2.ReferenceCount> != 0)

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

MmUnmapLockedPages

ASSERT (MemoryDescriptorList-ByteCount> != 0)

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

MmUnmapLockedPages

ASSERT (MemoryDescriptorList-MdlFlags> & MDL_MAPPED_TO_SYSTEM_VA)

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

MmUnmapLockedPages

ASSERT (PointerPte-u.Hard.Valid> == 1)

MDL 描述的缓冲区中的页未驻留在内存中。

MmUnmapLockedPages

ASSERT (Page == MI_GET_PAGE_FRAME_FROM_PTE (PointerPte) )

MDL 中的页框架指针无效。

MmUnmapLockedPages

ASSERT (Pfn3-u3.e2.ReferenceCount> != 0)

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

MmMapIoSpace

ASSERT (PhysicalAddress.HighPart == 0)

这在物理内存不超过 4 GB 的基于 x86 的系统上运行,但传递给此函数以指定 I/O 空间地址的高 32 位的参数是非零的。

MmMapIoSpace

ASSERT (NumberOfBytes != 0)

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

MmMapIoSpace

ASSERT (PointerPte-u.Hard.Valid> == 0)

地址愤怒中的页面不在 I/O 空间中。

MmUnmapIoSpace

ASSERT (NumberOfBytes != 0)

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

MmAllocateContiguousMemory

ASSERT (NumberOfBytes != 0)

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

MemorySpecifyCache

ASSERT (NumberOfBytes != 0)

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

MmAllocateNonCachedMemory

ASSERT (NumberOfBytes != 0)

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

MmFreeNonCachedMemory

ASSERT (NumberOfBytes != 0)

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

MmFreeNonCachedMemory

ASSERT (PAGE_ALIGN (BaseAddress) == BaseAddress)

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