format PE GUI 4.0 ; PE EXE файл
entry start ; Точка входа
include 'win32a.inc'
section '.main' code readable writeable executable ; Секция кода
; и данных
buf rb 500h ; Буффер для имени директории
fake1 dd '.',0 ; Дирекории, которые
fake2 dd '..',0 ; НЕ надо сканировать
start: ; Начало основной
; Программы
push 1h ; SEM_FAILCRITICALERRORS
call [SetErrorMode] ; Установим error mode
; что бы в случае обращения
; к недоступному диску
; не вываливалось сообщение
call [GetLogicalDrives] ; Получаем список дисков,
; существующих в системе
mov ecx,25 ; Будем проверять, начиная с Z:\
.find_drives:
mov ebx,1 ; Нехитрые опрерации в
shl ebx,cl ; ходе которых мы выясняем
and ebx,eax ; присутствует диск в
je .no_disk ; системе или нет
add cl,65 ; Если да, то добавим
mov byte [buf],cl ; букву диска в
sub cl,65 ; буффер
mov dword [buf+1],':\*.' ; Сформируем строку
mov byte [buf+5],'*' ; для поиска, вида,
mov byte [buf+6],0 ; например, C:\*.*
locals ; Локальные переменные:
fd WIN32_FIND_DATA ; структура WIN32_FIND_DATA
find_h dd ? ; и хэндл поиска
endl
lea eax,[fd] ; Вычисляем и кладем в стек
push eax ; указатель на стуктуру find data
push buf ; Указатель на имя директории, где искать
call [FindFirstFile] ; Ищем
inc eax ; Если ничего
je .exit ; не нашли - выходим
dec eax ; Иначе, сохраним
mov [find_h],eax ; хэндл поиска
.find_next:
mov eax,[fd.dwFileAttributes] ; Проверяем, нашли
and eax,FILE_ATTRIBUTE_DIRECTORY ; директорию?
je .found ; Если нет - прыгаем на .found
lea eax,[fd.cFileName] ; Проверяем,
push eax ; вдруг это
push fake1 ; "."
call [lstrcmp] ;
test eax,eax ; Если да,
je .next ; ищем следующий файл
lea eax,[fd.cFileName] ; Проверяем,
push eax ; вдруг это
push fake2 ; ".."
call [lstrcmp] ;
test eax,eax ; Если да
je .next ; ищем следующий файл
push buf ; Вычислим
call [lstrlen] ; длину строки
sub eax,3 ; вычтем *.*
push eax ; сохраним полученную длину
mov byte [buf+eax],0 ; Если мы всё-таки
lea eax,[fd.cFileName] ; нашли директорию
push eax ; то прибавляем
push buf ; её имя к текущей
call [lstrcat] ; папке
push buf ; Опять вычислим
call [lstrlen] ; длину получившейся строки
mov dword [buf+eax],'\*.*' ; и прибавим
mov byte [buf+eax+4],0 ; \*.* для поиска
pop eax ; Восстановим
mov dword [buf+eax-1],'\*.*' ; имя прежней
mov byte [buf+eax+3],0 ; директории
jmp .next ; Ищем следующий файл
.found:
lea eax,[fd.cFileName]
push eax
call [lstrlen]
cmp dword [fd.cFileName+eax-4],'.iso' ; Проверим расширение файла
jne .next ; Если не совпадает ищем дальше
call [MessageBox]
.next:
lea eax,[fd] ; Кладем в стек указатель
push eax ; на структуру find_data
push [find_h] ; Хэндл текущего поиска
call [FindNextFile] ; Ищем следующий файл
test eax,eax ;
jne .find_next ; Если ничего не нашли,
push [find_h] ; то закрываем
call [FindClose] ; хэндл поиска
Молодец,только назыай темы нормально.Что за рекурсивный обход?
Если это рекурсивный поиск файлов,то так и назови тему.
P.S так что тему переименовываю.