Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

138 lines
5.1 KiB

/********************************************************************/
/** Microsoft LAN Manager **/
/** Copyright(c) Microsoft Corp., 1987-1990 **/
/********************************************************************/
#ifdef MASM
include dirent.inc
#else
#define attr_directory 0x10
#endif
/* Directory Entry Fields
*
* Directory entries are always left as a multiple of 4
* to speed up moves. The DIR_NAMA field is variable length,
* the DIR_BTP field, if present, is the last dword in the record.
* ACL information may be stored after the DIR_NAMA field but before
* the DIR_BTP field so the DIR_BTP field must be located by going
* backwards from the end of the record
*
* WARNING - Mkdir block copies some of these entries and
* makes assumptions about which fields get copied. Check
* mkdir if stuff is added.
*/
struct DIRENT {
unsigned short DIR_ELEN; /* length of this entry (including free space) */
unsigned short DIR_FLAG; /* flags - low byte defined below */
/* high byte holds the old attr_ FAT values */
unsigned long DIR_FN; /* FNODE Sector */
unsigned long DIR_MTIM; /* last modification time */
unsigned long DIR_SIZE; /* file size */
unsigned long DIR_ATIM; /* last access time */
unsigned long DIR_CTIM; /* fnode creation time */
unsigned long DIR_EALEN; /* bytes of extended attributes */
char DIR_FLEX; /* description of "flex" area following the
* file name. Current definition is:
* bits 0-2: number of ACEs in dirent
* bits 3-7: reserved.
*/
char DIR_CPAGE; /* code page index on volume */
/* the following fields have information specific to the name and directory
* position of the file. This info is not propigated for a move/rename
* That code uses DIR_NAML as a seperator - check MOVE if changes are
* made to this structure */
unsigned char DIR_NAML; /* length of file name */
unsigned char DIR_NAMA; /* name goes here */
/* ACL information may be stored here */
/* long DIR_BTP; btree pointer to descendent DIRBLK record. */
/* This is only present if DF_BTP is set. */
/* This field is referenced from the end of */
/* the record, not DIR_NAMA+DIR_NAML */
}; /* DIRENT */
#ifdef MASM
#define DIR_BTP dword ptr -4 /* referenced from the end of the record */
#endif
#define SIZE_DIR_BTP 4
#define MAX_DIRACL 3 /* max of 3 ACLs in dirent */
#define DIRSIZL offset DIR_NAMA /* base size of leaf dir entry (minus name) */
#define DIRSIZP (sizeof (struct DIRENT)-1+4) /* base size of dir entry with btree ptr w/o name */
#define MAX_DIRENT (DIRSIZP+255+MAX_DIRACL*(sizeof (struct SPERM_LIST))+10) /* max size of a DIRENT */
/* (plus some slop) */
/* Directory Block Definition
*
* The change count field is incremented every time we move any
* of the entries in this block. For efficiency reasons, folks
* remember the Sector # and offset of a directory entry, and the
* value of the DB_CCNT field when that info was recorded.
* If the DB_CCNT field is different then the remembered value,
* then the entry offset is invalid and the entry should be
* refound from the top. Note that when a directory block splits,
* the old DIRBLK gets the old DB_CCNT field. Since
* the new DIRBLK is previously unknown, it can have
* any DB_CCNT value. We start with zero so that DB_CCNT
* gives us a feel for the change rate in the directory.
*/
struct DIRBLK {
unsigned long DB_SIG; /* signature value */
unsigned long DB_FREP; /* offset of first free byte */
unsigned long DB_CCNT; /* change count (low order bit is flag) */
/* =1 if this block is topmost */
/* =0 otherwise */
unsigned long DB_PAR; /* parent directory PSector # if not topmost */
/* FNODE sector if topmost */
unsigned long DB_SEC; /* PSector # of this directory block */
char DB_START; /* first dirent record goes here */
char DB_DUMY[2027]; /* round out to 2048 bytes */
}; /* DIRBLK */
/* Maximum entries per directory. */
#define MAXDIRE (size DIRBLK- DB_START)/(size DIRENT)
/** DIR_FLEX mask
*/
#define DFX_ACLMASK 0x03 /* Bits describing number of ACLS */
/** DIR_FLAG values
*/
#define DF_SPEC 0x0001 /* special . entry */
#define DF_ACL 0x0002 /* item has ACL */
#define DF_BTP 0x0004 /* entry has a btree down pointer */
#define DF_END 0x0008 /* is dumy end record */
#define DF_XACL 0x0040 /* item has explicit ACL */
#define DF_NEEDEAS 0x0080 /* file has "need" EAs */
#define DF_NEWNAME 0x4000 /* filename doesn't use old naming rules */
#define attr_newname 0x40 /* ditto for "dos attribute byte" */
#define DF_RMASK DF_ACL+DF_XACL+DF_NEEDEAS /* only attributes preserved for rename */
#ifdef MASM
.errnz DF_BTP - SIZE_DIR_BTP /* code uses this "coincidence" */
#endif
/* Attributes which creation can specify */
#define DF_CMASK attr_read_only+attr_hidden+attr_archive+attr_system
#define SD_ACL_LIM 1024 /* *SD_ACL lists bigger than this come from */
/* system memory, smaller come from heap */