📄 zipdl.asm
字号:
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 + -