367 lines
5.6 KiB
C++
367 lines
5.6 KiB
C++
/*++
|
||
|
||
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
|