Взаимосвязь основных объектов
Что происходит при успешном открытии объекта-устройства
(неважно, с помощью какой функции: CreateFile() или NtCreateFile()? Для
описания состояния работы с каждым объектом, открытым с помощью этих функций,
создается новый экземпляр объекта-файла. Именно
отсюда название функции - CreateFile.
С точки зрения прикладного уровня ОС функции открытия файла могут применяться
для открытия файлов, устройств, именованных каналов, почтовых слотов и
т.п. Однако, с точки зрения ядра ОС, объекта-файла (в смысле файл на жестком
Диске) не существует, как не существует объектов именованный канал или
почтовый слот. В действительности объект-файл будет связан с некоторым
объектом-устройством, для которого имеет смысл, допустим, понятие «файл»
(в смысле файл файловой системы).
Соответственно, каждая операция ввода/вывода на прикладном уровне будет
производиться с некоторым объектом-файлом. Причем конкретный объект будет
указан не напрямую, а через так называемый описатель
(HANDLE), возвращаемый как результат работы функции CreateFile().
Важно отметить, что каждый процесс имеет свою собственную таблицу описателей,
обеспечивая уникальность описателей только в рамках своей таблицы. Это означает, например, что для двух процессов - А и В - описателю со значением 1 будут в общем случае соответствовать два различных объекта-файла (см. рис. 8). Кроме того, ОС поддерживает механизм наследования описателей. В этом случае два разных процесса через два разных описателя будут разделять один и тот же объект-файл.
Рис. 8
Практически уникальность описателя только в контексте данного процесса означает невозможность использования описателя драйвером при работе в случайном контексте. Описатель обязательно должен быть переведен в указатель на объект посредством вызова функции диспетчера объектов ObReferenceObjectBy-Handle().