Presentation is loading. Please wait.

Presentation is loading. Please wait.

WDM 드라이버의 기본 구조 What is WDM?

Similar presentations


Presentation on theme: "WDM 드라이버의 기본 구조 What is WDM?"— Presentation transcript:

1 WDM 드라이버의 기본 구조 What is WDM?
What are Device Objects and Device Stacks? Something about Kernel-Mode Driver Components

2 Contents Windows 드라이버 소개 Types Design goal Windows Driver Model
What is WDM? Device Objects and Device Stacks What is Device Object? Device Object Type Creating Device Object Named device object NT device name Device extension Properties Device access 제어 Driver Components Standard Driver Routine 필수 루틴 Driver Object Driver Object의 Entry Point 필수 Dispatch Routine Unload routine

3 Types of Windows Drivers
Highest-level drivers always depend on support from underlying lower-level drivers Intermediate drivers depend on support from underlying lower-level drivers. Function/filter driver Lowest-level drivers control an I/O bus to which peripheral devices are connected. 인터미디엇 드라이버는 I/O 요정을 다른 드라이버에게 전달하는 커널모드 드라이버. 인터미디엇 드라이버는 하드웨어 지원을 레지스터 수준에서 다루는 일을 거의 담당하지 않음. 인터미디엇 드라이버는 물리 드라이버와 같이 하드웨어를 조작하는 하위 레벨 드라이버에 의존하는 드라이버.

4 Design Goal for Drivers
Portable Configurable Always pre-emptible and always interruptible Multiprocessor-safe Object-based Packet-driven I/O with reusable IRPs Capable of supporting asynchronous I/O 커널모드 드라이버의 디자인 목표 한 플랫폼에서 다른 플랫폼으로의 이식성 모든 드라이버는 윈도우를 지원하는 하드웨어 플랫폼간에 이식이 되어야 한다. 이를 위해 드라이버 개발자는 "C 로 작성해야 하며[no asm]", WDK에서 지원하는 헤더와 인터페이스만을 사용하여야 한다. 모든 커널모드 드라이버 개발자는 C로 작성해야 한다. 그럼으로써 다른 윈도우 플랫폼간에 재 작성이나 코드의 변경없이 재 컴파일 될수 있다. WDK에서 제공하는 인터페이스를 사용하는것은 시간이 지나 해당 루틴의 내부의 구현이 바뀌더라도 인터페이스는 바뀌지 않기때문에 이식성이 향상된다. 만약 드라이버가 플랫폼 의존적인 정의를 요구한다면, 가장 좋은 방법은 #ifdef 으로 해당 구문을 따로 떼어내는것이다. 그래서 드라이버가 하드웨어 플랫폼에 적합하도록 컴파일되고 링크될수 있다. 하지만, 거의 모든 경우에 WDK마스터 헤더파일(wdm.h or ntddk.h)에서 제공하는 루틴이나 매크로, 상수형과 타입을 사용해서 한 플랫폼에 종속적인 구현을 피할수 있다. 다양한 하드웨어와 소프트웨어 플랫폼에서 설정가능성 하드웨어 설정 가능함 이란 물리적인 수정없이 하드웨어에 변경을 가하는 것이다. 소프트웨어 설정 가능함 이란 디바이스의 하드웨어 리소스를 동적으로 받고 수정할수 있다는 의미이다. 항상 선점 가능하고 인터럽트 가능해야 함. 시스템 성능을 최대화 한다. 어떤 쓰레드라도 더 높은 우선순위를 가진 쓰레드에 의해 선점 당할수 있으며, 어떤 드라이버 인터럽트 서비스 루틴이라도 더 높은 인터럽트 요구 레벨(IRQL)을 가진 루틴에 의해 인터럽트 당할수 있다. 가장 낮은 IRQL을 PASSIVE_LEVEL이라고 부르며, 이 레벨에서는 인터럽트를 무시할수 없다. 다음 레벨은 APC_LEVEL, DISPATCH_LEVEL, WAKE_LEVEL(커널 디버깅시 사용)이 있으며 소프트웨어 인터럽트이다. 디바이스 인터럽트는 여전히 높은 IRQL이다. 가장 높은 IRQL은 시스템 크리티컬한 인터럽트(시스템 클럭, 버스 에러들)로 커널이 예약해 두었다. 멀티 프로세서 환경에서의 안전성 SMP(symmetric multiprocessor) 플랫폼에서 안전하게 실행하기 위해서는, 운영체제는 한 프로세서가 다른 프로세서가 액세스하고 수정하고 있는 데이터에 액세스 하지 못하게 해야한다. NT 커널 컴포넌트는 동기화를 위해서 '스핀락'이라는 메커니즘을 제공한다. 객체 기반 NT 기반의 운영체제는 객제 기반이다. 실행부(Executive)의 다양한 컴포넌트들이 하나 이상의 객체 형태로 정의되어 있다. 각각의 컴포넌트는 객체 타입의 인스턴스를 생성해주는 커널모드 루틴이 있다. 어떠한 컴포넌트도 직접적으로 다른 컴포넌트의 객체에 액세스 할수 없다. 다른 컴포넌트의 객체를 쓰고 싶다면, 해당 컴포넌트에서 제공해 주는 루틴을 call해야 한다. 이러한 디자인은 운영체제를 이식성있고, 유연하게 한다. 드라이버는 WDK에서 제공해주는 루틴이나 인터페이스를 사용해서 운영체제나 다른 드라이버들과 의사소통 해야한다. (이식성을 높이기 위해서는 ,각각의 객체의 내부 구조는 언제라도 바뀔수 있음으로, 시스템이 제공해 주는 루틴을 사용하여 객체를 생성해야 한다.) 재사용 가능한 IRP를 사용한 패킷 driven I/O I/O 매니저, PnP매니저, 파워 매니저는 IRP(I/O Request Packet)을 사용하여 커널모드 드라이버들과, 혹은 드라이버끼리 의사소통을 한다 I/O 매니저의 동작순서 유저 모드 어플리케이션이 요청한 I/O 요청을 받음. I/O 요청에 해당하는 IRPs를 생성 알맞은 드라이버에서 IRPs를 전송 IRPs가 완료될때까지 Tracks(?)함. 원래 요청자에게 I/O 상태를 반환함. 비동기 I/O 지원 I/O 매니저는 비동기 I/O를 제공한다. 따라서 I/O 요청자는 I/O 요청이 끝나기를 기다리는 대신 계속해서 실행할수 있다. 비동기 I/O는 처리량을 증가시키고 성능을 끌어 올린다.

