123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #include <main.h>
- #include <internetFeatures.h>
- #include <shlwapi.h>
- #include <strsafe.h>
- #define REGISTRY_FEATURE_CONTROL L"Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl"
- InternetFeatures::InternetFeatures()
- : module(NULL), loadResult(S_FALSE),
- CoInternetSetFeatureEnabled(NULL),
- CoInternetIsFeatureEnabled(NULL),
- processName_(NULL)
- {
- }
- InternetFeatures::~InternetFeatures()
- {
- if (NULL != module)
- {
- FreeLibrary(module);
- }
- if (NULL != processName_)
- free(processName_);
- }
- HRESULT InternetFeatures::LoadModule()
- {
- if (S_FALSE != loadResult)
- return loadResult;
- module = LoadLibrary(L"UrlMon.dll");
- if (NULL == module)
- {
- DWORD errorCode = GetLastError();
- loadResult = HRESULT_FROM_WIN32(errorCode);
- return loadResult;
- }
- else
- {
- loadResult = S_OK;
- }
- CoInternetSetFeatureEnabled = (COINTERNETSETFEATUREENABLED)GetProcAddress(module, "CoInternetSetFeatureEnabled");
- CoInternetIsFeatureEnabled = (COINTERNETISFEATUREENABLED)GetProcAddress(module, "CoInternetIsFeatureEnabled");
- return loadResult;
- }
- const wchar_t *InternetFeatures::GetProcessName()
- {
- if (NULL == processName_)
- {
- wchar_t buffer[2*MAX_PATH] = {0};
- unsigned long length = GetModuleFileNameW(NULL, buffer, ARRAYSIZE(buffer));
- if (0 == length)
- return NULL;
- const wchar_t *fileName = PathFindFileName(buffer);
- length = lstrlenW(fileName);
- processName_ = (wchar_t *)calloc((length + 1), sizeof(wchar_t));
- if (NULL == processName_)
- return NULL;
- memcpy(processName_, fileName, sizeof(wchar_t)*length);
- processName_[length]=L'\0';
- }
- return processName_;
- }
- HRESULT InternetFeatures::SetEnabled(INTERNETFEATURELIST FeatureEntry, DWORD dwFlags, BOOL fEnable)
- {
- HRESULT hr = LoadModule();
- if (FAILED(hr)) return hr;
- if (NULL == CoInternetSetFeatureEnabled) return E_NOINTERFACE;
- return CoInternetSetFeatureEnabled(FeatureEntry, dwFlags, fEnable);
- }
- HRESULT InternetFeatures::IsEnabled(INTERNETFEATURELIST FeatureEntry, DWORD dwFlags)
- {
- HRESULT hr = LoadModule();
- if (FAILED(hr)) return hr;
- if (NULL == CoInternetIsFeatureEnabled) return E_NOINTERFACE;
- return CoInternetIsFeatureEnabled(FeatureEntry, dwFlags);
- }
- HRESULT InternetFeatures::SetDWORDFeature(const wchar_t *featureName, BOOL perUser, unsigned long value)
- {
- if (NULL == featureName
- || L'\0' == *featureName)
- {
- return E_INVALIDARG;
- }
- const wchar_t *processName = GetProcessName();
- if (NULL == processName)
- return E_UNEXPECTED;
- HKEY rootKey = (FALSE != perUser) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
- HKEY key = NULL;
- unsigned long disposition = 0;
- long errorCode = 0;
- HRESULT result = S_OK;
- wchar_t buffer[MAX_PATH] = {0};
- if (FAILED(StringCchPrintf(buffer, ARRAYSIZE(buffer),
- REGISTRY_FEATURE_CONTROL L"\\" L"%s",
- featureName)))
- {
- return E_OUTOFMEMORY;
- }
- errorCode = RegCreateKeyEx(rootKey, buffer,
- NULL, NULL, REG_OPTION_VOLATILE, KEY_WRITE,
- NULL, &key, &disposition);
- if (ERROR_SUCCESS != errorCode)
- return HRESULT_FROM_WIN32(errorCode);
- errorCode = RegSetValueEx(key, processName, 0, REG_DWORD, (const BYTE*)&value,
- sizeof(unsigned long));
- if (ERROR_SUCCESS != errorCode)
- {
- result = HRESULT_FROM_WIN32(errorCode);
- }
- else
- {
- result = S_OK;
- }
- RegCloseKey(key);
- return result;
- }
- HRESULT InternetFeatures::GetDWORDFeature(const wchar_t *featureName, BOOL perUser, unsigned long *value)
- {
- if (NULL == featureName
- || L'\0' == *featureName)
- {
- return E_INVALIDARG;
- }
- if (NULL == value)
- return E_POINTER;
- const wchar_t *processName = GetProcessName();
- if (NULL == processName)
- return E_UNEXPECTED;
- HKEY rootKey = (FALSE != perUser) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
- HKEY key = NULL;
- long errorCode = 0;
- HRESULT result = S_OK;
- unsigned long valueType = 0;
- unsigned long valueSize = 0;
- wchar_t buffer[MAX_PATH] = {0};
- if (FAILED(StringCchPrintf(buffer, ARRAYSIZE(buffer),
- REGISTRY_FEATURE_CONTROL L"\\" L"%s",
- featureName)))
- {
- return E_OUTOFMEMORY;
- }
- errorCode = RegOpenKeyEx(rootKey, buffer, 0, KEY_READ, &key);
- if (ERROR_SUCCESS != errorCode)
- return HRESULT_FROM_WIN32(errorCode);
- valueSize = sizeof(unsigned long);
- errorCode = RegQueryValueEx(key, processName, 0, &valueType,
- (BYTE*)value, &valueSize);
- if (ERROR_SUCCESS != errorCode)
- {
- result = HRESULT_FROM_WIN32(errorCode);
- }
- else
- {
- if (REG_DWORD != valueType)
- result = E_UNEXPECTED;
- else
- result = S_OK;
- }
- RegCloseKey(key);
- return result;
- }
- void InternetFeatures::DeleteFeature(const wchar_t *featureName, BOOL perUser)
- {
- if (NULL == featureName
- || L'\0' == *featureName)
- {
- return;
- }
- const wchar_t *processName = GetProcessName();
- if (NULL == processName)
- return;
- HKEY rootKey = (FALSE != perUser) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE;
- HKEY key = NULL;
- long errorCode = 0;
- wchar_t buffer[MAX_PATH] = {0};
- if (FAILED(StringCchPrintf(buffer, ARRAYSIZE(buffer),
- REGISTRY_FEATURE_CONTROL L"\\" L"%s",
- featureName)))
- {
- return;
- }
- errorCode = RegOpenKeyEx(rootKey, buffer, 0, KEY_WRITE, &key);
- if (ERROR_SUCCESS != errorCode)
- return;
- RegDeleteValue(key, processName);
- RegCloseKey(key);
- }
|