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 так что тему переименовываю.