windows-nt/Source/XPSP1/NT/shell/ext/hnw/nconn32/netcli.cpp

140 lines
3.2 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//
// NetCli.cpp
//
// Code to install, uninstall, and bind clients such as Client for
// Microsoft Networks (VREDIR).
//
// History:
//
// 2/02/1999 KenSh Created for JetNet
// 9/29/1999 KenSh Repurposed for Home Networking Wizard
//
#include "stdafx.h"
#include "NetConn.h"
#include "nconnwrap.h"
#include "TheApp.h"
#include "ParseInf.h"
#include "HookUI.h"
// IsClientInstalled
//
// Returns TRUE if the given client (e.g. "VREDIR") is currently installed.
//
BOOL WINAPI IsClientInstalled(LPCSTR pszClientDeviceID, BOOL bExhaustive)
{
BOOL bResult = FALSE;
TCHAR szRegKey[50];
wsprintf(szRegKey, "Enum\\Network\\%s", pszClientDeviceID);
CRegistry reg;
if (reg.OpenKey(HKEY_LOCAL_MACHINE, szRegKey, KEY_READ))
{
DWORD cSubKeys;
if (ERROR_SUCCESS == RegQueryInfoKey(reg.m_hKey, NULL, NULL, NULL, &cSubKeys, NULL, NULL, NULL, NULL, NULL, NULL, NULL))
{
if (cSubKeys != 0)
bResult = TRUE;
}
}
if (bResult && bExhaustive)
{
TCHAR szInfSection[50];
wsprintf(szInfSection, "%s.Install", pszClientDeviceID);
if (!CheckInfSectionInstallation("netcli.inf", szInfSection))
bResult = FALSE;
}
return bResult;
}
BOOL WINAPI IsMSClientInstalled(BOOL bExhaustive)
{
if (!FindValidNetEnumKey(SZ_CLASS_CLIENT, SZ_CLIENT_MICROSOFT, NULL, 0))
return FALSE;
if (bExhaustive)
{
if (!CheckInfSectionInstallation("netcli.inf", "VREDIR.Install"))
return FALSE;
}
return TRUE;
}
// Installs Client for Microsoft Networking, or fixes a broken installation
HRESULT WINAPI InstallMSClient(HWND hwndParent, PROGRESS_CALLBACK pfnProgress, LPVOID pvProgressParam)
{
HRESULT hr = NETCONN_SUCCESS;
// Remove any broken bindings
RemoveBrokenNetItems(SZ_CLASS_CLIENT, SZ_CLIENT_MICROSOFT);
if (IsMSClientInstalled(FALSE))
{
// Client is set up in registry, but check for missing files
if (!CheckInfSectionInstallation("netcli.inf", "VREDIR.Install"))
{
if (InstallInfSection("netcli.inf", "VREDIR.Install", TRUE))
{
hr = NETCONN_NEED_RESTART;
}
}
}
else
{
BeginSuppressNetdiUI(hwndParent, pfnProgress, pvProgressParam);
DWORD dwResult = CallClassInstaller16(hwndParent, SZ_CLASS_CLIENT, SZ_CLIENT_MICROSOFT);
EndSuppressNetdiUI();
hr = HresultFromCCI(dwResult);
if (g_bUserAbort)
{
hr = NETCONN_USER_ABORT;
}
else if (SUCCEEDED(hr))
{
hr = NETCONN_NEED_RESTART;
}
}
return hr;
}
// pszServiceBinding contains a service to list in the new client's Bindings subkey
// pszBuf is filled with the new binding's enum key, e.g. "VREDIR\0001"
HRESULT CreateNewClientForMSNet(LPSTR pszBuf, int cchBuf, LPCSTR pszServiceBinding)
{
HRESULT hr;
if (FAILED(hr = FindAndCloneNetEnumKey(SZ_CLASS_CLIENT, SZ_CLIENT_MICROSOFT, pszBuf, cchBuf)))
{
ASSERT(FALSE);
return hr;
}
// Now pszBuf contains a string of the form "VREDIR\0001"
CRegistry regBindings;
TCHAR szBindingsKey[200];
wsprintf(szBindingsKey, "Enum\\Network\\%s\\Bindings", pszBuf);
if (!regBindings.CreateKey(HKEY_LOCAL_MACHINE, szBindingsKey, KEY_ALL_ACCESS))
{
ASSERT(FALSE);
return NETCONN_UNKNOWN_ERROR;
}
// Delete existing bindings
regBindings.DeleteAllValues();
// Add the service binding
if (pszServiceBinding != NULL && *pszServiceBinding != '\0')
regBindings.SetStringValue(pszServiceBinding, "");
return NETCONN_SUCCESS;
}