Иллюстрированный самоучитель по задачам и примерам Assembler

Работа с дисками, каталогами и организация поиска файлов

Win32 располагает большим набором функций для получения информации о структуре файловой системы конкретного компьютера. Часть этих функций развивает идеи работы с файловой подсистемой, появившиеся в последних версиях WAS DOS. Другие функции являются уникальными для платформы Win32. Рассмотрим наиболее интересные из них.

Программа, предназначенная для исследования файловой системы, прежде всего должна знать, какие логические диски присутствуют в системе. Среди нескольких функций, выполняющих эту работу, наиболее удобной для процесса обработки является GetLogicalDrivesString.

DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR lpBuffer);

Данной функции передаются два параметра:

  • lpBuffer – адрес буфера, в который помешаются имена корневых каталогов логических дисков, установленных в системе;
  • nBufferLength – длина буфера, заданного указателем lpBuffer. В качестве возвращаемого значения функция формирует длину буфера, действительно необходимую для размещения строки с именами корневых каталогов логических дисков.

Например, при наличии трех логических дисков структура заполненного буфера будет следующей: А:\0В:\0С:\0. Заметьте, что имена корневых каталогов разделены нулевыми байтами. Более эффективно вызывать эту функцию два раза: первый раз с нулевым значением первого параметра, при этом функция вернет потребное количество байт для размещения буфера; второй раз функцию уже можно вызывать, подставив на место первого параметра значение, возвращенное при первом вызове.

:prg07_33.asm – Win32-консольное приложение для Win32 для исследования работы
:функции GetLogicalDriveStrings API Win32.
.data
TitleText db 'Получение информации о дисках в Win32',0 '
infojmf db 10 duo (0)
.code
:…….----GetLogi cal Dri veStri ngs…………….-……..
push offset info_buf
push 0
call GetLogicalDriveStringsA
cmp eax.O
jz exit;выход в случае неудачи
;вызываем функцию второй раз. когда известно количество байт, потребное
:для записи списка корневых каталогов
push offset info_buf
push eax
call GetLogicalDriveStringsA
cmp eax.O
jz exit:выход в случае неудачи результат смотрим в отладчике TD32.exe

Недостаток функции GetLogicalDriveStrings состоит в том, что она работает не во всех версиях Windows. Альтернативным вариантом получения информации о наличии дисков в системе является функция GetLogicalDrives.

DWORD GetLogicalDrives(VOID);

Эта функция возвращает в регистре ЕАХ битовую маску, в которой установленные биты указывают на существование логического диска: бит 0 – А, бит 1 – В, бит 2 – С… Таким образом, с помощью функции GetLogicalDrives можно достичь того же самого результата, что и с помощью функции GetLogicalDriveStrings, но несколько большими трудами.

;prg07_34.asm – Win32-консольное приложение для исследования
;работы функции GetLogicalDrives API Win32.
.data
TitleText db 'Получение информации о дисках в Win32'.0
info_buf db 10 dup (0)
.code
call GetLogicalDrives cmp eax.O
jz exit;выход в случае неудачи результат смотрим з отладчике TD32.exe

После того как информация о номенклатуре логических дисков в системе получена, можно получить информацию о каждом из них. Для этого используется функция GetVolumelnformation.

BOOL GetVolumeInformation(LPCTSTR ipRootPathName.
LPTSTR lpvolumeNameBuffer. DWORD nVolumeNameSize, LPDWORD ipVolumeSerialNumber, LPDWORD
ipMaximumComponentLength. LPDWORD lpFileSystemFlags.
LPTSTR ipFileSystemNameBuffer. DWORD nFileSystemNameSize);
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.