elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  fat12maker
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: fat12maker  (Leído 1,234 veces)
Khronos14


Desconectado Desconectado

Mensajes: 443


A lie is a lie


Ver Perfil WWW
fat12maker
« en: 4 Julio 2012, 16:53 pm »

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.

Código
  1. /*
  2.  * addFileFAT12()
  3.  * Add file to our FAT12_t structure
  4. */
  5. int addFileFAT12(char * fileName, FAT12_t * fat12)
  6. {
  7. int result = 0;
  8. linked_list_t * l = NULL;
  9. directory_entry_t directoryEntry;
  10.  
  11. if (fat12 == NULL)
  12. return FAT12_INVALID_FAT12_POINTER;
  13.  
  14. if (fat12->active != 0)
  15. return FAT12_INACTIVE;
  16.  
  17. result = getDirectoryEntry(fileName, fat12, &directoryEntry);
  18. if (result == DE_OK)
  19. {
  20. fat12->list.list = fat12->list.last;
  21.  
  22. l = (linked_list_t*)malloc(sizeof(linked_list_t));
  23. if (l == NULL)
  24. return FAT12_LINKED_LIST_MALLOC_ERR;
  25.  
  26. if (fat12->list.list == NULL)
  27. fat12->list.list = l;
  28. else
  29. {
  30. fat12->list.list->next = l;
  31. fat12->list.list = fat12->list.list->next;
  32. }
  33.  
  34. fat12->list.list->directoryEntry = directoryEntry;
  35.  
  36. fat12->list.list->fileName = (char *)malloc(strlen(fileName) + 1);
  37. if (fat12->list.list->fileName == NULL)
  38. return FAT12_LINKED_LIST_FILENAME_MALLOC_ERR;
  39.  
  40. strncpy(fat12->list.list->fileName, fileName, strlen(fileName) + 1);
  41. //fat12->list.list->fileName = strdup(fileName);
  42.  
  43. fat12->list.list->next = NULL;
  44.  
  45. if (fat12->list.first == NULL)
  46. fat12->list.first = fat12->list.list;
  47.  
  48. fat12->list.last = fat12->list.list;
  49. fat12->NumberOfFiles++;
  50.  
  51. return FAT12_OK;
  52. }
  53. else
  54. return result;
  55. }
  56.  
  57. ...
  58. while (fat12->list.list != NULL)
  59. {
  60. sectorsCount = (unsigned short)(fat12->list.list->directoryEntry.FileSize / fat12->boot_sector.BytesPerSector) + 1;
  61. fat12->list.list->directoryEntry.StartingCluster = LBAAddress;
  62.  
  63. printf("\nFile: %s, Size: %d bytes, Sectors count: %d, LBA Address: 0x%.4x", fat12->list.list->fileName,
  64. fat12->list.list->directoryEntry.FileSize, sectorsCount, LBAAddress);
  65.  
  66. LBAAddress += sectorsCount;
  67.  
  68. if (sectorsCountOfNextFile != -1) //Quiere decir que ya usamos un cluster
  69. sectorsCount--;
  70. sectorsCountOfNextFile = -1;
  71.  
  72. fat12->list.list = fat12->list.list->next; //Preparamos el siguiente archivo
  73. while (sectorsCount > 0)
  74. {
  75. switch (sectorsCount)
  76. {
  77. case 1:
  78. sectorsCount = 0;
  79. fat_entry = 0x000FFF00;
  80.  
  81. if (fat12->list.list != NULL)
  82. {
  83. sectorsCountOfNextFile = (unsigned short)(fat12->list.list->directoryEntry.FileSize / fat12->boot_sector.BytesPerSector) + 1;
  84. if (sectorsCountOfNextFile == 1)
  85. fat_entry = 0xFFFFFF00;
  86. else
  87. fat_entry += (nextCluster + 1) << 20;
  88. }
  89. break;
  90. case 2:
  91. fat_entry = 0xFFF00000 + (nextCluster << 8);
  92. sectorsCount = 0;
  93. break;
  94. default:
  95. fat_entry = (unsigned long)((nextCluster + 1) << 20) + (nextCluster << 8);
  96.  
  97. sectorsCount -= 2;
  98. break;
  99. }
  100. nextCluster+=2;
  101.  
  102. *fatTable++ = (unsigned char)((fat_entry & 0x0000FF00) >> 8);
  103. *fatTable++ = (unsigned char)((fat_entry & 0x00FF0000) >> 16);
  104. *fatTable++ = (unsigned char)((fat_entry & 0xFF000000) >> 24);
  105. }
  106. }
  107.  
  108.  

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.


« Última modificación: 4 Julio 2012, 16:55 pm por Khronos14 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines