ExSetResourceOwnerPointerEx 函式 (wdm.h)

ExSetResourceOwnerPointerEx 例程會將主管資源的擁有權從呼叫線程傳輸到擁有者指標,這是識別資源擁有者的系統位址。

語法

void ExSetResourceOwnerPointerEx(
  [in, out] PERESOURCE Resource,
  [in]      PVOID      OwnerPointer,
  [in]      ULONG      Flags
);

參數

[in, out] Resource

執行資源的指標 (呼叫線程所擁有的不透明 ERESOURCE 結構) 。 呼叫端先前已配置此結構,並藉由呼叫 ExInitializeResourceLite 例程加以初始化。 如需詳細資訊,請參閱接下來的<備註>一節。

[in] OwnerPointer

識別資源擁有者的指標值。 此參數值是類型為 ERESOURCE_THREAD 但轉換成 PVOID 類型的指標。 呼叫端必須將這個指標值的兩個最小有效位設定為一個。 如需詳細資訊,請參閱接下來的<備註>一節。

[in] Flags

一組旗標,可修改此例程的作業。 將此參數設定為零或下列旗標值:

  • FLAG_OWNER_POINTER_IS_THREAD
如果 Flags = FLAG_OWNER_POINTER_IS_THREAD,OwnerPointer 必須指向類型為 ERESOURCE_THREAD 的值,這是不透明線程物件的指標。 如果 Flags = 0,OwnerPointer 必須指向系統記憶體中的記憶體物件,該物件會維持配置,直到資源釋放為止。 如需詳細資訊,請參閱接下來的<備註>一節。

傳回值

備註

此例程適用於 Windows 7 和更新版本的 Windows 作業系統。

ExSetResourceOwnerPointerEx 可讓作為資源管理員的線程,將線程已取得的執行資源擁有權轉移至另一個線程,然後使用資源。 執行資源是以 ERESOURCE 結構表示。

呼叫端必須將 OwnerPointer 參數值的兩個最小有效位設定為一個。 操作系統會在內部使用這些位來區分 ExSetResourceOwnerPointerEx 呼叫所設定的擁有者指標,與透過呼叫 ExAcquireResourceExclusiveLiteExAcquireResourceSharedLite 例程取得資源的線程。

呼叫 ExSetResourceOwnerPointerEx 以傳輸資源擁有權的線程,必須與先前呼叫 ExAcquireResourceXxxLite 例程才能取得資源的相同線程。

如果 resource-manager 線程藉由呼叫 ExAcquireResourceExclusiveLite) 取得獨佔存取權的資源 (, 則 ExSetResourceOwnerPointerEx 呼叫會將獨佔存取權轉移給資源使用者線程。 如果 resource-manager 線程藉由呼叫 ExAcquireResourceSharedLite () 取得共用存取的資源, 則 ExSetResourceOwnerPointerEx 呼叫會將共用存取權轉移給資源用戶線程。

當資源用戶線程不再需要資源時,應該釋放資源。 一般而言,資源用戶線程會釋放資源。 若要這樣做,它必須呼叫 ExReleaseResourceForThreadLite 例程。 在此呼叫中, ThreadId 參數值必須符合 OwnerPointer 參數的值, (包括先前 ExSetResourceOwnerPointerEx 呼叫中傳輸資源擁有權的兩個最小有效位) 。

在 ExSetResourceOwnerPointerEx 呼叫轉移資源的擁有權之後,驅動程式可以呼叫指定資源的唯一 ERESOURCE 例程ExReleaseResourceForThreadLite。 嘗試呼叫另一個 ERESOURCE 例程,例如 ExReleaseResourceLite,此資源是錯誤。

ExSetResourceOwnerPointerEx 可以在兩種不同的模式中運作。 模式是由 Flags 參數所指定。 若要選取兩種模式更具彈性,請設定 Flags = FLAG_OWNER_POINTER_IS_THREAD。 這個 Flags 值會通知操作系統 OwnerPointer 參數是 resource-manager 線程線程之線程物件的指標。 如有必要,操作系統可以使用這項資訊暫時提升此線程的優先順序,以避免優先順序反轉。 若要取得 用於 OwnerPointer 值的線程對象指標,驅動程式可以呼叫 ExGetCurrentResourceThread 例程。 請記得將 OwnerPointer 值的兩個最小有效位設定為一個。

如果 Flags 為零, 則 ExSetResourceOwnerPointerEx 的行為與舊版 ExSetResourceOwnerPointer 例程的行為相同,可在 Windows 2000 和更新版本的 Windows 操作系統中使用。 也就是說, OwnerPointer 參數會指向資源管理員線程在呼叫 ExSetResourceOwnerPointerEx 之前配置於系統記憶體中的記憶體中的記憶體物件。 在此情況下,物件類型和值並不相關,因為 ExSetResourceOwnerPointerEx 不會嘗試存取物件本身。 相反地,例程只會使用物件的記憶體位址來識別資源擁有者。 對象的記憶體必須從記憶體中的偶數四位元組界限開始。 為了避免兩個驅動程式同時使用相同的擁有者指標,資源管理員線程在釋放資源之前,不得釋放對象的記憶體。

如需管理執行資源的詳細資訊,請參閱 ERESOURCE 例程簡介

規格需求

需求
最低支援的用戶端 適用於 Windows 7 和更新版本的 Windows 作業系統。
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS (storport)

另請參閱

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer