|
|
///+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (c) Microsoft Corporation, 1996 - 2000.
//
// File: regscp.hxx
//
// Contents: Class for parsing scopes to be indexed as listed in the
// registry.
//
// Classes: CParseRegistryScope
//
// History: 29-Oct-96 dlee Created.
//
//----------------------------------------------------------------------------
#pragma once
#include <lmcons.h>
#include <cisecret.hxx>
//+---------------------------------------------------------------------------
//
// Class: CParseRegistryScope
//
// Purpose: Parses a registry scope entry
//
// History: 29-Oct-96 dlee Created.
//
//----------------------------------------------------------------------------
class CParseRegistryScope { public: CParseRegistryScope( WCHAR const *pValueName, ULONG uValueType, VOID const *pValueData, ULONG uValueLength ) : _pwcScope( pValueName ), _fIsIndexed( TRUE ), _fIsPhysical( TRUE ), _fIsVirtual( FALSE ), _fIsShadowAlias( FALSE ) { //
// Is this a duplicate scope (e.g. one with '<#>' at then end)?
//
unsigned cwc = wcslen( pValueName );
if ( pValueName[cwc-1] == L'>' ) { //
// Find the other bracket.
//
cwc--;
while ( cwc > 0 && pValueName[cwc] != L'<' ) cwc--;
if ( cwc > 0 ) { _xScope.Init( cwc + 1 ); _pwcScope = _xScope.Get();
RtlCopyMemory( _xScope.Get(), pValueName, cwc * sizeof(WCHAR) ); _xScope[cwc] = 0; } }
// Format is fixup,username,indexed
// Fields are optional.
// If indexed is "0", indexing is turned off.
if ( REG_SZ != uValueType ) return;
WCHAR *pwcValue = (WCHAR *) pValueData;
cwc = 1 + wcslen( pwcValue ); XArray<WCHAR> xValue( cwc ); RtlCopyMemory( xValue.Get(), pwcValue, xValue.SizeOf() );
WCHAR *pwcUser = wcschr( xValue.Get(), L',' );
if ( 0 != pwcUser ) { *pwcUser = 0;
if ( pwcUser != xValue.Get() ) { _xFixup.Init( 1 + (UINT)(pwcUser - xValue.Get()) ); RtlCopyMemory( _xFixup.Get(), xValue.Get(), _xFixup.SizeOf() ); }
pwcUser++; WCHAR *pwcIndexed = wcschr( pwcUser, L',' );
if ( 0 != pwcIndexed ) { *pwcIndexed = 0;
if ( pwcIndexed != pwcUser ) { _xUsername.Init( 1 + (UINT)(pwcIndexed - pwcUser) ); RtlCopyMemory( _xUsername.Get(), pwcUser, _xUsername.SizeOf() ); }
pwcIndexed++;
if ( ( isxdigit(pwcIndexed[0]) ) && ( 0 == pwcIndexed[1] || (isxdigit(pwcIndexed[1]) && 0 == pwcIndexed[2]) ) ) { unsigned flag = wcstol( pwcIndexed, 0, 16 );
if ( 0 == (flag & 0x1) ) _fIsIndexed = FALSE;
if ( flag & 0x2 ) { _fIsVirtual = TRUE; _fIsPhysical = FALSE; }
if ( flag & 0x40 ) _fIsShadowAlias = TRUE;
if ( flag & 0x4 ) _fIsPhysical = TRUE; } } else { unsigned cwcUser = 1 + wcslen( pwcUser ); _xUsername.Init( cwcUser ); RtlCopyMemory( _xUsername.Get(), pwcUser, _xUsername.SizeOf() ); } } else { _xFixup.Set( cwc, xValue.Acquire() ); } }
~CParseRegistryScope() { if ( 0 != _xPassword.Get() ) SecureZeroMemory( _xPassword.Get(), _xPassword.SizeOf() ); }
WCHAR const * GetScope() { return _pwcScope; }
void GetScope( WCHAR * pwcScope ) { if ( _pwcScope != pwcScope ) wcscpy( pwcScope, _pwcScope ); }
WCHAR const * GetFixup() { return _xFixup.Get(); } WCHAR * AcqFixup() { return _xFixup.Acquire(); }
WCHAR const * GetUsername() { return _xUsername.Get(); } WCHAR * AcqUsername() { return _xUsername.Acquire(); }
BOOL IsIndexed() { return _fIsIndexed; } BOOL IsVirtualPlaceholder() { return _fIsVirtual; } BOOL IsPhysical() { return _fIsPhysical; } BOOL IsShadowAlias() { return _fIsShadowAlias; }
WCHAR * GetPassword( WCHAR const * pwcCatalogName ) { // For security reasons, the password isn't stored in the registry.
// It's in the lsa database under a key that includes the catalog
// name and username.
if ( ( 0 == _xPassword.Get() ) && ( 0 != _xUsername.Get() ) ) { // Look it up in the lsa database.
// This object is short-lived, so leave it in memory unencrypted.
WCHAR awc[ PWLEN+1 ]; if ( CiGetPassword( pwcCatalogName, _xUsername.Get(), awc ) ) { unsigned cwc = 1 + wcslen( awc ); _xPassword.Init( cwc ); RtlCopyMemory( _xPassword.Get(), awc, _xPassword.SizeOf() ); } }
return _xPassword.Get(); }
private:
WCHAR const * _pwcScope; // scope to be filtered or excluded
BOOL _fIsIndexed; // TRUE if the scope should be filtered
BOOL _fIsVirtual; // TRUE if scope exists (partly) because of IIS / NNTP
BOOL _fIsPhysical; // TRUE if scope exists independent of IIS / NNTP
BOOL _fIsShadowAlias; // TRUE if the scope was added to shadow a net share
XArray<WCHAR> _xFixup; // optional fix for remote use of local scopes
XArray<WCHAR> _xUsername; // optional username to use for scope
XArray<WCHAR> _xPassword; // optional password to use for scope
XArray<WCHAR> _xScope; // Used for duplicate scopes
};
|