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

📄 ie.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
SubClassRichEditProc PROTO:DWORD,:DWORD,:DWORD,:DWORD
make_skt PROTO :dword
receive_pkt PROTO :dword,:dword
CreateIndex PROTO
HighLightSyntax PROTO :DWORD,:DWORD,:DWORD,:DWORD
WORDINFO struct
   WordLen dd ?		
   pszWord dd ?		
   pColor dd ?		
   NextLink dd ?		
WORDINFO ends

.const
IDR_MAINMENU            equ 101
IDM_HIGHLIGHT           equ 1001
IDM_HTTP                    equ 2002
IDM_EXIT                     equ 1000
IDC_RICHEDIT             equ 1
IDC_EDIT                     equ 2
IDC_BUTTON               equ 3
UM_SOCK                    equ WM_USER+100h
UM_GETHOSTINFO     equ WM_USER+101h
DEFAULT_PORT          equ 80
.data
ClassName 	    db "ClientClass",0
EditClassName               db "EDIT",0
ButtonClassName           db "Button",0
RichEditClassName        db "RichEdit20A",0
TitleName                     db "客户端浏览器",0
RichEditDLLName         db "riched20.dll",0
SyntaxFileName             db ".\syntaxword.txt",0
SynwordFileNoExist       db "高亮词汇的文件不存在!",0
ConnectText                  db "URL连接",0
DisconnectText              db "断开连接",0
StartupError                  db "套接字初始化错误!",0
InputDomainName          db "必须输入登录的域名!",0
HostNameError              db "输入的服务器域名错误!",0
SocketError                  db "套接字创建错误!",0
SelectError                   db "异步选择模式错误!",0
ConnectError                db "连接服务器错误!",0
ConnectSuccess           db "连接成功!",0
SendError                    db "发送数据错!",0
RequestHead               db  "GET / HTTP/1.1",13,10
                    db "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, application/x-shockwave-flash, */*",13,10
                    db "Accept-Language: zh-cn",13,10
                    db "Accept-Encoding: gzip, deflate",13,10
                    db "If-Modified-Since: Tue, 22 Oct 1996 17:56:34 GMT; length=534",13,10
                    db "User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)",13,10
                    db "Host: www.asm.com",13,10
                    db " Connection: Keep-Alive",13,10
                    db 13,10,0
REQLEN              equ  $-RequestHead
HostBuffer          db MAXGETHOSTSTRUCT dup (0)
ConnectMark       db FALSE
ClearContent         db 0,0
SynSection          db "HTTP",0
KeyName1            db "S1",0
KeyName2            db "S2",0
KeyName3            db "S3",0
KeyName4            db "S4",0
KeyName5            db "S5",0
KeyName6            db "S6",0
KeyName7            db "S7",0
KeyName8            db "S8",0
KeyName9            db "S9",0
KeyName10           db "S10",0
KeyName11           db "S11",0
KeyName12           db "S12",0
KeyName13           db "S13",0
ZeroString          db 0
SynColorArray       dd 0FF0000h,0ffh,0ff00h,0ff00FFh,0FFFFh,0a0a0ah,0a00000h,0c00000h,0300000h,0E00E0h,0d0d0d0h,0F00000h,0B00000h
SynArray            dd 256 dup  (0)
SelectMenuMark      dd 0


.data?
hInstance	HINSTANCE ?
hwndRichEdit    HANDLE    ?
hMainWnd        HANDLE    ?
hsocket         HANDLE    ?
hEvent          HANDLE    ?
hHeap           HANDLE    ?
pHEad           dd        ?
OldWndProc      dd        ?
hRichEdit       dd ?
hwndEdit        dd ?
hwndButton      dd ?
RichEditVersion dd ?
DomainName      db 100  dup (?)
RecvBuffer      db 1024 dup (?)
RichEditVer     dd ?

.code
start:
   invoke GetModuleHandle, NULL
   mov    hInstance,eax
   invoke GetProcessHeap
   mov hHeap,eax
   invoke CreateIndex
   invoke LoadLibrary,addr RichEditDLLName
   mov hRichEdit,eax
   invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
   invoke FreeLibrary,hRichEdit
   invoke ExitProcess,eax

WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
   LOCAL wc:WNDCLASSEX
   LOCAL msg:MSG
   LOCAL hwnd:HWND
   mov   wc.cbSize,SIZEOF WNDCLASSEX
   mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
   mov   wc.lpfnWndProc, OFFSET WndProc
   mov   wc.cbClsExtra,NULL
   mov   wc.cbWndExtra,NULL
   push  hInst
   pop   wc.hInstance
   mov   wc.hbrBackground,COLOR_APPWORKSPACE
   mov   wc.lpszMenuName,IDR_MAINMENU
   mov   wc.lpszClassName,OFFSET ClassName
   invoke LoadIcon,NULL,IDI_APPLICATION
   mov   wc.hIcon,eax
   mov   wc.hIconSm,eax
   invoke LoadCursor,NULL,IDC_ARROW
   mov   wc.hCursor,eax
   invoke RegisterClassEx, addr wc
   invoke CreateWindowEx,NULL,ADDR ClassName,ADDR TitleName,\
      WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
      CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInst,NULL
   mov hwnd,eax
   push eax
   pop hMainWnd
   invoke ShowWindow, hwnd,SW_SHOWNORMAL
   invoke UpdateWindow, hwnd
   .while TRUE
      invoke GetMessage, ADDR msg,NULL,0,0
      .BREAK .IF  (!eax)
      invoke TranslateMessage, ADDR msg
      invoke DispatchMessage, ADDR msg
   .endw
   mov eax,msg.wParam
   ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   local wsaData:WSADATA
   local editstream:EDITSTREAM
   local  index :dword
   local  nleft:dword
   .if  uMsg==WM_CREATE
      invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR RichEditClassName,NULL,\
         WS_CHILD or WS_VISIBLE or ES_MULTILINE or WS_HSCROLL or WS_VSCROLL or ES_NOHIDESEL ,\
         CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,IDC_RICHEDIT,hInstance,NULL
      mov hwndRichEdit,eax
      invoke SendMessage,hwndRichEdit,EM_SETTYPOGRAPHYOPTIONS,TO_SIMPLELINEBREAK,TO_SIMPLELINEBREAK
      invoke SendMessage,hwndRichEdit,EM_GETTYPOGRAPHYOPTIONS,1,1
      .if eax==0
         mov RichEditVersion,2
      .else
         mov RichEditVersion,3
         invoke SendMessage,hwndRichEdit,EM_SETEDITSTYLE,SES_EMULATESYSEDIT,SES_EMULATESYSEDIT
      .endif
      invoke SendMessage,hwndRichEdit,EM_LIMITTEXT,-1,0
      invoke SetWindowLong,hwndRichEdit,GWL_WNDPROC, addr SubClassRichEditProc
      mov OldWndProc,eax
      invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL, WS_VISIBLE \
         or WS_CHILD or ES_MULTILINE or ES_WANTRETURN, 0,0,\
         80,20,hWnd,IDC_EDIT,hInstance,NULL
      mov hwndEdit,eax
      invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ConnectText,\
         WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,\
         85,0,80,25,hWnd,IDC_BUTTON,hInstance,NULL
      mov  hwndButton,eax
      invoke CreateEvent,NULL,TRUE,FALSE,NULL
      mov hEvent,eax
      invoke WSAStartup,101h,addr wsaData
      .if  eax
         invoke MessageBox,hWnd,addr StartupError,addr TitleName,MB_OK
         invoke SendMessage,hWnd,WM_CLOSE,0,0
      .endif
   .elseif  uMsg==UM_GETHOSTINFO
      mov eax,lParam
      shr eax,16
      .if  ax
         invoke MessageBox,hWnd,addr HostNameError,addr TitleName,MB_OK
         invoke EnableWindow,hwndButton,TRUE
      .else
         invoke make_skt,hWnd
      .endif
   .elseif  uMsg==UM_SOCK
      mov eax,lParam
      .if  ax==FD_READ
         invoke receive_pkt,wParam,hWnd
      .elseif  ax==FD_WRITE
         invoke SetEvent,hEvent
      .elseif  ax==FD_CONNECT
         mov eax,lParam
         shr eax,16
         .if ax 
            invoke closesocket,hsocket     
            invoke EnableWindow,hwndButton,TRUE
            mov ConnectMark,FALSE
            invoke MessageBox,hWnd,addr ConnectError,addr TitleName,MB_OK
         .else
            mov SelectMenuMark,0
            mov ConnectMark,TRUE
            invoke EnableWindow,hwndButton,TRUE
            invoke SetWindowText,hwndButton,addr DisconnectText
            mov nleft,REQLEN
            lea esi,RequestHead
               .while nleft>0
                  invoke send,wParam,esi,nleft,0
                 .if  eax==SOCKET_ERROR
                    invoke WSAGetLastError
                    .if  eax!=WSAEWOULDBLOCK
                       invoke closesocket,wParam
                       invoke MessageBox,hWnd,addr SendError,addr TitleName,MB_OK
                       invoke closesocket,wParam
                       invoke EnableWindow,hwndButton,TRUE  
                    .else
                       invoke WaitForSingleObject,hEvent,INFINITE
                       invoke ResetEvent,hEvent                    
                    .endif
                 .else
                    sub nleft,eax
                    add esi,eax
                 .endif 
               .endw
         .endif 
      .elseif  ax==FD_CLOSE
         invoke closesocket,hsocket     
         mov ConnectMark,FALSE
         invoke SetWindowText,hwndButton,addr ConnectText
      .endif
   .elseif  uMsg==WM_COMMAND
      mov eax,wParam
      .IF lParam==0
         .IF ax==IDM_HIGHLIGHT
            mov SelectMenuMark,1
            invoke InvalidateRect,hwndRichEdit,NULL,TRUE
         .ELSEIF ax==IDM_HTTP
            mov SelectMenuMark,2
            invoke InvalidateRect,hwndRichEdit,NULL,TRUE
         .ELSEIF  ax==IDM_EXIT
            invoke DestroyWindow,hWnd
         .ENDIF         
      .ELSE
         .IF ax==IDC_BUTTON
            shr eax,16
            .IF ax==BN_CLICKED
               .if  !ConnectMark
                  invoke GetWindowText,hwndEdit,addr DomainName,100
                  invoke lstrlen,addr DomainName
                  .if !eax
                     invoke MessageBox,hWnd,addr InputDomainName,addr TitleName,MB_OK
                     xor eax,eax
                     ret
                  .endif
                  invoke EnableWindow,hwndButton,FALSE
                  invoke SetWindowText,hwndRichEdit,addr ClearContent
                  invoke WSAAsyncGetHostByName,hWnd,UM_GETHOSTINFO,addr DomainName,addr HostBuffer,MAXGETHOSTSTRUCT 
               .else
                  mov ConnectMark,FALSE
                  invoke closesocket,hsocket
                  invoke SetWindowText,hwndButton,addr ConnectText
               .endif
            .ENDIF
         .ENDIF
      .ENDIF      
   .elseif  uMsg==WM_SIZE
      mov eax,lParam
      mov edx,eax
      movzx eax,ax
      shr edx,16
      sub edx,20
      push eax
      invoke MoveWindow,hwndRichEdit,0,20,eax,edx,TRUE
      pop eax
      mov ecx,eax
      shr eax,2
      sub ecx,eax
      push ecx
      invoke MoveWindow,hwndEdit,0,0,ecx,20,TRUE
      pop ecx
      add ecx,10
      invoke MoveWindow,hwndButton,ecx,0,80,20,TRUE
   .elseif  uMsg==WM_DESTROY
      invoke WSACleanup
      invoke PostQuitMessage,NULL
   .else
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam     
      ret
   .endif
   xor eax,eax
   ret
WndProc endp

SubClassRichEditProc proc uses esi edi  hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   local FirstChar:DWORD
   local LastChar:DWORD
   local hdc:DWORD
   local rect:RECT
   local TxtRange:TEXTRANGE
   local hRegion:HANDLE
   local hOldRegion:HANDLE
   local nSize:DWORD
   local strbuffer[6400]:byte
   local buffer[1024*10]:byte
   local EffectLen:dword
   local pTempStore:dword
   .if  uMsg==WM_PAINT
      invoke CallWindowProc,OldWndProc,hWnd,uMsg,wParam,lParam 
      invoke HideCaret,hWnd 
      invoke SendMessage,hWnd,EM_GETRECT,0,addr rect
      invoke SendMessage,hWnd,EM_CHARFROMPOS,0,addr rect
      mov FirstChar,eax

⌨️ 快捷键说明

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