Ресурсы Исполнительной системы
Ресурсы являются вариантом быстрого мьютекса. Ресурсы не являются диспетчерскими
объектами, поэтому они не могут иметь имя и использоваться в функции
KeWaitForSingleObject() или KeWaitForMultipleObjects(). Ресурсы предоставляют
две формы захвата:
Эксклюзивный - в этом случае ресурс ведет себя как обычный
мьютекс - поток, который попытается захватить такой ресурс для эксклюзивного
или совместного использования, будет блокирован.
Совместно используемый - в этом случае ресурс может
быть одновременно захвачен для совместного использования любым числом
потоков.
Ресурсы идеально подходят для защиты структур данных, которые могут
одновременно читаться несколькими потоками, но должны модифицироваться
в каждый момент времени только одним потоком.
Для работы с ресурсами существуют функции запроса эксклюзивного доступа,
неэксклюзивного доступа и преобразования уже полученного неэксклюзивного
доступа в эксклюзивный и, наоборот, без промежуточных операций освобождения
ресурса и запроса нового режима доступа. Все функции должны вызываться
на уровне IRQL меньшем DISPATCH_LEVEL.
Функции работы с ресурсами:
- 1. NTSTATUS ExInitializeResourceLite(IN PERESOURCE
Resource);
2. VOID ExReinitializeResourceLite(IN PERESOURCE Resource);
3. BOOLEAN ExAcquireResourceExclusiveLite(IN PERESOURCE Resource
IN BOOLEAN Wait);
4. BOOLEAN ExTryToAcquireResourceExclusiveLite(IN PERESOURCE Resource);
5. BOOLEAN ExAcquireResourceSharedLite(IN PERESOURCE Resource
IN BOOLEAN Wait);
6. BOOLEAN ExAcquireSharedStarveExclusive(IN PERESOURCE Resource
IN BOOLEAN Waif);
7. BOOLEAN ExAcquireSharedWaitForExclusive(IN PERESOURCE Resource,IN
BOOLEAN Waif);
8. VOID ExConvertExclusiveToSharedLite(IN PERESOURCE Resource);
9. BOOLEAN ExIsResourceAcquiredExclusiveLite(IN PERESOURCE Resource);
10. USHORT ExIsResourceAcquiredSharedLite(IN PERESOURCE Resource);
11. ULONG ExGetExclusiveWaiterCount(IN PERESOURCE Resource);
12. ULONG ExGetSharedWaiterCount(IN PERESOURCE Resource);
13. NTSTATUS ExDeleteResourceLite(IN PERESOURCE
Resource);
14. VOID ExReleaseResourceForThreadLite(IN PERESOURCE Resource;
15. IN ERESOURCEJTHREAD ResourceThreadld).
|