News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

zip source

Started by 70mas, April 30, 2006, 08:39:59 PM

Previous topic - Next topic

70mas

Hello!

Does anybody know where can I find ZIP/UNZIP source code in assembler? I would like to use it in my single exe without redistributing any DLLs.

Thanks!

zcoder

70mas,
there is none, unless someone knows of someone who has just wrote one.
So you can still do this:

Go get the ziplib found at sourceForge and use that, or get the ziplib dll progrject
found at same place and open a lib project in C then place those files in that project
and make a LIB, and use the functions there in your exe.


Zcoder....
Back in 1979, My computer ran so fine.
And there was no such thing,
As a Microsoft Crashed Machine.
http://zcoder.110mb.com
http://www.dietzel.com/partner/idevaffiliate.php?id=345_6  Free Domain Names

Mark Jones

Hello 70mas, check out the JCALG1 library. It is a free compressor API.
http://www.bitsum.com/jcalg1.htm
"To deny our impulses... foolish; to revel in them, chaos." MCJ 2003.08

dsouza123

There is c source, try google zip unzip source.

Windows XP has three dlls that may help.
cabinet.dll
cabview.dll
zipfldr.dll

Remember cab files can contain zip files.

Windows XP can create and extract zip files (called zip folders).
Windows ME also natively handles zip folders.
Windows 98 Plus also.
Windows 2000 needs Dunzip32.dll Dzip32.dll Zipfldr.dll according to
http://www.petri.co.il/enable_compressed_folder_in_w2k.htm

Not sure what other versions of windows (95,98SE,NT,Server) have zip folder support.

Maybe someone has created the .inc and .lib files for the dlls.

Also Java .jar files are zip files.

PBrennick

You can also get the library and DLL for manipulating RAR files.  I have attached a project that demonstrates the unrar method.

Paul


[attachment deleted by admin]
The GeneSys Project is available from:
The Repository or My crappy website

Ar-ras


.data?
        RAND_HEAD_LEN           equ     12              ; Length of random encryption header
        keys0                   dd      ?
        keys1                   dd      ?
        keys2                   dd      ?

.data

fake_pack_hdr                   db      00h             ; Usual block
fake_pack_hdrf                  db      01h             ; Final block

; Zip file headers
zip_header_t struct
        signature               DWORD   ?
        ver_needed              WORD    ?
        flags                   WORD    ?
        method                  WORD    ?
        lastmod_time            WORD    ?
        lastmod_date            WORD    ?
        crc                     DWORD   ?
        compressed_size         DWORD   ?
        uncompressed_size       DWORD   ?
        filename_length         WORD    ?
        extra_length            WORD    ?
zip_header_t ends

zip_eod_t struct
        signature               DWORD   ?
        disk_no                 WORD    ?
        disk_dirst              WORD    ?
        disk_dir_entries        WORD    ?
        dir_entries             WORD    ?
        dir_size                DWORD   ?
        dir_offs                DWORD   ?
        comment_len             WORD    ?
zip_eod_t ends

zip_dir_t struct
        signature               DWORD   ?
        made_by                 WORD    ?
        ver_needed              WORD    ?
        flags                   WORD    ?
        method                  WORD    ?
        lastmod_time            WORD    ?
        lastmod_date            WORD    ?
        crc                     DWORD   ?
        compressed_size         DWORD   ?
        uncompressed_size       DWORD   ?
        filename_length         WORD    ?
        extra_length            WORD    ?
        comment_length          WORD    ?
        disk_no                 WORD    ?
        internal_attr           WORD    ?
        external_attr           DWORD   ?
        local_offs              DWORD   ?
zip_dir_t ends

.code

; A part of CRC32 algorithm
CRC32Crypt proc a: DWORD, b: BYTE
        mov     edx, a
        movzx   eax, b
        xor     al, dl
        mov     eax, dword ptr[CRCTable+eax*4]
        shr     edx, 8
        xor     eax, edx
        ret
