inc: winfsp.hpp: improve C++ layer

This commit is contained in:
Bill Zissimopoulos 2017-04-13 18:23:55 -07:00
parent c144d4d303
commit d5802f3a5f
3 changed files with 614 additions and 325 deletions

View File

@ -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;
}; };

View File

@ -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();
} }

View File

@ -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>