windows-nt/Source/XPSP1/NT/base/fs/utils/untfs/inc/indxroot.hxx

367 lines
5.6 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
indxroot.hxx
Abstract:
this module contains the declarations for the NTFS_INDEX_ROOT
class, which models the root of an NTFS index
Author:
Bill McJohn (billmc) 06-Sept-1991
Environment:
ULIB, User Mode
--*/
#if !defined( _NTFS_INDEX_ROOT_DEFN_ )
#define _NTFS_INDEX_ROOT_DEFN_
DECLARE_CLASS( NTFS_ATTRIBUTE );
DECLARE_CLASS( NTFS_UPCASE_TABLE );
// If the index buffer size is smaller than the cluster size, we'll
// divide the index buffers into 512-byte blocks, and the ClustersPer-
// IndexBuffer item will actually be blocks per index buffer.
//
const ULONG NTFS_INDEX_BLOCK_SIZE = 512;
class NTFS_INDEX_ROOT : public OBJECT {
public:
DECLARE_CONSTRUCTOR( NTFS_INDEX_ROOT );
VIRTUAL
~NTFS_INDEX_ROOT(
);
NONVIRTUAL
BOOLEAN
Initialize(
IN PNTFS_ATTRIBUTE RootAttribute,
IN PNTFS_UPCASE_TABLE UpcaseTable,
IN ULONG MaximumSize
);
NONVIRTUAL
BOOLEAN
Initialize(
IN ATTRIBUTE_TYPE_CODE IndexedAttributeType,
IN COLLATION_RULE CollationRule,
IN PNTFS_UPCASE_TABLE UpcaseTable,
IN ULONG ClustersPerBuffer,
IN ULONG BytesPerBuffer,
IN ULONG MaximumRootSize
);
NONVIRTUAL
BOOLEAN
FindEntry(
IN PCINDEX_ENTRY SearchEntry,
IN OUT PULONG Ordinal,
OUT PINDEX_ENTRY* EntryFound
);
NONVIRTUAL
BOOLEAN
InsertEntry(
IN PCINDEX_ENTRY NewEntry,
IN PINDEX_ENTRY InsertPoint DEFAULT NULL
);
NONVIRTUAL
VOID
RemoveEntry(
PINDEX_ENTRY EntryToRemove
);
NONVIRTUAL
PINDEX_ENTRY
GetFirstEntry(
);
NONVIRTUAL
VOID
Recreate(
IN BOOLEAN IsLeaf,
IN VCN EndEntryDownpointer
);
NONVIRTUAL
BOOLEAN
Write(
PNTFS_ATTRIBUTE RootAttribute
);
NONVIRTUAL
ULONG
QueryClustersPerBuffer(
);
NONVIRTUAL
ULONG
QueryBufferSize(
);
NONVIRTUAL
ULONG
QueryIndexedAttributeType(
);
NONVIRTUAL
COLLATION_RULE
QueryCollationRule(
);
NONVIRTUAL
BOOLEAN
IsLeaf(
);
NONVIRTUAL
BOOLEAN
IsModified(
);
private:
NONVIRTUAL
VOID
Construct(
);
NONVIRTUAL
VOID
Destroy(
);
NONVIRTUAL
VOID
MarkModified(
);
ULONG _MaximumSize;
ULONG _DataLength;
PINDEX_ROOT _Data;
PNTFS_UPCASE_TABLE _UpcaseTable;
BOOLEAN _IsModified;
};
INLINE
PINDEX_ENTRY
NTFS_INDEX_ROOT::GetFirstEntry(
)
/*++
Routine Description:
This method returns a pointer to the first entry in the index root.
Arguments:
None.
Return Value:
A pointer to the first index entry in the root.
--*/
{
return( (PINDEX_ENTRY)( (PBYTE)&(_Data->IndexHeader) +
_Data->IndexHeader.FirstIndexEntry ) );
}
INLINE
ULONG
NTFS_INDEX_ROOT::QueryClustersPerBuffer(
)
/*++
Routine Description:
This method returns the number of clusters in each Index Allocation
Buffer in this index.
Arguments:
None.
Return Value:
Clusters per Buffer.
--*/
{
return _Data->ClustersPerIndexBuffer;
}
INLINE
ULONG
NTFS_INDEX_ROOT::QueryBufferSize(
)
/*++
Routine Description:
This method returns the number of bytes in each Index Allocation
Buffer in this index.
Arguments:
None.
Return Value:
Bytes per Buffer.
--*/
{
return _Data->BytesPerIndexBuffer;
}
INLINE
ULONG
NTFS_INDEX_ROOT::QueryIndexedAttributeType(
)
/*++
Routine Description:
This method returns the Attribute Type Code of the attribute
which is indexed by this index.
Arguments:
None.
Return Value:
The attribute type code of the attributes in this index.
--*/
{
return _Data->IndexedAttributeType;
}
INLINE
COLLATION_RULE
NTFS_INDEX_ROOT::QueryCollationRule(
)
/*++
Routine Description:
This method marks the index root as modified.
Arguments:
None.
Return Value:
None.
--*/
{
return _Data->CollationRule;
}
INLINE
BOOLEAN
NTFS_INDEX_ROOT::IsLeaf(
)
/*++
Routine Description:
This method determines whether the Index Root is a leaf (ie. that
the entries in the root do not have downpointers) or a node
(ie. the entries have downpointers).
Arguments:
None.
Return Value:
TRUE if the root is a leaf; FALSE if it is a node.
--*/
{
return( !(_Data->IndexHeader.Flags & INDEX_NODE) );
}
INLINE
BOOLEAN
NTFS_INDEX_ROOT::IsModified(
)
/*++
Routine Description:
This method indicates whether the index root has been modified
since the last time it was read from or written to an $INDEX_ROOT
attribute.
Arguments:
None.
Return Value:
TRUE if the index root has been modified; FALSE otherwise.
--*/
{
return _IsModified;
}
INLINE
VOID
NTFS_INDEX_ROOT::MarkModified(
)
/*++
Routine Description:
This method marks the index root as modified.
Arguments:
None.
Return Value:
None.
--*/
{
_IsModified = TRUE;
}
#endif