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 |