뭉근 : 느긋하게 타는 불

PsSetCreateProcessNotifyRoutineEx를 실행하면 아래와 같이 STATUS_ACCESS_DENIED(0xc0000022) 에러가 반환된다.

   

ObCallbackTest: DriverEntry: Driver loaded. Use ed nt!Kd_IHVDRIVER_Mask f (or 7) to enable more traces

ObCallbackTest: DriverEntry: PsSetCreateProcessNotifyRoutineEx(2) returned 0xc0000022

   

이상하게 MS측에서 제공하는 드라이버 샘플 파일은 접근 거부가 일어나지 않는데, 내가 직접 똑같은 소스코드를 사용하여 컴파일한 드라이버를 로드할 경우에는 저 에러가 떴다.

   

MS에 의하면 PsSetCreateProcessNotifyRoutineEx는 Highest Level 드라이버에서만 동작한다고 되어 있어서 드라이버도 권한이 있는건가 싶어서 계속 알아보았는데 아무것도 안나왔다. 따라서 소스코드 문제인가 싶어 WDM, KMDF 드라이버 등을 생성하여 여러 방면으로 함수 호출을 시도해보았지만 문제가 해결되지 않았다.

   

그러나 위의 에러 문구를 검색하니 정말 간단한 문제 해결 방법이 나왔다.

링커 옵션에 INTEGRITYCHECK 옵션을 넣어주면 되는 것이다.

   

다음과 같이 프로젝트 속성의 링커 옵션을 추가해주면 된다.

   

   

아래는 obcallback 샘플의 링커 옵션이다.

   

   

   

INTEGRITYCHECK 옵션이란 메모리 메니저가 PE Header의 플래그값을 확인하여 드라이버 이미지를 로드하기 위하여 디지털 시그너처를 검사하는 것이다. MS에 의하면 모든 드라이버들이 이 기능을 사용하길 추천한다고 명시되어 있다.

   

integritycheck를 검색해보니 이 기능을 사용하지 않을 경우 일부 API를 사용할 수 없다고 한다.

'프로그래밍' 카테고리의 다른 글

Rstudio 3.3.0 스케일링 문제  (0) 2016.05.06
드라이버 개발 삽질 #1  (0) 2015.03.12
ofstream 한글 출력 문제  (0) 2014.10.22
ifstream 64  (0) 2014.09.25
CPP 벡터 반복문 중 원소 지우기  (0) 2014.09.22