반응형

개발하고 있는 파일 시스템 필터 드라이버 ...


일단 기본기능은 구현했다만,,,이놈 저놈 테스트시마다 문제가 발생한다.

이번에 만난 문제는 Windows2000에서의 구동문제다.

Sfilter
를 기반으로한 드라이버이고, WindowsXP Vista에서는 정상 구동...

Windows 2000의 경우, 이미 로드된 파일시스템 드라이버에 대한 통지를 받지 못한다고 하니,
추가 코드가 필요하려니 하긴 했지만, 예상치 못한 문제가 발생한다.

1. 첫번째 문제 - SLIST ( 이건 파일시스템 필터와 관련된건 아니지만)
드라이버를 설치하고 로드하려고 하니 아래와 같은 메시지를 뱉어내며, 로딩이 안된다.


뭔가 Win2k에서 지원하지 않는 함수를 쓴거 같기는 한데...
네이버에 물어보니 ExFreeToNPagedLookasideList()와 관련이 있단다. 내부적으로 SList관련 함수를 쓰는 모양이다
.

그렇지만 의문이 생기는 것은 Sfilter도 동일한 함수를 사용했지만, Sfilter 드라이버는 win2k에서 로딩이 된다는 거다
..
하나 하나 추적하며 테스트 해보니, 결국 ExFreeToNPagedLookasideList()을 사용한 코드가 문제이긴 했다
.
원인이 뭘까
?

----------------------------------------------------------------------------------------------------
Sfilter
에는 다음의 구문이 존재한다. Win2k에서 SList를 쓰기위한 먼가의 정의 인거 같다.

#ifndef _WIN2K_COMPAT_SLIST_USAGE
#define _WIN2K_COMPAT_SLIST_USAGE
#endif


우선 문제의 해결은 위의 구문을 헤더에 추가해 주거나, Sorces파일에 다음 구문을 추가해 주면 된다.

C_DEFINES=$(C_DEFINES) -D_WIN2K_COMPAT_SLIST_USAGE

그리고 원인을 찾고 나니 눈에 띄는 ExFreeToNPagedLookasideList() 관련 DDK문서의 내용...
On Microsoft Windows 2000, drivers must use the
D_WIN2K_COMPAT_SLIST_USAGE switch to successfully link code that uses ExFreeToPagedLookasideList

그런데.. ExFreeToNPagedLookasideList 도 똑같구만.. ExFreeToNPagedLookasideList
섹션에는 커맨트를 빼먹어서 사람을 혼란스럽게 하냔 말이다
.
(
역시 소스를 참고할때는 꼼꼼해 살펴봐야 손가락이 고생안한다. )


----------------------------------------------------------------------------------------------------
위와 같이 처리하는 이유는 wdm.h에 존재하는 아래의 코드 때문이다.

#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
NTKERNELAPI
PSLIST_ENTRY
FASTCALL
ExInterlockedPopEntrySList (
__inout PSLIST_HEADER ListHead,
__inout __deref __drv_neverHold(KeSpinLockType) PKSPIN_LOCK Lock
);

NTKERNELAPI
PSLIST_ENTRY
FASTCALL
ExInterlockedPushEntrySList (
__inout PSLIST_HEADER ListHead,
__inout __drv_aliasesMem PSLIST_ENTRY ListEntry,
__inout __deref __drv_neverHold(KeSpinLockType) PKSPIN_LOCK Lock
);

#else

#define ExInterlockedPopEntrySList(ListHead, Lock) \
InterlockedPopEntrySList(ListHead)
#define ExInterlockedPushEntrySList(ListHead, ListEntry, Lock) \
InterlockedPushEntrySList(ListHead, ListEntry)

#endif

* 2011.05.04 추가


2. 두번째 문제 Filter Group
Sfilter
샘플을 보면, 드라이버의 필터 그룹을 "FSFilter Activity Monitor"로 설정한다.
(Windows 2000
에는 "FSFilter Activity Monitor"그룹이 없다던데
....)
MS
에서 만든 샘플이니 일단 따라해 봤다
.
등록도 되고 잘 동작하는듯 보였는데
...
파일 생성/Read/Write 모두 필터링이 안되는 문제가 발생했다
.
확인해 보니 Ntfs드라이버가 생성한 DeviceObject Attach가 안된다
.
Ntfs
파일시스템 등록시 통지를 해주지는 않는 듯 하다
.

필터 그룹을 "Filter"로 해서 등록하니 이제야 정상 동작.

 

규격에 끼워맞춰 코딩하는건 참 지난한 작업인 것 같다.

 

반응형

+ Recent posts