我正在编写利用和操作GUID分区表(GPT)的软件。我使用了许多引用,但在查看有关GUID分区表的UEFI标准文件时,出现了许多问题。
目前,我编写的代码只是将值从磁盘上的打包格式转换为非打包格式,以方便数据访问。此外,我还有一些例程将对GPT的各个方面执行CRC32检查。密码在下面。
/* Validates the GPT entries. */
int fs_gptp_gptevalid(fs_gptent_t *list, fs_gpt_t *head)
{
uint32 ls; /* List Size */
uint32 crc; /* List CRC */
ls = head->entry_count * head->entry_size;
crc = fs_gptp_crc32(list, ls);
if (crc != head->p_crc32) return(0);
return(1);
}
/* Validates the GPT header. */
int fs_gptp_gpthvalid(fs_gpt_t *head)
{
uint32 hs; /* Header Size */
uint32 crc1, crc2; /* Header CRCs */
/* According to the specification, the header CRC field
needs to be zero when calculating the CRC. */
hs = head->hsize;
crc1 = head->h_crc32;
head->h_crc32 = 0;
crc2 = fs_gptp_crc32(head, hs);
head->h_crc32 = crc1;
if (crc1 != crc2) return(0);
return(1);
}发布于 2015-05-24 22:53:07
SizeOfPartitionEntry字段实际上必须是大于或等于128的2的幂。因此,1024是有效的大小,而640 (5 * 128)则不是。假定允许128以外的大小,以便UEFI规范的未来版本可以以兼容的方式扩展分区条目的大小。您的代码应该能够处理任何有效的条目大小。注意,由于规范的早期版本允许任何8的倍数,健壮的实现也应该处理这种情况。
虽然规范确实要求“必须为NumberOfPartitionEntries数组保留至少16,384字节的空间”,但我不知道这或任何其他方面是否对NumberOfPartitionEntries字段设置了任何限制。例如,我认为只要在MyLBA和FirstUsableLBA (以及LastUsableLBA和AlternateLBA之间)之间保留16 if的值,就可以允许4的值,以便在必要时可以扩展该表。无论哪种方式,我都看不到任何能使128个条目达到最大数量的东西。如果SizeOfPartitionEntry大于128个,它也可能小于128个。
值得注意的是,通过快速的网络搜索可以发现NumberOfPartitionEntries设置为12的HP服务器。
https://stackoverflow.com/questions/30428523
复制相似问题