http://bugs.winehq.org/show_bug.cgi?id=17796
--- Comment #7 from Anastasius Focht focht@gmx.net --- Hello folks,
not fully fixed yet.
Although commit http://source.winehq.org/git/wine.git/commitdiff/2ef27a232239bcd614e53ff4805... was technically correct, there is another problem in InternetGetConnectedStateExA()
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/Citavi/bin
$ WINEDEBUG=+tid,+seh,+relay,+wininet wine ./Citavi\ Program.exe >>log.txt 2>&1 ...
002b:Call wininet.InternetGetConnectedStateEx(0f6de084,114786b0,00000000,00000000) ret=04950f05 002b:trace:wininet:InternetGetConnectedStateExA (0xf6de084, 0x114786b0, 0, 0x00000000) 002b:trace:wininet:InternetGetConnectedStateExW (0xf6de084, (nil), 0, 0x00000000) 002b:warn:wininet:InternetGetConnectedStateExW always returning LAN connection. 002b:Call user32.LoadStringW(7e020000,00000500,00000000,00000000) ret=7e04ae39 002b:Ret user32.LoadStringW() retval=00000000 ret=7e04ae39 002b:Ret wininet.InternetGetConnectedStateEx() retval=00000000 ret=04950f05 ... 002b:Call KERNEL32.OutputDebugStringW(01128298 L"1/30/2014 9:59:01 PM - Value of "hasLAN" flag: False\r\n") ret=049505de --- snip ---
Wine only allocates a wide-character buffer in InternetGetConnectedStateExA() in case of non-NULL lpszConnectionName' _and_ non-zero 'dwNameLen'.
The .NET code passes a valid buffer ptr but zero 'dwNameLen' (see .NET code from my comment #6) hence InternetGetConnectedStateExW() always gets NULL buffer, leading to LoadStringW() failure.
Source: http://source.winehq.org/git/wine.git/blob/2ef27a232239bcd614e53ff48054ac5fe...
--- snip --- 1229 BOOL WINAPI InternetGetConnectedStateExA(LPDWORD lpdwStatus, LPSTR lpszConnectionName, 1230 DWORD dwNameLen, DWORD dwReserved) 1231 { 1232 LPWSTR lpwszConnectionName = NULL; 1233 BOOL rc; 1234 1235 TRACE("(%p, %p, %d, 0x%08x)\n", lpdwStatus, lpszConnectionName, dwNameLen, dwReserved); 1236 1237 if (lpszConnectionName && dwNameLen > 0) 1238 lpwszConnectionName = heap_alloc(dwNameLen * sizeof(WCHAR)); 1239 1240 rc = InternetGetConnectedStateExW(lpdwStatus,lpwszConnectionName, dwNameLen, 1241 dwReserved); 1242 if (rc && lpwszConnectionName) 1243 { 1244 WideCharToMultiByte(CP_ACP,0,lpwszConnectionName,-1,lpszConnectionName, 1245 dwNameLen, NULL, NULL); 1246 heap_free(lpwszConnectionName); 1247 } 1248 return rc; 1249 } --- snip ---
Native can somehow cope with this situation, probably ignoring 'dwNameLen', using a fixed size temporary wide-character buffer which is passed to InternetGetConnectedStateExW().
Even if the caller never gets a filled buffer due to 'dwNameLen' being zero, the function can still return 'TRUE' when InternetGetConnectedStateExW() returns 'TRUE'. I think this is what the .NET code implies by passing zero 'dwNameLen': only interested in return value, not the actual connection name.
$ sha1sum CitaviSetup.exe bf840b949f9210654a31ba8488046e1ac47d51e5 CitaviSetup.exe
$ du -sh CitaviSetup.exe 26M CitaviSetup.exe
$ wine --version wine-1.7.11-206-g82b3813
Regards