Сейчас на форуме: tyns777 (+5 невидимых)

 eXeL@B —› Программирование —› Help pls
Посл.ответ Сообщение

Ранг: 2.7 (гость)
Активность: 0=0
Статус: Участник

Создано: 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




Ранг: 109.2 (ветеран)
Активность: 0.090
Статус: Участник
Cardinal

Создано: 01 января 2008 11:23
· Личное сообщение · #2

заюзай
UINT GetDriveType(
LPCTSTR lpRootPathName
);
и проверяй то что вернет с флагом DRIVE_FIXED

-----
– Почему ты работаешь по ночам ? – Так удобнее... В одну смену с чертями...



 eXeL@B —› Программирование —› Help pls
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати