본문 바로가기

Language & API/WINDOWS DRIVER

[자료구조]DEVICE_OBJECT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _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;                                // See above:  DO_...
    ULONG Characteristics;                      // See ntioapi:  FILE_...
    __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;
 
    //
    //  The following field is for exclusive use by the filesystem to keep
    //  track of the number of Fsp threads currently using the device
    //
 
    ULONG ActiveThreadCount;
    PSECURITY_DESCRIPTOR SecurityDescriptor;
    KEVENT DeviceLock;
 
    USHORT SectorSize;
    USHORT Spare1;
 
    struct _DEVOBJ_EXTENSION  *DeviceObjectExtension;
    PVOID  Reserved;
 
} DEVICE_OBJECT;
 
typedef struct _DEVICE_OBJECT *PDEVICE_OBJECT
cs


PDEVICE_OBJECT는 FDO, PDO 또는 FIDO 같은 스택 층을 묘사한 구조체를 가리키는 포인터이다. 


[변수]

Type -> Device object의 목적을 나타내기 위해 운영체제에 의해 사용된다. 오로지 Read Only 이다. 


Size -> 장치의 개체의 크기를 바이트 단위로 지정합니다. DeviceExtension 멤버는 포함하지만 DeviceObjectExtension 멤버는 포함하지 않는다. 

오로지 Read Only 이다. 


ReferenceCount -> I/O manager 에 의해 사용된다. 디바이스 객체와 연관된 디바이스의 열린 핸들 수를 추적한다. 읽기 전용이다. Read Only


DriverObject -> 현재 DeviceObject를 생성한 DriverObject를 가리키는 포인터


NextDevice -> DriverObject가 생성한 다른 DeviceObject를 찾아가는 포인터로 자신이 생성되기 직전의 DeviceObject를 가리키거나 자신의 처음이라면 주소값을 갖지 않는다. 


AttachedDevice -> DeviceObject가 참여하고 있는 스택에서 자신의 상위 스택에 있는 DeviceObject를 가리키는 주소 값이다. 


CurrentIrp -> 현재 진행되고 있는 IRP의 값을 가진다. 현재 진행되는 IRP가 없다면 NULL값을 가지게 된다. DriverStartIo 루틴이 처리 중인 IRP를 기억하는 곳


Flags -> 상수들이 여러가지 OR되어서 사용될 수 있는 플래그 변수이다. 

  - DO_BUFFERED_IO  -> 명령어 안의 사용자가 버퍼의 형태로 Buffered IO의 형태여야 한다. 

  - DO_DIRECT_IO -> 명령어 안의 사용자 버퍼의 형태가 Direct IO 여야 한다. 

  - DO_DEVICE_INITIALIZING -> IoCreateDevice()를 통해 생성된 직후의 DeviceObject는 모두 이값을 가진다. 이 값을 지우지 않으면 더이상 그 상위로 스택이 쌓이지 않기 때문에 스택을 형성하기 위해서는 지워야 한다. 

  - DO_POWER_INRUSH -> Thread의 문맥과 상관없이 언제든 PowerManager의 IRP를 받는다. 

  - DO_POWER_PAGABLE -> 항상 보장된 Thread의 문맥 아래에서만 PowerManager의 명령어를 받는다. 언제는 TaskSwitChing 함수를 사용하여도 무방하다. 


Timer -> 타이머 객체에 대한 포인터이다. I/O 매니저가 드라이버 제공 타이머 루틴마다 초를 호출 할 수 있다. Read/Write 


DeviceExtension -> DeviceObject 마다 가질 수 있는 자체 메모리 영역이다. 

 


'Language & API > WINDOWS DRIVER' 카테고리의 다른 글

[함수]IoCreateSymbolicLink  (0) 2016.07.25
[함수]IoSetDeviceInterfaceState  (0) 2016.07.25
[함수]IoRegisterDeviceInterface  (0) 2016.07.25
[함수]IoAttachDeviceToDeviceStack  (0) 2016.07.25
[함수]IoCreateDevice  (0) 2016.07.25