} __attribute__((packed));
-struct bde_fve_metadata {
+struct bde_fve_metadata_block_header {
/* 0 */ unsigned char signature[8];
-/* 8 */ uint16_t size;
+/* 8 */ unsigned char __dummy1[10 - 8];
/* 10 */ uint16_t version;
-};
+/* 12 */ unsigned char __dummy2[64 - 12];
+} __attribute__((packed));
+
+struct bde_fve_metadata_header {
+/* 0 */ uint32_t size;
+/* 4 */ uint32_t version;
+/* 8 */ uint32_t header_size;
+/* 12 */ uint32_t size_copy;
+/* 16 */ unsigned char volume_identifier[16];
+} __attribute__((packed));
+
+struct bde_fve_metadata {
+ struct bde_fve_metadata_block_header block_header;
+ struct bde_fve_metadata_header header;
+} __attribute__((packed));
enum {
BDE_VERSION_VISTA = 0,
return errno ? -errno : 1;
fve = (const struct bde_fve_metadata *) buf;
- if (memcmp(fve->signature, BDE_MAGIC_FVE, sizeof(fve->signature)) != 0)
+ if (memcmp(fve->block_header.signature, BDE_MAGIC_FVE, sizeof(fve->block_header.signature)) != 0)
goto nothing;
if (buf_fve)
*buf_fve = buf;
if (rc)
return rc;
- if (kind == BDE_VERSION_WIN7) {
- const struct bde_header_win7 *hdr = (const struct bde_header_win7 *) buf_hdr;
-
- /* Unfortunately, it seems volume_serial is always zero */
- blkid_probe_sprintf_uuid(pr,
- (const unsigned char *) &hdr->volume_serial,
- sizeof(hdr->volume_serial),
- "%016d", le32_to_cpu(hdr->volume_serial));
- }
-
if (buf_fve) {
const struct bde_fve_metadata *fve = (const struct bde_fve_metadata *) buf_fve;
- blkid_probe_sprintf_version(pr, "%d", le16_to_cpu(fve->version));
+ blkid_probe_sprintf_version(pr, "%d", le16_to_cpu(fve->block_header.version));
+
+ /* Microsoft GUID format, interpreted as explained by Raymond Chen:
+ * https://devblogs.microsoft.com/oldnewthing/20220928-00/?p=107221
+ */
+ blkid_probe_sprintf_uuid(pr, fve->header.volume_identifier, 16,
+ "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+ fve->header.volume_identifier[3], fve->header.volume_identifier[2], /* uint32_t Data1 */
+ fve->header.volume_identifier[1], fve->header.volume_identifier[0],
+ fve->header.volume_identifier[5], fve->header.volume_identifier[4], /* uint16_t Data2 */
+ fve->header.volume_identifier[7], fve->header.volume_identifier[6], /* uint16_t Data3 */
+ fve->header.volume_identifier[8], fve->header.volume_identifier[9], /* uint8_t Data4[8] */
+ fve->header.volume_identifier[10], fve->header.volume_identifier[11],
+ fve->header.volume_identifier[12], fve->header.volume_identifier[13],
+ fve->header.volume_identifier[14], fve->header.volume_identifier[15]);
}
return 0;
}