aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/internetFeatures.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/omBrowser/internetFeatures.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/omBrowser/internetFeatures.cpp')
-rw-r--r--Src/omBrowser/internetFeatures.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/Src/omBrowser/internetFeatures.cpp b/Src/omBrowser/internetFeatures.cpp
new file mode 100644
index 00000000..c2c7bd52
--- /dev/null
+++ b/Src/omBrowser/internetFeatures.cpp
@@ -0,0 +1,224 @@
+#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);
+} \ No newline at end of file