Files
RockOS/kernel/drivers/iso/iso.c

59 lines
1.7 KiB
C
Raw Normal View History

2026-06-24 13:30:23 -05:00
#include "iso.h"
#include "drivers/ide/ide.h"
#include "lib/print.h"
#include "lib/memory.h"
uint8_t sector_buf[2048];
void read_iso(ide_device_t* dev) {
int success = ide_read_blks(dev, 16, 1, sector_buf);
if (!success) {
kprintf("Failed to read PVD\n");
return;
}
2026-06-24 13:30:23 -05:00
if (sector_buf[0] != 1) {
kprintf("Couldn't find PVD in sector 0x10\n");
2026-06-24 13:30:23 -05:00
return;
}
iso_pvd_t* pvd = (iso_pvd_t*)sector_buf;
2026-06-24 13:30:23 -05:00
char pvd_identifier[6];
memcpy(pvd->header.identifier, pvd_identifier, 5);
2026-06-24 13:30:23 -05:00
pvd_identifier[5] = 0;
if (strcmp(pvd_identifier, "CD001") > 0) {
kprintf("Invalid PVD identifier\n");
return;
}
char volume_identifier[33];
memset((uint8_t*)volume_identifier, 0, 33);
memcpy(&pvd->volume_ident[0], volume_identifier, 32);
kprintf("Reading ISO Filesystem from CDROM Disk %s\n", volume_identifier);
uint32_t lba_path_table = pvd->path_table_l_loc;
uint32_t path_table_sz = pvd->path_table_sz_le;
uint32_t sectors = path_table_sz / 2048;
2026-06-24 23:41:33 -05:00
if (sectors % 2048 > 0 || sectors == 0) {
sectors++;
}
uint8_t path_table_sec[2048 * sectors];
memset(path_table_sec, 0, 2048);
success = ide_read_blks(dev, lba_path_table, 1, path_table_sec);
if (!success) {
kprintf("could not read path table at lba 0x%x\n", lba_path_table);
return;
}
iso_path_table_entry_t* path = (iso_path_table_entry_t*)path_table_sec;
while ((uint32_t)path - (uint32_t)path_table_sec < 2048) {
size_t entry_sz = sizeof(iso_path_table_entry_t) + (path->dir_ident_len - 1);
if (path->dir_ident_len % 2 > 0) entry_sz++;
path = (iso_path_table_entry_t*)((uint32_t)path + entry_sz);
}
2026-06-24 13:30:23 -05:00
}