⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zipdl.asm

📁 zip文件下载器的汇编语言源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
                        sub ecx,ActualBytesWritten
                .endif
                add ActualBytesWritten,ecx
                .if StateFlag!=12
                        push ecx
                        mov edi,lpDest
                        rep movsb
                        pop ecx
                        mov eax,lpDestIndex
                        add [eax],ecx
                .else
                        invoke WriteFile,FileHandle,esi,ecx,addr BytesWritten,NULL
                .endif
                invoke DisplayProgress
                ret
        .else
                jmp BackAndSearch
        .endif
StillNotFound:
        mov esi,mPointer
        mov edi,offset MultipartHeader
        add edi,MultipartIndex
        mov ecx,sizetoread
        push ecx
        rep movsb
        pop ecx
        add MultipartIndex,ecx
        ret
GetMultipartHeader ENDP


CheckIfCanResume PROC
       .if byte ptr [StatusCode]=="2"
                .if byte ptr [StatusCode+2]=="6"
                        mov CanResume,TRUE
                        xor eax,eax
                .else
                        invoke InStringi,addr HTTPHeader,addr AcceptRange
                        .if eax==-1
                                mov StateFlag,0
                                mov eax,2       ; Cannot resume
                        .else
                                mov CanResume,TRUE
                                xor eax,eax
                        .endif
                .endif
        .else
                mov CanResume,FALSE
                mov eax,1               ; HTTP error
        .endif
        ret
CheckIfCanResume ENDP


ParseEOZ PROC uses edi esi hWnd:DWORD
        LOCAL buffer[512]:BYTE
        .if EOZSize==22
                mov eax,EOZSignature
                .if DWORD ptr [EndOfZip]==eax
                        mov StateFlag,4         ; 4= Request for Central Directory
                        invoke MakeConnection,hWnd
                .else                        
                        mov EOZSize,1024
                        mov StateFlag,1
                        invoke MakeConnection,hWnd
                .endif
        .else
                mov esi,DWORD ptr [EOZSignature]
                mov edi,offset EndOfZip
                mov ecx,1020
RescanForEOZ:                
                mov al,"P"
                repne scasb
                jne EOZNotFound
                push edi
                dec edi
                cmp DWORD ptr [edi],esi
                pop edi
                jne RescanForEOZ                
EOZFound:
                        mov esi,edi
                        dec esi
                        mov edi,offset EndOfZip
                        mov cx,22
                        rep movsb
                        mov byte ptr [edi],0
                        mov StateFlag,4
                        invoke MakeConnection,hWnd
                        jmp BackToCaller
EOZNotFound:
                        invoke MessageBox,hWnd,addr InvalidFile,addr AppName,MB_OK+MB_ICONERROR
                        invoke ToggleControls,hWnd
                        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_DELETEALLITEMS,NULL,NULL
                        invoke SendMessage,hwndStatus,SB_SETTEXT,NULL,NULL
                        mov StateFlag,0
BackToCaller:
                mov EOZSize,22
        .endif
        ret
ParseEOZ ENDP

RequestCD PROC hWnd:DWORD
        LOCAL buffer[512]:BYTE
        
        mov eax,DWORD ptr [EndOfZip+12]
        push eax 
        inc eax
        invoke GlobalReAlloc,hZipDir,eax,GHND
        mov hZipDir,eax
        invoke GlobalLock,eax
        mov pZipDir,eax
        pop eax
        add eax,DWORD ptr [EndOfZip+16]
        dec eax
        push eax
        push DWORD ptr [EndOfZip+16]
        push offset HostName
        push offset RelativeURL
        push offset CDTemplate
        lea eax,buffer
        push eax
        call wsprintfA
        add esp,24
        invoke SetStatusText,addr GettingCD,NULL
        invoke lstrlen,addr buffer
        invoke send,sock,addr buffer,eax,0
        .if eax==SOCKET_ERROR
                invoke ShowErrorMessage,hWnd
                invoke ToggleControls,hWnd
        .else
                invoke SetStatusText,addr Connected,addr HostName
                mov HTTPIndex,0
                mov MultipartIndex,0
                mov EOZIndex,0
                mov CDIndex,0
                mov ActualBytesWritten,0
        .endif
        ret
RequestCD ENDP

