정보공간_1

[6기 대구 류지현] FileSystem Minifilter Driver #1 본문

IT 놀이터/Elite Member Tech & Talk

[6기 대구 류지현] FileSystem Minifilter Driver #1

알 수 없는 사용자 2014. 11. 26. 03:04

안녕하세요. 대구멤버십 21-1기 류지현입니다.

오늘은 FileSystem Minifilter Driver의 Load와 Unload에 대해서 알아보겠습니다.

 

드라이버를 설치하는 방법에는 2가지가 있습니다. 첫번째로는 inf파일을 이용하는 방법이고, 다른 방법은 설치를 위한 프로그램을 만들어서, 서비스를 등록하는 방법입니다.

두 방법 모두 동일한 역할을 수행하는 것이기 때문에 본인의 프로젝트 상황에 맞추어 사용하면 되겠습니다.

 

inf파일을 보기위해서 프로젝틀 생성해 보겠습니다.

wdk 버전이 올라가면서 visual studio 2013에서는 아래와 같이 드라이버 프로젝트를 바로 만들 수 있게 되었습니다.

프로젝트를 생성하게되면 inf파일도 프로젝트에 포함되어 있는데 이것도 wdk 버전이 올라가며서 편해진 부분입니다.

아래파일이 프로젝트 생성시 기본적으로 만들어지는 inf파일 입니다.

 

TestDriver.inf

 

inf파일을 보면 Signature, Class, ClassGuid등 다양한 지시자들을 볼 수 있는데, 이번 포스팅에서는 그중에서

StartType과 Altitude에 대해서만 간략히 설명하겠습니다.

 

1) StartType

SERVICE_BOOT_START (0x00000000)

SERVICE_SYSTEM_START (0x00000001)

SERVICE_AUTO_START (0x00000002)

SERVICE_DEMAND_START (0x00000003)

SERVICE_DISABLED (0x00000004)

위의 5가지 값을 StartType으로 설정해서 드라이버를 설치 할 수 있습니다.

각각의 StartType에 따라 드라이버의 Loading 시점을 설정 할 수 있습니다.

 

2) Altitude

Altitude는 파일시스템 미니필터 드라이버가 필터 매니저에 등록되는 위치를 나타내는 값으로 특정 범위마다 Load Order Groups으로 구분되어 드라이버의 역할 맞는 Altitude를 사용해야 합니다.

Load Order Groups은 Activity Monitor, AntiVirus, Excrption등 다양한 그룹이 있으며 모든 그룹을 확인 하시려면 아래 링크에서 확인 하실 수 있습니다.

 

Load Order Groups

 

Altitude 사용시 주의할 점으로 기존에 사용되고 있는 Altitude에 드라이버를 로드 할 경우 드라이버가 로드 되지 않습니다.

아래 링크에서는 msdn에 등록되어 있는 Altitude를 확인 해 볼 수 있습니다.

 

Allocated Altitude

 

드라이버는 StartType과 Altitude에 따라 로드되는 시점이 결정되게 됩니다. 각각의 드라이버는 StartType에 따라 기본적인 로드 시점이 결정되고 같은 StartType의 경우 Altitude가 작은 드라이버부터 로드되게 됩니다.

소스를 이용해서 드라이버를 설치하는 부분은 아래 파일을 참고 하시면 됩니다.

 

Loader.cpp

Loader.h

 

소스에서는 드라이버 설치시 드라이버를 서비스에 등록하고, 기타 레지스트리를 설정하고, 삭제시 서비스에서 드라이버를 제거하는 동작을 수행합니다.

 

다음으로는 드라이버 로드와 언로드시 드라이버의 동작을 살펴 보겠습니다.

DriverEntry 루틴은 드라이버 진입점으로써 드라이버를 로드하게 되면 가장 먼저 호출되는 함수입니다.

DriverEntry 루틴에서는 기본적으로 2가지 작업을 수행해야 하는데

필터매니저에 드라이버를 등록하는 작업과, 드라이버의 동작을 시작하는 작업입니다.

드라이버를 등족하는 작업에서는 해당 드라이버가 어떤 IRP에 대한 콜백작업을 수행할 것인지, 어떤 Context를 사용할 것인지, 그리고 Instance 관련된 Callback과 Unload 루틴등을 등록해 주어야 합니다.

언로드 루틴은 드라이버가 언로드 될때 호출이 되고 여기에서는 드라이버를 필터매니저에서 등록 해제 시켜주는 작업을 수행해야 합니다.

각각의 루틴을 수행하는 함수는 다음과 같습니다.

 

FltRegisterFilter() : 드라이버 등록

FltStartFiltering() : 드라이버 동작 시작

FltUnregisterFilter() : 드라이버 등록 해제

 

파일 시스템 미니필터 드라이버의 경우 DriverEntry루틴을 수행한다고 해서 드라이버가 바로 동작을 하는것은 아닙니다.

일반적으로 컴퓨터를 사용할 때 여러 볼륨이 존재하는데 각각의 볼륨에 대해서 드라이버가 동작하기 위해서 Instance가 생성되어야 합니다.

인스턴스의 생성은 드라이버를 등록하는 과정 ( FltRegisterFilter() )에서 등록한 InstanceSetup콜백에서 수행됩니다.

InstanceSetup()루틴에서는 VolumeDeviceTyp, VolumeFilesystemType을 확인 할 수 있는데

이를 이용해서 작성한 드라이버에 맞게 드라이버가 동작 할 볼륨에 Instance를 생성해 주어야 합니다.