Win32汇编实现通过域名方式到指定网址下载文件

即程序中运行一个程序。
代码实现

  .386  ;汇编语言的伪指令
  .model flat,stdcall
  option casemap:none

include         windows.inc
include         user32.inc
includelib      user32.lib
include         kernel32.inc
includelib      kernel32.lib
include         wininet.inc
includelib      wininet.lib

  .data?
hintInternetOpen     dd ?
hintInternetOpenUrl  dd ?
hCreateFile          dd ?
dwBytesRead          dd ?
dwWritten            dd ?
bWriteFile           dd ?
szDownBuffer         db 4096 dup (?)

  .const 
szAgent                db "Microsoft Internet Explorer",0
URL                    db "https://baike.baidu.com/item/win32/4894730?fr=aladdin",0
szFilePath             db "E:\1.txt",0
szCreateFileError      db "CreateFile Error!",0  
szErrorCaption         db "Error",0
szInternetOpenError    db "InternetOpen Error!",0
szInternetOpenURLError db "InternetOpenURL Error!",0

  .code
;输出出错信息,并退出
ErrorExit proc ErrorMsg
      invoke MessageBox,NULL,ErrorMsg,offset szErrorCaption,MB_OK
      invoke ExitProcess,NULL 
ErrorExit endp

start:
      invoke InternetOpen, offset szAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0
      mov hintInternetOpen,eax 
      .if eax == NULL
          invoke InternetCloseHandle,hintInternetOpen
          invoke ErrorExit,offset szInternetOpenError
      .endif

      invoke InternetOpenUrl, hintInternetOpen, offset URL, NULL, 0, 0, 0 
      mov hintInternetOpenUrl,eax
      .if eax == NULL
          invoke InternetCloseHandle,hintInternetOpen
          invoke InternetCloseHandle,hintInternetOpenUrl
          invoke ErrorExit,offset szInternetOpenError
      .endif
      
      invoke CreateFile,offset szFilePath,GENERIC_WRITE, 0, NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
      .if eax == INVALID_HANDLE_VALUE
          invoke InternetCloseHandle,hintInternetOpen
          invoke InternetCloseHandle,hintInternetOpenUrl
          invoke ErrorExit,szCreateFileError
      .endif
      mov hCreateFile,eax

      mov dwBytesRead,0
      mov bWriteFile,1
      .while 1
          invoke InternetReadFile,hintInternetOpenUrl,offset szDownBuffer, sizeof szDownBuffer, offset dwBytesRead
          .if dwBytesRead == 0
              .break
          .endif

          invoke WriteFile,hCreateFile, offset szDownBuffer, dwBytesRead, offset dwWritten, NULL
          mov bWriteFile,eax
          .if eax == 0
              .break
            .endif
      .endw

      invoke InternetCloseHandle,hintInternetOpen
      invoke InternetCloseHandle,hintInternetOpenUrl
      invoke CloseHandle,hCreateFile
      invoke ExitProcess,NULL
end start

参考C语言

#include <windows.h>
#include <wininet.h>

#define URL "https://baike.baidu.com/item/win32/4894730?fr=aladdin"
#define PATH "E:\1.txt"
#define szAgnet "Microsoft Internet Explorer"

int main()
{
    
    
    DWORD dwByteRead = 0;
    char szDownBuffer[4096];
    memset(szDownBuffer, 0, 4096);
    BOOL bIntNetReadFile = TRUE;
    BOOL bWriteFile = TRUE;
    DWORD dwWritten = 0;

    HINTERNET hintInternetOpen = InternetOpen("Testing", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (!hintInternetOpen)
    {
    
    
        InternetCloseHandle(hintInternetOpen);
        return 1;
    }
    HINTERNET hintInternetOpenUrl = InternetOpenUrl(hintInternetOpen, URL, NULL, 0, INTERNET_FLAG_RELOAD, 0);
    if (!hintInternetOpenUrl)
    {
    
    
        InternetCloseHandle(hintInternetOpen);
        InternetCloseHandle(hintInternetOpenUrl);
        return 1;
    }

    HANDLE hCreateFile = CreateFile(PATH, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (hCreateFile == INVALID_HANDLE_VALUE)
    {
    
    
        InternetCloseHandle(hintInternetOpen);
        InternetCloseHandle(hintInternetOpenUrl);
        return 1;
    }
    
    while (bIntNetReadFile && bWriteFile)
    {
    
    
        bIntNetReadFile = InternetReadFile(hintInternetOpenUrl, szDownBuffer, sizeof(szDownBuffer), &dwByteRead);
        if (!dwByteRead)
        {
    
    
            break;
        }

        bWriteFile = WriteFile(hCreateFile, szDownBuffer, sizeof(szDownBuffer), &dwWritten, NULL);
        if (!dwWritten)
        {
    
    
            break;
        }
    }
    
    InternetCloseHandle(hintInternetOpen);
    InternetCloseHandle(hintInternetOpenUrl);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44029550/article/details/104099343