fat12maker

Iniciado por Khronos14, 4 Julio 2012, 16:53 PM

0 Miembros y 1 Visitante están viendo este tema.

Khronos14

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.