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