341 lines
4.3 KiB
C++
341 lines
4.3 KiB
C++
/*++
|
||
|
||
Copyright (c) 1990 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
clusrun.hxx
|
||
|
||
Abstract:
|
||
|
||
This class models a run of clusters on an NTFS volume. Its
|
||
principle purpose is to mediate between the cluster-oriented
|
||
NTFS volume and the sector-oriented drive object.
|
||
|
||
Author:
|
||
|
||
Bill McJohn (billmc) 17-June-91
|
||
|
||
Environment:
|
||
|
||
ULIB, User Mode
|
||
|
||
--*/
|
||
|
||
#if !defined( NTFS_CLUSTER_RUN_DEFN )
|
||
|
||
#define NTFS_CLUSTER_RUN_DEFN
|
||
|
||
#include "secrun.hxx"
|
||
|
||
|
||
class NTFS_CLUSTER_RUN : public SECRUN {
|
||
|
||
public:
|
||
|
||
UNTFS_EXPORT
|
||
DECLARE_CONSTRUCTOR( NTFS_CLUSTER_RUN );
|
||
|
||
UNTFS_EXPORT
|
||
VIRTUAL
|
||
~NTFS_CLUSTER_RUN(
|
||
);
|
||
|
||
UNTFS_EXPORT
|
||
NONVIRTUAL
|
||
BOOLEAN
|
||
Initialize(
|
||
IN PMEM Mem,
|
||
IN PLOG_IO_DP_DRIVE Drive,
|
||
IN LCN Lcn,
|
||
IN ULONG ClusterFactor,
|
||
IN ULONG NumberOfClusters
|
||
);
|
||
|
||
UNTFS_EXPORT
|
||
NONVIRTUAL
|
||
VOID
|
||
Relocate(
|
||
IN LCN NewLcn
|
||
);
|
||
|
||
NONVIRTUAL
|
||
LCN
|
||
QueryStartLcn(
|
||
) CONST;
|
||
|
||
NONVIRTUAL
|
||
ULONG
|
||
QueryClusterFactor(
|
||
) CONST;
|
||
|
||
NONVIRTUAL
|
||
PLOG_IO_DP_DRIVE
|
||
GetDrive(
|
||
);
|
||
|
||
NONVIRTUAL
|
||
VOID
|
||
MarkModified(
|
||
);
|
||
|
||
NONVIRTUAL
|
||
BOOLEAN
|
||
IsModified(
|
||
) CONST;
|
||
|
||
VIRTUAL
|
||
BOOLEAN
|
||
Write(
|
||
);
|
||
|
||
VIRTUAL
|
||
BOOLEAN
|
||
Write(
|
||
IN BOOLEAN OnlyIfModified
|
||
);
|
||
|
||
protected:
|
||
|
||
NONVIRTUAL
|
||
USHORT
|
||
QueryClusterSize(
|
||
) CONST;
|
||
|
||
private:
|
||
|
||
NONVIRTUAL
|
||
VOID
|
||
Construct (
|
||
);
|
||
|
||
NONVIRTUAL
|
||
VOID
|
||
Destroy (
|
||
);
|
||
|
||
|
||
LCN _StartLcn;
|
||
ULONG _ClusterFactor;
|
||
PLOG_IO_DP_DRIVE _Drive;
|
||
BOOLEAN _IsModified;
|
||
|
||
};
|
||
|
||
|
||
INLINE
|
||
LCN
|
||
NTFS_CLUSTER_RUN::QueryStartLcn (
|
||
) CONST
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This method gives the client the first LCN of the cluster run.
|
||
|
||
Arguments:
|
||
|
||
StartLcn -- receives the first LCN of the cluster run.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
return _StartLcn;
|
||
}
|
||
|
||
|
||
INLINE
|
||
ULONG
|
||
NTFS_CLUSTER_RUN::QueryClusterFactor(
|
||
) CONST
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This method returns the number of sectors per cluster in
|
||
this cluster run.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
The cluster run's cluster factor.
|
||
|
||
++*/
|
||
{
|
||
return _ClusterFactor;
|
||
}
|
||
|
||
|
||
INLINE
|
||
PLOG_IO_DP_DRIVE
|
||
NTFS_CLUSTER_RUN::GetDrive(
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This method returns the drive on which the Cluster Run resides.
|
||
This functionality enables clients of Cluster Run to initialize
|
||
other Cluster Runs on the same drive.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
The drive on which the Cluster Run resides.
|
||
|
||
--*/
|
||
{
|
||
return _Drive;
|
||
}
|
||
|
||
|
||
INLINE
|
||
VOID
|
||
NTFS_CLUSTER_RUN::MarkModified(
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Mark the Cluster Run as modified.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
_IsModified = TRUE;
|
||
}
|
||
|
||
|
||
INLINE
|
||
BOOLEAN
|
||
NTFS_CLUSTER_RUN::IsModified(
|
||
) CONST
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Query whether the Cluster Run has been marked as modified.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
TRUE if the Cluster Run has been marked as modified.
|
||
|
||
--*/
|
||
{
|
||
return( _IsModified );
|
||
}
|
||
|
||
|
||
INLINE
|
||
BOOLEAN
|
||
NTFS_CLUSTER_RUN::Write(
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This method writes the Cluster Run.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
TRUE upon successful completion.
|
||
|
||
Notes:
|
||
|
||
This method is provided to keep the Write method on SECRUN visible.
|
||
|
||
--*/
|
||
{
|
||
return SECRUN::Write();
|
||
}
|
||
|
||
|
||
INLINE
|
||
BOOLEAN
|
||
NTFS_CLUSTER_RUN::Write(
|
||
IN BOOLEAN OnlyIfModified
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This method writes the Cluster Run; it also allows the client
|
||
to specify that it should only be written if it has been modified.
|
||
|
||
Arguments:
|
||
|
||
OnlyIfModified -- supplies a flag indicating whether the write
|
||
is conditional; if this is TRUE, then the
|
||
Cluster Run is written only if it has been
|
||
marked as modified.
|
||
|
||
Return Value:
|
||
|
||
TRUE upon successful completion.
|
||
|
||
Notes:
|
||
|
||
The Cluster Run does not mark itself dirty; if clients want
|
||
to take advantage of the ability to write only if modified,
|
||
they have to be sure to call MarkModified appropriately.
|
||
|
||
--*/
|
||
{
|
||
_IsModified = (BOOLEAN)
|
||
!((OnlyIfModified && !_IsModified) || SECRUN::Write());
|
||
|
||
return !_IsModified;
|
||
}
|
||
|
||
|
||
INLINE
|
||
USHORT
|
||
NTFS_CLUSTER_RUN::QueryClusterSize(
|
||
) CONST
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This method returns the number of bytes per cluster.
|
||
|
||
Arguments:
|
||
|
||
None.
|
||
|
||
Return Value:
|
||
|
||
Number of bytes per cluster (zero indicates error).
|
||
|
||
--*/
|
||
{
|
||
DebugPtrAssert( _Drive );
|
||
|
||
return( (USHORT)_ClusterFactor * (USHORT)_Drive->QuerySectorSize() );
|
||
}
|
||
|
||
#endif
|