삽질2008.09.29 11:30

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에서도 필터매니저가 동작하나 보다.

신고
Posted by 꿍스
삽질2008.09.10 00:18
Minifilter를 사용할때 유저모드 어플리케이션에서 FilterSendMessage로 필터로 메세지를 보내고 받을때

HRESULT
WINAPI

  FilterSendMessage(
    IN HANDLE  hPort,
    IN LPVOID  lpInBuffer OPTIONAL,
    IN DWORD  dwInBufferSize,
    IN OUT LPVOID  lpOutBuffer OPTIONAL,
    IN DWORD  dwOutBufferSize,
    OUT LPDWORD  lpBytesReturned
    ); 

lpInBuffer과 dwInBufferSize를 NULL, 0 으로 잡고 필터에 메세지를 보냈더니 리턴되는 HRESULT 값에 E_INVALIDARG 값으로 에러가 리턴되어 왔다. 분명히 WDK문서를 봐도 NULL이 될수 있다고 하는데 이상하다.

그래서 아무문자나 InBuffer에 입력하고 그 문자열 길이를 dwInBufferSize에 넣어주니 잘 동작한다.

검색해보니 나랑 비슷한 사례가 있다.

https://www.osronline.com/ShowThread.cfm?link=128683
신고
Posted by 꿍스
삽질2008.08.06 20:22
원본 : http://www.themssforum.com/Drivers/File-System-104809/

Will not work on x64 Vista/2008, also note that NtReadFile hook will not catch
paging IO.
- Maxim Shatskih, Windows DDK MVP

Using a SSDT hook driver for this is incredibly irresponsible. First as Max
pointed out, it will not work for X64, and it will not catch paging I/O.
Also, getting these right is harder than one thinks, and is likely to
destabilize the system. Also, the driver will immediately be flagged as
MALWARE. Following such a path for file operations that are easily
catchable with approved ways, is beyond stupid.
- Don Burn (MVP, Windows DDK)

This can be done with a mini-filter and Microsoft provides one FileSpy that
meets most of the OP's needs. Get the WDK and take a look.

I don't think SSDT hook driver look like malware. Too many HIPS
software are using this technology.
Mini-filter driver maybe is the best way to done this case.

And some not all of these are special cased in the MALWARE detection.
Bottom lime is you cannot hook and unhook safely and it is a damaging
practice that hopefully Microsoft will block in 32 bit someday as well as 64
bit.

결국은 미니 필터 드라이버, WDK에 새로 추가된 미니필터 드라이버를 공부해 보도록 해야겠다.

자료가 별로 없는게 단점이지만 WDK에 minifilter예제들이 있으므로 그걸참고로 해야할듯 -ㅁ-;
신고
Posted by 꿍스