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

📄 zipdl.asm

📁 zip文件下载器的汇编语言源代码
💻 ASM
📖 第 1 页 / 共 5 页
字号:
                xor ecx,ecx
                mov edx,mPointer
                mov cx,WORD ptr [edx+28]
                mov esi,edx
                add esi,46
                mov edi,lvitem.pszText
                repe cmpsb
                je  GetIt
                xor eax,eax
                mov ax,WORD ptr [edx+28]
                add ax,WORD ptr [edx+30]
                add ax,WORD ptr [edx+32]
                add ax,46
                add mPointer,eax
                dec NoEntry
        .endw
GetIt:
        inc TotalCount
        mov WORD ptr [edx+30],0
        mov WORD ptr [edx+32],0
        mov WORD ptr [edx+34],0
        xor ecx,ecx
        mov cx,WORD ptr [edx+28]
        add ecx,46
        add DirSize,ecx
        invoke WriteFile,FileHandle,edx,ecx,addr BytesWritten,NULL
        jmp CheckAllHeader
NoMore:        
        mov eax,TotalCount
        ret
WriteCentralDir ENDP

WriteEndOfDir PROC TotalCount:DWORD
        mov DWORD ptr [EndOfZip+4],0
        mov WORD ptr [EndOfZip+8],ax
        mov WORD ptr [EndOfZip+10],ax
        mov eax,DirSize
        mov DWORD ptr [EndOfZip+12],eax
        mov eax,CDOffset
        mov DWORD ptr [EndOfZip+16],eax
        mov WORD ptr [EndOfZip+20],0
        invoke WriteFile,FileHandle,addr EndOfZip,22,addr BytesWritten,NULL
        ret
WriteEndOfDir ENDP

CheckForOtherFiles PROC hWnd:DWORD
        invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_GETNEXTITEM,PrevIndex,LVNI_SELECTED
        .if eax==-1
                invoke WriteCentralDir,hWnd
                invoke WriteEndOfDir,eax
                invoke CloseHandle,FileHandle
                invoke MessageBox,hWnd,addr Finish,addr AppName,MB_OK
                invoke ToggleControls,hWnd
                invoke SendMessage,hwndStatus,SB_SETTEXT,NULL,NULL
                invoke SendDlgItemMessage,hWnd,IDC_NAMELIST,LVM_DELETEALLITEMS,NULL,NULL
                mov StateFlag,0
        .else
                mov PrevIndex,eax
                mov CurrentIndex,eax
                mov StateFlag,7
                invoke MakeConnection,hWnd
        .endif
        ret
CheckForOtherFiles ENDP

RequestZipFile PROC uses edi esi hWnd:DWORD        
        LOCAL lvitem:LV_ITEM
        LOCAL TheName[256]:BYTE
        LOCAL NoEntry:DWORD
        LOCAL mPointer:DWORD
        LOCAL buffer[256]:BYTE
        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
        xor eax,eax
        mov ax,WORD ptr [EndOfZip+10]
        mov NoEntry,eax
        .while NoEntry>0
                xor ecx,ecx
                mov edx,mPointer
                mov cx,WORD ptr [edx+28]
                push edx
                push ecx                
                invoke lstrlen,lvitem.pszText
                pop  ecx
                .if eax>ecx
                        mov ecx,eax
                .endif
                pop edx
                mov esi,edx
                add esi,46
                mov edi,lvitem.pszText
                repe cmpsb
                je  GetIt
                xor eax,eax
                mov ax,WORD ptr [edx+28]
                add ax,WORD ptr [edx+30]
                add ax,WORD ptr [edx+32]
                add ax,46
                add mPointer,eax
                dec NoEntry
        .endw
GetIt:
        mov lpRelOffset,edx
        add lpRelOffset,42
        mov eax,DWORD ptr [edx+42]
        add eax,30
        dec eax
        push eax
        xor ecx,ecx
        mov cx,WORD ptr [edx+28]
        mov edi,offset ZipFileName
        mov esi,edx
        add esi,46
        rep movsb
        mov byte ptr [edi],0
        mov eax,DWORD ptr [edx+42]
        mov StartingOffset,eax
        push eax
        push offset HostName
        push offset RelativeURL
        push offset CDTemplate
        lea eax,buffer
        push eax
        call wsprintfA
        add esp,24
        invoke SetFilePointer,FileHandle,0,0,FILE_CURRENT
        mov ecx,lpRelOffset
        mov DWORD ptr [ecx],eax
;        invoke MessageBox,hWnd,addr buffer,addr AppName,MB_OK
        invoke SetStatusText,addr Downloading,NULL
        invoke lstrlen,addr buffer
        invoke send,sock,addr buffer,eax,0
        .if eax==SOCKET_ERROR
                invoke ShowErrorMessage,hWnd
                invoke ToggleControls,hWnd
                mov StateFlag,0
        .else
                invoke SetStatusText,addr Connected,addr HostName
                mov HTTPIndex,0
                mov MultipartIndex,0
                mov EOZIndex,0
                mov CDIndex,0
                mov LocalIndex,0
                mov ActualBytesWritten,0
        .endif
        ret
RequestZipFile ENDP


ParseLocalHeader PROC hWnd:DWORD
        mov StateFlag,10
        invoke WriteFile,FileHandle,addr LocalHeader,30,addr BytesWritten,NULL
        invoke MakeConnection,hWnd
        ret
ParseLocalHeader ENDP