5 QA

6 WDM(Windows Driver Model)
Include wdm.h 세가지 타입의 드라이버로 구분됨(bus/function/filter) 디바이스 오브젝트를 생성. PnP지원 Power Management(전원관리) 지원 WMI 지원. WDM 을 따르지 않는 드라이버(Non-WDM Driver)도 존재함. WDM은 오랜시간동안 개발되어 왔기 때문에, 버전 별 차이가 있다. 이식성을 생각한다면 가장 낮은 버전에 기준을 두고 개발해야 함. 최근 KMDF(Kernel-Mode Driver Framework)를 제공함(WDM보다 간단한 인터페이스)

7 WDM 드라이버 타입 Bus Driver Filter Driver Function Driver
Enumerate the device on its bus Respond to Plug and Play IRPs and power management IRPs Multiplex access to the bus Generically administer the devices on its bus Filter Driver Add value to or modify the behavior of a device Optional Function Driver Handles reads and writes to the device and manage device power policy 버스 드라이버: -버스에 연결된 디바이스들을 열거할 수 있음. (각 디바이스 별 PDO를 생성) -PnP IRP와 전원관리 IRP에 반응함. -Multiplex access to the bus -버스에 연결된 디바이스들을 관리함. 필터 드라이버: -선택사항(필터 드라이버는 존재 할수도/안 할수도 있다) -디바이스의 동작을 추가하거나 동작을 변경한다. 펑션 드라이버: -디바이스에 직접적으로 액세스하고 전원관리(ex>USB 탈/착 시)를 함. **만약 디바이스가 raw모드로 동작한다면, 펑션 드라이버나, lower/upper 필터 드라이버가 존재하지 않는다. 모든 raw 모드의 I/O는 버스드라이버와 버스 필터 드라이버에 의해 동작한다.

8 WDM Driver Layer Example

9 QA

