//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1992. // // File: ilinkp.hxx // // Contents: Declarations PRIVATE to link tracking code across // multiple Cairo projects. // Do not use these declarations without first contacting // the current owner of this file. // // Classes: CTracker -- base for all tracking links // COleTrackingLink -- base for shell and ole links // COleLinkTrackingLink -- tracking for IOleLink def link // COleShellTrackingLink -- tracking for shell ref // // Functions: // // History: 07-Aug-93 BillMo Created. // // Note: Id's of source are retrieved only when the source is bound to. // //-------------------------------------------------------------------------- #ifndef __ILINKP_HXX__ #define __ILINKP_HXX__ #include #define ELEMENTS(x) (sizeof(x)/sizeof((x)[0])) #define WCHARS(x) ELEMENTS(x) #define ALIGN8(cb) (((cb-1) & (~7)) + 8) #define WCH_COMP_SEPARATOR L'\\' #define WCH_ROOT_SEPARATOR L':' #define USER_REGISTRY_ROOT L"SoftWare\\Microsoft\\LinkSearch" #define ABSOLUTE_MAX_AUTO 64 // volumes in auto searchlist #define DEFAULT_MAX_AUTO 10 #define MAX_BROADCASTS 10 #define BROADCAST_REPLY_WAIT 300 #define DEFAULT_GROVEL_MONIKER_SIZE 1024 // new (ExceptOnFail) SFindObjectOut [FSCTL_OUT_BUFFER_SIZE]; #define FSCTL_OUT_BUFFER_SIZE 10 // // treepatcher won't allow paths > MAX_DOS_NETWORK_PATH // #define MAX_DOS_NETWORK_PATH 384 #define MAX_NT_HEADER 20 #define MAX_NT_NETWORK_PATH (MAX_DOS_NETWORK_PATH + MAX_NT_HEADER) #define MAX_EMBEDDINGLEVELS 40 #define TREECOPY_PAGESIZE 4096 #define TREEPATCHER_SIG LONGSIG('h','c','p','y') class CVolume; class CSearchContext; class CEmbeddedMonikers; //-------------------------------------------------------------------------- // // Currently private definitions that may become public. // //-------------------------------------------------------------------------- typedef DWORD HCOPY; //-------------------------------------------------------------------------- // // Private error codes. // //-------------------------------------------------------------------------- #if !defined(LNK_NO_OLE2) // // Error codes (HRESULT)0x80081580 to 0x800815bf are internal // to link tracking. // // // Generated by CVolume::FindObject to indicate the volume was // not even searched. // #define LINKP_E_VOLUME_NOT_SEARCHED ((HRESULT)0x80081580) // // Generated by objectid.cxx::ReadObjectId(IPropertyStorage*,OBJECTID*) // as an internal error to GetObjectId. // #define LINKP_E_NOSUCHPROPERTY ((HRESULT)0x80081581) // // Generated by CVolume::FindObject to indicate that the volume was // successfully contacted, but no object with matching id was found. // #define LINKP_E_VOLUME_SEARCHED_OBJECT_NOT_FOUND ((HRESULT)0x80081582) // // Used in failure testing // #define LINKP_E_FAILTEST ((HRESULT)0x80081583) // // Returned by ReplaceFileMoniker if there is no file moniker to replace. // #define LINKP_E_NOFILEMONIKER ((HRESULT)0x80081584) // // IEnumMoniker::Next returned S_FALSE immediately after IMoniker::Enum // was called successfully. // #define LINKP_E_NOMONIKERS ((HRESULT)0x80081585) // // Couldn't rebuild moniker to pseudo-object because there // weren't enough monikers in the enumeration. // #define LINKP_E_RANGE_INACCESSIBLE ((HRESULT) 0x80081586) // // The path passed to CPathWalker was too long (i.e. absolute moniker // path name too long.) // #define LINKP_E_INVALID_PATH ((HRESULT) 0x80081587) // // The ancestor was not found by CPathWalker // #define LINKP_E_ANCESTOR_NOT_FOUND ((HRESULT) 0x80081588) // // No object which is the only object with matching lineage and // last component of name // #define LINKP_E_NOLINEAGEMATCH ((HRESULT) 0x80081589) // // No object exactly matches the id // #define LINKP_E_NOEXACTMATCH ((HRESULT) 0x80081589) // // No monikers in IMoniker::Enum // #define LINKP_E_ENUMEMPTY ((HRESULT) 0x8008158a) // // Too many nesting levels // #define LINKP_E_TOOMANYEMBEDDINGLEVELS ((HRESULT) 0x8008158b) // // Used when throwing exceptions due to not enough memory // #define LINK_E_NOT_ENOUGH_MEMORY \ (HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY)) #endif // !defined(LNK_NO_OLE2) //-------------------------------------------------------------------------- // // Defines for tracker object serialized form // //-------------------------------------------------------------------------- #define SHELLMK_SIG 0x0033 #define OLEMK_SIG 0x0022 #define MAX_LINK_EXPANSION 262144 #define LINK_FLAG_DOMAINID 0x00000001 #define LINK_FLAG_VOLUMEID 0x00000002 #define LINK_FLAG_OBJECTID 0x00000004 //-------------------------------------------------------------------------- // // Function predeclarations // //-------------------------------------------------------------------------- void UpdateAutoSearchList(void); //-------------------------------------------------------------------------- // // Functions used by DRT. // //-------------------------------------------------------------------------- const WCHAR *ObjectIdToString(const OBJECTID &oid); //+------------------------------------------------------------------------- // // Class: DFSID // // Purpose: Encapsulate specifics of DFS domain and volume ids. // //-------------------------------------------------------------------------- class DFSID { public: DFSID() { Invalidate(); } VOID Invalidate(VOID) { memset(&g, 0, sizeof(g)); } operator GUID () { return(g); } operator GUID * () { return(&g); } operator == (const DFSID &other) { return(0 == memcmp(&g, &other.g, sizeof(g))); } BOOL IsValid(VOID) { DFSID i; return(i != *this); } private: GUID g; }; typedef DFSID DOMAINID; typedef DFSID VOLUMEID; //+------------------------------------------------------------------------- // // Class: CTracker // // Purpose: Base class for 1. extending Ole links, 2. supporting // shell references, 3. supporting win32 links. // // This class contains code common to all types. // // Interface: // // History: 07-Aug-93 BillMo Created. // // Notes: // //-------------------------------------------------------------------------- #if !defined(LNK_NO_OLE2) // this should be put in its own header class CTracker { public: CTracker(); // assignment operators/ctors needed because of pointer. // doesn't copy expansion data CTracker(const CTracker &); // doesn't overwrite expansion data CTracker & CTracker::operator = (const CTracker & t); ~CTracker(); // // For OLE2 tracking // BOOL operator == (const CTracker &t); BOOL operator != (const CTracker &t); HRESULT Load(IStorage *pstg); HRESULT Save(IStorage *pstg); HRESULT BindToObject(IBindCtx *pbc, IMoniker *pmkToLeft, REFIID riid, void ** ppv, IMoniker**ppmk); HRESULT UpdateIdsFromMoniker(IBindCtx *pbc, IMoniker *pmk); // // For OLE1 tracking // VOID SetObjectId(const OBJECTID &oid); // // For OLE1 and OLE2 tracking // HRESULT FindObjectName(CVolume * pVolume, BOOL fHintedVolumeValid, WCHAR ** ppwszPath, CEmbeddedMonikers *pem, CSearchContext *psc, const WCHAR *pwszOriginal); private: HRESULT SaveTrackingInfo(USHORT usSig, LPSTREAM pstm); void Read(LPSTREAM pstm, void *pv, ULONG cbExpected); HRESULT LoadTrackingInfo(USHORT usSig, LPSTREAM pstm); HRESULT SearchEnumVolumes(CVolume *pVolume, WCHAR **ppwszPath, CEmbeddedMonikers *pem, CSearchContext *psc, const WCHAR *pwszOriginal); HRESULT GetEmbeddedObjectsId(IBindCtx *pbc, IMoniker *pmk); HRESULT wBindToObject(CSearchContext *psc, IMoniker *pmkToLeft, REFIID riid, void ** ppv, IMoniker**ppmk); HRESULT GetVolume(IBindCtx * pbc, IMoniker *pmkFile, CVolume *pVolume); // // if persistent data is added, then GetSizeMax must be // changed. // ULONG _ulFlags; DOMAINID _didDomain; VOLUMEID _vidVolume; OBJECTID _oidFile; OBJECTID _oidEmbed; LONG _cNoStorage; // other cairo info // expansion data ULONG _cbExpansion; BYTE * _pbExpansion; }; #endif // !defined(LNK_NO_OLE2) #if !defined(LNK_NO_NTDEF) NTSTATUS PatchObjectId(UNICODE_STRING *pus, const OBJECTID &oid); #endif // BUGBUG this class definition should be in its own header file // when we get rid of lnkfsctl.exe's dependence on lnktrack.dll #if !defined(LNK_NO_EXCEPTIONS) //+------------------------------------------------------------------------- // // Class: CFileHandle // // Purpose: Handle opening files for caller if necessary. // // Interface: CFileHandle::CFileHandle -- Initialize. // CFileHandle::Open -- Open path. // CFileHandle::OpenIf -- Open path if handle is not passed. // CFileHandle::~CFileHandle -- Close file if we opened it. // // History: 07-Jun-92 BillMo Created. // // Notes: BUGBUG: should probably have a single unwindable object // which contains all these resources. // //-------------------------------------------------------------------------- #include class CFileHandle { public: CFileHandle(); ~CFileHandle(); NTSTATUS OpenIf(HANDLE hFile, const WCHAR * pwszPath, DWORD dwAccess, DWORD dwShare); NTSTATUS Open(const WCHAR * pwszDosPath, ACCESS_MASK AccessMask = GENERIC_READ | SYNCHRONIZE, ULONG ShareAccess = FILE_SHARE_READ); inline operator HANDLE (); private: HANDLE _hFile; BOOL _fOpened; }; //+------------------------------------------------------------------- // // Member: CFileHandle::operator HANDLE, public // // Synopsis: Return internal handle. For HANDLE parameter passing. // // History: 25-Jan-93 BillMo Created. // // Notes: // //-------------------------------------------------------------------- CFileHandle::operator HANDLE (void) { return(_hFile); } #endif // !defined(LNK_NO_EXCEPTIONS) #if !defined(LNK_NO_NTDEF) VOID PrependNtObjectName(UNICODE_STRING *pus); #endif #endif