|
|
/*++
Copyright (c) 1996 Microsoft Corporation
Abstract:
This module contains the common header information for the EFS
DLL.
Author:
Robert Gu (robertg) 08-Dec-1996
Enviroment:
Kernel Mode Only
Revision History:
--*/ #ifndef EFSRTL_H
#define EFSRTL_H
#include "efs.h"
#include "efsext.h"
#define EFS_IV 0x169119629891ad13
#define EFS_AES_IVL 0x5816657be9161312
#define EFS_AES_IVH 0x1989adbe44918961
//#define ENCRYPT 0
//#define DECRYPT 1
#define CHUNK_SIZE 512
#define EFS_MAX_LENGTH 256*1024
//
// Status of EFS context.
//
// Processing Status
//
#define NO_FURTHER_PROCESSING 0x00000000
#define NEW_FILE_EFS_REQUIRED 0x00000001
#define NEW_DIR_EFS_REQUIRED 0x00000002
#define VERIFY_USER_REQUIRED 0x00000004
#define TURN_ON_BIT_ONLY 0x00000008
#define NO_OPEN_CACHE_CHECK 0x40000000
#define TURN_ON_ENCRYPTION_BIT 0x80000000
#define ACTION_REQUIRED 0x0fffffff
//
//
//
#define SYSTEM_IS_READONLY 0x00000001
//
// Error Status
//
#define CREATE_EFS_FAIL 0x00000100
#define OPEN_EFS_FAIL 0x00000200
#define WRITE_EFS_FAIL 0x00000400
#define OUT_OF_MEMORY 0x00000800
#define EFS_FORMAT_ERROR 0x00001000
#define NTOFS_EXCEPTION 0x00002000
//
// Information Status
//
#define EFS_READ_SUCCESSFUL 0x00010000
//
// Stream Create Status
//
#define STRING_NEW_OR_EXIST_MASK 0x000f0000
#define FILE_DIR_TYPE 0x0000000f
#define FILE_NEW 0x00000001
#define FILE_EXISTING 0x00000002
#define DIRECTORY_NEW 0x00000004
#define DIRECTORY_EXISTING 0x00000008
#define STREAM_NEW 0x00010000
#define STREAM_EXISTING 0x00020000
//
// Encryption flag
//
#define FILE_ENCRYPTED 0x00000002
#define STREAM_ENCRYPTED 0x00000001
//
// The EFS FSCTL Input data buffer.
//
typedef struct _FSCTL_INPUT {
ULONG PlainSubCode; ULONG EfsFsCode; ULONG CipherSubCode; UCHAR EfsFsData[1];
} FSCTL_INPUT, *PFSCTL_INPUT;
typedef struct _GENERAL_FS_DATA {
UCHAR Sk1[DES_KEYSIZE]; ULONG Hdl1; ULONG Hdl2; UCHAR Sk2[DES_KEYSIZE]; ULONG Hdl3; ULONG Hdl4; UCHAR EfsData[1];
} GENERAL_FS_DATA, *PGENERAL_FS_DATA;
typedef struct _EFS_STREAM {
ULONG Length; ULONG Status; UCHAR Private[1];
} EFS_STREAM, *PEFS_STREAM;
//
// Function prototypes
//
typedef VOID ( * EfsEncFunc)( IN PUCHAR InBuffer, OUT PUCHAR OutBuffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
typedef VOID ( * EfsDecFunc)( IN OUT PUCHAR Buffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSDesEnc( IN PUCHAR InBuffer, OUT PUCHAR OutBuffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSDesDec( IN OUT PUCHAR Buffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSDesXEnc( IN PUCHAR InBuffer, OUT PUCHAR OutBuffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSDesXDec( IN OUT PUCHAR Buffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSDes3Enc( IN PUCHAR InBuffer, OUT PUCHAR OutBuffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSDes3Dec( IN OUT PUCHAR Buffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSAesEnc( IN PUCHAR InBuffer, OUT PUCHAR OutBuffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EFSAesDec( IN OUT PUCHAR Buffer, IN PUCHAR IV, IN PKEY_BLOB KeyBlob, IN LONG Length );
VOID EfsEncryptKeyFsData( IN PVOID DataBuffer, IN ULONG DataLength, IN ULONG DataEncOffset, IN ULONG RefdataEncOffset, IN ULONG RefdataEncLength );
NTSTATUS EfsOpenFile( IN OBJECT_HANDLE FileHdl, IN OBJECT_HANDLE ParentDir OPTIONAL, IN PIO_STACK_LOCATION IrpSp, IN ULONG FileDirFlag, IN ULONG SystemState, IN PIRP_CONTEXT IrpContext, IN PDEVICE_OBJECT VolDo, IN PVOID PfileKeyContext, IN OUT PVOID *PContext, IN OUT PULONG PContextLength, IN OUT PVOID *PCreateContext, IN OUT PBOOLEAN Reserved );
NTSTATUS EfsFileControl( IN PVOID PInputBuffer, IN ULONG InputDataLength, OUT PVOID POutputBuffer OPTIONAL, IN OUT PULONG OutputBufferLength, IN ULONG EncryptionFlag, IN ULONG AccessFlag, IN ULONG SystemState, IN ULONG FsControlCode, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, IN PDEVICE_OBJECT VolDo, IN ATTRIBUTE_HANDLE Stream, IN OUT PVOID *PContext, IN OUT PULONG PContextLength );
NTSTATUS EfsRead( IN OUT PUCHAR Buffer, IN PLARGE_INTEGER Offset, IN ULONG BufferSize, IN PVOID Context );
NTSTATUS EfsWrite( IN PUCHAR InBuffer, //Do we need in and out buffer?
OUT PUCHAR OutBuffer, IN PLARGE_INTEGER Offset, IN ULONG BufferSize, IN PUCHAR Context );
VOID EfsFreeContext( IN OUT PVOID *PContext );
NTSTATUS EfsMountVolumn( IN PDEVICE_OBJECT VolDo, IN PDEVICE_OBJECT RealDevice );
VOID EfsDismountVolumn( IN PDEVICE_OBJECT DeviceObject );
NTSTATUS EfsReadEfsData( IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, OUT PVOID *EfsStreamData, OUT PULONG PEfsStreamLength, OUT PULONG Information );
BOOLEAN EfsVerifyGeneralFsData( IN PUCHAR DataOffset, IN ULONG InputDataLength );
BOOLEAN EfsVerifyKeyFsData( IN PUCHAR DataOffset, IN ULONG InputDataLength );
NTSTATUS EfsDeleteEfsData( IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext );
NTSTATUS EfsSetEncrypt( IN PUCHAR InputData, IN ULONG InputDataLength, IN ULONG EncryptionFlag, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, IN OUT PVOID *Context, IN OUT PULONG PContextLength );
NTSTATUS EfsEncryptStream( IN PUCHAR InputData, IN ULONG InputDataLength, IN ULONG EncryptionFlag, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, IN OUT PVOID *Context, IN OUT PULONG PContextLength );
NTSTATUS EfsEncryptFile( IN PUCHAR InputData, IN ULONG InputDataLength, IN ULONG EncryptionFlag, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, IN OUT PVOID *Context );
NTSTATUS EfsDecryptStream( IN PUCHAR InputData, IN ULONG InputDataLength, IN ULONG EncryptionFlag, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, IN OUT PVOID *Context, IN OUT PULONG PContextLength );
NTSTATUS EfsDecryptFile( IN PUCHAR InputData, IN ULONG InputDataLength, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext );
NTSTATUS EfsEncryptDir( IN PUCHAR InputData, IN ULONG InputDataLength, IN ULONG EncryptionFlag, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext );
NTSTATUS EfsModifyEfsState( IN ULONG FunctionCode, IN PUCHAR InputData, IN ULONG InputDataLength, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext );
ULONG GetEfsStreamOffset( IN PUCHAR InputData );
NTSTATUS SetEfsData( PUCHAR InputData, IN ULONG InputDataLength, IN ULONG SystemState, IN OBJECT_HANDLE FileHdl, IN PIRP_CONTEXT IrpContext, IN OUT PVOID *PContext, IN OUT PULONG PContextLength );
BOOLEAN EfsFindInCache( IN GUID *EfsId, IN PTOKEN_USER UserId );
NTSTATUS EfsRefreshCache( IN GUID *EfsId, IN PTOKEN_USER UserId );
BOOLEAN SkipCheckStream( IN PIO_STACK_LOCATION IrpSp, IN PVOID efsStreamData );
#endif
|