최신목록

2017년 3월 30일 목요일

[파일로그]파일 시스템 미니 필터 드라이버(minispy)

이전에는 파일로그 구현시 파일 필터 드라이버를 만들었었다. 그러다 드라이버가 가지는 리스크를 조금이라도 줄여보기 위해서 미니필터 드라이버를 지원하여 callback 형식으로 처리를 하게 하였다. WDK에 보면 이 드라이버 샘플이 존재하는데 이것이 minispy이다.

이 샘플을 빌드하는건 정리를 하지 못하였다. 이 글을 쓸 당시 기존에 빌드하던 드라이버를 다시 사용하려니 정리를 안해놔서 헤맨 상태여서 헤맨 부분만 일단 정리한다.

현재 테스트 하고 싶은 부분은
ondemand 타입의 드라이버에서 메모리 릭이 발생하면 드라이버 unload 시 메모리가 free가 되는가?
이부분은 나중에 테스트 해서 다시 올리도록 하겠다.

지금은 minispy 로드하고 start 하고 상태 확인 하는 방법...정도??ㅎㅎ

일단 MS에서 fltmc라는 기본적인 테스팅 툴을 제공한다.
이를 이용하면 driver의 상태를 쉽게 확인할 수 있다.


fltmc는 현재 설치되고 로드된 필터 드라이버들을 보여준다.
minispy는 존재하지 않는다. minispy.inf를 이용하여 설치 후에도 필터 드라이버는 보이지 않는다. 설치 확인은 msinfo32.exe를 이용하여 확인이 가능하고 sc query minispy 를 이용하여도 상태를 확인할 수 있다.

driver 상태 확인

> sc query driver_name

driver 시작

> sc start driver_name 
또는
> fltmc load driver_name

driver 중지

> sc stop driver_name

driver 제거

> sc delete driver_name



댓글 8개:

  1. 안녕하세요. minifilter 드라이버를 연구중에 궁금한점이 있어서 글남깁니다.. MiniFSWatcher(https://github.com/CenterDevice/MiniFSWatcher) 라는 오픈소스를 가지고 이것저것 해보고 있는데요, 특정 컴포터에서는 pre post callback 함수가 호출이 안됩니다. 함수 시작지점에 dbgprint 로 로그를 남겼지만 dbgview 로 봤을 대 아무것도 보이지 않습니다. DriveEntry 에서 호출하는 함수들은 모두 성공을 한 상태이고요. 대체 뭐가 문제일까요? 답답한 마음에 혹시나 남겨봅니다. 호출이 안되는 컴퓨터의 사양은 다음과 같습니다.

    CPU : AMD Ryzen 1700
    RAM : DDR4 32GB
    HDD : 256G SSD, 4TB HDD
    OS : Windows 10 64bit Build No. 15063.332

    감사합니다.

    답글삭제
  2. 안녕하세요 특정 컴퓨터만 안되신다고하면 답답한 상황이네요. 일단 확인하고 싶은 부분은
    1. dbgview에 Capture Kernel 이 활성화 되있는지 궁금하구요.
    2. DriveEntry의 호출 함수가 모두 성공했다는건 dbgview에서 로그로 확인하신 내용인지 아니면 windbg 같은걸로 확인하신 내용인지 궁금합니다.

    답글삭제
    답글
    1. 답변감사드립니다. dbgview 를 관리자권한으로 실행했고, Capture Kernel은 활성화되어있습니다. DriveEntry 함수들의 성공 여부는, 함수들의 리턴값으로 확인했습니다. 모두 0을 리턴했고 함수의 끝까지 도달하였습니다. 어떤 문제인걸까요? 의심나는 부분있다면 어떤 것이든 부탁드립니다~!

      삭제
    2. fltmc instances 로 확인시 minispy에 대한 필터 인스턴스가 잘 생성이 되있나요?

      삭제
    3. msdn에 의하면 vista 이상부터는 dbgprint 말고 dbgprintex를 사용하라고 되있네요. 어떤 이유에서 안되는지 궁금하네요. 해결되시면 공유부탁드려요^^

      In Microsoft Windows Server 2003 and earlier versions of Windows, the DbgPrint routine sends a message to the kernel debugger. In Windows Vista and later versions of Windows, DbgPrint sends a message only if certain conditions apply. Specifically, it behaves like the DbgPrintEx routine with the DEFAULT component and a message importance level of DPFLTR_INFO_LEVEL. In other words, the following two function calls are identical:

      삭제
    4. https://docs.microsoft.com/ko-kr/windows-hardware/drivers/devtest/reading-and-filtering-debugging-messages

      이 글을 참고하세요 DPFLTR_INFO_LEVEL대신 DPFLTR_ERROR_LEVEL 사용하시면 모든 메세지가 표시될듯 하네요.

      삭제
    5. 문제 해결했습니다 ㅠ minifilter 드라이버에서 attach 한 드라이브와 어플에서 watching 하려고 설정한 드라이브가 틀려서 생긴 문제였습니다. minifilter 드라이버를 auto attach 시키다보니 이런 문제가 생기네요. 답변감사했습니다. 혹시 나중에라도 도움이 되시기를 바랍니다~!

      삭제
    6. 아 네~ 잘 해결되셨다니 다행이네요~^^

      삭제