CRC32Crypt endp

; Update zip encryption keys
ZipUpdateKeys proc V: BYTE
        invoke  CRC32Crypt, keys0, V
        mov     keys0, eax
        and     eax, 0ffh
        add     eax, keys1
        xor     edx, edx
        mov     ecx, 134775813
        mul     ecx
        inc     eax
        mov     keys1, eax
        shr     eax, 24
        invoke  CRC32Crypt, keys2, al
        mov     keys2, eax
        ret
ZipUpdateKeys endp

; Encode a single byte
ZipEncode proc a: BYTE
        mov     ecx, keys2
        and     ecx, 0ffffh
        or      ecx, 2
        mov     eax, ecx
        xor     ecx, 1
        xor     edx, edx
        mul     ecx
        shr     eax, 8
        push    eax
        invoke  ZipUpdateKeys, a
        pop     eax
        xor     al, a
        ret
ZipEncode endp

; Init zip encryption keys
ZipInitKeys proc uses esi passwd: DWORD
        mov     keys0, 305419896
        mov     keys1, 591751049
        mov     keys2, 878082192
        mov     esi, passwd
        lodsb
        .WHILE  al
                invoke  ZipUpdateKeys, al
                lodsb
        .ENDW
        ret
ZipInitKeys endp

; Write crypt header
ZipCryptHead proc uses esi edi passwd, crc, zfile: DWORD
        LOCAL   header[RAND_HEAD_LEN-2]: BYTE ; Random header
        LOCAL   n, bWritten: DWORD
        LOCAL   ztemp: BYTE

        invoke  ZipInitKeys, passwd
        mov     n, 0
        lea     edi, header
        .WHILE  n < RAND_HEAD_LEN-2
                invoke  Rand, 0ffffh
                shr     eax, 7
                invoke  ZipEncode, al
                stosb
                inc     n
        .ENDW
   
        lea     esi, header
        invoke  ZipInitKeys, passwd
        mov     n, 0
        .WHILE  n < RAND_HEAD_LEN-2
                lodsb
                invoke  ZipEncode, al
                mov     ztemp, al
                invoke  WriteFile, zfile, addr ztemp, 1, addr bWritten, NULL
                inc     n
        .ENDW

        mov     eax, crc
        shr     eax, 16
        invoke  ZipEncode, al
        mov     ztemp, al
        invoke  WriteFile, zfile, addr ztemp, 1, addr bWritten, NULL
       
        mov     eax, crc
        shr     eax, 24
        invoke  ZipEncode, al
        mov     ztemp, al
        invoke  WriteFile, zfile, addr ztemp, 1, addr bWritten, NULL
        ret
ZipCryptHead endp

; Encrypt part of dest zfile
ZipCloak proc begin_offs, len, zfile: DWORD
        LOCAL   bTemp: BYTE
        LOCAL   bRead: DWORD

        .IF     !len
                ret
        .ENDIF

        invoke  SetFilePointer, zfile, begin_offs, NULL, FILE_BEGIN

@l:
        invoke  SetFilePointer, zfile, 0, NULL, FILE_CURRENT
        push    eax
        invoke  ReadFile, zfile, addr bTemp, 1, addr bRead, NULL
        pop     eax
        invoke  SetFilePointer, zfile, eax, NULL, FILE_BEGIN
        invoke  ZipEncode, bTemp
        mov     bTemp, al
        invoke  WriteFile, zfile, addr bTemp, 1, addr bRead, NULL
        dec     len
        jnz     @l

        ret
ZipCloak endp

; Convert localtime to ziptime
ZipFilePutTime proc f_time, f_date: DWORD
        LOCAL   systime: SYSTEMTIME

        invoke  GetLocalTime, addr systime

        mov     eax, f_date
        mov     dx, systime.wYear
        sub     dx, 1980
        shl     dx, 9

        mov     cx, systime.wMonth
        shl     cx, 5
        or      cx, systime.wDay
        or      dx, cx
        mov     word ptr[eax], dx

        mov     eax, f_time
        mov     dx, systime.wHour
        shl     dx, 11
        mov     cx, systime.wMinute
        shl     cx, 5
        or      dx, cx
        mov     word ptr[eax], dx
        ret
