[MPR]
authorPierre Schweitzer <pierre@reactos.org>
Mon, 31 Oct 2016 21:17:46 +0000 (21:17 +0000)
committerPierre Schweitzer <pierre@reactos.org>
Mon, 31 Oct 2016 21:17:46 +0000 (21:17 +0000)
Allow saving connections when using WNetUseConnection(), WNetAddConnection2().
It makes the "net use /persistent" switch working (ie, saving connection - not restoring connections).

CORE-11757

svn path=/trunk/; revision=73091

reactos/dll/win32/mpr/mpr_ros.diff
reactos/dll/win32/mpr/wnet.c

index 6f3470a..230e5ed 100644 (file)
@@ -49,27 +49,71 @@ Index: wnet.c
 ===================================================================\r
 --- wnet.c     (revision 71983)\r
 +++ wnet.c     (working copy)\r
-@@ -48,6 +48,9 @@\r
-     PF_NPGetResourceInformation getResourceInformation;\r
+@@ -60,6 +50,9 @@\r
      PF_NPAddConnection addConnection;\r
      PF_NPAddConnection3 addConnection3;\r
+     PF_NPCancelConnection cancelConnection;\r
 +#ifdef __REACTOS__\r
 +    PF_NPGetConnection getConnection;\r
 +#endif\r
  } WNetProvider, *PWNetProvider;\r
  \r
  typedef struct _WNetProviderTable\r
-@@ -196,6 +199,9 @@\r
-                         }\r
+@@ -214,6 +207,9 @@\r
                          provider->addConnection = MPR_GETPROC(NPAddConnection);\r
                          provider->addConnection3 = MPR_GETPROC(NPAddConnection3);\r
+                         provider->cancelConnection = MPR_GETPROC(NPCancelConnection);\r
 +#ifdef __REACTOS__\r
 +                        provider->getConnection = MPR_GETPROC(NPGetConnection);\r
 +#endif\r
                          TRACE("NPAddConnection %p\n", provider->addConnection);\r
                          TRACE("NPAddConnection3 %p\n", provider->addConnection3);\r
-                         providerTable->numProviders++;\r
-@@ -1949,6 +1955,7 @@\r
+                         TRACE("NPCancelConnection %p\n", provider->cancelConnection);\r
+@@ -1870,6 +1866,43 @@\r
+         }\r
+     }\r
\r
++#ifdef __REACTOS__\r
++    if (ret == WN_SUCCESS && ctxt->flags & CONNECT_UPDATE_PROFILE)\r
++    {\r
++        HKEY user_profile;\r
++\r
++        if (netres.dwType == RESOURCETYPE_PRINT)\r
++        {\r
++            FIXME("Persistent connection are not supported for printers\n");\r
++            return ret;\r
++        }\r
++\r
++        if (RegOpenCurrentUser(KEY_ALL_ACCESS, &user_profile) == ERROR_SUCCESS)\r
++        {\r
++            HKEY network;\r
++            WCHAR subkey[10] = {'N', 'e', 't', 'w', 'o', 'r', 'k', '\\', netres.lpLocalName[0], 0};\r
++\r
++            if (RegCreateKeyExW(user_profile, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &network, NULL) == ERROR_SUCCESS)\r
++            {\r
++                DWORD dword_arg = RESOURCETYPE_DISK;\r
++                DWORD len = (strlenW(provider->name) + 1) * sizeof(WCHAR);\r
++\r
++                RegSetValueExW(network, L"ConnectionType", 0, REG_DWORD, (const BYTE *)&dword_arg, sizeof(DWORD));\r
++                RegSetValueExW(network, L"ProviderName", 0, REG_SZ, (const BYTE *)provider->name, len);\r
++                dword_arg = provider->dwNetType;\r
++                RegSetValueExW(network, L"ProviderType", 0, REG_DWORD, (const BYTE *)&dword_arg, sizeof(DWORD));\r
++                len = (strlenW(netres.lpRemoteName) + 1) * sizeof(WCHAR);\r
++                RegSetValueExW(network, L"RemotePath", 0, REG_SZ, (const BYTE *)netres.lpRemoteName, len);\r
++                len = 0;\r
++                RegSetValueExW(network, L"UserName", 0, REG_SZ, (const BYTE *)netres.lpRemoteName, len);\r
++                RegCloseKey(network);\r
++            }\r
++\r
++            RegCloseKey(user_profile);\r
++        }\r
++    }\r
++#endif\r
++\r
+     return ret;\r
+ }\r
\r
+@@ -2188,6 +2221,7 @@\r
  /* find the network connection for a given drive; helper for WNetGetConnection */\r
  static DWORD get_drive_connection( WCHAR letter, LPWSTR remote, LPDWORD size )\r
  {\r
@@ -77,7 +121,7 @@ Index: wnet.c
      char buffer[1024];\r
      struct mountmgr_unix_drive *data = (struct mountmgr_unix_drive *)buffer;\r
      HANDLE mgr;\r
-@@ -1991,6 +1998,32 @@\r
+@@ -2230,6 +2264,32 @@\r
      }\r
      CloseHandle( mgr );\r
      return ret;\r
index 794bf2e..ae281e3 100644 (file)
@@ -1866,6 +1866,43 @@ static DWORD wnet_use_connection( struct use_connection_context *ctxt )
         }
     }
 
+#ifdef __REACTOS__
+    if (ret == WN_SUCCESS && ctxt->flags & CONNECT_UPDATE_PROFILE)
+    {
+        HKEY user_profile;
+
+        if (netres.dwType == RESOURCETYPE_PRINT)
+        {
+            FIXME("Persistent connection are not supported for printers\n");
+            return ret;
+        }
+
+        if (RegOpenCurrentUser(KEY_ALL_ACCESS, &user_profile) == ERROR_SUCCESS)
+        {
+            HKEY network;
+            WCHAR subkey[10] = {'N', 'e', 't', 'w', 'o', 'r', 'k', '\\', netres.lpLocalName[0], 0};
+
+            if (RegCreateKeyExW(user_profile, subkey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &network, NULL) == ERROR_SUCCESS)
+            {
+                DWORD dword_arg = RESOURCETYPE_DISK;
+                DWORD len = (strlenW(provider->name) + 1) * sizeof(WCHAR);
+
+                RegSetValueExW(network, L"ConnectionType", 0, REG_DWORD, (const BYTE *)&dword_arg, sizeof(DWORD));
+                RegSetValueExW(network, L"ProviderName", 0, REG_SZ, (const BYTE *)provider->name, len);
+                dword_arg = provider->dwNetType;
+                RegSetValueExW(network, L"ProviderType", 0, REG_DWORD, (const BYTE *)&dword_arg, sizeof(DWORD));
+                len = (strlenW(netres.lpRemoteName) + 1) * sizeof(WCHAR);
+                RegSetValueExW(network, L"RemotePath", 0, REG_SZ, (const BYTE *)netres.lpRemoteName, len);
+                len = 0;
+                RegSetValueExW(network, L"UserName", 0, REG_SZ, (const BYTE *)netres.lpRemoteName, len);
+                RegCloseKey(network);
+            }
+
+            RegCloseKey(user_profile);
+        }
+    }
+#endif
+
     return ret;
 }