140 lines
3.2 KiB
C++
140 lines
3.2 KiB
C++
//
|
|
// 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;
|
|
}
|
|
|