0
点赞
收藏
分享

微信扫一扫

用MASM32按Time Protocol(RFC868)协议编写网络对时程序中的一些有用的函数代码


  这几天在用MASM32按Time Protocol(RFC868)协议编写网络对时程序,现在基本完成了。将其中一些有用的函数代码整理了一下。

  我们需要将本地系统时间转换为UTC格式发送给时间服务器,相关转换代码如下:

 

BaseTimeLow equ 0D53E8000h
BaseTimeHigh equ 19DB1DEh
;:::::::::::::::::::::::::::::::::::::::::::::::::::
FileTime2DateStamp proc lpFileTime: dword
;:::::::::::::::::::::::::::::::::::::::::::::::::::
mov ecx, lpFileTime
mov eax, [ecx]
mov edx, [ecx+4]
sub eax, BaseTimeLow
sbb edx, BaseTimeHigh

mov ecx, 10000000
div ecx

RET
FileTime2DateStamp endp


;::::::::::::::::::::::::::::::::::::::::
GetLocalTimeStamp proc
;::::::::::::::::::::::::::::::::::::::::
local stSystemTime: SYSTEMTIME
local stFileTime: FILETIME

invoke GetSystemTime, addr stSystemTime
invoke SystemTimeToFileTime, addr stSystemTime, addr stFileTime
invoke FileTime2DateStamp, addr stFileTime

ret
GetLocalTimeStamp endp

 

  时间服务器返回的是从1900年1月1日午夜到现在的秒数,将其转换为本地时间的相关代码如下:

 

;::::::::::::::::::::::::::::::::::::::::::::::::::::
_MemCpy proc lpD, lpS, dwSize
;::::::::::::::::::::::::::::::::::::::::::::::::::::
mov esi, lpS
mov edi, lpD
mov ecx, dwSize
rep movsb

ret
_MemCpy endp


g_szFmtDateTime db "%d-%d-%d %d:%d:%d", 0
;::::::::::::::::::::::::::::::::::::::::::::::::::::
printDateTime proc dwTimeStamp: dword
;::::::::::::::::::::::::::::::::::::::::::::::::::::
local buf[30]: byte
local stSysTime: SYSTEMTIME
local stFileTime: FILETIME
local stLocFileTime: FILETIME
local li: LARGE_INTEGER


invoke RtlZeroMemory, addr stSysTime, sizeof stSysTime

mov stSysTime.wYear, 1900
mov stSysTime.wMonth, 1
mov stSysTime.wDay, 1

invoke SystemTimeToFileTime, addr stSysTime, addr stFileTime
invoke _MemCpy, addr li, addr stFileTime, sizeof stFileTime

mov eax, dwTimeStamp
mov edx, 10000000
mul edx; edx=10000000

lea edi, li.QuadPart
add [edi], eax
adc [edi+4], edx

invoke _MemCpy, addr stFileTime, addr li, sizeof li
invoke FileTimeToLocalFileTime, addr stFileTime, addr stLocFileTime

lea edi, stSysTime;push edi
invoke FileTimeToSystemTime, addr stLocFileTime, edi ;edi=addr stSysTime
;pop edi movzx eax, (SYSTEMTIME ptr [edi]).wYear
movzx ebx, (SYSTEMTIME ptr [edi]).wMonth
movzx ecx, (SYSTEMTIME ptr [edi]).wDay
movzx edx, (SYSTEMTIME ptr [edi]).wHour
movzx esi, (SYSTEMTIME ptr [edi]).wMinute
movzx edi, (SYSTEMTIME ptr [edi]).wSecond

invoke wsprintf, addr buf, addr g_szFmtDateTime, eax, ebx, ecx,edx, esi, edi
invoke StdOut, addr buf

ret
printDateTime endp

举报

相关推荐

0 条评论