Freigeben über


ExSetResourceOwnerPointerEx-Funktion (wdm.h)

Die ExSetResourceOwnerPointerEx Routine überträgt den Besitz einer Geschäftsleitungsressource 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 Geschäftsleitungsressource (eine undurchsichtige ERESOURCE--Struktur), die dem aufrufenden Thread gehört. Der Aufrufer hat diese Struktur zuvor zugewiesen 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 gegossen. Der Aufrufer muss die beiden am wenigsten signifikanten Bits dieses Zeigerwerts auf diejenigen festlegen. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

[in] Flags

Eine Reihe 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
Wenn Flags = FLAG_OWNER_POINTER_IS_THREAD, muss OwnerPointer- auf einen Wert vom Typ ERESOURCE_THREAD verweisen, bei dem es sich um einen Zeiger auf ein undurchsichtiges Threadobjekt handelt. Wenn Flags = 0, muss OwnerPointer- auf ein Speicherobjekt im Systemspeicher verweisen, das bis zur Veröffentlichung der Ressource zugeordnet bleibt. Weitere Informationen finden Sie im folgenden Abschnitt "Hinweise".

Rückgabewert

Nichts

Bemerkungen

Diese Routine ist in Windows 7 und höheren Versionen des Windows-Betriebssystems verfügbar.

ExSetResourceOwnerPointerEx ermöglicht es einem Thread, der als Ressourcenmanager fungiert, den Besitz einer Executive-Ressource, die der Thread bereits erworben hat, in einen anderen Thread zu übertragen, der dann die Ressource verwendet. Die Executive-Ressource wird durch eine ERESOURCE Struktur dargestellt.

Der Aufrufer muss die beiden am wenigsten signifikanten Bits des OwnerPointer Parameterwert auf einen festlegen. Das Betriebssystem verwendet diese Bits intern, um einen Besitzerzeiger zu unterscheiden, der von einem ExSetResourceOwnerPointerEx-Aufruf von einem Thread festgelegt wurde, 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 den ExAcquireResourceXxxLite Routine zum Abrufen der Ressource aufgerufen hat.

Wenn der Ressourcen-Manager-Thread die Ressource für den exklusiven Zugriff erworben hat (durch Aufrufen von ExAcquireResourceExclusiveLite), überträgt der ExSetResourceOwnerPointerEx den exklusiven Zugriff an den Ressourcenbenutzerthread. Wenn der Ressourcen-Manager-Thread die Ressource für den freigegebenen Zugriff erworben hat (durch Aufrufen von ExAcquireResourceSharedLite), überträgt der ExSetResourceOwnerPointerEx Aufruf den Besitz des freigegebenen Zugriffs 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 parameterwert ThreadId mit dem Wert des parameters OwnerPointer (einschließlich der beiden am wenigsten signifikanten Bits) im vorherigen ExSetResourceOwnerPointerEx Aufrufen übereinstimmen, der den Besitz der Ressource übertragen hat.

Nachdem ein ExSetResourceOwnerPointerEx Den Besitz einer Ressource überträgt, der einzige andere ERESOURCE-Routine, die ein Treiber für die angegebene Ressource aufrufen kann, ExReleaseResourceForThreadLiteist. Ein Versuch, eine andere ERESOURCE Routine aufzurufen, z. B. ExReleaseResourceLite, für diese Ressource ist ein Fehler.

ExSetResourceOwnerPointerEx- kann in zwei erheblich unterschiedlichen Modi ausgeführt werden. Der Modus wird durch den parameter Flags angegeben. Um die vielseitigeren beiden Modi auszuwählen, legen Sie Flags = FLAG_OWNER_POINTER_IS_THREAD fest. Dieser Flags Wert informiert das Betriebssystem, dass der OwnerPointer Parameter ein Zeiger auf das Threadobjekt des Ressourcen-Manager-Threads ist. Das Betriebssystem kann bei Bedarf diese Informationen 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 beiden am wenigsten signifikanten Bits des OwnerPointer Wert auf solche festzulegen.

Wenn Flags null ist, ist das Verhalten von ExSetResourceOwnerPointerEx- mit der der älteren ExSetResourceOwnerPointer Routine identisch, 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 Ressourcen-Manager-Thread im Systemspeicher zuweist, bevor er ExSetResourceOwnerPointerEx-aufruft. 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 mit einer geraden Vierbytegrenze 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 Routines.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Verfügbar in Windows 7 und höheren Versionen des Windows-Betriebssystems.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- <= DISPATCH_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport)

Siehe auch

ERESOURCE-

ExAcquireResourceExclusiveLite-

ExAcquireResourceSharedLite-

ExGetCurrentResourceThread-

ExInitializeResourceLite-

ExReleaseResourceForThreadLite-

ExReleaseResourceLite-

ExSetResourceOwnerPointer-