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.
161 lines
5.6 KiB
161 lines
5.6 KiB
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
diskinfo.cpp
|
|
|
|
Abstract:
|
|
|
|
SIS Groveler disk information class
|
|
|
|
Authors:
|
|
|
|
John Douceur, 1998
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "all.hxx"
|
|
|
|
static const _TCHAR disks_ini_filename[] = L"grovel.ini";
|
|
static const _TCHAR disks_ini_section[] = L"Disk Info";
|
|
|
|
ReadDiskInformation::ReadDiskInformation(
|
|
const _TCHAR *drive_name)
|
|
{
|
|
ASSERT(this != 0);
|
|
EntrySpec registry_entries[registry_entry_count] =
|
|
{
|
|
{_T("minimum merge file size"), entry_int, _T("32768"), &min_file_size},
|
|
{_T("minimum merge file age"), entry_int, _T("0"), &min_file_age},
|
|
{_T("enable groveling"), entry_bool, _T("1"), &enable_groveling},
|
|
{_T("error retry log extraction"), entry_bool, _T("1"), &error_retry_log_extraction},
|
|
{_T("error retry groveling"), entry_bool, _T("1"), &error_retry_groveling},
|
|
{_T("merge compressed files"), entry_bool, _T("1"), &allow_compressed_files},
|
|
{_T("merge encrypted files"), entry_bool, _T("0"), &allow_encrypted_files},
|
|
{_T("merge hidden files"), entry_bool, _T("1"), &allow_hidden_files},
|
|
{_T("merge offline files"), entry_bool, _T("0"), &allow_offline_files},
|
|
{_T("merge temporary files"), entry_bool, _T("0"), &allow_temporary_files},
|
|
{_T("base USN log size"), entry_int64, _T("1048576"), &base_usn_log_size},
|
|
{_T("max USN log size"), entry_int64, _T("16777216"), &max_usn_log_size}
|
|
};
|
|
|
|
int bLen = _tcslen(disks_ini_filename) + _tcslen(drive_name) + SIS_CSDIR_STRING_NCHARS + (sizeof(_TCHAR)*2);
|
|
_TCHAR *ini_file_partition_path = new _TCHAR[bLen];
|
|
|
|
(void)StringCchCopy(ini_file_partition_path, bLen, drive_name);
|
|
TrimTrailingChar(ini_file_partition_path,L'\\');
|
|
(void)StringCchCat(ini_file_partition_path, bLen, SIS_CSDIR_STRING);
|
|
(void)StringCchCat(ini_file_partition_path, bLen, disks_ini_filename);
|
|
|
|
IniFile::read(ini_file_partition_path, disks_ini_section,
|
|
registry_entry_count, registry_entries);
|
|
|
|
#if WRITE_ALL_PARAMETERS
|
|
|
|
bool ini_file_overwrite_ok =
|
|
IniFile::overwrite(ini_file_partition_path, disks_ini_section,
|
|
registry_entry_count, registry_entries);
|
|
if (!ini_file_overwrite_ok)
|
|
{
|
|
PRINT_DEBUG_MSG((_T("GROVELER: IniFile::overwrite() failed\n")));
|
|
}
|
|
|
|
#endif // WRITE_ALL_PARAMETERS
|
|
|
|
ASSERT(ini_file_partition_path != 0);
|
|
delete[] ini_file_partition_path;
|
|
ini_file_partition_path = 0;
|
|
}
|
|
|
|
WriteDiskInformation::WriteDiskInformation(
|
|
const _TCHAR *drive_name,
|
|
int backup_interval)
|
|
{
|
|
ASSERT(this != 0);
|
|
ASSERT(backup_interval >= 0);
|
|
this->backup_interval = backup_interval;
|
|
|
|
EntrySpec registry_entries[registry_entry_count] =
|
|
{
|
|
{_T("hash read time estimate"), entry_double, _T("0.0"), &partition_hash_read_time_estimate},
|
|
{_T("compare read time estimate"), entry_double, _T("0.0"), &partition_compare_read_time_estimate},
|
|
{_T("mean file size"), entry_double, _T("65536.0"), &mean_file_size},
|
|
{_T("read time confidence"), entry_double, _T("0.0"), &read_time_confidence},
|
|
{_T("volume serial number"), entry_int, _T("0"), &volume_serial_number},
|
|
{_T("GrovelAllPaths State"), entry_int, _T("1"), &grovelAllPathsState}
|
|
};
|
|
|
|
for (int index = 0; index < registry_entry_count; index++)
|
|
{
|
|
this->registry_entries[index] = registry_entries[index];
|
|
}
|
|
|
|
int bLen = _tcslen(disks_ini_filename) + _tcslen(drive_name) + SIS_CSDIR_STRING_NCHARS + (sizeof(_TCHAR)*2);
|
|
ini_file_partition_path = new _TCHAR[bLen];
|
|
|
|
(void)StringCchCopy(ini_file_partition_path, bLen, drive_name);
|
|
TrimTrailingChar(ini_file_partition_path,L'\\');
|
|
(void)StringCchCat(ini_file_partition_path, bLen, SIS_CSDIR_STRING);
|
|
(void)StringCchCat(ini_file_partition_path, bLen, disks_ini_filename);
|
|
|
|
IniFile::read(ini_file_partition_path, disks_ini_section,
|
|
registry_entry_count, registry_entries);
|
|
|
|
if (backup_interval > 0)
|
|
{
|
|
backup((void *)this);
|
|
}
|
|
}
|
|
|
|
WriteDiskInformation::~WriteDiskInformation()
|
|
{
|
|
ASSERT(this != 0);
|
|
ASSERT(backup_interval >= 0);
|
|
ASSERT(ini_file_partition_path != 0);
|
|
backup((void *)this);
|
|
delete[] ini_file_partition_path;
|
|
ini_file_partition_path = 0;
|
|
}
|
|
|
|
void
|
|
WriteDiskInformation::flush()
|
|
{
|
|
bool ini_file_overwrite_ok =
|
|
IniFile::overwrite(ini_file_partition_path, disks_ini_section,
|
|
registry_entry_count, registry_entries);
|
|
if (!ini_file_overwrite_ok)
|
|
{
|
|
PRINT_DEBUG_MSG((_T("GROVELER: IniFile::overwrite() failed\n")));
|
|
}
|
|
}
|
|
|
|
|
|
void
|
|
WriteDiskInformation::backup(
|
|
void *context)
|
|
{
|
|
ASSERT(context != 0);
|
|
unsigned int invokation_time = GET_TICK_COUNT();
|
|
WriteDiskInformation *me = (WriteDiskInformation *)context;
|
|
ASSERT(me->backup_interval >= 0);
|
|
ASSERT(me->ini_file_partition_path != 0);
|
|
bool ini_file_overwrite_ok =
|
|
IniFile::overwrite(me->ini_file_partition_path, disks_ini_section,
|
|
registry_entry_count, me->registry_entries);
|
|
if (!ini_file_overwrite_ok)
|
|
{
|
|
PRINT_DEBUG_MSG((_T("GROVELER: IniFile::overwrite() failed\n")));
|
|
}
|
|
event_timer.schedule(invokation_time + me->backup_interval,
|
|
context, backup);
|
|
}
|