최신목록

2016년 3월 2일 수요일

[WIN32]_WIN32_WINNT와 WINVER 그리고 NTDDI_VERSION

파일시스템 미니필터 드라이버를 작업하고 있는데 Fltxxxx 함수들이 동작하는 OS 버전이 달라서 컴파일이 안될때가 있다.

PINSTANCE_FULL_INFORMATION 구조체가 컴파일이 안되서 FltuserStructures.h를 열어보았다.

#if FLT_MGR_BASELINE

//
//  Disable warning for this file
//

FLT_MGR_BASELINE이 무슨이유에서인지 define이 안되고 있는 상태이다. FLT_MGR_BASELINE을 따라가 보면 OS VERSION의 조건이 만족되어야 한다. 음...
몇부터 되는것이지?? define 내용은 아래와 같다.

#define FLT_MGR_BASELINE (((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WIN2KSP4))) || \
                          ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WINXPSP2))) || \
                          ((OSVER(NTDDI_VERSION) == NTDDI_WS03)  && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WS03SP1))) ||  \
                          (NTDDI_VERSION >= NTDDI_VISTA))

정리해보면 NTDDI_VERSION이 NTDDI_WS03SP1 보다 같거나 높아야한다는것...
음... 하지만 나의 헤더에는 아래와 같이 선언이 되있었다.

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0502
#endif

_WIN32_WINNT 0x0502이면 windows 2003 sp1 이란얘긴데...왜 안되지???
그럼 NTDDI_VERSION은 몇으로 되있는 것일까? 찾아보자 skddkver.h 에 아래와 같이 선언되있다.


#ifndef NTDDI_VERSION
#ifdef _WIN32_WINNT
// set NTDDI_VERSION based on _WIN32_WINNT
#define NTDDI_VERSION   NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT)
#else
#define NTDDI_VERSION   0x06010000
#endif
#endif

이는 NTDDI_VERSION이 따로 선언되있지 않고 _WIN32_WINNT일때는 _WIN32_WINNT를 NTDDI_VERSION으로 컨버팅해서 따라간다는것인데...음...WINDOWS 2003 SP1인데 잘 컨버팅이 됬다면 되야하는데..왜 안되지???

#define NTDDI_VERSION_FROM_WIN32_WINNT2(ver)    ver##0000
#define NTDDI_VERSION_FROM_WIN32_WINNT(ver)     NTDDI_VERSION_FROM_WIN32_WINNT2(ver)

음...별거없네 그냥 뒤에 0000만 더 붙인것...그럼 0x05020000 인데...
NTDDI_VERSION 정의를 살펴보자.


NTDDI_WS03SP1은 0x05020100 으로 _WIN32_WINNT에 0000만 붙여서 해결되지 않는다.
NTDDI_VERSION_FROM_WIN32_WINNT 믿을놈이 못된다..ㅋㅋ

잘 확인하고 사용하자.




댓글 없음:

댓글 쓰기