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

Сериализация

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

Ресурсы являются вариантом быстрого мьютекса. Ресурсы не являются диспетчерскими объектами, поэтому они не могут иметь имя и использоваться в функции 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).

Обобщенная таблица механизмов синхронизации

В таблице 9 представлены механизмы синхронизации и особенности использования каждого из них.

Таблица 9.Механизмы синхронизации и особенности использования механизмов синхронизации.

Объект синхронизации Уровень IRQL, на котором может работать запрашивающий синхронизацию поток Уровень IRQL, на котором будет работать запросивший синхронизацию поток при освобождении объекта синхронизации или его переходе в сигнальное состояние
Запрос без блокирования потока Запрос с блокированием потока
Стандартная спин-блокировка (Standard Spin Lock) <= DISPATCH_LEVEL DISPATCHJLEVEL
Спин-блокировка для ISR, определенная по умолчанию (Default ISR Spin Lock) <= DIRQL DIRQL
Спин-блокировка для синхронизации с ISR (ISR Synchro nize Spin Lock) <= Specified DIRQL Specified DIRQL
Мьютекс (Mutex) <=DISPATCH_LEVEL <DISPATCH LEVEL <=DISPATCH_LEVEL
Семафор (Semaphore) <=DISPATCKLLEVEL <DISPATCH_LEVEL <=DISPATCH_LEVEL
Событие синхронизации (Synchronization Event) <=DISPATCH_LEVEL <DISPATCH_LEVEL <=DISPATCH_LEVEL
Событие уведомления (Notification Event) <=DISPATCH_LEVEL <DISPATCH_LEVEL <=DISPATCH_LEVEL
Таймер синхронизации (Synchronization Timer) <=DISPATCH_LEVEL <DISPATCH_LEVEL  
Таймер уведомления (Notification Timer) <=DISPATCH_LEVEL <DISPATCH_LEVEL  
Процесс (Process) <=DISPATCH_LEVEL <DISPATCH_LEVEL  
Поток (Thread) <=DISPATCH_LEVEL <DISPATCH_LEVEL  
Файл (File) <=DISPATCH_LEVEL <DISPATCfi_LEVEL  
Ресурсы (Resources) < DISPATCH_LEVEL <DISPATCH_LEVEL <=DISPATCH_LEVEL
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.