From f86fdfb526acb4fe867837399556a0859c6ca915 Mon Sep 17 00:00:00 2001 From: Andrei Miloiu Date: Sat, 2 Sep 2023 16:43:38 +0300 Subject: [PATCH 01/27] [MSGINA] Update Romanian (ro-RO) translation (#5636) --- dll/win32/msgina/lang/ro-RO.rc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dll/win32/msgina/lang/ro-RO.rc b/dll/win32/msgina/lang/ro-RO.rc index cfbc268afd6..c5b896fa831 100644 --- a/dll/win32/msgina/lang/ro-RO.rc +++ b/dll/win32/msgina/lang/ro-RO.rc @@ -4,7 +4,7 @@ * PURPOSE: Romanian resource file * TRANSLATORS: Copyright 2009 Petru Dimitriu * Copyright 2011-2019 Ștefan Fulea - * Copyright 2022 Andrei Miloiu + * Copyright 2022-2023 Andrei Miloiu */ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL @@ -243,10 +243,10 @@ BEGIN IDS_INVALIDLOGONHOURS "Contul dumneavoastră are restricții de timp care vă împiedică să vă conectați în acest moment. Încercați mai târziu." IDS_INVALIDWORKSTATION "Contul dumneavoastră este configurat pentru a vă preveni în a folosi acest calculator. Încercați la alt calculator." IDS_ACCOUNTRESTRICTION "Eșec în conectarea dumneavoastră din cauza unei restricții a contului." - IDS_EMERGENCYLOGOFFTITLE "Log Off ReactOS" - IDS_EMERGENCYLOGOFF "Click OK to immediately log off. Any unsaved data will be lost. Use this only as a last resort." - IDS_EMERGENCYRESTARTTITLE "Emergency restart" - IDS_EMERGENCYRESTART "Click OK to immediately restart. Any unsaved data will be lost. Use this only as a last resort." + IDS_EMERGENCYLOGOFFTITLE "Deautentificare din ReactOS" + IDS_EMERGENCYLOGOFF "Apăsați Confirmă pentru a vă deautentifica imediat. Toate datele nepăstrate vor fi pierdute. Folosiți acest lucru doar ca ultimă soluție." + IDS_EMERGENCYRESTARTTITLE "Repornire de urgență" + IDS_EMERGENCYRESTART "Apăsați Confirmă pentru a vă reporni calculatorul imediat. Toate datele nepăstrate vor fi pierdute. Folosiți acest lucru doar ca ultimă soluție." END /* Shutdown Dialog Strings */ From f1549bc251c626cc90751d7b7b59a4370c0e4c98 Mon Sep 17 00:00:00 2001 From: Andrei Miloiu Date: Sat, 2 Sep 2023 16:44:10 +0300 Subject: [PATCH 02/27] [REGEDIT] Update Romanian (ro-RO) translation (#5632) --- base/applications/regedit/lang/ro-RO.rc | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/base/applications/regedit/lang/ro-RO.rc b/base/applications/regedit/lang/ro-RO.rc index b3b0899923d..83edfeb06ce 100644 --- a/base/applications/regedit/lang/ro-RO.rc +++ b/base/applications/regedit/lang/ro-RO.rc @@ -431,7 +431,7 @@ BEGIN IDS_FLT_REGEDIT4_FLT "*.reg" IDS_FLT_ALLFILES "Orice fișier (*.*)" IDS_FLT_ALLFILES_FLT "*.*" - IDS_FLT_TXTFILES "Text Files (*.txt)" + IDS_FLT_TXTFILES "Fișiere text (*.txt)" IDS_FLT_TXTFILES_FLT "*.txt" END @@ -530,16 +530,16 @@ END STRINGTABLE BEGIN - IDS_FIELD_KEY_NAME "Key Name:" - IDS_FIELD_CLASS_NAME "Class Name:" - IDS_NO_CLASS_NAME "" - IDS_NULL_TIMESTAMP "" - IDS_FIELD_NAME " Name:" - IDS_FIELD_TYPE " Type:" - IDS_FIELD_DATA " Data:" - IDS_FIELD_LASTWRITE "Last Write Time:" - IDS_UNKNOWN "" - IDS_VALUE_INDEX "Value %d" + IDS_FIELD_KEY_NAME "Numele cheii:" + IDS_FIELD_CLASS_NAME "Numele clasei:" + IDS_NO_CLASS_NAME "" + IDS_NULL_TIMESTAMP "" + IDS_FIELD_NAME " Nume:" + IDS_FIELD_TYPE " Tip:" + IDS_FIELD_DATA " Dată:" + IDS_FIELD_LASTWRITE "Ultima dată a scrierii:" + IDS_UNKNOWN "" + IDS_VALUE_INDEX "Valoare %d" END /*****************************************************************/ From ed9d2a06b08e3642109bc072f8d7c445a2c16cbf Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Sat, 2 Sep 2023 20:16:22 +0200 Subject: [PATCH 03/27] [SHELL32] Handle HotKey and ShowCmd on the shortcut property page (#5638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Stanislav Motylkov Co-authored-by: Hermès BÉLUSCA - MAÏTO Co-authored-by: Katayama Hirofumi MZ --- dll/win32/shell32/CShellLink.cpp | 29 +++++++++++++++++++++++++++++ dll/win32/shell32/lang/bg-BG.rc | 7 ++++++- dll/win32/shell32/lang/ca-ES.rc | 7 ++++++- dll/win32/shell32/lang/cs-CZ.rc | 7 ++++++- dll/win32/shell32/lang/da-DK.rc | 7 ++++++- dll/win32/shell32/lang/de-DE.rc | 7 ++++++- dll/win32/shell32/lang/el-GR.rc | 7 ++++++- dll/win32/shell32/lang/en-GB.rc | 7 ++++++- dll/win32/shell32/lang/en-US.rc | 7 ++++++- dll/win32/shell32/lang/es-ES.rc | 7 ++++++- dll/win32/shell32/lang/et-EE.rc | 7 ++++++- dll/win32/shell32/lang/eu-ES.rc | 7 ++++++- dll/win32/shell32/lang/fi-FI.rc | 7 ++++++- dll/win32/shell32/lang/fr-FR.rc | 7 ++++++- dll/win32/shell32/lang/he-IL.rc | 7 ++++++- dll/win32/shell32/lang/hi-IN.rc | 7 ++++++- dll/win32/shell32/lang/hu-HU.rc | 7 ++++++- dll/win32/shell32/lang/id-ID.rc | 7 ++++++- dll/win32/shell32/lang/it-IT.rc | 7 ++++++- dll/win32/shell32/lang/ja-JP.rc | 7 ++++++- dll/win32/shell32/lang/ko-KR.rc | 7 ++++++- dll/win32/shell32/lang/nl-NL.rc | 7 ++++++- dll/win32/shell32/lang/no-NO.rc | 7 ++++++- dll/win32/shell32/lang/pl-PL.rc | 7 ++++++- dll/win32/shell32/lang/pt-BR.rc | 7 ++++++- dll/win32/shell32/lang/pt-PT.rc | 7 ++++++- dll/win32/shell32/lang/ro-RO.rc | 7 ++++++- dll/win32/shell32/lang/ru-RU.rc | 7 ++++++- dll/win32/shell32/lang/sk-SK.rc | 7 ++++++- dll/win32/shell32/lang/sl-SI.rc | 7 ++++++- dll/win32/shell32/lang/sq-AL.rc | 7 ++++++- dll/win32/shell32/lang/sv-SE.rc | 7 ++++++- dll/win32/shell32/lang/tr-TR.rc | 7 ++++++- dll/win32/shell32/lang/uk-UA.rc | 7 ++++++- dll/win32/shell32/lang/zh-CN.rc | 7 ++++++- dll/win32/shell32/lang/zh-HK.rc | 7 ++++++- dll/win32/shell32/lang/zh-TW.rc | 7 ++++++- dll/win32/shell32/shresdef.h | 5 +++++ 38 files changed, 250 insertions(+), 36 deletions(-) diff --git a/dll/win32/shell32/CShellLink.cpp b/dll/win32/shell32/CShellLink.cpp index 7ad91f5c2d9..d8951860328 100644 --- a/dll/win32/shell32/CShellLink.cpp +++ b/dll/win32/shell32/CShellLink.cpp @@ -2802,6 +2802,27 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam) if (m_sDescription) SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_COMMENT_EDIT, m_sDescription); + /* Hot key */ + SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_KEY_HOTKEY, HKM_SETHOTKEY, m_Header.wHotKey, 0); + + /* Run */ + const WORD runstrings[] = { IDS_SHORTCUT_RUN_NORMAL, IDS_SHORTCUT_RUN_MIN, IDS_SHORTCUT_RUN_MAX }; + const DWORD runshowcmd[] = { SW_SHOWNORMAL, SW_SHOWMINNOACTIVE, SW_SHOWMAXIMIZED }; + HWND hRunCombo = GetDlgItem(hwndDlg, IDC_SHORTCUT_RUN_COMBO); + for (UINT i = 0; i < _countof(runstrings); ++i) + { + WCHAR buf[MAX_PATH]; + if (!LoadStringW(shell32_hInstance, runstrings[i], buf, _countof(buf))) + break; + + int index = SendMessageW(hRunCombo, CB_ADDSTRING, 0, (LPARAM)buf); + if (index < 0) + continue; + SendMessageW(hRunCombo, CB_SETITEMDATA, index, runshowcmd[i]); + if (!i || m_Header.nShowCommand == runshowcmd[i]) + SendMessageW(hRunCombo, CB_SETCURSEL, index, 0); + } + /* auto-completion */ SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_TARGET_TEXT), SHACF_DEFAULT); SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_START_IN_EDIT), SHACF_DEFAULT); @@ -2923,6 +2944,14 @@ LRESULT CShellLink::OnNotify(HWND hwndDlg, int idFrom, LPNMHDR pnmhdr) HeapFree(GetProcessHeap(), 0, unquoted); + m_Header.wHotKey = (WORD)SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_KEY_HOTKEY, HKM_GETHOTKEY, 0, 0); + + int index = (int)SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_RUN_COMBO, CB_GETCURSEL, 0, 0); + if (index != CB_ERR) + { + m_Header.nShowCommand = (UINT)SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_RUN_COMBO, CB_GETITEMDATA, index, 0); + } + TRACE("This %p m_sLinkPath %S\n", this, m_sLinkPath); Save(m_sLinkPath, TRUE); SHChangeNotify(SHCNE_UPDATEITEM, SHCNF_PATHW, m_sLinkPath, NULL); diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc index f748b48b598..4482ced2728 100644 --- a/dll/win32/shell32/lang/bg-BG.rc +++ b/dll/win32/shell32/lang/bg-BG.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Бърз &клавиш:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Из&пълняване:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Забележка:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Намиране на целта...", IDC_SHORTCUT_FIND, 10, 115, 75, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Пусков изборник\\Приложения" IDS_PERSONAL "Книжа" diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc index 8fe2ea35f20..6cfafbc1556 100644 --- a/dll/win32/shell32/lang/ca-ES.rc +++ b/dll/win32/shell32/lang/ca-ES.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "My Documents" diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc index 779d6ee557a..79b66910561 100644 --- a/dll/win32/shell32/lang/cs-CZ.rc +++ b/dll/win32/shell32/lang/cs-CZ.rc @@ -197,7 +197,7 @@ BEGIN LTEXT "Klávesová zk&ratka:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Spusti&t:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Komentář:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Najít cíl...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -859,6 +859,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Procházet" IDS_RUNDLG_BROWSE_FILTER "Spustitelné soubory (*.exe)\0*.exe\0Všechnysoubory (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Nabídka Start\\Programy" IDS_PERSONAL "Dokumenty" diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc index b3bb48b457d..d7b93f3afd5 100644 --- a/dll/win32/shell32/lang/da-DK.rc +++ b/dll/win32/shell32/lang/da-DK.rc @@ -197,7 +197,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -859,6 +859,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programmer" IDS_PERSONAL "Mine Dokumenter" diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc index 9ac58358ae9..30dfc52306e 100644 --- a/dll/win32/shell32/lang/de-DE.rc +++ b/dll/win32/shell32/lang/de-DE.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Kurztasten:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Ausfüh&ren:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&ommentar:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Ziel finden...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -854,6 +854,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Durchsuchen" IDS_RUNDLG_BROWSE_FILTER "Ausführbare Dateien (*.exe)\0*.exe\0Alle Dateien (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Startmenü\\Programme" IDS_PERSONAL "Eigene Dateien" diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc index 5ae43f646e1..1748705409b 100644 --- a/dll/win32/shell32/lang/el-GR.rc +++ b/dll/win32/shell32/lang/el-GR.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Πλήκτρο &συντόμευσης:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Εκ&τέλεση:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Σχόλια:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Εύρεση προορισμού...", IDC_SHORTCUT_FIND, 10, 115, 71, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "Τα έγγραφά μου" diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc index e7415d373ae..3c554179d20 100644 --- a/dll/win32/shell32/lang/en-GB.rc +++ b/dll/win32/shell32/lang/en-GB.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "My Documents" diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index 80920dbd914..be8e2c5b3bb 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "My Documents" diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc index bfbfaa3bde2..d231def1651 100644 --- a/dll/win32/shell32/lang/es-ES.rc +++ b/dll/win32/shell32/lang/es-ES.rc @@ -200,7 +200,7 @@ BEGIN LTEXT "&Tecla de método abreviado:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Ejecutar:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omentario:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Abrir ubicación...", IDC_SHORTCUT_FIND, 9, 172, 62, 14, ES_LEFT @@ -862,6 +862,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Examinar" IDS_RUNDLG_BROWSE_FILTER "Archivos ejecutables (*.exe)\0*.exe\0Todos los archivos (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menú Inicio\\Programas" IDS_PERSONAL "Mis documentos" diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc index c83ae8ff1d8..82297e87ea5 100644 --- a/dll/win32/shell32/lang/et-EE.rc +++ b/dll/win32/shell32/lang/et-EE.rc @@ -198,7 +198,7 @@ BEGIN LTEXT "Kiirkla&hv:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Käivita:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&ommentaar:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Otsi sihtüksus...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -860,6 +860,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Sirvi" IDS_RUNDLG_BROWSE_FILTER "Rakendatavad failid (*.exe)\0*.exe\0Kõik failid (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "Minu dokumendid" diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc index 2e20f6d6cc8..05942f367f5 100644 --- a/dll/win32/shell32/lang/eu-ES.rc +++ b/dll/win32/shell32/lang/eu-ES.rc @@ -198,7 +198,7 @@ BEGIN LTEXT "Las&ter-tekla:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Exe&kutatu:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Iruzkina:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Bilatu helburua...", IDC_SHORTCUT_FIND, 9, 172, 62, 14, ES_LEFT @@ -858,6 +858,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Arakatu" IDS_RUNDLG_BROWSE_FILTER "Exekutatuko fitxategi (*.exe)\0*.exe\0Fitxategi denak (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Hasi Menua\\Programak" IDS_PERSONAL "Nire dokumentuak" diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc index 983d4fb5fab..20601d5d01f 100644 --- a/dll/win32/shell32/lang/fi-FI.rc +++ b/dll/win32/shell32/lang/fi-FI.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Käynnistä\\Ohjelmat" IDS_PERSONAL "Omat tiedostot" diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc index 484ec674832..f2371b86e91 100644 --- a/dll/win32/shell32/lang/fr-FR.rc +++ b/dll/win32/shell32/lang/fr-FR.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Touche de raccourci :", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Exécuter :", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&ommentaire :", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "Trouver la cible...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Parcourir" IDS_RUNDLG_BROWSE_FILTER "Fichiers exécutables (*.exe)\0*.exe\0Tous les fichiers (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menu Démarrer\\Programmes" IDS_PERSONAL "Mes documents" diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc index 6faa9abaab2..1cbdb451cb4 100644 --- a/dll/win32/shell32/lang/he-IL.rc +++ b/dll/win32/shell32/lang/he-IL.rc @@ -193,7 +193,7 @@ BEGIN LTEXT "מקש קיצור:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "הפעל:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "הערה:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "פתח מיקום קובץ", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -855,6 +855,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "עיון" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "תפריט ההתחלה\\תכניות" IDS_PERSONAL "המסמכים שלי" diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc index 54919159198..86805ece5a2 100644 --- a/dll/win32/shell32/lang/hi-IN.rc +++ b/dll/win32/shell32/lang/hi-IN.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "शॉर्टकट &की:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&रन:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&टिप्पणी:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&टारगेट ढूंढें...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -848,6 +848,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "ब्राउज़" IDS_RUNDLG_BROWSE_FILTER "एक्सेक्यूटेबल फ़ाइलें (*.exe)\0*.exe\0सारे फ़ाइलें (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "प्रारंभ मेनू\\प्रोग्राम" IDS_PERSONAL "मेरे डॉक्यूमेंट" diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index d46e93594ad..4fc189f36ad 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Billentyűparancs:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Futtatás:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Megjegyzés:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "Cé&l keresése...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -852,6 +852,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Tallózás" IDS_RUNDLG_BROWSE_FILTER "Futtatható fájlok (*.exe)\0*.exe\0Minden fájl (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start menü\\Programok" IDS_PERSONAL "Dokumentumok" diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc index 39fcf0bba0f..3663a33cd09 100644 --- a/dll/win32/shell32/lang/id-ID.rc +++ b/dll/win32/shell32/lang/id-ID.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Tombol pintasan:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Jalankan:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&omentar:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Cari Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -850,6 +850,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Jelajah" IDS_RUNDLG_BROWSE_FILTER "Berkas Eksekusi (*.exe)\0*.exe\0Semua Berkas (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menu Mulai\\Program" IDS_PERSONAL "Dokumen Saya" diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc index 6414dd62d2e..8220be84a37 100644 --- a/dll/win32/shell32/lang/it-IT.rc +++ b/dll/win32/shell32/lang/it-IT.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Tasto per il collegamento:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "E&secuzione:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&ommento:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Trova...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Sfoglia" IDS_RUNDLG_BROWSE_FILTER "File Eseguibili (*.exe)\0*.exe\0Tutti i file (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menu Avvio\\Programmi" IDS_PERSONAL "Documenti Personali" diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc index 4f2281ed0cc..0bda0c01b04 100644 --- a/dll/win32/shell32/lang/ja-JP.rc +++ b/dll/win32/shell32/lang/ja-JP.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "ショートカットキー(&K):", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "実行状態 (&R):", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "コメント(&O):", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "対象の検索(&F)...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -850,6 +850,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "参照" IDS_RUNDLG_BROWSE_FILTER "実行可能ファイル (*.exe)\0*.exe\0すべてのファイル (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "スタート メニュー\\プログラム" IDS_PERSONAL "マイ ドキュメント" diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc index 4e883d0bcf6..71e8ec1c27c 100644 --- a/dll/win32/shell32/lang/ko-KR.rc +++ b/dll/win32/shell32/lang/ko-KR.rc @@ -198,7 +198,7 @@ BEGIN LTEXT "바로 가기 키(&K):", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "실행(&R):", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "설명(&C)...", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "대상 찾기(&F)...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -860,6 +860,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "내 문서" diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc index 51ba62cf5a1..2a5def28b66 100644 --- a/dll/win32/shell32/lang/nl-NL.rc +++ b/dll/win32/shell32/lang/nl-NL.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "My Documents" diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc index 08d51f68005..2f5b88a6c5e 100644 --- a/dll/win32/shell32/lang/no-NO.rc +++ b/dll/win32/shell32/lang/no-NO.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Snarvei nø&kkel:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Kjø&r:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&ommentar:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Finn mål...", IDC_SHORTCUT_FIND, 10, 115, 63, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start-meny\\Programmer" IDS_PERSONAL "Mine dokumenter" diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc index 1c7f22f40f8..cd90289414a 100644 --- a/dll/win32/shell32/lang/pl-PL.rc +++ b/dll/win32/shell32/lang/pl-PL.rc @@ -197,7 +197,7 @@ BEGIN LTEXT "Klawisz &skrótu:", IDC_SHORTCUT_KEY, 7, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "U&ruchom:", IDC_SHORTCUT_RUN, 7, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&omentarz:", IDC_SHORTCUT_COMMENT, 7, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Znajdź element docelowy...", IDC_SHORTCUT_FIND, 7, 172, 96, 14, ES_LEFT @@ -859,6 +859,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Przeglądanie" IDS_RUNDLG_BROWSE_FILTER "Programy (*.exe)\0*.exe\0Wszystkie pliki (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menu Start\\Programy" IDS_PERSONAL "Moje dokumenty" diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc index 94b594c7465..9421ebf518e 100644 --- a/dll/win32/shell32/lang/pt-BR.rc +++ b/dll/win32/shell32/lang/pt-BR.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Tecla de atalho:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Executar:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omentário:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Procurar Alvo...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Procurar" IDS_RUNDLG_BROWSE_FILTER "Arquivos Executáveis (*.exe)\0*.exe\0Todos os arquivos (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menu Iniciar\\Programas" IDS_PERSONAL "Meus Documentos" diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc index 45f9f468bfe..5c24aa3e344 100644 --- a/dll/win32/shell32/lang/pt-PT.rc +++ b/dll/win32/shell32/lang/pt-PT.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Tecla de atalho:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Executar:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omentário:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Localizar destino...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -852,6 +852,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Localizar" IDS_RUNDLG_BROWSE_FILTER "Ficheiros executáveis (*.exe)\0*.exe\0Todos (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Menu Iniciar\\Programas" IDS_PERSONAL "Os Meus Documentos" diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc index 108fb316db2..546c875f56b 100644 --- a/dll/win32/shell32/lang/ro-RO.rc +++ b/dll/win32/shell32/lang/ro-RO.rc @@ -194,7 +194,7 @@ BEGIN LTEXT "Taste &rapide:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "E&xecuție:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Comentariu:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Locul țintei", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -856,6 +856,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Specificare fișiere" IDS_RUNDLG_BROWSE_FILTER "Fișiere executabile (*.exe)\0*.exe\0Orice fișier (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Meniul Pornire\\Programe" IDS_PERSONAL "Documentele mele" diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index 2e4f44ed294..77ed73f9445 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -198,7 +198,7 @@ BEGIN LTEXT "Б&ыстрый вызов:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Ок&но:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Комментарий:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Найти объект...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -860,6 +860,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Обзор" IDS_RUNDLG_BROWSE_FILTER "Исполняемые файлы (*.exe)\0*.exe\0Все файлы (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Главное меню\\Программы" IDS_PERSONAL "Мои документы" diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc index d3ea7e6974c..8f82b531d90 100644 --- a/dll/win32/shell32/lang/sk-SK.rc +++ b/dll/win32/shell32/lang/sk-SK.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Klávesová skratka:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "Sp&ustiť:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "Pozná&mka:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Hľadať cieľ...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Prehľadávať" IDS_RUNDLG_BROWSE_FILTER "Spustiteľné súbory (*.exe)\0*.exe\0Všetky súbory (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Ponuka Štart\\Programy" IDS_PERSONAL "Moje dokumenty" diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc index 3d5ff4af009..e29cf6de4e4 100644 --- a/dll/win32/shell32/lang/sl-SI.rc +++ b/dll/win32/shell32/lang/sl-SI.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Shortcut &key:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Run:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "C&omment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Find Target...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Browse" IDS_RUNDLG_BROWSE_FILTER "Executable Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start Menu\\Programs" IDS_PERSONAL "My Documents" diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc index 25a95b57dfe..35da9ad8e5e 100644 --- a/dll/win32/shell32/lang/sq-AL.rc +++ b/dll/win32/shell32/lang/sq-AL.rc @@ -195,7 +195,7 @@ BEGIN LTEXT "Ikonë &çelës:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Ekzekuto:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&oment:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Gjej Objektivin...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -857,6 +857,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Shfletp" IDS_RUNDLG_BROWSE_FILTER "Dokumentë Ekzekutues (*.exe)\0*.exe\0T'gjith Dokumentat (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Fillo Menu\\Programe" IDS_PERSONAL "Dokumentet e'mi" diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc index 46ed208c020..361fcae0b5a 100644 --- a/dll/win32/shell32/lang/sv-SE.rc +++ b/dll/win32/shell32/lang/sv-SE.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "Kort&kommando:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Kör:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "K&ommentar:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "&Sök mål...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Bläddra" IDS_RUNDLG_BROWSE_FILTER "Körbara filer (*.exe)\0*.exe\0Alla filer (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Start-meny\\Program" IDS_PERSONAL "Mina dokument" diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc index 92b19843e1b..2466291200f 100644 --- a/dll/win32/shell32/lang/tr-TR.rc +++ b/dll/win32/shell32/lang/tr-TR.rc @@ -193,7 +193,7 @@ BEGIN LTEXT "&Kısayol Tuşu:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Çalıştır:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Açıklama:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "H&edef Bul...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -855,6 +855,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Göz At" IDS_RUNDLG_BROWSE_FILTER "Çalıştırılabilir Dosyalar (*.exe)\0*.exe\0Tüm Dosyalar (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Başlat Menüsü\\Programlar" IDS_PERSONAL "Belgelerim" diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc index d56e437bee4..e34d4d2d355 100644 --- a/dll/win32/shell32/lang/uk-UA.rc +++ b/dll/win32/shell32/lang/uk-UA.rc @@ -191,7 +191,7 @@ BEGIN LTEXT "&Швидкий виклик:", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "&Вікно:", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "&Примітка:", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "З&найти об'єкт...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -853,6 +853,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "Огляд" IDS_RUNDLG_BROWSE_FILTER "Виконувані файли (*.exe)\0*.exe\0Всі Файли (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Головне меню\\Програми" IDS_PERSONAL "Мої документи" diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc index 1c5a374868f..ce95ea14128 100644 --- a/dll/win32/shell32/lang/zh-CN.rc +++ b/dll/win32/shell32/lang/zh-CN.rc @@ -201,7 +201,7 @@ BEGIN LTEXT "快捷键(&K):", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "运行(&R):", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "备注(&O):", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "查找目标(&F)...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -861,6 +861,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "浏览" IDS_RUNDLG_BROWSE_FILTER "可执行文件 (*.exe)\0*.exe\0所有文件 (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* Shell folder path default values. See also: dll/win32/userenv/lang */ /* ATTENTION: If there is no special situation, please DO NOT change English folder names into Chinese, or it may cause problems in the system. */ diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc index b98323d4677..0af7a25a294 100644 --- a/dll/win32/shell32/lang/zh-HK.rc +++ b/dll/win32/shell32/lang/zh-HK.rc @@ -199,7 +199,7 @@ BEGIN LTEXT "快速鍵(&K):", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "執行(&R):", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "註解(&O):", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "尋找目標(&F)...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -859,6 +859,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "瀏覽" IDS_RUNDLG_BROWSE_FILTER "可執行檔 (*.exe)\0*.exe\0All Files (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* ATTENTION: DO NOT change English folder names into Chinese unless necessary, * or it may cause problems in the system. */ /* Shell folder path default values. See also: dll/win32/userenv/lang */ diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc index 92f9ee603cb..af19932540c 100644 --- a/dll/win32/shell32/lang/zh-TW.rc +++ b/dll/win32/shell32/lang/zh-TW.rc @@ -200,7 +200,7 @@ BEGIN LTEXT "快速鍵(&K):", IDC_SHORTCUT_KEY, 8, 117, 68, 10 CONTROL "", IDC_SHORTCUT_KEY_HOTKEY, "msctls_hotkey32", WS_VISIBLE | WS_CHILD | WS_BORDER | WS_TABSTOP, 79, 115, 150, 14 LTEXT "執行(&R):", IDC_SHORTCUT_RUN, 8, 136, 68, 10 - COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 14, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SHORTCUT_RUN_COMBO, 79, 134, 150, 54, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_TABSTOP LTEXT "註解(&O):", IDC_SHORTCUT_COMMENT, 8, 154, 68, 10 EDITTEXT IDC_SHORTCUT_COMMENT_EDIT, 79, 152, 150, 14, ES_AUTOHSCROLL PUSHBUTTON "尋找目標(&F)...", IDC_SHORTCUT_FIND, 9, 172, 70, 14, ES_LEFT @@ -860,6 +860,11 @@ BEGIN IDS_RUNDLG_BROWSE_CAPTION "瀏覽" IDS_RUNDLG_BROWSE_FILTER "可執行檔 (*.exe)\0*.exe\0所有檔案 (*.*)\0*.*\0" + /* Shortcut property sheet */ + IDS_SHORTCUT_RUN_NORMAL "Normal window" + IDS_SHORTCUT_RUN_MIN "Minimized" + IDS_SHORTCUT_RUN_MAX "Maximized" + /* ATTENTION: DO NOT change English folder names into Chinese unless necessary, * or it may cause problems in the system. */ /* Shell folder path default values. See also: dll/win32/userenv/lang */ diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index 9f37375b3f3..edaa5ab9e57 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -256,6 +256,11 @@ #define IDS_MOVEERROR 351 #define IDS_COPYERROR 352 +/* Shortcut property sheet */ +#define IDS_SHORTCUT_RUN_NORMAL 4167 +#define IDS_SHORTCUT_RUN_MIN 4168 +#define IDS_SHORTCUT_RUN_MAX 4169 + #define IDS_MENU_EMPTY 34561 /* Note: those strings are referenced from the registry */ From 8a0e45031e4743a181533a1d001b0df7f407234f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 2 Sep 2023 17:25:47 +0200 Subject: [PATCH 04/27] [BOOTDATA] Fix Standard Time description for "Mountain Standard Time (Mexico)" CORE-11855 It was erroneously forgotten while making the timezone names translatable in commit f25d0ce42 (r74415). --- boot/bootdata/hivesft.inf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boot/bootdata/hivesft.inf b/boot/bootdata/hivesft.inf index dc9903f7d34..e45880375de 100644 --- a/boot/bootdata/hivesft.inf +++ b/boot/bootdata/hivesft.inf @@ -799,7 +799,7 @@ HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard Time (Mexico)","Display",0x00000000,%GMT_MINUS_07_B_DESC% HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard Time (Mexico)","Dlt",0x00000000,%GMT_MINUS_07_B_DAYLIGHT% -HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard Time (Mexico)","Std",0x00000000, +HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard Time (Mexico)","Std",0x00000000,%GMT_MINUS_07_B_STANDARD% HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard Time (Mexico)","Index",0x00010001,13 HKLM,"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Mountain Standard Time (Mexico)","TZI",0x00000001,\ 0xa4,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xff,0xff,0xff,\ From df9c3de5ba8e62e867ec0c89cbea84f98fefbae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 2 Sep 2023 21:44:21 +0200 Subject: [PATCH 05/27] [DXDIAG] Remove a "redundant" GetTimeZoneInformation() call. Indeed, the next SystemTimeToTzSpecificLocalTime() call, when done with a NULL TIME_ZONE_INFORMATION* 1st parameter, uses the currently active time zone, which is exactly what the GetTimeZoneInformation() call was doing. And note that the original code was incorrectly validating the returned value from GetTimeZoneInformation() -- the code was assuming the function returns a boolean, instead of checking for TIME_ZONE_ID_INVALID. --- base/applications/dxdiag/display.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/base/applications/dxdiag/display.c b/base/applications/dxdiag/display.c index eae055589f4..14228720d23 100644 --- a/base/applications/dxdiag/display.c +++ b/base/applications/dxdiag/display.c @@ -18,7 +18,6 @@ GetFileModifyTime(LPCWSTR pFullPath, WCHAR * szTime, int szTimeSize) FILETIME AccessTime; SYSTEMTIME SysTime, LocalTime; UINT Length; - TIME_ZONE_INFORMATION TimeInfo; hFile = CreateFileW(pFullPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (!hFile) @@ -31,13 +30,10 @@ GetFileModifyTime(LPCWSTR pFullPath, WCHAR * szTime, int szTimeSize) } CloseHandle(hFile); - if(!GetTimeZoneInformation(&TimeInfo)) - return FALSE; - if (!FileTimeToSystemTime(&AccessTime, &SysTime)) return FALSE; - if (!SystemTimeToTzSpecificLocalTime(&TimeInfo, &SysTime, &LocalTime)) + if (!SystemTimeToTzSpecificLocalTime(NULL, &SysTime, &LocalTime)) return FALSE; Length = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &LocalTime, NULL, szTime, szTimeSize); From 67645ab7a8998d7c62f19e24035d20a5f6fc6ba5 Mon Sep 17 00:00:00 2001 From: Stanislav Motylkov Date: Sat, 2 Sep 2023 22:56:38 +0300 Subject: [PATCH 06/27] [SHELL32] Update Russian (ru-RU) translation --- dll/win32/shell32/lang/ru-RU.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index 77ed73f9445..ab5a7e3d928 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -861,9 +861,9 @@ BEGIN IDS_RUNDLG_BROWSE_FILTER "Исполняемые файлы (*.exe)\0*.exe\0Все файлы (*.*)\0*.*\0" /* Shortcut property sheet */ - IDS_SHORTCUT_RUN_NORMAL "Normal window" - IDS_SHORTCUT_RUN_MIN "Minimized" - IDS_SHORTCUT_RUN_MAX "Maximized" + IDS_SHORTCUT_RUN_NORMAL "Обычный размер окна" + IDS_SHORTCUT_RUN_MIN "Свёрнутое в значок" + IDS_SHORTCUT_RUN_MAX "Развёрнутое на весь экран" /* Shell folder path default values. See also: dll/win32/userenv/lang */ IDS_PROGRAMS "Главное меню\\Программы" From 8dbb800358c5714e88848b80d76910a32b90c8d7 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sun, 3 Sep 2023 09:42:10 +0900 Subject: [PATCH 07/27] [SHDOCVW][SDK] Implement MRU List for Shell Bag, Part 2 (#5634) Follow-up to #5626. - Implement CMruBase class. - Add delay import of shell32. - Add RegCreateKeyExWrapW prototype to . CORE-9283 --- dll/win32/shdocvw/CMakeLists.txt | 2 +- dll/win32/shdocvw/mrulist.cpp | 289 ++++++++++++++++++++++++---- sdk/include/reactos/shlobj_undoc.h | 6 +- sdk/include/reactos/shlwapi_undoc.h | 13 ++ 4 files changed, 268 insertions(+), 42 deletions(-) diff --git a/dll/win32/shdocvw/CMakeLists.txt b/dll/win32/shdocvw/CMakeLists.txt index 307fee5ad6e..5d25b402784 100644 --- a/dll/win32/shdocvw/CMakeLists.txt +++ b/dll/win32/shdocvw/CMakeLists.txt @@ -23,7 +23,7 @@ add_library(shdocvw MODULE set_module_type(shdocvw win32dll) target_link_libraries(shdocvw uuid wine) -add_delay_importlibs(shdocvw ole32 oleaut32 ieframe) +add_delay_importlibs(shdocvw shell32 ole32 oleaut32 ieframe) add_importlibs(shdocvw shlwapi advapi32 msvcrt kernel32 ntdll) add_dependencies(shdocvw stdole2) add_pch(shdocvw precomp.h SOURCE) diff --git a/dll/win32/shdocvw/mrulist.cpp b/dll/win32/shdocvw/mrulist.cpp index 564c3d9e9be..b140779cb9c 100644 --- a/dll/win32/shdocvw/mrulist.cpp +++ b/dll/win32/shdocvw/mrulist.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "shdocvw.h" #include @@ -27,20 +28,49 @@ extern "C" void __cxa_pure_virtual(void) ::DebugBreak(); } +BOOL IEILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, BOOL bUnknown) +{ + UINT cb1 = ILGetSize(pidl1), cb2 = ILGetSize(pidl2); + if (cb1 == cb2 && memcmp(pidl1, pidl2, cb1) == 0) + return TRUE; + + FIXME("%p, %p\n", pidl1, pidl2); + return FALSE; +} + +// The flags for SLOTITEMDATA.dwFlags +#define SLOT_LOADED 0x1 +#define SLOT_UNKNOWN_FLAG 0x2 + +// The flags for CMruBase.m_dwFlags +#define COMPARE_BY_MEMCMP 0x0 +#define COMPARE_BY_STRCMPIW 0x1 +#define COMPARE_BY_STRCMPW 0x2 +#define COMPARE_BY_IEILISEQUAL 0x3 +#define COMPARE_BY_MASK 0xF + class CMruBase : public IMruDataList { protected: LONG m_cRefs = 1; // Reference count - DWORD m_dwFlags = 0; // The flags + DWORD m_dwFlags = 0; // The COMPARE_BY_... flags BOOL m_bFlag1 = FALSE; // ??? - BOOL m_bChecked = FALSE; // ??? + BOOL m_bChecked = FALSE; // The checked flag HKEY m_hKey = NULL; // A registry key DWORD m_cSlotRooms = 0; // Rooms for slots DWORD m_cSlots = 0; // The # of slots SLOTCOMPARE m_fnCompare = NULL; // The comparison function SLOTITEMDATA * m_pSlots = NULL; // Slot data + HRESULT _LoadItem(UINT iSlot); + HRESULT _AddItem(UINT iSlot, const BYTE *pbData, DWORD cbData); + HRESULT _GetItem(UINT iSlot, SLOTITEMDATA **ppItem); + void _DeleteItem(UINT iSlot); + + HRESULT _GetSlotItem(UINT iSlot, SLOTITEMDATA **ppItem); + void _CheckUsedSlots(); + public: CMruBase() { @@ -53,19 +83,12 @@ class CMruBase { return ::InterlockedIncrement(&m_cRefs); } - STDMETHODIMP_(ULONG) Release() override - { - if (::InterlockedDecrement(&m_cRefs) == 0) - { - delete this; - return 0; - } - return m_cRefs; - } + STDMETHODIMP_(ULONG) Release() override; // IMruDataList methods - STDMETHODIMP InitData(UINT cCapacity, UINT flags, HKEY hKey, LPCWSTR pszSubKey, - SLOTCOMPARE fnCompare) override; + STDMETHODIMP InitData(UINT cCapacity, UINT flags, HKEY hKey, + LPCWSTR pszSubKey OPTIONAL, + SLOTCOMPARE fnCompare OPTIONAL) override; STDMETHODIMP AddData(const BYTE *pbData, DWORD cbData, UINT *piSlot) override; STDMETHODIMP FindData(const BYTE *pbData, DWORD cbData, UINT *piSlot) override; STDMETHODIMP GetData(UINT iSlot, BYTE *pbData, DWORD cbData) override; @@ -73,7 +96,7 @@ class CMruBase STDMETHODIMP Delete(UINT iSlot) override; // Non-standard methods - virtual HRESULT _IsEqual(const SLOTITEMDATA *pSlot, LPCITEMIDLIST pidl, UINT cbPidl) const; + virtual BOOL _IsEqual(const SLOTITEMDATA *pItem, LPCVOID pvData, UINT cbData) const; virtual HRESULT _DeleteValue(LPCWSTR pszValue); virtual HRESULT _InitSlots() = 0; virtual void _SaveSlots() = 0; @@ -104,11 +127,7 @@ CMruBase::~CMruBase() { for (UINT iSlot = 0; iSlot < m_cSlots; ++iSlot) { - if (m_pSlots[iSlot].pidl) - { - ::LocalFree(m_pSlots[iSlot].pidl); - m_pSlots[iSlot].pidl = NULL; - } + m_pSlots[iSlot].pvData = ::LocalFree(m_pSlots[iSlot].pvData); } ::LocalFree(m_pSlots); @@ -130,58 +149,252 @@ STDMETHODIMP CMruBase::QueryInterface(REFIID riid, void **ppvObj) return E_NOINTERFACE; } +STDMETHODIMP_(ULONG) CMruBase::Release() +{ + if (::InterlockedDecrement(&m_cRefs) == 0) + { + _SaveSlots(); + delete this; + return 0; + } + return m_cRefs; +} + +HRESULT CMruBase::_LoadItem(UINT iSlot) +{ + DWORD cbData; + WCHAR szValue[12]; + + SLOTITEMDATA *pItem = &m_pSlots[iSlot]; + _SlotString(iSlot, szValue, _countof(szValue)); + + if (SHGetValueW(m_hKey, NULL, szValue, NULL, NULL, &cbData) == ERROR_SUCCESS && + cbData > 0) + { + pItem->pvData = ::LocalAlloc(LPTR, cbData); + if (pItem->pvData) + { + pItem->cbData = cbData; + if (SHGetValueW(m_hKey, NULL, szValue, NULL, pItem->pvData, &cbData) != ERROR_SUCCESS) + pItem->pvData = ::LocalFree(pItem->pvData); + } + } + + pItem->dwFlags |= SLOT_LOADED; + if (!pItem->pvData) + return E_FAIL; + + return S_OK; +} + +HRESULT CMruBase::_GetSlotItem(UINT iSlot, SLOTITEMDATA **ppItem) +{ + if (!(m_pSlots[iSlot].dwFlags & SLOT_LOADED)) + _LoadItem(iSlot); + + SLOTITEMDATA *pItem = &m_pSlots[iSlot]; + if (!pItem->pvData) + return E_OUTOFMEMORY; + + *ppItem = pItem; + return S_OK; +} + +HRESULT CMruBase::_GetItem(UINT iSlot, SLOTITEMDATA **ppItem) +{ + HRESULT hr = _GetSlot(iSlot, &iSlot); + if (FAILED(hr)) + return hr; + return _GetSlotItem(iSlot, ppItem); +} + +void CMruBase::_DeleteItem(UINT iSlot) +{ + WCHAR szBuff[12]; + + _SlotString(iSlot, szBuff, _countof(szBuff)); + _DeleteValue(szBuff); + + m_pSlots[iSlot].pvData = ::LocalFree(m_pSlots[iSlot].pvData); +} + +void CMruBase::_CheckUsedSlots() +{ + UINT iGotSlot; + for (UINT iSlot = 0; iSlot < m_cSlots; ++iSlot) + _GetSlot(iSlot, &iGotSlot); + + m_bChecked = TRUE; +} + +HRESULT CMruBase::_AddItem(UINT iSlot, const BYTE *pbData, DWORD cbData) +{ + SLOTITEMDATA *pItem = &m_pSlots[iSlot]; + + WCHAR szBuff[12]; + _SlotString(iSlot, szBuff, _countof(szBuff)); + + if (SHSetValueW(m_hKey, NULL, szBuff, REG_BINARY, pbData, cbData) != ERROR_SUCCESS) + return E_OUTOFMEMORY; + + if (cbData >= pItem->cbData || !pItem->pvData) + { + ::LocalFree(pItem->pvData); + pItem->pvData = ::LocalAlloc(LPTR, cbData); + } + + if (!pItem->pvData) + return E_FAIL; + + pItem->cbData = cbData; + pItem->dwFlags = (SLOT_LOADED | SLOT_UNKNOWN_FLAG); + CopyMemory(pItem->pvData, pbData, cbData); + return S_OK; +} + STDMETHODIMP CMruBase::InitData( UINT cCapacity, UINT flags, HKEY hKey, - LPCWSTR pszSubKey, - SLOTCOMPARE fnCompare) + LPCWSTR pszSubKey OPTIONAL, + SLOTCOMPARE fnCompare OPTIONAL) { - FIXME("Stub\n"); - return E_NOTIMPL; + m_dwFlags = flags; + m_fnCompare = fnCompare; + m_cSlotRooms = cCapacity; + + if (pszSubKey) + ::RegCreateKeyExWrapW(hKey, pszSubKey, 0, NULL, 0, MAXIMUM_ALLOWED, NULL, &m_hKey, NULL); + else + m_hKey = SHRegDuplicateHKey(hKey); + + if (!m_hKey) + return E_FAIL; + + m_pSlots = (SLOTITEMDATA*)::LocalAlloc(LPTR, m_cSlotRooms * sizeof(SLOTITEMDATA)); + if (!m_pSlots) + return E_OUTOFMEMORY; + + return _InitSlots(); } STDMETHODIMP CMruBase::AddData(const BYTE *pbData, DWORD cbData, UINT *piSlot) { - FIXME("Stub\n"); - return E_NOTIMPL; + UINT iSlot; + HRESULT hr = FindData(pbData, cbData, &iSlot); + if (FAILED(hr)) + { + iSlot = _UpdateSlots(m_cSlots); + hr = _AddItem(iSlot, pbData, cbData); + if (FAILED(hr)) + return hr; + } + else + { + iSlot = _UpdateSlots(iSlot); + hr = S_OK; + } + + if (piSlot) + *piSlot = iSlot; + + return hr; } STDMETHODIMP CMruBase::FindData(const BYTE *pbData, DWORD cbData, UINT *piSlot) { - FIXME("Stub\n"); - return E_NOTIMPL; + if (m_cSlots <= 0) + return E_FAIL; + + UINT iSlot = 0; + SLOTITEMDATA *pItem; + while (FAILED(_GetItem(iSlot, &pItem)) || !_IsEqual(pItem, pbData, cbData)) + { + if (++iSlot >= m_cSlots) + return E_FAIL; + } + + *piSlot = iSlot; + return S_OK; } STDMETHODIMP CMruBase::GetData(UINT iSlot, BYTE *pbData, DWORD cbData) { - FIXME("Stub\n"); - return E_NOTIMPL; + SLOTITEMDATA *pItem; + HRESULT hr = _GetItem(iSlot, &pItem); + if (FAILED(hr)) + return hr; + + if (cbData < pItem->cbData) + return 0x8007007A; // FIXME: Magic number + + CopyMemory(pbData, pItem->pvData, pItem->cbData); + return hr; } STDMETHODIMP CMruBase::QueryInfo(UINT iSlot, UINT *puSlot, DWORD *pcbData) { - FIXME("Stub\n"); - return E_NOTIMPL; + UINT iGotSlot; + HRESULT hr = _GetSlot(iSlot, &iGotSlot); + if (FAILED(hr)) + return hr; + + if (puSlot) + *puSlot = iGotSlot; + + if (pcbData) + { + SLOTITEMDATA *pItem; + hr = _GetSlotItem(iGotSlot, &pItem); + if (SUCCEEDED(hr)) + *pcbData = pItem->cbData; + } + + return hr; } STDMETHODIMP CMruBase::Delete(UINT iSlot) { - FIXME("Stub\n"); - return E_NOTIMPL; + UINT uSlot; + HRESULT hr = _RemoveSlot(iSlot, &uSlot); + if (FAILED(hr)) + return hr; + + _DeleteItem(uSlot); + return hr; } -HRESULT CMruBase::_IsEqual(const SLOTITEMDATA *pSlot, LPCITEMIDLIST pidl, UINT cbPidl) const +BOOL CMruBase::_IsEqual(const SLOTITEMDATA *pItem, LPCVOID pvData, UINT cbData) const { - FIXME("Stub\n"); - return E_NOTIMPL; + if (m_fnCompare) + return m_fnCompare(pvData, pItem->pvData, cbData) == 0; + + switch (m_dwFlags & COMPARE_BY_MASK) + { + case COMPARE_BY_MEMCMP: + if (pItem->cbData != cbData) + return FALSE; + return memcmp(pvData, pItem->pvData, cbData) == 0; + + case COMPARE_BY_STRCMPIW: + return StrCmpIW((LPCWSTR)pvData, (LPCWSTR)pItem->pvData) == 0; + + case COMPARE_BY_STRCMPW: + return StrCmpW((LPCWSTR)pvData, (LPCWSTR)pItem->pvData) == 0; + + case COMPARE_BY_IEILISEQUAL: + return IEILIsEqual((LPCITEMIDLIST)pvData, (LPCITEMIDLIST)pItem->pvData, FALSE); + + default: + ERR("0x%08X\n", m_dwFlags); + return FALSE; + } } HRESULT CMruBase::_DeleteValue(LPCWSTR pszValue) { - FIXME("Stub\n"); - return E_NOTIMPL; + return SHDeleteValueW(m_hKey, NULL, pszValue); } class CMruLongList diff --git a/sdk/include/reactos/shlobj_undoc.h b/sdk/include/reactos/shlobj_undoc.h index 33f911e05c7..0601d6fbd7b 100644 --- a/sdk/include/reactos/shlobj_undoc.h +++ b/sdk/include/reactos/shlobj_undoc.h @@ -29,11 +29,11 @@ extern "C" { typedef struct tagSLOTITEMDATA { DWORD dwFlags; - UINT cbPidl; - LPITEMIDLIST pidl; + UINT cbData; + LPVOID pvData; } SLOTITEMDATA, *PSLOTITEMDATA; -typedef INT (CALLBACK *SLOTCOMPARE)(LPCITEMIDLIST, LPCITEMIDLIST, UINT); +typedef INT (CALLBACK *SLOTCOMPARE)(LPCVOID pvData1, LPCVOID pvData2, UINT cbData); /***************************************************************************** * New shellstate structure diff --git a/sdk/include/reactos/shlwapi_undoc.h b/sdk/include/reactos/shlwapi_undoc.h index d7f3790d897..cd427170815 100644 --- a/sdk/include/reactos/shlwapi_undoc.h +++ b/sdk/include/reactos/shlwapi_undoc.h @@ -69,6 +69,19 @@ HRESULT WINAPI SHWriteDataBlockList(IStream* lpStream, LPDBLIST lpList); HRESULT WINAPI SHReadDataBlockList(IStream* lpStream, LPDBLIST* lppList); VOID WINAPI SHFreeDataBlockList(LPDBLIST lpList); +LONG +WINAPI +RegCreateKeyExWrapW( + _In_ HKEY hKey, + _In_ LPCWSTR lpSubKey, + _In_ DWORD Reserved, + _In_opt_ LPWSTR lpClass, + _In_ DWORD dwOptions, + _In_ REGSAM samDesired, + _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, + _Out_ PHKEY phkResult, + _Out_opt_ LPDWORD lpdwDisposition); + /* Redirected to kernel32.ExpandEnvironmentStringsA/W */ DWORD WINAPI SHExpandEnvironmentStringsA(LPCSTR,LPSTR,DWORD); DWORD WINAPI SHExpandEnvironmentStringsW(LPCWSTR,LPWSTR,DWORD); From 4814dfea01b4651a58d8d8951c02ec4fcf1ee8ea Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sun, 3 Sep 2023 12:09:55 +0900 Subject: [PATCH 08/27] [BROWSEUI][SDK] Half-implement CShellBrowser::GetPropertyBag (#5635) - Implement CShellBrowser::GetPropertyBag a little by using SHGetViewStatePropertyBag. - Add SHGetPathFromIDListWrapW prototype to . CORE-9283 --- dll/win32/browseui/shellbrowser.cpp | 23 ++++++++++++++++++++++- sdk/include/reactos/shlwapi_undoc.h | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index f6cb992dbb6..9c8edff1822 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -2387,12 +2387,33 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::QueryService(REFGUID guidService, REFII return E_NOINTERFACE; } +static BOOL _ILIsNetworkPlace(LPCITEMIDLIST pidl) +{ + WCHAR szPath[MAX_PATH]; + return SHGetPathFromIDListWrapW(pidl, szPath) && PathIsUNCW(szPath); +} + HRESULT STDMETHODCALLTYPE CShellBrowser::GetPropertyBag(long flags, REFIID riid, void **ppvObject) { if (ppvObject == NULL) return E_POINTER; + *ppvObject = NULL; - return E_NOTIMPL; + + LPITEMIDLIST pidl; + HRESULT hr = GetPidl(&pidl); + if (FAILED_UNEXPECTEDLY(hr)) + return E_FAIL; + + // FIXME: pidl for Internet etc. + + if (_ILIsNetworkPlace(pidl)) + flags |= SHGVSPB_ROAM; + + hr = SHGetViewStatePropertyBag(pidl, L"Shell", flags, riid, ppvObject); + + ILFree(pidl); + return hr; } HRESULT STDMETHODCALLTYPE CShellBrowser::GetTypeInfoCount(UINT *pctinfo) diff --git a/sdk/include/reactos/shlwapi_undoc.h b/sdk/include/reactos/shlwapi_undoc.h index cd427170815..1cb5a064631 100644 --- a/sdk/include/reactos/shlwapi_undoc.h +++ b/sdk/include/reactos/shlwapi_undoc.h @@ -276,6 +276,7 @@ BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich); BOOL WINAPI PathFindOnPathExW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs, DWORD dwWhich); VOID WINAPI FixSlashesAndColonW(LPWSTR); BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD dwClass); +BOOL WINAPI SHGetPathFromIDListWrapW(LPCITEMIDLIST pidl, LPWSTR pszPath); #ifdef __cplusplus } /* extern "C" */ From c66a1582aca1ca1ed98d142276b16bb4db71e0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 3 Sep 2023 16:44:12 +0200 Subject: [PATCH 09/27] [NTOS:EX] Add some missing PoNotifySystemTimeSet() calls. Stub out NtSetSystemTime() with NULL parameter. - They notify, via the "\\Callback\\SetSystemTime" callback, components of a change of system time (for example, Win32k). Note, that our Win32k currently does not handle power callouts, so it isn't affected by these changes (yet). - NtSetSystemTime(NULL, ...) means "update system time using the current time-zone information", which is something we don't implement yet. (And, nothing was previously protecting this call from a NULL parameter...) --- ntoskrnl/ex/init.c | 7 +++---- ntoskrnl/ex/time.c | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/ntoskrnl/ex/init.c b/ntoskrnl/ex/init.c index 2953a442e35..517661dfd4c 100644 --- a/ntoskrnl/ex/init.c +++ b/ntoskrnl/ex/init.c @@ -1549,10 +1549,8 @@ Phase1InitializationDiscard(IN PVOID Context) ExpTimeZoneBias.QuadPart; } - /* Update the system time */ + /* Update the system time and notify the system */ KeSetSystemTime(&UniversalBootTime, &OldTime, FALSE, NULL); - - /* Do system callback */ PoNotifySystemTimeSet(); /* Remember this as the boot time */ @@ -1681,7 +1679,8 @@ Phase1InitializationDiscard(IN PVOID Context) else { /* Check if the timezone switched and update the time */ - if (LastTzBias != ExpLastTimeZoneBias) ZwSetSystemTime(NULL, NULL); + if (LastTzBias != ExpLastTimeZoneBias) + ZwSetSystemTime(NULL, NULL); } /* Initialize the File System Runtime Library */ diff --git a/ntoskrnl/ex/time.c b/ntoskrnl/ex/time.c index ad971773a8d..a2de0591178 100644 --- a/ntoskrnl/ex/time.c +++ b/ntoskrnl/ex/time.c @@ -372,8 +372,9 @@ ExpSetTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation) /* Calculate the new system time */ ExLocalTimeToSystemTime(&LocalTime, &SystemTime); - /* Set the new system time */ + /* Set the new system time and notify the system */ KeSetSystemTime(&SystemTime, &OldTime, FALSE, NULL); + PoNotifySystemTimeSet(); /* Return success */ DPRINT("ExpSetTimeZoneInformation() done\n"); @@ -400,8 +401,17 @@ NtSetSystemTime(IN PLARGE_INTEGER SystemTime, TIME_FIELDS TimeFields; KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + // TODO: Handle the case when SystemTime == NULL, which means: + // "update system time using the current time-zone information". + if (!SystemTime) + { + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; + } + /* Check if we were called from user-mode */ if (PreviousMode != KernelMode) { @@ -409,7 +419,7 @@ NtSetSystemTime(IN PLARGE_INTEGER SystemTime, { /* Verify the time pointers */ NewSystemTime = ProbeForReadLargeInteger(SystemTime); - if(PreviousTime) ProbeForWriteLargeInteger(PreviousTime); + if (PreviousTime) ProbeForWriteLargeInteger(PreviousTime); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -437,8 +447,9 @@ NtSetSystemTime(IN PLARGE_INTEGER SystemTime, RtlTimeToTimeFields(&LocalTime, &TimeFields); HalSetRealTimeClock(&TimeFields); - /* Now set system time */ + /* Now set the system time and notify the system */ KeSetSystemTime(&NewSystemTime, &OldSystemTime, FALSE, NULL); + PoNotifySystemTimeSet(); /* Check if caller wanted previous time */ if (PreviousTime) From 3068422d5131d55dcd74fc82d36a2025e37f1faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tibor=20Lajos=20F=C3=BCzi?= Date: Sun, 3 Sep 2023 17:46:38 +0200 Subject: [PATCH 10/27] [TRANSLATION] Update hungarian translation for mspaint, notepad, taskmgr, explorer, appwiz, browseui, msgina, shell32 (#5645) --- base/applications/mspaint/lang/hu-HU.rc | 18 +++++++++--------- base/applications/notepad/lang/hu-HU.rc | 18 +++++++++--------- base/applications/taskmgr/lang/hu-HU.rc | 8 ++++---- base/shell/explorer/lang/hu-HU.rc | 14 +++++++------- dll/cpl/appwiz/lang/hu-HU.rc | 2 +- dll/win32/browseui/lang/hu-HU.rc | 2 +- dll/win32/msgina/lang/hu-HU.rc | 8 ++++---- dll/win32/shell32/lang/hu-HU.rc | 12 ++++++------ 8 files changed, 41 insertions(+), 41 deletions(-) diff --git a/base/applications/mspaint/lang/hu-HU.rc b/base/applications/mspaint/lang/hu-HU.rc index 1d97acb2681..ded0865a4d2 100644 --- a/base/applications/mspaint/lang/hu-HU.rc +++ b/base/applications/mspaint/lang/hu-HU.rc @@ -213,7 +213,7 @@ BEGIN END IDD_FONTS DIALOG 0, 0, 225, 25 -CAPTION "Fonts" +CAPTION "Betűtípusok" STYLE DS_CENTER | DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION EXSTYLE WS_EX_TOOLWINDOW FONT 8, "MS Shell Dlg" @@ -256,13 +256,13 @@ BEGIN IDS_ANGLE "A szögnek -89 és 89 között kell lennie." IDS_LOADERRORTEXT "A(z) %s fájlt nem sikerült betölteni." IDS_ENLARGEPROMPTTEXT "A vágólapon lévő kép nagyobb mint a bitkép.\nSzeretné a bitkép méretét megnövelni?" - IDS_BOLD "Bold" - IDS_ITALIC "Italic" - IDS_UNDERLINE "Underline" - IDS_VERTICAL "Vertical" + IDS_BOLD "Félkövér" + IDS_ITALIC "Dőlt" + IDS_UNDERLINE "Aláhúzott" + IDS_VERTICAL "Függőleges" IDS_PRINTRES "%d x %d pixel/cm" - IDS_CANTPASTE "Failed to paste from the clipboard. The data format is either incorrect or not supported." - IDS_SAVEERROR "Failed to save the bitmap to file:\n\n%s" - IDS_CANTSENDMAIL "Failed to send a mail." - IDS_LOSECOLOR "The color information will be lost in this operation. Are you sure to proceed?" + IDS_CANTPASTE "Nem sikerült a beillesztés a vágólapról. Hibás, vagy nem támogatott adatformátum." + IDS_SAVEERROR "Nem sikerült a bitkép mentése az alábbi fájlba:\n\n%s" + IDS_CANTSENDMAIL "Nem sikerült az email küldése." + IDS_LOSECOLOR "A színinformációk el fognak veszni a művelet során. Biztosan folytatja?" END diff --git a/base/applications/notepad/lang/hu-HU.rc b/base/applications/notepad/lang/hu-HU.rc index 18e368941c7..1f419e614c7 100644 --- a/base/applications/notepad/lang/hu-HU.rc +++ b/base/applications/notepad/lang/hu-HU.rc @@ -131,12 +131,12 @@ BEGIN END DIALOG_PRINTING DIALOG 0, 0, 160, 100 -CAPTION "Now printing" +CAPTION "Nyomtatás folyamatban" STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" BEGIN - CTEXT "Print job is starting...", IDC_PRINTING_STATUS, 5, 10, 150, 15 - CTEXT "(Filename)", IDC_PRINTING_FILENAME, 5, 35, 150, 15 + CTEXT "A nyomtatási feladat indul...", IDC_PRINTING_STATUS, 5, 10, 150, 15 + CTEXT "(Fájlnév)", IDC_PRINTING_FILENAME, 5, 35, 150, 15 CTEXT "Oldalszám: %u", IDC_PRINTING_PAGE, 5, 55, 150, 15 PUSHBUTTON "Mégse", IDCANCEL, 50, 75, 60, 20 END @@ -176,12 +176,12 @@ Szeretné menteni a változásokat?" STRING_LINE_COLUMN "Sor: %d, oszlop: %d" STRING_PRINTERROR "Nem sikerült kinyomtatni a következő fájlt: '%s'.\n\nEllenőrizze hogy a nyomtató be van-e kapcsolva és megfelelően van-e konfigurálva." STRING_DEFAULTFONT "Lucida Console" - STRING_LINE_NUMBER_OUT_OF_RANGE "The specified line number is out of range." - STRING_NOWPRINTING "Now printing page..." - STRING_PRINTCANCELING "The print job is being canceled..." - STRING_PRINTCOMPLETE "Printing is successfully done." - STRING_PRINTCANCELED "Printing has been canceled." - STRING_PRINTFAILED "Printing is failed." + STRING_LINE_NUMBER_OUT_OF_RANGE "A megadott sorszám kívül esik az elérhető tartományon." + STRING_NOWPRINTING "Oldal nyomtatása folyamatban..." + STRING_PRINTCANCELING "A nyomtatási feladat megszakítása folyamatban..." + STRING_PRINTCOMPLETE "A nyomtatás sikeresen befejeződött." + STRING_PRINTCANCELED "A nyomtatást megszakították." + STRING_PRINTFAILED "A nyomtatás nem sikerült." STRING_TEXT_DOCUMENT "Szöveges dokumentum" STRING_NOTEPAD_AUTHORS "Copyright 1997,98 Marcel Baur, 2000 Mike McCormack, 2002 Sylvain Petreolle, 2002 Andriy Palamarchuk\r\n" diff --git a/base/applications/taskmgr/lang/hu-HU.rc b/base/applications/taskmgr/lang/hu-HU.rc index 84a04f5b22b..f4968d5432a 100644 --- a/base/applications/taskmgr/lang/hu-HU.rc +++ b/base/applications/taskmgr/lang/hu-HU.rc @@ -138,8 +138,8 @@ BEGIN END MENUITEM "&Processzorok használata...", ID_PROCESS_PAGE_SETAFFINITY MENUITEM SEPARATOR - MENUITEM "&Properties", ID_PROCESS_PAGE_PROPERTIES - MENUITEM "&Open File Location", ID_PROCESS_PAGE_OPENFILELOCATION + MENUITEM "&Tulajdonságok", ID_PROCESS_PAGE_PROPERTIES + MENUITEM "Fájl &helyének megnyitása", ID_PROCESS_PAGE_OPENFILELOCATION END END @@ -381,8 +381,8 @@ BEGIN ID_PROCESS_PAGE_SETPRIORITY_NORMAL "Normál prioritásra állítja a folyamatot" ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL "Normál alatti prioritásra állítja a folyamatot" ID_PROCESS_PAGE_SETPRIORITY_LOW "Alacsony prioritásra állítja a folyamatot" - ID_PROCESS_PAGE_PROPERTIES "Shows process file properties" - ID_PROCESS_PAGE_OPENFILELOCATION "Opens process file location" + ID_PROCESS_PAGE_PROPERTIES "Megjeleníti a folyamat fájl tulajdonságait" + ID_PROCESS_PAGE_OPENFILELOCATION "Megnyitja a folyamat fájl helyét" END STRINGTABLE diff --git a/base/shell/explorer/lang/hu-HU.rc b/base/shell/explorer/lang/hu-HU.rc index d5c5aa5560b..0c4829ee569 100644 --- a/base/shell/explorer/lang/hu-HU.rc +++ b/base/shell/explorer/lang/hu-HU.rc @@ -78,7 +78,7 @@ BEGIN AUTOCHECKBOX "A tálca mindig legyen &látható a többi ablak előtt", IDC_TASKBARPROP_ONTOP, 13, 71, 200, 10 AUTOCHECKBOX "Hasonló tálca gombok &csoportosítása", IDC_TASKBARPROP_GROUP, 13, 84, 200, 10 AUTOCHECKBOX "&Gyorsindító megjelenítése", IDC_TASKBARPROP_SHOWQL, 13, 97, 200, 10 - AUTOCHECKBOX "U&se small icons", IDC_TASKBARPROP_SMALLICONS, 13, 110, 200, 10 + AUTOCHECKBOX "&Kis ikonok használata", IDC_TASKBARPROP_SMALLICONS, 13, 110, 200, 10 END IDD_TASKBARPROP_STARTMENU DIALOGEX 0, 0, 252, 218 @@ -101,15 +101,15 @@ CAPTION "Értesítési terület" FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN CONTROL "", IDC_TASKBARPROP_NOTIFICATIONBITMAP, "Static", SS_BITMAP | SS_SUNKEN | SS_CENTERIMAGE, 12, 6, 229, 24 - GROUPBOX "Icons", IDC_STATIC, 6, 36, 240, 56 + GROUPBOX "Ikonok", IDC_STATIC, 6, 36, 240, 56 LTEXT "Rendezettebbé teheti az értesítési területet, ha elrejti azokat az ikonokat, amelyekre már régen nem kattintott rá.", IDC_STATIC, 13, 48, 223, 16 AUTOCHECKBOX "A nem aktív &ikonok elrejtése", IDC_TASKBARPROP_HIDEICONS, 13, 70, 125, 10 PUSHBUTTON "&Testreszabás...", IDC_TASKBARPROP_ICONCUST, 188, 67, 53, 14 - GROUPBOX "System icons", IDC_STATIC, 6, 99, 240, 56 - LTEXT "Select which system icons to always show.", IDC_STATIC, 13, 113, 223, 8 + GROUPBOX "Rendszerikonok", IDC_STATIC, 6, 99, 240, 56 + LTEXT "Jelölje ki a mindig megjelenítendő rendszerikonokat.", IDC_STATIC, 13, 113, 223, 8 AUTOCHECKBOX "Az óra &megjelenítése", IDC_TASKBARPROP_CLOCK, 13, 127, 80, 10 AUTOCHECKBOX "Má&sodpercek megjelenítése", IDC_TASKBARPROP_SECONDS, 120, 127, 100, 10, WS_DISABLED - AUTOCHECKBOX "&Desktop", IDC_TASKBARPROP_DESKTOP, 13, 140, 80, 10 + AUTOCHECKBOX "&Asztal", IDC_TASKBARPROP_DESKTOP, 13, 140, 80, 10 END IDD_NOTIFICATIONS_CUSTOMIZE DIALOGEX 0, 0, 232, 240 @@ -213,6 +213,6 @@ STRINGTABLE BEGIN IDS_TASKBAR_STARTMENU_PROP_CAPTION "Tálca és Start menü" IDS_RESTORE_ALL "&Megnyitott ablakok megjelenítése" - IDS_TRAYWND_UNDO_CASCADE "&Undo Cascade" - IDS_TRAYWND_UNDO_TILE "&Undo Tile" + IDS_TRAYWND_UNDO_CASCADE "Lépcsőzetes elre&ndezés visszavonása" + IDS_TRAYWND_UNDO_TILE "Mozaik elre&ndezés visszavonása" END diff --git a/dll/cpl/appwiz/lang/hu-HU.rc b/dll/cpl/appwiz/lang/hu-HU.rc index ed58f785006..665869289d0 100644 --- a/dll/cpl/appwiz/lang/hu-HU.rc +++ b/dll/cpl/appwiz/lang/hu-HU.rc @@ -90,5 +90,5 @@ BEGIN IDS_NO_DIRECTORY "Nincs megadva mappa!" IDS_INVALID_PATH "A megadott mappa érvénytelen!" IDS_INVALID_NAME "A megadott parancsikon név érvénytelen fájlnév karaktereket tartalmaz, vagy túl hosszú." - IDS_BROWSE_FOR_TARGET "Please select the target of the shortcut below:" + IDS_BROWSE_FOR_TARGET "Kérem válassza ki a parancsikon hivatkozását:" END diff --git a/dll/win32/browseui/lang/hu-HU.rc b/dll/win32/browseui/lang/hu-HU.rc index cf7a915449f..43d26737ca3 100644 --- a/dll/win32/browseui/lang/hu-HU.rc +++ b/dll/win32/browseui/lang/hu-HU.rc @@ -316,7 +316,7 @@ END STRINGTABLE BEGIN - IDS_ADDRESSMENUTEXT "&Address" + IDS_ADDRESSMENUTEXT "&Cím" IDS_HISTORYTEXT "&Előzmények\tCtrl+H" END diff --git a/dll/win32/msgina/lang/hu-HU.rc b/dll/win32/msgina/lang/hu-HU.rc index 4d7024a20d8..9e86c71769d 100644 --- a/dll/win32/msgina/lang/hu-HU.rc +++ b/dll/win32/msgina/lang/hu-HU.rc @@ -235,10 +235,10 @@ BEGIN IDS_INVALIDLOGONHOURS "A fiókján olyan időkorlátozás van, amely miatt jelenleg nem tud belépni. Kérjük próbálja újra később." IDS_INVALIDWORKSTATION "A fiókja úgy van beállítva hogy nem használhatja ezt a számítógépet. Kérjük próbálkozzon egy másik számítógéppel." IDS_ACCOUNTRESTRICTION "Fiókkorlátozás miatt nem sikerült a bejelentkezés." - IDS_EMERGENCYLOGOFFTITLE "Log Off ReactOS" - IDS_EMERGENCYLOGOFF "Click OK to immediately log off. Any unsaved data will be lost. Use this only as a last resort." - IDS_EMERGENCYRESTARTTITLE "Emergency restart" - IDS_EMERGENCYRESTART "Click OK to immediately restart. Any unsaved data will be lost. Use this only as a last resort." + IDS_EMERGENCYLOGOFFTITLE "Kijelentkezés a ReactOS-ből" + IDS_EMERGENCYLOGOFF "Kattintson az OK-ra az azonnali kijelentkezéshez. Minden nem mentett adat el fog veszni. Csak végső megoldásként használja ezt." + IDS_EMERGENCYRESTARTTITLE "Vészhelyzeti újraindítás" + IDS_EMERGENCYRESTART "Kattintson az OK-ra az azonnali újraindításhoz. Minden nem mentett adat el fog veszni. Csak végső megoldásként használja ezt." END /* Shutdown Dialog Strings */ diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index 4fc189f36ad..e7837a056b8 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -804,11 +804,11 @@ BEGIN IDS_COPYERRORSAME "'%s' nem másolható: a forrás- és célfájl ugyanaz." IDS_MOVEERRORSUBFOLDER "'%s' nem mozgatható: a célmappa a forrásmappa egyik almappája." IDS_COPYERRORSUBFOLDER "'%s' nem másolható: a célmappa a forrásmappa egyik almappája." - IDS_MOVEERROR "Cannot move '%s': %s" - IDS_COPYERROR "Cannot copy '%s': %s" + IDS_MOVEERROR "'%s' nem mozgatható: %s" + IDS_COPYERROR "'%s' nem másolható: %s" - IDS_CREATEFILE_DENIED "Could not create file %1" - IDS_CREATEFILE_CAPTION "Error creating file" + IDS_CREATEFILE_DENIED "Nem sikerült a(z) %1 fájl létrehozása" + IDS_CREATEFILE_CAPTION "Hiba a fájl létrehozásakor" IDS_CREATEFOLDER_DENIED "Nem sikerült a(z) '%1' mappa létrehozása." IDS_CREATEFOLDER_CAPTION "Nem sikerült létrehozni a mappát" IDS_DELETEITEM_CAPTION "Állomány törlés megerősítése" @@ -888,7 +888,7 @@ BEGIN IDS_NETWORKPLACE "Hálózati helyek" IDS_NEWFOLDER "Új mappa" - IDS_NEWITEMFORMAT "New %s" + IDS_NEWITEMFORMAT "Új %s" IDS_DRIVE_FIXED "Helyi lemez" IDS_DRIVE_CDROM "CD-meghajtó" @@ -905,7 +905,7 @@ BEGIN IDS_SHELL_ABOUT_AUTHORS "&Készítők" IDS_SHELL_ABOUT_BACK "< &Vissza" - FCIDM_SHVIEW_NEW "Ne&w" /* A menu item with an ampersand */ + FCIDM_SHVIEW_NEW "Ú&j" /* A menu item with an ampersand */ FCIDM_SHVIEW_NEWFOLDER "&Mappa" FCIDM_SHVIEW_NEWLINK "&Parancsikon" IDS_FOLDER_OPTIONS "Mappabeállítások" From f0995dac581f7db5c70c8e6ae054b266f53a68e9 Mon Sep 17 00:00:00 2001 From: "Carl J. Bialorucki" Date: Sun, 3 Sep 2023 13:18:23 -0600 Subject: [PATCH 11/27] [LOGON] Several improvements for screensaver (#5641) - Currently the logo moves around every two seconds. This is not consistent with Windows Server 2003 (and other versions) and is very distracting. Increase the interval to every ten seconds, which matches Win2003. - There are currently two identical copies of the logo bitmap in the screensaver. Use only one copy of the logo bitmap. - Shrink the space around the logo bitmap. This should save some disk space but more importantly allow the logo to reach closer to the edges of the screen, similar to Win2003. - Remove unneeded includes. --- base/applications/screensavers/logon/logon.c | 164 +++++++----------- base/applications/screensavers/logon/logon.rc | 5 +- .../applications/screensavers/logon/res/0.bmp | Bin 230454 -> 101078 bytes .../applications/screensavers/logon/res/1.bmp | Bin 230454 -> 0 bytes 4 files changed, 71 insertions(+), 98 deletions(-) delete mode 100644 base/applications/screensavers/logon/res/1.bmp diff --git a/base/applications/screensavers/logon/logon.c b/base/applications/screensavers/logon/logon.c index 20e66f2fb70..bf84b782723 100644 --- a/base/applications/screensavers/logon/logon.c +++ b/base/applications/screensavers/logon/logon.c @@ -18,127 +18,95 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #include #include #include #include #include -#include -#include #include "resource.h" -#define RANDOM( min, max ) ((rand() % (int)(((max)+1) - (min))) + (min)) +#define RANDOM(min, max) ((rand() % (int)(((max)+1) - (min))) + (min)) -#define APPNAME _T("Logon") #define APP_TIMER 1 -#define APP_TIMER_INTERVAL 2000 +#define APP_TIMER_INTERVAL 10000 +static HBITMAP GetScreenSaverBitmap(VOID) { - OSVERSIONINFOEX osvi; - - ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); - GetVersionEx ((OSVERSIONINFO *) &osvi); - - switch(osvi.wProductType) - { - case VER_NT_WORKSTATION: - return LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_WORKSTATION), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - break; - default: - return LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_SERVER), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - break; - } + OSVERSIONINFOEX osvi = {0}; + osvi.dwOSVersionInfoSize = sizeof(osvi); + GetVersionEx((POSVERSIONINFO)&osvi); + + return LoadImageW(GetModuleHandle(NULL), + osvi.wProductType == VER_NT_WORKSTATION ? + MAKEINTRESOURCEW(IDB_WORKSTATION) : MAKEINTRESOURCEW(IDB_SERVER), + IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); } LRESULT CALLBACK -ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +ScreenSaverProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { - static RECT rect; static HBITMAP bitmap; - switch (message) + switch (uMsg) { case WM_CREATE: { - bitmap = GetScreenSaverBitmap (); + bitmap = GetScreenSaverBitmap(); if (bitmap == NULL) { - MessageBox(hWnd, - _T("Fatal Error: Could not load bitmap"), - _T("Error"), - MB_OK | MB_ICONEXCLAMATION); + /* Extremely unlikely, message not localized. */ + MessageBoxW(hWnd, + L"Fatal Error: Could not load bitmap", + L"Error", + MB_OK | MB_ICONEXCLAMATION); } - SetTimer(hWnd, - APP_TIMER, - APP_TIMER_INTERVAL, - NULL); - - break; + SetTimer(hWnd, APP_TIMER, APP_TIMER_INTERVAL, NULL); + break; } case WM_PAINT: { - BITMAP bm; /* Bitmap structure as seen in bmWidth & bmHeight */ - PAINTSTRUCT ps; - HDC hdc; - HDC hdcMem; - HBITMAP hbmOld; - - // Obtain window coordinates. - GetClientRect (hWnd, &rect); - - hdc = BeginPaint(hWnd, &ps); - hdcMem = CreateCompatibleDC(hdc); - hbmOld = SelectObject(hdcMem, bitmap); - - GetObject(bitmap, sizeof(bm), &bm); - - if (rect.right < bm.bmWidth || - rect.bottom < bm.bmHeight) - { - StretchBlt( - hdc, - RANDOM (0, rect.right - (bm.bmWidth /5)), - RANDOM (0, rect.bottom - (bm.bmHeight /5)), - bm.bmWidth /5, - bm.bmHeight /5, - hdcMem, - 0, - 0, - bm.bmWidth, - bm.bmHeight, - SRCCOPY); - } - else - { - BitBlt( - hdc, - RANDOM (0, rect.right - bm.bmWidth), - RANDOM (0, rect.bottom - bm.bmHeight), - bm.bmWidth, - bm.bmHeight, - hdcMem, - 0, - 0, - SRCCOPY); - } - - SelectObject(hdcMem, hbmOld); - DeleteDC(hdcMem); - - EndPaint(hWnd, &ps); - break; + BITMAP bm; + PAINTSTRUCT ps; + HDC hdc; + HDC hdcMem; + HBITMAP hbmOld; + RECT rect; + + hdc = BeginPaint(hWnd, &ps); + hdcMem = CreateCompatibleDC(hdc); + hbmOld = SelectObject(hdcMem, bitmap); + GetObjectW(bitmap, sizeof(bm), &bm); + + GetClientRect(hWnd, &rect); + if (rect.right < bm.bmWidth || rect.bottom < bm.bmHeight) + { + StretchBlt(hdc, RANDOM(0, rect.right - (bm.bmWidth / 5)), + RANDOM(0, rect.bottom - (bm.bmHeight / 5)), + bm.bmWidth / 5, bm.bmHeight / 5, hdcMem, 0, 0, + bm.bmWidth, bm.bmHeight, SRCCOPY); + } + else + { + BitBlt(hdc, RANDOM(0, rect.right - bm.bmWidth), + RANDOM(0, rect.bottom - bm.bmHeight), + bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY); + } + + SelectObject(hdcMem, hbmOld); + DeleteDC(hdcMem); + EndPaint(hWnd, &ps); + break; } case WM_TIMER: { - InvalidateRect(hWnd, NULL, 1); - break; + InvalidateRect(hWnd, NULL, TRUE); + break; } case WM_DESTROY: { @@ -147,10 +115,11 @@ ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) PostQuitMessage(0); break; } - default: - // Pass Windows Messages to the default screensaver window procedure - return DefScreenSaverProc(hWnd, message, wParam, lParam); + { + /* Pass window messages to the default screensaver window procedure */ + return DefScreenSaverProc(hWnd, uMsg, wParam, lParam); + } } return 0; @@ -163,19 +132,20 @@ ScreenSaverConfigureDialog(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) return FALSE; } -// This function is only called one time before opening the configuration dialog. -// Use it to show a message that no configuration is necessary and return FALSE to indicate that no configuration dialog shall be opened. +/* This function is only called once before opening the configuration dialog. + * Use it to show a message that no configuration is necessary and return FALSE to indicate that no configuration dialog shall be opened. + */ BOOL WINAPI RegisterDialogClasses(HANDLE hInst) { - TCHAR szMessage[256]; - TCHAR szTitle[25]; + WCHAR szMessage[256]; + WCHAR szTitle[25]; - LoadString(hInst, IDS_TEXT, szMessage, sizeof(szMessage) / sizeof(TCHAR)); - LoadString(hInst, IDS_DESCRIPTION, szTitle, sizeof(szTitle) / sizeof(TCHAR)); + LoadStringW(hInst, IDS_TEXT, szMessage, _countof(szMessage)); + LoadStringW(hInst, IDS_DESCRIPTION, szTitle, _countof(szTitle)); - MessageBox(NULL, szMessage, szTitle, MB_OK | MB_ICONEXCLAMATION); + MessageBoxW(NULL, szMessage, szTitle, MB_OK | MB_ICONEXCLAMATION); return FALSE; } diff --git a/base/applications/screensavers/logon/logon.rc b/base/applications/screensavers/logon/logon.rc index 329adc901a1..710bb93ec0a 100644 --- a/base/applications/screensavers/logon/logon.rc +++ b/base/applications/screensavers/logon/logon.rc @@ -15,8 +15,11 @@ IDI_ICON ICON DISCARDABLE "res/icon_logon.ico" #include +/* To change the bitmap used for Workstation or Server + * versions, add the new bitmap and update the path below. + */ IDB_WORKSTATION BITMAP "res/0.bmp" -IDB_SERVER BITMAP "res/1.bmp" +IDB_SERVER BITMAP "res/0.bmp" #include diff --git a/base/applications/screensavers/logon/res/0.bmp b/base/applications/screensavers/logon/res/0.bmp index 3f99e1d56ea691ecd1f4dbb3ee1e963a05e9b24b..d692ced1ca56b4b843cd6770e11d9e16c23414fe 100644 GIT binary patch delta 1500 zcmYLJ4M<&O820_F(@r~hm*u*8nWo(B>PkJ!Ym05RxoVZ*0x4>ONRea|vr7%5u}wDU z$4$1|Vf!#Pvb8}&naXkZlUwF!P#`Sn&u}z#GQ+i9a&SpjiM`Kvy~hjZ;rX8Td4Iki zZtSD1vExQ?d+k^|W#IQ1f5rS==I;!Dl;LO0$mnX9_YI1Ie)~wCEH9<}sGZ{+o3P~T zMHF;%f4f^OsoCrQB1Tt{Wkz;4ee=hRJYhCPVJUi3wWr`%uL#pZ4sQJ2mq} zI@fZ$Zg>mRZAet7Bc{9Nwzn|2g(cUoqX4=GqjrVUkg#M&9;L{h67uP}oQ_0A)DG$1 zGO>azXY1dSdgat7)_X(B=kF)enM-h`LbYFo0llq~sP2}4hqLQ#85s?3DKJpI9P*<|)sq|U+oWpqF06b z_(Mjy_%&a|bBEa-J4#JL4SfQ9{{(R3r@-VXxX*viJmrp@h4An>1ZR7IXZxsGsHOq% zqCxQKuYjkAp)_6sFZdofIRgCb2gVaexpUJ`s8ukgW8*q@l~MNf2@YP<1!o{n&jL^1 zLh$VY4mQsrxHbuSW*+if56j*ELT+A!T%0KwXASYDP~G=3PnC^i3AU7FL(nin za7Wg_9WDe<2ANCy9G4v`W{W)VGmqT%h~SYo+3+n?z&ErJxNkGCYAbMIyViGTy#~&0 zJDJDoAY6PA?e^^guWCSDOc8qpW#g|Q*4oT5IXueUs@{S;-vXPSB>oPBcUzGi-mB$7 z9&mm?%c&G~5RS+PaBOIYL!V}{1M>MO7U~-%rggcSQw_~W}N$u#;jx)frFX7YY zo$SVB{k@PQE^vdw#*%UHfp5TDzXfjk4oP@eu@Q9Vr(>u~mti~fBMdu!1)Afq=?fVB t9kq{4iQPigUFV=|!Q%+b!ojcAP}gpXh>-kz`5&N-I>8L}@|@^c{Xg*T{S^QJ delta 1874 zcmaJ?e{2+05bj=aW$m^{iWgVbJFe!^qgOf01>0I_y9cP`Dp)E|s?rvkO9f0lLW~BC ze;5OeQS=;a(MC!dK}{3vIl+xuA&sV~CKO|A{VfeYVqz3)YK%%6e0y)^x{ZmKZ0>vC zeBZozGjFq#uc+^J7x`DOuY5K?&-qn~XPI~`B`d`f*<-XDehQfP=~^>3E#(cc%mi@iAWe5gSJcK z&E~AVHRj5xLtCqk$3ycukqZmMZcc;gs1Dun;YZaUn_0j4a z2fs$W(yxm$#8JW}X)6TQW(|@XB5BJDPdDlCV6_g*o5N{qm2+gc`hfm&>^z?mXJd)E zeAZ?i3O1C$c)5mscihMU(E8#Kfg8l;jDsHis4s6EH6 z@A#+*JX%-hyiSJdktsS@YIR`3^s>xf3y3p7-BdY9&K^! zecAcG6*4o{b#&cSNNl^zy-!=k*w#8XPBAe2qt-B|UyWWY%?&`<1w0n+V!gTVNSM`W(bw~6T+BqskPf!#wC`uttV^gdRn zs91N3vL3TZxbOo4sbK_=Vhs zzY+8J@5D^aNB}Q=q~gXu=|uP!g#%Z~aA20em1`2%TRaM((+e1tUeD-|rpOfb-v!KV zFJkoRB1P6{M;9~K<0H=Lg{>Hhti|qF!rHN0SX;4_(UFpzYeu#6L+nbHvf}JA_Q%SJ z>lJ?0KDM02o(dN4ig7y8UwdLDE2^qk(SIi)utrq7a1|@WWukU`WihH>!|2Vs8HtNP zjoFuA?!tYH68CfT)JEp~o0#j~!f0kIMV&Xp-u@6Dadex~mA#Ah%68WF?_hL8l3h-V zpX_AU4?Ee_@F;0vD6QJVU91-`w;kD|?8)YaGY7rB!4A>Fp}k7!P5=EW`WF8SQZJ9` diff --git a/base/applications/screensavers/logon/res/1.bmp b/base/applications/screensavers/logon/res/1.bmp deleted file mode 100644 index 3f99e1d56ea691ecd1f4dbb3ee1e963a05e9b24b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230454 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 From d55e33d0f3cf7ca8a1b087a677ef5726834130aa Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 4 Sep 2023 21:11:24 +0900 Subject: [PATCH 12/27] [COMDLG32] GetOpen/GetSaveFileName: Improve extension handling (#5640) - Improve GetOpenFileName and GetSaveFileName functions. - Add FILEDLG95_GetFallbackExtension and FILEDLG95_AddDotExtIfNeeded helper functions. - Modify FILEDLG95_ValidatePathAction and FILEDLG95_OnOpen functions. CORE-19148, CORE-15020 --- dll/win32/comdlg32/cdlg.h | 6 + dll/win32/comdlg32/filedlg.c | 202 +++++++++++++++------------- dll/win32/comdlg32/filedlgbrowser.h | 5 +- 3 files changed, 118 insertions(+), 95 deletions(-) diff --git a/dll/win32/comdlg32/cdlg.h b/dll/win32/comdlg32/cdlg.h index 7570acebb9e..4c8be081e84 100644 --- a/dll/win32/comdlg32/cdlg.h +++ b/dll/win32/comdlg32/cdlg.h @@ -199,8 +199,14 @@ HRESULT FileSaveDialog_Constructor(IUnknown *pUnkOuter, REFIID riid, void **ppv) /* Shared helper functions */ void COMDLG32_GetCanonicalPath(PCIDLIST_ABSOLUTE pidlAbsCurrent, LPWSTR lpstrFile, LPWSTR lpstrPathAndFile) DECLSPEC_HIDDEN; +#ifdef __REACTOS__ +struct FileOpenDlgInfos; +int FILEDLG95_ValidatePathAction(struct FileOpenDlgInfos *fodInfos, LPWSTR lpstrPathAndFile, IShellFolder **ppsf, + HWND hwnd, DWORD flags, BOOL isSaveDlg, int defAction) DECLSPEC_HIDDEN; +#else int FILEDLG95_ValidatePathAction(LPWSTR lpstrPathAndFile, IShellFolder **ppsf, HWND hwnd, DWORD flags, BOOL isSaveDlg, int defAction) DECLSPEC_HIDDEN; +#endif int COMDLG32_SplitFileNames(LPWSTR lpstrEdit, UINT nStrLen, LPWSTR *lpstrFileList, UINT *sizeUsed) DECLSPEC_HIDDEN; void FILEDLG95_OnOpenMessage(HWND hwnd, int idCaption, int idText) DECLSPEC_HIDDEN; diff --git a/dll/win32/comdlg32/filedlg.c b/dll/win32/comdlg32/filedlg.c index 54bbc544aab..8aa8eae3987 100644 --- a/dll/win32/comdlg32/filedlg.c +++ b/dll/win32/comdlg32/filedlg.c @@ -2826,8 +2826,98 @@ void FILEDLG95_OnOpenMessage(HWND hwnd, int idCaption, int idText) MessageBoxW(hwnd,strMsgText, strMsgTitle, MB_OK | MB_ICONHAND); } +#ifdef __REACTOS__ +/* The return value needs LocalFree */ +static LPWSTR FILEDLG95_GetFallbackExtension(FileOpenDlgInfos *fodInfos, LPWSTR lpstrPathAndFile) +{ + LPWSTR lpstrFilter, the_ext = NULL, pchDot = NULL; + + /* Without lpstrDefExt, append no extension */ + if (!fodInfos->defext) + return NULL; + + /* Get filter extensions */ + lpstrFilter = (LPWSTR)CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB, + fodInfos->ofnInfos->nFilterIndex - 1); + if (lpstrFilter != (LPWSTR)CB_ERR && lpstrFilter && *lpstrFilter) + { + LPWSTR pchSemicolon = wcschr(lpstrFilter, L';'); + + if (pchSemicolon) + *pchSemicolon = UNICODE_NULL; + + pchDot = wcschr(lpstrFilter, L'.'); + + if (pchDot && pchDot[1] && !wcschr(pchDot, L'*') && !wcschr(pchDot, L'?')) + the_ext = StrDupW(pchDot + 1); + + if (pchSemicolon) + *pchSemicolon = L';'; + } + + if (!the_ext && (!pchDot || pchDot[1])) + { + /* use default extension if no extension in filter */ + the_ext = StrDupW(fodInfos->defext); + } + + return the_ext; +} + +static BOOL +FILEDLG95_AddDotExtIfNeeded(FileOpenDlgInfos *fodInfos, LPWSTR lpstrPathAndFile) +{ + BOOL ret = FALSE; + LPWSTR ext = PathFindExtensionW(lpstrPathAndFile); + int PathLength = lstrlenW(lpstrPathAndFile); + LPWSTR the_ext = FILEDLG95_GetFallbackExtension(fodInfos, lpstrPathAndFile); + + if (the_ext && *the_ext && + (*ext == UNICODE_NULL || lstrcmpiW(ext + 1, the_ext) != 0)) + { + if (strlenW(lpstrPathAndFile) + 1 + strlenW(the_ext) + 1 <= + fodInfos->ofnInfos->nMaxFile) + { + /* Make the extension lowercase */ + CharLowerW(the_ext); + /* Append it (with dot) to the file */ + lstrcatW(lpstrPathAndFile, L"."); + lstrcatW(lpstrPathAndFile, the_ext); + /* update ext */ + ext = PathFindExtensionW(lpstrPathAndFile); + ret = TRUE; + } + } + + LocalFree(the_ext); + + /* In Open dialog: if file does not exist try without extension */ + if (!(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) && !PathFileExistsW(lpstrPathAndFile)) + { + lpstrPathAndFile[PathLength] = UNICODE_NULL; + ret = FALSE; + } + + /* Set/clear the output OFN_EXTENSIONDIFFERENT flag */ + if (*ext) + ext++; + if (!lstrcmpiW(fodInfos->defext, ext)) + fodInfos->ofnInfos->Flags &= ~OFN_EXTENSIONDIFFERENT; + else + fodInfos->ofnInfos->Flags |= OFN_EXTENSIONDIFFERENT; + + return ret; +} +#endif + +#ifdef __REACTOS__ +int FILEDLG95_ValidatePathAction(struct FileOpenDlgInfos *fodInfos, LPWSTR lpstrPathAndFile, + IShellFolder **ppsf, HWND hwnd, DWORD flags, BOOL isSaveDlg, + int defAction) +#else int FILEDLG95_ValidatePathAction(LPWSTR lpstrPathAndFile, IShellFolder **ppsf, HWND hwnd, DWORD flags, BOOL isSaveDlg, int defAction) +#endif { int nOpenAction = defAction; LPWSTR lpszTemp, lpszTemp1; @@ -2924,8 +3014,17 @@ int FILEDLG95_ValidatePathAction(LPWSTR lpstrPathAndFile, IShellFolder **ppsf, { if( (flags & OFN_FILEMUSTEXIST) && !isSaveDlg ) { +#ifdef __REACTOS__ + FILEDLG95_AddDotExtIfNeeded(fodInfos, lpstrPathAndFile); + if (!PathFileExistsW(lpstrPathAndFile)) + { + FILEDLG95_OnOpenMessage(hwnd, 0, IDS_FILENOTEXISTING); + break; + } +#else FILEDLG95_OnOpenMessage(hwnd, 0, IDS_FILENOTEXISTING); break; +#endif } } /* change to the current folder */ @@ -3011,7 +3110,11 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) else nOpenAction = ONOPEN_BROWSE; +#ifdef __REACTOS__ + nOpenAction = FILEDLG95_ValidatePathAction(fodInfos, lpstrPathAndFile, &lpsf, hwnd, +#else nOpenAction = FILEDLG95_ValidatePathAction(lpstrPathAndFile, &lpsf, hwnd, +#endif fodInfos->ofnInfos->Flags, fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG, nOpenAction); @@ -3088,7 +3191,9 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) case ONOPEN_OPEN: /* fill in the return struct and close the dialog */ TRACE("ONOPEN_OPEN %s\n", debugstr_w(lpstrPathAndFile)); { +#ifndef __REACTOS__ WCHAR *ext = NULL; +#endif /* update READONLY check box flag */ if ((SendMessageW(GetDlgItem(hwnd,IDC_OPENREADONLY),BM_GETCHECK,0,0) & 0x03) == BST_CHECKED) @@ -3097,104 +3202,13 @@ BOOL FILEDLG95_OnOpen(HWND hwnd) fodInfos->ofnInfos->Flags &= ~OFN_READONLY; /* Attach the file extension with file name*/ - ext = PathFindExtensionW(lpstrPathAndFile); #ifdef __REACTOS__ - if (*ext == UNICODE_NULL && fodInfos->defext) - { - LPWSTR filterExt = NULL, lpstrFilter = NULL, pch, pchNext; - LPCWSTR the_ext = NULL; - static const WCHAR szwDot[] = {'.',0}; - int PathLength = lstrlenW(lpstrPathAndFile); - - /* get filter extensions */ - lpstrFilter = (LPWSTR) CBGetItemDataPtr(fodInfos->DlgInfos.hwndFileTypeCB, - fodInfos->ofnInfos->nFilterIndex - 1); - if (lpstrFilter != (LPWSTR)CB_ERR) /* control is not empty */ - { - LPWSTR filterSearchIndex, pchFirst = NULL; - filterExt = heap_alloc((lstrlenW(lpstrFilter) + 1) * sizeof(WCHAR)); - if (filterExt) - { - strcpyW(filterExt, lpstrFilter); - - if (ext && *ext) - { - /* find ext in filter */ - for (pch = filterExt; pch && *pch; pch = pchNext) - { - filterSearchIndex = strchrW(pch, ';'); - if (filterSearchIndex) - { - filterSearchIndex[0] = 0; - pchNext = filterSearchIndex + 1; - } - else - { - pchNext = NULL; - } - - while (*pch == '*' || *pch == '.' || *pch == '?') - { - ++pch; - } - - if (!pchFirst) - pchFirst = pch; - - if (lstrcmpiW(pch, &ext[1]) == 0) - { - the_ext = pch; - break; - } - } - - /* use first one if not found */ - if (!the_ext && pchFirst && *pchFirst) - { - the_ext = pchFirst; - } - } - } - } - - if (!the_ext) - { - /* use default extension if no extension in filter */ - the_ext = fodInfos->defext; - } - - if (the_ext && *the_ext && lstrcmpiW(&ext[1], the_ext) != 0) - { - if (strlenW(lpstrPathAndFile) + 1 + strlenW(the_ext) + 1 <= - fodInfos->ofnInfos->nMaxFile) - { - /* append the dot */ - lstrcatW(lpstrPathAndFile, szwDot); - /* append the extension */ - lstrcatW(lpstrPathAndFile, the_ext); - /* update ext */ - ext = PathFindExtensionW(lpstrPathAndFile); - } - } - - heap_free(filterExt); - - /* In Open dialog: if file does not exist try without extension */ - if (!(fodInfos->DlgInfos.dwDlgProp & FODPROP_SAVEDLG) && !PathFileExistsW(lpstrPathAndFile)) - lpstrPathAndFile[PathLength] = 0; - - /* Set/clear the output OFN_EXTENSIONDIFFERENT flag */ - if (*ext) - ext++; - if (!lstrcmpiW(fodInfos->defext, ext)) - fodInfos->ofnInfos->Flags &= ~OFN_EXTENSIONDIFFERENT; - else - fodInfos->ofnInfos->Flags |= OFN_EXTENSIONDIFFERENT; - } - + /* Add extension if necessary */ + FILEDLG95_AddDotExtIfNeeded(fodInfos, lpstrPathAndFile); /* update dialog data */ SetWindowTextW(fodInfos->DlgInfos.hwndFileName, PathFindFileNameW(lpstrPathAndFile)); #else /* __REACTOS__ */ + ext = PathFindExtensionW(lpstrPathAndFile); if (! *ext && fodInfos->defext) { /* if no extension is specified with file name, then */ diff --git a/dll/win32/comdlg32/filedlgbrowser.h b/dll/win32/comdlg32/filedlgbrowser.h index 67c07a8793c..ee7fbdc79d8 100644 --- a/dll/win32/comdlg32/filedlgbrowser.h +++ b/dll/win32/comdlg32/filedlgbrowser.h @@ -47,8 +47,11 @@ * Data structure */ - +#ifdef __REACTOS__ +typedef struct FileOpenDlgInfos +#else typedef struct +#endif { LPOPENFILENAMEW ofnInfos; BOOL unicode; From b68a3f329c2f9cb8daad63431ca1b92ce6ac4ab9 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Tue, 5 Sep 2023 09:03:32 +0900 Subject: [PATCH 13/27] [ATL][ATL_APITEST] Implement CImageDC class (#5643) - Use reference count for CImage::GetDC / CImage::ReleaseDC. - Add CImageDC class. - Delete modules/rostests/apitests/atl/CImage_WIP.txt. CORE-19008 --- modules/rostests/apitests/atl/CImage.cpp | 20 +++++ modules/rostests/apitests/atl/CImage_WIP.txt | 86 -------------------- sdk/lib/atl/atlimage.h | 65 +++++++++++---- 3 files changed, 70 insertions(+), 101 deletions(-) delete mode 100644 modules/rostests/apitests/atl/CImage_WIP.txt diff --git a/modules/rostests/apitests/atl/CImage.cpp b/modules/rostests/apitests/atl/CImage.cpp index 005cd4d9295..3ee98304da8 100644 --- a/modules/rostests/apitests/atl/CImage.cpp +++ b/modules/rostests/apitests/atl/CImage.cpp @@ -235,6 +235,26 @@ static void Test_LoadSaveImage(void) color = image1.GetPixel(5, 5); ok(color == RGB(255, 0,0), "Expected color to be 255, 0, 0; was: %i, %i, %i (for %i)\n", GetRValue(color), GetGValue(color), GetBValue(color), n); + { + CImageDC dc1(image1); + ::SetPixel(dc1, 5, 5, RGB(0, 255, 0)); + { + CImageDC dc2(image1); + ::SetPixel(dc2, 5, 5, RGB(0, 0, 255)); + } + } + + { + HDC hdcImage = image1.GetDC(); + color = ::GetPixel(hdcImage, 5, 5); + ok_long(color, RGB(0, 0, 255)); + + ::SetPixel(hdcImage, 5, 5, RGB(255, 0, 0)); + color = ::GetPixel(hdcImage, 5, 5); + ok_long(color, RGB(255, 0, 0)); + image1.ReleaseDC(); + } + bOK = DeleteFile(file); ok(bOK, "Expected bOK to be TRUE, was: %d (for %i)\n", bOK, n); } diff --git a/modules/rostests/apitests/atl/CImage_WIP.txt b/modules/rostests/apitests/atl/CImage_WIP.txt deleted file mode 100644 index 7cc02b77afe..00000000000 --- a/modules/rostests/apitests/atl/CImage_WIP.txt +++ /dev/null @@ -1,86 +0,0 @@ -Test files: - -atl_apitest: CImage class from reactos -CImage.exe : CImage class from microsoft - -================================================================================================================ -Windows Server 2003 SP2: -================================================================================================================ ->atl_apitest.exe CImage -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(234): Test failed: Expected bpp to be 8, was: 32 -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 0) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 1) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 2) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(260): Test failed: Expected bpp to be 24, was: 32 (for 3) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 4) - -CImage: 79 tests executed (0 marked as todo, 6 failures), 0 skipped. -================================================================================================================ ->CImage.exe -CImage: 79 tests executed (0 marked as todo, 0 failures), 0 skipped. -================================================================================================================ -================================================================================================================ -Windows 10: -================================================================================================================ ->atl_apitest.exe CImage -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(234): Test failed: Expected bpp to be 8, was: 32 -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 0) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 1) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 2) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(260): Test failed: Expected bpp to be 24, was: 32 (for 3) -R:\src\trunk\reactos\modules\rostests\apitests\atl\CImage.cpp(265): Test failed: Expected bpp to be 8, was: 32 (for 4) - -CImage: 79 tests executed (0 marked as todo, 6 failures), 0 skipped. -================================================================================================================ ->CImage.exe -CImage: 79 tests executed (0 marked as todo, 0 failures), 0 skipped. -================================================================================================================ -================================================================================================================ -ReactOS: -================================================================================================================ ->atl_apitest.exe CImage -CImage.cpp:234: Test failed: Expected bpp to be 8, was: 32 -CImage.cpp:265: Test failed: Expected bpp to be 8, was: 32 (for 0) -CImage.cpp:245: Test failed: Expected hr to be S_OK, was: 80004005 (for 1) -CImage.cpp:251: Test failed: Expected hr to be S_OK, was: 80004005 (for 1) -CImage.cpp:254: Test failed: Expected width to be 48, was: 0 (for 1) -CImage.cpp:256: Test failed: Expected height to be 48, was: 0 (for 1) -CImage.cpp:265: Test failed: Expected bpp to be 8, was: 0 (for 1) -CImage.cpp:148: Test failed: Expected status to be 0, was: 1 -CImage.cpp:149: Test failed: Expected a valid bitmap -CImage.cpp:245: Test failed: Expected hr to be S_OK, was: 80004005 (for 2) -CImage.cpp:251: Test failed: Expected hr to be S_OK, was: 80004005 (for 2) -CImage.cpp:254: Test failed: Expected width to be 48, was: 0 (for 2) -CImage.cpp:256: Test failed: Expected height to be 48, was: 0 (for 2) -CImage.cpp:265: Test failed: Expected bpp to be 8, was: 0 (for 2) -CImage.cpp:148: Test failed: Expected status to be 0, was: 1 -CImage.cpp:149: Test failed: Expected a valid bitmap -CImage.cpp:260: Test failed: Expected bpp to be 24, was: 32 (for 3) -CImage.cpp:154: Test failed: Expected PixelFormat to be 0x21808, was: 0x30803 -CImage.cpp:265: Test failed: Expected bpp to be 8, was: 32 (for 4) -CImage.cpp:154: Test failed: Expected PixelFormat to be 0x30803, was: 0x21808 - -CImage: 77 tests executed (0 marked as todo, 20 failures), 0 skipped. -================================================================================================================ ->CImage.exe -../CImage.cpp (245): Expected hr to be S_OK, was: 80004005 (for 1) -../CImage.cpp (251): Expected hr to be S_OK, was: 80004005 (for 1) -../CImage.cpp (254): Expected width to be 48, was: 0 (for 1) -../CImage.cpp (256): Expected height to be 48, was: 0 (for 1) -../CImage.cpp (265): Expected bpp to be 8, was: 0 (for 1) -../CImage.cpp (148): Expected status to be 0, was: 1 -../CImage.cpp (149): Expected a valid bitmap -../CImage.cpp (245): Expected hr to be S_OK, was: 80004005 (for 2) -../CImage.cpp (251): Expected hr to be S_OK, was: 80004005 (for 2) -../CImage.cpp (254): Expected width to be 48, was: 0 (for 2) -../CImage.cpp (256): Expected height to be 48, was: 0 (for 2) -../CImage.cpp (265): Expected bpp to be 8, was: 0 (for 2) -../CImage.cpp (148): Expected status to be 0, was: 1 -../CImage.cpp (149): Expected a valid bitmap -../CImage.cpp (260): Expected bpp to be 24, was: 8 (for 3) -../CImage.cpp (154): Expected PixelFormat to be 0x21808, was: 0x30803 -../CImage.cpp (265): Expected bpp to be 8, was: 24 (for 4) -../CImage.cpp (154): Expected PixelFormat to be 0x30803, was: 0x21808 -CImage: 77 tests executed (0 marked as todo, 18 failures), 0 skipped. -================================================================================================================ - diff --git a/sdk/lib/atl/atlimage.h b/sdk/lib/atl/atlimage.h index 31cceac8c76..c77c4dbc67b 100644 --- a/sdk/lib/atl/atlimage.h +++ b/sdk/lib/atl/atlimage.h @@ -6,12 +6,6 @@ #ifndef __ATLIMAGE_H__ #define __ATLIMAGE_H__ -// !!!! -// TODO: The backend (gdi+) that this class relies on is not yet complete! -// Before that is finished, this class will not be a perfect replacement. -// See rostest/apitests/atl/CImage_WIP.txt for test results. -// !!!! - #pragma once #include // for ATL Core @@ -93,28 +87,41 @@ class CImage HDC GetDC() const throw() { - if (m_hDC) - return m_hDC; + ATLASSERT(m_nDCRefCount >= 0); + if (::InterlockedIncrement(&m_nDCRefCount) == 1) + { + ATLASSERT(m_hDC == NULL); + ATLASSERT(m_hOldBitmap == NULL); + + m_hDC = ::CreateCompatibleDC(NULL); + ATLASSERT(m_hDC != NULL); + + m_hOldBitmap = (HBITMAP)::SelectObject(m_hDC, m_hBitmap); + ATLASSERT(m_hOldBitmap != NULL); + } - m_hDC = ::CreateCompatibleDC(NULL); - m_hOldBitmap = (HBITMAP)::SelectObject(m_hDC, m_hBitmap); return m_hDC; } void ReleaseDC() const throw() { - ATLASSERT(m_hDC); + ATLASSERT(m_nDCRefCount > 0); - if (m_hDC == NULL) + if (::InterlockedDecrement(&m_nDCRefCount) != 0) return; if (m_hOldBitmap) { + ATLASSERT(m_hDC != NULL); ::SelectObject(m_hDC, m_hOldBitmap); m_hOldBitmap = NULL; } - ::DeleteDC(m_hDC); - m_hDC = NULL; + + if (m_hDC) + { + ::DeleteDC(m_hDC); + m_hDC = NULL; + } } BOOL AlphaBlend(HDC hDestDC, @@ -1016,6 +1023,7 @@ class CImage HBITMAP m_hBitmap; mutable HBITMAP m_hOldBitmap; mutable HDC m_hDC; + mutable LONG m_nDCRefCount = 0; DIBOrientation m_eOrientation; bool m_bHasAlphaChannel; bool m_bIsDIBSection; @@ -1213,7 +1221,34 @@ class CImage DECLSPEC_SELECTANY CImage::CInitGDIPlus CImage::s_gdiplus; -} +class CImageDC +{ +private: + const CImage& m_image; + HDC m_hDC; + +public: + CImageDC(const CImage& image) + : m_image(image) + , m_hDC(image.GetDC()) + { + } + + virtual ~CImageDC() throw() + { + m_image.ReleaseDC(); + } + + operator HDC() const throw() + { + return m_hDC; + } + + CImageDC(const CImageDC&) = delete; + CImageDC& operator=(const CImageDC&) = delete; +}; + +} // namespace ATL #endif From eb6561bbc703a883c0a59abf3407992fc2fb3e1f Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Tue, 5 Sep 2023 09:12:01 +0900 Subject: [PATCH 14/27] [ATL] atlimage.h: Replace throw() with noexcept throw() is deprecated in C++17. CORE-19008 --- sdk/lib/atl/atlimage.h | 148 ++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/sdk/lib/atl/atlimage.h b/sdk/lib/atl/atlimage.h index c77c4dbc67b..a8546b085c0 100644 --- a/sdk/lib/atl/atlimage.h +++ b/sdk/lib/atl/atlimage.h @@ -37,7 +37,7 @@ class CImage DIBOR_TOPDOWN // top-down DIB }; - CImage() throw() + CImage() noexcept { m_hBitmap = NULL; m_hOldBitmap = NULL; @@ -52,13 +52,13 @@ class CImage s_gdiplus.IncreaseCImageCount(); } - virtual ~CImage() throw() + virtual ~CImage() noexcept { Destroy(); s_gdiplus.DecreaseCImageCount(); } - operator HBITMAP() throw() + operator HBITMAP() noexcept { return m_hBitmap; } @@ -68,12 +68,12 @@ class CImage s_gdiplus.ReleaseGDIPlus(); } - void Attach(HBITMAP hBitmap, DIBOrientation eOrientation = DIBOR_DEFAULT) throw() + void Attach(HBITMAP hBitmap, DIBOrientation eOrientation = DIBOR_DEFAULT) noexcept { AttachInternal(hBitmap, eOrientation, -1); } - HBITMAP Detach() throw() + HBITMAP Detach() noexcept { m_eOrientation = DIBOR_DEFAULT; m_bHasAlphaChannel = false; @@ -85,7 +85,7 @@ class CImage return hBitmap; } - HDC GetDC() const throw() + HDC GetDC() const noexcept { ATLASSERT(m_nDCRefCount >= 0); if (::InterlockedIncrement(&m_nDCRefCount) == 1) @@ -103,7 +103,7 @@ class CImage return m_hDC; } - void ReleaseDC() const throw() + void ReleaseDC() const noexcept { ATLASSERT(m_nDCRefCount > 0); @@ -170,7 +170,7 @@ class CImage BOOL BitBlt(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, - int xSrc, int ySrc, DWORD dwROP = SRCCOPY) const throw() + int xSrc, int ySrc, DWORD dwROP = SRCCOPY) const noexcept { GetDC(); BOOL ret = ::BitBlt(hDestDC, xDest, yDest, nDestWidth, nDestHeight, @@ -179,18 +179,18 @@ class CImage return ret; } BOOL BitBlt(HDC hDestDC, int xDest, int yDest, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { return BitBlt(hDestDC, xDest, yDest, GetWidth(), GetHeight(), 0, 0, dwROP); } BOOL BitBlt(HDC hDestDC, const POINT& pointDest, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { return BitBlt(hDestDC, pointDest.x, pointDest.y, dwROP); } BOOL BitBlt(HDC hDestDC, const RECT& rectDest, const POINT& pointSrc, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { return BitBlt(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, @@ -198,18 +198,18 @@ class CImage pointSrc.x, pointSrc.y, dwROP); } - BOOL Create(int nWidth, int nHeight, int nBPP, DWORD dwFlags = 0) throw() + BOOL Create(int nWidth, int nHeight, int nBPP, DWORD dwFlags = 0) noexcept { return CreateEx(nWidth, nHeight, nBPP, BI_RGB, NULL, dwFlags); } BOOL CreateEx(int nWidth, int nHeight, int nBPP, DWORD eCompression, - const DWORD* pdwBitmasks = NULL, DWORD dwFlags = 0) throw() + const DWORD* pdwBitmasks = NULL, DWORD dwFlags = 0) noexcept { return CreateInternal(nWidth, nHeight, nBPP, eCompression, pdwBitmasks, dwFlags); } - void Destroy() throw() + void Destroy() noexcept { if (m_hBitmap) { @@ -218,7 +218,7 @@ class CImage } BOOL Draw(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, - int xSrc, int ySrc, int nSrcWidth, int nSrcHeight) const throw() + int xSrc, int ySrc, int nSrcWidth, int nSrcHeight) const noexcept { ATLASSERT(IsTransparencySupported()); if (m_bHasAlphaChannel) @@ -242,7 +242,7 @@ class CImage xSrc, ySrc, nSrcWidth, nSrcHeight); } } - BOOL Draw(HDC hDestDC, const RECT& rectDest, const RECT& rectSrc) const throw() + BOOL Draw(HDC hDestDC, const RECT& rectDest, const RECT& rectSrc) const noexcept { return Draw(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, @@ -251,28 +251,28 @@ class CImage rectSrc.right - rectSrc.left, rectSrc.bottom - rectSrc.top); } - BOOL Draw(HDC hDestDC, int xDest, int yDest) const throw() + BOOL Draw(HDC hDestDC, int xDest, int yDest) const noexcept { return Draw(hDestDC, xDest, yDest, GetWidth(), GetHeight()); } - BOOL Draw(HDC hDestDC, const POINT& pointDest) const throw() + BOOL Draw(HDC hDestDC, const POINT& pointDest) const noexcept { return Draw(hDestDC, pointDest.x, pointDest.y); } BOOL Draw(HDC hDestDC, int xDest, int yDest, - int nDestWidth, int nDestHeight) const throw() + int nDestWidth, int nDestHeight) const noexcept { return Draw(hDestDC, xDest, yDest, nDestWidth, nDestHeight, 0, 0, GetWidth(), GetHeight()); } - BOOL Draw(HDC hDestDC, const RECT& rectDest) const throw() + BOOL Draw(HDC hDestDC, const RECT& rectDest) const noexcept { return Draw(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, rectDest.bottom - rectDest.top); } - void *GetBits() throw() + void *GetBits() noexcept { ATLASSERT(IsDIBSection()); BYTE *pb = (BYTE *)m_bm.bmBits; @@ -283,14 +283,14 @@ class CImage return pb; } - int GetBPP() const throw() + int GetBPP() const noexcept { ATLASSERT(m_hBitmap); return m_bm.bmBitsPixel; } void GetColorTable(UINT iFirstColor, UINT nColors, - RGBQUAD* prgbColors) const throw() + RGBQUAD* prgbColors) const noexcept { ATLASSERT(IsDIBSection()); GetDC(); @@ -298,13 +298,13 @@ class CImage ReleaseDC(); } - int GetHeight() const throw() + int GetHeight() const noexcept { ATLASSERT(m_hBitmap); return m_bm.bmHeight; } - int GetMaxColorTableEntries() const throw() + int GetMaxColorTableEntries() const noexcept { ATLASSERT(IsDIBSection()); if (m_ds.dsBmih.biClrUsed && m_ds.dsBmih.biBitCount < 16) @@ -324,7 +324,7 @@ class CImage } } - int GetPitch() const throw() + int GetPitch() const noexcept { ATLASSERT(IsDIBSection()); if (m_eOrientation == DIBOR_BOTTOMUP) @@ -333,7 +333,7 @@ class CImage return m_bm.bmWidthBytes; } - COLORREF GetPixel(int x, int y) const throw() + COLORREF GetPixel(int x, int y) const noexcept { GetDC(); COLORREF ret = ::GetPixel(m_hDC, x, y); @@ -341,7 +341,7 @@ class CImage return ret; } - void* GetPixelAddress(int x, int y) throw() + void* GetPixelAddress(int x, int y) noexcept { ATLASSERT(IsDIBSection()); BYTE *pb = (BYTE *)GetBits(); @@ -350,35 +350,35 @@ class CImage return pb; } - COLORREF GetTransparentColor() const throw() + COLORREF GetTransparentColor() const noexcept { return m_clrTransparentColor; } - int GetWidth() const throw() + int GetWidth() const noexcept { ATLASSERT(m_hBitmap); return m_bm.bmWidth; } - bool IsDIBSection() const throw() + bool IsDIBSection() const noexcept { ATLASSERT(m_hBitmap); return m_bIsDIBSection; } - bool IsIndexed() const throw() + bool IsIndexed() const noexcept { ATLASSERT(IsDIBSection()); return GetBPP() <= 8; } - bool IsNull() const throw() + bool IsNull() const noexcept { return m_hBitmap == NULL; } - HRESULT Load(LPCTSTR pszFileName) throw() + HRESULT Load(LPCTSTR pszFileName) noexcept { if (!InitGDIPlus()) return E_FAIL; @@ -407,7 +407,7 @@ class CImage Attach(hbm); return (status == Ok ? S_OK : E_FAIL); } - HRESULT Load(IStream* pStream) throw() + HRESULT Load(IStream* pStream) noexcept { if (!InitGDIPlus()) return E_FAIL; @@ -435,13 +435,13 @@ class CImage } // NOTE: LoadFromResource loads BITMAP resource only - void LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName) throw() + void LoadFromResource(HINSTANCE hInstance, LPCTSTR pszResourceName) noexcept { HANDLE hHandle = ::LoadImage(hInstance, pszResourceName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); Attach(reinterpret_cast(hHandle)); } - void LoadFromResource(HINSTANCE hInstance, UINT nIDResource) throw() + void LoadFromResource(HINSTANCE hInstance, UINT nIDResource) noexcept { LoadFromResource(hInstance, MAKEINTRESOURCE(nIDResource)); } @@ -449,7 +449,7 @@ class CImage BOOL MaskBlt(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, HBITMAP hbmMask, int xMask, int yMask, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { ATLASSERT(IsTransparencySupported()); GetDC(); @@ -461,20 +461,20 @@ class CImage } BOOL MaskBlt(HDC hDestDC, const RECT& rectDest, const POINT& pointSrc, HBITMAP hbmMask, const POINT& pointMask, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { return MaskBlt(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, rectDest.bottom - rectDest.top, pointSrc.x, pointSrc.y, hbmMask, pointMask.x, pointMask.y, dwROP); } BOOL MaskBlt(HDC hDestDC, int xDest, int yDest, - HBITMAP hbmMask, DWORD dwROP = SRCCOPY) const throw() + HBITMAP hbmMask, DWORD dwROP = SRCCOPY) const noexcept { return MaskBlt(hDestDC, xDest, yDest, GetWidth(), GetHeight(), 0, 0, hbmMask, 0, 0, dwROP); } BOOL MaskBlt(HDC hDestDC, const POINT& pointDest, - HBITMAP hbmMask, DWORD dwROP = SRCCOPY) const throw() + HBITMAP hbmMask, DWORD dwROP = SRCCOPY) const noexcept { return MaskBlt(hDestDC, pointDest.x, pointDest.y, hbmMask, dwROP); } @@ -482,7 +482,7 @@ class CImage BOOL PlgBlt(HDC hDestDC, const POINT* pPoints, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, HBITMAP hbmMask = NULL, - int xMask = 0, int yMask = 0) const throw() + int xMask = 0, int yMask = 0) const noexcept { ATLASSERT(IsTransparencySupported()); GetDC(); @@ -493,26 +493,26 @@ class CImage return ret; } BOOL PlgBlt(HDC hDestDC, const POINT* pPoints, - HBITMAP hbmMask = NULL) const throw() + HBITMAP hbmMask = NULL) const noexcept { return PlgBlt(hDestDC, pPoints, 0, 0, GetWidth(), GetHeight(), hbmMask); } BOOL PlgBlt(HDC hDestDC, const POINT* pPoints, const RECT& rectSrc, - HBITMAP hbmMask, const POINT& pointMask) const throw() + HBITMAP hbmMask, const POINT& pointMask) const noexcept { return PlgBlt(hDestDC, pPoints, rectSrc.left, rectSrc.top, rectSrc.right - rectSrc.left, rectSrc.bottom - rectSrc.top, hbmMask, pointMask.x, pointMask.y); } BOOL PlgBlt(HDC hDestDC, const POINT* pPoints, const RECT& rectSrc, - HBITMAP hbmMask = NULL) const throw() + HBITMAP hbmMask = NULL) const noexcept { POINT pointMask = {0, 0}; return PlgBlt(hDestDC, pPoints, rectSrc, hbmMask, pointMask); } - HRESULT Save(IStream* pStream, GUID *guidFileType) const throw() + HRESULT Save(IStream* pStream, GUID *guidFileType) const noexcept { if (!InitGDIPlus()) return E_FAIL; @@ -543,7 +543,7 @@ class CImage } HRESULT Save(LPCTSTR pszFileName, - REFGUID guidFileType = GUID_NULL) const throw() + REFGUID guidFileType = GUID_NULL) const noexcept { if (!InitGDIPlus()) return E_FAIL; @@ -585,7 +585,7 @@ class CImage } void SetColorTable(UINT iFirstColor, UINT nColors, - const RGBQUAD* prgbColors) throw() + const RGBQUAD* prgbColors) noexcept { ATLASSERT(IsDIBSection()); GetDC(); @@ -593,14 +593,14 @@ class CImage ReleaseDC(); } - void SetPixel(int x, int y, COLORREF color) throw() + void SetPixel(int x, int y, COLORREF color) noexcept { GetDC(); ::SetPixelV(m_hDC, x, y, color); ReleaseDC(); } - void SetPixelIndexed(int x, int y, int iIndex) throw() + void SetPixelIndexed(int x, int y, int iIndex) noexcept { ATLASSERT(IsIndexed()); GetDC(); @@ -608,12 +608,12 @@ class CImage ReleaseDC(); } - void SetPixelRGB(int x, int y, BYTE r, BYTE g, BYTE b) throw() + void SetPixelRGB(int x, int y, BYTE r, BYTE g, BYTE b) noexcept { SetPixel(x, y, RGB(r, g, b)); } - COLORREF SetTransparentColor(COLORREF rgbTransparent) throw() + COLORREF SetTransparentColor(COLORREF rgbTransparent) noexcept { ATLASSERT(m_hBitmap); COLORREF rgbOldColor = m_clrTransparentColor; @@ -624,7 +624,7 @@ class CImage BOOL StretchBlt(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { GetDC(); BOOL ret = ::StretchBlt(hDestDC, xDest, yDest, nDestWidth, nDestHeight, @@ -634,20 +634,20 @@ class CImage } BOOL StretchBlt(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { return StretchBlt(hDestDC, xDest, yDest, nDestWidth, nDestHeight, 0, 0, GetWidth(), GetHeight(), dwROP); } BOOL StretchBlt(HDC hDestDC, const RECT& rectDest, - DWORD dwROP = SRCCOPY) const throw() + DWORD dwROP = SRCCOPY) const noexcept { return StretchBlt(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, rectDest.bottom - rectDest.top, dwROP); } BOOL StretchBlt(HDC hDestDC, const RECT& rectDest, - const RECT& rectSrc, DWORD dwROP = SRCCOPY) const throw() + const RECT& rectSrc, DWORD dwROP = SRCCOPY) const noexcept { return StretchBlt(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, @@ -660,7 +660,7 @@ class CImage BOOL TransparentBlt(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, - UINT crTransparent = CLR_INVALID) const throw() + UINT crTransparent = CLR_INVALID) const noexcept { ATLASSERT(IsTransparencySupported()); GetDC(); @@ -673,13 +673,13 @@ class CImage } BOOL TransparentBlt(HDC hDestDC, int xDest, int yDest, int nDestWidth, int nDestHeight, - UINT crTransparent = CLR_INVALID) const throw() + UINT crTransparent = CLR_INVALID) const noexcept { return TransparentBlt(hDestDC, xDest, yDest, nDestWidth, nDestHeight, 0, 0, GetWidth(), GetHeight(), crTransparent); } BOOL TransparentBlt(HDC hDestDC, const RECT& rectDest, - UINT crTransparent = CLR_INVALID) const throw() + UINT crTransparent = CLR_INVALID) const noexcept { return TransparentBlt(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, @@ -687,7 +687,7 @@ class CImage } BOOL TransparentBlt( HDC hDestDC, const RECT& rectDest, - const RECT& rectSrc, UINT crTransparent = CLR_INVALID) const throw() + const RECT& rectSrc, UINT crTransparent = CLR_INVALID) const noexcept { return TransparentBlt(hDestDC, rectDest.left, rectDest.top, rectDest.right - rectDest.left, rectDest.bottom - rectDest.left, @@ -695,7 +695,7 @@ class CImage rectSrc.bottom - rectSrc.top, crTransparent); } - static BOOL IsTransparencySupported() throw() + static BOOL IsTransparencySupported() noexcept { return TRUE; } @@ -881,7 +881,7 @@ class CImage LONG m_nCImageObjects; DWORD m_dwLastError; - void _clear_funs() throw() + void _clear_funs() noexcept { Startup = NULL; Shutdown = NULL; @@ -899,7 +899,7 @@ class CImage } template - T_FUN _get_fun(T_FUN& fun, LPCSTR name) throw() + T_FUN _get_fun(T_FUN& fun, LPCSTR name) noexcept { if (!fun) fun = reinterpret_cast(::GetProcAddress(m_hInst, name)); @@ -922,7 +922,7 @@ class CImage FUN_SaveImageToFile SaveImageToFile; FUN_SaveImageToStream SaveImageToStream; - CInitGDIPlus() throw() + CInitGDIPlus() noexcept : m_hInst(NULL) , m_dwToken(0) , m_nCImageObjects(0) @@ -932,13 +932,13 @@ class CImage ::InitializeCriticalSection(&m_sect); } - ~CInitGDIPlus() throw() + ~CInitGDIPlus() noexcept { ReleaseGDIPlus(); ::DeleteCriticalSection(&m_sect); } - bool Init() throw() + bool Init() noexcept { ::EnterCriticalSection(&m_sect); @@ -975,7 +975,7 @@ class CImage return ret; } - void ReleaseGDIPlus() throw() + void ReleaseGDIPlus() noexcept { ::EnterCriticalSection(&m_sect); if (m_dwToken) @@ -994,14 +994,14 @@ class CImage ::LeaveCriticalSection(&m_sect); } - void IncreaseCImageCount() throw() + void IncreaseCImageCount() noexcept { ::EnterCriticalSection(&m_sect); ++m_nCImageObjects; ::LeaveCriticalSection(&m_sect); } - void DecreaseCImageCount() throw() + void DecreaseCImageCount() noexcept { ::EnterCriticalSection(&m_sect); if (--m_nCImageObjects == 0) @@ -1014,7 +1014,7 @@ class CImage static CInitGDIPlus s_gdiplus; - static bool InitGDIPlus() throw() + static bool InitGDIPlus() noexcept { return s_gdiplus.Init(); } @@ -1134,7 +1134,7 @@ class CImage } void AttachInternal(HBITMAP hBitmap, DIBOrientation eOrientation, - LONG iTransColor) throw() + LONG iTransColor) noexcept { Destroy(); @@ -1154,7 +1154,7 @@ class CImage BOOL CreateInternal(int nWidth, int nHeight, int nBPP, DWORD eCompression, const DWORD* pdwBitmasks = NULL, - DWORD dwFlags = 0) throw() + DWORD dwFlags = 0) noexcept { ATLASSERT(nWidth != 0); ATLASSERT(nHeight != 0); @@ -1234,12 +1234,12 @@ class CImageDC { } - virtual ~CImageDC() throw() + virtual ~CImageDC() noexcept { m_image.ReleaseDC(); } - operator HDC() const throw() + operator HDC() const noexcept { return m_hDC; } From 3f921d1119b295de31ee095dceaa62d6ce54ae69 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Tue, 5 Sep 2023 22:36:18 +0900 Subject: [PATCH 15/27] [NOTEPAD] Use StringCchPrintf instead (#5654) Use preferred string functions. CORE-18837 --- base/applications/notepad/dialog.c | 4 ++-- base/applications/notepad/main.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/base/applications/notepad/dialog.c b/base/applications/notepad/dialog.c index 78dbd467f37..846a9abac57 100644 --- a/base/applications/notepad/dialog.c +++ b/base/applications/notepad/dialog.c @@ -164,7 +164,7 @@ int DIALOG_StringMsgBox(HWND hParent, int formatId, LPCTSTR szString, DWORD dwFl /* Load and format szMessage */ LoadString(Globals.hInstance, formatId, szResource, _countof(szResource)); - _sntprintf(szMessage, _countof(szMessage), szResource, szString); + StringCchPrintf(szMessage, _countof(szMessage), szResource, szString); /* Load szCaption */ if ((dwFlags & MB_ICONMASK) == MB_ICONEXCLAMATION) @@ -880,7 +880,7 @@ VOID DIALOG_StatusBarUpdateCaretPos(VOID) line = SendMessage(Globals.hEdit, EM_LINEFROMCHAR, (WPARAM)dwStart, 0); col = dwStart - SendMessage(Globals.hEdit, EM_LINEINDEX, (WPARAM)line, 0); - _stprintf(buff, Globals.szStatusBarLineCol, line + 1, col + 1); + StringCchPrintf(buff, _countof(buff), Globals.szStatusBarLineCol, line + 1, col + 1); SendMessage(Globals.hStatusBar, SB_SETTEXT, SBPART_CURPOS, (LPARAM)buff); } diff --git a/base/applications/notepad/main.c b/base/applications/notepad/main.c index c232bfbf3e7..a6477bfefd6 100644 --- a/base/applications/notepad/main.c +++ b/base/applications/notepad/main.c @@ -202,7 +202,7 @@ BOOL NOTEPAD_FindNext(FINDREPLACE *pFindReplace, BOOL bReplace, BOOL bShowAlert) if (bShowAlert) { LoadString(Globals.hInstance, STRING_CANNOTFIND, szResource, _countof(szResource)); - _sntprintf(szText, _countof(szText), szResource, pFindReplace->lpstrFindWhat); + StringCchPrintf(szText, _countof(szText), szResource, pFindReplace->lpstrFindWhat); LoadString(Globals.hInstance, STRING_NOTEPAD, szResource, _countof(szResource)); MessageBox(Globals.hFindReplaceDlg, szText, szResource, MB_OK); } From 94e0c54c7dfc73aa03a6e80be37e6a3fd25ec2e7 Mon Sep 17 00:00:00 2001 From: William Kent Date: Wed, 6 Sep 2023 06:04:05 -0400 Subject: [PATCH 16/27] [MSVCRT] Officially implement _localtime32{,_s} (#5652) required by the guest additions of an app called "UTM", which is a QEMU fork --- dll/apisets/api-ms-win-crt-time-l1-1-0.spec | 8 ++++---- dll/win32/msvcrt/msvcrt.spec | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dll/apisets/api-ms-win-crt-time-l1-1-0.spec b/dll/apisets/api-ms-win-crt-time-l1-1-0.spec index db0fe40f724..6b571be4c03 100644 --- a/dll/apisets/api-ms-win-crt-time-l1-1-0.spec +++ b/dll/apisets/api-ms-win-crt-time-l1-1-0.spec @@ -34,10 +34,10 @@ @ stub _gmtime32_s @ stdcall _gmtime64() msvcrt._gmtime64 @ stub _gmtime64_s -@ stub _localtime32 -@ stub _localtime32_s -@ stdcall _localtime64() msvcrt._localtime64 -@ stub _localtime64_s +@ cdecl -version=0x600+ _localtime32() msvcrt._localtime32 +@ cdecl -version=0x600+ _localtime32_s() msvcrt._localtime32_s +@ cdecl _localtime64() msvcrt._localtime64 +@ cdecl -version=0x600+ _localtime64_s() msvcrt._localtime64_s @ stub _mkgmtime32 @ stdcall _mkgmtime64() msvcrt._mkgmtime64 @ stub _mktime32 diff --git a/dll/win32/msvcrt/msvcrt.spec b/dll/win32/msvcrt/msvcrt.spec index 0d5ab41eeee..e80a290e2fd 100644 --- a/dll/win32/msvcrt/msvcrt.spec +++ b/dll/win32/msvcrt/msvcrt.spec @@ -710,8 +710,8 @@ @ cdecl -arch=x86_64 _local_unwind(ptr ptr) @ cdecl -arch=i386 _local_unwind2(ptr long) @ cdecl -arch=i386 -version=0x600+ _local_unwind4(ptr ptr long) -@ stub -version=0x600+ _localtime32 -@ stub -version=0x600+ _localtime32_s +@ cdecl -version=0x600+ _localtime32(ptr) +@ cdecl -version=0x600+ _localtime32_s(ptr ptr) @ cdecl _localtime64(ptr) @ cdecl -version=0x600+ _localtime64_s(ptr ptr) @ cdecl _lock(long) From 289dec6c391401b504e4494a3c7548d3b59af697 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Wed, 6 Sep 2023 19:26:23 +0900 Subject: [PATCH 17/27] [NOTEPAD] Do type cast to kill C4244 warnings (#5655) - Do type cast to int from SendMessage return value. - Fix usage of EM_GETSEL and EM_LINEINDEX messages. CORE-18837 --- base/applications/notepad/dialog.c | 11 +++++++++-- base/applications/notepad/main.c | 5 +++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/base/applications/notepad/dialog.c b/base/applications/notepad/dialog.c index 846a9abac57..111d0428a1d 100644 --- a/base/applications/notepad/dialog.c +++ b/base/applications/notepad/dialog.c @@ -865,6 +865,10 @@ VOID DIALOG_GoTo(VOID) else ich = (INT)SendMessage(Globals.hEdit, EM_LINEINDEX, GotoData.iLine, 0); + /* EM_LINEINDEX can return -1 on failure */ + if (ich < 0) + ich = 0; + /* Move the caret */ SendMessage(Globals.hEdit, EM_SETSEL, ich, ich); SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0); @@ -872,13 +876,16 @@ VOID DIALOG_GoTo(VOID) VOID DIALOG_StatusBarUpdateCaretPos(VOID) { - int line, col; + int line, ich, col; TCHAR buff[MAX_PATH]; DWORD dwStart, dwSize; SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwSize); line = SendMessage(Globals.hEdit, EM_LINEFROMCHAR, (WPARAM)dwStart, 0); - col = dwStart - SendMessage(Globals.hEdit, EM_LINEINDEX, (WPARAM)line, 0); + ich = (int)SendMessage(Globals.hEdit, EM_LINEINDEX, (WPARAM)line, 0); + + /* EM_LINEINDEX can return -1 on failure */ + col = ((ich < 0) ? 0 : (dwStart - ich)); StringCchPrintf(buff, _countof(buff), Globals.szStatusBarLineCol, line + 1, col + 1); SendMessage(Globals.hStatusBar, SB_SETTEXT, SBPART_CURPOS, (LPARAM)buff); diff --git a/base/applications/notepad/main.c b/base/applications/notepad/main.c index a6477bfefd6..599ad5c60df 100644 --- a/base/applications/notepad/main.c +++ b/base/applications/notepad/main.c @@ -270,6 +270,7 @@ static VOID NOTEPAD_InitData(HINSTANCE hInstance) */ static VOID NOTEPAD_InitMenuPopup(HMENU menu, LPARAM index) { + DWORD dwStart, dwEnd; int enable; UNREFERENCED_PARAMETER(index); @@ -280,8 +281,8 @@ static VOID NOTEPAD_InitMenuPopup(HMENU menu, LPARAM index) SendMessage(Globals.hEdit, EM_CANUNDO, 0, 0) ? MF_ENABLED : MF_GRAYED); EnableMenuItem(menu, CMD_PASTE, IsClipboardFormatAvailable(CF_TEXT) ? MF_ENABLED : MF_GRAYED); - enable = (int) SendMessage(Globals.hEdit, EM_GETSEL, 0, 0); - enable = (HIWORD(enable) == LOWORD(enable)) ? MF_GRAYED : MF_ENABLED; + SendMessage(Globals.hEdit, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); + enable = ((dwStart == dwEnd) ? MF_GRAYED : MF_ENABLED); EnableMenuItem(menu, CMD_CUT, enable); EnableMenuItem(menu, CMD_COPY, enable); EnableMenuItem(menu, CMD_DELETE, enable); From 2b14056600bae80532f7ab9320fdc0853a55e30a Mon Sep 17 00:00:00 2001 From: Doug Lyons Date: Wed, 6 Sep 2023 06:34:25 -0500 Subject: [PATCH 18/27] [NTOS:CC][NTOS:MM] Add back CcRosTrimCache and add Delay for MM to work. (#5630) MM/CC Add back CcRosTrimCache as suggested by Thomas Faber which was removed in 0.4.15-dev-1717-g d8cdb89fb03006595dc40ac23db5267b8d9d9c09 and call it once in a while also during read-operations. fixes JIRA issue: CORE-17624 'Cannot copy files > RAMsize anymore using TotalCommander' 1st testbot results on top of 0.4.15-dev-6526-g8d35887 VBox: https://reactos.org/testman/compare.php?ids=89111,89120 (additional random reboot in winhttp:winhttp) KVM: https://reactos.org/testman/compare.php?ids=89110,89119 We do assume that reboot to be unrelated. 2nd testbot results on top of 0.4.15-dev-6526-g8d35887 VBox: https://reactos.org/testman/compare.php?ids=89111,89232 KVM: https://reactos.org/testman/compare.php?ids=89110,89233 --- ntoskrnl/cc/view.c | 118 ++++++++++++++++++++++++++++++++++++++++++ ntoskrnl/mm/balance.c | 23 ++++++++ 2 files changed, 141 insertions(+) diff --git a/ntoskrnl/cc/view.c b/ntoskrnl/cc/view.c index 0e6917ea18a..efa4c8523d4 100644 --- a/ntoskrnl/cc/view.c +++ b/ntoskrnl/cc/view.c @@ -449,6 +449,124 @@ CcRosFlushDirtyPages ( return STATUS_SUCCESS; } +VOID +CcRosTrimCache( + _In_ ULONG Target, + _Out_ PULONG NrFreed) +/* + * FUNCTION: Try to free some memory from the file cache. + * ARGUMENTS: + * Target - The number of pages to be freed. + * NrFreed - Points to a variable where the number of pages + * actually freed is returned. + */ +{ + PLIST_ENTRY current_entry; + PROS_VACB current; + ULONG PagesFreed; + KIRQL oldIrql; + LIST_ENTRY FreeList; + PFN_NUMBER Page; + ULONG i; + BOOLEAN FlushedPages = FALSE; + + DPRINT("CcRosTrimCache(Target %lu)\n", Target); + + InitializeListHead(&FreeList); + + *NrFreed = 0; + +retry: + oldIrql = KeAcquireQueuedSpinLock(LockQueueMasterLock); + + current_entry = VacbLruListHead.Flink; + while (current_entry != &VacbLruListHead) + { + ULONG Refs; + + current = CONTAINING_RECORD(current_entry, + ROS_VACB, + VacbLruListEntry); + current_entry = current_entry->Flink; + + KeAcquireSpinLockAtDpcLevel(¤t->SharedCacheMap->CacheMapLock); + + /* Reference the VACB */ + CcRosVacbIncRefCount(current); + + /* Check if it's mapped and not dirty */ + if (InterlockedCompareExchange((PLONG)¤t->MappedCount, 0, 0) > 0 && !current->Dirty) + { + /* Page out the VACB */ + for (i = 0; i < VACB_MAPPING_GRANULARITY / PAGE_SIZE; i++) + { + Page = (PFN_NUMBER)(MmGetPhysicalAddress((PUCHAR)current->BaseAddress + (i * PAGE_SIZE)).QuadPart >> PAGE_SHIFT); + + MmPageOutPhysicalAddress(Page); + } + } + + /* Dereference the VACB */ + Refs = CcRosVacbDecRefCount(current); + + /* Check if we can free this entry now */ + if (Refs < 2) + { + ASSERT(!current->Dirty); + ASSERT(!current->MappedCount); + ASSERT(Refs == 1); + + RemoveEntryList(¤t->CacheMapVacbListEntry); + RemoveEntryList(¤t->VacbLruListEntry); + InitializeListHead(¤t->VacbLruListEntry); + InsertHeadList(&FreeList, ¤t->CacheMapVacbListEntry); + + /* Calculate how many pages we freed for Mm */ + PagesFreed = min(VACB_MAPPING_GRANULARITY / PAGE_SIZE, Target); + Target -= PagesFreed; + (*NrFreed) += PagesFreed; + } + + KeReleaseSpinLockFromDpcLevel(¤t->SharedCacheMap->CacheMapLock); + } + + KeReleaseQueuedSpinLock(LockQueueMasterLock, oldIrql); + + /* Try flushing pages if we haven't met our target */ + if ((Target > 0) && !FlushedPages) + { + /* Flush dirty pages to disk */ + CcRosFlushDirtyPages(Target, &PagesFreed, FALSE, FALSE); + FlushedPages = TRUE; + + /* We can only swap as many pages as we flushed */ + if (PagesFreed < Target) Target = PagesFreed; + + /* Check if we flushed anything */ + if (PagesFreed != 0) + { + /* Try again after flushing dirty pages */ + DPRINT("Flushed %lu dirty cache pages to disk\n", PagesFreed); + goto retry; + } + } + + while (!IsListEmpty(&FreeList)) + { + ULONG Refs; + + current_entry = RemoveHeadList(&FreeList); + current = CONTAINING_RECORD(current_entry, + ROS_VACB, + CacheMapVacbListEntry); + InitializeListHead(¤t->CacheMapVacbListEntry); + Refs = CcRosVacbDecRefCount(current); + ASSERT(Refs == 0); + } + + DPRINT("Evicted %lu cache pages\n", (*NrFreed)); +} + NTSTATUS CcRosReleaseVacb ( PROS_SHARED_CACHE_MAP SharedCacheMap, diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c index ab71d0f195b..f33189dc247 100644 --- a/ntoskrnl/mm/balance.c +++ b/ntoskrnl/mm/balance.c @@ -316,6 +316,15 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, PPFN_NUMBER AllocatedPage) { PFN_NUMBER Page; + static INT i = 0; + static LARGE_INTEGER TinyTime = {{-1L, -1L}}; + + /* Delay some requests for the Memory Manager to recover pages */ + if (i++ >= 100) + { + KeDelayExecutionThread(KernelMode, FALSE, &TinyTime); + i = 0; + } /* * Actually allocate the page. @@ -335,6 +344,10 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, return(STATUS_SUCCESS); } +VOID +CcRosTrimCache( + _In_ ULONG Target, + _Out_ PULONG NrFreed); VOID NTAPI MiBalancerThread(PVOID Unused) @@ -361,6 +374,8 @@ MiBalancerThread(PVOID Unused) if (Status == STATUS_WAIT_0 || Status == STATUS_WAIT_1) { ULONG InitialTarget = 0; + ULONG Target; + ULONG NrFreedPages; do { @@ -372,6 +387,14 @@ MiBalancerThread(PVOID Unused) InitialTarget = MiTrimMemoryConsumer(i, InitialTarget); } + /* Trim cache */ + Target = max(InitialTarget, abs(MiMinimumAvailablePages - MmAvailablePages)); + if (Target) + { + CcRosTrimCache(Target, &NrFreedPages); + InitialTarget -= min(NrFreedPages, InitialTarget); + } + /* No pages left to swap! */ if (InitialTarget != 0 && InitialTarget == OldTarget) From d9cd76017336c2bc9d535807f56e5e80f7ac0d87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=89LUSCA=20-=20MA=C3=8FTO?= Date: Wed, 6 Sep 2023 14:15:33 +0200 Subject: [PATCH 19/27] [TIMEDATE] Fix the way the current time-zone is found in the list. (#5649) fies regression CORE-18666 'Wrong timezone saved/displayed' which was introduced by 0.4.14-dev-1522-g aa69236646f01a476377ec76ae7b762e061cd300 --- dll/cpl/timedate/timezone.c | 65 +++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 25 deletions(-) diff --git a/dll/cpl/timedate/timezone.c b/dll/cpl/timedate/timezone.c index dcc8fab661a..8d1d94191fa 100644 --- a/dll/cpl/timedate/timezone.c +++ b/dll/cpl/timedate/timezone.c @@ -168,36 +168,51 @@ ShowTimeZoneList(HWND hwnd) { TIME_ZONE_INFORMATION TimeZoneInfo; PTIMEZONE_ENTRY Entry; - BOOL bDoAdvancedTest; - DWORD dwIndex; - DWORD i; + DWORD dwCount; + DWORD dwIndex = 0; + BOOL bFound = FALSE; - GetTimeZoneInformation(&TimeZoneInfo); - bDoAdvancedTest = (!*TimeZoneInfo.StandardName); + if (GetTimeZoneInformation(&TimeZoneInfo) == TIME_ZONE_ID_INVALID) + { + /* Failed to retrieve current time-zone info, reset it */ + ZeroMemory(&TimeZoneInfo, sizeof(TimeZoneInfo)); + } - dwIndex = 0; - i = 0; - Entry = TimeZoneListHead; - while (Entry != NULL) + for (Entry = TimeZoneListHead; Entry != NULL; Entry = Entry->Next) { - SendMessageW(hwnd, - CB_ADDSTRING, - 0, - (LPARAM)Entry->Description); - - if ( (!bDoAdvancedTest && *Entry->StandardName && - wcscmp(Entry->StandardName, TimeZoneInfo.StandardName) == 0) || - ( (Entry->TimezoneInfo.Bias == TimeZoneInfo.Bias) && - (Entry->TimezoneInfo.StandardBias == TimeZoneInfo.StandardBias) && - (Entry->TimezoneInfo.DaylightBias == TimeZoneInfo.DaylightBias) && - (memcmp(&Entry->TimezoneInfo.StandardDate, &TimeZoneInfo.StandardDate, sizeof(SYSTEMTIME)) == 0) && - (memcmp(&Entry->TimezoneInfo.DaylightDate, &TimeZoneInfo.DaylightDate, sizeof(SYSTEMTIME)) == 0) ) ) + dwCount = SendMessageW(hwnd, + CB_ADDSTRING, + 0, + (LPARAM)Entry->Description); + if (dwCount == CB_ERR || dwCount == CB_ERRSPACE) + continue; + + /* If the time-zone was found in the list, skip the tests */ + if (bFound) + continue; + + if (*TimeZoneInfo.StandardName && *Entry->StandardName) { - dwIndex = i; + /* Compare by name */ + if (wcscmp(Entry->StandardName, TimeZoneInfo.StandardName) == 0) + { + dwIndex = dwCount; + bFound = TRUE; + } + } + else + { + /* Compare by date and bias */ + if ((Entry->TimezoneInfo.Bias == TimeZoneInfo.Bias) && + (Entry->TimezoneInfo.StandardBias == TimeZoneInfo.StandardBias) && + (Entry->TimezoneInfo.DaylightBias == TimeZoneInfo.DaylightBias) && + (memcmp(&Entry->TimezoneInfo.StandardDate, &TimeZoneInfo.StandardDate, sizeof(SYSTEMTIME)) == 0) && + (memcmp(&Entry->TimezoneInfo.DaylightDate, &TimeZoneInfo.DaylightDate, sizeof(SYSTEMTIME)) == 0)) + { + dwIndex = dwCount; + bFound = TRUE; + } } - - i++; - Entry = Entry->Next; } SendMessageW(hwnd, From 195c491880c6e6e9cd7d4669c1242da1f3836bda Mon Sep 17 00:00:00 2001 From: Joachim Henze Date: Wed, 6 Sep 2023 14:53:53 +0200 Subject: [PATCH 20/27] [NTOSKRNL] Mute some good-path log-spam, no functional change Now that the Memory Management is a bit more under control again, and branching releases/0.4.15 is near, do mute some frequent log-spam that got introduced during 0.4.15-dev'ing regarding lazy-flushes and MM balancing. It frequently logged even while being idle. Slightly improve the headers of the two touched files. No rocket-science. --- ntoskrnl/config/cmlazy.c | 11 +++++------ ntoskrnl/mm/balance.c | 14 ++++++-------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/ntoskrnl/config/cmlazy.c b/ntoskrnl/config/cmlazy.c index 13b74570b00..ed03247a8c7 100644 --- a/ntoskrnl/config/cmlazy.c +++ b/ntoskrnl/config/cmlazy.c @@ -1,15 +1,14 @@ /* - * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/config/cmlazy.c - * PURPOSE: Configuration Manager - Internal Registry APIs - * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Configuration Manager - Internal Registry APIs + * PROGRAMMERS: Alex Ionescu */ /* INCLUDES *******************************************************************/ #include "ntoskrnl.h" -//#define NDEBUG +#define NDEBUG #include "debug.h" /* GLOBALS ********************************************************************/ diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c index f33189dc247..3b11aeab2c8 100644 --- a/ntoskrnl/mm/balance.c +++ b/ntoskrnl/mm/balance.c @@ -1,11 +1,9 @@ /* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/balance.c - * PURPOSE: kernel memory management functions - * - * PROGRAMMERS: David Welch (welch@cwcom.net) - * Cameron Gutman (cameron.gutman@reactos.org) + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * PURPOSE: kernel memory management functions + * PROGRAMMERS: David Welch + * Cameron Gutman */ /* INCLUDES *****************************************************************/ @@ -144,7 +142,7 @@ MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages) (*NrFreedPages) = 0; - DPRINT1("MM BALANCER: %s\n", Priority ? "Paging out!" : "Removing access bit!"); + DPRINT("MM BALANCER: %s\n", Priority ? "Paging out!" : "Removing access bit!"); FirstPage = MmGetLRUFirstUserPage(); CurrentPage = FirstPage; From 9ce81f648517263cbc5a83883354c8589a3474c6 Mon Sep 17 00:00:00 2001 From: Doug Lyons Date: Wed, 6 Sep 2023 16:02:48 -0500 Subject: [PATCH 21/27] [WINHTTP_WINETEST] Skip wine_dbgstr_wn() call when returned text length is zero (#5656) On receiving a zero length response, do not try to print returned text using wine_dbgstr_wn(). Instead check the returned string for zero length and skip the print in that case. ROSTESTS-377 --- modules/rostests/winetests/winhttp/winhttp.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/rostests/winetests/winhttp/winhttp.c b/modules/rostests/winetests/winhttp/winhttp.c index 776ee53e379..5655432f73b 100644 --- a/modules/rostests/winetests/winhttp/winhttp.c +++ b/modules/rostests/winetests/winhttp/winhttp.c @@ -4276,7 +4276,12 @@ static void test_IWinHttpRequest(int port) hr = IWinHttpRequest_get_ResponseText( req, &response ); ok( hr == S_OK, "got %08x\n", hr ); +#ifdef __REACTOS__ + ok( !memcmp(response, data_start, sizeof(data_start)), "got %s\n", + wine_dbgstr_wn(response, min(SysStringLen(response), 32)) ); +#else ok( !memcmp(response, data_start, sizeof(data_start)), "got %s\n", wine_dbgstr_wn(response, 32) ); +#endif SysFreeString( response ); IWinHttpRequest_Release( req ); From 6a81e5f4d72edf925aaa8942b30bec2db5fcbebb Mon Sep 17 00:00:00 2001 From: Stanislav Motylkov Date: Thu, 7 Sep 2023 00:10:32 +0300 Subject: [PATCH 22/27] [SHELL32] Fix standard log off dialog layout Make it consistent between translations and other misc fixes. --- dll/win32/shell32/lang/bg-BG.rc | 4 ++-- dll/win32/shell32/lang/ca-ES.rc | 2 +- dll/win32/shell32/lang/cs-CZ.rc | 6 +++--- dll/win32/shell32/lang/da-DK.rc | 2 +- dll/win32/shell32/lang/de-DE.rc | 10 +++++----- dll/win32/shell32/lang/el-GR.rc | 2 +- dll/win32/shell32/lang/en-GB.rc | 2 +- dll/win32/shell32/lang/en-US.rc | 2 +- dll/win32/shell32/lang/es-ES.rc | 10 +++++----- dll/win32/shell32/lang/et-EE.rc | 2 +- dll/win32/shell32/lang/eu-ES.rc | 8 ++++---- dll/win32/shell32/lang/fi-FI.rc | 2 +- dll/win32/shell32/lang/fr-FR.rc | 10 +++++----- dll/win32/shell32/lang/he-IL.rc | 2 +- dll/win32/shell32/lang/hi-IN.rc | 2 +- dll/win32/shell32/lang/hu-HU.rc | 4 ++-- dll/win32/shell32/lang/id-ID.rc | 2 +- dll/win32/shell32/lang/it-IT.rc | 10 +++++----- dll/win32/shell32/lang/ja-JP.rc | 8 ++++---- dll/win32/shell32/lang/ko-KR.rc | 2 +- dll/win32/shell32/lang/nl-NL.rc | 2 +- dll/win32/shell32/lang/no-NO.rc | 6 +++--- dll/win32/shell32/lang/pl-PL.rc | 6 +++--- dll/win32/shell32/lang/pt-BR.rc | 4 ++-- dll/win32/shell32/lang/pt-PT.rc | 10 +++++----- dll/win32/shell32/lang/ro-RO.rc | 6 +++--- dll/win32/shell32/lang/ru-RU.rc | 8 ++++---- dll/win32/shell32/lang/sk-SK.rc | 2 +- dll/win32/shell32/lang/sl-SI.rc | 2 +- dll/win32/shell32/lang/sq-AL.rc | 6 +++--- dll/win32/shell32/lang/sv-SE.rc | 2 +- dll/win32/shell32/lang/tr-TR.rc | 10 +++++----- dll/win32/shell32/lang/uk-UA.rc | 2 +- dll/win32/shell32/lang/zh-CN.rc | 6 +++--- dll/win32/shell32/lang/zh-HK.rc | 2 +- dll/win32/shell32/lang/zh-TW.rc | 2 +- 36 files changed, 84 insertions(+), 84 deletions(-) diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc index 4482ced2728..01e2c9c0023 100644 --- a/dll/win32/shell32/lang/bg-BG.rc +++ b/dll/win32/shell32/lang/bg-BG.rc @@ -481,13 +481,13 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Излизане от РеактОС" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Сигурни ли сте, че искате да излезете?", -1, 43, 11, 140, 22 + LTEXT "Сигурни ли сте, че искате да излезете?", -1, 49, 15, 156, 8 DEFPUSHBUTTON "&Излизане", IDOK, 49, 38, 43, 14 PUSHBUTTON "Отказ", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc index 6cfafbc1556..5f2aaa48cc7 100644 --- a/dll/win32/shell32/lang/ca-ES.rc +++ b/dll/win32/shell32/lang/ca-ES.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc index 79b66910561..8af5dce9338 100644 --- a/dll/win32/shell32/lang/cs-CZ.rc +++ b/dll/win32/shell32/lang/cs-CZ.rc @@ -493,9 +493,9 @@ CAPTION "Odhlásit se ze systému ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Opravdu se chcete odhlásit?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "&Odhlásit", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Storno", IDCANCEL, 95, 39, 50, 14 + LTEXT "Opravdu se chcete odhlásit?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "&Odhlásit", IDOK, 49, 38, 43, 14 + PUSHBUTTON "Storno", IDCANCEL, 99, 38, 43, 14 END IDD_DISCONNECT DIALOGEX 0, 0, 188, 60 diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc index d7b93f3afd5..a2a8a198f60 100644 --- a/dll/win32/shell32/lang/da-DK.rc +++ b/dll/win32/shell32/lang/da-DK.rc @@ -493,7 +493,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc index 30dfc52306e..cfe026ee4c9 100644 --- a/dll/win32/shell32/lang/de-DE.rc +++ b/dll/win32/shell32/lang/de-DE.rc @@ -481,15 +481,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Abmelden" FONT 8, "MS Shell Dlg" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 7, 7, 20, 20 - LTEXT "Sind Sie sicher, dass Sie sich abmelden wollen?", -1, 35, 16, 166, 8 - DEFPUSHBUTTON "&Abmelden", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Abbrechen", IDCANCEL, 95, 39, 50, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "Sind Sie sicher, dass Sie sich abmelden wollen?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "&Abmelden", IDOK, 49, 38, 53, 14 + PUSHBUTTON "Abbrechen", IDCANCEL, 109, 38, 53, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc index 1748705409b..a191eb18ce0 100644 --- a/dll/win32/shell32/lang/el-GR.rc +++ b/dll/win32/shell32/lang/el-GR.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc index 3c554179d20..c4df603d9b2 100644 --- a/dll/win32/shell32/lang/en-GB.rc +++ b/dll/win32/shell32/lang/en-GB.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index be8e2c5b3bb..dc666d4a21b 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc index d231def1651..c455913d518 100644 --- a/dll/win32/shell32/lang/es-ES.rc +++ b/dll/win32/shell32/lang/es-ES.rc @@ -490,15 +490,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Cerrar sesión de ReactOS" FONT 8, "MS Shell Dlg" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 7, 7, 20, 20 - LTEXT "¿Esta seguro de que quiere cerrar la sesión?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "&Cerrar sesión", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 95, 39, 50, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "¿Esta seguro de que quiere cerrar la sesión?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "&Cerrar sesión", IDOK, 49, 38, 53, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 109, 38, 53, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc index 82297e87ea5..c61f8875535 100644 --- a/dll/win32/shell32/lang/et-EE.rc +++ b/dll/win32/shell32/lang/et-EE.rc @@ -494,7 +494,7 @@ CAPTION "Logi ReactOS'ist välja" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Kas soovid kindlasti välja logida?", -1, 49, 15, 131, 8 + LTEXT "Kas soovid kindlasti välja logida?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Logi välja", IDOK, 49, 38, 43, 14 PUSHBUTTON "Loobu", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc index 05942f367f5..aae6824a530 100644 --- a/dll/win32/shell32/lang/eu-ES.rc +++ b/dll/win32/shell32/lang/eu-ES.rc @@ -493,10 +493,10 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Amaitu ReactOS saioa" FONT 8, "MS Shell Dlg" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 7, 7, 20, 20 - LTEXT "Ziur zaude saioa amaitu nahi duzula?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "Ama&itu saioa", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Utzi", IDCANCEL, 95, 39, 50, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "Ziur zaude saioa amaitu nahi duzula?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "Ama&itu saioa", IDOK, 49, 38, 53, 14 + PUSHBUTTON "Utzi", IDCANCEL, 109, 38, 53, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc index 20601d5d01f..5da33435d2e 100644 --- a/dll/win32/shell32/lang/fi-FI.rc +++ b/dll/win32/shell32/lang/fi-FI.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc index f2371b86e91..02c79aa67c6 100644 --- a/dll/win32/shell32/lang/fr-FR.rc +++ b/dll/win32/shell32/lang/fr-FR.rc @@ -481,15 +481,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Fermer ReactOS" FONT 8, "MS Shell Dlg" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 7, 7, 20, 20 - LTEXT "Êtes-vous sûr de vouloir fermer ReactOS ?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "Fermer", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Annuler", IDCANCEL, 95, 39, 50, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "Êtes-vous sûr de vouloir fermer ReactOS ?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "&Fermer", IDOK, 49, 38, 43, 14 + PUSHBUTTON "Annuler", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc index 1cbdb451cb4..e41a4b769a3 100644 --- a/dll/win32/shell32/lang/he-IL.rc +++ b/dll/win32/shell32/lang/he-IL.rc @@ -489,7 +489,7 @@ CAPTION "התנתקות מ-ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "האם אתה בטוח שברצונך להתנתק?", -1, 49, 15, 131, 8 + LTEXT "האם אתה בטוח שברצונך להתנתק?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "התנתק", IDOK, 49, 38, 43, 14 PUSHBUTTON "ביטול", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc index 86805ece5a2..b425b0d6e49 100644 --- a/dll/win32/shell32/lang/hi-IN.rc +++ b/dll/win32/shell32/lang/hi-IN.rc @@ -487,7 +487,7 @@ CAPTION "लॉग ऑफ़ रिऐक्ट ओएस" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "क्या आप वाकई लॉग आफ़ करना चाहते हैं?", -1, 49, 15, 131, 8 + LTEXT "क्या आप वाकई लॉग आफ़ करना चाहते हैं?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&लॉग आफ़", IDOK, 49, 38, 43, 14 PUSHBUTTON "रद्द करें", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index e7837a056b8..28c4cbe7cb9 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -487,9 +487,9 @@ CAPTION "Kijelentkezés a ReactOS-ből" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Biztosan ki akar jelentkezni?", -1, 49, 15, 131, 8 + LTEXT "Biztosan ki akar jelentkezni?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Kijelentkezés", IDOK, 49, 38, 53, 14 - PUSHBUTTON "Mégse", IDCANCEL, 109, 38, 43, 14 + PUSHBUTTON "Mégse", IDCANCEL, 109, 38, 53, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc index 3663a33cd09..661dac1ccd0 100644 --- a/dll/win32/shell32/lang/id-ID.rc +++ b/dll/win32/shell32/lang/id-ID.rc @@ -487,7 +487,7 @@ CAPTION "Keluar ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Anda yakin ingin keluar?", -1, 49, 15, 131, 8 + LTEXT "Anda yakin ingin keluar?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Keluar", IDOK, 49, 38, 43, 14 PUSHBUTTON "Batal", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc index 8220be84a37..32189f8de8e 100644 --- a/dll/win32/shell32/lang/it-IT.rc +++ b/dll/win32/shell32/lang/it-IT.rc @@ -481,15 +481,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Chiudi sessione di ReactOS" FONT 8, "MS Shell Dlg" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 7, 7, 20, 20 - LTEXT "Siete sicuro di voler chiudere la sessione?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "&Chiudi sessione", IDOK, 35, 39, 55, 14 - PUSHBUTTON "Annulla", IDCANCEL, 95, 39, 50, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "Siete sicuro di voler chiudere la sessione?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "&Chiudi sessione", IDOK, 49, 38, 57, 14 + PUSHBUTTON "Annulla", IDCANCEL, 113, 38, 57, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc index 0bda0c01b04..7cf8c34729f 100644 --- a/dll/win32/shell32/lang/ja-JP.rc +++ b/dll/win32/shell32/lang/ja-JP.rc @@ -486,10 +486,10 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "ReactOS のログオフ" FONT 9, "MS UI Gothic" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 22, 21 - LTEXT "ログオフしてもよろしいですか?", -1, 43, 11, 140, 22 - DEFPUSHBUTTON "ログオフ(&L)", IDOK, 41, 39, 50, 14 - PUSHBUTTON "キャンセル", IDCANCEL, 95, 39, 50, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "ログオフしてもよろしいですか?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "ログオフ(&L)", IDOK, 49, 38, 43, 14 + PUSHBUTTON "キャンセル", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc index 71e8ec1c27c..fdbc263ae98 100644 --- a/dll/win32/shell32/lang/ko-KR.rc +++ b/dll/win32/shell32/lang/ko-KR.rc @@ -494,7 +494,7 @@ CAPTION "Log Off ReactOS" FONT 9, "굴림" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc index 2a5def28b66..fca4d439f46 100644 --- a/dll/win32/shell32/lang/nl-NL.rc +++ b/dll/win32/shell32/lang/nl-NL.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc index 2f5b88a6c5e..07aaf2547e6 100644 --- a/dll/win32/shell32/lang/no-NO.rc +++ b/dll/win32/shell32/lang/no-NO.rc @@ -487,9 +487,9 @@ CAPTION "Logg av ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Er du sikker på at du vil logge av?", -1, 43, 11, 140, 22 - DEFPUSHBUTTON "&Logg av", IDOK, 57, 40, 60, 14 - PUSHBUTTON "Avbryt", IDCANCEL, 122, 40, 60, 14 + LTEXT "Er du sikker på at du vil logge av?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "&Logg av", IDOK, 49, 38, 43, 14 + PUSHBUTTON "Avbryt", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc index cd90289414a..6f0eeef2235 100644 --- a/dll/win32/shell32/lang/pl-PL.rc +++ b/dll/win32/shell32/lang/pl-PL.rc @@ -493,9 +493,9 @@ CAPTION "Wylogowywanie z systemu ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Czy na pewno chcesz się wylogować?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "&Wyloguj", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Anuluj", IDCANCEL, 95, 39, 50, 14 + LTEXT "Czy na pewno chcesz się wylogować?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "&Wyloguj", IDOK, 49, 38, 43, 14 + PUSHBUTTON "Anuluj", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 278, 122 diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc index 9421ebf518e..d610d4a66f1 100644 --- a/dll/win32/shell32/lang/pt-BR.rc +++ b/dll/win32/shell32/lang/pt-BR.rc @@ -481,13 +481,13 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Você tem certeza que desejar realizar log off?", -1, 35, 15, 148, 8 + LTEXT "Você tem certeza que desejar realizar log off?", -1, 49, 15, 156, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancelar", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc index 5c24aa3e344..35a71da2a44 100644 --- a/dll/win32/shell32/lang/pt-PT.rc +++ b/dll/win32/shell32/lang/pt-PT.rc @@ -1,4 +1,4 @@ -LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_PORTUGAL MENU_001 MENUEX BEGIN @@ -481,15 +481,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Terminar sessão ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Pretende terminar a sessão?", -1, 43, 15, 170, 8 - DEFPUSHBUTTON "&Terminar a sessão", IDOK, 30, 38, 64, 14 - PUSHBUTTON "&Cancelar", IDCANCEL, 99, 38, 43, 14 + LTEXT "Pretende terminar a sessão?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "&Terminar a sessão", IDOK, 49, 38, 67, 14 + PUSHBUTTON "Cancelar", IDCANCEL, 123, 38, 67, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc index 546c875f56b..2ad102e0fc6 100644 --- a/dll/win32/shell32/lang/ro-RO.rc +++ b/dll/win32/shell32/lang/ro-RO.rc @@ -490,9 +490,9 @@ CAPTION "Deautentificare" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Sigur doriți să vă deautentificați?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "&Deautentifică", IDOK, 41, 39, 50, 14 - PUSHBUTTON "A&nulează", IDCANCEL, 95, 39, 50, 14 + LTEXT "Sigur doriți să vă deautentificați?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "&Deautentifică", IDOK, 49, 38, 53, 14 + PUSHBUTTON "Anulează", IDCANCEL, 109, 38, 53, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index ab5a7e3d928..4b2d22971d9 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -488,15 +488,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "Выход из ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Вы действительно хотите выйти из системы?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "В&ыход", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Отмена", IDCANCEL, 95, 39, 50, 14 + LTEXT "Вы действительно хотите выйти из системы?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "В&ыход", IDOK, 49, 38, 43, 14 + PUSHBUTTON "Отмена", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc index 8f82b531d90..bcc4af294ce 100644 --- a/dll/win32/shell32/lang/sk-SK.rc +++ b/dll/win32/shell32/lang/sk-SK.rc @@ -487,7 +487,7 @@ CAPTION "Odhlásiť ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Ste si istý, že sa chcete odhlásiť?", -1, 49, 15, 131, 8 + LTEXT "Ste si istý, že sa chcete odhlásiť?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "O&dhlásiť", IDOK, 49, 38, 43, 14 PUSHBUTTON "Zrušiť", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc index e29cf6de4e4..d8ae90a55af 100644 --- a/dll/win32/shell32/lang/sl-SI.rc +++ b/dll/win32/shell32/lang/sl-SI.rc @@ -487,7 +487,7 @@ CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Are you sure you want to log off?", -1, 49, 15, 131, 8 + LTEXT "Are you sure you want to log off?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Log Off", IDOK, 49, 38, 43, 14 PUSHBUTTON "Cancel", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc index 35da9ad8e5e..408a46ee2f5 100644 --- a/dll/win32/shell32/lang/sq-AL.rc +++ b/dll/win32/shell32/lang/sq-AL.rc @@ -491,9 +491,9 @@ CAPTION "Dil nga ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Jeni te sigurte qe doni të dilni?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "&Dil", IDOK, 41, 39, 50, 14 - PUSHBUTTON "Anulo", IDCANCEL, 95, 39, 50, 14 + LTEXT "Jeni te sigurte qe doni të dilni?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "&Dil", IDOK, 49, 38, 43, 14 + PUSHBUTTON "Anulo", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc index 361fcae0b5a..e00a5433304 100644 --- a/dll/win32/shell32/lang/sv-SE.rc +++ b/dll/win32/shell32/lang/sv-SE.rc @@ -487,7 +487,7 @@ CAPTION "Logga ut från ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Är du säker på att du vill logga ut?", -1, 49, 15, 131, 8 + LTEXT "Är du säker på att du vill logga ut?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "&Logga ut", IDOK, 49, 38, 43, 14 PUSHBUTTON "Avbryt", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc index 2466291200f..b45a252a61f 100644 --- a/dll/win32/shell32/lang/tr-TR.rc +++ b/dll/win32/shell32/lang/tr-TR.rc @@ -483,15 +483,15 @@ BEGIN ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END -IDD_LOG_OFF DIALOGEX 0, 0, 188, 60 +IDD_LOG_OFF DIALOGEX 0, 0, 212, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION CAPTION "ReactOS Oturumunu Kapat" FONT 8, "MS Shell Dlg" BEGIN - ICON IDI_SHELL_LOGOFF, IDC_STATIC, 7, 7, 21, 20 - LTEXT "Oturumu kapatmak istediğinizden emin misiniz?", -1, 33, 16, 151, 8 - DEFPUSHBUTTON "&Oturumu Kapat", IDOK, 30, 39, 60, 14 - PUSHBUTTON "İptal", IDCANCEL, 95, 39, 60, 14 + ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 + LTEXT "Oturumu kapatmak istediğinizden emin misiniz?", -1, 49, 15, 156, 8 + DEFPUSHBUTTON "&Oturumu Kapat", IDOK, 49, 38, 57, 14 + PUSHBUTTON "İptal", IDCANCEL, 113, 38, 57, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc index e34d4d2d355..09997ef3c96 100644 --- a/dll/win32/shell32/lang/uk-UA.rc +++ b/dll/win32/shell32/lang/uk-UA.rc @@ -487,7 +487,7 @@ CAPTION "Вихід із ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "Ви дійсно бажаєте вийти із системи?", -1, 49, 15, 131, 8 + LTEXT "Ви дійсно бажаєте вийти із системи?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "В&ихід", IDOK, 49, 38, 43, 14 PUSHBUTTON "Скасувати", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc index ce95ea14128..32f4421c1b0 100644 --- a/dll/win32/shell32/lang/zh-CN.rc +++ b/dll/win32/shell32/lang/zh-CN.rc @@ -497,9 +497,9 @@ CAPTION "注销 ReactOS" FONT 9, "宋体" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "您确定要注销 ReactOS 吗?", -1, 35, 16, 146, 8 - DEFPUSHBUTTON "注销(&L)", IDOK, 41, 39, 50, 14 - PUSHBUTTON "取消", IDCANCEL, 95, 39, 50, 14 + LTEXT "您确定要注销 ReactOS 吗?", -1, 49, 15, 132, 8 + DEFPUSHBUTTON "注销(&L)", IDOK, 49, 38, 43, 14 + PUSHBUTTON "取消", IDCANCEL, 99, 38, 43, 14 END IDD_LOG_OFF_FANCY DIALOGEX 0, 0, 208, 122 diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc index 0af7a25a294..80a753e83f4 100644 --- a/dll/win32/shell32/lang/zh-HK.rc +++ b/dll/win32/shell32/lang/zh-HK.rc @@ -495,7 +495,7 @@ CAPTION "登出 ReactOS" FONT 9, "新細明體" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "您確定要登出 ReactOS 嗎?", -1, 49, 15, 131, 8 + LTEXT "您確定要登出 ReactOS 嗎?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "登出(&L)", IDOK, 49, 38, 43, 14 PUSHBUTTON "取消", IDCANCEL, 99, 38, 43, 14 END diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc index af19932540c..6f3f37c48eb 100644 --- a/dll/win32/shell32/lang/zh-TW.rc +++ b/dll/win32/shell32/lang/zh-TW.rc @@ -496,7 +496,7 @@ CAPTION "登出 ReactOS" FONT 9, "新細明體" BEGIN ICON IDI_SHELL_LOGOFF, IDC_STATIC, 8, 6, 21, 20 - LTEXT "您確定要登出 ReactOS 嗎?", -1, 49, 15, 131, 8 + LTEXT "您確定要登出 ReactOS 嗎?", -1, 49, 15, 132, 8 DEFPUSHBUTTON "登出(&L)", IDOK, 49, 38, 43, 14 PUSHBUTTON "取消", IDCANCEL, 99, 38, 43, 14 END From 995d2559623380857ce5f371c2401cd8a8ff2913 Mon Sep 17 00:00:00 2001 From: Stanislav Motylkov Date: Thu, 7 Sep 2023 00:34:02 +0300 Subject: [PATCH 23/27] [REACTOS] Fix various '% s' typos with a space - [NOTEPAD][REGEDIT][SHELL32] were affected. - Also while being here, fix headers. --- base/applications/notepad/lang/hi-IN.rc | 10 +++++----- base/applications/regedit/lang/it-IT.rc | 16 ++++++++++++---- dll/win32/shell32/lang/hi-IN.rc | 9 ++++++++- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/base/applications/notepad/lang/hi-IN.rc b/base/applications/notepad/lang/hi-IN.rc index 5c568dc677e..59b16bb6cc6 100644 --- a/base/applications/notepad/lang/hi-IN.rc +++ b/base/applications/notepad/lang/hi-IN.rc @@ -1,8 +1,8 @@ /* - * PROJECT: Notepad Hindi Translation - * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) - * PURPOSE: Hindi Translation Of Notepad - * COPYRIGHT: Copyright 2018 Arnav Bhatt (arnavbhatt2004@gmail.com) + * PROJECT: ReactOS Notepad + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Hindi (India) resource file + * TRANSLATOR: Copyright 2018 Arnav Bhatt */ LANGUAGE LANG_HINDI, SUBLANG_HINDI_INDIA @@ -159,7 +159,7 @@ BEGIN STRING_UNTITLED "शीर्षकहीन" STRING_ALL_FILES "सभी फाइलें (*.*)" STRING_TEXT_FILES_TXT "पाठ फाइलें (*.txt)" - STRING_TOOLARGE "नोटपैड के लिए फ़ाइल '% s' बहुत बड़ी है।\n\ + STRING_TOOLARGE "नोटपैड के लिए फ़ाइल '%s' बहुत बड़ी है।\n\ कृपया एक अलग इडिटर का प्रयोग करें।" STRING_NOTEXT "आपने कोई टेक्स्ट दर्ज नहीं किया है।\ \nकृपया कुछ टाइप करें और पुनः प्रयास करें" diff --git a/base/applications/regedit/lang/it-IT.rc b/base/applications/regedit/lang/it-IT.rc index 5226bad09d8..5394d596765 100644 --- a/base/applications/regedit/lang/it-IT.rc +++ b/base/applications/regedit/lang/it-IT.rc @@ -1,3 +1,11 @@ +/* + * PROJECT: ReactOS Registry Editor + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Italian resource file + * TRANSLATORS: Copyright 2007-2013 Paolo Devoti + * Copyright 2013 Ivan Di Francesco (oswetto) + */ + LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL ID_ACCEL ACCELERATORS @@ -458,10 +466,10 @@ END STRINGTABLE BEGIN - IDS_IMPORT_PROMPT "Aggiungendo informazioni si possono involontariamente modificare o eliminare i valori e causare il giusto funzionamente dei componenti.\n Se non si considera attendibile la fonte di queste informazioni in '% s', non aggiungere al Registro di sistema.\n\n Si desidera continuare? " - IDS_IMPORT_OK "Le chiavi e i valori contenuti in '% s' sono stati correttamente aggiunti al Registro di sistema." - IDS_IMPORT_ERROR "Impossibile importare '% s': Errore durante l'apertura del file. Ci può essere un disco, file cdanneggiati o il file non esiste." - IDS_EXPORT_ERROR "Impossibile esportare '% s': Errore durante la creazione o la scrittura del file. Ci può essere un disco o un file di sistema danneggiato." + IDS_IMPORT_PROMPT "Aggiungendo informazioni si possono involontariamente modificare o eliminare i valori e causare il giusto funzionamente dei componenti.\n Se non si considera attendibile la fonte di queste informazioni in '%s', non aggiungere al Registro di sistema.\n\n Si desidera continuare? " + IDS_IMPORT_OK "Le chiavi e i valori contenuti in '%s' sono stati correttamente aggiunti al Registro di sistema." + IDS_IMPORT_ERROR "Impossibile importare '%s': Errore durante l'apertura del file. Ci può essere un disco, file cdanneggiati o il file non esiste." + IDS_EXPORT_ERROR "Impossibile esportare '%s': Errore durante la creazione o la scrittura del file. Ci può essere un disco o un file di sistema danneggiato." END STRINGTABLE diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc index b425b0d6e49..609c2bb38a8 100644 --- a/dll/win32/shell32/lang/hi-IN.rc +++ b/dll/win32/shell32/lang/hi-IN.rc @@ -1,3 +1,10 @@ +/* + * PROJECT: ReactOS Shell32 + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Hindi (India) resource file + * TRANSLATOR: Copyright 2019 Arnav Bhatt + */ + LANGUAGE LANG_HINDI, SUBLANG_HINDI_INDIA MENU_001 MENUEX @@ -1019,7 +1026,7 @@ BEGIN IDS_SPECIFY_ACTION "आपको एक कार्रवाई निर्दिष्ट करनी चाहिए।" IDS_INVALID_PROGRAM "निर्दिष्ट प्रोग्राम नहीं मिल सका। सुनिश्चित करें कि फ़ाइल का नाम और पथ सही है।" IDS_REMOVE_ACTION "क्या आप वाकई इस कार्रवाई को हटाना चाहते हैं?" - IDS_ACTION_EXISTS "इस फ़ाइल प्रकार के लिए कार्रवाई '% s' पहले से ही पंजीकृत है। कृपया एक अलग नाम दर्ज करें और पुनः प्रयास करें।" + IDS_ACTION_EXISTS "इस फ़ाइल प्रकार के लिए कार्रवाई '%s' पहले से ही पंजीकृत है। कृपया एक अलग नाम दर्ज करें और पुनः प्रयास करें।" IDS_EXE_FILTER "प्रोग्राम\0*.exe\0सारे फ़ाइल\0*.*\0" IDS_EDITING_ACTION "प्रकार के लिए संपादन कार्रवाई:" IDS_NO_ICONS "फ़ाइल '%s' में कोई आइकन नहीं है।\n\nसूची से एक आइकन चुनें या एक अलग फ़ाइल निर्दिष्ट करें।" From 583be404ddc0a52091a7a22944520d94196cbf70 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 16 Aug 2023 01:14:28 +0300 Subject: [PATCH 24/27] [NTOSKRNL/x64] Fix bug in KiInitializeContextThread The function set CtxSwitchFrame->ApcBypass to FALSE, preventing APCs (like when user mode sets the context while the thread is suspended) from being delivered as soon as the thread lowers IRQL to PASSIVE_LEVEL. This resulted in the SetContext APC to be delivered only after the user mode APC was initialized, overwriting the user mode APC context in the trap frame. This caused kernel32_winetest process to break. --- ntoskrnl/ke/amd64/thrdini.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ntoskrnl/ke/amd64/thrdini.c b/ntoskrnl/ke/amd64/thrdini.c index b2119c6e8a3..3185de21cd6 100644 --- a/ntoskrnl/ke/amd64/thrdini.c +++ b/ntoskrnl/ke/amd64/thrdini.c @@ -134,7 +134,7 @@ KiInitializeContextThread(IN PKTHREAD Thread, /* Set up the Context Switch Frame */ CtxSwitchFrame->Return = (ULONG64)KiThreadStartup; - CtxSwitchFrame->ApcBypass = FALSE; + CtxSwitchFrame->ApcBypass = TRUE; StartFrame->P1Home = (ULONG64)StartRoutine; StartFrame->P2Home = (ULONG64)StartContext; From f491d7cc99ecaf156b47baf33e3d9933a7f49e6e Mon Sep 17 00:00:00 2001 From: Ratin Gao Date: Thu, 7 Sep 2023 06:40:53 +0800 Subject: [PATCH 25/27] [KERNEL32][RTL] Implement One-Time initialization API and improve RTL support (#5046) * [KERNEL32][RTL] Implement One-Time initialization API and improve RTL support --- dll/win32/kernel32/kernel32.spec | 6 +- .../kernel32/kernel32_vista/CMakeLists.txt | 2 +- dll/win32/kernel32/kernel32_vista/InitOnce.c | 62 ++++ .../kernel32_vista/InitOnceExecuteOnce.c | 19 -- .../kernel32_vista/kernel32_vista.spec | 4 + .../rostests/apitests/kernel32/CMakeLists.txt | 1 + modules/rostests/apitests/kernel32/InitOnce.c | 280 ++++++++++++++++++ modules/rostests/apitests/kernel32/testlist.c | 2 + sdk/include/ndk/rtlfuncs.h | 37 +++ sdk/include/psdk/winbase.h | 37 ++- sdk/include/xdk/winnt_old.h | 10 +- sdk/lib/rtl/runonce.c | 77 +++-- 12 files changed, 472 insertions(+), 65 deletions(-) create mode 100644 dll/win32/kernel32/kernel32_vista/InitOnce.c delete mode 100644 dll/win32/kernel32/kernel32_vista/InitOnceExecuteOnce.c create mode 100644 modules/rostests/apitests/kernel32/InitOnce.c diff --git a/dll/win32/kernel32/kernel32.spec b/dll/win32/kernel32/kernel32.spec index e72f99fb295..c4583be816f 100644 --- a/dll/win32/kernel32/kernel32.spec +++ b/dll/win32/kernel32/kernel32.spec @@ -708,10 +708,10 @@ @ stdcall -stub -version=0x600+ IdnToNameprepUnicode(long wstr long ptr long) @ stdcall -stub -version=0x600+ IdnToUnicode(long wstr long ptr long) @ stdcall InitAtomTable(long) -@ stdcall -stub -version=0x600+ InitOnceBeginInitialize(ptr long ptr ptr) -@ stdcall -stub -version=0x600+ InitOnceComplete(ptr long ptr) +@ stdcall -version=0x600+ InitOnceBeginInitialize(ptr long ptr ptr) +@ stdcall -version=0x600+ InitOnceComplete(ptr long ptr) @ stdcall -version=0x600+ InitOnceExecuteOnce(ptr ptr ptr ptr) -@ stdcall -stub -version=0x600+ InitOnceInitialize(ptr) +@ stdcall -version=0x600+ InitOnceInitialize(ptr) NTDLL.RtlRunOnceInitialize @ stdcall -version=0x600+ InitializeConditionVariable(ptr) ntdll.RtlInitializeConditionVariable @ stdcall InitializeCriticalSection(ptr) @ stdcall InitializeCriticalSectionAndSpinCount(ptr long) diff --git a/dll/win32/kernel32/kernel32_vista/CMakeLists.txt b/dll/win32/kernel32/kernel32_vista/CMakeLists.txt index acc53b9d80a..3b2b8e735b7 100644 --- a/dll/win32/kernel32/kernel32_vista/CMakeLists.txt +++ b/dll/win32/kernel32/kernel32_vista/CMakeLists.txt @@ -9,7 +9,7 @@ spec2def(kernel32_vista.dll kernel32_vista.spec ADD_IMPORTLIB) list(APPEND SOURCE GetFileInformationByHandleEx.c GetTickCount64.c - InitOnceExecuteOnce.c + InitOnce.c sync.c vista.c) diff --git a/dll/win32/kernel32/kernel32_vista/InitOnce.c b/dll/win32/kernel32/kernel32_vista/InitOnce.c new file mode 100644 index 00000000000..339c157286c --- /dev/null +++ b/dll/win32/kernel32/kernel32_vista/InitOnce.c @@ -0,0 +1,62 @@ +/* + * PROJECT: ReactOS Win32 Base API + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: One-Time initialization API + * COPYRIGHT: Copyright 2023 Ratin Gao + */ + +#include "k32_vista.h" + +BOOL +WINAPI +InitOnceExecuteOnce( + _Inout_ PINIT_ONCE InitOnce, + _In_ __callback PINIT_ONCE_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ LPVOID *Context) +{ + return NT_SUCCESS(RtlRunOnceExecuteOnce(InitOnce, + (PRTL_RUN_ONCE_INIT_FN)InitFn, + Parameter, + Context)); +} + +BOOL +WINAPI +InitOnceBeginInitialize( + _Inout_ LPINIT_ONCE lpInitOnce, + _In_ DWORD dwFlags, + _Out_ PBOOL fPending, + _Outptr_opt_result_maybenull_ LPVOID *lpContext) +{ + NTSTATUS Status; + + Status = RtlRunOnceBeginInitialize(lpInitOnce, dwFlags, lpContext); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + + *fPending = (Status == STATUS_PENDING); + return TRUE; +} + +BOOL +WINAPI +InitOnceComplete( + _Inout_ LPINIT_ONCE lpInitOnce, + _In_ DWORD dwFlags, + _In_opt_ LPVOID lpContext) +{ + NTSTATUS Status; + + Status = RtlRunOnceComplete(lpInitOnce, dwFlags, lpContext); + if (!NT_SUCCESS(Status)) + { + BaseSetLastNTError(Status); + return FALSE; + } + + return TRUE; +} diff --git a/dll/win32/kernel32/kernel32_vista/InitOnceExecuteOnce.c b/dll/win32/kernel32/kernel32_vista/InitOnceExecuteOnce.c deleted file mode 100644 index 1ef59160aef..00000000000 --- a/dll/win32/kernel32/kernel32_vista/InitOnceExecuteOnce.c +++ /dev/null @@ -1,19 +0,0 @@ - -#include "k32_vista.h" - -#include -#include -#include - -DWORD WINAPI RtlRunOnceExecuteOnce( RTL_RUN_ONCE *once, PRTL_RUN_ONCE_INIT_FN func, - void *param, void **context ); - -/* Taken from Wine kernel32/sync.c */ - -/* - * @implemented - */ -BOOL NTAPI InitOnceExecuteOnce( INIT_ONCE *once, PINIT_ONCE_FN func, void *param, void **context ) -{ - return !RtlRunOnceExecuteOnce( once, (PRTL_RUN_ONCE_INIT_FN)func, param, context ); -} diff --git a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec index 02c1cb05739..bf074328323 100644 --- a/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec +++ b/dll/win32/kernel32/kernel32_vista/kernel32_vista.spec @@ -1,5 +1,9 @@ +@ stdcall InitOnceBeginInitialize(ptr long ptr ptr) +@ stdcall InitOnceComplete(ptr long ptr) @ stdcall InitOnceExecuteOnce(ptr ptr ptr ptr) +@ stdcall InitOnceInitialize(ptr) NTDLL.RtlRunOnceInitialize + @ stdcall GetFileInformationByHandleEx(long long ptr long) @ stdcall -ret64 GetTickCount64() diff --git a/modules/rostests/apitests/kernel32/CMakeLists.txt b/modules/rostests/apitests/kernel32/CMakeLists.txt index 9aebaa979a5..8c26b340edc 100644 --- a/modules/rostests/apitests/kernel32/CMakeLists.txt +++ b/modules/rostests/apitests/kernel32/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND SOURCE GetDriveType.c GetModuleFileName.c GetVolumeInformation.c + InitOnce.c interlck.c IsDBCSLeadByteEx.c JapaneseCalendar.c diff --git a/modules/rostests/apitests/kernel32/InitOnce.c b/modules/rostests/apitests/kernel32/InitOnce.c new file mode 100644 index 00000000000..586e87bac9d --- /dev/null +++ b/modules/rostests/apitests/kernel32/InitOnce.c @@ -0,0 +1,280 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) + * PURPOSE: Tests for One-Time initialization APIs + * COPYRIGHT: Copyright 2023 Ratin Gao + */ + +#include "precomp.h" + +typedef +VOID +WINAPI +FN_InitOnceInitialize(_Out_ PINIT_ONCE InitOnce); + +typedef +BOOL +WINAPI +FN_InitOnceExecuteOnce( + _Inout_ PINIT_ONCE InitOnce, + _In_ __callback PINIT_ONCE_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ LPVOID *Context); + +typedef +BOOL +WINAPI +FN_InitOnceBeginInitialize( + _Inout_ LPINIT_ONCE lpInitOnce, + _In_ DWORD dwFlags, + _Out_ PBOOL fPending, + _Outptr_opt_result_maybenull_ LPVOID *lpContext); + +typedef +BOOL +WINAPI +FN_InitOnceComplete( + _Inout_ LPINIT_ONCE lpInitOnce, + _In_ DWORD dwFlags, + _In_opt_ LPVOID lpContext); + +static ULONG g_ulRandom; + +static +VOID +InitWorker(_Inout_ PULONG InitCount, _Out_ PULONG_PTR Context) +{ + /* Increase the initialization count */ + (*InitCount)++; + + /* Output context data */ + *Context = (ULONG_PTR)g_ulRandom; +} + +static +_Success_(return != FALSE) +BOOL +WINAPI +InitOnceProc( + _Inout_ PINIT_ONCE InitOnce, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ PVOID* Context) +{ + if (!Parameter || !Context) + { + return FALSE; + } + + InitWorker(Parameter, (PULONG_PTR)Context); + return TRUE; +} + +START_TEST(InitOnce) +{ + BOOL bRet, fPending; + ULONG i, ulInitCount, ulSeed, ulContextData; + ULONG_PTR ulTempContext; + DWORD dwError; + + HMODULE hKernel32; + FN_InitOnceInitialize* pfnInitOnceInitialize; + FN_InitOnceExecuteOnce* pfnInitOnceExecuteOnce; + FN_InitOnceBeginInitialize* pfnInitOnceBeginInitialize; + FN_InitOnceComplete* pfnInitOnceComplete; + + /* Load functions */ + hKernel32 = GetModuleHandleW(L"kernel32.dll"); + if (!hKernel32) + { + skip("Module kernel32 not found\n"); + return; + } + pfnInitOnceInitialize = (FN_InitOnceInitialize*)GetProcAddress(hKernel32, "InitOnceInitialize"); + pfnInitOnceExecuteOnce = (FN_InitOnceExecuteOnce*)GetProcAddress(hKernel32, "InitOnceExecuteOnce"); + pfnInitOnceBeginInitialize = (FN_InitOnceBeginInitialize*)GetProcAddress(hKernel32, "InitOnceBeginInitialize"); + pfnInitOnceComplete = (FN_InitOnceComplete*)GetProcAddress(hKernel32, "InitOnceComplete"); + + /* + * Use a random as output context data, + * which the low-order INIT_ONCE_CTX_RESERVED_BITS bits should be zero. + */ + ulSeed = (ULONG)(ULONG_PTR)&ulSeed ^ GetTickCount(); + g_ulRandom = RtlRandom(&ulSeed); + for (i = 0; i < INIT_ONCE_CTX_RESERVED_BITS; i++) + { + g_ulRandom &= (~(1 << i)); + } + + /* Initialize One-Time initialization structure */ + INIT_ONCE InitOnce = { (PVOID)(ULONG_PTR)0xDEADBEEF }; + if (pfnInitOnceInitialize) + { + pfnInitOnceInitialize(&InitOnce); + } + else + { + skip("InitOnceInitialize not found\n"); + InitOnce = (INIT_ONCE)INIT_ONCE_STATIC_INIT; + } + + if (!pfnInitOnceExecuteOnce) + { + skip("InitOnceExecuteOnce not found\n"); + goto _test_sync; + } + + /* + * Perform synchronous initialization by using InitOnceExecuteOnce, + * which executes user-defined callback to initialize. + * Call InitOnceExecuteOnce twice will success, + * initialization count should be 1 and retrieve correct context data. + */ + ulInitCount = 0; + ulContextData = MAXULONG; + bRet = pfnInitOnceExecuteOnce(&InitOnce, InitOnceProc, &ulInitCount, (LPVOID*)&ulContextData); + ok(bRet, "InitOnceExecuteOnce failed with %lu\n", GetLastError()); + if (bRet) + { + /* Call InitOnceExecuteOnce again and check output values if the first call succeeded */ + bRet = pfnInitOnceExecuteOnce(&InitOnce, + InitOnceProc, + &ulInitCount, + (LPVOID*)&ulContextData); + ok(bRet, "InitOnceExecuteOnce failed with %lu\n", GetLastError()); + ok(ulInitCount == 1, "ulInitCount is not 1\n"); + ok(ulContextData == g_ulRandom, "Output ulContextData is incorrect\n"); + } + +_test_sync: + if (!pfnInitOnceBeginInitialize || !pfnInitOnceComplete) + { + skip("InitOnceBeginInitialize or InitOnceComplete not found\n"); + return; + } + + /* Re-initialize One-Time initialization structure by using INIT_ONCE_STATIC_INIT */ + InitOnce = (INIT_ONCE)INIT_ONCE_STATIC_INIT; + + /* Perform synchronous initialization by using InitOnceBeginInitialize */ + fPending = FALSE; + bRet = pfnInitOnceBeginInitialize(&InitOnce, 0, &fPending, (LPVOID*)&ulContextData); + ok(bRet, "InitOnceBeginInitialize failed with %lu\n", GetLastError()); + if (!bRet) + { + goto _test_async; + } + ok(fPending, "fPending is not TRUE after the first success InitOnceBeginInitialize\n"); + if (!fPending) + { + goto _test_async; + } + + /* Complete the initialization */ + InitWorker(&ulInitCount, &ulTempContext); + bRet = pfnInitOnceComplete(&InitOnce, 0, (LPVOID)ulTempContext); + ok(bRet, "InitOnceComplete failed with %lu\n", GetLastError()); + if (!bRet) + { + goto _test_async; + } + + /* + * Initialization is completed, call InitOnceBeginInitialize with + * INIT_ONCE_CHECK_ONLY should retrieve status and context data successfully + */ + bRet = pfnInitOnceBeginInitialize(&InitOnce, + INIT_ONCE_CHECK_ONLY, + &fPending, + (LPVOID*)&ulContextData); + ok(bRet && !fPending && ulContextData == g_ulRandom, + "InitOnceBeginInitialize returns incorrect result for a completed initialization\n"); + +_test_async: + InitOnce = (INIT_ONCE)INIT_ONCE_STATIC_INIT; + + /* Perform asynchronous initialization */ + fPending = FALSE; + bRet = pfnInitOnceBeginInitialize(&InitOnce, + INIT_ONCE_ASYNC, + &fPending, + (LPVOID*)&ulContextData); + ok(bRet, "InitOnceBeginInitialize failed with %lu\n", GetLastError()); + if (!bRet) + { + return; + } + ok(fPending, "fPending is not TRUE after a success InitOnceBeginInitialize\n"); + if (!fPending) + { + return; + } + + /* + * Now the initialization is in progress but not completed yet, + * call InitOnceBeginInitialize again without INIT_ONCE_ASYNC is invalid, + * should fail with ERROR_INVALID_PARAMETER + */ + bRet = pfnInitOnceBeginInitialize(&InitOnce, 0, &fPending, (LPVOID*)&ulContextData); + ok(!bRet, "InitOnceBeginInitialize should not success\n"); + if (!bRet) + { + dwError = GetLastError(); + ok(dwError == ERROR_INVALID_PARAMETER, + "Last error is %lu, but %u is expected\n", + dwError, + ERROR_INVALID_PARAMETER); + } + + /* + * Call InitOnceBeginInitialize again with INIT_ONCE_ASYNC + * should success because initialization could be executed in parallel + */ + bRet = pfnInitOnceBeginInitialize(&InitOnce, + INIT_ONCE_ASYNC, + &fPending, + (LPVOID*)&ulContextData); + ok(bRet, "InitOnceBeginInitialize failed with %lu\n", GetLastError()); + if (!bRet) + { + return; + } + ok(fPending, "fPending is not TRUE after a success InitOnceBeginInitialize\n"); + if (!fPending) + { + return; + } + + /* Complete the initialization once */ + InitWorker(&ulInitCount, &ulTempContext); + bRet = pfnInitOnceComplete(&InitOnce, INIT_ONCE_ASYNC, (LPVOID)ulTempContext); + ok(bRet, "InitOnceComplete failed with %lu\n", GetLastError()); + if (!bRet) + { + return; + } + + /* Subsequent InitOnceComplete should fail with ERROR_GEN_FAILURE */ + bRet = pfnInitOnceComplete(&InitOnce, INIT_ONCE_ASYNC, (LPVOID)ulTempContext); + ok(!bRet, "InitOnceComplete should not success\n"); + if (!bRet) + { + dwError = GetLastError(); + ok(dwError == ERROR_GEN_FAILURE, + "Last error is %lu, but %u is expected\n", + dwError, + ERROR_GEN_FAILURE); + } + + /* + * Initialization is completed, call InitOnceBeginInitialize with + * INIT_ONCE_CHECK_ONLY should retrieve status and context data successfully + */ + bRet = pfnInitOnceBeginInitialize(&InitOnce, + INIT_ONCE_CHECK_ONLY, + &fPending, + (LPVOID*)&ulContextData); + ok(bRet && !fPending && ulContextData == g_ulRandom, + "InitOnceBeginInitialize returns incorrect result for a completed initialization\n"); + + return; +} diff --git a/modules/rostests/apitests/kernel32/testlist.c b/modules/rostests/apitests/kernel32/testlist.c index b96dfa956f0..4802d88079c 100644 --- a/modules/rostests/apitests/kernel32/testlist.c +++ b/modules/rostests/apitests/kernel32/testlist.c @@ -18,6 +18,7 @@ extern void func_GetCurrentDirectory(void); extern void func_GetDriveType(void); extern void func_GetModuleFileName(void); extern void func_GetVolumeInformation(void); +extern void func_InitOnce(void); extern void func_interlck(void); extern void func_IsDBCSLeadByteEx(void); extern void func_JapaneseCalendar(void); @@ -53,6 +54,7 @@ const struct test winetest_testlist[] = { "GetDriveType", func_GetDriveType }, { "GetModuleFileName", func_GetModuleFileName }, { "GetVolumeInformation", func_GetVolumeInformation }, + { "InitOnce", func_InitOnce }, { "interlck", func_interlck }, { "IsDBCSLeadByteEx", func_IsDBCSLeadByteEx }, { "JapaneseCalendar", func_JapaneseCalendar }, diff --git a/sdk/include/ndk/rtlfuncs.h b/sdk/include/ndk/rtlfuncs.h index 47830b87990..41aedeb7e2d 100644 --- a/sdk/include/ndk/rtlfuncs.h +++ b/sdk/include/ndk/rtlfuncs.h @@ -4961,6 +4961,43 @@ RtlGetNativeSystemInformation( _Out_opt_ PULONG ReturnLength ); +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) || (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA) + +NTSYSAPI +VOID +NTAPI +RtlRunOnceInitialize( + _Out_ PRTL_RUN_ONCE RunOnce); + +_Maybe_raises_SEH_exception_ +NTSYSAPI +NTSTATUS +NTAPI +RtlRunOnceExecuteOnce( + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ __inner_callback PRTL_RUN_ONCE_INIT_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ PVOID *Context); + +_Must_inspect_result_ +NTSYSAPI +NTSTATUS +NTAPI +RtlRunOnceBeginInitialize( + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _Outptr_opt_result_maybenull_ PVOID *Context); + +NTSYSAPI +NTSTATUS +NTAPI +RtlRunOnceComplete( + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _In_opt_ PVOID Context); + +#endif + #if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) || (defined(__REACTOS__) && defined(_NTDLLBUILD_)) /* Put NTSYSAPI back when this will be really exported. Only statically linked for now */ // NTSYSAPI diff --git a/sdk/include/psdk/winbase.h b/sdk/include/psdk/winbase.h index 4872e40d98b..6b616b07b39 100644 --- a/sdk/include/psdk/winbase.h +++ b/sdk/include/psdk/winbase.h @@ -3837,6 +3837,8 @@ typedef PRTL_RUN_ONCE LPINIT_ONCE; #define INIT_ONCE_ASYNC RTL_RUN_ONCE_ASYNC #define INIT_ONCE_INIT_FAILED RTL_RUN_ONCE_INIT_FAILED +#define INIT_ONCE_CTX_RESERVED_BITS RTL_RUN_ONCE_CTX_RESERVED_BITS + typedef BOOL (WINAPI *PINIT_ONCE_FN)( _Inout_ PINIT_ONCE InitOnce, @@ -3961,14 +3963,41 @@ CopyFile2( #endif /* _WIN32_WINNT >= 0x0601 */ +#if (_WIN32_WINNT >= _WIN32_WINNT_VISTA) || (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA) + +WINBASEAPI +VOID +WINAPI +InitOnceInitialize( + _Out_ PINIT_ONCE InitOnce); + +WINBASEAPI +BOOL +WINAPI +InitOnceBeginInitialize( + _Inout_ LPINIT_ONCE lpInitOnce, + _In_ DWORD dwFlags, + _Out_ PBOOL fPending, + _Outptr_opt_result_maybenull_ LPVOID *lpContext); + +WINBASEAPI +BOOL +WINAPI +InitOnceComplete( + _Inout_ LPINIT_ONCE lpInitOnce, + _In_ DWORD dwFlags, + _In_opt_ LPVOID lpContext); + +#endif /* (_WIN32_WINNT >= _WIN32_WINNT_VISTA) || (DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA) */ + WINBASEAPI BOOL WINAPI InitOnceExecuteOnce( - _Inout_ PINIT_ONCE InitOnce, - _In_ __callback PINIT_ONCE_FN InitFn, - _Inout_opt_ PVOID Parameter, - _Outptr_opt_result_maybenull_ LPVOID *Context); + _Inout_ PINIT_ONCE InitOnce, + _In_ __callback PINIT_ONCE_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ LPVOID *Context); #if defined(_SLIST_HEADER_) && !defined(_NTOS_) && !defined(_NTOSP_) diff --git a/sdk/include/xdk/winnt_old.h b/sdk/include/xdk/winnt_old.h index 8e0de26a3da..7e564277b9a 100644 --- a/sdk/include/xdk/winnt_old.h +++ b/sdk/include/xdk/winnt_old.h @@ -2778,6 +2778,8 @@ RtlQueryDepthSList( #define RTL_RUN_ONCE_ASYNC 0x00000002UL #define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL +#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2 + #define RTL_RUN_ONCE_INIT {0} typedef union _RTL_RUN_ONCE { @@ -2787,14 +2789,6 @@ typedef union _RTL_RUN_ONCE { typedef DWORD WINAPI RTL_RUN_ONCE_INIT_FN(PRTL_RUN_ONCE, PVOID, PVOID*); typedef RTL_RUN_ONCE_INIT_FN *PRTL_RUN_ONCE_INIT_FN; -NTSYSAPI -DWORD -WINAPI -RtlRunOnceComplete( - PRTL_RUN_ONCE, - DWORD, - PVOID); - #endif #define RTL_CONDITION_VARIABLE_INIT {0} diff --git a/sdk/lib/rtl/runonce.c b/sdk/lib/rtl/runonce.c index 0ffa49b9fa4..da970e9febd 100644 --- a/sdk/lib/rtl/runonce.c +++ b/sdk/lib/rtl/runonce.c @@ -8,52 +8,58 @@ /****************************************************************** * RtlRunOnceInitialize (NTDLL.@) */ -void WINAPI RtlRunOnceInitialize( RTL_RUN_ONCE *once ) +VOID NTAPI RtlRunOnceInitialize(_Out_ PRTL_RUN_ONCE RunOnce) { - once->Ptr = NULL; + RunOnce->Ptr = NULL; } /****************************************************************** * RtlRunOnceBeginInitialize (NTDLL.@) */ -DWORD WINAPI RtlRunOnceBeginInitialize( RTL_RUN_ONCE *once, ULONG flags, void **context ) +_Must_inspect_result_ +NTSTATUS +NTAPI +RtlRunOnceBeginInitialize( + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _Outptr_opt_result_maybenull_ PVOID *Context) { - if (flags & RTL_RUN_ONCE_CHECK_ONLY) + if (Flags & RTL_RUN_ONCE_CHECK_ONLY) { - ULONG_PTR val = (ULONG_PTR)once->Ptr; + ULONG_PTR val = (ULONG_PTR)RunOnce->Ptr; - if (flags & RTL_RUN_ONCE_ASYNC) return STATUS_INVALID_PARAMETER; + if (Flags & RTL_RUN_ONCE_ASYNC) return STATUS_INVALID_PARAMETER; if ((val & 3) != 2) return STATUS_UNSUCCESSFUL; - if (context) *context = (void *)(val & ~3); + if (Context) *Context = (void *)(val & ~3); return STATUS_SUCCESS; } for (;;) { - ULONG_PTR next, val = (ULONG_PTR)once->Ptr; + ULONG_PTR next, val = (ULONG_PTR)RunOnce->Ptr; switch (val & 3) { case 0: /* first time */ - if (!interlocked_cmpxchg_ptr( &once->Ptr, - (flags & RTL_RUN_ONCE_ASYNC) ? (void *)3 : (void *)1, 0 )) + if (!interlocked_cmpxchg_ptr( &RunOnce->Ptr, + (Flags & RTL_RUN_ONCE_ASYNC) ? (void *)3 : (void *)1, 0)) return STATUS_PENDING; break; case 1: /* in progress, wait */ - if (flags & RTL_RUN_ONCE_ASYNC) return STATUS_INVALID_PARAMETER; + if (Flags & RTL_RUN_ONCE_ASYNC) return STATUS_INVALID_PARAMETER; next = val & ~3; - if (interlocked_cmpxchg_ptr( &once->Ptr, (void *)((ULONG_PTR)&next | 1), + if (interlocked_cmpxchg_ptr( &RunOnce->Ptr, (void *)((ULONG_PTR)&next | 1), (void *)val ) == (void *)val) NtWaitForKeyedEvent( 0, &next, FALSE, NULL ); break; case 2: /* done */ - if (context) *context = (void *)(val & ~3); + if (Context) *Context = (void *)(val & ~3); return STATUS_SUCCESS; case 3: /* in progress, async */ - if (!(flags & RTL_RUN_ONCE_ASYNC)) return STATUS_INVALID_PARAMETER; + if (!(Flags & RTL_RUN_ONCE_ASYNC)) return STATUS_INVALID_PARAMETER; return STATUS_PENDING; } } @@ -62,25 +68,30 @@ DWORD WINAPI RtlRunOnceBeginInitialize( RTL_RUN_ONCE *once, ULONG flags, void ** /****************************************************************** * RtlRunOnceComplete (NTDLL.@) */ -DWORD WINAPI RtlRunOnceComplete( RTL_RUN_ONCE *once, ULONG flags, void *context ) +NTSTATUS +NTAPI +RtlRunOnceComplete( + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ ULONG Flags, + _In_opt_ PVOID Context) { - if ((ULONG_PTR)context & 3) return STATUS_INVALID_PARAMETER; + if ((ULONG_PTR)Context & 3) return STATUS_INVALID_PARAMETER; - if (flags & RTL_RUN_ONCE_INIT_FAILED) + if (Flags & RTL_RUN_ONCE_INIT_FAILED) { - if (context) return STATUS_INVALID_PARAMETER; - if (flags & RTL_RUN_ONCE_ASYNC) return STATUS_INVALID_PARAMETER; + if (Context) return STATUS_INVALID_PARAMETER; + if (Flags & RTL_RUN_ONCE_ASYNC) return STATUS_INVALID_PARAMETER; } - else context = (void *)((ULONG_PTR)context | 2); + else Context = (void *)((ULONG_PTR)Context | 2); for (;;) { - ULONG_PTR val = (ULONG_PTR)once->Ptr; + ULONG_PTR val = (ULONG_PTR)RunOnce->Ptr; switch (val & 3) { case 1: /* in progress */ - if (interlocked_cmpxchg_ptr( &once->Ptr, context, (void *)val ) != (void *)val) break; + if (interlocked_cmpxchg_ptr( &RunOnce->Ptr, Context, (void *)val ) != (void *)val) break; val &= ~3; while (val) { @@ -91,8 +102,8 @@ DWORD WINAPI RtlRunOnceComplete( RTL_RUN_ONCE *once, ULONG flags, void *context return STATUS_SUCCESS; case 3: /* in progress, async */ - if (!(flags & RTL_RUN_ONCE_ASYNC)) return STATUS_INVALID_PARAMETER; - if (interlocked_cmpxchg_ptr( &once->Ptr, context, (void *)val ) != (void *)val) break; + if (!(Flags & RTL_RUN_ONCE_ASYNC)) return STATUS_INVALID_PARAMETER; + if (interlocked_cmpxchg_ptr( &RunOnce->Ptr, Context, (void *)val) != (void *)val) break; return STATUS_SUCCESS; default: @@ -104,18 +115,24 @@ DWORD WINAPI RtlRunOnceComplete( RTL_RUN_ONCE *once, ULONG flags, void *context /****************************************************************** * RtlRunOnceExecuteOnce (NTDLL.@) */ -DWORD WINAPI RtlRunOnceExecuteOnce( RTL_RUN_ONCE *once, PRTL_RUN_ONCE_INIT_FN func, - void *param, void **context ) +_Maybe_raises_SEH_exception_ +NTSTATUS +NTAPI +RtlRunOnceExecuteOnce( + _Inout_ PRTL_RUN_ONCE RunOnce, + _In_ __inner_callback PRTL_RUN_ONCE_INIT_FN InitFn, + _Inout_opt_ PVOID Parameter, + _Outptr_opt_result_maybenull_ PVOID *Context) { - DWORD ret = RtlRunOnceBeginInitialize( once, 0, context ); + DWORD ret = RtlRunOnceBeginInitialize( RunOnce, 0, Context ); if (ret != STATUS_PENDING) return ret; - if (!func( once, param, context )) + if (!InitFn( RunOnce, Parameter, Context )) { - RtlRunOnceComplete( once, RTL_RUN_ONCE_INIT_FAILED, NULL ); + RtlRunOnceComplete( RunOnce, RTL_RUN_ONCE_INIT_FAILED, NULL ); return STATUS_UNSUCCESSFUL; } - return RtlRunOnceComplete( once, 0, context ? *context : NULL ); + return RtlRunOnceComplete( RunOnce, 0, Context ? *Context : NULL ); } From 1d59cf43af3ad38ea853b883468358f648d6da97 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Mon, 14 Aug 2023 22:07:15 +0300 Subject: [PATCH 26/27] [NTDLL_APITEST] Add tests for critical sections --- .../rostests/apitests/ntdll/CMakeLists.txt | 1 + .../apitests/ntdll/RtlCriticalSection.c | 411 ++++++++++++++++++ modules/rostests/apitests/ntdll/testlist.c | 2 + sdk/include/xdk/winnt_old.h | 14 +- 4 files changed, 427 insertions(+), 1 deletion(-) create mode 100644 modules/rostests/apitests/ntdll/RtlCriticalSection.c diff --git a/modules/rostests/apitests/ntdll/CMakeLists.txt b/modules/rostests/apitests/ntdll/CMakeLists.txt index 14c12de120e..85515a2efaf 100644 --- a/modules/rostests/apitests/ntdll/CMakeLists.txt +++ b/modules/rostests/apitests/ntdll/CMakeLists.txt @@ -59,6 +59,7 @@ list(APPEND SOURCE RtlBitmap.c RtlComputePrivatizedDllName_U.c RtlCopyMappedMemory.c + RtlCriticalSection.c RtlDebugInformation.c RtlDeleteAce.c RtlDetermineDosPathNameType.c diff --git a/modules/rostests/apitests/ntdll/RtlCriticalSection.c b/modules/rostests/apitests/ntdll/RtlCriticalSection.c new file mode 100644 index 00000000000..920cc3a97a3 --- /dev/null +++ b/modules/rostests/apitests/ntdll/RtlCriticalSection.c @@ -0,0 +1,411 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) + * PURPOSE: Test for Rtl Critical Section API + * COPYRIGHT: Copyright 2023 Timo Kreuzer + */ + +#include "precomp.h" +#include + +SYSTEM_INFO g_SysInfo; +OSVERSIONINFOEXA g_VerInfo; +ULONG g_Version; +ULONG g_DefaultSpinCount; + +typedef +NTSTATUS +NTAPI +FN_RtlInitializeCriticalSectionEx( + _Out_ PRTL_CRITICAL_SECTION CriticalSection, + _In_ ULONG SpinCount, + _In_ ULONG Flags); + +FN_RtlInitializeCriticalSectionEx* pfnRtlInitializeCriticalSectionEx; +RTL_CRITICAL_SECTION CritSect; +HANDLE hEventThread1Ready, hEventThread1Cont; +HANDLE hEventThread2Ready, hEventThread2Cont; + +static +void +Test_Init(void) +{ + NTSTATUS Status; + BOOL HasDebugInfo = (g_Version <= _WIN32_WINNT_VISTA); + + _SEH2_TRY + { + RtlInitializeCriticalSection(NULL); + Status = STATUS_SUCCESS; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + ok_ntstatus(Status, STATUS_ACCESS_VIOLATION); + + Status = RtlInitializeCriticalSection(&CritSect); + ok_ntstatus(Status, STATUS_SUCCESS); + ok_long(CritSect.LockCount, -1); + ok_long(CritSect.RecursionCount, 0); + ok_ptr(CritSect.OwningThread, NULL); + ok_ptr(CritSect.LockSemaphore, NULL); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + if (HasDebugInfo) + { + ok(CritSect.DebugInfo != NULL, "DebugInfo is %p\n", CritSect.DebugInfo); + ok(CritSect.DebugInfo != LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + } + else + { + ok(CritSect.DebugInfo == LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + } + + Status = RtlInitializeCriticalSectionAndSpinCount(&CritSect, 0); + ok_ntstatus(Status, STATUS_SUCCESS); + ok_long(CritSect.LockCount, -1); + ok_long(CritSect.RecursionCount, 0); + ok_ptr(CritSect.OwningThread, NULL); + ok_ptr(CritSect.LockSemaphore, NULL); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + if (HasDebugInfo) + { + ok(CritSect.DebugInfo != NULL, "DebugInfo is %p\n", CritSect.DebugInfo); + ok(CritSect.DebugInfo != LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + } + else + { + ok(CritSect.DebugInfo == LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + } + + Status = RtlInitializeCriticalSectionAndSpinCount(&CritSect, 0xFF000000); + ok_ntstatus(Status, STATUS_SUCCESS); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + + Status = RtlInitializeCriticalSectionAndSpinCount(&CritSect, 0x1234); + ok_ntstatus(Status, STATUS_SUCCESS); + ok_size_t(CritSect.SpinCount, (g_SysInfo.dwNumberOfProcessors > 1) ? 0x1234 : 0); + + if (pfnRtlInitializeCriticalSectionEx != NULL) + { + _SEH2_TRY + { + pfnRtlInitializeCriticalSectionEx(NULL, 0, 0); + Status = STATUS_SUCCESS; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + ok_ntstatus(Status, STATUS_ACCESS_VIOLATION); + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0, 0); + ok_ntstatus(Status, STATUS_SUCCESS); + ok_long(CritSect.LockCount, -1); + ok_long(CritSect.RecursionCount, 0); + ok_ptr(CritSect.OwningThread, NULL); + ok_ptr(CritSect.LockSemaphore, NULL); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + if (HasDebugInfo) + { + ok(CritSect.DebugInfo != NULL, "DebugInfo is %p\n", CritSect.DebugInfo); + ok(CritSect.DebugInfo != LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + if ((CritSect.DebugInfo != NULL) && (CritSect.DebugInfo != LongToPtr(-1))) + { + ok_int(CritSect.DebugInfo->Type, 0); + ok_int(CritSect.DebugInfo->CreatorBackTraceIndex, 0); + ok_int(CritSect.DebugInfo->CreatorBackTraceIndexHigh, 0); + ok_ptr(CritSect.DebugInfo->CriticalSection, &CritSect); + ok(CritSect.DebugInfo->ProcessLocksList.Flink != NULL, "Flink is NULL\n"); + ok(CritSect.DebugInfo->ProcessLocksList.Blink != NULL, "Blink is NULL\n"); + if ((CritSect.DebugInfo->ProcessLocksList.Flink != NULL) && + (CritSect.DebugInfo->ProcessLocksList.Blink != NULL)) + { + ok_ptr(CritSect.DebugInfo->ProcessLocksList.Flink->Blink, + &CritSect.DebugInfo->ProcessLocksList); + ok_ptr(CritSect.DebugInfo->ProcessLocksList.Blink->Flink, + &CritSect.DebugInfo->ProcessLocksList); + } + ok_long(CritSect.DebugInfo->EntryCount, 0); + ok_long(CritSect.DebugInfo->ContentionCount, 0); + ok_long(CritSect.DebugInfo->Flags, 0); + ok_int(CritSect.DebugInfo->SpareWORD, 0); + } + } + else + { + ok(CritSect.DebugInfo == LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + } + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0x00FFFFFF, 0); + ok_size_t(CritSect.SpinCount, (g_SysInfo.dwNumberOfProcessors > 1) ? 0x00FFFFFF : 0); + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0x01000000, 0); + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_2); + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0x80000000, 0); + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_2); + + _SEH2_TRY + { + Status = pfnRtlInitializeCriticalSectionEx(NULL, 0x12345678, 0); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_2); + + for (ULONG i = 0; i < 32; i++) + { + ULONG Flags = 1UL << i; + ULONG AllowedFlags = 0x07FFFFFF; + if (g_Version >= _WIN32_WINNT_WIN7) AllowedFlags |= 0x18000000; + NTSTATUS ExpectedStatus = (Flags & ~AllowedFlags) ? + STATUS_INVALID_PARAMETER_3 : STATUS_SUCCESS; + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0, Flags); + ok(Status == ExpectedStatus, "Wrong Status (0x%lx) for Flags 0x%lx\n", + Status, Flags); + if (NT_SUCCESS(Status)) + { + ULONG SetFlags = Flags & 0x08000000; + if (g_Version >= _WIN32_WINNT_WIN7) SetFlags |= (Flags & 0x03000000); + ok_size_t(CritSect.SpinCount, (g_SysInfo.dwNumberOfProcessors > 1) ? g_DefaultSpinCount | SetFlags : SetFlags); + } + } + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0, 0xFFFFFFFF); + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_3); + _SEH2_TRY + { + Status = pfnRtlInitializeCriticalSectionEx(NULL, 0, 0xFFFFFFFF); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_3); + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0x12345678, 0xFFFFFFFF); + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_3); + + Status = pfnRtlInitializeCriticalSectionEx(&CritSect, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO); + if (g_Version >= _WIN32_WINNT_WIN7) + { + ok_ntstatus(Status, STATUS_SUCCESS); + ok(CritSect.DebugInfo != NULL, "DebugInfo is %p\n", CritSect.DebugInfo); + ok(CritSect.DebugInfo != LongToPtr(-1), "DebugInfo is %p\n", CritSect.DebugInfo); + if ((CritSect.DebugInfo != NULL) && (CritSect.DebugInfo != LongToPtr(-1))) + { + ok_int(CritSect.DebugInfo->Type, 0); + ok_int(CritSect.DebugInfo->CreatorBackTraceIndex, 0); + ok_int(CritSect.DebugInfo->CreatorBackTraceIndexHigh, 0); + ok_ptr(CritSect.DebugInfo->CriticalSection, &CritSect); + ok(CritSect.DebugInfo->ProcessLocksList.Flink != NULL, "Flink is NULL\n"); + ok(CritSect.DebugInfo->ProcessLocksList.Blink != NULL, "Blink is NULL\n"); + if ((CritSect.DebugInfo->ProcessLocksList.Flink != NULL) && + (CritSect.DebugInfo->ProcessLocksList.Blink != NULL)) + { + ok_ptr(CritSect.DebugInfo->ProcessLocksList.Flink->Blink, + &CritSect.DebugInfo->ProcessLocksList); + ok_ptr(CritSect.DebugInfo->ProcessLocksList.Blink->Flink, + &CritSect.DebugInfo->ProcessLocksList); + } + ok_long(CritSect.DebugInfo->EntryCount, 0); + ok_long(CritSect.DebugInfo->ContentionCount, 0); + ok_long(CritSect.DebugInfo->Flags, 0); + ok_int(CritSect.DebugInfo->SpareWORD, 0); + } + } + else + { + ok_ntstatus(Status, STATUS_INVALID_PARAMETER_3); + } + } + else + { + skip("RtlInitializeCriticalSectionEx not available.\n"); + } +} + +static +DWORD +WINAPI +ThreadProc1( + _In_ LPVOID lpParameter) +{ + printf("ThreadProc1 starting\n"); + RtlEnterCriticalSection(&CritSect); + + SetEvent(hEventThread1Ready); + + printf("ThreadProc1 waiting\n"); + WaitForSingleObject(hEventThread1Cont, INFINITE); + printf("ThreadProc1 returned from wait\n"); + + RtlLeaveCriticalSection(&CritSect); + + return 0; +} + +static +DWORD +WINAPI +ThreadProc2( + _In_ LPVOID lpParameter) +{ + printf("ThreadProc2 starting\n"); + RtlEnterCriticalSection(&CritSect); + + SetEvent(hEventThread2Ready); + + printf("ThreadProc2 waiting\n"); + WaitForSingleObject(hEventThread2Cont, INFINITE); + printf("ThreadProc2 returned from wait\n"); + + RtlLeaveCriticalSection(&CritSect); + + return 0; +} + +static +void +Test_Acquire(void) +{ + DWORD dwThreadId1, dwThreadId2; + HANDLE hThread1, hThread2; + + RtlInitializeCriticalSection(&CritSect); + + // Acquire once + RtlEnterCriticalSection(&CritSect); + ok_long(CritSect.LockCount, -2); + ok_long(CritSect.RecursionCount, 1); + ok_ptr(CritSect.OwningThread, UlongToHandle(GetCurrentThreadId())); + ok_ptr(CritSect.LockSemaphore, NULL); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + + // Acquire recursively + RtlEnterCriticalSection(&CritSect); + ok_long(CritSect.LockCount, -2); + ok_long(CritSect.RecursionCount, 2); + ok_ptr(CritSect.OwningThread, UlongToHandle(GetCurrentThreadId())); + ok_ptr(CritSect.LockSemaphore, NULL); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + + hEventThread1Ready = CreateEvent(NULL, TRUE, FALSE, NULL); + hEventThread1Cont = CreateEvent(NULL, TRUE, FALSE, NULL); + hEventThread2Ready = CreateEvent(NULL, TRUE, FALSE, NULL); + hEventThread2Cont = CreateEvent(NULL, TRUE, FALSE, NULL); + + // Create thread 1 and wait to it time to try to acquire the critical section + hThread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, &dwThreadId1); + + // Wait up to 10 s + for (ULONG i = 0; (CritSect.LockCount == -2) && (i < 1000); i++) + { + Sleep(10); + } + + ok_long(CritSect.LockCount, -6); + ok_long(CritSect.RecursionCount, 2); + ok_ptr(CritSect.OwningThread, UlongToHandle(GetCurrentThreadId())); + //ok_ptr(CritSect.LockSemaphore, LongToPtr(-1)); // TODO: this behaves differently on different OS versions + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + + // Create thread 2 and wait to it time to try to acquire the critical section + hThread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, &dwThreadId2); + + // Wait up to 10 s + for (ULONG i = 0; (CritSect.LockCount == -6) && (i < 1000); i++) + { + Sleep(10); + } + + ok_long(CritSect.LockCount, -10); + ok_long(CritSect.RecursionCount, 2); + ok_ptr(CritSect.OwningThread, UlongToHandle(GetCurrentThreadId())); + //ok_ptr(CritSect.LockSemaphore, LongToPtr(-1)); + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + + RtlLeaveCriticalSection(&CritSect); + ok_long(CritSect.LockCount, -10); + ok_long(CritSect.RecursionCount, 1); + RtlLeaveCriticalSection(&CritSect); + + // Wait until thread 1 has acquired the critical section + WaitForSingleObject(hEventThread1Ready, INFINITE); + + ok_long(CritSect.LockCount, -6); + ok_long(CritSect.RecursionCount, 1); + ok_ptr(CritSect.OwningThread, UlongToHandle(dwThreadId1)); + //ok_ptr(CritSect.LockSemaphore, LongToPtr(-1)); + if (g_DefaultSpinCount != 0) + { + ok(CritSect.SpinCount <= g_DefaultSpinCount, "SpinCount increased\n"); + } + else + { + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + } + + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount ? g_DefaultSpinCount - 1 : 0); + + // Release thread 1, wait for thread 2 to acquire the critical section + SetEvent(hEventThread1Cont); + WaitForSingleObject(hEventThread2Ready, INFINITE); + + ok_long(CritSect.LockCount, -2); + ok_long(CritSect.RecursionCount, 1); + ok_ptr(CritSect.OwningThread, UlongToHandle(dwThreadId2)); + //ok_ptr(CritSect.LockSemaphore, LongToPtr(-1)); + if (g_DefaultSpinCount != 0) + { + ok(CritSect.SpinCount <= g_DefaultSpinCount, "SpinCount increased\n"); + } + else + { + ok_size_t(CritSect.SpinCount, g_DefaultSpinCount); + } + + // Release thread 2 + SetEvent(hEventThread2Cont); + + // To make Thomas happy :) + WaitForSingleObject(hThread1, INFINITE); + WaitForSingleObject(hThread2, INFINITE); +} + +START_TEST(RtlCriticalSection) +{ + HMODULE hmodNtDll = GetModuleHandleA("ntdll.dll"); + pfnRtlInitializeCriticalSectionEx = (FN_RtlInitializeCriticalSectionEx*) + GetProcAddress(hmodNtDll, "RtlInitializeCriticalSectionEx"); + + g_VerInfo.dwOSVersionInfoSize = sizeof(g_VerInfo); + GetVersionExA((LPOSVERSIONINFOA)&g_VerInfo); + g_Version = g_VerInfo.dwMajorVersion << 8 | g_VerInfo.dwMinorVersion; + printf("g_VerInfo: %lu.%lu.%lu ('%s')\n ", + g_VerInfo.dwMajorVersion, + g_VerInfo.dwMinorVersion, + g_VerInfo.dwBuildNumber, + g_VerInfo.szCSDVersion); + GetSystemInfo(&g_SysInfo); + printf("g_SysInfo.dwNumberOfProcessors = %lu\n", g_SysInfo.dwNumberOfProcessors); + + if ((g_Version >= _WIN32_WINNT_VISTA) && (g_SysInfo.dwNumberOfProcessors > 1)) + { + g_DefaultSpinCount = 0x20007d0; + } + else + { + g_DefaultSpinCount = 0; + } + + Test_Init(); + Test_Acquire(); +} diff --git a/modules/rostests/apitests/ntdll/testlist.c b/modules/rostests/apitests/ntdll/testlist.c index 7f80f42420b..2be58938238 100644 --- a/modules/rostests/apitests/ntdll/testlist.c +++ b/modules/rostests/apitests/ntdll/testlist.c @@ -55,6 +55,7 @@ extern void func_RtlAllocateHeap(void); extern void func_RtlBitmap(void); extern void func_RtlComputePrivatizedDllName_U(void); extern void func_RtlCopyMappedMemory(void); +extern void func_RtlCriticalSection(void); extern void func_RtlDebugInformation(void); extern void func_RtlDeleteAce(void); extern void func_RtlDetermineDosPathNameType(void); @@ -150,6 +151,7 @@ const struct test winetest_testlist[] = { "RtlBitmapApi", func_RtlBitmap }, { "RtlComputePrivatizedDllName_U", func_RtlComputePrivatizedDllName_U }, { "RtlCopyMappedMemory", func_RtlCopyMappedMemory }, + { "RtlCriticalSection", func_RtlCriticalSection }, { "RtlDebugInformation", func_RtlDebugInformation }, { "RtlDeleteAce", func_RtlDeleteAce }, { "RtlDetermineDosPathNameType", func_RtlDetermineDosPathNameType }, diff --git a/sdk/include/xdk/winnt_old.h b/sdk/include/xdk/winnt_old.h index 7e564277b9a..15d353fc9ef 100644 --- a/sdk/include/xdk/winnt_old.h +++ b/sdk/include/xdk/winnt_old.h @@ -1116,7 +1116,19 @@ typedef VOID (NTAPI *WORKERCALLBACKFUNC)(PVOID); #define IO_REPARSE_TAG_MOUNT_POINT 0xA0000003 #define IO_REPARSE_TAG_SYMLINK 0xA000000CL -#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO 0x01000000 +#define RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO 0x01000000 +#define RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN 0x02000000 +#define RTL_CRITICAL_SECTION_FLAG_STATIC_INIT 0x04000000 +#define RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE 0x08000000 +#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO 0x10000000 +#define RTL_CRITICAL_SECTION_ALL_FLAG_BITS 0xFF000000 +#define RTL_CRITICAL_SECTION_FLAG_RESERVED \ + (RTL_CRITICAL_SECTION_ALL_FLAG_BITS & \ + (~(RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO | \ + RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN | \ + RTL_CRITICAL_SECTION_FLAG_STATIC_INIT | \ + RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE | \ + RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO))) #ifndef RC_INVOKED From 8f6aaa8af64ab752960f9404a8b5dfeadaf57b1e Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sun, 13 Aug 2023 14:03:48 +0300 Subject: [PATCH 27/27] [RTL][NTDLL] Implement and export RtlInitializeCriticalSectionEx --- dll/ntdll/def/ntdll.spec | 2 +- sdk/lib/rtl/critical.c | 174 +++++++++++++++++++++++++++------------ 2 files changed, 124 insertions(+), 52 deletions(-) diff --git a/dll/ntdll/def/ntdll.spec b/dll/ntdll/def/ntdll.spec index ee2598f8040..b7659f042d5 100644 --- a/dll/ntdll/def/ntdll.spec +++ b/dll/ntdll/def/ntdll.spec @@ -940,7 +940,7 @@ @ stdcall RtlInitializeContext(ptr ptr ptr ptr ptr) @ stdcall RtlInitializeCriticalSection(ptr) @ stdcall RtlInitializeCriticalSectionAndSpinCount(ptr long) -@ stub -version=0x600+ RtlInitializeCriticalSectionEx +@ stdcall -version=0x600+ RtlInitializeCriticalSectionEx(ptr long long) @ stub -version=0x600+ -arch=i386 RtlInitializeExceptionChain @ stdcall RtlInitializeGenericTable(ptr ptr ptr ptr ptr) @ stdcall RtlInitializeGenericTableAvl(ptr ptr ptr ptr ptr) diff --git a/sdk/lib/rtl/critical.c b/sdk/lib/rtl/critical.c index f2e88481417..0d2ca9913ad 100644 --- a/sdk/lib/rtl/critical.c +++ b/sdk/lib/rtl/critical.c @@ -28,6 +28,10 @@ extern HANDLE LdrpShutdownThreadId; /* FUNCTIONS *****************************************************************/ +#define CRITSECT_HAS_DEBUG_INFO(CriticalSection) \ + (((CriticalSection)->DebugInfo != NULL) && \ + ((CriticalSection)->DebugInfo != LongToPtr(-1))) + /*++ * RtlpCreateCriticalSectionSem * @@ -119,7 +123,7 @@ RtlpWaitForCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) CriticalSection, CriticalSection->LockSemaphore); - if (CriticalSection->DebugInfo) + if (CRITSECT_HAS_DEBUG_INFO(CriticalSection)) CriticalSection->DebugInfo->EntryCount++; /* @@ -142,7 +146,7 @@ RtlpWaitForCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) for (;;) { /* Increase the number of times we've had contention */ - if (CriticalSection->DebugInfo) + if (CRITSECT_HAS_DEBUG_INFO(CriticalSection)) CriticalSection->DebugInfo->ContentionCount++; /* Check if allocating the event failed */ @@ -404,7 +408,7 @@ RtlDeleteCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) /* Protect List */ RtlEnterCriticalSection(&RtlCriticalSectionLock); - if (CriticalSection->DebugInfo) + if (CRITSECT_HAS_DEBUG_INFO(CriticalSection)) { /* Remove it from the list */ RemoveEntryList(&CriticalSection->DebugInfo->ProcessLocksList); @@ -417,7 +421,7 @@ RtlDeleteCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) /* Unprotect */ RtlLeaveCriticalSection(&RtlCriticalSectionLock); - if (CriticalSection->DebugInfo) + if (CRITSECT_HAS_DEBUG_INFO(CriticalSection)) { /* Free it */ RtlpFreeDebugInfo(CriticalSection->DebugInfo); @@ -543,8 +547,8 @@ RtlInitializeCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) } /*++ - * RtlInitializeCriticalSectionAndSpinCount - * @implemented NT4 + * RtlInitializeCriticalSectionEx + * @implemented NT6.0 * * Initialises a new critical section. * @@ -553,6 +557,8 @@ RtlInitializeCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) * * SpinCount - Spin count for the critical section. * + * Flags - Flags for initialization. + * * Returns: * STATUS_SUCCESS. * @@ -562,10 +568,41 @@ RtlInitializeCriticalSection(PRTL_CRITICAL_SECTION CriticalSection) *--*/ NTSTATUS NTAPI -RtlInitializeCriticalSectionAndSpinCount(PRTL_CRITICAL_SECTION CriticalSection, - ULONG SpinCount) +RtlInitializeCriticalSectionEx( + _Out_ PRTL_CRITICAL_SECTION CriticalSection, + _In_ ULONG SpinCount, + _In_ ULONG Flags) { PRTL_CRITICAL_SECTION_DEBUG CritcalSectionDebugData; + ULONG AllowedFlags; + ULONG OsVersion; + + /* Remove lower bits from flags */ + Flags &= RTL_CRITICAL_SECTION_ALL_FLAG_BITS; + + /* These flags generally allowed */ + AllowedFlags = RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO | + RTL_CRITICAL_SECTION_FLAG_DYNAMIC_SPIN | + RTL_CRITICAL_SECTION_FLAG_STATIC_INIT; + + /* Flags for Windows 7+ (CHECKME) */ + OsVersion = NtCurrentPeb()->OSMajorVersion << 8 | + NtCurrentPeb()->OSMinorVersion; + if (OsVersion >= _WIN32_WINNT_WIN7) + { + AllowedFlags |= RTL_CRITICAL_SECTION_FLAG_RESOURCE_TYPE | + RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO; + } + + if (Flags & ~AllowedFlags) + { + return STATUS_INVALID_PARAMETER_3; + } + + if (SpinCount & RTL_CRITICAL_SECTION_ALL_FLAG_BITS) + { + return STATUS_INVALID_PARAMETER_2; + } /* First things first, set up the Object */ DPRINT("Initializing Critical Section: %p\n", CriticalSection); @@ -575,62 +612,97 @@ RtlInitializeCriticalSectionAndSpinCount(PRTL_CRITICAL_SECTION CriticalSection, CriticalSection->SpinCount = (NtCurrentPeb()->NumberOfProcessors > 1) ? SpinCount : 0; CriticalSection->LockSemaphore = 0; - /* Allocate the Debug Data */ - CritcalSectionDebugData = RtlpAllocateDebugInfo(); - DPRINT("Allocated Debug Data: %p inside Process: %p\n", - CritcalSectionDebugData, - NtCurrentTeb()->ClientId.UniqueProcess); - - if (!CritcalSectionDebugData) + if (Flags & RTL_CRITICAL_SECTION_FLAG_NO_DEBUG_INFO) { - /* This is bad! */ - DPRINT1("Couldn't allocate Debug Data for: %p\n", CriticalSection); - return STATUS_NO_MEMORY; + CriticalSection->DebugInfo = LongToPtr(-1); } + else + { + /* Allocate the Debug Data */ + CritcalSectionDebugData = RtlpAllocateDebugInfo(); + DPRINT("Allocated Debug Data: %p inside Process: %p\n", + CritcalSectionDebugData, + NtCurrentTeb()->ClientId.UniqueProcess); - /* Set it up */ - CritcalSectionDebugData->Type = RTL_CRITSECT_TYPE; - CritcalSectionDebugData->ContentionCount = 0; - CritcalSectionDebugData->EntryCount = 0; - CritcalSectionDebugData->CriticalSection = CriticalSection; - CritcalSectionDebugData->Flags = 0; - CriticalSection->DebugInfo = CritcalSectionDebugData; + if (!CritcalSectionDebugData) + { + /* This is bad! */ + DPRINT1("Couldn't allocate Debug Data for: %p\n", CriticalSection); + return STATUS_NO_MEMORY; + } - /* - * Add it to the List of Critical Sections owned by the process. - * If we've initialized the Lock, then use it. If not, then probably - * this is the lock initialization itself, so insert it directly. - */ - if ((CriticalSection != &RtlCriticalSectionLock) && (RtlpCritSectInitialized)) - { - DPRINT("Securely Inserting into ProcessLocks: %p, %p, %p\n", - &CritcalSectionDebugData->ProcessLocksList, - CriticalSection, - &RtlCriticalSectionList); + /* Set it up */ + CritcalSectionDebugData->Type = RTL_CRITSECT_TYPE; + CritcalSectionDebugData->ContentionCount = 0; + CritcalSectionDebugData->EntryCount = 0; + CritcalSectionDebugData->CriticalSection = CriticalSection; + CritcalSectionDebugData->Flags = 0; + CriticalSection->DebugInfo = CritcalSectionDebugData; - /* Protect List */ - RtlEnterCriticalSection(&RtlCriticalSectionLock); + /* + * Add it to the List of Critical Sections owned by the process. + * If we've initialized the Lock, then use it. If not, then probably + * this is the lock initialization itself, so insert it directly. + */ + if ((CriticalSection != &RtlCriticalSectionLock) && (RtlpCritSectInitialized)) + { + DPRINT("Securely Inserting into ProcessLocks: %p, %p, %p\n", + &CritcalSectionDebugData->ProcessLocksList, + CriticalSection, + &RtlCriticalSectionList); - /* Add this one */ - InsertTailList(&RtlCriticalSectionList, &CritcalSectionDebugData->ProcessLocksList); + /* Protect List */ + RtlEnterCriticalSection(&RtlCriticalSectionLock); - /* Unprotect */ - RtlLeaveCriticalSection(&RtlCriticalSectionLock); - } - else - { - DPRINT("Inserting into ProcessLocks: %p, %p, %p\n", - &CritcalSectionDebugData->ProcessLocksList, - CriticalSection, - &RtlCriticalSectionList); + /* Add this one */ + InsertTailList(&RtlCriticalSectionList, &CritcalSectionDebugData->ProcessLocksList); + + /* Unprotect */ + RtlLeaveCriticalSection(&RtlCriticalSectionLock); + } + else + { + DPRINT("Inserting into ProcessLocks: %p, %p, %p\n", + &CritcalSectionDebugData->ProcessLocksList, + CriticalSection, + &RtlCriticalSectionList); - /* Add it directly */ - InsertTailList(&RtlCriticalSectionList, &CritcalSectionDebugData->ProcessLocksList); + /* Add it directly */ + InsertTailList(&RtlCriticalSectionList, &CritcalSectionDebugData->ProcessLocksList); + } } return STATUS_SUCCESS; } +/*++ + * RtlInitializeCriticalSectionAndSpinCount + * @implemented NT4 + * + * Initialises a new critical section. + * + * Params: + * CriticalSection - Critical section to initialise + * + * SpinCount - Spin count for the critical section. + * + * Returns: + * STATUS_SUCCESS. + * + * Remarks: + * SpinCount is ignored on single-processor systems. + * + *--*/ +NTSTATUS +NTAPI +RtlInitializeCriticalSectionAndSpinCount( + _Out_ PRTL_CRITICAL_SECTION CriticalSection, + _In_ ULONG SpinCount) +{ + SpinCount &= ~RTL_CRITICAL_SECTION_ALL_FLAG_BITS; + return RtlInitializeCriticalSectionEx(CriticalSection, SpinCount, 0); +} + /*++ * RtlGetCriticalSectionRecursionCount * @implemented NT5.2 SP1