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
|