Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
250
Добавлен:
20.02.2016
Размер:
105.47 Кб
Скачать

[5.2.2] Объект-устройство

Объект-устройствопредставляет физическое или логическое устройство, которое должно быть использовано в качестве получателя запросов ввода/вывода. Формат объекта-устройство определяется частично документированной структурой данных DEVICE_OBJECT. Хотя объект-устройство может быть создан в любое время посредством вызова функции IoCreateDevice(), обычно он создается внутри DriverEntry. При этом указывается размер структуры Device Extension (собственно структура как тип определяется разработчиком драйвери). Эта структура используется для хранения данных, специфичных для конкретного объекта-устройство. При создании объекта-устройство также может быть указано его имя, которое будет видимо в директории “\Device” пространства имен диспетчера объектов. Если имя не указано, объект-устройство может быть использован только внутри драйвера и недоступен извне. Если быть более точным, такой объект-устройство можно использовать, если иметь указатель на описывающую его структуру.

Именованный объект-устройство доступен для использования через вызов системного сервиса NtCreateFile().

Имя устройства и символическая связь

Для обращении к именованному объекту-устройство из подсистемы Win32 посредством функции CreateFile() должны быть предприняты дополнительные действия. Функция CreateFile() ищет имя устройства в директории Диспетчера Объектов “\??” (NT 4.0 и W2K) либо “\DosDevices”(NT 3.51). Поэтому в соответствующей директории – для большей совместимости это должна быть “\DosDevices” – должен быть создан объект-символическая связь, указывающий на имя устройства в директории “\Device”. Обычно связь создается в самом драйвере, хотя это можно сделать и из прикладной программы пользовательского режима с помощью Win32-функции DefineDosDevice().

[5.2.3] Объект-файл и файловые описатели (handle)

Что происходит при успешном открытии объекта-устройство (неважно, с помощью какой функции: CreateFile() или NtCreateFile())? Для описания состояния работы с каждым объектом, открытым с помощью этих функций, создается объект-файл. Особо необходимо подчеркнуть, что создается не новый экземпляр некоторого объекта некоторого типа, имя которого передается этим функциям, а новый экземпляр объекта-файл. Именно отсюда название функций – CreateFile.

С точки зрения прикладного уровня ОС функции открытия файла могут применяться для открытия файлов, устройств, именованных каналов, почтовых слотов и т.п. Однако, с точки зрения ядра ОС, объекта-файл в смысле файл на жестком диске, не существует, как не существует объектов именованный канал или почтовый слот. В действительности объект-файл будет связан с некоторым объектом-устройство, для которого имеет смысл, допустим, понятие “файл” (в смысле файл файловой системы).

Соответственно, каждая операция в/в на прикладном уровне будет производиться с некоторым объектом-файл. Причем конкретный объект будет указан не напрямую, а через так называемый описатель (HANDLE), возвращаемый как результат работы функции CreateFile().

Важно отметить, что каждый процесс имеет свою собственную таблицу описателей, обеспечивая уникальность описателей только в рамках своей таблицы. Это означает, например, что для двух процессов – А и В – описателю со значением 1 будут в общем случае соответствовать 2 различных объекта-файла. Кроме того, ОС поддерживает механизм наследования описателей. В этом случае 2 разных процесса через 2 разных описателя будут разделять один и тот же объект-файл.

Практически уникальность описателя только в контексте данного процесса означает невозможность использования описателя драйвером при работе в случайном контексте. Описатель обязательно должен быть переведен в указатель на объект посредством вызова функции диспетчера объектов ObReferenceObjectByHandle().

Соседние файлы в папке Лабы по драйверам