[FLTMC] Implement 'fltmc volumes'
authorGed Murphy <gedmurphy@reactos.org>
Sun, 11 Nov 2018 17:57:56 +0000 (17:57 +0000)
committerGed Murphy <gedmurphy@reactos.org>
Sun, 11 Nov 2018 17:58:39 +0000 (17:58 +0000)
base/applications/fltmc/fltmc.cpp
base/applications/fltmc/lang/en-US.rc
base/applications/fltmc/resource.h

index 1aca074..3220a6e 100644 (file)
@@ -202,6 +202,64 @@ PrintFilterInfo(_In_ PVOID Buffer,
     }
 }
 
+void
+PrintVolumeInfo(_In_ PVOID Buffer)
+{
+    PFILTER_VOLUME_STANDARD_INFORMATION FilterVolInfo;
+    WCHAR DosName[16] = { 0 };
+    WCHAR VolName[128] = { 0 };
+    WCHAR FileSystem[32] = { 0 };
+
+    FilterVolInfo = (PFILTER_VOLUME_STANDARD_INFORMATION)Buffer;
+
+    if (FilterVolInfo->FilterVolumeNameLength < 128)
+    {
+        CopyMemory(VolName,
+                   (PCHAR)FilterVolInfo->FilterVolumeName,
+                   FilterVolInfo->FilterVolumeNameLength);
+        VolName[FilterVolInfo->FilterVolumeNameLength] = UNICODE_NULL;
+    }
+
+    (void)FilterGetDosName(VolName, DosName, 16);
+
+    switch (FilterVolInfo->FileSystemType)
+    {
+    case FLT_FSTYPE_MUP:
+        StringCchCopyW(FileSystem, 32, L"Remote");
+        break;
+
+    case FLT_FSTYPE_NTFS:
+        StringCchCopyW(FileSystem, 32, L"NTFS");
+        break;
+
+    case FLT_FSTYPE_FAT:
+        StringCchCopyW(FileSystem, 32, L"FAT");
+        break;
+
+    case FLT_FSTYPE_EXFAT:
+        StringCchCopyW(FileSystem, 32, L"exFAT");
+        break;
+
+    case FLT_FSTYPE_NPFS:
+        StringCchCopyW(FileSystem, 32, L"NamedPipe");
+        break;
+
+    case FLT_FSTYPE_MSFS:
+        StringCchCopyW(FileSystem, 32, L"Mailslot");
+        break;
+
+    case FLT_FSTYPE_UNKNOWN:
+    default:
+        StringCchCopyW(FileSystem, 32, L"<Unknown>");
+        break;
+    }
+
+    wprintf(L"%-31s %-40s %-10s\n",
+            DosName,
+            VolName,
+            FileSystem);
+}
+
 void
 ListFilters()
 {
@@ -260,7 +318,51 @@ ListFilters()
 
     if (!SUCCEEDED(hr) && hr != HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
     {
-        LoadAndPrintString(IDS_ERROR_PRIV, hr);
+        LoadAndPrintString(IDS_ERROR_FILTERS, hr);
+        PrintErrorText(hr);
+    }
+}
+
+void
+ListVolumes()
+{
+    HANDLE FindHandle;
+    BYTE Buffer[1024];
+    ULONG BytesReturned;
+    HRESULT hr;
+
+    hr = FilterVolumeFindFirst(FilterVolumeStandardInformation,
+                               Buffer,
+                               1024,
+                               &BytesReturned,
+                               &FindHandle);
+    if (SUCCEEDED(hr))
+    {
+        LoadAndPrintString(IDS_DISPLAY_VOLUMES);
+        wprintf(L"------------------------------  ---------------------------------------  ----------  --------\n");
+
+        PrintVolumeInfo(Buffer);
+
+        do
+        {
+            hr = FilterVolumeFindNext(FindHandle,
+                                      FilterVolumeStandardInformation,
+                                      Buffer,
+                                      1024,
+                                      &BytesReturned);
+            if (SUCCEEDED(hr))
+            {
+                PrintVolumeInfo(Buffer);
+            }
+
+        } while (SUCCEEDED(hr));
+
+        FilterVolumeFindClose(FindHandle);
+    }
+
+    if (!SUCCEEDED(hr) && hr != HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
+    {
+        LoadAndPrintString(IDS_ERROR_VOLUMES, hr);
         PrintErrorText(hr);
     }
 }
@@ -309,6 +411,18 @@ int wmain(int argc, WCHAR *argv[])
             wprintf(L"fltmc.exe unload [name]\n\n");
         }
     }
+    else if (!_wcsicmp(argv[1], L"volumes"))
+    {
+        if (argc == 2)
+        {
+            ListVolumes();
+        }
+        else
+        {
+            LoadAndPrintString(IDS_USAGE_VOLUMES);
+            wprintf(L"fltmc.exe volumes [name]\n\n");
+        }
+    }
 
     return 0;
 }
index 95e0338..721855e 100644 (file)
@@ -16,6 +16,7 @@ STRINGTABLE
 BEGIN
     IDS_DISPLAY_FILTERS1    "Filter Name                     Num Instances    Altitude    Frame\n"
     IDS_DISPLAY_FILTERS2    "Filter Name                     Num Instances   Frame\n"
+    IDS_DISPLAY_VOLUMES     "Dos Name                        Volume Name                              FileSystem   Status\n"
 END
 
 STRINGTABLE
@@ -24,4 +25,5 @@ BEGIN
     IDS_ERROR_FILTERS   "Failed to list the filters (0x%X)\n"
     IDS_ERROR_LOAD      "Failed to load the filter (0x%X)\n"
     IDS_ERROR_UNLOAD    "Failed to unload the filter (0x%X)\n"
+    IDS_ERROR_VOLUMES   "Failed to list the volumes (0x%X)\n"
 END
index 366b6bd..b3a0543 100644 (file)
@@ -4,11 +4,14 @@
 #define IDS_USAGE_LOAD              1
 #define IDS_USAGE_UNLOAD            2
 #define IDS_USAGE_FILTERS           3
+#define IDS_USAGE_VOLUMES           4
 
 #define IDS_DISPLAY_FILTERS1        10
 #define IDS_DISPLAY_FILTERS2        11
+#define IDS_DISPLAY_VOLUMES         12
 
 #define IDS_ERROR_PRIV              20
 #define IDS_ERROR_FILTERS           21
 #define IDS_ERROR_LOAD              22
 #define IDS_ERROR_UNLOAD            23
+#define IDS_ERROR_VOLUMES           24