windows-nt/Source/XPSP1/NT/base/fs/utils/untfs/inc/indxbuff.hxx
2020-09-26 16:20:57 +08:00

384 lines
6.3 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
indxbuff.hxx
Abstract:
this module contains the declarations for the NTFS_INDEX_BUFFER
class, which models index buffers in NTFS index trees.
Author:
Bill McJohn (billmc) 02-Sept-1991
Environment:
ULIB, User Mode
--*/
#if !defined( _NTFS_INDEX_BUFFER_DEFN_ )
#define _NTFS_INDEX_BUFFER_DEFN_
#include "hmem.hxx"
#include "indxtree.hxx"
DECLARE_CLASS( LOG_IO_DP_DRIVE );
DECLARE_CLASS( NTFS_ATTRIBUTE );
DECLARE_CLASS( NTFS_INDEX_TREE );
DECLARE_CLASS( NTFS_UPCASE_TABLE );
class NTFS_INDEX_BUFFER : public OBJECT {
FRIEND
BOOLEAN
NTFS_INDEX_TREE::InsertIntoBuffer(
PNTFS_INDEX_BUFFER TargetBuffer,
PINTSTACK ParentTrail,
PCINDEX_ENTRY NewEntry,
PINDEX_ENTRY InsertionPoint
);
FRIEND
BOOLEAN
NTFS_INDEX_TREE::InsertIntoRoot(
PCINDEX_ENTRY NewEntry,
PINDEX_ENTRY InsertionPoint
);
FRIEND
BOOLEAN
NTFS_INDEX_TREE::GetNextParent(
);
public:
DECLARE_CONSTRUCTOR( NTFS_INDEX_BUFFER );
VIRTUAL
~NTFS_INDEX_BUFFER(
);
NONVIRTUAL
BOOLEAN
Initialize(
IN PCLOG_IO_DP_DRIVE Drive,
IN VCN ThisBufferVcn,
IN ULONG ClusterSize,
IN ULONG ClustersPerBuffer,
IN ULONG BufferSize,
IN ULONG CollationRule,
IN PNTFS_UPCASE_TABLE UpcaseTable
);
NONVIRTUAL
VOID
Create(
IN BOOLEAN IsLeaf,
IN VCN EndEntryDownpointer
);
NONVIRTUAL
BOOLEAN
Read(
IN OUT PNTFS_ATTRIBUTE AllocationAttribute
);
NONVIRTUAL
BOOLEAN
Write(
IN OUT PNTFS_ATTRIBUTE AllocationAttribute
);
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(
IN PINDEX_ENTRY EntryToRemove
);
NONVIRTUAL
PINDEX_ENTRY
GetFirstEntry(
);
NONVIRTUAL
BOOLEAN
IsLeaf(
) CONST;
NONVIRTUAL
VCN
QueryVcn(
) CONST;
NONVIRTUAL
ULONG
QuerySize(
) CONST;
NONVIRTUAL
PINDEX_ALLOCATION_BUFFER
GetData(
);
NONVIRTUAL
PINDEX_ENTRY
FindSplitPoint(
);
NONVIRTUAL
BOOLEAN
IsEmpty(
);
NONVIRTUAL
BOOLEAN
SetLsn(
IN BIG_INT NewLsn
);
NONVIRTUAL
LSN
QueryLsn(
) CONST;
BOOLEAN
Copy(
IN PNTFS_INDEX_BUFFER p,
IN PCLOG_IO_DP_DRIVE Drive
);
private:
NONVIRTUAL
VOID
Construct(
);
NONVIRTUAL
VOID
Destroy(
);
NONVIRTUAL
VOID
InsertClump(
IN ULONG LengthOfClump,
IN PCVOID Clump
);
NONVIRTUAL
VOID
RemoveClump(
IN ULONG LengthOfClump
);
VCN _ThisBufferVcn;
ULONG _ClusterSize;
ULONG _ClustersPerBuffer;
ULONG _BufferSize;
COLLATION_RULE _CollationRule;
PNTFS_UPCASE_TABLE _UpcaseTable;
HMEM _Mem;
PINDEX_ALLOCATION_BUFFER _Data;
};
INLINE
PINDEX_ENTRY
NTFS_INDEX_BUFFER::GetFirstEntry(
)
/*++
Routine Description:
This method returns a pointer to the first entry in the index buffer.
Arguments:
None.
Return Value:
A pointer to the first index entry in the buffer.
--*/
{
return( (PINDEX_ENTRY)( (PBYTE)&(_Data->IndexHeader) +
_Data->IndexHeader.FirstIndexEntry ) );
}
INLINE
BOOLEAN
NTFS_INDEX_BUFFER::IsLeaf(
) CONST
/*++
Routine Description:
This method determines whether this index buffer is a leaf.
Arguments:
None.
Return Value:
TRUE if this buffer is a leaf; FALSE otherwise.
--*/
{
return( !(_Data->IndexHeader.Flags & INDEX_NODE) );
}
INLINE
VCN
NTFS_INDEX_BUFFER::QueryVcn(
) CONST
/*++
Routine Description:
This method returns the VCN within the index allocation attribute
of this index buffer.
Arguments:
None.
Return Value:
The VCN within the index allocation attribute of this index buffer.
--*/
{
return _ThisBufferVcn;
}
INLINE
ULONG
NTFS_INDEX_BUFFER::QuerySize(
) CONST
/*++
Routine Description:
This method returns the size of this buffer. Note that it includes
any free space in the buffer, and that all buffers in a given tree
will have the same size.
Arguments:
None.
Return Value:
The size of the buffer.
--*/
{
return _BufferSize;
}
INLINE
PINDEX_ALLOCATION_BUFFER
NTFS_INDEX_BUFFER::GetData(
)
/*++
Routine Description:
This method returns the index buffer's data buffer. It's a back
door that allows the index tree to read and write the index buffer.
Arguments:
None.
Return Value:
The index buffer's data buffer.
--*/
{
return _Data;
}
INLINE
BOOLEAN
NTFS_INDEX_BUFFER::SetLsn(
IN BIG_INT NewLsn
)
/*++
Routine Description:
This method sets the Log Sequence Number in the index buffer.
Arguments:
NewLsn -- Supplies the new LSN
Return Value:
Always returns TRUE.
--*/
{
_Data->Lsn = NewLsn.GetLargeInteger();
return TRUE;
}
INLINE
LSN
NTFS_INDEX_BUFFER::QueryLsn(
) CONST
/*++
Routine Description:
This method sets the Log Sequence Number in the index buffer.
Arguments:
NewLsn -- Supplies the new LSN
Return Value:
Always returns TRUE.
--*/
{
return _Data->Lsn;
}
#endif