Announcement

Collapse
No announcement yet.

Attn: Wayne - CRC code problem

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Attn: Wayne - CRC code problem

    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

  • #2
    Whats wrong? Whatever youve changed in it is wrong - the original works fine!
    Im a bit tied up at the moment but I'll have a look at it in the next hour or two, but can you tell me first please what you want to do that is different to the original?

    Cheers,
    Wayne


    [This message has been edited by Wayne Diamond (edited April 23, 2001).]
    -

    Comment


    • #3
      Well it would not compile as is. The orginal did not use the MSGBOX or standard APIs. It also used STDIN which I have never seen and will not compile. I added a call to the Windows OpenDialog so that you can point to the file you want to CRC easily.

      TO test it I made the CheckCRC a stand alone app that can also use the OpenDialog to point to the file to be checked.

      Everything works but the check fails

      Whenever you get a chance - no hurry.

      ------------------
      Kind Regards
      Mike

      Comment


      • #4
        Mike, the sample is for PB/CC not PB/DLL ... i highly recommend buying PB/CC, it is money well spent.
        To convert it to PB/DLL, just replace STDOUT with MSGBOX, and replace STDIN LINE with anything that accepts input...
        STDIN/OUT just works like this:
        Code:
        FUNCTION PBMAIN() AS LONG
         STDOUT "Enter your name: ";
         STDIN LINE YourName
         STDOUT "Hello there " & YourName
        END FUNCTION
        Im regretably busy at the moment and dont have time to port it to PB/DLL, but if you post your email address I can email you the compiled version of makecrc.exe if you want

        Best regards,
        Wayne


        ------------------
        -

        Comment


        • #5
          Hi Wayne,

          Oh thats it I see.

          Well I allready ported it. MakeCRC works fine as does CheckCRC. but the result of MakeCRC is not whats expected. The result of MakeCRC is whats expected.

          I think if you take a couple of minutes to compile the code above it should be obvious to a guru like you I suspect that there is just some small problem or oversight. I dont think you will be getting into anything heavy

          I dont really want to post my e-mail adress here cos all this stuff goes in the archive for millenia! but if there were some other way to exchange addresses I would be happy to do that.

          ------------------
          Kind Regards
          Mike

          Comment


          • #6
            OK I think I found the problem.

            MakeCRC is not adding the 8Byte checksum like its supposed to:
            OPEN TargetFile FOR BINARY ACCESS WRITE AS #94
            PUT #94, FileLength + 1, xHEX ' not working
            CLOSE #94

            so the GET in CheckCRC comes back with zero:
            OPEN TargetFile FOR BINARY ACCESS READ AS #91
            GET #91, FileLength - 7, xHEX ' why -7 by the way?

            Other than that, the checksum appears to be calculated and encoded fine

            Anyone got any ideas?

            ------------------
            Kind Regards
            Mike

            Comment


            • #7
              Mike,

              Wednesday is a public holiday here in Australia and New Zealand (ANZAC Day) so Ill have a look at it then, but looking at your last question:
              Code:
              MakeCRC is not adding the 8Byte checksum like its supposed to:
              OPEN TargetFile FOR BINARY ACCESS WRITE AS #94
              PUT #94, FileLength + 1, xHEX ' not working
              CLOSE #94
              Add some debugging msgboxes in there...:
              Code:
              OPEN TargetFile FOR BINARY ACCESS WRITE AS #94
               IF ERR THEN MSGBOX "Error opening the file for binary write access"
               MSGBOX "FileLength=" & STR$(FileLength)
               PUT #94, FileLength + 1, xHEX ' not working
               MSGBOX "xHEX=" & xHEX
              CLOSE #94
              See what FileLength and XHex are, one of those values is probably not correct


              ------------------
              -

              Comment


              • #8
                ANZAC day! wassat??

                I have spent a while sticking MSGBOX dialogs everywhere. xHex is zero, file length is correct. I think xHex is zero cos the CRC (which appears to be correctly calculated) is not actually appended to the file with MakeCRC.

                I have verified every step of Make CRC, bur the CRC is not getting written with:

                OPEN TargetFile FOR BINARY ACCESS WRITE AS #94
                PUT #94, FileLength + 1, xHEX ' not working
                CLOSE #94



                ------------------
                Kind Regards
                Mike

                Comment


                • #9
                  ANZAC Day (Australia & New Zealand Army Corps) is a public holiday where we remember and pay tribute to those that gave their lives answering the call to war to fight for peace in WW1, WW2, Vietnam, Korea, etc, and most recently East Timor. A very proud day for all Aussies & Kiwis. <tops up Lance's drink - cheers >
                  I'll have another look at the PB/DLL port of this as soon as I sober up enough to put code together - having problems putting sentences together at the moment so I'll wait a while

                  Cheers,
                  Wayne


                  ------------------
                  -

                  Comment


                  • #10
                    hehehe

                    I have created an account @ http://www.whalemail.com/
                    to send you the debug versions with msgboxs inserted etc to save you some time.
                    l = pbdll
                    p = waynescrc32
                    (All lower case)
                    pls read the message

                    Happy ANZAC day!

                    ------------------
                    Kind Regards
                    Mike

                    Comment


                    • #11
                      Ok, im back. I still cant put a sentence together, but funny enough I can still somehow get bugs out of code.
                      All you need to do is replace your makecrc.bas's PBMain function with this one:
                      Code:
                      FUNCTION PBMAIN() AS LONG
                      LOCAL TargetFile AS STRING, BUFFER AS STRING, xHEX AS STRING * 8
                      LOCAL CRC AS LONG, FileLength 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:
                      'FileLength = SHELL("c:\aspack\aspack.exe " & TargetFile,1)
                      'SLEEP(3000)
                      FileLength = FileSize(TargetFile)
                      Open TargetFile For Binary Access Read As #94
                       BUFFER = String$(FileLength, 0)
                       Get #94, 1, BUFFER
                       CRC = Crc32(StrPtr(BUFFER), Len(BUFFER), -1)
                       CRC = CRC - 4096
                       XHEX = Hex$(CRC)
                      Close #94
                      Open TargetFile For Binary Access Write Lock Read As #94
                       Put #94, FileLength + 1, XHEX
                       MSGBOX "Checksum=" & Hex$(CRC) & ", Size=" & Str$(Len(BUFFER)) & " bytes, First2=" & Left$(BUFFER, 2) & " (should be MZ)"
                      Close #94
                      END FUNCTION
                      Cheers,
                      Wayne


                      ------------------
                      -

                      Comment


                      • #12
                        OK I tried this. It seems the same as mine. Either way it does not seem to append the checksum. The file size should be 1 byte bigger right?
                        So If run the Makr CRC again the file size should have changed.

                        Either way when i run Check CRC it should show me a larger file too and xHex should not be zero. it is.
                        Am i missing something fundamental here? Os or some other prob (i use 98SE)

                        Also, Did you get the files from Whalemail OK?

                        ------------------
                        Kind Regards
                        Mike

                        Comment


                        • #13
                          Yep I used whalemail to download it before modifying, and it worked fine then. All I had to do was copy the PBMain function below into makecrc and it worked fine then...
                          PS. If you dont have one already, get yourself a good hex editor like HexWorkshop32


                          ------------------
                          -

                          Comment


                          • #14
                            Wayne,

                            What am I missing here. I does not work on my end

                            could you e-mail me privatly, I think we have taken up enough band width here


                            ------------------
                            Kind Regards
                            Mike

                            Comment

                            Working...
                            X