Программирование драйверов Windows


Мьютексы - часть 2


/p>

Интересен параметр Level, который мало где описан, включая DDK, но может улучшить защищенность кода от ситуаций взаимоблокировок, если драйвер использует несколько мьютексов сразу из нескольких программных потоков. При инициализации объекта мьютекса устанавливается номер уровня (параметр Level). Позднее, когда поток пытается получить очередной мьютекс, ядро не разрешает владение этим мьютексом в случае, если во владении данного потока уже находится любой другой мьютекс с более низким значением уровня. При умелом использовании этого механизма, ядро автоматически предотвращает взаимоблокировки, возникающие в результате использования в драйвере нескольких объектов мьютексов.

Программный поток не должен пытаться освобождать мьютексы, которые он не получал, поскольку это вынудит систему прекратить работу (bugcheck). Попытка освободить мьютекс, который имеет сигнальное состояние (то есть уже никому не принадлежит) приведет к аналогичным последствиям.

Драйвер должен освобождать все мьютексы, которые находятся в его владении, перед тем, как передаст управление в пользовательский режим (то есть завершит рабочую процедуру и вернет управление Диспетчеру ввода/вывода). Ядро воспримет это как ошибку. Процедура AddDevice, DriverEntry или какая-либо рабочая процедура драйвера, получая для себя мьютекс, не должны планировать его освобождение в другой рабочей процедуре или в другом программном потоке данного драйвера.

Таблица 10.35. Прототип вызова KeReleaseMutex

LONG KeReleaseMutex IRQL == PASSIVE_LEVEL
Параметры Уменьшает на единицу "счетчик занятости" объекта мьютекса, обозначая намерение инициатора вызова тут же вызвать (или не вызывать) KeWaitXxx.
IN PKMUTEX pMutex

Указатель на объект мьютекса

IN BOOLEAN doCallOfKeWaitXxx • TRUE &#8212 следом за данным вызовом текущий программный поток собирается сделать вызов KeWaitForXxx

(используется редко)

• FALSE &#8212 применяемое на практике значение (см. документацию DDK)

Возвращаемое значение

0, если объект мьютекса перешел в сигнальное состояние

<


Начало  Назад  Вперед