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) |