버그 검사 0xE6: DRIVER_VERIFIER_DMA_VIOLATION

DRIVER_VERIFIER_DMA_VIOLATION 버그 검사 값은 0x000000E6. 모든 드라이버 검증 도구 DMA 확인 위반에 대한 버그 검사 코드입니다.

중요

이 문서는 프로그래머를 위한 것입니다. 컴퓨터를 사용하는 동안 블루 스크린 오류 코드를 받은 고객인 경우 블루 스크린 오류 문제 해결을 참조하세요.

참고

드라이버 검증 도구를 사용하도록 설정하지 않은 경우 E6 주요 버그 검사 코드를 관찰할 수 있습니다. 드라이버 검증 도구를 사용하지 않고 이 코드가 발생하는 경우 자세한 내용은 DMA 확인 페이지를 참조하세요.

DRIVER_VERIFIER_DMA_VIOLATION 매개 변수

매개 변수 1은 관심 있는 유일한 매개 변수입니다. 이 매개 변수는 정확한 위반을 식별합니다. 디버거가 연결된 경우 디버거에 정보 메시지가 표시됩니다.

매개 변수 1 오류 및 디버거 메시지의 원인

0x00 - 기타 DMA 오류입니다.

이 코드는 매개 변수 2에 표시된 두 가지 종류의 오류를 나타낼 수 있습니다.

0x1 - 드라이버가 맵 레지스터 파일의 끝에 너무 많은 바이트를 플러시하려고 했습니다.

매개 변수 3 - MDL에 남아 있는 바이트 수입니다.

매개 변수 4 - 플러시하도록 요청된 남은 바이트 수입니다.

0x2 - Windows에 연속 지도 레지스터가 부족합니다.

매개 변수 3 - 필요한 맵 레지스터입니다.

매개 변수 4 - 연속 맵 레지스터의 수입니다.

0x01

성능 카운터가 감소했습니다. 카운터의 이전 값과 새 값이 표시됩니다.

0x02

성능 카운터가 너무 빠르게 증가했습니다. 카운터 값이 디버거에 표시됩니다.

0x03

드라이버가 너무 많은 DMA 공통 버퍼를 해제했습니다. 일반적으로 동일한 버퍼를 두 번 해제했습니다.

매개 변수 2 - 해제된 추가 일반 버퍼 수입니다.

0x04

드라이버가 너무 많은 DMA 어댑터 채널을 해제했습니다. 일반적으로 동일한 어댑터 채널을 두 번 해제했습니다.

매개 변수 2 - 해제된 추가 어댑터 채널 수입니다.

0x05

드라이버가 너무 많은 DMA 맵 레지스터를 해제했습니다. 일반적으로 동일한 맵 레지스터를 두 번 해제했습니다.

매개 변수 2 - 해제된 추가 맵 레지스터 수입니다.

0x06

드라이버가 너무 많은 DMA 분산/수집 목록을 해제했습니다. 일반적으로 동일한 분산/수집 목록을 두 번 해제했습니다.

매개 변수 2 - 할당된 분산형 수집 목록입니다.

매개 변수 3 - 분산형 수집 목록이 해제되었습니다.

0x07

드라이버는 먼저 모든 공통 버퍼를 해제하지 않고 어댑터를 해제하려고 했습니다.

매개 변수 2 - DMA 어댑터에 대한 포인터입니다.

매개 변수 3 - 미해결 공통 버퍼 수입니다.

매개 변수 4 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x08

드라이버는 먼저 모든 어댑터 채널, 공통 버퍼 또는 분산/수집 목록을 해제하지 않고 어댑터를 해제하려고 했습니다.

매개 변수 2 - DMA 어댑터에 대한 포인터입니다.

매개 변수 3 - 미해결 어댑터 채널 수입니다.

매개 변수 4 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x09

드라이버는 먼저 모든 맵 레지스터를 해제하지 않고 어댑터를 해제하려고 했습니다.

매개 변수 2 - DMA 어댑터에 대한 포인터입니다.

매개 변수 3 - 미해결 맵 레지스터 수입니다.

매개 변수 4 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x0A

드라이버는 먼저 모든 분산/수집 목록을 해제하지 않고 어댑터를 해제하려고 했습니다.

매개 변수 2 - DMA 어댑터에 대한 포인터입니다.

