Диспетчерские объекты
Таблица 8. Диспетчерские объекты
Тип Объекта | Переход в сигнальное состояние | Результат для ожидающих потоков | |||
Мьютекс (Mutex) | Освобождение мьютекса | Освобождается один из ожидающих потоков
| |||
Семафор (Semaphore) | Счетчик захватов становится ненулевым | Освобождается некоторое число ожидающих потоков | |||
Событие синхрониза ции (Synchronization events) | Установка события в сигнальное состояние | Освобождается один из ожидающих потоков | |||
Событие оповещения (Notification event) | Установка события в сигнальное состояние | Освобождаются все ожидающие потоки | |||
Таймер синхронизации (Synchronization timer) | Наступило время или истек интервал | Освобождается один из ожидающих потоков | |||
Таймер оповещения (Notification timer) | Наступило время или истек интервал | Освобождаются все ожидающие потоки | |||
Процесс | Завершился последний поток процесса | Освобождаются все ожидающие потоки | |||
Поток | Поток завершился | Освобождаются все ожи дающие потоки | |||
Файл | Завершена операция ввода/вывода | Освобождаются все ожидающие потоки |
Диспетчерские объекты управляются Диспетчером объектов. Как и все объекты Диспетчера объектов, они могут иметь имена в пространстве имен Диспетчера объектов. С помощью этого имени различные драйвера и прикладные программы могут обращаться к соответствующему объекту. Кроме того, каждый процесс имеет таблицу описателей, связанных с конкретным объектом. Как уже говорилось, описатель в таблице описателей уникален и имеет смысл только в контексте конкретного процесса. Однако Диспетчер объектов предоставляет функцию ObReferenceObjectByHandle(), которая дает возможность получения указателя на объект по его описателю. Эту функцию, как следует из вышесказанного, можно использовать только в контексте известного процесса (для которого создавался описатель), а полученный указатель на объект уже можно использовать в случайном контексте. Чтобы такой объект впоследствии мог быть удален, по окончании его использования должна быть вызвана функция ObDereference Object().