///+--------------------------------------------------------------------------- // // 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 #include //+--------------------------------------------------------------------------- // // 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 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 _xFixup; // optional fix for remote use of local scopes XArray _xUsername; // optional username to use for scope XArray _xPassword; // optional password to use for scope XArray _xScope; // Used for duplicate scopes };