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

📄 downloadurl.asm

📁 用汇编写的Http、ftp文件下载器
💻 ASM
字号:
DEBUG		equ	0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Programmed by 罗云彬, bigluo@telekbird.com.cn
;	Website: http://asm.yeah.net
;	LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Http/Ftp 下载示范程序
;	Ver1.0	2000.03.01
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

		.386
		.model flat, stdcall
		option casemap :none   ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc
include		user32.inc
include		kernel32.inc
include		comctl32.inc
include		comdlg32.inc

includelib	comctl32.lib
includelib	comdlg32.lib
includelib	user32.lib
includelib	kernel32.lib
include		wininet.inc
includelib	wininet.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN	equ	1000
DLG_MAIN	equ	2000
IDC_URL		equ	2001
IDC_INFO	equ	2002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data?

hInstance	dd	?
hWinMain	dd	?
hThread		dd	?
szBuffer	db	512 dup (?)
szUrl		db	512 dup (?)
dwFlag		dd	?
F_ABORT		equ	0001h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data

szHttp		db	'http://',0
szStateOK	db	'200',0
szAgentName	db	"Lyb's Download Sample",0
szConnecting	db	'正在联接主机',0
szConnError	db	'无法联接到主机',0
szNoFile	db	'指定文件不存在',0
szReadError	db	'接收数据错误',0
szWriteError	db	'无法建立保存文件',0
szFinish	db	'文件接收完毕',0
szAbort		db	'下载被终止',0
szAllFile	db	'All Files(*.*)',0,'*.*',0,0
szFormat	db	'已经下载 %d 字节(%d%%)',0
szNull		db	0
szStart		db	'开始下载(&D)',0
szStop		db	'终止下载(&S)',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

		.code

if		DEBUG
		include		Debug.asm
endif
include		Win.asm		;通用窗口子程序库
include		Char.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 查询存盘文件名
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetSaveFile	proc	lpBuffer,dwBufferSize
		local	@stOpenFileName:OPENFILENAME

		invoke	RtlZeroMemory,addr @stOpenFileName,sizeof OPENFILENAME
		invoke	RtlZeroMemory,lpBuffer,dwBufferSize
		mov	@stOpenFileName.lStructSize,SIZEOF @stOpenFileName
		mov	@stOpenFileName.Flags,OFN_OVERWRITEPROMPT or OFN_CREATEPROMPT
		push	hWinMain
		pop	@stOpenFileName.hwndOwner
		mov	@stOpenFileName.lpstrFilter,offset szAllFile
		push	lpBuffer
		pop	@stOpenFileName.lpstrFile
		mov	@stOpenFileName.nMaxFile,MAX_PATH
		invoke	GetSaveFileName,addr @stOpenFileName
		ret

_GetSaveFile	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowInfo	proc	lpText

		invoke	SetDlgItemText,hWinMain,IDC_INFO,lpText
		ret

_ShowInfo	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 下载文件功能
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DownLoad	proc	uses ebx ecx edx esi edi,lParam
		local	@hSession,@hHttpFile,@dwRead
		local	@dwTotalByte,@dwNowReadByte
		local	@hSaveFile,@dwWrite
		local	@szBuffer[MAX_PATH]:byte

		pushad

		and	dwFlag,not F_ABORT
		invoke	GetDlgItem,hWinMain,IDOK
		invoke	EnableWindow,eax,FALSE
		invoke	GetDlgItem,hWinMain,IDC_URL
		invoke	EnableWindow,eax,FALSE

		invoke	_ShowInfo,addr szNull
;********************************************************************
; 处理输入的地址
;********************************************************************
		invoke	lstrcpy,addr szBuffer,addr szUrl
		mov	szBuffer+7,0
		invoke	lstrcmpi,addr szBuffer,addr szHttp
		.if	eax
			invoke	lstrcpy,addr szBuffer,addr szUrl
			invoke	lstrcpy,addr szUrl,addr szHttp
			invoke	lstrcat,addr szUrl,addr szBuffer
			invoke	SetDlgItemText,hWinMain,IDC_URL,addr szUrl
		.endif
;********************************************************************
; 建立 Internet 联接
;********************************************************************
		invoke	InternetOpen,addr szAgentName,INTERNET_OPEN_TYPE_PRECONFIG,\
			NULL,NULL,0
		.if	! eax
			mov	ebx,offset szConnError
			jmp	_DL_Ret
		.endif
		mov	@hSession,eax
;********************************************************************
; 打开 URL
;********************************************************************
		invoke	_ShowInfo,addr szConnecting
		invoke	InternetOpenUrl,@hSession,addr szUrl,NULL,0,INTERNET_FLAG_NO_AUTO_REDIRECT,0
		.if	! eax
			mov	ebx,offset szConnError
			jmp	_DL_Err
		.endif
		mov	@hHttpFile,eax
