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

       

Диспетчерские объекты



Таблица 8. Диспетчерские объекты

Тип Объекта

Переход в сигнальное состояние

Результат для ожидающих потоков

Мьютекс (Mutex)

Освобождение мьютекса

Освобождается один из ожидающих потоков



Семафор (Semaphore)

Счетчик захватов становится ненулевым

Освобождается некоторое число ожидающих потоков

Событие синхрониза ции (Synchronization events)

Установка события в сигнальное состояние

Освобождается один из ожидающих потоков

Событие оповещения (Notification event)

Установка события в сигнальное состояние

Освобождаются все ожидающие потоки

Таймер синхронизации (Synchronization timer)

Наступило время или истек интервал

Освобождается один из ожидающих потоков

Таймер оповещения (Notification timer)

Наступило время или истек интервал

Освобождаются все ожидающие потоки

Процесс

Завершился последний поток процесса

Освобождаются все ожидающие потоки

Поток

Поток завершился

Освобождаются все ожи дающие потоки

Файл

Завершена операция ввода/вывода

Освобождаются все ожидающие потоки

Диспетчерские объекты управляются Диспетчером объектов. Как и все объекты Диспетчера объектов, они могут иметь имена в пространстве имен Диспетчера объектов. С помощью этого имени различные драйвера и прикладные программы могут обращаться к соответствующему объекту. Кроме того, каждый процесс имеет таблицу описателей, связанных с конкретным объектом. Как уже говорилось, описатель в таблице описателей уникален и имеет смысл только в контексте конкретного процесса. Однако Диспетчер объектов предоставляет функцию ObReferenceObjectByHandle(), которая дает возможность получения указателя на объект по его описателю. Эту функцию, как следует из вышесказанного, можно использовать только в контексте известного процесса (для которого создавался описатель), а полученный указатель на объект уже можно использовать в случайном контексте. Чтобы такой объект впоследствии мог быть удален, по окончании его использования должна быть вызвана функция ObDereference Object().



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