SMALL
디바이스 스택과 디바이스 오브젝트, 디바이스 드라이버는 다음과 같은 연관성을 가진다.
위와 관련되어 있는 함수를 정리
1 2 3 4 5 6 7 8 9 | NTSTATUS IoCreateDevice( _In_ PDRIVER_OBJECT DriverObject,/ _In_ ULONG DeviceExtensionSize, _In_opt_ PUNICODE_STRING DeviceName, _In_ DEVICE_TYPE DeviceType, _In_ ULONG DeviceCharacteristics, _In_ BOOLEAN Exclusive, _Out_ PDEVICE_OBJECT *DeviceObject ); | cs |
PDRIVER_OBJECT : 호출자인 드라이버 오브젝트의 포인터 값
DeviceExtensionSize : 디바이스 오브젝트에서 사용할 DeviceExtension의 크기
DeviceExtensionSize : 디바이스 오브젝트에서 사용할 DeviceExtension의 크기
PUNICODE_STRING : 옵셔널 인자로, 디바이스 오브젝트의 이름을 붙임
DEVICE_TYPE : 어떠한 디바이스인지 종류를 나타탬
FILE_DEVICE_DISK, FILE_DEVICE_KEYBOARD
DeviceCharacteristics : 드라이버의 디바이스 오브젝트에 추가 정보를 제공
보통 FILE_DEVICE_SECURE_OPEN을 사용
FILE_DEVICE_UNKNOWN 도 사용
Exclusive : 해당 디바이스 오브젝트가 단독 장치인지를 표시함
보통 FALSE 값을 설정
*DeviceObject : 생성된 디바이스 오브젝트의 포인터를 담을 변수
1 2 3 4 | PDEVICE_OBJECT IoAttachDeviceToDeviceStack( _In_ PDEVICE_OBJECT SourceDevice, _In_ PDEVICE_OBJECT TargetDevice ); | cs |
IoAttachDeviceToDeviceStack 루틴은 호출자의 장치 개체를 체인의 최상위 장치 개체에 연결하고
이전에 가장 높은 장치 개체에 대한 포인터를 반환
SourceDevice : 호출자(드라이버)가 만든 디바이스 오브젝트의 포인터
TargetDevice : 다른 드라이버의 디바이스 오브젝트 포인터
위의 그림에서 Y가 SourceDevice, X가 TargetDevice
Device Object
typedef struct _DEVICE_OBJECT { CSHORT Type; USHORT Size; LONG ReferenceCount; struct _DRIVER_OBJECT *DriverObject; --> 해당 디바이스를 생성한 드라이버 오브젝트 struct _DEVICE_OBJECT *NextDevice; --> 같은 드라이버에서 생성된 다른 디바이스 오브젝트 struct _DEVICE_OBJECT *AttachedDevice; --> 디바이스 스택에서 밑에 놓여있는 디바이스 오브젝트
...
}
[참고] : https://www.youtube.com/watch?v=1E5Y64CPH00
[참고2] : MSDN
LIST
'reversing > Windows Driver' 카테고리의 다른 글
Minifilter - User Mode Communication (0) | 2017.08.04 |
---|---|
IRP, I/O Stack 관련 내용 정리 (0) | 2017.07.28 |
[Device Stack] 디바이스 스택 (0) | 2017.07.25 |
MDL(Memory Descriptor List) (0) | 2017.07.21 |
DPC (Deferred Procedure Calls) (0) | 2017.07.20 |