- From f094498129a5b406796c38c34527d8ffac341833 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 26 Jul 2025 15:02:28 +0200
- Subject: [PATCH 1/4] daemon,sys,tests: Support opening the volume mount point
- dir as file
- Support opening the volume mount point dir as file, i.e. open
- L: if |FILE_NON_DIRECTORY_FILE| is set.
- See https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
- section "FILE_NON_DIRECTORY_FILE":
- "... The file being opened must not be a directory file or this call
- fails. The file object being opened can represent a data file, a
- logical, virtual, or physical device, or a *VOLUME* ...").
- This also gets $ fsutil.exe fsinfo volumeinfo L: # working.
- Reported-by: Martin Wege <martin.l.wege@gmail.com>
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- daemon/open.c | 49 ++++++++++++++++++++++++++++------------
- daemon/upcall.h | 1 +
- sys/nfs41sys_driver.h | 4 +++-
- sys/nfs41sys_mount.c | 5 +++-
- sys/nfs41sys_openclose.c | 21 +++++++++++++++++
- sys/nfs41sys_util.c | 2 +-
- tests/manual_testing.txt | 11 +++++++++
- 7 files changed, 76 insertions(+), 17 deletions(-)
- diff --git a/daemon/open.c b/daemon/open.c
- index ac7d102..2e71e07 100644
- --- a/daemon/open.c
- +++ b/daemon/open.c
- @@ -317,6 +317,8 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
- status = get_name(&buffer, &length, &args->path);
- if (status) goto out;
- + status = safe_read(&buffer, &length, &args->isvolumemntpt, sizeof(BOOLEAN));
- + if (status) goto out;
- status = safe_read(&buffer, &length, &args->access_mask, sizeof(ULONG));
- if (status) goto out;
- status = safe_read(&buffer, &length, &args->access_mode, sizeof(ULONG));
- @@ -345,21 +347,25 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
- if (status) goto out;
- #ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- - DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' access mask=%d "
- + DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
- + "isvolumemntpt=%d access mask=%d "
- "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
- "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
- "owner_local_uid=%u owner_group_local_gid=%u "
- - "srv_open=0x%p symlink=%s ea=0x%p\n", args->path, args->access_mask,
- + "srv_open=0x%p symlink=%s ea=0x%p\n",
- + args->path, (int)args->isvolumemntpt, args->access_mask,
- args->access_mode, args->file_attrs, args->create_opts,
- args->disposition, args->open_owner_id, args->mode,
- (unsigned int)args->owner_local_uid, (unsigned int)args->owner_group_local_gid,
- args->srv_open,
- args->symlink.path, args->ea));
- #else
- - DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' access mask=%d "
- + DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
- + "isvolumemntpt=%d access mask=%d "
- "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
- "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
- - "srv_open=0x%p symlink=%s ea=0x%p\n", args->path, args->access_mask,
- + "srv_open=0x%p symlink=%s ea=0x%p\n",
- + args->path, (int)args->isvolumemntpt, args->access_mask,
- args->access_mode, args->file_attrs, args->create_opts,
- args->disposition, args->open_owner_id, args->mode,
- args->srv_open,
- @@ -836,16 +842,31 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
- if (info.type == NF4DIR) {
- DPRINTF(2, ("handle_nfs41_open: DIRECTORY\n"));
- if (args->create_opts & FILE_NON_DIRECTORY_FILE) {
- - DPRINTF(1, ("trying to open directory '%s' as a file\n",
- - state->path.path));
- - /*
- - * Notes:
- - * - NTFS+SMB returns |STATUS_FILE_IS_A_DIRECTORY|
- - * - See |map_open_errors()| for the mapping to
- - * |STATUS_*|
- - */
- - status = ERROR_DIRECTORY_NOT_SUPPORTED;
- - goto out_free_state;
- + if (args->isvolumemntpt) {
- + /*
- + * Open directry as volume
- + * (see https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
- + * section "FILE_NON_DIRECTORY_FILE":
- + * "... The file being opened must not be a directory file
- + * or this call fails. The file object being opened can
- + * represent a data file, a logical, virtual, or physical
- + * device, or a *VOLUME* ...")
- + */
- + DPRINTF(1, ("open directory '%s' as a volume\n",
- + state->path.path));
- + }
- + else {
- + DPRINTF(1, ("trying to open directory '%s' as a file\n",
- + state->path.path));
- + /*
- + * Notes:
- + * - NTFS+SMB returns |STATUS_FILE_IS_A_DIRECTORY|
- + * - See |map_open_errors()| for the mapping to
- + * |STATUS_*|
- + */
- + status = ERROR_DIRECTORY_NOT_SUPPORTED;
- + goto out_free_state;
- + }
- }
- } else if (info.type == NF4REG) {
- DPRINTF(2, ("handle nfs41_open: FILE\n"));
- diff --git a/daemon/upcall.h b/daemon/upcall.h
- index bbbecf7..bafaac9 100644
- --- a/daemon/upcall.h
- +++ b/daemon/upcall.h
- @@ -51,6 +51,7 @@ typedef struct __open_upcall_args {
- ULONGLONG fileid;
- ULONGLONG fsid_major, fsid_minor;
- const char *path;
- + BOOLEAN isvolumemntpt;
- ULONG access_mask;
- ULONG access_mode;
- ULONG file_attrs;
- diff --git a/sys/nfs41sys_driver.h b/sys/nfs41sys_driver.h
- index c6b6c0d..87047f9 100644
- --- a/sys/nfs41sys_driver.h
- +++ b/sys/nfs41sys_driver.h
- @@ -219,6 +219,7 @@ typedef struct _updowncall_entry {
- ULONGLONG fileid;
- ULONGLONG fsid_major, fsid_minor;
- UNICODE_STRING symlink;
- + BOOLEAN isvolumemntpt;
- ULONG access_mask;
- ULONG access_mode;
- ULONG attrs;
- @@ -408,7 +409,8 @@ typedef struct _NFS41_V_NET_ROOT_EXTENSION {
- DWORD timeout;
- NFS41_MOUNT_CREATEMODE dir_createmode;
- NFS41_MOUNT_CREATEMODE file_createmode;
- - USHORT MountPathLen;
- + WCHAR mntpt_buffer[NFS41_SYS_MAX_PATH_LEN];
- + UNICODE_STRING MntPt;
- DWORD nfsvers;
- BOOLEAN read_only;
- BOOLEAN write_thru;
- diff --git a/sys/nfs41sys_mount.c b/sys/nfs41sys_mount.c
- index 5e66eda..f2d7d81 100644
- --- a/sys/nfs41sys_mount.c
- +++ b/sys/nfs41sys_mount.c
- @@ -1051,7 +1051,10 @@ NTSTATUS nfs41_CreateVNetRoot(
- Config->file_createmode.use_nfsv3attrsea_mode?1:0,
- Config->file_createmode.mode);
- - pVNetRootContext->MountPathLen = Config->MntPt.Length;
- + pVNetRootContext->MntPt.Buffer = pVNetRootContext->mntpt_buffer;
- + pVNetRootContext->MntPt.Length = Config->MntPt.Length;
- + pVNetRootContext->MntPt.MaximumLength = Config->MntPt.MaximumLength;
- + RtlCopyUnicodeString(&pVNetRootContext->MntPt, &Config->MntPt);
- pVNetRootContext->timeout = Config->timeout;
- pVNetRootContext->dir_createmode.use_nfsv3attrsea_mode =
- Config->dir_createmode.use_nfsv3attrsea_mode;
- diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
- index 94d3fa8..f18e54f 100644
- --- a/sys/nfs41sys_openclose.c
- +++ b/sys/nfs41sys_openclose.c
- @@ -123,6 +123,7 @@ NTSTATUS marshal_nfs41_open(
- #ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- 2 * sizeof(DWORD) +
- #endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- + 1 * sizeof(BOOLEAN) +
- 2 * sizeof(HANDLE) +
- length_as_utf8(&entry->u.Open.symlink);
- if (header_len > buf_len) {
- @@ -131,6 +132,9 @@ NTSTATUS marshal_nfs41_open(
- }
- status = marshall_unicode_as_utf8(&tmp, entry->filename);
- if (status) goto out;
- + RtlCopyMemory(tmp, &entry->u.Open.isvolumemntpt,
- + sizeof(entry->u.Open.isvolumemntpt));
- + tmp += sizeof(entry->u.Open.isvolumemntpt);
- RtlCopyMemory(tmp, &entry->u.Open.access_mask,
- sizeof(entry->u.Open.access_mask));
- tmp += sizeof(entry->u.Open.access_mask);
- @@ -389,6 +393,18 @@ static BOOLEAN areOpenParamsValid(NT_CREATE_PARAMETERS *params)
- return TRUE;
- }
- +static BOOLEAN isFileNameTheVolumeMountPoint(PUNICODE_STRING fileName,
- + PNFS41_V_NET_ROOT_EXTENSION pVNetRootContext) {
- + /* Check whether this is the mount point for this volume */
- + if ((fileName->Length == pVNetRootContext->MntPt.Length) &&
- + (memcmp(fileName->Buffer,
- + pVNetRootContext->MntPt.Buffer,
- + pVNetRootContext->MntPt.Length) == 0)) {
- + return TRUE;
- + }
- + return FALSE;
- +}
- +
- NTSTATUS map_open_errors(
- DWORD status,
- USHORT len)
- @@ -628,6 +644,11 @@ NTSTATUS nfs41_Create(
- SrvOpen->pAlreadyPrefixedName, &entry);
- if (status) goto out;
- + /* Check whether this is the mount point for this volume */
- + entry->u.Open.isvolumemntpt =
- + isFileNameTheVolumeMountPoint(SrvOpen->pAlreadyPrefixedName,
- + pVNetRootContext);
- +
- entry->u.Open.access_mask = params->DesiredAccess;
- entry->u.Open.access_mode = params->ShareAccess;
- entry->u.Open.attrs = params->FileAttributes;
- diff --git a/sys/nfs41sys_util.c b/sys/nfs41sys_util.c
- index b1a7589..4420546 100644
- --- a/sys/nfs41sys_util.c
- +++ b/sys/nfs41sys_util.c
- @@ -112,7 +112,7 @@ BOOLEAN is_root_directory(
- /* calculate the root directory's length, including vnetroot prefix,
- * mount path, and a trailing \ */
- const USHORT RootPathLen = VNetRoot->PrefixEntry.Prefix.Length +
- - pVNetRootContext->MountPathLen + sizeof(WCHAR);
- + pVNetRootContext->MntPt.Length + sizeof(WCHAR);
- return RxContext->CurrentIrpSp->FileObject->FileName.Length <= RootPathLen;
- }
- diff --git a/tests/manual_testing.txt b/tests/manual_testing.txt
- index c57160b..526547c 100644
- --- a/tests/manual_testing.txt
- +++ b/tests/manual_testing.txt
- @@ -427,6 +427,17 @@ icacls mytestfile1.txt | grep --colour -E 'cygwingrp2.+GR'
- #
- +#
- +# Test whether opening the mount point (e.g. L:) as a plain file works
- +# (see https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntcreatefile
- +# section "FILE_NON_DIRECTORY_FILE": "... The file being opened must not be a directory file
- +# or this call fails. The file object being opened can represent a data file, a logical,
- +# virtual, or physical device, or a *VOLUME*. ...")
- +#
- +$ fsutil.exe fsinfo volumeinfo L:
- +<Should print info about that filesystem>
- +
- +
- #
- # Tests for Windows EAs (Extended Attributes)
- # Windows EAs are represented as NFSv4 extended attributes (XATTR)
- --
- 2.45.1
- From 34c1b7491ef79b76fa491080644a432985ec794a Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 26 Jul 2025 15:18:29 +0200
- Subject: [PATCH 2/4] daemon: Enable debug output for NFS file types open does
- not handle (FIFO, DEVICE, ...)
- Enable debug output for NFS file types open does not handle (FIFO, DEVICE, ...).
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- daemon/open.c | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
- diff --git a/daemon/open.c b/daemon/open.c
- index 2e71e07..49c01a9 100644
- --- a/daemon/open.c
- +++ b/daemon/open.c
- @@ -918,8 +918,11 @@ static int handle_open(void *daemon_context, nfs41_upcall *upcall)
- }
- goto out_free_state;
- }
- - } else
- - DPRINTF(2, ("handle_open(): unsupported type=%d\n", info.type));
- + } else {
- + DPRINTF(0,
- + ("handle_open(args->path='%s'): unsupported info.type=%d\n",
- + args->path, info.type));
- + }
- state->type = info.type;
- } else if (status != ERROR_FILE_NOT_FOUND)
- goto out_free_state;
- --
- 2.45.1
- From 3339532909b15b5b2e0228b6317d9d1b9d59eb6f Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 26 Jul 2025 15:39:06 +0200
- Subject: [PATCH 3/4] daemon,sys: Remove dead code in
- NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES support
- Remove dead code in NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- support.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- daemon/open.c | 21 ---------------------
- sys/nfs41sys_openclose.c | 15 ---------------
- 2 files changed, 36 deletions(-)
- diff --git a/daemon/open.c b/daemon/open.c
- index 49c01a9..65e2607 100644
- --- a/daemon/open.c
- +++ b/daemon/open.c
- @@ -333,12 +333,6 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
- if (status) goto out;
- status = safe_read(&buffer, &length, &args->mode, sizeof(DWORD));
- if (status) goto out;
- -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- - status = safe_read(&buffer, &length, &args->owner_local_uid, sizeof(DWORD));
- - if (status) goto out;
- - status = safe_read(&buffer, &length, &args->owner_group_local_gid, sizeof(DWORD));
- - if (status) goto out;
- -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- status = safe_read(&buffer, &length, &args->srv_open, sizeof(HANDLE));
- if (status) goto out;
- status = parse_abs_path(&buffer, &length, &args->symlink);
- @@ -346,31 +340,16 @@ static int parse_open(unsigned char *buffer, uint32_t length, nfs41_upcall *upca
- status = safe_read(&buffer, &length, &args->ea, sizeof(HANDLE));
- if (status) goto out;
- -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
- "isvolumemntpt=%d access mask=%d "
- "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
- "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
- - "owner_local_uid=%u owner_group_local_gid=%u "
- "srv_open=0x%p symlink=%s ea=0x%p\n",
- args->path, (int)args->isvolumemntpt, args->access_mask,
- args->access_mode, args->file_attrs, args->create_opts,
- args->disposition, args->open_owner_id, args->mode,
- - (unsigned int)args->owner_local_uid, (unsigned int)args->owner_group_local_gid,
- args->srv_open,
- args->symlink.path, args->ea));
- -#else
- - DPRINTF(1, ("parsing NFS41_SYSOP_OPEN: filename='%s' "
- - "isvolumemntpt=%d access mask=%d "
- - "access mode=%d\n\tfile attrs=0x%x create attrs=0x%x "
- - "(kernel) disposition=%d\n\topen_owner_id=%d mode=0%o "
- - "srv_open=0x%p symlink=%s ea=0x%p\n",
- - args->path, (int)args->isvolumemntpt, args->access_mask,
- - args->access_mode, args->file_attrs, args->create_opts,
- - args->disposition, args->open_owner_id, args->mode,
- - args->srv_open,
- - args->symlink.path, args->ea));
- -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- if (DPRINTF_LEVEL_ENABLED(2)) {
- print_disposition(2, args->disposition);
- diff --git a/sys/nfs41sys_openclose.c b/sys/nfs41sys_openclose.c
- index f18e54f..9a4431f 100644
- --- a/sys/nfs41sys_openclose.c
- +++ b/sys/nfs41sys_openclose.c
- @@ -120,9 +120,6 @@ NTSTATUS marshal_nfs41_open(
- header_len = *len + length_as_utf8(entry->filename) +
- 7 * sizeof(ULONG) +
- -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- - 2 * sizeof(DWORD) +
- -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- 1 * sizeof(BOOLEAN) +
- 2 * sizeof(HANDLE) +
- length_as_utf8(&entry->u.Open.symlink);
- @@ -152,12 +149,6 @@ NTSTATUS marshal_nfs41_open(
- tmp += sizeof(entry->u.Open.open_owner_id);
- RtlCopyMemory(tmp, &entry->u.Open.mode, sizeof(DWORD));
- tmp += sizeof(DWORD);
- -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- - RtlCopyMemory(tmp, &entry->u.Open.owner_local_uid, sizeof(DWORD));
- - tmp += sizeof(DWORD);
- - RtlCopyMemory(tmp, &entry->u.Open.owner_group_local_gid, sizeof(DWORD));
- - tmp += sizeof(DWORD);
- -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- RtlCopyMemory(tmp, &entry->u.Open.srv_open, sizeof(HANDLE));
- tmp += sizeof(HANDLE);
- status = marshall_unicode_as_utf8(&tmp, &entry->u.Open.symlink);
- @@ -190,16 +181,10 @@ NTSTATUS marshal_nfs41_open(
- #ifdef DEBUG_MARSHAL_DETAIL
- DbgP("marshal_nfs41_open: name='%wZ' mask=0x%x access=0x%x attrs=0x%x "
- "opts=0x%x dispo=0x%x open_owner_id=0x%x mode=0%o "
- -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- - "owner_local_uid=%lu owner_group_local_gid=%lu "
- -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- "srv_open=0x%p ea=0x%p\n",
- entry->filename, entry->u.Open.access_mask,
- entry->u.Open.access_mode, entry->u.Open.attrs, entry->u.Open.copts,
- entry->u.Open.disp, entry->u.Open.open_owner_id, entry->u.Open.mode,
- -#ifdef NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES
- - entry->u.Open.owner_local_uid,entry->u.Open.owner_group_local_gid,
- -#endif /* NFS41_DRIVER_FEATURE_LOCAL_UIDGID_IN_NFSV3ATTRIBUTES */
- entry->u.Open.srv_open, entry->u.Open.EaBuffer);
- #endif
- out:
- --
- 2.45.1
- From 17eddea0b8a959ea8254556e42376b7ef8efabba Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Sat, 26 Jul 2025 15:50:15 +0200
- Subject: [PATCH 4/4] README.md,docs: Add MariaDB+Office 2016+misc to
- supported+tested software
- Add MariaDB+Office 2016+misc to supported+tested software.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- README.md | 10 ++++++++--
- docs/README.xml | 8 +++++++-
- 2 files changed, 15 insertions(+), 3 deletions(-)
- diff --git a/README.md b/README.md
- index 9c3a2de..48e6695 100644
- --- a/README.md
- +++ b/README.md
- @@ -174,7 +174,8 @@ NFSv4.2/NFSv4.1 filesystem driver for Windows 10/11 & Windows Server
- and other POSIX-compatible NFSv4.2/NFSv4.1 clients.
- - Support for NFSv4 public mounts (i.e., use the NFSv4 public file
- - handle lookup protocol via `$ nfs_mount -o public ... #`)
- + handle lookup protocol via
- + `$ nfs_mount -o public ... relative-path-or-url#`)
- - Support for NFSv4 referrals
- @@ -210,11 +211,16 @@ NFSv4.2/NFSv4.1 filesystem driver for Windows 10/11 & Windows Server
- - All tools from Cygwin/MSYS2/MinGW
- - - Visual Studio
- + - Visual Studio (tested: VS2019, VS2022)
- - VMware Workstation (can use VMs hosted on NFSv4.2/NFSv4.1
- filesystem)
- + - MariaDB (including sparse file support for [page
- + compression](https://dev.mysql.com/doc/refman/8.4/en/innodb-page-compression.html))
- +
- + - Microsoft Office (tested: Office 2016)
- +
- # Requirements
- - Windows 10 (32bit or 64bit), Windows 11 or Windows Server 2019+2022
- diff --git a/docs/README.xml b/docs/README.xml
- index 86f783e..6fc896a 100644
- --- a/docs/README.xml
- +++ b/docs/README.xml
- @@ -235,11 +235,17 @@
- <para>All tools from Cygwin/MSYS2/MinGW</para>
- </listitem>
- <listitem>
- - <para>Visual Studio</para>
- + <para>Visual Studio (tested: VS2019, VS2022)</para>
- </listitem>
- <listitem>
- <para>VMware Workstation (can use VMs hosted on NFSv4.2/NFSv4.1 filesystem)</para>
- </listitem>
- + <listitem>
- + <para>MariaDB (including sparse file support for <link xl:href="https://dev.mysql.com/doc/refman/8.4/en/innodb-page-compression.html">page compression</link>)</para>
- + </listitem>
- + <listitem>
- + <para>Microsoft Office (tested: Office 2016)</para>
- + </listitem>
- </itemizedlist>
- </para>
- </listitem>
- --
- 2.45.1
msnfs41client: Patches for opening volume (dir) as file, docs, cleanup, tests+misc, 2025-07-26
Posted by Anonymous on Sat 26th Jul 2025 15:59
raw | new post
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.