- From 79c438f2aef57aef28ee8cf9a04396c5c6231378 Mon Sep 17 00:00:00 2001
- From: Roland Mainz <roland.mainz@nrubsig.org>
- Date: Tue, 11 Mar 2025 20:11:54 +0100
- Subject: [PATCH] sys,tests: Implement |FileNetworkPhysicalNameInformation|
- support
- Implement |FileNetworkPhysicalNameInformation| support.
- Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
- ---
- sys/nfs41sys_fileinfo.c | 38 ++++++++++++++++++
- tests/winfsinfo1/winfsinfo.c | 77 ++++++++++++++++++++++++++++++++++++
- 2 files changed, 115 insertions(+)
- diff --git a/sys/nfs41sys_fileinfo.c b/sys/nfs41sys_fileinfo.c
- index 6efa067..4c7dceb 100644
- --- a/sys/nfs41sys_fileinfo.c
- +++ b/sys/nfs41sys_fileinfo.c
- @@ -280,6 +280,44 @@ NTSTATUS nfs41_QueryFileInformation(
- goto out;
- }
- #endif /* NFS41_DRIVER_DISABLE_8DOT3_SHORTNAME_GENERATION */
- + /*
- + * |FileNetworkPhysicalNameInformation| - return UNC path -
- + * basically the same logic as |FileNormalizedNameInformation|
- + * above in our case (but without the 8.3 filename
- + * restrictions).
- + */
- + case FileNetworkPhysicalNameInformation:
- + {
- + if (RxContext->Info.LengthRemaining <
- + FIELD_OFFSET(FILE_NAME_INFORMATION, FileName)) {
- + RxContext->Info.Length = 0;
- + status = STATUS_BUFFER_OVERFLOW;
- + goto out;
- + }
- +
- + PFILE_NETWORK_PHYSICAL_NAME_INFORMATION fnpni =
- + (PFILE_NETWORK_PHYSICAL_NAME_INFORMATION)
- + RxContext->Info.Buffer;
- + RxContext->Info.LengthRemaining -=
- + FIELD_OFFSET(FILE_NETWORK_PHYSICAL_NAME_INFORMATION,
- + FileName);
- +
- + RxConjureOriginalName((PFCB)RxContext->pFcb,
- + (PFOBX)RxContext->pFobx,
- + &fnpni->FileNameLength,
- + &fnpni->FileName[0],
- + &RxContext->Info.Length,
- + VNetRoot_As_UNC_Name);
- +
- + if (RxContext->Info.LengthRemaining < 0) {
- + RxContext->Info.Length = 0;
- + status = STATUS_BUFFER_OVERFLOW;
- + goto out;
- + }
- +
- + status = STATUS_SUCCESS;
- + goto out;
- + }
- case FileEaInformation:
- {
- if (RxContext->Info.LengthRemaining <
- diff --git a/tests/winfsinfo1/winfsinfo.c b/tests/winfsinfo1/winfsinfo.c
- index de1d95e..10616ed 100644
- --- a/tests/winfsinfo1/winfsinfo.c
- +++ b/tests/winfsinfo1/winfsinfo.c
- @@ -1194,6 +1194,79 @@ out:
- return retval;
- }
- +typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
- + ULONG FileNameLength;
- + WCHAR FileName[1];
- +} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
- +
- +NTSYSAPI
- +NTSTATUS
- +NTAPI
- +ZwQueryInformationFile(
- + _In_ HANDLE FileHandle,
- + _Out_ PIO_STATUS_BLOCK IoStatusBlock,
- + _Out_writes_bytes_(Length) PVOID FileInformation,
- + _In_ ULONG Length,
- + _In_ FILE_INFORMATION_CLASS FileInformationClass
- +);
- +
- +static
- +bool get_filenetworkphysicalnameinfo(const char *progname, const char *filename)
- +{
- + int res = EXIT_FAILURE;
- + NTSTATUS status;
- + IO_STATUS_BLOCK iostatus;
- + PFILE_NETWORK_PHYSICAL_NAME_INFORMATION fnpni = NULL;
- +
- + HANDLE fileHandle = CreateFileA(filename,
- + GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
- + FILE_FLAG_BACKUP_SEMANTICS, NULL);
- + if (fileHandle == INVALID_HANDLE_VALUE) {
- + (void)fprintf(stderr,
- + "%s: Error opening file '%s'. Last error was %d.\n",
- + progname,
- + filename,
- + (int)GetLastError());
- + return EXIT_FAILURE;
- + }
- +
- +#define FNPNI_MAXCHARS (16384)
- + fnpni = calloc(1,
- + sizeof(FILE_NETWORK_PHYSICAL_NAME_INFORMATION)+sizeof(wchar_t)*FNPNI_MAXCHARS);
- + if (fnpni == NULL) {
- + (void)fprintf(stderr,
- + "%s: Out of memory.\n",
- + progname);
- + return EXIT_FAILURE;
- + }
- +
- + status = ZwQueryInformationFile(fileHandle,
- + &iostatus,
- + fnpni,
- + (sizeof(FILE_NETWORK_PHYSICAL_NAME_INFORMATION)+sizeof(wchar_t)*FNPNI_MAXCHARS),
- + FileNetworkPhysicalNameInformation);
- +
- + if (status != STATUS_SUCCESS) {
- + (void)fprintf(stderr, "%s: GetFileInformationByHandleEx() "
- + "error. status==0x%lx.\n",
- + progname,
- + (long)status);
- + res = EXIT_FAILURE;
- + goto done;
- + }
- +
- + (void)printf("(\n");
- + (void)printf("\tfilename='%s'\n", filename);
- + (void)printf("\tfnpni_FileName='%S'\n",
- + fnpni->FileName);
- + (void)printf(")\n");
- + res = EXIT_SUCCESS;
- +
- +done:
- + free(fnpni);
- + (void)CloseHandle(fileHandle);
- + return res;
- +}
- static
- void usage(void)
- @@ -1213,6 +1286,7 @@ void usage(void)
- "nfs3attr|"
- "fileremoteprotocolinfo|"
- "fileidinfo|"
- + "filenetworkphysicalnameinfo|"
- "fsctlqueryallocatedranges"
- "> path\n");
- }
- @@ -1275,6 +1349,9 @@ int main(int ac, char *av[])
- else if (!strcmp(subcmd, "fileidinfo")) {
- return get_fileidinfo(av[0], av[2]);
- }
- + else if (!strcmp(subcmd, "filenetworkphysicalnameinfo")) {
- + return get_filenetworkphysicalnameinfo(av[0], av[2]);
- + }
- else if (!strcmp(subcmd, "fsctlqueryallocatedranges")) {
- return fsctlqueryallocatedranges(av[0], av[2]);
- }
- --
- 2.45.1
msnfs41client: Patch to implement |FileNetworkPhysicalNameInformation|, 2025-03-11
Posted by Anonymous on Tue 11th Mar 2025 19:21
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.