From cbf3e61d631985f0d45c76a2cc817638b6f77be3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 7 Jun 2025 22:50:23 +0200 Subject: [PATCH] [USERENV] Implement error reporting via error dialog (#8139) This feature is used to report errors when `LoadUserProfile()` fails. It is also meant to be used by other functions in the future. The error dialog is shown only when the `PI_NOUI` flag is _NOT_ set in `PROFILEINFO::dwFlags`. - Add support for retrieving USERENV-specific registry policies, in a systematic way. - Add support for "timed" dialogs that automatically close after a given timeout has elapsed. The default timeout is controlled by the `"ProfileDlgTimeOut"` policy: https://www.visualautomation.com/comprod/secure6/profile_.htm https://www.infania.net/misc/kbarchive/kb/196/Q196284/index.html - TODO for the future: report the error in the event log. - `LoadUserProfileW()`: Reset `ret` to `FALSE` after the call to `CreateUserProfileW()`; this allows to return failure in case any other function calls down the line fails. (`ret` is set to `TRUE` only when everything has succeeded.) --- dll/win32/userenv/internal.h | 41 ++++ dll/win32/userenv/lang/bg-BG.rc | 12 ++ dll/win32/userenv/lang/cs-CZ.rc | 12 ++ dll/win32/userenv/lang/da-DK.rc | 12 ++ dll/win32/userenv/lang/de-DE.rc | 12 ++ dll/win32/userenv/lang/el-GR.rc | 12 ++ dll/win32/userenv/lang/en-US.rc | 12 ++ dll/win32/userenv/lang/es-ES.rc | 12 ++ dll/win32/userenv/lang/eu-ES.rc | 12 ++ dll/win32/userenv/lang/fi-FI.rc | 12 ++ dll/win32/userenv/lang/fr-FR.rc | 12 ++ dll/win32/userenv/lang/he-IL.rc | 12 ++ dll/win32/userenv/lang/hu-HU.rc | 12 ++ dll/win32/userenv/lang/id-ID.rc | 12 ++ dll/win32/userenv/lang/it-IT.rc | 12 ++ dll/win32/userenv/lang/ja-JP.rc | 12 ++ dll/win32/userenv/lang/lt-LT.rc | 12 ++ dll/win32/userenv/lang/nl-NL.rc | 12 ++ dll/win32/userenv/lang/no-NO.rc | 12 ++ dll/win32/userenv/lang/pl-PL.rc | 12 ++ dll/win32/userenv/lang/pt-BR.rc | 12 ++ dll/win32/userenv/lang/pt-PT.rc | 12 ++ dll/win32/userenv/lang/ro-RO.rc | 12 ++ dll/win32/userenv/lang/ru-RU.rc | 12 ++ dll/win32/userenv/lang/sk-SK.rc | 12 ++ dll/win32/userenv/lang/sq-AL.rc | 15 +- dll/win32/userenv/lang/sv-SE.rc | 12 ++ dll/win32/userenv/lang/th-TH.rc | 12 ++ dll/win32/userenv/lang/tr-TR.rc | 12 ++ dll/win32/userenv/lang/uk-UA.rc | 12 ++ dll/win32/userenv/lang/zh-CN.rc | 12 ++ dll/win32/userenv/lang/zh-HK.rc | 12 ++ dll/win32/userenv/lang/zh-TW.rc | 12 ++ dll/win32/userenv/misc.c | 299 +++++++++++++++++++++++++++++- dll/win32/userenv/profile.c | 63 ++++--- dll/win32/userenv/res/userenv.ico | Bin 0 -> 22486 bytes dll/win32/userenv/resources.h | 12 ++ dll/win32/userenv/userenv.rc | 6 +- 38 files changed, 776 insertions(+), 32 deletions(-) create mode 100644 dll/win32/userenv/res/userenv.ico diff --git a/dll/win32/userenv/internal.h b/dll/win32/userenv/internal.h index 2c1cfeb79b4..c20d65205ba 100644 --- a/dll/win32/userenv/internal.h +++ b/dll/win32/userenv/internal.h @@ -80,6 +80,47 @@ AppendBackslash(LPWSTR String); PSECURITY_DESCRIPTOR CreateDefaultSecurityDescriptor(VOID); + +typedef struct _POLICY_VALUES +{ + PCWSTR ValueName; + DWORD Type; + PVOID Data; + DWORD Length; +} POLICY_VALUES, *PPOLICY_VALUES; + +LONG +GetPolicyValues( + _In_ HKEY hRootKey, + _Inout_ PPOLICY_VALUES QueryTable); + +LONG +GetPolicyValue( + _In_ HKEY hRootKey, + _In_ PCWSTR ValueName, + _In_ DWORD Type, + _Out_opt_ PVOID pData, + _Inout_opt_ PDWORD pcbData); + + +VOID +ReportErrorWorker( + _In_ DWORD dwFlags, + _In_ PCWSTR pszStr); + +VOID +ReportErrorV( + _In_ DWORD dwFlags, + _In_ PCWSTR pszStr, + _In_ va_list args); + +VOID +__cdecl +ReportError( + _In_ DWORD dwFlags, + _In_ PCWSTR pszStr, + ...); + /* profile.c */ BOOL AppendSystemPostfix(LPWSTR lpName, diff --git a/dll/win32/userenv/lang/bg-BG.rc b/dll/win32/userenv/lang/bg-BG.rc index 21da1b64683..07d8f220c48 100644 --- a/dll/win32/userenv/lang/bg-BG.rc +++ b/dll/win32/userenv/lang/bg-BG.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/cs-CZ.rc b/dll/win32/userenv/lang/cs-CZ.rc index 49bee685d17..7a9b34a0a80 100644 --- a/dll/win32/userenv/lang/cs-CZ.rc +++ b/dll/win32/userenv/lang/cs-CZ.rc @@ -5,6 +5,18 @@ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/da-DK.rc b/dll/win32/userenv/lang/da-DK.rc index 9324cf3deeb..213758057d2 100644 --- a/dll/win32/userenv/lang/da-DK.rc +++ b/dll/win32/userenv/lang/da-DK.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_DANISH, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/de-DE.rc b/dll/win32/userenv/lang/de-DE.rc index 6bb12707924..8e735411a80 100644 --- a/dll/win32/userenv/lang/de-DE.rc +++ b/dll/win32/userenv/lang/de-DE.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/el-GR.rc b/dll/win32/userenv/lang/el-GR.rc index 657e1c601cc..6cbb58f526f 100644 --- a/dll/win32/userenv/lang/el-GR.rc +++ b/dll/win32/userenv/lang/el-GR.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_GREEK, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/en-US.rc b/dll/win32/userenv/lang/en-US.rc index 448a99170cc..72a2dcfe0ae 100644 --- a/dll/win32/userenv/lang/en-US.rc +++ b/dll/win32/userenv/lang/en-US.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" // "User Environment" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/es-ES.rc b/dll/win32/userenv/lang/es-ES.rc index c5b361df779..3a67a11f3cd 100644 --- a/dll/win32/userenv/lang/es-ES.rc +++ b/dll/win32/userenv/lang/es-ES.rc @@ -9,6 +9,18 @@ LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/eu-ES.rc b/dll/win32/userenv/lang/eu-ES.rc index d5320123cb5..d8eea051e6d 100644 --- a/dll/win32/userenv/lang/eu-ES.rc +++ b/dll/win32/userenv/lang/eu-ES.rc @@ -7,6 +7,18 @@ LANGUAGE LANG_BASQUE, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/fi-FI.rc b/dll/win32/userenv/lang/fi-FI.rc index fc5e90c4d1f..86f177d5511 100644 --- a/dll/win32/userenv/lang/fi-FI.rc +++ b/dll/win32/userenv/lang/fi-FI.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_FINNISH, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/fr-FR.rc b/dll/win32/userenv/lang/fr-FR.rc index 0c2dd616c41..4c693c731ed 100644 --- a/dll/win32/userenv/lang/fr-FR.rc +++ b/dll/win32/userenv/lang/fr-FR.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "Profil utilisateur" // "Environnement utilisateur" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Temps restant :", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/he-IL.rc b/dll/win32/userenv/lang/he-IL.rc index 5d2ffedeef5..999fd063704 100644 --- a/dll/win32/userenv/lang/he-IL.rc +++ b/dll/win32/userenv/lang/he-IL.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_HEBREW, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/hu-HU.rc b/dll/win32/userenv/lang/hu-HU.rc index 9b47e11134e..3d631bda706 100644 --- a/dll/win32/userenv/lang/hu-HU.rc +++ b/dll/win32/userenv/lang/hu-HU.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/id-ID.rc b/dll/win32/userenv/lang/id-ID.rc index 6715e746e99..4bd2e619206 100644 --- a/dll/win32/userenv/lang/id-ID.rc +++ b/dll/win32/userenv/lang/id-ID.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_INDONESIAN, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/it-IT.rc b/dll/win32/userenv/lang/it-IT.rc index 704946d78ef..94dbbaba995 100644 --- a/dll/win32/userenv/lang/it-IT.rc +++ b/dll/win32/userenv/lang/it-IT.rc @@ -11,6 +11,18 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/ja-JP.rc b/dll/win32/userenv/lang/ja-JP.rc index b9aef4b977f..4a0ba5d7b39 100644 --- a/dll/win32/userenv/lang/ja-JP.rc +++ b/dll/win32/userenv/lang/ja-JP.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/lt-LT.rc b/dll/win32/userenv/lang/lt-LT.rc index 3a9fda5b1b9..b205adc8415 100644 --- a/dll/win32/userenv/lang/lt-LT.rc +++ b/dll/win32/userenv/lang/lt-LT.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_LITHUANIAN, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/nl-NL.rc b/dll/win32/userenv/lang/nl-NL.rc index bd648f3b8bf..b4a45624009 100644 --- a/dll/win32/userenv/lang/nl-NL.rc +++ b/dll/win32/userenv/lang/nl-NL.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/no-NO.rc b/dll/win32/userenv/lang/no-NO.rc index 5a1aeaf5481..11e5fb061d1 100644 --- a/dll/win32/userenv/lang/no-NO.rc +++ b/dll/win32/userenv/lang/no-NO.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/pl-PL.rc b/dll/win32/userenv/lang/pl-PL.rc index 46308e7002f..8a52ab2be9b 100644 --- a/dll/win32/userenv/lang/pl-PL.rc +++ b/dll/win32/userenv/lang/pl-PL.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/pt-BR.rc b/dll/win32/userenv/lang/pt-BR.rc index ecbee96f31b..9c0d6a780b6 100644 --- a/dll/win32/userenv/lang/pt-BR.rc +++ b/dll/win32/userenv/lang/pt-BR.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/pt-PT.rc b/dll/win32/userenv/lang/pt-PT.rc index 7f667b4726e..52797c47413 100644 --- a/dll/win32/userenv/lang/pt-PT.rc +++ b/dll/win32/userenv/lang/pt-PT.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/ro-RO.rc b/dll/win32/userenv/lang/ro-RO.rc index bd3a3f2778e..27c7e41e277 100644 --- a/dll/win32/userenv/lang/ro-RO.rc +++ b/dll/win32/userenv/lang/ro-RO.rc @@ -8,6 +8,18 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/ru-RU.rc b/dll/win32/userenv/lang/ru-RU.rc index 0705a7c4bde..8919d50b563 100644 --- a/dll/win32/userenv/lang/ru-RU.rc +++ b/dll/win32/userenv/lang/ru-RU.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/sk-SK.rc b/dll/win32/userenv/lang/sk-SK.rc index 5b476dd5068..7fcb4be0091 100644 --- a/dll/win32/userenv/lang/sk-SK.rc +++ b/dll/win32/userenv/lang/sk-SK.rc @@ -5,6 +5,18 @@ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/sq-AL.rc b/dll/win32/userenv/lang/sq-AL.rc index 5aab4ba11f0..42024239253 100644 --- a/dll/win32/userenv/lang/sq-AL.rc +++ b/dll/win32/userenv/lang/sq-AL.rc @@ -1,10 +1,21 @@ /* TRANSLATOR : Ardit Dani (Ard1t) (ardit.dani@gmail.com) * DATE OF TRANSLATION: 06-02-2014 -*/ - + */ LANGUAGE LANG_ALBANIAN, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/sv-SE.rc b/dll/win32/userenv/lang/sv-SE.rc index eb7c1ed3e2e..a6186c103b1 100644 --- a/dll/win32/userenv/lang/sv-SE.rc +++ b/dll/win32/userenv/lang/sv-SE.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/th-TH.rc b/dll/win32/userenv/lang/th-TH.rc index e85d0e8b802..3a2f8b75bc4 100644 --- a/dll/win32/userenv/lang/th-TH.rc +++ b/dll/win32/userenv/lang/th-TH.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_THAI, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/tr-TR.rc b/dll/win32/userenv/lang/tr-TR.rc index c0ce85e9aef..8359d30feb6 100644 --- a/dll/win32/userenv/lang/tr-TR.rc +++ b/dll/win32/userenv/lang/tr-TR.rc @@ -2,6 +2,18 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/uk-UA.rc b/dll/win32/userenv/lang/uk-UA.rc index a43432f02af..f4ee8628506 100644 --- a/dll/win32/userenv/lang/uk-UA.rc +++ b/dll/win32/userenv/lang/uk-UA.rc @@ -1,5 +1,17 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/zh-CN.rc b/dll/win32/userenv/lang/zh-CN.rc index d5bb8e2f521..0ae16667cf7 100644 --- a/dll/win32/userenv/lang/zh-CN.rc +++ b/dll/win32/userenv/lang/zh-CN.rc @@ -6,6 +6,18 @@ English folder names into Chinese, or it may cause problems in the system. */ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/zh-HK.rc b/dll/win32/userenv/lang/zh-HK.rc index 76fe017dd39..59252d773ea 100644 --- a/dll/win32/userenv/lang/zh-HK.rc +++ b/dll/win32/userenv/lang/zh-HK.rc @@ -12,6 +12,18 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_HONGKONG +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/lang/zh-TW.rc b/dll/win32/userenv/lang/zh-TW.rc index 019c3f1d122..c5b985f1605 100644 --- a/dll/win32/userenv/lang/zh-TW.rc +++ b/dll/win32/userenv/lang/zh-TW.rc @@ -5,6 +5,18 @@ English folder names into Chinese, or it may cause problems in the system. */ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL +IDD_ERRORDLG DIALOGEX 0, 0, 250, 95 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "User Profile" +FONT 8, "MS Shell Dlg" +BEGIN + ICON IDI_USERENV, IDC_STATIC, 6, 10, 18, 20 + DEFPUSHBUTTON "OK", IDOK, 190, 10, 50, 14, BS_NOTIFY | WS_TABSTOP + EDITTEXT IDC_ERRORDESC, 37, 10, 145, 66, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER | WS_TABSTOP + RTEXT "Time remaining:", IDC_TIMEOUTSTATIC, 172, 80, 54, 8 + LTEXT "", IDC_TIMEOUT, 230, 80, 12, 8 +END + /* See also: dll/win32/shell32/lang */ STRINGTABLE BEGIN diff --git a/dll/win32/userenv/misc.c b/dll/win32/userenv/misc.c index 214d8f1f448..cbf9000ab38 100644 --- a/dll/win32/userenv/misc.c +++ b/dll/win32/userenv/misc.c @@ -25,9 +25,10 @@ */ #include "precomp.h" - #include +#include "resources.h" + #define NDEBUG #include @@ -52,7 +53,6 @@ AppendBackslash(LPWSTR String) return &String[Length]; } - PSECURITY_DESCRIPTOR CreateDefaultSecurityDescriptor(VOID) { @@ -198,6 +198,299 @@ Cleanup: return pSD; } +/* Policy values helpers *****************************************************/ + +LONG +GetPolicyValues( + _In_ HKEY hRootKey, + _Inout_ PPOLICY_VALUES QueryTable) +{ + static PCWSTR PolicyKeys[] = + { + L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", + L"Software\\Policies\\Microsoft\\Windows\\System" + }; + + /* Retrieve the sought policy values in each of the policy keys */ + DWORD i; + for (i = 0; i < _countof(PolicyKeys); ++i) + { + HKEY hKey; + PPOLICY_VALUES Value; + DWORD dwType, cbData; + + if (RegOpenKeyExW(hRootKey, PolicyKeys[i], 0, + KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS) + { + continue; + } + + for (Value = QueryTable; Value->ValueName || Value->Data; ++Value) + { + /* Retrieve the type and data length for validation checks */ + if (RegQueryValueExW(hKey, Value->ValueName, NULL, + &dwType, NULL, &cbData) != ERROR_SUCCESS) + { + continue; + } + + /* Verify for compatible types */ + if ( ((Value->Type == REG_SZ || Value->Type == REG_EXPAND_SZ) && + (dwType == REG_SZ || dwType == REG_EXPAND_SZ)) || + (Value->Type == REG_DWORD && dwType == REG_DWORD) || + (Value->Type == REG_QWORD && dwType == REG_QWORD) || + (Value->Type == REG_MULTI_SZ && dwType == REG_MULTI_SZ) || + (Value->Type == REG_NONE || Value->Type == REG_BINARY) ) + { + /* Verify whether the given buffer can hold the data; + * if so, retrieve the actual data */ + if (Value->Length >= cbData) + { + RegQueryValueExW(hKey, Value->ValueName, NULL, + &dwType, Value->Data, &cbData); + } + } + } + RegCloseKey(hKey); + } + + return ERROR_SUCCESS; +} + +LONG +GetPolicyValue( + _In_ HKEY hRootKey, + _In_ PCWSTR ValueName, + _In_ DWORD Type, + _Out_opt_ PVOID pData, + _Inout_opt_ PDWORD pcbData) +{ + POLICY_VALUES QueryTable[] = + { + {ValueName, Type, pData, pcbData ? *pcbData : 0}, + {NULL, 0, NULL, 0} + }; + LONG ret = GetPolicyValues(hRootKey, QueryTable); + if ((ret == ERROR_SUCCESS) && pcbData) + *pcbData = QueryTable[0].Length; + + return ret; +} + +/* Timed dialog helpers ******************************************************/ + +#define IDT_DLGTIMER 1 + +typedef struct _TIMERDLG_BUTTON +{ + UINT uID; + INT_PTR nResult; +} TIMERDLG_BUTTON, *PTIMERDLG_BUTTON; + +typedef struct _TIMERDLG_INFO +{ + ULONG ulTimeout; ///< Dialog timeout. + WORD wDefBtnOnTimeout; ///< Index in button map for the default action on timeout. + WORD wDefBtnOnCancel; ///< Index in button map for the default action on dialog cancel. + TIMERDLG_BUTTON ButtonMap[2]; ///< Button/result map for the 1st and 2nd buttons. +} TIMERDLG_INFO, *PTIMERDLG_INFO; + +static INT_PTR +CALLBACK +TimerDlgProc( + _Inout_ PTIMERDLG_INFO Info, + _In_ HWND hDlg, + _In_ UINT uMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + { + /* Setup the timeout */ + if (Info->ulTimeout) + { + /* Display the countdown */ + WCHAR szTimeout[10]; + StringCchPrintfW(szTimeout, _countof(szTimeout), L"%d", Info->ulTimeout); + SetDlgItemTextW(hDlg, IDC_TIMEOUT, szTimeout); + + /* Set a 1-second timer */ + SetTimer(hDlg, IDT_DLGTIMER, 1000, NULL); + } + break; + } + + case WM_COMMAND: + { + PTIMERDLG_BUTTON ButtonMap = Info->ButtonMap; + WORD wDefBtnOnTimeout = min(Info->wDefBtnOnTimeout, _countof(Info->ButtonMap)-1); + WORD i; + + if (LOWORD(wParam) == IDCANCEL) + { + /* ESC or CANCEL button pressed: stop the timeout, + * close the dialog and return the default result */ + WORD wDefBtnOnCancel = min(Info->wDefBtnOnCancel, _countof(Info->ButtonMap)-1); + KillTimer(hDlg, IDT_DLGTIMER); + EndDialog(hDlg, ButtonMap[wDefBtnOnCancel].nResult); + break; + } + + for (i = 0; i < _countof(Info->ButtonMap); ++i) + { + if (LOWORD(wParam) == ButtonMap[i].uID) + { + if (HIWORD(wParam) == BN_CLICKED) + { + /* Button pressed: stop the timeout, close the + * dialog and return the corresponding result */ + KillTimer(hDlg, IDT_DLGTIMER); + EndDialog(hDlg, ButtonMap[i].nResult); + } + else if (HIWORD(wParam) == BN_KILLFOCUS) + { + /* Button lost the focus: stop the timeout + * only if this isn't the default action */ + if (i != wDefBtnOnTimeout) + break; + KillTimer(hDlg, IDT_DLGTIMER); + ShowWindow(GetDlgItem(hDlg, IDC_TIMEOUT), SW_HIDE); + ShowWindow(GetDlgItem(hDlg, IDC_TIMEOUTSTATIC), SW_HIDE); + } + break; + } + } + break; + } + + case WM_TIMER: + { + if (Info->ulTimeout < 1) + { + /* Timeout ended, close the dialog */ + WORD wDefBtnOnTimeout = min(Info->wDefBtnOnTimeout, _countof(Info->ButtonMap)-1); + PostMessageW(hDlg, WM_COMMAND, + MAKEWPARAM(Info->ButtonMap[wDefBtnOnTimeout].uID, BN_CLICKED), + 0); + } + else + { + /* Decrement and display the countdown */ + WCHAR szTimeout[10]; + StringCchPrintfW(szTimeout, _countof(szTimeout), L"%d", --(Info->ulTimeout)); + SetDlgItemTextW(hDlg, IDC_TIMEOUT, szTimeout); + } + break; + } + } + + return FALSE; +} + +/* Error reporting helpers ***************************************************/ + +typedef struct _ERRORDLG_PARAMS +{ + ULONG ulTimeout; + PCWSTR pszString; +} ERRORDLG_PARAMS, *PERRORDLG_PARAMS; + +static TIMERDLG_INFO ErrorDlg = +{ + 0, ///< Global error-dialog timeout, used for all displayed error dialogs. + 0, 1, + {{IDOK, TRUE}, {IDCANCEL, FALSE}} +}; + +static INT_PTR +CALLBACK +ErrorDlgProc( + _In_ HWND hDlg, + _In_ UINT uMsg, + _In_ WPARAM wParam, + _In_ LPARAM lParam) +{ + if (uMsg == WM_INITDIALOG) + { + PERRORDLG_PARAMS Params = (PERRORDLG_PARAMS)lParam; + + /* Position and focus the dialog */ + // CenterWindow(hDlg); // Already done with the DS_CENTER style. + SetForegroundWindow(hDlg); + + /* Display the message */ + SetDlgItemTextW(hDlg, IDC_ERRORDESC, Params->pszString); + + /* Setup the timeout and display the countdown */ + ErrorDlg.ulTimeout = Params->ulTimeout; + // SetWindowLongPtrW(hDlg, DWLP_USER, &ErrorDlg); + TimerDlgProc(&ErrorDlg, hDlg, WM_INITDIALOG, wParam, lParam); + return TRUE; + } + return TimerDlgProc(&ErrorDlg, hDlg, uMsg, wParam, lParam); +} + +VOID +ErrorDialogEx( + _In_ ULONG ulTimeout, + _In_ PCWSTR pszString) +{ + ERRORDLG_PARAMS Params = {ulTimeout, pszString}; + DialogBoxParamW(hInstance, MAKEINTRESOURCEW(IDD_ERRORDLG), + NULL, ErrorDlgProc, (LPARAM)&Params); +} + +VOID +ReportErrorWorker( + _In_ DWORD dwFlags, + _In_ PCWSTR pszStr) +{ + // TODO: Report event to Application log, "Userenv" source. + DPRINT1("%S", pszStr); + + if (!(dwFlags & PI_NOUI)) + { + /* Retrieve the "Profile Dialog Time Out" policy value, + * defaulting to 30 seconds timeout */ + ULONG ulTimeout = 30; + DWORD cbData = sizeof(ulTimeout); + GetPolicyValue(HKEY_LOCAL_MACHINE, + L"ProfileDlgTimeOut", + REG_DWORD, + &ulTimeout, + &cbData); + ErrorDialogEx(ulTimeout, pszStr); + } +} + +VOID +ReportErrorV( + _In_ DWORD dwFlags, + _In_ PCWSTR pszStr, + _In_ va_list args) +{ + WCHAR Buffer[4096]; + _vsnwprintf(Buffer, _countof(Buffer), pszStr, args); + ReportErrorWorker(dwFlags, Buffer); +} + +VOID +__cdecl +ReportError( + _In_ DWORD dwFlags, + _In_ PCWSTR pszStr, + ...) +{ + va_list args; + + va_start(args, pszStr); + ReportErrorV(dwFlags, pszStr, args); + va_end(args); +} + + /* Dynamic DLL loading interface **********************************************/ /* OLE32.DLL import table */ @@ -212,7 +505,6 @@ DYN_MODULE DynOle32 = } }; - /* * Use this function to load functions from other modules. We cannot statically * link to e.g. ole32.dll because those dlls would get loaded on startup with @@ -254,7 +546,6 @@ LoadDynamicImports(PDYN_MODULE Module, return TRUE; } - VOID UnloadDynamicImports(PDYN_FUNCS DynFuncs) { diff --git a/dll/win32/userenv/profile.c b/dll/win32/userenv/profile.c index 0e7a9295242..d23a8d118c1 100644 --- a/dll/win32/userenv/profile.c +++ b/dll/win32/userenv/profile.c @@ -2007,12 +2007,12 @@ LoadUserProfileW( _Inout_ LPPROFILEINFOW lpProfileInfo) { WCHAR szUserHivePath[MAX_PATH]; + DWORD dwLength = _countof(szUserHivePath); PTOKEN_USER UserSid = NULL; UNICODE_STRING SidString = { 0, 0, NULL }; HANDLE hProfileMutex = NULL; - LONG Error; + DWORD dwError = MAXDWORD; BOOL ret = FALSE; - DWORD dwLength = sizeof(szUserHivePath) / sizeof(szUserHivePath[0]); DPRINT("LoadUserProfileW(%p %p)\n", hToken, lpProfileInfo); @@ -2083,15 +2083,15 @@ LoadUserProfileW( if (GetTokenInformation(hToken, TokenUser, NULL, 0, &dwLength) || GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - DPRINT1 ("GetTokenInformation() failed\n"); + DPRINT1("GetTokenInformation() failed\n"); goto cleanup; } UserSid = (PTOKEN_USER)HeapAlloc(GetProcessHeap(), 0, dwLength); if (!UserSid) { + dwError = ERROR_NOT_ENOUGH_MEMORY; DPRINT1("HeapAlloc() failed\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); goto cleanup; } @@ -2108,6 +2108,7 @@ LoadUserProfileW( DPRINT1("CreateUserProfileW() failed\n"); goto cleanup; } + ret = FALSE; } /* Acquire restore privilege */ @@ -2117,20 +2118,19 @@ LoadUserProfileW( goto cleanup; } - /* Load user registry hive */ - Error = RegLoadKeyW(HKEY_USERS, - SidString.Buffer, - szUserHivePath); + /* Load the user registry hive */ + dwError = RegLoadKeyW(HKEY_USERS, + SidString.Buffer, + szUserHivePath); AcquireRemoveRestorePrivilege(FALSE); /* HACK: Do not fail if the profile has already been loaded! */ - if (Error == ERROR_SHARING_VIOLATION) - Error = ERROR_SUCCESS; + if (dwError == ERROR_SHARING_VIOLATION) + dwError = ERROR_SUCCESS; - if (Error != ERROR_SUCCESS) + if (dwError != ERROR_SUCCESS) { - DPRINT1("RegLoadKeyW() failed (Error %ld)\n", Error); - SetLastError((DWORD)Error); + DPRINT1("RegLoadKeyW() failed (Error %ld)\n", dwError); goto cleanup; } @@ -2140,29 +2140,30 @@ LoadUserProfileW( } /* Open future HKEY_CURRENT_USER */ - Error = RegOpenKeyExW(HKEY_USERS, - SidString.Buffer, - 0, - MAXIMUM_ALLOWED, - (PHKEY)&lpProfileInfo->hProfile); - if (Error != ERROR_SUCCESS) + dwError = RegOpenKeyExW(HKEY_USERS, + SidString.Buffer, + 0, + MAXIMUM_ALLOWED, + (PHKEY)&lpProfileInfo->hProfile); + if (dwError != ERROR_SUCCESS) { - DPRINT1("RegOpenKeyExW() failed (Error %ld)\n", Error); - SetLastError((DWORD)Error); + DPRINT1("RegOpenKeyExW() failed (Error %ld)\n", dwError); goto cleanup; } - Error = IncrementRefCount(SidString.Buffer, NULL); - if (Error != ERROR_SUCCESS) + dwError = IncrementRefCount(SidString.Buffer, NULL); + if (dwError != ERROR_SUCCESS) { - DPRINT1("IncrementRefCount() failed (Error %ld)\n", Error); - SetLastError((DWORD)Error); + DPRINT1("IncrementRefCount() failed (Error %ld)\n", dwError); goto cleanup; } ret = TRUE; cleanup: + if (dwError == MAXDWORD) + dwError = GetLastError(); + if (UserSid != NULL) HeapFree(GetProcessHeap(), 0, UserSid); @@ -2174,7 +2175,19 @@ cleanup: RtlFreeUnicodeString(&SidString); + /* Report any error occurred */ + if (!ret) + { + // TODO: Use a localized *.mc resource message* error. + ReportError(lpProfileInfo->dwFlags, + L"ReactOS could not load the locally stored user profile. " + L"Possible causes of this error include insufficient security rights or a corrupt local profile.\n" + L"\nError: %lu\n", + dwError); + } + DPRINT("LoadUserProfileW() done\n"); + SetLastError(dwError); return ret; } diff --git a/dll/win32/userenv/res/userenv.ico b/dll/win32/userenv/res/userenv.ico new file mode 100644 index 0000000000000000000000000000000000000000..cf1e2e4d809af2dd6af05201348dc25bb1b03f7e GIT binary patch literal 22486 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 +#include #include "resources.h" @@ -30,6 +32,8 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +IDI_USERENV ICON "res/userenv.ico" + /* * Everything specific to any language goes in one of the specific * files. Note that you can and may override resources which also have -- 2.51.2