Поделиться через


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

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

Никакой

Замечания

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

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

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

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

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

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

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

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

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

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

Требования

Требование Ценность
минимальные поддерживаемые клиентские Доступно в Windows 7 и более поздних версиях операционной системы Windows.
целевая платформа Всеобщий
заголовка wdm.h (include 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