VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Boot/Windows
diff options
context:
space:
mode:
Diffstat (limited to 'src/Boot/Windows')
-rw-r--r--src/Boot/Windows/BootCommon.h99
1 files changed, 66 insertions, 33 deletions
diff --git a/src/Boot/Windows/BootCommon.h b/src/Boot/Windows/BootCommon.h
index bc1300b9..ea63c08b 100644
--- a/src/Boot/Windows/BootCommon.h
+++ b/src/Boot/Windows/BootCommon.h
@@ -78,9 +78,9 @@ typedef struct
#define TC_SET_BOOT_ARGUMENTS_SIGNATURE(SG) do { SG[0] = 'T'; SG[1] = 'R'; SG[2] = 'U'; SG[3] = 'E'; SG[4] = 0x11; SG[5] = 0x23; SG[6] = 0x45; SG[7] = 0x66; } while (FALSE)
#define TC_IS_BOOT_ARGUMENTS_SIGNATURE(SG) (SG[0] == 'T' && SG[1] == 'R' && SG[2] == 'U' && SG[3] == 'E' && SG[4] == 0x11 && SG[5] == 0x23 && SG[6] == 0x45 && SG[7] == 0x66)
-#if !defined(TC_WINDOWS_BOOT)
+#if !defined(TC_WINDOWS_BOOT)
-#define DCS_DISK_ENTRY_LIST_HEADER_ID SIGNATURE_64 ('D','C','S','D','E','L','S','T')
+#define DCS_DISK_ENTRY_LIST_HEADER_SIGN SIGNATURE_64 ('D','C','S','D','E','L','S','T')
#define DE_IDX_CRYPTOHEADER 0
#define DE_IDX_LIST 1
@@ -89,9 +89,11 @@ typedef struct
#define DE_IDX_MAINGPTENTRYS 4
#define DE_IDX_ALTGPTHDR 5
#define DE_IDX_ALTGPTENTRYS 6
-#define DE_IDX_EXECPARAMS 7
+#define DE_IDX_EXEC 7
#define DE_IDX_PWDCACHE 8
-#define DE_IDX_TOTAL 9
+#define DE_IDX_RND 9
+#define DE_IDX_TOTAL 10
+static_assert(DE_IDX_TOTAL <= 15, "DE_IDX_TOTAL too big");
enum DcsDiskEntryTypes {
DE_Unused = 0,
@@ -99,7 +101,8 @@ enum DcsDiskEntryTypes {
DE_List,
DE_DISKID,
DE_ExecParams,
- DE_PwdCache
+ DE_PwdCache,
+ DE_Rnd
};
#pragma pack(1)
@@ -109,14 +112,6 @@ typedef struct _SECREGION_BOOT_PARAMS {
uint32 Crc;
} SECREGION_BOOT_PARAMS;
-typedef struct _DCS_DISK_ENTRY_SECTORS {
- uint32 Type;
- uint32 Offset;
- uint64 Reserved;
- uint64 Start;
- uint64 Length;
-} DCS_DISK_ENTRY_SECTORS;
-
typedef struct {
uint32 Data1;
uint16 Data2;
@@ -124,43 +119,63 @@ typedef struct {
byte Data4[8];
} DCS_GUID;
+// DE types
+typedef struct _DCS_DISK_ENTRY_SECTORS {
+ uint32 Type;
+ uint32 Offset; // Offset in memory
+ uint64 Reserved;
+ uint64 Start; // Start on disk (byte)
+ uint64 Length; // length on disk (byte)
+} DCS_DISK_ENTRY_SECTORS;
+static_assert(sizeof(DCS_DISK_ENTRY_SECTORS) == 32, "Wrong size DCS_DISK_ENTRY_SECTORS");
+
+typedef struct _DCS_DISK_ENTRY_PARAMS {
+ uint32 Type;
+ uint32 Offset;
+ uint64 Reserved[2];
+ uint64 Length; // size of data
+} DCS_DISK_ENTRY_PARAMS;
+static_assert(sizeof(DCS_DISK_ENTRY_PARAMS) == 32, "Wrong size DCS_DISK_ENTRY_PARAMS");
+
typedef struct _DCS_DISK_ENTRY_DISKID {
uint32 Type;
uint32 MbrID;
uint64 ReservedDiskId;
DCS_GUID GptID;
} DCS_DISK_ENTRY_DISKID;
-
-typedef struct _DCS_DISK_ENTRY_EXEC_PARAMS {
- DCS_GUID ExecPartGuid;
- uint16 ExecCmd[248];
-} DCS_DISK_ENTRY_EXEC_PARAMS;
-static_assert(sizeof(DCS_DISK_ENTRY_EXEC_PARAMS) == 512, "Wrong size DCS_DISK_ENTRY_EXEC_PARAMS");
-
-#define DCS_DISK_ENTRY_PWD_CACHE_ID SIGNATURE_64 ('P','W','D','C','A','C','H','E')
-typedef struct _DCS_DISK_ENTRY_PWD_CACHE {
- uint64 Sign;
- uint32 CRC;
- uint32 Count;
- Password Pwd[4];
- int32 Pim[4];
- byte pad[512 -8 - 4 - 4 - (sizeof(Password) + 4) * 4];
-} DCS_DISK_ENTRY_PWD_CACHE;
-static_assert(sizeof(DCS_DISK_ENTRY_PWD_CACHE) == 512, "Wrong size DCS_DISK_ENTRY_PWD_CACHE");
+static_assert(sizeof(DCS_DISK_ENTRY_DISKID) == 32, "Wrong size DCS_DISK_ENTRY_DISKID");
#pragma warning(disable:4201)
typedef struct _DCS_DISK_ENTRY {
union {
struct {
uint32 Type;
- byte Data[28];
+ uint32 Offset;
+ byte reserved[16];
+ uint64 Length; // size of structure at Offset
};
DCS_DISK_ENTRY_SECTORS Sectors;
DCS_DISK_ENTRY_DISKID DiskId;
+ DCS_DISK_ENTRY_PARAMS Prm;
};
} DCS_DISK_ENTRY;
#pragma warning(default:4201)
+static_assert(sizeof(DCS_DISK_ENTRY) == 32, "Wrong size DCS_DISK_ENTRY");
+// Static compile time checks field offsets
+#ifndef FIELD_OFFSET
+#define FIELD_OFFSET(t, f) ((UINTN)(&((t*)0)->f))
+#endif
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Type) == FIELD_OFFSET(DCS_DISK_ENTRY_SECTORS, Type), "Wrong Type offset");
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Type) == FIELD_OFFSET(DCS_DISK_ENTRY_DISKID, Type), "Wrong Type offset");
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Type) == FIELD_OFFSET(DCS_DISK_ENTRY_PARAMS, Type), "Wrong Type offset");
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Length) == FIELD_OFFSET(DCS_DISK_ENTRY_SECTORS, Length), "Wrong Length offset");
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Length) == FIELD_OFFSET(DCS_DISK_ENTRY_PARAMS, Length), "Wrong Length offset");
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Offset) == FIELD_OFFSET(DCS_DISK_ENTRY_SECTORS, Offset), "Wrong Offset offset");
+static_assert(FIELD_OFFSET(DCS_DISK_ENTRY, Offset) == FIELD_OFFSET(DCS_DISK_ENTRY_PARAMS, Offset), "Wrong Offset offset");
+
+// DE type specific data
+// DE List
typedef struct _DCS_DISK_ENTRY_LIST {
// EFI_TABLE_HEADER
uint64 Signature;
@@ -172,10 +187,28 @@ typedef struct _DCS_DISK_ENTRY_LIST {
uint32 Count;
uint32 DataSize;
//
- DCS_DISK_ENTRY DE[31];
+ DCS_DISK_ENTRY DE[15];
} DCS_DISK_ENTRY_LIST;
+static_assert(sizeof(DCS_DISK_ENTRY_LIST) == 512, "Wrong size DCS_DISK_ENTRY_LIST");
+
+typedef struct _DCS_DEP_EXEC {
+ DCS_GUID ExecPartGuid;
+ uint16 ExecCmd[248];
+} DCS_DEP_EXEC;
+static_assert(sizeof(DCS_DEP_EXEC) == 512, "Wrong size DCS_DEP_EXEC");
+
+#define DCS_DEP_PWD_CACHE_SIGN SIGNATURE_64 ('P','W','D','C','A','C','H','E')
+typedef struct _DCS_DEP_PWD_CACHE {
+ uint64 Sign;
+ uint32 CRC;
+ uint32 Count;
+ Password Pwd[4];
+ int32 Pim[4];
+ byte pad[512 - 8 - 4 - 4 - (sizeof(Password) + 4) * 4];
+} DCS_DEP_PWD_CACHE;
+static_assert(sizeof(DCS_DEP_PWD_CACHE) == 512, "Wrong size DCS_DEP_PWD_CACHE");
#pragma pack()
-#endif
+#endif // #if !defined(TC_WINDOWS_BOOT)
#endif // TC_HEADER_Boot_BootCommon