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 |