빌드 ASSERT를 확인했습니다.

이 항목에는 드라이버 작성기에서 발생하는 일반적인 ASSERT 목록이 포함되어 있습니다.

이러한 어설션을 처리하는 방법에 대한 몇 가지 팁(및 나열되지 않은 항목)은 확인된 빌드가 문제를 나타내는 방법을 참조하세요.

"호출된 루틴" 열에 나열된 루틴은 드라이버 작성기 또는 시스템 구성 요소가 이 오류를 유발하기 위해 호출하는 가장 일반적인 루틴입니다. 아래에 나열된 루틴 중 일부는 드라이버가 호출하는 문서화된 루틴입니다. 시스템 구성 요소만 호출할 수 있는 내부 루틴도 있습니다. 드라이버에서 다른 함수를 호출하면 호출된 함수가 나열된 함수 중 하나를 내부적으로 호출하여 ASSERT를 발급할 수 있습니다.

참고

확인된 빌드는 Windows 10 버전 1803 이전 버전의 Windows 사용할 수 있었습니다. 드라이버 검증 도구 및 GFlags와 같은 도구를 사용하여 이후 버전의 Windows 드라이버 코드를 확인합니다.

호출된 루틴 ASSERT 텍스트 의미

IoAllocateMdl

ASSERT(Length)

설명되는 사용자 버퍼의 길이는 0입니다.

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가 해제되고 있지만 I/O 완료가 아직 이 IRP를 처리한 모든 드라이버에 대해 완료되지 않았습니다.

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)

상태 == STATUS_REPARSE 및 Information == IO_REPARSE_TAG_MOUNT_POINT IRP가 완료되었지만 ReparseTag는 MOUNT_POINT 위한 것이 아닙니다.

IopCompleteRequest

ASSERT(reparseBuffer-ReparseDataLength>< MAXIMUM_REPARSE_DATA_BUFFER_SIZE)

상태 == STATUS_REPARSE 및 Information == IO_REPARSE_TAG_MOUNT_POINT IRP가 완료되었지만 반환된 태그의 길이가 잘못되었습니다.

IopCompleteRequest

ASSERT(reparseBuffer-Reserved>< MAXIMUM_REPARSE_DATA_BUFFER_SIZE)

상태 == STATUS_REPARSE 및 Information == IO_REPARSE_TAG_MOUNT_POINT IRP가 완료되었지만 반환된 태그의 길이가 잘못되었습니다.

IopSynchronousServiceTail

ASSERT( ! Irp-PendingReturned> )

IRP가 보류 중으로 표시되었지만 != STATUS_PENDING 상태로 반환된 루틴을 동기적으로 디스패치합니다.

MmProbeAndLockPages

ASSERT(MemoryDescriptorList-ByteCount> != 0)

전달된 MDL의 바이트 수는 0입니다.

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은 잠글 페이지가 0인 페이지 범위를 설명합니다.

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은 0바이트 길이의 버퍼를 설명합니다.

MmUnlockPages

ASSERT(NumberOfPages != 0)

MDL에는 페이지가 없습니다.

MmUnlockPages

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

MDL과 연결된 프로세스에 잠긴 페이지가 없습니다.

MmUnlockPages

ASSERT(Page <= MmHighestPhysicalPage)

MDL의 페이지 프레임 포인터가 잘못되었습니다.

MmBuildMdlForNonPagedPool

ASSERT(MemoryDescriptorList-ByteCount> != 0)

MDL에서 설명하는 버퍼 길이는 0바이트입니다.

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은 페이지가 0인 버퍼를 설명합니다.

MmMapLockedPagesSpecifyCache

ASSERT(MemoryDescriptorList-ByteCount> != 0)

MDL의 길이는 0입니다.

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은 0바이트 길이의 버퍼를 설명합니다.

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)

실제 메모리가 4GB를 넘지 않는 x86 기반 시스템에서 실행되지만 I/O 공간 주소의 높은 32비트를 지정하기 위해 이 함수에 전달된 매개 변수는 0이 아닙니다.

MmMapIoSpace

ASSERT(NumberOfBytes != 0)

매핑할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다.

MmMapIoSpace

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

주소 분노의 페이지가 I/O 공간에 없습니다.

MmUnmapIoSpace

ASSERT(NumberOfBytes != 0)

매핑을 해제할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다.

MmAllocateContiguousMemory

ASSERT(NumberOfBytes != 0)

할당할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다.

MemorySpecifyCache

ASSERT(NumberOfBytes != 0)

할당할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다.

MmAllocateNonCachedMemory

ASSERT(NumberOfBytes != 0)

할당할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다.

MmFreeNonCachedMemory

ASSERT(NumberOfBytes != 0)

해제할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다.

MmFreeNonCachedMemory

ASSERT(PAGE_ALIGN(BaseAddress) == BaseAddress)

기본 주소를 지정하기 위해 이 함수에 전달된 매개 변수가 잘못되었습니다.