freeotfe.h

来自「文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2」· C头文件 代码 · 共 784 行 · 第 1/2 页

H
784
字号
// Description: FreeOTFE Device Driver
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW:   http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//


#ifndef _FreeOTFE_H
#define _FreeOTFE_H   1


// The following includes are required in order to implement Cancel-Safe
// IRP Queues
#include <ntddk.h>
//#include <wdm.h>
#include <csq.h>

#include <ntverp.h>  // Needed for VER_PRODUCTBUILD

#include <initguid.h>  // Required for TEST_GUID_...

#include "FreeOTFECypherAPI.h"
#include "FreeOTFEHashAPI.h"
#include "FreeOTFEPlatform.h"


// =========================================================================
// Const definitions

// These values are in DECIMAL
#define DRIVER_VERSION_MAJOR     02
#define DRIVER_VERSION_MINOR     00
#define DRIVER_VERSION_BUILD   0000

#define DRIVER_VERSION  (                                      \
                         (DRIVER_VERSION_MAJOR * 0x01000000) + \
                         (DRIVER_VERSION_MINOR * 0x00010000) + \
                         (DRIVER_VERSION_BUILD * 0x00000001)   \
                        )

#define MAX_DEVICES 26


#define HDD_BYTES_PER_SECTOR 512
#define CD_BYTES_PER_SECTOR  2048
// These figures are used; no real reason for these *exact* numbers, except
// that they're the same defaults as used by Windows NT for SCSI devices
// when it can't get the real values from the SCSI BIOS.
// See MS Knowledgebase article Q258281 for further details
// Tracks per cylinder = the number of heads
#define TRACKS_PER_CYLINDER 64
#define SECTORS_PER_TRACK 32


// Definition used for testing purposes; dummy GUID with 0x0F as it's last byte
DEFINE_GUID(TEST_GUID_0x0F,  0x00000000L, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F);


#define CD_FRAMES_PER_SECOND 75
#define CD_FRAMES_PER_MINUTE (CD_FRAMES_PER_SECOND * 60)

// From winioctl.h
#define FSCTL_LOCK_VOLUME               CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  6, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_UNLOCK_VOLUME             CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  7, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_DISMOUNT_VOLUME           CTL_CODE(FILE_DEVICE_FILE_SYSTEM,  8, METHOD_BUFFERED, FILE_ANY_ACCESS)


// =========================================================================
// Function headers

// Driver entry point
NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
);
    
    
// Driver unload
VOID
DriverUnload(
    IN PDRIVER_OBJECT DriverObject
);
    
    
// Handle create IRPs
NTSTATUS
FreeOTFE_MF_DispatchCreate(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Handle close IRPs
NTSTATUS
FreeOTFE_MF_DispatchClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Handle device control IRPs
NTSTATUS
FreeOTFE_MF_DispatchDeviceControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Handle read IRPs
NTSTATUS
FreeOTFE_MF_DispatchRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Handle write IRPs
NTSTATUS
FreeOTFE_MF_DispatchWrite(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Handle flush buffers IRPs
NTSTATUS
FreeOTFE_MF_DispatchFlushBuffers(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

    
// Handle power IRPs
NTSTATUS
FreeOTFE_MF_DispatchPower(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Handle system control IRPs
NTSTATUS
FreeOTFE_MF_DispatchSystemControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

NTSTATUS
CreateMainDevice (
    IN PDRIVER_OBJECT   DriverObject,
    OUT PDEVICE_OBJECT  *DeviceObject
);


NTSTATUS
CreateDiskDevice (
    IN PDRIVER_OBJECT   DriverObject,
    IN ULONG DeviceType,
    OUT PDEVICE_OBJECT  *DeviceObject
);
    

PDEVICE_OBJECT
DestroyDevice(
    IN PDEVICE_OBJECT devObj    
);

    
VOID
FreeOTFEThread(
    IN PVOID Context
);
    
    
    
    

VOID CSQInsertIrp (
    IN PIO_CSQ   Csq,
    IN PIRP              Irp
);

VOID CSQRemoveIrp(
    IN  PIO_CSQ Csq,
    IN  PIRP    Irp
);

PIRP CSQPeekNextIrp(
    IN  PIO_CSQ Csq,
    IN  PIRP    Irp,
    IN  PVOID   PeekContext
);

VOID CSQAcquireLock(
    IN  PIO_CSQ Csq,
    OUT PKIRQL  Irql
);

VOID CSQReleaseLock(
    IN PIO_CSQ Csq,
    IN KIRQL   Irql
);

VOID CSQCompleteCanceledIrp(
    IN  PIO_CSQ             pCsq,
    IN  PIRP                Irp
);

// Cancel all IRPs currently on the queue
void
CancelAllQueuedIRPs(
    IN PDEVICE_OBJECT DeviceObject
);


// Queue the specified IRP for the given DeviceObject
NTSTATUS
QueueIRPToThread(
    IN  PDEVICE_OBJECT DeviceObject,    
    IN  PIRP           Irp
);


NTSTATUS
GetNamedCharDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PCHAR TgtDeviceName, 
    OUT PDEVICE_OBJECT* DeviceObject
);
    
    
NTSTATUS
GetNamedUnicodeDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING TgtDeviceName, 
    OUT PDEVICE_OBJECT* DeviceObject
);


// Read/write data to the specified device
NTSTATUS
ThreadReadWriteData(
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
);


// Mount the specified device
NTSTATUS
ThreadMount(
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
);


// Dismount the specified device
NTSTATUS
ThreadDismount(
    IN PDEVICE_OBJECT DeviceObject,
    IN OUT PIRP Irp
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_Version(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_Create(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);
    
    
NTSTATUS
IOCTL_FreeOTFEIOCTL_Destroy(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


// Write raw data to volume
NTSTATUS
IOCTL_FreeOTFEIOCTL_SetRaw(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

    
// Read raw data from volume
NTSTATUS
IOCTL_FreeOTFEIOCTL_GetRaw(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

// Derive a key
// This is implemented in the kernel mode driver as implementing it in userspace (e.g. the
// Delphi frontend) takes *far* too long to process the data due to the repeated calls to hash
// functions, etc
NTSTATUS
IOCTL_FreeOTFEIOCTL_DeriveKey(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

    
// Generate a MAC
// Implmented in the kernel mode driver because it's required by the key derivation process
NTSTATUS
IOCTL_FreeOTFEIOCTL_GenerateMAC(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_Mount(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PDEVICE_OBJECT *QueueDeviceObject
);
    
    
NTSTATUS
IOCTL_FreeOTFEIOCTL_DOSMountpointCreate(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

NTSTATUS
IOCTL_FreeOTFEIOCTL_DOSMountpointDelete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

NTSTATUS
IOCTL_FreeOTFEIOCTL_LDREU(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_Dismount(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PDEVICE_OBJECT *QueueDeviceObject
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_GetDiskDeviceCount(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_GetDiskDeviceList(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


NTSTATUS
IOCTL_FreeOTFEIOCTL_GetDiskDeviceStatus(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);
      

NTSTATUS
IOCTL_FreeOTFEIOCTL_GetDiskDeviceMetaData(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);

NTSTATUS
IOCTL_Std_DiskFormatTracks(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
);


NTSTATUS

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?