|
|
/*++
Microsoft Windows Copyright (C) Microsoft Corporation, 1981 - 1998
Module Name:
redir.hxx
Abstract: See comments in redir.cxx
Author:
Rahul Thombre (RahulTh) 8/11/1998
Revision History:
8/11/1998 RahulTh Created this module.
--*/
#ifndef __REDIR_HXX__
#define __REDIR_HXX__
// Homedir variable
#define HOMEDIR_STR L"%HOMESHARE%%HOMEPATH%"
//enumeration type to keep track of whether shares are online/offline/local
typedef enum tagSHARESTATUS { PathLocal, ShareOffline, ShareOnline, NoCSC } SHARESTATUS;
//the redirection flags in the ini file.
typedef enum tagREDIR { REDIR_MOVE_CONTENTS = 0x1, //move contents of the folder
REDIR_FOLLOW_PARENT = 0x2, //special descendants should follow the parent
REDIR_DONT_CARE = 0x4, //policy has no effect on the location
REDIR_SCALEABLE = 0x8, //only used by the snapin ui
REDIR_SETACLS = 0x10, //if set, acl check will be performed
REDIR_RELOCATEONREMOVE= 0x20 //if set, it means that the contents should not be orphaned upon policy removal
} REDIR;
//an enumeration of the folders that can be redirected.
//note: parent folders must appear before their children.
typedef enum tagRedirectable { Desktop = 0, MyDocs, MyPics, StartMenu, Programs, Startup, AppData, EndRedirectable } REDIRECTABLE;
//forward declarations
class CFileDB; class CSavedSettings;
class CRedirectInfo { friend CRedirectInfo; //useful in merging using overloaded assignment methods
friend class CRedirectionPolicy;
public: CRedirectInfo(); ~CRedirectInfo();
static REDIRECTABLE GetFolderIndex (LPCTSTR szFldrName); void ResetMembers (void); DWORD LoadLocalizedNames (void); DWORD GatherRedirectionInfo (CFileDB * pFileDB, DWORD dwFlags, BOOL bRemove); const DWORD GetFlags (void); const DWORD GetRedirStatus (void); const BOOL WasRedirectionAttempted (void); LPCTSTR GetLocation (void); LPCTSTR GetLocalizedName (void);
DWORD Redirect (HANDLE hUserToken, HKEY hKeyRoot, CFileDB* pFileDB); void UpdateDescendant (void); CRedirectInfo& operator= (const CRedirectInfo& ri); //overloaded assignment : used for merging
DWORD PerformRedirection (CFileDB * pFileDB, BOOL bSourceValid, WCHAR * pwszSource, WCHAR * pwszDest, SHARESTATUS StatusFrom, SHARESTATUS StatusTo, HANDLE hUserToken ); void PreventRedirection (DWORD Status); void PreventDescendantRedirection (DWORD Status); DWORD ComputeEffectivePolicyRemoval (PGROUP_POLICY_OBJECT pDeletedGPOList, PGROUP_POLICY_OBJECT pChangedGPOList, CFileDB * pFileDB);
BOOL HasPolicy();
//private data members
private: static int m_idConstructor; REDIRECTABLE m_rID; CRedirectInfo* m_pChild; CRedirectInfo* m_pParent; TCHAR* m_szLocation; DWORD m_cbLocSize; TCHAR m_szFolderRelativePath[80]; //80 characters ought to be enough for
//the display name of the folder.
TCHAR m_szDisplayName[80]; //the display name of the folder.
TCHAR m_szLocFolderRelativePath[80]; //localized relative path.
TCHAR m_szLocDisplayName[80]; //localized display name.
DWORD m_dwFlags; //the redirection flags as obtained from
BOOL m_bRemove; //the redirection is actually due to a policy removal
BOOL m_fDataValid; PSID m_pSid; //the sid of the group that was used to redirect the user
BOOL m_bValidGPO; //if a valid GPO name is stored in m_szGPOName;
WCHAR m_szGPOName[50]; //the GPO name (if any) that results in the redirection
//notes::::::
//normally in order to determine if a child is supposed to follow the parent
//one can use m_dwFlags & REDIR_FOLLOW_PARENT. However, this information
//gets lost when UpdateDescendant is invoked as it sets the redirection
//settings based on its parent. In fact, after this, if
//m_dwFlags & REDIR_FOLLOW_PARENT still succeeds, it is an indication of
//the fact that UpdateDescendant failed. Thus, in the redirection phase
//we need to keep track of whether a child was supposed to follow the parent
//or not so that redirection of a child is not attempted if that of the
//parent fails
//hence the following variable is used to keep track of whether a child
//was supposed to follow the parent or not
BOOL m_bFollowsParent;
//the following variable is used to keep track of whether redirection has
//already been attempted for this particular folder. This is necessary
//because redirection of special descendants may be attempted via their
//parents as well as via the normal iteration in ProcessGroupPolicy so
//we don't want to attempt the redirection twice
BOOL m_bRedirectionAttempted;
//also, we must record the return code whenever we attempt redirection
//so that we can record the same code when redirection is attempted again.
//this is necessary because when redirection of a special descendant folder
//is attempted via the parent, then this is the only place where its return
//value is recorded. When redirection of the special descendant is attempted
//again in the normal iteration in ProcessGroupPolicy, the Redirect member
//function returns the value stored in m_StatusRedirection which is then
//recorded by ProcessGroupPolicy and reported back to the policy engine
//this ensures that the wrong value is never recorded for any folder and
//that the policy engine never gets back an incorrect return value.
DWORD m_StatusRedir;
WCHAR* m_szGroupRedirectionData;
DWORD m_iRedirectingGroup; // For RSoP -- index in the ini file
// of the group causing this redirection
//private helper functions
private: BOOL ShouldSaveExpandedPath(void); void FreeAllocatedMem (void);
};
//put the extern declarations here so that redir.[ch]xx encompass all
//the info. and variables related to redirection.
extern const int g_lRedirInfoSize; extern CRedirectInfo gPolicyResultant[]; //size specified in redir.cxx
extern CRedirectInfo gDeletedPolicyResultant[]; extern CRedirectInfo gAddedPolicyResultant[];
//other global vars
extern WCHAR * g_szRelativePathNames[]; extern WCHAR * g_szDisplayNames[];
#endif //__REDIR_HXX__
|