146 lines
4.1 KiB
C
146 lines
4.1 KiB
C
/*++
|
|
|
|
Copyright (c) 1989-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
fat.h
|
|
|
|
Abstract:
|
|
|
|
This module defines the on-disk structure of the FAT file system.
|
|
|
|
--*/
|
|
|
|
#ifndef _FAT_
|
|
#define _FAT_
|
|
|
|
#include <pshpack1.h>
|
|
|
|
//
|
|
// Define the length of the volume name stored in the FAT volume metadata block.
|
|
// This includes one character for storing a null terminator. This should be
|
|
// equal to MAX_MUNAME (from xbox.h).
|
|
//
|
|
|
|
#define FAT_VOLUME_NAME_LENGTH 32
|
|
|
|
//
|
|
// Defines the length of region reserved for online related data.
|
|
//
|
|
|
|
#define FAT_ONLINE_DATA_LENGTH 2048
|
|
|
|
//
|
|
// Define the structure of the FAT volume metadata block. The metadata block
|
|
// is at physical byte offset zero of the volume. The metadata block is either
|
|
// 4096 bytes or one device sector in length, whichever is greater.
|
|
//
|
|
|
|
typedef struct _FAT_VOLUME_METADATA {
|
|
ULONG Signature;
|
|
ULONG SerialNumber;
|
|
ULONG SectorsPerCluster;
|
|
ULONG RootDirFirstCluster;
|
|
WCHAR VolumeName[FAT_VOLUME_NAME_LENGTH];
|
|
UCHAR OnlineData[FAT_ONLINE_DATA_LENGTH];
|
|
// Unused space in the block is filled with 0xFF bytes.
|
|
} FAT_VOLUME_METADATA, *PFAT_VOLUME_METADATA;
|
|
|
|
//
|
|
// Define the volume signature value contained in the volume metadata block.
|
|
//
|
|
|
|
#define FAT_VOLUME_SIGNATURE 'XTAF'
|
|
|
|
//
|
|
// The first entry of the FAT is reserved in order to catch media errors that
|
|
// cause part of the FAT to be zeroed out.
|
|
//
|
|
|
|
#define FAT_RESERVED_FAT_ENTRIES 1
|
|
|
|
//
|
|
// The following constants the are the valid FAT index values.
|
|
//
|
|
|
|
#define FAT_CLUSTER_AVAILABLE (ULONG)0x00000000
|
|
#define FAT_CLUSTER_RESERVED (ULONG)0xfffffff0
|
|
#define FAT_CLUSTER_BAD (ULONG)0xfffffff7
|
|
#define FAT_CLUSTER_MEDIA (ULONG)0xfffffff8
|
|
#define FAT_CLUSTER_LAST (ULONG)0xffffffff
|
|
|
|
#define FAT_CLUSTER16_AVAILABLE (USHORT)0x0000
|
|
#define FAT_CLUSTER16_RESERVED (USHORT)0xfff0
|
|
#define FAT_CLUSTER16_BAD (USHORT)0xfff7
|
|
#define FAT_CLUSTER16_MEDIA (USHORT)0xfff8
|
|
#define FAT_CLUSTER16_LAST (USHORT)0xffff
|
|
|
|
#define FAT_CLUSTER_NULL (ULONG)0
|
|
|
|
//
|
|
// FAT files have the following time/date structures.
|
|
//
|
|
|
|
typedef union _FAT_TIME_STAMP {
|
|
struct {
|
|
USHORT DoubleSeconds : 5;
|
|
USHORT Minute : 6;
|
|
USHORT Hour : 5;
|
|
USHORT Day : 5;
|
|
USHORT Month : 4;
|
|
USHORT Year : 7; // Relative to 2000
|
|
};
|
|
ULONG AsULONG;
|
|
} FAT_TIME_STAMP;
|
|
typedef FAT_TIME_STAMP *PFAT_TIME_STAMP;
|
|
|
|
//
|
|
// FAT files have the following name length.
|
|
//
|
|
|
|
#define FAT_FILE_NAME_LENGTH 255
|
|
|
|
//
|
|
// FAT paths have the following name limit.
|
|
//
|
|
|
|
#define FAT_PATH_NAME_LIMIT 255
|
|
|
|
//
|
|
// The directory entry record exists for every file/directory on the
|
|
// disk except for the root directory.
|
|
//
|
|
|
|
typedef struct _DIRENT {
|
|
UCHAR FileNameLength; // offset 0x00
|
|
UCHAR FileAttributes; // offset 0x01
|
|
UCHAR FileName[FAT_FILE_NAME_LENGTH]; // offset 0x02
|
|
ULONG FirstCluster; // offset 0x2C
|
|
ULONG FileSize; // offset 0x30
|
|
FAT_TIME_STAMP CreationTime; // offset 0x34
|
|
FAT_TIME_STAMP LastWriteTime; // offset 0x38
|
|
FAT_TIME_STAMP LastAccessTime; // offset 0x3C
|
|
} DIRENT, *PDIRENT; // sizeof = 64
|
|
|
|
//
|
|
// The first byte of a dirent describes the dirent.
|
|
//
|
|
|
|
#define FAT_DIRENT_NEVER_USED 0x00
|
|
#define FAT_DIRENT_DELETED 0xE5
|
|
#define FAT_DIRENT_NEVER_USED2 0xFF
|
|
|
|
//
|
|
// FAT directories have the following file size restriction. The restriction
|
|
// helps to avoid circular FAT corruption (directories don't track the file
|
|
// size in their directory entry) and to ensure that titles don't create a
|
|
// directory structure that's slow to search.
|
|
//
|
|
|
|
#define FAT_MAXIMUM_DIRECTORY_FILE_SIZE (4096 * sizeof(DIRENT))
|
|
|
|
#include <poppack.h>
|
|
|
|
#endif // _FAT_
|