src/windows/native/java/io/WinNTFileSystem_md.c

Print this page

        

*** 21,33 **** * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! /* Access APIs for Win2K and above */ #ifndef _WIN32_WINNT ! #define _WIN32_WINNT 0x0500 #endif #include <assert.h> #include <stdio.h> #include <stdlib.h> --- 21,33 ---- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ ! /* Access APIs for WinXP and above */ #ifndef _WIN32_WINNT ! #define _WIN32_WINNT 0x0501 #endif #include <assert.h> #include <stdio.h> #include <stdlib.h>
*** 58,74 **** static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func; JNIEXPORT void JNICALL Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls) { ! HANDLE handle; jclass fileClass = (*env)->FindClass(env, "java/io/File"); if (!fileClass) return; ids.path = (*env)->GetFieldID(env, fileClass, "path", "Ljava/lang/String;"); ! handle = LoadLibrary("kernel32"); ! if (handle != NULL) { GetFinalPathNameByHandle_func = (GetFinalPathNameByHandleProc) GetProcAddress(handle, "GetFinalPathNameByHandleW"); } } --- 58,78 ---- static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func; JNIEXPORT void JNICALL Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls) { ! HMODULE handle; jclass fileClass = (*env)->FindClass(env, "java/io/File"); if (!fileClass) return; ids.path = (*env)->GetFieldID(env, fileClass, "path", "Ljava/lang/String;"); ! ! // GetFinalPathNameByHandle requires Windows Vista or newer ! if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | ! GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT), ! (LPCWSTR)&CreateFileW, &handle) != 0) ! { GetFinalPathNameByHandle_func = (GetFinalPathNameByHandleProc) GetProcAddress(handle, "GetFinalPathNameByHandleW"); } }
*** 822,849 **** ret = (*env)->NewString(env, p, (jsize)wcslen(p)); free (pf); return ret; } - typedef BOOL (WINAPI* GetVolumePathNameProc) (LPCWSTR, LPWSTR, DWORD); - JNIEXPORT jlong JNICALL Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this, jobject file, jint t) { WCHAR volname[MAX_PATH_LENGTH + 1]; jlong rv = 0L; WCHAR *pathbuf = fileToNTPath(env, file, ids.path); ! HMODULE h = LoadLibrary("kernel32"); ! GetVolumePathNameProc getVolumePathNameW = NULL; ! if (h) { ! getVolumePathNameW ! = (GetVolumePathNameProc)GetProcAddress(h, "GetVolumePathNameW"); ! } ! ! if (getVolumePathNameW(pathbuf, volname, MAX_PATH_LENGTH)) { ULARGE_INTEGER totalSpace, freeSpace, usableSpace; if (GetDiskFreeSpaceExW(volname, &usableSpace, &totalSpace, &freeSpace)) { switch(t) { case java_io_FileSystem_SPACE_TOTAL: rv = long_to_jlong(totalSpace.QuadPart); --- 826,844 ---- ret = (*env)->NewString(env, p, (jsize)wcslen(p)); free (pf); return ret; } JNIEXPORT jlong JNICALL Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this, jobject file, jint t) { WCHAR volname[MAX_PATH_LENGTH + 1]; jlong rv = 0L; WCHAR *pathbuf = fileToNTPath(env, file, ids.path); ! if (GetVolumePathNameW(pathbuf, volname, MAX_PATH_LENGTH)) { ULARGE_INTEGER totalSpace, freeSpace, usableSpace; if (GetDiskFreeSpaceExW(volname, &usableSpace, &totalSpace, &freeSpace)) { switch(t) { case java_io_FileSystem_SPACE_TOTAL: rv = long_to_jlong(totalSpace.QuadPart);
*** 858,868 **** assert(0); } } } - if (h) { - FreeLibrary(h); - } free(pathbuf); return rv; } --- 853,860 ----