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 }
dpm_read
size_t dpm_read(char Letter, uint64_t high_offset, uint64_t low_offset, size_t Size, void *Buffer)
[DPM] Считывание данных с диска
Definition: dpm.c:82
strlen
size_t strlen(const char *str)
Возращает длину строки
Definition: string.c:88
memcpy
void * memcpy(void *restrict destination, const void *restrict source, size_t n)
Копирование непересекающихся массивов используя SSE.
Definition: string.c:173
ISO9660_PVD
Definition: iso9660.h:8
ISO9660_PVD::CopyrightFileID
char CopyrightFileID[37]
[702] Имя файла в корневом каталоге, который содержит информацию об авторских правах для этого набора...
Definition: iso9660.h:31
ISO9660_PVD::LocOfOpti_M_PathTable
int32_t LocOfOpti_M_PathTable
[152] Местоположение LBA дополнительной таблицы путей. Таблица путей, на которую указывает,...
Definition: iso9660.h:25
ISO9660_PVD::DataPreparerID
char DataPreparerID[128]
[446] Идентификатор лица(ов), подготовившего данные для этого тома. Для расширенной информации о подг...
Definition: iso9660.h:29
ISO9660_PVD::VolumeExpirationDate
char VolumeExpirationDate[17]
[847] Дата и время, после которых этот том считается устаревшим. Если не указано, том никогда не счит...
Definition: iso9660.h:36
ISO9660_PVD::VolumeSetID
char VolumeSetID[128]
[190] Идентификатор набора томов, членом которого является этот том.
Definition: iso9660.h:27
ISO9660_PVD::LocOfOpti_L_PathTable
int32_t LocOfOpti_L_PathTable
[144] Местоположение LBA дополнительной таблицы путей. Таблица путей, на которую указывает,...
Definition: iso9660.h:23
ISO9660_PVD::VolumeCreationDate
char VolumeCreationDate[17]
[813] Дата и время создания тома.
Definition: iso9660.h:34
ISO9660_PVD::VolumeSequenceNumber
int32_t VolumeSequenceNumber
[124] Номер этого диска в наборе томов.
Definition: iso9660.h:19
ISO9660_PVD::ID
char ID[5]
[1+5] ОЕМ-идентификатор (Всегда CD001)
Definition: iso9660.h:10
ISO9660_PVD::Version
uint8_t Version
[6+1] Версия файловой системы
Definition: iso9660.h:11
ISO9660_PVD::DirectoryEntry
char DirectoryEntry[34]
[156] Обратите внимание, что это не адрес LBA, а фактическая запись каталога, которая содержит одноба...
Definition: iso9660.h:26
ISO9660_PVD::Zero
uint8_t Zero
[0+1] Указывает на загрузочную запись?
Definition: iso9660.h:9
ISO9660_PVD::VolumeSpaceSize
int32_t VolumeSpaceSize[2]
[80] Количество логических блоков, в которых записан том.
Definition: iso9660.h:16
ISO9660_PVD::VolumeEffectiveDate
char VolumeEffectiveDate[17]
[864] Дата и время, после которых том можно будет использовать. Если не указано иное,...
Definition: iso9660.h:37
ISO9660_PVD::FileStructureVersion
int8_t FileStructureVersion
[881] Записи каталога и версия таблицы путей (всегда 0x01).
Definition: iso9660.h:38
ISO9660_PVD::Label
char Label[32]
[40+32] Метка диска
Definition: iso9660.h:14
ISO9660_PVD::ApplicationID
char ApplicationID[128]
[574] Определяет, как данные записываются на этот том. Для расширенной информации первый байт должен ...
Definition: iso9660.h:30
ISO9660_PVD::LocOfType_M_PathTable
int32_t LocOfType_M_PathTable
[148] Расположение LBA таблицы путей. Таблица путей, на которую указывает, содержит только значения с...
Definition: iso9660.h:24
ISO9660_PVD::SystemName
char SystemName[32]
[8+32] Имя системы, которая может работать с секторами 0x00–0x0F тома.
Definition: iso9660.h:13
ISO9660_PVD::PublisherID
char PublisherID[128]
[318] Издательство тома. Для расширенной информации об издателе первый байт должен быть 0x5F,...
Definition: iso9660.h:28
ISO9660_PVD::VolumeSetSize
int32_t VolumeSetSize
[120] Количество логических блоков, в которых записан том.
Definition: iso9660.h:18
ISO9660_PVD::LogicalBlockSize
int32_t LogicalBlockSize
[128] Размер логического блока в байтах. NB: Это означает, что логический блок на компакт-диске может...
Definition: iso9660.h:20
ISO9660_PVD::PathTableSize
int32_t PathTableSize[2]
[132] Размер таблицы путей в байтах.
Definition: iso9660.h:21
ISO9660_PVD::VolumeModificationDate
char VolumeModificationDate[17]
[830] Дата и время изменения тома.
Definition: iso9660.h:35
ISO9660_PVD::LocOfType_L_PathTable
int32_t LocOfType_L_PathTable
[140] Расположение LBA таблицы путей. Таблица путей, на которую указывает, содержит только значения с...
Definition: iso9660.h:22
ISO9660_PVD::AbstractFileID
char AbstractFileID[37]
[739] Имя файла в корневом каталоге, который содержит абстрактную информацию для этого набора томов....
Definition: iso9660.h:32
ISO9660_PVD::BibliographicFileID
char BibliographicFileID[37]
[776] Имя файла в корневом каталоге, содержащего библиографическую информацию для этого набора томов....
Definition: iso9660.h:33