mirror of
https://github.com/pbatard/rufus.git
synced 2024-08-14 23:57:05 +00:00
[net] add fallback to InternetGetConnectedState() when INetworkListManager service dependencies are missing
* INetworkListManager appears to depend on specific services to be able to work,
which one can actually disable while still getting full Internet connectivity.
* If that is the case, HRESULT_FROM_WIN32(ERROR_SERVICE_DEPENDENCY_FAIL) will be
returned, therefore we add a fallback to using InternetGetConnectedState(), which
does not have such dependencies (but has other limitations per b2492908be
)
when we detect a dependency error.
* Also take this opportunity to switch to using INetworkListManager::get_IsConnectedToInternet().
* Also fix Coverity breakage due to Synopsys having upgraded their toolchain.
* Closes #1801
This commit is contained in:
parent
209fb18b1c
commit
89db56acbc
3 changed files with 25 additions and 10 deletions
4
.github/workflows/coverity.yml
vendored
4
.github/workflows/coverity.yml
vendored
|
@ -49,7 +49,9 @@ jobs:
|
||||||
msbuild-architecture: x64
|
msbuild-architecture: x64
|
||||||
|
|
||||||
- name: Build with Coverity
|
- name: Build with Coverity
|
||||||
run: cov-build.exe --dir cov-int msbuild ${{ env.SOLUTION_FILE_PATH }} /m /p:Configuration=${{ env.BUILD_CONFIGURATION }},Platform=${{ env.TARGET_PLATFORM }}
|
run: |
|
||||||
|
cov-configure --msvc
|
||||||
|
cov-build.exe --dir cov-int msbuild ${{ env.SOLUTION_FILE_PATH }} /m /p:Configuration=${{ env.BUILD_CONFIGURATION }},Platform=${{ env.TARGET_PLATFORM }}
|
||||||
|
|
||||||
- name: Publish Coverity artifacts
|
- name: Publish Coverity artifacts
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
|
|
21
src/net.c
21
src/net.c
|
@ -57,6 +57,10 @@ static DWORD error_code, fido_len = 0;
|
||||||
static BOOL force_update_check = FALSE;
|
static BOOL force_update_check = FALSE;
|
||||||
static const char* request_headers = "Accept-Encoding: gzip, deflate";
|
static const char* request_headers = "Accept-Encoding: gzip, deflate";
|
||||||
|
|
||||||
|
#if defined(__MINGW32__)
|
||||||
|
#define INetworkListManager_get_IsConnectedToInternet INetworkListManager_IsConnectedToInternet
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FormatMessage does not handle internet errors
|
* FormatMessage does not handle internet errors
|
||||||
* https://docs.microsoft.com/en-us/windows/desktop/wininet/wininet-errors
|
* https://docs.microsoft.com/en-us/windows/desktop/wininet/wininet-errors
|
||||||
|
@ -267,16 +271,18 @@ static HINTERNET GetInternetSession(BOOL bRetry)
|
||||||
int i;
|
int i;
|
||||||
char agent[64];
|
char agent[64];
|
||||||
BOOL decodingSupport = TRUE;
|
BOOL decodingSupport = TRUE;
|
||||||
DWORD dwTimeout = NET_SESSION_TIMEOUT, dwProtocolSupport = HTTP_PROTOCOL_FLAG_HTTP2;
|
VARIANT_BOOL InternetConnection = VARIANT_FALSE;
|
||||||
|
DWORD dwFlags, dwTimeout = NET_SESSION_TIMEOUT, dwProtocolSupport = HTTP_PROTOCOL_FLAG_HTTP2;
|
||||||
HINTERNET hSession = NULL;
|
HINTERNET hSession = NULL;
|
||||||
HRESULT hr = S_FALSE;
|
HRESULT hr = S_FALSE;
|
||||||
INetworkListManager* pNetworkListManager;
|
INetworkListManager* pNetworkListManager;
|
||||||
NLM_CONNECTIVITY Connectivity = NLM_CONNECTIVITY_DISCONNECTED;
|
|
||||||
|
|
||||||
PF_TYPE_DECL(WINAPI, HINTERNET, InternetOpenA, (LPCSTR, DWORD, LPCSTR, LPCSTR, DWORD));
|
PF_TYPE_DECL(WINAPI, HINTERNET, InternetOpenA, (LPCSTR, DWORD, LPCSTR, LPCSTR, DWORD));
|
||||||
PF_TYPE_DECL(WINAPI, BOOL, InternetSetOptionA, (HINTERNET, DWORD, LPVOID, DWORD));
|
PF_TYPE_DECL(WINAPI, BOOL, InternetSetOptionA, (HINTERNET, DWORD, LPVOID, DWORD));
|
||||||
|
PF_TYPE_DECL(WINAPI, BOOL, InternetGetConnectedState, (LPDWORD, DWORD));
|
||||||
PF_INIT_OR_OUT(InternetOpenA, WinInet);
|
PF_INIT_OR_OUT(InternetOpenA, WinInet);
|
||||||
PF_INIT_OR_OUT(InternetSetOptionA, WinInet);
|
PF_INIT_OR_OUT(InternetSetOptionA, WinInet);
|
||||||
|
PF_INIT(InternetGetConnectedState, WinInet);
|
||||||
|
|
||||||
// Create a NetworkListManager Instance to check the network connection
|
// Create a NetworkListManager Instance to check the network connection
|
||||||
IGNORE_RETVAL(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));
|
IGNORE_RETVAL(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));
|
||||||
|
@ -284,13 +290,20 @@ static HINTERNET GetInternetSession(BOOL bRetry)
|
||||||
&IID_INetworkListManager, (LPVOID*)&pNetworkListManager);
|
&IID_INetworkListManager, (LPVOID*)&pNetworkListManager);
|
||||||
if (hr == S_OK) {
|
if (hr == S_OK) {
|
||||||
for (i = 0; i <= WRITE_RETRIES; i++) {
|
for (i = 0; i <= WRITE_RETRIES; i++) {
|
||||||
hr = INetworkListManager_GetConnectivity(pNetworkListManager, &Connectivity);
|
hr = INetworkListManager_get_IsConnectedToInternet(pNetworkListManager, &InternetConnection);
|
||||||
|
// INetworkListManager may fail with ERROR_SERVICE_DEPENDENCY_FAIL if the DHCP service
|
||||||
|
// is not running, in which case we must fall back to using InternetGetConnectedState().
|
||||||
|
// See https://github.com/pbatard/rufus/issues/1801.
|
||||||
|
if ((hr == HRESULT_FROM_WIN32(ERROR_SERVICE_DEPENDENCY_FAIL)) && (pfInternetGetConnectedState != NULL)) {
|
||||||
|
InternetConnection = pfInternetGetConnectedState(&dwFlags, 0) ? VARIANT_TRUE : VARIANT_FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (hr == S_OK || !bRetry)
|
if (hr == S_OK || !bRetry)
|
||||||
break;
|
break;
|
||||||
Sleep(1000);
|
Sleep(1000);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Connectivity == NLM_CONNECTIVITY_DISCONNECTED) {
|
if (InternetConnection == VARIANT_FALSE) {
|
||||||
SetLastError(ERROR_INTERNET_DISCONNECTED);
|
SetLastError(ERROR_INTERNET_DISCONNECTED);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 3.18.1871"
|
CAPTION "Rufus 3.18.1872"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -395,8 +395,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,18,1871,0
|
FILEVERSION 3,18,1872,0
|
||||||
PRODUCTVERSION 3,18,1871,0
|
PRODUCTVERSION 3,18,1872,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -414,13 +414,13 @@ BEGIN
|
||||||
VALUE "Comments", "https://rufus.ie"
|
VALUE "Comments", "https://rufus.ie"
|
||||||
VALUE "CompanyName", "Akeo Consulting"
|
VALUE "CompanyName", "Akeo Consulting"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "3.18.1871"
|
VALUE "FileVersion", "3.18.1872"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2022 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2022 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
VALUE "LegalTrademarks", "https://www.gnu.org/licenses/gpl-3.0.html"
|
||||||
VALUE "OriginalFilename", "rufus-3.18.exe"
|
VALUE "OriginalFilename", "rufus-3.18.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.18.1871"
|
VALUE "ProductVersion", "3.18.1872"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Reference in a new issue