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.
374 lines
9.8 KiB
374 lines
9.8 KiB
//////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Copyright (c) 1999-2000 Microsoft Corporation
|
|
//
|
|
// Module Name:
|
|
// Util.cpp
|
|
//
|
|
// Description:
|
|
// Implementation of utility class and functions
|
|
//
|
|
// Author:
|
|
// Henry Wang (HenryWa) 24-AUG-1999
|
|
// MSP Prabu (mprabu) 06-Jan-2001
|
|
// Jim Benton (jbenton) 15-Oct-2001
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "Pch.h"
|
|
#include "ProvBase.h"
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
// Global Data
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
|
// wbem
|
|
//
|
|
const WCHAR * const PVD_WBEM_PROVIDERNAME = L"Volume Shadow Copy WMI Provider";
|
|
const WCHAR * const PVD_WBEM_EXTENDEDSTATUS = L"__ExtendedStatus";
|
|
const WCHAR * const PVD_WBEM_DESCRIPTION = L"Description";
|
|
const WCHAR * const PVD_WBEM_STATUSCODE = L"StatusCode";
|
|
const WCHAR * const PVD_WBEM_STATUS = L"Status";
|
|
const WCHAR * const PVD_WBEM_CLASS = L"__CLASS";
|
|
const WCHAR * const PVD_WBEM_RELPATH = L"__Relpath";
|
|
const WCHAR * const PVD_WBEM_PROP_ANTECEDENT = L"Antecedent";
|
|
const WCHAR * const PVD_WBEM_PROP_DEPENDENT = L"Dependent";
|
|
const WCHAR * const PVD_WBEM_PROP_ELEMENT = L"Element";
|
|
const WCHAR * const PVD_WBEM_PROP_SETTING = L"Setting";
|
|
const WCHAR * const PVD_WBEM_PROP_DEVICEID = L"DeviceId";
|
|
const WCHAR * const PVD_WBEM_PROP_RETURNVALUE = L"ReturnValue";
|
|
const WCHAR * const PVD_WBEM_PROP_PROVIDERNAME = L"ProviderName";
|
|
const WCHAR * const PVD_WBEM_QUA_DYNAMIC = L"Dynamic";
|
|
const WCHAR * const PVD_WBEM_QUA_CIMTYPE = L"CIMTYPE";
|
|
const WCHAR * const PVD_WBEM_DATETIME_FORMAT =L"%04d%02d%02d%02d%02d%02d.%06d%+03d";
|
|
|
|
//
|
|
// Constants used in partial value maps for localization
|
|
//
|
|
const WCHAR * const PVDR_CONS_UNAVAILABLE = L"Unavailable";
|
|
const WCHAR * const PVDR_CONS_ENABLED = L"Enabled";
|
|
const WCHAR * const PVDR_CONS_DISABLED = L"Disabled";
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// void
|
|
// CreateClass(
|
|
// const WCHAR * pwszClassNameIn,
|
|
// CWbemServices * pNamespaceIn,
|
|
// auto_ptr< CProvBase > & rNewClassInout
|
|
// )
|
|
//
|
|
// Description:
|
|
// Create the specified class
|
|
//
|
|
// Arguments:
|
|
// pwszClassNameIn -- Name of the class to create.
|
|
// pNamespaceIn -- WMI namespace
|
|
// rNewClassInout -- Receives the new class.
|
|
//
|
|
// Return Values:
|
|
// reference to the array of property maping table
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
void
|
|
CreateClass(
|
|
IN const WCHAR * pwszClassName,
|
|
IN CWbemServices * pNamespace,
|
|
IN OUT auto_ptr< CProvBase > & rNewClass
|
|
)
|
|
{
|
|
CVssFunctionTracer ft(VSSDBG_VSSADMIN, L"CreateClass");
|
|
ClassMap::iterator itMap;
|
|
|
|
_ASSERTE(pwszClassName != NULL);
|
|
_ASSERTE(pNamespace != NULL);
|
|
|
|
itMap = g_ClassMap.find(pwszClassName);
|
|
|
|
if ( itMap != g_ClassMap.end() )
|
|
{
|
|
CClassCreator& rcc = itMap->second;
|
|
|
|
auto_ptr< CProvBase > pBase(
|
|
rcc.m_pfnConstructor(
|
|
rcc.m_pbstrClassName,
|
|
pNamespace
|
|
)
|
|
);
|
|
|
|
if (pBase.get() == NULL)
|
|
throw CProvException( static_cast< HRESULT >( WBEM_E_INITIALIZATION_FAILURE ) );
|
|
|
|
rNewClass = pBase;
|
|
}
|
|
else
|
|
{
|
|
throw CProvException( static_cast< HRESULT >( WBEM_E_INVALID_PARAMETER ) );
|
|
}
|
|
|
|
return;
|
|
|
|
} //*** void CreateClass()
|
|
|
|
WCHAR* GuidToString(
|
|
IN GUID guid
|
|
)
|
|
{
|
|
WCHAR* pwszGuid = reinterpret_cast<WCHAR*>(::CoTaskMemAlloc((g_cchGUID) * sizeof(WCHAR)));
|
|
|
|
if (pwszGuid == NULL)
|
|
throw CProvException(E_OUTOFMEMORY);
|
|
|
|
_snwprintf(pwszGuid, g_cchGUID,
|
|
L"{%.8x-%.4x-%.4x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}",
|
|
GUID_PRINTF_ARG(guid));
|
|
|
|
return pwszGuid;
|
|
}
|
|
|
|
_bstr_t EncodeQuotes( WCHAR * wszString )
|
|
{
|
|
// Encodes only double-quote and back-slash in the key
|
|
// property strings in building the object path string.
|
|
|
|
_bstr_t bstrTemp;
|
|
if( wszString == NULL )
|
|
return bstrTemp;
|
|
|
|
int nSize = 0;
|
|
WCHAR* des = NULL;
|
|
WCHAR* src = wszString;
|
|
|
|
// loop to find the character to encode
|
|
while(*src)
|
|
{
|
|
// check character
|
|
switch(*src)
|
|
{
|
|
case L'"':
|
|
nSize += 2;
|
|
break;
|
|
case L'\\':
|
|
nSize += 2;
|
|
break;
|
|
default:
|
|
nSize++;
|
|
break;
|
|
}
|
|
|
|
src++;
|
|
}
|
|
|
|
// create buffer
|
|
WCHAR* pwszEncoded = new WCHAR[nSize + 1];
|
|
if(pwszEncoded == NULL)
|
|
return bstrTemp;
|
|
|
|
ZeroMemory(pwszEncoded, (nSize + 1)*sizeof(WCHAR));
|
|
src = wszString;
|
|
des = pwszEncoded;
|
|
|
|
// loop to encode
|
|
while(*src)
|
|
{
|
|
// check character
|
|
switch(*src)
|
|
{
|
|
case L'"':
|
|
lstrcpyn(des, L"\\\"", 3); // the char count includes null termination char
|
|
des += 2;
|
|
break;
|
|
case L'\\':
|
|
lstrcpyn(des, L"\\\\", 3); // the char count includes null termination char
|
|
des += 2;
|
|
break;
|
|
default:
|
|
*des = *src;
|
|
des++;
|
|
break;
|
|
}
|
|
|
|
src++;
|
|
}
|
|
|
|
bstrTemp = pwszEncoded;
|
|
delete [] pwszEncoded;
|
|
|
|
return bstrTemp;
|
|
}
|
|
|
|
|
|
LPWSTR GetMsg(
|
|
IN LONG msgId,
|
|
...
|
|
)
|
|
{
|
|
CVssFunctionTracer ft( VSSDBG_VSSADMIN, L"CVssAdminCLI::GetMsg" );
|
|
|
|
va_list args;
|
|
LPWSTR lpMsgBuf;
|
|
LPWSTR lpReturnStr = NULL;
|
|
|
|
va_start( args, msgId );
|
|
|
|
if (::FormatMessageW(
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE |
|
|
FORMAT_MESSAGE_MAX_WIDTH_MASK,
|
|
g_hModule,
|
|
msgId,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPWSTR) &lpMsgBuf,
|
|
0,
|
|
&args
|
|
))
|
|
{
|
|
::VssSafeDuplicateStr( ft, lpReturnStr, lpMsgBuf );
|
|
::LocalFree( lpMsgBuf );
|
|
}
|
|
else if (::FormatMessageW(
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_MAX_WIDTH_MASK,
|
|
NULL,
|
|
msgId,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPWSTR) &lpMsgBuf,
|
|
0,
|
|
&args ) )
|
|
{
|
|
::VssSafeDuplicateStr( ft, lpReturnStr, lpMsgBuf );
|
|
::LocalFree( lpMsgBuf );
|
|
}
|
|
|
|
va_end( args );
|
|
|
|
// Returns NULL if message was not found
|
|
return lpReturnStr;
|
|
}
|
|
|
|
#ifdef PROP_ARRAY_ENABLE
|
|
//****************************************************************************
|
|
//
|
|
// PropMapEntryArray
|
|
//
|
|
//****************************************************************************
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// LPCWSTR
|
|
// SPropMapEntryArray::PwszLookup(
|
|
// LPCWSTR pwszIn
|
|
// ) const
|
|
//
|
|
// Description:
|
|
// Lookup an entry in the array.
|
|
//
|
|
// Arguments:
|
|
// pwszIn -- Name of entry to lookup.
|
|
//
|
|
// Return Values:
|
|
// Pointer to string entry in the array.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LPCWSTR
|
|
SPropMapEntryArray::PwszLookup(
|
|
IN LPCWSTR pwsz
|
|
) const
|
|
{
|
|
UINT idx;
|
|
|
|
_ASSERTE(pwszIn != NULL);
|
|
|
|
for ( idx = 0; idx < m_dwSize; idx ++ )
|
|
{
|
|
if ( _wcsicmp( pwsz, m_pArray[ idx ].clstName ) == 0 )
|
|
{
|
|
//
|
|
// mofName is NULL for clstname not supported
|
|
//
|
|
return m_pArray[ idx ].mofName;
|
|
}
|
|
}
|
|
|
|
//
|
|
// mofname is the same as clstname if not found in the table
|
|
//
|
|
return pwsz;
|
|
|
|
} //*** SPropMapEntry::PwszLookup()
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
//++
|
|
//
|
|
// LPCWSTR
|
|
// PwszSpaceReplace(
|
|
// LPWSTR pwszTrgInout,
|
|
// LPCWSTR pwszSrcIn,
|
|
// WCHAR wchArgIn
|
|
// )
|
|
//
|
|
// Description:
|
|
// Replace spaces in a string with another character.
|
|
// Ignores leading spaces.
|
|
//
|
|
// Arguments:
|
|
// pwszTrgInout -- Target string.
|
|
// pwszSrcIn -- Source string.
|
|
// wchArgIn -- Character to replace spaces with.
|
|
//
|
|
// Return Values:
|
|
// Pointer to the target string.
|
|
//
|
|
//--
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
LPWSTR
|
|
PwszSpaceReplace(
|
|
IN OUT LPWSTR pwszTrg,
|
|
IN LPCWSTR pwszSrc,
|
|
IN WCHAR wchArg
|
|
)
|
|
{
|
|
LPCWSTR pwsz = NULL;
|
|
LPWSTR pwszTrg = NULL;
|
|
|
|
if ( ( pwszTrg == NULL ) || ( pwszSrc == NULL ) )
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// ignore leading space
|
|
//
|
|
for ( pwsz = pwszSrc ; *pwsz == L' '; pwsz++ )
|
|
{
|
|
// empty loop
|
|
}
|
|
pwszTrg = pwszTrg;
|
|
for ( ; *pwsz != L'\0' ; pwsz++ )
|
|
{
|
|
if ( *pwsz == L' ' )
|
|
{
|
|
*pwszTrg++ = wchArg;
|
|
for ( ; *pwsz == L' '; pwsz++ )
|
|
{
|
|
// empty loop
|
|
}
|
|
pwsz--;
|
|
}
|
|
else
|
|
{
|
|
*pwszTrg++ = *pwsz;
|
|
}
|
|
} // for: each character in the source string
|
|
|
|
*pwszTrg = L'\0';
|
|
return pwszTrg;
|
|
|
|
} //*** PwszSpaceReplace()
|
|
#endif
|