一个小笔记(1):设置重启电脑、自动启动

【设置重启电脑】

使用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));
 
 
然后就可以啦!大功告成。

posted @ 2016-07-09 00:40  Sky_天空  阅读(299)  评论(0编辑  收藏  举报