[SHELL32] Lnk propertysheet must disallow editing special targets (#6993)

CORE-16505
This commit is contained in:
Whindmar Saksit 2024-09-03 17:38:03 +02:00 committed by GitHub
parent 814f3a15f9
commit 13b9c2a6d6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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: