mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
inc: winfsp.hpp: improve C++ layer
This commit is contained in:
parent
c144d4d303
commit
d5802f3a5f
@ -56,18 +56,13 @@ inline DWORD Win32FromNtStatus(NTSTATUS Status)
|
|||||||
class FileSystem
|
class FileSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef FSP_FSCTL_VOLUME_PARAMS VOLUME_PARAMS;
|
typedef FSP_FSCTL_VOLUME_PARAMS VolumeParams;
|
||||||
typedef FSP_FSCTL_VOLUME_INFO VOLUME_INFO;
|
typedef FSP_FSCTL_VOLUME_INFO VolumeInfo;
|
||||||
typedef FSP_FSCTL_FILE_INFO FILE_INFO;
|
typedef FSP_FSCTL_FILE_INFO FileInfo;
|
||||||
typedef FSP_FSCTL_OPEN_FILE_INFO OPEN_FILE_INFO;
|
typedef FSP_FSCTL_OPEN_FILE_INFO OpenFileInfo;
|
||||||
typedef FSP_FSCTL_DIR_INFO DIR_INFO;
|
typedef FSP_FSCTL_DIR_INFO DirInfo;
|
||||||
typedef FSP_FSCTL_STREAM_INFO STREAM_INFO;
|
typedef FSP_FSCTL_STREAM_INFO StreamInfo;
|
||||||
struct FILE_CONTEXT
|
enum CleanupFlags
|
||||||
{
|
|
||||||
PVOID FileNode;
|
|
||||||
PVOID FileDesc;
|
|
||||||
};
|
|
||||||
enum CLEANUP_FLAGS
|
|
||||||
{
|
{
|
||||||
CleanupDelete = FspCleanupDelete,
|
CleanupDelete = FspCleanupDelete,
|
||||||
CleanupSetAllocationSize = FspCleanupSetAllocationSize,
|
CleanupSetAllocationSize = FspCleanupSetAllocationSize,
|
||||||
@ -91,7 +86,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
const VOLUME_PARAMS *VolumeParams()
|
const VolumeParams *GetVolumeParams()
|
||||||
{
|
{
|
||||||
return &_VolumeParams;
|
return &_VolumeParams;
|
||||||
}
|
}
|
||||||
@ -228,7 +223,7 @@ public:
|
|||||||
return FspFileSystemAcquireDirectoryBuffer(PDirBuffer, Reset, PResult);
|
return FspFileSystemAcquireDirectoryBuffer(PDirBuffer, Reset, PResult);
|
||||||
}
|
}
|
||||||
static BOOLEAN FillDirectoryBuffer(PVOID *PDirBuffer,
|
static BOOLEAN FillDirectoryBuffer(PVOID *PDirBuffer,
|
||||||
DIR_INFO *DirInfo, PNTSTATUS PResult)
|
DirInfo *DirInfo, PNTSTATUS PResult)
|
||||||
{
|
{
|
||||||
return FspFileSystemFillDirectoryBuffer(PDirBuffer, DirInfo, PResult);
|
return FspFileSystemFillDirectoryBuffer(PDirBuffer, DirInfo, PResult);
|
||||||
}
|
}
|
||||||
@ -247,12 +242,12 @@ public:
|
|||||||
{
|
{
|
||||||
FspFileSystemDeleteDirectoryBuffer(PDirBuffer);
|
FspFileSystemDeleteDirectoryBuffer(PDirBuffer);
|
||||||
}
|
}
|
||||||
static BOOLEAN AddDirInfo(DIR_INFO *DirInfo,
|
static BOOLEAN AddDirInfo(DirInfo *DirInfo,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred);
|
return FspFileSystemAddDirInfo(DirInfo, Buffer, Length, PBytesTransferred);
|
||||||
}
|
}
|
||||||
static BOOLEAN AddStreamInfo(STREAM_INFO *StreamInfo,
|
static BOOLEAN AddStreamInfo(StreamInfo *StreamInfo,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred);
|
return FspFileSystemAddStreamInfo(StreamInfo, Buffer, Length, PBytesTransferred);
|
||||||
@ -281,149 +276,222 @@ protected:
|
|||||||
return STATUS_UNEXPECTED_IO_ERROR;
|
return STATUS_UNEXPECTED_IO_ERROR;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetVolumeInfo(
|
virtual NTSTATUS GetVolumeInfo(
|
||||||
VOLUME_INFO *VolumeInfo)
|
VolumeInfo *VolumeInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS SetVolumeLabel_(
|
virtual NTSTATUS SetVolumeLabel_(
|
||||||
PWSTR VolumeLabel,
|
PWSTR VolumeLabel,
|
||||||
VOLUME_INFO *VolumeInfo)
|
VolumeInfo *VolumeInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetSecurityByName(
|
virtual NTSTATUS GetSecurityByName(
|
||||||
PWSTR FileName, PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
PWSTR FileName,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Create(
|
virtual NTSTATUS Create(
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
UINT32 CreateOptions,
|
||||||
FILE_CONTEXT *FileContext, OPEN_FILE_INFO *OpenFileInfo)
|
UINT32 GrantedAccess,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
PVOID *PFileNode,
|
||||||
|
PVOID *PFileDesc,
|
||||||
|
OpenFileInfo *OpenFileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Open(
|
virtual NTSTATUS Open(
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
FILE_CONTEXT *FileContext, OPEN_FILE_INFO *OpenFileInfo)
|
UINT32 CreateOptions,
|
||||||
|
UINT32 GrantedAccess,
|
||||||
|
PVOID *PFileNode,
|
||||||
|
PVOID *PFileDesc,
|
||||||
|
OpenFileInfo *OpenFileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Overwrite(
|
virtual NTSTATUS Overwrite(
|
||||||
const FILE_CONTEXT *FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
BOOLEAN ReplaceFileAttributes,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual VOID Cleanup(
|
virtual VOID Cleanup(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR FileName, ULONG Flags)
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
ULONG Flags)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
virtual VOID Close(
|
virtual VOID Close(
|
||||||
const FILE_CONTEXT *FileContext)
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Read(
|
virtual NTSTATUS Read(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Write(
|
virtual NTSTATUS Write(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileNode,
|
||||||
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
PVOID FileDesc,
|
||||||
PULONG PBytesTransferred, FILE_INFO *FileInfo)
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
|
BOOLEAN WriteToEndOfFile,
|
||||||
|
BOOLEAN ConstrainedIo,
|
||||||
|
PULONG PBytesTransferred,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Flush(
|
virtual NTSTATUS Flush(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetFileInfo(
|
virtual NTSTATUS GetFileInfo(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS SetBasicInfo(
|
virtual NTSTATUS SetBasicInfo(
|
||||||
const FILE_CONTEXT *FileContext, UINT32 FileAttributes,
|
PVOID FileNode,
|
||||||
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
PVOID FileDesc,
|
||||||
FILE_INFO *FileInfo)
|
UINT32 FileAttributes,
|
||||||
|
UINT64 CreationTime,
|
||||||
|
UINT64 LastAccessTime,
|
||||||
|
UINT64 LastWriteTime,
|
||||||
|
UINT64 ChangeTime,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS SetFileSize(
|
virtual NTSTATUS SetFileSize(
|
||||||
const FILE_CONTEXT *FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
UINT64 NewSize,
|
||||||
|
BOOLEAN SetAllocationSize,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS CanDelete(
|
virtual NTSTATUS CanDelete(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR FileName)
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS Rename(
|
virtual NTSTATUS Rename(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists)
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
PWSTR NewFileName,
|
||||||
|
BOOLEAN ReplaceIfExists)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetSecurity(
|
virtual NTSTATUS GetSecurity(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PVOID FileDesc,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS SetSecurity(
|
virtual NTSTATUS SetSecurity(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
PVOID FileDesc,
|
||||||
|
SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR ModificationDescriptor)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS ReadDirectory(
|
virtual NTSTATUS ReadDirectory(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR Pattern, PWSTR Marker,
|
PVOID FileNode,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
PVOID FileDesc,
|
||||||
|
PWSTR Pattern,
|
||||||
|
PWSTR Marker,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG Length,
|
||||||
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS ResolveReparsePoints(
|
virtual NTSTATUS ResolveReparsePoints(
|
||||||
PWSTR FileName, UINT32 ReparsePointIndex, BOOLEAN ResolveLastPathComponent,
|
PWSTR FileName,
|
||||||
PIO_STATUS_BLOCK PIoStatus, PVOID Buffer, PSIZE_T PSize)
|
UINT32 ReparsePointIndex,
|
||||||
|
BOOLEAN ResolveLastPathComponent,
|
||||||
|
PIO_STATUS_BLOCK PIoStatus,
|
||||||
|
PVOID Buffer,
|
||||||
|
PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
return FspFileSystemResolveReparsePoints(_FileSystem, GetReparsePointByName, 0,
|
return FspFileSystemResolveReparsePoints(_FileSystem, GetReparsePointByName, 0,
|
||||||
FileName, ReparsePointIndex, ResolveLastPathComponent,
|
FileName, ReparsePointIndex, ResolveLastPathComponent,
|
||||||
PIoStatus, Buffer, PSize);
|
PIoStatus, Buffer, PSize);
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetReparsePointByName(
|
virtual NTSTATUS GetReparsePointByName(
|
||||||
PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize)
|
PWSTR FileName,
|
||||||
|
BOOLEAN IsDirectory,
|
||||||
|
PVOID Buffer,
|
||||||
|
PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetReparsePoint(
|
virtual NTSTATUS GetReparsePoint(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PWSTR FileName, PVOID Buffer, PSIZE_T PSize)
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
PVOID Buffer,
|
||||||
|
PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS SetReparsePoint(
|
virtual NTSTATUS SetReparsePoint(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
PVOID Buffer,
|
||||||
|
SIZE_T Size)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS DeleteReparsePoint(
|
virtual NTSTATUS DeleteReparsePoint(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
PVOID Buffer,
|
||||||
|
SIZE_T Size)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
}
|
}
|
||||||
virtual NTSTATUS GetStreamInfo(
|
virtual NTSTATUS GetStreamInfo(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, ULONG Length,
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
return STATUS_INVALID_DEVICE_REQUEST;
|
return STATUS_INVALID_DEVICE_REQUEST;
|
||||||
@ -432,301 +500,411 @@ protected:
|
|||||||
private:
|
private:
|
||||||
/* FSP_FILE_SYSTEM_INTERFACE */
|
/* FSP_FILE_SYSTEM_INTERFACE */
|
||||||
static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS GetVolumeInfo(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
VOLUME_INFO *VolumeInfo)
|
VolumeInfo *VolumeInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetVolumeInfo(VolumeInfo);
|
return self->GetVolumeInfo(
|
||||||
|
VolumeInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS SetVolumeLabel_(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS SetVolumeLabel_(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PWSTR VolumeLabel,
|
PWSTR VolumeLabel,
|
||||||
VOLUME_INFO *VolumeInfo)
|
VolumeInfo *VolumeInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->SetVolumeLabel_(VolumeLabel, VolumeInfo);
|
return self->SetVolumeLabel_(
|
||||||
|
VolumeLabel,
|
||||||
|
VolumeInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS GetSecurityByName(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PWSTR FileName, PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
PWSTR FileName,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetSecurityByName(
|
return self->GetSecurityByName(
|
||||||
FileName, PFileAttributes, SecurityDescriptor, PSecurityDescriptorSize);
|
FileName,
|
||||||
|
PFileAttributes,
|
||||||
|
SecurityDescriptor,
|
||||||
|
PSecurityDescriptorSize);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
UINT32 CreateOptions,
|
||||||
PVOID *FullContext, FILE_INFO *FileInfo)
|
UINT32 GrantedAccess,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
PVOID *FullContext,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext = { 0 };
|
PVOID FileNode, FileDesc;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
Result = self->Create(
|
Result = self->Create(
|
||||||
FileName, CreateOptions, GrantedAccess, FileAttributes, SecurityDescriptor, AllocationSize,
|
FileName,
|
||||||
&FileContext, FspFileSystemGetOpenFileInfo(FileInfo));
|
CreateOptions,
|
||||||
|
GrantedAccess,
|
||||||
|
FileAttributes,
|
||||||
|
SecurityDescriptor,
|
||||||
|
AllocationSize,
|
||||||
|
&FileNode,
|
||||||
|
&FileDesc,
|
||||||
|
FspFileSystemGetOpenFileInfo(FileInfo));
|
||||||
)
|
)
|
||||||
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext = (UINT64)(UINT_PTR)FileContext.FileNode;
|
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext = (UINT64)(UINT_PTR)FileNode;
|
||||||
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2 = (UINT64)(UINT_PTR)FileContext.FileDesc;
|
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2 = (UINT64)(UINT_PTR)FileDesc;
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
PVOID *FullContext, FILE_INFO *FileInfo)
|
UINT32 CreateOptions,
|
||||||
|
UINT32 GrantedAccess,
|
||||||
|
PVOID *FullContext,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext = { 0 };
|
PVOID FileNode, FileDesc;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
Result = self->Open(
|
Result = self->Open(
|
||||||
FileName, CreateOptions, GrantedAccess,
|
FileName,
|
||||||
&FileContext, FspFileSystemGetOpenFileInfo(FileInfo));
|
CreateOptions,
|
||||||
|
GrantedAccess,
|
||||||
|
&FileNode,
|
||||||
|
&FileDesc,
|
||||||
|
FspFileSystemGetOpenFileInfo(FileInfo));
|
||||||
)
|
)
|
||||||
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext = (UINT64)(UINT_PTR)FileContext.FileNode;
|
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext = (UINT64)(UINT_PTR)FileNode;
|
||||||
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2 = (UINT64)(UINT_PTR)FileContext.FileDesc;
|
((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2 = (UINT64)(UINT_PTR)FileDesc;
|
||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
PVOID FullContext,
|
||||||
FILE_INFO *FileInfo)
|
UINT32 FileAttributes,
|
||||||
|
BOOLEAN ReplaceFileAttributes,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->Overwrite(&FileContext, FileAttributes, ReplaceFileAttributes, AllocationSize,
|
return self->Overwrite(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileAttributes,
|
||||||
|
ReplaceFileAttributes,
|
||||||
|
AllocationSize,
|
||||||
FileInfo);
|
FileInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem0,
|
static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, PWSTR FileName, ULONG Flags)
|
PVOID FullContext,
|
||||||
|
PWSTR FileName,
|
||||||
|
ULONG Flags)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD_VOID(
|
FSP_CPP_EXCEPTION_GUARD_VOID(
|
||||||
return self->Cleanup(&FileContext, FileName, (CLEANUP_FLAGS)Flags);
|
return self->Cleanup(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileName,
|
||||||
|
Flags);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static VOID Close(FSP_FILE_SYSTEM *FileSystem0,
|
static VOID Close(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext)
|
PVOID FullContext)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD_VOID(
|
FSP_CPP_EXCEPTION_GUARD_VOID(
|
||||||
return self->Close(&FileContext);
|
return self->Close(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FullContext,
|
||||||
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->Read(&FileContext, Buffer, Offset, Length, PBytesTransferred);
|
return self->Read(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
Buffer,
|
||||||
|
Offset,
|
||||||
|
Length,
|
||||||
|
PBytesTransferred);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FullContext,
|
||||||
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
PVOID Buffer,
|
||||||
PULONG PBytesTransferred, FILE_INFO *FileInfo)
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
|
BOOLEAN WriteToEndOfFile,
|
||||||
|
BOOLEAN ConstrainedIo,
|
||||||
|
PULONG PBytesTransferred,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->Write(&FileContext, Buffer, Offset, Length, WriteToEndOfFile, ConstrainedIo,
|
return self->Write(
|
||||||
PBytesTransferred, FileInfo);
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
Buffer,
|
||||||
|
Offset,
|
||||||
|
Length,
|
||||||
|
WriteToEndOfFile,
|
||||||
|
ConstrainedIo,
|
||||||
|
PBytesTransferred,
|
||||||
|
FileInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
FILE_INFO *FileInfo)
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->Flush(&FileContext, FileInfo);
|
return self->Flush(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
FILE_INFO *FileInfo)
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetFileInfo(&FileContext, FileInfo);
|
return self->GetFileInfo(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, UINT32 FileAttributes,
|
PVOID FullContext,
|
||||||
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
UINT32 FileAttributes,
|
||||||
FILE_INFO *FileInfo)
|
UINT64 CreationTime,
|
||||||
|
UINT64 LastAccessTime,
|
||||||
|
UINT64 LastWriteTime,
|
||||||
|
UINT64 ChangeTime,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->SetBasicInfo(&FileContext, FileAttributes,
|
return self->SetBasicInfo(
|
||||||
CreationTime, LastAccessTime, LastWriteTime, ChangeTime,
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileAttributes,
|
||||||
|
CreationTime,
|
||||||
|
LastAccessTime,
|
||||||
|
LastWriteTime,
|
||||||
|
ChangeTime,
|
||||||
FileInfo);
|
FileInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
PVOID FullContext,
|
||||||
FILE_INFO *FileInfo)
|
UINT64 NewSize,
|
||||||
|
BOOLEAN SetAllocationSize,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->SetFileSize(&FileContext, NewSize, SetAllocationSize, FileInfo);
|
return self->SetFileSize(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
NewSize,
|
||||||
|
SetAllocationSize,
|
||||||
|
FileInfo);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, PWSTR FileName)
|
PVOID FullContext,
|
||||||
|
PWSTR FileName)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->CanDelete(&FileContext, FileName);
|
return self->CanDelete(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileName);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS Rename(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS Rename(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists)
|
PWSTR FileName,
|
||||||
|
PWSTR NewFileName,
|
||||||
|
BOOLEAN ReplaceIfExists)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->Rename(&FileContext, FileName, NewFileName, ReplaceIfExists);
|
return self->Rename(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileName,
|
||||||
|
NewFileName,
|
||||||
|
ReplaceIfExists);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetSecurity(&FileContext, SecurityDescriptor, PSecurityDescriptorSize);
|
return self->GetSecurity(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
SecurityDescriptor,
|
||||||
|
PSecurityDescriptorSize);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR ModificationDescriptor)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->SetSecurity(&FileContext, SecurityInformation, ModificationDescriptor);
|
return self->SetSecurity(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
SecurityInformation,
|
||||||
|
ModificationDescriptor);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, PWSTR Pattern, PWSTR Marker,
|
PVOID FullContext,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred)
|
PWSTR Pattern,
|
||||||
|
PWSTR Marker,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG Length,
|
||||||
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->ReadDirectory(&FileContext, Pattern, Marker, Buffer, Length, PBytesTransferred);
|
return self->ReadDirectory(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
Pattern,
|
||||||
|
Marker,
|
||||||
|
Buffer,
|
||||||
|
Length,
|
||||||
|
PBytesTransferred);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS ResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS ResolveReparsePoints(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PWSTR FileName, UINT32 ReparsePointIndex, BOOLEAN ResolveLastPathComponent,
|
PWSTR FileName,
|
||||||
PIO_STATUS_BLOCK PIoStatus, PVOID Buffer, PSIZE_T PSize)
|
UINT32 ReparsePointIndex,
|
||||||
|
BOOLEAN ResolveLastPathComponent,
|
||||||
|
PIO_STATUS_BLOCK PIoStatus,
|
||||||
|
PVOID Buffer,
|
||||||
|
PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->ResolveReparsePoints(FileName, ReparsePointIndex, ResolveLastPathComponent,
|
return self->ResolveReparsePoints(
|
||||||
PIoStatus, Buffer, PSize);
|
FileName,
|
||||||
|
ReparsePointIndex,
|
||||||
|
ResolveLastPathComponent,
|
||||||
|
PIoStatus,
|
||||||
|
Buffer,
|
||||||
|
PSize);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS GetReparsePointByName(
|
static NTSTATUS GetReparsePointByName(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
FSP_FILE_SYSTEM *FileSystem0, PVOID Context,
|
PVOID Context,
|
||||||
PWSTR FileName, BOOLEAN IsDirectory, PVOID Buffer, PSIZE_T PSize)
|
PWSTR FileName,
|
||||||
|
BOOLEAN IsDirectory,
|
||||||
|
PVOID Buffer,
|
||||||
|
PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetReparsePointByName(FileName, IsDirectory, Buffer, PSize);
|
return self->GetReparsePointByName(
|
||||||
|
FileName,
|
||||||
|
IsDirectory,
|
||||||
|
Buffer,
|
||||||
|
PSize);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS GetReparsePoint(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS GetReparsePoint(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
PWSTR FileName, PVOID Buffer, PSIZE_T PSize)
|
PWSTR FileName,
|
||||||
|
PVOID Buffer,
|
||||||
|
PSIZE_T PSize)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetReparsePoint(&FileContext, FileName, Buffer, PSize);
|
return self->GetReparsePoint(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileName,
|
||||||
|
Buffer,
|
||||||
|
PSize);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS SetReparsePoint(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS SetReparsePoint(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
PWSTR FileName,
|
||||||
|
PVOID Buffer,
|
||||||
|
SIZE_T Size)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->SetReparsePoint(&FileContext, FileName, Buffer, Size);
|
return self->SetReparsePoint(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileName,
|
||||||
|
Buffer,
|
||||||
|
Size);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS DeleteReparsePoint(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext,
|
PVOID FullContext,
|
||||||
PWSTR FileName, PVOID Buffer, SIZE_T Size)
|
PWSTR FileName,
|
||||||
|
PVOID Buffer,
|
||||||
|
SIZE_T Size)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->DeleteReparsePoint(&FileContext, FileName, Buffer, Size);
|
return self->DeleteReparsePoint(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
FileName,
|
||||||
|
Buffer,
|
||||||
|
Size);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static NTSTATUS GetStreamInfo(FSP_FILE_SYSTEM *FileSystem0,
|
static NTSTATUS GetStreamInfo(FSP_FILE_SYSTEM *FileSystem0,
|
||||||
PVOID FullContext, PVOID Buffer, ULONG Length,
|
PVOID FullContext,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
FileSystem *self = (FileSystem *)FileSystem0->UserContext;
|
||||||
FILE_CONTEXT FileContext;
|
|
||||||
FileContext.FileNode = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext;
|
|
||||||
FileContext.FileDesc = (PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2;
|
|
||||||
FSP_CPP_EXCEPTION_GUARD(
|
FSP_CPP_EXCEPTION_GUARD(
|
||||||
return self->GetStreamInfo(&FileContext, Buffer, Length, PBytesTransferred);
|
return self->GetStreamInfo(
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext,
|
||||||
|
(PVOID)(UINT_PTR)((FSP_FSCTL_TRANSACT_FULL_CONTEXT *)FullContext)->UserContext2,
|
||||||
|
Buffer,
|
||||||
|
Length,
|
||||||
|
PBytesTransferred);
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
static FSP_FILE_SYSTEM_INTERFACE *Interface()
|
static FSP_FILE_SYSTEM_INTERFACE *Interface()
|
||||||
@ -767,7 +945,7 @@ private:
|
|||||||
FileSystem &operator=(const FileSystem &);
|
FileSystem &operator=(const FileSystem &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VOLUME_PARAMS _VolumeParams;
|
VolumeParams _VolumeParams;
|
||||||
FSP_FILE_SYSTEM *_FileSystem;
|
FSP_FILE_SYSTEM *_FileSystem;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -28,91 +28,146 @@
|
|||||||
#define fail(format, ...) Service::Log(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__)
|
#define fail(format, ...) Service::Log(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__)
|
||||||
|
|
||||||
#define ConcatPath(FN, FP) (0 == StringCbPrintfW(FP, sizeof FP, L"%s%s", _Path, FN))
|
#define ConcatPath(FN, FP) (0 == StringCbPrintfW(FP, sizeof FP, L"%s%s", _Path, FN))
|
||||||
#define HandleFromContext(FC) ((PTFS_FILE_DESC *)FileContext->FileDesc)->Handle
|
#define HandleFromFileDesc(FD) ((PtfsFileDesc *)(FD))->Handle
|
||||||
|
|
||||||
using namespace Fsp;
|
using namespace Fsp;
|
||||||
|
|
||||||
class PTFS : public FileSystem
|
class Ptfs : public FileSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PTFS();
|
Ptfs();
|
||||||
~PTFS();
|
~Ptfs();
|
||||||
NTSTATUS SetPath(PWSTR Path);
|
NTSTATUS SetPath(PWSTR Path);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static NTSTATUS GetFileInfoInternal(HANDLE Handle, FILE_INFO *FileInfo);
|
static NTSTATUS GetFileInfoInternal(HANDLE Handle, FileInfo *FileInfo);
|
||||||
NTSTATUS GetVolumeInfo(VOLUME_INFO *VolumeInfo);
|
NTSTATUS GetVolumeInfo(
|
||||||
|
VolumeInfo *VolumeInfo);
|
||||||
NTSTATUS GetSecurityByName(
|
NTSTATUS GetSecurityByName(
|
||||||
PWSTR FileName, PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
PWSTR FileName,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize);
|
PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize);
|
||||||
NTSTATUS Create(
|
NTSTATUS Create(
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
UINT32 CreateOptions,
|
||||||
FILE_CONTEXT *FileContext, OPEN_FILE_INFO *OpenFileInfo);
|
UINT32 GrantedAccess,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
PVOID *PFileNode,
|
||||||
|
PVOID *PFileDesc,
|
||||||
|
OpenFileInfo *OpenFileInfo);
|
||||||
NTSTATUS Open(
|
NTSTATUS Open(
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
FILE_CONTEXT *FileContext, OPEN_FILE_INFO *OpenFileInfo);
|
UINT32 CreateOptions,
|
||||||
|
UINT32 GrantedAccess,
|
||||||
|
PVOID *PFileNode,
|
||||||
|
PVOID *PFileDesc,
|
||||||
|
OpenFileInfo *OpenFileInfo);
|
||||||
NTSTATUS Overwrite(
|
NTSTATUS Overwrite(
|
||||||
const FILE_CONTEXT *FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo);
|
PVOID FileDesc,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
BOOLEAN ReplaceFileAttributes,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
FileInfo *FileInfo);
|
||||||
VOID Cleanup(
|
VOID Cleanup(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR FileName, ULONG Flags);
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
ULONG Flags);
|
||||||
VOID Close(
|
VOID Close(
|
||||||
const FILE_CONTEXT *FileContext);
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc);
|
||||||
NTSTATUS Read(
|
NTSTATUS Read(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
PULONG PBytesTransferred);
|
PULONG PBytesTransferred);
|
||||||
NTSTATUS Write(
|
NTSTATUS Write(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileNode,
|
||||||
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
PVOID FileDesc,
|
||||||
PULONG PBytesTransferred, FILE_INFO *FileInfo);
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
|
BOOLEAN WriteToEndOfFile,
|
||||||
|
BOOLEAN ConstrainedIo,
|
||||||
|
PULONG PBytesTransferred,
|
||||||
|
FileInfo *FileInfo);
|
||||||
NTSTATUS Flush(
|
NTSTATUS Flush(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo);
|
PVOID FileDesc,
|
||||||
|
FileInfo *FileInfo);
|
||||||
NTSTATUS GetFileInfo(
|
NTSTATUS GetFileInfo(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo);
|
PVOID FileDesc,
|
||||||
|
FileInfo *FileInfo);
|
||||||
NTSTATUS SetBasicInfo(
|
NTSTATUS SetBasicInfo(
|
||||||
const FILE_CONTEXT *FileContext, UINT32 FileAttributes,
|
PVOID FileNode,
|
||||||
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
PVOID FileDesc,
|
||||||
FILE_INFO *FileInfo);
|
UINT32 FileAttributes,
|
||||||
|
UINT64 CreationTime,
|
||||||
|
UINT64 LastAccessTime,
|
||||||
|
UINT64 LastWriteTime,
|
||||||
|
UINT64 ChangeTime,
|
||||||
|
FileInfo *FileInfo);
|
||||||
NTSTATUS SetFileSize(
|
NTSTATUS SetFileSize(
|
||||||
const FILE_CONTEXT *FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo);
|
PVOID FileDesc,
|
||||||
|
UINT64 NewSize,
|
||||||
|
BOOLEAN SetAllocationSize,
|
||||||
|
FileInfo *FileInfo);
|
||||||
NTSTATUS CanDelete(
|
NTSTATUS CanDelete(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR FileName);
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName);
|
||||||
NTSTATUS Rename(
|
NTSTATUS Rename(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists);
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
PWSTR NewFileName,
|
||||||
|
BOOLEAN ReplaceIfExists);
|
||||||
NTSTATUS GetSecurity(
|
NTSTATUS GetSecurity(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize);
|
PVOID FileDesc,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize);
|
||||||
NTSTATUS SetSecurity(
|
NTSTATUS SetSecurity(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor);
|
PVOID FileDesc,
|
||||||
|
SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR ModificationDescriptor);
|
||||||
NTSTATUS ReadDirectory(
|
NTSTATUS ReadDirectory(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR Pattern, PWSTR Marker,
|
PVOID FileNode,
|
||||||
PVOID Buffer, ULONG Length, PULONG PBytesTransferred);
|
PVOID FileDesc,
|
||||||
|
PWSTR Pattern,
|
||||||
|
PWSTR Marker,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG Length,
|
||||||
|
PULONG PBytesTransferred);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PWSTR _Path;
|
PWSTR _Path;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PTFS_FILE_DESC
|
struct PtfsFileDesc
|
||||||
{
|
{
|
||||||
PTFS_FILE_DESC() : Handle(INVALID_HANDLE_VALUE), DirBuffer()
|
PtfsFileDesc() : Handle(INVALID_HANDLE_VALUE), DirBuffer()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
~PTFS_FILE_DESC()
|
~PtfsFileDesc()
|
||||||
{
|
{
|
||||||
CloseHandle(Handle);
|
CloseHandle(Handle);
|
||||||
PTFS::DeleteDirectoryBuffer(&DirBuffer);
|
Ptfs::DeleteDirectoryBuffer(&DirBuffer);
|
||||||
}
|
}
|
||||||
HANDLE Handle;
|
HANDLE Handle;
|
||||||
PVOID DirBuffer;
|
PVOID DirBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
PTFS::PTFS() : FileSystem(), _Path()
|
Ptfs::Ptfs() : FileSystem(), _Path()
|
||||||
{
|
{
|
||||||
SetSectorSize(ALLOCATION_UNIT);
|
SetSectorSize(ALLOCATION_UNIT);
|
||||||
SetSectorsPerAllocationUnit(1);
|
SetSectorsPerAllocationUnit(1);
|
||||||
@ -125,12 +180,12 @@ PTFS::PTFS() : FileSystem(), _Path()
|
|||||||
SetPassQueryDirectoryPattern(TRUE);
|
SetPassQueryDirectoryPattern(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
PTFS::~PTFS()
|
Ptfs::~Ptfs()
|
||||||
{
|
{
|
||||||
delete[] _Path;
|
delete[] _Path;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::SetPath(PWSTR Path)
|
NTSTATUS Ptfs::SetPath(PWSTR Path)
|
||||||
{
|
{
|
||||||
WCHAR FullPath[MAX_PATH];
|
WCHAR FullPath[MAX_PATH];
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
@ -173,7 +228,7 @@ NTSTATUS PTFS::SetPath(PWSTR Path)
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::GetFileInfoInternal(HANDLE Handle, FILE_INFO *FileInfo)
|
NTSTATUS Ptfs::GetFileInfoInternal(HANDLE Handle, FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
BY_HANDLE_FILE_INFORMATION ByHandleFileInfo;
|
BY_HANDLE_FILE_INFORMATION ByHandleFileInfo;
|
||||||
|
|
||||||
@ -196,7 +251,8 @@ NTSTATUS PTFS::GetFileInfoInternal(HANDLE Handle, FILE_INFO *FileInfo)
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::GetVolumeInfo(VOLUME_INFO *VolumeInfo)
|
NTSTATUS Ptfs::GetVolumeInfo(
|
||||||
|
VolumeInfo *VolumeInfo)
|
||||||
{
|
{
|
||||||
WCHAR Root[MAX_PATH];
|
WCHAR Root[MAX_PATH];
|
||||||
ULARGE_INTEGER TotalSize, FreeSize;
|
ULARGE_INTEGER TotalSize, FreeSize;
|
||||||
@ -213,9 +269,11 @@ NTSTATUS PTFS::GetVolumeInfo(VOLUME_INFO *VolumeInfo)
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::GetSecurityByName(
|
NTSTATUS Ptfs::GetSecurityByName(
|
||||||
PWSTR FileName, PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
PWSTR FileName,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PUINT32 PFileAttributes/* or ReparsePointIndex */,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
HANDLE Handle;
|
HANDLE Handle;
|
||||||
@ -270,20 +328,26 @@ exit:
|
|||||||
return Result;
|
return Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Create(
|
NTSTATUS Ptfs::Create(
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
UINT32 FileAttributes, PSECURITY_DESCRIPTOR SecurityDescriptor, UINT64 AllocationSize,
|
UINT32 CreateOptions,
|
||||||
FILE_CONTEXT *FileContext, OPEN_FILE_INFO *OpenFileInfo)
|
UINT32 GrantedAccess,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
PVOID *PFileNode,
|
||||||
|
PVOID *PFileDesc,
|
||||||
|
OpenFileInfo *OpenFileInfo)
|
||||||
{
|
{
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
SECURITY_ATTRIBUTES SecurityAttributes;
|
SECURITY_ATTRIBUTES SecurityAttributes;
|
||||||
ULONG CreateFlags;
|
ULONG CreateFlags;
|
||||||
PTFS_FILE_DESC *FileDesc;
|
PtfsFileDesc *FileDesc;
|
||||||
|
|
||||||
if (!ConcatPath(FileName, FullPath))
|
if (!ConcatPath(FileName, FullPath))
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
|
|
||||||
FileDesc = new PTFS_FILE_DESC;
|
FileDesc = new PtfsFileDesc;
|
||||||
|
|
||||||
SecurityAttributes.nLength = sizeof SecurityAttributes;
|
SecurityAttributes.nLength = sizeof SecurityAttributes;
|
||||||
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
||||||
@ -319,23 +383,27 @@ NTSTATUS PTFS::Create(
|
|||||||
return NtStatusFromWin32(GetLastError());
|
return NtStatusFromWin32(GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
FileContext->FileDesc = FileDesc;
|
*PFileDesc = FileDesc;
|
||||||
|
|
||||||
return GetFileInfoInternal(FileDesc->Handle, &OpenFileInfo->FileInfo);
|
return GetFileInfoInternal(FileDesc->Handle, &OpenFileInfo->FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Open(
|
NTSTATUS Ptfs::Open(
|
||||||
PWSTR FileName, UINT32 CreateOptions, UINT32 GrantedAccess,
|
PWSTR FileName,
|
||||||
FILE_CONTEXT *FileContext, OPEN_FILE_INFO *OpenFileInfo)
|
UINT32 CreateOptions,
|
||||||
|
UINT32 GrantedAccess,
|
||||||
|
PVOID *PFileNode,
|
||||||
|
PVOID *PFileDesc,
|
||||||
|
OpenFileInfo *OpenFileInfo)
|
||||||
{
|
{
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
ULONG CreateFlags;
|
ULONG CreateFlags;
|
||||||
PTFS_FILE_DESC *FileDesc;
|
PtfsFileDesc *FileDesc;
|
||||||
|
|
||||||
if (!ConcatPath(FileName, FullPath))
|
if (!ConcatPath(FileName, FullPath))
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
|
|
||||||
FileDesc = new PTFS_FILE_DESC;
|
FileDesc = new PtfsFileDesc;
|
||||||
|
|
||||||
CreateFlags = FILE_FLAG_BACKUP_SEMANTICS;
|
CreateFlags = FILE_FLAG_BACKUP_SEMANTICS;
|
||||||
if (CreateOptions & FILE_DELETE_ON_CLOSE)
|
if (CreateOptions & FILE_DELETE_ON_CLOSE)
|
||||||
@ -350,16 +418,20 @@ NTSTATUS PTFS::Open(
|
|||||||
return NtStatusFromWin32(GetLastError());
|
return NtStatusFromWin32(GetLastError());
|
||||||
}
|
}
|
||||||
|
|
||||||
FileContext->FileDesc = FileDesc;
|
*PFileDesc = FileDesc;
|
||||||
|
|
||||||
return GetFileInfoInternal(FileDesc->Handle, &OpenFileInfo->FileInfo);
|
return GetFileInfoInternal(FileDesc->Handle, &OpenFileInfo->FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Overwrite(
|
NTSTATUS Ptfs::Overwrite(
|
||||||
const FILE_CONTEXT *FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
UINT32 FileAttributes,
|
||||||
|
BOOLEAN ReplaceFileAttributes,
|
||||||
|
UINT64 AllocationSize,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
FILE_BASIC_INFO BasicInfo = { 0 };
|
FILE_BASIC_INFO BasicInfo = { 0 };
|
||||||
FILE_ALLOCATION_INFO AllocationInfo = { 0 };
|
FILE_ALLOCATION_INFO AllocationInfo = { 0 };
|
||||||
FILE_ATTRIBUTE_TAG_INFO AttributeTagInfo;
|
FILE_ATTRIBUTE_TAG_INFO AttributeTagInfo;
|
||||||
@ -396,33 +468,41 @@ NTSTATUS PTFS::Overwrite(
|
|||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PTFS::Cleanup(
|
VOID Ptfs::Cleanup(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR FileName, ULONG Flags)
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
ULONG Flags)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
|
|
||||||
if (Flags & CleanupDelete)
|
if (Flags & CleanupDelete)
|
||||||
{
|
{
|
||||||
CloseHandle(Handle);
|
CloseHandle(Handle);
|
||||||
|
|
||||||
/* this will make all future uses of Handle to fail with STATUS_INVALID_HANDLE */
|
/* this will make all future uses of Handle to fail with STATUS_INVALID_HANDLE */
|
||||||
HandleFromContext(FileContext) = INVALID_HANDLE_VALUE;
|
HandleFromFileDesc(FileDesc) = INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VOID PTFS::Close(
|
VOID Ptfs::Close(
|
||||||
const FILE_CONTEXT *FileContext)
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc0)
|
||||||
{
|
{
|
||||||
PTFS_FILE_DESC *FileDesc = (PTFS_FILE_DESC *)FileContext->FileDesc;
|
PtfsFileDesc *FileDesc = (PtfsFileDesc *)FileDesc0;
|
||||||
|
|
||||||
delete FileDesc;
|
delete FileDesc;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Read(
|
NTSTATUS Ptfs::Read(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
OVERLAPPED Overlapped = { 0 };
|
OVERLAPPED Overlapped = { 0 };
|
||||||
|
|
||||||
Overlapped.Offset = (DWORD)Offset;
|
Overlapped.Offset = (DWORD)Offset;
|
||||||
@ -434,12 +514,18 @@ NTSTATUS PTFS::Read(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Write(
|
NTSTATUS Ptfs::Write(
|
||||||
const FILE_CONTEXT *FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileNode,
|
||||||
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
PVOID FileDesc,
|
||||||
PULONG PBytesTransferred, FILE_INFO *FileInfo)
|
PVOID Buffer,
|
||||||
|
UINT64 Offset,
|
||||||
|
ULONG Length,
|
||||||
|
BOOLEAN WriteToEndOfFile,
|
||||||
|
BOOLEAN ConstrainedIo,
|
||||||
|
PULONG PBytesTransferred,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
LARGE_INTEGER FileSize;
|
LARGE_INTEGER FileSize;
|
||||||
OVERLAPPED Overlapped = { 0 };
|
OVERLAPPED Overlapped = { 0 };
|
||||||
|
|
||||||
@ -463,11 +549,12 @@ NTSTATUS PTFS::Write(
|
|||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Flush(
|
NTSTATUS Ptfs::Flush(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
|
|
||||||
/* we do not flush the whole volume, so just return SUCCESS */
|
/* we do not flush the whole volume, so just return SUCCESS */
|
||||||
if (0 == Handle)
|
if (0 == Handle)
|
||||||
@ -479,21 +566,27 @@ NTSTATUS PTFS::Flush(
|
|||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::GetFileInfo(
|
NTSTATUS Ptfs::GetFileInfo(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
|
|
||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::SetBasicInfo(
|
NTSTATUS Ptfs::SetBasicInfo(
|
||||||
const FILE_CONTEXT *FileContext, UINT32 FileAttributes,
|
PVOID FileNode,
|
||||||
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
PVOID FileDesc,
|
||||||
FILE_INFO *FileInfo)
|
UINT32 FileAttributes,
|
||||||
|
UINT64 CreationTime,
|
||||||
|
UINT64 LastAccessTime,
|
||||||
|
UINT64 LastWriteTime,
|
||||||
|
UINT64 ChangeTime,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
FILE_BASIC_INFO BasicInfo = { 0 };
|
FILE_BASIC_INFO BasicInfo = { 0 };
|
||||||
|
|
||||||
if (INVALID_FILE_ATTRIBUTES == FileAttributes)
|
if (INVALID_FILE_ATTRIBUTES == FileAttributes)
|
||||||
@ -514,11 +607,14 @@ NTSTATUS PTFS::SetBasicInfo(
|
|||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::SetFileSize(
|
NTSTATUS Ptfs::SetFileSize(
|
||||||
const FILE_CONTEXT *FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
PVOID FileNode,
|
||||||
FILE_INFO *FileInfo)
|
PVOID FileDesc,
|
||||||
|
UINT64 NewSize,
|
||||||
|
BOOLEAN SetAllocationSize,
|
||||||
|
FileInfo *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
FILE_ALLOCATION_INFO AllocationInfo;
|
FILE_ALLOCATION_INFO AllocationInfo;
|
||||||
FILE_END_OF_FILE_INFO EndOfFileInfo;
|
FILE_END_OF_FILE_INFO EndOfFileInfo;
|
||||||
|
|
||||||
@ -553,10 +649,12 @@ NTSTATUS PTFS::SetFileSize(
|
|||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::CanDelete(
|
NTSTATUS Ptfs::CanDelete(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR FileName)
|
PVOID FileNode,
|
||||||
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
FILE_DISPOSITION_INFO DispositionInfo;
|
FILE_DISPOSITION_INFO DispositionInfo;
|
||||||
|
|
||||||
DispositionInfo.DeleteFile = TRUE;
|
DispositionInfo.DeleteFile = TRUE;
|
||||||
@ -568,9 +666,12 @@ NTSTATUS PTFS::CanDelete(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::Rename(
|
NTSTATUS Ptfs::Rename(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PWSTR FileName, PWSTR NewFileName, BOOLEAN ReplaceIfExists)
|
PVOID FileDesc,
|
||||||
|
PWSTR FileName,
|
||||||
|
PWSTR NewFileName,
|
||||||
|
BOOLEAN ReplaceIfExists)
|
||||||
{
|
{
|
||||||
WCHAR FullPath[FULLPATH_SIZE], NewFullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE], NewFullPath[FULLPATH_SIZE];
|
||||||
|
|
||||||
@ -586,11 +687,13 @@ NTSTATUS PTFS::Rename(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::GetSecurity(
|
NTSTATUS Ptfs::GetSecurity(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PVOID FileDesc,
|
||||||
|
PSECURITY_DESCRIPTOR SecurityDescriptor,
|
||||||
|
SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
DWORD SecurityDescriptorSizeNeeded;
|
DWORD SecurityDescriptorSizeNeeded;
|
||||||
|
|
||||||
if (!GetKernelObjectSecurity(Handle,
|
if (!GetKernelObjectSecurity(Handle,
|
||||||
@ -606,11 +709,13 @@ NTSTATUS PTFS::GetSecurity(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::SetSecurity(
|
NTSTATUS Ptfs::SetSecurity(
|
||||||
const FILE_CONTEXT *FileContext,
|
PVOID FileNode,
|
||||||
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
PVOID FileDesc,
|
||||||
|
SECURITY_INFORMATION SecurityInformation,
|
||||||
|
PSECURITY_DESCRIPTOR ModificationDescriptor)
|
||||||
{
|
{
|
||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromFileDesc(FileDesc);
|
||||||
|
|
||||||
if (!SetKernelObjectSecurity(Handle, SecurityInformation, ModificationDescriptor))
|
if (!SetKernelObjectSecurity(Handle, SecurityInformation, ModificationDescriptor))
|
||||||
return NtStatusFromWin32(GetLastError());
|
return NtStatusFromWin32(GetLastError());
|
||||||
@ -618,11 +723,16 @@ NTSTATUS PTFS::SetSecurity(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS::ReadDirectory(
|
NTSTATUS Ptfs::ReadDirectory(
|
||||||
const FILE_CONTEXT *FileContext, PWSTR Pattern, PWSTR Marker,
|
PVOID FileNode,
|
||||||
PVOID Buffer, ULONG BufferLength, PULONG PBytesTransferred)
|
PVOID FileDesc0,
|
||||||
|
PWSTR Pattern,
|
||||||
|
PWSTR Marker,
|
||||||
|
PVOID Buffer,
|
||||||
|
ULONG BufferLength,
|
||||||
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
PTFS_FILE_DESC *FileDesc = (PTFS_FILE_DESC *)FileContext->FileDesc;
|
PtfsFileDesc *FileDesc = (PtfsFileDesc *)FileDesc0;
|
||||||
HANDLE Handle = FileDesc->Handle;
|
HANDLE Handle = FileDesc->Handle;
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
ULONG Length, PatternLength;
|
ULONG Length, PatternLength;
|
||||||
@ -630,10 +740,10 @@ NTSTATUS PTFS::ReadDirectory(
|
|||||||
WIN32_FIND_DATAW FindData;
|
WIN32_FIND_DATAW FindData;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
UINT8 B[FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) + MAX_PATH * sizeof(WCHAR)];
|
UINT8 B[FIELD_OFFSET(FileSystem::DirInfo, FileNameBuf) + MAX_PATH * sizeof(WCHAR)];
|
||||||
FSP_FSCTL_DIR_INFO D;
|
FileSystem::DirInfo D;
|
||||||
} DirInfoBuf;
|
} DirInfoBuf;
|
||||||
FSP_FSCTL_DIR_INFO *DirInfo = &DirInfoBuf.D;
|
FileSystem::DirInfo *DirInfo = &DirInfoBuf.D;
|
||||||
NTSTATUS DirBufferResult;
|
NTSTATUS DirBufferResult;
|
||||||
|
|
||||||
DirBufferResult = STATUS_SUCCESS;
|
DirBufferResult = STATUS_SUCCESS;
|
||||||
@ -666,7 +776,8 @@ NTSTATUS PTFS::ReadDirectory(
|
|||||||
{
|
{
|
||||||
memset(DirInfo, 0, sizeof *DirInfo);
|
memset(DirInfo, 0, sizeof *DirInfo);
|
||||||
Length = (ULONG)wcslen(FindData.cFileName);
|
Length = (ULONG)wcslen(FindData.cFileName);
|
||||||
DirInfo->Size = (UINT16)(FIELD_OFFSET(FSP_FSCTL_DIR_INFO, FileNameBuf) + Length * sizeof(WCHAR));
|
DirInfo->Size = (UINT16)(FIELD_OFFSET(FileSystem::DirInfo, FileNameBuf) +
|
||||||
|
Length * sizeof(WCHAR));
|
||||||
DirInfo->FileInfo.FileAttributes = FindData.dwFileAttributes;
|
DirInfo->FileInfo.FileAttributes = FindData.dwFileAttributes;
|
||||||
DirInfo->FileInfo.ReparseTag = 0;
|
DirInfo->FileInfo.ReparseTag = 0;
|
||||||
DirInfo->FileInfo.FileSize =
|
DirInfo->FileInfo.FileSize =
|
||||||
@ -700,17 +811,17 @@ NTSTATUS PTFS::ReadDirectory(
|
|||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
class PTFS_SERVICE : public Service
|
class PtfsService : public Service
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PTFS_SERVICE();
|
PtfsService();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
NTSTATUS OnStart(ULONG Argc, PWSTR *Argv);
|
NTSTATUS OnStart(ULONG Argc, PWSTR *Argv);
|
||||||
NTSTATUS OnStop();
|
NTSTATUS OnStop();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
PTFS *_Ptfs;
|
Ptfs *_Ptfs;
|
||||||
};
|
};
|
||||||
|
|
||||||
static NTSTATUS EnableBackupRestorePrivileges(VOID)
|
static NTSTATUS EnableBackupRestorePrivileges(VOID)
|
||||||
@ -752,11 +863,11 @@ static ULONG wcstol_deflt(wchar_t *w, ULONG deflt)
|
|||||||
return L'\0' != w[0] && L'\0' == *endp ? ul : deflt;
|
return L'\0' != w[0] && L'\0' == *endp ? ul : deflt;
|
||||||
}
|
}
|
||||||
|
|
||||||
PTFS_SERVICE::PTFS_SERVICE() : Service(L"" PROGNAME), _Ptfs(0)
|
PtfsService::PtfsService() : Service(L"" PROGNAME), _Ptfs(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS_SERVICE::OnStart(ULONG argc, PWSTR *argv)
|
NTSTATUS PtfsService::OnStart(ULONG argc, PWSTR *argv)
|
||||||
{
|
{
|
||||||
#define argtos(v) if (arge > ++argp) v = *argp; else goto usage
|
#define argtos(v) if (arge > ++argp) v = *argp; else goto usage
|
||||||
#define argtol(v) if (arge > ++argp) v = wcstol_deflt(*argp, v); else goto usage
|
#define argtol(v) if (arge > ++argp) v = wcstol_deflt(*argp, v); else goto usage
|
||||||
@ -769,7 +880,7 @@ NTSTATUS PTFS_SERVICE::OnStart(ULONG argc, PWSTR *argv)
|
|||||||
PWSTR MountPoint = 0;
|
PWSTR MountPoint = 0;
|
||||||
HANDLE DebugLogHandle = INVALID_HANDLE_VALUE;
|
HANDLE DebugLogHandle = INVALID_HANDLE_VALUE;
|
||||||
WCHAR PassThroughBuf[MAX_PATH];
|
WCHAR PassThroughBuf[MAX_PATH];
|
||||||
PTFS *Ptfs = 0;
|
::Ptfs *Ptfs = 0;
|
||||||
NTSTATUS Result;
|
NTSTATUS Result;
|
||||||
|
|
||||||
for (argp = argv + 1, arge = argv + argc; arge > argp; argp++)
|
for (argp = argv + 1, arge = argv + argc; arge > argp; argp++)
|
||||||
@ -851,7 +962,7 @@ NTSTATUS PTFS_SERVICE::OnStart(ULONG argc, PWSTR *argv)
|
|||||||
FspDebugLogSetHandle(DebugLogHandle);
|
FspDebugLogSetHandle(DebugLogHandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ptfs = new PTFS;
|
Ptfs = new ::Ptfs;
|
||||||
|
|
||||||
Ptfs->SetPrefix(VolumePrefix);
|
Ptfs->SetPrefix(VolumePrefix);
|
||||||
|
|
||||||
@ -906,7 +1017,7 @@ usage:
|
|||||||
#undef argtol
|
#undef argtol
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS PTFS_SERVICE::OnStop()
|
NTSTATUS PtfsService::OnStop()
|
||||||
{
|
{
|
||||||
_Ptfs->Unmount();
|
_Ptfs->Unmount();
|
||||||
delete _Ptfs;
|
delete _Ptfs;
|
||||||
@ -917,5 +1028,5 @@ NTSTATUS PTFS_SERVICE::OnStop()
|
|||||||
|
|
||||||
int wmain(int argc, wchar_t **argv)
|
int wmain(int argc, wchar_t **argv)
|
||||||
{
|
{
|
||||||
return PTFS_SERVICE().Run();
|
return PtfsService().Run();
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@
|
|||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc;..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -118,7 +118,7 @@
|
|||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc;..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -137,7 +137,7 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc;..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -158,7 +158,7 @@
|
|||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc;..\..\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user