Ресурсы Исполнительной системы

Быстрые мьютексы

Быстрый мьютекс являются урезанным вариантом мьютекса, который не может быть рекурсивно захвачен. Поскольку быстрый мьютекс не является диспетчерским объектом, он не может использоваться функцией KeWaitForSingleObject() или KeWaitForMultipleObjects(). Вместо этого нужно использовать функцию ExAcquireFastMutex(). Эквивалента быстрым мьютексам на пользовательском уровне нет, поэтому они могут использоваться только для синхронизации кода режима ядра.

Функции работы с быстрыми мьютексами

VOID ExInitializeFastMutex(IN PFAST_MUTEX FastMutex);

VOID ExAcquireFastMutex(IN PFAST_MUTEX FastMutex);

BOOLEAN ExTryToAcquireFastMutex(IN PFAST_MUTEX FastMutex);

VOID ExReleaseFastMutex(IN PFAST_MUTEX FastMutex);

VOID ExAcquireFastMutexUnsafe(IN PFAST_MUTEX FastMutex);

VOID ExReleaseFastMutexUnsafe (IN PFAST_MUTEX FastMutex);

Ресурсы являются вариантом мьютекса. Ресурсы не являются диспетчерскими объектами, поэтому они не могут иметь имя и использоваться в функции KeWaitForSingleObject() или KeWaitForMultipleObjects(). Ресурсы предоставляют две формы захвата:

· Эксклюзивный – в этом случае ресурс ведет себя как обычный мьютекс – поток, который попытается захватить такой ресурс для эксклюзивного или совместного использования, будет блокирован

· Совместно используемый – в этом случае ресурс может быть одновременно захвачен для совместного использования любым числом потоков.

Ресурсы идеально подходят для защиты структур данных, которые могут одновременно читаться несколькими потоками, но должны модифицироваться в каждый момент времени только одним потоком.

Для работы с ресурсами существуют функции запроса эксклюзивного доступа, неэксклюзивного доступа и преобразования уже полученного неэксклюзивного доступа в эксклюзивный и наоборот без промежуточных операций освобождения ресурса и запроса нового режима доступа. Все функции должны вызываться на уровне IRQL < DISPATCH_LEVEL.

Функции работы с ресурсами

NTSTATUS ExInitializeResourceLite(IN PERESOURCE Resource);

VOID ExReinitializeResourceLite(IN PERESOURCE Resource);

BOOLEAN ExAcquireResourceExclusiveLite(IN PERESOURCE Resource,IN BOOLEAN Wait);

BOOLEAN ExTryToAcquireResourceExclusiveLite(IN PERESOURCE Resource);

BOOLEAN ExAcquireResourceSharedLite(IN PERESOURCE Resource,IN BOOLEAN Wait);

BOOLEAN ExAcquireSharedStarveExclusive(IN PERESOURCE Resource,IN BOOLEAN Wait);

BOOLEAN ExAcquireSharedWaitForExclusive(IN PERESOURCE Resource,IN BOOLEAN Wait);

VOID ExConvertExclusiveToSharedLite(IN PERESOURCE Resource);

BOOLEAN ExIsResourceAcquiredExclusiveLite(IN PERESOURCE Resource);

USHORT ExIsResourceAcquiredSharedLite(IN PERESOURCE Resource);

ULONG ExGetExclusiveWaiterCount(IN PERESOURCE Resource);

ULONG ExGetSharedWaiterCount(IN PERESOURCE Resource);

NTSTATUS ExDeleteResourceLite(IN PERESOURCE Resource);

VOID ExReleaseResourceForThreadLite(IN PERESOURCE Resource,

IN ERESOURCE_THREAD ResourceThreadId);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: