Windows OS2011. 10. 10. 19:19
반응형
미니필터를 사용하다 보면 필터매니저의 프레임이라는 개념을 접하게 되는 경우가 있다.
프레임이 여러개 존재하는 상황에 대한 정리가 필요해 기록해 둔다.

1. Frame 0 하나인 상황
먼저 기본적인 상황을 살펴본다.
보통 필터 드라이버 디바이스 스택을 보면 다음과 같다.

kd> !devstack 859a8168  
  !DevObj   !DrvObj            !DevExt   ObjectName
  863d8108  \Driver\AhnFlt2K   863d81c0  
> 859a8168  \Driver\AFPAnsi    859a8220  
  8593c280  \FileSystem\FltMgr 8593c338  ===> Frame 0 
  8592d020  \FileSystem\Ntfs   8592d0d8  

아래에서 두번째 줄에 FltMgr이 보이는에 여기가 바로 필터매니저가 생성한 Frame 0 다.
Frame 0 위에 AFPAnsi와 AhnFlt2k가 있는데 둘 다 위에 있지만 이렇게 위치한 이유가 좀 다르다.

AFPAnsi는 부팅시에 로드하게 되어 있는데 Group이 Filter로 설정되어 있다.
필터 매니저가 관리하는 Altitude 중 가장 위에 Filter 그룹이 위치하므로 FltMgr 위로 올라간 것이다. 

필터 매니저의 Altitude 정보는 아래 링크를 참고하기 바란다.
http://msdn.microsoft.com/en-us/windows/hardware/gg462963.aspx

AhnFlt2k는 수동 로드이고 Group이 없기 때문에 부팅 후에 attach 하면서 맨 위에 붙어 버린 것이다.
이 부분은 나중에 좀 더 꼼꼼히 따져봐야 하는데 일단 현재까지는 이렇게 정리했다.

현재 상태의 프레임 정보를 보면 다음과 같다.

kd> !fltkd.frames

Frame List: 83a159f8 
   FLTP_FRAME: 8531b6c8 "Frame 0" "0 to 429998.99"
      FLT_FILTER: 859e5e30 "V3Flt2K" "326020"
         FLT_INSTANCE: 860c05d0 "V3Flt2K Instance" "326020"
         FLT_INSTANCE: 860c0308 "V3Flt2K Instance" "326020"
      FLT_FILTER: 86172008 "luafv" "135000"
         FLT_INSTANCE: 86155a50 "luafv" "135000"
      FLT_FILTER: 85336980 "FileInfo" "45000"
         FLT_INSTANCE: 858f50e8 "FileInfo" "45000"
         FLT_INSTANCE: 85900830 "FileInfo" "45000"

현재 필터 매니저를 이용중인 미니 필터들을 볼 수 있다.
Frame 0가 모든 Altitude 영역인 0 ~ 429998.99까지 모두 사용하는 것을 볼 수 있다.


2. Frame 0, Frame 1 두 개인 상황
프레임이 두개 보이는 경우가 있는데 이 때 필터 드라이버 디바이스 스택은 다음과 같다.

kd> !devstack 85900c08  
  !DevObj   !DrvObj            !DevExt   ObjectName
  86b786e0  \Driver\AhnFlt2K   86b78798  
  85a19ab8  \FileSystem\FltMgr 85a19b70   ===> Frame 1
> 85900c08  \Driver\AFPAnsi    85900cc0  
  85930648  \FileSystem\FltMgr 85930700  ===> Frame 0  
  85963020  \FileSystem\Ntfs   859630d8  

AFPAnsi의 동작 조건을 수정했더니 이렇게 변한 것이다.
현재 AFPAnsi는 Group을 삭제해서 지정된 Group이 없는 상태다.
그랬더니 Frame 0과 Frame 1 사이에 위치하게 되었다.

필터 매니저는 부팅시에 올라오는 Legacy 필터 드라이버는 비교적 아래쪽의 Altitude를 부여한다.
부팅시에 올라오는 필터 드라이버라서 다른 미니 필터보다 우선 순위를 높여주려는 목적으로 보인다.
(이 부분은 좀 더 확인이 필요한 부분이다.)

프레임 정보를 확인해 보면 Frame 0와 Frame 1이 어떻게 구성되어 있는지 알 수 있다.

kd> !fltkd.frames

Frame List: 8743a9f8 
   FLTP_FRAME: 859dacc0 "Frame 1" "49999 to 326020"
      FLT_FILTER: 859b66d8 "V3Flt2K" "326020"
         FLT_INSTANCE: 85a6ad80 "V3Flt2K Instance" "326020"
         FLT_INSTANCE: 85a658a8 "V3Flt2K Instance" "326020"
      FLT_FILTER: 86852ac0 "luafv" "135000"
         FLT_INSTANCE: 86856008 "luafv" "135000"
 
   FLTP_FRAME: 8531d6c8 "Frame 0" "0 to 49999"
      FLT_FILTER: 8533b438 "FileInfo" "45000"
         FLT_INSTANCE: 858f5118 "FileInfo" "45000"
         FLT_INSTANCE: 85976dc8 "FileInfo" "45000"

Frame 0는 Altitude 0 ~ 49999까지 Frame 0가 사용하면서 Legacy보다도 아래쪽에 위치해야 하는 FileInfo 미니 필터의 자리를 확보해 준다.

AFPAnsi는 부팅시 로드되는 Legacy로 처리되어 바로 이 위에 붙었다.

Frame 1은 Lagacy 위에 붙어서 일반적인 미니 필터들을 위해 49999 부터 현재 가장 높은 altitude인 V3Flt2k의 Altitude인 326020까지 자리를 확보해 준다.

나중에 올라온 AhnFlt2k는 이 위에 붙었다.


3. 여기서 미니 필터가 추가로 로드되는 경우

a) 326020 이하의 Altitude를 가지는 미니 필터가 로드되면 Frame 1 안에서 동작할 것이다.
b) 326021 이상의 Altitude를 가지는 미니 필터가 로드되면 Frame 2 가 생성되고 여기서 동작할 것이다.

이 부분은 아쉽게도 아직 확인해 보지 않았다. ^^

반응형
Posted by GreeMate