diff options
Diffstat (limited to 'src/Driver/EncryptedIoQueue.h')
-rw-r--r-- | src/Driver/EncryptedIoQueue.h | 330 |
1 files changed, 165 insertions, 165 deletions
diff --git a/src/Driver/EncryptedIoQueue.h b/src/Driver/EncryptedIoQueue.h index de9fce07..ffe71471 100644 --- a/src/Driver/EncryptedIoQueue.h +++ b/src/Driver/EncryptedIoQueue.h @@ -1,165 +1,165 @@ -/*
- Derived from source code of TrueCrypt 7.1a, which is
- Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed
- by the TrueCrypt License 3.0.
-
- Modifications and additions to the original source code (contained in this file)
- and all other portions of this file are Copyright (c) 2013-2016 IDRIX
- and are governed by the Apache License 2.0 the full text of which is
- contained in the file License.txt included in VeraCrypt binary and source
- code distribution packages.
-*/
-
-#ifndef TC_HEADER_DRIVER_ENCRYPTED_IO_QUEUE
-#define TC_HEADER_DRIVER_ENCRYPTED_IO_QUEUE
-
-#include "TCdefs.h"
-#include "Apidrvr.h"
-
-#if 0
-# define TC_TRACE_IO_QUEUE
-#endif
-
-#define TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE (256 * 1024)
-
-#define TC_ENC_IO_QUEUE_PREALLOCATED_ITEM_COUNT 8
-#define TC_ENC_IO_QUEUE_PREALLOCATED_IO_REQUEST_COUNT 16
-
-
-typedef struct EncryptedIoQueueBufferStruct
-{
- struct EncryptedIoQueueBufferStruct *NextBuffer;
-
- void *Address;
- ULONG Size;
- BOOL InUse;
-
-} EncryptedIoQueueBuffer;
-
-
-typedef struct
-{
- PDEVICE_OBJECT DeviceObject;
-
- KMUTEX BufferPoolMutex;
- EncryptedIoQueueBuffer *FirstPoolBuffer;
-
- CRYPTO_INFO *CryptoInfo;
-
- // File-handle-based IO
- HANDLE HostFileHandle;
- int64 VirtualDeviceLength;
- SECURITY_CLIENT_CONTEXT *SecurityClientContext;
-
- // Filter device
- BOOL IsFilterDevice;
- PDEVICE_OBJECT LowerDeviceObject;
- int64 EncryptedAreaStart;
- volatile int64 EncryptedAreaEnd;
- volatile BOOL EncryptedAreaEndUpdatePending;
- BOOL RemapEncryptedArea;
- int64 RemappedAreaOffset;
- int64 RemappedAreaDataUnitOffset;
- IO_REMOVE_LOCK RemoveLock;
-
- // Main tread
- PKTHREAD MainThread;
- LIST_ENTRY MainThreadQueue;
- KSPIN_LOCK MainThreadQueueLock;
- KEVENT MainThreadQueueNotEmptyEvent;
-
- // IO thread
- PKTHREAD IoThread;
- LIST_ENTRY IoThreadQueue;
- KSPIN_LOCK IoThreadQueueLock;
- KEVENT IoThreadQueueNotEmptyEvent;
-
- // Completion thread
- PKTHREAD CompletionThread;
- LIST_ENTRY CompletionThreadQueue;
- KSPIN_LOCK CompletionThreadQueueLock;
- KEVENT CompletionThreadQueueNotEmptyEvent;
-
- // Fragment buffers
- byte *FragmentBufferA;
- byte *FragmentBufferB;
- KEVENT FragmentBufferAFreeEvent;
- KEVENT FragmentBufferBFreeEvent;
-
- // Read-ahead buffer
- BOOL ReadAheadBufferValid;
- LARGE_INTEGER LastReadOffset;
- ULONG LastReadLength;
- LARGE_INTEGER ReadAheadOffset;
- ULONG ReadAheadLength;
- byte *ReadAheadBuffer;
- LARGE_INTEGER MaxReadAheadOffset;
-
- LONG OutstandingIoCount;
- KEVENT NoOutstandingIoEvent;
- LONG IoThreadPendingRequestCount;
-
- KEVENT PoolBufferFreeEvent;
-
- __int64 TotalBytesRead;
- __int64 TotalBytesWritten;
-
- volatile BOOL StartPending;
- volatile BOOL ThreadExitRequested;
-
- volatile BOOL Suspended;
- volatile BOOL SuspendPending;
- volatile BOOL StopPending;
-
- KEVENT QueueResumedEvent;
-
-#ifdef TC_TRACE_IO_QUEUE
- LARGE_INTEGER LastPerformanceCounter;
-#endif
-
-} EncryptedIoQueue;
-
-
-typedef struct
-{
- EncryptedIoQueue *Queue;
- PIRP OriginalIrp;
- BOOL Write;
- ULONG OriginalLength;
- LARGE_INTEGER OriginalOffset;
- NTSTATUS Status;
-
-#ifdef TC_TRACE_IO_QUEUE
- LARGE_INTEGER OriginalIrpOffset;
-#endif
-
-} EncryptedIoQueueItem;
-
-
-typedef struct
-{
- EncryptedIoQueueItem *Item;
-
- BOOL CompleteOriginalIrp;
- LARGE_INTEGER Offset;
- ULONG Length;
- int64 EncryptedOffset;
- ULONG EncryptedLength;
- byte *Data;
- byte *OrigDataBufferFragment;
-
- LIST_ENTRY ListEntry;
- LIST_ENTRY CompletionListEntry;
-} EncryptedIoRequest;
-
-
-NTSTATUS EncryptedIoQueueAddIrp (EncryptedIoQueue *queue, PIRP irp);
-BOOL EncryptedIoQueueIsRunning (EncryptedIoQueue *queue);
-BOOL EncryptedIoQueueIsSuspended (EncryptedIoQueue *queue);
-NTSTATUS EncryptedIoQueueResumeFromHold (EncryptedIoQueue *queue);
-NTSTATUS EncryptedIoQueueStart (EncryptedIoQueue *queue);
-NTSTATUS EncryptedIoQueueStop (EncryptedIoQueue *queue);
-NTSTATUS EncryptedIoQueueHoldWhenIdle (EncryptedIoQueue *queue, int64 timeout);
-
-
-#endif // TC_HEADER_DRIVER_ENCRYPTED_IO_QUEUE
+/* + Derived from source code of TrueCrypt 7.1a, which is + Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed + by the TrueCrypt License 3.0. + + Modifications and additions to the original source code (contained in this file) + and all other portions of this file are Copyright (c) 2013-2016 IDRIX + and are governed by the Apache License 2.0 the full text of which is + contained in the file License.txt included in VeraCrypt binary and source + code distribution packages. +*/ + +#ifndef TC_HEADER_DRIVER_ENCRYPTED_IO_QUEUE +#define TC_HEADER_DRIVER_ENCRYPTED_IO_QUEUE + +#include "TCdefs.h" +#include "Apidrvr.h" + +#if 0 +# define TC_TRACE_IO_QUEUE +#endif + +#define TC_ENC_IO_QUEUE_MAX_FRAGMENT_SIZE (256 * 1024) + +#define TC_ENC_IO_QUEUE_PREALLOCATED_ITEM_COUNT 8 +#define TC_ENC_IO_QUEUE_PREALLOCATED_IO_REQUEST_COUNT 16 + + +typedef struct EncryptedIoQueueBufferStruct +{ + struct EncryptedIoQueueBufferStruct *NextBuffer; + + void *Address; + ULONG Size; + BOOL InUse; + +} EncryptedIoQueueBuffer; + + +typedef struct +{ + PDEVICE_OBJECT DeviceObject; + + KMUTEX BufferPoolMutex; + EncryptedIoQueueBuffer *FirstPoolBuffer; + + CRYPTO_INFO *CryptoInfo; + + // File-handle-based IO + HANDLE HostFileHandle; + int64 VirtualDeviceLength; + SECURITY_CLIENT_CONTEXT *SecurityClientContext; + + // Filter device + BOOL IsFilterDevice; + PDEVICE_OBJECT LowerDeviceObject; + int64 EncryptedAreaStart; + volatile int64 EncryptedAreaEnd; + volatile BOOL EncryptedAreaEndUpdatePending; + BOOL RemapEncryptedArea; + int64 RemappedAreaOffset; + int64 RemappedAreaDataUnitOffset; + IO_REMOVE_LOCK RemoveLock; + + // Main tread + PKTHREAD MainThread; + LIST_ENTRY MainThreadQueue; + KSPIN_LOCK MainThreadQueueLock; + KEVENT MainThreadQueueNotEmptyEvent; + + // IO thread + PKTHREAD IoThread; + LIST_ENTRY IoThreadQueue; + KSPIN_LOCK IoThreadQueueLock; + KEVENT IoThreadQueueNotEmptyEvent; + + // Completion thread + PKTHREAD CompletionThread; + LIST_ENTRY CompletionThreadQueue; + KSPIN_LOCK CompletionThreadQueueLock; + KEVENT CompletionThreadQueueNotEmptyEvent; + + // Fragment buffers + byte *FragmentBufferA; + byte *FragmentBufferB; + KEVENT FragmentBufferAFreeEvent; + KEVENT FragmentBufferBFreeEvent; + + // Read-ahead buffer + BOOL ReadAheadBufferValid; + LARGE_INTEGER LastReadOffset; + ULONG LastReadLength; + LARGE_INTEGER ReadAheadOffset; + ULONG ReadAheadLength; + byte *ReadAheadBuffer; + LARGE_INTEGER MaxReadAheadOffset; + + LONG OutstandingIoCount; + KEVENT NoOutstandingIoEvent; + LONG IoThreadPendingRequestCount; + + KEVENT PoolBufferFreeEvent; + + __int64 TotalBytesRead; + __int64 TotalBytesWritten; + + volatile BOOL StartPending; + volatile BOOL ThreadExitRequested; + + volatile BOOL Suspended; + volatile BOOL SuspendPending; + volatile BOOL StopPending; + + KEVENT QueueResumedEvent; + +#ifdef TC_TRACE_IO_QUEUE + LARGE_INTEGER LastPerformanceCounter; +#endif + +} EncryptedIoQueue; + + +typedef struct +{ + EncryptedIoQueue *Queue; + PIRP OriginalIrp; + BOOL Write; + ULONG OriginalLength; + LARGE_INTEGER OriginalOffset; + NTSTATUS Status; + +#ifdef TC_TRACE_IO_QUEUE + LARGE_INTEGER OriginalIrpOffset; +#endif + +} EncryptedIoQueueItem; + + +typedef struct +{ + EncryptedIoQueueItem *Item; + + BOOL CompleteOriginalIrp; + LARGE_INTEGER Offset; + ULONG Length; + int64 EncryptedOffset; + ULONG EncryptedLength; + byte *Data; + byte *OrigDataBufferFragment; + + LIST_ENTRY ListEntry; + LIST_ENTRY CompletionListEntry; +} EncryptedIoRequest; + + +NTSTATUS EncryptedIoQueueAddIrp (EncryptedIoQueue *queue, PIRP irp); +BOOL EncryptedIoQueueIsRunning (EncryptedIoQueue *queue); +BOOL EncryptedIoQueueIsSuspended (EncryptedIoQueue *queue); +NTSTATUS EncryptedIoQueueResumeFromHold (EncryptedIoQueue *queue); +NTSTATUS EncryptedIoQueueStart (EncryptedIoQueue *queue); +NTSTATUS EncryptedIoQueueStop (EncryptedIoQueue *queue); +NTSTATUS EncryptedIoQueueHoldWhenIdle (EncryptedIoQueue *queue, int64 timeout); + + +#endif // TC_HEADER_DRIVER_ENCRYPTED_IO_QUEUE |