Added odbccp32-SQLWritePrivateProfileStringW patchset

This commit is contained in:
Alistair Leslie-Hughes 2024-06-15 14:38:32 +10:00
parent d776fcfa06
commit 5a586ba5cb
3 changed files with 117 additions and 0 deletions

View File

@ -0,0 +1,50 @@
From bea6b99a50c4de12c03d6dd68e9f246b854f9550 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sat, 8 Jun 2024 10:24:40 +1000
Subject: [PATCH 1/2] odbccp32: Support System wide ODBC DSN keys
---
dlls/odbccp32/odbccp32.c | 22 ++++++++++++++--------
1 file changed, 14 insertions(+), 8 deletions(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index 95bfb90781e..7846f29584f 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -713,19 +713,25 @@ BOOL WINAPI SQLGetInstalledDrivers(char *buf, WORD size, WORD *sizeout)
static HKEY get_privateprofile_sectionkey(LPCWSTR section, LPCWSTR filename)
{
- HKEY hkey, hkeyfilename, hkeysection;
+ HKEY hkeysection;
LONG ret;
+ WCHAR *regpath;
- if (RegOpenKeyW(HKEY_CURRENT_USER, odbcW, &hkey))
+ regpath = malloc ( (wcslen(L"Software\\ODBC\\") + wcslen(filename) + wcslen(L"\\")
+ + wcslen(section) + 1) * sizeof(WCHAR));
+ if (!regpath)
return NULL;
- ret = RegOpenKeyW(hkey, filename, &hkeyfilename);
- RegCloseKey(hkey);
- if (ret)
- return NULL;
+ wcscpy(regpath, L"Software\\ODBC\\");
+ wcscat(regpath, filename);
+ wcscat(regpath, L"\\");
+ wcscat(regpath, section);
- ret = RegOpenKeyW(hkeyfilename, section, &hkeysection);
- RegCloseKey(hkeyfilename);
+ if ((ret = RegOpenKeyW(HKEY_CURRENT_USER, regpath, &hkeysection)) != ERROR_SUCCESS)
+ {
+ ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, regpath, &hkeysection);
+ }
+ free(regpath);
return ret ? NULL : hkeysection;
}
--
2.43.0

View File

@ -0,0 +1,63 @@
From e7ef9385cd21edecf8229f85e7c4a8f5436164c0 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Sat, 8 Jun 2024 15:08:08 +1000
Subject: [PATCH 2/2] odbccp32: SQLWritePrivateProfileStringW check for
existing DSN first
If a DSN is System wide, we need to write to the HKEY_LOCAL_MACHINE
part of the registry not HKEY_CURRENT_USER which it's currently doing.
---
dlls/odbccp32/odbccp32.c | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/dlls/odbccp32/odbccp32.c b/dlls/odbccp32/odbccp32.c
index 7846f29584f..470bc170618 100644
--- a/dlls/odbccp32/odbccp32.c
+++ b/dlls/odbccp32/odbccp32.c
@@ -1810,6 +1810,7 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry
static const WCHAR empty[] = {0};
LONG ret;
HKEY hkey;
+ WCHAR *regpath;
clear_errors();
TRACE("%s %s %s %s\n", debugstr_w(lpszSection), debugstr_w(lpszEntry),
@@ -1821,7 +1822,34 @@ BOOL WINAPI SQLWritePrivateProfileStringW(LPCWSTR lpszSection, LPCWSTR lpszEntry
return FALSE;
}
- if ((ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) == ERROR_SUCCESS)
+ regpath = malloc ( (wcslen(L"Software\\ODBC\\") + wcslen(lpszFilename) + wcslen(L"\\")
+ + wcslen(lpszSection) + 1) * sizeof(WCHAR));
+ if (!regpath)
+ {
+ push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem);
+ return FALSE;
+ }
+ wcscpy(regpath, L"Software\\ODBC\\");
+ wcscat(regpath, lpszFilename);
+ wcscat(regpath, L"\\");
+ wcscat(regpath, lpszSection);
+
+ /* Check an existing key first before writing a new one */
+ if ((ret = RegOpenKeyW(HKEY_CURRENT_USER, regpath, &hkey)) != ERROR_SUCCESS)
+ {
+ ret = RegOpenKeyW(HKEY_LOCAL_MACHINE, regpath, &hkey);
+ }
+ free(regpath);
+
+ if (ret == ERROR_SUCCESS)
+ {
+ if(lpszString)
+ ret = RegSetValueExW(hkey, lpszEntry, 0, REG_SZ, (BYTE*)lpszString, (lstrlenW(lpszString)+1)*sizeof(WCHAR));
+ else
+ ret = RegSetValueExW(hkey, lpszEntry, 0, REG_SZ, (BYTE*)empty, sizeof(empty));
+ RegCloseKey(hkey);
+ }
+ else if ((ret = RegCreateKeyW(HKEY_CURRENT_USER, odbcW, &hkey)) == ERROR_SUCCESS)
{
HKEY hkeyfilename;
--
2.43.0

View File

@ -0,0 +1,4 @@
Fixes: [56786] odbccp32: Correct lookup of DSN before writing to registry.
#PR: https://gitlab.winehq.org/wine/wine/-/merge_requests/5812