mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-23 08:53:01 -05:00
tst: passthrough file system: WIP
This commit is contained in:
parent
d519145f61
commit
eea92e89ef
@ -26,13 +26,19 @@
|
|||||||
#define warn(format, ...) FspServiceLog(EVENTLOG_WARNING_TYPE, format, __VA_ARGS__)
|
#define warn(format, ...) FspServiceLog(EVENTLOG_WARNING_TYPE, format, __VA_ARGS__)
|
||||||
#define fail(format, ...) FspServiceLog(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__)
|
#define fail(format, ...) FspServiceLog(EVENTLOG_ERROR_TYPE, format, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define ConcatPath(Ptfs, FN, FP) (0 == StringCbPrintfW(FP, sizeof FP, L"%s%s", Ptfs->Path, FN))
|
||||||
|
#define HandleFromContext(FC) (((PTFS_FILE_CONTEXT *)(FC))->Handle)
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
FSP_FILE_SYSTEM *FileSystem;
|
FSP_FILE_SYSTEM *FileSystem;
|
||||||
PWSTR Path;
|
PWSTR Path;
|
||||||
} PTFS;
|
} PTFS;
|
||||||
|
|
||||||
#define ConcatPath(Ptfs, FN, FP) (0 == StringCbPrintfW(FP, sizeof FP, L"%s%s", Ptfs->Path, FN))
|
typedef struct
|
||||||
|
{
|
||||||
|
HANDLE Handle;
|
||||||
|
} PTFS_FILE_CONTEXT;
|
||||||
|
|
||||||
static NTSTATUS GetFileInfoInternal(HANDLE Handle, FSP_FSCTL_FILE_INFO *FileInfo)
|
static NTSTATUS GetFileInfoInternal(HANDLE Handle, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
@ -151,11 +157,15 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
SECURITY_ATTRIBUTES SecurityAttributes;
|
SECURITY_ATTRIBUTES SecurityAttributes;
|
||||||
ULONG CreateDirectory;
|
ULONG CreateDirectory;
|
||||||
HANDLE Handle;
|
PTFS_FILE_CONTEXT *FileContext;
|
||||||
|
|
||||||
if (!ConcatPath(Ptfs, FileName, FullPath))
|
if (!ConcatPath(Ptfs, FileName, FullPath))
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
|
|
||||||
|
FileContext = malloc(sizeof *FileContext);
|
||||||
|
if (0 == FileContext)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
SecurityAttributes.nLength = sizeof SecurityAttributes;
|
SecurityAttributes.nLength = sizeof SecurityAttributes;
|
||||||
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
||||||
SecurityAttributes.bInheritHandle = FALSE;
|
SecurityAttributes.bInheritHandle = FALSE;
|
||||||
@ -174,15 +184,18 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (0 == FileAttributes)
|
if (0 == FileAttributes)
|
||||||
FileAttributes = FILE_ATTRIBUTE_NORMAL;
|
FileAttributes = FILE_ATTRIBUTE_NORMAL;
|
||||||
|
|
||||||
Handle = CreateFileW(FullPath,
|
FileContext->Handle = CreateFileW(FullPath,
|
||||||
GrantedAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, &SecurityAttributes,
|
GrantedAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, &SecurityAttributes,
|
||||||
CREATE_NEW, FileAttributes | CreateDirectory | FILE_FLAG_BACKUP_SEMANTICS, 0);
|
CREATE_NEW, FileAttributes | CreateDirectory | FILE_FLAG_BACKUP_SEMANTICS, 0);
|
||||||
if (INVALID_HANDLE_VALUE == Handle)
|
if (INVALID_HANDLE_VALUE == FileContext->Handle)
|
||||||
|
{
|
||||||
|
free(FileContext);
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
*PFileContext = Handle;
|
*PFileContext = FileContext;
|
||||||
|
|
||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(FileContext->Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem,
|
||||||
@ -191,27 +204,34 @@ static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
{
|
{
|
||||||
PTFS *Ptfs = (PTFS *)FileSystem->UserContext;
|
PTFS *Ptfs = (PTFS *)FileSystem->UserContext;
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
HANDLE Handle;
|
PTFS_FILE_CONTEXT *FileContext;
|
||||||
|
|
||||||
if (!ConcatPath(Ptfs, FileName, FullPath))
|
if (!ConcatPath(Ptfs, FileName, FullPath))
|
||||||
return STATUS_OBJECT_NAME_INVALID;
|
return STATUS_OBJECT_NAME_INVALID;
|
||||||
|
|
||||||
Handle = CreateFileW(FullPath,
|
FileContext = malloc(sizeof *FileContext);
|
||||||
|
if (0 == FileContext)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
FileContext->Handle = CreateFileW(FullPath,
|
||||||
GrantedAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0,
|
GrantedAccess, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, 0,
|
||||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
||||||
if (INVALID_HANDLE_VALUE == Handle)
|
if (INVALID_HANDLE_VALUE == FileContext->Handle)
|
||||||
|
{
|
||||||
|
free(FileContext);
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
|
}
|
||||||
|
|
||||||
*PFileContext = Handle;
|
*PFileContext = FileContext;
|
||||||
|
|
||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(FileContext->Handle, FileInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
PVOID FileContext, UINT32 FileAttributes, BOOLEAN ReplaceFileAttributes, UINT64 AllocationSize,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
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;
|
||||||
@ -248,24 +268,32 @@ static NTSTATUS Overwrite(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem,
|
static VOID Cleanup(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, PWSTR FileName, ULONG Flags)
|
PVOID FileContext, PWSTR FileName, ULONG Flags)
|
||||||
{
|
{
|
||||||
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
|
|
||||||
if (Flags & FspCleanupDelete)
|
if (Flags & FspCleanupDelete)
|
||||||
{
|
{
|
||||||
|
CloseHandle(Handle);
|
||||||
|
|
||||||
|
/* this will make all future uses of Handle to fail with STATUS_INVALID_HANDLE */
|
||||||
|
HandleFromContext(FileContext) = INVALID_HANDLE_VALUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID Close(FSP_FILE_SYSTEM *FileSystem,
|
static VOID Close(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext)
|
PVOID FileContext)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
|
|
||||||
CloseHandle(Handle);
|
CloseHandle(Handle);
|
||||||
|
|
||||||
|
free(FileContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS Read(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
PVOID FileContext, PVOID Buffer, UINT64 Offset, ULONG Length,
|
||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
OVERLAPPED Overlapped = { 0 };
|
OVERLAPPED Overlapped = { 0 };
|
||||||
|
|
||||||
Overlapped.Offset = (DWORD)Offset;
|
Overlapped.Offset = (DWORD)Offset;
|
||||||
@ -282,7 +310,7 @@ static NTSTATUS Write(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
BOOLEAN WriteToEndOfFile, BOOLEAN ConstrainedIo,
|
||||||
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
|
PULONG PBytesTransferred, FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
LARGE_INTEGER FileSize;
|
LARGE_INTEGER FileSize;
|
||||||
OVERLAPPED Overlapped = { 0 };
|
OVERLAPPED Overlapped = { 0 };
|
||||||
|
|
||||||
@ -310,7 +338,7 @@ NTSTATUS Flush(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PVOID FileContext,
|
PVOID FileContext,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
|
|
||||||
/* 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)
|
||||||
@ -326,7 +354,7 @@ static NTSTATUS GetFileInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PVOID FileContext,
|
PVOID FileContext,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
|
|
||||||
return GetFileInfoInternal(Handle, FileInfo);
|
return GetFileInfoInternal(Handle, FileInfo);
|
||||||
}
|
}
|
||||||
@ -336,7 +364,7 @@ static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
UINT64 CreationTime, UINT64 LastAccessTime, UINT64 LastWriteTime, UINT64 ChangeTime,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
FILE_BASIC_INFO BasicInfo = { 0 };
|
FILE_BASIC_INFO BasicInfo = { 0 };
|
||||||
|
|
||||||
BasicInfo.FileAttributes = INVALID_FILE_ATTRIBUTES != FileAttributes ? FileAttributes : 0;
|
BasicInfo.FileAttributes = INVALID_FILE_ATTRIBUTES != FileAttributes ? FileAttributes : 0;
|
||||||
@ -356,7 +384,7 @@ static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PVOID FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
PVOID FileContext, UINT64 NewSize, BOOLEAN SetAllocationSize,
|
||||||
FSP_FSCTL_FILE_INFO *FileInfo)
|
FSP_FSCTL_FILE_INFO *FileInfo)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
FILE_ALLOCATION_INFO AllocationInfo;
|
FILE_ALLOCATION_INFO AllocationInfo;
|
||||||
FILE_END_OF_FILE_INFO EndOfFileInfo;
|
FILE_END_OF_FILE_INFO EndOfFileInfo;
|
||||||
|
|
||||||
@ -394,7 +422,7 @@ static NTSTATUS SetFileSize(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
static NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
static NTSTATUS CanDelete(FSP_FILE_SYSTEM *FileSystem,
|
||||||
PVOID FileContext, PWSTR FileName)
|
PVOID FileContext, PWSTR FileName)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
FILE_DISPOSITION_INFO DispositionInfo;
|
FILE_DISPOSITION_INFO DispositionInfo;
|
||||||
|
|
||||||
DispositionInfo.DeleteFile = TRUE;
|
DispositionInfo.DeleteFile = TRUE;
|
||||||
@ -417,7 +445,7 @@ static NTSTATUS GetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PVOID FileContext,
|
PVOID FileContext,
|
||||||
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
PSECURITY_DESCRIPTOR SecurityDescriptor, SIZE_T *PSecurityDescriptorSize)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
DWORD SecurityDescriptorSizeNeeded;
|
DWORD SecurityDescriptorSizeNeeded;
|
||||||
|
|
||||||
if (!GetKernelObjectSecurity(Handle,
|
if (!GetKernelObjectSecurity(Handle,
|
||||||
@ -437,7 +465,7 @@ static NTSTATUS SetSecurity(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PVOID FileContext,
|
PVOID FileContext,
|
||||||
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR ModificationDescriptor)
|
||||||
{
|
{
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
|
|
||||||
if (!SetKernelObjectSecurity(Handle, SecurityInformation, ModificationDescriptor))
|
if (!SetKernelObjectSecurity(Handle, SecurityInformation, ModificationDescriptor))
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
@ -451,7 +479,7 @@ static NTSTATUS ReadDirectory(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PULONG PBytesTransferred)
|
PULONG PBytesTransferred)
|
||||||
{
|
{
|
||||||
PTFS *Ptfs = (PTFS *)FileSystem->UserContext;
|
PTFS *Ptfs = (PTFS *)FileSystem->UserContext;
|
||||||
HANDLE Handle = FileContext;
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
ULONG Length, PatternLength;
|
ULONG Length, PatternLength;
|
||||||
HANDLE FindHandle;
|
HANDLE FindHandle;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user