windows-nt/Source/XPSP1/NT/base/efiutil/efilib/inc/cluster.hxx
2020-09-26 16:20:57 +08:00

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