#ifndef __REINTH #define __REINTH #define ERROR_SHADOW_OP_FAILED 3000L #define ERROR_REINT_FAILED 3001L #define ERROR_STALE 3002L #define ERROR_REMOTE_OP_FAILED 3003L #define ERROR_CONFLICT_FIRST 3100L #define ERROR_CREATE_CONFLICT 3100L // A locally created file already exists #define ERROR_DELETE_CONFLICT 3101L // A lcally modified shadow has been deleted from the remote #define ERROR_UPDATE_CONFLICT 3102L // Updated on remote while client changed it when disconnected #define ERROR_ATTRIBUTE_CONFLICT 3103L #define ERROR_NO_CONFLICT_DIR 3104L #define ERROR_CONFLICT_LAST 3104L // Force level fro refreshconnections #define REFRESH_FORCE_UNC_ONLY 0 // nuke UNC connections if no outstanding ops #define REFRESH_FORCE_GENTLE 1 // nuke all connections if no outstanding ops #define REFRESH_FORCE_SHADOW 2 // nuke all shadow connections #define REFRESH_FORCE_ALL 3 // nuke all connection // Verbose level while nuking connections #define REFRESH_SILENT 0 #define REFRESH_NOISY 1 #ifdef CSC_ON_NT #define FILL_BUF_SIZE_SLOWLINK 4096 #define FILL_BUF_SIZE_LAN (FILL_BUF_SIZE_SLOWLINK * 4) #define MyStrChr wcschr #define MyPathIsUNC(lpT) ((*(lpT)==_T('\\')) && (*(lpT+1)==_T('\\'))) #else #define FILL_BUF_SIZE_SLOWLINK 512 #define FILL_BUF_SIZE_LAN (4096-1024) #define MyStrChr StrChr #define MyPathIsUNC(lpT) PathIsUNC(lpT) #endif #define PUBLIC FAR PASCAL #define PRIVATE NEAR PASCAL /******************* Macros *************************************************/ #define mModifiedOffline(ulStatus) ((ulStatus) & (SHADOW_DIRTY|SHADOW_TIME_CHANGE|SHADOW_ATTRIB_CHANGE)) /******************* Typedefs ***********************************************/ typedef struct tagERRMSG { DWORD dwError; unsigned uMessageID; } ERRMSG; typedef struct tagFAILINFO { struct tagFAILINFO FAR *lpnextFI; HSHARE hShare; HSHADOW hDir; HSHADOW hShadow; unsigned short cntFail; unsigned short cntMaxFail; DWORD dwFailTime; #ifdef DEBUG _TCHAR rgchPath[MAX_PATH+1]; #endif //DEBUG } FAILINFO, FAR *LPFAILINFO; typedef struct tagCONNECTINFO { struct tagCONNECTINFO *lpnextCI; unsigned uStatus; #ifdef _WIN64 __declspec(align(8)) #endif byte rgFill[]; } CONNECTINFO, FAR *LPCONNECTINFO; typedef int (CALLBACK *LPFNREFRESHPROC)(LPCONNECTINFO, DWORD); typedef int (CALLBACK *LPFNREFRESHEXPROC)(int, DWORD); // In reint.c int PRIVATE PurgeSkipQueue( BOOL fAll, HSHARE hShare, HSHADOW hDir, HSHADOW hShadow ); int PUBLIC ReintAllShares(HWND hwndParent); typedef struct tagUPDATEINFO { HSHARE hShare; HWND hwndParent; } UPDATEINFO, FAR * PUPDATEINFO; // // Pass in the Share to merge on // and the parent window. // int PUBLIC ReintOneShare(HSHARE hShare, HSHADOW hRoot, _TCHAR *, _TCHAR *, _TCHAR *, ULONG, LPCSCPROC lpfnMergeProgress, DWORD_PTR dwContext); BOOL FGetConnectionList(LPCONNECTINFO *, int *); BOOL FGetConnectionListEx(LPCONNECTINFO *lplpHead, LPCTSTR lptzShareName, BOOL fAllSharesOnServer, BOOL fForceOffline, int *lpcntDiscon); int DisconnectList(LPCONNECTINFO *, LPFNREFRESHPROC lpfn, DWORD dwCookie); int ReconnectList(LPCONNECTINFO *,HWND hwndParent); VOID ClearConnectionList(LPCONNECTINFO *); void DoFreeShadowSpace(void); void GetLogCopyStatus(void); _TCHAR * PRIVATE LpGetExclusionList( VOID ); VOID PRIVATE ReleaseExclusionList( LPVOID lpBuff); DWORD PRIVATE DWConnectNet( _TCHAR *lpSharePath, _TCHAR *lpOutDrive, _TCHAR *lpDomainName, _TCHAR *lpUserName, _TCHAR *lpPassword, DWORD dwFlags, BOOL *lpfIsDfsConnect ); DWORD DWDisconnectDriveMappedNet( LPTSTR lptzDrive, BOOL fForce ); #ifdef DEBUG VOID EnterSkipQueue( HSHARE hShare, HSHADOW hDir, HSHADOW hShadow, _TCHAR * lpPath ); #else VOID EnterSkipQueue( HSHARE hShare, HSHADOW hDir, HSHADOW hShadow); #endif //DEBUG BOOL GetWin32Info( _TCHAR * lpFile, LPWIN32_FIND_DATA lpFW32 ); LPCOPYPARAMS LpAllocCopyParams(VOID); VOID FreeCopyParams( LPCOPYPARAMS lp ); BOOL CALLBACK ShdLogonProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); int BreakConnectionsInternal( int force, BOOL verbose ); int RefreshConnectionsInternal( int force, BOOL verbose ); int RefreshConnectionsEx( int force, BOOL verbose, LPFNREFRESHEXPROC lpfn, DWORD dwCookie ); //Synchronization functions int PUBLIC EnterAgentCrit( VOID ); VOID PUBLIC LeaveAgentCrit( VOID ); int ExtractSpaceStats( IN GLOBALSTATUS *lpsGS, OUT unsigned long *lpulMaxSpace, OUT unsigned long *lpulCurSpace, OUT unsigned long *lpulFreeSpace ); VOID ReInt_DoFreeShadowSpace( GLOBALSTATUS *lpsGS, int fForce ); BOOL CALLBACK ShdLogonProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ); BOOL TruncateAndMarkSparse( HANDLE, _TCHAR *, LPSHADOWINFO ); DWORD DWConnectNetEx( _TCHAR * lpSharePath, _TCHAR * lpOutDrive, BOOL fInteractive ); int AttemptCacheFill ( HSHARE hShare, int type, BOOL fFullSync, ULONG ulPrincipalID, LPCSCPROC lpfnFillProgress, DWORD_PTR dwContext ); DWORD DoSparseFill( HANDLE hShadowDB, _TCHAR *, _TCHAR *, LPSHADOWINFO, WIN32_FIND_DATA *, LPCOPYPARAMS lpCP, BOOL fStalenessCheck, ULONG ulPrincipalID, LPCSCPROC, DWORD_PTR ); DWORD DoRefresh( HANDLE hShadowDB, LPCOPYPARAMS lpCP, _TCHAR *, LPSHADOWINFO, _TCHAR * ); VOID ReportLastError( VOID ); int CheckDirtyShares( VOID ); // Shadow Cache Maintenance Functions int DoDBMaintenance(VOID); int ClearShadowCache(VOID); void CopyLogToShare(void); BOOL FStopAgent( VOID ); BOOL UpdateExclusionList( VOID ); BOOL UpdateBandwidthConservationList( VOID ); BOOL SetAgentThreadImpersonation( HSHADOW hDir, HSHADOW hShadow, BOOL fWrite ); BOOL ResetAgentThreadImpersonation( VOID ); BOOL FAbortOperation( VOID ); VOID SetAgentShutDownRequest( VOID ); BOOL HasAgentShutDown( VOID ); VOID CleanupReintState( VOID ); BOOL InitCSCUI( HANDLE hToken ); VOID TerminateCSCUI( VOID ); BOOL GetWin32InfoForNT( _TCHAR * lpFile, LPWIN32_FIND_DATA lpFW32 ); DWORD DoNetUseAddForAgent( IN LPTSTR lptzShareName, IN LPTSTR lptzUseName, IN LPTSTR lptzDomainName, IN LPTSTR lptzUserName, IN LPTSTR lptzPassword, IN DWORD dwFlags, OUT BOOL *lpfIsDfsConnect ); #define DO_ONE_OBJECT 1 #define DO_ONE_SHARE 2 #define DO_ALL 3 #define TOD_CALLBACK_REASON_BEGIN 0 #define TOD_CALLBACK_REASON_NEXT_ITEM 1 #define TOD_CALLBACK_REASON_END 2 #define TOD_CONTINUE 0 #define TOD_ABORT 1 #define TOD_SKIP_DIRECTORY 2 typedef int (*TRAVERSEFUNC)( HANDLE, LPSECURITYINFO, _TCHAR *, DWORD, WIN32_FIND_DATA *, LPSHADOWINFO, LPVOID); int TraverseOneDirectory( HANDLE hShadowDB, LPSECURITYINFO pShareSecurityInfo, HSHADOW hParentDir, HSHADOW hDir, LPTSTR lptzInputPath, TRAVERSEFUNC lpfnTraverseDir, LPVOID lpContext ); BOOL GetCSCPrincipalID( ULONG *lpPrincipalID ); BOOL GetCSCAccessMaskForPrincipal( unsigned long ulPrincipalID, HSHADOW hDir, HSHADOW hShadow, unsigned long *pulAccessMask ); BOOL GetCSCAccessMaskForPrincipalEx( unsigned long ulPrincipalID, HSHADOW hDir, HSHADOW hShadow, unsigned long *pulAccessMask, unsigned long *pulActualMaskForUser, unsigned long *pulActualMaskForGuest ); BOOL GetConnectionInfoForDriveBasedName( _TCHAR * lpName, LPDWORD lpdwSpeed ); BOOL ReportTransitionToDfs( _TCHAR *lptServerName, BOOL fOffline, DWORD cbLen ); BOOL CSCEnumForStatsInternal( IN LPCTSTR lpszShareName, IN LPCSCPROC lpfnEnumProgress, IN BOOL fPeruserInfo, IN BOOL fUpdateShareReintBit, IN DWORD_PTR dwContext ); // interval in milliseconds between two sparsefill attempts #define WAIT_INTERVAL_ATTEMPT_MS (1000*60) // 1 minute // interval in milliseconds between two polls for global status #define WAIT_INTERVAL_GLOBALSTATUS_MS (1000*60*10) // 10 minutes // duration in milliseconds after which an entry that is in the skip queue is nuked #define WAIT_INTERVAL_SKIP_MS (1000*60*10) // 10 minutes // duration in milliseconds between two stalenesscheck iterations #define WAIT_INTERVAL_BETWEEN_ITERATIONS_MS (1000*60*10) // interval in milliseconds between two staleness check attempts #define WAIT_INTERVAL_STALE_MS (1000*5) // 5 seconds #define WAIT_INTERVAL_CHECK_SERVER_ONLINE_MS (1000*60*8) // 8 minutes #define WAIT_INTERVAL_FILL_THROTTLE_MS (1000*60*2) // 2 minutes // delay to wait for PNP to settle down #define WAIT_INTERVAL_PNP (1000*15) // 15 seconds // for some Registry queries, this is the max len buffer that I want back #define MAX_NAME_LEN 100 #define SZ_TRUE "true" #define SZ_FALSE "false" extern _TCHAR * vlpExclusionList; extern HANDLE vhMutex; extern BOOL vfLogCopying,vfCopying,allowAttempt; extern HCURSOR vhcursor; extern HWND vhdlgShdLogon; extern DWORD dwVxDEvent; extern HWND vhwndMain; extern HANDLE vhShadowDB; extern DWORD vdwAgentThreadId; extern DWORD vdwAgentSessionId; #ifdef CSC_ON_NT extern DWORD vdwCopyChunkThreadId; extern HDESK hdesktopUser; #endif extern BOOL fFillers; #define RWM_UPDATE (WM_USER+0x200) #define RWM_UPDATEALL (WM_USER+0x201) #ifdef DEBUG //dbgprint interface #define ReintKdPrint(__bit,__x) {\ if (((REINT_KDP_##__bit)==0) || (ReintKdPrintVector & (REINT_KDP_##__bit))) {\ DEBUG_PRINT(__x);\ }\ } #define REINT_KDP_ALWAYS 0x00000000 #define REINT_KDP_BADERRORS 0x00000001 #define REINT_KDP_INIT 0x00000002 #define REINT_KDP_MAINLOOP 0x00000004 #define REINT_KDP_FILL 0x00000008 #define REINT_KDP_MERGE 0x00000010 #define REINT_KDP_API 0x00000020 #define REINT_KDP_SPACE 0x00000040 #define REINT_KDP_STALENESS 0x00000080 #define REINT_KDP_SKIPQUEUE 0x00000100 #define REINT_KDP_SECURITY 0x00000200 #define REINT_KDP_GOOD_DEFAULT (REINT_KDP_BADERRORS) extern ULONG ReintKdPrintVector; #else #define ReintKdPrint(__bit,__x) ; #endif #endif