HRESULT HrInstallComponent( IN INetCfg* pnc, IN LPCTSTR szComponentId, IN const GUID* pguidClass ) { INetCfgClassSetup *pncClassSetup = NULL; INetCfgComponent *pncc = NULL; OBO_TOKEN OboToken; HRESULT hr = S_OK; // // OBO_TOKEN specifies on whose behalf this // component is being installed. // Set it to OBO_USER so that szComponentId will be installed // on behalf of the user. // ZeroMemory(&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER; // // Get component's setup class reference. // hr = pnc->QueryNetCfgClass(pguidClass, IID_INetCfgClassSetup, (void**)&pncClassSetup); if (hr == S_OK) { hr = pncClassSetup->Install(szComponentId, &OboToken, 0, 0, // Upgrade from build number. NULL, // Answerfile name NULL, // Answerfile section name &pncc); // Reference after the component if (S_OK == hr) { // is installed. // // we don't need to use pncc (INetCfgComponent), release it // ReleaseRef(pncc); } ReleaseRef(pncClassSetup); } return hr; }
//+--------------------------------------------------------------------------- // // Function: HrInstallNetComponent // // Purpose: Install the specified net component // // Arguments: // pnc [in] pointer to INetCfg object // szComponentId [in] component to install // pguidClass [in] class guid of the component // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrInstallNetComponent(IN INetCfg* pnc, IN PCWSTR szComponentId, IN const GUID* pguidClass) { HRESULT hr=S_OK; OBO_TOKEN OboToken; INetCfgClassSetup* pncClassSetup; INetCfgComponent* pncc; // OBO_TOKEN specifies the entity on whose behalf this // component is being installed // set it to OBO_USER so that szComponentId will be installed // On-Behalf-Of "user" ZeroMemory (&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER; hr = pnc->QueryNetCfgClass (pguidClass, IID_INetCfgClassSetup, (void**)&pncClassSetup); if (SUCCEEDED(hr)) { hr = pncClassSetup->Install(szComponentId, &OboToken, NSF_POSTSYSINSTALL, 0, // <upgrade-from-build-num> NULL, // answerfile name NULL, // answerfile section name &pncc); if (S_OK == hr) { // we dont want to use pncc (INetCfgComponent), release it ReleaseObj(pncc); } ReleaseObj(pncClassSetup); } return hr; }
//+--------------------------------------------------------------------------- // // Function: HrInstallNetComponent // // Purpose: Install the specified net component // // Arguments: // pnc [in] pointer to INetCfg object // szComponentId [in] component to install // pguidClass [in] class guid of the component // // Returns: S_OK or NETCFG_S_REBOOT on success, otherwise an error code // // Notes: // HRESULT HrInstallNetComponent(IN INetCfg* pnc, IN PCTSTR szComponentId, IN const GUID* pguidClass) { HRESULT hr=S_OK; OBO_TOKEN OboToken; INetCfgClassSetup* pncClassSetup; INetCfgComponent* pncc; WCHAR szComponentIdW[256] ; int cnt ; #ifdef _MBCS // @hootch@ // // size_t cchLen; StringCchLength(szComponentId, 256, &cchLen); cnt = MultiByteToWideChar( CP_ACP, // code page 0, // character-type options szComponentId, // string to map cchLen, // number of bytes in string szComponentIdW, // wide-character buffer 256 // size of buffer ); if(cnt == 0) { // error return S_FALSE ; } #endif // OBO_TOKEN specifies the entity on whose behalf this // component is being installed // set it to OBO_USER so that szComponentId will be installed // On-Behalf-Of "user" ZeroMemory (&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER; hr = pnc->QueryNetCfgClass (pguidClass, IID_INetCfgClassSetup, (void**)&pncClassSetup); if (SUCCEEDED(hr)) { LogPrintf(_T("QueryNetCfg succeeded.\n")); #ifdef _MBCS hr = pncClassSetup->Install(szComponentIdW, &OboToken, NSF_POSTSYSINSTALL, 0, // <upgrade-from-build-num> NULL, // answerfile name NULL, // answerfile section name &pncc); #else hr = pncClassSetup->Install(szComponentId, &OboToken, NSF_POSTSYSINSTALL, 0, // <upgrade-from-build-num> NULL, // answerfile name NULL, // answerfile section name &pncc); #endif if (S_OK == hr) { LogPrintf(_T("ClassSetup Install succeeded.\n")); // we dont want to use pncc (INetCfgComponent), release it ReleaseObj(pncc); } else { LogPrintf(_T("ClassSetup Install failed.\n")); } ReleaseObj(pncClassSetup); } else { LogPrintf(_T("QueryNetCfg failed.\n")); } return hr; }
// 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; }
HRESULT CMuxVirtualMiniport::Install (VOID) { INetCfgClass *pncClass; INetCfgClassSetup *pncClassSetup; INetCfgComponent *pnccMiniport; HRESULT hr; LPWSTR *pmszwRefs=NULL; OBO_TOKEN *pOboToken=NULL; DWORD dwSetupFlags=0; LPCWSTR pszwAnswerFile=NULL; LPCWSTR pszwAnswerSections=NULL; TraceMsg( L"-->CMuxVirtualMiniport::Install.\n" ); hr = m_pnc->QueryNetCfgClass( &GUID_DEVCLASS_NET, IID_INetCfgClass, (void **)&pncClass ); if ( hr == S_OK ) { hr = pncClass->QueryInterface( IID_INetCfgClassSetup, (void **)&pncClassSetup ); if ( hr == S_OK ) { hr = pncClassSetup->Install( c_szMuxMiniport, pOboToken, dwSetupFlags, 0, pszwAnswerFile, pszwAnswerSections, &pnccMiniport ); if ( hr == S_OK ) { hr = pnccMiniport->GetInstanceGuid( &m_guidMiniport ); if ( hr != S_OK ) { TraceMsg( L" Failed to get the instance guid, uninstalling " L" the miniport.\n" ); pncClassSetup->DeInstall( pnccMiniport, pOboToken, pmszwRefs ); } ReleaseObj( pnccMiniport ); } else { TraceMsg( L" Failed to install the miniport.\n" ); } ReleaseObj( pncClassSetup ); } else { TraceMsg( L" QueryInterface failed.\n" ); } ReleaseObj( pncClass ); } else { TraceMsg( L" QueryNetCfgClass failed.\n" ); } TraceMsg( L"<--CMuxVirtualMiniport::Install(HRESULT = %x).\n", 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; }