|
|
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.12 root 12: #ifndef TC_HEADER_NTDRIVER
13: #define TC_HEADER_NTDRIVER
14:
1.1.1.19! root 15: #include "Common.h"
1.1.1.12 root 16: #include "EncryptedIoQueue.h"
17:
1.1 root 18: /* This structure is used to start new threads */
19: typedef struct _THREAD_BLOCK_
20: {
21: PDEVICE_OBJECT DeviceObject;
22: NTSTATUS ntCreateStatus;
1.1.1.7 root 23: WCHAR wszMountVolume[TC_MAX_PATH + 8];
1.1 root 24: MOUNT_STRUCT *mount;
25: } THREAD_BLOCK, *PTHREAD_BLOCK;
26:
1.1.1.12 root 27:
1.1 root 28: /* This structure is allocated for non-root devices! WARNING: bRootDevice
29: must be the first member of the structure! */
30: typedef struct EXTENSION
31: {
1.1.1.14 root 32: BOOL bRootDevice; /* Is this the root device ? which the user-mode apps talk to */
1.1.1.15 root 33: BOOL IsVolumeDevice;
1.1.1.12 root 34: BOOL IsDriveFilterDevice;
1.1.1.15 root 35: BOOL IsVolumeFilterDevice;
1.1 root 36:
1.1.1.14 root 37: ULONG lMagicNumber; /* To ensure the completion routine is not sending us bad IRP's */
1.1 root 38:
1.1.1.6 root 39: int UniqueVolumeId;
1.1.1.14 root 40: int nDosDriveNo; /* Drive number this extension is mounted against */
41:
1.1 root 42: BOOL bShuttingDown; /* Is the driver shutting down ? */
43: BOOL bThreadShouldQuit; /* Instruct per device worker thread to quit */
44: PETHREAD peThread; /* Thread handle */
45: KEVENT keCreateEvent; /* Device creation event */
46: KSPIN_LOCK ListSpinLock; /* IRP spinlock */
47: LIST_ENTRY ListEntry; /* IRP listentry */
48: KSEMAPHORE RequestSemaphore; /* IRP list request Semaphore */
49:
50: HANDLE hDeviceFile; /* Device handle for this device */
51: PFILE_OBJECT pfoDeviceFile; /* Device fileobject for this device */
52: PDEVICE_OBJECT pFsdDevice; /* lower level device handle */
53:
1.1.1.6 root 54: CRYPTO_INFO *cryptoInfo; /* Cryptographic and other information for this device */
1.1 root 55:
1.1.1.17 root 56: __int64 HostLength;
1.1 root 57: __int64 DiskLength; /* The length of the disk referred to by this device */
58: __int64 NumberOfCylinders; /* Partition info */
59: ULONG TracksPerCylinder; /* Partition info */
60: ULONG SectorsPerTrack; /* Partition info */
61: ULONG BytesPerSector; /* Partition info */
62: UCHAR PartitionType; /* Partition info */
1.1.1.10 root 63:
64: int HostBytesPerSector;
1.1 root 65:
66: KEVENT keVolumeEvent; /* Event structure used when setting up a device */
67:
1.1.1.12 root 68: EncryptedIoQueue Queue;
1.1.1.8 root 69:
1.1.1.4 root 70: BOOL bReadOnly; /* Is this device read-only ? */
71: BOOL bRemovable; /* Is this device removable media ? */
1.1.1.19! root 72: BOOL PartitionInInactiveSysEncScope;
1.1.1.4 root 73: BOOL bRawDevice; /* Is this a raw-partition or raw-floppy device ? */
74: BOOL bMountManager; /* Mount manager knows about volume */
1.1.1.19! root 75: BOOL SystemFavorite;
1.1 root 76:
1.1.1.7 root 77: WCHAR wszVolume[TC_MAX_PATH]; /* DONT change this size without also changing MOUNT_LIST_STRUCT! */
1.1 root 78:
1.1.1.6 root 79: // Container file date/time (used to reset date and time of file-hosted volumes after dismount or unsuccessful mount attempt, to preserve plausible deniability of hidden volumes).
1.1.1.4 root 80: LARGE_INTEGER fileCreationTime;
81: LARGE_INTEGER fileLastAccessTime;
82: LARGE_INTEGER fileLastWriteTime;
83: LARGE_INTEGER fileLastChangeTime;
1.1.1.6 root 84: BOOL bTimeStampValid;
85:
1.1.1.16 root 86: PSID UserSid;
87: BOOL SecurityClientContextValid;
88: SECURITY_CLIENT_CONTEXT SecurityClientContext;
89:
1.1 root 90: } EXTENSION, *PEXTENSION;
91:
1.1.1.16 root 92:
93: typedef enum
94: {
95: ValidateInput,
96: ValidateOutput,
97: ValidateInputOutput
98: } ValidateIOBufferSizeType;
99:
100:
1.1.1.14 root 101: extern PDRIVER_OBJECT TCDriverObject;
1.1.1.12 root 102: extern BOOL DriverShuttingDown;
1.1.1.10 root 103: extern ULONG OsMajorVersion;
1.1.1.14 root 104: extern ULONG OsMinorVersion;
1.1.1.17 root 105: extern BOOL VolumeClassFilterRegistered;
1.1.1.16 root 106: extern BOOL CacheBootPassword;
1.1.1.10 root 107:
1.1 root 108: /* Helper macro returning x seconds in units of 100 nanoseconds */
1.1.1.4 root 109: #define WAIT_SECONDS(x) ((x)*10000000)
1.1 root 110:
111: NTSTATUS DriverEntry (PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath);
1.1.1.15 root 112: NTSTATUS DriverAddDevice (PDRIVER_OBJECT driverObject, PDEVICE_OBJECT pdo);
1.1.1.12 root 113: void DumpMemory (void *memory, int size);
114: BOOL IsAccessibleByUser (PUNICODE_STRING objectFileName, BOOL readOnly);
115: NTSTATUS ProcessMainDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension, PIRP Irp);
116: NTSTATUS ProcessVolumeDeviceControlIrp (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension, PIRP Irp);
117: NTSTATUS SendDeviceIoControlRequest (PDEVICE_OBJECT deviceObject, ULONG ioControlCode, void *inputBuffer, int inputBufferSize, void *outputBuffer, int outputBufferSize);
1.1 root 118: NTSTATUS TCDispatchQueueIRP (PDEVICE_OBJECT DeviceObject, PIRP Irp);
119: NTSTATUS TCCreateRootDeviceObject (PDRIVER_OBJECT DriverObject);
1.1.1.4 root 120: NTSTATUS TCCreateDeviceObject (PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT * ppDeviceObject, MOUNT_STRUCT * mount);
1.1.1.12 root 121: NTSTATUS TCReadDevice (PDEVICE_OBJECT deviceObject, PVOID buffer, LARGE_INTEGER offset, ULONG length);
122: NTSTATUS TCWriteDevice (PDEVICE_OBJECT deviceObject, PVOID buffer, LARGE_INTEGER offset, ULONG length);
123: NTSTATUS TCStartThread (PKSTART_ROUTINE threadProc, PVOID threadArg, PKTHREAD *kThread);
1.1.1.13 root 124: NTSTATUS TCStartThreadInProcess (PKSTART_ROUTINE threadProc, PVOID threadArg, PKTHREAD *kThread, PEPROCESS process);
1.1.1.12 root 125: NTSTATUS TCStartVolumeThread (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension, MOUNT_STRUCT * mount);
126: void TCStopThread (PKTHREAD kThread, PKEVENT wakeUpEvent);
127: void TCStopVolumeThread (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension);
128: VOID VolumeThreadProc (PVOID Context);
1.1.1.5 root 129: void TCSleep (int milliSeconds);
1.1 root 130: void TCGetNTNameFromNumber (LPWSTR ntname, int nDriveNo);
131: void TCGetDosNameFromNumber (LPWSTR dosname, int nDriveNo);
132: LPWSTR TCTranslateCode (ULONG ulCode);
133: PDEVICE_OBJECT TCDeleteDeviceObject (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension);
134: VOID TCUnloadDriver (PDRIVER_OBJECT DriverObject);
1.1.1.19! root 135: NTSTATUS TCDeviceIoControl (PWSTR deviceName, ULONG IoControlCode, void *InputBuffer, ULONG InputBufferSize, void *OutputBuffer, ULONG OutputBufferSize);
1.1.1.4 root 136: NTSTATUS TCOpenFsVolume (PEXTENSION Extension, PHANDLE volumeHandle, PFILE_OBJECT * fileObject);
137: void TCCloseFsVolume (HANDLE volumeHandle, PFILE_OBJECT fileObject);
138: NTSTATUS TCFsctlCall (PFILE_OBJECT fileObject, LONG IoControlCode, void *InputBuffer, int InputBufferSize, void *OutputBuffer, int OutputBufferSize);
1.1.1.6 root 139: NTSTATUS CreateDriveLink (int nDosDriveNo);
140: NTSTATUS RemoveDriveLink (int nDosDriveNo);
1.1.1.4 root 141: NTSTATUS MountManagerMount (MOUNT_STRUCT *mount);
142: NTSTATUS MountManagerUnmount (int nDosDriveNo);
143: NTSTATUS MountDevice (PDEVICE_OBJECT deviceObject, MOUNT_STRUCT *mount);
1.1.1.15 root 144: NTSTATUS UnmountDevice (UNMOUNT_STRUCT *unmountRequest, PDEVICE_OBJECT deviceObject, BOOL ignoreOpenFiles);
145: NTSTATUS UnmountAllDevices (UNMOUNT_STRUCT *unmountRequest, PDEVICE_OBJECT DeviceObject, BOOL ignoreOpenFiles);
1.1.1.4 root 146: NTSTATUS SymbolicLinkToTarget (PWSTR symlinkName, PWSTR targetName, USHORT maxTargetNameLength);
1.1.1.5 root 147: void DriverMutexWait ();
1.1.1.19! root 148: BOOL DriverMutexAcquireNoWait ();
1.1.1.5 root 149: void DriverMutexRelease ();
1.1.1.6 root 150: BOOL RegionsOverlap (unsigned __int64 start1, unsigned __int64 end1, unsigned __int64 start2, unsigned __int64 end2);
1.1.1.12 root 151: void GetIntersection (uint64 start1, uint32 length1, uint64 start2, uint64 end2, uint64 *intersectStart, uint32 *intersectLength);
152: NTSTATUS TCCompleteIrp (PIRP irp, NTSTATUS status, ULONG_PTR information);
153: NTSTATUS TCCompleteDiskIrp (PIRP irp, NTSTATUS status, ULONG_PTR information);
154: NTSTATUS ProbeRealDriveSize (PDEVICE_OBJECT driveDeviceObject, LARGE_INTEGER *driveSize);
1.1.1.14 root 155: BOOL UserCanAccessDriveDevice ();
1.1.1.15 root 156: size_t GetCpuCount ();
157: void EnsureNullTerminatedString (wchar_t *str, size_t maxSizeInBytes);
158: void *AllocateMemoryWithTimeout (size_t size, int retryDelay, int timeout);
159: BOOL IsDriveLetterAvailable (int nDosDriveNo);
160: NTSTATUS TCReadRegistryKey (PUNICODE_STRING keyPath, wchar_t *keyValueName, PKEY_VALUE_PARTIAL_INFORMATION *keyData);
161: NTSTATUS TCWriteRegistryKey (PUNICODE_STRING keyPath, wchar_t *keyValueName, ULONG keyValueType, void *valueData, ULONG valueSize);
162: BOOL IsVolumeClassFilterRegistered ();
163: uint32 ReadRegistryConfigFlags ();
164: NTSTATUS WriteRegistryConfigFlags (uint32 flags);
1.1.1.16 root 165: BOOL ValidateIOBufferSize (PIRP irp, size_t requiredBufferSize, ValidateIOBufferSizeType type);
166: NTSTATUS GetDeviceSectorSize (PDEVICE_OBJECT deviceObject, ULONG *bytesPerSector);
167: NTSTATUS ZeroUnreadableSectors (PDEVICE_OBJECT deviceObject, LARGE_INTEGER startOffset, ULONG size, uint64 *zeroedSectorCount);
1.1.1.17 root 168: NTSTATUS ReadDeviceSkipUnreadableSectors (PDEVICE_OBJECT deviceObject, byte *buffer, LARGE_INTEGER startOffset, ULONG size, uint64 *badSectorCount);
1.1.1.16 root 169: BOOL IsVolumeAccessibleByCurrentUser (PEXTENSION volumeDeviceExtension);
1.1.1.17 root 170: void GetElapsedTimeInit (LARGE_INTEGER *lastPerfCounter);
171: int64 GetElapsedTime (LARGE_INTEGER *lastPerfCounter);
1.1.1.19! root 172: BOOL IsOSAtLeast (OSVersionEnum reqMinOS);
1.1.1.12 root 173:
1.1.1.19! root 174: #define TC_BUG_CHECK(status) KeBugCheckEx (SECURITY_SYSTEM, __LINE__, (ULONG_PTR) status, 0, 'TC')
1.1.1.12 root 175:
176: #endif // TC_HEADER_NTDRIVER
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.