【设置重启电脑】
使用API函数ExitWindowsEx
BOOL WINAPI ExitWindowsEx(
_In_ UINT uFlags,
_In_ DWORD dwReason
);
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winuser%2FExitWindowsEx);k(ExitWindowsEx);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
如果方法执行成功,返回非零值
其实MSDN里有例子,MSDN的例子大多都是一个很宝贵的资源~
直接Copy一个过来,改一下地方就行了:
#include <windows.h>
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "advapi32.lib")
BOOL MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
// Get a token for this process.
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );
// Get the LUID for the shutdown privilege.
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
// Get the shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES)NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
return FALSE;
// Shut down the system and force all applications to close.
if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPGRADE |
SHTDN_REASON_FLAG_PLANNED))
return FALSE;
//Reboot was successful
return TRUE;
}
在使用ExitWindosEx之前,要使用其他一些函数,为什么?
ExitWindowsEx函数属于“高危”动作,系统会“需要确认”我们的程序是否真的要这样子做。
所以我们在让系统知道“我们的确要用这个函数来做高危动作”
在系统里,这叫权限,我们要给自己的程序“提权”,所以就会有上面的一堆代码了。
OpenProcessToken:打开当前进程Token
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winbase%2FOpenProcessToken);k(OpenProcessToken);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
LookupPrivilegeValue:使程序拥有相应的权限(跟系统说:我要某个权限)
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winbase%2FLookupPrivilegeValue);k(LookupPrivilegeValue);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
AdjustTokenPrivileges:应用权限(跟系统说:我确定要使用这个权限)
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winbase%2FAdjustTokenPrivileges);k(AdjustTokenPrivileges);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
【自动启动】
注册表中有6个地方可以写入开机启动信息,
其中一个位置:HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun
步骤:
第一步,打开注册表,使用API函数RegOpenKeyEx
LONG WINAPI RegOpenKeyEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpSubKey,
_In_ DWORD ulOptions,
_In_ REGSAM samDesired,
_Out_ PHKEY phkResult
);
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winreg%2FRegOpenKeyEx);k(RegOpenKeyEx);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
如果方法执行成功,返回值为:ERROR_SUCCESS
HKEY hKey = { 0 };
// 打开注册表
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWAREMicrosoftWindowsCurrentVersionRun", 0, KEY_WRITE, &hKey);
第二步,写入注册表,使用API函数RegSetValueEx
LONG WINAPI RegSetValueEx(
_In_ HKEY hKey,
_In_opt_ LPCTSTR lpValueName,
_Reserved_ DWORD Reserved,
_In_ DWORD dwType,
_In_ const BYTE *lpData,
_In_ DWORD cbData
);
【MSDN】
https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(winreg%2FRegSetValueEx);k(RegSetValueEx);k(DevLang-C%2B%2B);k(TargetOS-Windows)&rd=true
如果方法执行成功,返回值为:ERROR_SUCCESS
char szPath[MAXBYTE] = { 0 };
GetModuleFileNameA(nullptr, szPath, MAXBYTE);
// 写入信息
RegSetValueEx(hKey, L"ReBootDemo", 0, REG_SZ, (byte*)szPath, strlen(szPath));
然后就可以啦!大功告成。