IoAttachDeviceToDeviceStackSafe-Funktion (ntddk.h)

Die IoAttachDeviceToDeviceStackSafe-Routine fügt das Geräteobjekt des Aufrufers an das oberste Geräteobjekt in einem Treiberstapel an.

Syntax

NTSTATUS IoAttachDeviceToDeviceStackSafe(
  [in]  PDEVICE_OBJECT SourceDevice,
  [in]  PDEVICE_OBJECT TargetDevice,
  [out] PDEVICE_OBJECT *AttachedToDeviceObject
);

Parameter

[in] SourceDevice

Zeiger auf ein vom Aufrufer erstelltes Geräteobjekt.

[in] TargetDevice

Zeiger auf das Geräteobjekt im Stapel, an den das SourceDevice-Objekt angefügt werden soll.

[out] AttachedToDeviceObject

Bei der Eingabe gibt dieser Parameter die Adresse von SourceDevice-DeviceExtension-AttachedToDeviceObject>> an, die einen NULL-Zeiger enthalten muss. Bei der Ausgabe empfängt dieser Parameter einen Zeiger auf das Geräteobjekt, an das das SourceDevice angefügt wurde.

Rückgabewert

IoAttachDeviceToDeviceStackSafe gibt STATUS_SUCCESS zurück, wenn SourceDevice erfolgreich über dem TargetDevice angefügt wurde; Andernfalls wird STATUS_NO_SUCH_DEVICE zurückgegeben.

Hinweise

Wie IoAttachDeviceToDeviceStack richtet IoAttachDeviceToDeviceStackSafe layering zwischen Treibern ein, sodass dieselben IRPs an jeden Treiber im Stapel gesendet werden. Im Gegensatz zu IoAttachDeviceToDeviceStack verfügt IoAttachDeviceToDeviceStackSafe jedoch über einen zusätzlichen Parameter, AttachedToDeviceObject, den der Filtertreiber verwendet, um die Adresse des AttachedToDeviceObject-Felds des SourceDevice-Objekts zu übergeben. IoAttachDeviceToDeviceStackSafe aktualisiert dieses Feld, während die E/A-Systemdatenbanksperre gedrückt wird. Da es diese Sperre enthält, vermeidet IoAttachDeviceToDeviceStackSafe eine Racebedingung, die andernfalls auftreten könnte, wenn das SourceDevice-Objekt einen IRP erhalten hat, bevor sein AttachedToDeviceObject-Feld aktualisiert wurde.

Ein Dateisystemfiltertreiber ruft IoAttachDeviceToDeviceStackSafe auf, um sein eigenes Filtergeräteobjekt (SourceDevice) über einem Geräteobjekt (TargetDevice) anzufügen, das zu einem Dateisystem oder einem anderen Filtertreiber gehört. Nachfolgende E/A-Anforderungen, die an AttachedToDeviceObject gesendet werden, werden zuerst vom Filtertreiber empfangen, der sie verarbeitet und durch Aufrufen von IoCallDriver an den nächsten Treiber im Stapel weiterleitet.

Wenn sich das von TargetDevice angegebene Geräteobjekt derzeit ganz oben im Treiberstapel befindet, wird das SourceDevice direkt an das TargetDevice angefügt. In diesem Fall sind TargetDevice und der zurückgegebene AttachedToDeviceObject-Zeiger gleich.

Wenn ein oder mehrere Filtergeräteobjekte bereits über dem TargetDevice im Treiberstapel angefügt sind, fügt IoAttachDeviceToDeviceStackSafe das SourceDevice an das oberste Filtergeräteobjekt an. Ein Zeiger auf letzteres wird in AttachedToDeviceObject zurückgegeben.

In dem Moment, in dem es unmittelbar nach dem Anfügen am oberen Rand des Stapels angebracht wurde, belegt das SourceDevice den oberen Rand des Treiberstapels. Beachten Sie jedoch, dass dies nicht notwendigerweise bedeutet, dass das SourceDevice am oberen Rand des Treiberstapels verbleibt. Andere Filter können ihre eigenen Filtergeräteobjekte über dem SourceDevice im Stapel anfügen.

IoAttachDeviceToDeviceStackSafe legt das AlignmentRequirement-Member des Geräteobjekts, auf das von SourceDevice verwiesen wird, auf den Wert des entsprechenden im nächstniedrigen Geräteobjekt fest und legt stackSize in SourceDevice auf den Wert im nächstniedrigen Objekt plus eins fest.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Diese Routine ist im Updaterollup für Windows 2000 Service Pack 4 (SP4) und windows XP und höher verfügbar.
Zielplattform Universell
Header ntddk.h (include Ntddk.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDDIs(storport)

Weitere Informationen

IoAttachDeviceToDeviceStack

IoCallDriver