Función IoAttachDeviceToDeviceStackSafe (ntddk.h)
La rutina IoAttachDeviceToDeviceStackSafe asocia el objeto de dispositivo del autor de la llamada al objeto de dispositivo más alto de una pila de controladores.
Sintaxis
NTSTATUS IoAttachDeviceToDeviceStackSafe(
[in] PDEVICE_OBJECT SourceDevice,
[in] PDEVICE_OBJECT TargetDevice,
[out] PDEVICE_OBJECT *AttachedToDeviceObject
);
Parámetros
[in] SourceDevice
Puntero a un objeto de dispositivo creado por el autor de la llamada.
[in] TargetDevice
Puntero al objeto de dispositivo de la pila a la que se va a adjuntar el objeto sourceDevice .
[out] AttachedToDeviceObject
En la entrada, este parámetro especifica la dirección de SourceDevice->DeviceExtension->AttachedToDeviceObject, que debe contener un puntero NULL. En la salida, este parámetro recibe un puntero al objeto de dispositivo al que se adjuntó el SourceDevice.
Valor devuelto
ioAttachDeviceToDeviceStackSafe devuelve STATUS_SUCCESS si SourceDevice se adjunta correctamente encima del TargetDevice; de lo contrario, devuelve STATUS_NO_SUCH_DEVICE.
Observaciones
Al igual que IoAttachDeviceToDeviceStack, IoAttachDeviceToDeviceStackSafe establece capas entre controladores para que los mismos IRP se envíen a cada controlador de la pila. Sin embargo, a diferencia de IoAttachDeviceToDeviceStack, IoAttachDeviceToDeviceStackSafe tiene un parámetro adicional, AttachedToDeviceObject, que el controlador de filtro usa para pasar la dirección del campo SourceDevice objeto AttachedToDeviceObject. IoAttachDeviceToDeviceStackSafe actualiza este campo mientras mantiene el bloqueo de la base de datos del sistema de E/S. Dado que contiene este bloqueo, IoAttachDeviceToDeviceStackSafe evita una condición de carrera que, de lo contrario, podría producirse si el objeto SourceDevice recibió un IRP antes de que se actualizara su campo AttachedToDeviceObject.
Un controlador de filtro del sistema de archivos llama a IoAttachDeviceToDeviceStackSafe para adjuntar su propio objeto de dispositivo de filtro (SourceDevice) encima de un objeto de dispositivo (TargetDevice) que pertenece a un sistema de archivos u otro controlador de filtro. El controlador de filtro recibe primero las solicitudes de E/S posteriores enviadas a AttachedToDeviceObject, que los procesa y los reenvía al siguiente controlador de la pila llamando a IoCallDriver.
Si el objeto de dispositivo especificado por TargetDevice está actualmente en la parte superior de la pila de controladores, el SourceDevice de se adjunta directamente al TargetDevice. En este caso, TargetDevice y el AttachedToDeviceObject devuelto puntero son iguales.
Si uno o varios objetos de dispositivo de filtro ya están conectados por encima del targetDevice en la pila de controladores, IoAttachDeviceToDeviceToDeviceStackSafe adjunta el SourceDevice al objeto de dispositivo de filtro superior. Se devuelve un puntero al último en AttachedToDeviceObject.
En el momento inmediatamente después de que se conecte a la parte superior de la pila, el SourceDevice ocupa la parte superior de la pila de controladores. Sin embargo, tenga en cuenta que esto no significa necesariamente que el sourceDevice permanecerá en la parte superior de la pila de controladores. Otros filtros pueden adjuntar sus propios objetos de dispositivo de filtro encima del sourceDevice en la pila.
IoAttachDeviceToDeviceStackSafe establece el miembro AlignmentRequirement del objeto de dispositivo al que apunta sourceDevice al valor de correspondiente en el objeto de dispositivo siguiente inferior y establece el StackSize en SourceDevice al valor del siguiente objeto inferior más uno.