Самоучитель по программированию систем защиты

       

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



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

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

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).

  •  



    Содержание раздела