IRP_MJ_MAXIMUM_FUNCTION
아래에 이어서 파일시스템 필터 드라이버 등록시 발생한 문제.
파일 시스템 드라이버로 등록한 후 재 부팅...
이번에는 문제 없겠지...?
하지만 이번에도 발생한 애매모호한 문제...
재 부팅시 아래와 같은 메시지가 팝업 되는거다.
뜬금없이 왠 페이징 사이즈??
처음에는 드라이버에서 사용하는 전역변수 크기가 너무 큰지?
드라이버 코드가 메모리를 넘 마니 잡아먹는지?
에 초점을 맞춰 봤지만, 이래 저래 코드를 빼봐도 마찬가지 였다.
그러던중, 시스템의 페이징 사이즈 정보를 보니 0으로 설정되어 있는게 아닌가?
좀 쪽 팔린 얘기지만 이 문제 확인하면서, 윈도우즈가 페이징 처리하는 대상 파일이 Pagefile.sys라는걸 알았다.
그렇담... 이놈을 읽거나 쓰는 게 문제가 아닐까?
역시나 디버깅을 해보니, 내가 작성한 드라이버가 C드라이브에 볼륨에 Attach되면 pagefile.sys을 Create할때 몇 번의 에러가 발생하는 게 아닌가?
이번에도 Sfilter와 비교해가며, Attach하는 부분을 싹 다 점검하고, 코드를 하나하나 빼가며 확인하기 시작했다.
문제의 원인은??? ㅡ.ㅡ
바로 이코드다...
for ( i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++ ) { DriverObject->MajorFunction[i] = DispathPassthru; } |
무슨 문제인지 감이 오십니껴????
i < IRP_MJ_MAXIMUM_FUNCTION 가 아니라 i <= IRP_MJ_MAXIMUM_FUNCTION 로 작성해야 하는 코드였다.
ntddk.h파일을 보면
IRP_MJ_CREATE( 0x00 )에서 시작해서
IRP_MJ_PNP( 0x1b ) 까지 정의가 되어 있다.
그런데 IRP_MJ_MAXIMUM_FUNCTION의 값은 0x1c가 아니라 0x1b인거다.
즉 MajorFunction[] 배열을 모두 DispathPassthru로 채워주자면
i <= IRP_MJ_MAXIMUM_FUNCTION 인경우까지 루프를 돌려줘야 한다.
직접적인 연관 관계는 알 수 없지만, IRP_MJ_PNP에 대한 디스패치 함수가 등록되지 않아 발생한 문제로 보여진다.
이 문제 확인하는데 1주일이 걸리긴 했지만...
그래도 pagefile.sys에 대한 내용과 DriverObject->MajorFunction[]를 채우는 부분에 대해
머리속 깊이 각인되었으니 그나마 다행...
그래도 되도록이면 삽질하지 말자..
'Windows Programming > 드라이버' 카테고리의 다른 글
IoGetDiskDeviceObject() - FileSystem Devive Object의 Storage Device Object 얻기 (0) | 2009.05.15 |
---|---|
Windows2000에서 구동되는 파일시스템 필터 드라이버 작성시 주의할것 (0) | 2009.04.23 |
파일 시스템 필터 드라이버 등록하기 #1 - Device Naming (0) | 2009.04.23 |
메모리를 할당한 후 반드시 리턴값을 확인 할 것 (0) | 2009.04.14 |
DRIVER_POWER_STATE_FAILURE (9f) (0) | 2009.04.14 |