10 Device Object OS represents devices by device object
One or more device object are associated with each device (n:1) Software-only driver still must a device object to represent the target of its operations System passes an IRP data structure to the driver for the top device object in the device stack 디바이스 오브젝트와 디바이스 스택이란 무엇인가? -운영체제는 디바이스를 디바이스 오브젝트를 통해 나타난다. -각 디바이스는 하나이상의 디바이스 오브젝트와 관계되어 있다. -디바이스 오브젝트는 디바이스의 모든 연산(operation)의 타겟이 된다. -커널모드 드라이버는 각 디바이스별로 최소 1개 이상의 디바이스 오브젝트를 생성해야 한다. -클래스/ 포트 드라이버와 연관있는 미니 드라이버(minidrivers that have an associated class/port driver)는 디바이스 오브젝트를 생성할 필요 없음. -Type-specific system 디바이스의 드라이버, NDIS 미니 포트 드라이버 같은, 는 subsystem이 디바이스 오브젝트를 생성한다. -I/O 요청을 처리하는 software only 드라이버라도 디바이스 오브젝트를 생성해야 한다.

11 Types of Device Object Physical Device Object Function Device Object
Represents a device on a bus to a bus driver Function Device Object Represents a device to a function driver Filter Device Object Represents a device to a filter driver Each device objects are all of the type DEVICE_OBJECT, but are used differently and can have different device extensions WDM 디바이스 오브젝트 -다음 세가지 종류의 디바이스 오브젝트는 모두 DEVICE_OBJECT이자만 다르게 사용되며, 다른 디바이스 익스텐션을 가질수 있다. --물리 디바이스 오브젝트 PDO - 버스 드라이버에서 디바이스와 버스간의 연결을 표현. --펑션 디바이스 오브젝트 FDO - 디바이스의 기능성을 관리하기 위해 function 드라이버에서 사용함. --Filter DO - 하드웨어와 필터 작업에 대한 정보를 보관하기 위해 이 객체를 사용. -IOCreateDevice를 통해서 생성하며 IoAttachDeviceToDeviceStack함수를 통해 디바이스 스택의 top에 attach한다.

12 Device Stack 각 PDO들은 하위(부모) 디바이스에서 생성해줌. PDO와 FDO는 반드시 존재함.
When Are WDM Device Object Created? 버스 드라이버는 버스에 물려있는 디바이스별로 PDO를 생성한다. 디바이스 스택상에서 PDO 하단에는 디바이스 오브젝트가 위치할수 없다. PnP매니저는 새로운 디바이스를 찾아내면, '버스 필터 드라이버'가 있는지 확인하고, 그것을 로드하여 AddDevice루틴(디바이스 오브젝트[filter DO]를 생성하고 디바이스 스택에 붙임)을 호출한다. (optional) PnP매니저는 '버스 드라이버'와 '버스 필터 드라이버'들을 다 로드 한 다음 'Lower level 필터 드라이버'를 로드(filter DO를 생성해서 디바이스 스택에 붙임)한다. (optional) PnP매니저는 '펑션 드라이버'를 로드하여 FDO를 디바이스 스택에 붙인다. PnP매니저는 '펑션 드라이버'를 로드 한 다음 'Upper level 필터 드라이버'를 로드(filter DO를 생성하여 디바이스 스택에 붙임) 한다. (optional) 모든 디바이스(버스 어댑터/컨트롤러 혹은 non버스 디바이스)는 PDO랑 FDO를 자신의 디바이스 스택에 가지고 있다. 버스 어댑터/컨트롤러의 PDO는 부모 버스의 버스 드라이버가 생성해 준다. Ex) scsi 어댑터가 PCI버스에 꼽혀 있다면(scsi 어댑터가 PCI 버스의 자식), PCI 버스 드라이버가 scsi 어댑터의 PDO를 생성해 준다. --- Example WDM Device Stack (PCI 버스<USB 호스트 컨트롤러<USB 허브<조이스틱) Root 버스 드라이버가 연결된 디바이스를 발견하면 PDO를 생성해 준다.(PCI버스는 발견된 디바이스중 한 개) PnP매니저는 PCI드라이버를 로드하고 PDO를 넘겨준다. PCI 드라이버는 AddDevice 루틴에서 (PCI 버스를 위한)FDO를 생성해서 디바이스 스택에 붙인다. PnP매니저는 PCI드라이버가 자식 드라이버를 검색(IRP_MN_QUERY_DEVICE_RELATIONS)하도록 하고, PDO를 생성해서 USB 호스트 컨트롤러 드라이버에 보내고.. 뭐 반복... PDO는 부모 버스 드라이버에 의해 생성되고, 디바이스 스택의 최 하단에 위치한다.

