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