425 lines
11 KiB
C++
425 lines
11 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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 <lnkobjid.hxx>
|
|
|
|
#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 <except.hxx>
|
|
|
|
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
|
|
|