diff --git a/Changelog.md b/Changelog.md index 8c8243b2..ae08c880 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,10 +1,12 @@ # Changelog -## v1.12 (2023) +## v1.12B1 (2022.2) - [NEW] A new registry setting `MountUseMountmgrFromFSD` has been added. See [WinFsp Registry Settings](https://github.com/winfsp/winfsp/wiki/WinFsp-Registry-Settings) for details. +- [BUILD] Product configuration for the relative paths to the File System Driver, Network Provider and EventLog is now possible via the file `build.version.props` located in `build\VStudio`. + ## v1.11 (2022+ARM64) diff --git a/build/VStudio/build.common.props b/build/VStudio/build.common.props index 81f57a60..ba6c66af 100644 --- a/build/VStudio/build.common.props +++ b/build/VStudio/build.common.props @@ -3,10 +3,10 @@ - NTDDI_VERSION=0x06010000;_WIN32_WINNT=0x0601;MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid) + NTDDI_VERSION=0x06010000;_WIN32_WINNT=0x0601;MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid);MyFsctlRegisterPath=$(MyFsctlRegisterPath);MyNpRegisterPath=$(MyNpRegisterPath);MyEventLogRegisterPath=$(MyEventLogRegisterPath) - MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid) + MyProductName=$(MyProductName);MyProductFileName=$(MyProductFileName);MyDescription=$(MyDescription);MyCompanyName=$(MyCompanyName);MyCopyright=$(MyCopyright);MyProductVersion=$(MyProductVersion);MyProductStage=$(MyProductStage);MyVersion=$(MyVersion);MyVersionWithCommas=$(MyVersionWithCommas);MyFullVersion=$(MyFullVersion);MyFspFsctlDeviceClassGuid=$(MyFspFsctlDeviceClassGuid);MyFspFsvrtDeviceClassGuid=$(MyFspFsvrtDeviceClassGuid);MyFsctlRegisterPath=$(MyFsctlRegisterPath);MyNpRegisterPath=$(MyNpRegisterPath);MyEventLogRegisterPath=$(MyEventLogRegisterPath) diff --git a/build/VStudio/build.version.props b/build/VStudio/build.version.props index 50e54b65..ac2341a1 100644 --- a/build/VStudio/build.version.props +++ b/build/VStudio/build.version.props @@ -20,7 +20,7 @@ 1.12 - 2023 + 2022.2 Beta1 Beta DigiCertGlobalG3CodeSigningECCSHA3842021CA1.cer @@ -40,5 +40,37 @@ { 0x6f9d25fa, 0x6dee, 0x4a9d, { 0x80, 0xf5, 0xe9, 0x8e, 0x14, 0xf3, 0x5e, 0x54 } } { 0xb48171c3, 0xdd50, 0x4852, { 0x83, 0xa3, 0x34, 0x4c, 0x50, 0xd9, 0x3b, 0x17 } } + + + "." + "." + "." \ No newline at end of file diff --git a/build/VStudio/winfsp_dll.vcxproj b/build/VStudio/winfsp_dll.vcxproj index fdf44984..7b947fd5 100644 --- a/build/VStudio/winfsp_dll.vcxproj +++ b/build/VStudio/winfsp_dll.vcxproj @@ -289,7 +289,7 @@ copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(My $(OutDir)$(TargetFileName).map false ..\..\src\dll\library.def - %(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib + %(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib $(OutDir)$(TargetFileName).public.pdb @@ -316,7 +316,7 @@ copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(My $(OutDir)$(TargetFileName).map true ..\..\src\dll\library.def - %(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib + %(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib $(OutDir)$(TargetFileName).public.pdb @@ -343,7 +343,7 @@ copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(My $(OutDir)$(TargetFileName).map true ..\..\src\dll\library.def - %(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib + %(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib $(OutDir)$(TargetFileName).public.pdb @@ -373,7 +373,7 @@ copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(My $(OutDir)$(TargetFileName).map false ..\..\src\dll\library.def - %(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib + %(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib $(OutDir)$(TargetFileName).public.pdb /PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions) @@ -404,7 +404,7 @@ copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(My $(OutDir)$(TargetFileName).map true ..\..\src\dll\library.def - %(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib + %(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib $(OutDir)$(TargetFileName).public.pdb /PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions) @@ -435,7 +435,7 @@ copy /b $(OutDir)fuse3-$(MyProductFileArch).pc + %(FullPath) $(OutDir)fuse3-$(My $(OutDir)$(TargetFileName).map true ..\..\src\dll\library.def - %(AdditionalDependencies);rpcrt4.lib;credui.lib;secur32.lib;version.lib;netapi32.lib;wldap32.lib + %(AdditionalDependencies);credui.lib;netapi32.lib;rpcrt4.lib;secur32.lib;shlwapi.lib;version.lib;wldap32.lib $(OutDir)$(TargetFileName).public.pdb /PDBALTPATH:$(TargetFileName).pdb %(AdditionalOptions) diff --git a/src/dll/eventlog.c b/src/dll/eventlog.c index a4d00fe3..24ba7cef 100644 --- a/src/dll/eventlog.c +++ b/src/dll/eventlog.c @@ -100,9 +100,11 @@ NTSTATUS FspEventLogRegister(VOID) WCHAR Path[MAX_PATH]; DWORD RegResult, DwordValue; HKEY RegKey; + NTSTATUS Result; - if (0 == GetModuleFileNameW(DllInstance, Path, MAX_PATH)) - return FspNtStatusFromWin32(GetLastError()); + Result = FspGetModuleFileName(DllInstance, Path, MAX_PATH, L"" MyEventLogRegisterPath); + if (!NT_SUCCESS(Result)) + return Result; RegResult = RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\" FSP_EVENTLOG_NAME, diff --git a/src/dll/fsctl.c b/src/dll/fsctl.c index 32fcac50..e670616a 100644 --- a/src/dll/fsctl.c +++ b/src/dll/fsctl.c @@ -730,8 +730,9 @@ NTSTATUS FspFsctlRegister(VOID) FspSxsAppendSuffix(DriverName, sizeof DriverName, L"" FSP_FSCTL_DRIVER_NAME); - if (0 == GetModuleFileNameW(DllInstance, DriverPath, MAX_PATH)) - return FspNtStatusFromWin32(GetLastError()); + Result = FspGetModuleFileName(DllInstance, DriverPath, MAX_PATH, L"" MyFsctlRegisterPath); + if (!NT_SUCCESS(Result)) + return Result; Size = lstrlenW(DriverPath); if (4 < Size && @@ -745,6 +746,14 @@ NTSTATUS FspFsctlRegister(VOID) DriverPath[Size - 2] = L'y'; DriverPath[Size - 1] = L's'; } + else if (4 < Size && + (L'.' == DriverPath[Size - 4]) && + (L'S' == DriverPath[Size - 3] || L's' == DriverPath[Size - 3]) && + (L'Y' == DriverPath[Size - 2] || L'y' == DriverPath[Size - 2]) && + (L'S' == DriverPath[Size - 1] || L's' == DriverPath[Size - 1]) && + (L'\0' == DriverPath[Size])) + { + } else /* should not happen! */ return STATUS_NO_SUCH_DEVICE; diff --git a/src/dll/library.h b/src/dll/library.h index da524098..6f161a6a 100644 --- a/src/dll/library.h +++ b/src/dll/library.h @@ -94,6 +94,11 @@ ULONG FspLdapGetTrustPosixOffset(PVOID Ldap, PWSTR Context, PWSTR Domain, PWSTR PWSTR FspDiagIdent(VOID); NTSTATUS FspGetModuleVersion(PWSTR ModuleFileName, PUINT32 PVersion); +NTSTATUS FspGetModuleFileName( + HMODULE Module, + PWSTR FileName, + ULONG Size, + PWSTR RelativePath); #define FspFileSystemDirectoryBufferEntryInvalid ((ULONG)-1) VOID FspFileSystemPeekInDirectoryBuffer(PVOID *PDirBuffer, diff --git a/src/dll/np.c b/src/dll/np.c index e7c2ad4c..fab6f9f1 100644 --- a/src/dll/np.c +++ b/src/dll/np.c @@ -1152,15 +1152,34 @@ DWORD APIENTRY NPCloseEnum(HANDLE hEnum) NTSTATUS FspNpRegister(VOID) { extern HINSTANCE DllInstance; - WCHAR ProviderPath[MAX_PATH]; + WCHAR DllPath[MAX_PATH], ProviderPath[MAX_PATH]; + PWSTR VersionInfoPath; + BOOLEAN HasPercent; WCHAR RegBuffer[1024]; PWSTR P, Part; DWORD RegResult, RegType, RegBufferSize, RegBufferOffset; HKEY RegKey; BOOLEAN FoundProvider; + NTSTATUS Result; - if (0 == GetModuleFileNameW(DllInstance, ProviderPath, MAX_PATH)) - return FspNtStatusFromWin32(GetLastError()); + VersionInfoPath = ProviderPath; + HasPercent = FALSE; + for (P = L"" MyNpRegisterPath; *P; P++) + if ('%' == *P) + { + HasPercent = TRUE; + break; + } + if (HasPercent) + { + VersionInfoPath = DllPath; + if (0 == GetModuleFileNameW(DllInstance, DllPath, MAX_PATH)) + return FspNtStatusFromWin32(GetLastError()); + } + + Result = FspGetModuleFileName(DllInstance, ProviderPath, MAX_PATH, L"" MyNpRegisterPath); + if (!NT_SUCCESS(Result)) + return Result; RegResult = RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\" FSP_NP_NAME, @@ -1187,12 +1206,12 @@ NTSTATUS FspNpRegister(VOID) DWORD Size; PWSTR Description; - Size = GetFileVersionInfoSizeW(ProviderPath, &Size/*dummy*/); + Size = GetFileVersionInfoSizeW(VersionInfoPath, &Size/*dummy*/); if (0 < Size) { VersionInfo = MemAlloc(Size); if (0 != VersionInfo && - GetFileVersionInfoW(ProviderPath, 0, Size, VersionInfo) && + GetFileVersionInfoW(VersionInfoPath, 0, Size, VersionInfo) && VerQueryValueW(VersionInfo, L"\\StringFileInfo\\040904b0\\FileDescription", &Description, &Size)) { @@ -1208,7 +1227,8 @@ NTSTATUS FspNpRegister(VOID) goto close_and_exit; RegResult = RegSetValueExW(RegKey, - L"ProviderPath", 0, REG_SZ, (PVOID)ProviderPath, (lstrlenW(ProviderPath) + 1) * sizeof(WCHAR)); + L"ProviderPath", 0, HasPercent ? REG_EXPAND_SZ : REG_SZ, + (PVOID)ProviderPath, (lstrlenW(ProviderPath) + 1) * sizeof(WCHAR)); if (ERROR_SUCCESS != RegResult) goto close_and_exit; diff --git a/src/dll/util.c b/src/dll/util.c index b08ce50e..00da6b08 100644 --- a/src/dll/util.c +++ b/src/dll/util.c @@ -21,6 +21,7 @@ #include #include +#include static INIT_ONCE FspDiagIdentInitOnce = INIT_ONCE_STATIC_INIT; static WCHAR FspDiagIdentBuf[20] = L"UNKNOWN"; @@ -248,3 +249,33 @@ NTSTATUS FspGetModuleVersion(PWSTR ModuleFileName, PUINT32 PVersion) return STATUS_SUCCESS; } + +NTSTATUS FspGetModuleFileName( + HMODULE Module, + PWSTR FileName, + ULONG Size, + PWSTR RelativePath) +{ + if (MAX_PATH > Size) + return STATUS_BUFFER_TOO_SMALL; + + if (0 != RelativePath && + L'\0' != RelativePath[0] && + (L'.' != RelativePath[0] || L'\0' != RelativePath[1])) + { + WCHAR Temp[MAX_PATH]; + + if (0 == GetModuleFileNameW(Module, Temp, MAX_PATH)) + return FspNtStatusFromWin32(GetLastError()); + + if (0 == PathCombineW(FileName, Temp, RelativePath)) + return STATUS_UNSUCCESSFUL; + } + else + { + if (0 == GetModuleFileNameW(Module, FileName, MAX_PATH)) + return FspNtStatusFromWin32(GetLastError()); + } + + return STATUS_SUCCESS; +}