ZipFilePutTime endp

ZipDumpFile proc uses esi edi hFileIn, hFileOut, StoreName, szPassword, poffs, pdir: DWORD
        LOCAL   bRead, bWritten: DWORD
        LOCAL   offs: DWORD
        LOCAL   hdr1: zip_header_t
        LOCAL   dir1: zip_dir_t
        LOCAL   buf: DWORD
        LOCAL   last_block_offset, crypt_offset: DWORD
        LOCAL   storeas_len: DWORD
        LOCAL   block_len: WORD
        LOCAL   hdr_offs: DWORD

        invoke  SetFilePointer, hFileIn, 0, NULL, FILE_BEGIN

        invoke  GlobalAlloc, GMEM_FIXED, 8192
        mov     buf, eax

        mov     eax, poffs
        m2m     offs, dword ptr[eax]

        m2m     hdr_offs, offs

        invoke  ZeroMemory, addr hdr1, sizeof hdr1
        invoke  ZeroMemory, addr dir1, sizeof dir1

        .IF     szPassword
                or      hdr1.flags, 1
                or      dir1.flags, 1
        .ENDIF

        invoke  lstrlen, StoreName
        mov     storeas_len, eax

        mov     hdr1.signature, 04034b50h
        mov     hdr1.method, 0008h      ; Deflate
        mov     dir1.ver_needed, 10
        m2m     hdr1.ver_needed, dir1.ver_needed
        invoke  ZipFilePutTime, addr hdr1.lastmod_time, addr hdr1.lastmod_date
        m2m     dir1.lastmod_time, hdr1.lastmod_time
        m2m     dir1.lastmod_date, hdr1.lastmod_date
        invoke  CRC32File, hFileIn
        mov     hdr1.crc, eax
        mov     dir1.crc, eax

        m2m     dir1.local_offs, offs

        invoke  GetFileSize, hFileIn, NULL
        mov     hdr1.compressed_size, eax
        mov     dir1.compressed_size, eax
        mov     hdr1.uncompressed_size, eax
        mov     dir1.uncompressed_size, eax

        mov     eax, storeas_len
        mov     hdr1.filename_length, ax
        mov     dir1.filename_length, ax

        mov     eax, storeas_len
        add     offs, eax
        add     offs, sizeof hdr1

        invoke  WriteFile, hFileOut, addr hdr1, sizeof hdr1, addr bWritten, NULL
        invoke  WriteFile, hFileOut, StoreName, storeas_len, addr bWritten, NULL

        .IF     szPassword
                invoke  ZipCryptHead, szPassword, dir1.crc, hFileOut
                add     hdr1.compressed_size, 12 ; size of encryption header
                add     dir1.compressed_size, 12
                add     offs, 12
                invoke  SetFilePointer, hFileOut, 0, NULL, FILE_END
                mov     crypt_offset, eax
        .ENDIF

        ; Write file data
