📄 call.asm
字号:
LOCAL TimeBuff[20]:BYTE
LOCAL hTime:SYSTEMTIME
LOCAL hNum:DWORD
or ebx,-1
invoke lstrlen,lpName
.if eax < 50
invoke wsprintf,addr NetBuff,STEXT('%lu'),lpNetPass
invoke wsprintf,addr TmpBuff,STEXT("SELECT Number FROM T_Net WHERE (Name='%s')AND(Password='%s')AND(State=0 OR State IS NULL)"),lpNetName,addr NetBuff
invoke ShellSqlQueryUser,addr TmpBuff
.if eax != -1 ; 判断网吧是否存在
.if eax >= lpNum
mov hNum,eax
invoke wsprintf,addr TmpBuff,STEXT("SELECT COUNT(*) FROM T_Single WHERE (Name='%s')"),lpName
invoke ShellSqlQueryUser,addr TmpBuff
.if eax != -1 ; 判断用户名是否存在
.if lpType == 1 ; 新建用户
.if eax == 0
invoke GetLocalTime,addr hTime
invoke TimeToStr,addr hTime,addr TimeBuff
invoke GetTickCount
.if eax <= 1000000
.while eax <= 1000000
add eax,9999
imul eax,eax,357
.endw
.elseif eax >= 9999999
.while eax >= 9999999
sub eax,9999
shr eax,1
.endw
.endif
mov edx,lpNetName
mov dword ptr [edx+32],eax
invoke wsprintf,addr PassBuff,STEXT('%lu'),eax
invoke wsprintf,addr TmpBuff,STEXT("INSERT INTO T_Single (Name,Password,Number,SupplyTime,CreateTime,Source) VALUES ('%s','%s',%d,'%s','%s','%s')"),lpName,addr PassBuff,lpNum,addr TimeBuff,addr TimeBuff,lpNetName
invoke ShellSqlExecCommand,addr TmpBuff
.if eax == 0
invoke wsprintf,addr TmpBuff,STEXT("UPDATE T_Net SET Number=Number-%d WHERE (Name='%s')"),lpNum,lpNetName
invoke ShellSqlExecCommand,addr TmpBuff
mov ebx,lpNum
.endif
.else
mov ebx,-2
.endif
.else ; 已存在的用户
.if eax == 1
invoke GetLocalTime,addr hTime
invoke TimeToStr,addr hTime,addr TimeBuff
invoke wsprintf,addr TmpBuff,STEXT("UPDATE T_Single SET Number=Number+%d,SupplyTime='%s',Source='%s' WHERE ((Name='%s')AND(State=0 OR State IS NULL))"),lpNum,addr TimeBuff,lpNetName,lpName
invoke ShellSqlExecCommand,addr TmpBuff
.if eax == 0
invoke wsprintf,addr TmpBuff,STEXT("UPDATE T_Net SET Number=Number-%d WHERE (Name='%s')"),lpNum,lpNetName
invoke ShellSqlExecCommand,addr TmpBuff
invoke wsprintf,addr TmpBuff,STEXT("SELECT Number FROM T_Single WHERE(Name='%s')"),lpName
invoke ShellSqlQueryDword,addr TmpBuff
mov ebx,eax
.endif
.else
mov ebx,-3
.endif
.endif
.endif
.endif
.endif
.endif
mov eax,ebx
ret
CallSupplyNetToSingle endp
TimeToStr proc uses esi edi ebx,lpTime:DWORD,lpBuff:DWORD
mov eax,lpTime
movzx ebx,[eax.SYSTEMTIME].wMonth
movzx ecx,[eax.SYSTEMTIME].wDay
movzx edx,[eax.SYSTEMTIME].wHour
movzx esi,[eax.SYSTEMTIME].wMinute
movzx edi,[eax.SYSTEMTIME].wSecond
movzx eax,[eax.SYSTEMTIME].wYear
invoke wsprintf,lpBuff,STEXT('%d-%d-%d %d:%d:%d'),eax,ebx,ecx,edx,esi,edi
ret
TimeToStr endp
TimeToStr2 proc uses esi edi ebx,lpTime:DWORD,lpBuff:DWORD
mov eax,lpTime
movzx ebx,[eax.SYSTEMTIME].wMonth
movzx ecx,[eax.SYSTEMTIME].wDay
movzx edx,[eax.SYSTEMTIME].wHour
movzx esi,[eax.SYSTEMTIME].wMinute
movzx edi,[eax.SYSTEMTIME].wSecond
movzx eax,[eax.SYSTEMTIME].wYear
invoke wsprintf,lpBuff,STEXT('%1.4d-%1.2d-%1.2d %1.2d:%1.2d:%1.2d'),eax,ebx,ecx,edx,esi,edi
ret
TimeToStr2 endp
CallCmpTimeSize proc uses esi edi ebx,lpTime1:DWORD,lpTime2:DWORD,lpSize:DWORD
xor esi,esi
mov ebx,lpTime1
movzx eax,[ebx.SYSTEMTIME].wYear
imul eax,eax,365
add esi,eax
movzx eax,[ebx.SYSTEMTIME].wMonth
movzx eax,[eax*2+hMonthDay-2]
add esi,eax
movzx eax,[ebx.SYSTEMTIME].wDay
add esi,eax
xor edi,edi
mov ebx,lpTime2
movzx eax,[ebx.SYSTEMTIME].wYear
imul eax,eax,365
add edi,eax
movzx eax,[ebx.SYSTEMTIME].wMonth
movzx eax,[eax*2+hMonthDay-2]
add edi,eax
movzx eax,[ebx.SYSTEMTIME].wDay
add edi,eax
sub esi,edi
.if esi >= lpSize
xor eax,eax
.else
or eax,-1
.endif
ret
CallCmpTimeSize endp
CallIsNum proc uses esi,lpBuff:DWORD
mov esi,lpBuff
.if byte ptr [esi] == 0
or eax,-1
ret
.endif
.while byte ptr [esi] != 0
lodsb
.if al >= '0' && al <= '9'
.else
or eax,-1
ret
.endif
.endw
xor eax,eax
ret
CallIsNum endp
CallIsValidateCrd proc uses esi ebx,lpOldCrd:DWORD,lpNewCrd:DWORD
LOCAL hFlag:BYTE
invoke CharUpper,lpOldCrd
mov hFlag,0
invoke StrCmpN,lpOldCrd,STEXT('BY'),2
.if eax == 0
or hFlag,-1
mov ebx,2
.else
invoke StrCmpN,lpOldCrd,STEXT('PY'),2
.if eax == 0
or hFlag,-1
mov ebx,2
.else
invoke StrCmpN,lpOldCrd,STEXT('GY'),2
.if eax == 0
or hFlag,-1
mov ebx,2
.else
invoke StrCmpN,lpOldCrd,STEXT('LY'),2
.if eax == 0
or hFlag,-1
mov ebx,2
.endif
.endif
.endif
.endif
.if hFlag != 0
add lpOldCrd,ebx
invoke CallIsNum,lpOldCrd
.if eax == 0
mov esi,lpNewCrd
.repeat
lodsb
.until (al >= '0' && al <= '9') || al == 0
dec esi
invoke StrCmpN,esi,STEXT('9999'),4
.if eax == 0
mov hFlag,0
.else
invoke StrCmpN,lpOldCrd,esi,4
.if eax == 0
mov hFlag,0
.endif
.endif
.else
mov hFlag,0
.endif
.endif
movsx eax,hFlag
ret
CallIsValidateCrd endp
CallCloseSocket proc sock:DWORD,hWin:DWORD
invoke WSAAsyncSelect,sock,hWin,0,0
invoke closesocket,sock
ret
CallCloseSocket endp
CallCloseMsgSocket proc sock:DWORD,hWin:DWORD,hMsg:DWORD
LOCAL MyMSG:MSG
invoke WSAAsyncSelect,sock,hWin,0,0
invoke closesocket,sock
invoke PeekMessage,addr MyMSG,hWin,hMsg,hMsg,PM_REMOVE
ret
CallCloseMsgSocket endp
CallInitLogFile proc
LOCAL TmpBuff[MAX_PATH]:BYTE
LOCAL hFile:DWORD,hSize:DWORD
LOCAL TimeBuff[20]:BYTE
LOCAL hTime:SYSTEMTIME
invoke GetCurrentPath,addr TmpBuff
invoke lstrcat,addr TmpBuff,STEXT('SERVER.LOG')
invoke CreateFile,addr TmpBuff,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
invoke CreateFile,addr TmpBuff,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.endif
.if eax != INVALID_HANDLE_VALUE
mov hFile,eax
invoke SetFilePointer,hFile,0,0,FILE_END
invoke GetLocalTime,addr hTime
invoke TimeToStr2,addr hTime,addr TimeBuff
szText szStartStr,'%s 服务端启动。',0dh,0ah,0
invoke wsprintf,addr TmpBuff,addr szStartStr,addr TimeBuff
lea edx,hSize
invoke WriteFile,hFile,addr TmpBuff,eax,edx,NULL
invoke CloseHandle,hFile
.endif
ret
CallInitLogFile endp
CallMakeLogFile proc
LOCAL TmpBuff[MAX_PATH]:BYTE
LOCAL hFile:DWORD,hSize:DWORD
LOCAL TimeBuff[20]:BYTE
LOCAL hTime:SYSTEMTIME
invoke GetCurrentPath,addr TmpBuff
invoke lstrcat,addr TmpBuff,STEXT('SERVER.LOG')
invoke CreateFile,addr TmpBuff,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
invoke CreateFile,addr TmpBuff,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.endif
.if eax != INVALID_HANDLE_VALUE
mov hFile,eax
invoke SetFilePointer,hFile,0,0,FILE_END
invoke GetLocalTime,addr hTime
invoke TimeToStr2,addr hTime,addr TimeBuff
szText szMakeStr,'%s 连接用户数:%lu,登录用户数:%lu,进入游戏用户数:%lu,错误连接数:%lu。',0dh,0ah,0
invoke wsprintf,addr TmpBuff,addr szMakeStr,addr TimeBuff,hInd3,hInd2,hInd1,hInd4
lea edx,hSize
invoke WriteFile,hFile,addr TmpBuff,eax,edx,NULL
invoke CloseHandle,hFile
mov hInd1,0
mov hInd2,0
mov hInd3,0
mov hInd4,0
.endif
ret
CallMakeLogFile endp
CallExitLogFile proc
LOCAL TmpBuff[MAX_PATH]:BYTE
LOCAL hFile:DWORD,hSize:DWORD
LOCAL TimeBuff[20]:BYTE
LOCAL hTime:SYSTEMTIME
invoke GetCurrentPath,addr TmpBuff
invoke lstrcat,addr TmpBuff,STEXT('SERVER.LOG')
invoke CreateFile,addr TmpBuff,GENERIC_READ or GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
invoke CreateFile,addr TmpBuff,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.endif
.if eax != INVALID_HANDLE_VALUE
mov hFile,eax
invoke SetFilePointer,hFile,0,0,FILE_END
invoke GetLocalTime,addr hTime
invoke TimeToStr2,addr hTime,addr TimeBuff
szText szEndStr,'%s 服务端退出。连接用户数:%lu,登录用户数:%lu,进入游戏用户数:%lu,错误连接数:%lu。',0dh,0ah,0
invoke wsprintf,addr TmpBuff,addr szEndStr,addr TimeBuff,hInd3,hInd2,hInd1,hInd4
lea edx,hSize
invoke WriteFile,hFile,addr TmpBuff,eax,edx,NULL
invoke CloseHandle,hFile
.endif
ret
CallExitLogFile endp
GetCurrentPath proc uses esi,lpBuff:DWORD
invoke GetModuleFileName,0,lpBuff,MAX_PATH
mov esi,lpBuff
xor edx, edx
xor ecx, ecx
cld
.while TRUE
lodsb
inc ecx
.if al == 0
.break
.elseif al != '\'
.continue
.endif
mov edx,ecx
.endw
mov eax,lpBuff
add eax,edx
mov byte ptr [eax],0
ret
GetCurrentPath endp
CallGetServerConfig proc hWin:DWORD
LOCAL @hService:DWORD,hSCM:DWORD
LOCAL hSize:DWORD
LOCAL hSerCon:QUERY_SERVICE_CONFIGA
LOCAL hRet:DWORD
or hRet,-1
invoke OpenSCManager,0,0,SC_MANAGER_ALL_ACCESS
.if eax != 0
mov hSCM,eax
invoke OpenService,hSCM,STEXT('BywgService'),SERVICE_ALL_ACCESS
.if eax != 0
mov @hService,eax
invoke QueryServiceConfig,@hService,addr hSerCon,sizeof hSerCon,addr hSize
invoke CloseServiceHandle,@hService
mov eax,hSerCon.dwStartType
.if eax == SERVICE_AUTO_START
mov hRet,0
.endif
.endif
invoke CloseServiceHandle,hSCM
.endif
mov eax,hRet
ret
CallGetServerConfig endp
CallChangeServerConfig proc lpStart:DWORD
LOCAL @hService:DWORD,hSCM:DWORD
LOCAL hSize:DWORD,hMem:DWORD
LOCAL hSerCon:QUERY_SERVICE_CONFIGA
LOCAL hRet:DWORD,hLock:DWORD
or hRet,-1
invoke OpenSCManager,0,0,SC_MANAGER_ALL_ACCESS or GENERIC_WRITE
.if eax != 0
mov hSCM,eax
invoke LockServiceDatabase,hSCM
.if eax != 0
mov hLock,eax
invoke OpenService,hSCM,STEXT('BywgService'),SERVICE_ALL_ACCESS
.if eax != 0
mov @hService,eax
invoke ChangeServiceConfig,@hService,SERVICE_NO_CHANGE,lpStart,SERVICE_NO_CHANGE,0,0,0,0,0,0,0
invoke CloseServiceHandle,@hService
.endif
invoke UnlockServiceDatabase,hLock
.endif
invoke CloseServiceHandle,hSCM
.endif
mov eax,hRet
ret
CallChangeServerConfig endp
CallChangeSockAttrib proc hSock:DWORD
LOCAL ling:linger
.if hSock != INVALID_SOCKET
mov ling.l_onoff,0
mov ling.l_linger,0
invoke setsockopt,hSock,SOL_SOCKET,SO_LINGER,addr ling,sizeof ling
.endif
ret
CallChangeSockAttrib endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -