Программирование драйверов Windows


Функции для работы с файлами - часть 4


Рассмотрим подробнее некоторые функции, использованные в приведенном выше примере.

Макроопределение InitializeObjectAttributes используется для заполнения полей структуры OBJECT_ATTRIBUTES, что делает эту операцию компактнее. Это макроопределение вводится в заголовочном файле ntdef.h пакета DDK. Там же описана и внутренняя организация OBJECT_ATTRIBUTES.

Собственно запись в файл в приведенном выше примере выполняется системной функцией ZwWriteFile.

Способ вызова ZwReadFile во многом повторяет прототип для ZwWriteFile, приведенный в таблице 7.40.

Если параметр pByteOffset указан равным NULL, то в большинстве случаев это воспринимается как нулевое смещение, и запись была бы выполнена (скажем, в приведенном примере) с начала файла. Однако на это допущение лучше не полагаться. Например, если бы мы пытались произвести запись в упомянутое выше устройство PHDDebugPrint, то нас преследовали бы ошибки, пока значение *pByteOffset не было бы задано явно, то есть:

pByteOffset-&#62QuadPart = 0i64; // 0 для LARGE_INTEGER.

Упоминания в документации DDK XР, по поводу того, что при наличии в параметре DesiredAccess (при вызове ZwCreateFile для получения доступа к файлу) флага FILE_APPEND_DATA запись всегда производится в конец файла, мягко говоря, не совсем справедливы. При наличии этого флага (среди параметров вызова ZwCreateFile) значение ByteOffset играет по-прежнему ту же роль в вызове ZwWriteFile, что и 6eз использования этого флага при открытии файла.

В примере, представленном выше, для получения информации о размере файла был использован системный вызов ZwQueryInformationFile. Данный вызов достаточно универсален, и возвращаемая им информация зависит от его последнего параметра, который может принимать следующие значения:

  • FileBasicInformation &#8212 для получения общих параметров открываемого файла, времени создания, времени последнего обращения, аргументов.
  • FileStandardInformation &#8212 для получения размера файла и признака того, что данный объект может быть директорией и т.п.
  • FilePositionInformation &#8212 для получения текущей позиции в файле.
  • FileAlignmentInformation &#8212 для получения информации о способе выравнивания буфера для работы с данным объектом.
  • FileNameInformation &#8212 для получения системной информации об имени файла.

Разумеется, для каждого типа вызова должна быть предоставлена своя структура, для чего предусмотрен предпоследний параметр, где при вызове указывается ее размер. То есть больше указанного таким образом размера вызов ZwQueryInformationFile

использовать не может. Недостаток места для записи всей информации может быть причиной неудачного завершения.




Начало  Назад  Вперед