@l:
        ; Gen random block lengths
        invoke  Rand, 200
        add     eax, 20
        xchg    eax, edx
        invoke  ReadFile, hFileIn, buf, edx, addr bRead, NULL
        .IF     bRead
                invoke  SetFilePointer, hFileOut, 0, NULL, FILE_CURRENT
                mov     last_block_offset, eax
               
                ; BTYPE=00
                invoke  WriteFile, hFileOut, offset fake_pack_hdr, 1, addr bWritten, NULL
               
                ; Real block length
                mov     eax, bRead
                mov     block_len, ax
                invoke  WriteFile, hFileOut, addr block_len, 2, addr bWritten, NULL

                ; Complement block length
                not     block_len
                invoke  WriteFile, hFileOut, addr block_len, 2, addr bWritten, NULL

                add     offs, 5
                add     dir1.compressed_size, 5
                add     hdr1.compressed_size, 5

                invoke  WriteFile, hFileOut, buf, bRead, addr bWritten, NULL
                mov     eax, bRead
                add     offs, eax
                jmp     @l
        .ENDIF

        ; Write updated compressed length
        invoke  SetFilePointer, hFileOut, hdr_offs, 0, FILE_BEGIN
        invoke  WriteFile, hFileOut, addr hdr1, sizeof hdr1, addr bWritten, NULL
       
        ; Set last block bit
        invoke  SetFilePointer, hFileOut, last_block_offset, NULL, FILE_BEGIN
        invoke  WriteFile, hFileOut, offset fake_pack_hdrf, 1, addr bWritten, NULL

        ; Encrypt
        .IF     szPassword
                mov     edx, hdr1.compressed_size
                sub     edx, 12 ; sizeof encryption header
                invoke  ZipCloak, crypt_offset, edx, hFileOut
        .ENDIF
        invoke  SetFilePointer, hFileOut, 0, NULL, FILE_END

        mov     dir1.signature,  02014b50h
        mov     dir1.method, 0008h              ; Deflate
        mov     dir1.made_by, 14h               ; MSDOS, PKZIP 2.0
        mov     dir1.ver_needed, 0ah            ; Windows NTFS
        mov     dir1.internal_attr, 1h          ; Apparently an ASCII or text file
        mov     dir1.external_attr, 20h         ; FA_ARCHIVE

        lea     esi, dir1
        mov     edi, pdir
        mov     ecx, sizeof zip_dir_t
        rep movsb

        invoke  GlobalFree, buf

        mov     eax, poffs
        m2m     dword ptr[eax], offs
        ret
ZipDumpFile endp

ZipDumpDir proc hFileOut, dir1, StoreName, poffs: DWORD
        LOCAL   bWritten: DWORD

        invoke  WriteFile, hFileOut, dir1, sizeof zip_dir_t, addr bWritten, NULL

        invoke  lstrlen, StoreName
        mov     ecx, poffs
        add     dword ptr[ecx], eax
        add     dword ptr[ecx], sizeof zip_dir_t
        xchg    eax, edx
        invoke  WriteFile, hFileOut, StoreName, edx, addr bWritten, NULL
        ret
ZipDumpDir endp

; Create ZIP (fake Deflate method: non-packed blocks only), szPassword can be NULL.
; InFile2 (junk file) added to archive to bypass "clever" antiviruses.
CreateZipFile proc uses ebx InFile, InFile2, OutFile, StoreName, StoreName2, szPassword: DWORD
        LOCAL   hFileIn, hFileIn2, hFileOut: DWORD
        LOCAL   bRead, bWritten: DWORD
        LOCAL   offs: DWORD
        LOCAL   eod1: zip_eod_t
        LOCAL   dir1: zip_dir_t
        LOCAL   dir2: zip_dir_t

        xor     ebx, ebx

        invoke  CreateFile, InFile, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
        mov     hFileIn, eax
        inc     eax
        jz      @czf_ret

        invoke  CreateFile, InFile2, GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL
        mov     hFileIn2, eax
        inc     eax
        jz      @czf_ret
       
        invoke  CreateFile, OutFile, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL
        mov     hFileOut, eax
        inc     eax
        jz      @czf_ret

        invoke  ZeroMemory, addr eod1, sizeof eod1

        mov     offs, 0
        invoke  ZipDumpFile, hFileIn, hFileOut, StoreName, szPassword, addr offs, addr dir1
        invoke  ZipDumpFile, hFileIn2, hFileOut, StoreName2, szPassword, addr offs, addr dir2

        m2m     eod1.dir_offs, offs

        invoke  ZipDumpDir, hFileOut, addr dir1, StoreName, addr offs
        invoke  ZipDumpDir, hFileOut, addr dir2, StoreName2, addr offs

        mov     eod1.signature, 06054b50h
        mov     eod1.disk_dir_entries, 2
        m2m     eod1.dir_entries, eod1.disk_dir_entries
        mov     eax, offs
        sub     eax, eod1.dir_offs
        mov     eod1.dir_size, eax
        invoke  WriteFile, hFileOut, addr eod1, sizeof eod1, addr bWritten, NULL

        invoke  CloseHandle, hFileIn2
        invoke  CloseHandle, hFileIn
        invoke  CloseHandle, hFileOut
        inc     ebx

