View of xos/common/include/vfat.h


XOS | Parent Directory | View | Download

/* Structures de donnees relatives a un systeme de fichiers VFAT. */
/* Copyright (C) 2008  Emmanuel Varoquaux
 
   This file is part of XOS.
 
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
 
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
 
   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>. */
/* Note! Ce fichier n'est valable que pour FAT12 et FAT16 ! */
 
#ifndef _VFAT_H
#define _VFAT_H
 
/* Secteur de boot */
 
typedef struct __attribute__ ((packed)) {
  unsigned char  BS_jmpBoot[3];
  unsigned char  BS_OEMName[8];
  unsigned short BPB_BytsPerSec;
  unsigned char  BPB_SecPerClus;
  unsigned short BPB_ResvdSecCnt;
  unsigned char  BPB_NumFATs;
  unsigned short BPB_RootEntCnt;
  unsigned short BPB_TotSec16;
  unsigned char  BPB_Media;
  unsigned short BPB_FATSz16;
  unsigned short BPB_SecPerTrk;
  unsigned short BPB_NumHeads;
  unsigned long  BPB_HiddSec;
  unsigned long  BPB_TotSec32;
  union {
    struct { /* FAT12 and FAT16 */
      unsigned char  BS_DrvNum;
      unsigned char  BS_Reserved1;
      unsigned char  BS_BootSig;
      unsigned long  BS_VolID;
      unsigned char  BS_VolLab[11];
      unsigned char  BS_FilSysType[8];
    } fat12, fat16;
    struct { /* FAT32 */
      unsigned long  BPB_FATSz32;
      unsigned short BPB_ExtFlags;
      unsigned short BPB_FSVer;
      unsigned long  BPB_RootClus;
      unsigned short BPB_FSInfo;
      unsigned short BPB_BkBootSec;
      unsigned char  BPB_Reserved[12];
      unsigned char  BS_DrvNum;
      unsigned char  BS_Reserved1;
      unsigned char  BS_BootSig;
      unsigned long  BS_VolID;
      unsigned char  BS_VolLab[11];
      unsigned char  BS_FilSysType[8];
    } fat32;
  };
} bootSector_t;
 
/* FAT32 FSInfo */
 
typedef struct __attribute__ ((packed)) {
  unsigned long  FSI_LeadSig;
  unsigned char  FSI_Reserved1[480];
  unsigned long  FSI_StrucSig;
  unsigned long  FSI_Free_Count;
  unsigned long  FSI_Nxt_Free;
  unsigned char  FSI_Reserved2[12];
  unsigned long  FSI_TrailSig;
} FSInfo_t;
 
/* Entrees de repertoire */
 
#define ATTR_READ_ONLY          0x01
#define ATTR_HIDDEN             0x02
#define ATTR_SYSTEM             0x04
#define ATTR_VOLUME_ID          0x08
#define ATTR_DIRECTORY          0x10
#define ATTR_ARCHIVE            0x20
#define ATTR_LONG_NAME          (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID)
#define ATTR_LONG_NAME_MASK     (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID | ATTR_DIRECTORY | ATTR_ARCHIVE)
 
#define LAST_LONG_ENTRY         0x40
 
typedef struct __attribute__ ((packed)) {
  unsigned char  DIR_Name[11];
  unsigned char  DIR_Attr;
  unsigned char  DIR_NTRes;
  unsigned char  DIR_CrtTimeTenth;
  unsigned short DIR_CrtTime;
  unsigned short DIR_CrtDate;
  unsigned short DIR_LstAccDate;
  unsigned short DIR_FstClusHI;
  unsigned short DIR_WrtTime;
  unsigned short DIR_WrtDate;
  unsigned short DIR_FstClusLO;
  unsigned long  DIR_FileSize;
} directoryEntryStructure_t;
 
typedef struct __attribute__ ((packed)) {
  unsigned char  LDIR_Ord;
  unsigned short LDIR_Name1[5];
  unsigned char  LDIR_Attr;
  unsigned char  LDIR_Type;
  unsigned char  LDIR_Chksum;
  unsigned short LDIR_Name2[6];
  unsigned short LDIR_FstClusLO;
  unsigned short LDIR_Name3[2];
} longDirectoryEntryStructure_t;
 
/* Somme de controle pour les noms de fichier longs */
 
static inline unsigned char chkSum(const unsigned char *pFcbName)
{
  short fcbNameLen;
  unsigned char sum;
 
  sum = 0;
  for (fcbNameLen = 11; fcbNameLen; fcbNameLen--)
    sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *pFcbName++;
  return sum;
}
 
#endif