![]() |
|
|
|
#1
|
||||
|
||||
|
Fundamentally, if you have permissions to run shutdown.exe, you have permissions to use the same API that it uses, so you can do what you want in your own program. I would use the ExitWindowsEx() API, maybe with a warning dialog and a countdown. You need to obtain shutdown permission first though. I found this code snippet thanks to CoderSource.net :
Code:
HANDLE hToken; // handle to process token
TOKEN_PRIVILEGES tkp; // pointer to token structure
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES |
TOKEN_QUERY, &hToken); // Get the LUID for 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 shutdown privilege for this process.
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0);
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError() != ERROR_SUCCESS)
MessageBox("AdjustTokenPrivileges enable failed.");
MSDN offers this example on the use of ExitWindowsEx : Code:
#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_SHUTDOWN | EWX_FORCE,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPGRADE |
SHTDN_REASON_FLAG_PLANNED))
return FALSE;
//shutdown was successful
return TRUE;
}
|
|
#2
|
|||
|
|||
|
Git,
Thanks for your reply. This is taken from the MSDN documentation regarding ExitWindowsEx: The function is designed to stop all processes in the caller's logon session. Therefore, if you are not the interactive user, the function can succeed without actually shutting down the computer. If you are not the interactive user, use the InitiateSystemShutdown or InitiateSystemShutdownEx function. As you can see, it is better to use InitiateSystemShutdown. However this displays the System Shutdown dialog I can't subclass. In fact, reversing the shutdown.exe utility you can see that it uses this latter API. But what you propose is valid. I can write my own shutdown utility with my own Dialog and call the same API shutdown does. However reversing shutdown will take longer than just subclassing the Dialog. So, unless this Dialog can't be subclassed y prefer not to reverse. |
|
#3
|
|||
|
|||
|
You can use SHUTDOWN replacement by sysinternals.com: look for PSSHUTDOWN.
The option '-c' adds the "Cancel" button to the shutdown dialog box. Best regards, bilbo |
|
#4
|
|||
|
|||
|
Hey Bilbo, this is exactly what I needed. I already created a little proggie that allows to cancel shutdown from the tray and it works fine but I might be curious and look inside this utility to see how it bypasses the System Shutdown dialog.
Thanks a lot!! ![]()
|
![]() |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Skillfeed everything for free // site shutdown | Spiderz_Soft | General Discussion | 2 | 09-22-2015 01:06 |