#1
|
|||
|
|||
Subclass System Shutdown Dialog
Hi,
I use the shutdown.exe utility to shutdown computers at a specified time (as a scheduled task). However sometimes the computer might still be in use and shutdown should be aborted. The system shutdown dialog that opens does not have a cancel button and it is necessary to open a command prompt and abort shutdown using another option of the same utility. I want to subclass this dialog to add a cancel button but trying to use Windows Hooks gives Access Denied. I've tried acquiring the Shutdown privilege and even the Debug privilege (the utility runs under the administrator account) but I always get Access Denied. Is it possible to subclass this dialog? Note: The Shutdown dialog from most searches over the Internet is the one with the Standby, Stop and Restart buttons. The dialog I'm talking about is the one that shows up by running the shutdown.exe command line utility without the -i option. Any help... |
#2
|
||||
|
||||
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; } |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
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 |
#5
|
|||
|
|||
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!! |
|
|
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 |
Need Help With Masm Dialog Resource File Data | kittmaster | General Discussion | 2 | 02-18-2006 09:15 |