ParseCD PROC uses edi esi hWnd:DWORD
        LOCAL lvitem:LV_ITEM
        LOCAL Name1[2048]:BYTE
        LOCAL CurIndex:DWORD
        LOCAL ItemAddr:DWORD
        LOCAL buffer[512]:BYTE
        invoke SendMessage,hwndStatus,SB_SETTEXT,NULL,NULL
        mov edx,pZipDir
        mov CurIndex,0
        xor eax,eax
        mov ax,WORD ptr [EndOfZip+8]
        mov lvitem.imask,LVIF_TEXT
        push eax
        mov lvitem.iSubItem,0
        lea ecx,Name1
        mov lvitem.pszText,ecx
        .while eax>0
                xor ecx,ecx
                mov cx,WORD ptr [edx+28]
                lea edi,Name1
                mov esi,edx
                add esi,46
                rep movsb
                mov byte ptr [edi],0
                xor ecx,ecx
                mov cx,WORD ptr [edx+28]
                add cx,WORD ptr [edx+30]
                add cx,WORD ptr [edx+32]
                add ecx,46
                add edx,ecx
                push eax
                push CurIndex
                pop lvitem.iItem
                inc CurIndex
                push edx
                invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_INSERTITEM,NULL,addr lvitem
                pop edx
                pop eax
                dec eax
        .endw
        pop eax
        mov CurIndex,0
        mov lvitem.cchTextMax,2048
        .while eax>0
                push CurIndex
                pop lvitem.iItem
                lea ecx,Name1
                mov lvitem.pszText,ecx
                push eax
                invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_GETITEM,NULL,addr lvitem
                invoke FindItemInCentralDir,addr Name1
                .if eax!=-1
                        mov ItemAddr,eax
                        mov edx,eax
                        mov ax,WORD ptr [edx+14]
                        xor ecx,ecx
                        mov cx,ax
                        shr cx,9
                        add cx,1980
                        push ecx
                        xor ecx,ecx
                        mov cx,ax
                        and cx,1Fh
                        push ecx
                        xor ecx,ecx
                        mov cx,ax
                        shr cx,5
                        and cx,0Fh
                        push ecx
                        push offset DateTemplate
                        lea eax,buffer
                        push eax
                        call wsprintfA
                        add esp,20
                        lea ecx,buffer
                        mov lvitem.pszText,ecx
                        mov lvitem.iSubItem,1
                        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_SETITEM,NULL,addr lvitem
                        mov lvitem.iSubItem,0
                        mov edx,ItemAddr
                        xor eax,eax
                        mov ax,WORD ptr [edx+12]
                        xor ecx,ecx
                        mov cx,ax
                        shr cx,5
                        and cx,3Fh
                        push ecx
                        xor ecx,ecx
                        mov cx,ax
                        shr cx,11
                        push ecx
                        push offset TimeTemplate
                        lea ecx,buffer
                        push ecx
                        call wsprintfA
                        add esp,16
                        lea ecx,buffer
                        mov lvitem.pszText,ecx
                        mov lvitem.iSubItem,2
                        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_SETITEM,NULL,addr lvitem                        
                        mov edx,ItemAddr
                        push DWORD ptr [edx+24]
                        push offset ValueTemplate
                        lea ecx,buffer
                        push ecx
                        call wsprintfA
                        add esp,12
                        lea ecx,buffer
                        mov lvitem.pszText,ecx
                        mov lvitem.iSubItem,3
                        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_SETITEM,NULL,addr lvitem                        
                        mov edx,ItemAddr
                        push DWORD ptr [edx+20]
                        push offset ValueTemplate
                        lea ecx,buffer
                        push ecx
                        call wsprintfA
                        add esp,12
                        lea ecx,buffer
                        mov lvitem.pszText,ecx
                        mov lvitem.iSubItem,4
                        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_SETITEM,NULL,addr lvitem                        
                        mov lvitem.iSubItem,0
                .else
                        invoke MessageBox,NULL,addr AppName,addr AppName,MB_OK
                .endif
                inc CurIndex
                pop eax
                dec eax
        .endw
        mov StateFlag,7         ; 7= Waiting for user to select files
        ret
ParseCD ENDP

FindItemInCentralDir PROC uses esi edi String:DWORD
        LOCAL NoOfItem:DWORD
        LOCAL NameLength:DWORD
        invoke lstrlen,String
        mov NameLength,eax
        xor eax,eax
        mov ax,WORD ptr [EndOfZip+8]
        mov NoOfItem,eax
        xor eax,eax
        mov edx,pZipDir        
        .while eax<NoOfItem
                xor ecx,ecx
                mov cx,WORD ptr [edx+28]
                .if ecx==NameLength
                        mov edi,String
                        mov esi,edx
                        add esi,46
                        repe cmpsb
                        je FoundTheAddress
                .endif
                xor ecx,ecx
                mov cx,WORD ptr [edx+28]
                add cx,WORD ptr [edx+30]
                add cx,WORD ptr [edx+32]
                add edx,46
                add edx,ecx
                inc eax
        .endw
        mov eax,-1
        ret
FoundTheAddress:
        mov eax,edx
        ret
FindItemInCentralDir ENDP

DownloadFiles PROC hWnd:DWORD
        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_GETSELECTEDCOUNT,0,0
        .if eax==0
                invoke MessageBox,hWnd,addr NotSelected,addr AppName,MB_OK+MB_ICONERROR
        .else
                invoke EnableWindow,hwndOK,FALSE
                invoke CreateFile,addr FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL
                mov FileHandle,eax                
                invoke EnableWindow,hwndList,FALSE
                mov PrevIndex,-1
                invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_GETNEXTITEM,PrevIndex,LVNI_SELECTED
                mov PrevIndex,eax
                mov CurrentIndex,eax
                invoke MakeConnection,hWnd
        .endif
        ret
DownloadFiles ENDP

WriteCentralDir PROC hWnd:DWORD
        LOCAL lvitem:LV_ITEM
        LOCAL TheName[256]:BYTE
        LOCAL NoEntry:DWORD
        LOCAL mPointer:DWORD
        LOCAL TotalCount:DWORD
        invoke SetFilePointer,FileHandle,0,0,FILE_CURRENT
        mov CDOffset,eax
        mov PrevIndex,-1
        mov DirSize,0
        mov TotalCount,0
CheckAllHeader:        
        xor eax,eax
        mov ax,WORD ptr [EndOfZip+10]
        mov NoEntry,eax
        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_GETNEXTITEM,PrevIndex,LVNI_SELECTED
        mov PrevIndex,eax
        mov CurrentIndex,eax
        cmp eax,-1
        je  NoMore
        mov lvitem.imask,LVIF_TEXT
        mov eax,CurrentIndex
        mov lvitem.iItem,eax
        mov lvitem.iSubItem,0
        lea eax,TheName
        mov lvitem.pszText,eax
        mov lvitem.cchTextMax,256
        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_GETITEM,0,addr lvitem
        mov edi,pZipDir
        mov mPointer,edi
        .while NoEntry>0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -