|
|
//*************************************************************
//
// Copyright (c) Microsoft Corporation 1998
// All rights reserved
//
// filedb.hxx
//
//*************************************************************
#ifndef _FILEDB_HXX_
#define _FILEDB_HXX_
#define GPT_SUBDIR L"\\Documents & Settings\\"
#define INIFILE_NAME L"fdeploy.ini"
//forward declaration
class CCopyFailData;
typedef struct _FOLDERINFO { int CSidl; DWORD FolderNameLength; WCHAR * FolderName; } FOLDERINFO;
class CSavedSettings { friend class CRedirectInfo;
public: CSavedSettings(); ~CSavedSettings();
BOOL NeedsProcessing (void); DWORD HandleUserNameChange (CFileDB * pFileDB, CRedirectInfo * pRedir); DWORD Load (CFileDB * pFileDB);
static const DWORD MaxSidString = 256; DWORD Save (const WCHAR * pwszPath, DWORD dwFlags, PSID pSid, const WCHAR * pszGPOName);
static void ResetStaticMembers (void); void ResetMembers (void);
private: //data
static int m_idConstructor; static CFileDB * m_pFileDB; static WCHAR * m_szSavedSettingsPath;
//object specific data
REDIRECTABLE m_rID; //the id of the folder that it represents
WCHAR * m_szLastRedirectedPath; WCHAR * m_szCurrentPath; WCHAR * m_szLastUserName; //the name of the user at the last logon
BOOL m_bUserNameChanged; //if the user's logon name was different at last logon.
WCHAR * m_szLastHomedir; // The value of Homedir at last redirection.
BOOL m_bIsHomedirRedir; // Indicates if this is a homedir redirection.
BOOL m_bHomedirChanged; // Indicates if the homedir value has changed.
PSID m_psid; DWORD m_dwFlags; BOOL m_bValidGPO; WCHAR m_szGPOName[50]; //unique GPO name (if any) that was used for redirection
//50 characters are more than enough to store the GPO name.
private: //helper functions
DWORD LoadDefaultLocal (void); DWORD LoadFromIniFile (void); DWORD GetCurrentPath (void); DWORD ResetLastUserName (void); DWORD UpdateUserNameInCache (void); };
class CFileDB : public CRedirectionLog { friend class CSavedSettings; friend class CRedirectInfo; friend class CRedirectionPolicy;
public: CFileDB(); ~CFileDB();
DWORD Initialize ( HANDLE hUserToken, HKEY hkRoot, CRsopContext* pRsopContext );
DWORD Process( PGROUP_POLICY_OBJECT pGPO, BOOL bRemove );
const WCHAR * GetLocalStoragePath ();
PVOID GetEnvBlock (void);
CRsopContext* GetRsopContext();
private: DWORD ProcessRedirects();
static const DWORD MaxIniSectionSize = 32 * (1024*1024); // limit this to 32 MB to avoid a huge section that eats all memory.
BOOL ReadIniSection( WCHAR * pwszSectionName, WCHAR ** ppwszStrings, DWORD * pcchLen = NULL );
DWORD GetLocalFilePath( WCHAR * pwszFolderPath, WCHAR wszFullPath[MAX_PATH] );
DWORD GetPathFromFolderName( WCHAR * pwszFolderName, WCHAR wszFullPath[MAX_PATH] );
const FOLDERINFO* FolderInfoFromFolderName( WCHAR * pwszFolderName );
int RegValueCSIDLFromFolderName( WCHAR * pwszFolderName );
DWORD CopyFileTree( WCHAR * pwszExistingPath, WCHAR * pwszNewPath, WCHAR * pwszIgnoredSubdir, SHARESTATUS StatusFrom, SHARESTATUS StatusTo, BOOL bAllowRdrTimeout, CCopyFailData * pCopyFailure );
DWORD DeleteFileTree( WCHAR * pwszPath, WCHAR * pwszIgnoredSubdir );
DWORD CreateRedirectedFolderPath( const WCHAR * pwszSource, const WCHAR * pwszDest, BOOL bSourceValid, BOOL bCheckOwner, BOOL bMoveContents );
DWORD CreateFolderWithUserFileSecurity( WCHAR * pwszPath );
DWORD SetUserAsOwner( WCHAR * pwszPath );
DWORD IsUserOwner (const WCHAR * pwszPath);
//data
//same across all policies
HANDLE _hUserToken; HKEY _hkRoot; PTOKEN_GROUPS _pGroups; WCHAR _pwszLocalPath[MAX_PATH]; //path to the Local Settings directory
//created only if necessary but same across all policies
PVOID _pEnvBlock;
//varies with each policy
BOOL _bRemove; WCHAR * _pwszGPTPath; // Path to Documents & Settings dir on GPT
DWORD _GPTPathLen; //number of characters allocated to _pwszGPTPath
WCHAR * _pwszIniFilePath; // Full path to file deployment ini file on the GPT
DWORD _IniFileLen; //# of characters allocated to _pwszIniFilePath
WCHAR * _pwszGPOName; // From GPO_INFO struct, not alloced
WCHAR * _pwszGPOUniqueName; // From GPO_INFO struct, not alloced
WCHAR * _pwszGPOSOMPath; // From GPO_INFO struct, not alloced
WCHAR * _pwszGPODSPath; // From GPO_INFO struct, not alloced
CRsopContext* _pRsopContext; // unowned reference to rsop info
};
inline void RemoveEndingSlash( WCHAR * pwszPath ) { DWORD Length = wcslen( pwszPath );
if ( pwszPath[Length-1] == L'\\' ) pwszPath[Length-1] = 0; }
#endif
|