1 #include "drv/disk/mbr.h"
2 #include "drv/disk/dpm.h"
4 #include "debug/hexview.h"
7 void ebr_recursive_dump(
char disk, uint64_t abs_lba, uint64_t lba,
int depth) {
10 dpm_read(disk, 0, ((lba + abs_lba) * 512) + 446,
sizeof(w), (uint8_t *)&w);
12 qemu_log(
"%*s Active: %d; [C: %d; H: %d; S: %d] Type: %d; [C: %d; H: %d; S: %d] Start LBA: %d; Num Sectors: %d\n",
15 w.start_cylinder, w.start_head, w.start_sector,
17 w.end_cylinder, w.end_head, w.end_sector,
18 w.start_sector_lba, w.num_sectors);
20 tty_printf(
"%*s A: %d; [%d:%d:%d] Type: %d; [%d:%d:%d] SLBA: %d; COUNT: %d\n",
23 w.start_cylinder, w.start_head, w.start_sector,
25 w.end_cylinder, w.end_head, w.end_sector,
26 w.start_sector_lba, w.num_sectors);
28 dpm_read(disk, 0, ((lba + abs_lba) * 512) + 446 + 16,
sizeof(w), (uint8_t *)&w);
31 ebr_recursive_dump(disk, abs_lba, w.start_sector_lba, depth);
35 void mbr_dump(
char disk, uint64_t i) {
38 dpm_read(disk, 0, 446 + (i * 16),
sizeof(p), (uint8_t *)&p);
40 qemu_log(
"[%d] Active: %d; [C: %d; H: %d; S: %d] Type: %d; [C: %d; H: %d; S: %d] Start LBA: %d; Num Sectors: %d",
43 p.start_cylinder, p.start_head, p.start_sector,
45 p.end_cylinder, p.end_head, p.end_sector,
46 p.start_sector_lba, p.num_sectors);
48 tty_printf(
"[%d] A: %d; [%d:%d:%d] Type: %d; [%d:%d:%d] SLBA: %d; COUNT: %d\n",
51 p.start_cylinder, p.start_head, p.start_sector,
53 p.end_cylinder, p.end_head, p.end_sector,
54 p.start_sector_lba, p.num_sectors);
56 if(p.type == 5 || p.type == 15) {
57 ebr_recursive_dump(disk, p.start_sector_lba, 0, 1);
61 void mbr_dump_all(
char disk) {
64 dpm_read(disk, 0, 510, 2, (uint8_t *)&p);
size_t dpm_read(char Letter, uint64_t high_offset, uint64_t low_offset, size_t Size, void *Buffer)
[DPM] Считывание данных с диска