본문 바로가기

window driver

Device Object와 Device Stack 형성 과정

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