summaryrefslogtreecommitdiffhomepage
path: root/src/neboot-partition-map-parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/neboot-partition-map-parse.c')
-rw-r--r--src/neboot-partition-map-parse.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/neboot-partition-map-parse.c b/src/neboot-partition-map-parse.c
new file mode 100644
index 0000000..7d8f80f
--- /dev/null
+++ b/src/neboot-partition-map-parse.c
@@ -0,0 +1,42 @@
+/* -------------------------------------------
+
+ Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved.
+
+------------------------------------------- */
+
+#include <lib/partition-map.h>
+
+bool cb_parse_partition_block_data_at(voidptr_t blob, size_t blob_sz, size_t index, size_t* end_lba,
+ size_t* start_lba, size_t* sector_sz) {
+ if (!start_lba || !end_lba || !blob || !blob_sz || !sector_sz ||
+ (sizeof(part_block_t) * index) > blob_sz)
+ return false;
+
+ part_block_t* block = (part_block_t*) (blob + (sizeof(part_block_t) * index));
+
+ if (block->version != EPM_REVISION || block->num_blocks < 1 || block->num_blocks > EPM_MAX_BLKS ||
+ strcmp(block->magic, EPM_MAGIC) > 0 || block->lba_end == 0 || block->lba_start == 0) {
+ return false;
+ }
+
+ *end_lba = block->lba_end;
+ *start_lba = block->lba_start;
+ *sector_sz = block->sector_sz;
+
+ return true;
+}
+
+part_block_t* cb_parse_partition_block_at(voidptr_t blob, size_t blob_sz, size_t index) {
+ if (!blob || !blob_sz || (sizeof(part_block_t) * index) > blob_sz) return nil;
+
+ part_block_t* block = (part_block_t*) (blob + (sizeof(part_block_t) * index));
+
+ cb_put_string(block->magic);
+
+ if (block->version != EPM_REVISION || block->num_blocks < 1 || block->num_blocks > EPM_MAX_BLKS ||
+ strcmp(block->magic, EPM_MAGIC) > 0 || block->lba_end == 0 || block->lba_start == 0) {
+ return nil;
+ }
+
+ return block;
+} \ No newline at end of file