TSK_MM_INFO * tsk_mm_gpt_open(TSK_IMG_INFO * img_info, DADDR_T offset) { TSK_MM_INFO *mm; // clean up any errors that are lying around tsk_error_reset(); mm = (TSK_MM_INFO *) tsk_malloc(sizeof(*mm)); if (mm == NULL) return NULL; mm->img_info = img_info; mm->mmtype = TSK_MM_INFO_TYPE_GPT; mm->str_type = "GUID Partition Table"; /* If an offset was given, then use that too */ mm->offset = offset; /* inititialize settings */ mm->part_list = NULL; mm->first_part = mm->last_part = 0; mm->endian = 0; mm->dev_bsize = 512; mm->block_size = 512; /* Assign functions */ mm->part_walk = gpt_part_walk; mm->close = gpt_close; /* Load the partitions into the sorted list */ if (gpt_load_table(mm)) { gpt_close(mm); return NULL; } /* fill in the sorted list with the 'unknown' values */ if (tsk_mm_part_unused(mm)) { gpt_close(mm); return NULL; } return mm; }
TSK_VS_INFO * tsk_vs_gpt_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset) { TSK_VS_INFO *vs; // clean up any errors that are lying around tsk_error_reset(); vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs)); if (vs == NULL) return NULL; vs->img_info = img_info; vs->vstype = TSK_VS_TYPE_GPT; vs->tag = TSK_VS_INFO_TAG; /* If an offset was given, then use that too */ vs->offset = offset; /* inititialize settings */ vs->part_list = NULL; vs->part_count = 0; vs->endian = 0; vs->block_size = img_info->sector_size; /* Assign functions */ vs->close = gpt_close; /* Load the partitions into the sorted list */ if (gpt_load_table(vs)) { int found = 0; if (tsk_verbose) tsk_fprintf(stderr, "gpt_open: Trying other sector sizes\n"); /* Before we give up, lets try some other sector sizes */ vs->block_size = 512; while (vs->block_size <= 8192) { if (tsk_verbose) tsk_fprintf(stderr, "gpt_open: Trying sector size: %d\n", vs->block_size); if (gpt_load_table(vs)) { vs->block_size *= 2; continue; } found = 1; break; } if (found == 0) { gpt_close(vs); return NULL; } } /* fill in the sorted list with the 'unknown' values */ if (tsk_vs_part_unused(vs)) { gpt_close(vs); return NULL; } return vs; }