Локальные сети персональных компьютеров. Работа с сервером Novell NetWare


Таблица каталогов файл-сервера - часть 3


На рис. 1 приведен формат этой информации. К номеру года, возвращенному в первом байте, необходимо добавить число 80.

Рис.1. Формат даты и времени

Параметр OwnerObjectID - указатель на слово, в котором будет записан идентификатор пользователя, создавшего каталог. По этому идентификатору с помощью функции GetBinderyObjectName() вы легко сможете получить имя пользователя.

Параметр MaximumRightsMask - указатель на байт, в который будет записано значение маски прав доступа, связанное с данным каталогом. Маска используется для определения возможности доступа к каталогу и определяется при создании каталога. Каждый бит маски, установленный в 1, разрешает соответствующий вид доступа:

Номер бита Доступ
0 Чтение файлов
1 Запись в файлы
2 Открытие файлов
3 Создание файлов
4 Удаление файлов
5 Можно создавать подкаталоги и задавать для создаваемых подкаталогов права доступа
6 Поиск файлов в каталоге
7 Изменение атрибутов файлов

Функция ScanDirectoryInformation() при успешном завершении возвращает нулевое значение, в противном случае - код ошибки:

Код ошибки Значение
0x98 Заданный сетевой том не существует
0x9B Неправильное значение параметра индекса каталога
0x9C Неправильный путь к каталогу

Для просмотра подкаталогов в заданном каталоге вместо функции ScanDirectoryInformation() можно использовать функцию E2h прерывания INT 21h:

На входе: AH = E2h;
DS:SI = Адрес буфера запроса;
ES:DI Адрес буфера ответа.
На выходе: AL Код ошибки или 0, если операция завершилась без ошибок.

Буфер запроса имеет следующий формат:

struct REQUEST { WORD PacketLength; // размер пакета запроса BYTE Function; // должно быть равно 2 BYTE DirectoryHandle; // индекс каталога WORD SequenceNumber; // порядковый номер BYTE PathLength; // длина поля пути BYTE SearchDirectoryPath[PathLength]; // путь поиска };

Приведем формат буфера ответа:

struct REPLAY { WORD PacketLength; // размер пакета BYTE DirectoryName[16]; // имя найденного каталога BYTE CreationDate[2]; // дата создания каталога BYTE CreationTime[2]; // время создания каталога long OwnerObjectID; // идентификатор пользователя, // создавшего каталог BYTE MaximumRightsMask; // маска прав доступа BYTE Reserved; // зарезервировано WORD SubDirNumber; // номер подкаталога в // каталоге };

В процессе просмотра содержимого каталога программа должна вызывать эту функцию в цикле, задавая каждый раз (кроме первого) значение поля SequenceNumber в буфере запроса равным значению SubDirNumber, полученному в буфере ответа после предыдущего вызова функции. При первом вызове функции значение поля SequenceNumber должно быть равно нулю. Учтите, что поля SubDirNumber и SequenceNumber имеют "перевернутый" формат, т. е. младший байт поля записан по старшему адресу.

Если при вызове функции был найден подкаталог, соответствующий образцу, заданному в поле SearchDirectoryPath, регистр AL будет содержать нулевое значение.




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



Книжный магазин