aboutsummaryrefslogtreecommitdiff
path: root/Src/omBrowser/ieversion.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/omBrowser/ieversion.cpp')
-rw-r--r--Src/omBrowser/ieversion.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/Src/omBrowser/ieversion.cpp b/Src/omBrowser/ieversion.cpp
new file mode 100644
index 00000000..dc4cb9a4
--- /dev/null
+++ b/Src/omBrowser/ieversion.cpp
@@ -0,0 +1,81 @@
+#include "main.h"
+#include "./ieversion.h"
+
+#include <shlwapi.h>
+#include <strsafe.h>
+
+HRESULT MSIE_GetVersionString(LPWSTR pszBuffer, INT cchBufferMax)
+{
+ if (NULL == pszBuffer) return E_INVALIDARG;
+
+ HKEY hKey = NULL;
+ LONG result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Internet Explorer", 0,
+ STANDARD_RIGHTS_READ | KEY_QUERY_VALUE, &hKey);
+
+ if (ERROR_SUCCESS == result)
+ {
+ DWORD cbBuffer = sizeof(WCHAR) * cchBufferMax;
+ result = RegQueryValueEx(hKey, L"svcVersion", NULL, NULL, (BYTE*)pszBuffer, &cbBuffer);
+ if (ERROR_SUCCESS != result
+ || L'\0' == *pszBuffer)
+ {
+ cbBuffer = sizeof(WCHAR) * cchBufferMax;
+ result = RegQueryValueEx(hKey, L"Version", NULL, NULL, (BYTE*)pszBuffer, &cbBuffer);
+ }
+ RegCloseKey(hKey);
+ }
+
+ if (ERROR_SUCCESS != result)
+ {
+ *pszBuffer = L'\0';
+ return HRESULT_FROM_WIN32(result);
+ }
+
+ return S_OK;
+}
+
+HRESULT MSIE_GetVersion(INT *majorOut, INT *minorOut, INT *buildOut, INT *subBuildOut)
+{
+ INT szVersion[4] = { 0, 0, 0, 0};
+ WCHAR szBuffer[64] = {0};
+ HRESULT hr = MSIE_GetVersionString(szBuffer, ARRAYSIZE(szBuffer));
+ if (SUCCEEDED(hr))
+ {
+ INT index = 0;
+ LPWSTR block = szBuffer;
+ LPWSTR cursor = block;
+
+ for(;;)
+ {
+ if (L'\0' == *cursor)
+ {
+ if (block != cursor && FALSE != StrToIntEx(block,STIF_DEFAULT, &szVersion[index]))
+ index++;
+ break;
+ }
+ else if (L'.' == *cursor)
+ {
+ *cursor = L'\0';
+ if (block != cursor && FALSE != StrToIntEx(block,STIF_DEFAULT, &szVersion[index]))
+ {
+ index++;
+ if (index == ARRAYSIZE(szVersion))
+ break; // too many numbers
+ }
+ cursor++;
+ block = cursor;
+ }
+ cursor++;
+ }
+
+ if (index < ARRAYSIZE(szVersion))
+ hr = E_FAIL;
+ }
+
+ if (NULL != majorOut) *majorOut = szVersion[0];
+ if (NULL != minorOut) *minorOut = szVersion[1];
+ if (NULL != buildOut) *buildOut = szVersion[2];
+ if (NULL != subBuildOut) *subBuildOut = szVersion[3];
+
+ return hr;
+} \ No newline at end of file