SayoriOS  0.3.3
iso9660.c
1 
10 #include <kernel.h>
11 #include "portability.h"
12 #include <io/ports.h>
13 #include <../src/lib/elk/ext/jse_function.h>
14 
15 void __out_limit(char* pr, char* str, size_t count){
16  char* buf = kcalloc(1, count+1);
17  memcpy(buf,str, count);
18  printf("%s: '%s'\n",pr, buf);
19  kfree(buf);
20 }
21 
22 
23 size_t fs_iso9660_read(const char Disk,const char* Path, size_t Offset, size_t Size,void* Buffer){
24  return 0;
25 }
26 
27 size_t fs_iso9660_write(const char Disk,const char* Path,size_t Offset,size_t Size,void* Buffer){
28  return 0;
29 }
30 
31 FSM_FILE fs_iso9660_info(const char Disk,const char* Path){
32  return (FSM_FILE){};
33 }
34 
35 FSM_DIR* fs_iso9660_dir(const char Disk,const char* Path){
36  return 0;
37 }
38 
39 int fs_iso9660_create(const char Disk,const char* Path,int Mode){
40  return 0;
41 }
42 
43 int fs_iso9660_delete(const char Disk,const char* Path,int Mode){
44  return 0;
45 }
46 
47 void fs_iso9660_label(const char Disk, char* Label){
48  char* l = kcalloc(1, 33);
49  int buf_read = dpm_read(Disk, 0, 0x8028, 32, l);
50  if (buf_read != 32){
51  memcpy(Label,"Unsupported disk",strlen("Unsupported disk"));
52  } else {
53  l[33] = 0;
54  jse_trim(l);
55  memcpy(Label,l,strlen(l));
56  }
57  kfree(l);
58 }
59 
60 int fs_iso9660_detect(const char Disk){
61  ISO9660_PVD* pvd = kcalloc(1, sizeof(ISO9660_PVD));
62  int buf_read = dpm_read(Disk, 0, 0x8000, sizeof(ISO9660_PVD), pvd);
63  if (
64  pvd->Version != 0x1 ||
65  pvd->ID[0] != 0x43 ||
66  pvd->ID[1] != 0x44 ||
67  pvd->ID[2] != 0x30 ||
68  pvd->ID[3] != 0x30 ||
69  pvd->ID[4] != 0x31 ||
70  pvd->FileStructureVersion != 0x1
71  ){
72  qemu_err("[ISO9660] %c | No passed test!",Disk);
73 
74  kfree(pvd);
75  return 0;
76  }
77 
78  qemu_warn("--------------------------------");
79  qemu_warn("| Label Disk %c | READ: %d", Disk, buf_read);
80  qemu_warn("| Zero | %x | %d ", pvd->Zero, pvd->Zero);
81  __out_limit("ID", pvd->ID, 5);
82  qemu_warn("| Version | %x | %d ", pvd->Version, pvd->Version);
83  __out_limit("SystemName", pvd->SystemName, 32);
84  __out_limit("Label", pvd->Label, 32);
85  qemu_warn("| VolumeSpaceSize | %x | %d ", pvd->VolumeSpaceSize, pvd->VolumeSpaceSize);
86  qemu_warn("| VolumeSetSize | %x | %d ", pvd->VolumeSetSize, pvd->VolumeSetSize);
87  qemu_warn("| VolumeSequenceNumber | %x | %d ", pvd->VolumeSequenceNumber, pvd->VolumeSequenceNumber);
88  qemu_warn("| LogicalBlockSize | %x | %d ", pvd->LogicalBlockSize, pvd->LogicalBlockSize);
89  qemu_warn("| PathTableSize | %x | %d ", pvd->PathTableSize, pvd->PathTableSize);
90  qemu_warn("| LocOfType_L_PathTable | %x | %d ", pvd->LocOfType_L_PathTable, pvd->LocOfType_L_PathTable);
91  qemu_warn("| LocOfOpti_L_PathTable | %x | %d ", pvd->LocOfOpti_L_PathTable, pvd->LocOfOpti_L_PathTable);
92  qemu_warn("| LocOfType_M_PathTable | %x | %d ", pvd->LocOfType_M_PathTable, pvd->LocOfType_M_PathTable);
93  qemu_warn("| LocOfOpti_M_PathTable | %x | %d ", pvd->LocOfOpti_M_PathTable, pvd->LocOfOpti_M_PathTable);
94 
95  __out_limit("DirectoryEntry", pvd->DirectoryEntry, 34);
96  __out_limit("VolumeSetID", pvd->VolumeSetID, 128);
97  __out_limit("PublisherID", pvd->PublisherID, 128);
98  __out_limit("DataPreparerID", pvd->DataPreparerID, 128);
99  __out_limit("ApplicationID", pvd->ApplicationID, 128);
100  __out_limit("CopyrightFileID", pvd->CopyrightFileID, 37);
101  __out_limit("AbstractFileID", pvd->AbstractFileID, 37);
102  __out_limit("BibliographicFileID", pvd->BibliographicFileID, 37);
103  __out_limit("VolumeCreationDate", pvd->VolumeCreationDate, 37);
104  __out_limit("VolumeModificationDate", pvd->VolumeModificationDate, 17);
105  __out_limit("VolumeExpirationDate", pvd->VolumeExpirationDate, 17);
106  __out_limit("VolumeEffectiveDate", pvd->VolumeEffectiveDate, 17);
107 
108  qemu_warn("| FSVersion | %x | %d ", pvd->FileStructureVersion, pvd->FileStructureVersion);
109  qemu_warn("--------------------------------");
110 
111 
112 
113 
114 // ISO9660_Entity* entity = kcalloc(1, sizeof(ISO9660_Entity));
115 // buf_read = dpm_read(Disk, 0x809C - 3, sizeof(ISO9660_Entity), entity);
116 //
117 // int lba = (entity->LBA[0] & 0xFF) | ((entity->LBA[0] & 0xFF00) >> 8) | ((entity->LBA[0] & 0xFF0000) >> 16) | ((entity->LBA[0] & 0xFF000000) >> 24);
118 // qemu_warn("LBA: %d | %x",lba,lba);
119 
120  kfree(pvd);
121  //kfree(entity);
122  return (1);
123 }
size_t dpm_read(char Letter, uint64_t high_offset, uint64_t low_offset, size_t Size, void *Buffer)
[DPM] Считывание данных с диска
Definition: dpm.c:82
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
char CopyrightFileID[37]
[702] Имя файла в корневом каталоге, который содержит информацию об авторских правах для этого набора...
Definition: iso9660.h:31
int32_t LocOfOpti_M_PathTable
[152] Местоположение LBA дополнительной таблицы путей. Таблица путей, на которую указывает,...
Definition: iso9660.h:25
char DataPreparerID[128]
[446] Идентификатор лица(ов), подготовившего данные для этого тома. Для расширенной информации о подг...
Definition: iso9660.h:29
char VolumeExpirationDate[17]
[847] Дата и время, после которых этот том считается устаревшим. Если не указано, том никогда не счит...
Definition: iso9660.h:36
char VolumeSetID[128]
[190] Идентификатор набора томов, членом которого является этот том.
Definition: iso9660.h:27
int32_t LocOfOpti_L_PathTable
[144] Местоположение LBA дополнительной таблицы путей. Таблица путей, на которую указывает,...
Definition: iso9660.h:23
char VolumeCreationDate[17]
[813] Дата и время создания тома.
Definition: iso9660.h:34
int32_t VolumeSequenceNumber
[124] Номер этого диска в наборе томов.
Definition: iso9660.h:19
char ID[5]
[1+5] ОЕМ-идентификатор (Всегда CD001)
Definition: iso9660.h:10
uint8_t Version
[6+1] Версия файловой системы
Definition: iso9660.h:11
char DirectoryEntry[34]
[156] Обратите внимание, что это не адрес LBA, а фактическая запись каталога, которая содержит одноба...
Definition: iso9660.h:26
uint8_t Zero
[0+1] Указывает на загрузочную запись?
Definition: iso9660.h:9
int32_t VolumeSpaceSize[2]
[80] Количество логических блоков, в которых записан том.
Definition: iso9660.h:16
char VolumeEffectiveDate[17]
[864] Дата и время, после которых том можно будет использовать. Если не указано иное,...
Definition: iso9660.h:37
int8_t FileStructureVersion
[881] Записи каталога и версия таблицы путей (всегда 0x01).
Definition: iso9660.h:38
char Label[32]
[40+32] Метка диска
Definition: iso9660.h:14
char ApplicationID[128]
[574] Определяет, как данные записываются на этот том. Для расширенной информации первый байт должен ...
Definition: iso9660.h:30
int32_t LocOfType_M_PathTable
[148] Расположение LBA таблицы путей. Таблица путей, на которую указывает, содержит только значения с...
Definition: iso9660.h:24
char SystemName[32]
[8+32] Имя системы, которая может работать с секторами 0x00–0x0F тома.
Definition: iso9660.h:13
char PublisherID[128]
[318] Издательство тома. Для расширенной информации об издателе первый байт должен быть 0x5F,...
Definition: iso9660.h:28
int32_t VolumeSetSize
[120] Количество логических блоков, в которых записан том.
Definition: iso9660.h:18
int32_t LogicalBlockSize
[128] Размер логического блока в байтах. NB: Это означает, что логический блок на компакт-диске может...
Definition: iso9660.h:20
int32_t PathTableSize[2]
[132] Размер таблицы путей в байтах.
Definition: iso9660.h:21
char VolumeModificationDate[17]
[830] Дата и время изменения тома.
Definition: iso9660.h:35
int32_t LocOfType_L_PathTable
[140] Расположение LBA таблицы путей. Таблица путей, на которую указывает, содержит только значения с...
Definition: iso9660.h:22
char AbstractFileID[37]
[739] Имя файла в корневом каталоге, который содержит абстрактную информацию для этого набора томов....
Definition: iso9660.h:32
char BibliographicFileID[37]
[776] Имя файла в корневом каталоге, содержащего библиографическую информацию для этого набора томов....
Definition: iso9660.h:33