Функция 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 должен указывать на объект хранилища в системной памяти, который остается выделенным до освобождения ресурса. Дополнительные сведения см. в разделе "Примечания".

Возвращаемое значение

None

Remarks

Эта подпрограмма доступна в Windows 7 и более поздних версиях операционной системы Windows.

ExSetResourceOwnerPointerEx позволяет потоку, который выступает в качестве диспетчера ресурсов, передавать права владения на исполнительный ресурс, который поток уже приобрел, другому потоку, который затем использует ресурс. Исполнительный ресурс представлен структурой ERESOURCE .

Вызывающий объект должен задать два наименее значимых бита значения параметра OwnerPointer равными единицам. Операционная система использует эти биты внутри, чтобы различать указатель владельца, заданный вызовом ExSetResourceOwnerPointerEx из потока, который получил ресурс путем вызова подпрограммы ExAcquireResourceExclusiveLite или ExAcquireResourceSharedLite .

Поток, вызывающий ExSetResourceOwnerPointerEx для передачи права владения ресурсом, должен быть тем же потоком, который ранее назывался подпрограммой ExAcquireResourceXxxLite для получения ресурса.

Если поток resource-manager получил ресурс для монопольного доступа (путем вызова ExAcquireResourceExclusiveLite), вызов ExSetResourceOwnerPointerEx передает монопольный доступ потоку resource-user. Если поток resource-manager получил ресурс для общего доступа (путем вызова ExAcquireResourceSharedLite), вызов ExSetResourceOwnerPointerEx передает владение общим доступом потоку resource-user.

Если потоку resource-user ресурс больше не нужен, ресурс должен быть освобожден. Как правило, поток resource-user освобождает ресурс. Для этого необходимо вызвать подпрограмму ExReleaseResourceForThreadLite . В этом вызове значение параметра ThreadId должно соответствовать значению параметра OwnerPointer (включая два наименее значимых бита) в предыдущем вызове ExSetResourceOwnerPointerEx , который передал владение ресурсом.

После того как вызов ExSetResourceOwnerPointerEx передает право владения ресурсом, единственной другой подпрограммой ERESOURCE , которую драйвер может вызывать для указанного ресурса, является ExReleaseResourceForThreadLite. Попытка вызвать другую подпрограмму ERESOURCE , например ExReleaseResourceLite, для этого ресурса является ошибкой.

ExSetResourceOwnerPointerEx может работать в двух значительно разных режимах. Режим задается параметром Flags . Чтобы выбрать более универсальный из двух режимов, установите флажки = FLAG_OWNER_POINTER_IS_THREAD. Это значение Flags сообщает операционной системе, что параметр OwnerPointer является указателем на объект потока resource-manager. При необходимости операционная система может использовать эти сведения для временного повышения приоритета этого потока, чтобы избежать инверсии приоритета. Чтобы получить указатель объекта потока, используемый для значения OwnerPointer , драйвер может вызвать подпрограмму ExGetCurrentResourceThread . Не забудьте задать два наименее значимых бита значения OwnerPointer равными единицам.

Если значение Flags равно нулю, поведение ExSetResourceOwnerPointerEx аналогично поведению устаревшей подпрограммы ExSetResourceOwnerPointer, доступной в Windows 2000 и более поздних версиях операционной системы Windows. То есть параметр OwnerPointer указывает на объект хранилища, который поток resource-manager выделяет в системной памяти перед вызовом ExSetResourceOwnerPointerEx. В этом случае тип и значение объекта не имеют значения, так как ExSetResourceOwnerPointerEx не пытается получить доступ к самому объекту. Вместо этого подпрограмма просто использует адрес памяти объекта для идентификации владельца ресурса. Хранилище для объекта должно начинаться с четной четырехбайтовой границы в памяти. Чтобы предотвратить случайное использование двумя драйверами одного и того же указателя владельца одновременно, поток resource-manager не должен освобождать хранилище для объекта до тех пор, пока ресурс не будет освобожден.

Дополнительные сведения об управлении ресурсами для руководителей см. в статье Введение в подпрограммы ERESOURCE.

Требования

Требование Значение
Минимальная версия клиента Доступно в Windows 7 и более поздних версиях операционной системы Windows.
Целевая платформа Универсальное
Верхняя часть 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