WindowsDriver

WindowsDriver Develop Basic [정리중]

wsoh9812 2020. 9. 22. 23:31

기본 개념

 

- 장치[Device]라고 하면 다른게 아니라 마우스나 키보드, USB와 같은 것들이 장치라고 말할 수 있다.

- 운영체제에서는 이러한 장치를 편리하게 사용하기 위해서 PnP[플러그 앤 플레이]라는 기능이있다.
  (레거시 플러그 앤 플레이 ( PnP ) : 꽂으면 실행된다는 뜻)

 - PnP라 하면 새로운 장치를 컴퓨터에 집어 넣었을 때, 컴퓨터가 그 장치를 자동으로 인식할 수 있는 능력을 주는 표준     을 말한다.


- 각 장치가 연결되면 각 장치마다 위의 구조와 같은 구조의 인스턴스가 생성되는 것이다. - > DriverObject 구조체

- 직관적으로 하나의 USB가 연결되면 해당 USB를 관리할 때 사용 하기 위해서 커널에서 DriverObject 구조체를 가진 객

  체를 생성하고  생성된 개체를 장치 개체라고 한다.


- 디바이스를 관리하기 위한 드라이버들이 존재한다. ( 하나의 디바이스에 여러개의 드라이버 가능)

 

 - 드라이버들이 디바이스를 컨트롤 하는데 참여한다는 의미로, 드라이버 마다 디바이스 오브젝트를 생성한다.
   그리고 이 디바이스 오브젝트들이 순서를 가지고 쌓여서 디바이스 스택이 된다.

디바이스 스택 집고 넘어가기

 

[중요] 'KINGSTON SA...'라는 디바이스가 4개의 드라이버( partmgr, dis, EhStor.....)가 관리한다. 해석한다.

이 4개의 드라이버가 모이면 '드라이스 스택'이라고 한다.

 

[중요] 응용프로그램은 '디바이스 스택'이 존재하는지 확인 해야한다.

( 이유 : 디바이스 스택이 존재해야 디바스가 존재한다 라고 해석하기 때문 )

 

[중요]

라이버들이 응용프로그램들로 부터 명령들을 받는데있어서 순서는

'디바이스 스택'의 꼭대기에 디바이스 오브젝트를 만들면 그 드라이버가 가장 먼저 전달 받는다.

( 아마 irp )

 

 

 - 윈도우에서 드라이버나 하드웨어를 통신 할 때, I/O Manager 가 참여하게 된다.

  그 이유는 시스템 상에서 드라이버를 파일로 취급해서


[응용프로그램]  — [파일 입출력 드라이버에 대한]-----> [I/O Manager]  ——[IRP 구조체 생성]-—> [Device Driver 1]  ——>[Device Driver 2] --> 디바이스

이벤트가 발생하면 I/O Manager가 IRP를 생성하고, 이와 관련된 드라이버에게 IRP 구조체를 넘기면서 단계별로 처리한 후, 최종적으로  디바이스를 제어하게 되는 것이다.

[ 흐 름 ]

 

 

 

IRP와 I/O Stack  관계

 

 

 

IRP와 I/O Stack은 IRP가 I/O Stack을 포함하는 관계이다.


이를 통해서 IRP에 존재하는 I/O Stack에 접근 할수 있게 되는데, 이 Stack을 구성하는 각 엔트리(Entry)는 IO_STACK_LOCATION 구조체로IRP와 I/O Stack은 IRP가 I/O Stack을 포함하는 관계이다.

정적인 IRP 헤더가 존재한다. 그리고 이제 해당 IRP에 몇개의 스택이 존재하고 현재 어디를 가리키고 있는지를 나타낸다.

정리하면 Stack의 Size와 현재 처리할[동작할]때 사용하는 스택의 CurrentStackLocation을 알수 있다.

이를 통해서 IRP에 존재하는 I/O Stack에 접근 할수 있게 되는데, 이 Stack을 구성하는 각 엔트리(Entry)는 IO_STACK_LOCATION 구조체로 구성되어 있다.

 

 

 IO_STACK_LOCATION 구조

 

MajorFunction : 수행 할 I / O 작업 유형을 나타내는 IRP 주요 기능 코드

-->해당 I/O 작업이 읽기인지, 쓰기인지, 명령인지 등을 나타 냄

MinorFunction : 주요 기능에 대한 하위 기능 코드

--> 좀 더 세부적인 내용을 기술함 주요 기능 들에서, PnP일 때 디바이스를 멈춰라 등등

DeviceObject : 드라이버가 생성 한 DEVICE_OBJECT 구조체에 대한 포인터

--> 동작할 드라이버 오브젝트가 관여하는 디바이스 오브젝트

CompletionRoutine 

--> 해당 처리 IRP에서의 스택 사용이 끝나고 난후 일어날 루틴



 

정리

- A 드라이버에 읽기 요청이 들어옴.

- I/O Manager는 읽기 요청을 처리하기 관련 디바이스 스택 검색 및 발견

- I/O Manager는 IRP 생성 및 디바이스 스택의 최상위 오브젝트를 생성한 드라이버 오브젝트에 IRP 전달

- 여기서 전달을 하면서, IRP에 존재하는 I/O Stack에 해당 드라이버 오브젝트가 처리 해야 할 정보를 담

   은 IO_STACK_LOCATION도 추가(PUSH)

해당 Entry에는 읽기 요청과 관련된 정보와 코드들이 저장

해당 드라이버 오브젝트에서 처리 해야할 내용을 현재 자신의 IO_STACK_LOCATION 내용을 보고 처리

다음 디바이스 오브젝트의 드라이버 오브젝트에 IRP를 전달 ----------------> 반복



출처: https://richong.tistory.com/275?category=711194 [study]

 

 

 

출처 : richong.tistory.com/