13 Creating a Device Object
Device Extension is a system-allocated storage area that the driver can use for device-specific storage Device Type represented by the device object Characteristic indicate the device characteristics for the device Exclusive indicate the driver services an exclusive device WDM drivers must set FALSE Driver Object point to their driver object in their DriverEntry routine Device Name is an optional pointer to a null-terminated Unicode String Only with non-WDM/Bus drivers Creating a Device Object 디바이스 객체를 생성하지 않은 디바이스는 IRP(Interrupt Request Packet)를 받지 못한다. 클래스/포트 드라이버와 관련있는 (be associated with)미니 드라이버는 디바이스 오브젝트를 생성할 필요가 없다. 대신에 클래스/포트 드라이버가 생성한 디바이스 객체를 통해 디바이스에 요청된 IRP를 받는다. 디바이스 객체를 생성할때(IoCreateDevice/IoCreateDeviceSecure) 알아야 할 정보들 '디바이스 익스텐션'의 크기. 해당 디바이스에 필요한 정보를 담는데 쓸수 있는 시스템에 할당된 명역이다. 디바이스 오브젝트가 나타내는(의미하는) '디바이스 타입' 시스템에 정의되어 있는 하나 이상의 '디바이스 속성(Characteristic)' 배타성(DO_EXCLUSIVE로 설정할수 있는 boolean값). WDM 드라이버는 배타성을 false해야 함. 드라이버를 위한 드라이버 오브젝트의 포인터(a pointer to the driver object for the driver). 모든 드라이버들은 그들의 드라이버 포인터를 DriverEntry에서 driver object를 통해 받는다. 시스템은 디바이스 오브젝트에서 드라이버 오브젝트 포인터를 통해 관련된 드라이버와 연관짓는다. (그니까.. 디바이스 스택에서 원하는 디바이스 오브젝트를 발견했단 말이야. 그 디바이스 오브젝트에서 드라이버 오브젝트의 포인터를 통해서 드라이버 코드를 실행시킨단 말이야.. 맞나?!) WDM 드라이버(버스 드라이버 빼고)는 지원 안하는 '널 문자로 끝나는 유니코드 스트링(DeviceName)'이 있다. (optional) Creating 디바이스 오브젝트 for WDM Function and Filter Drivers IoCreateDevice를 통해 디바이스 오브젝트를 생성한다. 대체로 AddDevice 루틴에서 생성한다. 디스크 드라이버같이 드라이브 레이아웃 IOCTL(뭐냐 이게??)에 반응해야 하는 녀석은 '디스패치 루틴'에서 생성할수도 있다. Creating 디바이스 오브젝트 for WDM Bus Drivers IoCreateDevice나 IoCreateDeviceSecure를 통해서 디바이스 오브젝트를 생성한다. 만약 디바이스고 raw 모드로 사용된다면 , IoCreateDeviceSecure로 생성해야함. Raw 모드가 아니면 IoCreateDevice나 IoCreateDeviceSecure(특정한 security descriptor를 쓰고 싶을때)로 생성 가능. Creating 디바이스 오브젝트 for non-WDM Drivers IoCreateDevice는 unnamed 디바이스 오브젝트를 생성하고, IoCreateDeviceSecure는 named 디바이스 오브젝트를 생성한다. Non-WDM 드라이버의 Unnamed 디바이스 오브젝트는 유저모드에서 접근할수 없다(not accessible). Initializing a Device Object IoCreateDevice는 디바이스 오브젝트의 포인터를 반환한다. '디바이스 오브젝트'는 '디바이스 익스텐션'의 포인터를 포함하고 있다. Higher level 드라이버는 IoAttachDevice나 IoAttachDeviceToDeviceStack를 호출하는데, 이 루틴들은 자동적으로 디바이스 오브젝트의 AlignmentRequirement를 설정한다 AlignmentRequirement: 디바이스에 대한 읽기/쓰기 요청에 사용되는 데이터 버퍼가 가져야할 정렬(alignment)를 기술함. Intermediate 드라이버는 드라이버가 언로드 될때 파일 오브젝트를 dereferencing 하기 위해서IoGetDeviceObjectPointer를 호출해서 '파일 오브젝트 포인터(file object pointer)'를 저장해 둔다 Intermediate/lowest level 드라이버는 DO_DIRECT_IO나 DO_BUFFERED_IO를 설정한다. Highest level 드라이버는 추가적인 작업을 위해 DO_DIRECT_IO나 DO_BUFFERED_IO 설정을 하지 않을수 있다. Intermediate 드라이버는 Flags 필드를 하위 디바이스 오브젝트와 동일하게 설정해야 한다. Flags 필드에는 특정 디바이스에만 의존적인 설정들도 있다. Removable-media 디바이스의 non-WDM 드라이버는 I/O 연산중에 디바이스의 변화(착탈)을 알기위해 DO_VERIFY_VOLUMN를 설정해야 한다. Function/filter 드라이버는 DO_DEVICE_INITIALIZING 플래그를 클리어(clear)해야 한다.

