|
|
1.1.1.10 root 1: /*
1.1.1.12 root 2: Legal Notice: Some portions of the source code contained in this file were
3: derived from the source code of Encryption for the Masses 2.02a, which is
4: Copyright (c) 1998-2000 Paul Le Roux and which is governed by the 'License
5: Agreement for Encryption for the Masses'. Modifications and additions to
1.1.1.20 root 6: the original source code (contained in this file) and all other portions
1.1.1.21 root 7: of this file are Copyright (c) 2003-2010 TrueCrypt Developers Association
8: and are governed by the TrueCrypt License 3.0 the full text of which is
1.1.1.20 root 9: contained in the file License.txt included in TrueCrypt binary and source
10: code distribution packages. */
1.1 root 11:
1.1.1.6 root 12: #pragma once
13:
14: #include "Tcdefs.h"
1.1.1.15 root 15: #include "Boot/Windows/BootDefs.h"
1.1.1.6 root 16: #include "Common.h"
17: #include "Crypto.h"
1.1.1.21 root 18: #include "Volumes.h"
1.1.1.12 root 19: #include "Wipe.h"
1.1.1.6 root 20:
21: #ifdef _WIN32
22:
1.1.1.13 root 23: /* WARNING: Modifying the following values or their meanings can introduce incompatibility with previous versions. */
1.1 root 24:
1.1.1.12 root 25: #define TC_IOCTL(CODE) (CTL_CODE (FILE_DEVICE_UNKNOWN, 0x800 + (CODE), METHOD_BUFFERED, FILE_ANY_ACCESS))
1.1 root 26:
1.1.1.12 root 27: #define TC_IOCTL_GET_DRIVER_VERSION TC_IOCTL (1)
28: #define TC_IOCTL_GET_BOOT_LOADER_VERSION TC_IOCTL (2)
29: #define TC_IOCTL_MOUNT_VOLUME TC_IOCTL (3)
30: #define TC_IOCTL_DISMOUNT_VOLUME TC_IOCTL (4)
31: #define TC_IOCTL_DISMOUNT_ALL_VOLUMES TC_IOCTL (5)
32: #define TC_IOCTL_GET_MOUNTED_VOLUMES TC_IOCTL (6)
33: #define TC_IOCTL_GET_VOLUME_PROPERTIES TC_IOCTL (7)
34: #define TC_IOCTL_GET_DEVICE_REFCOUNT TC_IOCTL (8)
1.1.1.22! root 35: #define TC_IOCTL_IS_DRIVER_UNLOAD_DISABLED TC_IOCTL (9)
1.1.1.12 root 36: #define TC_IOCTL_IS_ANY_VOLUME_MOUNTED TC_IOCTL (10)
37: #define TC_IOCTL_GET_PASSWORD_CACHE_STATUS TC_IOCTL (11)
38: #define TC_IOCTL_WIPE_PASSWORD_CACHE TC_IOCTL (12)
39: #define TC_IOCTL_OPEN_TEST TC_IOCTL (13)
40: #define TC_IOCTL_GET_DRIVE_PARTITION_INFO TC_IOCTL (14)
41: #define TC_IOCTL_GET_DRIVE_GEOMETRY TC_IOCTL (15)
42: #define TC_IOCTL_PROBE_REAL_DRIVE_SIZE TC_IOCTL (16)
43: #define TC_IOCTL_GET_RESOLVED_SYMLINK TC_IOCTL (17)
44: #define TC_IOCTL_GET_BOOT_ENCRYPTION_STATUS TC_IOCTL (18)
45: #define TC_IOCTL_BOOT_ENCRYPTION_SETUP TC_IOCTL (19)
46: #define TC_IOCTL_ABORT_BOOT_ENCRYPTION_SETUP TC_IOCTL (20)
47: #define TC_IOCTL_GET_BOOT_ENCRYPTION_SETUP_RESULT TC_IOCTL (21)
48: #define TC_IOCTL_GET_BOOT_DRIVE_VOLUME_PROPERTIES TC_IOCTL (22)
49: #define TC_IOCTL_REOPEN_BOOT_VOLUME_HEADER TC_IOCTL (23)
1.1.1.13 root 50: #define TC_IOCTL_GET_BOOT_ENCRYPTION_ALGORITHM_NAME TC_IOCTL (24)
1.1.1.19 root 51: #define TC_IOCTL_GET_PORTABLE_MODE_STATUS TC_IOCTL (25)
52: #define TC_IOCTL_SET_PORTABLE_MODE_STATUS TC_IOCTL (26)
1.1.1.14 root 53: #define TC_IOCTL_IS_HIDDEN_SYSTEM_RUNNING TC_IOCTL (27)
54: #define TC_IOCTL_GET_SYSTEM_DRIVE_CONFIG TC_IOCTL (28)
55: #define TC_IOCTL_DISK_IS_WRITABLE TC_IOCTL (29)
1.1.1.15 root 56: #define TC_IOCTL_START_DECOY_SYSTEM_WIPE TC_IOCTL (30)
57: #define TC_IOCTL_ABORT_DECOY_SYSTEM_WIPE TC_IOCTL (31)
58: #define TC_IOCTL_GET_DECOY_SYSTEM_WIPE_STATUS TC_IOCTL (32)
59: #define TC_IOCTL_GET_DECOY_SYSTEM_WIPE_RESULT TC_IOCTL (33)
60: #define TC_IOCTL_WRITE_BOOT_DRIVE_SECTOR TC_IOCTL (34)
1.1.1.21 root 61: #define TC_IOCTL_GET_WARNING_FLAGS TC_IOCTL (35)
1.1.1.19 root 62: #define TC_IOCTL_SET_SYSTEM_FAVORITE_VOLUME_DIRTY TC_IOCTL (36)
1.1.1.21 root 63: #define TC_IOCTL_REREAD_DRIVER_CONFIG TC_IOCTL (37)
64: #define TC_IOCTL_GET_SYSTEM_DRIVE_DUMP_CONFIG TC_IOCTL (38)
1.1.1.12 root 65:
66: // Legacy IOCTLs used before version 5.0
67: #define TC_IOCTL_LEGACY_GET_DRIVER_VERSION 466968
68: #define TC_IOCTL_LEGACY_GET_MOUNTED_VOLUMES 466948
1.1 root 69:
70:
71: /* Start of driver interface structures, the size of these structures may
72: change between versions; so make sure you first send DRIVER_VERSION to
73: check that it's the correct device driver */
74:
75: #pragma pack (push)
76: #pragma pack(1)
77:
78: typedef struct
79: {
1.1.1.6 root 80: int nReturnCode; /* Return code back from driver */
1.1.1.15 root 81: BOOL FilesystemDirty;
1.1.1.16 root 82: BOOL VolumeMountedReadOnlyAfterAccessDenied;
1.1.1.17 root 83: BOOL VolumeMountedReadOnlyAfterDeviceWriteProtected;
1.1.1.15 root 84:
1.1.1.21 root 85: wchar_t wszVolume[TC_MAX_PATH]; /* Volume to be mounted */
1.1.1.6 root 86: Password VolumePassword; /* User password */
87: BOOL bCache; /* Cache passwords in driver */
88: int nDosDriveNo; /* Drive number to mount */
1.1.1.21 root 89: uint32 BytesPerSector;
1.1.1.6 root 90: BOOL bMountReadOnly; /* Mount volume in read-only mode */
91: BOOL bMountRemovable; /* Mount volume as removable media */
92: BOOL bExclusiveAccess; /* Open host file/device in exclusive access mode */
93: BOOL bMountManager; /* Announce volume to mount manager */
94: BOOL bPreserveTimestamp; /* Preserve file container timestamp */
1.1.1.13 root 95: BOOL bPartitionInInactiveSysEncScope; /* If TRUE, we are to attempt to mount a partition located on an encrypted system drive without pre-boot authentication. */
96: int nPartitionInInactiveSysEncScopeDriveNo; /* If bPartitionInInactiveSysEncScope is TRUE, this contains the drive number of the system drive on which the partition is located. */
1.1.1.19 root 97: BOOL SystemFavorite;
1.1.1.6 root 98: // Hidden volume protection
99: BOOL bProtectHiddenVolume; /* TRUE if the user wants the hidden volume within this volume to be protected against being overwritten (damaged) */
100: Password ProtectedHidVolPassword; /* Password to the hidden volume to be protected against overwriting */
1.1.1.14 root 101: BOOL UseBackupHeader;
1.1.1.15 root 102: BOOL RecoveryMode;
1.1 root 103: } MOUNT_STRUCT;
104:
105: typedef struct
106: {
107: int nDosDriveNo; /* Drive letter to unmount */
1.1.1.4 root 108: BOOL ignoreOpenFiles;
1.1.1.14 root 109: BOOL HiddenVolumeProtectionTriggered;
1.1.1.4 root 110: int nReturnCode; /* Return code back from driver */
1.1 root 111: } UNMOUNT_STRUCT;
112:
113: typedef struct
114: {
1.1.1.6 root 115: unsigned __int32 ulMountedDrives; /* Bitfield of all mounted drive letters */
1.1.1.21 root 116: wchar_t wszVolume[26][TC_MAX_PATH]; /* Volume names of mounted volumes */
1.1 root 117: unsigned __int64 diskLength[26];
1.1.1.4 root 118: int ea[26];
1.1.1.6 root 119: int volumeType[26]; /* Volume type (e.g. PROP_VOL_TYPE_OUTER, PROP_VOL_TYPE_OUTER_VOL_WRITE_PREVENTED, etc.) */
1.1 root 120: } MOUNT_LIST_STRUCT;
121:
122: typedef struct
123: {
124: int driveNo;
1.1.1.6 root 125: int uniqueId;
1.1.1.21 root 126: wchar_t wszVolume[TC_MAX_PATH];
1.1 root 127: unsigned __int64 diskLength;
1.1.1.4 root 128: int ea;
1.1.1.7 root 129: int mode;
1.1 root 130: int pkcs5;
131: int pkcs5Iterations;
1.1.1.4 root 132: BOOL hiddenVolume;
1.1.1.6 root 133: BOOL readOnly;
1.1.1.17 root 134: BOOL removable;
1.1.1.19 root 135: BOOL partitionInInactiveSysEncScope;
1.1.1.15 root 136: #if 0
137: unsigned __int64 volumeCreationTime; // Deprecated in v6.0
138: unsigned __int64 headerCreationTime; // Deprecated in v6.0
139: #endif
140: uint32 volumeHeaderFlags;
1.1.1.6 root 141: unsigned __int64 totalBytesRead;
142: unsigned __int64 totalBytesWritten;
143: int hiddenVolProtection; /* Hidden volume protection status (e.g. HIDVOL_PROT_STATUS_NONE, HIDVOL_PROT_STATUS_ACTIVE, etc.) */
1.1.1.14 root 144: int volFormatVersion;
1.1 root 145: } VOLUME_PROPERTIES_STRUCT;
146:
147: typedef struct
148: {
1.1.1.4 root 149: WCHAR symLinkName[TC_MAX_PATH];
150: WCHAR targetName[TC_MAX_PATH];
151: } RESOLVE_SYMLINK_STRUCT;
152:
153: typedef struct
154: {
1.1.1.10 root 155: WCHAR deviceName[TC_MAX_PATH];
156: PARTITION_INFORMATION partInfo;
1.1.1.12 root 157: BOOL IsGPT;
1.1.1.15 root 158: BOOL IsDynamic;
1.1.1.10 root 159: }
160: DISK_PARTITION_INFO_STRUCT;
161:
162: typedef struct
163: {
164: WCHAR deviceName[TC_MAX_PATH];
165: DISK_GEOMETRY diskGeometry;
166: }
167: DISK_GEOMETRY_STRUCT;
168:
169: typedef struct
170: {
1.1.1.12 root 171: WCHAR DeviceName[TC_MAX_PATH];
172: LARGE_INTEGER RealDriveSize;
1.1.1.13 root 173: BOOL TimeOut;
1.1.1.12 root 174: } ProbeRealDriveSizeRequest;
175:
176: typedef struct
177: {
1.1.1.21 root 178: wchar_t wszFileName[TC_MAX_PATH]; // Volume to be "open tested"
1.1.1.13 root 179: BOOL bDetectTCBootLoader; // Whether the driver is to determine if the first sector contains a portion of the TrueCrypt Boot Loader
1.1.1.17 root 180: BOOL TCBootLoaderDetected;
181: BOOL DetectFilesystem;
182: BOOL FilesystemDetected;
1.1 root 183: } OPEN_TEST_STRUCT;
184:
185:
1.1.1.12 root 186: typedef enum
187: {
188: SetupNone = 0,
189: SetupEncryption,
190: SetupDecryption
191: } BootEncryptionSetupMode;
192:
193:
194: typedef struct
195: {
1.1.1.14 root 196: // New fields must be added at the end of the structure to maintain compatibility with previous versions
1.1.1.12 root 197: BOOL DeviceFilterActive;
198:
199: uint16 BootLoaderVersion;
200:
201: BOOL DriveMounted;
202: BOOL VolumeHeaderPresent;
203: BOOL DriveEncrypted;
204:
205: LARGE_INTEGER BootDriveLength;
206:
207: int64 ConfiguredEncryptedAreaStart;
208: int64 ConfiguredEncryptedAreaEnd;
209: int64 EncryptedAreaStart;
210: int64 EncryptedAreaEnd;
211:
212: uint32 VolumeHeaderSaltCrc32;
213:
214: BOOL SetupInProgress;
215: BootEncryptionSetupMode SetupMode;
216: BOOL TransformWaitingForIdle;
217:
218: uint32 HibernationPreventionCount;
219:
1.1.1.14 root 220: BOOL HiddenSystem;
221: int64 HiddenSystemPartitionStart;
222:
223: // Number of times the filter driver answered that an unencrypted volume
224: // is read-only (or mounted an outer/normal TrueCrypt volume as read only)
225: uint32 HiddenSysLeakProtectionCount;
226:
1.1.1.12 root 227: } BootEncryptionStatus;
228:
229:
230: typedef struct
231: {
232: BootEncryptionSetupMode SetupMode;
233: WipeAlgorithmId WipeAlgorithm;
1.1.1.15 root 234: BOOL ZeroUnreadableSectors;
1.1.1.17 root 235: BOOL DiscardUnreadableEncryptedSectors;
1.1.1.12 root 236: } BootEncryptionSetupRequest;
237:
238:
239: typedef struct
240: {
241: Password VolumePassword;
242: } ReopenBootVolumeHeaderRequest;
243:
244:
1.1.1.13 root 245: typedef struct
246: {
247: char BootEncryptionAlgorithmName[256];
248: } GetBootEncryptionAlgorithmNameRequest;
249:
1.1.1.14 root 250: typedef struct
251: {
252: wchar_t DevicePath[TC_MAX_PATH];
253: byte Configuration;
254: BOOL DriveIsDynamic;
1.1.1.15 root 255: uint16 BootLoaderVersion;
256: byte UserConfiguration;
257: char CustomUserMessage[TC_BOOT_SECTOR_USER_MESSAGE_MAX_LENGTH + 1];
1.1.1.14 root 258: } GetSystemDriveConfigurationRequest;
1.1.1.13 root 259:
1.1.1.15 root 260: typedef struct
261: {
262: WipeAlgorithmId WipeAlgorithm;
263: byte WipeKey[MASTER_KEYDATA_SIZE];
264: } WipeDecoySystemRequest;
265:
266: typedef struct
267: {
268: BOOL WipeInProgress;
269: WipeAlgorithmId WipeAlgorithm;
270: int64 WipedAreaEnd;
271: } DecoySystemWipeStatus;
272:
273: typedef struct
274: {
275: LARGE_INTEGER Offset;
1.1.1.21 root 276: byte Data[TC_SECTOR_SIZE_BIOS];
1.1.1.15 root 277: } WriteBootDriveSectorRequest;
278:
1.1.1.21 root 279: typedef struct
280: {
281: BOOL PagingFileCreationPrevented;
282: BOOL SystemFavoriteVolumeDirty;
283: } GetWarningFlagsRequest;
284:
285: typedef struct
286: {
287: struct _DriveFilterExtension *BootDriveFilterExtension;
288: BOOL HwEncryptionEnabled;
289: } GetSystemDriveDumpConfigRequest;
290:
1.1 root 291: #pragma pack (pop)
292:
1.1.1.21 root 293: #ifdef TC_WINDOWS_DRIVER
1.1 root 294: #define DRIVER_STR WIDE
295: #else
296: #define DRIVER_STR
297: #endif
298:
1.1.1.13 root 299: #define TC_UNIQUE_ID_PREFIX "TrueCryptVolume"
1.1 root 300: #define TC_MOUNT_PREFIX L"\\Device\\TrueCryptVolume"
301:
302: #define NT_MOUNT_PREFIX DRIVER_STR("\\Device\\TrueCryptVolume")
303: #define NT_ROOT_PREFIX DRIVER_STR("\\Device\\TrueCrypt")
304: #define DOS_MOUNT_PREFIX DRIVER_STR("\\DosDevices\\")
305: #define DOS_ROOT_PREFIX DRIVER_STR("\\DosDevices\\TrueCrypt")
306: #define WIN32_ROOT_PREFIX DRIVER_STR("\\\\.\\TrueCrypt")
1.1.1.6 root 307:
1.1.1.14 root 308: #define TC_DRIVER_CONFIG_REG_VALUE_NAME DRIVER_STR("TrueCryptConfig")
1.1.1.21 root 309: #define TC_ENCRYPTION_FREE_CPU_COUNT_REG_VALUE_NAME DRIVER_STR("TrueCryptEncryptionFreeCpuCount")
1.1.1.14 root 310:
1.1.1.21 root 311: // WARNING: Modifying the following values can introduce incompatibility with previous versions.
1.1.1.19 root 312: #define TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD 0x1
313: #define TC_DRIVER_CONFIG_CACHE_BOOT_PASSWORD_FOR_SYS_FAVORITES 0x2
314: #define TC_DRIVER_CONFIG_DISABLE_NONADMIN_SYS_FAVORITES_ACCESS 0x4
1.1.1.21 root 315: #define TC_DRIVER_CONFIG_DISABLE_HARDWARE_ENCRYPTION 0x8
1.1.1.15 root 316:
1.1.1.6 root 317: #endif /* _WIN32 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.