HRESULT CDirItems::SetLinkInfo(CDirItem &dirItem, const NFind::CFileInfo &fi, const FString &phyPrefix) { if (!SymLinks || !fi.HasReparsePoint()) return S_OK; const FString path = phyPrefix + fi.Name; CByteBuffer &buf = dirItem.ReparseData; DWORD res = 0; if (NIO::GetReparseData(path, buf)) { CReparseAttr attr; if (attr.Parse(buf, buf.Size(), res)) return S_OK; // we ignore unknown reparse points if (res != ERROR_INVALID_REPARSE_DATA) res = 0; } else { res = ::GetLastError(); if (res == 0) res = ERROR_INVALID_FUNCTION; } buf.Free(); if (res == 0) return S_OK; return AddError(path, res); }
void CDirItems::SetLinkInfo(CDirItem &dirItem, const NFind::CFileInfo &fi, const FString &phyPrefix) { if (!SymLinks || !fi.HasReparsePoint()) return; const FString path = phyPrefix + fi.Name; CByteBuffer &buf = dirItem.ReparseData; if (NIO::GetReparseData(path, buf)) { CReparseAttr attr; if (attr.Parse(buf, buf.Size())) return; } AddError(path); buf.Free(); }
bool CLinkDialog::OnInit() { #ifdef LANG LangSetWindowText(*this, IDD_LINK); LangSetDlgItems(*this, kLangIDs, ARRAY_SIZE(kLangIDs)); #endif _pathFromCombo.Attach(GetItem(IDC_LINK_PATH_FROM)); _pathToCombo.Attach(GetItem(IDC_LINK_PATH_TO)); if (!FilePath.IsEmpty()) { NFind::CFileInfo fi; int linkType = 0; if (!fi.Find(us2fs(FilePath))) linkType = IDR_LINK_TYPE_SYM_FILE; else { if (fi.HasReparsePoint()) { CReparseAttr attr; bool res = GetSymLink(us2fs(FilePath), attr); UString s = attr.PrintName; if (!attr.IsOkNamePair()) { s += L" : "; s += attr.SubsName; } if (!res) s = L"ERROR: " + s; SetItemText(IDT_LINK_PATH_TO_CUR, s); UString destPath = attr.GetPath(); _pathFromCombo.SetText(FilePath); _pathToCombo.SetText(destPath); if (res) { if (attr.IsMountPoint()) linkType = IDR_LINK_TYPE_JUNCTION; if (attr.IsSymLink()) { linkType = fi.IsDir() ? IDR_LINK_TYPE_SYM_DIR : IDR_LINK_TYPE_SYM_FILE; // if (attr.IsRelative()) linkType = IDR_LINK_TYPE_SYM_RELATIVE; } if (linkType != 0) Set_LinkType_Radio(linkType); } } else { _pathFromCombo.SetText(AnotherPath); _pathToCombo.SetText(FilePath); if (fi.IsDir()) linkType = g_SymLink_Supported ? IDR_LINK_TYPE_SYM_DIR : IDR_LINK_TYPE_JUNCTION; else linkType = IDR_LINK_TYPE_HARD; } } if (linkType != 0) Set_LinkType_Radio(linkType); } NormalizeSize(); return CModalDialog::OnInit(); }