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
2025
March
February
January
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 2025
----- 2025 -----
March 2025
February 2025
January 2025
----- 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
79 discussions
Start a n
N
ew thread
[reactos] 01/01: [BROWSEUI][SHELL32] Fix desktop and computer find files locations (#7721)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9a55c931f89915cbd69f9…
commit 9a55c931f89915cbd69f9401550a3398cf2e5d4f Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Fri Feb 28 18:52:48 2025 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Feb 28 18:52:48 2025 +0100 [BROWSEUI][SHELL32] Fix desktop and computer find files locations (#7721) - Searching the Desktop now searches the two desktop folders. - Searching My Computer now searches all local disks. - Adds a "Browse..." entry to the combobox list. --- dll/win32/browseui/shellfind/CFindFolder.cpp | 28 ++- dll/win32/browseui/shellfind/CSearchBar.cpp | 273 ++++++++++++++++++++++++--- dll/win32/browseui/shellfind/CSearchBar.h | 5 +- dll/win32/browseui/shellfind/shellfind.h | 48 ++++- dll/win32/shell32/lang/bg-BG.rc | 2 + dll/win32/shell32/lang/ca-ES.rc | 2 + dll/win32/shell32/lang/cs-CZ.rc | 2 + dll/win32/shell32/lang/da-DK.rc | 2 + dll/win32/shell32/lang/de-DE.rc | 2 + 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 | 2 + dll/win32/shell32/lang/et-EE.rc | 2 + dll/win32/shell32/lang/eu-ES.rc | 2 + dll/win32/shell32/lang/fi-FI.rc | 2 + dll/win32/shell32/lang/fr-FR.rc | 2 + dll/win32/shell32/lang/he-IL.rc | 3 + dll/win32/shell32/lang/hi-IN.rc | 2 + dll/win32/shell32/lang/hu-HU.rc | 2 + dll/win32/shell32/lang/id-ID.rc | 2 + dll/win32/shell32/lang/it-IT.rc | 2 + dll/win32/shell32/lang/ja-JP.rc | 2 + dll/win32/shell32/lang/ko-KR.rc | 2 + dll/win32/shell32/lang/nl-NL.rc | 2 + dll/win32/shell32/lang/no-NO.rc | 2 + dll/win32/shell32/lang/pl-PL.rc | 2 + dll/win32/shell32/lang/pt-BR.rc | 2 + dll/win32/shell32/lang/pt-PT.rc | 2 + dll/win32/shell32/lang/ro-RO.rc | 2 + dll/win32/shell32/lang/ru-RU.rc | 2 + dll/win32/shell32/lang/sk-SK.rc | 2 + dll/win32/shell32/lang/sl-SI.rc | 2 + dll/win32/shell32/lang/sq-AL.rc | 2 + dll/win32/shell32/lang/sv-SE.rc | 2 + dll/win32/shell32/lang/tr-TR.rc | 2 + dll/win32/shell32/lang/uk-UA.rc | 2 + dll/win32/shell32/lang/zh-CN.rc | 2 + dll/win32/shell32/lang/zh-HK.rc | 2 + dll/win32/shell32/lang/zh-TW.rc | 2 + dll/win32/shell32/shresdef.h | 4 + 41 files changed, 398 insertions(+), 33 deletions(-) diff --git a/dll/win32/browseui/shellfind/CFindFolder.cpp b/dll/win32/browseui/shellfind/CFindFolder.cpp index ea703158c30..4a08b8a0852 100644 --- a/dll/win32/browseui/shellfind/CFindFolder.cpp +++ b/dll/win32/browseui/shellfind/CFindFolder.cpp @@ -148,7 +148,7 @@ struct _SearchData { HWND hwnd; HANDLE hStopEvent; - CStringW szPath; + LOCATIONITEM *pPaths; CStringW szFileName; CStringA szQueryA; CStringW szQueryW; @@ -156,6 +156,11 @@ struct _SearchData CStringA szQueryU8; BOOL SearchHidden; CComPtr<CFindFolder> pFindFolder; + + ~_SearchData() + { + FreeList(pPaths); + } }; template<typename TChar, typename TString, int (&StrNCmp)(const TChar *, const TChar *, size_t)> @@ -461,11 +466,17 @@ DWORD WINAPI CFindFolder::SearchThreadProc(LPVOID lpParameter) { _SearchData *data = static_cast<_SearchData*>(lpParameter); + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL); + HRESULT hrCoInit = CoInitializeEx(NULL, COINIT_MULTITHREADED); data->pFindFolder->NotifyConnections(DISPID_SEARCHSTART); - UINT uTotalFound = RecursiveFind(data->szPath, data); + UINT uTotalFound = 0; + for (LOCATIONITEM *pLocation = data->pPaths; pLocation; pLocation = pLocation->pNext) + { + uTotalFound += RecursiveFind(pLocation->szPath, data); + } data->pFindFolder->NotifyConnections(DISPID_SEARCHCOMPLETE); @@ -521,7 +532,7 @@ LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & pSearchData->hwnd = m_hWnd; SearchStart *pSearchParams = (SearchStart *) lParam; - pSearchData->szPath = pSearchParams->szPath; + pSearchData->pPaths = pSearchParams->pPaths; pSearchData->szFileName = pSearchParams->szFileName; pSearchData->szQueryA = pSearchParams->szQuery; pSearchData->szQueryW = pSearchParams->szQuery; @@ -589,12 +600,15 @@ LRESULT CFindFolder::StartSearch(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL & SetEvent(m_hStopEvent); pSearchData->hStopEvent = m_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if (!SHCreateThread(SearchThreadProc, pSearchData, NULL, NULL)) + if (!SHCreateThread(SearchThreadProc, pSearchData, 0, NULL)) { - SHFree(pSearchData); - return 0; + if (pSearchData->hStopEvent) + { + CloseHandle(pSearchData->hStopEvent); + m_hStopEvent = NULL; + } + delete pSearchData; } - return 0; } diff --git a/dll/win32/browseui/shellfind/CSearchBar.cpp b/dll/win32/browseui/shellfind/CSearchBar.cpp index 2ff47bfaf24..543151394b3 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.cpp +++ b/dll/win32/browseui/shellfind/CSearchBar.cpp @@ -47,8 +47,130 @@ static UINT GetShellViewItemCount(IShellView *pSV) return 0; } + +struct SPECIALFINDITEMID +{ + WORD cb; + BYTE Type, Id; + CLSID Cls; + WORD Terminator; +}; +enum { SPECIAL_BROWSE = 42 }; + +static const SPECIALFINDITEMID g_pidlBrowseDir = { FIELD_OFFSET(SPECIALFINDITEMID, Terminator), + 0, SPECIAL_BROWSE, CLSID_FindFolder, 0 }; + +static BYTE GetSpecial(PCIDLIST_ABSOLUTE pidl) +{ + if (pidl && pidl->mkid.cb == FIELD_OFFSET(SPECIALFINDITEMID, Terminator)) + { + SPECIALFINDITEMID *pSpecial = (SPECIALFINDITEMID*)pidl; + if (pSpecial->Type == g_pidlBrowseDir.Type && pSpecial->Cls == g_pidlBrowseDir.Cls && + ILIsEmpty(ILGetNext(pidl))) + { + return pSpecial->Id; + } + } + return 0; +} + +static HRESULT BindToObject(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv) +{ + PCUITEMID_CHILD pidlChild; + CComPtr<IShellFolder> psf; + HRESULT hr = SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &psf), &pidlChild); + return SUCCEEDED(hr) ? psf->BindToObject(pidlChild, NULL, riid, ppv) : hr; +} + +static HRESULT GetClassOfItem(PCIDLIST_ABSOLUTE pidl, CLSID *pCLSID) +{ + CComPtr<IShellFolder> psf; + HRESULT hr = BindToObject(pidl, IID_PPV_ARG(IShellFolder, &psf)); + return SUCCEEDED(hr) ? IUnknown_GetClassID(psf, pCLSID) : hr; +} + +void FreeList(LOCATIONITEM *pItems) +{ + while (pItems) + { + LOCATIONITEM *pNext = pItems->pNext; + CoTaskMemFree(pItems); + pItems = pNext; + } +} + +static LOCATIONITEM* CreateLocationListItem(PCWSTR szPath) +{ + const SIZE_T cch = lstrlenW(szPath) + 1; + LOCATIONITEM *p = (LOCATIONITEM*)CoTaskMemAlloc(FIELD_OFFSET(LOCATIONITEM, szPath[cch])); + if (p) + { + p->pNext = NULL; + CopyMemory(p->szPath, szPath, cch * sizeof(*szPath)); + } + return p; +} + +template<class T> static LOCATIONITEM* BuildLocationList(T **rgszPaths, SIZE_T nCount) +{ + LOCATIONITEM *pStart = NULL, *pPrev = NULL; + for (SIZE_T i = 0; i < nCount; ++i) + { + LOCATIONITEM *pItem = CreateLocationListItem(rgszPaths[i]); + if (!pStart) + pStart = pItem; + else if (pPrev) + pPrev->pNext = pItem; + pPrev = pItem; + if (!pItem) + { + FreeList(pStart); + return NULL; + } + } + return pStart; +} + +static LOCATIONITEM* GetDesktopLocations() +{ + SIZE_T nCount = 0; + PCWSTR rgszLocations[2]; + WCHAR szUser[MAX_PATH], szCommon[MAX_PATH]; + + rgszLocations[nCount] = szUser; + nCount += !!SHGetSpecialFolderPathW(NULL, szUser, CSIDL_DESKTOPDIRECTORY, TRUE); + rgszLocations[nCount] = szCommon; + nCount += !!SHGetSpecialFolderPathW(NULL, szCommon, CSIDL_COMMON_DESKTOPDIRECTORY, TRUE); + return BuildLocationList(rgszLocations, nCount); +} + +static LOCATIONITEM* GetLocalDisksLocations() +{ + PCWSTR rgszLocations[26]; + WCHAR rgszDrives[_countof(rgszLocations)][4]; + UINT nCount = 0; + for (UINT i = 0, fDrives = GetLogicalDrives(); i < _countof(rgszLocations); ++i) + { + if (fDrives & (1 << i)) + { + rgszDrives[nCount][0] = 'A' + i; + rgszDrives[nCount][1] = ':'; + rgszDrives[nCount][2] = '\\'; + rgszDrives[nCount][3] = UNICODE_NULL; + UINT fType = GetDriveTypeW(rgszDrives[nCount]); + if (fType == DRIVE_FIXED || fType == DRIVE_RAMDISK) + { + rgszLocations[nCount] = rgszDrives[nCount]; + nCount++; + } + } + } + return BuildLocationList(rgszLocations, nCount); +} + CSearchBar::CSearchBar() : m_pSite(NULL), + m_RealItemIndex(0), m_bVisible(FALSE) { } @@ -194,11 +316,15 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndC pSearchStart->SearchHidden = IsDlgButtonChecked(IDC_SEARCH_HIDDEN); - if (!GetAddressEditBoxPath(pSearchStart->szPath)) + WCHAR buf[MAX_PATH]; + pSearchStart->pPaths = GetAddressEditBoxLocations(buf); + if (!pSearchStart->pPaths) { - ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd, MAKEINTRESOURCEW(IDS_SEARCHINVALID), MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK | MB_ICONERROR, pSearchStart->szPath); + ShellMessageBoxW(_AtlBaseModule.GetResourceInstance(), m_hWnd, MAKEINTRESOURCEW(IDS_SEARCHINVALID), + MAKEINTRESOURCEW(IDS_SEARCHLABEL), MB_OK | MB_ICONERROR, buf); return 0; } + ScopedFreeLocationItems FreeLocationsHelper(pSearchStart->pPaths); // See if we have an szFileName by testing for its entry lenth > 0 and our searched FileName does not contain // an asterisk or a question mark. If so, then prepend and append an asterisk to the searched FileName. @@ -255,6 +381,7 @@ LRESULT CSearchBar::OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndC return 0; } + FreeLocationsHelper.Detach(); ::PostMessageW(hwnd, WM_SEARCH_START, 0, (LPARAM) pSearchStart.Detach()); SetSearchInProgress(TRUE); @@ -272,31 +399,89 @@ LRESULT CSearchBar::OnStopButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl return 0; } -BOOL CSearchBar::GetAddressEditBoxPath(WCHAR *szPath) +LRESULT CSearchBar::OnLocationEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) { + HWND hComboboxEx = hWndCtl; + INT_PTR idx = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0); + if (idx < 0) + return 0; + COMBOBOXEXITEMW item; + item.mask = CBEIF_LPARAM; + item.iItem = idx; + item.cchTextMax = 0; + if (!SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item) || + GetSpecial((LPITEMIDLIST)item.lParam) != SPECIAL_BROWSE) + { + m_RealItemIndex = idx; + return 0; + } + + idx = max(m_RealItemIndex, 0); + SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); // Reset to previous item + + BROWSEINFOW bi = { hComboboxEx }; + bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE; + if (PIDLIST_ABSOLUTE pidl = SHBrowseForFolderW(&bi)) + { + idx = FindItemInComboEx(hComboboxEx, pidl, ILIsEqual, TRUE); + if (idx < 0) + { + SHFILEINFO shfi; + if (SHGetFileInfoW((WCHAR*)pidl, 0, &shfi, sizeof(shfi), SHGFI_PIDL | SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX)) + { + item.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_SELECTEDIMAGE | CBEIF_IMAGE; + item.iItem = -1; + item.iImage = item.iSelectedImage = shfi.iIcon; + item.pszText = shfi.szDisplayName; + item.lParam = (LPARAM)pidl; // IAddressEditBox takes ownership + idx = SendMessageW(hComboboxEx, CBEM_INSERTITEMW, 0, (LPARAM)&item); + } + } + if (idx >= 0) + SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); // Select the browsed item + else + SHFree(pidl); + } + return 0; +} + +LOCATIONITEM* CSearchBar::GetAddressEditBoxLocations(WCHAR *szPath) +{ + WCHAR szItemText[MAX_PATH], *pszPath = szPath; HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX); ::GetWindowTextW(hComboboxEx, szPath, MAX_PATH); INT iSelectedIndex = SendMessageW(hComboboxEx, CB_GETCURSEL, 0, 0); if (iSelectedIndex != CB_ERR) { - WCHAR szItemText[MAX_PATH]; - COMBOBOXEXITEMW item = {0}; + COMBOBOXEXITEMW item; item.mask = CBEIF_LPARAM | CBEIF_TEXT; item.iItem = iSelectedIndex; item.pszText = szItemText; item.cchTextMax = _countof(szItemText); SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item); - - if (!wcscmp(szItemText, szPath) && SHGetPathFromIDListW((LPCITEMIDLIST)item.lParam, szItemText)) + if (!wcscmp(szItemText, szPath)) { - StringCbCopyW(szPath, MAX_PATH * sizeof(WCHAR), szItemText); - return TRUE; + LPCITEMIDLIST pidl = (LPCITEMIDLIST)item.lParam; + CLSID clsid; + HRESULT hr = GetClassOfItem(pidl, &clsid); + if (SUCCEEDED(hr) && clsid == CLSID_MyComputer) + return GetLocalDisksLocations(); + // TODO: Shell enumerate the network neighborhood if it is chosen + if (!pidl || !pidl->mkid.cb) + return GetDesktopLocations(); + if (GetSpecial(pidl) || !SHGetPathFromIDListW(pidl, szItemText)) + return NULL; + pszPath = szItemText; } } - DWORD dwAttributes = GetFileAttributesW(szPath); - return dwAttributes != INVALID_FILE_ATTRIBUTES - && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY); + DWORD dwAttributes = GetFileAttributesW(pszPath); + if (dwAttributes != INVALID_FILE_ATTRIBUTES && (dwAttributes & FILE_ATTRIBUTE_DIRECTORY) && + PathIsAbsolute(pszPath)) + { + return BuildLocationList(&pszPath, 1); + } + return NULL; } LRESULT CSearchBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) @@ -607,30 +792,70 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, L if (FAILED_UNEXPECTEDLY(hResult)) return hResult; HWND hComboboxEx = GetDlgItem(IDC_SEARCH_COMBOBOX); - int index = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0); - if (index <= 0) + INT_PTR count = SendMessageW(hComboboxEx, CB_GETCOUNT, 0, 0); + if (count <= 0) return S_OK; COMBOBOXEXITEMW item = {0}; item.mask = CBEIF_LPARAM; - item.iItem = index - 1; + item.iItem = count - 1; SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item); if (!item.lParam) return S_OK; - CComPtr<IShellFolder> pDesktopFolder; - hResult = SHGetDesktopFolder(&pDesktopFolder); - if (FAILED_UNEXPECTEDLY(hResult)) - return hResult; - CComPtr<IShellFolder> pShellFolder; - hResult = pDesktopFolder->BindToObject((LPCITEMIDLIST)item.lParam, NULL, IID_PPV_ARG(IShellFolder, &pShellFolder)); - if (FAILED(hResult)) - return S_OK; CLSID clsid; - hResult = IUnknown_GetClassID(pShellFolder, &clsid); + hResult = GetClassOfItem((LPCITEMIDLIST)item.lParam, &clsid); if (SUCCEEDED(hResult) && clsid == CLSID_FindFolder) { SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 0); SendMessageW(hComboboxEx, CB_SETCURSEL, 0, 0); + // Starting in My Computer is better than just searching the desktop folder + PIDLIST_ABSOLUTE pidl; + if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidl))) + { + INT_PTR idx = FindItemInComboEx(hComboboxEx, pidl, ILIsEqual, TRUE); + if (idx >= 0) + SendMessageW(hComboboxEx, CB_SETCURSEL, idx, 0); + SHFree(pidl); + } + } + + // Remove all non-filesystem items since we currently use FindFirstFile to search + BOOL fFoundBrowse = FALSE; + for (item.iItem = 0; SendMessageW(hComboboxEx, CBEM_GETITEMW, 0, (LPARAM)&item); item.iItem++) + { + LPCITEMIDLIST pidl = (LPCITEMIDLIST)item.lParam; + BYTE special = GetSpecial(pidl); + fFoundBrowse |= special == SPECIAL_BROWSE; + if (special) + continue; + const UINT fQuery = SFGAO_FILESYSTEM | SFGAO_FILESYSANCESTOR; + SHFILEINFO shfi; + shfi.dwAttributes = fQuery; + if (SHGetFileInfoW((WCHAR*)pidl, 0, &shfi, sizeof(shfi), SHGFI_PIDL | SHGFI_ATTRIBUTES | SHGFI_ATTR_SPECIFIED)) + { + if (!(shfi.dwAttributes & fQuery)) + { + if (SendMessageW(hComboboxEx, CBEM_DELETEITEM, item.iItem, 0) != CB_ERR) + item.iItem--; + } + } } + + // Add our custom Browse item + if (!fFoundBrowse) + { + WCHAR buf[200]; + item.mask = CBEIF_LPARAM | CBEIF_TEXT | CBEIF_INDENT; + item.iItem = -1; + item.iIndent = -2; // Remove space reserved for the non-existing item icon + item.lParam = (LPARAM)ILClone((LPITEMIDLIST)&g_pidlBrowseDir); + item.pszText = const_cast<PWSTR>(L"..."); + #define IDS_SEARCH_BROWSEITEM 10244 /* shell32 shresdef.h */ + if (LoadStringW(GetModuleHandleW(L"SHELL32"), IDS_SEARCH_BROWSEITEM, buf, _countof(buf))) + item.pszText = buf; + if (item.lParam) + SendMessageW(hComboboxEx, CBEM_INSERTITEMW, 0, (LPARAM)&item); + } + return S_OK; } case DISPID_SEARCHCOMPLETE: diff --git a/dll/win32/browseui/shellfind/CSearchBar.h b/dll/win32/browseui/shellfind/CSearchBar.h index 0a4ead4d307..0e3710152f1 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.h +++ b/dll/win32/browseui/shellfind/CSearchBar.h @@ -24,10 +24,11 @@ private: // *** BaseBarSite information *** CComPtr<IUnknown> m_pSite; CComPtr<IAddressEditBox> m_AddressEditBox; + INT_PTR m_RealItemIndex; BOOL m_bVisible; HRESULT GetSearchResultsFolder(IShellBrowser **ppShellBrowser, HWND *pHwnd, IShellFolder **ppShellFolder); - BOOL GetAddressEditBoxPath(WCHAR *szPath); + LOCATIONITEM* GetAddressEditBoxLocations(WCHAR *szPath); void SetSearchInProgress(BOOL bInProgress); HRESULT TrySubscribeToSearchEvents(); void TrySetFocus(UINT Source); @@ -37,6 +38,7 @@ private: LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnSearchButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); LRESULT OnStopButtonClicked(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnLocationEditChange(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); public: @@ -105,5 +107,6 @@ public: MESSAGE_HANDLER(WM_SIZE, OnSize) COMMAND_HANDLER(IDC_SEARCH_BUTTON, BN_CLICKED, OnSearchButtonClicked) COMMAND_HANDLER(IDC_SEARCH_STOP_BUTTON, BN_CLICKED, OnStopButtonClicked) + COMMAND_HANDLER(IDC_SEARCH_COMBOBOX, CBN_EDITCHANGE, OnLocationEditChange) END_MSG_MAP() }; diff --git a/dll/win32/browseui/shellfind/shellfind.h b/dll/win32/browseui/shellfind/shellfind.h index 93256cb7970..1f42f99d7c1 100644 --- a/dll/win32/browseui/shellfind/shellfind.h +++ b/dll/win32/browseui/shellfind/shellfind.h @@ -31,12 +31,58 @@ #define WM_SEARCH_ADD_RESULT WM_USER + 2 #define WM_SEARCH_UPDATE_STATUS WM_USER + 3 +typedef struct tagLOCATIONITEM +{ + struct tagLOCATIONITEM *pNext; + WCHAR szPath[ANYSIZE_ARRAY]; +} LOCATIONITEM; + +void FreeList(LOCATIONITEM *pLI); + +struct ScopedFreeLocationItems +{ + LOCATIONITEM *m_ptr; + ScopedFreeLocationItems(LOCATIONITEM *ptr) : m_ptr(ptr) {} + ~ScopedFreeLocationItems() { FreeList(m_ptr); } + void Detach() { m_ptr = NULL; } +}; + struct SearchStart { - WCHAR szPath[MAX_PATH]; + LOCATIONITEM *pPaths; WCHAR szFileName[MAX_PATH]; WCHAR szQuery[MAX_PATH]; BOOL SearchHidden; }; +template<class T, class F, class R> +static INT_PTR FindItemInComboEx(HWND hCombo, T &FindItem, F CompareFunc, R RetMatch) +{ + COMBOBOXEXITEMW item; + item.mask = CBEIF_LPARAM; + item.cchTextMax = 0; + for (item.iItem = 0; SendMessageW(hCombo, CBEM_GETITEMW, 0, (LPARAM)&item); item.iItem++) + { + if (CompareFunc((T&)item.lParam, FindItem) == RetMatch) + return item.iItem; + } + return -1; +} + +static inline bool PathIsOnDrive(PCWSTR Path) +{ + return PathGetDriveNumberW(Path) >= 0 && (Path[2] == '\\' || !Path[2]); +} + +static inline BOOL PathIsOnUnc(PCWSTR Path) +{ + return PathIsUNCW(Path); // FIXME: Verify the path starts with <\\Server\Share>[\] +} + +static inline bool PathIsAbsolute(PCWSTR Path) +{ + // Note: PathIsRelativeW is too forgiving + return PathIsOnDrive(Path) || PathIsOnUnc(Path); +} + #endif /* _SHELLFIND_PCH_ */ diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc index a6f1ec66737..ffa7fa93d77 100644 --- a/dll/win32/shell32/lang/bg-BG.rc +++ b/dll/win32/shell32/lang/bg-BG.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Обзор..." + IDS_TITLE_MYCOMP "Моят компютър" IDS_TITLE_MYNET "Моята мрежа" IDS_TITLE_BIN_1 "Кошче (пълно)" diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc index 50088b84052..e8f729c7c9e 100644 --- a/dll/win32/shell32/lang/ca-ES.rc +++ b/dll/win32/shell32/lang/ca-ES.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Browse..." + IDS_TITLE_MYCOMP "My Computer" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc index 744d8c727a7..9a2a3ebec95 100644 --- a/dll/win32/shell32/lang/cs-CZ.rc +++ b/dll/win32/shell32/lang/cs-CZ.rc @@ -1006,6 +1006,8 @@ BEGIN IDS_OBJECTS "Položek: %d" IDS_OBJECTS_SELECTED "Položek vybráno: %d" + IDS_SEARCH_BROWSEITEM "Procházet..." + IDS_TITLE_MYCOMP "Tento počítač" IDS_TITLE_MYNET "Místa v síti" IDS_TITLE_BIN_1 "Koš (plný)" diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc index 7cb598194ad..46bc8854b97 100644 --- a/dll/win32/shell32/lang/da-DK.rc +++ b/dll/win32/shell32/lang/da-DK.rc @@ -1005,6 +1005,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Gennemse..." + IDS_TITLE_MYCOMP "Min Computer" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc index ecb87154a4b..1270e5c1702 100644 --- a/dll/win32/shell32/lang/de-DE.rc +++ b/dll/win32/shell32/lang/de-DE.rc @@ -999,6 +999,8 @@ BEGIN IDS_OBJECTS "%d Objekte" IDS_OBJECTS_SELECTED "%d Objekte ausgewählt" + IDS_SEARCH_BROWSEITEM "Durchsuchen..." + IDS_TITLE_MYCOMP "Arbeitsplatz" IDS_TITLE_MYNET "Netzwerkumgebung" IDS_TITLE_BIN_1 "Papierkorb (voll)" diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc index e26cab3ff42..906192f80db 100644 --- a/dll/win32/shell32/lang/el-GR.rc +++ b/dll/win32/shell32/lang/el-GR.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Αναζήτηση..." + IDS_TITLE_MYCOMP "Ο υπολογιστής μου" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Κάδος ανακύκλωσης (γεμάτος)" diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc index 5c7426cba73..acc08e4f3bd 100644 --- a/dll/win32/shell32/lang/en-GB.rc +++ b/dll/win32/shell32/lang/en-GB.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Browse..." + IDS_TITLE_MYCOMP "My Computer" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index be1df9decac..46a403aa4d6 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Browse..." + IDS_TITLE_MYCOMP "My Computer" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc index 0d4e112eada..8d515c6cbc0 100644 --- a/dll/win32/shell32/lang/es-ES.rc +++ b/dll/win32/shell32/lang/es-ES.rc @@ -1007,6 +1007,8 @@ BEGIN IDS_OBJECTS "%d elementos" IDS_OBJECTS_SELECTED "%d elementos seleccionados" + IDS_SEARCH_BROWSEITEM "Examinar..." + IDS_TITLE_MYCOMP "Mi equipo" IDS_TITLE_MYNET "Mis sitios de red" IDS_TITLE_BIN_1 "Papelera (llena)" diff --git a/dll/win32/shell32/lang/et-EE.rc b/dll/win32/shell32/lang/et-EE.rc index 67324abb2da..35a11ea9b6e 100644 --- a/dll/win32/shell32/lang/et-EE.rc +++ b/dll/win32/shell32/lang/et-EE.rc @@ -1005,6 +1005,8 @@ BEGIN IDS_OBJECTS "%d objekti" IDS_OBJECTS_SELECTED "%d objekti valitud" + IDS_SEARCH_BROWSEITEM "Sirvi..." + IDS_TITLE_MYCOMP "Minu arvuti" IDS_TITLE_MYNET "Minu võrgukohad" IDS_TITLE_BIN_1 "Prügikast (täis)" diff --git a/dll/win32/shell32/lang/eu-ES.rc b/dll/win32/shell32/lang/eu-ES.rc index 0eb4c03261c..9ce6a760948 100644 --- a/dll/win32/shell32/lang/eu-ES.rc +++ b/dll/win32/shell32/lang/eu-ES.rc @@ -1003,6 +1003,8 @@ BEGIN IDS_OBJECTS "%d elementuak" IDS_OBJECTS_SELECTED "%d elementu hautatuak" + IDS_SEARCH_BROWSEITEM "Arakatu..." + IDS_TITLE_MYCOMP "Ordenagailua" IDS_TITLE_MYNET "Nire sarelekuak" IDS_TITLE_BIN_1 "Zakarrontzia (betea)" diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc index 1d7a4be529f..0743841d7e3 100644 --- a/dll/win32/shell32/lang/fi-FI.rc +++ b/dll/win32/shell32/lang/fi-FI.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Selaa..." + IDS_TITLE_MYCOMP "Oma Tietokone" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc index c38a47692fb..fbd939d7941 100644 --- a/dll/win32/shell32/lang/fr-FR.rc +++ b/dll/win32/shell32/lang/fr-FR.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d objet(s)" IDS_OBJECTS_SELECTED "%d objet(s) sélectionné(s)" + IDS_SEARCH_BROWSEITEM "Parcourir..." + IDS_TITLE_MYCOMP "Poste de travail" IDS_TITLE_MYNET "Mon réseau" IDS_TITLE_BIN_1 "Corbeille (pleine)" diff --git a/dll/win32/shell32/lang/he-IL.rc b/dll/win32/shell32/lang/he-IL.rc index 5f3bd630847..4ae2969e694 100644 --- a/dll/win32/shell32/lang/he-IL.rc +++ b/dll/win32/shell32/lang/he-IL.rc @@ -1005,6 +1005,9 @@ BEGIN IDS_OBJECTS "%d פריטים" IDS_OBJECTS_SELECTED "%d פריטים נבחרו" + IDS_SEARCH_BROWSEITEM "עיון..." + + IDS_TITLE_MYCOMP "המחשב שלי" IDS_TITLE_MYNET "מיקומי הרשת שלי" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/hi-IN.rc b/dll/win32/shell32/lang/hi-IN.rc index 8a6ed3d42b3..fc38faac4f1 100644 --- a/dll/win32/shell32/lang/hi-IN.rc +++ b/dll/win32/shell32/lang/hi-IN.rc @@ -1000,6 +1000,8 @@ BEGIN IDS_OBJECTS "%d वस्तुओं" IDS_OBJECTS_SELECTED "%d वस्तुओं का चयन किया" + IDS_SEARCH_BROWSEITEM "ब्राउज़ करें..." + IDS_TITLE_MYCOMP "मेरा कंप्यूटर" IDS_TITLE_MYNET "मेरे नेटवर्क स्थान" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index dca369f41aa..28a7923bb29 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -997,6 +997,8 @@ BEGIN IDS_OBJECTS "%d elem" IDS_OBJECTS_SELECTED "%d kijelölt elem" + IDS_SEARCH_BROWSEITEM "Böngészés..." + IDS_TITLE_MYCOMP "Számítógép" IDS_TITLE_MYNET "Hálózati helyek" IDS_TITLE_BIN_1 "Lomtár (tele)" diff --git a/dll/win32/shell32/lang/id-ID.rc b/dll/win32/shell32/lang/id-ID.rc index 14851b34ba0..50250ed016b 100644 --- a/dll/win32/shell32/lang/id-ID.rc +++ b/dll/win32/shell32/lang/id-ID.rc @@ -995,6 +995,8 @@ BEGIN IDS_OBJECTS "%d Obyek" IDS_OBJECTS_SELECTED "%d Obyek terpilih" + IDS_SEARCH_BROWSEITEM "Jelajah..." + IDS_TITLE_MYCOMP "Komputer Saya" IDS_TITLE_MYNET "Tempat Jaringan Saya" IDS_TITLE_BIN_1 "Tampungan Daur Ulang (penuh)" diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc index 2f06fb39638..889df335f8a 100644 --- a/dll/win32/shell32/lang/it-IT.rc +++ b/dll/win32/shell32/lang/it-IT.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Oggetti" IDS_OBJECTS_SELECTED "%d Oggetti selezionati" + IDS_SEARCH_BROWSEITEM "Esplora..." + IDS_TITLE_MYCOMP "Risorse del Computer" IDS_TITLE_MYNET "Risorse di rete" IDS_TITLE_BIN_1 "Cestino (pieno)" diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc index b4002272715..a186027c5fe 100644 --- a/dll/win32/shell32/lang/ja-JP.rc +++ b/dll/win32/shell32/lang/ja-JP.rc @@ -995,6 +995,8 @@ BEGIN IDS_OBJECTS "%d 個のオブジェクト" IDS_OBJECTS_SELECTED "%d 個のオブジェクトが選択済み" + IDS_SEARCH_BROWSEITEM "参照..." + IDS_TITLE_MYCOMP "マイ コンピュータ" IDS_TITLE_MYNET "マイ ネットワーク" IDS_TITLE_BIN_1 "ごみ箱 (いっぱい)" diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc index b702a01f108..d6a31a17bdb 100644 --- a/dll/win32/shell32/lang/ko-KR.rc +++ b/dll/win32/shell32/lang/ko-KR.rc @@ -1005,6 +1005,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "찾아보기..." + IDS_TITLE_MYCOMP "내 컴퓨터" IDS_TITLE_MYNET "내 네트워크 환경" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc index 4ffb90d81eb..82d22450c87 100644 --- a/dll/win32/shell32/lang/nl-NL.rc +++ b/dll/win32/shell32/lang/nl-NL.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Bladeren..." + IDS_TITLE_MYCOMP "My Computer" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc index c0f8bd18da8..0321417fb24 100644 --- a/dll/win32/shell32/lang/no-NO.rc +++ b/dll/win32/shell32/lang/no-NO.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Bla gjennom..." + IDS_TITLE_MYCOMP "Min datamaskin" IDS_TITLE_MYNET "Mine nettverkssteder" IDS_TITLE_BIN_1 "Papirkurv (full)" diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc index e495ffef72b..1614266d238 100644 --- a/dll/win32/shell32/lang/pl-PL.rc +++ b/dll/win32/shell32/lang/pl-PL.rc @@ -1007,6 +1007,8 @@ BEGIN IDS_OBJECTS "Elementów: %d" IDS_OBJECTS_SELECTED "Zaznaczonych elementów: %d" + IDS_SEARCH_BROWSEITEM "Przeglądaj..." + IDS_TITLE_MYCOMP "Mój komputer" IDS_TITLE_MYNET "Moje miejsca sieciowe" IDS_TITLE_BIN_1 "Kosz (pełny)" diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc index 16d1422681e..0b5c46f359f 100644 --- a/dll/win32/shell32/lang/pt-BR.rc +++ b/dll/win32/shell32/lang/pt-BR.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Procurar..." + IDS_TITLE_MYCOMP "Meu Computador" IDS_TITLE_MYNET "Meus Locais de Rede" IDS_TITLE_BIN_1 "Lixeira (cheia)" diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc index 2236d5c1dae..d606c701112 100644 --- a/dll/win32/shell32/lang/pt-PT.rc +++ b/dll/win32/shell32/lang/pt-PT.rc @@ -1007,6 +1007,8 @@ BEGIN IDS_OBJECTS "%d Objectos" IDS_OBJECTS_SELECTED "%d Objectos seleccionados" + IDS_SEARCH_BROWSEITEM "Procurar..." + IDS_TITLE_MYCOMP "O Meu Computador" IDS_TITLE_MYNET "Os Meus Locais na Rede" IDS_TITLE_BIN_1 "Reciclagem (cheia)" diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc index 35ba49334c8..c5109abb36d 100644 --- a/dll/win32/shell32/lang/ro-RO.rc +++ b/dll/win32/shell32/lang/ro-RO.rc @@ -1006,6 +1006,8 @@ BEGIN IDS_OBJECTS "%d Obiecte" IDS_OBJECTS_SELECTED "%d Obiecte selectate" + IDS_SEARCH_BROWSEITEM "Răsfoire..." + IDS_TITLE_MYCOMP "Computerul meu" IDS_TITLE_MYNET "Locaţii în reţea" IDS_TITLE_BIN_1 "Coş de reciclare (plin)" diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index 773dde053f5..f81a82b00da 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -1007,6 +1007,8 @@ BEGIN IDS_OBJECTS "Объектов: %d" IDS_OBJECTS_SELECTED "Выделено объектов: %d" + IDS_SEARCH_BROWSEITEM "Обзор..." + IDS_TITLE_MYCOMP "Мой компьютер" IDS_TITLE_MYNET "Сетевое окружение" IDS_TITLE_BIN_1 "Корзина (полная)" diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc index 59bb8bf6097..e17019cd76d 100644 --- a/dll/win32/shell32/lang/sk-SK.rc +++ b/dll/win32/shell32/lang/sk-SK.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Prehľadávať..." + IDS_TITLE_MYCOMP "Tento počítač" IDS_TITLE_MYNET "Miesta v sieti" IDS_TITLE_BIN_1 "Kôš (plný)" diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc index 40013522a90..17b3d7d9bee 100644 --- a/dll/win32/shell32/lang/sl-SI.rc +++ b/dll/win32/shell32/lang/sl-SI.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Prebrskaj..." + IDS_TITLE_MYCOMP "My Computer" IDS_TITLE_MYNET "My Network Places" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/sq-AL.rc b/dll/win32/shell32/lang/sq-AL.rc index fcf87e2f734..6915235b1b3 100644 --- a/dll/win32/shell32/lang/sq-AL.rc +++ b/dll/win32/shell32/lang/sq-AL.rc @@ -1005,6 +1005,8 @@ BEGIN IDS_OBJECTS "%d Objects" IDS_OBJECTS_SELECTED "%d Objects Selected" + IDS_SEARCH_BROWSEITEM "Shfleto..." + IDS_TITLE_MYCOMP "Kompjuteri Im" IDS_TITLE_MYNET "Vendi Rrjetit Tim" IDS_TITLE_BIN_1 "Plehra (plot)" diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc index 9d5486e743d..9628f301240 100644 --- a/dll/win32/shell32/lang/sv-SE.rc +++ b/dll/win32/shell32/lang/sv-SE.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d objekt" IDS_OBJECTS_SELECTED "%d markerade objekt" + IDS_SEARCH_BROWSEITEM "Bläddra..." + IDS_TITLE_MYCOMP "Den här datorn" IDS_TITLE_MYNET "Mina nätverksplatser" IDS_TITLE_BIN_1 "Papperskorgen (full)" diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc index 2d52e60d51d..04a16690660 100644 --- a/dll/win32/shell32/lang/tr-TR.rc +++ b/dll/win32/shell32/lang/tr-TR.rc @@ -1007,6 +1007,8 @@ BEGIN IDS_OBJECTS "%d Nesne" IDS_OBJECTS_SELECTED "%d Nesne Seçili" + IDS_SEARCH_BROWSEITEM "Gözat..." + IDS_TITLE_MYCOMP "Bilgisayarım" IDS_TITLE_MYNET "Ağ Bağlantılarım" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc index 853f4041a02..0a943e91999 100644 --- a/dll/win32/shell32/lang/uk-UA.rc +++ b/dll/win32/shell32/lang/uk-UA.rc @@ -998,6 +998,8 @@ BEGIN IDS_OBJECTS "%d об'єктів" IDS_OBJECTS_SELECTED "Обрано %d об'єктів" + IDS_SEARCH_BROWSEITEM "Огляд..." + IDS_TITLE_MYCOMP "Мій комп'ютер" IDS_TITLE_MYNET "Мережне оточення" IDS_TITLE_BIN_1 "Кошик (повний)" diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc index 3d58230cc58..6685c210944 100644 --- a/dll/win32/shell32/lang/zh-CN.rc +++ b/dll/win32/shell32/lang/zh-CN.rc @@ -1008,6 +1008,8 @@ BEGIN IDS_OBJECTS "%d 个对象" IDS_OBJECTS_SELECTED "已选中 %d 个对象" + IDS_SEARCH_BROWSEITEM "浏览..." + IDS_TITLE_MYCOMP "我的电脑" IDS_TITLE_MYNET "网上邻居" IDS_TITLE_BIN_1 "回收站(满)" diff --git a/dll/win32/shell32/lang/zh-HK.rc b/dll/win32/shell32/lang/zh-HK.rc index e4700b57e72..dd7d89bef55 100644 --- a/dll/win32/shell32/lang/zh-HK.rc +++ b/dll/win32/shell32/lang/zh-HK.rc @@ -1006,6 +1006,8 @@ BEGIN IDS_OBJECTS "%d 個物件" IDS_OBJECTS_SELECTED "已選擇 %d 個物件" + IDS_SEARCH_BROWSEITEM "瀏覽..." + IDS_TITLE_MYCOMP "我的電腦" IDS_TITLE_MYNET "網絡上的芳鄰" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc index 2bc2ea7d49f..7d5a8e2b402 100644 --- a/dll/win32/shell32/lang/zh-TW.rc +++ b/dll/win32/shell32/lang/zh-TW.rc @@ -1007,6 +1007,8 @@ BEGIN IDS_OBJECTS "%d 個物件" IDS_OBJECTS_SELECTED "已選擇 %d 個物件" + IDS_SEARCH_BROWSEITEM "瀏覽..." + IDS_TITLE_MYCOMP "我的電腦" IDS_TITLE_MYNET "網路上的芳鄰" IDS_TITLE_BIN_1 "Recycle Bin (full)" diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index d4c8422d29a..cc9a651da93 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -282,6 +282,10 @@ #define IDS_OBJECTS 6466 #define IDS_OBJECTS_SELECTED 6477 +/* Explorer file search */ +#define IDS_SEARCH_LOCALDRIVES 10241 +#define IDS_SEARCH_BROWSEITEM 10244 + /* Desktop icon titles */ #define IDS_TITLE_MYCOMP 30386 #define IDS_TITLE_MYNET 30387
3 days, 10 hours
1
0
0
0
[reactos] 01/01: [BROWSEUI] Set find files pane focus (#7722)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=556cc8a7b27c427a94ee2…
commit 556cc8a7b27c427a94ee22364624122f5df006f8 Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Fri Feb 28 16:57:08 2025 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Fri Feb 28 16:57:08 2025 +0100 [BROWSEUI] Set find files pane focus (#7722) CORE-16424 --- dll/win32/browseui/shellfind/CSearchBar.cpp | 50 +++++++++++++++++++++++++++++ dll/win32/browseui/shellfind/CSearchBar.h | 1 + 2 files changed, 51 insertions(+) diff --git a/dll/win32/browseui/shellfind/CSearchBar.cpp b/dll/win32/browseui/shellfind/CSearchBar.cpp index b7d97123798..2ff47bfaf24 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.cpp +++ b/dll/win32/browseui/shellfind/CSearchBar.cpp @@ -20,6 +20,33 @@ WINE_DEFAULT_DEBUG_CHANNEL(shellfind); #define UNIMPLEMENTED DbgPrint("%s is UNIMPLEMENTED!\n", __FUNCTION__) #endif +static BOOL IsWindowChildOf(const HWND hNeedle, const HWND hRoot) +{ + if (hNeedle != hRoot) + { + for (HWND hParent = hNeedle; hParent;) + { + hParent = GetParent(hParent); + if (hParent == hRoot) + return TRUE; + } + } + return FALSE; +} + +static UINT GetShellViewItemCount(IShellView *pSV) +{ + int signedCount; + CComQIIDPtr<I_ID(IFolderView)> pFV(pSV); + if (pFV && SUCCEEDED(pFV->ItemCount(SVGIO_ALLVIEW, &signedCount))) + return signedCount; + UINT unsignedCount; + CComQIIDPtr<I_ID(IShellFolderView)> pSFV(pSV); + if (pSFV && SUCCEEDED(pSFV->GetObjectCount(&unsignedCount))) + return unsignedCount; + return 0; +} + CSearchBar::CSearchBar() : m_pSite(NULL), m_bVisible(FALSE) @@ -336,6 +363,8 @@ HRESULT STDMETHODCALLTYPE CSearchBar::ShowDW(BOOL fShow) { m_bVisible = fShow; ShowWindow(fShow); + if (fShow) + TrySetFocus(DISPID_WINDOWSTATECHANGED); return S_OK; } @@ -562,6 +591,7 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, L case DISPID_DOCUMENTCOMPLETE: { TrySubscribeToSearchEvents(); + TrySetFocus(DISPID_NAVIGATECOMPLETE2); // Remove the search results folder from the address box CComPtr<IDispatch> pDispatch; @@ -606,8 +636,28 @@ HRESULT STDMETHODCALLTYPE CSearchBar::Invoke(DISPID dispIdMember, REFIID riid, L case DISPID_SEARCHCOMPLETE: case DISPID_SEARCHABORT: SetSearchInProgress(FALSE); + TrySetFocus(DISPID_SEARCHCOMPLETE); return S_OK; default: return E_INVALIDARG; } } + +void CSearchBar::TrySetFocus(UINT Source) +{ + CComPtr<IShellBrowser> pBrowser; + CComPtr<IShellView> pResultsSV; + if (SUCCEEDED(GetSearchResultsFolder(&pBrowser, NULL, NULL))) + pBrowser->QueryActiveShellView(&pResultsSV); + UINT cItems = pResultsSV ? GetShellViewItemCount(pResultsSV) : 0; + + // Attempt to set the focus if we are not in the results folder or if there are no results + HWND hWndFocus = ::GetFocus(); + if (!hWndFocus || !pResultsSV || cItems == 0) + { + BOOL IsOnButton = GetDlgItem(IDC_SEARCH_BUTTON) == hWndFocus; + BOOL IsOnSelfPane = hWndFocus == m_hWnd; + if (!hWndFocus || IsOnSelfPane || IsOnButton || !IsWindowChildOf(hWndFocus, m_hWnd)) + SendMessageW(WM_NEXTDLGCTL, (WPARAM)GetDlgItem(IDC_SEARCH_FILENAME), TRUE); + } +} diff --git a/dll/win32/browseui/shellfind/CSearchBar.h b/dll/win32/browseui/shellfind/CSearchBar.h index a798e368d5c..0a4ead4d307 100644 --- a/dll/win32/browseui/shellfind/CSearchBar.h +++ b/dll/win32/browseui/shellfind/CSearchBar.h @@ -30,6 +30,7 @@ private: BOOL GetAddressEditBoxPath(WCHAR *szPath); void SetSearchInProgress(BOOL bInProgress); HRESULT TrySubscribeToSearchEvents(); + void TrySetFocus(UINT Source); // *** ATL event handlers *** LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
3 days, 12 hours
1
0
0
0
[reactos] 01/01: [RAPPS] Added option to display small application icons (#7723)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a236c39ee547e7690dfd2…
commit a236c39ee547e7690dfd2f856b42986f50891f1a Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Sun Feb 23 19:27:02 2025 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Sun Feb 23 19:27:02 2025 +0100 [RAPPS] Added option to display small application icons (#7723) --- base/applications/rapps/appview.cpp | 14 ++-- base/applications/rapps/include/resource.h | 11 ++- base/applications/rapps/include/settings.h | 1 + base/applications/rapps/lang/bg-BG.rc | 8 +- base/applications/rapps/lang/cs-CZ.rc | 8 +- base/applications/rapps/lang/de-DE.rc | 8 +- base/applications/rapps/lang/en-US.rc | 8 +- base/applications/rapps/lang/es-ES.rc | 8 +- base/applications/rapps/lang/et-EE.rc | 8 +- base/applications/rapps/lang/fr-FR.rc | 8 +- base/applications/rapps/lang/he-IL.rc | 8 +- base/applications/rapps/lang/hu-HU.rc | 8 +- base/applications/rapps/lang/id-ID.rc | 8 +- base/applications/rapps/lang/it-IT.rc | 8 +- base/applications/rapps/lang/ja-JP.rc | 8 +- base/applications/rapps/lang/no-NO.rc | 8 +- base/applications/rapps/lang/pl-PL.rc | 8 +- base/applications/rapps/lang/pt-BR.rc | 8 +- base/applications/rapps/lang/pt-PT.rc | 8 +- base/applications/rapps/lang/ro-RO.rc | 8 +- base/applications/rapps/lang/ru-RU.rc | 8 +- base/applications/rapps/lang/sk-SK.rc | 8 +- base/applications/rapps/lang/sq-AL.rc | 8 +- base/applications/rapps/lang/sv-SE.rc | 8 +- base/applications/rapps/lang/tr-TR.rc | 8 +- base/applications/rapps/lang/uk-UA.rc | 8 +- base/applications/rapps/lang/zh-CN.rc | 8 +- base/applications/rapps/lang/zh-HK.rc | 8 +- base/applications/rapps/lang/zh-TW.rc | 8 +- base/applications/rapps/settings.cpp | 1 + base/applications/rapps/settingsdlg.cpp | 127 +++++++++++++++++++++++------ 31 files changed, 252 insertions(+), 110 deletions(-) diff --git a/base/applications/rapps/appview.cpp b/base/applications/rapps/appview.cpp index 248050ebb92..d8e40ab77f7 100644 --- a/base/applications/rapps/appview.cpp +++ b/base/applications/rapps/appview.cpp @@ -15,6 +15,7 @@ using namespace Gdiplus; HICON g_hDefaultPackageIcon = NULL; static int g_DefaultPackageIconILIdx = I_IMAGENONE; +UINT g_IconSize = 0; // **** Menu helpers **** @@ -1063,9 +1064,11 @@ AsyncLoadIconProc(LPVOID Param) if (task->TaskId == g_AsyncIconTaskId) { HICON hIcon; + HICON *phBigIcon = SettingsInfo.bSmallIcons ? NULL : &hIcon; + HICON *phSmallIcon = phBigIcon ? NULL : &hIcon; if (!task->Parse) - hIcon = (HICON)LoadImageW(NULL, task->Location, IMAGE_ICON, 0, 0, LR_LOADFROMFILE | LR_DEFAULTSIZE); - else if (!ExtractIconExW(task->Location, PathParseIconLocationW(task->Location), &hIcon, NULL, 1)) + hIcon = (HICON)LoadImageW(NULL, task->Location, IMAGE_ICON, g_IconSize, g_IconSize, LR_LOADFROMFILE); + else if (!ExtractIconExW(task->Location, PathParseIconLocationW(task->Location), phBigIcon, phSmallIcon, 1)) hIcon = NULL; if (hIcon) @@ -1392,13 +1395,14 @@ CAppsListView::SetDisplayAppType(APPLICATION_VIEW_TYPE AppType) if (!g_hDefaultPackageIcon) { ImageList_Destroy(m_hImageListView); - UINT IconSize = GetSystemMetrics(SM_CXICON); + g_IconSize = GetSystemMetrics(SettingsInfo.bSmallIcons ? SM_CXSMICON : SM_CXICON); + g_IconSize = max(g_IconSize, 8); UINT ilc = GetSystemColorDepth() | ILC_MASK; - m_hImageListView = ImageList_Create(IconSize, IconSize, ilc, 0, 1); + m_hImageListView = ImageList_Create(g_IconSize, g_IconSize, ilc, 0, 1); SetImageList(m_hImageListView, LVSIL_SMALL); SetImageList(m_hImageListView, LVSIL_NORMAL); g_hDefaultPackageIcon = (HICON)LoadImageW(hInst, MAKEINTRESOURCEW(IDI_MAIN), - IMAGE_ICON, IconSize, IconSize, LR_SHARED); + IMAGE_ICON, g_IconSize, g_IconSize, LR_SHARED); } ImageList_RemoveAll(m_hImageListView); diff --git a/base/applications/rapps/include/resource.h b/base/applications/rapps/include/resource.h index 1e0f1de14a3..2d832027eb9 100644 --- a/base/applications/rapps/include/resource.h +++ b/base/applications/rapps/include/resource.h @@ -1,4 +1,5 @@ #pragma once +#define LVCHECKSTYLES LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SINGLESEL | LVS_SORTASCENDING /* Icons */ #define IDI_MAIN 10 @@ -40,11 +41,11 @@ #define IDC_STATUSBAR 1000 #define IDC_DOWNLOAD_PROGRESS 1001 #define IDC_DOWNLOAD_STATUS 1002 -#define IDC_SAVE_WINDOW_POS 1003 -#define IDC_UPDATE_AVLIST 1004 +#define IDC_GENERALLIST 1003 + #define IDC_DOWNLOAD_DIR_EDIT 1005 #define IDC_DEL_AFTER_INSTALL 1006 -#define IDC_LOG_ENABLED 1007 + #define IDC_CHOOSE 1008 #define IDC_DEFAULT_SETTINGS 1009 #define IDC_INSTALL_TEXT 1010 @@ -127,6 +128,10 @@ #define IDS_APP_DISPLAY_LIST 136 #define IDS_APP_DISPLAY_TILE 137 #define IDS_NO_SEARCH_RESULTS 138 +#define IDS_CFG_SAVE_WINDOW_POS 139 +#define IDS_CFG_UPDATE_AVLIST 140 +#define IDS_CFG_LOG_ENABLED 141 +#define IDS_CFG_SMALL_ICONS 142 /* Tooltips */ #define IDS_TOOLTIP_INSTALL 200 diff --git a/base/applications/rapps/include/settings.h b/base/applications/rapps/include/settings.h index 29f48985e71..51d01a2d27d 100644 --- a/base/applications/rapps/include/settings.h +++ b/base/applications/rapps/include/settings.h @@ -9,6 +9,7 @@ struct SETTINGS_INFO BOOL bLogEnabled; WCHAR szDownloadDir[MAX_PATH]; BOOL bDelInstaller; + BOOL bSmallIcons; /* Window Pos */ BOOL Maximized; INT Left; diff --git a/base/applications/rapps/lang/bg-BG.rc b/base/applications/rapps/lang/bg-BG.rc index 6eb7997ec11..5d8f27e4dba 100644 --- a/base/applications/rapps/lang/bg-BG.rc +++ b/base/applications/rapps/lang/bg-BG.rc @@ -49,9 +49,7 @@ CAPTION "Настройки" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Общи", -1, 4, 2, 244, 61 - AUTOCHECKBOX "&Съхраняване разположението на прозореца", IDC_SAVE_WINDOW_POS, 15, 12, 223, 12 - AUTOCHECKBOX "Об&новяване на списъка с достъпните приложения при пускане", IDC_UPDATE_AVLIST, 15, 29, 227, 12 - AUTOCHECKBOX "&Вписване на слаганията и маханията на приложения", IDC_LOG_ENABLED, 15, 46, 223, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Сваляне", -1, 4, 65, 244, 51 LTEXT "Папка за свалените файлове", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Съхраняване разположението на прозореца" + IDS_CFG_UPDATE_AVLIST "Обновяване на списъка с достъпните приложения при пускане" + IDS_CFG_LOG_ENABLED "Вписване на слаганията и маханията на приложения" + IDS_CFG_SMALL_ICONS "Малки значета" END STRINGTABLE diff --git a/base/applications/rapps/lang/cs-CZ.rc b/base/applications/rapps/lang/cs-CZ.rc index 09f608b43c2..8d336327cfe 100644 --- a/base/applications/rapps/lang/cs-CZ.rc +++ b/base/applications/rapps/lang/cs-CZ.rc @@ -50,9 +50,7 @@ CAPTION "Nastavení" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Obecné", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Uložit pozici okna", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Aktualizovat seznam dostupných programů při startu programu", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "Ukládat &záznam instalací a odstranění programů", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Stahování", -1, 4, 65, 240, 51 LTEXT "Složka se staženými soubory:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -213,6 +211,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Seznam" IDS_APP_DISPLAY_TILE "Dlaždice" IDS_NO_SEARCH_RESULTS "Žádné výsledky" + IDS_CFG_SAVE_WINDOW_POS "Uložit pozici okna" + IDS_CFG_UPDATE_AVLIST "Aktualizovat seznam dostupných programů při startu programu" + IDS_CFG_LOG_ENABLED "Ukládat záznam instalací a odstranění programů" + IDS_CFG_SMALL_ICONS "Malé ikony" END STRINGTABLE diff --git a/base/applications/rapps/lang/de-DE.rc b/base/applications/rapps/lang/de-DE.rc index 3196296a41f..53d4a111147 100644 --- a/base/applications/rapps/lang/de-DE.rc +++ b/base/applications/rapps/lang/de-DE.rc @@ -52,9 +52,7 @@ CAPTION "Einstellungen" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Allgemein", -1, 4, 2, 240, 61 - AUTOCHECKBOX "Fensterposition &speichern", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "Beim Start Liste der verfügbaren Programme &aktualisieren", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "Hinzufügen und Entfernen von Programmen mit&loggen", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Download", -1, 4, 65, 240, 51 LTEXT "Ordner für Downloads:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -215,6 +213,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Liste" IDS_APP_DISPLAY_TILE "Kacheln" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Fensterposition speichern" + IDS_CFG_UPDATE_AVLIST "Beim Start Liste der verfügbaren Programme aktualisieren" + IDS_CFG_LOG_ENABLED "Hinzufügen und Entfernen von Programmen mitloggen" + IDS_CFG_SMALL_ICONS "Kleine symbole" END STRINGTABLE diff --git a/base/applications/rapps/lang/en-US.rc b/base/applications/rapps/lang/en-US.rc index 558d5132645..499aeb5142d 100644 --- a/base/applications/rapps/lang/en-US.rc +++ b/base/applications/rapps/lang/en-US.rc @@ -52,9 +52,7 @@ CAPTION "Settings" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "General", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Save window position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Update the list of accessible programs at start", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Log of installation and removal of programs", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Downloading", -1, 4, 65, 240, 51 LTEXT "Downloads folder:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -215,6 +213,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Save window position" + IDS_CFG_UPDATE_AVLIST "Update the list of accessible programs at start" + IDS_CFG_LOG_ENABLED "Log of installation and removal of programs" + IDS_CFG_SMALL_ICONS "Small icons" END STRINGTABLE diff --git a/base/applications/rapps/lang/es-ES.rc b/base/applications/rapps/lang/es-ES.rc index 23ec16eb993..67f2a930802 100644 --- a/base/applications/rapps/lang/es-ES.rc +++ b/base/applications/rapps/lang/es-ES.rc @@ -51,9 +51,7 @@ CAPTION "Ajustes" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "General", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Guardar posición de la ventana", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Actualizar la lista de programas accesibles al comenzar", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Registro de programas instalados y desinstalados", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Descargas", -1, 4, 65, 240, 51 LTEXT "Carpeta de descargas:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -214,6 +212,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Lista" IDS_APP_DISPLAY_TILE "Título" IDS_NO_SEARCH_RESULTS "Búsqueda sin resultados." + IDS_CFG_SAVE_WINDOW_POS "Guardar posición de la ventana" + IDS_CFG_UPDATE_AVLIST "Actualizar la lista de programas accesibles al comenzar" + IDS_CFG_LOG_ENABLED "Registro de programas instalados y desinstalados" + IDS_CFG_SMALL_ICONS "Iconos pequeños" END STRINGTABLE diff --git a/base/applications/rapps/lang/et-EE.rc b/base/applications/rapps/lang/et-EE.rc index 83de8d68f0d..9ab9214ea41 100644 --- a/base/applications/rapps/lang/et-EE.rc +++ b/base/applications/rapps/lang/et-EE.rc @@ -49,9 +49,7 @@ CAPTION "Sätted" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Üldine", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Salvesta akna asukoht", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Värskenda kättesaadavate programmide nimekirja käivitusel", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "Installeerimiste ja eemalduste &logi", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Allalaadimine", -1, 4, 65, 240, 51 LTEXT "Allalaadimiste kaust:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Salvesta akna asukoht" + IDS_CFG_UPDATE_AVLIST "Värskenda kättesaadavate programmide nimekirja käivitusel" + IDS_CFG_LOG_ENABLED "Installeerimiste ja eemalduste logi" + IDS_CFG_SMALL_ICONS "Väikesed ikoonid" END STRINGTABLE diff --git a/base/applications/rapps/lang/fr-FR.rc b/base/applications/rapps/lang/fr-FR.rc index 2bc101f0553..ddad6d4c90a 100644 --- a/base/applications/rapps/lang/fr-FR.rc +++ b/base/applications/rapps/lang/fr-FR.rc @@ -52,9 +52,7 @@ CAPTION "Configuration" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Général", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Enregistrer la position de la fenêtre", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Mettre à jour la liste des programmes accessibles au démarrage", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Journal de l'installation et de la suppression des programmes", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Téléchargement", -1, 4, 65, 240, 51 LTEXT "Dossier des téléchargements :", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -215,6 +213,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Liste" IDS_APP_DISPLAY_TILE "Tuile" IDS_NO_SEARCH_RESULTS "Aucun résultat" + IDS_CFG_SAVE_WINDOW_POS "Enregistrer la position de la fenêtre" + IDS_CFG_UPDATE_AVLIST "Mettre à jour la liste des programmes accessibles au démarrage" + IDS_CFG_LOG_ENABLED "Journal de l'installation et de la suppression des programmes" + IDS_CFG_SMALL_ICONS "Petites icônes" END STRINGTABLE diff --git a/base/applications/rapps/lang/he-IL.rc b/base/applications/rapps/lang/he-IL.rc index 369c7b1730d..90837d9fc01 100644 --- a/base/applications/rapps/lang/he-IL.rc +++ b/base/applications/rapps/lang/he-IL.rc @@ -52,9 +52,7 @@ CAPTION "הגדרות" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "כללי", -1, 4, 2, 240, 61 - AUTOCHECKBOX "שמור מיקום חלון", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "עדכן את רשימת התוכניות האפשרויות בהפעלה", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "תעד התקנה והסרה של תוכניות", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "הורדה", -1, 4, 65, 240, 51 LTEXT "תיקיית הורדות:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -217,6 +215,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "שמור מיקום חלון" + IDS_CFG_UPDATE_AVLIST "עדכן את רשימת התוכניות האפשרויות בהפעלה" + IDS_CFG_LOG_ENABLED "תעד התקנה והסרה של תוכניות" + IDS_CFG_SMALL_ICONS "סמלים קטנים" END STRINGTABLE diff --git a/base/applications/rapps/lang/hu-HU.rc b/base/applications/rapps/lang/hu-HU.rc index 2691447be1b..21f7b9b71ee 100644 --- a/base/applications/rapps/lang/hu-HU.rc +++ b/base/applications/rapps/lang/hu-HU.rc @@ -49,9 +49,7 @@ CAPTION "Beállítások" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Általános", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Ablak helyének megjegyzése", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "Elérhető programok listájának &frissítése indításkor", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "Programok telepítésének és eltávolításának &naplózása", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Letöltés", -1, 4, 65, 240, 51 LTEXT "Letöltés mappája:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Lista" IDS_APP_DISPLAY_TILE "Csempe" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Ablak helyének megjegyzése" + IDS_CFG_UPDATE_AVLIST "Elérhető programok listájának frissítése indításkor" + IDS_CFG_LOG_ENABLED "Programok telepítésének és eltávolításának naplózása" + IDS_CFG_SMALL_ICONS "Kis képek" END STRINGTABLE diff --git a/base/applications/rapps/lang/id-ID.rc b/base/applications/rapps/lang/id-ID.rc index ea276805166..1dde61b4136 100644 --- a/base/applications/rapps/lang/id-ID.rc +++ b/base/applications/rapps/lang/id-ID.rc @@ -49,9 +49,7 @@ CAPTION "Pengaturan" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Umum", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Simpan posisi jendela", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Perbarui daftar program yang bisa diakses saat mulai", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Log pemasangan dan pembongkaran program", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Mengunduh", -1, 4, 65, 240, 51 LTEXT "Folder unduhan:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Simpan posisi jendela" + IDS_CFG_UPDATE_AVLIST "Perbarui daftar program yang bisa diakses saat mulai" + IDS_CFG_LOG_ENABLED "Log pemasangan dan pembongkaran program" + IDS_CFG_SMALL_ICONS "Ikon Kecil" END STRINGTABLE diff --git a/base/applications/rapps/lang/it-IT.rc b/base/applications/rapps/lang/it-IT.rc index 2effb985435..1075574ba4c 100644 --- a/base/applications/rapps/lang/it-IT.rc +++ b/base/applications/rapps/lang/it-IT.rc @@ -51,9 +51,7 @@ CAPTION "Impostazioni" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Generale", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Salva la posizione della finestra", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Aggiorna la lista dei programmi accessibili", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Registra la installazione o disinstallazione dei programmi", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Scaricamenti", -1, 4, 65, 240, 51 LTEXT "Cartella:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -214,6 +212,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Salva la posizione della finestra" + IDS_CFG_UPDATE_AVLIST "Aggiorna la lista dei programmi accessibili" + IDS_CFG_LOG_ENABLED "Registra la installazione o disinstallazione dei programmi" + IDS_CFG_SMALL_ICONS "Icone Piccole" END STRINGTABLE diff --git a/base/applications/rapps/lang/ja-JP.rc b/base/applications/rapps/lang/ja-JP.rc index da8c309d313..b62872f52ae 100644 --- a/base/applications/rapps/lang/ja-JP.rc +++ b/base/applications/rapps/lang/ja-JP.rc @@ -51,9 +51,7 @@ CAPTION "設定" FONT 9, "MS UI Gothic" BEGIN GROUPBOX "全般", -1, 4, 2, 240, 61 - AUTOCHECKBOX "ウィンドウの場所を保存する(&S)", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "起動時に利用できるプログラムのリストを更新する(&U)", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "プログラムのインストールと削除を記録する(&L)", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "ダウンロード処理", -1, 4, 65, 240, 51 LTEXT "ダウンロードするフォルダ:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -214,6 +212,10 @@ BEGIN IDS_APP_DISPLAY_LIST "リスト" IDS_APP_DISPLAY_TILE "タイル" IDS_NO_SEARCH_RESULTS "検索結果はありません" + IDS_CFG_SAVE_WINDOW_POS "ウィンドウの場所を保存する" + IDS_CFG_UPDATE_AVLIST "起動時に利用できるプログラムのリストを更新する" + IDS_CFG_LOG_ENABLED "プログラムのインストールと削除を記録する" + IDS_CFG_SMALL_ICONS "小さいアイコン" END STRINGTABLE diff --git a/base/applications/rapps/lang/no-NO.rc b/base/applications/rapps/lang/no-NO.rc index 239190f4e3f..b271227c78a 100644 --- a/base/applications/rapps/lang/no-NO.rc +++ b/base/applications/rapps/lang/no-NO.rc @@ -49,9 +49,7 @@ CAPTION "Settings" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "General", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Save window position", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Update the list of accessible programs at start", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Log of installation and removal of programs", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Downloading", -1, 4, 65, 240, 51 LTEXT "Folder for downloadings:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Save window position" + IDS_CFG_UPDATE_AVLIST "Update the list of accessible programs at start" + IDS_CFG_LOG_ENABLED "Log of installation and removal of programs" + IDS_CFG_SMALL_ICONS "Små ikoner" END STRINGTABLE diff --git a/base/applications/rapps/lang/pl-PL.rc b/base/applications/rapps/lang/pl-PL.rc index 034773c2669..1aa2fcc6135 100644 --- a/base/applications/rapps/lang/pl-PL.rc +++ b/base/applications/rapps/lang/pl-PL.rc @@ -51,9 +51,7 @@ CAPTION "Ustawienia" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Ogólne", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Zapisz pozycję okna", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Aktualizuj listę dostępnych programów przy każdym uruchomieniu", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "Zapisuj &dziennik instalacji i usuwania programów", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Pobieranie", -1, 4, 65, 240, 51 LTEXT "Katalog dla pobranych plików:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -214,6 +212,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Lista" IDS_APP_DISPLAY_TILE "Kafelki" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Zapisz pozycję okna" + IDS_CFG_UPDATE_AVLIST "Aktualizuj listę dostępnych programów przy każdym uruchomieniu" + IDS_CFG_LOG_ENABLED "Zapisuj dziennik instalacji i usuwania programów" + IDS_CFG_SMALL_ICONS "Małe ikony" END STRINGTABLE diff --git a/base/applications/rapps/lang/pt-BR.rc b/base/applications/rapps/lang/pt-BR.rc index f939d288965..807615a63ca 100644 --- a/base/applications/rapps/lang/pt-BR.rc +++ b/base/applications/rapps/lang/pt-BR.rc @@ -49,9 +49,7 @@ CAPTION "Configurações" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Geral", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Salvar posição da janela", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Atualizar esta lista de programas ao iniciar", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Registro de instalação e remoção de programas", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Baixando", -1, 4, 65, 240, 51 LTEXT "Pasta de download:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Salvar posição da janela" + IDS_CFG_UPDATE_AVLIST "Atualizar esta lista de programas ao iniciar" + IDS_CFG_LOG_ENABLED "Registro de instalação e remoção de programas" + IDS_CFG_SMALL_ICONS "Ícones pequenos" END STRINGTABLE diff --git a/base/applications/rapps/lang/pt-PT.rc b/base/applications/rapps/lang/pt-PT.rc index c24f98afb4a..dfdd2850137 100644 --- a/base/applications/rapps/lang/pt-PT.rc +++ b/base/applications/rapps/lang/pt-PT.rc @@ -49,9 +49,7 @@ CAPTION "Configurações" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Geral", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Guardar posição da janela", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Actualizar a lista de programas ao iniciar", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Registar a instalação e remoção de programas", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "A carregar", -1, 4, 65, 240, 51 LTEXT "Pasta de download:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Lista" IDS_APP_DISPLAY_TILE "Cabeçalho" IDS_NO_SEARCH_RESULTS "Busca sem resultados" + IDS_CFG_SAVE_WINDOW_POS "Guardar posição da janela" + IDS_CFG_UPDATE_AVLIST "Actualizar a lista de programas ao iniciar" + IDS_CFG_LOG_ENABLED "Registar a instalação e remoção de programas" + IDS_CFG_SMALL_ICONS "Ícones pequenos" END STRINGTABLE diff --git a/base/applications/rapps/lang/ro-RO.rc b/base/applications/rapps/lang/ro-RO.rc index f4092694c58..ba9421f37fe 100644 --- a/base/applications/rapps/lang/ro-RO.rc +++ b/base/applications/rapps/lang/ro-RO.rc @@ -51,9 +51,7 @@ CAPTION "Setări" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "General", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Salvare a poziției ferestrei", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Actualizare la pornire a listei programelor disponibile", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "Menținere a j&urnalului de instalare/dezinstalare a programelor", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Descărcări", -1, 4, 65, 240, 51 LTEXT "Folderul pentru descărcări:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -214,6 +212,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Listă" IDS_APP_DISPLAY_TILE "Dale" IDS_NO_SEARCH_RESULTS "Niciun rezultat al căutării" + IDS_CFG_SAVE_WINDOW_POS "Salvare a poziției ferestrei" + IDS_CFG_UPDATE_AVLIST "Actualizare la pornire a listei programelor disponibile" + IDS_CFG_LOG_ENABLED "Menținere a jurnalului de instalare/dezinstalare a programelor" + IDS_CFG_SMALL_ICONS "Pictograme mici" END STRINGTABLE diff --git a/base/applications/rapps/lang/ru-RU.rc b/base/applications/rapps/lang/ru-RU.rc index 5e9f71915be..6b119334886 100644 --- a/base/applications/rapps/lang/ru-RU.rc +++ b/base/applications/rapps/lang/ru-RU.rc @@ -54,9 +54,7 @@ CAPTION "Параметры" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Общие", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Сохранять положение окна", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Обновлять список доступных программ при запуске", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Вести лог установки/удаления программ", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Загрузка", -1, 4, 65, 240, 51 LTEXT "Папка для загрузок:", -1, 16, 75, 77, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -217,6 +215,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Список" IDS_APP_DISPLAY_TILE "Плитка" IDS_NO_SEARCH_RESULTS "Ничего не найдено" + IDS_CFG_SAVE_WINDOW_POS "Сохранять положение окна" + IDS_CFG_UPDATE_AVLIST "Обновлять список доступных программ при запуске" + IDS_CFG_LOG_ENABLED "Вести лог установки/удаления программ" + IDS_CFG_SMALL_ICONS "Мелкие значки" END STRINGTABLE diff --git a/base/applications/rapps/lang/sk-SK.rc b/base/applications/rapps/lang/sk-SK.rc index f8202c7333c..44932a0b4e3 100644 --- a/base/applications/rapps/lang/sk-SK.rc +++ b/base/applications/rapps/lang/sk-SK.rc @@ -50,9 +50,7 @@ CAPTION "Nastavenia" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Všeobecné", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Uložiť pozíciu okna", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Aktualizovať zoznam dostupných programov pri spustení", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Záznam o inštalovaní a odstránení programov", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Sťahovanie", -1, 4, 65, 240, 51 LTEXT "Priečinok pre sťahovanie:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -213,6 +211,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Zoznam" IDS_APP_DISPLAY_TILE "Dlaždice" IDS_NO_SEARCH_RESULTS "Žiadne výsledky" + IDS_CFG_SAVE_WINDOW_POS "Uložiť pozíciu okna" + IDS_CFG_UPDATE_AVLIST "Aktualizovať zoznam dostupných programov pri spustení" + IDS_CFG_LOG_ENABLED "Záznam o inštalovaní a odstránení programov" + IDS_CFG_SMALL_ICONS "Malé ikony" END STRINGTABLE diff --git a/base/applications/rapps/lang/sq-AL.rc b/base/applications/rapps/lang/sq-AL.rc index a9f60543bff..77feaa24eda 100644 --- a/base/applications/rapps/lang/sq-AL.rc +++ b/base/applications/rapps/lang/sq-AL.rc @@ -49,9 +49,7 @@ CAPTION "Konfigurime" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Pergjithshem", -1, 4, 2, 240, 61 - AUTOCHECKBOX "Ruaj pozicionin e dritare", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Updejto listen e programeve te aksesuar ne start", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Log instalalimin dhe heqjen e programeve", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Shkarko", -1, 4, 65, 240, 51 LTEXT "Dosja e shkarkimit:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Ruaj pozicionin e dritare" + IDS_CFG_UPDATE_AVLIST "Updejto listen e programeve te aksesuar ne start" + IDS_CFG_LOG_ENABLED "Log instalalimin dhe heqjen e programeve" + IDS_CFG_SMALL_ICONS "Ikonat e vogla" END STRINGTABLE diff --git a/base/applications/rapps/lang/sv-SE.rc b/base/applications/rapps/lang/sv-SE.rc index a9cb657a4e0..c14b19adb51 100644 --- a/base/applications/rapps/lang/sv-SE.rc +++ b/base/applications/rapps/lang/sv-SE.rc @@ -49,9 +49,7 @@ CAPTION "Inställningar" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Allmänna", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Spara fönsterposition", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Uppdatera listan med tillgängliga program vid start", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Logga ur installation och borttagning program", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Nerladding", -1, 4, 65, 240, 51 LTEXT "Mapp för nerladdningar:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -212,6 +210,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Spara fönsterposition" + IDS_CFG_UPDATE_AVLIST "Uppdatera listan med tillgängliga program vid start" + IDS_CFG_LOG_ENABLED "Logga ur installation och borttagning program" + IDS_CFG_SMALL_ICONS "Små ikoner" END STRINGTABLE diff --git a/base/applications/rapps/lang/tr-TR.rc b/base/applications/rapps/lang/tr-TR.rc index 74a2fa7c531..c33ab128536 100644 --- a/base/applications/rapps/lang/tr-TR.rc +++ b/base/applications/rapps/lang/tr-TR.rc @@ -51,9 +51,7 @@ CAPTION "Ayarlar" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Genel", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Pencere Konumunu Kaydet", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Başlangıçta Erişilebilir Programların Listesini Yenile", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "P&rogramların Kurulma ve Kaldırma Günlüğünü Sakla", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "İndirme", -1, 4, 65, 240, 51 LTEXT "İndirme Dizini:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -214,6 +212,10 @@ BEGIN IDS_APP_DISPLAY_LIST "Liste" IDS_APP_DISPLAY_TILE "Karo" IDS_NO_SEARCH_RESULTS "Arama sonucu yok" + IDS_CFG_SAVE_WINDOW_POS "Pencere Konumunu Kaydet" + IDS_CFG_UPDATE_AVLIST "Başlangıçta Erişilebilir Programların Listesini Yenile" + IDS_CFG_LOG_ENABLED "Programların Kurulma ve Kaldırma Günlüğünü Sakla" + IDS_CFG_SMALL_ICONS "Küçük simgeler" END STRINGTABLE diff --git a/base/applications/rapps/lang/uk-UA.rc b/base/applications/rapps/lang/uk-UA.rc index f3c6fd904f3..35cb17f24f2 100644 --- a/base/applications/rapps/lang/uk-UA.rc +++ b/base/applications/rapps/lang/uk-UA.rc @@ -52,9 +52,7 @@ CAPTION "Налаштування" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Загальні", -1, 4, 2, 240, 61 - AUTOCHECKBOX "&Зберігати положення вікна", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "&Оновлювати список наявних програм при запуску", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "&Вести звіт встановлення/видалення програм", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "Завантаження", -1, 4, 65, 240, 51 LTEXT "Тека для завантажень:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -215,6 +213,10 @@ BEGIN IDS_APP_DISPLAY_LIST "List" IDS_APP_DISPLAY_TILE "Tile" IDS_NO_SEARCH_RESULTS "No search results" + IDS_CFG_SAVE_WINDOW_POS "Зберігати положення вікна" + IDS_CFG_UPDATE_AVLIST "Оновлювати список наявних програм при запуску" + IDS_CFG_LOG_ENABLED "Вести звіт встановлення/видалення програм" + IDS_CFG_SMALL_ICONS "Дрібні значки" END STRINGTABLE diff --git a/base/applications/rapps/lang/zh-CN.rc b/base/applications/rapps/lang/zh-CN.rc index 9ef28009d91..7eed7260cbf 100644 --- a/base/applications/rapps/lang/zh-CN.rc +++ b/base/applications/rapps/lang/zh-CN.rc @@ -53,9 +53,7 @@ CAPTION "设置" FONT 9, "宋体" BEGIN GROUPBOX "常规", -1, 4, 2, 240, 61 - AUTOCHECKBOX "保存窗口位置(&S)", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "启动时更新可获得的程序列表(&U)", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "将程序的安装和卸载记录到日志(&L)", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "下载设置", -1, 4, 65, 240, 51 LTEXT "下载文件夹:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -216,6 +214,10 @@ BEGIN IDS_APP_DISPLAY_LIST "列表" IDS_APP_DISPLAY_TILE "卡片" IDS_NO_SEARCH_RESULTS "无搜索结果" + IDS_CFG_SAVE_WINDOW_POS "保存窗口位置" + IDS_CFG_UPDATE_AVLIST "启动时更新可获得的程序列表" + IDS_CFG_LOG_ENABLED "将程序的安装和卸载记录到日志" + IDS_CFG_SMALL_ICONS "小图标" END STRINGTABLE diff --git a/base/applications/rapps/lang/zh-HK.rc b/base/applications/rapps/lang/zh-HK.rc index 6d3492616f6..2340b0963c6 100644 --- a/base/applications/rapps/lang/zh-HK.rc +++ b/base/applications/rapps/lang/zh-HK.rc @@ -50,9 +50,7 @@ CAPTION "設定" FONT 9, "新細明體" BEGIN GROUPBOX "一般", -1, 4, 2, 240, 61 - AUTOCHECKBOX "儲存視窗位置(&S)", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "啟動時更新可獲得的程式列表(&U)", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "將程式的安裝和解除安裝記錄到記錄檔(&L)", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "正在下載", -1, 4, 65, 240, 51 LTEXT "下載資料夾:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -213,6 +211,10 @@ BEGIN IDS_APP_DISPLAY_LIST "列表" IDS_APP_DISPLAY_TILE "並排" IDS_NO_SEARCH_RESULTS "沒有搜尋結果" + IDS_CFG_SAVE_WINDOW_POS "儲存視窗位置" + IDS_CFG_UPDATE_AVLIST "啟動時更新可獲得的程式列表" + IDS_CFG_LOG_ENABLED "將程式的安裝和解除安裝記錄到記錄檔" + IDS_CFG_SMALL_ICONS "小圖示" END STRINGTABLE diff --git a/base/applications/rapps/lang/zh-TW.rc b/base/applications/rapps/lang/zh-TW.rc index 6e0584d8b6e..a3befd8880d 100644 --- a/base/applications/rapps/lang/zh-TW.rc +++ b/base/applications/rapps/lang/zh-TW.rc @@ -50,9 +50,7 @@ CAPTION "設定" FONT 9, "新細明體" BEGIN GROUPBOX "一般", -1, 4, 2, 240, 61 - AUTOCHECKBOX "儲存視窗位置(&S)", IDC_SAVE_WINDOW_POS, 15, 12, 219, 12 - AUTOCHECKBOX "啟動時更新可獲得的程式列表(&U)", IDC_UPDATE_AVLIST, 15, 29, 222, 12 - AUTOCHECKBOX "記錄程式的安裝和解除安裝過程(&L)", IDC_LOG_ENABLED, 15, 46, 219, 12 + CONTROL "", IDC_GENERALLIST, "SysListView32", WS_TABSTOP | LVCHECKSTYLES, 15, 12, 219, 46, WS_EX_STATICEDGE GROUPBOX "正在下載", -1, 4, 65, 240, 51 LTEXT "下載資料夾:", -1, 16, 75, 100, 9 EDITTEXT IDC_DOWNLOAD_DIR_EDIT, 15, 86, 166, 12, WS_CHILD | WS_VISIBLE | WS_GROUP | ES_AUTOHSCROLL @@ -213,6 +211,10 @@ BEGIN IDS_APP_DISPLAY_LIST "列表" IDS_APP_DISPLAY_TILE "並排" IDS_NO_SEARCH_RESULTS "沒有搜尋結果" + IDS_CFG_SAVE_WINDOW_POS "儲存視窗位置" + IDS_CFG_UPDATE_AVLIST "啟動時更新可獲得的程式列表" + IDS_CFG_LOG_ENABLED "記錄程式的安裝和解除安裝過程" + IDS_CFG_SMALL_ICONS "小圖示" END STRINGTABLE diff --git a/base/applications/rapps/settings.cpp b/base/applications/rapps/settings.cpp index b23c2dd7a49..e87d5d0315c 100644 --- a/base/applications/rapps/settings.cpp +++ b/base/applications/rapps/settings.cpp @@ -118,6 +118,7 @@ AddInfoFields(ATL::CAtlList<SettingsField *> &infoFields, SETTINGS_INFO &setting infoFields.AddTail(new SettingsFieldBool(&(settings.bLogEnabled), L"bLogEnabled")); infoFields.AddTail(new SettingsFieldString(settings.szDownloadDir, MAX_PATH, L"szDownloadDir")); infoFields.AddTail(new SettingsFieldBool(&(settings.bDelInstaller), L"bDelInstaller")); + infoFields.AddTail(new SettingsFieldBool(&(settings.bSmallIcons), L"SmallIcons")); infoFields.AddTail(new SettingsFieldBool(&(settings.Maximized), L"WindowPosMaximized")); infoFields.AddTail(new SettingsFieldInt(&(settings.Left), L"WindowPosLeft")); infoFields.AddTail(new SettingsFieldInt(&(settings.Top), L"WindowPosTop")); diff --git a/base/applications/rapps/settingsdlg.cpp b/base/applications/rapps/settingsdlg.cpp index 92782d59484..56efc75193c 100644 --- a/base/applications/rapps/settingsdlg.cpp +++ b/base/applications/rapps/settingsdlg.cpp @@ -7,7 +7,7 @@ */ #include "rapps.h" -SETTINGS_INFO NewSettingsInfo; +SETTINGS_INFO *g_pNewSettingsInfo; static int CALLBACK BrowseFolderCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) @@ -23,7 +23,7 @@ BrowseFolderCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) return 0; } -BOOL +static BOOL ChooseFolder(HWND hwnd) { BOOL bRet = FALSE; @@ -65,7 +65,7 @@ ChooseFolder(HWND hwnd) return bRet; } -BOOL +static BOOL IsUrlValid(const WCHAR *Url) { URL_COMPONENTSW UrlComponmentInfo = {0}; @@ -94,18 +94,74 @@ IsUrlValid(const WCHAR *Url) namespace { -inline BOOL +static inline BOOL IsCheckedDlgItem(HWND hDlg, INT nIDDlgItem) { - return (SendDlgItemMessageW(hDlg, nIDDlgItem, BM_GETCHECK, 0, 0) == BST_CHECKED) ? TRUE : FALSE; + return SendDlgItemMessageW(hDlg, nIDDlgItem, BM_GETCHECK, 0, 0) == BST_CHECKED; } -VOID +static inline void +AdjustListViewHeader(HWND hWndList) +{ + ListView_SetColumnWidth(hWndList, 0, LVSCW_AUTOSIZE_USEHEADER); +} + +static void +HandleGeneralListItems(HWND hWndList, PSETTINGS_INFO Load, PSETTINGS_INFO Save) +{ + PSETTINGS_INFO Info = Load ? Load : Save; + const struct { + WORD Id; + BOOL *Setting; + } Map[] = { + { IDS_CFG_SAVE_WINDOW_POS, &Info->bSaveWndPos }, + { IDS_CFG_UPDATE_AVLIST, &Info->bUpdateAtStart }, + { IDS_CFG_LOG_ENABLED, &Info->bLogEnabled }, + { IDS_CFG_SMALL_ICONS, &Info->bSmallIcons }, + }; + + if (Load) + { + UINT ExStyle = LVS_EX_CHECKBOXES | LVS_EX_LABELTIP; + ListView_SetExtendedListViewStyleEx(hWndList, ExStyle, ExStyle); + LVCOLUMN lvc; + lvc.mask = LVCF_TEXT | LVCF_SUBITEM; + lvc.iSubItem = 0; + lvc.pszText = const_cast<PWSTR>(L""); + ListView_InsertColumn(hWndList, 0, &lvc); + + CStringW Name; + for (SIZE_T i = 0; i < _countof(Map); ++i) + { + LVITEMW Item; + Item.mask = LVIF_TEXT | LVIF_PARAM; + Item.iItem = 0x7fff; + Item.iSubItem = 0; + Item.lParam = Map[i].Id; + Name.LoadStringW(Map[i].Id); + Item.pszText = const_cast<PWSTR>(Name.GetString()); + Item.iItem = ListView_InsertItem(hWndList, &Item); + ListView_SetCheckState(hWndList, Item.iItem, *Map[i].Setting); + } + ListView_SetItemState(hWndList, 0, -1, LVIS_FOCUSED | LVIS_SELECTED); + AdjustListViewHeader(hWndList); + } + else + { + for (SIZE_T i = 0; i < _countof(Map); ++i) + { + LVFINDINFOW FindInfo = { LVFI_PARAM, NULL, Map[i].Id }; + int Idx = ListView_FindItem(hWndList, -1, &FindInfo); + if (Idx >= 0) + *Map[i].Setting = ListView_GetCheckState(hWndList, Idx); + } + } +} + +static VOID InitSettingsControls(HWND hDlg, PSETTINGS_INFO Info) { - SendDlgItemMessageW(hDlg, IDC_SAVE_WINDOW_POS, BM_SETCHECK, Info->bSaveWndPos, 0); - SendDlgItemMessageW(hDlg, IDC_UPDATE_AVLIST, BM_SETCHECK, Info->bUpdateAtStart, 0); - SendDlgItemMessageW(hDlg, IDC_LOG_ENABLED, BM_SETCHECK, Info->bLogEnabled, 0); + HandleGeneralListItems(GetDlgItem(hDlg, IDC_GENERALLIST), Info, NULL); SendDlgItemMessageW(hDlg, IDC_DEL_AFTER_INSTALL, BM_SETCHECK, Info->bDelInstaller, 0); HWND hCtl = GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT); @@ -134,16 +190,24 @@ InitSettingsControls(HWND hDlg, PSETTINGS_INFO Info) SetWindowTextW(GetDlgItem(hDlg, IDC_NO_PROXY_FOR), Info->szNoProxyFor); } -INT_PTR CALLBACK +static INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) { + SETTINGS_INFO &NewSettingsInfo = *g_pNewSettingsInfo; + switch (Msg) { case WM_INITDIALOG: - NewSettingsInfo = SettingsInfo; InitSettingsControls(hDlg, &SettingsInfo); return TRUE; + case WM_SETTINGCHANGE: + case WM_THEMECHANGED: + case WM_SYSCOLORCHANGE: + SendMessage(GetDlgItem(hDlg, IDC_GENERALLIST), Msg, wParam, lParam); + AdjustListViewHeader(GetDlgItem(hDlg, IDC_GENERALLIST)); + break; + case WM_COMMAND: { switch (LOWORD(wParam)) @@ -152,18 +216,6 @@ SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) ChooseFolder(hDlg); break; - case IDC_SAVE_WINDOW_POS: - NewSettingsInfo.bSaveWndPos = IsCheckedDlgItem(hDlg, IDC_SAVE_WINDOW_POS); - break; - - case IDC_UPDATE_AVLIST: - NewSettingsInfo.bUpdateAtStart = IsCheckedDlgItem(hDlg, IDC_UPDATE_AVLIST); - break; - - case IDC_LOG_ENABLED: - NewSettingsInfo.bLogEnabled = IsCheckedDlgItem(hDlg, IDC_LOG_ENABLED); - break; - case IDC_DEL_AFTER_INSTALL: NewSettingsInfo.bDelInstaller = IsCheckedDlgItem(hDlg, IDC_DEL_AFTER_INSTALL); break; @@ -203,6 +255,13 @@ SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) case IDOK: { + HandleGeneralListItems(GetDlgItem(hDlg, IDC_GENERALLIST), NULL, &NewSettingsInfo); + if (SettingsInfo.bSmallIcons != NewSettingsInfo.bSmallIcons) + { + SendMessageW(hMainWnd, WM_SETTINGCHANGE, SPI_SETICONMETRICS, 0); // Note: WM_SETTINGCHANGE cannot be posted + PostMessageW(hMainWnd, WM_COMMAND, ID_REFRESH, 0); + } + CStringW szDir; CStringW szSource; CStringW szProxy; @@ -281,8 +340,25 @@ SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) EndDialog(hDlg, LOWORD(wParam)); break; } + break; + } + + case WM_NOTIFY: + { + NMITEMACTIVATE &nmia = *(NMITEMACTIVATE*)lParam; + if (wParam == IDC_GENERALLIST && nmia.hdr.code == NM_CLICK) + { + LVHITTESTINFO lvhti; + lvhti.pt = nmia.ptAction; + if (nmia.iItem != -1 && ListView_HitTest(nmia.hdr.hwndFrom, &lvhti) != -1) + { + if (lvhti.flags & (LVHT_ONITEMICON | LVHT_ONITEMLABEL)) + ListView_SetCheckState(nmia.hdr.hwndFrom, nmia.iItem, + !ListView_GetCheckState(nmia.hdr.hwndFrom, nmia.iItem)); + } + } + break; } - break; } return FALSE; @@ -292,5 +368,8 @@ SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam) VOID CreateSettingsDlg(HWND hwnd) { + SETTINGS_INFO NewSettingsInfo = SettingsInfo; + g_pNewSettingsInfo = &NewSettingsInfo; + DialogBoxW(hInst, MAKEINTRESOURCEW(IDD_SETTINGS_DIALOG), hwnd, SettingsDlgProc); }
1 week, 1 day
1
0
0
0
[reactos] 01/01: [SHIMGVW] Only enable toolbar edit and print buttons if the shell verb exists (#7725)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=46d01bc7fdb55a35fb258…
commit 46d01bc7fdb55a35fb258a518fc9fef4c11bd303 Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Sun Feb 23 14:08:36 2025 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Sun Feb 23 14:08:36 2025 +0100 [SHIMGVW] Only enable toolbar edit and print buttons if the shell verb exists (#7725) CORE-20002 --- dll/win32/shimgvw/shimgvw.c | 43 ++++++++--------- dll/win32/shimgvw/shimgvw.h | 4 ++ dll/win32/shimgvw/util.c | 114 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 126 insertions(+), 35 deletions(-) diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c index ba8dd000e81..392a0a463be 100644 --- a/dll/win32/shimgvw/shimgvw.c +++ b/dll/win32/shimgvw/shimgvw.c @@ -33,6 +33,7 @@ HWND g_hwndFullscreen = NULL; SHIMGVW_FILENODE * g_pCurrentFile = NULL; GpImage * g_pImage = NULL; SHIMGVW_SETTINGS g_Settings; +UINT g_ImageId; static const UINT s_ZoomSteps[] = { @@ -402,6 +403,10 @@ Preview_pLoadImage(PPREVIEW_DATA pData, LPCWSTR szOpenFileName) Preview_ResetZoom(pData); Preview_UpdateTitle(pData, szOpenFileName); + + ++g_ImageId; + EnableCommandIfVerbExists(g_ImageId, g_hMainWnd, IDC_PRINT, L"print", pData->m_szFile); + EnableCommandIfVerbExists(g_ImageId, g_hMainWnd, IDC_MODIFY, L"edit", pData->m_szFile); } static VOID @@ -557,15 +562,17 @@ Preview_pSaveImageAs(PPREVIEW_DATA pData) static VOID Preview_pPrintImage(PPREVIEW_DATA pData) { - /* FIXME */ + ShellExecuteVerb(g_hMainWnd, L"print", pData->m_szFile, FALSE); } static VOID Preview_UpdateUI(PPREVIEW_DATA pData) { BOOL bEnable = (g_pImage != NULL); - PostMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_SAVEAS, bEnable); - PostMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_PRINT, bEnable); + SendMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_SAVEAS, bEnable); + // These will be validated and enabled later by EnableCommandIfVerbExists + SendMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_PRINT, FALSE); + SendMessageW(pData->m_hwndToolBar, TB_ENABLEBUTTON, IDC_MODIFY, FALSE); } static VOID @@ -1397,26 +1404,8 @@ Preview_Delete(PPREVIEW_DATA pData) static VOID Preview_Edit(HWND hwnd) { - SHELLEXECUTEINFOW sei; - PPREVIEW_DATA pData = Preview_GetData(hwnd); - - if (!pData->m_szFile[0]) - return; - - ZeroMemory(&sei, sizeof(sei)); - sei.cbSize = sizeof(sei); - sei.lpVerb = L"edit"; - sei.lpFile = pData->m_szFile; - sei.nShow = SW_SHOWNORMAL; - if (!ShellExecuteExW(&sei)) - { - DPRINT1("Preview_Edit: ShellExecuteExW() failed with code %ld\n", GetLastError()); - } - else - { - // Destroy the window to quit the application - DestroyWindow(hwnd); - } + PPREVIEW_DATA pData = Preview_GetData(g_hMainWnd); + ShellExecuteVerb(pData->m_hwnd, L"edit", pData->m_szFile, TRUE); } static VOID @@ -1715,6 +1704,13 @@ PreviewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) } break; } + case WM_UPDATECOMMANDSTATE: + { + PPREVIEW_DATA pData = Preview_GetData(g_hMainWnd); + if (g_ImageId == lParam) + SendMessage(pData->m_hwndToolBar, TB_ENABLEBUTTON, LOWORD(wParam), HIWORD(wParam)); + break; + } default: { return DefWindowProcW(hwnd, uMsg, wParam, lParam); @@ -1738,6 +1734,7 @@ ImageView_Main(HWND hwnd, LPCWSTR szFileName) INITCOMMONCONTROLSEX Icc = { .dwSize = sizeof(Icc), .dwICC = ICC_WIN95_CLASSES }; InitCommonControlsEx(&Icc); + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL); // Give UI higher priority than background threads /* Initialize COM */ hrCoInit = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); diff --git a/dll/win32/shimgvw/shimgvw.h b/dll/win32/shimgvw/shimgvw.h index 279d08cd244..cdb6f975fa2 100644 --- a/dll/win32/shimgvw/shimgvw.h +++ b/dll/win32/shimgvw/shimgvw.h @@ -30,6 +30,8 @@ #include "resource.h" +#define WM_UPDATECOMMANDSTATE (WM_APP + 0) + extern HINSTANCE g_hInstance; extern GpImage *g_pImage; @@ -72,6 +74,8 @@ void Anime_Pause(PANIME pAnime); BOOL Anime_OnTimer(PANIME pAnime, WPARAM wParam); void DoShellContextMenuOnFile(HWND hwnd, PCWSTR File, LPARAM lParam); +void EnableCommandIfVerbExists(UINT ImageId, HWND hwnd, UINT CmdId, PCWSTR Verb, PCWSTR File); +void ShellExecuteVerb(HWND hwnd, PCWSTR Verb, PCWSTR File, BOOL Quit); void DisplayHelp(HWND hwnd); static inline LPVOID QuickAlloc(SIZE_T cbSize, BOOL bZero) diff --git a/dll/win32/shimgvw/util.c b/dll/win32/shimgvw/util.c index 290ad083fad..5a3b8d46294 100644 --- a/dll/win32/shimgvw/util.c +++ b/dll/win32/shimgvw/util.c @@ -47,11 +47,10 @@ static void ModifyShellContextMenu(IContextMenu *pCM, HMENU hMenu, UINT CmdIdFirst, PCWSTR Assoc) { HRESULT hr; - UINT id, i; - for (i = 0; i < GetMenuItemCount(hMenu); ++i) + for (UINT i = 0, c = GetMenuItemCount(hMenu); i < c; ++i) { WCHAR buf[200]; - id = GetMenuItemIdByPos(hMenu, i); + UINT id = GetMenuItemIdByPos(hMenu, i); if (id == (UINT)-1) continue; @@ -131,8 +130,8 @@ die: g_pContextMenu = NULL; } -void -DoShellContextMenuOnFile(HWND hwnd, PCWSTR File, LPARAM lParam) +HRESULT +GetUIObjectOfPath(HWND hwnd, PCWSTR File, REFIID riid, void **ppv) { HRESULT hr; IShellFolder *pSF; @@ -140,19 +139,110 @@ DoShellContextMenuOnFile(HWND hwnd, PCWSTR File, LPARAM lParam) PIDLIST_ABSOLUTE pidl = ILCreateFromPath(File); if (pidl && SUCCEEDED(SHBindToParent(pidl, IID_PPV_ARG(IShellFolder, &pSF), &pidlItem))) { - IContextMenu *pCM; - hr = IShellFolder_GetUIObjectOf(pSF, hwnd, 1, &pidlItem, &IID_IContextMenu, NULL, (void**)&pCM); + hr = IShellFolder_GetUIObjectOf(pSF, hwnd, 1, &pidlItem, riid, NULL, ppv); + IShellFolder_Release(pSF); + } + SHFree(pidl); + return hr; +} + +void +DoShellContextMenuOnFile(HWND hwnd, PCWSTR File, LPARAM lParam) +{ + IContextMenu *pCM; + HRESULT hr = GetUIObjectOfPath(hwnd, File, IID_PPV_ARG(IContextMenu, &pCM)); + if (SUCCEEDED(hr)) + { + DoShellContextMenu(hwnd, pCM, File, lParam); + IContextMenu_Release(pCM); + } +} + +typedef struct _ENABLECOMMANDDATA +{ + HWND hwnd; + PCWSTR Verb; + UINT CmdId; + UINT ImageId; + WCHAR File[ANYSIZE_ARRAY]; +} ENABLECOMMANDDATA; + +static DWORD CALLBACK +EnableCommandIfVerbExistsProc(LPVOID ThreadParam) +{ + enum { first = 1, last = 0x7fff }; + ENABLECOMMANDDATA *pData = ThreadParam; + IContextMenu *pCM; + HRESULT hr = GetUIObjectOfPath(pData->hwnd, pData->File, IID_PPV_ARG(IContextMenu, &pCM)); + if (SUCCEEDED(hr)) + { + HMENU hMenu = CreatePopupMenu(); + hr = IContextMenu_QueryContextMenu(pCM, hMenu, 0, first, last, CMF_NORMAL); if (SUCCEEDED(hr)) { - DoShellContextMenu(hwnd, pCM, File, lParam); - IContextMenu_Release(pCM); + for (UINT i = 0, c = GetMenuItemCount(hMenu); i < c; ++i) + { + WCHAR buf[200]; + UINT id = GetMenuItemIdByPos(hMenu, i); + if (id == (UINT)-1) + continue; + + *buf = UNICODE_NULL; + hr = IContextMenu_GetCommandString(pCM, id - first, GCS_VERBW, NULL, (char*)buf, _countof(buf)); + if (SUCCEEDED(hr) && !lstrcmpiW(buf, pData->Verb)) + { + PostMessageW(pData->hwnd, WM_UPDATECOMMANDSTATE, MAKELONG(pData->CmdId, TRUE), pData->ImageId); + break; + } + } } - IShellFolder_Release(pSF); + DestroyMenu(hMenu); + IContextMenu_Release(pCM); + } + SHFree(pData); + return 0; +} + +void +EnableCommandIfVerbExists(UINT ImageId, HWND hwnd, UINT CmdId, PCWSTR Verb, PCWSTR File) +{ + const SIZE_T cch = lstrlenW(File) + 1; + ENABLECOMMANDDATA *pData = SHAlloc(FIELD_OFFSET(ENABLECOMMANDDATA, File[cch])); + if (pData) + { + pData->hwnd = hwnd; + pData->Verb = Verb; // Note: This assumes the string is valid for the lifetime of the thread. + pData->CmdId = CmdId; + pData->ImageId = ImageId; + CopyMemory(pData->File, File, cch * sizeof(*File)); + SHCreateThread(EnableCommandIfVerbExistsProc, pData, CTF_COINIT | CTF_INSIST, NULL); } - SHFree(pidl); } -void DisplayHelp(HWND hwnd) +void +ShellExecuteVerb(HWND hwnd, PCWSTR Verb, PCWSTR File, BOOL Quit) +{ + SHELLEXECUTEINFOW sei = { sizeof(sei), SEE_MASK_INVOKEIDLIST | SEE_MASK_ASYNCOK }; + if (!*File) + return; + + sei.hwnd = hwnd; + sei.lpVerb = Verb; + sei.lpFile = File; + sei.nShow = SW_SHOW; + if (!ShellExecuteExW(&sei)) + { + DPRINT1("ShellExecuteExW(%ls, %ls) failed with code %ld\n", Verb, File, GetLastError()); + } + else if (Quit) + { + // Destroy the window to quit the application + DestroyWindow(hwnd); + } +} + +void +DisplayHelp(HWND hwnd) { SHELL_ErrorBox(hwnd, ERROR_NOT_SUPPORTED); }
1 week, 1 day
1
0
0
0
[reactos] 01/01: [SHELL32] Handle multiple files in recycle bin delete/restore operations (#7568)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e5fc4de8c9254ccd1062b…
commit e5fc4de8c9254ccd1062b8309d2965627fb4c5b6 Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Sat Feb 22 13:03:11 2025 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Sat Feb 22 13:03:11 2025 +0100 [SHELL32] Handle multiple files in recycle bin delete/restore operations (#7568) CORE-19895 CORE-19231 --- dll/win32/shell32/COpenWithMenu.cpp | 3 +- dll/win32/shell32/folders/CRecycleBin.cpp | 165 +++++++++++++++------ dll/win32/shell32/precomp.h | 12 ++ dll/win32/shell32/shellrecyclebin/recyclebin.c | 19 ++- dll/win32/shell32/shellrecyclebin/recyclebin.h | 7 + .../shell32/shellrecyclebin/recyclebin_v5.cpp | 87 ++++------- dll/win32/shell32/shellrecyclebin/recyclebin_v5.h | 4 + .../shellrecyclebin/recyclebin_v5_enumerator.cpp | 7 + dll/win32/shell32/shlfileop.cpp | 60 +++++++- dll/win32/shell32/utils.h | 11 +- 10 files changed, 260 insertions(+), 115 deletions(-) diff --git a/dll/win32/shell32/COpenWithMenu.cpp b/dll/win32/shell32/COpenWithMenu.cpp index 3e081de625b..9f646c00019 100644 --- a/dll/win32/shell32/COpenWithMenu.cpp +++ b/dll/win32/shell32/COpenWithMenu.cpp @@ -1297,7 +1297,8 @@ VOID COpenWithMenu::AddApp(PVOID pApp) m_idCmdLast++; } -static const CMVERBMAP g_VerbMap[] = { +static const CMVERBMAP g_VerbMap[] = +{ { "openas", 0 }, { NULL } }; diff --git a/dll/win32/shell32/folders/CRecycleBin.cpp b/dll/win32/shell32/folders/CRecycleBin.cpp index bd09268623b..6508e071326 100644 --- a/dll/win32/shell32/folders/CRecycleBin.cpp +++ b/dll/win32/shell32/folders/CRecycleBin.cpp @@ -210,12 +210,6 @@ static HRESULT GetItemTypeName(PCUITEMID_CHILD pidl, const BBITEMDATA &Data, SHF return E_FAIL; } -static HDELFILE GetRecycleBinFileHandleFromItem(const BBITEMDATA &Data) -{ - RECYCLEBINFILEIDENTITY identity = { Data.DeletionTime, GetItemRecycledFullPath(Data) }; - return GetRecycleBinFileHandle(NULL, &identity); -} - /* * Recycle Bin folder */ @@ -285,14 +279,6 @@ EXTERN_C void CRecycleBin_NotifyRecycled(LPCWSTR OrigPath, const WIN32_FIND_DATA static void CRecycleBin_NotifyRemovedFromRecycleBin(LPCITEMIDLIST BBItem) { CRecycleBin_ChangeNotifyBBItem(IsFolder(BBItem) ? SHCNE_RMDIR : SHCNE_DELETE, BBItem); - - CComHeapPtr<ITEMIDLIST> pidlBB(SHCloneSpecialIDList(NULL, CSIDL_BITBUCKET, FALSE)); - CComPtr<IShellFolder> pSF; - if (pidlBB && SUCCEEDED(SHBindToObject(NULL, pidlBB, IID_PPV_ARG(IShellFolder, &pSF)))) - { - if (IsRecycleBinEmpty(pSF)) - SHUpdateRecycleBinIcon(); - } } static HRESULT CRecyclerExtractIcon_CreateInstance( @@ -316,11 +302,12 @@ class CRecycleBinItemContextMenu : public IContextMenu2 { private: - LPITEMIDLIST apidl; + PITEMID_CHILD* m_apidl; + UINT m_cidl; public: CRecycleBinItemContextMenu(); - ~CRecycleBinItemContextMenu(); - HRESULT WINAPI Initialize(LPCITEMIDLIST pidl); + virtual ~CRecycleBinItemContextMenu(); + HRESULT WINAPI Initialize(UINT cidl, PCUITEMID_CHILD_ARRAY apidl); // IContextMenu STDMETHOD(QueryContextMenu)(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override; @@ -411,19 +398,21 @@ BOOL CRecycleBinEnum::CBEnumRecycleBin(IN HDELFILE hDeletedFile) CRecycleBinItemContextMenu::CRecycleBinItemContextMenu() { - apidl = NULL; + m_apidl = NULL; + m_cidl = 0; } CRecycleBinItemContextMenu::~CRecycleBinItemContextMenu() { - ILFree(apidl); + _ILFreeaPidl(m_apidl, m_cidl); } -HRESULT WINAPI CRecycleBinItemContextMenu::Initialize(LPCITEMIDLIST pidl) +HRESULT WINAPI CRecycleBinItemContextMenu::Initialize(UINT cidl, PCUITEMID_CHILD_ARRAY apidl) { - apidl = ILClone(pidl); - if (apidl == NULL) + m_apidl = _ILCopyaPidl(apidl, cidl); + if (m_apidl == NULL) return E_OUTOFMEMORY; + m_cidl = cidl; return S_OK; } @@ -473,22 +462,93 @@ HRESULT WINAPI CRecycleBinItemContextMenu::QueryContextMenu(HMENU hMenu, UINT in return idHigh ? MAKE_HRESULT(SEVERITY_SUCCESS, 0, idHigh - idCmdFirst + 1) : S_OK; } -static BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl, const BBITEMDATA &Data) +static BOOL ConfirmDelete(LPCMINVOKECOMMANDINFO lpcmi, UINT cidl, LPCITEMIDLIST pidl) { + BBITEMDATA *pData; if (lpcmi->fMask & CMIC_MASK_FLAG_NO_UI) { return TRUE; } - else if (cidl == 1) + else if (cidl == 1 && (pData = ValidateItem(pidl)) != NULL) { const UINT ask = IsFolder(pidl) ? ASK_DELETE_FOLDER : ASK_DELETE_FILE; - return SHELL_ConfirmYesNoW(lpcmi->hwnd, ask, GetItemOriginalFileName(Data)); + return SHELL_ConfirmYesNoW(lpcmi->hwnd, ask, GetItemOriginalFileName(*pData)); } - WCHAR buf[MAX_PATH]; + WCHAR buf[42]; wsprintfW(buf, L"%d", cidl); return SHELL_ConfirmYesNoW(lpcmi->hwnd, ASK_DELETE_MULTIPLE_ITEM, buf); } +static LPWSTR CreateFileOpStrings(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, BOOL RecycledPath) +{ + PWSTR mem = NULL, newmem; + for (SIZE_T i = 0, cb = 0, cb2, cbPath; i < cidl; ++i, cb = cb2) + { + BBITEMDATA *pData = ValidateItem(apidl[i]); + if (!pData) + { +fail: + LocalFree(mem); + return NULL; + } + LPCWSTR path = RecycledPath ? GetItemRecycledFullPath(*pData) : GetItemOriginalFullPath(*pData); + cbPath = (lstrlenW(path) + 1) * sizeof(WCHAR); + cb2 = cb + cbPath; + SIZE_T cbTot = cb2 + sizeof(WCHAR); // \0\0 termination + newmem = (PWSTR)(i ? LocalReAlloc(mem, cbTot, LMEM_MOVEABLE) : LocalAlloc(LPTR, cbTot)); + if (!newmem) + goto fail; + mem = newmem; + CopyMemory((char*)mem + cb, path, cbPath); + *(PWSTR)((char*)mem + cb + cbPath) = UNICODE_NULL; + } + return mem; +} + +typedef struct +{ + PCUITEMID_CHILD_ARRAY apidl; + UINT cidl, index; + BBITEMDATA *pItem; +} FILEOPDATA; + +static HRESULT CALLBACK FileOpCallback(FILEOPCALLBACKEVENT Event, LPCWSTR Src, LPCWSTR Dst, UINT Attrib, HRESULT hrOp, void *CallerData) +{ + FILEOPDATA &data = *(FILEOPDATA*)CallerData; + if (Event == FOCE_PREMOVEITEM || Event == FOCE_PREDELETEITEM) + { + data.pItem = NULL; + for (UINT i = 0; i < data.cidl; ++i) + { + BBITEMDATA *pItem = ValidateItem(data.apidl[i]); + if (pItem && !_wcsicmp(Src, GetItemRecycledFullPath(*pItem))) + { + data.pItem = pItem; + data.index = i; + break; + } + } + } + else if ((Event == FOCE_POSTDELETEITEM || Event == FOCE_POSTMOVEITEM) && SUCCEEDED(hrOp) && data.pItem) + { + RECYCLEBINFILEIDENTITY identity = { data.pItem->DeletionTime, GetItemRecycledFullPath(*data.pItem) }; + RemoveFromRecycleBinDatabase(&identity); + CRecycleBin_NotifyRemovedFromRecycleBin(data.apidl[data.index]); + data.pItem = NULL; + } + else if (Event == FOCE_FINISHOPERATIONS) + { + CComHeapPtr<ITEMIDLIST> pidlBB(SHCloneSpecialIDList(NULL, CSIDL_BITBUCKET, FALSE)); + CComPtr<IShellFolder> pSF; + if (pidlBB && SUCCEEDED(SHBindToObject(NULL, pidlBB, IID_PPV_ARG(IShellFolder, &pSF)))) + { + if (IsRecycleBinEmpty(pSF)) + SHUpdateRecycleBinIcon(); + } + } + return S_OK; +} + HRESULT WINAPI CRecycleBinItemContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) { TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", this, lpcmi, lpcmi->lpVerb, lpcmi->hwnd); @@ -505,35 +565,51 @@ HRESULT WINAPI CRecycleBinItemContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO l if (CmdId == IDC_BB_RESTORE || CmdId == IDC_BB_DELETE) { - BBITEMDATA *pData = ValidateItem(apidl); - if (!pData && FAILED_UNEXPECTEDLY(E_FAIL)) - return E_FAIL; - HDELFILE hDelFile = GetRecycleBinFileHandleFromItem(*pData); - if (!hDelFile && FAILED_UNEXPECTEDLY(E_FAIL)) - return E_FAIL; + HRESULT hr = S_OK; + if (CmdId == IDC_BB_DELETE && !ConfirmDelete(lpcmi, m_cidl, m_apidl[0])) + return S_OK; - HRESULT hr = S_FALSE; + LPWSTR pszzDst = NULL; + LPWSTR pszzSrc = CreateFileOpStrings(m_cidl, m_apidl, TRUE); + if (!pszzSrc) + return E_OUTOFMEMORY; + SHFILEOPSTRUCTW shfos = { lpcmi->hwnd, FO_DELETE, pszzSrc, NULL, FOF_NOCONFIRMMKDIR }; if (CmdId == IDC_BB_RESTORE) - hr = RestoreFileFromRecycleBin(hDelFile) ? S_OK : E_FAIL; - else if (ConfirmDelete(lpcmi, 1, apidl, *pData)) - hr = DeleteFileInRecycleBin(hDelFile) ? S_OK : E_FAIL; - - if (hr == S_OK) - CRecycleBin_NotifyRemovedFromRecycleBin(apidl); - - CloseRecycleBinHandle(hDelFile); + { + pszzDst = CreateFileOpStrings(m_cidl, m_apidl, FALSE); + if (!pszzDst) + hr = E_OUTOFMEMORY; + shfos.wFunc = FO_MOVE; + shfos.pTo = pszzDst; + shfos.fFlags |= FOF_MULTIDESTFILES; + } + else // IDC_BB_DELETE + { + shfos.fFlags |= FOF_NOCONFIRMATION; + } + if (SUCCEEDED(hr)) + { + if (lpcmi->fMask & CMIC_MASK_FLAG_NO_UI) + shfos.fFlags |= FOF_SILENT | FOF_NOERRORUI | FOF_NOCONFIRMATION; + FILEOPDATA data = { m_apidl, m_cidl }; + int res = SHELL32_FileOperation(&shfos, FileOpCallback, &data); + if (res && res != DE_OPCANCELLED && res != ERROR_CANCELLED) + hr = SHELL_ErrorBox(*lpcmi, E_FAIL); + } + LocalFree(pszzDst); + LocalFree(pszzSrc); return hr; } else if (CmdId == IDC_BB_CUT) { FIXME("implement cut\n"); - SHELL_ErrorBox(lpcmi->hwnd, ERROR_NOT_SUPPORTED); + SHELL_ErrorBox(*lpcmi, ERROR_NOT_SUPPORTED); return E_NOTIMPL; } else if (CmdId == IDC_BB_PROPERTIES) { FIXME("implement properties\n"); - SHELL_ErrorBox(lpcmi->hwnd, ERROR_NOT_SUPPORTED); + SHELL_ErrorBox(*lpcmi, ERROR_NOT_SUPPORTED); return E_NOTIMPL; } return E_UNEXPECTED; @@ -814,8 +890,7 @@ HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_C if ((IsEqualIID (riid, IID_IContextMenu) || IsEqualIID(riid, IID_IContextMenu2)) && (cidl >= 1)) { - // FIXME: Handle multiple items - hr = ShellObjectCreatorInit<CRecycleBinItemContextMenu>(apidl[0], riid, &pObj); + hr = ShellObjectCreatorInit<CRecycleBinItemContextMenu>(cidl, apidl, riid, &pObj); } else if((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1)) { diff --git a/dll/win32/shell32/precomp.h b/dll/win32/shell32/precomp.h index 3a70cb606c8..2d9e2776d6a 100644 --- a/dll/win32/shell32/precomp.h +++ b/dll/win32/shell32/precomp.h @@ -322,4 +322,16 @@ InvokeIExecuteCommandWithDataObject( _In_opt_ LPCMINVOKECOMMANDINFOEX pICI, _In_opt_ IUnknown *pSite); +typedef enum { + FOCE_STARTOPERATIONS, + FOCE_FINISHOPERATIONS, + FOCE_PREMOVEITEM, + FOCE_POSTMOVEITEM, + FOCE_PREDELETEITEM, + FOCE_POSTDELETEITEM +} FILEOPCALLBACKEVENT; +typedef HRESULT (CALLBACK *FILEOPCALLBACK)(FILEOPCALLBACKEVENT Event, LPCWSTR Source, LPCWSTR Destination, + UINT Attributes, HRESULT hr, void *CallerData); +int SHELL32_FileOperation(LPSHFILEOPSTRUCTW lpFileOp, FILEOPCALLBACK Callback, void *CallerData); + #endif /* _PRECOMP_H__ */ diff --git a/dll/win32/shell32/shellrecyclebin/recyclebin.c b/dll/win32/shell32/shellrecyclebin/recyclebin.c index 5a0153bacf5..890b625ea4b 100644 --- a/dll/win32/shell32/shellrecyclebin/recyclebin.c +++ b/dll/win32/shell32/shellrecyclebin/recyclebin.c @@ -93,7 +93,7 @@ BOOL WINAPI DeleteFileInRecycleBin( IN HDELFILE hDeletedFile) { - IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile; + IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDeletedFile); HRESULT hr; TRACE("(%p)\n", hDeletedFile); @@ -283,11 +283,26 @@ GetRecycleBinFileHandle( return context.hDelFile; } +EXTERN_C BOOL +RemoveFromRecycleBinDatabase( + IN const RECYCLEBINFILEIDENTITY *pFI) +{ + BOOL ret = FALSE; + HDELFILE hDelFile = GetRecycleBinFileHandle(NULL, pFI); + if (hDelFile) + { + IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDelFile); + ret = SUCCEEDED(IRecycleBinFile_RemoveFromDatabase(rbf)); + CloseRecycleBinHandle(hDelFile); + } + return ret; +} + BOOL WINAPI RestoreFileFromRecycleBin( IN HDELFILE hDeletedFile) { - IRecycleBinFile *rbf = (IRecycleBinFile *)hDeletedFile; + IRecycleBinFile *rbf = IRecycleBinFileFromHDELFILE(hDeletedFile); HRESULT hr; TRACE("(%p)\n", hDeletedFile); diff --git a/dll/win32/shell32/shellrecyclebin/recyclebin.h b/dll/win32/shell32/shellrecyclebin/recyclebin.h index b3795b04ebc..4746d0857ef 100644 --- a/dll/win32/shell32/shellrecyclebin/recyclebin.h +++ b/dll/win32/shell32/shellrecyclebin/recyclebin.h @@ -155,6 +155,10 @@ GetRecycleBinFileHandle( IN LPCWSTR pszRoot OPTIONAL, IN const RECYCLEBINFILEIDENTITY *pFI); +EXTERN_C BOOL +RemoveFromRecycleBinDatabase( + IN const RECYCLEBINFILEIDENTITY *pFI); + /* Restores a deleted file * hDeletedFile: handle of the deleted file to restore * Returns TRUE if operation succeeded, FALSE otherwise. @@ -187,6 +191,7 @@ DECLARE_INTERFACE_(IRecycleBinFile, IUnknown) STDMETHOD(GetFileName)(THIS_ SIZE_T BufferSize, LPWSTR Buffer, SIZE_T *RequiredSize) PURE; STDMETHOD(Delete)(THIS) PURE; STDMETHOD(Restore)(THIS) PURE; + STDMETHOD(RemoveFromDatabase)(THIS) PURE; END_INTERFACE }; @@ -262,6 +267,8 @@ EXTERN_C const IID IID_IRecycleBin; (This)->lpVtbl->Delete(This) #define IRecycleBinFile_Restore(This) \ (This)->lpVtbl->Restore(This) +#define IRecycleBinFile_RemoveFromDatabase(This) \ + (This)->lpVtbl->RemoveFromDatabase(This) #define IRecycleBinEnumList_QueryInterface(This, riid, ppvObject) \ (This)->lpVtbl->QueryInterface(This, riid, ppvObject) diff --git a/dll/win32/shell32/shellrecyclebin/recyclebin_v5.cpp b/dll/win32/shell32/shellrecyclebin/recyclebin_v5.cpp index b040851d011..c32f9c8d630 100644 --- a/dll/win32/shell32/shellrecyclebin/recyclebin_v5.cpp +++ b/dll/win32/shell32/shellrecyclebin/recyclebin_v5.cpp @@ -158,6 +158,9 @@ public: STDMETHODIMP Restore( _In_ LPCWSTR pDeletedFileName, _In_ DELETED_FILE_RECORD *pDeletedFile) override; + STDMETHODIMP RemoveFromDatabase( + _In_ LPCWSTR pDeletedFileName, + _In_ DELETED_FILE_RECORD *pDeletedFile) override; STDMETHODIMP OnClosing(_In_ IRecycleBinEnumList *prbel) override; protected: @@ -454,62 +457,38 @@ STDMETHODIMP RecycleBin5::Delete( _In_ LPCWSTR pDeletedFileName, _In_ DELETED_FILE_RECORD *pDeletedFile) { - ULARGE_INTEGER FileSize; - PINFO2_HEADER pHeader; - DELETED_FILE_RECORD *pRecord, *pLast; - DWORD dwEntries, i; TRACE("(%p, %s, %p)\n", this, debugstr_w(pDeletedFileName), pDeletedFile); - if (m_EnumeratorCount != 0) - return HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION); + int res = IntDeleteRecursive(pDeletedFileName); + if (!res) + return HResultFromWin32(GetLastError()); + res = RemoveFromDatabase(pDeletedFileName, pDeletedFile); + if (res == 0) + SHUpdateRecycleBinIcon(); // Full --> Empty + return res; +} - pHeader = (PINFO2_HEADER)MapViewOfFile(m_hInfoMapped, FILE_MAP_WRITE, 0, 0, 0); - if (!pHeader) - return HRESULT_FROM_WIN32(GetLastError()); +STDMETHODIMP RecycleBin5::Restore( + _In_ LPCWSTR pDeletedFileName, + _In_ DELETED_FILE_RECORD *pDeletedFile) +{ - FileSize.u.LowPart = GetFileSize(m_hInfo, &FileSize.u.HighPart); - if (FileSize.u.LowPart == 0) - { - UnmapViewOfFile(pHeader); - return HRESULT_FROM_WIN32(GetLastError()); - } - dwEntries = (DWORD)((FileSize.QuadPart - sizeof(INFO2_HEADER)) / sizeof(DELETED_FILE_RECORD)); + TRACE("(%p, %s, %p)\n", this, debugstr_w(pDeletedFileName), pDeletedFile); - pRecord = (DELETED_FILE_RECORD *)(pHeader + 1); - for (i = 0; i < dwEntries; i++) + int res = SHELL_SingleFileOperation(NULL, FO_MOVE, pDeletedFileName, pDeletedFile->FileNameW, 0); + if (res) { - if (pRecord->dwRecordUniqueId == pDeletedFile->dwRecordUniqueId) - { - /* Delete file */ - if (!IntDeleteRecursive(pDeletedFileName)) - { - UnmapViewOfFile(pHeader); - return HRESULT_FROM_WIN32(GetLastError()); - } - - /* Clear last entry in the file */ - MoveMemory(pRecord, pRecord + 1, (dwEntries - i - 1) * sizeof(DELETED_FILE_RECORD)); - pLast = pRecord + (dwEntries - i - 1); - ZeroMemory(pLast, sizeof(DELETED_FILE_RECORD)); - UnmapViewOfFile(pHeader); - - /* Resize file */ - CloseHandle(m_hInfoMapped); - SetFilePointer(m_hInfo, -(LONG)sizeof(DELETED_FILE_RECORD), NULL, FILE_END); - SetEndOfFile(m_hInfo); - m_hInfoMapped = CreateFileMappingW(m_hInfo, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 0, NULL); - if (!m_hInfoMapped) - return HRESULT_FROM_WIN32(GetLastError()); - return S_OK; - } - pRecord++; + ERR("SHFileOperationW failed with 0x%x\n", res); + return E_FAIL; } - UnmapViewOfFile(pHeader); - return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); + res = RemoveFromDatabase(pDeletedFileName, pDeletedFile); + if (res == 0) + SHUpdateRecycleBinIcon(); // Full --> Empty + return res; } -STDMETHODIMP RecycleBin5::Restore( +STDMETHODIMP RecycleBin5::RemoveFromDatabase( _In_ LPCWSTR pDeletedFileName, _In_ DELETED_FILE_RECORD *pDeletedFile) { @@ -517,7 +496,6 @@ STDMETHODIMP RecycleBin5::Restore( PINFO2_HEADER pHeader; DELETED_FILE_RECORD *pRecord, *pLast; DWORD dwEntries, i; - int res; TRACE("(%p, %s, %p)\n", this, debugstr_w(pDeletedFileName), pDeletedFile); @@ -541,14 +519,6 @@ STDMETHODIMP RecycleBin5::Restore( { if (pRecord->dwRecordUniqueId == pDeletedFile->dwRecordUniqueId) { - res = SHELL_SingleFileOperation(NULL, FO_MOVE, pDeletedFileName, pDeletedFile->FileNameW, 0); - if (res) - { - ERR("SHFileOperationW failed with 0x%x\n", res); - UnmapViewOfFile(pHeader); - return E_FAIL; - } - /* Clear last entry in the file */ MoveMemory(pRecord, pRecord + 1, (dwEntries - i - 1) * sizeof(DELETED_FILE_RECORD)); pLast = pRecord + (dwEntries - i - 1); @@ -561,10 +531,9 @@ STDMETHODIMP RecycleBin5::Restore( SetEndOfFile(m_hInfo); m_hInfoMapped = CreateFileMappingW(m_hInfo, NULL, PAGE_READWRITE | SEC_COMMIT, 0, 0, NULL); if (!m_hInfoMapped) - return HRESULT_FROM_WIN32(GetLastError()); - if (dwEntries == 1) - SHUpdateRecycleBinIcon(); // Full --> Empty - return S_OK; + return HResultFromWin32(GetLastError()); + dwEntries--; + return FAILED((int)dwEntries) ? INT_MAX : dwEntries; } pRecord++; } diff --git a/dll/win32/shell32/shellrecyclebin/recyclebin_v5.h b/dll/win32/shell32/shellrecyclebin/recyclebin_v5.h index 2461e0bdbca..a55286bc7a2 100644 --- a/dll/win32/shell32/shellrecyclebin/recyclebin_v5.h +++ b/dll/win32/shell32/shellrecyclebin/recyclebin_v5.h @@ -52,6 +52,10 @@ DECLARE_INTERFACE_(IRecycleBin5, IRecycleBin) THIS_ IN LPCWSTR pDeletedFileName, IN DELETED_FILE_RECORD *pDeletedFile) PURE; + STDMETHOD(RemoveFromDatabase)( + THIS_ + IN LPCWSTR pDeletedFileName, + IN DELETED_FILE_RECORD *pDeletedFile) PURE; STDMETHOD(OnClosing)( THIS_ IN IRecycleBinEnumList *prbel) PURE; diff --git a/dll/win32/shell32/shellrecyclebin/recyclebin_v5_enumerator.cpp b/dll/win32/shell32/shellrecyclebin/recyclebin_v5_enumerator.cpp index ae5c6d5e5e6..b9f1ff74a63 100644 --- a/dll/win32/shell32/shellrecyclebin/recyclebin_v5_enumerator.cpp +++ b/dll/win32/shell32/shellrecyclebin/recyclebin_v5_enumerator.cpp @@ -42,6 +42,7 @@ public: STDMETHODIMP GetFileName(SIZE_T BufferSize, LPWSTR Buffer, SIZE_T *RequiredSize) override; STDMETHODIMP Delete() override; STDMETHODIMP Restore() override; + STDMETHODIMP RemoveFromDatabase() override; protected: LONG m_ref; @@ -226,6 +227,12 @@ STDMETHODIMP RecycleBin5File::Restore() return m_recycleBin->Restore(m_FullName, &m_deletedFile); } +STDMETHODIMP RecycleBin5File::RemoveFromDatabase() +{ + TRACE("(%p)\n", this); + return m_recycleBin->RemoveFromDatabase(m_FullName, &m_deletedFile); +} + RecycleBin5File::RecycleBin5File() : m_ref(1) , m_recycleBin(NULL) diff --git a/dll/win32/shell32/shlfileop.cpp b/dll/win32/shell32/shlfileop.cpp index f26d54ecc68..eea83780694 100644 --- a/dll/win32/shell32/shlfileop.cpp +++ b/dll/win32/shell32/shlfileop.cpp @@ -45,6 +45,8 @@ typedef struct ULARGE_INTEGER completedSize; ULARGE_INTEGER totalSize; WCHAR szBuilderString[50]; + FILEOPCALLBACK Callback; + void *CallerCallbackData; } FILE_OPERATION; #define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 @@ -361,6 +363,19 @@ EXTERN_C HRESULT WINAPI SHIsFileAvailableOffline(LPCWSTR path, LPDWORD status) return E_FAIL; } +static HRESULT FileOpCallback(FILE_OPERATION *op, FILEOPCALLBACKEVENT Event, LPCWSTR Source, + LPCWSTR Destination, UINT Attributes, HRESULT hrOp = S_OK) +{ + HRESULT hr = S_OK; + if (op->Callback) + { + hr = op->Callback(Event, Source, Destination, Attributes, hrOp, op->CallerCallbackData); + if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED)) + op->bCancelled = TRUE; + } + return hr; +} + /************************************************************************** * SHELL_DeleteDirectory() [internal] * @@ -380,6 +395,9 @@ BOOL SHELL_DeleteDirectoryW(FILE_OPERATION *op, LPCWSTR pszDir, BOOL bShowUI) if (hFind == INVALID_HANDLE_VALUE) return FALSE; + if (FAILED(FileOpCallback(op, FOCE_PREDELETEITEM, pszDir, NULL, wfd.dwFileAttributes))) + return FALSE; + if (!bShowUI || (ret = SHELL_ConfirmDialogW(op->req->hwnd, ASK_DELETE_FOLDER, pszDir, NULL))) { do @@ -399,6 +417,7 @@ BOOL SHELL_DeleteDirectoryW(FILE_OPERATION *op, LPCWSTR pszDir, BOOL bShowUI) FindClose(hFind); if (ret) ret = (SHNotifyRemoveDirectoryW(pszDir) == ERROR_SUCCESS); + FileOpCallback(op, FOCE_POSTDELETEITEM, pszDir, NULL, wfd.dwFileAttributes, ret ? S_OK : E_FAIL); return ret; } @@ -622,7 +641,11 @@ static DWORD SHNotifyDeleteFileW(FILE_OPERATION *op, LPCWSTR path) tmp.u.HighPart = wfd.nFileSizeHigh; FileSize.QuadPart = tmp.QuadPart; } + UINT attrib = hFile != INVALID_HANDLE_VALUE ? wfd.dwFileAttributes : 0; + BOOL aborted = FAILED(FileOpCallback(op, FOCE_PREDELETEITEM, path, NULL, attrib)); FindClose(hFile); + if (aborted) + return ERROR_CANCELLED; ret = DeleteFileW(path); if (!ret) @@ -633,6 +656,7 @@ static DWORD SHNotifyDeleteFileW(FILE_OPERATION *op, LPCWSTR path) if (SetFileAttributesW(path, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) ret = DeleteFileW(path); } + FileOpCallback(op, FOCE_POSTDELETEITEM, path, NULL, attrib, ret ? S_OK : E_FAIL); if (ret) { // Bit of a hack to make the progress bar move. We don't have progress inside the file, so inform when done. @@ -720,6 +744,10 @@ static DWORD SHNotifyMoveFileW(FILE_OPERATION *op, LPCWSTR src, LPCWSTR dest, BO _SetOperationTexts(op, src, dest); + UINT attrib = isdir ? FILE_ATTRIBUTE_DIRECTORY : FILE_ATTRIBUTE_NORMAL; + if (FAILED(FileOpCallback(op, FOCE_PREMOVEITEM, src, dest, attrib))) + return ERROR_CANCELLED; + ret = MoveFileWithProgressW(src, dest, SHCopyProgressRoutine, op, MOVEFILE_REPLACE_EXISTING); /* MOVEFILE_REPLACE_EXISTING fails with dirs, so try MoveFile */ @@ -740,6 +768,7 @@ static DWORD SHNotifyMoveFileW(FILE_OPERATION *op, LPCWSTR src, LPCWSTR dest, BO ret = MoveFileW(src, dest); } } + FileOpCallback(op, FOCE_POSTMOVEITEM, src, dest, attrib, ret ? S_OK : E_FAIL); if (ret) { SHChangeNotify(isdir ? SHCNE_MKDIR : SHCNE_CREATE, SHCNF_PATHW, dest, NULL); @@ -1691,6 +1720,10 @@ static void move_dir_to_dir(FILE_OPERATION *op, const FILE_ENTRY *feFrom, LPCWST if (feFrom->szFilename && IsDotDir(feFrom->szFilename)) return; + UINT attrib = FILE_ATTRIBUTE_DIRECTORY; + if (FAILED(FileOpCallback(op, FOCE_PREMOVEITEM, feFrom->szFullPath, szDestPath, attrib))) + return; + SHNotifyCreateDirectoryW(szDestPath, NULL); PathCombineW(szFrom, feFrom->szFullPath, L"*.*"); @@ -1709,8 +1742,10 @@ static void move_dir_to_dir(FILE_OPERATION *op, const FILE_ENTRY *feFrom, LPCWST destroy_file_list(&flFromNew); destroy_file_list(&flToNew); + BOOL success = FALSE; if (PathIsDirectoryEmptyW(feFrom->szFullPath)) - Win32RemoveDirectoryW(feFrom->szFullPath); + success = Win32RemoveDirectoryW(feFrom->szFullPath); + FileOpCallback(op, FOCE_POSTMOVEITEM, feFrom->szFullPath, szDestPath, attrib, success ? S_OK : E_FAIL); } static BOOL move_file_to_file(FILE_OPERATION *op, const WCHAR *szFrom, const WCHAR *szTo) @@ -1982,12 +2017,7 @@ validate_operation(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom, FILE_LIST *flT return ERROR_SUCCESS; } -/************************************************************************* - * SHFileOperationW [SHELL32.@] - * - * See SHFileOperationA - */ -int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) +int SHELL32_FileOperation(LPSHFILEOPSTRUCTW lpFileOp, FILEOPCALLBACK Callback, void *CallerData) { FILE_OPERATION op; FILE_LIST flFrom, flTo; @@ -2017,6 +2047,8 @@ int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) op.totalSize.QuadPart = 0ull; op.completedSize.QuadPart = 0ull; op.bManyItems = (flFrom.dwNumFiles > 1); + op.Callback = Callback; + op.CallerCallbackData = CallerData; ret = validate_operation(lpFileOp, &flFrom, &flTo); if (ret) @@ -2035,6 +2067,8 @@ int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) _FileOpCountManager(&op, &flFrom); } + FileOpCallback(&op, FOCE_STARTOPERATIONS, NULL, NULL, 0); + switch (lpFileOp->wFunc) { case FO_COPY: @@ -2070,11 +2104,23 @@ cleanup: if (ret == ERROR_CANCELLED) lpFileOp->fAnyOperationsAborted = TRUE; + FileOpCallback(&op, FOCE_FINISHOPERATIONS, NULL, NULL, 0, HRESULT_FROM_WIN32(ret)); + CoUninitialize(); return ret; } +/************************************************************************* + * SHFileOperationW [SHELL32.@] + * + * See SHFileOperationA + */ +int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) +{ + return SHELL32_FileOperation(lpFileOp, NULL, NULL); +} + // Used by SHFreeNameMappings static int CALLBACK _DestroyCallback(void *p, void *pData) { diff --git a/dll/win32/shell32/utils.h b/dll/win32/shell32/utils.h index 5591eb6a463..a4effec8964 100644 --- a/dll/win32/shell32/utils.h +++ b/dll/win32/shell32/utils.h @@ -14,6 +14,14 @@ SHStrDupW(LPCWSTR Src) LPWSTR Dup; return SUCCEEDED(SHStrDupW(Src, &Dup)) ? Dup : NULL; } + +static inline UINT +SHELL_ErrorBox(CMINVOKECOMMANDINFO &cmi, UINT Error) +{ + if (cmi.fMask & CMIC_MASK_FLAG_NO_UI) + return Error ? Error : ERROR_INTERNAL_ERROR; + return SHELL_ErrorBox(cmi.hwnd, Error); +} #endif static inline BOOL @@ -46,7 +54,8 @@ RegSetString(HKEY hKey, LPCWSTR Name, LPCWSTR Str, DWORD Type = REG_SZ) return RegSetValueExW(hKey, Name, 0, Type, LPBYTE(Str), (lstrlenW(Str) + 1) * sizeof(WCHAR)); } -typedef struct { +typedef struct +{ LPCSTR Verb; WORD CmdId; } CMVERBMAP;
1 week, 2 days
1
0
0
0
[reactos] 01/01: [DESK] Don't include .ico files in list of wallpapers (#7726)
by Whindmar Saksit
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=924592dc47d9335b2c37e…
commit 924592dc47d9335b2c37e70b39b7fa0a1333156a Author: Whindmar Saksit <whindsaks(a)proton.me> AuthorDate: Sat Feb 22 13:01:32 2025 +0100 Commit: GitHub <noreply(a)github.com> CommitDate: Sat Feb 22 13:01:32 2025 +0100 [DESK] Don't include .ico files in list of wallpapers (#7726) CORE-20003 --- dll/cpl/desk/background.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dll/cpl/desk/background.c b/dll/cpl/desk/background.c index 931ef142c5e..6079d67ee89 100644 --- a/dll/cpl/desk/background.c +++ b/dll/cpl/desk/background.c @@ -155,6 +155,9 @@ GdipGetSupportedFileExtensions(VOID) for (i = 0; i < num; ++i) { + if (!lstrcmpiW(codecInfo[i].FilenameExtension, L"*.ico")) + continue; + StringCbCatW(lpBuffer, size, codecInfo[i].FilenameExtension); if (i < (num - 1)) {
1 week, 2 days
1
0
0
0
[reactos] 04/04: [FREELDR] Add Extents support
by Daniel Victor
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=56c8c8ab4f16633398356…
commit 56c8c8ab4f16633398356087ae9923d7b71bb467 Author: Daniel Victor <ilauncherdeveloper(a)gmail.com> AuthorDate: Thu Feb 13 16:34:02 2025 -0300 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 20 19:28:41 2025 +0200 [FREELDR] Add Extents support --- boot/freeldr/freeldr/lib/fs/ext.c | 82 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/boot/freeldr/freeldr/lib/fs/ext.c b/boot/freeldr/freeldr/lib/fs/ext.c index 6503bfca2f0..288d708a915 100644 --- a/boot/freeldr/freeldr/lib/fs/ext.c +++ b/boot/freeldr/freeldr/lib/fs/ext.c @@ -40,6 +40,7 @@ BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBu BOOLEAN ExtReadGroupDescriptor(PEXT_VOLUME_INFO Volume, ULONG Group, PEXT_GROUP_DESC GroupBuffer); ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode); ULONGLONG ExtGetInodeFileSize(PEXT_INODE Inode); +BOOLEAN ExtCopyBlockPointersByExtents(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, PEXT4_EXTENT_HEADER ExtentHeader); BOOLEAN ExtCopyIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock); BOOLEAN ExtCopyDoubleIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock); BOOLEAN ExtCopyTripleIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock); @@ -1037,6 +1038,21 @@ ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode) RtlZeroMemory(BlockList, BlockCount * sizeof(ULONG)); + // If the file is stored in extents, copy the block pointers by reading the + // extent entries. + if (Inode->Flags & EXT4_INODE_FLAG_EXTENTS) + { + CurrentBlockInList = 0; + + if (!ExtCopyBlockPointersByExtents(Volume, BlockList, &CurrentBlockInList, BlockCount, &Inode->ExtentHeader)) + { + FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); + return NULL; + } + + return BlockList; + } + // Copy the direct block pointers for (CurrentBlockInList = CurrentBlock = 0; CurrentBlockInList < BlockCount && CurrentBlock < sizeof(Inode->Blocks.DirectBlocks) / sizeof(*Inode->Blocks.DirectBlocks); @@ -1090,6 +1106,72 @@ ULONGLONG ExtGetInodeFileSize(PEXT_INODE Inode) } } +BOOLEAN ExtCopyBlockPointersByExtents(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, PEXT4_EXTENT_HEADER ExtentHeader) +{ + TRACE("ExtCopyBlockPointersByExtents() BlockCount = 0x%p\n", BlockCount); + + if (ExtentHeader->Magic != EXT4_EXTENT_HEADER_MAGIC || + ExtentHeader->Depth > EXT4_EXTENT_MAX_LEVEL) + return FALSE; + + ULONG Level = ExtentHeader->Depth; + ULONG Entries = ExtentHeader->Entries; + + TRACE("Level: %d\n", Level); + TRACE("Entries: %d\n", Entries); + + // If the level is 0, we have a direct extent block mapping + if (!Level) + { + PEXT4_EXTENT Extent = (PVOID)&ExtentHeader[1]; + + while ((*CurrentBlockInList) < BlockCount && Entries--) + { + BOOLEAN SparseExtent = (Extent->Length > EXT4_EXTENT_MAX_LENGTH); + ULONG Length = SparseExtent ? (Extent->Length - EXT4_EXTENT_MAX_LENGTH) : Extent->Length; + ULONG CurrentBlock = SparseExtent ? 0 : Extent->Start; + + // Copy the pointers to the block list + while ((*CurrentBlockInList) < BlockCount && Length--) + { + BlockList[(*CurrentBlockInList)++] = CurrentBlock; + + if (!SparseExtent) + CurrentBlock++; + } + + Extent++; + } + } + else + { + PEXT4_EXTENT_IDX Extent = (PVOID)&ExtentHeader[1]; + + PEXT4_EXTENT_HEADER BlockBuffer = FrLdrTempAlloc(Volume->BlockSizeInBytes, TAG_EXT_BUFFER); + if (!BlockBuffer) + { + return FALSE; + } + + // Recursively copy the pointers to the block list + while ((*CurrentBlockInList) < BlockCount && Entries--) + { + if (!(ExtReadBlock(Volume, Extent->Leaf, BlockBuffer) && + ExtCopyBlockPointersByExtents(Volume, BlockList, CurrentBlockInList, BlockCount, BlockBuffer))) + { + FrLdrTempFree(BlockBuffer, TAG_EXT_BUFFER); + return FALSE; + } + + Extent++; + } + + FrLdrTempFree(BlockBuffer, TAG_EXT_BUFFER); + } + + return TRUE; +} + BOOLEAN ExtCopyIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock) { ULONG* BlockBuffer;
1 week, 4 days
1
0
0
0
[reactos] 03/04: [FREELDR] Rewrite the header and reformat/adapt current code
by Daniel Victor
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a980ad08b425f2c26cfa6…
commit a980ad08b425f2c26cfa6cc3329db648592425f4 Author: Daniel Victor <ilauncherdeveloper(a)gmail.com> AuthorDate: Sun Jan 19 22:03:58 2025 -0300 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 20 19:28:41 2025 +0200 [FREELDR] Rewrite the header and reformat/adapt current code --- boot/freeldr/freeldr/include/fs/ext.h | 367 ++++++++++++++++++---------------- boot/freeldr/freeldr/lib/fs/ext.c | 348 ++++++++++++++++---------------- 2 files changed, 364 insertions(+), 351 deletions(-) diff --git a/boot/freeldr/freeldr/include/fs/ext.h b/boot/freeldr/freeldr/include/fs/ext.h index 733a731e555..3ca1fe18d92 100644 --- a/boot/freeldr/freeldr/include/fs/ext.h +++ b/boot/freeldr/freeldr/include/fs/ext.h @@ -1,6 +1,7 @@ /* * FreeLoader * Copyright (C) 1998-2003 Brian Palmer <brianp(a)sginet.com> + * Copyright (C) 2024-2025 Daniel Victor <ilauncherdeveloper(a)gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,202 +40,214 @@ * along with GRUB. If not, see <
http://www.gnu.org/licenses/
>. */ -/* Magic value used to identify an ext filesystem. */ -#define EXT_MAGIC 0xEF53 -/* Amount of indirect blocks in an inode. */ -#define INDIRECT_BLOCKS 12 -/* Maximum length of a pathname. */ -#define EXT_PATH_MAX 4096 -/* Maximum nesting of symlinks, used to prevent a loop. */ -#define EXT_MAX_SYMLINKCNT 8 - -/* The good old revision and the default inode size. */ -#define EXT_GOOD_OLD_REVISION 0 -#define EXT_DYNAMIC_REVISION 1 -#define EXT_GOOD_OLD_INODE_SIZE 128 - -/* Filetype used in directory entry. */ -#define FILETYPE_UNKNOWN 0 -#define FILETYPE_REG 1 -#define FILETYPE_DIRECTORY 2 -#define FILETYPE_SYMLINK 7 - -/* Filetype information as used in inodes. */ -#define FILETYPE_INO_MASK 0170000 -#define FILETYPE_INO_REG 0100000 -#define FILETYPE_INO_DIRECTORY 0040000 -#define FILETYPE_INO_SYMLINK 0120000 - -/* The ext superblock. */ -struct ext_sblock +#include <pshpack1.h> + +#define EXT_SUPERBLOCK_MAGIC 0xEF53 +#define EXT_DYNAMIC_REVISION 1 +#define EXT_DEFAULT_INODE_SIZE 128 +#define EXT_DEFAULT_GROUP_DESC_SIZE 32 + +#define EXT_DIR_ENTRY_MAX_NAME_LENGTH 255 + +typedef struct _ExtSuperBlock { - ULONG total_inodes; - ULONG total_blocks; - ULONG reserved_blocks; - ULONG free_blocks; - ULONG free_inodes; - ULONG first_data_block; - ULONG log2_block_size; - LONG log2_fragment_size; - ULONG blocks_per_group; - ULONG fragments_per_group; - ULONG inodes_per_group; - ULONG mtime; - ULONG utime; - USHORT mnt_count; - USHORT max_mnt_count; - USHORT magic; - USHORT fs_state; - USHORT error_handling; - USHORT minor_revision_level; - ULONG lastcheck; - ULONG checkinterval; - ULONG creator_os; - ULONG revision_level; - USHORT uid_reserved; - USHORT gid_reserved; - ULONG first_inode; - USHORT inode_size; - USHORT block_group_number; - ULONG feature_compatibility; - ULONG feature_incompat; - ULONG feature_ro_compat; - ULONG unique_id[4]; - char volume_name[16]; - char last_mounted_on[64]; - ULONG compression_info; - ULONG padding[77]; -}; - -/* The ext blockgroup. */ -struct ext_block_group + /* SuperBlock Information Ext2 */ + ULONG InodesCount; + ULONG BlocksCountLo; + ULONG RBlocksCountLo; + ULONG FreeBlocksCountLo; + ULONG FreeInodesCount; + ULONG FirstDataBlock; + ULONG LogBlockSize; + LONG LogFragSize; + ULONG BlocksPerGroup; + ULONG FragsPerGroup; + ULONG InodesPerGroup; + ULONG MTime; + ULONG WTime; + USHORT MntCount; + USHORT MaxMntCount; + USHORT Magic; + USHORT State; + USHORT Errors; + USHORT MinorRevisionLevel; + ULONG LastCheck; + ULONG CheckInterval; + ULONG CreatorOS; + ULONG RevisionLevel; + USHORT DefResUID; + USHORT DefResGID; + + /* SuperBlock Information Ext3 */ + ULONG FirstInode; + USHORT InodeSize; + USHORT BlockGroupNr; + ULONG FeatureCompat; + ULONG FeatureIncompat; + ULONG FeatureROCompat; + UCHAR UUID[16]; + CHAR VolumeName[16]; + CHAR LastMounted[64]; + ULONG AlgorithmUsageBitmap; + UCHAR PreallocBlocks; + UCHAR PreallocDirBlocks; + USHORT ReservedGdtBlocks; + UCHAR JournalUUID[16]; + ULONG JournalInum; + ULONG JournalDev; + ULONG LastOrphan; + ULONG HashSeed[4]; + UCHAR DefHashVersion; + UCHAR JournalBackupType; + USHORT GroupDescSize; + UCHAR Reserved[768]; +} EXT_SUPER_BLOCK, *PEXT_SUPER_BLOCK; + +typedef struct _ExtGroupDescriptor { - ULONG block_id; - ULONG inode_id; - ULONG inode_table_id; - USHORT free_blocks; - USHORT free_inodes; - USHORT used_dirs; - USHORT pad; - ULONG reserved[3]; -}; - -/* The ext inode. */ -struct ext_inode + ULONG BlockBitmap; + ULONG InodeBitmap; + ULONG InodeTable; + USHORT FreeBlocksCount; + USHORT FreeInodesCount; + USHORT UsedDirsCount; +} EXT_GROUP_DESC, *PEXT_GROUP_DESC; + +typedef struct _Ext4ExtentHeader { - USHORT mode; - USHORT uid; - ULONG size; - ULONG atime; - ULONG ctime; - ULONG mtime; - ULONG dtime; - USHORT gid; - USHORT nlinks; - ULONG blockcnt; /* Blocks of 512 bytes!! */ - ULONG flags; - ULONG osd1; - union - { - struct datablocks - { - ULONG dir_blocks[INDIRECT_BLOCKS]; - ULONG indir_block; - ULONG double_indir_block; - ULONG tripple_indir_block; - } blocks; - char symlink[60]; - }; - ULONG version; - ULONG acl; - ULONG dir_acl; - ULONG fragment_addr; - ULONG osd2[3]; -}; - -/* The header of an ext directory entry. */ -#define EXT_NAME_LEN 255 - -struct ext_dirent + USHORT Magic; + USHORT Entries; + USHORT Max; + USHORT Depth; + ULONG Generation; +} EXT4_EXTENT_HEADER, *PEXT4_EXTENT_HEADER; + +typedef struct _Ext4ExtentIdx { - ULONG inode; - USHORT direntlen; - UCHAR namelen; - UCHAR filetype; - CHAR name[EXT_NAME_LEN]; -}; + ULONG Block; + ULONG Leaf; + USHORT LeafHigh; + USHORT Unused; +} EXT4_EXTENT_IDX, *PEXT4_EXTENT_IDX; -/* - * End of code from grub/fs/ext2.c - */ +typedef struct _Ext4Extent +{ + ULONG Block; + USHORT Length; + USHORT StartHigh; + ULONG Start; +} EXT4_EXTENT, *PEXT4_EXTENT; + +typedef struct _ExtInode +{ + USHORT Mode; + USHORT UID; + ULONG Size; + ULONG Atime; + ULONG Ctime; + ULONG Mtime; + ULONG Dtime; + USHORT GID; + USHORT LinksCount; + ULONG BlocksCount; + ULONG Flags; + ULONG OSD1; + union + { + CHAR SymLink[60]; + struct + { + ULONG DirectBlocks[12]; + ULONG IndirectBlock; + ULONG DoubleIndirectBlock; + ULONG TripleIndirectBlock; + } Blocks; + EXT4_EXTENT_HEADER ExtentHeader; + }; + ULONG Generation; + ULONG FileACL; + ULONG DirACL; + ULONG FragAddress; + ULONG OSD2[3]; +} EXT_INODE, *PEXT_INODE; + +typedef struct _ExtDirEntry +{ + ULONG Inode; + USHORT EntryLen; + UCHAR NameLen; + UCHAR FileType; + CHAR Name[EXT_DIR_ENTRY_MAX_NAME_LENGTH]; +} EXT_DIR_ENTRY, *PEXT_DIR_ENTRY; -typedef struct ext_sblock EXT_SUPER_BLOCK, *PEXT_SUPER_BLOCK; -typedef struct ext_inode EXT_INODE, *PEXT_INODE; -typedef struct ext_block_group EXT_GROUP_DESC, *PEXT_GROUP_DESC; -typedef struct ext_dirent EXT_DIR_ENTRY, *PEXT_DIR_ENTRY; +#include <poppack.h> /* Special inode numbers. */ -#define EXT_ROOT_INO 2 +#define EXT_ROOT_INODE 2 + +/* The revision level. */ +#define EXT_REVISION(sb) (sb->RevisionLevel) -/* Feature set definitions. */ -#define EXT3_FEATURE_INCOMPAT_SUPP 0x0002 +/* The inode size. */ +#define EXT_INODE_SIZE(sb) \ + (EXT_REVISION(sb) < EXT_DYNAMIC_REVISION ? EXT_DEFAULT_INODE_SIZE : sb->InodeSize) -/* Log2 size of ext block in bytes. */ -#define LOG2_BLOCK_SIZE(sb) (sb->log2_block_size + 10) +/* The group descriptor size. */ +#define EXT_GROUP_DESC_SIZE(sb) \ + ((EXT_REVISION(sb) >= EXT_DYNAMIC_REVISION && sb->GroupDescSize) ? sb->GroupDescSize : EXT_DEFAULT_GROUP_DESC_SIZE) -/* The size of an ext block in bytes. */ -#define EXT_BLOCK_SIZE(sb) (((SIZE_T)1) << LOG2_BLOCK_SIZE(sb)) +/* The inode extents flag. */ +#define EXT4_INODE_FLAG_EXTENTS 0x80000 -/* The revision level. */ -#define EXT_REVISION(sb) (sb->revision_level) +/* The extent header magic value. */ +#define EXT4_EXTENT_HEADER_MAGIC 0xF30A -/* The inode size. */ -#define EXT_INODE_SIZE(sb) (EXT_REVISION(sb) == EXT_GOOD_OLD_REVISION \ - ? EXT_GOOD_OLD_INODE_SIZE \ - : sb->inode_size) +/* The maximum extent level. */ +#define EXT4_EXTENT_MAX_LEVEL 5 -#define EXT_DESC_PER_BLOCK(s) (EXT_BLOCK_SIZE(s) / sizeof(struct ext_block_group)) +/* The maximum extent length used to check for sparse extents. */ +#define EXT4_EXTENT_MAX_LENGTH 32768 // EXT_INODE::mode values -#define EXT_S_IRWXO 0x0007 // Other mask -#define EXT_S_IXOTH 0x0001 // ---------x execute -#define EXT_S_IWOTH 0x0002 // --------w- write -#define EXT_S_IROTH 0x0004 // -------r-- read - -#define EXT_S_IRWXG 0x0038 // Group mask -#define EXT_S_IXGRP 0x0008 // ------x--- execute -#define EXT_S_IWGRP 0x0010 // -----w---- write -#define EXT_S_IRGRP 0x0020 // ----r----- read - -#define EXT_S_IRWXU 0x01C0 // User mask -#define EXT_S_IXUSR 0x0040 // ---x------ execute -#define EXT_S_IWUSR 0x0080 // --w------- write -#define EXT_S_IRUSR 0x0100 // -r-------- read - -#define EXT_S_ISVTX 0x0200 // Sticky bit -#define EXT_S_ISGID 0x0400 // SGID -#define EXT_S_ISUID 0x0800 // SUID - -#define EXT_S_IFMT 0xF000 // Format mask -#define EXT_S_IFIFO 0x1000 // FIFO buffer -#define EXT_S_IFCHR 0x2000 // Character device -#define EXT_S_IFDIR 0x4000 // Directory -#define EXT_S_IFBLK 0x6000 // Block device -#define EXT_S_IFREG 0x8000 // Regular file -#define EXT_S_IFLNK 0xA000 // Symbolic link -#define EXT_S_IFSOCK 0xC000 // Socket - -#define FAST_SYMLINK_MAX_NAME_SIZE 60 +#define EXT_S_IRWXO 0x0007 // Other mask +#define EXT_S_IXOTH 0x0001 // ---------x execute +#define EXT_S_IWOTH 0x0002 // --------w- write +#define EXT_S_IROTH 0x0004 // -------r-- read + +#define EXT_S_IRWXG 0x0038 // Group mask +#define EXT_S_IXGRP 0x0008 // ------x--- execute +#define EXT_S_IWGRP 0x0010 // -----w---- write +#define EXT_S_IRGRP 0x0020 // ----r----- read + +#define EXT_S_IRWXU 0x01C0 // User mask +#define EXT_S_IXUSR 0x0040 // ---x------ execute +#define EXT_S_IWUSR 0x0080 // --w------- write +#define EXT_S_IRUSR 0x0100 // -r-------- read + +#define EXT_S_ISVTX 0x0200 // Sticky bit +#define EXT_S_ISGID 0x0400 // SGID +#define EXT_S_ISUID 0x0800 // SUID + +#define EXT_S_IFMT 0xF000 // Format mask +#define EXT_S_IFIFO 0x1000 // FIFO buffer +#define EXT_S_IFCHR 0x2000 // Character device +#define EXT_S_IFDIR 0x4000 // Directory +#define EXT_S_IFBLK 0x6000 // Block device +#define EXT_S_IFREG 0x8000 // Regular file +#define EXT_S_IFLNK 0xA000 // Symbolic link +#define EXT_S_IFSOCK 0xC000 // Socket + +#define FAST_SYMLINK_MAX_NAME_SIZE 60 typedef struct _EXT_VOLUME_INFO *PEXT_VOLUME_INFO; -typedef struct +typedef struct _EXT_FILE_INFO { - ULONGLONG FileSize; // File size - ULONGLONG FilePointer; // File pointer - ULONG* FileBlockList; // File block list - EXT_INODE Inode; // File's inode - PEXT_VOLUME_INFO Volume; -} EXT_FILE_INFO, * PEXT_FILE_INFO; + ULONGLONG FileSize; // File size + ULONGLONG FilePointer; // File pointer + PULONG FileBlockList; // File block list + EXT_INODE Inode; // File's inode + PEXT_VOLUME_INFO Volume; +} EXT_FILE_INFO, *PEXT_FILE_INFO; const DEVVTBL* ExtMount(ULONG DeviceId); diff --git a/boot/freeldr/freeldr/lib/fs/ext.c b/boot/freeldr/freeldr/lib/fs/ext.c index 1197e4566b2..6503bfca2f0 100644 --- a/boot/freeldr/freeldr/lib/fs/ext.c +++ b/boot/freeldr/freeldr/lib/fs/ext.c @@ -1,6 +1,7 @@ /* * FreeLoader * Copyright (C) 1998-2003 Brian Palmer <brianp(a)sginet.com> + * Copyright (C) 2024-2025 Daniel Victor <ilauncherdeveloper(a)gmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,6 +55,8 @@ typedef struct _EXT_VOLUME_INFO ULONG BlockSizeInSectors; // Block size in sectors ULONG FragmentSizeInBytes; // Fragment size in bytes ULONG FragmentSizeInSectors; // Fragment size in sectors + ULONG InodeSizeInBytes; // Inode size in bytes + ULONG GroupDescSizeInBytes; // Group descriptor size in bytes ULONG GroupCount; // Number of groups in this file system ULONG InodesPerBlock; // Number of inodes in one block ULONG GroupDescPerBlock; // Number of group descriptors in one block @@ -104,11 +107,11 @@ PEXT_FILE_INFO ExtOpenFile(PEXT_VOLUME_INFO Volume, PCSTR FileName) { EXT_FILE_INFO TempExtFileInfo; PEXT_FILE_INFO FileHandle; - CHAR SymLinkPath[EXT_NAME_LEN]; - CHAR FullPath[EXT_NAME_LEN * 2]; + CHAR SymLinkPath[EXT_DIR_ENTRY_MAX_NAME_LENGTH]; + CHAR FullPath[EXT_DIR_ENTRY_MAX_NAME_LENGTH * 2]; ULONG_PTR Index; - TRACE("ExtOpenFile() FileName = %s\n", FileName); + TRACE("ExtOpenFile() FileName = \"%s\"\n", FileName); RtlZeroMemory(SymLinkPath, sizeof(SymLinkPath)); @@ -120,7 +123,7 @@ PEXT_FILE_INFO ExtOpenFile(PEXT_VOLUME_INFO Volume, PCSTR FileName) // If we got a symbolic link then fix up the path // and re-call this function - if ((TempExtFileInfo.Inode.mode & EXT_S_IFMT) == EXT_S_IFLNK) + if ((TempExtFileInfo.Inode.Mode & EXT_S_IFMT) == EXT_S_IFLNK) { TRACE("File is a symbolic link\n"); @@ -135,14 +138,14 @@ PEXT_FILE_INFO ExtOpenFile(PEXT_VOLUME_INFO Volume, PCSTR FileName) return NULL; } - TRACE("Symbolic link path = %s\n", SymLinkPath); + TRACE("Symbolic link path = \"%s\"\n", SymLinkPath); // Get the full path if (SymLinkPath[0] == '/' || SymLinkPath[0] == '\\') { // Symbolic link is an absolute path // So copy it to FullPath, but skip over - // the '/' char at the beginning + // the '/' character at the beginning strcpy(FullPath, &SymLinkPath[1]); } else @@ -167,7 +170,7 @@ PEXT_FILE_INFO ExtOpenFile(PEXT_VOLUME_INFO Volume, PCSTR FileName) strcat(FullPath, SymLinkPath); } - TRACE("Full file path = %s\n", FullPath); + TRACE("Full file path = \"%s\"\n", FullPath); if (TempExtFileInfo.FileBlockList != NULL) { @@ -208,11 +211,11 @@ BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO Ex ULONG NumberOfPathParts; CHAR PathPart[261]; PVOID DirectoryBuffer; - ULONG DirectoryInode = EXT_ROOT_INO; + ULONG DirectoryInode = EXT_ROOT_INODE; EXT_INODE InodeData; EXT_DIR_ENTRY DirectoryEntry; - TRACE("ExtLookupFile() FileName = %s\n", FileName); + TRACE("ExtLookupFile() FileName = \"%s\"\n", FileName); RtlZeroMemory(ExtFileInfo, sizeof(EXT_FILE_INFO)); @@ -261,7 +264,7 @@ BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO Ex FrLdrTempFree(DirectoryBuffer, TAG_EXT_BUFFER); - DirectoryInode = DirectoryEntry.inode; + DirectoryInode = DirectoryEntry.Inode; } if (!ExtReadInode(Volume, DirectoryInode, &InodeData)) @@ -269,8 +272,8 @@ BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO Ex return FALSE; } - if (((InodeData.mode & EXT_S_IFMT) != EXT_S_IFREG) && - ((InodeData.mode & EXT_S_IFMT) != EXT_S_IFLNK)) + if (((InodeData.Mode & EXT_S_IFMT) != EXT_S_IFREG) && + ((InodeData.Mode & EXT_S_IFMT) != EXT_S_IFLNK)) { FileSystemError("Inode is not a regular file or symbolic link."); return FALSE; @@ -282,8 +285,8 @@ BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO Ex // If it's a regular file or a regular symbolic link // then get the block pointer list otherwise it must // be a fast symbolic link which doesn't have a block list - if (((InodeData.mode & EXT_S_IFMT) == EXT_S_IFREG) || - ((InodeData.mode & EXT_S_IFMT) == EXT_S_IFLNK && InodeData.size > FAST_SYMLINK_MAX_NAME_SIZE)) + if (((InodeData.Mode & EXT_S_IFMT) == EXT_S_IFREG) || + ((InodeData.Mode & EXT_S_IFMT) == EXT_S_IFLNK && InodeData.Size > FAST_SYMLINK_MAX_NAME_SIZE)) { ExtFileInfo->FileBlockList = ExtReadBlockPointerList(Volume, &InodeData); if (ExtFileInfo->FileBlockList == NULL) @@ -305,50 +308,49 @@ BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO Ex BOOLEAN ExtSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT_DIR_ENTRY DirectoryEntry) { - ULONG CurrentOffset; - PEXT_DIR_ENTRY CurrentDirectoryEntry; + ULONG CurrentOffset = 0; + PEXT_DIR_ENTRY CurrentDirectoryEntry; - TRACE("ExtSearchDirectoryBufferForFile() DirectoryBuffer = 0x%x DirectorySize = %d FileName = %s\n", DirectoryBuffer, DirectorySize, FileName); + TRACE("ExtSearchDirectoryBufferForFile() DirectoryBuffer = 0x%x DirectorySize = %d FileName = \"%s\"\n", DirectoryBuffer, DirectorySize, FileName); - for (CurrentOffset=0; CurrentOffset<DirectorySize; ) + while (CurrentOffset < DirectorySize) { CurrentDirectoryEntry = (PEXT_DIR_ENTRY)((ULONG_PTR)DirectoryBuffer + CurrentOffset); - if (CurrentDirectoryEntry->direntlen == 0) - { + if (!CurrentDirectoryEntry->EntryLen) break; - } - if ((CurrentDirectoryEntry->direntlen + CurrentOffset) > DirectorySize) + if ((CurrentDirectoryEntry->EntryLen + CurrentOffset) > DirectorySize) { FileSystemError("Directory entry extends past end of directory file."); return FALSE; } - TRACE("Dumping directory entry at offset %d:\n", CurrentOffset); - DbgDumpBuffer(DPRINT_FILESYSTEM, CurrentDirectoryEntry, CurrentDirectoryEntry->direntlen); + if (!CurrentDirectoryEntry->Inode) + goto NextDirectoryEntry; - if ((_strnicmp(FileName, CurrentDirectoryEntry->name, CurrentDirectoryEntry->namelen) == 0) && - (strlen(FileName) == CurrentDirectoryEntry->namelen)) + TRACE("EXT Directory Entry:\n"); + TRACE("Inode = %d\n", CurrentDirectoryEntry->Inode); + TRACE("EntryLen = %d\n", CurrentDirectoryEntry->EntryLen); + TRACE("NameLen = %d\n", CurrentDirectoryEntry->NameLen); + TRACE("FileType = %d\n", CurrentDirectoryEntry->FileType); + TRACE("Name = \""); + for (ULONG NameOffset = 0; NameOffset < CurrentDirectoryEntry->NameLen; NameOffset++) { - RtlCopyMemory(DirectoryEntry, CurrentDirectoryEntry, sizeof(EXT_DIR_ENTRY)); + TRACE("%c", CurrentDirectoryEntry->Name[NameOffset]); + } + TRACE("\"\n\n"); - TRACE("EXT Directory Entry:\n"); - TRACE("inode = %d\n", DirectoryEntry->inode); - TRACE("direntlen = %d\n", DirectoryEntry->direntlen); - TRACE("namelen = %d\n", DirectoryEntry->namelen); - TRACE("filetype = %d\n", DirectoryEntry->filetype); - TRACE("name = "); - for (CurrentOffset=0; CurrentOffset<DirectoryEntry->namelen; CurrentOffset++) - { - TRACE("%c", DirectoryEntry->name[CurrentOffset]); - } - TRACE("\n"); + if (strlen(FileName) == CurrentDirectoryEntry->NameLen && + !_strnicmp(FileName, CurrentDirectoryEntry->Name, CurrentDirectoryEntry->NameLen)) + { + RtlCopyMemory(DirectoryEntry, CurrentDirectoryEntry, sizeof(EXT_DIR_ENTRY)); return TRUE; } - CurrentOffset += CurrentDirectoryEntry->direntlen; +NextDirectoryEntry: + CurrentOffset += CurrentDirectoryEntry->EntryLen; } return FALSE; @@ -380,7 +382,7 @@ BOOLEAN ExtReadFileBig(PEXT_FILE_INFO ExtFileInfo, ULONGLONG BytesToRead, ULONGL { // Block pointer list is NULL // so this better be a fast symbolic link or else - if (((ExtFileInfo->Inode.mode & EXT_S_IFMT) != EXT_S_IFLNK) || + if (((ExtFileInfo->Inode.Mode & EXT_S_IFMT) != EXT_S_IFLNK) || (ExtFileInfo->FileSize > FAST_SYMLINK_MAX_NAME_SIZE)) { FileSystemError("Block pointer list is NULL and file is not a fast symbolic link."); @@ -408,13 +410,13 @@ BOOLEAN ExtReadFileBig(PEXT_FILE_INFO ExtFileInfo, ULONGLONG BytesToRead, ULONGL // Check if this is a fast symbolic link // if so then the read is easy - if (((ExtFileInfo->Inode.mode & EXT_S_IFMT) == EXT_S_IFLNK) && + if (((ExtFileInfo->Inode.Mode & EXT_S_IFMT) == EXT_S_IFLNK) && (ExtFileInfo->FileSize <= FAST_SYMLINK_MAX_NAME_SIZE)) { TRACE("Reading fast symbolic link data\n"); // Copy the data from the link - RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)ExtFileInfo->FilePointer + ExtFileInfo->Inode.symlink), (ULONG)BytesToRead); + RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)ExtFileInfo->FilePointer + ExtFileInfo->Inode.SymLink), (ULONG)BytesToRead); if (BytesRead != NULL) { @@ -615,94 +617,96 @@ BOOLEAN ExtReadSuperBlock(PEXT_VOLUME_INFO Volume) return FALSE; TRACE("Dumping super block:\n"); - TRACE("total_inodes: %d\n", SuperBlock->total_inodes); - TRACE("total_blocks: %d\n", SuperBlock->total_blocks); - TRACE("reserved_blocks: %d\n", SuperBlock->reserved_blocks); - TRACE("free_blocks: %d\n", SuperBlock->free_blocks); - TRACE("free_inodes: %d\n", SuperBlock->free_inodes); - TRACE("first_data_block: %d\n", SuperBlock->first_data_block); - TRACE("log2_block_size: %d\n", SuperBlock->log2_block_size); - TRACE("log2_fragment_size: %d\n", SuperBlock->log2_fragment_size); - TRACE("blocks_per_group: %d\n", SuperBlock->blocks_per_group); - TRACE("fragments_per_group: %d\n", SuperBlock->fragments_per_group); - TRACE("inodes_per_group: %d\n", SuperBlock->inodes_per_group); - TRACE("mtime: %d\n", SuperBlock->mtime); - TRACE("utime: %d\n", SuperBlock->utime); - TRACE("mnt_count: %d\n", SuperBlock->mnt_count); - TRACE("max_mnt_count: %d\n", SuperBlock->max_mnt_count); - TRACE("magic: 0x%x\n", SuperBlock->magic); - TRACE("fs_state: %d\n", SuperBlock->fs_state); - TRACE("error_handling: %d\n", SuperBlock->error_handling); - TRACE("minor_revision_level: %d\n", SuperBlock->minor_revision_level); - TRACE("lastcheck: %d\n", SuperBlock->lastcheck); - TRACE("checkinterval: %d\n", SuperBlock->checkinterval); - TRACE("creator_os: %d\n", SuperBlock->creator_os); - TRACE("revision_level: %d\n", SuperBlock->revision_level); - TRACE("uid_reserved: %d\n", SuperBlock->uid_reserved); - TRACE("gid_reserved: %d\n", SuperBlock->gid_reserved); - TRACE("first_inode: %d\n", SuperBlock->first_inode); - TRACE("inode_size: %d\n", SuperBlock->inode_size); - TRACE("block_group_number: %d\n", SuperBlock->block_group_number); - TRACE("feature_compatibility: 0x%x\n", SuperBlock->feature_compatibility); - TRACE("feature_incompat: 0x%x\n", SuperBlock->feature_incompat); - TRACE("feature_ro_compat: 0x%x\n", SuperBlock->feature_ro_compat); - TRACE("unique_id = { 0x%x, 0x%x, 0x%x, 0x%x }\n", - SuperBlock->unique_id[0], SuperBlock->unique_id[1], - SuperBlock->unique_id[2], SuperBlock->unique_id[3]); - TRACE("volume_name = '%.16s'\n", SuperBlock->volume_name); - TRACE("last_mounted_on = '%.64s'\n", SuperBlock->last_mounted_on); - TRACE("compression_info = 0x%x\n", SuperBlock->compression_info); + TRACE("InodesCount: %d\n", SuperBlock->InodesCount); + TRACE("BlocksCountLo: %d\n", SuperBlock->BlocksCountLo); + TRACE("RBlocksCountLo: %d\n", SuperBlock->RBlocksCountLo); + TRACE("FreeBlocksCountLo: %d\n", SuperBlock->FreeBlocksCountLo); + TRACE("FreeInodesCount: %d\n", SuperBlock->FreeInodesCount); + TRACE("FirstDataBlock: %d\n", SuperBlock->FirstDataBlock); + TRACE("LogBlockSize: %d\n", SuperBlock->LogBlockSize); + TRACE("LogFragSize: %d\n", SuperBlock->LogFragSize); + TRACE("BlocksPerGroup: %d\n", SuperBlock->BlocksPerGroup); + TRACE("FragsPerGroup: %d\n", SuperBlock->FragsPerGroup); + TRACE("InodesPerGroup: %d\n", SuperBlock->InodesPerGroup); + TRACE("MTime: %d\n", SuperBlock->MTime); + TRACE("WTime: %d\n", SuperBlock->WTime); + TRACE("MntCount: %d\n", SuperBlock->MntCount); + TRACE("MaxMntCount: %d\n", SuperBlock->MaxMntCount); + TRACE("Magic: 0x%x\n", SuperBlock->Magic); + TRACE("State: 0x%x\n", SuperBlock->State); + TRACE("Errors: 0x%x\n", SuperBlock->Errors); + TRACE("MinorRevisionLevel: %d\n", SuperBlock->MinorRevisionLevel); + TRACE("LastCheck: %d\n", SuperBlock->LastCheck); + TRACE("CheckInterval: %d\n", SuperBlock->CheckInterval); + TRACE("CreatorOS: %d\n", SuperBlock->CreatorOS); + TRACE("RevisionLevel: %d\n", SuperBlock->RevisionLevel); + TRACE("DefResUID: %d\n", SuperBlock->DefResUID); + TRACE("DefResGID: %d\n", SuperBlock->DefResGID); + TRACE("FirstInode: %d\n", SuperBlock->FirstInode); + TRACE("InodeSize: %d\n", SuperBlock->InodeSize); + TRACE("BlockGroupNr: %d\n", SuperBlock->BlockGroupNr); + TRACE("FeatureCompat: 0x%x\n", SuperBlock->FeatureCompat); + TRACE("FeatureIncompat: 0x%x\n", SuperBlock->FeatureIncompat); + TRACE("FeatureROCompat: 0x%x\n", SuperBlock->FeatureROCompat); + TRACE("UUID: { "); + for (ULONG i = 0; i < sizeof(SuperBlock->UUID); i++) + { + TRACE("0x%02x", SuperBlock->UUID[i]); + if (i < sizeof(SuperBlock->UUID) - 1) + TRACE(", "); + } + TRACE(" }\n"); + TRACE("VolumeName: \"%s\"\n", SuperBlock->VolumeName); + TRACE("LastMounted: \"%s\"\n", SuperBlock->LastMounted); + TRACE("AlgorithmUsageBitmap: 0x%x\n", SuperBlock->AlgorithmUsageBitmap); + TRACE("PreallocBlocks: %d\n", SuperBlock->PreallocBlocks); + TRACE("PreallocDirBlocks: %d\n", SuperBlock->PreallocDirBlocks); + TRACE("ReservedGdtBlocks: %d\n", SuperBlock->ReservedGdtBlocks); + TRACE("JournalUUID: { "); + for (ULONG i = 0; i < sizeof(SuperBlock->JournalUUID); i++) + { + TRACE("0x%02x", SuperBlock->JournalUUID[i]); + if (i < sizeof(SuperBlock->JournalUUID) - 1) + TRACE(", "); + } + TRACE(" }\n"); + TRACE("JournalInum: %d\n", SuperBlock->JournalInum); + TRACE("JournalDev: %d\n", SuperBlock->JournalDev); + TRACE("LastOrphan: %d\n", SuperBlock->LastOrphan); + TRACE("HashSeed: { 0x%02x, 0x%02x, 0x%02x, 0x%02x }\n", + SuperBlock->HashSeed[0], SuperBlock->HashSeed[1], + SuperBlock->HashSeed[2], SuperBlock->HashSeed[3]); + TRACE("DefHashVersion: %d\n", SuperBlock->DefHashVersion); + TRACE("JournalBackupType: %d\n", SuperBlock->JournalBackupType); + TRACE("GroupDescSize: %d\n", SuperBlock->GroupDescSize); // // Check the super block magic // - if (SuperBlock->magic != EXT_MAGIC) + if (SuperBlock->Magic != EXT_SUPERBLOCK_MAGIC) { FileSystemError("Invalid super block magic (0xef53)"); return FALSE; } - // - // Check the revision level - // - if (SuperBlock->revision_level > EXT_DYNAMIC_REVISION) - { - FileSystemError("FreeLoader does not understand the revision of this EXT/EXT3 filesystem.\nPlease update FreeLoader."); - return FALSE; - } - - // - // Check the feature set - // Don't need to check the compatible or read-only compatible features - // because we only mount the filesystem as read-only - // - if ((SuperBlock->revision_level >= EXT_DYNAMIC_REVISION) && - (/*((SuperBlock->s_feature_compat & ~EXT3_FEATURE_COMPAT_SUPP) != 0) ||*/ - /*((SuperBlock->s_feature_ro_compat & ~EXT3_FEATURE_RO_COMPAT_SUPP) != 0) ||*/ - ((SuperBlock->feature_incompat & ~EXT3_FEATURE_INCOMPAT_SUPP) != 0))) - { - FileSystemError("FreeLoader does not understand features of this EXT/EXT3 filesystem.\nPlease update FreeLoader."); - return FALSE; - } - // Calculate the group count - Volume->GroupCount = (SuperBlock->total_blocks - SuperBlock->first_data_block + SuperBlock->blocks_per_group - 1) / SuperBlock->blocks_per_group; + Volume->GroupCount = (SuperBlock->BlocksCountLo - SuperBlock->FirstDataBlock + SuperBlock->BlocksPerGroup - 1) / SuperBlock->BlocksPerGroup; TRACE("ExtGroupCount: %d\n", Volume->GroupCount); // Calculate the block size - Volume->BlockSizeInBytes = 1024 << SuperBlock->log2_block_size; + Volume->BlockSizeInBytes = 1024 << SuperBlock->LogBlockSize; Volume->BlockSizeInSectors = Volume->BlockSizeInBytes / Volume->BytesPerSector; TRACE("ExtBlockSizeInBytes: %d\n", Volume->BlockSizeInBytes); TRACE("ExtBlockSizeInSectors: %d\n", Volume->BlockSizeInSectors); // Calculate the fragment size - if (SuperBlock->log2_fragment_size >= 0) + if (SuperBlock->LogFragSize >= 0) { - Volume->FragmentSizeInBytes = 1024 << SuperBlock->log2_fragment_size; + Volume->FragmentSizeInBytes = 1024 << SuperBlock->LogFragSize; } else { - Volume->FragmentSizeInBytes = 1024 >> -(SuperBlock->log2_fragment_size); + Volume->FragmentSizeInBytes = 1024 >> -(SuperBlock->LogFragSize); } Volume->FragmentSizeInSectors = Volume->FragmentSizeInBytes / Volume->BytesPerSector; TRACE("ExtFragmentSizeInBytes: %d\n", Volume->FragmentSizeInBytes); @@ -715,12 +719,20 @@ BOOLEAN ExtReadSuperBlock(PEXT_VOLUME_INFO Volume) return FALSE; } + // Set the volume inode size in bytes + Volume->InodeSizeInBytes = EXT_INODE_SIZE(SuperBlock); + TRACE("InodeSizeInBytes: %d\n", Volume->InodeSizeInBytes); + + // Set the volume group descriptor size in bytes + Volume->GroupDescSizeInBytes = EXT_GROUP_DESC_SIZE(SuperBlock); + TRACE("GroupDescSizeInBytes: %d\n", Volume->GroupDescSizeInBytes); + // Calculate the number of inodes in one block - Volume->InodesPerBlock = Volume->BlockSizeInBytes / EXT_INODE_SIZE(SuperBlock); + Volume->InodesPerBlock = Volume->BlockSizeInBytes / Volume->InodeSizeInBytes; TRACE("ExtInodesPerBlock: %d\n", Volume->InodesPerBlock); // Calculate the number of group descriptors in one block - Volume->GroupDescPerBlock = EXT_DESC_PER_BLOCK(SuperBlock); + Volume->GroupDescPerBlock = Volume->BlockSizeInBytes / Volume->GroupDescSizeInBytes; TRACE("ExtGroupDescPerBlock: %d\n", Volume->GroupDescPerBlock); return TRUE; @@ -752,7 +764,7 @@ BOOLEAN ExtReadGroupDescriptors(PEXT_VOLUME_INFO Volume) // Now read the group descriptors CurrentGroupDescBlock = (PUCHAR)Volume->GroupDescriptors; - BlockNumber = Volume->SuperBlock->first_data_block + 1; + BlockNumber = Volume->SuperBlock->FirstDataBlock + 1; while (GroupDescBlockCount--) { @@ -781,7 +793,7 @@ BOOLEAN ExtReadDirectory(PEXT_VOLUME_INFO Volume, ULONG Inode, PVOID* DirectoryB } // Make sure it is a directory inode - if ((InodePointer->mode & EXT_S_IFMT) != EXT_S_IFDIR) + if ((InodePointer->Mode & EXT_S_IFMT) != EXT_S_IFDIR) { FileSystemError("Inode is not a directory."); return FALSE; @@ -835,7 +847,7 @@ BOOLEAN ExtReadBlock(PEXT_VOLUME_INFO Volume, ULONG BlockNumber, PVOID Buffer) TRACE("ExtReadBlock() BlockNumber = %d Buffer = 0x%x\n", BlockNumber, Buffer); // Make sure its a valid block - if (BlockNumber > Volume->SuperBlock->total_blocks) + if (BlockNumber > Volume->SuperBlock->BlocksCountLo) { sprintf(ErrorString, "Error reading block %d - block out of range.", (int) BlockNumber); FileSystemError(ErrorString); @@ -880,31 +892,19 @@ BOOLEAN ExtReadPartialBlock(PEXT_VOLUME_INFO Volume, ULONG BlockNumber, ULONG St return TRUE; } -#if 0 -ULONG ExtGetGroupDescBlockNumber(PEXT_VOLUME_INFO Volume, ULONG Group) -{ - return (((Group * sizeof(EXT_GROUP_DESC)) / Volume->GroupDescPerBlock) + Volume->SuperBlock->first_data_block + 1); -} - -ULONG ExtGetGroupDescOffsetInBlock(PEXT_VOLUME_INFO Volume, ULONG Group) -{ - return ((Group * sizeof(EXT_GROUP_DESC)) % Volume->GroupDescPerBlock); -} -#endif - ULONG ExtGetInodeGroupNumber(PEXT_VOLUME_INFO Volume, ULONG Inode) { - return ((Inode - 1) / Volume->SuperBlock->inodes_per_group); + return ((Inode - 1) / Volume->SuperBlock->InodesPerGroup); } ULONG ExtGetInodeBlockNumber(PEXT_VOLUME_INFO Volume, ULONG Inode) { - return (((Inode - 1) % Volume->SuperBlock->inodes_per_group) / Volume->InodesPerBlock); + return (((Inode - 1) % Volume->SuperBlock->InodesPerGroup) / Volume->InodesPerBlock); } ULONG ExtGetInodeOffsetInBlock(PEXT_VOLUME_INFO Volume, ULONG Inode) { - return (((Inode - 1) % Volume->SuperBlock->inodes_per_group) % Volume->InodesPerBlock); + return (((Inode - 1) % Volume->SuperBlock->InodesPerGroup) % Volume->InodesPerBlock); } BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBuffer) @@ -918,7 +918,7 @@ BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBuffe TRACE("ExtReadInode() Inode = %d\n", Inode); // Make sure its a valid inode - if ((Inode < 1) || (Inode > Volume->SuperBlock->total_inodes)) + if ((Inode < 1) || (Inode > Volume->SuperBlock->InodesCount)) { sprintf(ErrorString, "Error reading inode %ld - inode out of range.", Inode); FileSystemError(ErrorString); @@ -940,13 +940,13 @@ BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBuffe } // Add the start block of the inode table to the inode block number - InodeBlockNumber += GroupDescriptor.inode_table_id; + InodeBlockNumber += GroupDescriptor.InodeTable; TRACE("InodeBlockNumber (after group desc correction) = %d\n", InodeBlockNumber); // Read the block if (!ExtReadPartialBlock(Volume, InodeBlockNumber, - (InodeOffsetInBlock * EXT_INODE_SIZE(Volume->SuperBlock)), + (InodeOffsetInBlock * Volume->InodeSizeInBytes), sizeof(EXT_INODE), InodeBuffer)) { @@ -954,31 +954,31 @@ BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBuffe } TRACE("Dumping inode information:\n"); - TRACE("mode = 0x%x\n", InodeBuffer->mode); - TRACE("uid = %d\n", InodeBuffer->uid); - TRACE("size = %d\n", InodeBuffer->size); - TRACE("atime = %d\n", InodeBuffer->atime); - TRACE("ctime = %d\n", InodeBuffer->ctime); - TRACE("mtime = %d\n", InodeBuffer->mtime); - TRACE("dtime = %d\n", InodeBuffer->dtime); - TRACE("gid = %d\n", InodeBuffer->gid); - TRACE("nlinks = %d\n", InodeBuffer->nlinks); - TRACE("blockcnt = %d\n", InodeBuffer->blockcnt); - TRACE("flags = 0x%x\n", InodeBuffer->flags); - TRACE("osd1 = 0x%x\n", InodeBuffer->osd1); - TRACE("dir_blocks = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n", - InodeBuffer->blocks.dir_blocks[0], InodeBuffer->blocks.dir_blocks[1], InodeBuffer->blocks.dir_blocks[ 2], InodeBuffer->blocks.dir_blocks[ 3], - InodeBuffer->blocks.dir_blocks[4], InodeBuffer->blocks.dir_blocks[5], InodeBuffer->blocks.dir_blocks[ 6], InodeBuffer->blocks.dir_blocks[ 7], - InodeBuffer->blocks.dir_blocks[8], InodeBuffer->blocks.dir_blocks[9], InodeBuffer->blocks.dir_blocks[10], InodeBuffer->blocks.dir_blocks[11]); - TRACE("indir_block = %u\n", InodeBuffer->blocks.indir_block); - TRACE("double_indir_block = %u\n", InodeBuffer->blocks.double_indir_block); - TRACE("tripple_indir_block = %u\n", InodeBuffer->blocks.tripple_indir_block); - TRACE("version = %d\n", InodeBuffer->version); - TRACE("acl = %d\n", InodeBuffer->acl); - TRACE("dir_acl = %d\n", InodeBuffer->dir_acl); - TRACE("fragment_addr = %d\n", InodeBuffer->fragment_addr); - TRACE("osd2 = { %d, %d, %d }\n", - InodeBuffer->osd2[0], InodeBuffer->osd2[1], InodeBuffer->osd2[2]); + TRACE("Mode = 0x%x\n", InodeBuffer->Mode); + TRACE("UID = %d\n", InodeBuffer->UID); + TRACE("Size = %d\n", InodeBuffer->Size); + TRACE("Atime = %d\n", InodeBuffer->Atime); + TRACE("Ctime = %d\n", InodeBuffer->Ctime); + TRACE("Mtime = %d\n", InodeBuffer->Mtime); + TRACE("Dtime = %d\n", InodeBuffer->Dtime); + TRACE("GID = %d\n", InodeBuffer->GID); + TRACE("LinksCount = %d\n", InodeBuffer->LinksCount); + TRACE("Blocks = %d\n", InodeBuffer->Blocks); + TRACE("Flags = 0x%x\n", InodeBuffer->Flags); + TRACE("OSD1 = 0x%x\n", InodeBuffer->OSD1); + TRACE("DirectBlocks = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n", + InodeBuffer->Blocks.DirectBlocks[0], InodeBuffer->Blocks.DirectBlocks[1], InodeBuffer->Blocks.DirectBlocks[2], InodeBuffer->Blocks.DirectBlocks[3], + InodeBuffer->Blocks.DirectBlocks[4], InodeBuffer->Blocks.DirectBlocks[5], InodeBuffer->Blocks.DirectBlocks[6], InodeBuffer->Blocks.DirectBlocks[7], + InodeBuffer->Blocks.DirectBlocks[8], InodeBuffer->Blocks.DirectBlocks[9], InodeBuffer->Blocks.DirectBlocks[10], InodeBuffer->Blocks.DirectBlocks[11]); + TRACE("IndirectBlock = %u\n", InodeBuffer->Blocks.IndirectBlock); + TRACE("DoubleIndirectBlock = %u\n", InodeBuffer->Blocks.DoubleIndirectBlock); + TRACE("TripleIndirectBlock = %u\n", InodeBuffer->Blocks.TripleIndirectBlock); + TRACE("Generation = %d\n", InodeBuffer->Generation); + TRACE("FileACL = %d\n", InodeBuffer->FileACL); + TRACE("DirACL = %d\n", InodeBuffer->DirACL); + TRACE("FragAddress = %d\n", InodeBuffer->FragAddress); + TRACE("OSD2 = { %d, %d, %d }\n", + InodeBuffer->OSD2[0], InodeBuffer->OSD2[1], InodeBuffer->OSD2[2]); return TRUE; } @@ -995,15 +995,15 @@ BOOLEAN ExtReadGroupDescriptor(PEXT_VOLUME_INFO Volume, ULONG Group, PEXT_GROUP_ RtlCopyMemory(GroupBuffer, (PVOID)(FILESYSBUFFER + ExtGetGroupDescOffsetInBlock(Volume, Group)), sizeof(EXT_GROUP_DESC)); #endif - RtlCopyMemory(GroupBuffer, &Volume->GroupDescriptors[Group], sizeof(EXT_GROUP_DESC)); + RtlCopyMemory(GroupBuffer, &((PUCHAR)Volume->GroupDescriptors)[Volume->GroupDescSizeInBytes * Group], sizeof(EXT_GROUP_DESC)); TRACE("Dumping group descriptor:\n"); - TRACE("block_id = %d\n", GroupBuffer->block_id); - TRACE("inode_id = %d\n", GroupBuffer->inode_id); - TRACE("inode_table_id = %d\n", GroupBuffer->inode_table_id); - TRACE("free_blocks = %d\n", GroupBuffer->free_blocks); - TRACE("free_inodes = %d\n", GroupBuffer->free_inodes); - TRACE("used_dirs = %d\n", GroupBuffer->used_dirs); + TRACE("BlockBitmap = %d\n", GroupBuffer->BlockBitmap); + TRACE("InodeBitmap = %d\n", GroupBuffer->InodeBitmap); + TRACE("InodeTable = %d\n", GroupBuffer->InodeTable); + TRACE("FreeBlocksCount = %d\n", GroupBuffer->FreeBlocksCount); + TRACE("FreeInodesCount = %d\n", GroupBuffer->FreeInodesCount); + TRACE("UsedDirsCount = %d\n", GroupBuffer->UsedDirsCount); return TRUE; } @@ -1039,16 +1039,16 @@ ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode) // Copy the direct block pointers for (CurrentBlockInList = CurrentBlock = 0; - CurrentBlockInList < BlockCount && CurrentBlock < INDIRECT_BLOCKS; + CurrentBlockInList < BlockCount && CurrentBlock < sizeof(Inode->Blocks.DirectBlocks) / sizeof(*Inode->Blocks.DirectBlocks); CurrentBlock++, CurrentBlockInList++) { - BlockList[CurrentBlockInList] = Inode->blocks.dir_blocks[CurrentBlock]; + BlockList[CurrentBlockInList] = Inode->Blocks.DirectBlocks[CurrentBlock]; } // Copy the indirect block pointers if (CurrentBlockInList < BlockCount) { - if (!ExtCopyIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.indir_block)) + if (!ExtCopyIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->Blocks.IndirectBlock)) { FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); return NULL; @@ -1058,7 +1058,7 @@ ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode) // Copy the double indirect block pointers if (CurrentBlockInList < BlockCount) { - if (!ExtCopyDoubleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.double_indir_block)) + if (!ExtCopyDoubleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->Blocks.DoubleIndirectBlock)) { FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); return NULL; @@ -1068,7 +1068,7 @@ ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode) // Copy the triple indirect block pointers if (CurrentBlockInList < BlockCount) { - if (!ExtCopyTripleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.tripple_indir_block)) + if (!ExtCopyTripleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->Blocks.TripleIndirectBlock)) { FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); return NULL; @@ -1080,13 +1080,13 @@ ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode) ULONGLONG ExtGetInodeFileSize(PEXT_INODE Inode) { - if ((Inode->mode & EXT_S_IFMT) == EXT_S_IFDIR) + if ((Inode->Mode & EXT_S_IFMT) == EXT_S_IFDIR) { - return (ULONGLONG)(Inode->size); + return (ULONGLONG)(Inode->Size); } else { - return ((ULONGLONG)(Inode->size) | ((ULONGLONG)(Inode->dir_acl) << 32)); + return ((ULONGLONG)(Inode->Size) | ((ULONGLONG)(Inode->DirACL) << 32)); } } @@ -1227,7 +1227,7 @@ ARC_STATUS ExtOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) DeviceId = FsGetDeviceId(*FileId); Volume = ExtVolumes[DeviceId]; - TRACE("ExtOpen() FileName = %s\n", Path); + TRACE("ExtOpen() FileName = \"%s\"\n", Path); /* Call the internal open method */ // Status = ExtOpenFile(Volume, Path, &FileHandle); @@ -1327,7 +1327,7 @@ const DEVVTBL* ExtMount(ULONG DeviceId) } /* Check if SuperBlock is valid. If yes, return Ext function table. */ - if (SuperBlock.magic != EXT_MAGIC) + if (SuperBlock.Magic != EXT_SUPERBLOCK_MAGIC) { FrLdrTempFree(Volume, TAG_EXT_VOLUME); return NULL; @@ -1350,4 +1350,4 @@ const DEVVTBL* ExtMount(ULONG DeviceId) return &ExtFuncTable; } -#endif +#endif // _M_ARM
1 week, 4 days
1
0
0
0
[reactos] 02/04: [FREELDR] Rename almost everything to `Ext`
by Daniel Victor
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=1f3083be75dd55f279a2a…
commit 1f3083be75dd55f279a2a3aaed460ddbc701c03d Author: Daniel Victor <ilauncherdeveloper(a)gmail.com> AuthorDate: Sun Jan 19 21:54:13 2025 -0300 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 20 19:28:41 2025 +0200 [FREELDR] Rename almost everything to `Ext` --- boot/freeldr/freeldr/include/fs/ext.h | 126 +++++----- boot/freeldr/freeldr/lib/fs/ext.c | 452 +++++++++++++++++----------------- boot/freeldr/freeldr/lib/fs/fs.c | 2 +- 3 files changed, 290 insertions(+), 290 deletions(-) diff --git a/boot/freeldr/freeldr/include/fs/ext.h b/boot/freeldr/freeldr/include/fs/ext.h index b1b3c7e8d38..733a731e555 100644 --- a/boot/freeldr/freeldr/include/fs/ext.h +++ b/boot/freeldr/freeldr/include/fs/ext.h @@ -39,19 +39,19 @@ * along with GRUB. If not, see <
http://www.gnu.org/licenses/
>. */ -/* Magic value used to identify an ext2 filesystem. */ -#define EXT2_MAGIC 0xEF53 +/* Magic value used to identify an ext filesystem. */ +#define EXT_MAGIC 0xEF53 /* Amount of indirect blocks in an inode. */ #define INDIRECT_BLOCKS 12 /* Maximum length of a pathname. */ -#define EXT2_PATH_MAX 4096 +#define EXT_PATH_MAX 4096 /* Maximum nesting of symlinks, used to prevent a loop. */ -#define EXT2_MAX_SYMLINKCNT 8 +#define EXT_MAX_SYMLINKCNT 8 /* The good old revision and the default inode size. */ -#define EXT2_GOOD_OLD_REVISION 0 -#define EXT2_DYNAMIC_REVISION 1 -#define EXT2_GOOD_OLD_INODE_SIZE 128 +#define EXT_GOOD_OLD_REVISION 0 +#define EXT_DYNAMIC_REVISION 1 +#define EXT_GOOD_OLD_INODE_SIZE 128 /* Filetype used in directory entry. */ #define FILETYPE_UNKNOWN 0 @@ -65,8 +65,8 @@ #define FILETYPE_INO_DIRECTORY 0040000 #define FILETYPE_INO_SYMLINK 0120000 -/* The ext2 superblock. */ -struct ext2_sblock +/* The ext superblock. */ +struct ext_sblock { ULONG total_inodes; ULONG total_blocks; @@ -106,8 +106,8 @@ struct ext2_sblock ULONG padding[77]; }; -/* The ext2 blockgroup. */ -struct ext2_block_group +/* The ext blockgroup. */ +struct ext_block_group { ULONG block_id; ULONG inode_id; @@ -119,8 +119,8 @@ struct ext2_block_group ULONG reserved[3]; }; -/* The ext2 inode. */ -struct ext2_inode +/* The ext inode. */ +struct ext_inode { USHORT mode; USHORT uid; @@ -152,89 +152,89 @@ struct ext2_inode ULONG osd2[3]; }; -/* The header of an ext2 directory entry. */ -#define EXT2_NAME_LEN 255 +/* The header of an ext directory entry. */ +#define EXT_NAME_LEN 255 -struct ext2_dirent +struct ext_dirent { ULONG inode; USHORT direntlen; UCHAR namelen; UCHAR filetype; - CHAR name[EXT2_NAME_LEN]; + CHAR name[EXT_NAME_LEN]; }; /* * End of code from grub/fs/ext2.c */ -typedef struct ext2_sblock EXT2_SUPER_BLOCK, *PEXT2_SUPER_BLOCK; -typedef struct ext2_inode EXT2_INODE, *PEXT2_INODE; -typedef struct ext2_block_group EXT2_GROUP_DESC, *PEXT2_GROUP_DESC; -typedef struct ext2_dirent EXT2_DIR_ENTRY, *PEXT2_DIR_ENTRY; +typedef struct ext_sblock EXT_SUPER_BLOCK, *PEXT_SUPER_BLOCK; +typedef struct ext_inode EXT_INODE, *PEXT_INODE; +typedef struct ext_block_group EXT_GROUP_DESC, *PEXT_GROUP_DESC; +typedef struct ext_dirent EXT_DIR_ENTRY, *PEXT_DIR_ENTRY; /* Special inode numbers. */ -#define EXT2_ROOT_INO 2 +#define EXT_ROOT_INO 2 /* Feature set definitions. */ #define EXT3_FEATURE_INCOMPAT_SUPP 0x0002 -/* Log2 size of ext2 block in bytes. */ +/* Log2 size of ext block in bytes. */ #define LOG2_BLOCK_SIZE(sb) (sb->log2_block_size + 10) -/* The size of an ext2 block in bytes. */ -#define EXT2_BLOCK_SIZE(sb) (((SIZE_T)1) << LOG2_BLOCK_SIZE(sb)) +/* The size of an ext block in bytes. */ +#define EXT_BLOCK_SIZE(sb) (((SIZE_T)1) << LOG2_BLOCK_SIZE(sb)) /* The revision level. */ -#define EXT2_REVISION(sb) (sb->revision_level) +#define EXT_REVISION(sb) (sb->revision_level) /* The inode size. */ -#define EXT2_INODE_SIZE(sb) (EXT2_REVISION(sb) == EXT2_GOOD_OLD_REVISION \ - ? EXT2_GOOD_OLD_INODE_SIZE \ +#define EXT_INODE_SIZE(sb) (EXT_REVISION(sb) == EXT_GOOD_OLD_REVISION \ + ? EXT_GOOD_OLD_INODE_SIZE \ : sb->inode_size) -#define EXT2_DESC_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof(struct ext2_block_group)) - -// EXT2_INODE::mode values -#define EXT2_S_IRWXO 0x0007 // Other mask -#define EXT2_S_IXOTH 0x0001 // ---------x execute -#define EXT2_S_IWOTH 0x0002 // --------w- write -#define EXT2_S_IROTH 0x0004 // -------r-- read - -#define EXT2_S_IRWXG 0x0038 // Group mask -#define EXT2_S_IXGRP 0x0008 // ------x--- execute -#define EXT2_S_IWGRP 0x0010 // -----w---- write -#define EXT2_S_IRGRP 0x0020 // ----r----- read - -#define EXT2_S_IRWXU 0x01C0 // User mask -#define EXT2_S_IXUSR 0x0040 // ---x------ execute -#define EXT2_S_IWUSR 0x0080 // --w------- write -#define EXT2_S_IRUSR 0x0100 // -r-------- read - -#define EXT2_S_ISVTX 0x0200 // Sticky bit -#define EXT2_S_ISGID 0x0400 // SGID -#define EXT2_S_ISUID 0x0800 // SUID - -#define EXT2_S_IFMT 0xF000 // Format mask -#define EXT2_S_IFIFO 0x1000 // FIFO buffer -#define EXT2_S_IFCHR 0x2000 // Character device -#define EXT2_S_IFDIR 0x4000 // Directory -#define EXT2_S_IFBLK 0x6000 // Block device -#define EXT2_S_IFREG 0x8000 // Regular file -#define EXT2_S_IFLNK 0xA000 // Symbolic link -#define EXT2_S_IFSOCK 0xC000 // Socket +#define EXT_DESC_PER_BLOCK(s) (EXT_BLOCK_SIZE(s) / sizeof(struct ext_block_group)) + +// EXT_INODE::mode values +#define EXT_S_IRWXO 0x0007 // Other mask +#define EXT_S_IXOTH 0x0001 // ---------x execute +#define EXT_S_IWOTH 0x0002 // --------w- write +#define EXT_S_IROTH 0x0004 // -------r-- read + +#define EXT_S_IRWXG 0x0038 // Group mask +#define EXT_S_IXGRP 0x0008 // ------x--- execute +#define EXT_S_IWGRP 0x0010 // -----w---- write +#define EXT_S_IRGRP 0x0020 // ----r----- read + +#define EXT_S_IRWXU 0x01C0 // User mask +#define EXT_S_IXUSR 0x0040 // ---x------ execute +#define EXT_S_IWUSR 0x0080 // --w------- write +#define EXT_S_IRUSR 0x0100 // -r-------- read + +#define EXT_S_ISVTX 0x0200 // Sticky bit +#define EXT_S_ISGID 0x0400 // SGID +#define EXT_S_ISUID 0x0800 // SUID + +#define EXT_S_IFMT 0xF000 // Format mask +#define EXT_S_IFIFO 0x1000 // FIFO buffer +#define EXT_S_IFCHR 0x2000 // Character device +#define EXT_S_IFDIR 0x4000 // Directory +#define EXT_S_IFBLK 0x6000 // Block device +#define EXT_S_IFREG 0x8000 // Regular file +#define EXT_S_IFLNK 0xA000 // Symbolic link +#define EXT_S_IFSOCK 0xC000 // Socket #define FAST_SYMLINK_MAX_NAME_SIZE 60 -typedef struct _EXT2_VOLUME_INFO *PEXT2_VOLUME_INFO; +typedef struct _EXT_VOLUME_INFO *PEXT_VOLUME_INFO; typedef struct { ULONGLONG FileSize; // File size ULONGLONG FilePointer; // File pointer ULONG* FileBlockList; // File block list - EXT2_INODE Inode; // File's inode - PEXT2_VOLUME_INFO Volume; -} EXT2_FILE_INFO, * PEXT2_FILE_INFO; + EXT_INODE Inode; // File's inode + PEXT_VOLUME_INFO Volume; +} EXT_FILE_INFO, * PEXT_FILE_INFO; -const DEVVTBL* Ext2Mount(ULONG DeviceId); +const DEVVTBL* ExtMount(ULONG DeviceId); diff --git a/boot/freeldr/freeldr/lib/fs/ext.c b/boot/freeldr/freeldr/lib/fs/ext.c index 6ff59398f29..1197e4566b2 100644 --- a/boot/freeldr/freeldr/lib/fs/ext.c +++ b/boot/freeldr/freeldr/lib/fs/ext.c @@ -23,32 +23,32 @@ #include <debug.h> DBG_DEFAULT_CHANNEL(FILESYSTEM); -BOOLEAN Ext2OpenVolume(PEXT2_VOLUME_INFO Volume); -PEXT2_FILE_INFO Ext2OpenFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName); -BOOLEAN Ext2LookupFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfo); -BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT2_DIR_ENTRY DirectoryEntry); -BOOLEAN Ext2ReadVolumeSectors(PEXT2_VOLUME_INFO Volume, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); - -BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer); -BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume); -BOOLEAN Ext2ReadGroupDescriptors(PEXT2_VOLUME_INFO Volume); -BOOLEAN Ext2ReadDirectory(PEXT2_VOLUME_INFO Volume, ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE InodePointer); -BOOLEAN Ext2ReadBlock(PEXT2_VOLUME_INFO Volume, ULONG BlockNumber, PVOID Buffer); -BOOLEAN Ext2ReadPartialBlock(PEXT2_VOLUME_INFO Volume, ULONG BlockNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer); -BOOLEAN Ext2ReadInode(PEXT2_VOLUME_INFO Volume, ULONG Inode, PEXT2_INODE InodeBuffer); -BOOLEAN Ext2ReadGroupDescriptor(PEXT2_VOLUME_INFO Volume, ULONG Group, PEXT2_GROUP_DESC GroupBuffer); -ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode); -ULONGLONG Ext2GetInodeFileSize(PEXT2_INODE Inode); -BOOLEAN Ext2CopyIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock); -BOOLEAN Ext2CopyDoubleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock); -BOOLEAN Ext2CopyTripleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock); - -typedef struct _EXT2_VOLUME_INFO +BOOLEAN ExtOpenVolume(PEXT_VOLUME_INFO Volume); +PEXT_FILE_INFO ExtOpenFile(PEXT_VOLUME_INFO Volume, PCSTR FileName); +BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO ExtFileInfo); +BOOLEAN ExtSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT_DIR_ENTRY DirectoryEntry); +BOOLEAN ExtReadVolumeSectors(PEXT_VOLUME_INFO Volume, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); + +BOOLEAN ExtReadFileBig(PEXT_FILE_INFO ExtFileInfo, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer); +BOOLEAN ExtReadSuperBlock(PEXT_VOLUME_INFO Volume); +BOOLEAN ExtReadGroupDescriptors(PEXT_VOLUME_INFO Volume); +BOOLEAN ExtReadDirectory(PEXT_VOLUME_INFO Volume, ULONG Inode, PVOID* DirectoryBuffer, PEXT_INODE InodePointer); +BOOLEAN ExtReadBlock(PEXT_VOLUME_INFO Volume, ULONG BlockNumber, PVOID Buffer); +BOOLEAN ExtReadPartialBlock(PEXT_VOLUME_INFO Volume, ULONG BlockNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer); +BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBuffer); +BOOLEAN ExtReadGroupDescriptor(PEXT_VOLUME_INFO Volume, ULONG Group, PEXT_GROUP_DESC GroupBuffer); +ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode); +ULONGLONG ExtGetInodeFileSize(PEXT_INODE Inode); +BOOLEAN ExtCopyIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock); +BOOLEAN ExtCopyDoubleIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock); +BOOLEAN ExtCopyTripleIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock); + +typedef struct _EXT_VOLUME_INFO { ULONG BytesPerSector; // Usually 512... - PEXT2_SUPER_BLOCK SuperBlock; // Ext2 file system super block - PEXT2_GROUP_DESC GroupDescriptors; // Ext2 file system group descriptors + PEXT_SUPER_BLOCK SuperBlock; // Ext file system super block + PEXT_GROUP_DESC GroupDescriptors; // Ext file system group descriptors ULONG BlockSizeInBytes; // Block size in bytes ULONG BlockSizeInSectors; // Block size in sectors @@ -58,11 +58,11 @@ typedef struct _EXT2_VOLUME_INFO ULONG InodesPerBlock; // Number of inodes in one block ULONG GroupDescPerBlock; // Number of group descriptors in one block - ULONG DeviceId; // Ext2 file system device ID + ULONG DeviceId; // Ext file system device ID -} EXT2_VOLUME_INFO; +} EXT_VOLUME_INFO; -PEXT2_VOLUME_INFO Ext2Volumes[MAX_FDS]; +PEXT_VOLUME_INFO ExtVolumes[MAX_FDS]; #define TAG_EXT_BLOCK_LIST 'LtxE' #define TAG_EXT_FILE 'FtxE' @@ -71,9 +71,9 @@ PEXT2_VOLUME_INFO Ext2Volumes[MAX_FDS]; #define TAG_EXT_GROUP_DESC 'GtxE' #define TAG_EXT_VOLUME 'VtxE' -BOOLEAN Ext2OpenVolume(PEXT2_VOLUME_INFO Volume) +BOOLEAN ExtOpenVolume(PEXT_VOLUME_INFO Volume) { - TRACE("Ext2OpenVolume() DeviceId = %d\n", Volume->DeviceId); + TRACE("ExtOpenVolume() DeviceId = %d\n", Volume->DeviceId); #if 0 /* Initialize the disk cache for this drive */ @@ -85,51 +85,51 @@ BOOLEAN Ext2OpenVolume(PEXT2_VOLUME_INFO Volume) Volume->BytesPerSector = SECTOR_SIZE; /* Read in the super block */ - if (!Ext2ReadSuperBlock(Volume)) + if (!ExtReadSuperBlock(Volume)) return FALSE; /* Read in the group descriptors */ - if (!Ext2ReadGroupDescriptors(Volume)) + if (!ExtReadGroupDescriptors(Volume)) return FALSE; return TRUE; } /* - * Ext2OpenFile() + * ExtOpenFile() * Tries to open the file 'name' and returns true or false * for success and failure respectively */ -PEXT2_FILE_INFO Ext2OpenFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName) +PEXT_FILE_INFO ExtOpenFile(PEXT_VOLUME_INFO Volume, PCSTR FileName) { - EXT2_FILE_INFO TempExt2FileInfo; - PEXT2_FILE_INFO FileHandle; - CHAR SymLinkPath[EXT2_NAME_LEN]; - CHAR FullPath[EXT2_NAME_LEN * 2]; + EXT_FILE_INFO TempExtFileInfo; + PEXT_FILE_INFO FileHandle; + CHAR SymLinkPath[EXT_NAME_LEN]; + CHAR FullPath[EXT_NAME_LEN * 2]; ULONG_PTR Index; - TRACE("Ext2OpenFile() FileName = %s\n", FileName); + TRACE("ExtOpenFile() FileName = %s\n", FileName); RtlZeroMemory(SymLinkPath, sizeof(SymLinkPath)); // Lookup the file in the file system - if (!Ext2LookupFile(Volume, FileName, &TempExt2FileInfo)) + if (!ExtLookupFile(Volume, FileName, &TempExtFileInfo)) { return NULL; } // If we got a symbolic link then fix up the path // and re-call this function - if ((TempExt2FileInfo.Inode.mode & EXT2_S_IFMT) == EXT2_S_IFLNK) + if ((TempExtFileInfo.Inode.mode & EXT_S_IFMT) == EXT_S_IFLNK) { TRACE("File is a symbolic link\n"); // Now read in the symbolic link path - if (!Ext2ReadFileBig(&TempExt2FileInfo, TempExt2FileInfo.FileSize, NULL, SymLinkPath)) + if (!ExtReadFileBig(&TempExtFileInfo, TempExtFileInfo.FileSize, NULL, SymLinkPath)) { - if (TempExt2FileInfo.FileBlockList != NULL) + if (TempExtFileInfo.FileBlockList != NULL) { - FrLdrTempFree(TempExt2FileInfo.FileBlockList, TAG_EXT_BLOCK_LIST); + FrLdrTempFree(TempExtFileInfo.FileBlockList, TAG_EXT_BLOCK_LIST); } return NULL; @@ -169,52 +169,52 @@ PEXT2_FILE_INFO Ext2OpenFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName) TRACE("Full file path = %s\n", FullPath); - if (TempExt2FileInfo.FileBlockList != NULL) + if (TempExtFileInfo.FileBlockList != NULL) { - FrLdrTempFree(TempExt2FileInfo.FileBlockList, TAG_EXT_BLOCK_LIST); + FrLdrTempFree(TempExtFileInfo.FileBlockList, TAG_EXT_BLOCK_LIST); } - return Ext2OpenFile(Volume, FullPath); + return ExtOpenFile(Volume, FullPath); } else { - FileHandle = FrLdrTempAlloc(sizeof(EXT2_FILE_INFO), TAG_EXT_FILE); + FileHandle = FrLdrTempAlloc(sizeof(EXT_FILE_INFO), TAG_EXT_FILE); if (FileHandle == NULL) { - if (TempExt2FileInfo.FileBlockList != NULL) + if (TempExtFileInfo.FileBlockList != NULL) { - FrLdrTempFree(TempExt2FileInfo.FileBlockList, TAG_EXT_BLOCK_LIST); + FrLdrTempFree(TempExtFileInfo.FileBlockList, TAG_EXT_BLOCK_LIST); } return NULL; } - RtlCopyMemory(FileHandle, &TempExt2FileInfo, sizeof(EXT2_FILE_INFO)); + RtlCopyMemory(FileHandle, &TempExtFileInfo, sizeof(EXT_FILE_INFO)); return FileHandle; } } /* - * Ext2LookupFile() + * ExtLookupFile() * This function searches the file system for the - * specified filename and fills in a EXT2_FILE_INFO structure + * specified filename and fills in a EXT_FILE_INFO structure * with info describing the file, etc. returns true * if the file exists or false otherwise */ -BOOLEAN Ext2LookupFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName, PEXT2_FILE_INFO Ext2FileInfo) +BOOLEAN ExtLookupFile(PEXT_VOLUME_INFO Volume, PCSTR FileName, PEXT_FILE_INFO ExtFileInfo) { UINT32 i; ULONG NumberOfPathParts; CHAR PathPart[261]; PVOID DirectoryBuffer; - ULONG DirectoryInode = EXT2_ROOT_INO; - EXT2_INODE InodeData; - EXT2_DIR_ENTRY DirectoryEntry; + ULONG DirectoryInode = EXT_ROOT_INO; + EXT_INODE InodeData; + EXT_DIR_ENTRY DirectoryEntry; - TRACE("Ext2LookupFile() FileName = %s\n", FileName); + TRACE("ExtLookupFile() FileName = %s\n", FileName); - RtlZeroMemory(Ext2FileInfo, sizeof(EXT2_FILE_INFO)); + RtlZeroMemory(ExtFileInfo, sizeof(EXT_FILE_INFO)); /* Skip leading path separator, if any */ if (*FileName == '\\' || *FileName == '/') @@ -245,7 +245,7 @@ BOOLEAN Ext2LookupFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName, PEXT2_FILE_INFO // // Buffer the directory contents // - if (!Ext2ReadDirectory(Volume, DirectoryInode, &DirectoryBuffer, &InodeData)) + if (!ExtReadDirectory(Volume, DirectoryInode, &DirectoryBuffer, &InodeData)) { return FALSE; } @@ -253,7 +253,7 @@ BOOLEAN Ext2LookupFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName, PEXT2_FILE_INFO // // Search for file name in directory // - if (!Ext2SearchDirectoryBufferForFile(DirectoryBuffer, (ULONG)Ext2GetInodeFileSize(&InodeData), PathPart, &DirectoryEntry)) + if (!ExtSearchDirectoryBufferForFile(DirectoryBuffer, (ULONG)ExtGetInodeFileSize(&InodeData), PathPart, &DirectoryEntry)) { FrLdrTempFree(DirectoryBuffer, TAG_EXT_BUFFER); return FALSE; @@ -264,55 +264,55 @@ BOOLEAN Ext2LookupFile(PEXT2_VOLUME_INFO Volume, PCSTR FileName, PEXT2_FILE_INFO DirectoryInode = DirectoryEntry.inode; } - if (!Ext2ReadInode(Volume, DirectoryInode, &InodeData)) + if (!ExtReadInode(Volume, DirectoryInode, &InodeData)) { return FALSE; } - if (((InodeData.mode & EXT2_S_IFMT) != EXT2_S_IFREG) && - ((InodeData.mode & EXT2_S_IFMT) != EXT2_S_IFLNK)) + if (((InodeData.mode & EXT_S_IFMT) != EXT_S_IFREG) && + ((InodeData.mode & EXT_S_IFMT) != EXT_S_IFLNK)) { FileSystemError("Inode is not a regular file or symbolic link."); return FALSE; } // Set the associated volume - Ext2FileInfo->Volume = Volume; + ExtFileInfo->Volume = Volume; // If it's a regular file or a regular symbolic link // then get the block pointer list otherwise it must // be a fast symbolic link which doesn't have a block list - if (((InodeData.mode & EXT2_S_IFMT) == EXT2_S_IFREG) || - ((InodeData.mode & EXT2_S_IFMT) == EXT2_S_IFLNK && InodeData.size > FAST_SYMLINK_MAX_NAME_SIZE)) + if (((InodeData.mode & EXT_S_IFMT) == EXT_S_IFREG) || + ((InodeData.mode & EXT_S_IFMT) == EXT_S_IFLNK && InodeData.size > FAST_SYMLINK_MAX_NAME_SIZE)) { - Ext2FileInfo->FileBlockList = Ext2ReadBlockPointerList(Volume, &InodeData); - if (Ext2FileInfo->FileBlockList == NULL) + ExtFileInfo->FileBlockList = ExtReadBlockPointerList(Volume, &InodeData); + if (ExtFileInfo->FileBlockList == NULL) { return FALSE; } } else { - Ext2FileInfo->FileBlockList = NULL; + ExtFileInfo->FileBlockList = NULL; } - Ext2FileInfo->FilePointer = 0; - Ext2FileInfo->FileSize = Ext2GetInodeFileSize(&InodeData); - RtlCopyMemory(&Ext2FileInfo->Inode, &InodeData, sizeof(EXT2_INODE)); + ExtFileInfo->FilePointer = 0; + ExtFileInfo->FileSize = ExtGetInodeFileSize(&InodeData); + RtlCopyMemory(&ExtFileInfo->Inode, &InodeData, sizeof(EXT_INODE)); return TRUE; } -BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT2_DIR_ENTRY DirectoryEntry) +BOOLEAN ExtSearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectorySize, PCHAR FileName, PEXT_DIR_ENTRY DirectoryEntry) { ULONG CurrentOffset; - PEXT2_DIR_ENTRY CurrentDirectoryEntry; + PEXT_DIR_ENTRY CurrentDirectoryEntry; - TRACE("Ext2SearchDirectoryBufferForFile() DirectoryBuffer = 0x%x DirectorySize = %d FileName = %s\n", DirectoryBuffer, DirectorySize, FileName); + TRACE("ExtSearchDirectoryBufferForFile() DirectoryBuffer = 0x%x DirectorySize = %d FileName = %s\n", DirectoryBuffer, DirectorySize, FileName); for (CurrentOffset=0; CurrentOffset<DirectorySize; ) { - CurrentDirectoryEntry = (PEXT2_DIR_ENTRY)((ULONG_PTR)DirectoryBuffer + CurrentOffset); + CurrentDirectoryEntry = (PEXT_DIR_ENTRY)((ULONG_PTR)DirectoryBuffer + CurrentOffset); if (CurrentDirectoryEntry->direntlen == 0) { @@ -331,9 +331,9 @@ BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryS if ((_strnicmp(FileName, CurrentDirectoryEntry->name, CurrentDirectoryEntry->namelen) == 0) && (strlen(FileName) == CurrentDirectoryEntry->namelen)) { - RtlCopyMemory(DirectoryEntry, CurrentDirectoryEntry, sizeof(EXT2_DIR_ENTRY)); + RtlCopyMemory(DirectoryEntry, CurrentDirectoryEntry, sizeof(EXT_DIR_ENTRY)); - TRACE("EXT2 Directory Entry:\n"); + TRACE("EXT Directory Entry:\n"); TRACE("inode = %d\n", DirectoryEntry->inode); TRACE("direntlen = %d\n", DirectoryEntry->direntlen); TRACE("namelen = %d\n", DirectoryEntry->namelen); @@ -355,20 +355,20 @@ BOOLEAN Ext2SearchDirectoryBufferForFile(PVOID DirectoryBuffer, ULONG DirectoryS } /* - * Ext2ReadFileBig() + * ExtReadFileBig() * Reads BytesToRead from open file and * returns the number of bytes read in BytesRead */ -BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer) +BOOLEAN ExtReadFileBig(PEXT_FILE_INFO ExtFileInfo, ULONGLONG BytesToRead, ULONGLONG* BytesRead, PVOID Buffer) { - PEXT2_VOLUME_INFO Volume = Ext2FileInfo->Volume; + PEXT_VOLUME_INFO Volume = ExtFileInfo->Volume; ULONG BlockNumber; ULONG BlockNumberIndex; ULONG OffsetInBlock; ULONG LengthInBlock; ULONG NumberOfBlocks; - TRACE("Ext2ReadFileBig() BytesToRead = %d Buffer = 0x%x\n", (ULONG)BytesToRead, Buffer); + TRACE("ExtReadFileBig() BytesToRead = %d Buffer = 0x%x\n", (ULONG)BytesToRead, Buffer); if (BytesRead != NULL) { @@ -376,12 +376,12 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO } // Make sure we have the block pointer list if we need it - if (Ext2FileInfo->FileBlockList == NULL) + if (ExtFileInfo->FileBlockList == NULL) { // Block pointer list is NULL // so this better be a fast symbolic link or else - if (((Ext2FileInfo->Inode.mode & EXT2_S_IFMT) != EXT2_S_IFLNK) || - (Ext2FileInfo->FileSize > FAST_SYMLINK_MAX_NAME_SIZE)) + if (((ExtFileInfo->Inode.mode & EXT_S_IFMT) != EXT_S_IFLNK) || + (ExtFileInfo->FileSize > FAST_SYMLINK_MAX_NAME_SIZE)) { FileSystemError("Block pointer list is NULL and file is not a fast symbolic link."); return FALSE; @@ -392,7 +392,7 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO // If the user is trying to read past the end of // the file then return success with BytesRead == 0. // - if (Ext2FileInfo->FilePointer >= Ext2FileInfo->FileSize) + if (ExtFileInfo->FilePointer >= ExtFileInfo->FileSize) { return TRUE; } @@ -401,26 +401,26 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO // If the user is trying to read more than there is to read // then adjust the amount to read. // - if ((Ext2FileInfo->FilePointer + BytesToRead) > Ext2FileInfo->FileSize) + if ((ExtFileInfo->FilePointer + BytesToRead) > ExtFileInfo->FileSize) { - BytesToRead = (Ext2FileInfo->FileSize - Ext2FileInfo->FilePointer); + BytesToRead = (ExtFileInfo->FileSize - ExtFileInfo->FilePointer); } // Check if this is a fast symbolic link // if so then the read is easy - if (((Ext2FileInfo->Inode.mode & EXT2_S_IFMT) == EXT2_S_IFLNK) && - (Ext2FileInfo->FileSize <= FAST_SYMLINK_MAX_NAME_SIZE)) + if (((ExtFileInfo->Inode.mode & EXT_S_IFMT) == EXT_S_IFLNK) && + (ExtFileInfo->FileSize <= FAST_SYMLINK_MAX_NAME_SIZE)) { TRACE("Reading fast symbolic link data\n"); // Copy the data from the link - RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)Ext2FileInfo->FilePointer + Ext2FileInfo->Inode.symlink), (ULONG)BytesToRead); + RtlCopyMemory(Buffer, (PVOID)((ULONG_PTR)ExtFileInfo->FilePointer + ExtFileInfo->Inode.symlink), (ULONG)BytesToRead); if (BytesRead != NULL) { *BytesRead = BytesToRead; } - // Ext2FileInfo->FilePointer += BytesToRead; + // ExtFileInfo->FilePointer += BytesToRead; return TRUE; } @@ -457,20 +457,20 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO // Only do the first read if we // aren't aligned on a block boundary // - if (Ext2FileInfo->FilePointer % Volume->BlockSizeInBytes) + if (ExtFileInfo->FilePointer % Volume->BlockSizeInBytes) { // // Do the math for our first read // - BlockNumberIndex = (ULONG)(Ext2FileInfo->FilePointer / Volume->BlockSizeInBytes); - BlockNumber = Ext2FileInfo->FileBlockList[BlockNumberIndex]; - OffsetInBlock = (Ext2FileInfo->FilePointer % Volume->BlockSizeInBytes); + BlockNumberIndex = (ULONG)(ExtFileInfo->FilePointer / Volume->BlockSizeInBytes); + BlockNumber = ExtFileInfo->FileBlockList[BlockNumberIndex]; + OffsetInBlock = (ExtFileInfo->FilePointer % Volume->BlockSizeInBytes); LengthInBlock = (ULONG)((BytesToRead > (Volume->BlockSizeInBytes - OffsetInBlock)) ? (Volume->BlockSizeInBytes - OffsetInBlock) : BytesToRead); // // Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer // - if (!Ext2ReadPartialBlock(Volume, BlockNumber, OffsetInBlock, LengthInBlock, Buffer)) + if (!ExtReadPartialBlock(Volume, BlockNumber, OffsetInBlock, LengthInBlock, Buffer)) { return FALSE; } @@ -479,7 +479,7 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO *BytesRead += LengthInBlock; } BytesToRead -= LengthInBlock; - Ext2FileInfo->FilePointer += LengthInBlock; + ExtFileInfo->FilePointer += LengthInBlock; Buffer = (PVOID)((ULONG_PTR)Buffer + LengthInBlock); } @@ -495,13 +495,13 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO while (NumberOfBlocks > 0) { - BlockNumberIndex = (ULONG)(Ext2FileInfo->FilePointer / Volume->BlockSizeInBytes); - BlockNumber = Ext2FileInfo->FileBlockList[BlockNumberIndex]; + BlockNumberIndex = (ULONG)(ExtFileInfo->FilePointer / Volume->BlockSizeInBytes); + BlockNumber = ExtFileInfo->FileBlockList[BlockNumberIndex]; // // Now do the read and update BytesRead, BytesToRead, FilePointer, & Buffer // - if (!Ext2ReadBlock(Volume, BlockNumber, Buffer)) + if (!ExtReadBlock(Volume, BlockNumber, Buffer)) { return FALSE; } @@ -510,7 +510,7 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO *BytesRead += Volume->BlockSizeInBytes; } BytesToRead -= Volume->BlockSizeInBytes; - Ext2FileInfo->FilePointer += Volume->BlockSizeInBytes; + ExtFileInfo->FilePointer += Volume->BlockSizeInBytes; Buffer = (PVOID)((ULONG_PTR)Buffer + Volume->BlockSizeInBytes); NumberOfBlocks--; } @@ -521,13 +521,13 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO // if (BytesToRead > 0) { - BlockNumberIndex = (ULONG)(Ext2FileInfo->FilePointer / Volume->BlockSizeInBytes); - BlockNumber = Ext2FileInfo->FileBlockList[BlockNumberIndex]; + BlockNumberIndex = (ULONG)(ExtFileInfo->FilePointer / Volume->BlockSizeInBytes); + BlockNumber = ExtFileInfo->FileBlockList[BlockNumberIndex]; // // Now do the read and update BytesRead & FilePointer // - if (!Ext2ReadPartialBlock(Volume, BlockNumber, 0, (ULONG)BytesToRead, Buffer)) + if (!ExtReadPartialBlock(Volume, BlockNumber, 0, (ULONG)BytesToRead, Buffer)) { return FALSE; } @@ -535,16 +535,16 @@ BOOLEAN Ext2ReadFileBig(PEXT2_FILE_INFO Ext2FileInfo, ULONGLONG BytesToRead, ULO { *BytesRead += BytesToRead; } - Ext2FileInfo->FilePointer += BytesToRead; + ExtFileInfo->FilePointer += BytesToRead; } return TRUE; } -BOOLEAN Ext2ReadVolumeSectors(PEXT2_VOLUME_INFO Volume, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) +BOOLEAN ExtReadVolumeSectors(PEXT_VOLUME_INFO Volume, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) { #if 0 - return CacheReadDiskSectors(DriveNumber, SectorNumber + Ext2VolumeStartSector, SectorCount, Buffer); + return CacheReadDiskSectors(DriveNumber, SectorNumber + ExtVolumeStartSector, SectorCount, Buffer); #endif LARGE_INTEGER Position; @@ -556,7 +556,7 @@ BOOLEAN Ext2ReadVolumeSectors(PEXT2_VOLUME_INFO Volume, ULONGLONG SectorNumber, Status = ArcSeek(Volume->DeviceId, &Position, SeekAbsolute); if (Status != ESUCCESS) { - TRACE("Ext2ReadVolumeSectors() Failed to seek\n"); + TRACE("ExtReadVolumeSectors() Failed to seek\n"); return FALSE; } @@ -564,7 +564,7 @@ BOOLEAN Ext2ReadVolumeSectors(PEXT2_VOLUME_INFO Volume, ULONGLONG SectorNumber, Status = ArcRead(Volume->DeviceId, Buffer, SectorCount * 512, &Count); if (Status != ESUCCESS || Count != SectorCount * 512) { - TRACE("Ext2ReadVolumeSectors() Failed to read\n"); + TRACE("ExtReadVolumeSectors() Failed to read\n"); return FALSE; } @@ -572,14 +572,14 @@ BOOLEAN Ext2ReadVolumeSectors(PEXT2_VOLUME_INFO Volume, ULONGLONG SectorNumber, return TRUE; } -BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) +BOOLEAN ExtReadSuperBlock(PEXT_VOLUME_INFO Volume) { - PEXT2_SUPER_BLOCK SuperBlock = Volume->SuperBlock; + PEXT_SUPER_BLOCK SuperBlock = Volume->SuperBlock; LARGE_INTEGER Position; ULONG Count; ARC_STATUS Status; - TRACE("Ext2ReadSuperBlock()\n"); + TRACE("ExtReadSuperBlock()\n"); #if 0 /* Free any memory previously allocated */ @@ -593,7 +593,7 @@ BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) /* Allocate the memory to hold the super block if needed */ if (SuperBlock == NULL) { - SuperBlock = (PEXT2_SUPER_BLOCK)FrLdrTempAlloc(1024, TAG_EXT_SUPER_BLOCK); + SuperBlock = (PEXT_SUPER_BLOCK)FrLdrTempAlloc(1024, TAG_EXT_SUPER_BLOCK); if (SuperBlock == NULL) { FileSystemError("Out of memory."); @@ -656,7 +656,7 @@ BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) // // Check the super block magic // - if (SuperBlock->magic != EXT2_MAGIC) + if (SuperBlock->magic != EXT_MAGIC) { FileSystemError("Invalid super block magic (0xef53)"); return FALSE; @@ -665,9 +665,9 @@ BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) // // Check the revision level // - if (SuperBlock->revision_level > EXT2_DYNAMIC_REVISION) + if (SuperBlock->revision_level > EXT_DYNAMIC_REVISION) { - FileSystemError("FreeLoader does not understand the revision of this EXT2/EXT3 filesystem.\nPlease update FreeLoader."); + FileSystemError("FreeLoader does not understand the revision of this EXT/EXT3 filesystem.\nPlease update FreeLoader."); return FALSE; } @@ -676,24 +676,24 @@ BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) // Don't need to check the compatible or read-only compatible features // because we only mount the filesystem as read-only // - if ((SuperBlock->revision_level >= EXT2_DYNAMIC_REVISION) && + if ((SuperBlock->revision_level >= EXT_DYNAMIC_REVISION) && (/*((SuperBlock->s_feature_compat & ~EXT3_FEATURE_COMPAT_SUPP) != 0) ||*/ /*((SuperBlock->s_feature_ro_compat & ~EXT3_FEATURE_RO_COMPAT_SUPP) != 0) ||*/ ((SuperBlock->feature_incompat & ~EXT3_FEATURE_INCOMPAT_SUPP) != 0))) { - FileSystemError("FreeLoader does not understand features of this EXT2/EXT3 filesystem.\nPlease update FreeLoader."); + FileSystemError("FreeLoader does not understand features of this EXT/EXT3 filesystem.\nPlease update FreeLoader."); return FALSE; } // Calculate the group count Volume->GroupCount = (SuperBlock->total_blocks - SuperBlock->first_data_block + SuperBlock->blocks_per_group - 1) / SuperBlock->blocks_per_group; - TRACE("Ext2GroupCount: %d\n", Volume->GroupCount); + TRACE("ExtGroupCount: %d\n", Volume->GroupCount); // Calculate the block size Volume->BlockSizeInBytes = 1024 << SuperBlock->log2_block_size; Volume->BlockSizeInSectors = Volume->BlockSizeInBytes / Volume->BytesPerSector; - TRACE("Ext2BlockSizeInBytes: %d\n", Volume->BlockSizeInBytes); - TRACE("Ext2BlockSizeInSectors: %d\n", Volume->BlockSizeInSectors); + TRACE("ExtBlockSizeInBytes: %d\n", Volume->BlockSizeInBytes); + TRACE("ExtBlockSizeInSectors: %d\n", Volume->BlockSizeInSectors); // Calculate the fragment size if (SuperBlock->log2_fragment_size >= 0) @@ -705,8 +705,8 @@ BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) Volume->FragmentSizeInBytes = 1024 >> -(SuperBlock->log2_fragment_size); } Volume->FragmentSizeInSectors = Volume->FragmentSizeInBytes / Volume->BytesPerSector; - TRACE("Ext2FragmentSizeInBytes: %d\n", Volume->FragmentSizeInBytes); - TRACE("Ext2FragmentSizeInSectors: %d\n", Volume->FragmentSizeInSectors); + TRACE("ExtFragmentSizeInBytes: %d\n", Volume->FragmentSizeInBytes); + TRACE("ExtFragmentSizeInSectors: %d\n", Volume->FragmentSizeInSectors); // Verify that the fragment size and the block size are equal if (Volume->BlockSizeInBytes != Volume->FragmentSizeInBytes) @@ -716,23 +716,23 @@ BOOLEAN Ext2ReadSuperBlock(PEXT2_VOLUME_INFO Volume) } // Calculate the number of inodes in one block - Volume->InodesPerBlock = Volume->BlockSizeInBytes / EXT2_INODE_SIZE(SuperBlock); - TRACE("Ext2InodesPerBlock: %d\n", Volume->InodesPerBlock); + Volume->InodesPerBlock = Volume->BlockSizeInBytes / EXT_INODE_SIZE(SuperBlock); + TRACE("ExtInodesPerBlock: %d\n", Volume->InodesPerBlock); // Calculate the number of group descriptors in one block - Volume->GroupDescPerBlock = EXT2_DESC_PER_BLOCK(SuperBlock); - TRACE("Ext2GroupDescPerBlock: %d\n", Volume->GroupDescPerBlock); + Volume->GroupDescPerBlock = EXT_DESC_PER_BLOCK(SuperBlock); + TRACE("ExtGroupDescPerBlock: %d\n", Volume->GroupDescPerBlock); return TRUE; } -BOOLEAN Ext2ReadGroupDescriptors(PEXT2_VOLUME_INFO Volume) +BOOLEAN ExtReadGroupDescriptors(PEXT_VOLUME_INFO Volume) { ULONG GroupDescBlockCount; ULONG BlockNumber; PUCHAR CurrentGroupDescBlock; - TRACE("Ext2ReadGroupDescriptors()\n"); + TRACE("ExtReadGroupDescriptors()\n"); /* Free any memory previously allocated */ if (Volume->GroupDescriptors != NULL) @@ -743,7 +743,7 @@ BOOLEAN Ext2ReadGroupDescriptors(PEXT2_VOLUME_INFO Volume) /* Now allocate the memory to hold the group descriptors */ GroupDescBlockCount = ROUND_UP(Volume->GroupCount, Volume->GroupDescPerBlock) / Volume->GroupDescPerBlock; - Volume->GroupDescriptors = (PEXT2_GROUP_DESC)FrLdrTempAlloc(GroupDescBlockCount * Volume->BlockSizeInBytes, TAG_EXT_GROUP_DESC); + Volume->GroupDescriptors = (PEXT_GROUP_DESC)FrLdrTempAlloc(GroupDescBlockCount * Volume->BlockSizeInBytes, TAG_EXT_GROUP_DESC); if (Volume->GroupDescriptors == NULL) { FileSystemError("Out of memory."); @@ -756,7 +756,7 @@ BOOLEAN Ext2ReadGroupDescriptors(PEXT2_VOLUME_INFO Volume) while (GroupDescBlockCount--) { - if (!Ext2ReadBlock(Volume, BlockNumber, CurrentGroupDescBlock)) + if (!ExtReadBlock(Volume, BlockNumber, CurrentGroupDescBlock)) { return FALSE; } @@ -768,31 +768,31 @@ BOOLEAN Ext2ReadGroupDescriptors(PEXT2_VOLUME_INFO Volume) return TRUE; } -BOOLEAN Ext2ReadDirectory(PEXT2_VOLUME_INFO Volume, ULONG Inode, PVOID* DirectoryBuffer, PEXT2_INODE InodePointer) +BOOLEAN ExtReadDirectory(PEXT_VOLUME_INFO Volume, ULONG Inode, PVOID* DirectoryBuffer, PEXT_INODE InodePointer) { - EXT2_FILE_INFO DirectoryFileInfo; + EXT_FILE_INFO DirectoryFileInfo; - TRACE("Ext2ReadDirectory() Inode = %d\n", Inode); + TRACE("ExtReadDirectory() Inode = %d\n", Inode); // Read the directory inode - if (!Ext2ReadInode(Volume, Inode, InodePointer)) + if (!ExtReadInode(Volume, Inode, InodePointer)) { return FALSE; } // Make sure it is a directory inode - if ((InodePointer->mode & EXT2_S_IFMT) != EXT2_S_IFDIR) + if ((InodePointer->mode & EXT_S_IFMT) != EXT_S_IFDIR) { FileSystemError("Inode is not a directory."); return FALSE; } - // Fill in file info struct so we can call Ext2ReadFileBig() - RtlZeroMemory(&DirectoryFileInfo, sizeof(EXT2_FILE_INFO)); + // Fill in file info struct so we can call ExtReadFileBig() + RtlZeroMemory(&DirectoryFileInfo, sizeof(EXT_FILE_INFO)); DirectoryFileInfo.Volume = Volume; - DirectoryFileInfo.FileBlockList = Ext2ReadBlockPointerList(Volume, InodePointer); + DirectoryFileInfo.FileBlockList = ExtReadBlockPointerList(Volume, InodePointer); DirectoryFileInfo.FilePointer = 0; - DirectoryFileInfo.FileSize = Ext2GetInodeFileSize(InodePointer); + DirectoryFileInfo.FileSize = ExtGetInodeFileSize(InodePointer); if (DirectoryFileInfo.FileBlockList == NULL) { @@ -803,7 +803,7 @@ BOOLEAN Ext2ReadDirectory(PEXT2_VOLUME_INFO Volume, ULONG Inode, PVOID* Director // Now allocate the memory to hold the group descriptors // ASSERT(DirectoryFileInfo.FileSize <= 0xFFFFFFFF); - *DirectoryBuffer = (PEXT2_DIR_ENTRY)FrLdrTempAlloc((ULONG)DirectoryFileInfo.FileSize, TAG_EXT_BUFFER); + *DirectoryBuffer = (PEXT_DIR_ENTRY)FrLdrTempAlloc((ULONG)DirectoryFileInfo.FileSize, TAG_EXT_BUFFER); // // Make sure we got the memory @@ -816,7 +816,7 @@ BOOLEAN Ext2ReadDirectory(PEXT2_VOLUME_INFO Volume, ULONG Inode, PVOID* Director } // Now read the root directory data - if (!Ext2ReadFileBig(&DirectoryFileInfo, DirectoryFileInfo.FileSize, NULL, *DirectoryBuffer)) + if (!ExtReadFileBig(&DirectoryFileInfo, DirectoryFileInfo.FileSize, NULL, *DirectoryBuffer)) { FrLdrTempFree(*DirectoryBuffer, TAG_EXT_BUFFER); *DirectoryBuffer = NULL; @@ -828,11 +828,11 @@ BOOLEAN Ext2ReadDirectory(PEXT2_VOLUME_INFO Volume, ULONG Inode, PVOID* Director return TRUE; } -BOOLEAN Ext2ReadBlock(PEXT2_VOLUME_INFO Volume, ULONG BlockNumber, PVOID Buffer) +BOOLEAN ExtReadBlock(PEXT_VOLUME_INFO Volume, ULONG BlockNumber, PVOID Buffer) { CHAR ErrorString[80]; - TRACE("Ext2ReadBlock() BlockNumber = %d Buffer = 0x%x\n", BlockNumber, Buffer); + TRACE("ExtReadBlock() BlockNumber = %d Buffer = 0x%x\n", BlockNumber, Buffer); // Make sure its a valid block if (BlockNumber > Volume->SuperBlock->total_blocks) @@ -852,22 +852,22 @@ BOOLEAN Ext2ReadBlock(PEXT2_VOLUME_INFO Volume, ULONG BlockNumber, PVOID Buffer) return TRUE; } - return Ext2ReadVolumeSectors(Volume, (ULONGLONG)BlockNumber * Volume->BlockSizeInSectors, Volume->BlockSizeInSectors, Buffer); + return ExtReadVolumeSectors(Volume, (ULONGLONG)BlockNumber * Volume->BlockSizeInSectors, Volume->BlockSizeInSectors, Buffer); } /* - * Ext2ReadPartialBlock() + * ExtReadPartialBlock() * Reads part of a block into memory */ -BOOLEAN Ext2ReadPartialBlock(PEXT2_VOLUME_INFO Volume, ULONG BlockNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer) +BOOLEAN ExtReadPartialBlock(PEXT_VOLUME_INFO Volume, ULONG BlockNumber, ULONG StartingOffset, ULONG Length, PVOID Buffer) { PVOID TempBuffer; - TRACE("Ext2ReadPartialBlock() BlockNumber = %d StartingOffset = %d Length = %d Buffer = 0x%x\n", BlockNumber, StartingOffset, Length, Buffer); + TRACE("ExtReadPartialBlock() BlockNumber = %d StartingOffset = %d Length = %d Buffer = 0x%x\n", BlockNumber, StartingOffset, Length, Buffer); TempBuffer = FrLdrTempAlloc(Volume->BlockSizeInBytes, TAG_EXT_BUFFER); - if (!Ext2ReadBlock(Volume, BlockNumber, TempBuffer)) + if (!ExtReadBlock(Volume, BlockNumber, TempBuffer)) { FrLdrTempFree(TempBuffer, TAG_EXT_BUFFER); return FALSE; @@ -881,41 +881,41 @@ BOOLEAN Ext2ReadPartialBlock(PEXT2_VOLUME_INFO Volume, ULONG BlockNumber, ULONG } #if 0 -ULONG Ext2GetGroupDescBlockNumber(PEXT2_VOLUME_INFO Volume, ULONG Group) +ULONG ExtGetGroupDescBlockNumber(PEXT_VOLUME_INFO Volume, ULONG Group) { - return (((Group * sizeof(EXT2_GROUP_DESC)) / Volume->GroupDescPerBlock) + Volume->SuperBlock->first_data_block + 1); + return (((Group * sizeof(EXT_GROUP_DESC)) / Volume->GroupDescPerBlock) + Volume->SuperBlock->first_data_block + 1); } -ULONG Ext2GetGroupDescOffsetInBlock(PEXT2_VOLUME_INFO Volume, ULONG Group) +ULONG ExtGetGroupDescOffsetInBlock(PEXT_VOLUME_INFO Volume, ULONG Group) { - return ((Group * sizeof(EXT2_GROUP_DESC)) % Volume->GroupDescPerBlock); + return ((Group * sizeof(EXT_GROUP_DESC)) % Volume->GroupDescPerBlock); } #endif -ULONG Ext2GetInodeGroupNumber(PEXT2_VOLUME_INFO Volume, ULONG Inode) +ULONG ExtGetInodeGroupNumber(PEXT_VOLUME_INFO Volume, ULONG Inode) { return ((Inode - 1) / Volume->SuperBlock->inodes_per_group); } -ULONG Ext2GetInodeBlockNumber(PEXT2_VOLUME_INFO Volume, ULONG Inode) +ULONG ExtGetInodeBlockNumber(PEXT_VOLUME_INFO Volume, ULONG Inode) { return (((Inode - 1) % Volume->SuperBlock->inodes_per_group) / Volume->InodesPerBlock); } -ULONG Ext2GetInodeOffsetInBlock(PEXT2_VOLUME_INFO Volume, ULONG Inode) +ULONG ExtGetInodeOffsetInBlock(PEXT_VOLUME_INFO Volume, ULONG Inode) { return (((Inode - 1) % Volume->SuperBlock->inodes_per_group) % Volume->InodesPerBlock); } -BOOLEAN Ext2ReadInode(PEXT2_VOLUME_INFO Volume, ULONG Inode, PEXT2_INODE InodeBuffer) +BOOLEAN ExtReadInode(PEXT_VOLUME_INFO Volume, ULONG Inode, PEXT_INODE InodeBuffer) { ULONG InodeGroupNumber; ULONG InodeBlockNumber; ULONG InodeOffsetInBlock; CHAR ErrorString[80]; - EXT2_GROUP_DESC GroupDescriptor; + EXT_GROUP_DESC GroupDescriptor; - TRACE("Ext2ReadInode() Inode = %d\n", Inode); + TRACE("ExtReadInode() Inode = %d\n", Inode); // Make sure its a valid inode if ((Inode < 1) || (Inode > Volume->SuperBlock->total_inodes)) @@ -926,15 +926,15 @@ BOOLEAN Ext2ReadInode(PEXT2_VOLUME_INFO Volume, ULONG Inode, PEXT2_INODE InodeBu } // Get inode group & block number and offset in block - InodeGroupNumber = Ext2GetInodeGroupNumber(Volume, Inode); - InodeBlockNumber = Ext2GetInodeBlockNumber(Volume, Inode); - InodeOffsetInBlock = Ext2GetInodeOffsetInBlock(Volume, Inode); + InodeGroupNumber = ExtGetInodeGroupNumber(Volume, Inode); + InodeBlockNumber = ExtGetInodeBlockNumber(Volume, Inode); + InodeOffsetInBlock = ExtGetInodeOffsetInBlock(Volume, Inode); TRACE("InodeGroupNumber = %d\n", InodeGroupNumber); TRACE("InodeBlockNumber = %d\n", InodeBlockNumber); TRACE("InodeOffsetInBlock = %d\n", InodeOffsetInBlock); // Read the group descriptor - if (!Ext2ReadGroupDescriptor(Volume, InodeGroupNumber, &GroupDescriptor)) + if (!ExtReadGroupDescriptor(Volume, InodeGroupNumber, &GroupDescriptor)) { return FALSE; } @@ -944,10 +944,10 @@ BOOLEAN Ext2ReadInode(PEXT2_VOLUME_INFO Volume, ULONG Inode, PEXT2_INODE InodeBu TRACE("InodeBlockNumber (after group desc correction) = %d\n", InodeBlockNumber); // Read the block - if (!Ext2ReadPartialBlock(Volume, + if (!ExtReadPartialBlock(Volume, InodeBlockNumber, - (InodeOffsetInBlock * EXT2_INODE_SIZE(Volume->SuperBlock)), - sizeof(EXT2_INODE), + (InodeOffsetInBlock * EXT_INODE_SIZE(Volume->SuperBlock)), + sizeof(EXT_INODE), InodeBuffer)) { return FALSE; @@ -983,19 +983,19 @@ BOOLEAN Ext2ReadInode(PEXT2_VOLUME_INFO Volume, ULONG Inode, PEXT2_INODE InodeBu return TRUE; } -BOOLEAN Ext2ReadGroupDescriptor(PEXT2_VOLUME_INFO Volume, ULONG Group, PEXT2_GROUP_DESC GroupBuffer) +BOOLEAN ExtReadGroupDescriptor(PEXT_VOLUME_INFO Volume, ULONG Group, PEXT_GROUP_DESC GroupBuffer) { - TRACE("Ext2ReadGroupDescriptor()\n"); + TRACE("ExtReadGroupDescriptor()\n"); #if 0 - if (!Ext2ReadBlock(Volume, Ext2GetGroupDescBlockNumber(Volume, Group), (PVOID)FILESYSBUFFER)) + if (!ExtReadBlock(Volume, ExtGetGroupDescBlockNumber(Volume, Group), (PVOID)FILESYSBUFFER)) { return FALSE; } - RtlCopyMemory(GroupBuffer, (PVOID)(FILESYSBUFFER + Ext2GetGroupDescOffsetInBlock(Volume, Group)), sizeof(EXT2_GROUP_DESC)); + RtlCopyMemory(GroupBuffer, (PVOID)(FILESYSBUFFER + ExtGetGroupDescOffsetInBlock(Volume, Group)), sizeof(EXT_GROUP_DESC)); #endif - RtlCopyMemory(GroupBuffer, &Volume->GroupDescriptors[Group], sizeof(EXT2_GROUP_DESC)); + RtlCopyMemory(GroupBuffer, &Volume->GroupDescriptors[Group], sizeof(EXT_GROUP_DESC)); TRACE("Dumping group descriptor:\n"); TRACE("block_id = %d\n", GroupBuffer->block_id); @@ -1008,7 +1008,7 @@ BOOLEAN Ext2ReadGroupDescriptor(PEXT2_VOLUME_INFO Volume, ULONG Group, PEXT2_GRO return TRUE; } -ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) +ULONG* ExtReadBlockPointerList(PEXT_VOLUME_INFO Volume, PEXT_INODE Inode) { ULONGLONG FileSize; ULONG BlockCount; @@ -1016,7 +1016,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) ULONG CurrentBlockInList; ULONG CurrentBlock; - TRACE("Ext2ReadBlockPointerList()\n"); + TRACE("ExtReadBlockPointerList()\n"); // Get the number of blocks this file occupies // I would just use Inode->i_blocks but it @@ -1024,7 +1024,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) // the file size corresponds to, but instead // it is much bigger. //BlockCount = Inode->i_blocks; - FileSize = Ext2GetInodeFileSize(Inode); + FileSize = ExtGetInodeFileSize(Inode); FileSize = ROUND_UP(FileSize, Volume->BlockSizeInBytes); BlockCount = (ULONG)(FileSize / Volume->BlockSizeInBytes); @@ -1048,7 +1048,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) // Copy the indirect block pointers if (CurrentBlockInList < BlockCount) { - if (!Ext2CopyIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.indir_block)) + if (!ExtCopyIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.indir_block)) { FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); return NULL; @@ -1058,7 +1058,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) // Copy the double indirect block pointers if (CurrentBlockInList < BlockCount) { - if (!Ext2CopyDoubleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.double_indir_block)) + if (!ExtCopyDoubleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.double_indir_block)) { FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); return NULL; @@ -1068,7 +1068,7 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) // Copy the triple indirect block pointers if (CurrentBlockInList < BlockCount) { - if (!Ext2CopyTripleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.tripple_indir_block)) + if (!ExtCopyTripleIndirectBlockPointers(Volume, BlockList, &CurrentBlockInList, BlockCount, Inode->blocks.tripple_indir_block)) { FrLdrTempFree(BlockList, TAG_EXT_BLOCK_LIST); return NULL; @@ -1078,9 +1078,9 @@ ULONG* Ext2ReadBlockPointerList(PEXT2_VOLUME_INFO Volume, PEXT2_INODE Inode) return BlockList; } -ULONGLONG Ext2GetInodeFileSize(PEXT2_INODE Inode) +ULONGLONG ExtGetInodeFileSize(PEXT_INODE Inode) { - if ((Inode->mode & EXT2_S_IFMT) == EXT2_S_IFDIR) + if ((Inode->mode & EXT_S_IFMT) == EXT_S_IFDIR) { return (ULONGLONG)(Inode->size); } @@ -1090,13 +1090,13 @@ ULONGLONG Ext2GetInodeFileSize(PEXT2_INODE Inode) } } -BOOLEAN Ext2CopyIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock) +BOOLEAN ExtCopyIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG IndirectBlock) { ULONG* BlockBuffer; ULONG CurrentBlock; ULONG BlockPointersPerBlock; - TRACE("Ext2CopyIndirectBlockPointers() BlockCount = %d\n", BlockCount); + TRACE("ExtCopyIndirectBlockPointers() BlockCount = %d\n", BlockCount); BlockPointersPerBlock = Volume->BlockSizeInBytes / sizeof(ULONG); @@ -1106,7 +1106,7 @@ BOOLEAN Ext2CopyIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList return FALSE; } - if (!Ext2ReadBlock(Volume, IndirectBlock, BlockBuffer)) + if (!ExtReadBlock(Volume, IndirectBlock, BlockBuffer)) { return FALSE; } @@ -1122,13 +1122,13 @@ BOOLEAN Ext2CopyIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList return TRUE; } -BOOLEAN Ext2CopyDoubleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock) +BOOLEAN ExtCopyDoubleIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG DoubleIndirectBlock) { ULONG* BlockBuffer; ULONG CurrentBlock; ULONG BlockPointersPerBlock; - TRACE("Ext2CopyDoubleIndirectBlockPointers() BlockCount = %d\n", BlockCount); + TRACE("ExtCopyDoubleIndirectBlockPointers() BlockCount = %d\n", BlockCount); BlockPointersPerBlock = Volume->BlockSizeInBytes / sizeof(ULONG); @@ -1138,7 +1138,7 @@ BOOLEAN Ext2CopyDoubleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* Blo return FALSE; } - if (!Ext2ReadBlock(Volume, DoubleIndirectBlock, BlockBuffer)) + if (!ExtReadBlock(Volume, DoubleIndirectBlock, BlockBuffer)) { FrLdrTempFree(BlockBuffer, TAG_EXT_BUFFER); return FALSE; @@ -1146,7 +1146,7 @@ BOOLEAN Ext2CopyDoubleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* Blo for (CurrentBlock=0; (*CurrentBlockInList)<BlockCount && CurrentBlock<BlockPointersPerBlock; CurrentBlock++) { - if (!Ext2CopyIndirectBlockPointers(Volume, BlockList, CurrentBlockInList, BlockCount, BlockBuffer[CurrentBlock])) + if (!ExtCopyIndirectBlockPointers(Volume, BlockList, CurrentBlockInList, BlockCount, BlockBuffer[CurrentBlock])) { FrLdrTempFree(BlockBuffer, TAG_EXT_BUFFER); return FALSE; @@ -1157,13 +1157,13 @@ BOOLEAN Ext2CopyDoubleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* Blo return TRUE; } -BOOLEAN Ext2CopyTripleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock) +BOOLEAN ExtCopyTripleIndirectBlockPointers(PEXT_VOLUME_INFO Volume, ULONG* BlockList, ULONG* CurrentBlockInList, ULONG BlockCount, ULONG TripleIndirectBlock) { ULONG* BlockBuffer; ULONG CurrentBlock; ULONG BlockPointersPerBlock; - TRACE("Ext2CopyTripleIndirectBlockPointers() BlockCount = %d\n", BlockCount); + TRACE("ExtCopyTripleIndirectBlockPointers() BlockCount = %d\n", BlockCount); BlockPointersPerBlock = Volume->BlockSizeInBytes / sizeof(ULONG); @@ -1173,7 +1173,7 @@ BOOLEAN Ext2CopyTripleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* Blo return FALSE; } - if (!Ext2ReadBlock(Volume, TripleIndirectBlock, BlockBuffer)) + if (!ExtReadBlock(Volume, TripleIndirectBlock, BlockBuffer)) { FrLdrTempFree(BlockBuffer, TAG_EXT_BUFFER); return FALSE; @@ -1181,7 +1181,7 @@ BOOLEAN Ext2CopyTripleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* Blo for (CurrentBlock=0; (*CurrentBlockInList)<BlockCount && CurrentBlock<BlockPointersPerBlock; CurrentBlock++) { - if (!Ext2CopyDoubleIndirectBlockPointers(Volume, BlockList, CurrentBlockInList, BlockCount, BlockBuffer[CurrentBlock])) + if (!ExtCopyDoubleIndirectBlockPointers(Volume, BlockList, CurrentBlockInList, BlockCount, BlockBuffer[CurrentBlock])) { FrLdrTempFree(BlockBuffer, TAG_EXT_BUFFER); return FALSE; @@ -1192,31 +1192,31 @@ BOOLEAN Ext2CopyTripleIndirectBlockPointers(PEXT2_VOLUME_INFO Volume, ULONG* Blo return TRUE; } -ARC_STATUS Ext2Close(ULONG FileId) +ARC_STATUS ExtClose(ULONG FileId) { - PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); + PEXT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); FrLdrTempFree(FileHandle, TAG_EXT_FILE); return ESUCCESS; } -ARC_STATUS Ext2GetFileInformation(ULONG FileId, FILEINFORMATION* Information) +ARC_STATUS ExtGetFileInformation(ULONG FileId, FILEINFORMATION* Information) { - PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); + PEXT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); RtlZeroMemory(Information, sizeof(*Information)); Information->EndingAddress.QuadPart = FileHandle->FileSize; Information->CurrentAddress.QuadPart = FileHandle->FilePointer; - TRACE("Ext2GetFileInformation(%lu) -> FileSize = %llu, FilePointer = 0x%llx\n", + TRACE("ExtGetFileInformation(%lu) -> FileSize = %llu, FilePointer = 0x%llx\n", FileId, Information->EndingAddress.QuadPart, Information->CurrentAddress.QuadPart); return ESUCCESS; } -ARC_STATUS Ext2Open(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) +ARC_STATUS ExtOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) { - PEXT2_VOLUME_INFO Volume; - PEXT2_FILE_INFO FileHandle; + PEXT_VOLUME_INFO Volume; + PEXT_FILE_INFO FileHandle; ULONG DeviceId; /* Check parameters */ @@ -1225,13 +1225,13 @@ ARC_STATUS Ext2Open(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) /* Get underlying device */ DeviceId = FsGetDeviceId(*FileId); - Volume = Ext2Volumes[DeviceId]; + Volume = ExtVolumes[DeviceId]; - TRACE("Ext2Open() FileName = %s\n", Path); + TRACE("ExtOpen() FileName = %s\n", Path); /* Call the internal open method */ - // Status = Ext2OpenFile(Volume, Path, &FileHandle); - FileHandle = Ext2OpenFile(Volume, Path); + // Status = ExtOpenFile(Volume, Path, &FileHandle); + FileHandle = ExtOpenFile(Volume, Path); if (!FileHandle) return ENOENT; @@ -1240,16 +1240,16 @@ ARC_STATUS Ext2Open(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) return ESUCCESS; } -ARC_STATUS Ext2Read(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count) +ARC_STATUS ExtRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count) { - PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); + PEXT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); ULONGLONG BytesReadBig; BOOLEAN Success; // // Read data // - Success = Ext2ReadFileBig(FileHandle, N, &BytesReadBig, Buffer); + Success = ExtReadFileBig(FileHandle, N, &BytesReadBig, Buffer); *Count = (ULONG)BytesReadBig; // @@ -1261,9 +1261,9 @@ ARC_STATUS Ext2Read(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count) return EIO; } -ARC_STATUS Ext2Seek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) +ARC_STATUS ExtSeek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) { - PEXT2_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); + PEXT_FILE_INFO FileHandle = FsGetDeviceSpecific(FileId); LARGE_INTEGER NewPosition = *Position; switch (SeekMode) @@ -1285,31 +1285,31 @@ ARC_STATUS Ext2Seek(ULONG FileId, LARGE_INTEGER* Position, SEEKMODE SeekMode) return ESUCCESS; } -const DEVVTBL Ext2FuncTable = +const DEVVTBL ExtFuncTable = { - Ext2Close, - Ext2GetFileInformation, - Ext2Open, - Ext2Read, - Ext2Seek, + ExtClose, + ExtGetFileInformation, + ExtOpen, + ExtRead, + ExtSeek, L"ext2fs", }; -const DEVVTBL* Ext2Mount(ULONG DeviceId) +const DEVVTBL* ExtMount(ULONG DeviceId) { - PEXT2_VOLUME_INFO Volume; - EXT2_SUPER_BLOCK SuperBlock; + PEXT_VOLUME_INFO Volume; + EXT_SUPER_BLOCK SuperBlock; LARGE_INTEGER Position; ULONG Count; ARC_STATUS Status; - TRACE("Enter Ext2Mount(%lu)\n", DeviceId); + TRACE("Enter ExtMount(%lu)\n", DeviceId); /* Allocate data for volume information */ - Volume = FrLdrTempAlloc(sizeof(EXT2_VOLUME_INFO), TAG_EXT_VOLUME); + Volume = FrLdrTempAlloc(sizeof(EXT_VOLUME_INFO), TAG_EXT_VOLUME); if (!Volume) return NULL; - RtlZeroMemory(Volume, sizeof(EXT2_VOLUME_INFO)); + RtlZeroMemory(Volume, sizeof(EXT_VOLUME_INFO)); /* Read the SuperBlock */ Position.QuadPart = 2 * 512; @@ -1326,8 +1326,8 @@ const DEVVTBL* Ext2Mount(ULONG DeviceId) return NULL; } - /* Check if SuperBlock is valid. If yes, return Ext2 function table. */ - if (SuperBlock.magic != EXT2_MAGIC) + /* Check if SuperBlock is valid. If yes, return Ext function table. */ + if (SuperBlock.magic != EXT_MAGIC) { FrLdrTempFree(Volume, TAG_EXT_VOLUME); return NULL; @@ -1336,18 +1336,18 @@ const DEVVTBL* Ext2Mount(ULONG DeviceId) Volume->DeviceId = DeviceId; /* Really open the volume */ - if (!Ext2OpenVolume(Volume)) + if (!ExtOpenVolume(Volume)) { FrLdrTempFree(Volume, TAG_EXT_VOLUME); return NULL; } - /* Remember EXT2 volume information */ - Ext2Volumes[DeviceId] = Volume; + /* Remember EXT volume information */ + ExtVolumes[DeviceId] = Volume; /* Return success */ - TRACE("Ext2Mount(%lu) success\n", DeviceId); - return &Ext2FuncTable; + TRACE("ExtMount(%lu) success\n", DeviceId); + return &ExtFuncTable; } #endif diff --git a/boot/freeldr/freeldr/lib/fs/fs.c b/boot/freeldr/freeldr/lib/fs/fs.c index cefdad7249f..fe640f69a55 100644 --- a/boot/freeldr/freeldr/lib/fs/fs.c +++ b/boot/freeldr/freeldr/lib/fs/fs.c @@ -65,7 +65,7 @@ PFS_MOUNT FileSystems[] = BtrFsMount, #ifndef _M_ARM NtfsMount, - Ext2Mount, + ExtMount, #endif #if defined(_M_IX86) || defined(_M_AMD64) #ifndef UEFIBOOT
1 week, 4 days
1
0
0
0
[reactos] 01/04: [FREELDR] Rename the `ext2.*` to `ext.*`
by Daniel Victor
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=d0dfb6cf6f060a058f9ef…
commit d0dfb6cf6f060a058f9ef683cc6a5092cc7d5d57 Author: Daniel Victor <ilauncherdeveloper(a)gmail.com> AuthorDate: Sun Jan 19 14:14:58 2025 -0300 Commit: Timo Kreuzer <timo.kreuzer(a)reactos.org> CommitDate: Thu Feb 20 19:28:41 2025 +0200 [FREELDR] Rename the `ext2.*` to `ext.*` --- boot/freeldr/freeldr/CMakeLists.txt | 2 +- boot/freeldr/freeldr/include/freeldr.h | 2 +- boot/freeldr/freeldr/include/fs/{ext2.h => ext.h} | 0 boot/freeldr/freeldr/lib/fs/{ext2.c => ext.c} | 0 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/boot/freeldr/freeldr/CMakeLists.txt b/boot/freeldr/freeldr/CMakeLists.txt index ffbdaffa178..7f3493c0c4a 100644 --- a/boot/freeldr/freeldr/CMakeLists.txt +++ b/boot/freeldr/freeldr/CMakeLists.txt @@ -44,7 +44,7 @@ list(APPEND FREELDR_BOOTLIB_SOURCE lib/comm/rs232.c ## add KD support lib/fs/btrfs.c - lib/fs/ext2.c + lib/fs/ext.c lib/fs/fat.c lib/fs/fs.c lib/fs/iso.c diff --git a/boot/freeldr/freeldr/include/freeldr.h b/boot/freeldr/freeldr/include/freeldr.h index cc6478e1011..034f7dd775a 100644 --- a/boot/freeldr/freeldr/include/freeldr.h +++ b/boot/freeldr/freeldr/include/freeldr.h @@ -86,7 +86,7 @@ #include <peloader.h> /* File system headers */ -#include <fs/ext2.h> +#include <fs/ext.h> #include <fs/fat.h> #include <fs/ntfs.h> #include <fs/iso.h> diff --git a/boot/freeldr/freeldr/include/fs/ext2.h b/boot/freeldr/freeldr/include/fs/ext.h similarity index 100% rename from boot/freeldr/freeldr/include/fs/ext2.h rename to boot/freeldr/freeldr/include/fs/ext.h diff --git a/boot/freeldr/freeldr/lib/fs/ext2.c b/boot/freeldr/freeldr/lib/fs/ext.c similarity index 100% rename from boot/freeldr/freeldr/lib/fs/ext2.c rename to boot/freeldr/freeldr/lib/fs/ext.c
1 week, 4 days
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
Older →
Jump to page:
1
2
3
4
5
6
7
8
Results per page:
10
25
50
100
200