Device Object 연결 관계
-
attachedDevice 는 연결된 DeviceObject에 대한 포인터값을 담고있고, NextDevice 는 같은 드라이버에 의해 생성된 DeviceObject의 포인터값을 담고있다. (나중에 생성된 오브젝트가 먼저 생성된 오브젝트를 가리킴)NextDevice 로 연결된 오브젝트들을 형제디바이스오브젝트라고 한다.
-
DEVICE_OBJECT structure
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags;
ULONG Characteristics;
__volatile PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType;
CCHAR StackSize;
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue;
ULONG AlignmentRequirement;
KDEVICE_QUEUE DeviceQueue;
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize;
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
- PDO : 상위 드라이버가 디바이스를 인식하기 위해 만든 디바이스객체. 버스드라이버에 의해 생성된다.
- FDO : 디바이스를 구체적으로 설명하고 기능을 담당하는 디바이스 객체 ( AddDevice루틴에서 생성되는 디바이스 객체)
--> 시스템에 존재하는 모든 디바이스는 그들을 위한 버스 드라이버와 그들 자신을 위한 각자의 드라이버에 의해 관리 된다!!!
디바이스 스택 형성 과정
(MSDN예시)
1. PnPManager가 PCI bus driver(Pci.sys)에게 PCI bus와 연결된 Device를 찾으라고한다.
2. Pci.sys는 PCI bus와 연결되어있는 모든 디바이스에 디바이스 오브젝트를 생성한다.
(이때 각 디바이스에 생성된 디바이스 오브젝트는 PDO이다.)
3. PnPManger는 어떤 드라이버가 디바이스스택에 포함되야하는지 알아내기위해 레지스트리를 확인한다.
(디바이스스택은 하나의 FDO를 갖고, 선택적으로 하나 이상의 FIDO를 가져야한다.)
4. 3번에서 찾은 드라이버들은 디바이스 오브젝트를 생성하고 디바이스스택에 attach 한다.
[참고]
peonix120.tistory.com/entry/4%EC%9E%A5-%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4-%EC%8A%A4%ED%83%9D%EC%9D%98-%EA%B0%9C%EB%85%90-%ED%8C%8C%EC%95%85?category=553329
docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/device-nodes-and-device-stacks#how-does-a-device-stack-get-constructed
'window driver' 카테고리의 다른 글
Buffered I/O vs Direct I/O (0) | 2020.11.20 |
---|