반응형

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[]를 채우는 부분에 대해

머리속 깊이 각인되었으니 그나마 다행...

 

그래도 되도록이면 삽질하지 말자..

 

 

반응형

+ Recent posts