RequestActualData PROC hWnd:DWORD
        LOCAL buffer[512]:BYTE
        xor eax,eax
        mov ax,WORD ptr [LocalHeader+26]
        add ax,WORD ptr [LocalHeader+28]
        add eax, DWORD ptr [LocalHeader+18]
        mov ecx,StartingOffset
        add ecx,30
        add ecx,eax
        dec ecx
        push ecx
        mov eax,StartingOffset
        add eax,30
        push eax
        push offset HostName
        push offset RelativeURL
        push offset CDTemplate
        lea eax,buffer
        push eax
        call wsprintfA
        add esp,24
        invoke lstrlen,addr buffer
        invoke send,sock,addr buffer,eax,0
        .if eax==SOCKET_ERROR
                invoke ShowErrorMessage,hWnd
                invoke ToggleControls,hWnd
                mov StateFlag,0
        .else
                invoke SetStatusText,addr Connected,addr HostName
                mov HTTPIndex,0
                mov MultipartIndex,0
                mov EOZIndex,0
                mov CDIndex,0
                mov LocalIndex,0
                mov ActualBytesWritten,0
        .endif
        ret
RequestActualData ENDP

GetActualHeader PROC uses edi esi hWnd:DWORD,mPointer:DWORD
        LOCAL FirstDataOffset:DWORD
        mov edi,mPointer
        mov ecx,sizetoread
        mov al,0Ah
SearchForItAgain:  
        repne scasb
        jcxz GoToEnd
        jmp FoundIt
GoToEnd:        
        jmp EndOfHeaderNotFound
FoundIt:        
        cmp byte ptr [edi+1],0Ah
        jne  SearchForItAgain
        mov StateFlag,11         ; HTTP header of the data parsed
        push edi
        dec edi
        dec edi
        sub edi,mPointer
        mov ecx,edi
        mov esi,mPointer
        mov edi,offset HTTPHeader
        add edi,HTTPIndex
        rep movsb
        mov byte ptr [edi],0
        invoke ParseHeader,hWnd,addr HTTPHeader
        pop edi
        invoke InStringi,addr HTTPHeader,addr Multipart
        .if eax==-1
                inc edi
                inc edi
                push edi
                mov ecx,sizetoread
                sub edi,mPointer
                sub ecx,edi
                pop esi
                add ActualBytesWritten,ecx
                invoke WriteFile,FileHandle,esi,ecx,addr BytesWritten,NULL
        .else
                inc edi
                inc edi
                mov FirstDataOffset,edi
                sub edi,mPointer
                mov eax,sizetoread
                sub eax,edi
                mov edi,FirstDataOffset
                mov al,0Ah
SearchMultiAgain:                
                repne scasb
                jcxz EndOfMultiPartNotFound
                cmp byte ptr [edi+1],0Ah
                jne SearchMultiAgain
                inc edi
                inc edi
                push edi
                mov ecx,edi
                sub ecx,FirstDataOffset
                mov esi,FirstDataOffset
                mov edi,offset MultipartHeader
                add edi,MultipartIndex
                push ecx
                rep movsb
                pop ecx
                add MultipartIndex,ecx
                mov byte ptr [edi],0
                invoke ParseMultipartHeader
                pop  edi
                push edi
                sub edi,mPointer
                mov ecx,sizetoread
                sub ecx,edi                
                pop esi
                .if ecx>ContentLength
                        mov ecx,ContentLength
                .endif
                add ActualBytesWritten,ecx
                invoke WriteFile,FileHandle,esi,ecx,addr BytesWritten,NULL
                ret
EndOfMultiPartNotFound:
                mov esi,FirstDataOffset
                mov edi,offset MultipartHeader
                add edi,MultipartIndex
                mov ecx,sizetoread
                mov edx,FirstDataOffset
                sub edx,mPointer
                sub ecx,edx
                push ecx
                rep movsb
                pop ecx
                add MultipartIndex,ecx
                mov StateFlag,12                 ; Multipart header not yet parsed
        .endif
        ret
EndOfHeaderNotFound:
        mov esi,mPointer
        mov edi,offset HTTPHeader
        mov ecx,sizetoread
        rep movsb
        mov eax,sizetoread
        add HTTPIndex,eax
        ret
GetActualHeader ENDP

FillActualData PROC mPointer:DWORD
        .if MultipartIndex!=0
                mov ecx,ActualBytesWritten
                add ecx,sizetoread
                .if ecx>ContentLength
                        mov ecx,ContentLength
                        sub ecx,ActualBytesWritten
                .else
                        mov ecx,sizetoread
                .endif
                add ActualBytesWritten,ecx
        .else
                mov ecx,sizetoread
                add ActualBytesWritten,ecx
        .endif
        invoke WriteFile,FileHandle,mPointer,ecx,addr BytesWritten,NULL
        invoke DisplayProgress
        ret
FillActualData ENDP

ParseMultipartHeader PROC uses edi esi
        invoke InStringi,addr MultipartHeader,addr Content
        .if eax!=-1
                mov edi,offset ContentString                
                add eax,offset MultipartHeader
                add eax,15
                .while byte ptr [eax]!=0 && byte ptr [eax]!=0Dh && byte ptr [eax]!=0Ah
                        .if byte ptr [eax]!=" "
                                mov cl,byte ptr [eax]
                                mov byte ptr [edi],cl
                                inc edi
                        .endif
                        inc eax
                .endw
                mov byte ptr [edi],0
                invoke String2Dword,addr ContentString
                mov ContentLength,eax
        .else
                invoke MessageBox,NULL,addr NoContent,addr AppName,MB_OK
                invoke closesocket,sock
                mov StateFlag,0
        .endif
        ret
ParseMultipartHeader ENDP

ConnectSocket PROC hWnd:DWORD
        invoke ToggleControls,hWnd
        mov StateFlag,1        ; Begin first connection
        invoke MakeConnection,hWnd
        .if eax==FALSE
     

⌨️ 快捷键说明

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