http://bugs.winehq.org/show_bug.cgi?id=17796
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Keywords| |dotnet Status|UNCONFIRMED |NEW CC| |focht@gmx.net Component|-unknown |wininet Summary|Citavi: No network access |Citavi: No network access | |(wininet.dll | |InternetGetConnectedStateEx | |W returns incorrect network | |connection state) Ever Confirmed|0 |1
--- Comment #6 from Anastasius Focht focht@gmx.net 2013-03-22 13:56:49 CDT --- Hello folks,
confirming.
I extracted the .NET code the app uses to check for network connectivity with "Reflector" tool from "$WINEPREFIX/drive_c/Program Files/Citavi/bin/Asz.dll":
--- snip --- [DllImport("wininet.dll")] public static extern int InternetGetConnectedStateEx(out int lpdwFlags, StringBuilder lpszConnectionName, int dwNameLen, int dwReserved);
[DllImport("sensapi.dll")] public static extern bool IsNetworkAlive(ref int flags);
public bool HasLAN() { if (!_detectConnectedState) { Diagnostics.Trace(_detectConnectedState, "Value of "_detectConnectedState" flag."); return true; } bool flag = false; try { int lpdwFlags = 0; StringBuilder lpszConnectionName = new StringBuilder(0x100); int dwNameLen = 0; int dwReserved = 0; if (Native.InternetGetConnectedStateEx(out lpdwFlags, lpszConnectionName, dwNameLen, dwReserved) == 1) { flag = true; } } catch (Exception exception) { Diagnostics.Trace(exception); } Diagnostics.Trace(flag, "Value of "hasLAN" flag"); bool flag2 = Native.IsNetworkAlive(ref Native.NETWORK_ALIVE_LAN); Diagnostics.Trace(flag2, "Value of "isNetworkAlive" flag"); return (flag && flag2); } ... --- snip ---
The problem is the way Wine's wininet InternetGetConnectedStateEx() is written.
Source: http://source.winehq.org/git/wine.git/blob/ae77b3d368519b5518dbe485dfac2e812...
--- snip --- 1131 /*********************************************************************** 1132 * InternetGetConnectedStateExW (WININET.@) 1133 * 1134 * Return connected state 1135 * 1136 * PARAMS 1137 * 1138 * lpdwStatus [O] Flags specifying the status of the internet connection. 1139 * lpszConnectionName [O] Pointer to buffer to receive the friendly name of the internet connection. 1140 * dwNameLen [I] Size of the buffer, in characters. 1141 * dwReserved [I] Reserved. Must be set to 0. 1142 * 1143 * RETURNS 1144 * TRUE if connected 1145 * if lpdwStatus is not null, return the status (off line, 1146 * modem, lan...) in it. 1147 * FALSE if not connected 1148 * 1149 * NOTES 1150 * If the system has no available network connections, an empty string is 1151 * stored in lpszConnectionName. If there is a LAN connection, a localized 1152 * "LAN Connection" string is stored. Presumably, if only a dial-up 1153 * connection is available then the name of the dial-up connection is 1154 * returned. Why any application, other than the "Internet Settings" CPL, 1155 * would want to use this function instead of the simpler InternetGetConnectedStateW 1156 * function is beyond me. 1157 */ 1158 BOOL WINAPI InternetGetConnectedStateExW(LPDWORD lpdwStatus, LPWSTR lpszConnectionName, 1159 DWORD dwNameLen, DWORD dwReserved) 1160 { 1161 TRACE("(%p, %p, %d, 0x%08x)\n", lpdwStatus, lpszConnectionName, dwNameLen, dwReserved); 1162 1163 /* Must be zero */ 1164 if(dwReserved) 1165 return FALSE; 1166 1167 if (lpdwStatus) { 1168 WARN("always returning LAN connection.\n"); 1169 *lpdwStatus = INTERNET_CONNECTION_LAN; 1170 } 1171 return LoadStringW(WININET_hModule, IDS_LANCONNECTION, lpszConnectionName, dwNameLen); 1172 } --- snip ---
Returning the connection state through LoadStringW() result looks plain wrong to me (using result of that function call and/or return type int (num of chars) vs. bool).
MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384705%28v=vs.85%2...
--- quote --- BOOL InternetGetConnectedStateEx( _Out_ LPDWORD lpdwFlags, _Out_ LPTSTR lpszConnectionName, _In_ DWORD dwNameLen, _In_ DWORD dwReserved );
...
Remarks
A return value of TRUE from InternetGetConnectedState indicates that at least one connection to the Internet is available. It does not guarantee that a connection to a specific host can be established. Applications should always check for errors returned from API calls that connect to a server. InternetCheckConnection can be called to determine if a connection to a specific destination can be established.
A return value of TRUE indicates that either the modem connection is active, or a LAN connection is active and a proxy is properly configured for the LAN. A return value of FALSE indicates that neither the modem nor the LAN is connected. If FALSE is returned, the INTERNET_CONNECTION_CONFIGURED flag may be set to indicate that autodial is configured to "always dial" but is not currently active. If autodial is not configured, the function returns FALSE. --- quote ---
Digging through the application .NET code I also found a debug trace capability:
--- snip --- $ find . -name "Settings.xml" ./drive_c/users/focht/Application Data/Academic Software Zurich/Settings.xml --- snip ---
Set "EnableTrace" in XML file to "true" and you can use +debugstr channel to get more verbose diagnostics (OutputDebugString).
+debugstr with builtin wininet
--- snip --- warn:debugstr:OutputDebugStringA "3/22/2013 7:28:02 PM - _activeControlResolved is: OnlineSearchWaitDialog\r\n" warn:debugstr:OutputDebugStringA "3/22/2013 7:28:02 PM - Value of "hasLAN" flag: False\r\n" warn:debugstr:OutputDebugStringA "3/22/2013 7:28:02 PM - Value of "isNetworkAlive" flag: True\r\n" --- snip ---
+debugstr with native wininet (winetricks wininet):
--- snip --- warn:debugstr:OutputDebugStringA "3/22/2013 7:26:36 PM - _activeControlResolved is: OnlineSearchWaitDialog\r\n" fixme:ras:RasEnumConnectionsW (0x1e6ea0,0x32c68c,0x76c623e4),stub! fixme:ras:RasEnumConnectionsW RAS support is not implemented! Configure program to use LAN connection/winsock instead! fixme:service:EnumServicesStatusW resume handle not supported warn:debugstr:OutputDebugStringA "3/22/2013 7:26:37 PM - Value of "hasLAN" flag: True\r\n" warn:debugstr:OutputDebugStringA "3/22/2013 7:26:37 PM - Value of "isNetworkAlive" flag: True\r\n" warn:debugstr:OutputDebugStringA "3/22/2013 7:26:37 PM - Starting RetrievalDefinitions.UpdateAllFavorites.\r\n" ... --- snip ---
You can work around easily by either changing application setting:
"Extras" -> "Projektübergreifende Optionen" -> "Recherche" -> check "Internet-Verbindungsmeldungen von WIndows ignorieren" near the proxy settings.
or use native wininet ('winetricks wininet').
$ du -sh CitaviSetup.exe 26M CitaviSetup.exe
$ sha1sum CitaviSetup.exe bf840b949f9210654a31ba8488046e1ac47d51e5 CitaviSetup.exe
$ wine --version wine-1.5.26-19-g6ed2d9b
Regards