14 Named Device Objects Device object can be named or unnamed.
유저모드 어플리케이션이 이름으로 연산 대상을 정하면, 오브젝트 매니저가 이름을 확인하고 I/O 목적지를 정함. (Communication between driver and app) WDM drivers do not in general require MS-DOS device name but interface Named device objects 유저모드의 어플리케이션이 I/O 요청을 하면, 그 요청은 (디바이스 오브젝트의)이름에 따라 연산 대상(디바이스)이 정해진다. 오브젝트 매니저는 I/O 요청의 목적지를 (디바이스 오브젝트의)이름으로 구별한다. Named 디바이스 오브젝트는 MS-DOC 디바이스 이름(심볼릭 링크)을 가질수 있고, 이는 IoCreateSymbolicLink나 IoCreateUnprotectedSymbolicLink 함수로 생성된다. WDM 드라이버는, 보통, MS-DOS 디바이스 이름을 필요로 하지 않는다.

15 NT Device Name NT device name은 \Device\DeviceName 형식. WDM Driver
Bus driver specifies the FILE_AUTOGENERATED_DEVICE_NAME device characteristic when it creates device object. FDO, Filter DO are not named. Non-WDM Driver Must explicitly specify a name. If not, cant accessible from user mode NT device names NT device name의 형식은 '\Device\DeviceName' 이다. Device names for WDM drivers PDO는 네임드 오브젝트이다. 버스 드라이버가 FILE_AUTOGENERATED_DEVICE_NAME 속성(Characteristic)을 주면 시스템이 자동으로 디바이스 이름을 생성한다. FDO/filter DO는 네임드 오브젝트가 아니다. 디바이스 오브젝트를 생성할때 이름을 요구하지 않는다. 유저모드 어플레이케이션은 WDM 오브젝트 디바이스를 이름으로 참조하지 않는다. 대신에 device interface를 통해 디바이스 오브젝트에 액세스 한다. 드라이버 개발자는 디바이스 스택에서 한 개의 디바이스 오브젝트에만 이름을 주어야 한다. (not name more than one object in a dev stack) Device names for non-WDM drivers Non-WDM 드라이버는 어떠한 디바이스 오브젝트라도 이름을 명시적으로 주어야 한다. 디바이스 오브젝트를 생성하는 IoCreateDeviceSecure 함수에서 DeviceName 파라메터를 주어야 한다. Introduction to MS-DOS device names Non-WDM 드라이버는 전통적으로 MS-DOS 디바이스 이름을 가지고 있다. '\DosDevice\DosDeviceName' 과 같은 형태이다. WDM 드라이버는 IoRegisterDeviceInterface 루틴을 통해 디바이스 인터페이스를 등록한다. 만약 유저모드 프로그램과 협동(work with)을 한다면 MS-DOS 디바이스 네임이 필요하다. Local and Global MS-DOS Device Names 윈도우 2000 이후의 NT기반의 운영체제는 다양한 버전의(multiple versions) DosDevice 디렉토리가 있다. 글로벌 \DosDevices 디렉토리는 시스템 전역적(system-wide)인 MS-DOS 디바이스 이름을 가지고 있다. 로컬 \DosDevices 디렉토리는 local DosDevice 컨텍스트에서만 보이는 MS-DOS 디바이스 이름을 가지고 있다. 윈도우 XP이후의 버전은 각각의 로그온 세션마다 로컬 DosDevice 컨텍스트를 가지고 있다. 윈도우 2000은 각각의 터미널 서버 세션마다 로컬 DosDevice 컨텍스트를 가지고 있다. XP이후에는 오브젝트 매니저가 \DosDevices에서 이름을 검색할때, 로컬 \DosDevice에서 먼저 검색하고, 글로벌 \DosDevices에서 검색한다. 만약, 로컬/글로벌 양쪽에 동일한 이름이 존재한다면 로컬에 있는 이름이 선택된다. 글로벌 \DosDevices 디렉토리는 \DosDevices\Global (심볼릭 링크) 로 접근할수도 있다. 98/me는 \DosDevices\Global이 존재하지 않는다. 윈도우 XP이상에서 로컬 \DosDevices 디렉토리는 AuthenticationID로 신분 증명을 한다. 윈도우 NT 4.0 터미널 서버/2000 에서는 터미널 서버 세션을 위한 SessionId로 신분 증명을 한다.

