354 lines
11 KiB
C++
354 lines
11 KiB
C++
/******************************************************************************
|
|
*
|
|
* 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
|
|
|