获得系统版本号。内核编程难免使用硬编码,以及使用一些高版本系统才出现的函数。为了使得驱动能在低版本的系统上正常运行,就需要根据不同系统做不同处理了。
VOID GetVersion() { ULONG NtBuildNumber; RTL_OSVERSIONINFOW osi; osi.dwOSVersionInfoSize=sizeof(RTL_OSVERSIONINFOW); RtlFillMemory(&osi,sizeof(RTL_OSVERSIONINFOW),0); RtlGetVersion(&osi); NtBuildNumber=osi.dwBuildNumber; DbgPrint("NtBuildNumber: %ld\n",NtBuildNumber); return NtBuildNumber; }
获得系统时间。在内核里获得系统时间的是标准时间(GMT+0),转换成本地时间还需要进行转换。此功能在发布测试版软件的时候特别有用,限制人们只能在指定时间之前使用。
VOID MyGetCurrentTime() { LARGE_INTEGER CurrentTime; LARGE_INTEGER LocalTime; TIME_FIELDS TimeFiled; // 这里得到的其实是格林威治时间 KeQuerySystemTime(&CurrentTime); // 转换成本地时间 ExSystemTimeToLocalTime(&CurrentTime, &LocalTime); // 把时间转换为容易理解的形式 RtlTimeToTimeFields(&LocalTime, &TimeFiled); DbgPrint("[TimeTest] NowTime : %4d-%2d-%2d %2d:%2d:%2d", TimeFiled.Year, TimeFiled.Month, TimeFiled.Day, TimeFiled.Hour, TimeFiled.Minute, TimeFiled.Second); }