iso9660.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #pragma once
  2. typedef struct {
  3. char year[4];
  4. char month[2];
  5. char day[2];
  6. char hour[2];
  7. char minute[2];
  8. char second[2];
  9. char hundredths[2];
  10. int8_t timezone;
  11. } __attribute__((packed)) iso_9660_datetime_t;
  12. typedef struct {
  13. uint8_t year;
  14. uint8_t month;
  15. uint8_t day;
  16. uint8_t hour;
  17. uint8_t minute;
  18. uint8_t second;
  19. int8_t timezone;
  20. } __attribute__((packed)) iso_9660_rec_date_t;
  21. typedef struct {
  22. uint8_t length;
  23. uint8_t ext_length;
  24. uint32_t extent_start_LSB;
  25. uint32_t extent_start_MSB;
  26. uint32_t extent_length_LSB;
  27. uint32_t extent_length_MSB;
  28. iso_9660_rec_date_t record_date;
  29. uint8_t flags;
  30. uint8_t interleave_units;
  31. uint8_t interleave_gap;
  32. uint16_t volume_seq_LSB;
  33. uint16_t volume_seq_MSB;
  34. uint8_t name_len;
  35. char name[];
  36. } __attribute__((packed)) iso_9660_directory_entry_t;
  37. typedef struct {
  38. uint8_t type; /* 0x01 */
  39. char id[5]; /* CD001 */
  40. uint8_t version;
  41. uint8_t _unused0;
  42. char system_id[32];
  43. char volume_id[32];
  44. uint8_t _unused1[8];
  45. uint32_t volume_space_LSB;
  46. uint32_t volume_space_MSB;
  47. uint8_t _unused2[32];
  48. uint16_t volume_set_LSB;
  49. uint16_t volume_set_MSB;
  50. uint16_t volume_seq_LSB;
  51. uint16_t volume_seq_MSB;
  52. uint16_t logical_block_size_LSB;
  53. uint16_t logical_block_size_MSB;
  54. uint32_t path_table_size_LSB;
  55. uint32_t path_table_size_MSB;
  56. uint32_t path_table_LSB;
  57. uint32_t optional_path_table_LSB;
  58. uint32_t path_table_MSB;
  59. uint32_t optional_path_table_MSB;
  60. /* iso_9660_directory_entry_t */
  61. char root[34];
  62. char volume_set_id[128];
  63. char volume_publisher[128];
  64. char data_preparer[128];
  65. char application_id[128];
  66. char copyright_file[38];
  67. char abstract_file[36];
  68. char bibliographic_file[37];
  69. iso_9660_datetime_t creation;
  70. iso_9660_datetime_t modification;
  71. iso_9660_datetime_t expiration;
  72. iso_9660_datetime_t effective;
  73. uint8_t file_structure_version;
  74. uint8_t _unused_3;
  75. char application_use[];
  76. } __attribute__((packed)) iso_9660_volume_descriptor_t;
  77. #define ISO_SECTOR_SIZE 2048
  78. #define FLAG_HIDDEN 0x01
  79. #define FLAG_DIRECTORY 0x02
  80. #define FLAG_ASSOCIATED 0x04
  81. #define FLAG_EXTENDED 0x08
  82. #define FLAG_PERMISSIONS 0x10
  83. #define FLAG_CONTINUES 0x80
  84. static int root_sector = 0;
  85. static iso_9660_volume_descriptor_t * root = (iso_9660_volume_descriptor_t *)((uint8_t *)0x20000);
  86. static iso_9660_directory_entry_t * dir_entry = (iso_9660_directory_entry_t *)((uint8_t *)0x20800);
  87. static uint8_t * mod_dir = (uint8_t *)0x21000;
  88. static uint8_t * dir_entries = (uint8_t *)(0x30000);
  89. static struct ata_device * device = 0;
  90. static int navigate(char * name) {
  91. memset(dir_entries, 2048, 0xA5);
  92. //print("reading from sector ");
  93. //print_hex(dir_entry->extent_start_LSB);
  94. //print("\n");
  95. ata_device_read_sector_atapi(device, dir_entry->extent_start_LSB, dir_entries);
  96. ata_device_read_sector_atapi(device, dir_entry->extent_start_LSB+1, dir_entries + 2048);
  97. ata_device_read_sector_atapi(device, dir_entry->extent_start_LSB+2, dir_entries + 4096);
  98. long offset = 0;
  99. while (1) {
  100. iso_9660_directory_entry_t * dir = (iso_9660_directory_entry_t *)(dir_entries + offset);
  101. if (dir->length == 0) {
  102. if (offset < dir_entry->extent_length_LSB) {
  103. offset += 1; // this->block_size - ((uintptr_t)offset % this->block_size);
  104. goto try_again;
  105. }
  106. break;
  107. }
  108. if (!(dir->flags & FLAG_HIDDEN)) {
  109. char file_name[dir->name_len + 1];
  110. memcpy(file_name, dir->name, dir->name_len);
  111. file_name[dir->name_len] = 0;
  112. char * s = strchr(file_name,';');
  113. if (s) {
  114. *s = '\0';
  115. }
  116. #if 0
  117. print("Found a file: ");
  118. print(" Name: ");
  119. print(file_name); print("\n");
  120. #endif
  121. if (!strcmp(file_name, name)) {
  122. memcpy(dir_entry, dir, sizeof(iso_9660_directory_entry_t));
  123. return 1;
  124. }
  125. }
  126. offset += dir->length;
  127. try_again:
  128. if ((long)(offset) > dir_entry->extent_length_LSB) break;
  129. }
  130. return 0;
  131. }
  132. static void restore_root(void) {
  133. memcpy(dir_entry, (iso_9660_directory_entry_t *)&root->root, sizeof(iso_9660_directory_entry_t));
  134. #if 0
  135. print("Root restored.");
  136. print("\n Entry len: "); print_hex( dir_entry->length);
  137. print("\n File start: "); print_hex( dir_entry->extent_start_LSB);
  138. print("\n File len: "); print_hex( dir_entry->extent_length_LSB);
  139. print("\n");
  140. #endif
  141. }
  142. static void restore_mod(void) {
  143. memcpy(dir_entry, (iso_9660_directory_entry_t *)mod_dir, sizeof(iso_9660_directory_entry_t));
  144. #if 0
  145. print("mod restored.");
  146. print("\n Entry len: "); print_hex( dir_entry->length);
  147. print("\n File start: "); print_hex( dir_entry->extent_start_LSB);
  148. print("\n File len: "); print_hex( dir_entry->extent_length_LSB);
  149. print("\n");
  150. #endif
  151. }