很简单,原生态函数NtQuerySystemInformation已经为我们提供了这个功能,
虽然不那么优雅 :)
#include <stdio.h>
#include <stdbool.h>
#include <windows.h>
#define NT_SUCCESS(x) ((x)>=0)
#define SystemTimeInformation 3
typedef struct
{
LARGE_INTEGER liKeBootTime;
LARGE_INTEGER liKeSystemTime;
LARGE_INTEGER liExpTimeZoneBias;
ULONG uCurrentTimeZoneId;
DWORD dwReserved;
} SYSTEM_TIME_INFORMATION;
typedef long (__stdcall *fnNtQuerySystemInformation)(\
IN UINT SystemInformationClass,\
OUT PVOID SystemInformation,\
IN ULONG SystemInformationLength,\
OUT PULONG ReturnLength OPTIONAL);
static fnNtQuerySystemInformation NtQuerySystemInformation = NULL;
int main(void)
{
NtQuerySystemInformation = (fnNtQuerySystemInformation)\
GetProcAddress(LoadLibrary("ntdll.dll"),\
"NtQuerySystemInformation");
if(NtQuerySystemInformation == NULL)
{
printf("Get NtQuerySystemInformation Addr Failed!\n");
exit(-1);
}
LONG status;
SYSTEM_TIME_INFORMATION sti;
status = NtQuerySystemInformation(SystemTimeInformation,\
&sti,sizeof(sti),0);
printf("boot time (ms) == %I64X\n",sti.liKeBootTime.QuadPart);
/*if(!NT_SUCCESS(status))
{
printf("NtQuerySystemInformation Failed!\n");
goto quit;
}*/
if(NO_ERROR != status)
{
printf("NtQuerySystemInformation Failed!\n");
exit(-1);
}
FILETIME ft;
SYSTEMTIME st;
memcpy(&ft,&sti.liKeBootTime,sizeof(ft));
FileTimeToLocalFileTime(&ft,&ft);
FileTimeToSystemTime(&ft,&st);
printf("Date: %02d-%02d-%04d\nTime: %02d:%02d:%02d\n",st.wMonth,st.wDay,st.wYear,\
st.wHour,st.wMinute,st.wSecond);
getchar();
return 0;
}