Hi Wayne,
Thx for your help with this stuff
I looked up your CRC routine and rewrote it a little so that it compiles as two seperate apps, MakeCRC.exe and CheckCRC.exe. They both compile with the CRCwrap.inc file included.
When I make a CRC it seems fine, when I check it I do not get confirmation.
Whats wrong?
'-------------------------------------------------------------------------------------------
' MakeCRC.exe Appends an 8 Byte checksum to the file chosen
'-------------------------------------------------------------------------------------------
#COMPILE EXE "MakeCRC.exe"
#INCLUDE "WIN32API.INC" ' Win API definitions
#INCLUDE "Comdlg32.INC" ' For Open/Save Dialog
#INCLUDE "crcwrap.inc" ' All the necessary functions
TYPE FILETIME
dwLowDateTime AS DWORD
dwHighDateTime AS DWORD
END TYPE
'------------------------------------------------------------------------------------------
FUNCTION PBMAIN() AS LONG
LOCAL TargetFile AS STRING, BUFFER AS STRING, XHEX AS STRING * 8
LOCAL CRC AS LONG, zxLen AS LONG, I AS LONG
IF COMMAND$ = "" THEN
TargetFile = OpenSaveDialog("Exe to append checksum to", "", "C:\PBDLL60\", "exe", "exe", 0)
IF TargetFile = "" THEN EXIT FUNCTION
ELSE
TargetFile = COMMAND$
END IF
'If you want to compress your exe, do it here before tagging the CRC checksum on the end:
'zxLen = SHELL("c:\aspack\aspack.exe " & TargetFile,1)
'SLEEP(3000)
zxLen = FileSize(TargetFile)
OPEN TargetFile FOR BINARY ACCESS READ AS #94
BUFFER = STRING$(zxLen, 0)
GET #94, 1, BUFFER
CRC = Crc32(STRPTR(BUFFER), LEN(BUFFER), -1)
CRC = CRC - 4096
XHEX = HEX$(CRC)
CLOSE #94
FOR I = 1 TO LEN(XHEX) 'Our extremely strong encryption algo
MID$(XHEX, I, 1) = CHR$(ASC(MID$(XHEX, I, 1)) XOR 31)
NEXT I
OPEN TargetFile FOR BINARY ACCESS WRITE LOCK READ AS #94
PUT #94, zxLen + 1, XHEX
MSGBOX "Checksum=" & HEX$(CRC) & ", Size=" & STR$(LEN(BUFFER)) & _
" bytes, First2=" & LEFT$(BUFFER, 2) & " (should be MZ)"
CLOSE #94
END FUNCTION
'-----------------------------------------------------------------------------------------
' ----------------------------------------------------------------------------------------
' CheckCRC.exe - Check a files CRC (Use MakeCRC.exe TO APPEND the 8-BYTE checksum TO the END of your app)
'-----------------------------------------------------------------------------------------
#COMPILE EXE "CheckCRC.exe"
#INCLUDE "WIN32API.INC" ' Win API definitions
#INCLUDE "Comdlg32.INC" ' For Open/Save Dialog
#INCLUDE "crcwrap.inc" ' All the necessary functions
'-----------------------------------------------------------------------------------------
FUNCTION PBMAIN() AS LONG
LOCAL Result AS LONG
LOCAL FileAndPath AS STRING
FileAndPath = OpenSaveDialog("Exe to append checksum to", "", "C:\PBDLL60\", "exe", "exe", 0)
IF FileAndPath = "" THEN EXIT FUNCTION
' FileAndPath = ThisAppsName() ' Use this within your program to check its CRC
Result = CRC32Verify(FileAndPath) ' Choose a file to check
IF Result = -1 THEN
MSGBOX "Checksum has changed!" 'File has been modified
ELSE ' Result = 1
MSGBOX "Checksum is the same
" 'File is the same
END IF
END FUNCTION
'-----------------------------------------------------------------------------------------
' ----------------------------------------------------------------------------------------
' CRC32WRAP.INC - encapsulates the CRC32 functions. Whack into C:\PBDLL60\Winapi folder
'-----------------------------------------------------------------------------------------
FUNCTION CRC32(BYVAL Address AS DWORD, BYVAL Length AS LONG, BYVAL Seed AS LONG) AS LONG
! push EBX ; save EBX for PB
! push EDI ; save EDI for PB
! mov EDI,Address ; address in EDI
! mov ECX,Length ; length in ECX
! jecxz CrcDone ; exit is zero length
! cld ; clear the direction flag
BuildCRC:
! movzx EBX, Byte Ptr [EDI] ; get a char
! mov AX, Seed[1] ; get 2nd and 3rd bytes of seed
! xor DX, DX ; clear DX
! mov DL, Seed[3] ; get 4th byte of seed
! xor BL, Seed[0] ; xor char against first byte of seed
! xor BH, BH ; clear BH
! shl BX, 2 ; shift the index
! xor AX, CrcTable[EBX] ; xor low-half against the table
! xor DX, CrcTable[EBX+2] ; xor high-half against the table
! mov Seed[0], AX ; save the result
! mov Seed[2], DX ; ...
! inc EDI ; move to next char
! loop BuildCRC ; do ECX times
CrcDone:
! pop EDI ; restore EDI
! pop EBX ; restore EBX
FUNCTION = Seed
EXIT FUNCTION
CrcTable:
! dd &H000000000&, &H077073096&, &H0EE0E612C&, &H0990951BA&
! dd &H0076DC419&, &H0706AF48F&, &H0E963A535&, &H09E6495A3&
! dd &H00EDB8832&, &H079DCB8A4&, &H0E0D5E91E&, &H097D2D988&
! dd &H009B64C2B&, &H07EB17CBD&, &H0E7B82D07&, &H090BF1D91&
! dd &H01DB71064&, &H06AB020F2&, &H0F3B97148&, &H084BE41DE&
! dd &H01ADAD47D&, &H06DDDE4EB&, &H0F4D4B551&, &H083D385C7&
! dd &H0136C9856&, &H0646BA8C0&, &H0FD62F97A&, &H08A65C9EC&
! dd &H014015C4F&, &H063066CD9&, &H0FA0F3D63&, &H08D080DF5&
! dd &H03B6E20C8&, &H04C69105E&, &H0D56041E4&, &H0A2677172&
! dd &H03C03E4D1&, &H04B04D447&, &H0D20D85FD&, &H0A50AB56B&
! dd &H035B5A8FA&, &H042B2986C&, &H0DBBBC9D6&, &H0ACBCF940&
! dd &H032D86CE3&, &H045DF5C75&, &H0DCD60DCF&, &H0ABD13D59&
! dd &H026D930AC&, &H051DE003A&, &H0C8D75180&, &H0BFD06116&
! dd &H021B4F4B5&, &H056B3C423&, &H0CFBA9599&, &H0B8BDA50F&
! dd &H02802B89E&, &H05F058808&, &H0C60CD9B2&, &H0B10BE924&
! dd &H02F6F7C87&, &H058684C11&, &H0C1611DAB&, &H0B6662D3D&
! dd &H076DC4190&, &H001DB7106&, &H098D220BC&, &H0EFD5102A&
! dd &H071B18589&, &H006B6B51F&, &H09FBFE4A5&, &H0E8B8D433&
! dd &H07807C9A2&, &H00F00F934&, &H09609A88E&, &H0E10E9818&
! dd &H07F6A0DBB&, &H0086D3D2D&, &H091646C97&, &H0E6635C01&
! dd &H06B6B51F4&, &H01C6C6162&, &H0856530D8&, &H0F262004E&
! dd &H06C0695ED&, &H01B01A57B&, &H08208F4C1&, &H0F50FC457&
! dd &H065B0D9C6&, &H012B7E950&, &H08BBEB8EA&, &H0FCB9887C&
! dd &H062DD1DDF&, &H015DA2D49&, &H08CD37CF3&, &H0FBD44C65&
! dd &H04DB26158&, &H03AB551CE&, &H0A3BC0074&, &H0D4BB30E2&
! dd &H04ADFA541&, &H03DD895D7&, &H0A4D1C46D&, &H0D3D6F4FB&
! dd &H04369E96A&, &H0346ED9FC&, &H0AD678846&, &H0DA60B8D0&
! dd &H044042D73&, &H033031DE5&, &H0AA0A4C5F&, &H0DD0D7CC9&
! dd &H05005713C&, &H0270241AA&, &H0BE0B1010&, &H0C90C2086&
! dd &H05768B525&, &H0206F85B3&, &H0B966D409&, &H0CE61E49F&
! dd &H05EDEF90E&, &H029D9C998&, &H0B0D09822&, &H0C7D7A8B4&
! dd &H059B33D17&, &H02EB40D81&, &H0B7BD5C3B&, &H0C0BA6CAD&
! dd &H0EDB88320&, &H09ABFB3B6&, &H003B6E20C&, &H074B1D29A&
! dd &H0EAD54739&, &H09DD277AF&, &H004DB2615&, &H073DC1683&
! dd &H0E3630B12&, &H094643B84&, &H00D6D6A3E&, &H07A6A5AA8&
! dd &H0E40ECF0B&, &H09309FF9D&, &H00A00AE27&, &H07D079EB1&
! dd &H0F00F9344&, &H08708A3D2&, &H01E01F268&, &H06906C2FE&
! dd &H0F762575D&, &H0806567CB&, &H0196C3671&, &H06E6B06E7&
! dd &H0FED41B76&, &H089D32BE0&, &H010DA7A5A&, &H067DD4ACC&
! dd &H0F9B9DF6F&, &H08EBEEFF9&, &H017B7BE43&, &H060B08ED5&
! dd &H0D6D6A3E8&, &H0A1D1937E&, &H038D8C2C4&, &H04FDFF252&
! dd &H0D1BB67F1&, &H0A6BC5767&, &H03FB506DD&, &H048B2364B&
! dd &H0D80D2BDA&, &H0AF0A1B4C&, &H036034AF6&, &H041047A60&
! dd &H0DF60EFC3&, &H0A867DF55&, &H0316E8EEF&, &H04669BE79&
! dd &H0CB61B38C&, &H0BC66831A&, &H0256FD2A0&, &H05268E236&
! dd &H0CC0C7795&, &H0BB0B4703&, &H0220216B9&, &H05505262F&
! dd &H0C5BA3BBE&, &H0B2BD0B28&, &H02BB45A92&, &H05CB36A04&
! dd &H0C2D7FFA7&, &H0B5D0CF31&, &H02CD99E8B&, &H05BDEAE1D&
! dd &H09B64C2B0&, &H0EC63F226&, &H0756AA39C&, &H0026D930A&
! dd &H09C0906A9&, &H0EB0E363F&, &H072076785&, &H005005713&
! dd &H095BF4A82&, &H0E2B87A14&, &H07BB12BAE&, &H00CB61B38&
! dd &H092D28E9B&, &H0E5D5BE0D&, &H07CDCEFB7&, &H00BDBDF21&
! dd &H086D3D2D4&, &H0F1D4E242&, &H068DDB3F8&, &H01FDA836E&
! dd &H081BE16CD&, &H0F6B9265B&, &H06FB077E1&, &H018B74777&
! dd &H088085AE6&, &H0FF0F6A70&, &H066063BCA&, &H011010B5C&
! dd &H08F659EFF&, &H0F862AE69&, &H0616BFFD3&, &H0166CCF45&
! dd &H0A00AE278&, &H0D70DD2EE&, &H04E048354&, &H03903B3C2&
! dd &H0A7672661&, &H0D06016F7&, &H04969474D&, &H03E6E77DB&
! dd &H0AED16A4A&, &H0D9D65ADC&, &H040DF0B66&, &H037D83BF0&
! dd &H0A9BCAE53&, &H0DEBB9EC5&, &H047B2CF7F&, &H030B5FFE9&
! dd &H0BDBDF21C&, &H0CABAC28A&, &H053B39330&, &H024B4A3A6&
! dd &H0BAD03605&, &H0CDD70693&, &H054DE5729&, &H023D967BF&
! dd &H0B3667A2E&, &H0C4614AB8&, &H05D681B02&, &H02A6F2B94&
! dd &H0B40BBE37&, &H0C30C8EA1&, &H05A05DF1B&, &H02D02EF8D&
END FUNCTION
'---------------------------------------------------------------------------------------------
FUNCTION FileSize(BYVAL f AS STRING) AS LONG
ON ERROR RESUME NEXT
LOCAL FindData AS WIN32_FIND_DATA
LOCAL hDir AS LONG
hDir = FindFirstFile(BYVAL STRPTR(f), FindData)
IF hDir = -1 THEN
FUNCTION = -1
EXIT FUNCTION
END IF
FindClose hDir
FUNCTION = FindData.nFileSizeLow
END FUNCTION
'------------------------------------------------------------------------------------------
FUNCTION ThisAppsName() AS STRING
ON ERROR RESUME NEXT
LOCAL hModule AS LONG
LOCAL buffer AS ASCIIZ * 256
hModule = GetModuleHandle(BYVAL 0&)
GetModuleFileName hModule, Buffer, 256
FUNCTION = Buffer
END FUNCTION
'------------------------------------------------------------------------------------------
FUNCTION CRC32Verify( FileAndPath AS STRING ) AS LONG
ON ERROR RESUME NEXT
DIM xHEX AS STRING * 8
DIM xCRC AS STRING * 8
DIM CRC AS LONG
DIM BUFFER AS STRING
LOCAL I AS LONG
OPEN FileAndPath FOR BINARY ACCESS READ LOCK SHARED AS #91
GET #91, FileSize(FileAndPath) - 7, xHEX
FOR I = 1 TO LEN(XHEX) 'We dont want to show the checksum in plaintext, so XOR it
MID$(XHEX,I,1) = CHR$(ASC(MID$(XHEX,I,1)) XOR 31)
NEXT I
BUFFER = STRING$(FileSize(FileAndPath) - 8, 0)
GET #91, 1, BUFFER
CRC = CRC32(STRPTR(Buffer), LEN(Buffer), -1)
CRC = CRC - 4096
xHEX = RIGHT$("00000000" & xHEX, 8)
xCRC = RIGHT$("00000000" & TRIM$(HEX$(CRC)), 8)
IF xHEX <> xCRC THEN 'Internal change detected - file has been modified
FUNCTION = -1
EXIT FUNCTION
END IF
BUFFER = ""
CRC = 0
CLOSE #91
FUNCTION = 1 '
FUNCTION = 1 ' Default
END FUNCTION ' End of checksum check
'-----------------------------------------------------------------------------------------
FUNCTION OpenSaveDialog(BYVAL Caption AS STRING, _ ' caption
BYVAL NameofFile AS STRING, _ ' filename
BYVAL InitialDir AS STRING, _ ' start directory
BYVAL Filter AS STRING, _ ' filename filter
BYVAL DefExtension AS STRING, _ ' default extension
Flag AS LONG) AS STRING ' 1 = Save Dlg, 0 = Open Dlg
LOCAL Ofn AS OPENFILENAME
LOCAL zFileName AS ASCIIZ * 256
LOCAL zFileTitle AS ASCIIZ * 256
LOCAL zFilter AS ASCIIZ * 256
LOCAL zInitialDir AS ASCIIZ * 256
LOCAL zTitle AS ASCIIZ * 256
LOCAL zDefExt AS ASCIIZ * 10
REPLACE "|" WITH CHR$(0) IN Filter
zFilter = Filter + CHR$(0)
zInitialDir = InitialDir + CHR$(0)
zFileName = NameofFile + CHR$(0)
zDefExt = DefExtension + CHR$(0)
zTitle = Caption + CHR$(0)
ofn.lStructSize = SIZEOF(ofn)
ofn.hWndOwner = 0
ofn.lpstrFilter = VARPTR(zFilter)
ofn.nFilterIndex = 1
ofn.lpstrFile = VARPTR(zFileName)
ofn.nMaxFile = SIZEOF(zFileName)
ofn.lpstrFileTitle = VARPTR(zFileTitle)
ofn.nMaxFileTitle = SIZEOF(zFileTitle)
ofn.lpstrInitialDir = VARPTR(zInitialDir)
IF LEN(zTitle) THEN
ofn.lpstrTitle = VARPTR(zTitle)
END IF
ofn.Flags = Flag
IF Flag = 1 THEN
CALL GetSaveFilename(ofn)
ELSE
CALL GetOpenFilename(ofn)
END IF
ofn.lpstrDefExt = VARPTR(zDefExt)
FUNCTION = zFileName
END FUNCTION
'------------------------------------------------------------------------------------------
------------------
Kind Regards
Mike
Thx for your help with this stuff

I looked up your CRC routine and rewrote it a little so that it compiles as two seperate apps, MakeCRC.exe and CheckCRC.exe. They both compile with the CRCwrap.inc file included.
When I make a CRC it seems fine, when I check it I do not get confirmation.
Whats wrong?
'-------------------------------------------------------------------------------------------
' MakeCRC.exe Appends an 8 Byte checksum to the file chosen
'-------------------------------------------------------------------------------------------
#COMPILE EXE "MakeCRC.exe"
#INCLUDE "WIN32API.INC" ' Win API definitions
#INCLUDE "Comdlg32.INC" ' For Open/Save Dialog
#INCLUDE "crcwrap.inc" ' All the necessary functions
TYPE FILETIME
dwLowDateTime AS DWORD
dwHighDateTime AS DWORD
END TYPE
'------------------------------------------------------------------------------------------
FUNCTION PBMAIN() AS LONG
LOCAL TargetFile AS STRING, BUFFER AS STRING, XHEX AS STRING * 8
LOCAL CRC AS LONG, zxLen AS LONG, I AS LONG
IF COMMAND$ = "" THEN
TargetFile = OpenSaveDialog("Exe to append checksum to", "", "C:\PBDLL60\", "exe", "exe", 0)
IF TargetFile = "" THEN EXIT FUNCTION
ELSE
TargetFile = COMMAND$
END IF
'If you want to compress your exe, do it here before tagging the CRC checksum on the end:
'zxLen = SHELL("c:\aspack\aspack.exe " & TargetFile,1)
'SLEEP(3000)
zxLen = FileSize(TargetFile)
OPEN TargetFile FOR BINARY ACCESS READ AS #94
BUFFER = STRING$(zxLen, 0)
GET #94, 1, BUFFER
CRC = Crc32(STRPTR(BUFFER), LEN(BUFFER), -1)
CRC = CRC - 4096
XHEX = HEX$(CRC)
CLOSE #94
FOR I = 1 TO LEN(XHEX) 'Our extremely strong encryption algo
MID$(XHEX, I, 1) = CHR$(ASC(MID$(XHEX, I, 1)) XOR 31)
NEXT I
OPEN TargetFile FOR BINARY ACCESS WRITE LOCK READ AS #94
PUT #94, zxLen + 1, XHEX
MSGBOX "Checksum=" & HEX$(CRC) & ", Size=" & STR$(LEN(BUFFER)) & _
" bytes, First2=" & LEFT$(BUFFER, 2) & " (should be MZ)"
CLOSE #94
END FUNCTION
'-----------------------------------------------------------------------------------------
' ----------------------------------------------------------------------------------------
' CheckCRC.exe - Check a files CRC (Use MakeCRC.exe TO APPEND the 8-BYTE checksum TO the END of your app)
'-----------------------------------------------------------------------------------------
#COMPILE EXE "CheckCRC.exe"
#INCLUDE "WIN32API.INC" ' Win API definitions
#INCLUDE "Comdlg32.INC" ' For Open/Save Dialog
#INCLUDE "crcwrap.inc" ' All the necessary functions
'-----------------------------------------------------------------------------------------
FUNCTION PBMAIN() AS LONG
LOCAL Result AS LONG
LOCAL FileAndPath AS STRING
FileAndPath = OpenSaveDialog("Exe to append checksum to", "", "C:\PBDLL60\", "exe", "exe", 0)
IF FileAndPath = "" THEN EXIT FUNCTION
' FileAndPath = ThisAppsName() ' Use this within your program to check its CRC
Result = CRC32Verify(FileAndPath) ' Choose a file to check
IF Result = -1 THEN
MSGBOX "Checksum has changed!" 'File has been modified
ELSE ' Result = 1
MSGBOX "Checksum is the same

END IF
END FUNCTION
'-----------------------------------------------------------------------------------------
' ----------------------------------------------------------------------------------------
' CRC32WRAP.INC - encapsulates the CRC32 functions. Whack into C:\PBDLL60\Winapi folder
'-----------------------------------------------------------------------------------------
FUNCTION CRC32(BYVAL Address AS DWORD, BYVAL Length AS LONG, BYVAL Seed AS LONG) AS LONG
! push EBX ; save EBX for PB
! push EDI ; save EDI for PB
! mov EDI,Address ; address in EDI
! mov ECX,Length ; length in ECX
! jecxz CrcDone ; exit is zero length
! cld ; clear the direction flag
BuildCRC:
! movzx EBX, Byte Ptr [EDI] ; get a char
! mov AX, Seed[1] ; get 2nd and 3rd bytes of seed
! xor DX, DX ; clear DX
! mov DL, Seed[3] ; get 4th byte of seed
! xor BL, Seed[0] ; xor char against first byte of seed
! xor BH, BH ; clear BH
! shl BX, 2 ; shift the index
! xor AX, CrcTable[EBX] ; xor low-half against the table
! xor DX, CrcTable[EBX+2] ; xor high-half against the table
! mov Seed[0], AX ; save the result
! mov Seed[2], DX ; ...
! inc EDI ; move to next char
! loop BuildCRC ; do ECX times
CrcDone:
! pop EDI ; restore EDI
! pop EBX ; restore EBX
FUNCTION = Seed
EXIT FUNCTION
CrcTable:
! dd &H000000000&, &H077073096&, &H0EE0E612C&, &H0990951BA&
! dd &H0076DC419&, &H0706AF48F&, &H0E963A535&, &H09E6495A3&
! dd &H00EDB8832&, &H079DCB8A4&, &H0E0D5E91E&, &H097D2D988&
! dd &H009B64C2B&, &H07EB17CBD&, &H0E7B82D07&, &H090BF1D91&
! dd &H01DB71064&, &H06AB020F2&, &H0F3B97148&, &H084BE41DE&
! dd &H01ADAD47D&, &H06DDDE4EB&, &H0F4D4B551&, &H083D385C7&
! dd &H0136C9856&, &H0646BA8C0&, &H0FD62F97A&, &H08A65C9EC&
! dd &H014015C4F&, &H063066CD9&, &H0FA0F3D63&, &H08D080DF5&
! dd &H03B6E20C8&, &H04C69105E&, &H0D56041E4&, &H0A2677172&
! dd &H03C03E4D1&, &H04B04D447&, &H0D20D85FD&, &H0A50AB56B&
! dd &H035B5A8FA&, &H042B2986C&, &H0DBBBC9D6&, &H0ACBCF940&
! dd &H032D86CE3&, &H045DF5C75&, &H0DCD60DCF&, &H0ABD13D59&
! dd &H026D930AC&, &H051DE003A&, &H0C8D75180&, &H0BFD06116&
! dd &H021B4F4B5&, &H056B3C423&, &H0CFBA9599&, &H0B8BDA50F&
! dd &H02802B89E&, &H05F058808&, &H0C60CD9B2&, &H0B10BE924&
! dd &H02F6F7C87&, &H058684C11&, &H0C1611DAB&, &H0B6662D3D&
! dd &H076DC4190&, &H001DB7106&, &H098D220BC&, &H0EFD5102A&
! dd &H071B18589&, &H006B6B51F&, &H09FBFE4A5&, &H0E8B8D433&
! dd &H07807C9A2&, &H00F00F934&, &H09609A88E&, &H0E10E9818&
! dd &H07F6A0DBB&, &H0086D3D2D&, &H091646C97&, &H0E6635C01&
! dd &H06B6B51F4&, &H01C6C6162&, &H0856530D8&, &H0F262004E&
! dd &H06C0695ED&, &H01B01A57B&, &H08208F4C1&, &H0F50FC457&
! dd &H065B0D9C6&, &H012B7E950&, &H08BBEB8EA&, &H0FCB9887C&
! dd &H062DD1DDF&, &H015DA2D49&, &H08CD37CF3&, &H0FBD44C65&
! dd &H04DB26158&, &H03AB551CE&, &H0A3BC0074&, &H0D4BB30E2&
! dd &H04ADFA541&, &H03DD895D7&, &H0A4D1C46D&, &H0D3D6F4FB&
! dd &H04369E96A&, &H0346ED9FC&, &H0AD678846&, &H0DA60B8D0&
! dd &H044042D73&, &H033031DE5&, &H0AA0A4C5F&, &H0DD0D7CC9&
! dd &H05005713C&, &H0270241AA&, &H0BE0B1010&, &H0C90C2086&
! dd &H05768B525&, &H0206F85B3&, &H0B966D409&, &H0CE61E49F&
! dd &H05EDEF90E&, &H029D9C998&, &H0B0D09822&, &H0C7D7A8B4&
! dd &H059B33D17&, &H02EB40D81&, &H0B7BD5C3B&, &H0C0BA6CAD&
! dd &H0EDB88320&, &H09ABFB3B6&, &H003B6E20C&, &H074B1D29A&
! dd &H0EAD54739&, &H09DD277AF&, &H004DB2615&, &H073DC1683&
! dd &H0E3630B12&, &H094643B84&, &H00D6D6A3E&, &H07A6A5AA8&
! dd &H0E40ECF0B&, &H09309FF9D&, &H00A00AE27&, &H07D079EB1&
! dd &H0F00F9344&, &H08708A3D2&, &H01E01F268&, &H06906C2FE&
! dd &H0F762575D&, &H0806567CB&, &H0196C3671&, &H06E6B06E7&
! dd &H0FED41B76&, &H089D32BE0&, &H010DA7A5A&, &H067DD4ACC&
! dd &H0F9B9DF6F&, &H08EBEEFF9&, &H017B7BE43&, &H060B08ED5&
! dd &H0D6D6A3E8&, &H0A1D1937E&, &H038D8C2C4&, &H04FDFF252&
! dd &H0D1BB67F1&, &H0A6BC5767&, &H03FB506DD&, &H048B2364B&
! dd &H0D80D2BDA&, &H0AF0A1B4C&, &H036034AF6&, &H041047A60&
! dd &H0DF60EFC3&, &H0A867DF55&, &H0316E8EEF&, &H04669BE79&
! dd &H0CB61B38C&, &H0BC66831A&, &H0256FD2A0&, &H05268E236&
! dd &H0CC0C7795&, &H0BB0B4703&, &H0220216B9&, &H05505262F&
! dd &H0C5BA3BBE&, &H0B2BD0B28&, &H02BB45A92&, &H05CB36A04&
! dd &H0C2D7FFA7&, &H0B5D0CF31&, &H02CD99E8B&, &H05BDEAE1D&
! dd &H09B64C2B0&, &H0EC63F226&, &H0756AA39C&, &H0026D930A&
! dd &H09C0906A9&, &H0EB0E363F&, &H072076785&, &H005005713&
! dd &H095BF4A82&, &H0E2B87A14&, &H07BB12BAE&, &H00CB61B38&
! dd &H092D28E9B&, &H0E5D5BE0D&, &H07CDCEFB7&, &H00BDBDF21&
! dd &H086D3D2D4&, &H0F1D4E242&, &H068DDB3F8&, &H01FDA836E&
! dd &H081BE16CD&, &H0F6B9265B&, &H06FB077E1&, &H018B74777&
! dd &H088085AE6&, &H0FF0F6A70&, &H066063BCA&, &H011010B5C&
! dd &H08F659EFF&, &H0F862AE69&, &H0616BFFD3&, &H0166CCF45&
! dd &H0A00AE278&, &H0D70DD2EE&, &H04E048354&, &H03903B3C2&
! dd &H0A7672661&, &H0D06016F7&, &H04969474D&, &H03E6E77DB&
! dd &H0AED16A4A&, &H0D9D65ADC&, &H040DF0B66&, &H037D83BF0&
! dd &H0A9BCAE53&, &H0DEBB9EC5&, &H047B2CF7F&, &H030B5FFE9&
! dd &H0BDBDF21C&, &H0CABAC28A&, &H053B39330&, &H024B4A3A6&
! dd &H0BAD03605&, &H0CDD70693&, &H054DE5729&, &H023D967BF&
! dd &H0B3667A2E&, &H0C4614AB8&, &H05D681B02&, &H02A6F2B94&
! dd &H0B40BBE37&, &H0C30C8EA1&, &H05A05DF1B&, &H02D02EF8D&
END FUNCTION
'---------------------------------------------------------------------------------------------
FUNCTION FileSize(BYVAL f AS STRING) AS LONG
ON ERROR RESUME NEXT
LOCAL FindData AS WIN32_FIND_DATA
LOCAL hDir AS LONG
hDir = FindFirstFile(BYVAL STRPTR(f), FindData)
IF hDir = -1 THEN
FUNCTION = -1
EXIT FUNCTION
END IF
FindClose hDir
FUNCTION = FindData.nFileSizeLow
END FUNCTION
'------------------------------------------------------------------------------------------
FUNCTION ThisAppsName() AS STRING
ON ERROR RESUME NEXT
LOCAL hModule AS LONG
LOCAL buffer AS ASCIIZ * 256
hModule = GetModuleHandle(BYVAL 0&)
GetModuleFileName hModule, Buffer, 256
FUNCTION = Buffer
END FUNCTION
'------------------------------------------------------------------------------------------
FUNCTION CRC32Verify( FileAndPath AS STRING ) AS LONG
ON ERROR RESUME NEXT
DIM xHEX AS STRING * 8
DIM xCRC AS STRING * 8
DIM CRC AS LONG
DIM BUFFER AS STRING
LOCAL I AS LONG
OPEN FileAndPath FOR BINARY ACCESS READ LOCK SHARED AS #91
GET #91, FileSize(FileAndPath) - 7, xHEX
FOR I = 1 TO LEN(XHEX) 'We dont want to show the checksum in plaintext, so XOR it
MID$(XHEX,I,1) = CHR$(ASC(MID$(XHEX,I,1)) XOR 31)
NEXT I
BUFFER = STRING$(FileSize(FileAndPath) - 8, 0)
GET #91, 1, BUFFER
CRC = CRC32(STRPTR(Buffer), LEN(Buffer), -1)
CRC = CRC - 4096
xHEX = RIGHT$("00000000" & xHEX, 8)
xCRC = RIGHT$("00000000" & TRIM$(HEX$(CRC)), 8)
IF xHEX <> xCRC THEN 'Internal change detected - file has been modified
FUNCTION = -1
EXIT FUNCTION
END IF
BUFFER = ""
CRC = 0
CLOSE #91
FUNCTION = 1 '
FUNCTION = 1 ' Default
END FUNCTION ' End of checksum check
'-----------------------------------------------------------------------------------------
FUNCTION OpenSaveDialog(BYVAL Caption AS STRING, _ ' caption
BYVAL NameofFile AS STRING, _ ' filename
BYVAL InitialDir AS STRING, _ ' start directory
BYVAL Filter AS STRING, _ ' filename filter
BYVAL DefExtension AS STRING, _ ' default extension
Flag AS LONG) AS STRING ' 1 = Save Dlg, 0 = Open Dlg
LOCAL Ofn AS OPENFILENAME
LOCAL zFileName AS ASCIIZ * 256
LOCAL zFileTitle AS ASCIIZ * 256
LOCAL zFilter AS ASCIIZ * 256
LOCAL zInitialDir AS ASCIIZ * 256
LOCAL zTitle AS ASCIIZ * 256
LOCAL zDefExt AS ASCIIZ * 10
REPLACE "|" WITH CHR$(0) IN Filter
zFilter = Filter + CHR$(0)
zInitialDir = InitialDir + CHR$(0)
zFileName = NameofFile + CHR$(0)
zDefExt = DefExtension + CHR$(0)
zTitle = Caption + CHR$(0)
ofn.lStructSize = SIZEOF(ofn)
ofn.hWndOwner = 0
ofn.lpstrFilter = VARPTR(zFilter)
ofn.nFilterIndex = 1
ofn.lpstrFile = VARPTR(zFileName)
ofn.nMaxFile = SIZEOF(zFileName)
ofn.lpstrFileTitle = VARPTR(zFileTitle)
ofn.nMaxFileTitle = SIZEOF(zFileTitle)
ofn.lpstrInitialDir = VARPTR(zInitialDir)
IF LEN(zTitle) THEN
ofn.lpstrTitle = VARPTR(zTitle)
END IF
ofn.Flags = Flag
IF Flag = 1 THEN
CALL GetSaveFilename(ofn)
ELSE
CALL GetOpenFilename(ofn)
END IF
ofn.lpstrDefExt = VARPTR(zDefExt)
FUNCTION = zFileName
END FUNCTION
'------------------------------------------------------------------------------------------
------------------
Kind Regards
Mike
Comment