본문 바로가기

삽질

미니필터 유저 모드 어플리케이션 '식별자를 찾을수 없습니다.' 에러

Minifilter 드라이버의 유저모드에서 \WINDDK\inc\ddk, \WINDDK\inc\api 를 추가하고도 Fillterxxx 함수를 사용할때 다음의 에러가 발생한다면

error C3861: 'FilterConnectCommunicationPort': 식별자를 찾을 수 없습니다.

stdafx.h 등에 선언되어있는 윈도우 버전 선언을 잘보자.

필터 매니저가 WinXP 서비스팩 2 부터 동작하기 때문에 그보다 높은 버전을 입력하거나 선언부분을 지우면 된다.

fltUser.h에 보면 다음과 같은 부분이 있다.

//
// IMPORTANT!!!!!
//
// This is how FltMgr was released (from oldest to newest)
// xpsp2, (srv03, w2ksp5), LH
//

//
// The defines items that are part of the filter manager baseline
//

#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))

//
// This defines items that were added after XPSP2 was released. This means
// they are in Srv03 SP1, W2K SP5, and Longhorn
//

#define FLT_MGR_AFTER_XPSP2 (((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))

//
// This defines items that only exist in longhorn or later
//

#define FLT_MGR_LONGHORN (NTDDI_VERSION >= NTDDI_VISTA)



예를 들어 WTL 8 에서 생성한 코드에서

#define WINVER  0x0500
#define _WIN32_WINNT 0x0501
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0200

부분을

#define WINVER  0x600
#define _WIN32_WINNT 0x0601
#define _WIN32_IE 0x0501
#define _RICHEDIT_VER 0x0200

바꾸어 주면된다. 윈도 2000 서비스팩 5에서도 필터매니저가 동작하나 보다.