On Linux, various `stat()` calls allow probing information about files without opening them, but until recently, there wasn't an equivalent API available on Windows. Now that `GetFileInformationByName()` exists, we can use it instead of `GetFileInformationByHandle()`, which required first opening the file to create a file handle, then reading the file attributes, and finally closing the file handle.
Since `GetFileInformationByName()` is available on only newer versions of Windows, this patch uses conditional compilation and `LoadLibrary()` + `GetProcAddress()` to dynamically set the pointer to the API function. If the dynamic loading fails, we fall back to the old API. To avoid problems with race conditions, we use Windows' `INIT_ONCE` and `InitOnceExecuteOnce()` to initialize the function pointer exactly once. The rest of the patch is similar to the addition of any new JNI function call. WindowsConstants.java adds the relevant flags and error codes, WindowsFileAttributes.java adds the Java entry point, WindowsNativeDispatcher.java links the Java function with the C function, and WindowsNativeDispatcher.c calls the Win32 API function. --------- - [x] I confirm that I make this contribution in accordance with the [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). ------------- Commit messages: - Prefer `GetFileInformationByName()` over `GetFileInformationByHandle()` Changes: https://git.openjdk.org/jdk/pull/30994/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=30994&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8383623 Stats: 462 lines in 7 files changed: 462 ins; 0 del; 0 mod Patch: https://git.openjdk.org/jdk/pull/30994.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/30994/head:pull/30994 PR: https://git.openjdk.org/jdk/pull/30994
