📄 volume.cxx
字号:
IN FIX_LEVEL FixLevel,
IN OUT PMESSAGE Message,
IN ULONG Flags,
IN ULONG DesiredLogFileSize,
OUT PULONG ExitStatus,
IN PCWSTRING DriveLetter
)
/*++
Routine Description:
This routine checks the integrity of the file system on the volume.
If there are any problems, this routine will attempt to fix them
to the degree specified in 'FixLevel'.
Arguments:
FixLevel - Supplies the level to which the volume should be fixed.
Message - Supplies an outlet for messages.
Flags - Supplies the flags that controls the behavior of chkdsk
(see ulib\inc\ifsentry.hxx for details)
DesiredLogFileSize - Tells what logfile size the user wants.
ExitStatus - Returns and indication of how the chkdsk went.
DriveLetter - For autochk, tells which drive letter we're checking.
Return Value:
FALSE - Failure.
TRUE - Success.
--*/
{
MESSAGE msg;
ULONG exit_status;
if (!Message) {
Message = &msg;
}
if (NULL == ExitStatus) {
ExitStatus = &exit_status;
}
if (!_sa) {
return FALSE;
}
return _sa->VerifyAndFix(FixLevel,
Message,
Flags,
DesiredLogFileSize,
ExitStatus,
DriveLetter);
}
IFSUTIL_EXPORT
BOOLEAN
VOL_LIODPDRV::Recover(
IN PCWSTRING FullPathFileName,
IN OUT PMESSAGE Message
)
/*++
Routine Description:
This routine searches the named file for bad allocation units.
It removes these allocation units from the file and marks them
as bad in the file system.
Arguments:
FullPathFileName - Supplies the name of the file to recover.
Message - Supplies an outlet for messages.
Return Value:
FALSE - Failure.
TRUE - Success.
--*/
{
MESSAGE msg;
if (!Message) {
Message = &msg;
}
if (!_sa) {
return FALSE;
}
return _sa->RecoverFile(FullPathFileName, Message);
}
IFSUTIL_EXPORT
BOOLEAN
VOL_LIODPDRV::ForceAutochk(
IN BOOLEAN Fix,
IN ULONG Options,
IN ULONG LogFileSize,
IN PCWSTRING Name
)
/*++
Routine Description:
This method schedules Autochk to be run at next boot. If the client
has not requested bad sector detection or logfile resizing, this
scheduling is done simply by marking the volume dirty. If bad sector
detection or logfile resizing has been requested, the appropriate entry
is put into the registry to force autochk to run.
Arguments:
Fix -- Supplies if chkdsk /f is being implied.
Options -- Supplies flags
CHKDSK_RECOVER
CHKDSK_RESIZE_LOGFILE
CHKDSK_SKIP_INDEX_SCAN
CHKDSK_SKIP_CYCLE_SCAN
LogFileSize -- If CHKDSK_RESIZE_LOGFILE, tells the desired size in bytes.
Name -- Supplies the volume's NT name.
Return Value:
TRUE upon successful completion.
--*/
{
#if !defined( _AUTOCHECK_ ) && !defined( _EFICHECK_ )
DSTRING CommandLine;
DSTRING dos_drive_name;
DSTRING volume_name;
DSTRING nt_drive_name;
DSTRING drive_path_string;
PATH fullpath;
PATH dos_path;
PCWSTRING name;
PATH_ANALYZE_CODE rst;
if (!CommandLine.Initialize( "autocheck autochk " )) {
return FALSE;
}
#if 0
if (!(Options & (CHKDSK_RECOVER |
CHKDSK_SKIP_INDEX_SCAN |
CHKDSK_SKIP_CYCLE_SCAN |
CHKDSK_RESIZE_LOGFILE))) {
DSTRING all_drives;
// The client has not asked for autochk /r, /l, or /i so it
// suffices to mark the volume dirty. Before we do that,
// make sure there is an entry in the registry to look for
// dirty volume.
//
if (!all_drives.Initialize("*"))
return FALSE;
if (AUTOREG::IsEntryPresent(&CommandLine, &all_drives))
return ForceDirty();
if (!CommandLine.Strcat(&all_drives))
return FALSE;
if (!AUTOREG::AddEntry(&CommandLine))
return FALSE;
return ForceDirty();
}
#endif
//
// Let's schedule an explicit autochk.
//
//
// Remove any previous entry of Name from the registry
//
if (!AUTOREG::DeleteEntry(&CommandLine, Name))
return FALSE;
//
// Get the alternate name of the drive and remove any previous entry
// for it from the registry
//
if (!IFS_SYSTEM::NtDriveNameToDosDriveName(Name, &dos_drive_name) ||
!dos_path.Initialize(&dos_drive_name))
return FALSE;
rst = dos_path.AnalyzePath(&volume_name,
&fullpath,
&drive_path_string);
switch (rst) {
case PATH_OK:
DebugAssert(drive_path_string.QueryChCount() == 0);
if (dos_path.GetPathString()->Stricmp(&volume_name) != 0) {
// use volume_name as the alternate name
name = &volume_name;
} else {
// try to use fullpath as the alternate name
name = fullpath.GetPathString();
if (name->QueryChCount() != 2)
break; // alternate name not drive letter so done
}
if (!IFS_SYSTEM::DosDriveNameToNtDriveName(name, &nt_drive_name))
return FALSE;
if (!AUTOREG::DeleteEntry(&CommandLine, &nt_drive_name))
return FALSE;
break;
default:
return FALSE;
}
if (Options & CHKDSK_RECOVER) {
DSTRING R_Option;
if (!R_Option.Initialize( "/r " ) ||
!CommandLine.Strcat( &R_Option )) {
return FALSE;
}
}
if (Options & CHKDSK_SKIP_INDEX_SCAN) {
DSTRING I_Option;
if (!I_Option.Initialize( "/i " ) ||
!CommandLine.Strcat( &I_Option )) {
return FALSE;
}
}
if (Options & CHKDSK_SKIP_CYCLE_SCAN) {
DSTRING C_Option;
if (!C_Option.Initialize( "/c " ) ||
!CommandLine.Strcat( &C_Option )) {
return FALSE;
}
}
if (Options & CHKDSK_RESIZE_LOGFILE) {
DSTRING L_Option;
CHAR buf[20];
sprintf(buf, "/l:%d ", LogFileSize / 1024);
if (!L_Option.Initialize( buf ) ||
!CommandLine.Strcat( &L_Option )) {
return FALSE;
}
}
//
// if /f specified but it's not because of /r, /i, or /c, then
// specify /p as well. The options /r, /i, or /c implies /p
// for autochk.
//
if (Fix &&
!(Options & (CHKDSK_RECOVER |
CHKDSK_SKIP_INDEX_SCAN |
CHKDSK_SKIP_CYCLE_SCAN))) {
DSTRING P_Option;
if (!P_Option.Initialize( "/p " ) ||
!CommandLine.Strcat( &P_Option )) {
return FALSE;
}
}
return CommandLine.Strcat( Name ) &&
AUTOREG::PushEntry( &CommandLine );
#else
return FALSE;
#endif // _AUTOCHECK_
}
#if defined(FE_SB) && defined(_X86_)
USHORT VOL_LIODPDRV::_force_format = NONE;
BOOLEAN VOL_LIODPDRV::_force_convert_fat = FALSE;
IFSUTIL_EXPORT
VOID
VOL_LIODPDRV::ForceFormat(
IN USHORT FileSystem
)
/*++
Routine Description:
Arguments:
None.
Return Value:
None.
--*/
{
if (FileSystem != ANY || _force_format == NONE)
_force_format = FileSystem;
}
USHORT
VOL_LIODPDRV::QueryForceFormat(
)
/*++
Routine Description:
Arguments:
None.
Return Value:
None.
--*/
{
return _force_format;
}
VOID
VOL_LIODPDRV::ForceConvertFat(
)
/*++
Routine Description:
Arguments:
None.
Return Value:
None.
--*/
{
_force_convert_fat = TRUE;
}
BOOLEAN
VOL_LIODPDRV::QueryConvertFat(
)
/*++
Routine Description:
Arguments:
None.
Return Value:
None.
--*/
{
return _force_convert_fat;
}
#endif // FE_SB && _X86_
IFSUTIL_EXPORT
BOOLEAN
VOL_LIODPDRV::QueryAutochkTimeOut(
OUT PULONG TimeOut
)
/*++
Routine Description:
This routine returns the count down time before autochk
resumes.
Arguments:
TimeOut -- Supplies the location to store the timeout value.
Return Value:
TRUE if successful.
--*/
{
#if !defined( _EFICHECK_ )
return QueryTimeOutValue(TimeOut);
#else
return FALSE;
#endif
}
IFSUTIL_EXPORT
BOOLEAN
VOL_LIODPDRV::SetAutochkTimeOut(
IN ULONG TimeOut
)
/*++
Routine Description:
This routine sets the count down time before autochk
resumes.
Arguments:
TimeOut -- Supplies the count down time in seconds
Return Value:
TRUE if successful.
--*/
{
#if !defined( _EFICHECK_ )
return SetTimeOutValue(TimeOut);
#else
return FALSE;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -