기본 개념
- 장치[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/
'WindowsDriver' 카테고리의 다른 글
특정 프로세스 차단 드라이버 개발 (최종) (0) | 2021.07.07 |
---|---|
Mini Filter Driver Dev Part2. (feat. 개념) (0) | 2021.06.24 |
Mini Filter Driver Dev Part1. (feat. 개념) (0) | 2021.06.20 |
WindowsDriver Develop Basic2 [정리중] (0) | 2020.09.23 |