175 lines
3 KiB
C++
175 lines
3 KiB
C++
/*++
|
|
|
|
Copyright (c) 1990 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cluster.hxx
|
|
|
|
Abstract:
|
|
|
|
This class models a chain of clusters in a FAT file system. It gives
|
|
the ability to refer to a scattered chain of clusters as one contiguous
|
|
region of memory. This memory will be acquired from a MEM object at
|
|
initialization.
|
|
|
|
--*/
|
|
|
|
#if !defined(CLUSTER_CHAIN_DEFN)
|
|
|
|
#define CLUSTER_CHAIN_DEFN
|
|
|
|
|
|
#include "secrun.hxx"
|
|
#include "hmem.hxx"
|
|
|
|
#if defined ( _AUTOCHECK_ ) || defined( _EFICHECK_ )
|
|
#define UFAT_EXPORT
|
|
#elif defined ( _UFAT_MEMBER_ )
|
|
#define UFAT_EXPORT __declspec(dllexport)
|
|
#else
|
|
#define UFAT_EXPORT __declspec(dllimport)
|
|
#endif
|
|
|
|
//
|
|
// Forward references
|
|
//
|
|
|
|
DECLARE_CLASS( CLUSTER_CHAIN );
|
|
DECLARE_CLASS( FAT );
|
|
DECLARE_CLASS( FAT_SA );
|
|
DECLARE_CLASS( LOG_IO_DP_DRIVE );
|
|
DECLARE_CLASS( MEM );
|
|
|
|
class CLUSTER_CHAIN : public OBJECT {
|
|
|
|
public:
|
|
|
|
UFAT_EXPORT
|
|
DECLARE_CONSTRUCTOR( CLUSTER_CHAIN );
|
|
|
|
VIRTUAL
|
|
UFAT_EXPORT
|
|
~CLUSTER_CHAIN(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
UFAT_EXPORT
|
|
BOOLEAN
|
|
Initialize(
|
|
IN OUT PMEM Mem,
|
|
IN OUT PLOG_IO_DP_DRIVE Drive,
|
|
IN PFAT_SA FatSuperArea,
|
|
IN PCFAT Fat,
|
|
IN ULONG ClusterNumber,
|
|
IN ULONG LengthOfChain DEFAULT 0
|
|
);
|
|
|
|
VIRTUAL
|
|
UFAT_EXPORT
|
|
BOOLEAN
|
|
Read(
|
|
);
|
|
|
|
VIRTUAL
|
|
UFAT_EXPORT
|
|
BOOLEAN
|
|
Write(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
PVOID
|
|
GetBuf(
|
|
);
|
|
|
|
NONVIRTUAL
|
|
ULONG
|
|
QueryLength(
|
|
) CONST;
|
|
|
|
private:
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Construct (
|
|
);
|
|
|
|
NONVIRTUAL
|
|
VOID
|
|
Destroy(
|
|
);
|
|
|
|
PSECRUN* _secruns;
|
|
USHORT _num_secruns;
|
|
ULONG _length_of_chain;
|
|
|
|
//
|
|
// Stuff needed for compressed volumes.
|
|
//
|
|
|
|
BOOLEAN _is_compressed;
|
|
PSECRUN _secrun;
|
|
PUCHAR _buf;
|
|
HMEM _hmem;
|
|
PFAT_SA _fat_sa;
|
|
PCFAT _fat;
|
|
PLOG_IO_DP_DRIVE
|
|
_drive;
|
|
ULONG _starting_cluster;
|
|
};
|
|
|
|
|
|
INLINE
|
|
PVOID
|
|
CLUSTER_CHAIN::GetBuf(
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine returns a pointer to the beginning of the memory map for
|
|
the cluster chain.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
A pointer to the beginning of the memory map for the cluster chain.
|
|
|
|
--*/
|
|
{
|
|
if (_is_compressed) {
|
|
return _buf;
|
|
}
|
|
return (_secruns && _secruns[0]) ? _secruns[0]->GetBuf() : NULL;
|
|
}
|
|
|
|
|
|
INLINE
|
|
ULONG
|
|
CLUSTER_CHAIN::QueryLength(
|
|
) CONST
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Computes the number of clusters in the cluster chain.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
The number of clusters in the cluster chain.
|
|
|
|
--*/
|
|
{
|
|
return _length_of_chain;
|
|
}
|
|
|
|
|
|
#endif // CLUSTER_CHAIN_DEFN
|