强制重启——让调试的小伙伴爽一爽

本文介绍了一个简单的C++程序,用于在Windows系统上实现关机、重启和注销操作。程序通过启用关机特权并使用Windows API函数来完成这些任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>
#include <stdio.h>

bool EnableShutdownPrivilege()
{
	HANDLE hProcess = NULL;
	HANDLE hToken = NULL;
	LUID uID = {0};
	TOKEN_PRIVILEGES stToken_Privileges = {0};

	hProcess = ::GetCurrentProcess();  //获取当前应用程序进程句柄

	if(!::OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken))  //打开当前进程的访问令牌句柄(OpenProcessToken函数调用失败返回值为零)
		return FALSE;

	if(!::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&uID))  //获取权限名称为"SeShutdownPrivilege"的LUID(LookupPrivilegeValue函数调用失败返回值为零)
		return FALSE;

	stToken_Privileges.PrivilegeCount = 1;  //欲调整的权限个数
	stToken_Privileges.Privileges[0].Luid = uID;  //权限的LUID
	stToken_Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  //权限的属性,SE_PRIVILEGE_ENABLED为使能该权限

	if(!::AdjustTokenPrivileges(hToken,FALSE,&stToken_Privileges,sizeof stToken_Privileges,NULL,NULL))  //调整访问令牌里的指定权限(AdjustTokenPrivileges函数调用失败返回值为零)
		return FALSE;

	if(::GetLastError() != ERROR_SUCCESS)  //查看权限是否调整成功
		return FALSE;

	::CloseHandle(hToken);
	return TRUE;
}

//关机函数
BOOL Shutdown(BOOL bForce)
{
	EnableShutdownPrivilege();  //使能关机特权函数
	if(bForce)
		return ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,0);  //强制关机
	else
		return ::ExitWindowsEx(EWX_SHUTDOWN,0);
}

//注销函数
BOOL Logoff(BOOL bForce)
{
	if(bForce)
		return ::ExitWindowsEx(EWX_LOGOFF | EWX_FORCE,0);  //强制注销
	else
		return ::ExitWindowsEx(EWX_LOGOFF,0);
}

//重启函数
BOOL Reboot(BOOL bForce)
{
	EnableShutdownPrivilege();  //使能关机特权函数
	if(bForce)
		return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE,0);  //强制重启
	else
		return ::ExitWindowsEx(EWX_REBOOT,0);
}

int main()
{
	//Logoff(FALSE);  //注销
	//Reboot(FALSE);  //重启
	Shutdown(FALSE);  //关机
	//Logoff(TRUE);  //强制注销
	//Reboot(TRUE);  //强制重启
	//Shutdown(TRUE);  //强制关机
	return 0;
}

我的一个同学曾经在一个程序中这样做:如果检测OD/虚拟机,则调用这段代码。。。

说实话吓人一跳还是蛮实用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值