windows-nt/Source/XPSP1/NT/admin/pchealth/sr/inc/utils.h
2020-09-26 16:20:57 +08:00

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