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

📄 call.asm

📁 用ASM实现Server及sql操作
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	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 + -