Freigeben über


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 eingabe gibt dieser Parameter die Adresse 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 wird; andernfalls wird STATUS_NO_SUCH_DEVICE zurückgegeben.

Bemerkungen

Wie IoAttachDeviceToDeviceStack-, stellt IoAttachDeviceToDeviceToDeviceStackSafe Layering zwischen Treibern her, sodass dieselben IRPs an jeden Treiber im Stapel gesendet werden. Im Gegensatz zu IoAttachDeviceToDeviceStackhat IoAttachDeviceToDeviceStackSafe jedoch einen zusätzlichen Parameter, AttachedToDeviceObject, den der Filtertreiber verwendet, um die Adresse des SourceDevice Object's AttachedToDeviceObject-Felds zu übergeben. IoAttachDeviceToDeviceStackSafe aktualisiert dieses Feld, während die E/A-Systemdatenbank gesperrt ist. Da sie diese Sperre enthält, wird IoAttachDeviceToDeviceStackSafe eine Racebedingung vermieden, die andernfalls auftreten kann, wenn das SourceDevice- Objekt ein IRP empfangen hat, bevor das Feld "AttachedToDeviceObject" aktualisiert wurde.

Ein Dateisystemfiltertreiber ruft IoAttachDeviceToDeviceStackSafe auf, um ein eigenes Filtergerätobjekt (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 an den nächsten Treiber im Stapel weiterleitet, indem IoCallDriver-aufgerufen wird.

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

Wenn mindestens ein Filtergerätobjekt bereits über dem TargetDevice- im Treiberstapel angefügt ist, fügt IoAttachDeviceToDeviceStackSafe das SourceDevice- an das oberste Filtergerätobjekt an. Ein Zeiger auf letztere wird in AttachedToDeviceObjectzurückgegeben.

Unmittelbar nach dem Anfügen am Anfang des Stapels nimmt die SourceDevice den Oberen des Treiberstapels ein. Beachten Sie jedoch, dass dies nicht notwendigerweise bedeutet, dass die SourceDevice- oben im Treiberstapel verbleibt. Andere Filter können ihre eigenen Filtergeräteobjekte über dem SourceDevice- im Stapel anfügen.

IoAttachDeviceToDeviceStackSafe legt das AlignmentRequirement Element des Geräteobjekts fest, auf das SourceDevice auf den Wert des entsprechenden im nächsten unteren Geräteobjekt verweist, und legt den StackSize in SourceDevice auf den Wert im nächsten unteren Objekt plus eins fest.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Diese Routine ist im Updaterollup für Windows 2000 Service Pack 4 (SP4) und unter Windows XP und höher verfügbar.
Zielplattform- Universal
Header- ntddk.h (include Ntddk.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport)

Siehe auch

IoAttachDeviceToDeviceStack

IoCallDriver-