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

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

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

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