已检验版本 ASSERT
本主题包含驱动程序编写器遇到的常见 ASSERT列表。
有关如何处理这些断言 (和其他未在) 列出的断言的一些提示,请参阅 如何检查的生成指示问题。
“例程调用”列中列出的例程是驱动程序编写器或系统组件为引发此错误而调用的最常见例程。 下面列出的一些例程是驱动程序调用的记录例程。 其他例程是只有系统组件才能调用的内部例程。 请记住,从驱动程序调用其他一些函数可能会导致调用的函数在内部调用列出的函数之一,进而可能会发出 ASSERT。
注意
Windows 10 版本 1803 之前的旧版 Windows 上提供已检查的版本。 使用驱动程序验证器和 GFlags 等工具在更高版本的 Windows 中检查驱动程序代码。
调用的例程 | ASSERT 文本 | 含义 |
---|---|---|
ASSERT (长度) |
所描述的用户缓冲区的长度为零。 |
|
ASSERT ( sourceExtension-AttachedTo> == NULL ) |
(源设备) 附加的设备对象已附加到另一个设备对象。 |
|
ASSERT ( Irp-Type> == IO_TYPE_IRP ) |
PIRP 参数不指向 IRP。 |
|
ASSERT ( Irp-Type> == IO_TYPE_IRP ) |
PIRP 参数不指向 IRP。 |
|
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。 |
ASSERT ( (DriverObject-Flags> & DRVO_UNLOAD_INVOKED) == 0) |
已创建设备对象,但创建它的驱动程序标记为卸载。 |
|
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 完成尚未完成。 |
ASSERT (Irp-CancelRoutine> == NULL) |
IRP 中有一个已请求重复使用的取消例程。 |
|
IoReuseIrp |
ASSERT (IsListEmpty (&Irp-ThreadListEntry>) ) |
重复使用的 IRP 仍在线程的 IRP 列表中,因此仍在使用中。 |
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。 |
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 描述的缓冲区中的页已锁定到内存中的异常多的次数。 |
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 中的页框架指针无效。 |
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 描述包含零页的缓冲区。 |
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 描述的缓冲区包含未在内存中锁定的页。 |
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 描述的缓冲区包含未在内存中锁定的页。 |
ASSERT (PhysicalAddress.HighPart == 0) |
这在物理内存不超过 4 GB 的基于 x86 的系统上运行,但传递给此函数以指定 I/O 空间地址的高 32 位的参数是非零的。 |
|
MmMapIoSpace |
ASSERT (NumberOfBytes != 0) |
传递给此函数以指定要映射的字节数的参数为零。 |
MmMapIoSpace |
ASSERT (PointerPte-u.Hard.Valid> == 0) |
地址愤怒中的页面不在 I/O 空间中。 |
ASSERT (NumberOfBytes != 0) |
传递给此函数以指定要取消映射的字节数的参数为零。 |
|
ASSERT (NumberOfBytes != 0) |
传递给此函数以指定要分配的字节数的参数为零。 |
|
MemorySpecifyCache |
ASSERT (NumberOfBytes != 0) |
传递给此函数以指定要分配的字节数的参数为零。 |
ASSERT (NumberOfBytes != 0) |
传递给此函数以指定要分配的字节数的参数为零。 |
|
MmFreeNonCachedMemory |
ASSERT (NumberOfBytes != 0) |
传递给此函数以指定要释放的字节数的参数为零。 |
MmFreeNonCachedMemory |
ASSERT (PAGE_ALIGN (BaseAddress) == BaseAddress) |
传递给此函数以指定基址的参数无效。 |
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