16 Device Extensions Driver-defined structure.
Maintain device state information Provide storage for any kernel-defined objects or other system resources used by the driver Hold any data the driver must have resident and in system space to carry out its I/O operations Device Extensions 대부분의 intermediate/lowest level 드라이버들에서 '디바이스 익스텐션'은 디바이스 오브젝트와 관련있는 가장 중요한 데이터 구조이다. 디바이스의 상태 정보를 보관 드라이버에서 사용하는 시스템 리소스나 커널에서 정의된 오브젝트들을 저장함. Higher level 드라이버는 인터럽트 오브젝트 포인터를 저장할 공간을 제공하지 않는다. Higher level드라이버가 CustomTimerDpc루틴을 가지고 있다면 타이머나 DPC오브젝트를 저장할 공간을 제공해야 한다. Higher level 드라이버는 전통적으로 하위 드라이버의 디바이스 오브젝트의 포인터를 (higher level 드라이버)디바이스 익스텐션에 저장한다. Higher level 드라이버는 하위(next-lower-level) 드라이버의 디바이스 오브젝트 데이터를 IoAttachDeviceToDeviceStack를 통해 반환받은 포인터를 통해 읽을수 있다. 하위(lower) 드라이버 디바이스 오브젝트에 데이터를 쓰지 말것. 하위(lower) 드라이버의 디바이스 익스텐션에 접근(access)하지 말것. 동기화에 안전하지 못함. 드라이버의 코드를 수정하지 않고는 Intermidate 드라이버를 둘 사이(higher and lower)에 넣을수가 없다.

17 Device Object properties
Type Ntddk.h/wdm.h에 상수로 define Characteristics 각 디바이스 오브젝트는 1개 이상의 속성을 가질수 있음. FILE_DEVICE_SECURE_OPEN In the Registry WDM: can be set each device or a whole device setup class Non-WDM: can be set for a named device object’s device setup class Device setup class : 디바이스 인스톨을 간단하게 하기위해서, 셋업과 설정이 동일한 디바이스를 그룹으로 묵어서 디바이스 셋업 클래스로 나눠놓았음.

