From: Bruno Haible Date: Fri, 29 May 2020 00:03:12 +0000 (+0200) Subject: Avoid dynamic loading of Windows API functions when possible. X-Git-Tag: v1.0~4028 X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=3a1fdff1eebe09d6c4bb87b39d34a1d6f4179eaf;p=gnulib.git Avoid dynamic loading of Windows API functions when possible. Reported by Steve Lhomme in . * lib/gettimeofday.c (GetProcAddress, GetSystemTimePreciseAsFileTimeFuncType, GetSystemTimePreciseAsFileTimeFunc, initialized, initialize): Don't define in a build for Windows 8 or higher. * lib/isatty.c (GetProcAddress, GetNamedPipeClientProcessIdFuncType, GetNamedPipeClientProcessIdFunc, QueryFullProcessImageNameFuncType, QueryFullProcessImageNameFunc, initialized, initialize): Don't define in a build for Windows Vista or higher. * lib/stat-w32.c (GetProcAddress, GetFileInformationByHandleExFuncType, GetFileInformationByHandleExFunc, GetFinalPathNameByHandleFuncType, GetFinalPathNameByHandleFunc, initialized, initialize): Likewise. --- diff --git a/ChangeLog b/ChangeLog index 0a62f572db..c39bfd3723 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2020-05-28 Bruno Haible + + Avoid dynamic loading of Windows API functions when possible. + Reported by Steve Lhomme in + . + * lib/gettimeofday.c (GetProcAddress, + GetSystemTimePreciseAsFileTimeFuncType, + GetSystemTimePreciseAsFileTimeFunc, initialized, initialize): Don't + define in a build for Windows 8 or higher. + * lib/isatty.c (GetProcAddress, GetNamedPipeClientProcessIdFuncType, + GetNamedPipeClientProcessIdFunc, QueryFullProcessImageNameFuncType, + QueryFullProcessImageNameFunc, initialized, initialize): Don't define + in a build for Windows Vista or higher. + * lib/stat-w32.c (GetProcAddress, GetFileInformationByHandleExFuncType, + GetFileInformationByHandleExFunc, GetFinalPathNameByHandleFuncType, + GetFinalPathNameByHandleFunc, initialized, initialize): Likewise. + 2020-05-28 Paul Eggert explicit_bzero-tests: improve -Wmissing-declarations pacification diff --git a/lib/gettimeofday.c b/lib/gettimeofday.c index 19804793a9..3d53115d9f 100644 --- a/lib/gettimeofday.c +++ b/lib/gettimeofday.c @@ -33,9 +33,11 @@ #ifdef WINDOWS_NATIVE +# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) + /* Avoid warnings from gcc -Wcast-function-type. */ -# define GetProcAddress \ - (void *) GetProcAddress +# define GetProcAddress \ + (void *) GetProcAddress /* GetSystemTimePreciseAsFileTime was introduced only in Windows 8. */ typedef void (WINAPI * GetSystemTimePreciseAsFileTimeFuncType) (FILETIME *lpTime); @@ -54,6 +56,8 @@ initialize (void) initialized = TRUE; } +# endif + #endif /* This is a wrapper for gettimeofday. It is used only on systems @@ -84,8 +88,10 @@ gettimeofday (struct timeval *restrict tv, void *restrict tz) . */ FILETIME current_time; +# if !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) if (!initialized) initialize (); +# endif if (GetSystemTimePreciseAsFileTimeFunc != NULL) GetSystemTimePreciseAsFileTimeFunc (¤t_time); else diff --git a/lib/isatty.c b/lib/isatty.c index 6cdc0fb146..fc771d1036 100644 --- a/lib/isatty.c +++ b/lib/isatty.c @@ -39,9 +39,11 @@ # include #endif +#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) + /* Avoid warnings from gcc -Wcast-function-type. */ -#define GetProcAddress \ - (void *) GetProcAddress +# define GetProcAddress \ + (void *) GetProcAddress /* GetNamedPipeClientProcessId was introduced only in Windows Vista. */ typedef BOOL (WINAPI * GetNamedPipeClientProcessIdFuncType) (HANDLE hPipe, @@ -69,6 +71,8 @@ initialize (void) initialized = TRUE; } +#endif + static BOOL IsConsoleHandle (HANDLE h) { DWORD mode; @@ -84,8 +88,10 @@ static BOOL IsCygwinConsoleHandle (HANDLE h) BOOL result = FALSE; ULONG processId; +#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) if (!initialized) initialize (); +#endif /* GetNamedPipeClientProcessId diff --git a/lib/stat-w32.c b/lib/stat-w32.c index b9163f56e2..02ad9abe63 100644 --- a/lib/stat-w32.c +++ b/lib/stat-w32.c @@ -40,18 +40,20 @@ #include "pathmax.h" #include "verify.h" +#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) + /* Avoid warnings from gcc -Wcast-function-type. */ -#define GetProcAddress \ - (void *) GetProcAddress +# define GetProcAddress \ + (void *) GetProcAddress -#if _GL_WINDOWS_STAT_INODES == 2 +# if _GL_WINDOWS_STAT_INODES == 2 /* GetFileInformationByHandleEx was introduced only in Windows Vista. */ typedef DWORD (WINAPI * GetFileInformationByHandleExFuncType) (HANDLE hFile, FILE_INFO_BY_HANDLE_CLASS fiClass, LPVOID lpBuffer, DWORD dwBufferSize); static GetFileInformationByHandleExFuncType GetFileInformationByHandleExFunc = NULL; -#endif +# endif /* GetFinalPathNameByHandle was introduced only in Windows Vista. */ typedef DWORD (WINAPI * GetFinalPathNameByHandleFuncType) (HANDLE hFile, LPSTR lpFilePath, @@ -66,16 +68,18 @@ initialize (void) HMODULE kernel32 = LoadLibrary ("kernel32.dll"); if (kernel32 != NULL) { -#if _GL_WINDOWS_STAT_INODES == 2 +# if _GL_WINDOWS_STAT_INODES == 2 GetFileInformationByHandleExFunc = (GetFileInformationByHandleExFuncType) GetProcAddress (kernel32, "GetFileInformationByHandleEx"); -#endif +# endif GetFinalPathNameByHandleFunc = (GetFinalPathNameByHandleFuncType) GetProcAddress (kernel32, "GetFinalPathNameByHandleA"); } initialized = TRUE; } +#endif + /* Converts a FILETIME to GMT time since 1970-01-01 00:00:00. */ #if _GL_WINDOWS_STAT_TIMESPEC struct timespec @@ -134,8 +138,10 @@ _gl_fstat_by_handle (HANDLE h, const char *path, struct stat *buf) DWORD type = GetFileType (h); if (type == FILE_TYPE_DISK) { +#if !(_WIN32_WINNT >= _WIN32_WINNT_VISTA) if (!initialized) initialize (); +#endif /* st_mode can be determined through GetFileAttributesEx