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