빌드 ASSERT를 확인했습니다.
이 항목에는 드라이버 작성기에서 발생하는 일반적인 ASSERT 목록이 포함되어 있습니다.
이러한 어설션을 처리하는 방법에 대한 몇 가지 팁(및 나열되지 않은 항목)은 확인된 빌드가 문제를 나타내는 방법을 참조하세요.
"호출된 루틴" 열에 나열된 루틴은 드라이버 작성기 또는 시스템 구성 요소가 이 오류를 유발하기 위해 호출하는 가장 일반적인 루틴입니다. 아래에 나열된 루틴 중 일부는 드라이버가 호출하는 문서화된 루틴입니다. 시스템 구성 요소만 호출할 수 있는 내부 루틴도 있습니다. 드라이버에서 다른 함수를 호출하면 호출된 함수가 나열된 함수 중 하나를 내부적으로 호출하여 ASSERT를 발급할 수 있습니다.
참고
확인된 빌드는 Windows 10 버전 1803 이전 버전의 Windows 사용할 수 있었습니다. 드라이버 검증 도구 및 GFlags와 같은 도구를 사용하여 이후 버전의 Windows 드라이버 코드를 확인합니다.
| 호출된 루틴 | ASSERT 텍스트 | 의미 |
|---|---|---|
ASSERT(Length) |
설명되는 사용자 버퍼의 길이는 0입니다. |
|
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가 해제되고 있지만 I/O 완료가 아직 이 IRP를 처리한 모든 드라이버에 대해 완료되지 않았습니다. |
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) |
상태 == 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 상태로 반환된 루틴을 동기적으로 디스패치합니다. |
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에서 설명하는 버퍼의 페이지가 비정상적으로 많은 횟수만큼 메모리에 잠겼습니다. |
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의 페이지 프레임 포인터가 잘못되었습니다. |
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인 버퍼를 설명합니다. |
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에서 설명하는 버퍼에는 메모리에 잠겨 있지 않은 페이지가 포함되어 있습니다. |
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에서 설명하는 버퍼에는 메모리에 잠겨 있지 않은 페이지가 포함되어 있습니다. |
ASSERT(PhysicalAddress.HighPart == 0) |
실제 메모리가 4GB를 넘지 않는 x86 기반 시스템에서 실행되지만 I/O 공간 주소의 높은 32비트를 지정하기 위해 이 함수에 전달된 매개 변수는 0이 아닙니다. |
|
MmMapIoSpace |
ASSERT(NumberOfBytes != 0) |
매핑할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다. |
MmMapIoSpace |
ASSERT(PointerPte-u.Hard.Valid> == 0) |
주소 분노의 페이지가 I/O 공간에 없습니다. |
ASSERT(NumberOfBytes != 0) |
매핑을 해제할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다. |
|
ASSERT(NumberOfBytes != 0) |
할당할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다. |
|
MemorySpecifyCache |
ASSERT(NumberOfBytes != 0) |
할당할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다. |
ASSERT(NumberOfBytes != 0) |
할당할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다. |
|
MmFreeNonCachedMemory |
ASSERT(NumberOfBytes != 0) |
해제할 바이트 수를 지정하기 위해 이 함수에 전달된 매개 변수는 0입니다. |
MmFreeNonCachedMemory |
ASSERT(PAGE_ALIGN(BaseAddress) == BaseAddress) |
기본 주소를 지정하기 위해 이 함수에 전달된 매개 변수가 잘못되었습니다. |