|
|
/******************************************************************************
* * Copyright (c) 2000 Microsoft Corporation * * Module Name: * utils.h * * Abstract: * Declarations for commonly used util functions. * * Revision History: * Brijesh Krishnaswami (brijeshk) 03/17/2000 * created * *****************************************************************************/
#ifndef _UTILS_H_
#define _UTILS_H_
// trace macros
#define TENTER TraceFunctEnter
#define TLEAVE TraceFunctLeave
#define TRACE DebugTrace
#define tenter TraceFunctEnter
#define tleave TraceFunctLeave
#define trace DebugTrace
// lock macros
#define LOCKORLEAVE(a) if (! (a = m_DSLock.Lock(CLock::TIMEOUT))) { dwRc = ERROR_TIMEOUT; goto done; }
#define LOCKORLEAVE_EX(a, t) if (! (a = m_DSLock.Lock(t))) { dwRc = ERROR_TIMEOUT; goto done; }
#define UNLOCK(a) if (a) { m_DSLock.Unlock(); a = FALSE; }
#define CHECKERR(f, trace) dwErr = (f); if (dwErr != ERROR_SUCCESS) \
{ \ TRACE(0, "! %s : %ld", trace, dwErr); \ goto Err; \ }
// mem macros
#define SRMemAlloc(a) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, a)
#define SRMemFree(a) if (a) HeapFree(GetProcessHeap(), 0, a)
// unicode-ansi conversion routines
WCHAR * ConvertToUnicode(CHAR * pszString); CHAR * ConvertToANSI(WCHAR * pszwString);
#define UnicodeStringToWchar(US, pwsz) CopyMemory(pwsz, US.Buffer, US.Length); \
pwsz[US.Length/sizeof(WCHAR)]=L'\0'
// directory traversal routines
DWORD GetFileSize_Recurse (const WCHAR *pwszDir, INT64 *pllTotalBytes, BOOL *pfStop);
DWORD CompressFile (const WCHAR *pwszPath, BOOL fCompress, BOOL fDirectory);
DWORD TakeOwn (const WCHAR *pwszFile); DWORD Delnode_Recurse (const WCHAR *pwszDir, BOOL fDeleteRoot, BOOL *pfStop);
DWORD CopyFile_Recurse (const WCHAR *pwszSource, const WCHAR *pwszDest);
// returns system drive as "C:\" (if system drive is C) or as volume name
#define MAX_SYS_DRIVE 10
BOOL GetSystemDrive(LPWSTR pszDrive);
// returns TRUE if pszDrive contains the string L"C:" (if system drive is C)
BOOL IsSystemDrive(LPWSTR pszDrive);
// restore point routines
LPWSTR GetMachineGuid(); LPWSTR MakeRestorePath(LPWSTR pszDest, LPCWSTR pszDrive, LPCWSTR pszSuffix); ULONG GetID(LPCWSTR pszStr);
// registry routines
DWORD RegReadDWORD(HKEY hKey, LPCWSTR pszName, PDWORD pdwValue); DWORD RegWriteDWORD(HKEY hKey, LPCWSTR pszName, PDWORD pdwValue);
// set/get start type of specified service
DWORD SetServiceStartup(LPCWSTR pszName, DWORD dwStartType); DWORD GetServiceStartup(LPCWSTR pszName, PDWORD pdwStartType); DWORD GetServiceStartupRegistry(LPCWSTR pszName, PDWORD pdwStartType);
BOOL StopSRService(BOOL fWait);
// get the current domain or workgroup name
DWORD GetDomainMembershipInfo (WCHAR *pwszPath, WCHAR *pwszzBuffer);
// get the LSA secrets for restore
DWORD GetLsaRestoreState (HKEY hKeySoftware); DWORD SetLsaSecret (PVOID hPolicy, const WCHAR *wszSecret, WCHAR * wszSecretValue);
BOOL DoesDirExist(const TCHAR * pszFileName );
BOOL DoesFileExist(const TCHAR * pszFileName);
// this function creates all sub directories under the specified file
// name.
BOOL CreateBaseDirectory(const WCHAR * pszFileName);
DWORD SRLoadString(LPCWSTR pszModule, DWORD dwStringId, LPWSTR pszString, DWORD cbBytes); // sets acl allowing specific access to LocalSystem/Admin
// and to everyone
DWORD SetAclInObject(HANDLE hObject, DWORD dwObjectType, DWORD dwSystemMask, DWORD dwEveryoneMask, BOOL fInherit);
// sets acl to a named object allowing specific access to
// LocalSystem/Admin and to everyone
DWORD SetAclInNamedObject(WCHAR * pszDirName, DWORD dwObjectType, DWORD dwSystemMask, DWORD dwEveryoneMask, DWORD dwSystemInherit, DWORD dwEveryOneInherit);
// sets the right ACL on the root of the DS on a drive
DWORD SetCorrectACLOnDSRoot(WCHAR * wcsPath);
// returns if Everyone has write access to the directory
BOOL IsDirectoryWorldAccessible(WCHAR * pszObjectName);
// returns if the file is owned by the administrators group or system
BOOL IsFileOwnedByAdminOrSystem(WCHAR * pszObjectName);
void PostTestMessage(UINT msg, WPARAM wp, LPARAM lp);
// inline mem alloc class
class CSRAlloc { public:
inline void *operator new(size_t size) { return SRMemAlloc (size); }
inline void operator delete (void * pv) { SRMemFree (pv); } };
//////////////////////////////////////////////////////////////////////
// CLock - class that allows exclusive access to a resource
// uses a mutex - does not differentiate between readers/writers
class CLock { HANDLE hResource; public: BOOL fHaveLock; CLock(); ~CLock(); DWORD Init(); BOOL Lock(int iTimeOut); void Unlock(); static const enum {TIMEOUT = 10*60000}; };
//
// util function that checks the SR Stop event
// to see if it has been signalled or not
// will return TRUE if the event does not exist
//
BOOL IsStopSignalled(HANDLE hEvent);
// The following function logs the name of a file in the DS. The
// problem right now is that the path of the DS is so long that the
// relevant information is thrown away from the trace buffer.
void LogDSFileTrace(DWORD dwTraceID, const WCHAR * pszPrefix, // Initial message to be traced
const WCHAR * pszDSFile);
typedef DWORD (* PPROCESSFILEMETHOD) (WCHAR * pszBaseDir,// Base Directory
const WCHAR * pszFile); // File to process
DWORD DeleteGivenFile(WCHAR * pszBaseDir, // Base Directory
const WCHAR * pszFile); // file to delete
DWORD ProcessGivenFiles(WCHAR * pszBaseDir, PPROCESSFILEMETHOD pfnMethod, WCHAR * pszFindFileData);
//++-----------------------------------------------------------------------
//
// Function: WriteRegKey
//
// Synopsis: This function writes into a registry key. It also creates it
// if it does not exist.
//
// Arguments:
//
// Returns: TRUE no error
// FALSE a fatal error happened
//
// History: AshishS Created 5/22/96
//------------------------------------------------------------------------
BOOL WriteRegKey(BYTE * pbRegValue, DWORD dwNumBytes, const TCHAR * pszRegKey, const TCHAR * pszRegValueName, DWORD dwRegType);
//++------------------------------------------------------------------------
//
// Function: ReadRegKey
//
// Synopsis: This function reads a registry key and creates it
// if it does not exist with the default value.
//
// Arguments:
//
// Returns: TRUE no error
// FALSE a fatal error happened
//
// History: AshishS Created 5/22/96
//------------------------------------------------------------------------
BOOL ReadRegKeyOrCreate(BYTE * pbRegValue, // The value of the reg key will be
// stored here
DWORD * pdwNumBytes, // Pointer to DWORD conataining
// the number of bytes in the above buffer - will be
// set to actual bytes stored.
const TCHAR * pszRegKey, // Reg Key to be opened
const TCHAR * pszRegValueName, // Reg Value to query
DWORD dwRegTypeExpected, BYTE * pbDefaultValue, // default value
DWORD dwDefaultValueSize); // size of default value
//++------------------------------------------------------------------------
//
// Function: ReadRegKey
//
// Synopsis: This function reads a registry key.
//
// Arguments:
//
// Returns: TRUE no error
// FALSE a fatal error happened
//
// History: AshishS Created 5/22/96
//------------------------------------------------------------------------
BOOL ReadRegKey(BYTE * pbRegValue, // The value of the reg key will be
// stored here
DWORD * pdwNumBytes, // Pointer to DWORD conataining
// the number of bytes in the above buffer - will be
// set to actual bytes stored.
const TCHAR * pszRegKey, // Reg Key to be opened
const TCHAR * pszRegValueName, // Reg Value to query
DWORD dwRegTypeExpected); // Expected type of Value
// this function checks to see of the restore failed because of disk space
BOOL CheckForDiskSpaceError();
// this function sets the error hit by restore in the registry
BOOL SetRestoreError(DWORD dwRestoreError);
// this function sets the status whether restore was done in safe mode
BOOL SetRestoreSafeModeStatus(DWORD dwSafeModeStatus); // this function checks to see if the last restore was done in safe mode
BOOL WasLastRestoreInSafeMode();
LPCWSTR GetSysErrStr(); LPCWSTR GetSysErrStr( DWORD dwErr );
DWORD SRCopyFile( LPCWSTR cszSrc, LPCWSTR cszDst ); DWORD SRCreateSubdirectory ( LPCWSTR cszDst, LPSECURITY_ATTRIBUTES pSecAttr);
// this function returns whether the SR service is running
BOOL IsSRServiceRunning();
LPWSTR SRGetRegMultiSz( HKEY hkRoot, LPCWSTR cszSubKey, LPCWSTR cszValue, LPDWORD pdwData ); BOOL SRSetRegMultiSz( HKEY hkRoot, LPCWSTR cszSubKey, LPCWSTR cszValue, LPCWSTR cszData, DWORD cbData );
// this returns the name after the volume name
// For example input: c:\file output: file
// input \\?\Volume{GUID}\file1 output: file1
WCHAR * ReturnPastVolumeName(const WCHAR * pszFileName);
//This API sets the ShortFileName for a given file
DWORD SetShortFileName(const WCHAR * pszFile, // complete file path
const WCHAR * pszShortName); // desired short file name
void SRLogEvent (HANDLE hEventSource, WORD wType, DWORD dwID, void * pRawData, DWORD dwDataSize, const WCHAR * pszS1, const WCHAR * pszS2, const WCHAR * pszS3);
BOOL IsAdminOrSystem(); BOOL IsPowerUsers();
void ChangeCCS(HKEY hkMount, LPWSTR pszString);
void RemoveTrailingFilename(WCHAR * pszString, WCHAR wchSlash);
class CSRClientLoader { public: CSRClientLoader(); ~CSRClientLoader(); BOOL LoadSrClient(); HMODULE m_hSRClient; private:
HMODULE m_hFrameDyn;
BOOL LoadFrameDyn(); };
#endif
|