+--------+ | Child |
| File |
+--------+
-\f
+
Attached to each Directory Fcb is a prefix table containing the names
of children of this directory for which there is an Fcb. Not all Fcb's
will necessarily have an entry in this table.
| Object|
+--------+
-\f
+
Synchronization:
1. A resource in the CdData synchronizes access to the Vcb queue. This
#define BYTE_COUNT_EMBEDDED_NAME (32)
-\f
+
//
// The CD_MCB is used to store the mapping of logical file offset to
// logical disk offset. NOTE - This package only deals with the
} CD_MCB_ENTRY;
typedef CD_MCB_ENTRY *PCD_MCB_ENTRY;
-\f
+
//
// Cd name structure. The following structure is used to represent the
// full Cdrom name. This name can be stored in either Unicode or ANSI
} NAME_LINK;
typedef NAME_LINK *PNAME_LINK;
-\f
+
//
// Prefix entry. There is one of these for each name in the prefix table.
// An Fcb will have one of these embedded for the long name and an optional
#define PREFIX_FLAG_EXACT_CASE_IN_TREE (0x00000001)
#define PREFIX_FLAG_IGNORE_CASE_IN_TREE (0x00000002)
-\f
+
//
// The CD_DATA record is the top record in the CDROM file system in-memory
// data structure. This structure must be allocated from non-paged pool.
// Since DVD drives allow > 100 "sessions", we need to use a larger TOC
// than the legacy CD definition. The maximum is theoretically 0xaa-16 (max
// number of open tracks in a session), but it's quite possible that some
-// drive does not enforce this, so we'll go with 169 (track 0xaa is always the
+// drive does not enforce this, so we'll go with 169 (track 0xaa is always the
// leadout).
//
//
TRACK_DATA TrackData[ MAXIMUM_NUMBER_TRACKS_LARGE];
-
+
} CDROM_TOC_LARGE, *PCDROM_TOC_LARGE;
typedef struct _CD_SECTOR_CACHE_CHUNK {
ULONG BaseLbn;
PUCHAR Buffer;
-
+
} CD_SECTOR_CACHE_CHUNK, *PCD_SECTOR_CACHE_CHUNK;
#define CD_SEC_CACHE_CHUNKS 4
// Directory block cache. Read large numbers of blocks on directory
// reads, hoping to benefit from the fact that most mastered/pressed
// discs clump metadata in one place thus allowing us to crudely
- // pre-cache and reduce seeks back to directory data during app install,
+ // pre-cache and reduce seeks back to directory data during app install,
// file copy etc.
//
// Note that the purpose of this is to PRE cache unread data,
PUCHAR SectorCacheBuffer;
CD_SECTOR_CACHE_CHUNK SecCacheChunks[ CD_SEC_CACHE_CHUNKS];
ULONG SecCacheLRUChunkIndex;
-
+
PIRP SectorCacheIrp;
KEVENT SectorCacheEvent;
ERESOURCE SectorCacheResource;
#define VCB_STATE_SHUTDOWN (0x00000400)
#define VCB_STATE_DISMOUNTED (0x00000800)
-\f
+
//
// The Volume Device Object is an I/O system device object with a
// workqueue and an VCB record appended to the end. There are multiple
} VOLUME_DEVICE_OBJECT;
typedef VOLUME_DEVICE_OBJECT *PVOLUME_DEVICE_OBJECT;
-\f
+
//
// The following two structures are the separate union structures for
// data and index Fcb's. The path table is actually the same structure
#define SIZEOF_FCB_INDEX \
(FIELD_OFFSET( FCB, FcbType ) + sizeof( FCB_INDEX ))
-\f
+
//
// The Ccb record is allocated for every file object
//
#define CCB_FLAG_ENUM_INITIALIZED (0x00200000)
#define CCB_FLAG_ENUM_NOMATCH_CONSTANT_ENTRY (0x00400000)
-\f
+
//
// The Irp Context record is allocated for every orginating Irp. It is
// created by the Fsd dispatch routines, and deallocated by the CdComplete
IRP_CONTEXT_FLAG_IN_FSP \
)
-\f
+
//
// Following structure is used to queue a request to the delayed close queue.
// This structure should be the minimum block allocation size.
} IRP_CONTEXT_LITE;
typedef IRP_CONTEXT_LITE *PIRP_CONTEXT_LITE;
-\f
+
//
// Context structure for asynchronous I/O calls. Most of these fields
// are actually only required for the ReadMultiple routines, but
} CD_IO_CONTEXT;
typedef CD_IO_CONTEXT *PCD_IO_CONTEXT;
-\f
+
//
// Following structure is used to track the top level request. Each Cdfs
// Fsd and Fsp entry point will examine the top level irp location in the
} THREAD_CONTEXT;
typedef THREAD_CONTEXT *PTHREAD_CONTEXT;
-\f
+
//
// The following structure is used for enumerating the entries in the
// path table. We will always map this two sectors at a time so we don't
#define VACB_MAPPING_MASK (VACB_MAPPING_GRANULARITY - 1)
#define LAST_VACB_SECTOR_OFFSET (VACB_MAPPING_GRANULARITY - SECTOR_SIZE)
-\f
+
//
// Path Entry. This is our representation of the on disk data.
//
#define PATH_ENTRY_FLAG_ALLOC_BUFFER (0x00000001)
-\f
+
//
// Compound path entry. This structure combines the on-disk entries
// with the in-memory structures.
} COMPOUND_PATH_ENTRY;
typedef COMPOUND_PATH_ENTRY *PCOMPOUND_PATH_ENTRY;
-\f
+
//
// The following is used for enumerating through a directory via the
// dirents.
} DIRENT_ENUM_CONTEXT;
typedef DIRENT_ENUM_CONTEXT *PDIRENT_ENUM_CONTEXT;
-\f
+
//
// Following structure is used to smooth out the differences in the HSG, ISO
// and Joliett directory entries.
#define DIRENT_FLAG_NOT_PERSISTENT (0)
-\f
+
//
// Following structure combines the on-disk information with the normalized
// structure.
} COMPOUND_DIRENT;
typedef COMPOUND_DIRENT *PCOMPOUND_DIRENT;
-\f
+
//
// The following structure is used to enumerate the files in a directory.
// It contains three DirContext/Dirent pairs and then self pointers to
#define FILE_CONTEXT_MULTIPLE_DIRENTS (0x00000001)
-\f
+
//
// RIFF header. Prepended to the data of a file containing XA sectors.
// This is a hard-coded structure except that we bias the 'ChunkSize' and
} AUDIO_PLAY_HEADER;
typedef AUDIO_PLAY_HEADER *PAUDIO_PLAY_HEADER;
-\f
+
//
// Some macros for supporting the use of a Generic Table
// containing all the FCB/DCBs and indexed by their FileId.