;********************************************************************
; 检测文件长度以及文件是否存在
;********************************************************************
		mov	@dwRead,sizeof szBuffer
		invoke	HttpQueryInfo,@hHttpFile,HTTP_QUERY_STATUS_CODE,\
			addr szBuffer,addr @dwRead,NULL
		.if	! eax
			mov	ebx,offset szReadError
			jmp	_DL_Err1
		.endif
		invoke	lstrcmp,addr szBuffer,addr szStateOK
		.if	eax
			mov	ebx,offset szNoFile
			jmp	_DL_Err1
		.endif
		invoke	HttpQueryInfo,@hHttpFile,HTTP_QUERY_CONTENT_LENGTH,\
			addr szBuffer,addr @dwRead,NULL
		.if	eax
			invoke	_GetStringValue,addr szBuffer,10
			mov	@dwTotalByte,eax
		.endif
;********************************************************************
; 建立存盘文件
;********************************************************************
		invoke	_GetSaveFile,addr @szBuffer,sizeof @szBuffer
		.if	! eax
			mov	ebx,offset szAbort
			jmp	_DL_Err1
		.endif
		invoke	CreateFile,addr @szBuffer,GENERIC_READ or GENERIC_WRITE,\
			FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
		.if	eax ==	INVALID_HANDLE_VALUE
			mov	ebx,offset szWriteError
			jmp	_DL_Err1
		.endif
		mov	@hSaveFile,eax
		mov	@dwNowReadByte,0
;********************************************************************
; 接收数据并存盘
;********************************************************************
		invoke	SetDlgItemText,hWinMain,IDOK,addr szStop
		invoke	GetDlgItem,hWinMain,IDOK
		invoke	EnableWindow,eax,TRUE
		.repeat
			.if	dwFlag & F_ABORT
				mov	ebx,offset szAbort
				jmp	_DL_Err2
			.endif
			invoke	InternetReadFile,@hHttpFile,addr szBuffer,sizeof szBuffer,addr @dwRead
			.if	eax
				.break .if @dwRead == 0
				invoke	WriteFile,@hSaveFile,addr szBuffer,@dwRead,\
					addr @dwWrite,NULL
				mov	eax,@dwRead
				add	@dwNowReadByte,eax
				xor	eax,eax
				.if	@dwTotalByte
					mov	eax,@dwNowReadByte
					mov	ecx,100
					mul	ecx
					div	@dwTotalByte
				.endif
				invoke	wsprintf,addr szBuffer,addr szFormat,@dwNowReadByte,eax
				invoke	_ShowInfo,addr szBuffer
			.else
				invoke	SetDlgItemText,hWinMain,IDC_INFO,addr szReadError
				.break
			.endif
		.until	0
		mov	ebx,offset szFinish
_DL_Err2:
		invoke	CloseHandle,@hSaveFile
_DL_Err1:
		invoke	InternetCloseHandle,@hHttpFile
_DL_Err:
		invoke	InternetCloseHandle,@hSession
_DL_Ret:
		.if	ebx
			invoke	_ShowInfo,ebx
		.endif
		invoke	SetDlgItemText,hWinMain,IDOK,addr szStart
		invoke	GetDlgItem,hWinMain,IDOK
		invoke	EnableWindow,eax,TRUE
		invoke	GetDlgItem,hWinMain,IDC_URL
		invoke	EnableWindow,eax,TRUE
		invoke	CloseHandle,hThread
		mov	hThread,0

		popad
		ret

_DownLoad	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_MainDialogProc	proc	uses ebx edi esi hWnd,wMsg,wParam,lParam

		mov	eax,wMsg
		.if	eax == WM_CLOSE
			.if	hThread
				invoke	TerminateThread,hThread,-1
			.endif
			invoke	EndDialog,hWinMain,NULL
;********************************************************************
		.elseif	eax == WM_INITDIALOG
			mov	eax,hWnd
			mov	hWinMain,eax
			invoke	_CenterWindow,hWinMain
;********************************************************************
		.elseif	eax == WM_COMMAND
			mov	eax,wParam
			movzx	eax,ax
			.if	eax ==	IDC_URL
				invoke	GetDlgItemText,hWnd,IDC_URL,addr szUrl,sizeof szUrl
				invoke	lstrlen,addr szUrl
				mov	ebx,eax
				invoke	GetDlgItem,hWnd,IDOK
				.if	! hThread
					invoke	EnableWindow,eax,ebx
				.endif
			.elseif	eax ==	IDOK
				.if	hThread
					or	dwFlag,F_ABORT
				.else
					invoke	CreateThread,NULL,0,offset _DownLoad,NULL,\
						NULL,addr hThread
				.endif
			.endif
;********************************************************************
;	注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
;	要返回 FALSE
;********************************************************************
		.else
			mov	eax,FALSE
			ret
		.endif
		mov	eax,TRUE
		ret

_MainDialogProc	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
		invoke	InitCommonControls
		invoke	GetModuleHandle,NULL
		mov	hInstance,eax
		invoke	DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _MainDialogProc,0
		invoke	ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		end	start

⌨️ 快捷键说明

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