369 lines
10 KiB
C++
369 lines
10 KiB
C++
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999.
|
|
//
|
|
// File: tcatcnfg.cxx
|
|
//
|
|
// Contents: Test program for catalog configuration
|
|
//
|
|
// History: 24 Nov 1998 AlanW Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "pch.cxx"
|
|
#pragma hdrstop
|
|
|
|
#include "catcnfg.hxx"
|
|
|
|
WCHAR g_awcProfilePath[MAX_PATH];
|
|
|
|
const WCHAR wszRegProfileKey[] =
|
|
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList";
|
|
const WCHAR wszRegProfileValue[] = L"ProfilesDirectory";
|
|
|
|
//
|
|
// DLL module instance handle
|
|
//
|
|
HINSTANCE MyModuleHandle = (HINSTANCE)INVALID_HANDLE_VALUE;
|
|
|
|
ULONG isInfoLevel;
|
|
|
|
inline ULONG MB( ULONGLONG cb )
|
|
{
|
|
const ONE_MB = (1024*1024);
|
|
|
|
return (ULONG) ((cb+ONE_MB/2) / ONE_MB);
|
|
}
|
|
|
|
void PrintDriveInfo( CCatalogConfig & CatConfig );
|
|
void ExcludeSpecialLocations( CCatalogConfig & Cat );
|
|
|
|
WCHAR g_awcSystemDir[MAX_PATH];
|
|
|
|
__cdecl main()
|
|
{
|
|
CError Err;
|
|
|
|
GetSystemDirectory( g_awcSystemDir,
|
|
sizeof g_awcSystemDir / sizeof WCHAR );
|
|
CCatalogConfig CatConfig(Err);
|
|
|
|
CatConfig.InitDriveList();
|
|
//printf("\nBefore pagefile reservation:\n" );
|
|
//PrintDriveInfo( CatConfig );
|
|
|
|
//CatConfig.ReservePageFileData();
|
|
|
|
printf("\nBefore catalog configuration:\n" );
|
|
PrintDriveInfo( CatConfig );
|
|
|
|
//
|
|
// Find the default profile path (Usually %windir%\Profiles)
|
|
//
|
|
|
|
CWin32RegAccess regProfileKey( HKEY_LOCAL_MACHINE, wszRegProfileKey );
|
|
|
|
g_awcProfilePath[0] = L'\0';
|
|
WCHAR wcTemp[MAX_PATH+1];
|
|
|
|
if ( regProfileKey.Get( wszRegProfileValue, wcTemp, NUMELEM(wcTemp) ) )
|
|
{
|
|
unsigned ccTemp2 = ExpandEnvironmentStrings( wcTemp,
|
|
g_awcProfilePath,
|
|
NUMELEM(g_awcProfilePath) );
|
|
}
|
|
|
|
CatConfig.ConfigureDefaultCatalog(g_awcProfilePath);
|
|
ExcludeSpecialLocations( CatConfig );
|
|
|
|
printf("\nAfter catalog configuration:\n" );
|
|
PrintDriveInfo( CatConfig );
|
|
|
|
printf("\nCatalog drive:\n\t%ws\n", CatConfig.GetCatalogDrive());
|
|
|
|
WCHAR const * pwszScope;
|
|
for (unsigned i = 0; pwszScope = CatConfig.GetIncludedScope( i ); i++)
|
|
{
|
|
if ( 0 == i )
|
|
printf("\nIncluded scopes:\n");
|
|
printf("\t%ws\n", pwszScope );
|
|
}
|
|
|
|
for (i = 0; pwszScope = CatConfig.GetExcludedScope( i ); i++)
|
|
{
|
|
if ( 0 == i )
|
|
printf("\nExcluded scopes:\n");
|
|
printf("\t%ws\n", pwszScope );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void PrintDriveInfo( CCatalogConfig & CatConfig )
|
|
{
|
|
printf("Drive\tFree MB Resv MB Tot. MB\n");
|
|
|
|
CDriveInformation const * pDriveInfo = 0;
|
|
for ( unsigned i=0;
|
|
pDriveInfo = CatConfig.GetDriveInfo(i);
|
|
i++ )
|
|
{
|
|
printf("%s\t%7d\t%7d\t%7d",
|
|
pDriveInfo->GetDriveName(),
|
|
MB(pDriveInfo->GetAvailableSpace()),
|
|
MB(pDriveInfo->GetReservedSpace()),
|
|
MB(pDriveInfo->GetTotalSpace()) );
|
|
|
|
if ( pDriveInfo->IsNtfs() )
|
|
printf(" NTFS");
|
|
else if ( !pDriveInfo->IsBootDrive() )
|
|
printf(" FAT");
|
|
|
|
if ( pDriveInfo->IsSystemDrive() )
|
|
printf(" SystemDrive");
|
|
if ( pDriveInfo->IsBootDrive() )
|
|
printf(" BootDrive");
|
|
|
|
//if ( pDriveInfo->IsNtfs() )
|
|
// printf(" SupportsSecurity");
|
|
//if ( pDriveInfo->SupportsCompression() )
|
|
// printf(" SupportsCompression");
|
|
if ( pDriveInfo->HasPageFile() )
|
|
printf(" PageFile");
|
|
|
|
printf("\n");
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: ISError
|
|
//
|
|
// Synopsis: Reports a non-recoverable Index Server Install error
|
|
//
|
|
// Arguments: id -- resource identifier for the error string
|
|
//
|
|
// History: 8-Jan-97 dlee Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
void ISError( UINT id, CError &Err, LogSeverity Severity )
|
|
{
|
|
// CResString msg( id );
|
|
// CResString title( IS_MSG_INDEX_SERVER );
|
|
|
|
Err.Report( Severity, L"Error 0x%08x\n", id );
|
|
|
|
if ( LogSevFatalError == Severity )
|
|
{
|
|
//isDebugOut(( "ISError, abort install: '%ws'\n", msg.Get() ));
|
|
//g_fInstallAborted = TRUE;
|
|
exit( 1 );
|
|
}
|
|
|
|
} //ISError
|
|
|
|
|
|
CError::CError( )
|
|
{
|
|
}
|
|
|
|
CError::~CError( )
|
|
{
|
|
}
|
|
|
|
void CError::Report( LogSeverity Severity, WCHAR const * MessageString, ...)
|
|
{
|
|
va_list va;
|
|
va_start(va, MessageString);
|
|
|
|
wvsprintf(_awcMsg, MessageString, va);
|
|
|
|
va_end(va);
|
|
|
|
wprintf(L"setupqry: %s\r\n", _awcMsg);
|
|
}
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: ExcludeSpecialLocations, private
|
|
//
|
|
// Synopsis: Writes profile-based exclude scopes into the registry
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// History: 28-Aug-1998 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
WCHAR const wszRegShellSpecialPathsKey[] =
|
|
L".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
|
|
|
|
WCHAR const * const awszRegShellSpecialPathsValue[] = {
|
|
L"AppData",
|
|
L"Cache",
|
|
L"Local Settings"
|
|
};
|
|
|
|
WCHAR const wszUserProfile[] = L"%USERPROFILE%";
|
|
|
|
void ExcludeSpecialLocations( CCatalogConfig & Cat )
|
|
{
|
|
// CWin32RegAccess regScopes( HKEY_LOCAL_MACHINE, wcsRegSystemScopesSubKey );
|
|
|
|
//
|
|
// First, find the default profile path (Usually %windir%\Profiles)
|
|
//
|
|
|
|
WCHAR wcTemp[MAX_PATH+1];
|
|
|
|
if ( g_awcProfilePath[0] )
|
|
{
|
|
WCHAR wcTemp2[MAX_PATH+1];
|
|
wcscpy( wcTemp2, g_awcProfilePath );
|
|
unsigned ccTemp2 = wcslen( wcTemp2 );
|
|
|
|
//
|
|
// Append the wildcard, for user profile directory
|
|
//
|
|
|
|
wcscpy( wcTemp2 + ccTemp2, L"\\*\\" );
|
|
ccTemp2 += 3;
|
|
|
|
//
|
|
// Go through and look for special shell paths, which just happen
|
|
// to include all our special cases too.
|
|
//
|
|
|
|
CWin32RegAccess regShellSpecialPathsKey( HKEY_USERS, wszRegShellSpecialPathsKey );
|
|
|
|
for ( unsigned i = 0;
|
|
i < NUMELEM(awszRegShellSpecialPathsValue);
|
|
i++ )
|
|
{
|
|
if ( regShellSpecialPathsKey.Get( awszRegShellSpecialPathsValue[i],
|
|
wcTemp, NUMELEM(wcTemp) ) )
|
|
{
|
|
if ( RtlEqualMemory( wszUserProfile, wcTemp, sizeof(wszUserProfile) - sizeof(WCHAR) ) )
|
|
{
|
|
wcscpy( wcTemp2 + ccTemp2, wcTemp + NUMELEM(wszUserProfile) );
|
|
wcscpy( wcTemp, wcTemp2 );
|
|
}
|
|
else if ( wcschr( wcTemp, L'%' ) != 0 )
|
|
{
|
|
WCHAR wcTemp3[MAX_PATH+1];
|
|
unsigned ccTemp3 = ExpandEnvironmentStrings(
|
|
wcTemp,
|
|
wcTemp3,
|
|
NUMELEM(wcTemp3) );
|
|
if ( 0 != ccTemp3 )
|
|
wcscpy( wcTemp, wcTemp3 );
|
|
}
|
|
|
|
wcscat( wcTemp, L"\\*" );
|
|
isDebugOut(( "Exclude: %ws\n", wcTemp ));
|
|
|
|
Cat.AddExcludedDirOrPattern( wcTemp );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#if 0
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Function: ExcludeSpecialLocations, private
|
|
//
|
|
// Synopsis: Writes profile-based exclude scopes into the registry
|
|
//
|
|
// Arguments: none
|
|
//
|
|
// History: 28-Aug-1998 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
WCHAR const wszRegProfileKey[] =
|
|
L"Software\\Microsoft\\Windows NT\\CurrentVersion\\ProfileList";
|
|
WCHAR const wszRegProfileValue[] = L"ProfilesDirectory";
|
|
|
|
WCHAR const wszRegShellSpecialPathsKey[] =
|
|
L".DEFAULT\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders";
|
|
|
|
WCHAR const * const awszRegShellSpecialPathsValue[] = {
|
|
L"AppData",
|
|
L"Cache",
|
|
L"Local Settings"
|
|
};
|
|
|
|
WCHAR const wszUserProfile[] = L"%USERPROFILE%";
|
|
|
|
void ExcludeSpecialLocations( CCatalogConfig & Cat )
|
|
{
|
|
// CWin32RegAccess regScopes( HKEY_LOCAL_MACHINE, wcsRegSystemScopesSubKey );
|
|
|
|
//
|
|
// First, find the default profile path (Usually %windir%\Profiles)
|
|
//
|
|
|
|
CWin32RegAccess regProfileKey( HKEY_LOCAL_MACHINE, wszRegProfileKey );
|
|
|
|
WCHAR wcTemp[MAX_PATH+1];
|
|
|
|
if ( regProfileKey.Get( wszRegProfileValue, wcTemp, NUMELEM(wcTemp) ) )
|
|
{
|
|
WCHAR wcTemp2[MAX_PATH+1];
|
|
unsigned ccTemp2 = ExpandEnvironmentStrings( wcTemp, wcTemp2, NUMELEM(wcTemp2) );
|
|
|
|
if ( 0 != ccTemp2 )
|
|
{
|
|
//
|
|
// Append the wildcard, for user profile directory
|
|
//
|
|
|
|
ccTemp2--; // don't include null terminator
|
|
wcscpy( wcTemp2 + ccTemp2, L"\\*\\" );
|
|
ccTemp2 += 3;
|
|
|
|
//
|
|
// Go through and look for special shell paths, which just happen
|
|
// to include all our special cases too.
|
|
//
|
|
|
|
CWin32RegAccess regShellSpecialPathsKey( HKEY_USERS, wszRegShellSpecialPathsKey );
|
|
|
|
for ( unsigned i = 0;
|
|
i < NUMELEM(awszRegShellSpecialPathsValue);
|
|
i++ )
|
|
{
|
|
if ( regShellSpecialPathsKey.Get( awszRegShellSpecialPathsValue[i], wcTemp, NUMELEM(wcTemp) ) )
|
|
{
|
|
if ( RtlEqualMemory( wszUserProfile, wcTemp, sizeof(wszUserProfile) - sizeof(WCHAR) ) )
|
|
{
|
|
wcscpy( wcTemp2 + ccTemp2, wcTemp + NUMELEM(wszUserProfile) );
|
|
wcscpy( wcTemp, wcTemp2 );
|
|
}
|
|
else if ( wcschr( wcTemp, L'%' ) != 0 )
|
|
{
|
|
WCHAR wcTemp3[MAX_PATH+1];
|
|
unsigned ccTemp3 = ExpandEnvironmentStrings( wcTemp, wcTemp3, NUMELEM(wcTemp3) );
|
|
if ( 0 != ccTemp3 )
|
|
wcscpy( wcTemp, wcTemp3 );
|
|
}
|
|
|
|
wcscat( wcTemp, L"\\*" );
|
|
isDebugOut(( "Exclude: %ws\n", wcTemp ));
|
|
|
|
Cat.AddExcludedDirOrPattern( wcTemp );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif //0
|