|
|
/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name: rstrpriv.h
Abstract: This file defines common constants and utility macros, and contains the declarations of private utility functions.
Revision History: Seong Kook Khang (SKKhang) 07/07/99 created
******************************************************************************/
#ifndef _RSTRPRIV_H__INCLUDED_
#define _RSTRPRIV_H__INCLUDED_
#pragma once
//#include <changelog.h>
#include <srdefs.h>
#include <srrestoreptapi.h>
#include <ppath.h>
#include <utils.h>
#include <snapshot.h>
#include <srshell.h>
// System Restore Application Start Mode
enum { SRASM_NORMAL, // Show Main Page
SRASM_SUCCESS, // Show Success Result Page
SRASM_FAIL, // Show Failure Result Page
SRASM_FAILLOWDISK, // Show Fail-Low-Disk Result Page
SRASM_FAILINTERRUPTED };
#ifdef TEST_UI_ONLY
////////////////////////////////////////////////////////////////////////////
// Temporary definitions until entire SR components are in place
////////////////////////////////////////////////////////////////////////////
// from constants.h
static LPCTSTR s_cszHiddenSFPEnableVal = TEXT("2567"); static LPCTSTR s_cszHiddenSFPDisableVal = TEXT("2803");
#if 0
// statemgr.dll
BOOL DisableArchivingI( BOOL fMode ); #define DisableArchiving DisableArchivingI
// from sfpcapi.h
extern BOOL DisableSFP( BOOL fDisable, LPCTSTR pszKey ); extern BOOL DisableFIFO( INT64 llSeqNum ); extern BOOL EnableFIFO();
// from restoreptlog.h
typedef struct _RestorePtLogEntry { DWORD m_dwSize; DWORD m_dwType; INT64 m_llSeqNum; time_t ltime; WCHAR m_szCab[16]; CHAR m_bDesc[1]; } RESTOREPTLOGENTRY, *PRESTOREPTLOGENTRY;
// from restoreptapi.h
BOOL FindFirstRestorePt( PRESTOREPTLOGENTRY *ppEntry ); BOOL FindNextRestorePt( PRESTOREPTLOGENTRY *ppEntry ); BOOL ShutRestorePtAPI(PRESTOREPTLOGENTRY *ppEntry); #endif
// from srrestoreptapi.h
// from chglogapi.h
extern BOOL InitChgLogAPI(); extern BOOL ShutChgLogAPI(); extern VOID FreeChgLogPtr( LPVOID pPtr ); extern BOOL GetArchiveDir( LPTSTR* ppszArchiveDir ); extern BOOL RequestDSAccess( BOOL fMode );
// from vxdlog.h
enum { OPR_UNKNOWN = 0, OPR_FILE_ADD = 1, OPR_FILE_DELETE = 2, OPR_FILE_MODIFY = 3, OPR_RENAME = 4, OPR_SETATTRIB = 5, OPR_DIR_CREATE = 6, OPR_DIR_DELETE = 7 };
typedef struct VXD_LOG_ENTRY { DWORD m_dwSize; DWORD m_dwType; DWORD m_dwAttrib; DWORD m_dwSfp; DWORD m_dwFlags; INT64 m_llSeq; CHAR m_szProc[16]; BYTE m_bDrive[16]; CHAR m_szTemp[16]; CHAR m_bData[1]; } VxdLogEntry;
#define MAX_VXD_LOG_ENTRY ( sizeof(VxdLogEntry) + 3 * MAX_PPATH_SIZE )
// from restmap.h
typedef struct RESTORE_MAP_ENTRY { DWORD m_dwSize; DWORD m_dwOperation ; DWORD m_dwAttribute ; BYTE m_bDrive[16]; BYTE m_szCab [16]; BYTE m_szTemp[16]; CHAR m_bData [ 1 ]; } RestoreMapEntry;
extern BOOL CreateRestoreMap( INT64 nSeqNum, LPTSTR szRestFile, DWORD *pdwErrorCode );
////////////////////////////////////////////////////////////////////////////
// END of Temporary stuffs
////////////////////////////////////////////////////////////////////////////
#endif //def TEST_UI_ONLY
#ifdef TEST_UI_ONLY
#else
//extern "C" __declspec(dllimport) BOOL DisableArchiving( BOOL fMode );
#endif
// RESTORE SHELL
#define TID_RSTR_MAIN 0x0500
#define TID_RSTR_CLIWND 0x0501
#define TID_RSTR_RPDATA 0x0502
#define TID_RSTR_RSTRMAP 0x0503
#define TID_RSTR_UTIL 0x0504
#define TID_RSTR_LOGFILE 0x0505
#define TID_RSTR_PROCLIST 0x0506
#define TID_RSTR_RSTRCAL 0x0507
#define TID_RSTR_RSTRPROG 0x0508
#define TID_RSTR_RSTRSHL 0x0509
#define TID_RSTR_RSTREDIT 0x050A
#define TID_RSTR_UNDO 0x050B
#define MAX_STR_TITLE 256
#define MAX_STR_MSG 1024
#define SAFE_RELEASE(p) \
if ( (p) != NULL ) \ { \ (p)->Release(); \ p = NULL; \ } \
#define SAFE_DELETE(p) \
if ( (p) != NULL ) \ { \ delete p; \ p = NULL; \ } \
#define SAFE_DEL_ARRAY(p) \
if ( (p) != NULL ) \ { \ delete [] p; \ p = NULL; \ } \
#define VALIDATE_INPUT_ARGUMENT(x) \
{ \ _ASSERT(NULL != x); \ if (NULL == x) \ { \ ErrorTrace(TRACE_ID, "Invalid Argument, NULL input parameter"); \ hr = E_INVALIDARG; \ goto Exit; \ } \ }
#define VALIDATE_INPUT_VARIANT(var,type) \
if (V_VT(&var) != type) \ { \ ErrorTrace(TRACE_ID, "Invalid Argument, V_VT(var)=%d is not expected type %d",V_VT(&var),type); \ hr = E_INVALIDARG; \ goto Exit; \ } \
#define COPYBSTR_AND_CHECK_ERROR(bstrDest,bstrSrc) \
{ \ _ASSERT(bstrSrc.Length() > 0); \ bstrDest = bstrSrc; \ if (!bstrDest) \ { \ FatalTrace(TRACE_ID, "Out of memory, cannot allocate string"); \ hr = E_OUTOFMEMORY; \ goto Exit; \ } \ }
#define COPYBSTRFROMLPCTSTR_AND_CHECK_ERROR(bstrDest,szSrc) \
{ \ _ASSERT(szSrc); \ _ASSERT(szSrc[0] != TCHAR('\0')); \ bstrDest = szSrc; \ if (!bstrDest) \ { \ FatalTrace(TRACE_ID, "Out of memory, cannot allocate string"); \ hr = E_OUTOFMEMORY; \ goto Exit; \ } \ }
#define ALLOCATEBSTR_AND_CHECK_ERROR(pbstrDest,bstrSrc) \
{ \ if ( (LPCWSTR)(bstrSrc) == NULL || ((LPCWSTR)(bstrSrc))[0] == L'\0' ) \ { \ pbstrDest = NULL; \ } \ else \ { \ *pbstrDest = ::SysAllocString(bstrSrc); \ if (NULL == *pbstrDest) \ { \ FatalTrace(TRACE_ID, "Out of memory, cannot allocate string"); \ hr = E_OUTOFMEMORY; \ goto Exit; \ } \ } \ }
#define STR_REGPATH_RUNONCE L"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce"
#define STR_REGVAL_RUNONCE L"*Restore"
#define UNDOTYPE_LOWDISK 1
#define UNDOTYPE_INTERRUPTED 2
#define RSTRMAP_MIN_WIN_DISK_SPACE_MB (50) // 50 MB limit for now
#define RSTRMAP_LOW_WIN_DISK_SPACE_MB (10) // 10 MB limit for now
//
// Registry key strings from the file constants.h
//
static LPCWSTR s_cszUIFreezeSize = L"UIFreezeSize"; static LPCWSTR s_cszSeqNumPath = L"system\\restore\\rstrseq.log";
//extern HWND g_hFrameWnd;
//
// Global Variables from MAIN.CPP
//
extern HINSTANCE g_hInst;
inline int PCHLoadString( UINT uID, LPWSTR lpBuf, int nBufMax ) { return( ::LoadString( g_hInst, uID, lpBuf, nBufMax ) ); }
//
// Functions from UNDO.CPP
//
extern BOOL UndoRestore( int nType ); extern BOOL CancelRestorePoint( void );
//
// Functions from UTIL.CPP
//
extern int SRUtil_SetCalendarTypeBasedOnLocale(LCID locale); extern LPCWSTR GetSysErrStr(); extern LPCWSTR GetSysErrStr( DWORD dwErr ); extern LPSTR IStrDupA( LPCSTR szSrc ); extern LPWSTR IStrDupW( LPCWSTR wszSrc ); extern BOOL SRFormatMessage( LPWSTR szMsg, UINT uFmtId, ... ); extern BOOL ShowSRErrDlg( UINT uMsgId, ... ); extern BOOL SRGetRegDword( HKEY hKey, LPCWSTR cszSubKey, LPCWSTR cszValue, DWORD *pdwData ); //extern LPWSTR PathElem2Str( PathElement *pElem );
//extern LPWSTR ParsedPath2Str( ParsedPath *pPath, LPCWSTR wszDrive );
extern BOOL IsFreeSpaceOnWindowsDrive( void ); extern LANGID GetDefaultUILang(void); extern BOOL ShutDownStateMgr(void);
#ifdef UNICODE
#define IStrDup IStrDupW
#else
#define IStrDup IStrDupA
#endif //ifdef UNICODE
//
// String handling class
//
class CSRStr { public: CSRStr(); CSRStr( LPCWSTR wszSrc ); CSRStr( LPCSTR szSrc ); ~CSRStr();
// Attributes
public: int LengthW(); int LengthA(); inline int Length() { #ifdef UNICODE
return( LengthW() ); #else
return( LengthA() ); #endif
} operator LPCWSTR(); operator LPCSTR();
protected: int m_cchW; LPWSTR m_strW; int m_cchA; LPSTR m_strA;
// Operations
public: void Empty(); BOOL SetStr( LPCWSTR wszSrc, int cch = -1 ); BOOL SetStr( LPCSTR szSrc, int cch = -1 ); const CSRStr& operator =( LPCWSTR wszSrc ); const CSRStr& operator =( LPCSTR szSrc );
protected: BOOL ConvertA2W(); BOOL ConvertW2A(); void Release(); };
//
// Dynamic Array class
//
template<class type, int nBlock> class CSRDynPtrArray { public: CSRDynPtrArray(); ~CSRDynPtrArray();
// Attributes
public: int GetSize() { return( m_nCur ); } int GetUpperBound() { return( m_nCur-1 ); } type GetItem( int nItem ); type operator[]( int nItem ) { return( GetItem( nItem ) ); }
protected: int m_nMax; // Maximum Item Count
int m_nCur; // Current Item Count
type *m_ppTable;
// Operations
public: BOOL AddItem( type item ); BOOL Empty(); void DeleteAll(); void ReleaseAll(); };
template<class type, int nBlock> CSRDynPtrArray<type, nBlock>::CSRDynPtrArray() { m_nMax = 0; m_nCur = 0; m_ppTable = NULL; }
template<class type, int nBlock> CSRDynPtrArray<type, nBlock>::~CSRDynPtrArray() { Empty(); }
template<class type, int nBlock> type CSRDynPtrArray<type, nBlock>::GetItem( int nItem ) { if ( nItem < 0 || nItem >= m_nCur ) { // ERROR - Out of Range
} return( m_ppTable[nItem] ); }
template<class type, int nBlock> BOOL CSRDynPtrArray<type, nBlock>::AddItem( type item ) { type *ppTableNew;
if ( m_nCur == m_nMax ) { m_nMax += nBlock;
// Assuming m_ppTable and m_nMax are always in sync.
// Review if it's necessary to validate this assumption.
if ( m_ppTable == NULL ) ppTableNew = (type*)::HeapAlloc( ::GetProcessHeap(), 0, m_nMax*sizeof(type) ); else ppTableNew = (type*)::HeapReAlloc( ::GetProcessHeap(), 0, m_ppTable, m_nMax * sizeof(type) );
if ( ppTableNew == NULL ) { // FATAL, Memory Insufficient...
return FALSE; } m_ppTable = ppTableNew; } m_ppTable[m_nCur++] = item; return( TRUE ); }
template<class type, int nBlock> BOOL CSRDynPtrArray<type, nBlock>::Empty() { if ( m_ppTable != NULL ) { ::HeapFree( ::GetProcessHeap(), 0, m_ppTable ); m_ppTable = NULL; m_nMax = 0; m_nCur = 0; } return( TRUE ); }
template<class type, int nBlock> void CSRDynPtrArray<type, nBlock>::DeleteAll() { for ( int i = m_nCur-1; i >= 0; i-- ) delete m_ppTable[i];
Empty(); }
template<class type, int nBlock> void CSRDynPtrArray<type, nBlock>::ReleaseAll() { for ( int i = m_nCur-1; i >= 0; i-- ) m_ppTable[i]->Release();
Empty(); }
#endif //_RSTRPRIV_H__INCLUDED_
|