tst: passthrough file system: WIP

This commit is contained in:
Bill Zissimopoulos 2017-01-20 13:05:22 -08:00
parent d519145f61
commit eea92e89ef

View File

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