매개 변수 3 - 미해결 분산형 수집 목록의 수입니다.

매개 변수 4 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x0B

드라이버가 동시에 너무 많은 어댑터 채널을 할당했습니다(어댑터당 하나의 어댑터 채널만 허용됨).

매개 변수 2 - 미해결 어댑터 채널.

0x0C

드라이버가 동시에 너무 많은 맵 레지스터를 할당하려고 했습니다.

매개 변수 2 - 필수 맵 레지스터입니다.

매개 변수 3 - 최대 맵 레지스터입니다.

0x0D

드라이버가 어댑터 버퍼를 플러시하지 않았습니다.

매개 변수 2 - 매핑된 바이트 수입니다.

매개 변수 3 - 한 번에 매핑할 수 있는 최대 바이트 수입니다.

0x0E

드라이버는 버퍼를 잠그지 않고 DMA 전송을 시도했습니다. 문제의 버퍼가 페이징된 메모리에 있었습니다.

매개 변수 2 - DMA 버퍼 MDL의 주소입니다.

0x0F

드라이버 또는 하드웨어가 할당된 DMA 버퍼 외부에 작성되었습니다. 매개 변수 2는 위반 코드입니다.

0x01: DMA 버퍼가 수정되기 전의 태그입니다. 예상 태그는 DmaVrfy0입니다.

매개 변수 3 - 버퍼 길이입니다.

매개 변수 4 - 버퍼 시작.

0x02: DMA 버퍼가 수정된 후의 태그입니다.

예상 태그는 DmaVrfy0입니다.

매개 변수 3 - 버퍼 길이입니다.

매개 변수 4 - 버퍼 시작.

0x03: 무료 맵 레지스터를 덮어씁니다.

매개 변수 3 - 손상 주소입니다. 예상 채우기 패턴이 0x0F.

0x04: 버퍼가 잘못 수정되기 전의 패딩입니다.

매개 변수 3 - 버퍼 시작. 예상 안쪽 여백이 0x0F.

매개 변수 4 - 손상 주소입니다.

0x05: 버퍼가 잘못 수정된 후 안쪽 여백입니다.

매개 변수 3 - 버퍼 시작.

매개 변수 4 - 손상 주소입니다. 예상 안쪽 여백 패턴이 0x0F.

0x10

드라이버는 지도 레지스터를 해제하려고 시도했지만 일부는 여전히 매핑되었습니다.

매개 변수 2 - 여전히 매핑된 레지스터 수입니다.

0x11

드라이버에 어댑터에 대한 미해결 참조 수가 너무 많습니다.

매개 변수 2 - 참조 수입니다.

매개 변수 3 - DMA 어댑터에 대한 포인터입니다.

매개 변수 4 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x13

드라이버가 부적절한 IRQL에서 DMA 루틴을 호출했습니다. 매개 변수 2는 위반 코드입니다.

0x01: 현재 IRQL이 예상과 다릅니다.

매개 변수 3 - 예상 IRQL입니다.

매개 변수 4 - 현재 IRQL.

0x02: 현재 IRQL이 예상보다 높습니다.

매개 변수 3 - 예상되는 최대 IRQL입니다.

매개 변수 4 - 현재 IRQL.

0x14

드라이버가 부적절한 IRQL에서 DMA 루틴을 호출했습니다.

0x15

드라이버가 너무 많은 맵 레지스터를 할당하려고 했습니다.

매개 변수 2 - 할당된 맵 레지스터입니다.

매개 변수 3 - 최대 맵 레지스터입니다.

0x16

드라이버가 매핑되지 않은 버퍼를 플러시하려고 했습니다.

매개 변수 2 - 맵 레지스터의 시스템 가상 공간에 있는 주소입니다.

매개 변수 3 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x18

드라이버는 이미 릴리스되어 더 이상 존재하지 않는 어댑터를 사용하여 DMA 작업을 시도했습니다.

매개 변수 2 - DMA 어댑터에 대한 포인터입니다.

매개 변수 3 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x19

드라이버는 Null DMA_ADAPTER 값을 HAL 루틴에 전달했습니다.

0x1B

드라이버는 주소와 MDL을 HAL 루틴에 전달했습니다. 그러나 이 주소는 이 MDL의 범위 내에 있지 않습니다.

매개 변수 2 - MDL 범위를 벗어난 가상 주소입니다.

매개 변수 3 - MDL.