18 Controlling Device Access
Can be specified when the device object is created, or set in the registry WDM: when create device object, PnP manager determines a security descriptor for the device Set by Registry VS default security descriptor WDM(Bus Driver): Must provide security descriptor for PDO opened in raw mode. Non-WDM: Must specify default security descriptor and class GUID for named device object. Controlling device access 디바이스 오브젝트의 보안 설명자는 디바이스 오브젝트가 생성될 때나 레지스트리에 설정된 값에 의해 정해진다. Controlling device access for WDM drivers WDM드라이버가 디바이스 오브젝트를 생성하면 PnP매니저는 보안 설명자(security descriptor)를 지정한다. 만약 레지스트리에 보안 설명자가 설정되어 있다면, 디바이스 스택의 모든 오브젝트가 그 값으로 설정된다. 레지스트리에 설정되어 있는 셋업 클래스(device's setup class)가 보안 설명자를 가지고 있다면, 디바이스 스택의 모든 오브젝트가 그 값으로 설정된다. 디바이스 스택의 기본 보안 설명자는 디바이스 타입과 디바이스 속성(characteristic)에 의해 결정된다. 기본 보안 설명자는 관리자 계정(administrator)에는 full access(GENERIC_ALL)을 주고 그 외의 계정에는 read, write, execute access(GENERIC_READ|GENERIC_WRITE|GENERIC_EXECUTE)를 준다. Raw 모드로 작동한다면, PnP 매니저는 보안 설명자를 설정하지 못한다.(cannot determine a security descriptor), 이럴 경우에는 버스 드라이버가 (보안 설명자를)제공한다. Controlling device access for WDM bus drivers 버스 드라이버가 raw모드로 동작하지 않는다면, 보안 설명자를 제공할 필요가 없다. Controlling Device Access for Non-WDM drivers Non-WDM 드라이버는 네임드 디바이스 오브젝트에 기본 보안 설명자와 class GUID를 지정해야 한다.

19 QA

20 Standard Driver Routines
Required DriverEntry: initialize the driver and driver its object AddDevice: initialize devices and creates device objects Dispatch Routine: receive and process IRPs Unload: release system resources acquired by driver Optional Reinitialize: DriverEntry가 초기화를 마무리 못했다면, 마무리 StartIo: start I/O on a physical device Interrupt Service Routine: save device state when interrupted SynchCritSection: synchronizes access to driver data IoCompletion: completes driver’s processing of an IRP Cancel: cancel driver’s processing of an IRP ... And more ... Introduction to standard driver routines 커널 모드 드라이버는 I/O request packets(IRPs)를 스탠다드 루틴들을 통해 처리한다. 스탠다드 루틴은 두개의 그룹으로 나뉜다. 반드시 포함해야 하는것 DriverEntry AddDevice DispatchRoutines Unload Optional Reinitialize StartIo InterruptServiceRoutine DeferredProcedureCalls SynchCritSection AdapterControl IoCompletion Cacel CustomTimerDpc, IoTimer 현재 IRP와 타겟 디바이스 오브젝트는 많은 스탠다드 루틴의 입력 파라메터이다. 관습적으로 DriverEntry를 제외한 스탠다드 루틴의 앞 부분에 드라이버를 구분해 주는 이름(driver specific prefix)을 붙인다. (ex> Mouse_Unload)

21 Standard driver routine required
Must have DriverEntry which initialize driver-wide data structures and resources. Must have at least one dispatch routine WDM driver must have an Unload routine. WDM driver must have AddDevice routine. Can have StartIo routine 기능에 따라 다른 종류의 standard routine을 포함. Standard driver routine requirements 각 드라이버는 DriverEntry루틴이 존재하며, 드라이버에서 전역적으로 사용하는 데이터 구조나 자원들을 초기화 한다. I/O매니저는 드라이버를 로드할때 DriverEntry를 호출한다. 모든 드라이버는 IRPs를 받고 처리하는 최소한 1개 이상의 디스패치 루틴이 존재해야 한다. 드라이버는 각 IRP major function code에 따라 다른 디스패치 루틴을 가질수 있다. 모든 WDM드라이버는 Unload루틴을 포함해야 한다. PnP 드라이버의 Unload는 하는 일이 별로 없지만(responsibilities of a PnP driver's unload routine are minimal) non-PnP 드라이버의 Unload 루틴은 드라이버가 사용한 시스템 리소스를 해제하고 반환해야 한다. 모든 WDM 드라이버는 반드시 AddDevice루틴을 포함해야 하며 '드라이버 오브젝트'의 '드라이버 익스텐션(driver extension)'에 엔트리 포인트를 정의해야 한다. 드라이버는 StartIo루틴(I/O매니저가 호출하는 I/O 연산을 시작하는 루틴)을 가질수 있다. 만약 Higher level 드라이버가 IRPs를 단순히 하위 레벨 드라이버에게 전달만 해 준다면 StartIo루틴을 가지지 않을것이다. 드라이버의 기능에 따라 다른 종류의 스탠다드 루틴을 가진다.

22 Driver Object I/O manager creates a driver object for each driver
Driver object contains storage for entry points to many of a driver’s standard routines. DriverEntry routine supplies the address of the driver’s driver object Introduce to driver objects I/O 매니저는 인스톨 되었거나 로드된 드라이버의 '드라이버 오브젝트'를 생성한다. 드라이버 오브젝트는 드라이버의 스탠다드 루틴의 엔트리 포인트를 위한 영역(공간)을 가지고 있다.(contains storage for entry points)

23 Entry Points in Driver Objects
AddDevice routine at DriverObject->DriverExtension->AddDevice If driver manages its own queue of IRPs, specify StartIo routine Can be loaded/replaced dynamically, specify Unload routine Driver Entry Points in driver objects 커널모드 드라이버는 드라이버 오브젝트를 설정해야 한다. 최소한 1개 이상의 디스패치 루틴을 설정해야 한다. AddDevice루틴의 엔트리 포인트를 설정해야 한다. 자신의 IRPs큐를 관리한다면 StartIo루틴의 엔트리 포인트를 설정해야 한다. 드라이버가 수시로(dynamically) load/replace 될수 있다면, 시스템 리소스를 해제하기 위한 Unload 루틴의 엔트리 포인트를 설정해야 한다. 드라이버가 로드되면, DriverEntry루틴과 드라이버 오브젝트를 가리키는 포인터가 호출된다. DriverEntry 루틴이 호출되면, 디스패치, StartIo(필요하면), Unload(필요하면) 엔트리 포인트를 드라이버 오브젝트에 설정한다. 또한 DriverEntry 루틴은 AddDevice 루틴의 엔트리 포인트도 설정한다. (DriverObject->DriverExtension->AddDevice) 드라이버 오브젝트는 I/O 매니저가 현재 로드된 드라이버를 알기위해서 사용된다. 드라이버 오브젝트의 몇몇 멤버들은 단지 I/O 매니저에 의해서만 사용되며, 그 외의 멤버들은 드라이버 개발자에 의해 사용된다. (I/O 매니저에 의해서만 사용되는 멤버를 알고 있더라도 쓰지 말것, 이식성이 사라짐.) Other standard driver routines 커널모드 드라이버는 드라이버가 목표로 하는 기능을 위해서 다른 스탠다드 루틴을 가지고 있다.(have other standard routines) 대부분의 드라이버는 디바이스 오브젝트의 디바이스 익스텐션에 디바이스의 상태(I/O 연산, 다른 스탠다드 루틴을 위해 할당한 시스템 자원의 포인터 등)를 보관한다. ex

24 Required Dispatch Routines
ex DispatchPnP: IRP_MJ_PNP Request PnP device recognition, hardware configuration, resource allocation DispatchPower: IRP_MJ_ROUTINE Request pertaining to the power state of either their device or the system DispatchCreate: IRP_MJ_CREATE DispatchClose: IRP_MJ_CLOSE Last handle of the file object that was associated the target device object has been closed and released. DispatchRead: IRP_MJ_READ Transfer data from the underlying physical device to the system. DispatchWrite: IRP_MJ_WRITE Transfer data from the system to the underlying physical device DispatchDeviceControl: IRP_MJ_DEVICE_CONTROL DispatchInternalDeviceControl: IRP_MJ_INTERNAL_DEVICE_CONTROL DispatchSystemControl: IRP_MJ_SYSTEM_CONTROL Used to specify WMI requests to drivers

25 Unload routine environment
PnP manager calls Unload routine if driver has no more device objects after driver handles an IRP_MN_REMOVE_DEVICE request Start of unloading sequence, driver object and its device objects as “unload pending”. While “unload pending”, no additional driver attach and no IRPs to the driver Unload routine environment IRP_MN_REMOVE_DEVICE 요청이 핸들된 후 더 이상 device object가 없다면 PnP매니저는 PnP드라이버의 unload루틴을 호출할것이다. Unloading sequence가 시작될때 PnP매니저는 드라이버 오브젝트와 그 디바이스 오브젝트를 "unload pending" 으로 mark한다. "unload pending"으로 mark되면, 디바이스에 더 이상의 드라이버를 붙일수도 없고, IRP도 보내지 않는다.

26 Unload Routine PnP Driver: Non-PnP Driver:
In general, unloading process is a synchronous If driver allocated driver-wide resources, it must de-allocate in Unload routine unless it has already done so. Non-PnP Driver: Must release resources, delete device objects, and detach from the device stack in Unload routine. If not, ISR might be calld to handle a device interrupt while the Unload routine is releasing resources. After disabling interrupt, file system/legacy driver release resources and objects. PnP Driver's Unload Routine 만약 드라이버의 DriverEntry에서 드라이버 전역적으로 쓰이는 자원을 할당했다면, 할당을 해제해야하며 그렇지 않다면 unload는 끝나지 않을것이다.(unless it has already done so). 보통 PnP드라이버의 unloading은 동기적(synchronous)이다. Non-PnP Driver's Unload Routine PnP Device-removal 요청을 처리하지 못하는 드라이버는 unload루틴에서 리소스를 해제하고, 디바이스 오브젝트를 지우고, 디바이스 스택에서 detach해야 한다. 만약 위 작업을 먼저 수행하지 않았다면, unload 루틴을 실행하는중에 IRPs를 받을수도 있다. (해제 하는 도중에 말이다-0-!!). 인터럽트를 disabling후에 파일 시스템과 레거시 드라이버는 리소스와 오브젝트를 해제해야 한다.

27 QA


Download ppt "WDM 드라이버의 기본 구조 What is WDM?"

Similar presentations


Ads by Google