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

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

None

Remarks

Эта подпрограмма доступна в 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 может работать в двух значительно разных режимах. Режим задается параметром Flags . Чтобы выбрать более универсальный из двух режимов, установите флаги = FLAG_OWNER_POINTER_IS_THREAD. Это значение Flags сообщает операционной системе, что параметр 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 HwStorPortProhibitedDDIs(storport)

См. также раздел

ERESOURCE

ExAcquireResourceExclusiveLite

ExAcquireResourceSharedLite

ExGetCurrentResourceThread

ExInitializeResourceLite

ExReleaseResourceForThreadLite

ExReleaseResourceLite

ExSetResourceOwnerPointer