469 lines
8.8 KiB
C++
469 lines
8.8 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1990 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
volume.hxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Provides volume methods.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#if !defined (VOL_LOG_IO_DP_DRIVE_DEFN)
|
||
|
|
||
|
#define VOL_LOG_IO_DP_DRIVE_DEFN
|
||
|
|
||
|
#if !defined( _SETUP_LOADER_ )
|
||
|
|
||
|
#include "drive.hxx"
|
||
|
#include "numset.hxx"
|
||
|
|
||
|
#if defined ( _AUTOCHECK_ ) || defined( _EFICHECK_ )
|
||
|
#define IFSUTIL_EXPORT
|
||
|
#elif defined ( _IFSUTIL_MEMBER_ )
|
||
|
#define IFSUTIL_EXPORT __declspec(dllexport)
|
||
|
#else
|
||
|
#define IFSUTIL_EXPORT __declspec(dllimport)
|
||
|
#endif
|
||
|
|
||
|
|
||
|
//
|
||
|
// Forward references
|
||
|
//
|
||
|
|
||
|
DECLARE_CLASS( HMEM );
|
||
|
DECLARE_CLASS( MESSAGE );
|
||
|
DECLARE_CLASS( SUPERAREA );
|
||
|
DECLARE_CLASS( VOL_LIODPDRV );
|
||
|
DECLARE_CLASS( WSTRING );
|
||
|
DECLARE_CLASS( WSTRING );
|
||
|
|
||
|
// This number describes the minimum number of bytes in a boot sector.
|
||
|
#define BYTES_PER_BOOT_SECTOR 512
|
||
|
|
||
|
|
||
|
typedef ULONG VOLID;
|
||
|
|
||
|
#define MAXVOLNAME 11
|
||
|
|
||
|
#define AUTOCHK_TIMEOUT 10 // 10 seconds before initiating autochk
|
||
|
#define MAX_AUTOCHK_TIMEOUT_VALUE (3*24*3600) // 3 days maximum
|
||
|
|
||
|
enum FIX_LEVEL {
|
||
|
CheckOnly,
|
||
|
TotalFix,
|
||
|
SetupSpecial
|
||
|
};
|
||
|
|
||
|
enum FORMAT_ERROR_CODE {
|
||
|
GeneralError,
|
||
|
NoError,
|
||
|
LockError
|
||
|
};
|
||
|
|
||
|
class VOL_LIODPDRV : public LOG_IO_DP_DRIVE {
|
||
|
|
||
|
public:
|
||
|
|
||
|
VIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
~VOL_LIODPDRV(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
FORMAT_ERROR_CODE
|
||
|
Format(
|
||
|
IN PCWSTRING Label DEFAULT NULL,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN ULONG flags DEFAULT 0,
|
||
|
IN ULONG ClusterSize DEFAULT 0,
|
||
|
IN ULONG VirtualSectors DEFAULT 0
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
ChkDsk(
|
||
|
IN FIX_LEVEL FixLevel,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN ULONG Flags DEFAULT 0,
|
||
|
IN ULONG DesiredLogfileSize DEFAULT 0,
|
||
|
OUT PULONG ExitStatus DEFAULT NULL,
|
||
|
IN PCWSTRING DriveLetter DEFAULT NULL
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Recover(
|
||
|
IN PCWSTRING FileName,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
PSUPERAREA
|
||
|
GetSa(
|
||
|
);
|
||
|
|
||
|
VIRTUAL
|
||
|
PVOL_LIODPDRV
|
||
|
QueryDupVolume(
|
||
|
IN PCWSTRING NtDriveName,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN BOOLEAN ExclusiveWrite DEFAULT FALSE,
|
||
|
IN BOOLEAN FormatMedia DEFAULT FALSE,
|
||
|
IN MEDIA_TYPE MediaType DEFAULT Unknown
|
||
|
) CONST PURE;
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
ForceAutochk(
|
||
|
IN BOOLEAN Fix,
|
||
|
IN ULONG Options,
|
||
|
IN ULONG DesiredLogfileSize,
|
||
|
IN PCWSTRING Name
|
||
|
);
|
||
|
|
||
|
#if defined(FE_SB) && defined(_X86_)
|
||
|
STATIC
|
||
|
IFSUTIL_EXPORT
|
||
|
VOID
|
||
|
ForceFormat(
|
||
|
IN USHORT FileSystem
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
USHORT
|
||
|
QueryForceFormat(
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
VOID
|
||
|
ForceConvertFat(
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
BOOLEAN
|
||
|
QueryConvertFat(
|
||
|
);
|
||
|
|
||
|
enum { NONE, ANY, FAT, HPFS, OTHER };
|
||
|
#endif
|
||
|
|
||
|
STATIC
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
QueryAutochkTimeOut(
|
||
|
OUT PULONG TimeOut
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
SetAutochkTimeOut(
|
||
|
IN ULONG TimeOut
|
||
|
);
|
||
|
|
||
|
protected:
|
||
|
|
||
|
IFSUTIL_EXPORT
|
||
|
DECLARE_CONSTRUCTOR( VOL_LIODPDRV );
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
FORMAT_ERROR_CODE
|
||
|
Initialize(
|
||
|
IN PCWSTRING NtDriveName,
|
||
|
IN PSUPERAREA SuperArea,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN BOOLEAN ExclusiveWrite DEFAULT FALSE,
|
||
|
IN BOOLEAN FormatMedia DEFAULT FALSE,
|
||
|
IN MEDIA_TYPE MediaType DEFAULT Unknown
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
IFSUTIL_EXPORT
|
||
|
BOOLEAN
|
||
|
Initialize(
|
||
|
IN PCWSTRING NtDriveName,
|
||
|
IN PCWSTRING HostFileName,
|
||
|
IN PSUPERAREA SuperArea,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN BOOLEAN ExclusiveWrite DEFAULT FALSE
|
||
|
);
|
||
|
|
||
|
|
||
|
private:
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Construct (
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Destroy(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
SECTORCOUNT
|
||
|
ReadABunch(
|
||
|
IN OUT PHMEM HeapMem,
|
||
|
IN LBN StartLbn,
|
||
|
IN SECTORCOUNT NumSectors,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN PCWSTRING SrcDosDriveName DEFAULT NULL
|
||
|
);
|
||
|
|
||
|
PSUPERAREA _sa;
|
||
|
NUMBER_SET _bad_sectors;
|
||
|
#if defined(FE_SB) && defined(_X86_)
|
||
|
STATIC USHORT _force_format;
|
||
|
STATIC BOOLEAN _force_convert_fat;
|
||
|
#endif
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
PSUPERAREA
|
||
|
VOL_LIODPDRV::GetSa(
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine returns a pointer to the current super area.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
A pointer to the current super area.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return _sa;
|
||
|
}
|
||
|
|
||
|
#else // _SETUP_LOADER_ is defined
|
||
|
|
||
|
#include "drive.hxx"
|
||
|
#include "intstack.hxx"
|
||
|
|
||
|
//
|
||
|
// Forward references
|
||
|
//
|
||
|
|
||
|
DECLARE_CLASS( HMEM );
|
||
|
DECLARE_CLASS( MESSAGE );
|
||
|
DECLARE_CLASS( SUPERAREA );
|
||
|
DECLARE_CLASS( VOL_LIODPDRV );
|
||
|
DECLARE_CLASS( WSTRING );
|
||
|
DECLARE_CLASS( WSTRING );
|
||
|
|
||
|
|
||
|
typedef ULONG VOLID;
|
||
|
|
||
|
#define MAXVOLNAME 11
|
||
|
|
||
|
enum FIX_LEVEL {
|
||
|
CheckOnly,
|
||
|
TotalFix
|
||
|
};
|
||
|
|
||
|
// This number describes the minimum number of bytes in a boot sector.
|
||
|
#define BYTES_PER_BOOT_SECTOR 512
|
||
|
|
||
|
class VOL_LIODPDRV : public LOG_IO_DP_DRIVE {
|
||
|
|
||
|
public:
|
||
|
|
||
|
VIRTUAL
|
||
|
~VOL_LIODPDRV(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
BOOLEAN
|
||
|
ChkDsk(
|
||
|
IN FIX_LEVEL FixLevel,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN BOOLEAN Verbose DEFAULT FALSE,
|
||
|
IN BOOLEAN OnlyIfDirty DEFAULT FALSE
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
PSUPERAREA
|
||
|
GetSa(
|
||
|
);
|
||
|
|
||
|
VIRTUAL
|
||
|
BOOLEAN
|
||
|
IsHpfs(
|
||
|
);
|
||
|
|
||
|
VIRTUAL
|
||
|
BOOLEAN
|
||
|
IsNtfs(
|
||
|
);
|
||
|
|
||
|
VIRTUAL
|
||
|
ARC_STATUS
|
||
|
MarkDirty(
|
||
|
) PURE;
|
||
|
|
||
|
VIRTUAL
|
||
|
ARC_STATUS
|
||
|
Flush(
|
||
|
IN BOOLEAN JustHandle
|
||
|
) PURE;
|
||
|
|
||
|
#if defined(FE_SB) && defined(_X86_)
|
||
|
STATIC
|
||
|
IFSUTIL_EXPORT
|
||
|
VOID
|
||
|
ForceFormat(
|
||
|
IN USHORT FileSystem
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
USHORT
|
||
|
QueryForceFormat(
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
VOID
|
||
|
ForceConvertFat(
|
||
|
);
|
||
|
|
||
|
STATIC
|
||
|
BOOLEAN
|
||
|
QueryConvertFat(
|
||
|
);
|
||
|
|
||
|
enum { NONE, ANY, FAT, HPFS, OTHER };
|
||
|
#endif
|
||
|
|
||
|
protected:
|
||
|
|
||
|
DECLARE_CONSTRUCTOR( VOL_LIODPDRV );
|
||
|
|
||
|
NONVIRTUAL
|
||
|
BOOLEAN
|
||
|
Initialize(
|
||
|
IN ULONG DeviceId,
|
||
|
IN OUT PSUPERAREA SuperArea
|
||
|
);
|
||
|
|
||
|
private:
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Construct (
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
VOID
|
||
|
Destroy(
|
||
|
);
|
||
|
|
||
|
NONVIRTUAL
|
||
|
SECTORCOUNT
|
||
|
ReadABunch(
|
||
|
IN OUT PHMEM HeapMem,
|
||
|
IN LBN StartLbn,
|
||
|
IN SECTORCOUNT NumSectors,
|
||
|
IN OUT PMESSAGE Message DEFAULT NULL,
|
||
|
IN PCWSTRING SrcDosDriveName DEFAULT NULL
|
||
|
);
|
||
|
|
||
|
PSUPERAREA _sa;
|
||
|
INTSTACK _bad_sectors;
|
||
|
#if defined(FE_SB) && defined(_X86_)
|
||
|
STATIC USHORT _force_format;
|
||
|
STATIC BOOLEAN _force_convert_fat;
|
||
|
#endif
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
INLINE
|
||
|
PSUPERAREA
|
||
|
VOL_LIODPDRV::GetSa(
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This routine returns a pointer to the current super area.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
A pointer to the current super area.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return _sa;
|
||
|
}
|
||
|
|
||
|
INLINE
|
||
|
BOOLEAN
|
||
|
VOL_LIODPDRV::IsHpfs(
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This method determines whether the volume is HPFS.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE if this volume is an HPFS volume.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
INLINE
|
||
|
BOOLEAN
|
||
|
VOL_LIODPDRV::IsNtfs(
|
||
|
)
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
This method determines whether the volume is NTFS.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
None.
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
TRUE if this volume is an NTFS volume.
|
||
|
|
||
|
--*/
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif
|