//+--------------------------------------------------------------------------- // // Function: HrUninstallNetComponent // // Purpose: Initialize INetCfg and uninstall a component // // Arguments: // szComponentId [in] InfId of component to uninstall (e.g. MS_TCPIP) // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrUninstallNetComponent(IN PCWSTR szComponentId) { HRESULT hr=S_OK; INetCfg* pnc = NULL ; LogPrintf(_T("Trying to uninstall '%s'...\n"), szComponentId); // get INetCfg interface hr = HrGetINetCfg(TRUE, &pnc); if (SUCCEEDED(hr)) { // uninstall szComponentId hr = HrUninstallNetComponent(pnc, szComponentId); if (S_OK == hr) { // Apply the changes hr = pnc->Apply(); } else if (S_FALSE == hr) { LogPrintf(_T("'%s' is not installed\n"), szComponentId); } // release INetCfg (void) HrReleaseINetCfg(TRUE, pnc); } // show success/failure message ShowHrMessage(hr); return hr; }
ULONG WINAPI CNetConnectionPropertyUi::Release() { ULONG refCount = InterlockedDecrement(&ref); if (!refCount) { if (pNCfg) { pNCfg->Uninitialize(); pNCfg->Release(); } if (NCfgLock) { NCfgLock->Release(); } if (pProperties) { NcFreeNetconProperties(pProperties); } delete this; } return refCount; }
//+--------------------------------------------------------------------------- // // Function: HrUninstallNetComponent // // Purpose: Initialize INetCfg and uninstall a component // // Arguments: // szComponentId [in] InfId of component to uninstall (e.g. MS_TCPIP) // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrUninstallNetComponent(IN PCWSTR szComponentId) { HRESULT hr=S_OK; INetCfg* pnc; // get INetCfg interface hr = HrGetINetCfg(TRUE, &pnc); if (SUCCEEDED(hr)) { // uninstall szComponentId hr = HrUninstallNetComponent(pnc, szComponentId); if (S_OK == hr) { // Apply the changes hr = pnc->Apply(); } // release INetCfg (void) HrReleaseINetCfg(TRUE, pnc); } // show success/failure message ShowHrMessage(hr); return hr; }
BOOL CNetConnectionPropertyUi::GetINetCfgComponent(INetCfg *pNCfg, INetCfgComponent ** pOut) { LPWSTR pName; HRESULT hr; INetCfgComponent * pNCg; ULONG Fetched; IEnumNetCfgComponent * pEnumCfg; hr = pNCfg->EnumComponents(&GUID_DEVCLASS_NET, &pEnumCfg); if (FAILED(hr)) { return FALSE; } while (pEnumCfg->Next(1, &pNCg, &Fetched) == S_OK) { hr = pNCg->GetDisplayName(&pName); if (SUCCEEDED(hr)) { if (!_wcsicmp(pName, pProperties->pszwDeviceName)) { *pOut = pNCg; pEnumCfg->Release(); return TRUE; } CoTaskMemFree(pName); } pNCg->Release(); } pEnumCfg->Release(); return FALSE; }
HRESULT InstallSpecifiedComponent(LPTSTR lpszInfFile, LPTSTR lpszPnpID, const GUID* pguidClass) { INetCfg* pnc; LPTSTR lpszApp; HRESULT hr; hr = HrGetINetCfg(TRUE, APP_NAME, &pnc, &lpszApp); if (hr == S_OK) { // // Install the network component. // hr = HrInstallNetComponent(pnc, lpszPnpID, pguidClass, lpszInfFile); if ((hr == S_OK) || (hr == NETCFG_S_REBOOT)) { hr = pnc->Apply(); } else { if (hr != HRESULT_FROM_WIN32(ERROR_CANCELLED)) { ErrMsg(hr, L"Couldn't install the network component."); } } HrReleaseINetCfg(pnc, TRUE); } else { if ((hr == NETCFG_E_NO_WRITE_LOCK) && lpszApp) { ErrMsg(hr, L"%s currently holds the lock, try later.", lpszApp); CoTaskMemFree(lpszApp); } else { ErrMsg(hr, L"Couldn't the get notify object interface."); } } return hr; }
//+--------------------------------------------------------------------------- // // Function: HrIsComponentInstalled // // Purpose: Find out if a component is installed // // Arguments: // szComponentId [in] id of component to search // // Returns: S_OK if installed, // S_FALSE if not installed, // otherwise an error code // // Author: kumarp 11-February-99 // // Notes: // HRESULT HrIsComponentInstalled(IN PCWSTR szComponentId) { HRESULT hr=S_OK; INetCfg* pnc; INetCfgComponent* pncc; hr = HrGetINetCfg(FALSE, &pnc); if (S_OK == hr) { hr = pnc->FindComponent(szComponentId, &pncc); if (S_OK == hr) { ReleaseObj(pncc); } (void) HrReleaseINetCfg(FALSE, pnc); } return hr; }
//+--------------------------------------------------------------------------- // // Function: HrInstallNetComponent // // Purpose: Install the specified net component // // Arguments: // szComponentId [in] component to install // nc [in] class of the component // szInfFullPath [in] full path to primary INF file // required if the primary INF and other // associated files are not pre-copied to // the right destination dirs. // Not required when installing MS components // since the files are pre-copied by // Windows NT Setup. // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrInstallNetMonProtocol() { HRESULT hr=S_OK; INetCfg* pnc; hr = HrGetINetCfg(TRUE, &pnc); if (SUCCEEDED(hr)) { // install szComponentId hr = HrInstallNetComponent(pnc, L"MS_NetMon", &GUID_DEVCLASS_NETTRANS); if (SUCCEEDED(hr)) { // Apply the changes hr = pnc->Apply(); } // release INetCfg (void) HrReleaseINetCfg(TRUE, pnc); } return hr; }
//+--------------------------------------------------------------------------- // // Function: HrUninstallNetComponent // // Purpose: Initialize INetCfg and uninstall a component // // Arguments: // szComponentId [in] InfId of component to uninstall (e.g. MS_TCPIP) // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrUninstallNetMonProtocol() { HRESULT hr=S_OK; INetCfg* pnc; // get INetCfg interface hr = HrGetINetCfg(TRUE, &pnc); if (SUCCEEDED(hr)) { // uninstall szComponentId hr = HrUninstallNetComponent(pnc, L"MS_NetMon"); if (S_OK == hr) { // Apply the changes hr = pnc->Apply(); } // release INetCfg (void) HrReleaseINetCfg(TRUE, pnc); } return hr; }
//+--------------------------------------------------------------------------- // // Function: HrInstallNetComponent // // Purpose: Install the specified net component // // Arguments: // szComponentId [in] component to install // nc [in] class of the component // szInfFullPath [in] full path to primary INF file // required if the primary INF and other // associated files are not pre-copied to // the right destination dirs. // Not required when installing MS components // since the files are pre-copied by // Windows NT Setup. // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrInstallNetComponent(IN PCTSTR szComponentId, IN enum NetClass nc, IN PCTSTR szInfFullPath) { HRESULT hr=S_OK; INetCfg* pnc; // cannot install net adapters this way. they have to be // enumerated/detected and installed by PnP if ((nc == NC_NetProtocol) || (nc == NC_NetService) || (nc == NC_NetClient)) { LogPrintf(_T("Trying to install '%s'...\n"), szComponentId); // if full path to INF has been specified, the INF // needs to be copied using Setup API to ensure that any other files // that the primary INF copies will be correctly found by Setup API // size_t cchPath; StringCchLength(szInfFullPath, MAX_PATH, &cchPath); if (szInfFullPath && cchPath) { TCHAR szInfNameAfterCopy[MAX_PATH+1]; if (SetupCopyOEMInf( szInfFullPath, NULL, // other files are in the // same dir. as primary INF SPOST_PATH, // first param. contains path to INF 0, // default copy style szInfNameAfterCopy, // receives the name of the INF // after it is copied to %windir%\inf MAX_PATH, // max buf. size for the above NULL, // receives required size if non-null NULL)) // optionally retrieves filename // component of szInfNameAfterCopy { LogPrintf(_T("...%s was copied to %s\n"), szInfFullPath, szInfNameAfterCopy); } else { DWORD dwError = GetLastError(); LogPrintf(_T("Error on SetupCopyOEMInf, error %d"), dwError); hr = HRESULT_FROM_WIN32(dwError); } } if (S_OK == hr) { // get INetCfg interface hr = HrGetINetCfg(TRUE, &pnc); if (SUCCEEDED(hr)) { // install szComponentId LogPrintf(_T("Installing %s\n"), szComponentId); hr = HrInstallNetComponent(pnc, szComponentId, c_aguidClass[nc]); if (SUCCEEDED(hr)) { LogPrintf(_T("Installed successfully\n")); // Apply the changes LogPrintf(_T("Applying changes\n")); hr = pnc->Apply(); LogPrintf(_T("Applied successfully\n")); } else { LogPrintf(_T("%s installation failed.\n")); } // release INetCfg (void) HrReleaseINetCfg(TRUE, pnc); } } // show success/failure message ShowHrMessage(hr); } return hr; }
bool InstallNdisProtocolDriver(char *inf_path, wchar_t *id, UINT lock_timeout) { bool ret = false; HRESULT hr; INetCfg *pNetCfg; // Validate arguments if (inf_path == NULL || id == NULL) { return false; } hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void **)&pNetCfg); if (SUCCEEDED(hr)) { INetCfgLock *pLock; hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pLock); if (SUCCEEDED(hr)) { LPWSTR locked_by; hr = pLock->AcquireWriteLock(lock_timeout, L"SoftEther VPN", &locked_by); if (SUCCEEDED(hr)) { hr = pNetCfg->Initialize(NULL); if (SUCCEEDED(hr)) { char inf_dir[MAX_PATH]; SeGetDirNameFromFilePath(inf_dir, sizeof(inf_dir), inf_path); if (SetupCopyOEMInfA(inf_path, inf_dir, SPOST_PATH, 0, NULL, 0, NULL, 0)) { INetCfgClassSetup *pSetup; hr = pNetCfg->QueryNetCfgClass(&GUID_DEVCLASS_NETTRANS, IID_INetCfgClassSetup, (void **)&pSetup); if (SUCCEEDED(hr)) { OBO_TOKEN token; INetCfgComponent *pComponent; SeZero(&token, sizeof(token)); token.Type = OBO_USER; hr = pSetup->Install(id, &token, 0, 0, NULL, NULL, &pComponent); if (SUCCEEDED(hr)) { pNetCfg->Apply(); ret = true; } pSetup->Release(); } if (ret == false) { char dst_inf_name[MAX_PATH]; DWORD dst_inf_name_size = MAX_PATH; if (SetupCopyOEMInfA(inf_path, inf_dir, SPOST_PATH, SP_COPY_REPLACEONLY, dst_inf_name, dst_inf_name_size, &dst_inf_name_size, NULL) == false && GetLastError() == ERROR_FILE_EXISTS) { SetupUninstallOEMInfA(dst_inf_name, 0, NULL); } } } } pLock->ReleaseWriteLock(); } pLock->Release(); } pNetCfg->Release(); } return ret; }
VOID CNetConnectionPropertyUi::InitializeLANPropertiesUIDlg(HWND hwndDlg) { HRESULT hr; INetCfg *pNCfg; INetCfgLock *pNCfgLock; HWND hDlgCtrl = GetDlgItem(hwndDlg, IDC_COMPONENTSLIST); LVCOLUMNW lc; RECT rc; DWORD dwStyle; LPWSTR pDisplayName; LVITEMW li; SendDlgItemMessageW(hwndDlg, IDC_NETCARDNAME, WM_SETTEXT, 0, (LPARAM)pProperties->pszwDeviceName); if (pProperties->dwCharacter & NCCF_SHOW_ICON) { /* check show item on taskbar*/ SendDlgItemMessageW(hwndDlg, IDC_SHOWTASKBAR, BM_SETCHECK, BST_CHECKED, 0); } if (pProperties->dwCharacter & NCCF_NOTIFY_DISCONNECTED) { /* check notify item */ SendDlgItemMessageW(hwndDlg, IDC_NOTIFYNOCONNECTION, BM_SETCHECK, BST_CHECKED, 0); } memset(&lc, 0, sizeof(LV_COLUMN)); lc.mask = LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; lc.fmt = LVCFMT_FIXED_WIDTH; if (GetClientRect(hDlgCtrl, &rc)) { lc.mask |= LVCF_WIDTH; lc.cx = rc.right - rc.left; } lc.pszText = (LPWSTR)L""; (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&lc); dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); dwStyle = dwStyle | LVS_EX_FULLROWSELECT | LVS_EX_CHECKBOXES; SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (LPVOID*)&pNCfg); if (FAILED(hr)) return; hr = pNCfg->QueryInterface(IID_INetCfgLock, (LPVOID*)&pNCfgLock); hr = pNCfgLock->AcquireWriteLock(100, L"", &pDisplayName); if (hr == S_FALSE) { CoTaskMemFree(pDisplayName); return; } NCfgLock = pNCfgLock; hr = pNCfg->Initialize(NULL); if (FAILED(hr)) { pNCfg->Release(); return; } EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETCLIENT, NET_TYPE_CLIENT); EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETSERVICE, NET_TYPE_SERVICE); EnumComponents(hDlgCtrl, pNCfg, &GUID_DEVCLASS_NETTRANS, NET_TYPE_PROTOCOL); this->pNCfg = pNCfg; ZeroMemory(&li, sizeof(li)); li.mask = LVIF_STATE; li.stateMask = (UINT)-1; li.state = LVIS_FOCUSED|LVIS_SELECTED; (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&li); }
VOID CNetConnectionPropertyUi::EnumComponents(HWND hDlgCtrl, INetCfg *pNCfg, const GUID *CompGuid, UINT Type) { HRESULT hr; IEnumNetCfgComponent * pENetCfg; INetCfgComponent *pNCfgComp, *pAdapterCfgComp; INetCfgComponentBindings * pCompBind; ULONG Num; DWORD dwCharacteristics; LPOLESTR pDisplayName, pHelpText; PNET_ITEM pItem; BOOL bChecked; hr = pNCfg->EnumComponents(CompGuid, &pENetCfg); if (FAILED(hr)) { pNCfg->Release(); return; } while(pENetCfg->Next(1, &pNCfgComp, &Num) == S_OK) { hr = pNCfgComp->GetCharacteristics(&dwCharacteristics); if (SUCCEEDED(hr) && (dwCharacteristics & NCF_HIDDEN)) { pNCfgComp->Release(); continue; } pDisplayName = NULL; pHelpText = NULL; hr = pNCfgComp->GetDisplayName(&pDisplayName); hr = pNCfgComp->GetHelpText(&pHelpText); bChecked = TRUE; //ReactOS hack hr = pNCfgComp->QueryInterface(IID_INetCfgComponentBindings, (LPVOID*)&pCompBind); if (SUCCEEDED(hr)) { if (GetINetCfgComponent(pNCfg, &pAdapterCfgComp)) { hr = pCompBind->IsBoundTo(pAdapterCfgComp); if (hr == S_OK) bChecked = TRUE; else bChecked = FALSE; pAdapterCfgComp->Release(); pCompBind->Release(); } } pItem = (NET_ITEM*)CoTaskMemAlloc(sizeof(NET_ITEM)); if (!pItem) continue; pItem->dwCharacteristics = dwCharacteristics; pItem->szHelp = pHelpText; pItem->Type = (NET_TYPE)Type; pItem->pNCfgComp = pNCfgComp; pItem->NumPropDialogOpen = 0; AddItemToListView(hDlgCtrl, pItem, pDisplayName, bChecked); CoTaskMemFree(pDisplayName); } pENetCfg->Release(); }
// Install the NDIS protocol driver bool UninstallNdisProtocolDriver(wchar_t *id, UINT lock_timeout) { bool ret = false; HRESULT hr; INetCfg *pNetCfg; // Validate arguments if (id == NULL) { return false; } hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void **)&pNetCfg); if (SUCCEEDED(hr)) { INetCfgLock *pLock; hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pLock); if (SUCCEEDED(hr)) { LPWSTR locked_by; hr = pLock->AcquireWriteLock(lock_timeout, L"SoftEther VPN", &locked_by); if (SUCCEEDED(hr)) { hr = pNetCfg->Initialize(NULL); if (SUCCEEDED(hr)) { INetCfgComponent *pncc = NULL; hr = pNetCfg->FindComponent(id, &pncc); if (pncc == NULL || hr == S_FALSE) { hr = E_FAIL; } if (SUCCEEDED(hr)) { INetCfgClass *pncClass; hr = pNetCfg->QueryNetCfgClass(&GUID_DEVCLASS_NETTRANS, IID_INetCfgClass, (void **)&pncClass); if (SUCCEEDED(hr)) { INetCfgClassSetup *pncClassSetup; hr = pncClass->QueryInterface(IID_INetCfgClassSetup, (void **)&pncClassSetup); if (SUCCEEDED(hr)) { OBO_TOKEN obo; wchar_t *c = NULL; Zero(&obo, sizeof(obo)); obo.Type = OBO_USER; hr = pncClassSetup->DeInstall(pncc, &obo, &c); if (SUCCEEDED(hr)) { hr = pNetCfg->Apply(); if (SUCCEEDED(hr)) { ret = true; } else { WHERE; Debug("0x%x\n", hr); } } else { WHERE; Debug("0x%x\n", hr); } pncClassSetup->Release(); } else { WHERE; } pncClass->Release(); } else { WHERE; } pncc->Release(); } else { WHERE; } } else { WHERE; } pLock->ReleaseWriteLock(); } else { WHERE; } pLock->Release(); } pNetCfg->Release(); } else { WHERE; } return ret; }
bool UninstallNdisProtocolDriver(wchar_t *id, UINT lock_timeout) { bool ret = false; HRESULT hr; INetCfg *pNetCfg; // Validate arguments if (id == NULL) { return false; } hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void **)&pNetCfg); if (SUCCEEDED(hr)) { INetCfgLock *pLock; hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pLock); if (SUCCEEDED(hr)) { LPWSTR locked_by; hr = pLock->AcquireWriteLock(lock_timeout, L"SoftEther VPN", &locked_by); if (SUCCEEDED(hr)) { hr = pNetCfg->Initialize(NULL); if (SUCCEEDED(hr)) { INetCfgComponent *pComponent; hr = pNetCfg->FindComponent(id, &pComponent); if (SUCCEEDED(hr)) { INetCfgClassSetup *pSetup; hr = pNetCfg->QueryNetCfgClass(&GUID_DEVCLASS_NETTRANS, IID_INetCfgClassSetup, (void **)&pSetup); if (SUCCEEDED(hr)) { OBO_TOKEN token; SeZero(&token, sizeof(token)); token.Type = OBO_USER; hr = pSetup->DeInstall(pComponent, &token, NULL); if (SUCCEEDED(hr)) { pNetCfg->Apply(); ret = true; } pSetup->Release(); } } } pLock->ReleaseWriteLock(); } pLock->Release(); } pNetCfg->Release(); } return ret; }
//+--------------------------------------------------------------------------- // // Function: HrGetINetCfg // // Purpose: Initialize COM, create and initialize INetCfg. // Obtain write lock if indicated. // // Arguments: // fGetWriteLock [in] whether to get write lock // ppnc [in] pointer to pointer to INetCfg object // // Returns: S_OK on success, otherwise an error code // // Notes: // HRESULT HrGetINetCfg(IN BOOL fGetWriteLock, INetCfg** ppnc) { HRESULT hr=S_OK; // Initialize the output parameters. *ppnc = NULL; // initialize COM hr = CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED ); if (SUCCEEDED(hr)) { // Create the object implementing INetCfg. // INetCfg* pnc; hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void**)&pnc); if (SUCCEEDED(hr)) { INetCfgLock * pncLock = NULL; if (fGetWriteLock) { // Get the locking interface hr = pnc->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write static const ULONG c_cmsTimeout = 15000; static const WCHAR c_szSampleNetcfgApp[] = L"Sample Netcfg Application (netcfg.exe)"; PWSTR szLockedBy; hr = pncLock->AcquireWriteLock(c_cmsTimeout, c_szSampleNetcfgApp, &szLockedBy); if (S_FALSE == hr) { hr = NETCFG_E_NO_WRITE_LOCK; } } } if (SUCCEEDED(hr)) { // Initialize the INetCfg object. // hr = pnc->Initialize(NULL); if (SUCCEEDED(hr)) { *ppnc = pnc; pnc->AddRef(); } else { // initialize failed, if obtained lock, release it if (pncLock) { pncLock->ReleaseWriteLock(); } } } ReleaseObj(pncLock); ReleaseObj(pnc); } if (FAILED(hr)) { CoUninitialize(); } } return hr; }
bool ChangeNicBindingOrder() { HRESULT hr = S_OK; INetCfg *pNetCfg = NULL; INetCfgBindingPath *pNetCfgPath; INetCfgComponent *pNetCfgComponent = NULL; INetCfgComponentBindings *pNetCfgBinding = NULL; INetCfgLock *pNetCfgLock = NULL; IEnumNetCfgBindingPath *pEnumNetCfgBindingPath = NULL; PWSTR szLockedBy; if (!SUCCEEDED(CoInitialize(NULL))) { return false; } if (S_OK != CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void**)&pNetCfg)) { return false; } if (!SUCCEEDED(pNetCfg->QueryInterface(IID_INetCfgLock, (LPVOID *)&pNetCfgLock))) { return false; } static const ULONG c_cmsTimeout = 5000; static const WCHAR c_szSampleNetcfgApp[] = L"TapRebinder (TapRebinder.exe)"; if (!SUCCEEDED(pNetCfgLock->AcquireWriteLock(c_cmsTimeout, c_szSampleNetcfgApp, &szLockedBy))) { wprintf(L"Could not lock INetcfg, it is already locked by '%s'", szLockedBy); return false; } if (!SUCCEEDED(pNetCfg->Initialize(NULL))) { if (pNetCfgLock) { pNetCfgLock->ReleaseWriteLock(); } ReleaseObj(pNetCfgLock); return false; } ReleaseObj(pNetCfgLock); if (S_OK != pNetCfg->FindComponent(L"ms_tcpip", &pNetCfgComponent)) { return false; } if (S_OK != pNetCfgComponent->QueryInterface(IID_INetCfgComponentBindings, (LPVOID *)&pNetCfgBinding)) { return false; } if (S_OK != pNetCfgBinding->EnumBindingPaths(EBP_BELOW, &pEnumNetCfgBindingPath)) { return false; } while (S_OK == hr) { hr = pEnumNetCfgBindingPath->Next(1, &pNetCfgPath, NULL); LPWSTR pszwPathToken; pNetCfgPath->GetPathToken(&pszwPathToken); if (wcscmp(pszwPathToken, wDeviceInstanceId) == 0) { wprintf(L" Moving adapter to the first position: %s.\n", pszwPathToken); pNetCfgBinding->MoveBefore(pNetCfgPath, NULL); pNetCfg->Apply(); CoTaskMemFree(pszwPathToken); ReleaseObj(pNetCfgPath); break; } CoTaskMemFree(pszwPathToken); ReleaseObj(pNetCfgPath); } ReleaseObj(pEnumNetCfgBindingPath); ReleaseObj(pNetCfgBinding); ReleaseObj(pNetCfgComponent); ReleaseINetCfg(TRUE, pNetCfg); return true; }
// Install the NDIS protocol driver bool InstallNdisProtocolDriver(wchar_t *inf_path, wchar_t *id, UINT lock_timeout) { bool ret = false; HRESULT hr; INetCfg *pNetCfg; HINSTANCE hSetupApiDll = NULL; BOOL (WINAPI *_SetupCopyOEMInfW)(PCWSTR, PCWSTR, DWORD, DWORD, PWSTR, DWORD, PDWORD, PWSTR *) = NULL; BOOL (WINAPI *_SetupUninstallOEMInfW)(PCWSTR, DWORD, PVOID) = NULL; // Validate arguments if (inf_path == NULL || id == NULL) { return false; } hSetupApiDll = LoadLibraryA("setupapi.dll"); if (hSetupApiDll == NULL) { WHERE; goto LABEL_CLEANUP; } _SetupCopyOEMInfW = (UINT (__stdcall *)(PCWSTR,PCWSTR,DWORD,DWORD,PWSTR,DWORD,PDWORD,PWSTR *)) GetProcAddress(hSetupApiDll, "SetupCopyOEMInfW"); _SetupUninstallOEMInfW = (UINT (__stdcall *)(PCWSTR,DWORD,PVOID)) GetProcAddress(hSetupApiDll, "SetupUninstallOEMInfW"); if (_SetupCopyOEMInfW == NULL || _SetupUninstallOEMInfW == NULL) { WHERE; goto LABEL_CLEANUP; } hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void **)&pNetCfg); if (SUCCEEDED(hr)) { INetCfgLock *pLock; hr = pNetCfg->QueryInterface(IID_INetCfgLock, (PVOID*)&pLock); if (SUCCEEDED(hr)) { LPWSTR locked_by; hr = pLock->AcquireWriteLock(lock_timeout, L"SoftEther VPN", &locked_by); if (SUCCEEDED(hr)) { hr = pNetCfg->Initialize(NULL); if (SUCCEEDED(hr)) { wchar_t inf_dir[MAX_PATH]; GetDirNameFromFilePathW(inf_dir, sizeof(inf_dir), inf_path); if (_SetupCopyOEMInfW(inf_path, inf_dir, SPOST_PATH, 0, NULL, 0, NULL, 0)) { INetCfgClassSetup *pSetup; hr = pNetCfg->QueryNetCfgClass(&GUID_DEVCLASS_NETTRANS, IID_INetCfgClassSetup, (void **)&pSetup); if (SUCCEEDED(hr)) { OBO_TOKEN token; INetCfgComponent *pComponent; Zero(&token, sizeof(token)); token.Type = OBO_USER; hr = pSetup->Install(id, &token, 0, 0, NULL, NULL, &pComponent); if (SUCCEEDED(hr)) { pNetCfg->Apply(); ret = true; } else { WHERE; Debug("0x%x\n", hr); } pSetup->Release(); } else { WHERE; } if (ret == false) { wchar_t dst_inf_name[MAX_PATH]; DWORD dst_inf_name_size = MAX_PATH; if (_SetupCopyOEMInfW(inf_path, inf_dir, SPOST_PATH, SP_COPY_REPLACEONLY, dst_inf_name, dst_inf_name_size, &dst_inf_name_size, NULL) == false && GetLastError() == ERROR_FILE_EXISTS) { _SetupUninstallOEMInfW(dst_inf_name, 0, NULL); } } } else { WHERE; } } else { WHERE; } pLock->ReleaseWriteLock(); } else { WHERE; } pLock->Release(); } pNetCfg->Release(); } else { WHERE; } LABEL_CLEANUP: if (hSetupApiDll != NULL) { FreeLibrary(hSetupApiDll); } return ret; }
DWORD UninstallDriver() { TRACE_ENTER("UninstallDriver"); //_tprintf( _T("Uninstalling %s...\n"), NDISPROT_FRIENDLY_NAME ); // int nResult = MessageBox(NULL, _T("Uninstalling Driver..."), NDISPROT_FRIENDLY_NAME, MB_OKCANCEL | MB_ICONINFORMATION); // // if (nResult != IDOK) // { // return 0; // } INetCfg* pnc; INetCfgComponent* pncc; INetCfgClass* pncClass; INetCfgClassSetup* pncClassSetup; LPTSTR lpszApp; GUID guidClass; OBO_TOKEN obo; HRESULT hr; hr = HrGetINetCfg(TRUE, APP_NAME, &pnc, &lpszApp); if (hr == S_OK) { // // Get a reference to the network component to uninstall. // hr = pnc->FindComponent(NDISLWF_SERVICE_PNP_DEVICE_ID, &pncc); if (hr == S_OK) { // // Get the class GUID. // hr = pncc->GetClassGuid(&guidClass); if (hr == S_OK) { // // Get a reference to component's class. // hr = pnc->QueryNetCfgClass(&guidClass, IID_INetCfgClass, (PVOID *)&pncClass); if (hr == S_OK) { // // Get the setup interface. // hr = pncClass->QueryInterface(IID_INetCfgClassSetup, (LPVOID *)&pncClassSetup); if (hr == S_OK) { // // Uninstall the component. // ZeroMemory(&obo, sizeof(OBO_TOKEN)); obo.Type = OBO_USER; hr = pncClassSetup->DeInstall(pncc, &obo, NULL); if ((hr == S_OK) || (hr == NETCFG_S_REBOOT)) { hr = pnc->Apply(); if ((hr != S_OK) && (hr != NETCFG_S_REBOOT)) { ErrMsg(hr, L"Couldn't apply the changes after" L" uninstalling %s.", NDISLWF_SERVICE_PNP_DEVICE_ID); } else { TRACE_EXIT("UninstallDriver"); return 1; } } else { ErrMsg(hr, L"Failed to uninstall %s.", NDISLWF_SERVICE_PNP_DEVICE_ID); } ReleaseRef(pncClassSetup); } else { ErrMsg(hr, L"Couldn't get an interface to setup class."); } ReleaseRef(pncClass); } else { ErrMsg(hr, L"Couldn't get a pointer to class interface " L"of %s.", NDISLWF_SERVICE_PNP_DEVICE_ID); } } else { ErrMsg(hr, L"Couldn't get the class guid of %s.", NDISLWF_SERVICE_PNP_DEVICE_ID); } ReleaseRef(pncc); } else { ErrMsg(hr, L"Couldn't get an interface pointer to %s.", NDISLWF_SERVICE_PNP_DEVICE_ID); } HrReleaseINetCfg(pnc, TRUE); } else { if ((hr == NETCFG_E_NO_WRITE_LOCK) && lpszApp) { ErrMsg(hr, L"%s currently holds the lock, try later.", lpszApp); CoTaskMemFree(lpszApp); } else { ErrMsg(hr, L"Couldn't get the notify object interface."); } } TRACE_EXIT("UninstallDriver"); return 0; }
HRESULT HrGetINetCfg( IN BOOL fGetWriteLock, IN LPCTSTR lpszAppName, OUT INetCfg** ppnc, OUT LPTSTR *lpszLockedBy ) { INetCfg *pnc = NULL; INetCfgLock *pncLock = NULL; HRESULT hr = S_OK; // // Initialize the output parameters. // *ppnc = NULL; if (lpszLockedBy) { *lpszLockedBy = NULL; } // // Initialize COM // hr = CoInitialize(NULL); if (hr == S_OK) { // // Create the object implementing INetCfg. // hr = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER, IID_INetCfg, (void**)&pnc); if (hr == S_OK) { if (fGetWriteLock) { // // Get the locking reference // hr = pnc->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (hr == S_OK) { // // Attempt to lock the INetCfg for read/write // hr = pncLock->AcquireWriteLock(LOCK_TIME_OUT, lpszAppName, lpszLockedBy); if (hr == S_FALSE) { hr = NETCFG_E_NO_WRITE_LOCK; } } } if (hr == S_OK) { // // Initialize the INetCfg object. // hr = pnc->Initialize(NULL); if (hr == S_OK) { *ppnc = pnc; pnc->AddRef(); } else { // // Initialize failed, if obtained lock, release it // if (pncLock) { pncLock->ReleaseWriteLock(); } } } ReleaseRef(pncLock); ReleaseRef(pnc); } // // In case of error, uninitialize COM. // if (hr != S_OK) { CoUninitialize(); } } return hr; }