You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
6.9 KiB
198 lines
6.9 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
|
|
Abstract:
|
|
|
|
module common.hxx |
|
|
|
|
|
|
|
|
Author:
|
|
|
|
Michael C. Johnson [mikejohn] 03-Feb-2000
|
|
Stefan R. Steiner [SSteiner] 25-Jul-2001
|
|
|
|
Description:
|
|
|
|
Contains general code and definitions used by the Shim writer and the various other writers
|
|
|
|
|
|
Revision History:
|
|
|
|
reuvenl 05/02/2002 Incorporated code from common.h/cpp into this module
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#ifndef __H_COMMON_
|
|
#define __H_COMMON_
|
|
|
|
#pragma once
|
|
|
|
#include "bsstring.hxx"
|
|
|
|
typedef PWCHAR *PPWCHAR;
|
|
typedef PVOID *PPVOID;
|
|
typedef VSS_ID *PVSS_ID, **PPVSS_ID;
|
|
|
|
#define ROOT_BACKUP_DIR L"%SystemRoot%\\Repair\\Backup"
|
|
#define BOOTABLE_STATE_SUBDIR L"\\BootableSystemState"
|
|
#define SERVICE_STATE_SUBDIR L"\\ServiceState"
|
|
|
|
|
|
/*
|
|
** In a number of places we need a buffer into which to fetch registry
|
|
** values. Define a common buffer size for the mini writers to use
|
|
*/
|
|
|
|
#ifndef REGISTRY_BUFFER_SIZE
|
|
#define REGISTRY_BUFFER_SIZE (4096)
|
|
#endif
|
|
|
|
#ifndef MAX_VOLUMENAME_LENGTH
|
|
#define MAX_VOLUMENAME_LENGTH (50)
|
|
#endif
|
|
|
|
#ifndef MAX_VOLUMENAME_SIZE
|
|
#define MAX_VOLUMENAME_SIZE (MAX_VOLUMENAME_LENGTH * sizeof (WCHAR))
|
|
#endif
|
|
|
|
#ifndef DIR_SEP_STRING
|
|
#define DIR_SEP_STRING L"\\"
|
|
#endif
|
|
|
|
#ifndef DIR_SEP_CHAR
|
|
#define DIR_SEP_CHAR L'\\'
|
|
#endif
|
|
|
|
#ifndef UMIN
|
|
#define UMIN(_P1, _P2) (((_P1) < (_P2)) ? (_P1) : (_P2))
|
|
#endif
|
|
|
|
|
|
#ifndef UMAX
|
|
#define UMAX(_P1, _P2) (((_P1) > (_P2)) ? (_P1) : (_P2))
|
|
#endif
|
|
|
|
#define HandleInvalid(_Handle) ((NULL == (_Handle)) || (INVALID_HANDLE_VALUE == (_Handle)))
|
|
|
|
#define GET_STATUS_FROM_BOOL(_bSucceeded) ((_bSucceeded) ? NOERROR : HRESULT_FROM_WIN32 (GetLastError()))
|
|
#define GET_STATUS_FROM_HANDLE(_handle) ((!HandleInvalid(_handle)) ? NOERROR : HRESULT_FROM_WIN32 (GetLastError()))
|
|
#define GET_STATUS_FROM_POINTER(_ptr) ((NULL != (_ptr)) ? NOERROR : E_OUTOFMEMORY)
|
|
|
|
#define GET_STATUS_FROM_FILESCAN(_bMoreFiles) ((_bMoreFiles) \
|
|
? NOERROR \
|
|
: ((ERROR_NO_MORE_FILES == GetLastError()) \
|
|
? NOERROR \
|
|
: HRESULT_FROM_WIN32 (GetLastError())))
|
|
|
|
|
|
#define NameIsDotOrDotDot(_ptszName) ((L'.' == (_ptszName) [0]) && \
|
|
((L'\0' == (_ptszName) [1]) || ((L'.' == (_ptszName) [1]) && \
|
|
(L'\0' == (_ptszName) [2]))))
|
|
|
|
#define DeclareStaticUnicodeString(_StringName, _StringValue) \
|
|
static UNICODE_STRING (_StringName) = {sizeof (_StringValue) - sizeof (UNICODE_NULL), \
|
|
sizeof (_StringValue), \
|
|
_StringValue}
|
|
|
|
|
|
#define RETURN_VALUE_IF_REQUIRED(_Ptr, _Value) {if (NULL != (_Ptr)) *(_Ptr) = (_Value);}
|
|
|
|
HRESULT StringInitialise (PUNICODE_STRING pucsString);
|
|
HRESULT StringInitialise (PUNICODE_STRING pucsString, PWCHAR pwszString);
|
|
HRESULT StringInitialise (PUNICODE_STRING pucsString, LPCWSTR pwszString);
|
|
HRESULT StringTruncate (PUNICODE_STRING pucsString, USHORT usSizeInChars);
|
|
HRESULT StringSetLength (PUNICODE_STRING pucsString);
|
|
HRESULT StringAllocate (PUNICODE_STRING pucsString, USHORT usMaximumStringLengthInBytes);
|
|
HRESULT StringFree (PUNICODE_STRING pucsString);
|
|
HRESULT StringCreateFromString (PUNICODE_STRING pucsNewString, PUNICODE_STRING pucsOriginalString);
|
|
HRESULT StringCreateFromString (PUNICODE_STRING pucsNewString, PUNICODE_STRING pucsOriginalString, DWORD dwExtraChars);
|
|
HRESULT StringCreateFromString (PUNICODE_STRING pucsNewString, LPCWSTR pwszOriginalString);
|
|
HRESULT StringCreateFromString (PUNICODE_STRING pucsNewString, LPCWSTR pwszOriginalString, DWORD dwExtraChars);
|
|
HRESULT StringAppendString (PUNICODE_STRING pucsTarget, PUNICODE_STRING pucsSource);
|
|
HRESULT StringAppendString (PUNICODE_STRING pucsTarget, PWCHAR pwszSource);
|
|
HRESULT StringCreateFromExpandedString (PUNICODE_STRING pucsNewString, PUNICODE_STRING pucsOriginalString);
|
|
HRESULT StringCreateFromExpandedString (PUNICODE_STRING pucsNewString, PUNICODE_STRING pucsOriginalString, DWORD dwExtraChars);
|
|
HRESULT StringCreateFromExpandedString (PUNICODE_STRING pucsNewString, LPCWSTR pwszOriginalString);
|
|
HRESULT StringCreateFromExpandedString (PUNICODE_STRING pucsNewString, LPCWSTR pwszOriginalString, DWORD dwExtraChars);
|
|
|
|
HRESULT CommonCloseHandle (PHANDLE phHandle);
|
|
|
|
|
|
HRESULT VsServiceChangeState (IN LPCWSTR pwszServiceName,
|
|
IN DWORD dwRequestedState,
|
|
OUT PDWORD pdwReturnedOldState,
|
|
OUT PBOOL pbReturnedStateChanged);
|
|
|
|
BOOL VsCreateDirectories (
|
|
IN LPCWSTR pwszPathName,
|
|
IN LPSECURITY_ATTRIBUTES lpSecurityAttribute,
|
|
IN DWORD dwExtraAttributes
|
|
);
|
|
|
|
HRESULT RemoveDirectoryTree (
|
|
IN LPCWSTR pwcsDirectoryPath
|
|
);
|
|
|
|
HRESULT CreateTargetPath(
|
|
IN LPCWSTR pwszTargetPath
|
|
);
|
|
|
|
HRESULT CleanupTargetPath(LPCWSTR pwszTargetPath);
|
|
|
|
HRESULT MoveFilesInDirectory (
|
|
IN CBsString cwsSourceDirectoryPath,
|
|
IN CBsString cwsTargetDirectoryPath
|
|
);
|
|
|
|
HRESULT IsPathInVolumeArray (IN LPCWSTR pwszPath,
|
|
IN const ULONG ulVolumeCount,
|
|
IN LPCWSTR *ppwszVolumeNamesArray,
|
|
OUT PBOOL pbReturnedFoundInVolumeArray);
|
|
|
|
|
|
const HRESULT ClassifyShimFailure (HRESULT hrShimFailure);
|
|
const HRESULT ClassifyShimFailure (HRESULT hrShimFailure, BOOL &bStatusUpdated);
|
|
const HRESULT ClassifyWriterFailure (HRESULT hrWriterFailure);
|
|
const HRESULT ClassifyWriterFailure (HRESULT hrWriterFailure, BOOL &bStatusUpdated);
|
|
|
|
|
|
|
|
HRESULT LogFailureWorker (CVssFunctionTracer *pft,
|
|
LPCWSTR pwszNameWriter,
|
|
LPCWSTR pwszNameCalledRoutine);
|
|
|
|
|
|
#define LogFailure(_pft, _hrStatus, _hrStatusRemapped, _pwszNameWriter, _pwszNameCalledRoutine, _pwszNameCallingRoutine) \
|
|
{ \
|
|
if (FAILED (_hrStatus)) \
|
|
{ \
|
|
if (CVssFunctionTracer *_pftLocal = (NULL != (_pft)) ? (_pft) : new CVssFunctionTracer (VSSDBG_SHIM, (_pwszNameCallingRoutine))) \
|
|
{ \
|
|
_pftLocal->hr = (_hrStatus); \
|
|
\
|
|
(_hrStatusRemapped) = LogFailureWorker (_pftLocal, (_pwszNameWriter), (_pwszNameCalledRoutine)); \
|
|
\
|
|
if (NULL == (_pft)) delete _pftLocal; \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
|
|
#define LogAndThrowOnFailure(_ft, _pwszNameWriter, _pwszNameFailedRoutine) \
|
|
{ \
|
|
HRESULT _hrStatusRemapped; \
|
|
\
|
|
if (FAILED ((_ft).hr)) \
|
|
{ \
|
|
LogFailure (&(_ft), (_ft).hr, _hrStatusRemapped, (_pwszNameWriter), (_pwszNameFailedRoutine), L"(UNKNOWN)"); \
|
|
\
|
|
throw (_hrStatusRemapped); \
|
|
} \
|
|
}
|
|
|
|
#endif // __H_COMMON_
|