ExSetResourceOwnerPointerEx-Funktion (wdm.h)
Die ExSetResourceOwnerPointerEx-Routine überträgt den Besitz einer Executive-Ressource vom aufrufenden Thread an einen Besitzerzeiger, bei dem es sich um eine Systemadresse handelt, die den Ressourcenbesitzer identifiziert.
Syntax
void ExSetResourceOwnerPointerEx(
[in, out] PERESOURCE Resource,
[in] PVOID OwnerPointer,
[in] ULONG Flags
);
Parameter
[in, out] Resource
Ein Zeiger auf eine Executive-Ressource (eine undurchsichtige ERESOURCE-Struktur ), die sich im Besitz des aufrufenden Threads befindet. Der Aufrufer hat diese Struktur zuvor zugeordnet und durch Aufrufen der ExInitializeResourceLite-Routine initialisiert. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".
[in] OwnerPointer
Ein Zeigerwert, der den Ressourcenbesitzer identifiziert. Dieser Parameterwert ist nominal ein Zeiger auf einen Wert vom Typ ERESOURCE_THREAD wird jedoch in den Typ PVOID umgewandelt. Der Aufrufer muss die zwei am wenigsten signifikanten Bits dieses Zeigerwerts auf eins festlegen. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".
[in] Flags
Ein Satz von Flags, die den Vorgang dieser Routine ändern können. Legen Sie diesen Parameter entweder auf null oder auf den folgenden Flagwert fest:
- FLAG_OWNER_POINTER_IS_THREAD
Rückgabewert
Keine
Bemerkungen
Diese Routine ist in Windows 7 und höheren Versionen des Windows-Betriebssystems verfügbar.
ExSetResourceOwnerPointerEx ermöglicht es einem Thread, der als Ressourcen-Manager fungiert, den Besitz einer Executive-Ressource, die der Thread bereits erworben hat, an einen anderen Thread zu übertragen, der dann die Ressource verwendet. Die Executive-Ressource wird durch eine ERESOURCE-Struktur dargestellt.
Der Aufrufer muss die zwei am wenigsten signifikanten Bits des OwnerPointer-Parameterwerts auf eins festlegen. Das Betriebssystem verwendet diese Bits intern, um einen Besitzerzeiger, der durch einen ExSetResourceOwnerPointerEx-Aufruf festgelegt wurde, von einem Thread zu unterscheiden, der eine Ressource durch Aufrufen der ExAcquireResourceExclusiveLite - oder ExAcquireResourceSharedLite-Routine abgerufen hat.
Der Thread, der ExSetResourceOwnerPointerEx aufruft, um den Besitz einer Ressource zu übertragen, muss derselbe Thread sein, der zuvor die ExAcquireResourceXxxLite-Routine aufgerufen hat, um die Ressource abzurufen.
Wenn der Ressourcen-Manager-Thread die Ressource für exklusiven Zugriff (durch Aufrufen von ExAcquireResourceExclusiveLite) abgerufen hat, überträgt der ExSetResourceOwnerPointerEx-Aufruf den Besitz des exklusiven Zugriffs an den Ressourcenbenutzerthread. Wenn der Ressourcen-Manager-Thread die Ressource für den freigegebenen Zugriff (durch Aufrufen von ExAcquireResourceSharedLite) abgerufen hat, überträgt der ExSetResourceOwnerPointerEx-Aufruf den Shared Access-Besitz an den Ressourcenbenutzerthread.
Wenn der Ressourcenbenutzerthread die Ressource nicht mehr benötigt, sollte die Ressource freigegeben werden. In der Regel gibt der Ressourcenbenutzerthread die Ressource frei. Dazu muss die ExReleaseResourceForThreadLite-Routine aufgerufen werden. In diesem Aufruf muss der ThreadId-Parameterwert mit dem Wert des OwnerPointer-Parameters (einschließlich der zwei am wenigsten signifikanten Bits) im vorherigen ExSetResourceOwnerPointerEx-Aufruf übereinstimmen, der den Besitz der Ressource übertragen hat.
Nachdem ein ExSetResourceOwnerPointerEx-Aufruf den Besitz einer Ressource übertragen hat, ist die einzige andere ERESOURCE-Routine , die ein Treiber für die angegebene Ressource aufrufen kann , ExReleaseResourceForThreadLite. Ein Versuch, eine andere ERESOURCE-Routine , z. B . ExReleaseResourceLite, für diese Ressource aufzurufen, ist ein Fehler.
ExSetResourceOwnerPointerEx kann in zwei deutlich unterschiedlichen Modi betrieben werden. Der Modus wird durch den Flags-Parameter angegeben. Um den vielseitigeren der beiden Modi auszuwählen, legen Sie Flags = FLAG_OWNER_POINTER_IS_THREAD fest. Dieser Flags-Wert informiert das Betriebssystem darüber, dass der OwnerPointer-Parameter ein Zeiger auf das Threadobjekt des Resource-Manager-Threads ist. Das Betriebssystem kann diese Informationen bei Bedarf verwenden, um die Priorität dieses Threads vorübergehend zu erhöhen, um eine Prioritätsinversion zu vermeiden. Um den Threadobjektzeiger abzurufen, der für den OwnerPointer-Wert verwendet werden soll, kann ein Treiber die ExGetCurrentResourceThread-Routine aufrufen. Denken Sie daran, die zwei am wenigsten signifikanten Bits des OwnerPointer-Werts auf eins festzulegen.
Wenn Flags null ist, entspricht das Verhalten von ExSetResourceOwnerPointerEx dem verhalten der älteren ExSetResourceOwnerPointer-Routine , die in Windows 2000 und höheren Versionen des Windows-Betriebssystems verfügbar ist. Das heißt, der OwnerPointer-Parameter verweist auf ein Speicherobjekt, das der Resource-Manager-Thread im Systemspeicher zuordnet, bevor ExSetResourceOwnerPointerEx aufgerufen wird. In diesem Fall sind der Objekttyp und der Wert nicht relevant, da ExSetResourceOwnerPointerEx nicht versucht, auf das Objekt selbst zuzugreifen. Stattdessen verwendet die Routine einfach die Speicheradresse des Objekts, um den Ressourcenbesitzer zu identifizieren. Der Speicher für das Objekt muss an einer geraden Vier-Byte-Grenze im Arbeitsspeicher beginnen. Um zu verhindern, dass zwei Treiber versehentlich denselben Besitzerzeiger gleichzeitig verwenden, darf der Ressourcen-Manager-Thread den Speicher für das Objekt erst freigeben, wenn die Ressource freigegeben wird.
Weitere Informationen zum Verwalten von Führungskräfteressourcen finden Sie unter Einführung in ERESOURCE-Routinen.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar in Windows 7 und höheren Versionen des Windows-Betriebssystems. |
Zielplattform | Universell |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport) |
Weitere Informationen
ExAcquireResourceExclusiveLite