IoAttachDevice establishes layering between drivers so that the same
IRPs can be sent to each driver in the chain.
This routine is used by intermediate drivers during initialization.
It allows such a driver to attach its own device object to another
device in such a way that any requests being made to the original
device are given first to the intermediate driver.
The caller can be layered only at the
* top of an existing chain of layered drivers. *
IoAttachDevice searches for the highest device
object layered over TargetDevice and attaches to * that * object
(that can be the TargetDevice).
? Therefore, this routine must not be called if a driver that must
be higher-level has already layered itself over the target device. ?
...
This routine sets the AlignmentRequirement in SourceDevice to the
value in the next-lower device object and sets the StackSize
to the value in the next-lower object plus one.
*********************************************************************
Warning: AttachedDevice must point to a global memory location, such
as the driver's device extension. IoAttachDevice opens the file
object for the target device, updates AttachedDevice, performs the
attach, and then closes the file object. Thus,
! the source device receives the IRP_MJ_CLEANUP and IRP_MJ_CLOSE
requests for the file object before IoAttachDevice returns. !
The driver must forward these requests to the target device, and
AttachedDevice must be a memory location accessible to the driver's
DispatchCleanup and DispatchClose routines.
*********************************************************************