这几天在用MASM32按Time Protocol(RFC868)协议编写网络对时程序,现在基本完成了。将其中一些有用的函数代码整理了一下。
我们需要将本地系统时间转换为UTC格式发送给时间服务器,相关转换代码如下:
BaseTimeLowequ0D53E8000h
BaseTimeHighequ19DB1DEh
;:::::::::::::::::::::::::::::::::::::::::::::::::::
FileTime2DateStampproclpFileTime:dword
;:::::::::::::::::::::::::::::::::::::::::::::::::::
movecx,lpFileTime
moveax,[ecx]
movedx,[ecx+4]
subeax,BaseTimeLow
sbbedx,BaseTimeHigh
movecx,10000000
divecx
RET
FileTime2DateStampendp
;::::::::::::::::::::::::::::::::::::::::
GetLocalTimeStampproc
;::::::::::::::::::::::::::::::::::::::::
localstSystemTime:SYSTEMTIME
localstFileTime:FILETIME
invokeGetSystemTime,addrstSystemTime
invokeSystemTimeToFileTime,addrstSystemTime,addrstFileTime
invokeFileTime2DateStamp,addrstFileTime
ret
GetLocalTimeStampendp
时间服务器返回的是从1900年1月1日午夜到现在的秒数,将其转换为本地时间的相关代码如下:
;::::::::::::::::::::::::::::::::::::::::::::::::::::
_MemCpyproclpD,lpS,dwSize
;::::::::::::::::::::::::::::::::::::::::::::::::::::
movesi,lpS
movedi,lpD
movecx,dwSize
repmovsb
ret
_MemCpyendp
g_szFmtDateTimedb"%d-%d-%d%d:%d:%d",0
;::::::::::::::::::::::::::::::::::::::::::::::::::::
printDateTimeprocdwTimeStamp:dword
;::::::::::::::::::::::::::::::::::::::::::::::::::::
localbuf[30]:byte
localstSysTime:SYSTEMTIME
localstFileTime:FILETIME
localstLocFileTime:FILETIME
localli:LARGE_INTEGER
invokeRtlZeroMemory,addrstSysTime,sizeofstSysTime
movstSysTime.wYear,1900
movstSysTime.wMonth,1
movstSysTime.wDay,1
invokeSystemTimeToFileTime,addrstSysTime,addrstFileTime
invoke_MemCpy,addrli,addrstFileTime,sizeofstFileTime
moveax, dwTimeStamp
movedx,10000000
muledx;edx=10000000
leaedi,li.QuadPart
add[edi],eax
adc[edi+4],edx
invoke_MemCpy,addrstFileTime,addrli,sizeofli
invokeFileTimeToLocalFileTime,addrstFileTime,addrstLocFileTime
leaedi,stSysTime;push edi
invokeFileTimeToSystemTime,addrstLocFileTime,edi;edi=addrstSysTime
;pop edi
movzxeax,(SYSTEMTIMEptr[edi]).wYear
movzxebx,(SYSTEMTIMEptr[edi]).wMonth
movzxecx,(SYSTEMTIMEptr[edi]).wDay
movzxedx,(SYSTEMTIMEptr[edi]).wHour
movzxesi,(SYSTEMTIMEptr[edi]).wMinute
movzxedi,(SYSTEMTIMEptr[edi]).wSecond
invokewsprintf,addrbuf,addrg_szFmtDateTime,eax,ebx,ecx,edx,esi,edi
invokeStdOut,addrbuf
ret
printDateTimeendp