Hola, cree una herramienta que permite crear imágenes de disquete con el sistema de archivos FAT12.
Muchos considerarán inútil, pero le puede ser útil a aquella gente que quiera conocer como trabaja el sistema de archivos FAT12. Esta herramienta, la programé para el Kernel que estoy desarrollando. Puedes hacer un bootloader (de 512 bytes) y esta herramienta se encarga de meterla en el sector 0 de la imagen. También permite crear imágenes de disquete sin bootloader, soporta los siguientes tipos: 2880KB, 1440 KB, 1200 KB, 720 KB, 360 KB, 320 KB, 180 KB, 160 KB.
Las imágenes generadas siguen el estándar de Microsoft y pueden ser abiertas por el Nero o el UltraISO.
El código es bastante interesante, está escrito en C, creo que está bastante bien.
/*
* addFileFAT12()
* Add file to our FAT12_t structure
*/
int addFileFAT12(char * fileName, FAT12_t * fat12)
{
int result = 0;
linked_list_t * l = NULL;
directory_entry_t directoryEntry;
if (fat12 == NULL)
return FAT12_INVALID_FAT12_POINTER;
if (fat12->active != 0)
return FAT12_INACTIVE;
result = getDirectoryEntry(fileName, fat12, &directoryEntry);
if (result == DE_OK)
{
fat12->list.list = fat12->list.last;
l
= (linked_list_t
*)malloc(sizeof(linked_list_t
)); if (l == NULL)
return FAT12_LINKED_LIST_MALLOC_ERR;
if (fat12->list.list == NULL)
fat12->list.list = l;
else
{
fat12->list.list->next = l;
fat12->list.list = fat12->list.list->next;
}
fat12->list.list->directoryEntry = directoryEntry;
fat12
->list.
list->fileName
= (char *)malloc(strlen(fileName
) + 1); if (fat12->list.list->fileName == NULL)
return FAT12_LINKED_LIST_FILENAME_MALLOC_ERR;
strncpy(fat12
->list.
list->fileName
, fileName
, strlen(fileName
) + 1); //fat12->list.list->fileName = strdup(fileName);
fat12->list.list->next = NULL;
if (fat12->list.first == NULL)
fat12->list.first = fat12->list.list;
fat12->list.last = fat12->list.list;
fat12->NumberOfFiles++;
return FAT12_OK;
}
else
return result;
}
...
while (fat12->list.list != NULL)
{
sectorsCount = (unsigned short)(fat12->list.list->directoryEntry.FileSize / fat12->boot_sector.BytesPerSector) + 1;
fat12->list.list->directoryEntry.StartingCluster = LBAAddress;
printf("\nFile: %s, Size: %d bytes, Sectors count: %d, LBA Address: 0x%.4x", fat12
->list.
list->fileName
, fat12->list.list->directoryEntry.FileSize, sectorsCount, LBAAddress);
LBAAddress += sectorsCount;
if (sectorsCountOfNextFile != -1) //Quiere decir que ya usamos un cluster
sectorsCount--;
sectorsCountOfNextFile = -1;
fat12->list.list = fat12->list.list->next; //Preparamos el siguiente archivo
while (sectorsCount > 0)
{
switch (sectorsCount)
{
case 1:
sectorsCount = 0;
fat_entry = 0x000FFF00;
if (fat12->list.list != NULL)
{
sectorsCountOfNextFile = (unsigned short)(fat12->list.list->directoryEntry.FileSize / fat12->boot_sector.BytesPerSector) + 1;
if (sectorsCountOfNextFile == 1)
fat_entry = 0xFFFFFF00;
else
fat_entry += (nextCluster + 1) << 20;
}
break;
case 2:
fat_entry = 0xFFF00000 + (nextCluster << 8);
sectorsCount = 0;
break;
default:
fat_entry = (unsigned long)((nextCluster + 1) << 20) + (nextCluster << 8);
sectorsCount -= 2;
break;
}
nextCluster+=2;
*fatTable++ = (unsigned char)((fat_entry & 0x0000FF00) >> 8);
*fatTable++ = (unsigned char)((fat_entry & 0x00FF0000) >> 16);
*fatTable++ = (unsigned char)((fat_entry & 0xFF000000) >> 24);
}
}
Estoy haciendo más portable el código para que se pueda compilar en sistemas *nix, además, estoy escribiendo una buena documentación en español sobre el sistema de archivos FAT12.
https://sourceforge.net/projects/fat12maker/
Espero que os sea de utilidad ;D
Saludos.