標籤:
【設定重啟電腦】
使用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_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
步驟:
第一步,開啟註冊表,使用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"SOFTWARE\Microsoft\Windows\CurrentVersion\Run", 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));
然後就可以啦!大功告成。
一個小筆記(1):設定重啟電腦、自動啟動