427 lines
7.8 KiB
C
427 lines
7.8 KiB
C
/*++
|
|
|
|
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
|
|
|