#include #include #include // // Localization library and MessageIds. // #include #include "localmsg.h" EXTERN_C void ausage(void); HRESULT HrCreateINetCfg ( IN BOOL fAcquireWriteLock, OUT INetCfg** ppINetCfg) { HRESULT hr; INetCfg* pINetCfg; // Get the INetCfg interface. // hr = CoCreateInstance( CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER | CLSCTX_NO_CODE_DOWNLOAD, IID_INetCfg, reinterpret_cast(&pINetCfg)); if (S_OK == hr) { INetCfgLock * pnclock = NULL; if (fAcquireWriteLock) { // Get the locking interface hr = pINetCfg->QueryInterface(IID_INetCfgLock, reinterpret_cast(&pnclock)); if (SUCCEEDED(hr)) { LPWSTR pwszLockHolder; // Attempt to lock the INetCfg for read/write hr = pnclock->AcquireWriteLock(100, L"InstallIPv6", &pwszLockHolder); if (S_FALSE == hr) { // Couldn't acquire the lock hr = NETCFG_E_NO_WRITE_LOCK; NlsPutMsg(STDOUT, IPV6_MESSAGE_0); // printf("The write lock could not be acquired.\n"); NlsPutMsg(STDOUT, IPV6_MESSAGE_1, pwszLockHolder); // printf("You must close %ls first.\n", pwszLockHolder); } if (pwszLockHolder) { CoTaskMemFree(pwszLockHolder); } } } if (S_OK == hr) { hr = pINetCfg->Initialize (NULL); if (S_OK == hr) { *ppINetCfg = pINetCfg; pINetCfg->AddRef(); } else { if (pnclock) { pnclock->ReleaseWriteLock(); } } } if (pnclock) { pnclock->Release(); } //Transfer ownership to caller. pINetCfg->Release(); } return hr; } VOID pAddOrRemoveIpv6(BOOL fAddIpv6) { HRESULT hr; INetCfg* pINetCfg; hr = HrCreateINetCfg (TRUE, &pINetCfg); if (S_OK == hr) { INetCfgClassSetup* pSetup; // Get the setup interface used for installing // and uninstalling components. // hr = pINetCfg->QueryNetCfgClass ( &GUID_DEVCLASS_NETTRANS, IID_INetCfgClassSetup, (VOID**)&pSetup); if (S_OK == hr) { OBO_TOKEN OboToken; INetCfgComponent* pIComp; ZeroMemory (&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER; if (fAddIpv6) { NlsPutMsg(STDOUT, IPV6_MESSAGE_2); // printf("Installing...\n"); hr = pSetup->Install ( L"MS_TCPIP6", &OboToken, 0, 0, NULL, NULL, &pIComp); if (pIComp) { pIComp->Release(); } } else { // Need to remove the component. // Find it first. // hr = pINetCfg->FindComponent ( L"MS_TCPIP6", &pIComp); if (S_OK == hr) { NlsPutMsg(STDOUT, IPV6_MESSAGE_3); // printf("Uninstalling...\n"); hr = pSetup->DeInstall ( pIComp, &OboToken, NULL); pIComp->Release(); } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_4); // printf("Microsoft IPv6 Developer Edition is not installed.\n"); } } if (SUCCEEDED(hr)) { if (NETCFG_S_REBOOT == hr) { hr = S_OK; NlsPutMsg(STDOUT, IPV6_MESSAGE_5); // printf("A reboot is required to complete this action.\n"); } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_6); // printf("Succeeded.\n"); } } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_7); // printf("Failed to complete the action.\n"); if (HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) == hr) { hr = S_OK; NlsPutMsg(STDOUT, IPV6_MESSAGE_8); // printf("The INF file for Microsoft IPv6 Developer Edition could not be found.\n"); } else if (NETCFG_E_NEED_REBOOT == hr) { NlsPutMsg(STDOUT, IPV6_MESSAGE_9); // printf("A reboot is required before any further changes can be made.\n"); } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_10, hr); // printf("Error 0x%08x\n", hr); } } pSetup->Release(); } hr = pINetCfg->Uninitialize(); if (SUCCEEDED(hr)) { INetCfgLock * pnclock; // Get the locking interface hr = pINetCfg->QueryInterface(IID_INetCfgLock, reinterpret_cast(&pnclock)); if (SUCCEEDED(hr)) { // Attempt to lock the INetCfg for read/write hr = pnclock->ReleaseWriteLock(); pnclock->Release(); } } pINetCfg->Release(); } else if (NETCFG_E_NO_WRITE_LOCK == hr) { // Message has already been printed } else if (HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED) == hr) { ausage(); } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_11, hr); // printf("Problem 0x%08x occurred.\n", hr); } } EXTERN_C BOOL IsIpv6Installed() { HRESULT hr = S_OK; BOOL fInitCom = TRUE; BOOL fPresent = FALSE; // Initialize COM. // hr = CoInitializeEx( NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED ); if (RPC_E_CHANGED_MODE == hr) { // If we changed mode, then we won't uninitialize COM when we are done. // hr = S_OK; fInitCom = FALSE; } if (SUCCEEDED(hr)) { HRESULT hr; INetCfg* pINetCfg; hr = HrCreateINetCfg (FALSE, &pINetCfg); if (S_OK == hr) { fPresent = (S_OK == pINetCfg->FindComponent(L"MS_TCPIP6", NULL)); pINetCfg->Uninitialize(); pINetCfg->Release(); } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_12, hr); // printf("Problem 0x%08x occurred while accessing network configuration.\n", hr); exit(1); } if (fInitCom) { CoUninitialize(); } } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_13, hr); // printf("Problem 0x%08x initializing COM library\n", hr); } return fPresent; } EXTERN_C void AddOrRemoveIpv6 ( IN BOOL fAddIpv6) { HRESULT hr = S_OK; BOOL fInitCom = TRUE; // Initialize COM. // hr = CoInitializeEx( NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED ); if (RPC_E_CHANGED_MODE == hr) { // If we changed mode, then we won't uninitialize COM when we are done. // hr = S_OK; fInitCom = FALSE; } if (SUCCEEDED(hr)) { pAddOrRemoveIpv6(fAddIpv6); if (fInitCom) { CoUninitialize(); } } else { NlsPutMsg(STDOUT, IPV6_MESSAGE_13, hr); // printf("Problem 0x%08x initializing COM library\n", hr); } }