From 25b48e39483d95f4f1399f55c8166cad18e539ae Mon Sep 17 00:00:00 2001 From: Hannes Wellmann Date: Tue, 21 May 2024 21:36:04 +0200 Subject: [PATCH] Remove unused (native) code in Win32Natives for Win32RefreshProvider Unicode support was assumed to be present if the Windows-OS version is greater or equal five, which corresponds to Windows 2000 or later [1]. Because parts of the removed and remaining native code call methods that are only available on Windows XP/Server 2003 or later, for example 'FindFirstChangeNotificationA()' respectively 'FindFirstChangeNotificationW()', it is save to assume Unicode is always supported. All methods that check it or handle an alternative encoding are effectively dead code and can be removed. Furthermore only 64-bit artifacts are provided now and 64-bit CPU are not supported before Windows XP, too. [1] - https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-osversioninfow --- .../natives/make.bat | 20 ++-- .../org.eclipse.core.resources/natives/ref.c | 85 ---------------- .../org.eclipse.core.resources/natives/ref.h | 69 +------------ .../resources/refresh/win32/Win32Natives.java | 96 +------------------ 4 files changed, 17 insertions(+), 253 deletions(-) diff --git a/resources/bundles/org.eclipse.core.resources/natives/make.bat b/resources/bundles/org.eclipse.core.resources/natives/make.bat index aa8b7008f02..be540736625 100644 --- a/resources/bundles/org.eclipse.core.resources/natives/make.bat +++ b/resources/bundles/org.eclipse.core.resources/natives/make.bat @@ -11,22 +11,20 @@ @rem Contributors: @rem IBM Corporation - initial API and implementation @rem *************************************************************************** +@echo off REM build JNI header file -cd ..\bin -"C:\Program Files\Java\jdk1.8.0_65\bin\javah.exe" org.eclipse.core.internal.resources.refresh.win32.Win32Natives -move org_eclipse_core_internal_resources_refresh_win32_Win32Natives.h ..\natives\ref2.h +cd %~dp0\..\src + +"%JAVA_HOME%\bin\javac" -h . org\eclipse\core\internal\resources\refresh\win32\Win32Natives.java +del org\eclipse\core\internal\resources\refresh\win32\Win32Natives.class +move org_eclipse_core_internal_resources_refresh_win32_Win32Natives.h ..\natives\ref.h REM compile and link +if "%MSVC_HOME%"=="" set MSVC_HOME=C:\Program Files\Microsoft Visual Studio\2022\Community cd ..\natives -set win_include="C:\Program Files\Microsoft Visual Studio 14.0\VC\include" -set jdk_include="C:\Program Files\Java\jdk1.8.0_65\include" set dll_name=win32refresh.dll -call "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64_x86 -"cl.exe" -I%win_include% -I%jdk_include% -I%jdk_include%\win32 -LD ref.c -Fe%dll_name% -move %dll_name% ..\..\org.eclipse.core.resources.win32.x86\os\win32\x86\%dll_name% - -call "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64 -"cl.exe" -I%win_include% -I%jdk_include% -I%jdk_include%\win32 -LD ref.c -Fe%dll_name% +call "%MSVC_HOME%\VC\Auxiliary\Build\vcvarsall.bat" amd64 +"cl.exe" -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -LD ref.c -Fe%dll_name% move %dll_name% ..\..\org.eclipse.core.resources.win32.x86_64\os\win32\x86_64\%dll_name% \ No newline at end of file diff --git a/resources/bundles/org.eclipse.core.resources/natives/ref.c b/resources/bundles/org.eclipse.core.resources/natives/ref.c index 690a5a00a08..7d005258f3a 100644 --- a/resources/bundles/org.eclipse.core.resources/natives/ref.c +++ b/resources/bundles/org.eclipse.core.resources/natives/ref.c @@ -52,34 +52,6 @@ JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_W return result; } -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindFirstChangeNotificationA - * Signature: ([BZI)J - */ -JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindFirstChangeNotificationA -(JNIEnv * env, jclass this, jbyteArray lpPathName, jboolean bWatchSubtree, jint dwNotifyFilter) { - jlong result; - jsize numberOfChars; - jbyte *path, *temp; - - // create a new byte array to hold the null terminated path - numberOfChars = (*env)->GetArrayLength(env, lpPathName); - path = malloc((numberOfChars + 1) * sizeof(jbyte)); - - // get the path bytes from the vm, copy them, and release them - temp = (*env)->GetByteArrayElements(env, lpPathName, 0); - memcpy(path, temp, numberOfChars * sizeof(jbyte)); - (*env)->ReleaseByteArrayElements(env, lpPathName, temp, 0); - - // null terminate the path, make the request, and release the path memory - path[numberOfChars] = '\0'; - result = (jlong) FindFirstChangeNotificationA(path, bWatchSubtree, dwNotifyFilter); - free(path); - - return result; -} - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: FindCloseChangeNotification @@ -122,23 +94,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi return result; } -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: IsUnicode - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_IsUnicode - (JNIEnv *env, jclass this) { - OSVERSIONINFO osvi; - memset(&osvi, 0, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - if (! GetVersionEx (&osvi) ) - return JNI_FALSE; - if (osvi.dwMajorVersion >= 5) - return JNI_TRUE; - return JNI_FALSE; -} - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: GetLastError @@ -169,16 +124,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi return FILE_NOTIFY_CHANGE_DIR_NAME; } -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_ATTRIBUTES - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1ATTRIBUTES -(JNIEnv *env, jclass this) { - return FILE_NOTIFY_CHANGE_ATTRIBUTES; -} - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: FILE_NOTIFY_CHANGE_SIZE @@ -200,16 +145,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi } -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_SECURITY - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1SECURITY -(JNIEnv *env, jclass this) { - return FILE_NOTIFY_CHANGE_SECURITY; -} - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: MAXIMUM_WAIT_OBJECTS @@ -220,26 +155,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi return MAXIMUM_WAIT_OBJECTS; } -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: MAX_PATH - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_MAX_1PATH -(JNIEnv *env, jclass this) { - return MAX_PATH; -} - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: INFINITE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_INFINITE -(JNIEnv *env, jclass this) { - return INFINITE; -} - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: WAIT_OBJECT_0 diff --git a/resources/bundles/org.eclipse.core.resources/natives/ref.h b/resources/bundles/org.eclipse.core.resources/natives/ref.h index 0f018f629f5..b8afc0e056d 100644 --- a/resources/bundles/org.eclipse.core.resources/natives/ref.h +++ b/resources/bundles/org.eclipse.core.resources/natives/ref.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2016 IBM Corporation and others. + * Copyright (c) 2004, 2024 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -17,23 +17,8 @@ #ifdef __cplusplus extern "C" { #endif -/* Inaccessible static: INVALID_HANDLE_VALUE */ -/* Inaccessible static: ERROR_SUCCESS */ -/* Inaccessible static: ERROR_INVALID_HANDLE */ -/* Inaccessible static: FILE_NOTIFY_ALL */ -/* Inaccessible static: MAXIMUM_WAIT_OBJECTS */ -/* Inaccessible static: MAX_PATH */ -/* Inaccessible static: INFINITE */ -/* Inaccessible static: WAIT_TIMEOUT */ -/* Inaccessible static: WAIT_OBJECT_0 */ -/* Inaccessible static: WAIT_FAILED */ -/* Inaccessible static: FILE_NOTIFY_CHANGE_FILE_NAME */ -/* Inaccessible static: FILE_NOTIFY_CHANGE_DIR_NAME */ -/* Inaccessible static: FILE_NOTIFY_CHANGE_ATTRIBUTES */ -/* Inaccessible static: FILE_NOTIFY_CHANGE_SIZE */ -/* Inaccessible static: FILE_NOTIFY_CHANGE_LAST_WRITE */ -/* Inaccessible static: FILE_NOTIFY_CHANGE_SECURITY */ -/* Inaccessible static: UNICODE */ +#undef org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_ACCESS_DENIED +#define org_eclipse_core_internal_resources_refresh_win32_Win32Natives_ERROR_ACCESS_DENIED 5L /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: FindFirstChangeNotificationW @@ -42,14 +27,6 @@ extern "C" { JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindFirstChangeNotificationW (JNIEnv *, jclass, jstring, jboolean, jint); -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FindFirstChangeNotificationA - * Signature: ([BZI)J - */ -JNIEXPORT jlong JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FindFirstChangeNotificationA - (JNIEnv *, jclass, jbyteArray, jboolean, jint); - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: FindCloseChangeNotification @@ -74,14 +51,6 @@ JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win3 JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_WaitForMultipleObjects (JNIEnv *, jclass, jint, jlongArray, jboolean, jint); -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: IsUnicode - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_IsUnicode - (JNIEnv *, jclass); - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: GetLastError @@ -106,14 +75,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1DIR_1NAME (JNIEnv *, jclass); -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_ATTRIBUTES - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1ATTRIBUTES - (JNIEnv *, jclass); - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: FILE_NOTIFY_CHANGE_SIZE @@ -130,14 +91,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1FILE_1NAME (JNIEnv *, jclass); -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: FILE_NOTIFY_CHANGE_SECURITY - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_FILE_1NOTIFY_1CHANGE_1SECURITY - (JNIEnv *, jclass); - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: MAXIMUM_WAIT_OBJECTS @@ -146,22 +99,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Wi JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_MAXIMUM_1WAIT_1OBJECTS (JNIEnv *, jclass); -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: MAX_PATH - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_MAX_1PATH - (JNIEnv *, jclass); - -/* - * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives - * Method: INFINITE - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_eclipse_core_internal_resources_refresh_win32_Win32Natives_INFINITE - (JNIEnv *, jclass); - /* * Class: org_eclipse_core_internal_resources_refresh_win32_Win32Natives * Method: WAIT_OBJECT_0 diff --git a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java index 66de44de120..46bc0973fd4 100644 --- a/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java +++ b/resources/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/refresh/win32/Win32Natives.java @@ -37,23 +37,12 @@ public class Win32Natives { /** Access is denied. */ public static final int ERROR_ACCESS_DENIED = 5; - /** - * The combination of all of the error constants. - */ - public static int FILE_NOTIFY_ALL; + /** * A constant which indicates the maximum number of objects * that can be passed into WaitForMultipleObjects. */ public static final int MAXIMUM_WAIT_OBJECTS; - /** - * A constant which indicates the maximum length of a pathname. - */ - public static final int MAX_PATH; - /** - * A constant which expresses the concept of the infinite. - */ - public static final int INFINITE; /* wait return values */ /** @@ -86,10 +75,6 @@ public class Win32Natives { * Change filter for monitoring directory creation or deletion. */ public static final int FILE_NOTIFY_CHANGE_DIR_NAME; - /** - * Change filter for monitoring file/directory attribute changes. - */ - public static final int FILE_NOTIFY_CHANGE_ATTRIBUTES; /** * Change filter for monitoring file size changes. */ @@ -98,29 +83,17 @@ public class Win32Natives { * Change filter for monitoring the file write timestamp */ public static final int FILE_NOTIFY_CHANGE_LAST_WRITE; - /** - * Change filter for monitoring the security descriptors - * of files. - */ - public static final int FILE_NOTIFY_CHANGE_SECURITY; - /** - * Flag indicating whether or not the OS supports unicode calls. - */ - public static final boolean UNICODE; /* * Make requests to set the constants. */ static { System.loadLibrary("win32refresh"); //$NON-NLS-1$ - UNICODE = IsUnicode(); INVALID_HANDLE_VALUE = INVALID_HANDLE_VALUE(); ERROR_SUCCESS = ERROR_SUCCESS(); ERROR_INVALID_HANDLE = ERROR_INVALID_HANDLE(); MAXIMUM_WAIT_OBJECTS = MAXIMUM_WAIT_OBJECTS(); - MAX_PATH = MAX_PATH(); - INFINITE = INFINITE(); WAIT_TIMEOUT = WAIT_TIMEOUT(); WAIT_OBJECT_0 = WAIT_OBJECT_0(); @@ -129,11 +102,8 @@ public class Win32Natives { FILE_NOTIFY_CHANGE_FILE_NAME = FILE_NOTIFY_CHANGE_FILE_NAME(); FILE_NOTIFY_CHANGE_DIR_NAME = FILE_NOTIFY_CHANGE_DIR_NAME(); - FILE_NOTIFY_CHANGE_ATTRIBUTES = FILE_NOTIFY_CHANGE_ATTRIBUTES(); FILE_NOTIFY_CHANGE_SIZE = FILE_NOTIFY_CHANGE_SIZE(); FILE_NOTIFY_CHANGE_LAST_WRITE = FILE_NOTIFY_CHANGE_LAST_WRITE(); - FILE_NOTIFY_CHANGE_SECURITY = FILE_NOTIFY_CHANGE_SECURITY(); - FILE_NOTIFY_ALL = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_SECURITY; } /** @@ -142,11 +112,10 @@ public class Win32Natives { * subtree under the directory using FindNextChangeNotification or * WaitForMultipleObjects. *

- * If the OS supports unicode the path must be no longer than 2^15 - 1 characters. - * Otherwise, the path cannot be longer than MAX_PATH. In either case, if the given - * path is too long ERROR_INVALID_HANDLE is returned. + * The path must be no longer than 2^15 - 1 characters, if the given path is too + * long {@link #ERROR_INVALID_HANDLE} is returned. * - * @param lpPathName The path of the file. + * @param lpPathName The path to the directory to be monitored. * @param bWatchSubtree If true, specifies that the entire * tree under the given path should be monitored. If false * specifies that just the named path should be monitored. @@ -158,9 +127,7 @@ public class Win32Natives { * ERROR_INVALID_HANDLE if the attempt fails. */ public static long FindFirstChangeNotification(String lpPathName, boolean bWatchSubtree, int dwNotifyFilter) { - if (UNICODE) - return FindFirstChangeNotificationW(lpPathName, bWatchSubtree, dwNotifyFilter); - return FindFirstChangeNotificationA(Convert.toPlatformBytes(lpPathName), bWatchSubtree, dwNotifyFilter); + return FindFirstChangeNotificationW(lpPathName, bWatchSubtree, dwNotifyFilter); } /** @@ -183,27 +150,6 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch */ private static native long FindFirstChangeNotificationW(String lpPathName, boolean bWatchSubtree, int dwNotifyFilter); - /** - * Creates a change notification object for the given path. This notification object - * allows the client to monitor changes to the directory and the subtree - * under the directory using FindNextChangeNotification or - * WaitForMultipleObjects. - * - * @param lpPathName The path to the directory to be monitored, cannot be null, - * or be longer - * than MAX_PATH. This path must be in platform bytes converted. - * @param bWatchSubtree If true, specifies that the entire - * tree under the given path should be monitored. If false - * specifies that just the named path should be monitored. - * @param dwNotifyFilter Any combination of FILE_NOTIFY_CHANGE_FILE_NAME, - * FILE_NOTIFY_CHANGE_DIR_NAME, FILE_NOTIFY_CHANGE_ATTRIBUTES, - * FILE_NOTIFY_CHANGE_SIZE, FILE_NOTIFY_CHANGE_LAST_WRITE, or - * FILE_NOTIFY_CHANGE_SECURITY. - * @return long The handle to the find change notification object or - * ERROR_INVALID_HANDLE if the attempt fails. - */ - private static native long FindFirstChangeNotificationA(byte[] lpPathName, boolean bWatchSubtree, int dwNotifyFilter); - /** * Stops and disposes of the change notification object that corresponds to the given * handle. The handle cannot be used in future calls to FindNextChangeNotification or @@ -247,14 +193,6 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch */ public static native int WaitForMultipleObjects(int nCount, long[] lpHandles, boolean bWaitAll, int dwMilliseconds); - /** - * Answers true if the operating system supports - * long filenames. - * @return boolean true if the operating system supports - * long filenames, false otherwise. - */ - private static native boolean IsUnicode(); - /** * Answers the last error set in the current thread. * @return int the last error @@ -273,12 +211,6 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch */ private static native int FILE_NOTIFY_CHANGE_DIR_NAME(); - /** - * Returns the constant FILE_NOTIFY_CHANGE_ATTRIBUTES. - * @return int - */ - private static native int FILE_NOTIFY_CHANGE_ATTRIBUTES(); - /** * Returns the constant FILE_NOTIFY_CHANGE_SIZE. * @return int @@ -291,30 +223,12 @@ public static long FindFirstChangeNotification(String lpPathName, boolean bWatch */ private static native int FILE_NOTIFY_CHANGE_FILE_NAME(); - /** - * Returns the constant FILE_NOTIFY_CHANGE_SECURITY. - * @return int - */ - private static native int FILE_NOTIFY_CHANGE_SECURITY(); - /** * Returns the constant MAXIMUM_WAIT_OBJECTS. * @return int */ private static native int MAXIMUM_WAIT_OBJECTS(); - /** - * Returns the constant MAX_PATH. - * @return int - */ - private static native int MAX_PATH(); - - /** - * Returns the constant INFINITE. - * @return int - */ - private static native int INFINITE(); - /** * Returns the constant WAIT_OBJECT_0. * @return int