Hi Christian,
dazu wird ein Checksummer verwendet. Ein berühmter davon ist der CRC32-Algorythmus. In der VBEx32.DLL ist ein Filechecksummer implementiert. Wie der funktioniert, da habe ich einmal ein Beispiel in VB gesehen, das allerdings auch mit Assembler im Hintergrund arbeitete.
Wir haben den Code so implementiert:
' Function 127
' VBFILECRC32 *********( nicht geändert )*************
FUNCTION VBFILECRC32 ALIAS "VBFILECRC32" (QuellFile AS ASCIIZ PTR) EXPORT AS _
LONG
DIM a AS LONG, b AS BYTE,e AS BYTE
DIM d AS STRING
DIM y AS LONG
DIM nCRC AS LONG, c AS LONG, n AS LONG,x AS LONG, i AS LONG, m AS LONG
DIM f AS INTEGER
DIM xi AS BYTE
DIM sQuellFile AS STRING
sQuellFile=TRIM$(@QuellFile)
f = FREEFILE
ON ERROR RESUME NEXT
IF DIR$(sQuellFile) = "" THEN EXIT FUNCTION
IF ERR>0 THEN EXIT FUNCTION
OPEN sQuellFile FOR BINARY AS #f
x = LOF(f)
m = x\65535
n = 65535
FOR i=1 TO m
GET$ #f,n,d
GOSUB Loop0
NEXT
n = x MOD 65535
IF n>0 THEN
GET$ #f,n,d
GOSUB Loop0
END IF
CLOSE #f
IF nCrC < 0 THEN nCrC = nCrC+&H10000
FUNCTION = nCRC
EXIT FUNCTION
'********************* ( Inline Assembler ) ************************
Loop0:
! Mov a,&Hff ;Setze acht Bits in a
! Mov Ecx,8 ;Zähler initialisieren
Loop1:
! Mov b,0 ;Initialisiere b mit 0
! Mov e,0 ;Initialisiere e mit 0
! Mov Eax, nCRC ;nCRC in Register laden
! And Eax,32768 ;32768 And
! Cmp Eax,32768 ;Vergleiche Eax
! Jne Weiter0 ;Überspringe nächste Zeile wenn ungleich
! Mov b,1 ;Setze b auf logisch 1
Weiter0:
! Mov Edx,d ;StringPtr nach Edx
! Mov Ebx,c ;Counter nach Ebx
! Mov Eax,[Edx+Ebx] ;Wert aus Speicher nach Eax
! Mov Ebx,0 ;Initialisiere Ebx
! Shr a,1 ;Division um binär ^2
! Mov Ebx,a ;Wert a auf bl
! Inc Ebx ;Addiere 1
! And Eax,Ebx ;And mit Wert aus Ebx
! Cmp Eax,Ebx ;Vergleiche Eax,Ebx
! Jne Weiter1 ;Überspringe nächste Zeile wenn ungleich
! Mov e,1 ;Setze e auf logisch 1
Weiter1:
! Mov Eax,nCRC ;setze nCRC nach Eax
! AND Eax,32767 ;32767 And
! Shl Eax,1 ;Multipliziere Eax mit 2
! Mov nCRC,Eax ;speichere Ergebnis in nCRC
! Mov Al,b ;Wert aus b nach Al
! Mov Ah,e ;Wert von e nach Ah
! Cmp al,ah ;Vergleiche b mit e
! Je Weiter2 ;Springe wenn gleich XOR = true
! Mov Eax,nCRC ;setze nCRC nach Eax
! Xor Eax,&H8005 ;&H8005 XOR
! Mov nCRC,Eax ;Speichere Ergebnis in nCRC
Weiter2:
! Dec Ecx ;Vermindere counter um 1
! cmp Ecx,0 ;ist Counter 0?
! Jne Loop1 ;nein, dann Springe zu Loop1
! Inc c ;Addiere in c c=c+1
! Mov Eax,c
! Mov Ebx,n
! Cmp Eax,Ebx
! Jne Loop0
c=0
RETURN
END FUNCTION
' *****************************************************************************
' ** 0 |