NT4/private/utils/uhpfs/inc/dirtree.hxx
2020-09-30 17:12:29 +02:00

213 lines
3.3 KiB
C++

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
dirtree.hxx
Abstract:
Definitions for the HPFS directory tree object
Author:
Bill McJohn (billmc) 16-Jan-1989
Notes:
--*/
#if ! defined(HPFS_DIRECTORY_TREE_DEFN)
#define HPFS_DIRECTORY_TREE_DEFN
//
// Forward references
//
DECLARE_CLASS( DIRBLK );
DECLARE_CLASS( DIRBLK_CACHE );
DECLARE_CLASS( DIRBLK_CACHE_ELEMENT );
DECLARE_CLASS( HPFS_DIRECTORY_TREE );
DECLARE_CLASS( HPFS_NAME );
DECLARE_CLASS( HPFS_SA );
DECLARE_CLASS( LOG_IO_DP_DRIVE );
// WorstCaseSplit is the number of dirblks we would need to allocate for
// a worst-case split. Eight will allow us to split a five-level tree
// even if we have to discard two due to hotfixing.
CONST ULONG WorstCaseSplit = 8;
class HPFS_DIRECTORY_TREE : public OBJECT {
public:
DECLARE_CONSTRUCTOR( HPFS_DIRECTORY_TREE );
VIRTUAL
~HPFS_DIRECTORY_TREE(
);
NONVIRTUAL
BOOLEAN
Initialize(
IN PHPFS_SA SuperArea,
IN PDIRBLK_CACHE Cache,
IN LBN RootDirblkLbn,
IN LBN FnodeLbn
);
NONVIRTUAL
BOOLEAN
Insert(
IN PDIRENTD NewDirent
);
NONVIRTUAL
BOOLEAN
QueryDirentFromName(
IN PHPFS_NAME Name,
OUT PVOID Buffer,
IN ULONG BufferLength,
OUT PBOOLEAN Error
);
NONVIRTUAL
LBN
QueryFnodeLbnFromName(
IN PHPFS_NAME Name
);
NONVIRTUAL
LBN
QueryRootDirblkLbn(
);
NONVIRTUAL
BOOLEAN
Delete(
IN PHPFS_NAME Name
);
NONVIRTUAL
BOOLEAN
Sort(
);
NONVIRTUAL
BOOLEAN
CheckOrder(
PLOG_IO_DP_DRIVE Drive,
OUT PBOOLEAN IsBadlyOrdered
);
NONVIRTUAL
BOOLEAN
UpdateDirent(
IN PDIRENTD SourceDirent
);
private:
NONVIRTUAL
VOID
Construct (
);
NONVIRTUAL
VOID
Destroy(
);
NONVIRTUAL
BOOLEAN
FindName(
IN PHPFS_NAME Name,
OUT PDIRENTD* DirentFound,
OUT PDIRBLK* DirblkFound,
OUT PDIRBLK_CACHE_ELEMENT* HeaderFound
);
NONVIRTUAL
BOOLEAN
InsertIntoDirblk(
PDIRENTD NewDirent,
PDIRBLK Dirblk,
PDIRBLK_CACHE_ELEMENT Header,
PBYTE InsertionPoint = NULL,
LBN NewDownpointer = 0
);
NONVIRTUAL
BOOLEAN
CreateNewRoot(
PDIRENTD DirentToPromote,
LBN EndDownPointer
);
NONVIRTUAL
BOOLEAN
Merge(
PDIRBLK FirstDirblk,
PDIRBLK_CACHE_ELEMENT FirstHeader,
PDIRBLK SecondDirblk,
PDIRBLK_CACHE_ELEMENT SecondHeader,
PDIRBLK ParentDirblk,
PDIRBLK_CACHE_ELEMENT ParentHeader,
PDIRENTD ParentEntry
);
NONVIRTUAL
BOOLEAN
Balance(
PDIRBLK FirstDirblk,
PDIRBLK_CACHE_ELEMENT FirstHeader,
PDIRBLK SecondDirblk,
PDIRBLK_CACHE_ELEMENT SecondHeader,
PDIRBLK ParentDirblk,
PDIRBLK_CACHE_ELEMENT ParentHeader,
PDIRENTD ParentEntry
);
NONVIRTUAL
BOOLEAN
Adjust(
PDIRBLK_CACHE_ELEMENT TargetHeader,
PDIRBLK TargetDirblk
);
NONVIRTUAL
VOID
FreeDirblks(
LBN DirblkLbn
);
NONVIRTUAL
BOOLEAN
SortFromDirblk(
LBN DirblkLbn,
HPFS_DIRECTORY_TREE* TargetTree,
PDIRENTD Buffer
);
BOOLEAN
CheckOrderFromDirblk(
PLOG_IO_DP_DRIVE Drive,
IN LBN DirblkLbn,
IN OUT PHPFS_NAME PreviousName,
IN OUT PBOOLEAN IsBadlyOrdered
);
PDIRBLK_CACHE _Cache;
PHPFS_SA _SuperArea;
LBN _RootDirblkLbn;
LBN _FnodeLbn;
};
#endif