0x1D

드라이버가 이미 매핑된 주소 범위를 매핑하려고 했습니다.

매개 변수 2 - 매핑 시작을 위한 버퍼입니다.

매개 변수 3 - 끝을 매핑할 버퍼입니다.

매개 변수 4 - 이미 매핑된 버퍼의 시스템 주소입니다.

0x1E

HalGetAdapter라는 드라이버입니다. 이 함수는 사용되지 않습니다. 대신 IoGetDmaAdapter를 사용해야 합니다.

0x1F

잘못된 DMA 버퍼입니다. 드라이버는 첫 번째 MDL 이전 또는 첫 번째 MDL의 끝 이후 또는 MDL 버퍼보다 긴 전송 길이를 사용하여 잘못된 시스템 주소를 참조했습니다.매개 변수 2는 위반 코드입니다.

0x01: 가상 버퍼 주소가 첫 번째 MDL 앞에 있습니다.

매개 변수 3 - DMA 버퍼 시작의 가상 주소입니다.

매개 변수 4 - DMA 버퍼를 설명하는 첫 번째 MDL에 대한 포인터입니다.

0x02: 가상 주소는 첫 번째 MDL 이후입니다.

매개 변수 3 - DMA 버퍼 시작의 가상 주소입니다.

매개 변수 4 - DMA 버퍼를 설명하는 첫 번째 MDL에 대한 포인터입니다.

0x03: 추가 전송 길이가 페이지 경계를 넘습니다.

매개 변수 3 - DMA 버퍼를 설명하는 MDL에 대한 포인터입니다.

매개 변수 4 - DMA 전송 길이입니다.

0x04: DMA 버퍼의 가상 주소가 캐시 정렬되지 않았습니다.

매개 변수 3 - DMA 버퍼 시작의 가상 주소입니다.

매개 변수 4 - DMA 버퍼를 설명하는 MDL에 대한 포인터입니다.

0x05: DMA 버퍼 길이가 캐시 정렬되지 않았습니다.

매개 변수 3 - DMA 버퍼의 길이입니다.

매개 변수 4 - DMA 버퍼를 설명하는 MDL에 대한 포인터입니다.

0x20

드라이버가 매핑되지 않은 맵 레지스터를 플러시하려고 했습니다.

매개 변수 2 - 맵 레지스터 기준입니다.

매개 변수 3 - DMA 버퍼 시작의 VA입니다.

매개 변수 4 - DMA 버퍼를 설명하는 데 사용되는 MDL에 대한 포인터입니다.

0x21

드라이버는 전송을 위해 길이가 0인 버퍼를 매핑하려고 했습니다.

매개 변수 2 - 해당 내부 검증 도구 데이터에 대한 포인터입니다.

0x22

시스템 VA에서 매핑되지 않은 DMA 버퍼입니다.

매개 변수 2 - MDL

0x23

완료되거나 취소되지 않은 채널을 플러시할 수 없습니다.

매개 변수 2 - 위반 코드입니다.

값: 0x00: 잘못된 채널 플러시

매개 변수 3 - 컨트롤러 ID입니다.

매개 변수 4 - 채널 번호입니다.

0x24

요청된 길이에 대한 버퍼가 부족합니다.

매개 변수 2 - 계산되지 않은 길이입니다.

0x25

알 수 없는 디바이스 설명 버전입니다.

0x26

IOMMU가 DMA 위반을 감지했습니다.

매개 변수 2 - 결함이 있는 디바이스의 디바이스 개체입니다.

매개 변수 3 - 오류 정보(일반적으로 실제 주소 오류).

매개 변수 4 - 오류 유형(하드웨어별).

원인

원인에 대한 설명은 매개 변수 섹션의 각 코드 설명을 참조하세요.

해결 방법

이 버그 검사 드라이버 검증 도구가 하나 이상의 드라이버를 모니터링하라는 지시를 받은 경우에만 발생할 수 있습니다. 드라이버 검증 도구를 사용하지 않으려면 비활성화해야 합니다. 이 문제를 일으킨 드라이버를 제거하는 것도 고려할 수 있습니다.

드라이버 작성기인 경우 이 버그 검사 통해 얻은 정보를 사용하여 코드의 버그를 수정합니다.

드라이버 검증 도구에 대한 자세한 내용은 드라이버 검증 도구를 참조하세요.