Товарищи, мне требуется осуществить рекурсивный поиск папок (пока без файлов). Можете ли вы положить здесь исходный код (на языке ассемблера, разумеется) с использованием функций Win API FindFirstFile, FindNextFile, FindClose. На Delphi я сделал это вот так: ;======================================================== procedure SearchDir(Dir: string); var FD: _WIN32_FIND_DATAA; FH: THandle; begin FH:=FindFirstFile(PChar(Dir+'*'),FD); if FH <> INVALID_HANDLE_VALUE then repeat if Ord(FD.cFileName[0])<>46 then if (FD.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY) then begin SearchDir(Dir+Fd.cFileName+'\'); end; until Windows.FindNextFile(FH,FD) = False; end; ;========================================================= А на ассемблер перевести пока не получилось. Заранее благодарен за сотрудничество.
Компилишь, смотришь ассемблерный код (в IDA, например), выкидываешь ненужное, получаешь результат (грубо, конечно, но это - основные этапы). Оптимизируешь, если сможешь после компилятора...
Лови: Код (Text): buf db MAX_PATH dup(?) ; <--- Путь папки Find proc StartFolder:DWORD LOCAL search: WIN32_FIND_DATA LOCAL directory[MAX_PATH]: BYTE LOCAL hFind:DWORD invoke GetPathOnly, StartFolder, addr directory ; Получаем стартовый каталог (функция из пакета masm32) invoke FindFirstFile, StartFolder, addr search ; Ищем первый файл mov hFind, eax lf: test search.dwFileAttributes, 10h ; Каталог ли это? je lf2 cmp byte ptr[search.cFileName], "." ; Каталоги "." и ".." нам нафиг не нужны je lf2 invoke RtlZeroMemory, offset buf, MAX_PATH ; Забиваем нулями переменную buf функцией RtlZeroMemory (kernel32.dll) invoke lstrcpy, offset buf, addr directory invoke lstrcat, offset buf, addr search.cFileName ; Составляем строку пути каталога invoke lstrlen, offset buf mov byte ptr[buf][eax], 05Ch ; Добавляем "\" (все эти извращения сделаны ради большей скорости) invoke MessageBox,0,offset buf,0,0 ; <-- Показываем путь каталога invoke lstrcpy, offset buf, addr directory invoke lstrcat, offset buf, addr search.cFileName ; Составим строку пути каталога с маской invoke lstrlen, offset buf mov byte ptr[buf][eax], 05Ch ; Добавим "\" mov byte ptr[buf][eax+1], 02Ah ; Добавим "*" invoke Find, offset buf ; Рекурсия lf2: invoke FindNextFile, hFind, addr search cmp eax, 0 jnz lf invoke FindClose, hFind ret Find endp Вот. Не пинайте сильно. P.S. Вызов: invoke Find, $CTA0("C:\*")
кроме "." и ".." могут быть каталоги, которые просто начинаются на точку. ========== я делал так: Код (Text): ... mov eax,dword [.fdata.cFileName] and eax,0FFFFFFh cmp eax,".." je @F ; типа пропускаем cmp ax,"." je @F ...