Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

426 lines
7.8 KiB

/*++
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