ne wenn w2k ne mmc formatiert werden da 2 identische fat chains drauf
geschrieben um fehler zu verhindern.
fat32 sieht einen ordner als datei an. in dem 1ten sector des daten
teils befindet sich der root ordner. jeder eintrag besteht aus 32 byte
die ersten 8+3 sind der msdos datei name
danach kommt ein byte welches definiert ob es sich um
datei/ordner/read-only/archiv/volumelabel/ordner/langer dateiname
handelt. der rest der 32byte gibt auskunft über grösse/anfangs
sector/datum
hier ist die funktion mit der ich die pointer lade -->
// takes a 32 byte long fat entry and opens the file contained within
void FAT_load_file_ptr(u08 *fat_entry, FILE *stream){
// get the first sector of the file
stream->file_first_cluster = (((u32)fat_entry[21])<<24) +
(((u32)fat_entry[20])<<16) +
(((u32)fat_entry[27])<<8) +
fat_entry[26];
stream->file_first_cluster -= 2;
// set the curr file pos to the begining
stream->file_current_cluster = stream->file_first_cluster;
// get the size of the file and the size to go
stream->file_full_size = stream->file_size =
(((u32)fat_entry[31])<<24) +
(((u32)fat_entry[30])<<16) +
(((u32)fat_entry[29])<<8) +
fat_entry[28];
stream->file_offset = 0x00;
// copy the short file name
for(fat_u08=0; fat_u08<11; fat_u08++){
stream->name[fat_u08] = fat_entry[fat_u08];
};
};
und mit dieser schreibe ich sie -->
void FAT_set_entry(u08 *data, u08 attr, u08 *name, u32 sector, u08
ntval){
memset(data, 0, 32);
// set date&time
data[22] = data[14] = 0x1c; // TIMEL;
data[23] = data[15] = 0x73; // TIMEH;
data[18] = data[24] = data[16] = DATEL;
data[19] = data[25] = data[17] = DATEH;
data[13] = 0x19;
// set attribs
data[11] = attr;
// set name
// make sure that all the chars are upper
FAT_upper_name(name);
for(fat_u08 = 0; fat_u08 < 11; fat_u08++){
data[fat_u08] = name[fat_u08];
};
// set filesize to zero
data[31] = data[30] = data[29] = data[28] = 0x00;
// NT reserved
data[12] = ntval;
if(sector) sector += 2;
data[21] = (u08)((sector>>24)&0xff);
data[20] = (u08)((sector>>16)&0xff);
data[27] = (u08)((sector>>8)&0xff);
data[26] = (u08)(sector&0xff);
};
zum berechnen des datums benutze ich diese macros
#ifdef FAT_WRITE
#define MAKE_TIME(h, m, s) ((((int)h&0x1f)<<11) + (((int)m&0x3f)<<5) +
(s&0x1f))
#define TIME MAKE_TIME(12, 2, 24)
#define TIMEH ((TIME>>8)&0xff)
#define TIMEL (TIME&0xff)
#define MAKE_DATE(y, m, d) ((((int)y&0x7f)<<9) + (((int)m&0xf)<<5) +
(d&0x1f))
#define DATE MAKE_DATE(25, 3, 2)
#define DATEH ((DATE>>8)&0xff)
#define DATEL (DATE&0xff)
gruss,
john