[vlc-devel] [PATCH] win32: do not load wininet.dll on startup, it's not a Known DLL

Rémi Denis-Courmont remi at remlab.net
Fri Mar 10 14:32:06 CET 2017


On March 10, 2017 3:20:00 PM GMT+02:00, Steve Lhomme <robux4 at videolabs.io> wrote:
>---
> bin/Makefile.am |  2 +-
> bin/winvlc.c    | 36 +++++++++++++++++++++++++++++++-----
> 2 files changed, 32 insertions(+), 6 deletions(-)
>
>diff --git a/bin/Makefile.am b/bin/Makefile.am
>index 4358b2bc4e..c6ad2d7e0a 100644
>--- a/bin/Makefile.am
>+++ b/bin/Makefile.am
>@@ -75,7 +75,7 @@ vlc_static_LDADD = $(vlc_LDADD)
> vlc_static_LDFLAGS = $(vlc_LDFLAGS)
> 
> if HAVE_WIN32
>-vlc_LDADD += -lpsapi -lwininet vlc_win32_rc.$(OBJEXT)
>+vlc_LDADD += -lpsapi vlc_win32_rc.$(OBJEXT)
> vlc_DEPENDENCIES = vlc_win32_rc.$(OBJEXT)
> else
> vlc_LDADD += $(LIBDL)
>diff --git a/bin/winvlc.c b/bin/winvlc.c
>index ce44f5dd29..bc427d6b55 100644
>--- a/bin/winvlc.c
>+++ b/bin/winvlc.c
>@@ -247,11 +247,34 @@ static void check_crashdump(void)
> 
>     if(answer == IDYES)
>     {
>-        HINTERNET Hint = InternetOpen(L"VLC Crash Reporter",
>+        HMODULE hWininet = LoadLibrary(TEXT("wininet.dll"));
>+        if (hWininet == NULL)
>+        {
>+            fprintf(stderr, "There was an error loading the network"
>+                    " 0x%08lx\n", (unsigned long)GetLastError());
>+            goto done;
>+        }
>+
>+        HINTERNET (WINAPI *InternetOpenW_)(LPCWSTR ,DWORD
>dwAccessType,LPCWSTR lpszProxy,LPCWSTR lpszProxyBypass,DWORD dwFlags);
>+        HINTERNET (WINAPI *InternetConnectW_)(HINTERNET
>hInternet,LPCWSTR lpszServerName,INTERNET_PORT nServerPort,LPCWSTR
>lpszUserName,LPCWSTR lpszPassword,DWORD dwService,DWORD
>dwFlags,DWORD_PTR dwContext);
>+        BOOL (WINAPI *InternetCloseHandle_)(HINTERNET hInternet);
>+        BOOL (WINAPI *FtpPutFileW_)(HINTERNET hConnect,LPCWSTR
>lpszLocalFile,LPCWSTR lpszNewRemoteFile,DWORD dwFlags,DWORD_PTR
>dwContext);
>+        InternetOpenW_       = (void*)GetProcAddress(hWininet,
>"InternetOpenW");
>+        InternetConnectW_    = (void*)GetProcAddress(hWininet,
>"InternetConnectW");
>+        InternetCloseHandle_ = (void*)GetProcAddress(hWininet,
>"InternetCloseHandle");
>+        FtpPutFileW_         = (void*)GetProcAddress(hWininet,
>"FtpPutFileW");
>+        if (!InternetOpenW_ || !InternetConnectW_ ||
>!InternetCloseHandle_ || !FtpPutFileW_)
>+        {
>+            fprintf(stderr, "There was an error loading the network
>API entries"
>+                    " 0x%08lx\n", (unsigned long)GetLastError());
>+            goto done;
>+        }
>+
>+        HINTERNET Hint = InternetOpenW_(L"VLC Crash Reporter",
>                 INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL,0);
>         if(Hint)
>         {
>-            HINTERNET ftp = InternetConnect(Hint,
>L"crash.videolan.org",
>+            HINTERNET ftp = InternetConnectW_(Hint,
>L"crash.videolan.org",
>                         INTERNET_DEFAULT_FTP_PORT, NULL, NULL,
>                       INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
>             if(ftp)
>@@ -264,26 +287,29 @@ static void check_crashdump(void)
>                         now.wYear, now.wMonth, now.wDay, now.wHour,
>                         now.wMinute, now.wSecond );
> 
>-                if( FtpPutFile( ftp, mv_crashdump_path, remote_file,
>+                if( FtpPutFileW_( ftp, mv_crashdump_path, remote_file,
>                             FTP_TRANSFER_TYPE_BINARY, 0) )
>                    fprintf(stderr, "Report sent correctly to FTP.\n");
>                 else
>                fprintf(stderr,"Couldn't send report to FTP server\n");
> 
>-                InternetCloseHandle(ftp);
>+                InternetCloseHandle_(ftp);
>             }
>             else
>             {
>               fprintf(stderr, "Can't connect to FTP server 0x%08lx\n",
>                         (unsigned long)GetLastError());
>             }
>-            InternetCloseHandle(Hint);
>+            InternetCloseHandle_(Hint);
>         }
>         else
>         {
>          fprintf(stderr, "There was an error while connecting to the "
>                 "Internet  0x%08lx\n", (unsigned long)GetLastError());
>         }
>+done:
>+        if (hWininet != NULL)
>+            FreeLibrary(hWininet);
>         MessageBox( NULL, L"Thanks a lot for helping improving VLC!",
>                     L"VLC crash report" , MB_OK);
>     }
>-- 
>2.11.1
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

Frankly, this looks retarded. That looks like an OS problem more than a VLC one.

I can hardly believe that every Windows application will load wininet, winmm or whatever other Microsoft DLL only dynamically and only with the right flags. Ergo, it seems dubious that Microsoft would actually require it.
-- 
Rémi Denis-Courmont


More information about the vlc-devel mailing list