2020-09-30 17:17:25 +02:00

137 lines
5.3 KiB
C

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
gdformat.h
Abstract:
This module defines the on-disk structure of the GDF file system.
--*/
#ifndef _GDFORMAT_
#define _GDFORMAT_
#include <pshpack1.h>
//
// Define the signature bytes that are at the head and tail of the volume
// descriptor sector.
//
#define GDF_VOLUME_DESCRIPTOR_SIGNATURE "MICROSOFT*XBOX*MEDIA"
#define GDF_VOLUME_DESCRIPTOR_SIGNATURE_LENGTH 20
//
// Define the logical sector number of the volume descriptor sector.
//
// For ISO-9960 images, logical sector 16 is the start of the volume descriptor
// sequence. For UDF images, logical sector 256 is a possible sector for the
// anchor volume descriptor pointer. The following sector number is chosen
// such that its possible to coexist with other file systems for demo discs
// recorded on standard media.
//
#define GDF_VOLUME_DESCRIPTOR_SECTOR 32
//
// Define the structure of the GDF volume descriptor.
//
// The head and tail signature shall be set to GDF_VOLUME_DESCRIPTOR_SIGNATURE.
//
// The root directory starting sector is an absolute sector number relative to
// the start of the media. The root directory file size is the number of bytes
// allocated to the root directory.
//
// The time stamp is the volume creation date stored as a the number of 100
// nanosecond intervals since January 1, 1601 UTC (see the documentation for
// FILETIME in the Xbox XDK or Platform SDK). This time stamp is used as the
// time stamp for all files on the volume and is visible to the title through
// Win32 APIs such as FindFirstFile or GetFileAttributesEx.
//
// The reserved bytes shall be set to zero.
//
typedef struct _GDF_VOLUME_DESCRIPTOR {
UCHAR HeadSignature[GDF_VOLUME_DESCRIPTOR_SIGNATURE_LENGTH];
ULONG RootDirectoryFirstSector;
ULONG RootDirectoryFileSize;
LARGE_INTEGER TimeStamp;
UCHAR Reserved[1992];
UCHAR TailSignature[GDF_VOLUME_DESCRIPTOR_SIGNATURE_LENGTH];
} GDF_VOLUME_DESCRIPTOR, *PGDF_VOLUME_DESCRIPTOR;
//
// Define the structure of a GDF directory entry.
//
// Directory entries are stored as a binary tree with the directory entry at
// byte offset zero serving as the root node of the tree. When searching for a
// file name in a directory, the file system will do a case insensitive
// comparison of the target name to the name stored in the directory entry. If
// the names are equal, then the target directory entry has been found. If the
// target name is less than the name stored in the current directory entry, then
// the left entry index is used to find the next directory entry. If the target
// name is greater than the name stored in the current directory entry, then the
// right entry index is used to find the next directory entry.
//
// The left and right entry indexes are multiplied by four to obtain the byte
// offset of the next directory entry. If the left or right entry indexes are
// zero, then there are no more directory entries that will satisfy the target
// name search, so the name search is stopped. The byte offsets of the
// directory entries obtained by following the left or right entry indexes must
// be greater than the byte offset of the current directory entry; no entry
// indexes can point to a directory entry at a byte offset less than or equal to
// the current directory entry.
//
// Given that the left and right entry indexes are a 16-bit quantity and they
// are multiplied by four to obtain a byte offset, the maximum size for a GDF
// directory stream is 256K.
//
// No directory entry shall span a 2048 byte CD sector. If a directory stream
// sector cannot be filled with directory entries, then all unused bytes shall
// be filled with GDF_DIRECTORY_STREAM_PADDING.
//
// The starting sector is an absolute sector number relative to the start of the
// media. The file size is the number of bytes allocated to the file. All GDF
// files are allocated as a single extent. The file size shall be filled in for
// files and directories.
//
// The file attributes shall consist of the Win32 file attributes
// (FILE_ATTRIBUTE_*), but the only file attribute that the file system will pay
// attention to is FILE_ATTRIBUTE_DIRECTORY.
//
// The file name length is the number of bytes in the following variable length
// file name field. The file name length shall not be zero.
//
// The file name shall be 1 to 255 characters from the first 256 entries of the
// 16-bit Unicode table. Note that this is not equivalent to ASCII or to any of
// the Windows code pages.
//
typedef struct _GDF_DIRECTORY_ENTRY {
USHORT LeftEntryIndex;
USHORT RightEntryIndex;
ULONG FirstSector;
ULONG FileSize;
UCHAR FileAttributes;
UCHAR FileNameLength;
UCHAR FileName[1];
} GDF_DIRECTORY_ENTRY, *PGDF_DIRECTORY_ENTRY;
//
// Define the byte used to fill the unused space between the last directory
// entry of a sector and the end of the sector. When enumerating the contents
// of a directory, the file system will check for a "LeftEntryIndex ==
// RightEntryIndex == ((USHORT)-1)" in order to know that the rest of the
// directory stream sector is padding.
//
#define GDF_DIRECTORY_STREAM_PADDING ((UCHAR)-1)
#include <poppack.h>
#endif // GDFORMAT