[MPR] Drop a nasty ReactOS specific hack

That hack (cf. previous commit) was used to restore all
the saved connections. But, because it was implemented
in the wrong place, each time the MPR DLL was attached,
it was trying to restore connections.

With that commit and the previous one, now, ReactOS has
a correct behavior (it tries to bring back connections
only at session opening) and will reduce "workload" for
applications attaching MPR dll.

CORE-15310
This commit is contained in:
Pierre Schweitzer 2018-11-17 22:01:13 +01:00
parent 4cf87fdb2c
commit 5e024bfeb6
No known key found for this signature in database
GPG key ID: 7545556C3D585B0B

View file

@ -296,85 +296,6 @@ static void _tryLoadProvider(PCWSTR provider)
debugstr_w(provider));
}
#ifdef __REACTOS__
static void _restoreSavedConnection(HKEY connection, WCHAR * local)
{
NETRESOURCEW net;
DWORD type, prov, index, size;
net.lpProvider = NULL;
net.lpRemoteName = NULL;
net.lpLocalName = NULL;
TRACE("Restoring: %S\n", local);
size = sizeof(DWORD);
if (RegQueryValueExW(connection, L"ConnectionType", NULL, &type, (BYTE *)&net.dwType, &size) != ERROR_SUCCESS)
return;
if (type != REG_DWORD || size != sizeof(DWORD))
return;
if (RegQueryValueExW(connection, L"ProviderName", NULL, &type, NULL, &size) != ERROR_SUCCESS)
return;
if (type != REG_SZ)
return;
net.lpProvider = HeapAlloc(GetProcessHeap(), 0, size);
if (!net.lpProvider)
return;
if (RegQueryValueExW(connection, L"ProviderName", NULL, NULL, (BYTE *)net.lpProvider, &size) != ERROR_SUCCESS)
goto cleanup;
size = sizeof(DWORD);
if (RegQueryValueExW(connection, L"ProviderType", NULL, &type, (BYTE *)&prov, &size) != ERROR_SUCCESS)
goto cleanup;
if (type != REG_DWORD || size != sizeof(DWORD))
goto cleanup;
index = _findProviderIndexW(net.lpProvider);
if (index == BAD_PROVIDER_INDEX)
goto cleanup;
if (providerTable->table[index].dwNetType != prov)
goto cleanup;
if (RegQueryValueExW(connection, L"RemotePath", NULL, &type, NULL, &size) != ERROR_SUCCESS)
goto cleanup;
if (type != REG_SZ)
goto cleanup;
net.lpRemoteName = HeapAlloc(GetProcessHeap(), 0, size);
if (!net.lpRemoteName)
goto cleanup;
if (RegQueryValueExW(connection, L"RemotePath", NULL, NULL, (BYTE *)net.lpRemoteName, &size) != ERROR_SUCCESS)
goto cleanup;
size = strlenW(local);
net.lpLocalName = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR) + 2 * sizeof(WCHAR));
if (!net.lpLocalName)
goto cleanup;
strcpyW(net.lpLocalName, local);
net.lpLocalName[size] = ':';
net.lpLocalName[size + 1] = 0;
TRACE("Attempting connection\n");
WNetAddConnection2W(&net, NULL, NULL, 0);
cleanup:
HeapFree(GetProcessHeap(), 0, net.lpProvider);
HeapFree(GetProcessHeap(), 0, net.lpRemoteName);
HeapFree(GetProcessHeap(), 0, net.lpLocalName);
}
#endif
void wnetInit(HINSTANCE hInstDll)
{
static const WCHAR providerOrderKey[] = { 'S','y','s','t','e','m','\\',
@ -453,64 +374,6 @@ void wnetInit(HINSTANCE hInstDll)
}
RegCloseKey(hKey);
}
#ifdef __REACTOS__
if (providerTable)
{
HKEY user_profile;
if (RegOpenCurrentUser(KEY_ALL_ACCESS, &user_profile) == ERROR_SUCCESS)
{
HKEY network;
WCHAR subkey[8] = {'N', 'e', 't', 'w', 'o', 'r', 'k', 0};
if (RegOpenKeyExW(user_profile, subkey, 0, KEY_READ, &network) == ERROR_SUCCESS)
{
DWORD size, max;
TRACE("Enumerating remembered connections\n");
if (RegQueryInfoKey(network, NULL, NULL, NULL, &max, &size, NULL, NULL, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
{
WCHAR *local;
TRACE("There are %lu connections\n", max);
local = HeapAlloc(GetProcessHeap(), 0, (size + 1) * sizeof(WCHAR));
if (local)
{
DWORD index;
for (index = 0; index < max; ++index)
{
DWORD len = size + 1;
HKEY connection;
TRACE("Trying connection %lu\n", index);
if (RegEnumKeyExW(network, index, local, &len, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
continue;
TRACE("It is %S\n", local);
if (RegOpenKeyExW(network, local, 0, KEY_READ, &connection) != ERROR_SUCCESS)
continue;
_restoreSavedConnection(connection, local);
RegCloseKey(connection);
}
HeapFree(GetProcessHeap(), 0, local);
}
}
RegCloseKey(network);
}
RegCloseKey(user_profile);
}
}
#endif
}
void wnetFree(void)