C++获取系统启动时间

这里写自定义目录标题

这里写自定义目录标题

获取系统启动时间

转换时间戳

code

cpp 复制代码
#include<stdio.h> 
#include<windows.h>  
#include <ctime>

#include <iostream>
#define NT_SUCCESS(x) ((x)>=0) 
const UINT 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,err=%u\n", GetLastError());
		return 0;
	}
	LONG status;
	SYSTEM_TIME_INFORMATION sti;
	status = NtQuerySystemInformation(SystemTimeInformation, &sti, sizeof(sti), 0);
	if (NO_ERROR != status)
	{
		printf("NtQuerySystemInformation Failed!n");
		return 0;
	}
	FILETIME ft1, ft2;
	SYSTEMTIME st;
	memcpy_s(&ft1, sizeof(ft1), &sti.liKeBootTime, sizeof(sti.liKeBootTime));
	//将其转为文件时间  
	//将一个FILETIME结构转换成本地时间  
	if (0 == FileTimeToLocalFileTime(&ft1, &ft2))
	{
		printf("FileTimeToLocalFileTime Failed err=%u\nn", GetLastError());
		return 0;
	}
	//将文件时间转为系统时间
	if (0 == FileTimeToSystemTime(&ft2, &st))
	{
		printf("FileTimeToSystemTimeFailed err=%u\nn", GetLastError());
		return 0;
	}
	printf("Date: %02d-%02d-%04d Time: %02d:%02d:%02d \n", st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond);



	LARGE_INTEGER li;
	li.LowPart = ft1.dwLowDateTime;
	li.HighPart = ft1.dwHighDateTime;

	// 需要对LARGE_INTEGER结构的值进行校正,因为FILETIME以100纳秒为单位,
	// 而Unix时间戳以秒为单位。同时需要考虑从1601年1月1日到1970年1月1日的时间偏移。
	li.QuadPart -= 116444736000000000ULL; // 116444736000000000 = 100纳秒 * (3600 * 24 * 365 * 30 + 3600 * 24 * 15)
	LONG64 timestamp = (LONG64)(li.QuadPart / 10000000); // 
	printf("Unix timestamp: %ld\n", timestamp);





	// 计算时间戳
	FILETIME epoch;
	ZeroMemory(&epoch, sizeof(FILETIME));
	SYSTEMTIME stEpoch = { 1970, 1, 0, 1, 0, 0, 0, 0 };
	SystemTimeToFileTime(&stEpoch, &epoch);

	ULARGE_INTEGER ullBootTime;
	ULARGE_INTEGER ullEpoch;
	ullBootTime.LowPart = ft2.dwLowDateTime;
	ullBootTime.HighPart = ft2.dwHighDateTime;
	ullEpoch.LowPart = epoch.dwLowDateTime;
	ullEpoch.HighPart = epoch.dwHighDateTime;

	// 计算时间戳(单位:秒)
	LONG64 nSysStartRunTime = static_cast<LONG64>((ullBootTime.QuadPart - ullEpoch.QuadPart) / 10000000);
	std::cout << "系统启动时间: " << nSysStartRunTime << std::endl;

	getchar();
	return 0;
}
相关推荐
双子座断点几秒前
QT 机器视觉 (3. 虚拟相机SDK、测试工具)
qt·1024程序员节
20岁30年经验的码农13 分钟前
爬虫基础
1024程序员节
licy__32 分钟前
计算机网络IP地址分类,子网掩码,子网划分复习资料
1024程序员节
Chris-zz1 小时前
Linux:磁盘深潜:探索文件系统、连接之道与库的奥秘
linux·网络·c++·1024程序员节
JasonYin~1 小时前
《探索 HarmonyOS NEXT(5.0):开启构建模块化项目架构奇幻之旅 —— 模块化基础篇》
1024程序员节
Teamol20202 小时前
求助帖:ubuntu22.10 auto install user-data配置了为何还需要选择语言键盘(如何全自动)
linux·ubuntu·1024程序员节
尘佑不尘2 小时前
shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘
数据库·笔记·mongodb·web安全·jenkins·1024程序员节
SeniorMao0073 小时前
结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统
1024程序员节
网安_秋刀鱼3 小时前
CSRF防范及绕过
前端·安全·web安全·网络安全·csrf·1024程序员节