mirror of
https://github.com/winfsp/winfsp.git
synced 2025-07-03 17:32:57 -05:00
Compare commits
4 Commits
release/1.
...
before-reb
Author | SHA1 | Date | |
---|---|---|---|
a7cfabeff8 | |||
d4a70da611 | |||
50892bfa19 | |||
b2e677a3d3 |
@ -123,9 +123,12 @@ static struct
|
|||||||
PWSTR DnsDomainName;
|
PWSTR DnsDomainName;
|
||||||
ULONG TrustPosixOffset;
|
ULONG TrustPosixOffset;
|
||||||
} *FspTrustedDomains;
|
} *FspTrustedDomains;
|
||||||
ULONG FspTrustedDomainCount;
|
static ULONG FspTrustedDomainCount;
|
||||||
|
static BOOLEAN FspDistinctPermsForSameOwnerGroup;
|
||||||
static INIT_ONCE FspPosixInitOnce = INIT_ONCE_STATIC_INIT;
|
static INIT_ONCE FspPosixInitOnce = INIT_ONCE_STATIC_INIT;
|
||||||
|
|
||||||
#if !defined(_KERNEL_MODE)
|
#if !defined(_KERNEL_MODE)
|
||||||
|
|
||||||
static ULONG FspPosixInitializeTrustPosixOffsets(VOID)
|
static ULONG FspPosixInitializeTrustPosixOffsets(VOID)
|
||||||
{
|
{
|
||||||
PVOID Ldap = 0;
|
PVOID Ldap = 0;
|
||||||
@ -169,6 +172,28 @@ exit:
|
|||||||
return LdapResult;
|
return LdapResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VOID FspPosixInitializeFromRegistry(VOID)
|
||||||
|
{
|
||||||
|
HKEY RegKey;
|
||||||
|
LONG Result;
|
||||||
|
DWORD Size;
|
||||||
|
DWORD DistinctPermsForSameOwnerGroup;
|
||||||
|
|
||||||
|
DistinctPermsForSameOwnerGroup = 0;
|
||||||
|
|
||||||
|
Result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\WinFsp",
|
||||||
|
0, KEY_READ | KEY_WOW64_32KEY, &RegKey);
|
||||||
|
if (ERROR_SUCCESS == Result)
|
||||||
|
{
|
||||||
|
Size = sizeof DistinctPermsForSameOwnerGroup;
|
||||||
|
Result = RegGetValueW(RegKey, 0, L"DistinctPermsForSameOwnerGroup",
|
||||||
|
RRF_RT_REG_DWORD, 0, &DistinctPermsForSameOwnerGroup, &Size);
|
||||||
|
RegCloseKey(RegKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
FspDistinctPermsForSameOwnerGroup = !!DistinctPermsForSameOwnerGroup;
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL WINAPI FspPosixInitialize(
|
static BOOL WINAPI FspPosixInitialize(
|
||||||
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
|
||||||
{
|
{
|
||||||
@ -300,6 +325,8 @@ static BOOL WINAPI FspPosixInitialize(
|
|||||||
if (0 < FspTrustedDomainCount)
|
if (0 < FspTrustedDomainCount)
|
||||||
FspPosixInitializeTrustPosixOffsets();
|
FspPosixInitializeTrustPosixOffsets();
|
||||||
|
|
||||||
|
FspPosixInitializeFromRegistry();
|
||||||
|
|
||||||
exit:
|
exit:
|
||||||
if (0 != TrustedDomains)
|
if (0 != TrustedDomains)
|
||||||
NetApiBufferFree(TrustedDomains);
|
NetApiBufferFree(TrustedDomains);
|
||||||
@ -330,7 +357,9 @@ VOID FspPosixFinalize(BOOLEAN Dynamic)
|
|||||||
MemFree(FspPrimaryDomainSid);
|
MemFree(FspPrimaryDomainSid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
ULONG NTAPI FspPosixInitialize(
|
ULONG NTAPI FspPosixInitialize(
|
||||||
PRTL_RUN_ONCE RunOnce, PVOID Parameter, PVOID *Context)
|
PRTL_RUN_ONCE RunOnce, PVOID Parameter, PVOID *Context)
|
||||||
{
|
{
|
||||||
@ -376,8 +405,12 @@ ULONG NTAPI FspPosixInitialize(
|
|||||||
FspPrimaryDomainSid = &FspPrimaryDomainSidBuf.V;
|
FspPrimaryDomainSid = &FspPrimaryDomainSidBuf.V;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* always enable permissive permissions for same owner group in kernel mode */
|
||||||
|
FspDistinctPermsForSameOwnerGroup = TRUE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline BOOLEAN FspPosixIsRelativeSid(PISID Sid1, PISID Sid2)
|
static inline BOOLEAN FspPosixIsRelativeSid(PISID Sid1, PISID Sid2)
|
||||||
@ -778,7 +811,7 @@ FSP_API NTSTATUS FspPosixMapPermissionsToSecurityDescriptor(
|
|||||||
* bits are different?. In this case, the most restrictive permissions
|
* bits are different?. In this case, the most restrictive permissions
|
||||||
* are chosen and assigned to both ACEs.
|
* are chosen and assigned to both ACEs.
|
||||||
*/
|
*/
|
||||||
if (EqualSid(OwnerSid, GroupSid))
|
if (!FspDistinctPermsForSameOwnerGroup && EqualSid(OwnerSid, GroupSid))
|
||||||
OwnerPerm = GroupPerm = OwnerPerm & GroupPerm;
|
OwnerPerm = GroupPerm = OwnerPerm & GroupPerm;
|
||||||
|
|
||||||
/* [PERMS]
|
/* [PERMS]
|
||||||
|
@ -1288,10 +1288,31 @@ static NTSTATUS FspFsvolSetBasicInformation(PFILE_OBJECT FileObject,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Request->Req.SetInformation.Info.Basic.FileAttributes = FileAttributes;
|
Request->Req.SetInformation.Info.Basic.FileAttributes = FileAttributes;
|
||||||
Request->Req.SetInformation.Info.Basic.CreationTime = Info->CreationTime.QuadPart;
|
|
||||||
Request->Req.SetInformation.Info.Basic.LastAccessTime = Info->LastAccessTime.QuadPart;
|
/*
|
||||||
Request->Req.SetInformation.Info.Basic.LastWriteTime = Info->LastWriteTime.QuadPart;
|
* From FILE_BASIC_INFORMATION (https://tinyurl.com/hwex4bd9):
|
||||||
Request->Req.SetInformation.Info.Basic.ChangeTime = Info->ChangeTime.QuadPart;
|
*
|
||||||
|
* The file system updates the values of the LastAccessTime,
|
||||||
|
* LastWriteTime, and ChangeTime members as appropriate after an I/O
|
||||||
|
* operation is performed on a file. A driver or application can
|
||||||
|
* request that the file system not update one or more of these
|
||||||
|
* members for I/O operations that are performed on the caller's file
|
||||||
|
* handle by setting the appropriate members to -1. The caller can set
|
||||||
|
* one, all, or any other combination of these three members to -1.
|
||||||
|
* Only the members that are set to -1 will be unaffected by I/O
|
||||||
|
* operations on the file handle; the other members will be updated as
|
||||||
|
* appropriate.
|
||||||
|
*
|
||||||
|
* GitHub issue #362
|
||||||
|
*/
|
||||||
|
Request->Req.SetInformation.Info.Basic.CreationTime =
|
||||||
|
-1 != Info->CreationTime.QuadPart ? Info->CreationTime.QuadPart : 0;
|
||||||
|
Request->Req.SetInformation.Info.Basic.LastAccessTime =
|
||||||
|
-1 != Info->LastAccessTime.QuadPart ? Info->LastAccessTime.QuadPart : 0;
|
||||||
|
Request->Req.SetInformation.Info.Basic.LastWriteTime =
|
||||||
|
-1 != Info->LastWriteTime.QuadPart ? Info->LastWriteTime.QuadPart : 0;
|
||||||
|
Request->Req.SetInformation.Info.Basic.ChangeTime =
|
||||||
|
-1 != Info->ChangeTime.QuadPart ? Info->ChangeTime.QuadPart : 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
51
tools/fix162.bat
Normal file
51
tools/fix162.bat
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
REM This script is used to fix GitHub issue #162:
|
||||||
|
REM https://github.com/billziss-gh/winfsp/issues/162
|
||||||
|
REM
|
||||||
|
REM It works as follows:
|
||||||
|
REM
|
||||||
|
REM - Creates a junction called `amd64` inside the `WinFsp\bin` directory
|
||||||
|
REM that points back to the directory.
|
||||||
|
REM
|
||||||
|
REM - Updates the registry `ProviderPath` of the WinFsp Network Provider to
|
||||||
|
REM point to `...\bin\%PROCESSOR_ARCHITECTURE%\winfsp-x64.dll`.
|
||||||
|
REM
|
||||||
|
REM It requires Administrator privileges in order to run.
|
||||||
|
|
||||||
|
setlocal
|
||||||
|
setlocal EnableDelayedExpansion
|
||||||
|
|
||||||
|
set RegKey="HKLM\SOFTWARE\WinFsp"
|
||||||
|
set RegVal="InstallDir"
|
||||||
|
reg query !RegKey! /v !RegVal! /reg:32 >nul 2>&1
|
||||||
|
if !ERRORLEVEL! equ 0 (
|
||||||
|
for /f "tokens=2,*" %%i in ('reg query !RegKey! /v !RegVal! /reg:32 ^| findstr !RegVal!') do (
|
||||||
|
set InstallDir=%%j
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if not exist "!InstallDir!" (echo cannot find WinFsp installation >&2 & goto fail)
|
||||||
|
|
||||||
|
set RegKey="HKLM\SYSTEM\CurrentControlSet\Services\WinFsp.Np\NetworkProvider"
|
||||||
|
set RegVal="ProviderPath"
|
||||||
|
|
||||||
|
if not X%1==X-u (
|
||||||
|
echo fix #162
|
||||||
|
|
||||||
|
if not exist "!InstallDir!bin\amd64" mklink /j "!InstallDir!bin\amd64" "!InstallDir!bin"
|
||||||
|
|
||||||
|
reg add !RegKey! /v !RegVal! /t REG_EXPAND_SZ /d "!InstallDir!bin\%%PROCESSOR_ARCHITECTURE%%\winfsp-x64.dll" /f
|
||||||
|
|
||||||
|
) else (
|
||||||
|
echo undo fix #162
|
||||||
|
|
||||||
|
if exist "!InstallDir!bin\amd64" rmdir "!InstallDir!bin\amd64"
|
||||||
|
|
||||||
|
reg add !RegKey! /v !RegVal! /t REG_SZ /d "!InstallDir!bin\winfsp-x64.dll" /f
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
exit /b 0
|
||||||
|
|
||||||
|
:fail
|
||||||
|
exit /b 1
|
Reference in New Issue
Block a user