ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
February 2022
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
17 participants
108 discussions
Start a n
N
ew thread
[reactos] 03/04: [SHELL32] Show properties dialog in a new thread
by Mark Jansen
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=bc5603d9d078c4c276d85…
commit bc5603d9d078c4c276d852d636a2ba642288f984 Author: Mark Jansen <mark.jansen(a)reactos.org> AuthorDate: Thu Feb 3 23:23:33 2022 +0100 Commit: Mark Jansen <mark.jansen(a)reactos.org> CommitDate: Mon Feb 7 20:56:46 2022 +0100 [SHELL32] Show properties dialog in a new thread --- dll/win32/shell32/shlfolder.cpp | 81 ++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/dll/win32/shell32/shlfolder.cpp b/dll/win32/shell32/shlfolder.cpp index 03b4aa4ee11..01018b44ede 100644 --- a/dll/win32/shell32/shlfolder.cpp +++ b/dll/win32/shell32/shlfolder.cpp @@ -26,6 +26,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); +static +HRESULT WINAPI _SHBindToFolder(LPCITEMIDLIST path, IShellFolder** newFolder) +{ + CComPtr<IShellFolder> desktop; + + HRESULT hr = ::SHGetDesktopFolder(&desktop); + if (FAILED_UNEXPECTEDLY(hr)) + return E_FAIL; + if (path == NULL || path->mkid.cb == 0) + { + *newFolder = desktop; + desktop.p->AddRef(); + return S_OK; + } + return desktop->BindToObject(path, NULL, IID_PPV_ARG(IShellFolder, newFolder)); +} + + /*************************************************************************** * GetNextElement (internal function) * @@ -422,33 +440,39 @@ SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, return E_FAIL; } -/* - * for internal use - */ -HRESULT WINAPI -Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj) + + +static +DWORD WINAPI +_ShowPropertiesDialogThread(LPVOID lpParameter) { - PIDLIST_ABSOLUTE pidlFolder; - PUITEMID_CHILD *apidl; - UINT cidl; - HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl); - if (FAILED_UNEXPECTEDLY(hr)) - return hr; + CComPtr<IDataObject> pDataObject; + pDataObject.Attach((IDataObject*)lpParameter); + + CDataObjectHIDA cida(pDataObject); - if (cidl > 1) + if (FAILED_UNEXPECTEDLY(cida.hr())) + return cida.hr(); + + if (cida->cidl > 1) { ERR("SHMultiFileProperties is not yet implemented\n"); - SHFree(pidlFolder); - _ILFreeaPidl(apidl, cidl); return E_FAIL; } + PCUIDLIST_ABSOLUTE pidlFolder = HIDA_GetPIDLFolder(cida); + CComPtr<IShellFolder> psfParent; + HRESULT hr = _SHBindToFolder(pidlFolder, &psfParent); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + STRRET strFile; - hr = psf->GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strFile); - if (SUCCEEDED(hr)) + PCUIDLIST_RELATIVE apidl = HIDA_GetPIDLItem(cida, 0); + hr = psfParent->GetDisplayNameOf(apidl, SHGDN_FORPARSING, &strFile); + if (!FAILED_UNEXPECTEDLY(hr)) { - hr = SH_ShowPropertiesDialog(strFile.pOleStr, pidlFolder, apidl); - if (FAILED(hr)) + BOOL bSuccess = SH_ShowPropertiesDialog(strFile.pOleStr, pidlFolder, &apidl); + if (!bSuccess) ERR("SH_ShowPropertiesDialog failed\n"); } else @@ -456,8 +480,23 @@ Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj) ERR("Failed to get display name\n"); } - SHFree(pidlFolder); - _ILFreeaPidl(apidl, cidl); + return 0; +} - return hr; +/* + * for internal use + */ +HRESULT WINAPI +Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj) +{ + pdtobj->AddRef(); + if (!SHCreateThread(_ShowPropertiesDialogThread, pdtobj, CTF_INSIST | CTF_COINIT, NULL)) + { + pdtobj->Release(); + return HRESULT_FROM_WIN32(GetLastError()); + } + else + { + return S_OK; + } }
2 years, 10 months
1
0
0
0
[reactos] 02/04: [SHELL32] ShellExecute: Retry after searching for the file in the SEE_MASK_INVOKEIDLIST case
by Mark Jansen
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=93fac5533d377e86f65cb…
commit 93fac5533d377e86f65cb4c3ad2abe6ef44ea1a0 Author: Mark Jansen <mark.jansen(a)reactos.org> AuthorDate: Thu Feb 3 23:22:37 2022 +0100 Commit: Mark Jansen <mark.jansen(a)reactos.org> CommitDate: Mon Feb 7 20:56:46 2022 +0100 [SHELL32] ShellExecute: Retry after searching for the file in the SEE_MASK_INVOKEIDLIST case CORE-18035 --- dll/win32/shell32/shlexec.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dll/win32/shell32/shlexec.cpp b/dll/win32/shell32/shlexec.cpp index 7cfc0021470..a3a4a05a2c3 100644 --- a/dll/win32/shell32/shlexec.cpp +++ b/dll/win32/shell32/shlexec.cpp @@ -1486,7 +1486,18 @@ static HRESULT shellex_get_contextmenu(LPSHELLEXECUTEINFOW sei, CComPtr<IContext SFGAOF sfga = 0; HRESULT hr = SHParseDisplayName(sei->lpFile, NULL, &allocatedPidl, SFGAO_STORAGECAPMASK, &sfga); if (FAILED(hr)) - return hr; + { + WCHAR Buffer[MAX_PATH] = {}; + // FIXME: MAX_PATH..... + UINT retval = SHELL_FindExecutable(sei->lpDirectory, sei->lpFile, sei->lpVerb, Buffer, _countof(Buffer), NULL, NULL, NULL, sei->lpParameters); + if (retval <= 32) + return HRESULT_FROM_WIN32(retval); + + hr = SHParseDisplayName(Buffer, NULL, &allocatedPidl, SFGAO_STORAGECAPMASK, &sfga); + // This should not happen, we found it... + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + } pidl = allocatedPidl; }
2 years, 10 months
1
0
0
0
[reactos] 01/04: [SHELL32] ShellExecute: Implement SEE_MASK_INVOKEIDLIST
by Mark Jansen
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f6f5490ab41a4446a6026…
commit f6f5490ab41a4446a6026c81bea4cc8255584184 Author: Mark Jansen <mark.jansen(a)reactos.org> AuthorDate: Thu Feb 3 21:54:12 2022 +0100 Commit: Mark Jansen <mark.jansen(a)reactos.org> CommitDate: Mon Feb 7 20:56:21 2022 +0100 [SHELL32] ShellExecute: Implement SEE_MASK_INVOKEIDLIST CORE-18035 Also simplify some error handling by using smart pointers --- dll/win32/shell32/folders/CFSFolder.cpp | 4 +- dll/win32/shell32/shlexec.cpp | 194 ++++++++++++++++++++++---------- 2 files changed, 138 insertions(+), 60 deletions(-) diff --git a/dll/win32/shell32/folders/CFSFolder.cpp b/dll/win32/shell32/folders/CFSFolder.cpp index 72325d3973b..c332d812d3a 100644 --- a/dll/win32/shell32/folders/CFSFolder.cpp +++ b/dll/win32/shell32/folders/CFSFolder.cpp @@ -1812,8 +1812,8 @@ HRESULT WINAPI CFSFolder::CallBack(IShellFolder *psf, HWND hwndOwner, IDataObjec PUITEMID_CHILD pidlChild = ILClone(ILFindLastID(m_pidlRoot)); LPITEMIDLIST pidlParent = ILClone(m_pidlRoot); ILRemoveLastID(pidlParent); - HRESULT hr = SH_ShowPropertiesDialog(m_sPathTarget, pidlParent, &pidlChild); - if (FAILED(hr)) + BOOL bSuccess = SH_ShowPropertiesDialog(m_sPathTarget, pidlParent, &pidlChild); + if (!bSuccess) ERR("SH_ShowPropertiesDialog failed\n"); ILFree(pidlChild); ILFree(pidlParent); diff --git a/dll/win32/shell32/shlexec.cpp b/dll/win32/shell32/shlexec.cpp index 955d2af840e..7cfc0021470 100644 --- a/dll/win32/shell32/shlexec.cpp +++ b/dll/win32/shell32/shlexec.cpp @@ -1327,16 +1327,15 @@ static HKEY ShellExecute_GetClassKey(const SHELLEXECUTEINFOW *sei) return hkey; } -static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei ) +static HRESULT shellex_get_dataobj( LPSHELLEXECUTEINFOW sei, CComPtr<IDataObject>& dataObj) { - LPCITEMIDLIST pidllast = NULL; - CComPtr<IDataObject> dataobj; - CComPtr<IShellFolder> shf; + CComHeapPtr<ITEMIDLIST> allocatedPidl; LPITEMIDLIST pidl = NULL; - HRESULT r; if (sei->fMask & SEE_MASK_CLASSALL) + { pidl = (LPITEMIDLIST)sei->lpIDList; + } else { WCHAR fullpath[MAX_PATH]; @@ -1345,21 +1344,19 @@ static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei ) fullpath[0] = 0; ret = GetFullPathNameW(sei->lpFile, MAX_PATH, fullpath, NULL); if (!ret) - goto end; + return HRESULT_FROM_WIN32(GetLastError()); pidl = ILCreateFromPathW(fullpath); + allocatedPidl.Attach(pidl); } - r = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &shf), &pidllast); - if (FAILED(r)) - goto end; - - shf->GetUIObjectOf(NULL, 1, &pidllast, IID_NULL_PPV_ARG(IDataObject, &dataobj)); + CComPtr<IShellFolder> shf; + LPCITEMIDLIST pidllast = NULL; + HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &shf), &pidllast); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; -end: - if (pidl != sei->lpIDList) - ILFree(pidl); - return dataobj.Detach(); + return shf->GetUIObjectOf(NULL, 1, &pidllast, IID_NULL_PPV_ARG(IDataObject, &dataObj)); } static HRESULT shellex_run_context_menu_default(IShellExtInit *obj, @@ -1431,60 +1428,128 @@ end: return r; } -static HRESULT shellex_load_object_and_run(HKEY hkey, LPCGUID guid, LPSHELLEXECUTEINFOW sei) +namespace { - // Can not use CComPtr here because of CoUninitialize at the end, before the destructors would run. - IDataObject *dataobj = NULL; - IObjectWithSite *ows = NULL; - IShellExtInit *obj = NULL; - HRESULT r; + struct CCoInit + { + CCoInit() { hres = CoInitialize(NULL); } + ~CCoInit() { if (SUCCEEDED(hres)) { CoUninitialize(); } } + HRESULT hres; + }; +} +static HRESULT shellex_load_object_and_run(HKEY hkey, LPCGUID guid, LPSHELLEXECUTEINFOW sei) +{ TRACE("%p %s %p\n", hkey, debugstr_guid(guid), sei); - r = CoInitialize(NULL); - if (FAILED(r)) - goto end; + CCoInit coInit; + + if (FAILED_UNEXPECTEDLY(coInit.hres)) + return coInit.hres; - r = CoCreateInstance(*guid, NULL, CLSCTX_INPROC_SERVER, + CComPtr<IShellExtInit> obj; + HRESULT hr = CoCreateInstance(*guid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IShellExtInit, &obj)); - if (FAILED(r)) + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComPtr<IDataObject> dataobj; + hr = shellex_get_dataobj(sei, dataobj); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + hr = obj->Initialize(NULL, dataobj, hkey); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComPtr<IObjectWithSite> ows; + hr = obj->QueryInterface(IID_PPV_ARG(IObjectWithSite, &ows)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + ows->SetSite(NULL); + + return shellex_run_context_menu_default(obj, sei); +} + +static HRESULT shellex_get_contextmenu(LPSHELLEXECUTEINFOW sei, CComPtr<IContextMenu>& cm) +{ + CComHeapPtr<ITEMIDLIST> allocatedPidl; + LPITEMIDLIST pidl = NULL; + + if (sei->lpIDList) { - ERR("failed %08x\n", r); - goto end; + pidl = (LPITEMIDLIST)sei->lpIDList; } - - dataobj = shellex_get_dataobj(sei); - if (!dataobj) + else { - ERR("failed to get data object\n"); - r = E_FAIL; - goto end; + SFGAOF sfga = 0; + HRESULT hr = SHParseDisplayName(sei->lpFile, NULL, &allocatedPidl, SFGAO_STORAGECAPMASK, &sfga); + if (FAILED(hr)) + return hr; + + pidl = allocatedPidl; } - r = obj->Initialize(NULL, dataobj, hkey); - if (FAILED(r)) - goto end; + CComPtr<IShellFolder> shf; + LPCITEMIDLIST pidllast = NULL; + HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &shf), &pidllast); + if (FAILED(hr)) + return hr; - r = obj->QueryInterface(IID_PPV_ARG(IObjectWithSite, &ows)); - if (FAILED(r)) - goto end; + return shf->GetUIObjectOf(NULL, 1, &pidllast, IID_NULL_PPV_ARG(IContextMenu, &cm)); +} - ows->SetSite(NULL); +static HRESULT IContextMenu_exec(LPSHELLEXECUTEINFOW sei) +{ + TRACE("%p\n", sei); - r = shellex_run_context_menu_default(obj, sei); + CCoInit coInit; -end: - if (ows) - ows->Release(); - if (dataobj) - dataobj->Release(); - if (obj) - obj->Release(); - CoUninitialize(); - return r; + if (FAILED_UNEXPECTEDLY(coInit.hres)) + return coInit.hres; + + CComPtr<IContextMenu> cm; + HRESULT hr = shellex_get_contextmenu(sei, cm); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComHeapPtr<char> verb, parameters; + __SHCloneStrWtoA(&verb, sei->lpVerb); + __SHCloneStrWtoA(¶meters, sei->lpParameters); + + CMINVOKECOMMANDINFOEX ici = {}; + ici.cbSize = sizeof ici; + ici.fMask = (sei->fMask & (SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | SEE_MASK_FLAG_NO_UI)); + ici.nShow = sei->nShow; + ici.lpVerb = verb; + ici.hwnd = sei->hwnd; + ici.lpParameters = parameters; + + HMENU hMenu = CreatePopupMenu(); + BOOL fDefault = !ici.lpVerb || !ici.lpVerb[0]; + hr = cm->QueryContextMenu(hMenu, 0, 1, 0x7fff, fDefault ? CMF_DEFAULTONLY : 0); + if (!FAILED_UNEXPECTEDLY(hr)) + { + if (fDefault) + { + INT uDefault = GetMenuDefaultItem(hMenu, FALSE, 0); + uDefault = (uDefault != -1) ? uDefault - 1 : 0; + ici.lpVerb = MAKEINTRESOURCEA(uDefault); + } + + hr = cm->InvokeCommand((LPCMINVOKECOMMANDINFO)&ici); + if (!FAILED_UNEXPECTEDLY(hr)) + hr = S_OK; + } + + DestroyMenu(hMenu); + + return hr; } + /************************************************************************* * ShellExecute_FromContextMenu [Internal] */ @@ -1751,7 +1816,7 @@ static WCHAR *expand_environment( const WCHAR *str ) static BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc) { static const DWORD unsupportedFlags = - SEE_MASK_INVOKEIDLIST | SEE_MASK_ICON | SEE_MASK_HOTKEY | + SEE_MASK_ICON | SEE_MASK_HOTKEY | SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT | SEE_MASK_UNICODE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR; @@ -1853,15 +1918,12 @@ static BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc) if (sei_tmp.fMask & unsupportedFlags) { - // SEE_MASK_IDLIST is not in unsupportedFlags, but the check above passes because SEE_MASK_INVOKEIDLIST is in it - if ((sei_tmp.fMask & unsupportedFlags) != SEE_MASK_IDLIST) - { - FIXME("flags ignored: 0x%08x\n", sei_tmp.fMask & unsupportedFlags); - } + FIXME("flags ignored: 0x%08x\n", sei_tmp.fMask & unsupportedFlags); } /* process the IDList */ - if (sei_tmp.fMask & SEE_MASK_IDLIST) + if (sei_tmp.fMask & SEE_MASK_IDLIST && + (sei_tmp.fMask & SEE_MASK_INVOKEIDLIST) != SEE_MASK_INVOKEIDLIST) { CComPtr<IShellExecuteHookW> pSEH; @@ -1908,6 +1970,22 @@ static BOOL SHELL_execute(LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc) sei_tmp.lpDirectory = wszDir = tmp; } + if ((sei_tmp.fMask & SEE_MASK_INVOKEIDLIST) == SEE_MASK_INVOKEIDLIST) + { + HRESULT hr = IContextMenu_exec(&sei_tmp); + if (SUCCEEDED(hr)) + { + sei->hInstApp = (HINSTANCE)42; + HeapFree(GetProcessHeap(), 0, wszApplicationName); + if (wszParameters != parametersBuffer) + HeapFree(GetProcessHeap(), 0, wszParameters); + if (wszDir != dirBuffer) + HeapFree(GetProcessHeap(), 0, wszDir); + return TRUE; + } + } + + if (ERROR_SUCCESS == ShellExecute_FromContextMenu(&sei_tmp)) { sei->hInstApp = (HINSTANCE) 33;
2 years, 10 months
1
0
0
0
[reactos] 01/01: [NTUSER] Rewrite NtUserDestroyInputContext (#4342)
by Katayama Hirofumi MZ
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1bc9dda5e6ab80524aa00…
commit 1bc9dda5e6ab80524aa0012bd7a75d162325a232 Author: Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com> AuthorDate: Mon Feb 7 10:45:02 2022 +0900 Commit: GitHub <noreply(a)github.com> CommitDate: Mon Feb 7 10:45:02 2022 +0900 [NTUSER] Rewrite NtUserDestroyInputContext (#4342) CORE-11700 --- win32ss/user/ntuser/ime.c | 55 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/win32ss/user/ntuser/ime.c b/win32ss/user/ntuser/ime.c index 06b7eabe5fe..98007549568 100644 --- a/win32ss/user/ntuser/ime.c +++ b/win32ss/user/ntuser/ime.c @@ -27,6 +27,13 @@ PWND FASTCALL IntGetTopLevelWindow(PWND pwnd) return pwnd; } +HIMC FASTCALL IntAssociateInputContext(PWND pWnd, PIMC pImc) +{ + HIMC hOldImc = pWnd->hImc; + pWnd->hImc = (pImc ? UserHMGetHandle(pImc) : NULL); + return hOldImc; +} + DWORD APIENTRY NtUserSetThreadLayoutHandles(HKL hNewKL, HKL hOldKL) @@ -612,20 +619,49 @@ BOOL APIENTRY NtUserDestroyInputContext(HIMC hIMC) { PIMC pIMC; BOOL ret = FALSE; + HWND *phwnd; + PWND pWnd; + PWINDOWLIST pwl; + PTHREADINFO pti; UserEnterExclusive(); - if (!(gpsi->dwSRVIFlags & SRVINFO_IMM32)) + if (!IS_IMM_MODE()) { EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED); - UserLeave(); - return FALSE; + goto Quit; } - pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT); - if (pIMC) - ret = UserDereferenceObject(pIMC); + pIMC = UserGetObjectNoErr(gHandleTable, hIMC, TYPE_INPUTCONTEXT); + if (!pIMC) + goto Quit; + + pti = pIMC->head.pti; + if (pti != GetW32ThreadInfo() || pIMC == pti->spDefaultImc) + goto Quit; + + UserMarkObjectDestroy(pIMC); + + pwl = IntBuildHwndList(pti->rpdesk->pDeskInfo->spwnd->spwndChild, + IACE_CHILDREN | IACE_LIST, pti); + if (pwl) + { + for (phwnd = pwl->ahwnd; *phwnd != HWND_TERMINATOR; ++phwnd) + { + pWnd = ValidateHwndNoErr(*phwnd); + if (!pWnd) + continue; + + if (pWnd->hImc == hIMC) + IntAssociateInputContext(pWnd, pti->spDefaultImc); + } + + IntFreeHwndList(pwl); + } + ret = UserDeleteObject(hIMC, TYPE_INPUTCONTEXT); + +Quit: UserLeave(); return ret; } @@ -695,13 +731,6 @@ Quit: return ret; } -HIMC FASTCALL IntAssociateInputContext(PWND pWnd, PIMC pImc) -{ - HIMC hOldImc = pWnd->hImc; - pWnd->hImc = (pImc ? UserHMGetHandle(pImc) : NULL); - return hOldImc; -} - DWORD FASTCALL IntAssociateInputContextEx(PWND pWnd, PIMC pIMC, DWORD dwFlags) { DWORD ret = 0;
2 years, 10 months
1
0
0
0
[reactos] 01/01: [FREELDR:NTLDR] Adjust some debug traces. RegOpenKey(): demote an ERR to WARN. CORE-18040
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=914f14a8b9dbe2ed670ee…
commit 914f14a8b9dbe2ed670ee1dd6c8299fa0c63ffd4 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Mon Feb 7 00:26:08 2022 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Mon Feb 7 00:26:30 2022 +0100 [FREELDR:NTLDR] Adjust some debug traces. RegOpenKey(): demote an ERR to WARN. CORE-18040 --- boot/freeldr/freeldr/ntldr/registry.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/boot/freeldr/freeldr/ntldr/registry.c b/boot/freeldr/freeldr/ntldr/registry.c index 07438b52423..3db27582935 100644 --- a/boot/freeldr/freeldr/ntldr/registry.c +++ b/boot/freeldr/freeldr/ntldr/registry.c @@ -110,7 +110,7 @@ RegInitCurrentControlSet( &SelectKey); if (Error != ERROR_SUCCESS) { - ERR("RegOpenKey() failed (Error %u)\n", (int)Error); + ERR("RegOpenKey('SYSTEM\\Select') failed (Error %lu)\n", Error); return Error; } @@ -122,7 +122,7 @@ RegInitCurrentControlSet( &DataSize); if (Error != ERROR_SUCCESS) { - ERR("RegQueryValue('Default') failed (Error %u)\n", (int)Error); + ERR("RegQueryValue('Default') failed (Error %lu)\n", Error); RegCloseKey(SelectKey); return Error; } @@ -135,7 +135,7 @@ RegInitCurrentControlSet( &DataSize); if (Error != ERROR_SUCCESS) { - ERR("RegQueryValue('LastKnownGood') failed (Error %u)\n", (int)Error); + ERR("RegQueryValue('LastKnownGood') failed (Error %lu)\n", Error); RegCloseKey(SelectKey); return Error; } @@ -168,7 +168,7 @@ RegInitCurrentControlSet( &SystemKey); if (Error != ERROR_SUCCESS) { - ERR("RegOpenKey(SystemKey) failed (Error %lu)\n", Error); + ERR("RegOpenKey('SYSTEM') failed (Error %lu)\n", Error); return Error; } @@ -180,7 +180,7 @@ RegInitCurrentControlSet( if (Error != ERROR_SUCCESS) { - ERR("RegOpenKey(CurrentControlSetKey) failed (Error %lu)\n", Error); + ERR("RegOpenKey('%S') failed (Error %lu)\n", ControlSetKeyName, Error); return Error; } @@ -391,7 +391,7 @@ RegOpenKey( CellIndex = CmpFindSubKeyByName(Hive, KeyNode, &SubKeyName); if (CellIndex == HCELL_NIL) { - ERR("Did not find sub key '%wZ' (full %S)\n", &SubKeyName, KeyName); + WARN("Did not find sub key '%wZ' (full: %S)\n", &SubKeyName, KeyName); return ERROR_PATH_NOT_FOUND; }
2 years, 10 months
1
0
0
0
[reactos] 03/03: [FREELDR:NTLDR] Implement support for the SOS option. CORE-9023, CORE-18033
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=f6a13d452cbeaddeee0b7…
commit f6a13d452cbeaddeee0b75f74934d57c7b6a7939 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Fri Jan 7 15:39:25 2022 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Feb 6 23:53:41 2022 +0100 [FREELDR:NTLDR] Implement support for the SOS option. CORE-9023, CORE-18033 - Reset the UI to a minimal one in SOS mode. - In SOS mode, a trace of loaded files is displayed on the screen, instead of the usual progress bar. - Add a callback to the PE loader to notify when imported DLLs are loaded for a main image. This allows getting an accurate SOS trace. --- boot/freeldr/freeldr/include/peloader.h | 8 +++ boot/freeldr/freeldr/lib/peloader.c | 10 +++- boot/freeldr/freeldr/ntldr/arch/i386/winldr.c | 4 +- boot/freeldr/freeldr/ntldr/setupldr.c | 8 ++- boot/freeldr/freeldr/ntldr/winldr.c | 83 ++++++++++++++++++++------- boot/freeldr/freeldr/ntldr/winldr.h | 22 +++++++ boot/freeldr/freeldr/ntldr/wlregistry.c | 15 ++++- 7 files changed, 123 insertions(+), 27 deletions(-) diff --git a/boot/freeldr/freeldr/include/peloader.h b/boot/freeldr/freeldr/include/peloader.h index a582f760c29..63ffa80471a 100644 --- a/boot/freeldr/freeldr/include/peloader.h +++ b/boot/freeldr/freeldr/include/peloader.h @@ -18,6 +18,14 @@ #pragma once +/* Optional user-provided callback used by the PE loader + * when it loads DLLs imported by a main image. */ +typedef VOID +(NTAPI *PELDR_IMPORTDLL_LOAD_CALLBACK)( + _In_ PCSTR FileName); + +extern PELDR_IMPORTDLL_LOAD_CALLBACK PeLdrImportDllLoadCallback; + BOOLEAN PeLdrLoadImage( IN PCHAR FileName, diff --git a/boot/freeldr/freeldr/lib/peloader.c b/boot/freeldr/freeldr/lib/peloader.c index 935c0ee8212..b768aa9dea8 100644 --- a/boot/freeldr/freeldr/lib/peloader.c +++ b/boot/freeldr/freeldr/lib/peloader.c @@ -23,6 +23,11 @@ #include <debug.h> DBG_DEFAULT_CHANNEL(PELOADER); +/* GLOBALS *******************************************************************/ + +PELDR_IMPORTDLL_LOAD_CALLBACK PeLdrImportDllLoadCallback = NULL; + + /* PRIVATE FUNCTIONS *********************************************************/ /* DllName - physical, UnicodeString->Buffer - virtual */ @@ -356,6 +361,9 @@ PeLdrpLoadAndScanReferencedDll( TRACE("Loading referenced DLL: %s\n", FullDllName); + if (PeLdrImportDllLoadCallback) + PeLdrImportDllLoadCallback(FullDllName); + /* Load the image */ Success = PeLdrLoadImage(FullDllName, LoaderBootDriver, &BasePA); if (!Success) @@ -722,7 +730,7 @@ PeLdrLoadImage( LARGE_INTEGER Position; ULONG i, BytesRead; - TRACE("PeLdrLoadImage(%s, %ld, *)\n", FileName, MemoryType); + TRACE("PeLdrLoadImage(%s, %ld)\n", FileName, MemoryType); /* Open the image file */ Status = ArcOpen((PSTR)FileName, OpenReadOnly, &FileId); diff --git a/boot/freeldr/freeldr/ntldr/arch/i386/winldr.c b/boot/freeldr/freeldr/ntldr/arch/i386/winldr.c index 759a72f108c..e28778b553f 100644 --- a/boot/freeldr/freeldr/ntldr/arch/i386/winldr.c +++ b/boot/freeldr/freeldr/ntldr/arch/i386/winldr.c @@ -254,7 +254,7 @@ static VOID MempAllocatePTE(ULONG Entry, PHARDWARE_PTE *PhysicalPT, PHARDWARE_PTE *KernelPT) { - //Print(L"Creating PDE Entry %X\n", Entry); + //TRACE("Creating PDE Entry %X\n", Entry); // Identity mapping *PhysicalPT = (PHARDWARE_PTE)&PhysicalPageTablesBuffer[PhysicalPageTables*MM_PAGE_SIZE]; @@ -297,7 +297,7 @@ MempSetupPaging(IN PFN_NUMBER StartPage, // We cannot map this as it requires more than 1 PDE // and in fact it's not possible at all ;) // - //Print(L"skipping...\n"); + //TRACE("skipping...\n"); return TRUE; } diff --git a/boot/freeldr/freeldr/ntldr/setupldr.c b/boot/freeldr/freeldr/ntldr/setupldr.c index 89fde95d4b9..2deaf6ce5ba 100644 --- a/boot/freeldr/freeldr/ntldr/setupldr.c +++ b/boot/freeldr/freeldr/ntldr/setupldr.c @@ -490,6 +490,7 @@ LoadReactOSSetup( return EINVAL; } + /* Let the user know we started loading */ UiDrawBackdrop(); UiDrawStatusText("Setup is loading..."); UiDrawProgressBarCenter(1, 100, "Loading ReactOS Setup..."); @@ -726,6 +727,11 @@ LoadReactOSSetup( TRACE("BootOptions: '%s'\n", BootOptions); + /* Handle the SOS option */ + SosEnabled = !!NtLdrGetOption(BootOptions, "SOS"); + if (SosEnabled) + UiResetForSOS(); + /* Allocate and minimally-initialize the Loader Parameter Block */ AllocateAndInitLPB(_WIN32_WINNT_WS03, &LoaderBlock); @@ -737,7 +743,7 @@ LoadReactOSSetup( SetupBlock->Flags = SETUPLDR_TEXT_MODE; /* Load the "setupreg.hiv" setup system hive */ - UiDrawProgressBarCenter(15, 100, "Loading setup system hive..."); + if (!SosEnabled) UiDrawProgressBarCenter(15, 100, "Loading setup system hive..."); Success = WinLdrInitSystemHive(LoaderBlock, BootPath, TRUE); TRACE("Setup SYSTEM hive %s\n", (Success ? "loaded" : "not loaded")); /* Bail out if failure */ diff --git a/boot/freeldr/freeldr/ntldr/winldr.c b/boot/freeldr/freeldr/ntldr/winldr.c index b485835fcb4..3a21d2fe01a 100644 --- a/boot/freeldr/freeldr/ntldr/winldr.c +++ b/boot/freeldr/freeldr/ntldr/winldr.c @@ -39,6 +39,38 @@ BOOLEAN NoexecuteEnabled = FALSE; // debug stuff VOID DumpMemoryAllocMap(VOID); +/* PE loader import-DLL loading callback */ +static VOID +NTAPI +NtLdrImportDllLoadCallback( + _In_ PCSTR FileName) +{ + NtLdrOutputLoadMsg(FileName, NULL); +} + +VOID +NtLdrOutputLoadMsg( + _In_ PCSTR FileName, + _In_opt_ PCSTR Description) +{ + if (SosEnabled) + { + printf(" %s\n", FileName); + TRACE("Loading: %s\n", FileName); + } + else + { + /* Inform the user we load a file */ + CHAR ProgressString[256]; + + RtlStringCbPrintfA(ProgressString, sizeof(ProgressString), + "Loading %s...", + (Description ? Description : FileName)); + // UiDrawProgressBarCenter(1, 100, ProgressString); + UiDrawStatusText(ProgressString); + } +} + // Init "phase 0" VOID AllocateAndInitLPB( @@ -288,6 +320,8 @@ WinLdrLoadDeviceDriver(PLIST_ENTRY LoadOrderListHead, // It's not loaded, we have to load it RtlStringCbPrintfA(FullPath, sizeof(FullPath), "%s%wZ", BootPath, FilePath); + + NtLdrOutputLoadMsg(FullPath, NULL); Success = PeLdrLoadImage(FullPath, LoaderBootDriver, &DriverBase); if (!Success) return FALSE; @@ -379,16 +413,10 @@ WinLdrLoadModule(PCSTR ModuleName, ARC_STATUS Status; ULONG BytesRead; - //CHAR ProgressString[256]; - - /* Inform user we are loading files */ - //RtlStringCbPrintfA(ProgressString, sizeof(ProgressString), "Loading %s...", FileName); - //UiDrawProgressBarCenter(1, 100, ProgressString); - - TRACE("Loading module %s\n", ModuleName); *Size = 0; /* Open the image file */ + NtLdrOutputLoadMsg(ModuleName, NULL); Status = ArcOpen((PSTR)ModuleName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -467,11 +495,12 @@ LoadModule( PVOID BaseAddress = NULL; RtlStringCbPrintfA(ProgressString, sizeof(ProgressString), "Loading %s...", File); - UiDrawProgressBarCenter(Percentage, 100, ProgressString); + if (!SosEnabled) UiDrawProgressBarCenter(Percentage, 100, ProgressString); RtlStringCbCopyA(FullFileName, sizeof(FullFileName), Path); RtlStringCbCatA(FullFileName, sizeof(FullFileName), File); + NtLdrOutputLoadMsg(FullFileName, NULL); Success = PeLdrLoadImage(FullFileName, MemoryType, &BaseAddress); if (!Success) { @@ -620,12 +649,6 @@ LoadWindowsCore(IN USHORT OperatingSystemVersion, FIXME("LoadWindowsCore: 3GB - TRUE (not implemented)\n"); VirtualBias = TRUE; } - if (NtLdrGetOption(BootOptions, "SOS")) - { - /* We found the SOS option. */ - FIXME("LoadWindowsCore: SOS - TRUE (not implemented)\n"); - SosEnabled = TRUE; - } if (OperatingSystemVersion > _WIN32_WINNT_NT4) { @@ -813,7 +836,9 @@ LoadAndBootWindows( return EINVAL; } + /* Let the user know we started loading */ UiDrawBackdrop(); + UiDrawStatusText("Loading..."); UiDrawProgressBarCenter(1, 100, "Loading NT..."); /* Retrieve the system path */ @@ -909,14 +934,16 @@ LoadAndBootWindows( } } - /* Let user know we started loading */ - //UiDrawStatusText("Loading..."); + /* Handle the SOS option */ + SosEnabled = !!NtLdrGetOption(BootOptions, "SOS"); + if (SosEnabled) + UiResetForSOS(); /* Allocate and minimally-initialize the Loader Parameter Block */ AllocateAndInitLPB(OperatingSystemVersion, &LoaderBlock); /* Load the system hive */ - UiDrawProgressBarCenter(15, 100, "Loading system hive..."); + if (!SosEnabled) UiDrawProgressBarCenter(15, 100, "Loading system hive..."); Success = WinLdrInitSystemHive(LoaderBlock, BootPath, FALSE); TRACE("SYSTEM hive %s\n", (Success ? "loaded" : "not loaded")); /* Bail out if failure */ @@ -974,9 +1001,13 @@ LoadAndBootWindowsCommon( SystemRoot = strstr(BootPath, "\\"); /* Detect hardware */ - UiDrawProgressBarCenter(20, 100, "Detecting hardware..."); + if (!SosEnabled) UiDrawProgressBarCenter(20, 100, "Detecting hardware..."); LoaderBlock->ConfigurationRoot = MachHwDetect(); + /* Initialize the PE loader import-DLL callback, so that we can obtain + * feedback (for example during SOS) on the PE images that get loaded. */ + PeLdrImportDllLoadCallback = NtLdrImportDllLoadCallback; + /* Load the operating system core: the Kernel, the HAL and the Kernel Debugger Transport DLL */ Success = LoadWindowsCore(OperatingSystemVersion, LoaderBlock, @@ -985,17 +1016,27 @@ LoadAndBootWindowsCommon( &KernelDTE); if (!Success) { + /* Reset the PE loader import-DLL callback */ + PeLdrImportDllLoadCallback = NULL; + UiMessageBox("Error loading NTOS core."); return ENOEXEC; } + /* Cleanup INI file */ + IniCleanup(); + +/**** + **** WE HAVE NOW REACHED THE POINT OF NO RETURN !! + ****/ + /* Load boot drivers */ - UiDrawProgressBarCenter(100, 100, "Loading boot drivers..."); + if (!SosEnabled) UiDrawProgressBarCenter(100, 100, "Loading boot drivers..."); Success = WinLdrLoadBootDrivers(LoaderBlock, BootPath); TRACE("Boot drivers loading %s\n", Success ? "successful" : "failed"); - /* Cleanup ini file */ - IniCleanup(); + /* Reset the PE loader import-DLL callback */ + PeLdrImportDllLoadCallback = NULL; /* Initialize Phase 1 - no drivers loading anymore */ WinLdrInitializePhase1(LoaderBlock, diff --git a/boot/freeldr/freeldr/ntldr/winldr.h b/boot/freeldr/freeldr/ntldr/winldr.h index c89010e3e1a..03cc68f88c7 100644 --- a/boot/freeldr/freeldr/ntldr/winldr.h +++ b/boot/freeldr/freeldr/ntldr/winldr.h @@ -73,6 +73,28 @@ VOID ConvertConfigToVA(PCONFIGURATION_COMPONENT_DATA Start); // winldr.c +extern BOOLEAN SosEnabled; + +FORCEINLINE +VOID +UiResetForSOS(VOID) +{ +#ifdef _M_ARM + /* Re-initialize the UI */ + UiInitialize(TRUE); +#else + /* Reset the UI and switch to MiniTui */ + UiVtbl.UnInitialize(); + UiVtbl = MiniTuiVtbl; + UiVtbl.Initialize(); +#endif +} + +VOID +NtLdrOutputLoadMsg( + _In_ PCSTR FileName, + _In_opt_ PCSTR Description); + PVOID WinLdrLoadModule(PCSTR ModuleName, PULONG Size, TYPE_OF_MEMORY MemoryType); diff --git a/boot/freeldr/freeldr/ntldr/wlregistry.c b/boot/freeldr/freeldr/ntldr/wlregistry.c index 83bbda92f84..4f82fb82b97 100644 --- a/boot/freeldr/freeldr/ntldr/wlregistry.c +++ b/boot/freeldr/freeldr/ntldr/wlregistry.c @@ -50,6 +50,7 @@ WinLdrLoadSystemHive( RtlStringCbCopyA(FullHiveName, sizeof(FullHiveName), DirectoryPath); RtlStringCbCatA(FullHiveName, sizeof(FullHiveName), HiveName); + NtLdrOutputLoadMsg(FullHiveName, NULL); Status = ArcOpen(FullHiveName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -330,6 +331,8 @@ WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, /* Open file with ANSI and store its size */ RtlStringCbCopyA(FileName, sizeof(FileName), DirectoryPath); RtlStringCbCatA(FileName, sizeof(FileName), AnsiFileName); + + NtLdrOutputLoadMsg(FileName, NULL); Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -351,9 +354,10 @@ WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, } else { - //Print(L"Loading %s...\n", Filename); RtlStringCbCopyA(FileName, sizeof(FileName), DirectoryPath); RtlStringCbCatA(FileName, sizeof(FileName), OemFileName); + + NtLdrOutputLoadMsg(FileName, NULL); Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -370,9 +374,10 @@ WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, TRACE("OemFileSize: %d\n", OemFileSize); /* And finally open the language codepage file and store its length */ - //Print(L"Loading %s...\n", Filename); RtlStringCbCopyA(FileName, sizeof(FileName), DirectoryPath); RtlStringCbCatA(FileName, sizeof(FileName), LanguageFileName); + + NtLdrOutputLoadMsg(FileName, NULL); Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -415,6 +420,8 @@ WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, /* Now actually read the data into memory, starting with Ansi file */ RtlStringCbCopyA(FileName, sizeof(FileName), DirectoryPath); RtlStringCbCatA(FileName, sizeof(FileName), AnsiFileName); + + NtLdrOutputLoadMsg(FileName, NULL); Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -435,6 +442,8 @@ WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, { RtlStringCbCopyA(FileName, sizeof(FileName), DirectoryPath); RtlStringCbCatA(FileName, sizeof(FileName), OemFileName); + + NtLdrOutputLoadMsg(FileName, NULL); Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) { @@ -454,6 +463,8 @@ WinLdrLoadNLSData(IN OUT PLOADER_PARAMETER_BLOCK LoaderBlock, /* Finally the language file */ RtlStringCbCopyA(FileName, sizeof(FileName), DirectoryPath); RtlStringCbCatA(FileName, sizeof(FileName), LanguageFileName); + + NtLdrOutputLoadMsg(FileName, NULL); Status = ArcOpen(FileName, OpenReadOnly, &FileId); if (Status != ESUCCESS) {
2 years, 10 months
1
0
0
0
[reactos] 02/03: [FREELDR] Use strsafe functions in the PE loader.
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cfbec70e0453f84fd24fc…
commit cfbec70e0453f84fd24fc48b3924ba25fa078382 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Sun Feb 6 21:22:35 2022 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Feb 6 22:20:58 2022 +0100 [FREELDR] Use strsafe functions in the PE loader. --- boot/freeldr/freeldr/lib/peloader.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/boot/freeldr/freeldr/lib/peloader.c b/boot/freeldr/freeldr/lib/peloader.c index 0b5ca0f87b2..935c0ee8212 100644 --- a/boot/freeldr/freeldr/lib/peloader.c +++ b/boot/freeldr/freeldr/lib/peloader.c @@ -245,9 +245,9 @@ PeLdrpBindImportName( ((ULONG_PTR)ForwarderName < ((ULONG_PTR)ExportDirectory + ExportSize))) { PLDR_DATA_TABLE_ENTRY DataTableEntry; - CHAR ForwardDllName[255]; PIMAGE_EXPORT_DIRECTORY RefExportDirectory; ULONG RefExportSize; + CHAR ForwardDllName[256]; TRACE("PeLdrpBindImportName(): ForwarderName %s\n", ForwarderName); @@ -255,7 +255,7 @@ PeLdrpBindImportName( RtlCopyMemory(ForwardDllName, ForwarderName, sizeof(ForwardDllName)); /* Strip out the symbol name */ - *strrchr(ForwardDllName,'.') = '\0'; + *strrchr(ForwardDllName, '.') = ANSI_NULL; /* Check if the target image is already loaded */ if (!PeLdrCheckForLoadedDll(ModuleListHead, ForwardDllName, &DataTableEntry)) @@ -264,7 +264,7 @@ PeLdrpBindImportName( if (strchr(ForwardDllName, '.') == NULL) { /* Name does not have an extension, append '.dll' */ - strcat(ForwardDllName, ".dll"); + RtlStringCbCatA(ForwardDllName, sizeof(ForwardDllName), ".dll"); } /* Now let's try to load it! */ @@ -351,8 +351,8 @@ PeLdrpLoadAndScanReferencedDll( PVOID BasePA = NULL; /* Prepare the full path to the file to be loaded */ - strcpy(FullDllName, DirectoryPath); - strcat(FullDllName, ImportName); + RtlStringCbCopyA(FullDllName, sizeof(FullDllName), DirectoryPath); + RtlStringCbCatA(FullDllName, sizeof(FullDllName), ImportName); TRACE("Loading referenced DLL: %s\n", FullDllName);
2 years, 10 months
1
0
0
0
[reactos] 01/03: [FREELDR:UI] Clean-up when uninitializing the UI.
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=313e6b6cbbec08c56171a…
commit 313e6b6cbbec08c56171a64e6bd0d8be078c4a50 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Sun Feb 6 20:29:05 2022 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Feb 6 22:20:57 2022 +0100 [FREELDR:UI] Clean-up when uninitializing the UI. - If the started OS loader failed and we are back to the OS selection menu, re-initialize the UI as the loader may have messed up the display in the meantime. - Tear down allocated off-screen back-buffer when uninitializing the TUI. - Clear up the screen when initializing the direct-UI. --- boot/freeldr/freeldr/bootmgr.c | 7 +++++++ boot/freeldr/freeldr/include/ui/video.h | 4 +++- boot/freeldr/freeldr/ui/directui.c | 3 +++ boot/freeldr/freeldr/ui/tui.c | 7 +++++++ boot/freeldr/freeldr/ui/video.c | 15 ++++++++++----- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/boot/freeldr/freeldr/bootmgr.c b/boot/freeldr/freeldr/bootmgr.c index 9830c2ec74f..c866502a6aa 100644 --- a/boot/freeldr/freeldr/bootmgr.c +++ b/boot/freeldr/freeldr/bootmgr.c @@ -401,6 +401,13 @@ VOID RunLoader(VOID) /* Load the chosen operating system */ LoadOperatingSystem(&OperatingSystemList[SelectedOperatingSystem]); + + /* If we get there, the OS loader failed. As it may have + * messed up the display, re-initialize the UI. */ +#ifndef _M_ARM + UiVtbl.UnInitialize(); +#endif + UiInitialize(TRUE); } Reboot: diff --git a/boot/freeldr/freeldr/include/ui/video.h b/boot/freeldr/freeldr/include/ui/video.h index 0e0f4ec3828..c6f07a94704 100644 --- a/boot/freeldr/freeldr/include/ui/video.h +++ b/boot/freeldr/freeldr/include/ui/video.h @@ -19,7 +19,9 @@ typedef struct _PALETTE_ENTRY // extern PVOID VideoOffScreenBuffer; PVOID VideoAllocateOffScreenBuffer(VOID); // Returns a pointer to an off-screen buffer sufficient for the current video mode -VOID VideoCopyOffScreenBufferToVRAM(VOID); + +VOID VideoFreeOffScreenBuffer(VOID); +VOID VideoCopyOffScreenBufferToVRAM(VOID); VOID VideoSavePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); VOID VideoRestorePaletteState(PPALETTE_ENTRY Palette, ULONG ColorCount); diff --git a/boot/freeldr/freeldr/ui/directui.c b/boot/freeldr/freeldr/ui/directui.c index cd4b07dcf94..7021a86cdbc 100644 --- a/boot/freeldr/freeldr/ui/directui.c +++ b/boot/freeldr/freeldr/ui/directui.c @@ -34,6 +34,9 @@ UiInitialize(IN BOOLEAN ShowUi) /* Set mode and query size */ MachVideoSetDisplayMode(NULL, TRUE); MachVideoGetDisplaySize(&UiScreenWidth, &UiScreenHeight, &Depth); + + /* Clear the screen */ + UiDrawBackdrop(); return TRUE; } diff --git a/boot/freeldr/freeldr/ui/tui.c b/boot/freeldr/freeldr/ui/tui.c index d14b1f656fc..bcf510ed7c8 100644 --- a/boot/freeldr/freeldr/ui/tui.c +++ b/boot/freeldr/freeldr/ui/tui.c @@ -210,6 +210,10 @@ BOOLEAN TuiInitialize(VOID) VOID TuiUnInitialize(VOID) { + /* Do nothing if already uninitialized */ + if (!TextVideoBuffer) + return; + if (UiUseSpecialEffects) { TuiFadeOut(); @@ -219,6 +223,9 @@ VOID TuiUnInitialize(VOID) MachVideoSetDisplayMode(NULL, FALSE); } + VideoFreeOffScreenBuffer(); + TextVideoBuffer = NULL; + MachVideoClearScreen(ATTR(COLOR_GRAY, COLOR_BLACK)); MachVideoSetTextCursorPosition(0, 0); MachVideoHideShowTextCursor(TRUE); diff --git a/boot/freeldr/freeldr/ui/video.c b/boot/freeldr/freeldr/ui/video.c index d44f8ee1eed..ab77d694a3c 100644 --- a/boot/freeldr/freeldr/ui/video.c +++ b/boot/freeldr/freeldr/ui/video.c @@ -18,11 +18,7 @@ PVOID VideoAllocateOffScreenBuffer(VOID) { ULONG BufferSize; - if (VideoOffScreenBuffer != NULL) - { - MmFreeMemory(VideoOffScreenBuffer); - VideoOffScreenBuffer = NULL; - } + VideoFreeOffScreenBuffer(); BufferSize = MachVideoGetBufferSize(); @@ -31,6 +27,15 @@ PVOID VideoAllocateOffScreenBuffer(VOID) return VideoOffScreenBuffer; } +VOID VideoFreeOffScreenBuffer(VOID) +{ + if (!VideoOffScreenBuffer) + return; + + MmFreeMemory(VideoOffScreenBuffer); + VideoOffScreenBuffer = NULL; +} + VOID VideoCopyOffScreenBufferToVRAM(VOID) { MachVideoCopyOffScreenBufferToVRAM(VideoOffScreenBuffer);
2 years, 10 months
1
0
0
0
[reactos] 07/07: [FREELDR:UI] Improve drawing of progress bars, reducing flickering.
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e2daca3f605900da4af5b…
commit e2daca3f605900da4af5b60ee31728d91f3277ce Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Fri Jan 7 00:53:54 2022 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Feb 6 17:52:46 2022 +0100 [FREELDR:UI] Improve drawing of progress bars, reducing flickering. - Remove excessive UiDrawBackdrop() calls that caused too many unnecessary redraws. - ProgressBar: Clear only the portions that need to be cleared up. This allows to not use DrawBackdrop anymore and the flickering. --- boot/freeldr/freeldr/disk/ramdisk.c | 1 - boot/freeldr/freeldr/ntldr/setupldr.c | 4 +--- boot/freeldr/freeldr/ntldr/winldr.c | 5 ----- boot/freeldr/freeldr/ui/minitui.c | 15 +++++++++++++-- boot/freeldr/freeldr/ui/tui.c | 13 ++++--------- 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/boot/freeldr/freeldr/disk/ramdisk.c b/boot/freeldr/freeldr/disk/ramdisk.c index 9f623baf506..58f8a37d528 100644 --- a/boot/freeldr/freeldr/disk/ramdisk.c +++ b/boot/freeldr/freeldr/disk/ramdisk.c @@ -117,7 +117,6 @@ RamDiskLoadVirtualFile( LARGE_INTEGER Position; /* Display progress */ - UiDrawBackdrop(); UiDrawProgressBarCenter(1, 100, MsgBuffer); /* Try opening the Ramdisk file */ diff --git a/boot/freeldr/freeldr/ntldr/setupldr.c b/boot/freeldr/freeldr/ntldr/setupldr.c index e80d15e03a6..89fde95d4b9 100644 --- a/boot/freeldr/freeldr/ntldr/setupldr.c +++ b/boot/freeldr/freeldr/ntldr/setupldr.c @@ -490,9 +490,8 @@ LoadReactOSSetup( return EINVAL; } - UiDrawStatusText("Setup is loading..."); - UiDrawBackdrop(); + UiDrawStatusText("Setup is loading..."); UiDrawProgressBarCenter(1, 100, "Loading ReactOS Setup..."); /* Retrieve the system path */ @@ -738,7 +737,6 @@ LoadReactOSSetup( SetupBlock->Flags = SETUPLDR_TEXT_MODE; /* Load the "setupreg.hiv" setup system hive */ - UiDrawBackdrop(); UiDrawProgressBarCenter(15, 100, "Loading setup system hive..."); Success = WinLdrInitSystemHive(LoaderBlock, BootPath, TRUE); TRACE("Setup SYSTEM hive %s\n", (Success ? "loaded" : "not loaded")); diff --git a/boot/freeldr/freeldr/ntldr/winldr.c b/boot/freeldr/freeldr/ntldr/winldr.c index e1b97336281..b485835fcb4 100644 --- a/boot/freeldr/freeldr/ntldr/winldr.c +++ b/boot/freeldr/freeldr/ntldr/winldr.c @@ -382,7 +382,6 @@ WinLdrLoadModule(PCSTR ModuleName, //CHAR ProgressString[256]; /* Inform user we are loading files */ - //UiDrawBackdrop(); //RtlStringCbPrintfA(ProgressString, sizeof(ProgressString), "Loading %s...", FileName); //UiDrawProgressBarCenter(1, 100, ProgressString); @@ -467,7 +466,6 @@ LoadModule( CHAR ProgressString[256]; PVOID BaseAddress = NULL; - UiDrawBackdrop(); RtlStringCbPrintfA(ProgressString, sizeof(ProgressString), "Loading %s...", File); UiDrawProgressBarCenter(Percentage, 100, ProgressString); @@ -918,7 +916,6 @@ LoadAndBootWindows( AllocateAndInitLPB(OperatingSystemVersion, &LoaderBlock); /* Load the system hive */ - UiDrawBackdrop(); UiDrawProgressBarCenter(15, 100, "Loading system hive..."); Success = WinLdrInitSystemHive(LoaderBlock, BootPath, FALSE); TRACE("SYSTEM hive %s\n", (Success ? "loaded" : "not loaded")); @@ -977,7 +974,6 @@ LoadAndBootWindowsCommon( SystemRoot = strstr(BootPath, "\\"); /* Detect hardware */ - UiDrawBackdrop(); UiDrawProgressBarCenter(20, 100, "Detecting hardware..."); LoaderBlock->ConfigurationRoot = MachHwDetect(); @@ -994,7 +990,6 @@ LoadAndBootWindowsCommon( } /* Load boot drivers */ - UiDrawBackdrop(); UiDrawProgressBarCenter(100, 100, "Loading boot drivers..."); Success = WinLdrLoadBootDrivers(LoaderBlock, BootPath); TRACE("Boot drivers loading %s\n", Success ? "successful" : "failed"); diff --git a/boot/freeldr/freeldr/ui/minitui.c b/boot/freeldr/freeldr/ui/minitui.c index 95bb0b0eb1f..6c231af8b11 100644 --- a/boot/freeldr/freeldr/ui/minitui.c +++ b/boot/freeldr/freeldr/ui/minitui.c @@ -80,6 +80,15 @@ MiniTuiDrawProgressBar( /* First make sure the progress bar text fits */ UiTruncateStringEllipsis(ProgressText, ProgressBarWidth); + /* Clear the text area */ + TuiFillArea(Left, Top, Right, +#ifdef NTLDR_PROGRESSBAR + Bottom - 1, +#else // BTMGR_PROGRESSBAR + Bottom - 2, // One empty line between text and bar. +#endif + ' ', ATTR(UiTextColor, UiMenuBgColor)); + /* Draw the "Loading..." text */ TuiDrawCenteredText(Left, Top, Right, #ifdef NTLDR_PROGRESSBAR @@ -89,13 +98,15 @@ MiniTuiDrawProgressBar( #endif ProgressText, ATTR(UiTextColor, UiMenuBgColor)); - /* Draw the percent complete */ + /* Draw the percent complete -- Use the fill character */ for (i = 0; i < (Position * ProgressBarWidth) / Range; i++) { - /* Use the fill character */ TuiDrawText(Left + i, Bottom, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); } + /* Fill the remaining with blanks */ + TuiFillArea(Left + i, Bottom, Right, Bottom, + ' ', ATTR(UiTextColor, UiMenuBgColor)); #ifndef _M_ARM TuiUpdateDateTime(); diff --git a/boot/freeldr/freeldr/ui/tui.c b/boot/freeldr/freeldr/ui/tui.c index 821d7b399ba..d14b1f656fc 100644 --- a/boot/freeldr/freeldr/ui/tui.c +++ b/boot/freeldr/freeldr/ui/tui.c @@ -744,20 +744,15 @@ TuiDrawProgressBar( TuiDrawCenteredText(Left, Top, Right, Bottom - 1, ProgressText, ATTR(UiTextColor, UiMenuBgColor)); - /* Draw the percent complete */ + /* Draw the percent complete -- Use the fill character */ for (i = 0; i < (Position * ProgressBarWidth) / Range; i++) { - /* Use the fill character */ TuiDrawText(Left + i, Bottom, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); } - - /* Draw the shadow */ - for (; i < ProgressBarWidth; i++) - { - TuiDrawText(Left + i, Bottom, - "\xB2", ATTR(UiTextColor, UiMenuBgColor)); - } + /* Fill the remaining with shadow blanks */ + TuiFillArea(Left + i, Bottom, Right, Bottom, + '\xB2', ATTR(UiTextColor, UiMenuBgColor)); #ifndef _M_ARM TuiUpdateDateTime();
2 years, 10 months
1
0
0
0
[reactos] 06/07: [FREELDR:UI] Couple of fixes for the ProgressBar functions.
by Hermès Bélusca-Maïto
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=910124736612450b61164…
commit 910124736612450b611643f8e416f16cdd61e076 Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> AuthorDate: Thu Jan 6 23:58:22 2022 +0100 Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org> CommitDate: Sun Feb 6 17:52:44 2022 +0100 [FREELDR:UI] Couple of fixes for the ProgressBar functions. - Fix box size calculations. - MiniTUI: Distinguish Vista+ vs. NTLDR style progress bar. --- boot/freeldr/freeldr/ui/minitui.c | 38 +++++++++++++++++++++++-------- boot/freeldr/freeldr/ui/tui.c | 48 +++++++++++++++++++++++++-------------- 2 files changed, 59 insertions(+), 27 deletions(-) diff --git a/boot/freeldr/freeldr/ui/minitui.c b/boot/freeldr/freeldr/ui/minitui.c index cc967f9b753..95bb0b0eb1f 100644 --- a/boot/freeldr/freeldr/ui/minitui.c +++ b/boot/freeldr/freeldr/ui/minitui.c @@ -9,6 +9,10 @@ #include <freeldr.h> +/* NTLDR or Vista+ BOOTMGR progress-bar style */ +// #define NTLDR_PROGRESSBAR +// #define BTMGR_PROGRESSBAR /* Default style */ + #ifndef _M_ARM VOID MiniTuiDrawBackdrop(VOID) @@ -36,12 +40,19 @@ MiniTuiDrawProgressBarCenter( ULONG Left, Top, Right, Bottom, Width, Height; /* Build the coordinates and sizes */ +#ifdef NTLDR_PROGRESSBAR Height = 2; - Width = UiScreenWidth; + Width = UiScreenWidth; Left = 0; - Right = (Left + Width) - 1; - Top = UiScreenHeight - Height - 4; - Bottom = Top + Height + 1; + Top = UiScreenHeight - Height - 2; +#else // BTMGR_PROGRESSBAR + Height = 3; + Width = UiScreenWidth - 4; + Left = 2; + Top = UiScreenHeight - Height - 3; +#endif + Right = Left + Width - 1; + Bottom = Top + Height - 1; /* Draw the progress bar */ MiniTuiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText); @@ -60,23 +71,30 @@ MiniTuiDrawProgressBar( ULONG ProgressBarWidth, i; /* Calculate the width of the bar proper */ - ProgressBarWidth = (Right - Left) - 3; - - /* First make sure the progress bar text fits */ - UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4); + ProgressBarWidth = Right - Left + 1; /* Clip the position */ if (Position > Range) Position = Range; + /* First make sure the progress bar text fits */ + UiTruncateStringEllipsis(ProgressText, ProgressBarWidth); + /* Draw the "Loading..." text */ - TuiDrawCenteredText(Left + 2, Top + 1, Right - 2, Top + 1, ProgressText, ATTR(UiTextColor, UiMenuBgColor)); + TuiDrawCenteredText(Left, Top, Right, +#ifdef NTLDR_PROGRESSBAR + Bottom - 1, +#else // BTMGR_PROGRESSBAR + Bottom - 2, // One empty line between text and bar. +#endif + ProgressText, ATTR(UiTextColor, UiMenuBgColor)); /* Draw the percent complete */ for (i = 0; i < (Position * ProgressBarWidth) / Range; i++) { /* Use the fill character */ - TuiDrawText(Left + 2 + i, Top + 2, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); + TuiDrawText(Left + i, Bottom, + "\xDB", ATTR(UiTextColor, UiMenuBgColor)); } #ifndef _M_ARM diff --git a/boot/freeldr/freeldr/ui/tui.c b/boot/freeldr/freeldr/ui/tui.c index 9da79931b94..821d7b399ba 100644 --- a/boot/freeldr/freeldr/ui/tui.c +++ b/boot/freeldr/freeldr/ui/tui.c @@ -689,16 +689,21 @@ TuiDrawProgressBarCenter( _In_ ULONG Range, _Inout_z_ PSTR ProgressText) { - ULONG Left, Top, Right, Bottom; - ULONG Width = 50; // Allow for 50 "bars" - ULONG Height = 2; + ULONG Left, Top, Right, Bottom, Width, Height; /* Build the coordinates and sizes */ - Left = (UiScreenWidth - Width - 4) / 2; - Right = Left + Width + 3; - Top = (UiScreenHeight - Height - 2) / 2; - Top += 2; - Bottom = Top + Height + 1; + Height = 2; + Width = 50; // Allow for 50 "bars" + Left = (UiScreenWidth - Width) / 2; + Top = (UiScreenHeight - Height + 4) / 2; + Right = Left + Width - 1; + Bottom = Top + Height - 1; + + /* Inflate to include the box margins */ + Left -= 2; + Right += 2; + Top -= 1; + Bottom += 1; /* Draw the progress bar */ TuiDrawProgressBar(Left, Top, Right, Bottom, Position, Range, ProgressText); @@ -716,33 +721,42 @@ TuiDrawProgressBar( { ULONG ProgressBarWidth, i; - /* Calculate the width of the bar proper */ - ProgressBarWidth = (Right - Left) - 3; + /* Draw the box */ + TuiDrawBox(Left, Top, Right, Bottom, VERT, HORZ, TRUE, TRUE, ATTR(UiMenuFgColor, UiMenuBgColor)); - /* First make sure the progress bar text fits */ - UiTruncateStringEllipsis(ProgressText, ProgressBarWidth - 4); + /* Exclude the box margins */ + Left += 2; + Right -= 2; + Top += 1; + Bottom -= 1; + + /* Calculate the width of the bar proper */ + ProgressBarWidth = Right - Left + 1; /* Clip the position */ if (Position > Range) Position = Range; - /* Draw the box */ - TuiDrawBox(Left, Top, Right, Bottom, VERT, HORZ, TRUE, TRUE, ATTR(UiMenuFgColor, UiMenuBgColor)); + /* First make sure the progress bar text fits */ + UiTruncateStringEllipsis(ProgressText, ProgressBarWidth); /* Draw the "Loading..." text */ - TuiDrawCenteredText(Left + 2, Top + 2, Right - 2, Top + 2, ProgressText, ATTR(UiTextColor, UiMenuBgColor)); + TuiDrawCenteredText(Left, Top, Right, Bottom - 1, + ProgressText, ATTR(UiTextColor, UiMenuBgColor)); /* Draw the percent complete */ for (i = 0; i < (Position * ProgressBarWidth) / Range; i++) { /* Use the fill character */ - TuiDrawText(Left + 2 + i, Top + 2, "\xDB", ATTR(UiTextColor, UiMenuBgColor)); + TuiDrawText(Left + i, Bottom, + "\xDB", ATTR(UiTextColor, UiMenuBgColor)); } /* Draw the shadow */ for (; i < ProgressBarWidth; i++) { - TuiDrawText(Left + 2 + i, Top + 2, "\xB2", ATTR(UiTextColor, UiMenuBgColor)); + TuiDrawText(Left + i, Bottom, + "\xB2", ATTR(UiTextColor, UiMenuBgColor)); } #ifndef _M_ARM
2 years, 10 months
1
0
0
0
← Newer
1
...
6
7
8
9
10
11
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
Results per page:
10
25
50
100
200