Example #1
0
/****************************************************************************
 * _f_updatefileentry
 * Updated a file directory entry or removes the entry
 * and the fat chain belonging to it.
 ***************************************************************************/
static unsigned char _f_updatefileentry ( int remove )
{
  F_DIRENTRY    * de;
  unsigned short  date;
  unsigned short  time;

  de = (F_DIRENTRY *)( gl_sector + sizeof( F_DIRENTRY ) * gl_file.dirpos.pos );
  if ( _f_readglsector( gl_file.dirpos.sector ) || remove )
  {
    _f_setdecluster( de, 0 );
    _f_setlong( &de->filesize, 0 );
    (void)_f_writeglsector( (unsigned long)-1 );
    (void)_f_removechain( gl_file.startcluster );
    return F_ERR_WRITE;
  }

  _f_setdecluster( de, gl_file.startcluster );
  _f_setlong( &de->filesize, gl_file.filesize );
  f_igettimedate( &time, &date );
  _f_setword( &de->cdate, date );  /*if there is realtime clock then creation date could be set from*/
  _f_setword( &de->ctime, time );  /*if there is realtime clock then creation time could be set from*/
  if ( gl_volume.mediatype == F_FAT32_MEDIA )
  {
    _f_setword( &de->lastaccessdate, date );  /*if there is realtime clock then creation date could be set from*/
  }

  return _f_writeglsector( (unsigned long)-1 );
} /* _f_updatefileentry */
Example #2
0
/****************************************************************************
 *
 * _f_readbootrecord
 *
 * read boot record from a volume, it detects if there is MBR on the media
 *
 * RETURNS
 *
 * error code or zero if successful
 *
 ***************************************************************************/
static unsigned char _f_readbootrecord ( void )
{
  unsigned char   ret;
  unsigned char * ptr = (unsigned char *)gl_sector;
  unsigned long   maxcluster, _n;
  unsigned long   first_sector = 0;

  gl_volume.mediatype = F_UNKNOWN_MEDIA;


  ret = _f_readglsector( 0 );
  if ( ret )
  {
    return ret;
  }


  if ( ( ptr[0x1fe] != 0x55 ) || ( ptr[0x1ff] != 0xaa ) )
  {
    return F_ERR_NOTFORMATTED;                                              /*??*/
  }

  if ( ( ptr[0] != 0xeb ) && ( ptr[0] != 0xe9 ) )
  {
    first_sector = _f_getlong( &ptr[0x08 + 0x1be] ); /*start sector for 1st partioon*/

    ret = _f_readglsector( first_sector );
    if ( ret )
    {
      return ret;
    }

    if ( ( ptr[0x1fe] != 0x55 ) || ( ptr[0x1ff] != 0xaa ) )
    {
      return F_ERR_NOTFORMATTED;                                                /*??*/
    }

    if ( ( ptr[0] != 0xeb ) && ( ptr[0] != 0xe9 ) )
    {
      return F_ERR_NOTFORMATTED;                                        /*??*/
    }
  }

  ptr += 11;
  if ( _f_getword( ptr ) != F_SECTOR_SIZE )
  {
    return F_ERR_NOTSUPPSECTORSIZE;
  }

  ptr += 2;
  gl_volume.bootrecord.sector_per_cluster = *ptr++;
  gl_volume.firstfat.sector = _f_getword( ptr );
  ptr += 2;
  gl_volume.bootrecord.number_of_FATs = *ptr++;
  gl_volume.root.num = _f_getword( ptr );
  ptr += 2;
  gl_volume.root.num *= sizeof( F_DIRENTRY );
  gl_volume.root.num /= F_SECTOR_SIZE;
  maxcluster = _f_getword( ptr );
  ptr += 2;
  gl_volume.bootrecord.media_descriptor = *ptr++;
  gl_volume.firstfat.num = _f_getword( ptr );
  ptr += 6;
  _n = _f_getlong( ptr );
  ptr += 4;
  if ( _n < first_sector )
  {
    _n = first_sector;
  }

  gl_volume.firstfat.sector += _n;
  if ( !maxcluster )
  {
    maxcluster = _f_getlong( ptr );
  }

  ptr += 4;


  if ( gl_volume.firstfat.num )
  {
    gl_volume.root.sector = gl_volume.firstfat.sector + ( gl_volume.firstfat.num * gl_volume.bootrecord.number_of_FATs );
    gl_volume._tdata.sector = gl_volume.root.sector + gl_volume.root.num;
    gl_volume._tdata.num = 0;
    ptr += 3;
  }
  else
  {
    gl_volume.firstfat.num = _f_getlong( ptr );
    ptr += 8;
    gl_volume._tdata.sector = gl_volume.firstfat.sector;
    gl_volume._tdata.sector += gl_volume.firstfat.num * gl_volume.bootrecord.number_of_FATs;
    gl_volume._tdata.num = 0;
    gl_volume.bootrecord.rootcluster = _f_getlong( ptr );
    ptr += 23;
    gl_volume.root.num = gl_volume.bootrecord.sector_per_cluster;
    gl_volume.root.sector = ( ( gl_volume.bootrecord.rootcluster - 2 ) * gl_volume.root.num ) + gl_volume._tdata.sector;
  }

  gl_volume.bootrecord.serial_number = _f_getlong( ptr );

  maxcluster -= gl_volume._tdata.sector;
  maxcluster += _n;
  gl_volume.maxcluster = maxcluster / gl_volume.bootrecord.sector_per_cluster;

  if ( gl_volume.maxcluster < ( F_CLUSTER_RESERVED & 0xfff ) )
  {
    gl_volume.mediatype = F_FAT12_MEDIA;
  }
  else if ( gl_volume.maxcluster < ( F_CLUSTER_RESERVED & 0xffff ) )
  {
    gl_volume.mediatype = F_FAT16_MEDIA;
  }
  else
  {
    gl_volume.mediatype = F_FAT32_MEDIA;
  }

  if ( gl_volume.bootrecord.media_descriptor != 0xf8 )    /*fixdrive*/
  {
    if ( gl_volume.bootrecord.media_descriptor != 0xf0 )  /*removable*/
    {
      return F_ERR_NOTFORMATTED;      /*??*/
    }
  }

  return F_NO_ERROR;
} /* _f_readbootrecord */