【驱动开发】006 系统时间

来源:互联网 发布:淘宝直通车掌柜热卖 编辑:程序博客网 时间:2024/06/06 12:37

     在win32引用程序中,我们对时间操作一般都会用到 GetTickCount 这个函数返回系统自从启动后经历的毫秒数;同样在内核中也有一个对应的函数KeQueryTickCount ,这个函数返回系统“滴答”数,并不是时间。所以我们必须再调用KeQueryTImeIncrement获取每个滴答间隔。

     下面例子参考  楚狂人 代码,获取毫秒数

// 获取系统毫秒数//VOID MyGetTickCount(PULONG msec){LARGE_INTEGER tick_count ;ULONG myinc = KeQueryTimeIncrement();// 获取系统滴答数KeQueryTickCount(&tick_count);tick_count.QuadPart *= myinc ;// 滴答数 * 滴答间隔 = 总时间// 转换成毫秒tick_count.QuadPart /= 10000 ;*msec = tick_count.LowPart ;}


       接下来我们就要获取系统的时间。这里要说明一下,在MFC中我们有CTime类,微软做了封装,在内核中我们只能用TIME_FIELDS结构自己转换。
下面给个 楚狂人 写的demon:

// 获取系统当前时间 // 个数 年-月-日 时-分-秒PWCHAR MyCurTimeStr(){LARGE_INTEGER snow,now ;TIME_FIELDS now_fields ;static WCHAR time_str[32] = {0};// 注意这里必须要写成static静态的变量 否则会蓝屏#if DBG//_asm int 3 ;#endif // 获取标准时间KeQuerySystemTime(&snow);// 转换为当地时间ExSystemTimeToLocalTime(&snow,&now);// 转换成人们可以理解的时间要素RtlTimeToTimeFields(&now,&now_fields);// 将time_fields 按照格式打印出来RtlStringCchPrintfW(time_str,32,L"%4d-%2d-%2d %2d-%2d-%2d",now_fields.Year, now_fields.Month, now_fields.Day,now_fields.Hour, now_fields.Minute, now_fields.Second);return time_str;}

        这里面我们用了静态变量,所以调用完成后这个time_str还是驻留在内存中的,这样外部调用的时候并不会引发bsod;处理的办法有很多,这里只是为了方便设成静态变量,我们也可以传入参数或者 全局变量都可以实现函数返回的功能。



0 0
原创粉丝点击