https://git.reactos.org/?p=reactos.git;a=commitdiff;h=13b9c2a6d66e4e100865d38b2f3015141ef9f4cf
commit 13b9c2a6d66e4e100865d38b2f3015141ef9f4cf Author: Whindmar Saksit <whinds...@proton.me> AuthorDate: Tue Sep 3 17:38:03 2024 +0200 Commit: GitHub <nore...@github.com> CommitDate: Tue Sep 3 17:38:03 2024 +0200 [SHELL32] Lnk propertysheet must disallow editing special targets (#6993) CORE-16505 --- dll/win32/shell32/CShellLink.cpp | 94 ++++++++++++++++++++++++++++++---------- 1 file changed, 71 insertions(+), 23 deletions(-) diff --git a/dll/win32/shell32/CShellLink.cpp b/dll/win32/shell32/CShellLink.cpp index 5a73cb3fe49..41099e0f550 100644 --- a/dll/win32/shell32/CShellLink.cpp +++ b/dll/win32/shell32/CShellLink.cpp @@ -2688,39 +2688,33 @@ INT_PTR CALLBACK ExtendedShortcutProc(HWND hwndDlg, UINT uMsg, * * Function to get target type by passing full path to it */ -LPWSTR SH_GetTargetTypeByPath(LPCWSTR lpcwFullPath) +void SH_GetTargetTypeByPath(LPCWSTR lpcwFullPath, LPWSTR szBuf, UINT cchBuf) { LPCWSTR pwszExt; - static WCHAR wszBuf[MAX_PATH]; + BOOL fFolderTarget = PathIsDirectoryW(lpcwFullPath); + DWORD fAttribs = fFolderTarget ? FILE_ATTRIBUTE_DIRECTORY : 0; /* Get file information */ SHFILEINFOW fi; - if (!SHGetFileInfoW(lpcwFullPath, 0, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES)) + if (!SHGetFileInfoW(lpcwFullPath, fAttribs, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES)) { ERR("SHGetFileInfoW failed for %ls (%lu)\n", lpcwFullPath, GetLastError()); fi.szTypeName[0] = L'\0'; fi.hIcon = NULL; } - pwszExt = PathFindExtensionW(lpcwFullPath); + pwszExt = fFolderTarget ? L"" : PathFindExtensionW(lpcwFullPath); if (pwszExt[0]) { if (!fi.szTypeName[0]) - { - /* The file type is unknown, so default to string "FileExtension File" */ - size_t cchRemaining = 0; - LPWSTR pwszEnd = NULL; - - StringCchPrintfExW(wszBuf, _countof(wszBuf), &pwszEnd, &cchRemaining, 0, L"%s ", pwszExt + 1); - } + StringCchPrintfW(szBuf, cchBuf,L"%s ", pwszExt + 1); else - { - /* Update file type */ - StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s (%s)", fi.szTypeName, pwszExt); - } + StringCchPrintfW(szBuf, cchBuf, L"%s (%s)", fi.szTypeName, pwszExt); + } + else + { + StringCchPrintfW(szBuf, cchBuf, L"%s", fi.szTypeName); } - - return wszBuf; } BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam) @@ -2733,6 +2727,7 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam) m_sIcoPath, m_sPath, m_sPathRel, sProduct, m_sWorkDir); m_bInInit = TRUE; + UINT darwin = m_Header.dwFlags & (SLDF_HAS_DARWINID); /* Get file information */ // FIXME! FIXME! Shouldn't we use m_sIcoPath, m_Header.nIconIndex instead??? @@ -2754,9 +2749,17 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam) else ERR("ExtractIconW failed %ls %u\n", m_sIcoPath, m_Header.nIconIndex); + if (!SHGetFileInfoW(m_sLinkPath, 0, &fi, sizeof(fi), SHGFI_DISPLAYNAME)) + fi.szDisplayName[0] = UNICODE_NULL; + SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TEXT, fi.szDisplayName); + /* Target type */ if (m_sPath) - SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TYPE_EDIT, SH_GetTargetTypeByPath(m_sPath)); + { + WCHAR buf[MAX_PATH]; + SH_GetTargetTypeByPath(m_sPath, buf, _countof(buf)); + SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TYPE_EDIT, buf); + } /* Target location */ if (m_sPath) @@ -2770,7 +2773,8 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam) /* Target path */ if (m_sPath) { - WCHAR newpath[2*MAX_PATH] = L"\0"; + WCHAR newpath[MAX_PATH * 2]; + newpath[0] = UNICODE_NULL; if (wcschr(m_sPath, ' ')) StringCchPrintfExW(newpath, _countof(newpath), NULL, NULL, 0, L"\"%ls\"", m_sPath); else @@ -2813,6 +2817,54 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam) SendMessageW(hRunCombo, CB_SETCURSEL, index, 0); } + BOOL disablecontrols = FALSE; + if (darwin) + { + disablecontrols = TRUE; + EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_FIND), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_CHANGE_ICON), FALSE); + } + else + { + WCHAR path[MAX_PATH * 2]; + path[0] = UNICODE_NULL; + HRESULT hr = GetPath(path, _countof(path), NULL, SLGP_RAWPATH); + if (FAILED(hr)) + hr = GetPath(path, _countof(path), NULL, 0); +#if DBG + if (GetKeyState(VK_CONTROL) < 0) // Allow inspection of PIDL parsing path + { + hr = S_OK; + path[0] = UNICODE_NULL; + } +#endif + if (hr != S_OK) + { + disablecontrols = TRUE; + LPITEMIDLIST pidl; + if (GetIDList(&pidl) == S_OK) + { + path[0] = UNICODE_NULL; + SHGetNameAndFlagsW(pidl, SHGDN_FORADDRESSBAR | SHGDN_FORPARSING, path, _countof(path), NULL); + SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TYPE_EDIT, path); + SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TARGET_TEXT, path); + ILRemoveLastID(pidl); + path[0] = UNICODE_NULL; + SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_START_IN_EDIT, path); + SHGetNameAndFlagsW(pidl, SHGDN_NORMAL, path, _countof(path), NULL); + SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION_EDIT, path); + ILFree(pidl); + } + EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_ADVANCED), FALSE); + EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_START_IN_EDIT), FALSE); + } + else + { + ASSERT(FAILED(hr) || !(path[0] == ':' && path[1] == ':' && path[2] == '{')); + } + } + EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_TARGET_TEXT), !disablecontrols); + /* auto-completion */ SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_TARGET_TEXT), SHACF_DEFAULT); SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_START_IN_EDIT), SHACF_DEFAULT); @@ -2828,10 +2880,6 @@ void CShellLink::OnCommand(HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify) { case IDC_SHORTCUT_FIND: SHOpenFolderAndSelectItems(m_pPidl, 0, NULL, 0); - /// - /// FIXME - /// open target directory - /// return; case IDC_SHORTCUT_CHANGE_ICON: