// // 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; }