Re: Как определить что объект является файлом?
От: axxie  
Дата: 19.01.05 11:59
Оценка:
Здравствуйте, Linuxoid, Вы писали:

L>Как по параметрам функции IoCreateFile() определить,

L>1) создается новый объект или открывается существующий?

а) Сразу встречный вопрос: может оно вам и не нужно? А нужен вам хендл на этот объект либо код ошибки?
В этом случае вы можете дать отработать настоящему IoCreateFile(), и когда он создаст
для вас хендл работать дальше.

б) Перед передачей управления настоящему IoCreateFile() открыть файл с помощью апишных
функций (ZwCreateFile) но без указания на возможность создания файла (Disposition = FILE_OPEN).
Не забывать про защиту от рекурсии.

L>2) является открываемый (создаваемый) объект файлом, директорией, устройством (чем-то еще?)


2.1) по переданным OBJECT_ATTRIBUTES и другим параметрам сразу отсеять директории
(CreateOptions & FILE_DIRECTORY_FILE) и другие неподходящие вещи.
2.2) В зависимости от варианта реализации а) или б) п. 1) получить хендл. Имея хендл можно делать:
2.3) ObReferenceObjectByHandle => FileObject => DeviceObject.
2.4) Проверить, что это FileObject (FileObject->Type == IO_TYPE_FILE).
2.5) Проверить флаги FileObject.
2.6) Проверить флаги DeviceObject.
Не забывать про защиту от рекурсии. Не забывать, что не всякий хендл, который вам вернет
настоящий IoCreateFile(), позволяет выполнять все операции. Тщательно обрабатывать
ошибки.

Axxie
http://alter.org.ua
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.