//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1999 - 1999. // // File: remcat.cxx // // Contents: Removable catalog registry support // // Classes: CRemovableCatalog // // History: 6-Apr-99 dlee Created. // //---------------------------------------------------------------------------- #include #pragma hdrstop #include #include #include extern WCHAR GetDriveLetterOfAnyScope( WCHAR const * pwcCatalog ); //+------------------------------------------------------------------------- // // Method: CRemovableCatalog::Create, public // // Synopsis: Creates temporary registry entries for the catalog // // History: 6-Apr-99 dlee Created. // //-------------------------------------------------------------------------- void CRemovableCatalog::Create() { // First, remove any existing values for the catalog Destroy(); // Make the catalog key WCHAR awcCat[40]; MakeCatalogName( awcCat ); BOOL fExisted; { CWin32RegAccess reg( HKEY_LOCAL_MACHINE, wcsRegCatalogsSubKey ); reg.CreateKey( awcCat, fExisted ); } // Add values for this catalog under the key WCHAR awcCatalog[200]; wsprintf( awcCatalog, L"%ws\\%ws", wcsRegCatalogsSubKey, awcCat ); WCHAR awcScopes[ 200 ]; wsprintf( awcScopes, L"%ws\\%ws", awcCatalog, wcsCatalogScopes ); { CWin32RegAccess reg( HKEY_LOCAL_MACHINE, awcCatalog ); // Set the catalog location WCHAR awcLocation[4]; wcscpy( awcLocation, L"x:\\" ); awcLocation[0] = _wcDrive; reg.Set( wcsCatalogLocation, awcLocation ); // // Make the catalog read-only, mark it as removable, and force // path aliases so drive letters in paths returned in queries // match the drive letter of the removable drive. // reg.Set( wcsIsReadOnly, TRUE ); reg.Set( wcsIsRemovableCatalog, TRUE ); reg.Set( wcsForcePathAlias, TRUE ); reg.CreateKey( wcsCatalogScopes, fExisted ); } // // Add a fixup for the root of the volume in case the drive letter // is different from where the catalog was built. // WCHAR awcPath[ 20 ]; wcscpy( awcPath, L"x:\\catalog.wci" ); awcPath[0] = _wcDrive; WCHAR wcScope = GetDriveLetterOfAnyScope( awcPath ); ciDebugOut(( DEB_ITRACE, "scope drive: '%wc'\n", wcScope )); if ( 0 != wcScope ) { CWin32RegAccess reg( HKEY_LOCAL_MACHINE, awcScopes ); WCHAR awcValue[10]; wcscpy( awcValue, L"x:\\,," ); awcValue[0] = _wcDrive; WCHAR awcScope[10]; wcscpy( awcScope, L"x:\\" ); awcScope[0] = wcScope; reg.Set( awcScope, awcValue ); } } //Create //+------------------------------------------------------------------------- // // Method: CRemovableCatalog::Destroy, public // // Synopsis: Destroys temporary registry entries for the catalog // // History: 6-Apr-99 dlee Created. // //-------------------------------------------------------------------------- void CRemovableCatalog::Destroy() { // Ignore failures here... WCHAR awcCat[40]; MakeCatalogName( awcCat ); WCHAR awcCatalog[200]; wsprintf( awcCatalog, L"%ws\\%ws", wcsRegCatalogsSubKey, awcCat ); TRY { // Remove the scopes and properties keys { CWin32RegAccess reg( HKEY_LOCAL_MACHINE, awcCatalog ); reg.RemoveKey( wcsCatalogScopes ); reg.RemoveKey( wcsCatalogProperties ); } // Remove the catalog key { CWin32RegAccess reg( HKEY_LOCAL_MACHINE, wcsRegCatalogsSubKey ); reg.RemoveKey( awcCat ); } } CATCH( CException, e ) { // ignore it -- we tried. } END_CATCH } //Destroy