@czf_ret:
        mov     eax, ebx
        ret
CreateZipFile endp

Found it in another project
You have to find the deflate algorythm in asm

http://www.koders.com/assembler/fid0E015E03FA2C42D65DA0075C1DEE2D001061220D.aspx is deflate but in Nasm(?)

GregL

70mas,

I have successfully used unzip32.dll and unzip32.lib from Info-Zip in MASM programs.


Ar-ras

What about rewrite a c sourcecode to masm32 e.g. zlib
i am damn sure that a ziplibrary can be smaller and faster then zlib

PBrennick

Greg,
Do you have a sample project?

Paul
The GeneSys Project is available from:
The Repository or My crappy website

GregL

#9
Paul,

Here is a program I whipped up that downloads a zip file from the internet, unzips it and saves the unzipped file to a speciific directory. I requires the unzip32.dll from Info-Zip.    unz552dN.zip


.586
.MODEL FLAT, STDCALL
OPTION CASEMAP:NONE
   
INCLUDE c:\masm32\include\windows.inc
INCLUDE c:\masm32\include\kernel32.inc
INCLUDE c:\masm32\include\user32.inc
INCLUDE c:\masm32\include\urlmon.inc

INCLUDELIB c:\masm32\lib\kernel32.lib
INCLUDELIB c:\masm32\lib\user32.lib
INCLUDELIB c:\masm32\lib\urlmon.lib

wsprintfA PROTO C :DWORD,:VARARG
wsprintf equ <wsprintfA>

main                    PROTO
ConsOut                 PROTO :PTR BYTE
UnzipFile               PROTO :PTR BYTE, :PTR BYTE
UzPrintRoutine          PROTO :PTR BYTE, :DWORD
UzReplaceRoutine        PROTO :PTR BYTE
UzPasswordRoutine       PROTO :PTR BYTE, :DWORD, :PTR BYTE, :PTR BYTE
UzMessageRoutine        PROTO :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :BYTE, :PTR BYTE, :PTR BYTE, :DWORD, :BYTE

; 68 BYTEs, 17 DWORDs
DCL STRUCT
    ExtractOnlyNewer    DWORD ?
    SpaceToUnderscore   DWORD ?
    PromptToOverwrite   DWORD ?
    fQuiet              DWORD ?
    ncflag              DWORD ?
    ntflag              DWORD ?
    nvflag              DWORD ?
    nfflag              DWORD ?
    nzflag              DWORD ?
    ndflag              DWORD ?
    noflag              DWORD ?
    naflag              DWORD ?
    nZIflag             DWORD ?
    C_flag              DWORD ?
    fPrivilege          DWORD ?
    lpszZipFN           PBYTE ?   ; PTR BYTE
    lpszExtractDir      PBYTE ?   ; PTR BYTE
DCL ENDS

; 44 BYTEs, 11 DWORDs
USERFUNCTIONS STRUCT
    DLLPRNT             DWORD ?    ; function pointer
    DLLSND              DWORD ?    ; function pointer
    DLLREPLACE          DWORD ?    ; function pointer
    DLLPASSWORD         DWORD ?    ; function pointer
    DLLMESSAGE          DWORD ?    ; function pointer
    DLLSERVICE          DWORD ?    ; function pointer
    TotalSizeComp       DWORD ?
    TotalSize           DWORD ?
    CompFactor          DWORD ?   
    NumMembers          DWORD ?
    cchComment          WORD  ?
    pad                 WORD  ?
