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 ----