디바이스를 관리하기 위한 드라이버들이 존재한다. 이 드라이버들이 디바이스를 컨트롤 하는데 참여한다는 의미로 드라이버 마다 디바이스 오브젝트를 생선한다.
그리고 이 디바이스 오브젝트들이 순서를 가지고 쌓여서 디바이스 스택이 된다.
그러면 이제 하드웨어나 드라이버 통신을 위해서 어떻게 구성되어 있는지 이해한대로 정리해보려 한다.
윈도우에서 드라이버나 하드웨어를 통신 할 때, I/O Manager 가 참여하게 된다. 그 이유는 시스템 상에서 드라이버를 파일로 취급하여서 파일 입출력을 통해서
접근을 하는데, 파일 입출력은 I/O Manager[관리자]가 제공하기 때문이다.
응용프로그램에서 드라이버에 접근하여, 하드웨어를 제어한다고 생각해 본다.
요약하면 이벤트가 발생하면 I/O Manager가 IRP를 생성하고, 이와 관련된 드라이버에게 IRP 구조체를 넘기면서 단계별로 처리한 후, 최종적으로
디바이스를 제어하게 되는 것이다.
IRP와 I/O Stack 관계
IRP와 I/O Stack은 IRP가 I/O Stack을 포함하는 관계이다.
IRP의 구조를 보게되면 msdn에서는 불투명한 구조체라고 나오지만, 다음과 같은 관계를 지니고 있다.
정적인 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에서의 스택 사용이 끝나고 난후 일어날 루틴
[https://msdn.microsoft.com/en-us/library/windows/hardware/ff550659(v=vs.85).aspx]
[http://apprize.info/programming/reverse/4.html]
정리
A 드라이버에 읽기 요청이 들어옴.
I/O Manager는 읽기 요청을 처리하기 관련 디바이스 스택 검색 및 발견
I/O Manager는 IRP 생성 및 디바이스 스택의 최상위 오브젝트를 생성한 드라이버 오브젝트에 IRP 전달
여기서 전달을 하면서, IRP에 존재하는 I/O Stack에 해당 드라이버 오브젝트가 처리 해야 할 정보를 담은 IO_STACK_LOCATION도 추가(PUSH)
해당 Entry에는 읽기 요청과 관련된 정보와 코드들이 저장
해당 드라이버 오브젝트에서 처리 해야할 내용을 현재 자신의 IO_STACK_LOCATION 내용을 보고 처리
다음 디바이스 오브젝트의 드라이버 오브젝트에 IRP를 전달 ----------------> 반복
[출처] : https://www.youtube.com/watch?v=SphKWw7KArs&t=3s
'reversing > Windows Driver' 카테고리의 다른 글
Security Descriptors (0) | 2017.08.04 |
---|---|
Minifilter - User Mode Communication (0) | 2017.08.04 |
Driver Object , Deivce Object 연관성 및 함수 정리 (0) | 2017.07.25 |
[Device Stack] 디바이스 스택 (0) | 2017.07.25 |
MDL(Memory Descriptor List) (0) | 2017.07.21 |