Exetools  

Go Back   Exetools > General > General Discussion

Notices

Reply
 
Thread Tools Display Modes
  #1  
Old 10-14-2009, 07:17
nino nino is offline
Friend
 
Join Date: Jan 2002
Posts: 58
Rept. Given: 0
Rept. Rcvd 2 Times in 1 Post
Thanks Given: 0
Thanks Rcvd at 1 Time in 1 Post
nino Reputation: 2
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...
Reply With Quote
  #2  
Old 10-14-2009, 18:43
Git's Avatar
Git Git is offline
Old Git
 
Join Date: Mar 2002
Location: Torino
Posts: 1,115
Rept. Given: 220
Rept. Rcvd 265 Times in 157 Posts
Thanks Given: 108
Thanks Rcvd at 216 Times in 124 Posts
Git Reputation: 200-299 Git Reputation: 200-299 Git Reputation: 200-299
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;
}
Git
Reply With Quote
  #3  
Old 10-15-2009, 00:40
nino nino is offline
Friend
 
Join Date: Jan 2002
Posts: 58
Rept. Given: 0
Rept. Rcvd 2 Times in 1 Post
Thanks Given: 0
Thanks Rcvd at 1 Time in 1 Post
nino Reputation: 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.
Reply With Quote
  #4  
Old 10-16-2009, 12:16
bilbo bilbo is offline
Friend
 
Join Date: Jul 2004
Posts: 103
Rept. Given: 36
Rept. Rcvd 15 Times in 12 Posts
Thanks Given: 15
Thanks Rcvd at 17 Times in 11 Posts
bilbo Reputation: 15
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
Reply With Quote
  #5  
Old 10-17-2009, 10:18
nino nino is offline
Friend
 
Join Date: Jan 2002
Posts: 58
Rept. Given: 0
Rept. Rcvd 2 Times in 1 Post
Thanks Given: 0
Thanks Rcvd at 1 Time in 1 Post
nino Reputation: 2
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!!
Reply With Quote
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off


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


All times are GMT +8. The time now is 06:20.


Always Your Best Friend: Aaron, JMI, ahmadmansoor, ZeNiX, chessgod101
( 1998 - 2024 )