/**************************************************************************** * _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 */
/**************************************************************************** * * _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 */