MASM32编程将TimeStamp/UTC转换为具体日期时间的几个有用函数代码

本文介绍了一种将Windows事件日志中记录的时间戳转换为可读日期时间的方法。通过利用特定的偏移量和系统API,可以将UTC时间戳转换为本地日期时间格式。

  这两天在编写一个读取系统事件日志的程序,其中结构变量EVENTLOGRECORD中成员TimeGenerated和TimeWritten的值为:

The time at which this entry was submitted. This time is measured in the number of seconds elapsed since 00:00:00 January 1, 1970, Universal Coordinated Time.

即从格林尼治时间1970年1月1日夜里12:00开始的秒数。

Windows系统好像没有直接提供将其转换为对应的年月日、时分秒的API函数。

Google了一下,在
http://www.asmcommunity.net/board/index.php?topic=18369.0
找到了donkey网友提供的方法,整理如下:

BaseTimeLowequ0D53E8000h
BaseTimeHighequ19DB1DEh


StampToLocalDateTimeprocdwStamp:dword,lpstLocalTime:dword
localstUtcFileTime:FILETIME
localstLocalFileTime:FILETIME

moveax,dwStamp
movedx,10000000
muledx
addeax,BaseTimeLow
adcedx,BaseTimeHigh

movstUtcFileTime.dwLowDateTime,eax
movstUtcFileTime.dwHighDateTime,edx
invokeFileTimeToLocalFileTime,addrstUtcFileTime,addrstLocalFileTime
invokeFileTimeToSystemTime,addrstLocalFileTime,lpstLocalTime

ret
StampToLocalDateTimeendp


LOCALE_SYSTEM_DEFAULTequ0
g_szFmtDatedb"yyyy-M-d",0
printDateproclpstDate:dword
localbuf[12]:byte
invokeGetDateFormat,LOCALE_SYSTEM_DEFAULT,NULL,lpstDate,offsetg_szFmtDate,addrbuf,sizeofbuf
m_InsTxtaddrbuf
ret
printDateendp

;LOCALE_SYSTEM_DEFAULTequ0
g_szFmtTimedb"H:m:ss",0
printTimeproclpstTime:dword
localbuf[9]:byte
invokeGetTimeFormat,LOCALE_SYSTEM_DEFAULT,NULL,lpstTime,offsetg_szFmtTime,addrbuf,sizeofbuf
m_InsTxtaddrbuf
ret
printTimeendp


g_szFmtDateTimedb"%d-%d-%d%d:%d:%d",0
printDateTimeproclpstDateTime:DWORD
localbuf[30]:byte

pusha
movedi,lpstDateTime
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
popa

ret
printDateTimeendp

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值