211 lines
4.1 KiB
C++
211 lines
4.1 KiB
C++
/*++
|
|
|
|
Copyright (c) 1998 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
logdrive.cpp
|
|
|
|
Abstract:
|
|
|
|
SIS Groveler logging drive class
|
|
|
|
Authors:
|
|
|
|
John Douceur, 1998
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#include "all.hxx"
|
|
|
|
static const _TCHAR registry_parameter_path[] = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Groveler\\Parameters");
|
|
static const _TCHAR *log_drive_key_name = _T("log drive");
|
|
|
|
LogDrive::LogDrive()
|
|
{
|
|
_TCHAR *guid_name;
|
|
|
|
part_initted = 0;
|
|
registry_written = false;
|
|
log_drive_index = 0;
|
|
_TCHAR reg_name[MAX_PATH + 1];
|
|
read_registry(reg_name,sizeof(reg_name));
|
|
|
|
int partition_count = sis_drives.partition_count();
|
|
ASSERT(partition_count > 0);
|
|
|
|
part_initted = new bool[partition_count];
|
|
for (int index = 0; index < partition_count; index++)
|
|
{
|
|
part_initted[index] = false;
|
|
}
|
|
|
|
for (index = 0; index < partition_count; index++)
|
|
{
|
|
guid_name = sis_drives.partition_guid_name(index);
|
|
if (_tcsicmp(reg_name, guid_name) == 0)
|
|
{
|
|
log_drive_index = index;
|
|
write_registry(_T(""));
|
|
return;
|
|
}
|
|
}
|
|
|
|
__int64 log_drive_space = 0;
|
|
for (index = 0; index < partition_count; index++)
|
|
{
|
|
guid_name = sis_drives.partition_guid_name(index);
|
|
ULARGE_INTEGER my_free_bytes;
|
|
ULARGE_INTEGER total_bytes;
|
|
ULARGE_INTEGER free_bytes;
|
|
int ok = GetDiskFreeSpaceEx(
|
|
guid_name, &my_free_bytes, &total_bytes, &free_bytes);
|
|
if (ok)
|
|
{
|
|
__int64 space = free_bytes.QuadPart;
|
|
if (space > log_drive_space)
|
|
{
|
|
log_drive_space = space;
|
|
log_drive_index = index;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
DWORD err = GetLastError();
|
|
PRINT_DEBUG_MSG((_T("GROVELER: GetDiskFreeSpaceEx() failed with error %d\n"),
|
|
err));
|
|
}
|
|
}
|
|
write_registry(_T(""));
|
|
}
|
|
|
|
LogDrive::~LogDrive()
|
|
{
|
|
if (part_initted != 0)
|
|
{
|
|
delete[] part_initted;
|
|
part_initted = 0;
|
|
}
|
|
}
|
|
|
|
void
|
|
LogDrive::partition_initialized(
|
|
int partition_index)
|
|
{
|
|
if (!registry_written)
|
|
{
|
|
int partition_count = sis_drives.partition_count();
|
|
ASSERT(partition_index >= 0);
|
|
ASSERT(partition_index < partition_count);
|
|
part_initted[partition_index] = true;
|
|
for (int index = 0; index < partition_count; index++)
|
|
{
|
|
if (!part_initted[index])
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
write_registry(sis_drives.partition_guid_name(log_drive_index));
|
|
registry_written = true;
|
|
}
|
|
}
|
|
|
|
bool
|
|
LogDrive::read_registry(
|
|
_TCHAR *name,
|
|
DWORD size)
|
|
{
|
|
DWORD type;
|
|
try
|
|
{
|
|
HKEY path_key = 0;
|
|
Registry::open_key_ex(HKEY_LOCAL_MACHINE,
|
|
registry_parameter_path, REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS, &path_key);
|
|
try
|
|
{
|
|
Registry::query_value_ex(path_key, log_drive_key_name, 0,
|
|
&type, (BYTE *)name, &size);
|
|
}
|
|
catch (DWORD result)
|
|
{
|
|
ASSERT(result != ERROR_SUCCESS);
|
|
PRINT_DEBUG_MSG((
|
|
_T("GROVELER: Registry::query_value_ex() failed with error %d\n"),
|
|
result));
|
|
ASSERT(path_key != 0);
|
|
Registry::close_key(path_key);
|
|
path_key = 0;
|
|
*name = 0;
|
|
return false;
|
|
}
|
|
ASSERT(path_key != 0);
|
|
Registry::close_key(path_key);
|
|
path_key = 0;
|
|
}
|
|
catch (DWORD result)
|
|
{
|
|
ASSERT(result != ERROR_SUCCESS);
|
|
PRINT_DEBUG_MSG((_T("GROVELER: Registry::open_key_ex() or Registry::close_key() ")
|
|
_T("failed with error %d\n"), result));
|
|
*name = 0;
|
|
return false;
|
|
}
|
|
if (type != REG_EXPAND_SZ)
|
|
{
|
|
*name = 0;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
LogDrive::write_registry(
|
|
_TCHAR *name)
|
|
{
|
|
try
|
|
{
|
|
HKEY path_key = 0;
|
|
DWORD disp;
|
|
Registry::create_key_ex(HKEY_LOCAL_MACHINE,
|
|
registry_parameter_path, 0, 0, REG_OPTION_NON_VOLATILE,
|
|
KEY_ALL_ACCESS, 0, &path_key, &disp);
|
|
try
|
|
{
|
|
Registry::set_value_ex(path_key, log_drive_key_name, 0,
|
|
REG_EXPAND_SZ, (BYTE *)name,
|
|
(_tcslen(name) + 1) * sizeof(_TCHAR));
|
|
}
|
|
catch (DWORD result)
|
|
{
|
|
ASSERT(result != ERROR_SUCCESS);
|
|
PRINT_DEBUG_MSG((
|
|
_T("GROVELER: Registry::set_value_ex() failed with error %d\n"),
|
|
result));
|
|
ASSERT(path_key != 0);
|
|
Registry::close_key(path_key);
|
|
path_key = 0;
|
|
return false;
|
|
}
|
|
ASSERT(path_key != 0);
|
|
Registry::close_key(path_key);
|
|
path_key = 0;
|
|
}
|
|
catch (DWORD result)
|
|
{
|
|
ASSERT(result != ERROR_SUCCESS);
|
|
PRINT_DEBUG_MSG((_T("GROVELER: Registry::create_key_ex() or Registry::close_key() ")
|
|
_T("failed with error %d\n"), result));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|