From 23a232fce8899a24e76207518175235b7b0f00cd Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Tue, 27 Nov 2018 19:54:48 +0100 Subject: [PATCH] mpr: Implement support for making connections persistent. Signed-off-by: Pierre Schweitzer Signed-off-by: Alexandre Julliard --- dlls/mpr/wnet.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/dlls/mpr/wnet.c b/dlls/mpr/wnet.c index d0b4ba87814..3db0ab102a9 100644 --- a/dlls/mpr/wnet.c +++ b/dlls/mpr/wnet.c @@ -2004,9 +2004,12 @@ static DWORD wnet_use_provider( struct use_connection_context *ctxt, NETRESOURCE return ret; } +static const WCHAR providerType[] = { 'P','r','o','v','i','d','e','r','T','y','p','e',0 }; +static const WCHAR userName[] = { 'U','s','e','r','N','a','m','e',0 }; + static DWORD wnet_use_connection( struct use_connection_context *ctxt ) { - WNetProvider *provider; + WNetProvider *provider = NULL; DWORD index, ret = WN_NO_NETWORK; BOOL redirect = FALSE; WCHAR letter[3] = {'Z', ':', 0}; @@ -2060,6 +2063,42 @@ static DWORD wnet_use_connection( struct use_connection_context *ctxt ) } } + 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); + static const WCHAR empty[1] = {0}; + + RegSetValueExW(network, connectionType, 0, REG_DWORD, (const BYTE *)&dword_arg, sizeof(DWORD)); + RegSetValueExW(network, providerName, 0, REG_SZ, (const BYTE *)provider->name, len); + RegSetValueExW(network, providerType, 0, REG_DWORD, (const BYTE *)&provider->dwNetType, sizeof(DWORD)); + len = (strlenW(netres.lpRemoteName) + 1) * sizeof(WCHAR); + RegSetValueExW(network, remotePath, 0, REG_SZ, (const BYTE *)netres.lpRemoteName, len); + len = sizeof(empty); + RegSetValueExW(network, userName, 0, REG_SZ, (const BYTE *)empty, len); + RegCloseKey(network); + } + + RegCloseKey(user_profile); + } + } + return ret; }