pastebin - collaborative debugging tool
rovema.kpaste.net RSS


msnfs41client: Add "getfinalpath" subcmd to winfsinfo, 2025-06-27
Posted by Anonymous on Fri 27th Jun 2025 12:53
raw | new post

  1. From 148ab6430da7734e1cbb98b75e15ccbab95be302 Mon Sep 17 00:00:00 2001
  2. From: Roland Mainz <roland.mainz@nrubsig.org>
  3. Date: Fri, 27 Jun 2025 13:47:29 +0200
  4. Subject: [PATCH] tests: winfsinfo: Add "getfinalpath" subcmd
  5.  
  6. winfsinfo: Add "getfinalpath" subcmd to query a file
  7. via |GetFinalPathNameByHandleW()|.
  8.  
  9. Signed-off-by: Cedric Blancher <cedric.blancher@gmail.com>
  10. ---
  11. tests/winfsinfo1/winfsinfo.c | 67 ++++++++++++++++++++++++++++++++++++
  12.  1 file changed, 67 insertions(+)
  13.  
  14. diff --git a/tests/winfsinfo1/winfsinfo.c b/tests/winfsinfo1/winfsinfo.c
  15. index 1d2989a..8e28205 100644
  16. --- a/tests/winfsinfo1/winfsinfo.c
  17. +++ b/tests/winfsinfo1/winfsinfo.c
  18. @@ -153,6 +153,69 @@ done:
  19.      return res;
  20.  }
  21.  
  22. +static
  23. +bool getfinalpath(const char *progname, const char *filename)
  24. +{
  25. +    int res = EXIT_FAILURE;
  26. +    bool ok;
  27. +    wchar_t buffer[4096];
  28. +
  29. +    HANDLE fileHandle = CreateFileA(filename,
  30. +        GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
  31. +        FILE_FLAG_BACKUP_SEMANTICS, NULL);
  32. +    if (fileHandle == INVALID_HANDLE_VALUE) {
  33. +        (void)fprintf(stderr,
  34. +            "%s: Error opening file '%s'. Last error was %d.\n",
  35. +            progname,
  36. +            filename,
  37. +            (int)GetLastError());
  38. +        return EXIT_FAILURE;
  39. +    }
  40. +
  41. +    typedef struct _gfpn_ops{
  42. +        const char *name;
  43. +        DWORD flags;
  44. +    } gfpn_ops;
  45. +
  46. +    gfpn_ops opts[] ={
  47. +        { .name = "normalized_volume_name_dos",     .flags = FILE_NAME_NORMALIZED|VOLUME_NAME_DOS },
  48. +        { .name = "normalized_volume_name_guid",    .flags = FILE_NAME_NORMALIZED|VOLUME_NAME_GUID },
  49. +        { .name = "normalized_volume_name_none",    .flags = FILE_NAME_NORMALIZED|VOLUME_NAME_NONE },
  50. +        { .name = "normalized_volume_name_nt",      .flags = FILE_NAME_NORMALIZED|VOLUME_NAME_NT },
  51. +        { .name = "opened_volume_name_dos",         .flags = FILE_NAME_OPENED|VOLUME_NAME_DOS },
  52. +        { .name = "opened_volume_name_guid",        .flags = FILE_NAME_OPENED|VOLUME_NAME_GUID },
  53. +        { .name = "opened_volume_name_none",        .flags = FILE_NAME_OPENED|VOLUME_NAME_NONE },
  54. +        { .name = "opened_volume_name_nt",          .flags = FILE_NAME_OPENED|VOLUME_NAME_NT },
  55. +        { .name = NULL,                             .flags = 0 }
  56. +    };
  57. +
  58. +    (void)printf("(\n");
  59. +    (void)printf("\tfilename='%s'\n", filename);
  60. +
  61. +    (void)printf("\ttypeset -A paths=(\n");
  62. +
  63. +    for (gfpn_ops *o = opts ; o->name != NULL ; o++) {
  64. +        ok = GetFinalPathNameByHandleW(fileHandle, buffer, 4096, o->flags);
  65. +        if (ok) {
  66. +            (void)printf("\t\t['%s']='%ls'\n", o->name, buffer);
  67. +        }
  68. +        else {
  69. +            (void)fprintf(stderr, "%s: GetFinalPathNameByHandleW(%s) "
  70. +                "error. GetLastError()==%d.\n",
  71. +                progname,
  72. +                o->name,
  73. +                (int)GetLastError());
  74. +        }
  75. +    }
  76. +
  77. +    (void)printf("\t)\n");
  78. +    (void)printf(")\n");
  79. +    res = EXIT_SUCCESS;
  80. +
  81. +    (void)CloseHandle(fileHandle);
  82. +    return res;
  83. +}
  84. +
  85.  typedef struct _IO_STATUS_BLOCK {
  86.      union {
  87.          NTSTATUS Status;
  88. @@ -1273,6 +1336,7 @@ void usage(void)
  89.  {
  90.      (void)fprintf(stderr, "winfsinfo <"
  91.          "getvolumeinfo|"
  92. +        "getfinalpath|"
  93.  #ifdef NTDLL_HAS_ZWQUERYVOLUMEINFORMATIONFILE
  94.          "getfilefssectorsizeinformation|"
  95.  #endif /* NTDLL_HAS_ZWQUERYVOLUMEINFORMATIONFILE */
  96. @@ -1314,6 +1378,9 @@ int main(int ac, char *av[])
  97.      if (!strcmp(subcmd, "getvolumeinfo")) {
  98.          return getvolumeinfo(av[0], av[2]);
  99.      }
  100. +    if (!strcmp(subcmd, "getfinalpath")) {
  101. +        return getfinalpath(av[0], av[2]);
  102. +    }
  103.  #ifdef NTDLL_HAS_ZWQUERYVOLUMEINFORMATIONFILE
  104.      if (!strcmp(subcmd, "getfilefssectorsizeinformation")) {
  105.          return getfilefssectorsizeinformation(av[0], av[2]);
  106. --
  107. 2.45.1

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.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at