https://git.reactos.org/?p=reactos.git;a=commitdiff;h=13b9c2a6d66e4e100865d…
commit 13b9c2a6d66e4e100865d38b2f3015141ef9f4cf
Author: Whindmar Saksit <whindsaks(a)proton.me>
AuthorDate: Tue Sep 3 17:38:03 2024 +0200
Commit: GitHub <noreply(a)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: