[ Mr. Jack @ 13.01.2005. 16:06 ] @
Problem je sledeci:

uspeo sam da napravim file compare proceduru koja radi ReadFile po 1 bit u oba fajla, ali to je za fajlove > 200kb uzasno sporo.
E sad video sam da se u skorasnjem postu pominjao MMF, pa me zanima da li bi to bilo brze od ReadFile funkcije ili ipak sa ReadFile da ucitavam po 8 bitova tako da jedan "read" staje u registar pa onda da poredim 2 registra ili...

Ne treba mi nesto super brzo kao neki algoritam samo da je prihvatljvo (pravim patch creator).
[ Vojislav Milunovic @ 13.01.2005. 20:15 ] @
Pa prvo mozes prosto to da uradis, prvo da proveris duzinu dva fajla pre nego sto krenes sa njihovim poredjenjem, to je jedno lepo resenje =)

znaci otvoris fajlove sa CreateFile OPEN_EXISITNG falgom i onda iskoristis GetFileSize jer nema svrhe porediti ako fajlovi nisu iste velicine.

Zatim post osi utvrdio da su fajlovi iste velicine prelazis na mapiranje fajlova u memoriju ->>
Code:

invoke CreateFileA,file,GENERIC_READ,NULL, \
   NULL,OPEN_EXISTING,NULL,NULL
   cmp eax, INVALID_HANDLE_VALUE
   je @perror
   mov fd, eax
invoke GetFileSize, fd, NULL
   mov fsize, eax

;[ovo sve radis duplo

invoke CreateFileMappingA,fd,0,PAGE_READONLY,0,0,0
    or eax, eax
    jz @perror
    mov temp,eax

    invoke MapViewOfFile,temp,FILE_MAP_READ    ,0,0,0
      or eax, eax
      jz @perror
      mov memptr, eax

Pri cemo je fd handle koji vraca CreateFileA to mozes da ponovis za oba fajla pri cemu ce na jedan da pokazuje memptr a na drugi memptr1
posle toga kod je vise nego lak:
Code:

mov esi, memptr
mov edi, memptr
mov ecx, filesz
cld
repe cmpsb
jz @isti


i to bi bilo ukratko kako bi to islo preko memorije...
Medjutim ima i tehnika da ucitavas u odredjenim blokovima fajlove i njih da poredis.
Recimo mapiras vece blokove memorije sa VirtualAlloc ili GlobalAlloc. i da u njih sa ReadFile ucitavas mnogo vise nego sto ti radis trenutno sa byte po byte.
i onda vrtis kroz ovo isto:
Code:

mov esi, memptr1
mov edi, memptr2
mov ecx, (velicina_buffera)
cld
repe cmpsb
jz @ucitaj_opet


Pozdrav...
[ Mr. Jack @ 14.01.2005. 22:12 ] @
Hvala na odgovoru!

Sve radi samo sam morao malo da promenim posto mi je za
svaku razliku trebao offset i karakter koji se razlikuje:

Code:

mov esi, fHandle1
mov edi, fHandle2
mov ecx, fSize

@compare

cld
repe cmpsb

.if ecx != 0
    push ecx
    push edi
    
    push fSize
    pop counter
    sub counter,ecx
    dec counter            ; counter je sada offset
    
    dec edi
    invoke szLeft,edi,offset buffer
    ; buffer je sada karakter koji se razlikuje
    pop ecx
    pop edi
    jmp @compare
.endif

ovo je verovatno moglo lakse i bolje, zanima me sta sam
mogao da koristim umesto szLeft (trebalo je kopirati 1 bit
iz edi u buffer) i cemu sluzi komand cld jer radi i bez nje.

Pozdrav!
[ Vojislav Milunovic @ 14.01.2005. 22:44 ] @
cld clear direction flag -->> Ovo ti objasnjava vise
Citat:

Besides the si, di, si, and ax registers, one other register controls the 80x86's string instructions - the flags register. Specifically, the direction flag in the flags register controls how the CPU processes strings.

If the direction flag is clear, the CPU increments si and di after operating upon each string element. For example, if the direction flag is clear, then executing movs will move the byte, word, or double word at ds:si to es:di and will increment si and di by one, two, or four. When specifying the rep prefix before this instruction, the CPU increments si and di for each element in the string. At completion, the si and di registers will be pointing at the first item beyond the string.

If the direction flag is set, then the 80x86 decrements si and di after processing each string element. After a repeated string operation, the si and di registers will be pointing at the first byte or word before the strings if the direction flag was set.
The direction flag may be set or cleared using the cld (clear direction flag) and std (set direction flag) instructions

AOA Chapter 15

Inace szLeft, iz MASM Lib Help mi nista nije jasno, ali verujem da oces 1 byte na koji pokazuje edi da prebacis u buffer. To moze recimo ovako:
Code:

xor eax, eax
mov al, byte ptr[edi]
mov edi, offset buffer
stosb


Ipravime ako gresim ali zar szLeft po masm32 ne uzima tri parametra? (source,dest i len)? =))
[ Mr. Jack @ 15.01.2005. 13:08 ] @
da da sad mi je jasno, moracu da procitam malo tu knjigu da ne pitam svakakve gluposti. Hvala jos jednom.

Pozdrav!
[ Vojislav Milunovic @ 15.01.2005. 14:43 ] @
Evo ti sintaksa za google kad god te zanima neka instrukcija:
instrukcija, AOA

=) nalazi odma instrukciju u AOA =) Tako da kad ti nije jasna neka instrukcija samo pogledaj =)
[ Sundance @ 17.01.2005. 03:37 ] @
MMF su puuuuuuno brži od klasičnih disk I/O fja.

Heh, sjećam se kad je Jacky Qwerty (jedan genijalan vx lik :) bio napravio prvi virus koji je inficirao preko MMF na NT 4.0, znam da je gospon Kaspersky bio šokiran činjenicom kako se infekcija radi polako u pozadini, bez da se imalo osjeti opterećenje na sustav (brujanje diska i to..)

Možda bi učinkovitije bilo za neke fiksne komadiće koda (sam procjeni koliko) izračunati neki checksum pa njih uspoređivati, pa tek onda tražiti dijelove koji se razlikuju i njih uspoređivati "bit po bit" ?

Ima na netu tona alata za binarnu usporedbu datoteka, malo RCE nije na odmet ;)

[ Vojislav Milunovic @ 17.01.2005. 23:48 ] @
E sad sam se upišao od smeha =) Napravio program koji bukvalno pomeri sve sectione u fajlu tako da fajl koji prikazuje "Hello world" u MessageBoxu ima 1gb =) Pojede mi celu memoriju čoveče =)))) Samo vidiš u task manageru :
mmf --bla-bla --- Memory Usage : 455,xxx k dok pravi taj fajl =))