본문 바로가기

Language & API/WINDOWS DRIVER

[함수]IoAttachDeviceToDeviceStack

1
2
3
4
5
6
PDEVICE_OBJECT
IoAttachDeviceToDeviceStack(
    _In_ _When_(return!=0, __drv_aliasesMem)
    PDEVICE_OBJECT SourceDevice,
    _In_ PDEVICE_OBJECT TargetDevice
    );
cs

[파라미터]
SourceDevice -> 드라이버 루틴에서 IoCreateDevice()를 호출해 만들어낸 PDEVICE_OBJECT의 포인터다. 해당 드라이버는 TargetDevice가 포함된 다바이스 스택에 동참한다. 

TargetDevice -> SourceDevice가 연결하고자 하는 PDEVICE_OBJECT의 포인터다. 보통 WDM 드라이버에서 이 값은 PDO(physical Device Object)가 된다. 


[반환 값]

PDEVICE_OBJECT를 연결하는데 성공하면, 즉 드라이버의 디바이스 스택에 동참하는 데 성공하면 최근까지 디바이스 스택의 최상의에 위치해 있던 PDEVICE_OBJECT를 반환한다. 


[함수 설명]

IoCreateDevice로 만든 PDEVICE_OBJECT를 드라이버의 계층 구조에 포함시키는 함수다. 드라이버의 계층 구조(디바이스 스택)에 포함되어야 IO관리자가 보내주는IRP를 상위의 PDEVICE_OBJECT에서 전달 받을 수 있으며, 그것을 하위의 PDEVICE_OBJECT로 전달 할 수 있다. SourceDevice가 Attach하고 하는 TargetDevice의 현재가 Unload, Delete, Remove 같은 상태에 있다면 이 명령은 실패한다. 또한 TargetDeivce가 Flags 필드에 DO_DEVICE_INITIALIZING 상수 값을 포함하고 있을 때도 이 명령은 실패한다. 달리 말하면, PDEVICE_OBJECT의 Flags필드에서 DO_DEVICE_INITIALIZING 상수 값을 제거 해야 한다는 것이다. 그래야 또 다른 PDEVICE_OBJECT가 디바이스 스택 계층 구조에 Attach 될때 실패하지 않을 것이다. 


[호출할 때 요구되는 IRQL]

IRQL <= DISPATCH_LEVEL


아래 샘플 예제

1
2
3
4
5
6
NTSTATUS
SAMPLE_AddDevice
    (
    IN PDRIVER_OBJECT DriverObject,         
    IN PDEVICE_OBJECT PhysicalDeviceObject  
    )
cs



1
2
3
4
5
deviceExtension->NextLayerDeviceObject =
        IoAttachDeviceToDeviceStack (
                    DeviceObject,
                    PhysicalDeviceObject    
    );
cs

DeviceObject 는 IoCreateDevice 로 만들고
PhysicalDeviceObject 는 AddDevice 파라미터에 있는 PDEVICE_OBJECT 를 사용한다.


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

[함수]IoCreateSymbolicLink  (0) 2016.07.25
[함수]IoSetDeviceInterfaceState  (0) 2016.07.25
[함수]IoRegisterDeviceInterface  (0) 2016.07.25
[자료구조]DEVICE_OBJECT  (0) 2016.07.25
[함수]IoCreateDevice  (0) 2016.07.25