Leaked source code of windows server 2003
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

//////////////////////////////////////////////////////////////////////////////
//
// 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