Give you a code, below is part of my shutdown program.
void CShutDownView :: OnLogoff () {HANDLE hToken; TOKEN_PRIVILEGES tkp; LUID sedebugnameValue; if {if (OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken)!) return (IsWin98 ()!); if (LookupPrivilegeValue (NULL,! SE_SHUTDOWN_NAME, & sedebugnameValue)) {CloseHandle (hToken); return;} tkp.PrivilegeCount = 1; tkp.Privileges [0] .Luid = sedebugnameValue; tkp.Privileges [0] .Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges (hToken, FALSE, & tkp, SizeOf TKP, NULL, NULL); CloseHandle (HTOKEN);} if (! EXITWINDOWSEX (EWX_LOGOFF, 0L)) AFXMESSAGEBOX ("Close Computer Failed!"); EWX_REBOOT can be replaced with other parameters to implement power and other functions. }
Void cshutdownview :: oneXit () {
CWND * PMainWindow = AFXGETMAINWND (); :: PostMessage (PMainWindow-> M_HWND, WM_CLOSE, 0, 0);
Void cshutdownview :: onrestart () {/ * Steps: 1, Opens the access token associated with a process. * /
HANDLE hToken; TOKEN_PRIVILEGES tkp; LUID sedebugnameValue; (! IsWin98 ()) if {if (! OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken)) return; / * The LookupPrivilegeValue function retrieves the locally unique identifier (LUID) used on a specified system to locally represent the specified privilege name BOOL LookupPrivilegeValue (LPCTSTR lpSystemName, // address of string specifying the system LPCTSTR lpName, // address of string specifying the privilege PLUID lpLuid // address of locally unique identifier);. * / if (! LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, & sedebugnameValue)) {CloseHandle (hToken); return;} tkp.PrivilegeCount = 1; tkp.Privileges [0] .Luid = sedebugnameValue; tkp.Privileges [0] .Attributes = SE_PRIVILEGE_ENABLED; / * The AdjustTokenprivileges Function Enables or Disables Privileges in The Specified Access Token. Enabling or Disabling Privileges in An Access Token Requi res TOKEN_ADJUST_PRIVILEGES access. TokenPrivileges (HANDLE TokenHandle, // handle to token that contains privileges BOOL DisableAllPrivileges, // flag for disabling all privileges PTOKEN_PRIVILEGES NewState, // pointer to new privilege information DWORD BufferLength, // size, in bytes, of the PreviousState buffer PTOKEN_PRIVILEGES PreviousState, // receives original state of changed privileges PDWORD ReturnLength // receives required size of the PreviousState buffer); * / AdjustTokenPrivileges (hToken, FALSE, & tkp, sizeof tkp, NULL, NULL); CloseHandle (hToken);} if (! EXITWINDOWSEX (EWX_REBOOT, 0L)) AFXMessageBox ("Restart Failed!"); EWX_REBOOT can be replaced with other parameters to implement functions such as turning off power. }
Void cshutdownview :: onshutdown () {
HANDLE hToken; TOKEN_PRIVILEGES tkp; LUID sedebugnameValue; (! IsWin98 ()) if {if (! OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken)) return; if {CloseHandle ((LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, & sedebugnameValue)!) hToken); return;} tkp.PrivilegeCount = 1; tkp.Privileges [0] .Luid = sedebugnameValue; tkp.Privileges [0] .Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges (hToken, FALSE, & tkp, sizeof tkp, NULL, NULL); CloseHandle (HTokeen);} if (! EXITWINDOWSEX (EWX_SHUTDOWN, 0L)) AFXMESSAGEBOX ("Close Computer Failed!"); EWX_REBOOT can be replaced with other parameters to implement functional power.
}
Void cshutdownview :: onpoweroff () {
Handle HToken; Token_Privileges Tkp; Luid SedbugnameValue; if (! Iswin98 ()) {
if | return (OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY, & hToken)!); if {CloseHandle (hToken); return;} tkp.PrivilegeCount = 1; tkp.Privileges [0 (LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, & sedebugnameValue)!) ] .Luid = sedebugnameValue; tkp.Privileges [0] .Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges (hToken, FALSE, & tkp, sizeof tkp, NULL, NULL); CloseHandle (hToken);} if (! ExitWindowsEx (EWX_POWEROFF, 0L)) AfxMessageBox ("Close the computer failed!"); EWX_REBOOT can be replaced with other parameters to implement function of turning off power. }
Bool cshutdownview :: iswin98 () {dWord dWversionNum = getversion (); if (dwversionnnu <0x80000000) // Nt return false; else // win98 return;} This code should be, first acquiring privileges and then then then .. ...