Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

207 lines
7.0 KiB

//+------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1998.
//
// File: propret.hxx
//
// Contents: Generic property retriever
//
// Classes: CGenericPropRetriever
//
// History: 12-Dec-96 SitaramR Created
//
//-------------------------------------------------------------------
#pragma once
#include <ciintf.h>
#include <fsciexps.hxx>
#include <catalog.hxx>
#include <imprsnat.hxx>
#include <oleprop.hxx>
#include <pidremap.hxx>
#include <seccache.hxx>
class CPidRemapper;
class CCompositePropRecord;
const USHORT flagNoValueYet = 0xffff;
const USHORT flagNoValue = 0xfffe;
//+---------------------------------------------------------------------------
//
// Class: CGenericPropRetriever
//
// Purpose: Retrieves properties from file systems
//
// History: 12-Dec-96 SitaramR Created
//
//----------------------------------------------------------------------------
class CGenericPropRetriever : public ICiCPropRetriever
{
public:
//
// From IUnknown
//
virtual SCODE STDMETHODCALLTYPE QueryInterface( REFIID riid, void **ppvObject );
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
//
// From ICiCPropRetriever
//
virtual SCODE STDMETHODCALLTYPE BeginPropertyRetrieval( WORKID wid ) = 0;
virtual SCODE STDMETHODCALLTYPE RetrieveValueByPid( PROPID pid,
PROPVARIANT *pbData,
ULONG *pcb );
virtual SCODE STDMETHODCALLTYPE RetrieveValueByPropSpec( const FULLPROPSPEC *pPropSpec,
PROPVARIANT *pbData,
ULONG *pcb)
{
return E_NOTIMPL;
}
virtual SCODE STDMETHODCALLTYPE FetchSDID( SDID *pSDID) { return E_NOTIMPL; }
virtual SCODE STDMETHODCALLTYPE CheckSecurity( ACCESS_MASK am, BOOL *pfGranted);
virtual SCODE STDMETHODCALLTYPE IsInScope( BOOL *pfInScope) = 0;
virtual SCODE STDMETHODCALLTYPE EndPropertyRetrieval();
//
// Local methods
//
CGenericPropRetriever( PCatalog & cat,
ICiQueryPropertyMapper *pQueryPropMapper,
CSecurityCache & secCache,
CRestriction const * pScope = 0,
ACCESS_MASK amAlreadyAccessChecked = 0 );
protected:
virtual ~CGenericPropRetriever( );
virtual void Quiesce();
//
// Stat properties.
//
virtual UNICODE_STRING const * GetName() = 0;
virtual UNICODE_STRING const * GetShortName() = 0;
virtual UNICODE_STRING const * GetPath() = 0;
virtual UNICODE_STRING const * GetVirtualPath() = 0;
virtual LONGLONG CreateTime() = 0;
virtual LONGLONG ModifyTime() = 0;
virtual LONGLONG AccessTime() = 0;
virtual LONGLONG ObjectSize() = 0;
virtual ULONG Attributes() = 0;
virtual ULONG StorageType() { return 0xFFFFFFFF; }
virtual BYTE * GetCachedProperty(PROPID pid, ULONG *pcb) { return 0; }
//
// For metadata
//
virtual BOOL GetVRootType( ULONG & ulType ) { return FALSE; }
virtual BOOL GetPropGuid( GUID & guid ) { return FALSE; }
virtual PROPID GetPropPropid() { return pidInvalid; }
virtual UNICODE_STRING const * GetPropName() { return 0; }
virtual DWORD StorageLevel() { return INVALID_STORE_LEVEL; }
virtual BOOL IsModifiable() { return TRUE; }
BOOL FetchValue( PROPID pid, PROPVARIANT * pbData, unsigned * pcb );
BOOL IsPropRecReleased() const { return _pPropRec == 0; }
BOOL IsClientRemote() const { return _pScope != 0; }
HANDLE GetClientToken()
{
return _secCache.GetToken();
}
ULONG _ulAttribFilter; // restrict based on file attributes
CImpersonateRemoteAccess _remoteAccess;
PCatalog & _cat;
WORKID _widPrimedForPropRetrieval; // Set to the wid for which BeginPropRetreival has been
// called. After EndPropRetrieval has been called, this
// is reset to widInvalid.
void FetchPath( WCHAR * pwcPath, unsigned & cwc );
CCompositePropRecord & GetPropertyRecord()
{
OpenPropertyRecord();
Win4Assert( 0 != _pPropRec );
return *_pPropRec;
}
private:
void OpenPropertyRecord()
{
if ( 0 == _pPropRec )
_pPropRec = _cat.OpenValueRecord( _widPrimedForPropRetrieval,
(BYTE *)&_aulReservedForCPropRecord );
}
void StringToVariant( UNICODE_STRING const * pString,
PROPVARIANT * pbData,
unsigned * pcb );
static unsigned BuildPath( UNICODE_STRING const * pPath,
UNICODE_STRING const * pFilename,
XGrowable<WCHAR> & xwcBuf);
static unsigned BuildPath( UNICODE_STRING const * pPath,
UNICODE_STRING const * pFilename,
CFunnyPath & funnyBuf);
static unsigned BuildPath( UNICODE_STRING const * pPath,
UNICODE_STRING const * pFilename,
WCHAR * pwcBuf,
unsigned cbBuf );
unsigned FixupPath( WCHAR const * pwcsPath,
WCHAR * pwcsFixup,
unsigned cwcFixup );
unsigned FetchFixupInScope( WCHAR const * pwcsPath,
WCHAR * pwcsFixup,
unsigned cwcFixup,
WCHAR const * pwcsRoot,
unsigned cwcRoot,
BOOL fDeep,
BOOL & fUnchanged );
CRestriction const * _pScope; // Used only for scope fixup
ACCESS_MASK _amAlreadyAccessChecked;
//
// For property access.
//
ICiQueryPropertyMapper * _pQueryPropMapper; // Owned by the query session object
COLEPropManager _propMgr;
CCompositePropRecord * _pPropRec;
CSecurityCache & _secCache; // cache of AccessCheck results
ULONG _aulReservedForCPropRecord[ (sizeof_CCompositePropRecord + 2*sizeof(ULONG) - 1) / sizeof(ULONG) ];
ULONG _cRefs;
};