mirror of
https://github.com/reactos/reactos.git
synced 2025-04-19 20:19:26 +00:00
[XDK][MSGINA]: Consistency codestyle fixes.
[SHELL32] - Use explicit unicode functions; - Use _countof instead of sizeof(foo)/sizeof(foo[0]); - Enable the shutdown privilege when we need it, and disable as soon as possible (code taken from taskmgr). svn path=/trunk/; revision=72719
This commit is contained in:
parent
b5fc396ab8
commit
a1895a9da6
3 changed files with 67 additions and 65 deletions
|
@ -13,7 +13,7 @@
|
||||||
13 stub -noname ShellStatusHostShuttingDown ; ()
|
13 stub -noname ShellStatusHostShuttingDown ; ()
|
||||||
14 stub -noname ShellNotifyThemeUserChange ; (long long)
|
14 stub -noname ShellNotifyThemeUserChange ; (long long)
|
||||||
15 stub -noname ShellSwitchWhenInteractiveReady ; (long long)
|
15 stub -noname ShellSwitchWhenInteractiveReady ; (long long)
|
||||||
16 stdcall -noname ShellDimScreen (ptr ptr)
|
16 stdcall -noname ShellDimScreen(ptr ptr)
|
||||||
17 stub -noname ShellInstallAccountFilterData ; ()
|
17 stub -noname ShellInstallAccountFilterData ; ()
|
||||||
18 stub -noname ShellStatusHostBegin ; (long)
|
18 stub -noname ShellStatusHostBegin ; (long)
|
||||||
19 stub -noname ShellIsUserInteractiveLogonAllowed ; (long)
|
19 stub -noname ShellIsUserInteractiveLogonAllowed ; (long)
|
||||||
|
|
|
@ -802,15 +802,15 @@ Cleanup:
|
||||||
*/
|
*/
|
||||||
static BOOL ConfirmDialog(HWND hWndOwner, UINT PromptId, UINT TitleId)
|
static BOOL ConfirmDialog(HWND hWndOwner, UINT PromptId, UINT TitleId)
|
||||||
{
|
{
|
||||||
WCHAR Prompt[256];
|
WCHAR Prompt[256];
|
||||||
WCHAR Title[256];
|
WCHAR Title[256];
|
||||||
|
|
||||||
LoadStringW(shell32_hInstance, PromptId, Prompt, sizeof(Prompt) / sizeof(WCHAR));
|
LoadStringW(shell32_hInstance, PromptId, Prompt, _countof(Prompt));
|
||||||
LoadStringW(shell32_hInstance, TitleId, Title, sizeof(Title) / sizeof(WCHAR));
|
LoadStringW(shell32_hInstance, TitleId, Title, _countof(Title));
|
||||||
return MessageBoxW(hWndOwner, Prompt, Title, MB_YESNO|MB_ICONQUESTION) == IDYES;
|
return MessageBoxW(hWndOwner, Prompt, Title, MB_YESNO | MB_ICONQUESTION) == IDYES;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef HRESULT (__stdcall *tShellDimScreen) (IUnknown** Unknown, HWND* hWindow);
|
typedef HRESULT (WINAPI *tShellDimScreen)(IUnknown** Unknown, HWND* hWindow);
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
CallShellDimScreen(IUnknown** pUnknown, HWND* hWindow)
|
CallShellDimScreen(IUnknown** pUnknown, HWND* hWindow)
|
||||||
|
@ -819,8 +819,8 @@ CallShellDimScreen(IUnknown** pUnknown, HWND* hWindow)
|
||||||
static BOOL Initialized = FALSE;
|
static BOOL Initialized = FALSE;
|
||||||
if (!Initialized)
|
if (!Initialized)
|
||||||
{
|
{
|
||||||
HMODULE mod = LoadLibrary(TEXT("msgina.dll"));
|
HMODULE mod = LoadLibraryW(L"msgina.dll");
|
||||||
ShellDimScreen = (tShellDimScreen)GetProcAddress(mod, MAKEINTRESOURCEA(16));
|
ShellDimScreen = (tShellDimScreen)GetProcAddress(mod, (LPCSTR)16);
|
||||||
Initialized = TRUE;
|
Initialized = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -831,6 +831,33 @@ CallShellDimScreen(IUnknown** pUnknown, HWND* hWindow)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Used to get the shutdown privilege */
|
||||||
|
static BOOL
|
||||||
|
EnablePrivilege(LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege)
|
||||||
|
{
|
||||||
|
BOOL Success;
|
||||||
|
HANDLE hToken;
|
||||||
|
TOKEN_PRIVILEGES tp;
|
||||||
|
|
||||||
|
Success = OpenProcessToken(GetCurrentProcess(),
|
||||||
|
TOKEN_ADJUST_PRIVILEGES,
|
||||||
|
&hToken);
|
||||||
|
if (!Success) return Success;
|
||||||
|
|
||||||
|
Success = LookupPrivilegeValueW(NULL,
|
||||||
|
lpszPrivilegeName,
|
||||||
|
&tp.Privileges[0].Luid);
|
||||||
|
if (!Success) goto Quit;
|
||||||
|
|
||||||
|
tp.PrivilegeCount = 1;
|
||||||
|
tp.Privileges[0].Attributes = (bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0);
|
||||||
|
|
||||||
|
Success = AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL);
|
||||||
|
|
||||||
|
Quit:
|
||||||
|
CloseHandle(hToken);
|
||||||
|
return Success;
|
||||||
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* RestartDialogEx [SHELL32.730]
|
* RestartDialogEx [SHELL32.730]
|
||||||
|
@ -842,25 +869,16 @@ int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, D
|
||||||
|
|
||||||
CComPtr<IUnknown> fadeHandler;
|
CComPtr<IUnknown> fadeHandler;
|
||||||
HWND parent;
|
HWND parent;
|
||||||
|
|
||||||
if (!CallShellDimScreen(&fadeHandler, &parent))
|
if (!CallShellDimScreen(&fadeHandler, &parent))
|
||||||
parent = hWndOwner;
|
parent = hWndOwner;
|
||||||
|
|
||||||
/* FIXME: use lpwstrReason */
|
/* FIXME: use lpwstrReason */
|
||||||
if (ConfirmDialog(parent, IDS_RESTART_PROMPT, IDS_RESTART_TITLE))
|
if (ConfirmDialog(parent, IDS_RESTART_PROMPT, IDS_RESTART_TITLE))
|
||||||
{
|
{
|
||||||
HANDLE hToken;
|
EnablePrivilege(L"SeShutdownPrivilege", TRUE);
|
||||||
TOKEN_PRIVILEGES npr;
|
|
||||||
|
|
||||||
/* enable the shutdown privilege for the current process */
|
|
||||||
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
|
|
||||||
{
|
|
||||||
LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid);
|
|
||||||
npr.PrivilegeCount = 1;
|
|
||||||
npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
||||||
AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0);
|
|
||||||
CloseHandle(hToken);
|
|
||||||
}
|
|
||||||
ExitWindowsEx(EWX_REBOOT, uReason);
|
ExitWindowsEx(EWX_REBOOT, uReason);
|
||||||
|
EnablePrivilege(L"SeShutdownPrivilege", FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -870,21 +888,20 @@ int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, D
|
||||||
* LogOffDialogProc
|
* LogOffDialogProc
|
||||||
*
|
*
|
||||||
* NOTES: Used to make the Log Off dialog work
|
* NOTES: Used to make the Log Off dialog work
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
INT_PTR CALLBACK LogOffDialogProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
|
INT_PTR CALLBACK LogOffDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch(Message)
|
switch (uMsg)
|
||||||
{
|
{
|
||||||
case WM_INITDIALOG:
|
case WM_INITDIALOG:
|
||||||
{
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
|
||||||
case WM_CLOSE:
|
case WM_CLOSE:
|
||||||
EndDialog(hwnd, IDCANCEL);
|
EndDialog(hwnd, IDCANCEL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_COMMAND:
|
case WM_COMMAND:
|
||||||
switch(LOWORD(wParam))
|
switch (LOWORD(wParam))
|
||||||
{
|
{
|
||||||
case IDOK:
|
case IDOK:
|
||||||
ExitWindowsEx(EWX_LOGOFF, 0);
|
ExitWindowsEx(EWX_LOGOFF, 0);
|
||||||
|
@ -894,13 +911,13 @@ INT_PTR CALLBACK LogOffDialogProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* LogoffWindowsDialog [SHELL32.54]
|
* LogoffWindowsDialog [SHELL32.54]
|
||||||
*/
|
*/
|
||||||
|
@ -909,14 +926,14 @@ EXTERN_C int WINAPI LogoffWindowsDialog(HWND hWndOwner)
|
||||||
{
|
{
|
||||||
CComPtr<IUnknown> fadeHandler;
|
CComPtr<IUnknown> fadeHandler;
|
||||||
HWND parent;
|
HWND parent;
|
||||||
|
|
||||||
if (!CallShellDimScreen(&fadeHandler, &parent))
|
if (!CallShellDimScreen(&fadeHandler, &parent))
|
||||||
parent = hWndOwner;
|
parent = hWndOwner;
|
||||||
|
|
||||||
DialogBox(shell32_hInstance, MAKEINTRESOURCE(IDD_LOG_OFF), parent, LogOffDialogProc);
|
DialogBoxW(shell32_hInstance, MAKEINTRESOURCEW(IDD_LOG_OFF), parent, LogOffDialogProc);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* RestartDialog [SHELL32.59]
|
* RestartDialog [SHELL32.59]
|
||||||
*/
|
*/
|
||||||
|
@ -926,27 +943,6 @@ int WINAPI RestartDialog(HWND hWndOwner, LPCWSTR lpstrReason, DWORD uFlags)
|
||||||
return RestartDialogEx(hWndOwner, lpstrReason, uFlags, 0);
|
return RestartDialogEx(hWndOwner, lpstrReason, uFlags, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* Used to get the shutdown privilege
|
|
||||||
*/
|
|
||||||
VOID ExitWindows_GetShutdownPrivilege(VOID)
|
|
||||||
{
|
|
||||||
HANDLE hToken;
|
|
||||||
TOKEN_PRIVILEGES npr;
|
|
||||||
|
|
||||||
/* enable shut down privilege for current process */
|
|
||||||
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
|
|
||||||
{
|
|
||||||
LookupPrivilegeValueA(0, "SeShutdownPrivilege", &npr.Privileges[0].Luid);
|
|
||||||
|
|
||||||
npr.PrivilegeCount = 1;
|
|
||||||
npr.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
|
|
||||||
AdjustTokenPrivileges(hToken, FALSE, &npr, 0, 0, 0);
|
|
||||||
|
|
||||||
CloseHandle(hToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* ExitWindowsDialog_backup
|
* ExitWindowsDialog_backup
|
||||||
*
|
*
|
||||||
|
@ -960,8 +956,9 @@ VOID ExitWindowsDialog_backup(HWND hWndOwner)
|
||||||
|
|
||||||
if (ConfirmDialog(hWndOwner, IDS_SHUTDOWN_PROMPT, IDS_SHUTDOWN_TITLE))
|
if (ConfirmDialog(hWndOwner, IDS_SHUTDOWN_PROMPT, IDS_SHUTDOWN_TITLE))
|
||||||
{
|
{
|
||||||
ExitWindows_GetShutdownPrivilege();
|
EnablePrivilege(L"SeShutdownPrivilege", TRUE);
|
||||||
ExitWindowsEx(EWX_SHUTDOWN, 0);
|
ExitWindowsEx(EWX_SHUTDOWN, 0);
|
||||||
|
EnablePrivilege(L"SeShutdownPrivilege", FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -979,7 +976,7 @@ VOID ExitWindowsDialog_backup(HWND hWndOwner)
|
||||||
void WINAPI ExitWindowsDialog(HWND hWndOwner)
|
void WINAPI ExitWindowsDialog(HWND hWndOwner)
|
||||||
{
|
{
|
||||||
typedef DWORD (WINAPI *ShellShFunc)(HWND hParent, WCHAR *Username, BOOL bHideLogoff);
|
typedef DWORD (WINAPI *ShellShFunc)(HWND hParent, WCHAR *Username, BOOL bHideLogoff);
|
||||||
HINSTANCE msginaDll = LoadLibraryA("msgina.dll");
|
HINSTANCE msginaDll = LoadLibraryW(L"msgina.dll");
|
||||||
|
|
||||||
TRACE("(%p)\n", hWndOwner);
|
TRACE("(%p)\n", hWndOwner);
|
||||||
|
|
||||||
|
@ -990,21 +987,21 @@ void WINAPI ExitWindowsDialog(HWND hWndOwner)
|
||||||
|
|
||||||
/* If the DLL cannot be found for any reason, then it simply uses a
|
/* If the DLL cannot be found for any reason, then it simply uses a
|
||||||
dialog box to ask if the user wants to shut down the computer. */
|
dialog box to ask if the user wants to shut down the computer. */
|
||||||
if(!msginaDll)
|
if (!msginaDll)
|
||||||
{
|
{
|
||||||
TRACE("Unable to load msgina.dll.\n");
|
TRACE("Unable to load msgina.dll.\n");
|
||||||
ExitWindowsDialog_backup(parent);
|
ExitWindowsDialog_backup(parent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShellShFunc pShellShutdownDialog = (ShellShFunc) GetProcAddress(msginaDll, "ShellShutdownDialog");
|
ShellShFunc pShellShutdownDialog = (ShellShFunc)GetProcAddress(msginaDll, "ShellShutdownDialog");
|
||||||
|
|
||||||
if(pShellShutdownDialog)
|
if (pShellShutdownDialog)
|
||||||
{
|
{
|
||||||
/* Actually call the function */
|
/* Actually call the function */
|
||||||
DWORD returnValue = pShellShutdownDialog(parent, NULL, FALSE);
|
DWORD returnValue = pShellShutdownDialog(parent, NULL, FALSE);
|
||||||
|
|
||||||
switch(returnValue)
|
switch (returnValue)
|
||||||
{
|
{
|
||||||
case 0x01: /* Log off user */
|
case 0x01: /* Log off user */
|
||||||
{
|
{
|
||||||
|
@ -1013,8 +1010,9 @@ void WINAPI ExitWindowsDialog(HWND hWndOwner)
|
||||||
}
|
}
|
||||||
case 0x02: /* Shut down */
|
case 0x02: /* Shut down */
|
||||||
{
|
{
|
||||||
ExitWindows_GetShutdownPrivilege();
|
EnablePrivilege(L"SeShutdownPrivilege", TRUE);
|
||||||
ExitWindowsEx(EWX_SHUTDOWN, 0);
|
ExitWindowsEx(EWX_SHUTDOWN, 0);
|
||||||
|
EnablePrivilege(L"SeShutdownPrivilege", FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x03: /* Install Updates/Shutdown (?) */
|
case 0x03: /* Install Updates/Shutdown (?) */
|
||||||
|
@ -1023,25 +1021,28 @@ void WINAPI ExitWindowsDialog(HWND hWndOwner)
|
||||||
}
|
}
|
||||||
case 0x04: /* Reboot */
|
case 0x04: /* Reboot */
|
||||||
{
|
{
|
||||||
ExitWindows_GetShutdownPrivilege();
|
EnablePrivilege(L"SeShutdownPrivilege", TRUE);
|
||||||
ExitWindowsEx(EWX_REBOOT, 0);
|
ExitWindowsEx(EWX_REBOOT, 0);
|
||||||
|
EnablePrivilege(L"SeShutdownPrivilege", FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x10: /* Sleep */
|
case 0x10: /* Sleep */
|
||||||
{
|
{
|
||||||
if(IsPwrSuspendAllowed())
|
if (IsPwrSuspendAllowed())
|
||||||
{
|
{
|
||||||
ExitWindows_GetShutdownPrivilege();
|
EnablePrivilege(L"SeShutdownPrivilege", TRUE);
|
||||||
SetSuspendState(FALSE, FALSE, FALSE);
|
SetSuspendState(FALSE, FALSE, FALSE);
|
||||||
|
EnablePrivilege(L"SeShutdownPrivilege", FALSE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x40: /* Hibernate */
|
case 0x40: /* Hibernate */
|
||||||
{
|
{
|
||||||
if(IsPwrHibernateAllowed())
|
if (IsPwrHibernateAllowed())
|
||||||
{
|
{
|
||||||
ExitWindows_GetShutdownPrivilege();
|
EnablePrivilege(L"SeShutdownPrivilege", TRUE);
|
||||||
SetSuspendState(TRUE, FALSE, TRUE);
|
SetSuspendState(TRUE, FALSE, TRUE);
|
||||||
|
EnablePrivilege(L"SeShutdownPrivilege", FALSE);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1054,7 +1055,8 @@ void WINAPI ExitWindowsDialog(HWND hWndOwner)
|
||||||
{
|
{
|
||||||
/* If the function cannot be found, then revert to using the backup solution */
|
/* If the function cannot be found, then revert to using the backup solution */
|
||||||
TRACE("Unable to find the 'ShellShutdownDialog' function");
|
TRACE("Unable to find the 'ShellShutdownDialog' function");
|
||||||
FreeLibrary(msginaDll);
|
|
||||||
ExitWindowsDialog_backup(parent);
|
ExitWindowsDialog_backup(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FreeLibrary(msginaDll);
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ typedef struct _ACL {
|
||||||
/* Privilege attributes */
|
/* Privilege attributes */
|
||||||
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
|
#define SE_PRIVILEGE_ENABLED_BY_DEFAULT (0x00000001L)
|
||||||
#define SE_PRIVILEGE_ENABLED (0x00000002L)
|
#define SE_PRIVILEGE_ENABLED (0x00000002L)
|
||||||
#define SE_PRIVILEGE_REMOVED (0X00000004L)
|
#define SE_PRIVILEGE_REMOVED (0x00000004L)
|
||||||
#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
|
#define SE_PRIVILEGE_USED_FOR_ACCESS (0x80000000L)
|
||||||
|
|
||||||
#define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
|
#define SE_PRIVILEGE_VALID_ATTRIBUTES (SE_PRIVILEGE_ENABLED_BY_DEFAULT | \
|
||||||
|
|
Loading…
Reference in a new issue