USERFUNCTIONS ENDS

.DATA?

    szPath              BYTE MAX_PATH dup(?)
           
.DATA
   
    szURL               BYTE "http://www.primetimeshortwave.com/ptswdbas.zip", 0
    szDestPath          BYTE "D:\My Documents\Shortwave Radio\Primetime Shortwave - Access", 0   
    szFile              BYTE "ptswdbas.zip", 0
   
    szTitle             BYTE "Get PTSW dBase file", 13, 10, 0
    szRetrieve          BYTE " Retrieving file - ", 0
    szUnzip             BYTE " Unzipping file  - ", 0
    szSuccess           BYTE "Success", 13, 10, 0
    szFailure           BYTE "Failed!", 13, 10, 13, 10, 0
    szCrLf              BYTE 13, 10, 0
    szSlash             BYTE "\", 0       
    szLib               BYTE "unzip32.dll", 0
    szProcName          BYTE "Wiz_SingleEntryUnzip", 0

   
.CODE

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
start:

    call main
    INVOKE ExitProcess, eax

; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««

main PROC

    INVOKE ConsOut, ADDR szTitle
   
    ;// Retrieve zip file
    INVOKE GetTempPath, MAX_PATH, ADDR szPath
    .IF eax == 0
        INVOKE ConsOut, ADDR szFailure
        jmp @F
    .ENDIF
    INVOKE lstrcat, ADDR szPath, ADDR szSlash
    .IF eax == 0
        INVOKE ConsOut, ADDR szFailure
        jmp @F       
    .ENDIF   
    INVOKE lstrcat, ADDR szPath, ADDR szFile
    .IF eax == 0
        INVOKE ConsOut, ADDR szFailure
        jmp @F       
    .ENDIF
    INVOKE ConsOut, ADDR szRetrieve
    INVOKE URLDownloadToFile, NULL, ADDR szURL, ADDR szPath, 0, NULL
    ; URLDownloadToFile returns S_OK (0) if successful
    .IF eax != S_OK
        INVOKE ConsOut, ADDR szFailure
        jmp @F       
    .ENDIF
    INVOKE ConsOut, ADDR szSuccess
    ;// Unzip zip file
    INVOKE ConsOut, ADDR szUnzip
    INVOKE UnzipFile, ADDR szPath, ADDR szDestPath
    ; UnzipFile returns 0 on failure
    .IF eax == 0
        push edx     ; error code is in edx   
        INVOKE ConsOut, ADDR szFailure
        pop eax      ; return the error code
    .ELSE
        INVOKE ConsOut, ADDR szSuccess
        INVOKE ConsOut, ADDR szCrLf
        xor eax, eax ; return 0   
    .ENDIF
  @@: 
    ret
main ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
ConsOut PROC pString:PTR BYTE
    ; ConsOut returns 0 on failure
    LOCAL hStdOut      :DWORD
    LOCAL dwNumToWrite :DWORD
    LOCAL dwNumWritten :DWORD
   
    INVOKE GetStdHandle, STD_OUTPUT_HANDLE
    ; GetStdHandle returns INVALID_HANDLE_VALUE on failure
    .IF eax == INVALID_HANDLE_VALUE
        xor eax, eax
        jmp @F
    .ELSE
        mov hStdOut, eax         
        INVOKE lstrlen, pString
        ; lstrlen returns 0 on failure
        .IF eax == 0
            jmp @F
        .ELSE   
            mov dwNumToWrite, eax         
            INVOKE WriteConsole, hStdOut, pString, dwNumToWrite, ADDR dwNumWritten, NULL
            ; WriteConsole returns 0 on failure
            .IF eax
                mov eax, dwNumWritten
            .ENDIF
        .ENDIF
    .ENDIF   
  @@: 
    ret
