https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b518fc065d5e236bd73ee51a48e8e12eaa7140e4

commit b518fc065d5e236bd73ee51a48e8e12eaa7140e4
Author:     Pierre Schweitzer <pie...@reactos.org>
AuthorDate: Tue Dec 11 14:55:09 2018 +0100
Commit:     Pierre Schweitzer <pie...@reactos.org>
CommitDate: Tue Dec 11 15:04:25 2018 +0100

    [VCDCONTROLTOOL] Implement support for persistent mounts
---
 .../applications/vcdcontroltool/vcdcontroltool.c   | 35 +++++++++++++++++-----
 1 file changed, 28 insertions(+), 7 deletions(-)

diff --git a/modules/rosapps/applications/vcdcontroltool/vcdcontroltool.c 
b/modules/rosapps/applications/vcdcontroltool/vcdcontroltool.c
index bd7ca6cf70..542bb1dcbb 100644
--- a/modules/rosapps/applications/vcdcontroltool/vcdcontroltool.c
+++ b/modules/rosapps/applications/vcdcontroltool/vcdcontroltool.c
@@ -14,6 +14,7 @@
 #include <winuser.h>
 #include <wingdi.h>
 #include <winsvc.h>
+#include <winreg.h>
 #include <commctrl.h>
 #include <commdlg.h>
 #include <wchar.h>
@@ -371,12 +372,6 @@ SetMountFileName(HWND hDlg,
     hEditText = GetDlgItem(hMountWnd, IDC_MOUNTIMAGE);
     SendMessage(hEditText, WM_SETTEXT, 0, lParam);
 
-    /* FIXME: we don't support persistent mounts yet*/
-    {
-        hEditText = GetDlgItem(hMountWnd, IDC_MOUNTPERSIST);
-        EnableWindow(hEditText, FALSE);
-    }
-
     /* Show our window */
     ShowWindow(hDlg, SW_SHOW);
 
@@ -400,6 +395,9 @@ PerformMount(VOID)
     UNICODE_STRING NtPathName;
     HANDLE hLet;
     DWORD BytesRead;
+    BOOLEAN bPersist, Res;
+    WCHAR szKeyName[256];
+    HKEY hKey;
 
     /* Zero our input structure */
     ZeroMemory(&MountParams, sizeof(MOUNT_PARAMETERS));
@@ -418,6 +416,10 @@ PerformMount(VOID)
         MountParams.Flags |= MOUNT_FLAG_SUPP_JOLIET;
     }
 
+    /* Should the mount be persistent? */
+    hControl = GetDlgItem(hMountWnd, IDC_MOUNTPERSIST);
+    bPersist = (SendMessage(hControl, BM_GETCHECK, 0, 0) == BST_CHECKED);
+
     /* Get the file name */
     hControl = GetDlgItem(hMountWnd, IDC_MOUNTIMAGE);
     GetWindowText(hControl, szFileName, sizeof(szFileName) / sizeof(WCHAR));
@@ -435,12 +437,31 @@ PerformMount(VOID)
         if (hLet != INVALID_HANDLE_VALUE)
         {
             /* And issue the mount IOCTL */
-            DeviceIoControl(hLet, IOCTL_VCDROM_MOUNT_IMAGE, &MountParams, 
sizeof(MountParams), NULL, 0, &BytesRead, NULL);
+            Res = DeviceIoControl(hLet, IOCTL_VCDROM_MOUNT_IMAGE, 
&MountParams, sizeof(MountParams), NULL, 0, &BytesRead, NULL);
 
             CloseHandle(hLet);
 
             /* Refresh the list so that our mount appears */
             RefreshDevicesList(0);
+
+            /* If mount succeed and has to persistent, write it to registry */
+            if (Res && bPersist)
+            {
+                wsprintf(szKeyName, 
L"SYSTEM\\CurrentControlSet\\Services\\Vcdrom\\Parameters\\Device%c", 
wMountLetter);
+                if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKeyName, 0, NULL, 
REG_OPTION_NON_VOLATILE, KEY_CREATE_SUB_KEY | KEY_SET_VALUE, NULL, &hKey, NULL) 
== ERROR_SUCCESS)
+                {
+                    wcsncpy(szKeyName, MountParams.Path, MountParams.Length);
+                    szKeyName[MountParams.Length / sizeof(WCHAR)] = 0;
+                    RegSetValueExW(hKey, L"IMAGE", 0, REG_SZ, (BYTE 
*)szKeyName, MountParams.Length);
+
+                    szKeyName[0] = wMountLetter;
+                    szKeyName[1] = L':';
+                    szKeyName[2] = 0;
+                    RegSetValueExW(hKey, L"DRIVE", 0, REG_SZ, (BYTE 
*)szKeyName, 3 * sizeof(WCHAR));
+
+                    RegCloseKey(hKey);
+                }
+            }
         }
     }
 

Reply via email to