https://bugs.winehq.org/show_bug.cgi?id=50116
Bug ID: 50116 Summary: ODBC applications fail to create/configure system DSNs with builtin 'odbccp32' (SQLConfigDataSource must remap ODBC_xxx_SYS_DSN values for ConfigDSN) Product: Wine Version: 5.21 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: odbc Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
encountered with S-Hoai client 13.x from bug 7955
Download:
https://web.archive.org/web/20160419173100/http://www.kbld.de/fileadmin/defa...
Prerequisite:
* 'winetricks -q jet40' * MS Access 2000 runtime from http://download.microsoft.com/download/office2000dev/art2kmin/1/win98/en-us/... -> 'winetricks -q art2kmin' can't be used here (https://github.com/Winetricks/winetricks/issues/1641)
Content of 'MakeDSN.ini'
--- snip --- [shoai_access] ; die folgenden Einträge sollten immer da sein Driver=Microsoft Access Driver (*.mdb) DSNType=System DSN=shoai13 DESCRIPTION=S-HOAI 13.0 Access DBQ=C:\KOBOLD\shoai.13\data\kobold13.mdb FIL=MS Access; --- snip ---
Re-running the admin tool after installation:
--- snip --- $ pwd /home/focht/.wine/drive_c/KOBOLD/shoai.13/admin/client-installation/tools/makedsn
$ WINEDEBUG=+seh,+relay,+loaddll,+odbc wine ./makedsn.exe >>log.txt 2>&1 ... 0170:trace:loaddll:build_module Loaded L"C:\windows\system32\ODBCCP32.DLL" at 00990000: builtin 0170:Call PE DLL (proc=00996200,module=00990000 L"ODBCCP32.DLL",reason=WINE_PREATTACH,res=00000000) 0170:Ret PE DLL (proc=00996200,module=00990000 L"ODBCCP32.DLL",reason=WINE_PREATTACH,res=00000000) retval=1 ... 0170:Call KERNEL32.GetPrivateProfileStringA(00000000,00000000,00000000,00eb51bc,00004000,00eb5104 "C:\KOBOLD\shoai.13\admin\client-installation\tools\makedsn\\MakeDSN.ini") ret=0046425d ... 0170:Ret KERNEL32.GetPrivateProfileStringA() retval=0000000d ret=0046425d 0170:Call KERNEL32.GetPrivateProfileStringA(00eb91c8 "shoai_access",00000000,00000000,00eb926c,00004000,00eb5104 "C:\KOBOLD\shoai.13\admin\client-installation\tools\makedsn\\MakeDSN.ini") ret=00464366 ... 0170:Call odbccp32.SQLConfigDataSource(00000000,00000004,00ebd464 "Microsoft Access Driver (*.mdb)",00ebd54c "DSN=shoai13") ret=00465612 ... 0170:trace:odbc:SQLConfigDataSource "DSN=shoai13" 0170:trace:odbc:SQLConfigDataSource "DESCRIPTION=S-HOAI 13.0 Access" 0170:trace:odbc:SQLConfigDataSource "DBQ=C:\KOBOLD\shoai.13\data\kobold13.mdb" 0170:trace:odbc:SQLConfigDataSource "FIL=MS Access;" ... 0170:Call advapi32.RegOpenKeyW(80000002,009976d0 L"Software\ODBC\ODBCINST.INI\",0031fdcc) ret=00991b65 ... 0170:Ret advapi32.RegOpenKeyW() retval=00000000 ret=00991b65 0170:Call advapi32.RegOpenKeyW(00000090,001909b0 L"Microsoft Access Driver (*.mdb)",0031fdd0) ret=00991b7d ... 0170:Ret advapi32.RegOpenKeyW() retval=00000000 ret=00991b7d ... 0170:Call advapi32.RegGetValueW(00000094,00000000,0099a028 L"driver",00000002,0031fdc8,001909f8,0031fdc4) ret=00991c3e ... 0170:Ret advapi32.RegGetValueW() retval=00000000 ret=00991c3e ... 0170:Call KERNEL32.LoadLibraryW(001909f8 L"C:\windows\system32\ODBCJT32.DLL") ret=00991c53 ... 0170:trace:loaddll:build_module Loaded L"C:\windows\system32\ODBCJT32.DLL" at 010B0000: native ... 0170:Ret KERNEL32.LoadLibraryW() retval=010b0000 ret=00991c53 ... 0170:Call KERNEL32.GetProcAddress(010b0000,00997194 "ConfigDSN") ret=00991e58 0170:Ret KERNEL32.GetProcAddress() retval=012722aa ret=00991e58 ... 0170:trace:odbc:SQLConfigDataSource Calling ConfigDSN ... 0170:Call msvcrt.wcslen(01280f28 L"DSN=shoai13;DESCRIPTION=S-HOAI 13.0 Access;DBQ=C:\KOBOLD\shoai.13\data\kobold13.mdb;FIL=MS Access;;1\3a5f\7bc2\01c8;\0001;") ret=010bae8d 0170:Ret msvcrt.wcslen() retval=0000006a ret=010bae8d ... 0170:Call KERNEL32.LoadLibraryA(010b4bac "odbccp32.dll") ret=010dc812 ... 0170:Ret KERNEL32.LoadLibraryA() retval=00990000 ret=010dc812 0170:Call KERNEL32.LoadLibraryA(0031dd60 "C:\windows\system32\odbccp32.dll") ret=010dc820 ... 0170:Ret KERNEL32.LoadLibraryA() retval=00990000 ret=010dc820 0170:Call KERNEL32.FreeLibrary(00990000) ret=010dc987 ... 0170:Ret KERNEL32.FreeLibrary() retval=00000001 ret=010dc987 ... 0170:Call KERNEL32.GetProcAddress(00990000,010b4b10 "SQLGetPrivateProfileString") ret=010dc6a1 0170:Ret KERNEL32.GetProcAddress() retval=00991248 ret=010dc6a1 0170:Call odbccp32.SQLGetPrivateProfileString(01284aa8 "ODBC Data Sources",01284ad8 "shoai13",01284af8 "",0031f2e0,0000012b,01284b10 "odbc.ini") ret=010dc59e 0170:trace:odbc:SQLGetPrivateProfileString "ODBC Data Sources" "shoai13" "" 0031F2E0 299 "odbc.ini" ... 0170:Call advapi32.RegOpenKeyW(80000001,00997950 L"Software\ODBC",0031e34c) ret=00992fa0 ... 0170:Ret advapi32.RegOpenKeyW() retval=00000000 ret=00992fa0 0170:Call advapi32.RegOpenKeyW(000000a0,00191f38 L"odbc.ini",0031e350) ret=00992fb3 ... 0170:Ret advapi32.RegOpenKeyW() retval=00000000 ret=00992fb3 ... 0170:Call advapi32.RegOpenKeyW(000000a4,00191f08 L"ODBC Data Sources",0031e348) ret=00992fce ... 0170:Ret advapi32.RegOpenKeyW() retval=00000002 ret=00992fce ... 0170:Ret odbccp32.SQLGetPrivateProfileString() retval=00000000 ret=010dc59e ... 0170:Ret odbccp32.SQLConfigDataSource() retval=00000000 ret=00465612 ... 0170:Call user32.MessageBoxA(00030072,00eb51a4 "Folgende DSN konnte(n) nicht angelegt werden:\rshoai_access\r\n",00465108 "Fehler",00040010) ret=00465047 --- snip ---
Wine source:
https://source.winehq.org/git/wine.git/blob/b940c5e7c91bff963336dd7d2c4defc3...
--- snip --- 374 BOOL WINAPI SQLConfigDataSource(HWND hwnd, WORD request, LPCSTR driver, LPCSTR attributes) 375 { 376 HMODULE mod; 377 BOOL ret = FALSE; 378 WCHAR *driverW; 379 380 TRACE("%p, %d, %s, %s\n", hwnd, request, debugstr_a(driver), debugstr_a(attributes)); 381 382 if (TRACE_ON(odbc)) 383 { 384 const char *p; 385 for (p = attributes; *p; p += lstrlenA(p) + 1) 386 TRACE("%s\n", debugstr_a(p)); 387 } 388 389 clear_errors(); 390 391 driverW = heap_strdupAtoW(driver); 392 if (!driverW) 393 { 394 push_error(ODBC_ERROR_OUT_OF_MEM, odbc_error_out_of_mem); 395 return FALSE; 396 } 397 398 mod = load_config_driver(driverW); 399 if (!mod) 400 { 401 heap_free(driverW); 402 return FALSE; 403 } 404 405 pConfigDSN = (void*)GetProcAddress(mod, "ConfigDSN"); 406 if (pConfigDSN) 407 { 408 TRACE("Calling ConfigDSN\n"); 409 ret = pConfigDSN(hwnd, request, driver, attributes); 410 } 411 else 412 { 413 pConfigDSNW = (void*)GetProcAddress(mod, "ConfigDSNW"); 414 if (pConfigDSNW) 415 { 416 WCHAR *attr = NULL; 417 TRACE("Calling ConfigDSNW\n"); 418 419 attr = SQLInstall_strdup_multi(attributes); 420 if(attr) 421 ret = pConfigDSNW(hwnd, request, driverW, attr); 422 heap_free(attr); 423 } 424 } 425 426 if (!ret) 427 push_error(ODBC_ERROR_REQUEST_FAILED, odbc_error_request_failed); 428 429 heap_free(driverW); 430 FreeLibrary(mod); 431 432 return ret; 433 } --- snip ---
Microsoft docs 'SQLConfigDataSource':
https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlconfigdatasour...
Microsoft docs 'ConfigDSN':
https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/configdsn-functio...
--- quote --- Arguments
hwndParent [Input] Parent window handle. The function will not display any dialog boxes if the handle is null.
fRequest [Input] Type of request. The fRequest argument must contain one of the following values:
ODBC_ADD_DSN: Add a new data source.
ODBC_CONFIG_DSN: Configure (modify) an existing data source.
ODBC_REMOVE_DSN: Remove an existing data source.
lpszDriver [Input] Driver description (usually the name of the associated DBMS) presented to users instead of the physical driver name.
lpszAttributes [Input] A doubly null-terminated list of attributes in the form of keyword-value pairs. For more information, see "Comments." --- quote ---
You can't just pass 'fRequest' argument from 'SQLConfigDataSource' unmodified to the driver's 'ConfigDSN' function. All ODBC_xxx_SYS_DSN request values must be properly remapped to ODBC_xxx_DSN values. The fix should be applied to both, the ansi and wide-char variant.
Maybe it's also the reason for other ODBC apps failing. 'winetricks' no longer overrides 'odbccp32.dll' to native for MDAC verbs (https://github.com/Winetricks/winetricks/issues/1448)
https://github.com/Winetricks/winetricks/issues/1637
NOTE: It doesn't fully fix the DSN creation due to other builtin 'odbccp32' insufficiencies but it's a step in right direction.
$ sha1sum shoai13-kompakt.exe ee726de4309c6667c458296c4530102254fc7a20 shoai13-kompakt.exe
$ du -sh shoai13-kompakt.exe 38M shoai13-kompakt.exe
$ sha1sum art2kmin.exe 73be2622254d1f857a204a03f068787542b985e9 art2kmin.exe
$ du -sh art2kmin.exe 33M art2kmin.exe
$ wine --version wine-5.21-69-gb940c5e7c91
Regards