ConsOut ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
UnzipFile PROC pArcName:PTR BYTE, pDestPath:PTR BYTE

    ; Uses UNZIP32.DLL (www.Info-Zip.org)
    ; UnzipFile returns 0 on failure
   
    LOCAL theDCL               :DCL
    LOCAL theUF                :USERFUNCTIONS
    LOCAL hUnzipDll            :DWORD
    LOCAL Wiz_SingleEntryUnzip :DWORD   ; function pointer
   
    INVOKE LoadLibrary, ADDR szLib
    .IF eax == 0
        jmp done        ; return 0
    .ELSE
        mov hUnzipDll, eax
    .ENDIF
   
    INVOKE GetProcAddress, hUnzipDll, ADDR szProcName
    .IF eax == 0
        INVOKE FreeLibrary, hUnzipDll
        xor eax, eax    ; return 0
        jmp done
    .ELSE
        mov Wiz_SingleEntryUnzip, eax
    .ENDIF   
   
    ; Fill in the DCL struct
    mov theDCL.ExtractOnlyNewer, 0  ; Do not extract only newer
    mov theDCL.SpaceToUnderscore, 0 ; Do not convert space to underscore
    mov theDCL.PromptToOverwrite, 0 ; "Overwrite all" selected -> no query mode
    mov theDCL.fQuiet, 0            ; 0 = all messages
                                    ; 1 = fewer messages
                                    ; 2 = no messages
    mov theDCL.ncflag, 0            ; Write to stdout if true                                     
    mov theDCL.ntflag, 0            ; Test zip file if true
    mov theDCL.nvflag, 0            ; Give a verbose listing if true
    mov theDCL.nfflag, 0            ; Do not freshen existing files only   
    mov theDCL.nzflag, 0            ; Display a zip file comment if true
    mov theDCL.ndflag, 1            ; Recreate directories
                                    ; 0 = junk paths from filenames
                                    ; 1 = safe usage of paths in filenames (skip "../")
                                    ; 2 = allow unsafe path components (dir traversals)
    mov theDCL.noflag, 1            ; Over-write all files if true   
    mov theDCL.naflag, 0            ; Do not convert CR to CRLF
    mov theDCL.nZIflag, 0           ; Get ZipInfo if true
    mov theDCL.C_flag, 0            ; case insensitive if true
    mov theDCL.fPrivilege, 1        ; 1 = restore ACLs in user mode
                                    ; 2 = try to use privileges for restoring ACLs
    mov eax, pArcName
    mov theDCL.lpszZipFN, eax       ; The archive name
   
    mov eax, pDestPath
    mov theDCL.lpszExtractDir, eax  ; The directory to extract to. This is set
                                    ;   to NULL if you are extracting to the
                                    ;   current directory.
    ; Fill in the USERFUNCTIONS struct                                   
    lea eax, UzPrintRoutine                     
    mov theUF.DLLPRNT, eax
   
    mov eax, NULL   
    mov theUF.DLLSND, eax
   
    lea eax, UzReplaceRoutine   
    mov theUF.DLLREPLACE, eax
   
    lea eax, UzPasswordRoutine   
    mov theUF.DLLPASSWORD, eax
   
    lea eax, UzMessageRoutine
    mov theUF.DLLMESSAGE, eax
   
    lea eax, UzServiceRoutine   
    mov theUF.DLLSERVICE, eax
   
    ; The values below are filled in by the DLL
    mov eax, 0
    mov theUF.TotalSizeComp, eax
    mov theUF.TotalSize, eax
    mov theUF.CompFactor, eax
    mov theUF.NumMembers, eax
    mov theUF.cchComment, ax

    ; Call the DLL function                   
    ; INVOKE Wiz_SingleEntryUnzip, 0, NULL, 0, NULL, ADDR theDCL, ADDR theUF
    lea eax, theUF
    push eax
    lea eax, theDCL
    push eax
    push NULL
    push 0
    push NULL
    push 0
    call Wiz_SingleEntryUnzip
    ;add esp, 24        ; Wiz_SingleEntryUnzip cleans up the stack
   
    .IF eax == 0        ; success
        INVOKE FreeLibrary, hUnzipDll 
        mov eax, 1      ; return 1
    .ELSE               ; error
        push eax
        INVOKE FreeLibrary, hUnzipDll
        pop edx         ; error code in edx
        xor eax, eax    ; return 0       
    .ENDIF   
     
  done:
    ret
   
