summaryrefslogtreecommitdiffstats
path: root/private/ntos/boot/bootcode/hpfs/i386/tables.inc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/ntos/boot/bootcode/hpfs/i386/tables.inc201
1 files changed, 201 insertions, 0 deletions
diff --git a/private/ntos/boot/bootcode/hpfs/i386/tables.inc b/private/ntos/boot/bootcode/hpfs/i386/tables.inc
new file mode 100644
index 000000000..07cf61244
--- /dev/null
+++ b/private/ntos/boot/bootcode/hpfs/i386/tables.inc
@@ -0,0 +1,201 @@
+;static char *SCCSID = "@(#)tables.h 12.2 88/12/19";
+ifdef MASM
+ BREAK <OFT - Open File Table>
+endif
+
+;* OFT - Open File Table
+;
+; The OFT contains file specific information which is independent
+; of an instance of use of the file.
+;
+; If the file is open for write access, we keep a pointer to
+; it's directory entry, not just it's
+; FNODE, so that we can update the length and modification time when it's
+; written.
+;
+; We store the directory's FNODE number and the file name, with these
+; we can find the directory entry again even if the directory has
+; been shuffled by creates or deletes of other files. Two advisorys
+; are kept - the Vsector number, cache block address, and cache block
+; offset of the actual directory entry. This information has three
+; levels of validity:
+;
+; 1) Vsector, header address, and offset are valid
+; you can find the dir entry easily
+; 2) the header address is invalid due to cache flushing.
+; Vsector # and offset are still valid, so read the
+; cache block and go directly to the entry
+; In this case the header address points to the wrong
+; Vsector
+; 3) the directory has been altered since we opened the file,
+; so none of this info is accurate. In this case the
+; directory alteration routines located this OFT
+; entry and zeroed the Vsector number. Go to the directory
+; and search the name again.
+;
+
+OFT struc
+ OFT_P db (size DCHDR) dup (?) ; double chain of OFT structures, rooted in OFTHead[i]
+ OFT_FHT db (size DCHDR) dup (?) ; double chain of FHT structures
+ OFT_RLCK db (size DCHDR) dup (?) ; double chain of RECLOCK structures
+ OFT_FN db (size SECPTR) dup (?) ; pointer to file FNODE
+ OFT_SBD dw ? ; pointer to SBDIR structure
+ OFT_DIRE db (size SECPTR) dup (?) ; pointer to directory block
+
+ OFT_CCNT dd ? ; DB_CCNT value for OFT_DIRE to check OFT_DIRO validity
+ OFT_FREEDCNT dd ? ; SD_FREEDCNT value for DIRE to be valid
+
+;
+; These length fields are used when writing the file.
+; The OFN_ entries will reflect the OFT_ALEN value. These
+; aren't updated in the FNODE until the file closes, whereup
+; they are trimmed back to OFT_LEN which is itself propigated
+; to the file's DIR entry. If write-through is set then the
+; OFN_ entries below will be propigated to the FNODE and
+; then to the disk, but if we crash the cleanup program
+; will deallocate the "extra" sectors.
+;
+
+ OFT_LEN dd ? ; file actual length
+ OFT_ALEN dd ? ; file allocated length (SECSIZE multiple)
+ OFT_WLEN dd ? ; last byte+1 of valid data in the file
+ ; (optimization for writing into extended areas
+ OFT_LAST dd ? ; Psector # of last sector in file, or 0
+ OFT_LRP db (size SECPTR) dup (?) ; last run pointer. Valid if OFT_LAST !=0
+ ; if OFN_AB.ABF_NODE ==0 this is the address of
+ ; an OFN_SEC record in this OFT
+ ; else this is a SECPTR to the SIB
+ ; containing the last run record
+
+ OFT_VOL dd ? ; pointer to VOLTAB for this guy
+
+ OFT_NAME dd ? ; address of name string len byte
+ ; followed by name string itself
+ ; len doesn't include len byte
+
+ OFT_DIRO dw ? ; offset into directory block for entry
+ OFT_FILL dw ? ; unused, fill
+
+ OFT_LCKCNT dw ? ; count of guys in OFT_RLCK
+
+ OFT_WCNT dw ? ; # of threads blocked on this OFT
+
+ ; the following three fields are used to
+ ; control access. They're identical in use
+ ; to the equivalent fields in SBDIR. The
+ ; Flag byte only contains locking/holding
+ ; flags, so if DWORD PTR OFT_HCNT is 0 then
+ ; the OFT is known to be free and clear
+
+ OFT_HCNT dw ? ; held count, has OTF_PND bit also
+ OFT_DMY db ? ; unused, must be 0
+ OFT_FLAG db ? ; flag byte, high order in OFT_HCNT dword
+
+ OFT_WAITC dd ? ; head of wait chain if locked
+
+ OFT_OPLOCK dd ? ; Oplock value, 0 if none
+
+ OFT_BANDP dd ? ; pointer to BandTab structure in BandList
+ ; for our last allocation. =0 if unused
+
+; The following 5 fields hold the accumulation of all FHTs for this OFT.
+; This saves us from having to scan the FHTs to do a sharing check upon
+; open. An OFT is unused when OFT_RD and OFT_WT and OFT_FIND are zero
+
+ OFT_RD dw ? ; # of opens for read
+ OFT_WT dw ? ; # of opens for write
+ OFT_DR dw ? ; # of opens with deny read
+ OFT_DW dw ? ; # of opens with deny write
+ OFT_COMPAT dw ? ; # of opens for compatibility mode
+ OFT_FIND dw ? ; count of active FINDs using this OFT
+
+ OFT_REALLYBAD db ? ; non-zero if file is unusable due to
+ ; corrupt disk BUGBUG - FOLD INTO BITS
+ OFT_SFLAG db ? ; special flag byte
+ OFT_DMY2 dw ? ; unused
+
+
+; BUGBUG - rearrange these fields for er offsets dw ?
+;
+; Info copied from the file's FNODE
+;
+; The ALLEAF blocks must follow the ALBLK value
+;
+
+ OFN_AB db (size ALBLK) dup (?) ; allocation block structure
+ OFN_ALREC db (8*size ALLEAF) dup (?) ; referenced from FN_AB
+
+OFT ends
+
+; flag bits for OFT_FLAG
+
+OTF_LCK equ 01h ; file is locked against access
+OTF_PLK equ 02h ; pending lock
+OTF_PSO equ 04h ; pending solo
+OTF_PND equ 80h ; lock pending bit
+
+; flag bits for OFT_SFLAG
+
+OFS_OPLK equ 01h ; oplocked
+OFS_OPBA equ 02h ; oplock BATCH flag set
+OFS_DASD equ 04h ; DASD file
+ifdef DEBUG
+OFS_SAC equ 08h ; supress OFT_ALEN debug check
+endif
+
+; The file storage information from the fnode is replicated
+; in the OFT. This saves us from having to blow a cache block
+; keeping the FNODE in ram for every open file. The FNODE
+; is only accessed when a file is open, and when it's closed.
+; (If write-through is set, it's accessed for every growth)
+;
+; These statements are to keep the FNODE and the OFT in sync.
+
+ifdef MASM
+ .errnz (size OFN_ALREC - size FN_ALREC)
+endif
+
+
+;* FHT - File Handle Table
+;
+; The FHT contains per-handle informatiuon
+
+FHT struc
+ FHT_SEEK dd ? ; seek pointer
+ FHT_OFT dd ? ; pointer to OFT
+ FHT_CHN db (size DCHDR) dup (?) ; chain of FHTs for an OFT
+ FHT_UID dd ? ; UID and Session ID
+ FHT_MODE dw ? ; mode bits from OPEN
+ FHT_RAA dw ? ; read ahead advisory
+ FHT_HINT dd ? ; hint flags
+FHT ends
+
+ifdef MASM
+ .errnz FHT_CHN-OFT_FHT ; same offset used for both
+endif
+
+;* FHT_HINT flags
+
+FHH_SEQ equ 01 ; sequential file
+
+
+;* RecLock - Record Locking Records
+;
+; One record per lock, chained to the OFT. These are chained
+; in order RL_BEG
+;
+
+RECLOCK struc
+ RL_BEG dd ? ; begining byte of locked range
+ RL_END dd ? ; end byte of locked range
+ RL_TYPE db ? ; =1 if read allowed, =0 if full lock
+ RL_MEM db ? ; =0 if from heap, =1 if from special list
+ RL_DMY dw ? ; padding
+ RL_SPID dd ? ; Session/Pid
+ RL_CHN db (size DCHDR) dup (?) ; double chain of RECLOCK structures
+RECLOCK ends
+
+ifdef MASM
+ .errnz RL_CHN-OFT_RLCK ; must have same offset to work
+endif
+ \ No newline at end of file