본문 바로가기

Programming/Windows&C#

[Windows/WDM] 드라이버 스택 코드 이해

728x90
반응형

※제가 공부하면서 정리용으로 쓰는것이기 때문이 틀릴 가능성이 다분히 있습니다. 혹시 잘못된점이 있다면 댓글로 알려주세요 (아마 잘못된 부분이 많을 것으로 예상 됩니다.)



드라이버 스택을 이애하기 위해선 PDO, FDO, FIDO가 무엇인지 필수적으로 알아야한다.


PDO(Physical Device Object)

특정 디바이스에 attach된 디바이스들에 대한 열거 및 관리를 하는 Driver가 사용하는 device object 라고 말 할수 있다. 즉 만드는 디바이스에 대한 설명하는 드라이버이다.

이 PDO는 디바이스 드라이버 개발자가 직접 만드는것이 아닌 드라이버 개발자가 만들 디바이스의 상위 디바이가 개발자가 만드는 디바이스에 대한 PDO를 생성해준다.

위에 그림을 예로들면 현재 Root Hub디바이스를 만든다고 한다면 Root Hub PDO는 USB Host Controller의 디바이스에서 만들어진다.

- 즉 디바이스 스택에서 사장 밑에 위치한다.

 PDO는 AddDevice()와 DriverEntry()에서만 사용한다.



FOD(Functional Device Object)

제작하는 디바이스의 실제 기능을 담당하는 오브젝트이다. 실제로 드라이버를 설치하게 되면 DriverEntry 함수에서 처음 설치를 하게 될때 AddDevice(이름 변경가능) 함수로 가라고 명시를 하고 이 함수에서 IOCreateDevice()라는 함수를 통해 FDO를 생성해주게 되는데 이때부터 다른 모든 함수에서 만들어진 FDO를 사용하여 작업하게 된다. 



FIOD(Filter Device Object)

FDO의 위쪽과 아래쪽에 모여있는 오브젝트이다. FDO의 위에 있는 오브젝트는 상위필터(Upper Filter)라고 하며 FDO의 아래에 있고 PDO의 위에있는(즉 FDO와 PDO의 사이에 위치) 하위필터(Lower Filter)라고 한다.

 

DDK에서 정의한 디바이스 객체 구조체

typedef struct _DEVICE_OBJECT {
    //중략

①struct _DRIVE_OBJECT *DriverObject;

struct _DRIVE_OBJECT *NextDevice;

③struct _DRIVE_OBJECT *AttachedDevice;

//중략

④CCHAR StackSize;

//중략

} DEVICE_OBJECT;


①에는 디바이스 객체를 생성하였던 드라이버를 설명하는 드라이버 객체의 주소를 담는다.

- 즉 PDO에 해당하는 주소일 것이다.

②는 드라이버에서 생성된 디바이스 객체의 주소값를 담는다. 그때 이 주소값은 현재 디바이스 객체보다 바로 전에 생성된 디바이스 객체의 주소값이다. 하나의 드라이버는 여러개의 디바이스객체를 생성한다.(PDO , FDO, FIDO, 등) 그렇기 때문에 현재의 디바이스 객체보다 먼저 생성된 이전의 디바이스 객체를 저장해둔다.

③현재 디바이스 객체 위로 올라가 있는 디바이스 객체를 가르킨다. 이것이 디바이스 스택과 가장 밀접한 관계가 있는 필드인데 디바이스 스택간의 열결 관계를 설명하는 필드라고 생각하면 된다.

④현재의 디바이스 객체를 포함하여, 아래로 몇 개의 디바이스 객체가 연결되어 있는지를 알려주는 필드이다. 디바이스 스택에선 스택에 있는 디바이스 객체를 선택하면 그 밑에 몇개의 디바이스 객체가 더 있는지 알 수 있게해준다. 스택의 값의 경우에선 항상 이어져야 하는것은 아니면 아래에 있는 스택의 값보다 위에 있는 스택의 값이 크기만 하면 된다.




참고 :

http://blog.naver.com/PostView.nhn?blogId=clauzen&logNo=70103603768&redirect=Dlog&widgetTypeCall=true 

http://blog.naver.com/PostView.nhn?blogId=wesleyhw&logNo=20066020269



반응형