UnzipFile ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
; These are dummy routines. Needed to satisfy the pointers to functions. 
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
UzPrintRoutine PROC pString:PTR BYTE, dwLen:DWORD
    ;INVOKE ConsOut, pstring ; remark this line out if you don't want to see status messages
    mov eax, dwLen           ; return the string length
    ret
UzPrintRoutine ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
UzReplaceRoutine PROC p1:PTR BYTE
    mov eax, 1  ; return 1
    ret
UzReplaceRoutine ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
UzPasswordRoutine PROC p1:PTR BYTE, dw1:DWORD, p2:PTR BYTE, p3:PTR BYTE
    mov eax, 1  ; return 1
    ret
UzPasswordRoutine ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
UzMessageRoutine PROC dw1:DWORD, dw2:DWORD, dw3:DWORD, dw4:DWORD, dw5:DWORD, dw6:DWORD, dw7:DWORD, dw8:DWORD, b1:BYTE, p1:PTR BYTE, p2:PTR BYTE, dw9:DWORD, b2:BYTE
    mov eax, 1  ; does not need to return anything (void)
    ret
UzMessageRoutine ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
UzServiceRoutine PROC p1:PTR BYTE, dw1:DWORD
    mov eax, 0   ; if this procedure returns a non-zero value
                 ; Wiz_SingleEntryUnzip will fail
    ret
UzServiceRoutine ENDP
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
END start


Made minor changes:  5/4/2006


PBrennick

Greg,
Thanks for sharing this nice utility that will be added to my archive.  It really does a nice job.

Paul
The GeneSys Project is available from:
The Repository or My crappy website

msmith

I use bszip.dll from http://www.bigspeedsoft.com

It is written in assembler, is very easy to use, but does not include source code.

I is shareware ($65.00 US), and well worth the money.

It is faster than WinZip (almost twice as fast on decompressing) and is only 64K.

It has almost any feature you could think of including embedded comments, password encryption, and test mode. The only thing missing is self-extracting exe.

This dll is creates and reads zip files that are compatible with WinZip etc.

I tried JCALG1 (which is only 10K) but is is much slower and appears to not be compatible with the standard zippers. (I created a zip with it and WinZip would not unzip it)


Ar-ras

did you used the right format of zip?
zip is lz77 + huffman (both in a algorithm is called deflate)
JCALG1  is just lz77

EDIT:
http://www.bigspeed.net/index.php?page=bsdefdll
This is the encode/decode routine
BigSpeed uses Borland Delphi with optimized asm routines


msmith

I just used their test program. Since it was very slow to compress my file  and made a file that WinZip coundn't unzip, I didn't investigate any further.

The link you gave: http://www.bigspeed.net/index.php?page=bsdefdll is incorrect. It is a link to their in-memory deflate product.

The correct link is: http://www.bigspeed.net/index.php?page=bszipdll.

According to their claim it is written in assembler:

Quote
BigSpeed Zip DLL lets you add zipping and unzipping capabilities to any application. The ZIP engine is written in fast, highly-optimized assembler code, so it can perform at speeds up to 200% faster than other ZIP libraries. The API is simple to use and can be called by any programming language that supports DLLs. Examples are included that illustrate how to use the DLL with Delphi, Visual C++, Visual Basic, and Visual FoxPro.


[/uote]

Ar-ras

Quote from: Ar-ras on May 09, 2006, 11:54:20 AM
EDIT:
http://www.bigspeed.net/index.php?page=bsdefdll
This is the encode/decode routine

I wrote that it is the encode/decode routine


the same for bszip.dll