mirror of
https://github.com/winfsp/winfsp.git
synced 2025-04-22 16:33:02 -05:00
tst: passthrough: testing
This commit is contained in:
parent
53a4bdc478
commit
2ced698256
@ -156,7 +156,7 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
PTFS *Ptfs = (PTFS *)FileSystem->UserContext;
|
PTFS *Ptfs = (PTFS *)FileSystem->UserContext;
|
||||||
WCHAR FullPath[FULLPATH_SIZE];
|
WCHAR FullPath[FULLPATH_SIZE];
|
||||||
SECURITY_ATTRIBUTES SecurityAttributes;
|
SECURITY_ATTRIBUTES SecurityAttributes;
|
||||||
ULONG CreateDirectory;
|
ULONG CreateFlags;
|
||||||
PTFS_FILE_CONTEXT *FileContext;
|
PTFS_FILE_CONTEXT *FileContext;
|
||||||
|
|
||||||
if (!ConcatPath(Ptfs, FileName, FullPath))
|
if (!ConcatPath(Ptfs, FileName, FullPath))
|
||||||
@ -170,23 +170,30 @@ static NTSTATUS Create(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
SecurityAttributes.lpSecurityDescriptor = SecurityDescriptor;
|
||||||
SecurityAttributes.bInheritHandle = FALSE;
|
SecurityAttributes.bInheritHandle = FALSE;
|
||||||
|
|
||||||
|
CreateFlags = FILE_FLAG_BACKUP_SEMANTICS;
|
||||||
|
if (CreateOptions & FILE_DELETE_ON_CLOSE)
|
||||||
|
CreateFlags |= FILE_FLAG_DELETE_ON_CLOSE;
|
||||||
|
|
||||||
|
if (CreateOptions & FILE_DIRECTORY_FILE)
|
||||||
|
{
|
||||||
/*
|
/*
|
||||||
* It is not widely known but CreateFileW can be used to create directories!
|
* It is not widely known but CreateFileW can be used to create directories!
|
||||||
* It requires the specification of both FILE_FLAG_BACKUP_SEMANTICS and
|
* It requires the specification of both FILE_FLAG_BACKUP_SEMANTICS and
|
||||||
* FILE_FLAG_POSIX_SEMANTICS. It also requires that FileAttributes has
|
* FILE_FLAG_POSIX_SEMANTICS. It also requires that FileAttributes has
|
||||||
* FILE_ATTRIBUTE_DIRECTORY set.
|
* FILE_ATTRIBUTE_DIRECTORY set.
|
||||||
*/
|
*/
|
||||||
CreateDirectory = (CreateOptions & FILE_DIRECTORY_FILE) ? FILE_FLAG_POSIX_SEMANTICS : 0;
|
CreateFlags |= FILE_FLAG_POSIX_SEMANTICS;
|
||||||
if (CreateDirectory)
|
|
||||||
FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
|
FileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
FileAttributes &= ~FILE_ATTRIBUTE_DIRECTORY;
|
||||||
|
|
||||||
if (0 == FileAttributes)
|
if (0 == FileAttributes)
|
||||||
FileAttributes = FILE_ATTRIBUTE_NORMAL;
|
FileAttributes = FILE_ATTRIBUTE_NORMAL;
|
||||||
|
|
||||||
FileContext->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, CreateFlags | FileAttributes, 0);
|
||||||
if (INVALID_HANDLE_VALUE == FileContext->Handle)
|
if (INVALID_HANDLE_VALUE == FileContext->Handle)
|
||||||
{
|
{
|
||||||
free(FileContext);
|
free(FileContext);
|
||||||
@ -204,6 +211,7 @@ 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];
|
||||||
|
ULONG CreateFlags;
|
||||||
PTFS_FILE_CONTEXT *FileContext;
|
PTFS_FILE_CONTEXT *FileContext;
|
||||||
|
|
||||||
if (!ConcatPath(Ptfs, FileName, FullPath))
|
if (!ConcatPath(Ptfs, FileName, FullPath))
|
||||||
@ -213,9 +221,13 @@ static NTSTATUS Open(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
if (0 == FileContext)
|
if (0 == FileContext)
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
CreateFlags = FILE_FLAG_BACKUP_SEMANTICS;
|
||||||
|
if (CreateOptions & FILE_DELETE_ON_CLOSE)
|
||||||
|
CreateFlags |= FILE_FLAG_DELETE_ON_CLOSE;
|
||||||
|
|
||||||
FileContext->Handle = CreateFileW(FullPath,
|
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, CreateFlags, 0);
|
||||||
if (INVALID_HANDLE_VALUE == FileContext->Handle)
|
if (INVALID_HANDLE_VALUE == FileContext->Handle)
|
||||||
{
|
{
|
||||||
free(FileContext);
|
free(FileContext);
|
||||||
@ -367,7 +379,12 @@ static NTSTATUS SetBasicInfo(FSP_FILE_SYSTEM *FileSystem,
|
|||||||
HANDLE Handle = HandleFromContext(FileContext);
|
HANDLE Handle = HandleFromContext(FileContext);
|
||||||
FILE_BASIC_INFO BasicInfo = { 0 };
|
FILE_BASIC_INFO BasicInfo = { 0 };
|
||||||
|
|
||||||
BasicInfo.FileAttributes = INVALID_FILE_ATTRIBUTES != FileAttributes ? FileAttributes : 0;
|
if (INVALID_FILE_ATTRIBUTES == FileAttributes)
|
||||||
|
FileAttributes = 0;
|
||||||
|
else if (0 == FileAttributes)
|
||||||
|
FileAttributes = FILE_ATTRIBUTE_NORMAL;
|
||||||
|
|
||||||
|
BasicInfo.FileAttributes = FileAttributes;
|
||||||
BasicInfo.CreationTime.QuadPart = CreationTime;
|
BasicInfo.CreationTime.QuadPart = CreationTime;
|
||||||
BasicInfo.LastAccessTime.QuadPart = LastAccessTime;
|
BasicInfo.LastAccessTime.QuadPart = LastAccessTime;
|
||||||
BasicInfo.LastWriteTime.QuadPart = LastWriteTime;
|
BasicInfo.LastWriteTime.QuadPart = LastWriteTime;
|
||||||
@ -627,21 +644,30 @@ static NTSTATUS PtfsCreate(PWSTR Path, PWSTR VolumePrefix, PWSTR MountPoint, UIN
|
|||||||
|
|
||||||
*PPtfs = 0;
|
*PPtfs = 0;
|
||||||
|
|
||||||
if (!GetFullPathNameW(Path, MAX_PATH, FullPath, 0))
|
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
|
||||||
Length = (ULONG)wcslen(FullPath);
|
|
||||||
if (0 < Length && L'\\' == FullPath[Length - 1])
|
|
||||||
FullPath[--Length] = L'\0';
|
|
||||||
|
|
||||||
Handle = CreateFileW(
|
Handle = CreateFileW(
|
||||||
FullPath, FILE_READ_ATTRIBUTES, 0, 0,
|
Path, FILE_READ_ATTRIBUTES, 0, 0,
|
||||||
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
|
||||||
if (INVALID_HANDLE_VALUE == Handle)
|
if (INVALID_HANDLE_VALUE == Handle)
|
||||||
return FspNtStatusFromWin32(GetLastError());
|
return FspNtStatusFromWin32(GetLastError());
|
||||||
LastError = GetFileTime(Handle, &CreationTime, 0, 0) ? GetLastError() : 0;
|
|
||||||
|
Length = GetFinalPathNameByHandleW(Handle, FullPath, FULLPATH_SIZE - 1, 0);
|
||||||
|
if (0 == Length)
|
||||||
|
{
|
||||||
|
LastError = GetLastError();
|
||||||
CloseHandle(Handle);
|
CloseHandle(Handle);
|
||||||
if (0 != LastError)
|
|
||||||
return FspNtStatusFromWin32(LastError);
|
return FspNtStatusFromWin32(LastError);
|
||||||
|
}
|
||||||
|
if (L'\\' == FullPath[Length - 1])
|
||||||
|
FullPath[--Length] = L'\0';
|
||||||
|
|
||||||
|
if (!GetFileTime(Handle, &CreationTime, 0, 0))
|
||||||
|
{
|
||||||
|
LastError = GetLastError();
|
||||||
|
CloseHandle(Handle);
|
||||||
|
return FspNtStatusFromWin32(LastError);
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseHandle(Handle);
|
||||||
|
|
||||||
/* from now on we must goto exit on failure */
|
/* from now on we must goto exit on failure */
|
||||||
|
|
||||||
|
@ -102,6 +102,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -119,6 +120,7 @@
|
|||||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -138,6 +140,7 @@
|
|||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
@ -159,6 +162,7 @@
|
|||||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<SDLCheck>true</SDLCheck>
|
<SDLCheck>true</SDLCheck>
|
||||||
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(MSBuildProgramFiles32)\WinFsp\inc</AdditionalIncludeDirectories>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Console</SubSystem>
|
<SubSystem>Console</SubSystem>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user