summaryrefslogtreecommitdiffstats
path: root/private/ntos/boot/bootcode/hpfs/i386/fnode.inc
diff options
context:
space:
mode:
Diffstat (limited to 'private/ntos/boot/bootcode/hpfs/i386/fnode.inc')
-rw-r--r--private/ntos/boot/bootcode/hpfs/i386/fnode.inc214
1 files changed, 214 insertions, 0 deletions
diff --git a/private/ntos/boot/bootcode/hpfs/i386/fnode.inc b/private/ntos/boot/bootcode/hpfs/i386/fnode.inc
new file mode 100644
index 000000000..af0207520
--- /dev/null
+++ b/private/ntos/boot/bootcode/hpfs/i386/fnode.inc
@@ -0,0 +1,214 @@
+;** FNODE.H - Fnode definitions
+;
+; FILESYS
+; Gregory A. Jones
+; Copyright 1988 Microsoft Corporation
+;
+; Modification history:
+; P.A. Williams 06/01/89 Added fields FN_ACLBASE and FN_NEACNT
+; to fnode.
+; P.A. Williams 08/01/89 Added typedef FNODE and PFNODE, ALBLK, PALBLK,
+; ALLEAF, PALLEAF, ALSEC, and PALSEC.
+;
+
+
+;* File Allocation Tracking
+;
+; File space is allocated as a list of extents, each extent as
+; large as we can make it. This list is kept in a B+TREE format.
+; Each B+TREE block consists of a single sector containing an
+; ALSEC record, except for the top most block. The topmost block
+; consists of just an ALBLK structure, is usually much smaller than
+; 512 bytes, and is typically included in another structure.
+;
+; The leaf block(s) in the tree contain triples which indicate
+; the logical to physical mapping for this file. Typically this
+; extent list is small enough that it is wholy contained in the
+; fnode ALBLK stucture. If more than ALCNT extents are required
+; then the tree is split into two levels. Note that when the
+; topmost B+TREE block is 'split' no actual split is necessary,
+; since the new child block is much bigger than the parent block
+; and can contain all of the old records plus the new one. Thus,
+; we can have B+TREEs where the root block contains only one
+; downpointer.
+;
+; The following rules apply:
+;
+; 1) if the file is not empty, there is at least one sector allocated
+; to logical offset 0. This simplifys some critical loops.
+;
+; 2) The last entry in the last node block contains a AN_LOF value of
+; FFFFFFFF. This allows us to extend that last leaf block
+; without having to update the node block.
+;
+; 3) For the node records, the AN_SEC points to a node or leaf
+; sector which describes extents which occur before that
+; record's AN_LOF value.
+;
+
+;* Allocation block structure
+;
+; Each allocation block consists of one of these. This may be
+; a small block imbedded in an FNODE or OFT structure, or it
+; may occupy a whole sector and be embedded in an ALSEC structure.
+;
+
+ALBLK struc
+ AB_FLAG db ? ; flags
+ AB_FLAG2 db 3 dup (?) ; unused - sometimes copied with AB_FLAG
+ AB_FCNT db ? ; free count - slots for ALLEAF or ALNODE
+ AB_OCNT db ? ; occupied count - # of ALLEAF or ALNODEs
+ AB_FREP dw ? ; offset to last item+1
+ ; ALLEAF or ALNODE records go here
+ALBLK ends
+
+ABF_NODE equ 80h ; if not a leaf node
+ABF_BIN equ 40h ; suggest using binary search to find
+ABF_FNP equ 20h ; parent is an FNODE
+ABF_NFG equ 01h ; not a flag, high order bit of AB_FREP
+
+; Allocation Node Structure
+;
+; These follow an ALBLK header for a node block
+
+ALNODE struc
+ AN_LOF dd ? ; logical offset (sectors
+ AN_SEC dd ? ; sector for guys < this
+ALNODE ends
+
+
+; Allocation Leaf Structure
+;
+; These follow an ALBLK header in a leaf block
+
+ALLEAF struc
+ AL_LOF dd ? ; logical sector offset (sectors)
+ AL_LEN dd ? ; length of extent (sectors)
+ AL_POF dd ? ; physical sector offset (sectors)
+ALLEAF ends
+
+
+;* Allocation Sector Structure
+;
+; Root ALBLK structures are contained within other structures,
+; such as the FNODE. When the B+TREE is more than one level,
+; though, the non-root nodes are each held in a sector.
+;
+; This structure defines that format
+;
+
+ALSEC struc
+ AS_SIG dd ? ; signature
+ AS_SEC dd ? ; sector # of this sector
+ AS_RENT dd ? ; parent sector # or FNODE #
+ AS_ALBLK db (size ALBLK) dup (?) ; ALBLK goes here
+ ; ALNODE or ALLEAF records start here
+ALSEC ends
+
+; # of bytes available for ALLEAF or ALNODE values. Size chosen
+; so an integral # of either structure fits
+
+ifdef MASM
+ASSIZ equ ((SECSIZE - size ALSEC)/24*24)
+ .errnz size ALLEAF-12
+ .errnz size ALNODE-8
+ .errnz (ASSIZ + AL_LOF + size AL_LOF + size ALBLK) GT 512 ; extra room for an AL_LOF value
+else
+ASSIZ equ ((SECSIZE - size ALSEC)/24*24)
+endif
+
+
+; AuxInfo Structure
+;
+; The FNODE contains two AuxInfo structures, one for ACLs and
+; one for EAs.
+;
+; These structures point to within FNODE storage and also
+; potentially point to an overflow area which is an ALBLK structure.
+; The AI_FNL stuff is stored in the FN_FREE area, the ACLs first
+; and the EAs second, any free space following. The start of the
+; EAs can be found by offseting FN_FREE with FN_ACL.AI_FNL
+;
+
+AUXINFO struc
+ AI_DAL dd ? ; non-fnode Disk Allocation length
+ AI_SEC dd ? ; sec # of first sec in extent or of ALSEC
+ AI_FNL dw ? ; length of fnode info
+ AI_DAT db ? ; non-zero if AI_SEC points to ALSEC
+AUXINFO ends
+
+;* Fnode block definition
+;
+; Every file and directory has an FNODE. The file location
+; stuff is only used for files; directories are kept in
+; a BTREE of DIRBLK records pointed to by FN_SEC[0].RSEC
+;
+
+ALCNT equ 8 ; 8 ALLEAF records in an FN_AT entry
+LEAFPERFNODE equ 8 ; 8 ALLEAF records in an FN_AT entry
+NODEPERFNODE equ 12 ; 12 ALNODE records in an FNODE.
+LEAFPERSEC equ 40 ; ALLEAF records in an allocation sector
+NODEPERSEC equ 60 ; ALNODE records in an allocation sector
+
+FNODE struc
+
+; The following file location information is copied into the OFT
+; and is used there during normal file access. The stuff in the
+; fnode record here may in fact be out of date for open files.
+; See the OFN_ in the OFT structure THESE TWO AREAS IN THE
+; RESPECTIVE RECORDS MUST HAVE IDENTICAL FORMATS.
+;
+; There are two kinds of location info: FNSCNT SPTR records
+; and then a single, double, triple, and quad indirect block pointer.
+; The "block threshold" means the first sector number which is
+; contained in that indirect block heirarchy. You use this
+; to quickly find out where to start looking.
+;
+
+ FN_SIG dd ? ; signature value
+
+; History tracking info for softer software
+
+ FN_SRH dd ? ; sequential read history
+ FN_FRH dd ? ; fast read history
+ FN_NAME db 16 dup (?) ; 1st 18 bytes of file name
+ FN_CONTFN dd ? ; fnode of directory cont. this file/dir
+
+; stuff not interesting once opened
+
+ FN_ACL db (size AUXINFO) dup (?) ; access ctl list aux info structure
+ FN_HCNT db ? ; count of valid history bits
+ FN_EA db (size AUXINFO) dup (?) ; ea aux info structure
+ FN_FLAG db ? ; FNODE flag byte
+
+ FN_AB db (size ALBLK) dup (?) ; allocation block structure
+ FN_ALREC db (ALCNT*size ALLEAF) dup (?) ; referenced from FN_AB
+ FN_VLEN dd ? ; length of valid data in file. if DIR_SIZE
+ ; is > FN_VLEN then the space inbetween
+ ; must be zapped before being shown to user
+ FN_NEACNT dd ? ; # of "need eas" in file
+
+; The following fields are unused in this release, they're for
+; future compatibility. When deleting files, if FN_EEL is non-zero
+; then FN_EEL sectors starting at FN_EEP must be released too.
+;
+
+ FN_UID db 16 dup (?) ; reserved for UID value
+ FN_ACLBASE dw ? ; FN_ACLBASE offset of 1st ACE in fnode
+ FN_SPARE db 10 dup (?); 10 more bytes emergency spares
+
+; Free pool. ACLs and EAs are stored here via the AUXINFO structure
+
+ FN_FREE db 316 dup (?) ; free space for perm and env list; perm list
+ ; comes first.
+FNODE ends
+
+
+ifdef MASM
+ .errnz AL_LOF ; verify validity of FN_DMY1 hack above
+ .errnz size AL_LOF-4
+endif
+
+; Fnode FN_FLAG bits
+
+FNF_DIR equ 01h ; is a directory fnode