토요일, 7월 13, 2013

I/O requst packet


대부분의 요청(Request)은  device driver에서 보내고 이러한 요청들은 I/O request packets(IRPs)의 형태를 갖는다.
O/S 구성요소 혹은 driver는 IoCallDriver를 호출 함으로서 driver에 IRP를 보낸다.
IoCallDriver는  2개의 매게변수(DEVICE_OBJECT 포인터와, IRP포인터)를 갖는다.
DEVICE_OBJECT는  DRIVER_OBJECT와 연결된 포인터를 갖는다.
O/S 구성요서가 IoCallDriver를 호출 하면, 여러분은 O/S 구성요소가 device에 혹은 Device object와 연결된 Driver에 IRP를 보낸다고 말한다.
가끔 여러분은  IRP를 보낸다(Send)는 말 대신 IRP를 전송(forward) 혹은 구문전송(the phrase passes)이라고 말할 것이다.

일반적으로 IRP는 stack에 나열된 몇몇의 driver에서 처리된다. stack안의 각각의 driver는 device object와 연결되어 있다.
보다 많은 정보를 알고 싶으면 "Device nodes and device stacks"을 참조 하라. IRP가 stack device에서 처리 될때 IRP는 대게  device stack의 최상위에 있는 device object에 보내진다.
예를 들어 만약 IRP가 아래의 그림과 같은 device stack에서 처리 된다면, IRP는 우선 device stack의 최상위에 있는 filter device object(Filter DO)에 보내질 것이다.




device stack아래로 IRP전달 하기

I/O manager가 위 그림의 Filter DO에 IRP를 보냈다고 가정하자.
Filter DO와 연결된 driver(AfterThought.sys)는 IRP를 처리 하고
이를  device stack구조상 아래에 있는 functional device object(FDO)로 보낼 것이다.
driver가 device stack상 바로 아래쪽 device object에 IRP를 를 보낼때, 여러분은  driver가 IRP를 device stack 밑으로 내려보낸다고 말할것이다.
어떤 IRP들은 deice stack의 물리적 device object로 보내질 것이다.(해석하기 까다롭다.)
또 어떤 IRP들은 PDO상위의 driver에서 처리를 완료 하기 때문에 PDO까지 보내지 않을 것이다.

IRPs are self-contained

IRP 구조체는 driver가 I/O request 처리를 하는데 필요한 모든 정보를 포함하고 있다.
IRP 구조체의 어떤 부분은 stack내에 있는 driver에 공통적인 정보를 포함하고 있고, 또 IRP의 다른 부분에는 Stack에 있는 일부 driver에 필요한 특별한 정보를 포함하고 있다.

댓글 없음: