Сейчас на форуме: tyns777 (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Help pls |
Посл.ответ | Сообщение |
|
Создано: 01 января 2008 08:34 · Поправил: anynah · Личное сообщение · #1 Нужно немного переделать чтоб поиск был только на локальных дисках (без CD,Flash,Floppy,Network), как только найдет файл hl.exe чтобы сравнивала CRC и удаляла файлы по списку и продолжала поиск (на одном компе могут быть два каталога half-life) (эти файлы заргрузятся при входе на сервер) Связано это с www.reallite.cs2.ru/modules.php?name=Downloads&d_op=viewdownloaddetails&lid=125&ttitle=Reallite_Files_Checker_0.4 ;//========================================// ;// Wads (текстуры) // ;//========================================// chateau.wad cs_cbble.wad cs_dust.wad torntextures.wad ;//========================================// ;// Models (модели) // ;//========================================// models/p_aug.mdl models/p_ak47.mdl models/p_awp.mdl models/w_c4.mdl models/shield/v_shield_hegrenade.mdl models/shield/v_shield_knife.mdl models/shield/v_shield_p228.mdl models/shield/v_shield_smokegrenade.mdl models/shield/v_shield_usp.mdl ;//========================================// ;// Sprites (спрайты) // ;//========================================// sprites/black_smoke1.spr sprites/black_smoke2.spr sprites/black_smoke3.spr sprites/black_smoke4.spr sprites/fast_wallpuff1.spr sprites/gas_puff_01.spr sprites/smokepuff.spr sprites/wall_puff1.spr sprites/wall_puff2.spr sprites/wall_puff3.spr sprites/wall_puff4.spr sprites/pistol_smoke1.spr sprites/pistol_smoke2.spr sprites/rifle_smoke1.spr sprites/rifle_smoke2.spr ; -=-=-=-=-=-=-=-=-=-=-=-=-=- ; Global files search in FASM ; Created by Ct757 ; -=-=-=-=-=-=-=-=-=-=-=-=-=- ; ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ; В данном примере показана рекурсивная реализация ; поиска файлов на ассембеле под Windows с помощью ; API-функций FindFirstFile + FindNextFile, а так же ; показано как можно узнать список присутстующих ; в системе дисков с помощью функции GetLogicalDrives ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ format PE GUI 4.0 ; PE EXE файл entry start ; Точка входа include '%fasminc%\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 ; системе или нет ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ; На всякий случай, пояснение из MSDN: ; ; ;---------------------------------; ; ; DWORD GetLogicalDrives(void); ; ; ;---------------------------------; ; ; Return Values: ; -------------- ; If the function succeeds, the return value is a bitmask ; representing the currently available disk drives. ; Bit position 0 (the least-significant bit) is drive A, ; bit position 1 is drive B, bit position 2 is drive C, and so on. ; ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ add cl,65 ; Если да, то добавим mov byte [buf],cl ; букву диска в sub cl,65 ; буффер mov dword [buf+1],':\*.' ; Сформируем строку mov byte [buf+5],'*' ; для поиска, вида, mov byte [buf+6],0 ; например, C:\*.* push eax ; Сохраняем в стеке push ecx ; нужные регистры call find_files ; Вызываем процедуру поиска pop ecx ; Восстанавливаем pop eax ; регистры .no_disk: ; Если диска нет, dec ecx ; то проверяем следующий jge .find_drives ; пока ecx>0 push 0 ; Выходим из call [ExitProcess] ; программы proc find_files ; Рекурсивная процедура ; поиска файлов locals ; Локальные переменные: fd FINDDATA ; структура 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 ; \*.* для поиска call find_files ; Вызываем процедуру ; поиска для найденной ; директории 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],'.txt' ; Проверим расширение файла jne .next ; Если не совпадает ищем дальше lea eax,[fd.cFileName] push 0 ; push eax ; push eax ; push 0 ; Покажем MessageBox с 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] ; хэндл поиска .exit: ; ret ; Выход endp data import ; Импорт нужных API-функций library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\kernel32.inc' include '%fasminc%\APIA\user32.inc' en ![]() |
|
Создано: 01 января 2008 11:23 · Личное сообщение · #2 |
![]() |
eXeL@B —› Программирование —› Help pls |