提交 135dbba5 编写于 作者: A alanb

7030249: Eliminate use of LoadLibrary and other clean-ups

Reviewed-by: ohair, chegar, mchung
上级 59e6a22b
...@@ -198,10 +198,12 @@ INSTALL_DOT_LIB = true ...@@ -198,10 +198,12 @@ INSTALL_DOT_LIB = true
# #
# What to link? # What to link?
# On Windows, shell32 is not normally required and so it is delay loaded.
# #
ifeq ($(PLATFORM),windows) ifeq ($(PLATFORM),windows)
OTHER_LDLIBS += $(JVMLIB) -libpath:$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) fdlibm.lib \ OTHER_LDLIBS += $(JVMLIB) -libpath:$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) fdlibm.lib \
-libpath:$(OBJDIR)/../../../verify/$(OBJDIRNAME) verify.lib -libpath:$(OBJDIR)/../../../verify/$(OBJDIRNAME) verify.lib \
shell32.lib delayimp.lib /DELAYLOAD:shell32.dll
else else
OTHER_LDLIBS += $(JVMLIB) -lverify $(LIBSOCKET) $(LIBNSL) -ldl \ OTHER_LDLIBS += $(JVMLIB) -lverify $(LIBSOCKET) $(LIBNSL) -ldl \
-L$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) -lfdlibm.$(ARCH) -L$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) -lfdlibm.$(ARCH)
......
...@@ -86,7 +86,8 @@ OTHER_INCLUDES += \ ...@@ -86,7 +86,8 @@ OTHER_INCLUDES += \
-I$(SHARE_SRC)/native/sun/management -I$(SHARE_SRC)/native/sun/management
ifeq ($(PLATFORM),windows) ifeq ($(PLATFORM),windows)
OTHER_LDLIBS += $(JVMLIB) # Need process status helper API (psapi) on Windows
OTHER_LDLIBS += $(JVMLIB) psapi.lib
endif endif
# #
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "management.h" #include "management.h"
#include "com_sun_management_OperatingSystem.h" #include "com_sun_management_OperatingSystem.h"
#include <psapi.h>
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -53,41 +54,12 @@ static jlong jlong_from(jint h, jint l) { ...@@ -53,41 +54,12 @@ static jlong jlong_from(jint h, jint l) {
return result; return result;
} }
// From psapi.h
typedef struct _PROCESS_MEMORY_COUNTERS {
DWORD cb;
DWORD PageFaultCount;
SIZE_T PeakWorkingSetSize;
SIZE_T WorkingSetSize;
SIZE_T QuotaPeakPagedPoolUsage;
SIZE_T QuotaPagedPoolUsage;
SIZE_T QuotaPeakNonPagedPoolUsage;
SIZE_T QuotaNonPagedPoolUsage;
SIZE_T PagefileUsage;
SIZE_T PeakPagefileUsage;
} PROCESS_MEMORY_COUNTERS;
static HINSTANCE hInstPsapi = NULL;
typedef BOOL (WINAPI *LPFNGETPROCESSMEMORYINFO)(HANDLE, PROCESS_MEMORY_COUNTERS*, DWORD);
static jboolean is_nt = JNI_FALSE;
static HANDLE main_process; static HANDLE main_process;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_com_sun_management_OperatingSystem_initialize Java_com_sun_management_OperatingSystem_initialize
(JNIEnv *env, jclass cls) (JNIEnv *env, jclass cls)
{ {
OSVERSIONINFO oi;
oi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&oi);
switch(oi.dwPlatformId) {
case VER_PLATFORM_WIN32_WINDOWS: is_nt = JNI_FALSE; break;
case VER_PLATFORM_WIN32_NT: is_nt = JNI_TRUE; break;
default:
throw_internal_error(env, "Unsupported Platform");
return;
}
main_process = GetCurrentProcess(); main_process = GetCurrentProcess();
} }
...@@ -95,31 +67,12 @@ JNIEXPORT jlong JNICALL ...@@ -95,31 +67,12 @@ JNIEXPORT jlong JNICALL
Java_com_sun_management_OperatingSystem_getCommittedVirtualMemorySize0 Java_com_sun_management_OperatingSystem_getCommittedVirtualMemorySize0
(JNIEnv *env, jobject mbean) (JNIEnv *env, jobject mbean)
{ {
/*
* In bytes. NT/2000/XP only - using GetProcessMemoryInfo from psapi.dll
*/
static LPFNGETPROCESSMEMORYINFO lpfnGetProcessMemoryInfo = NULL;
static volatile jboolean psapi_inited = JNI_FALSE;
PROCESS_MEMORY_COUNTERS pmc; PROCESS_MEMORY_COUNTERS pmc;
if (GetProcessMemoryInfo(main_process, &pmc, sizeof(PROCESS_MEMORY_COUNTERS)) == 0) {
if (!is_nt) return -1; return (jlong)-1L;
} else {
if (!psapi_inited) { return (jlong) pmc.PagefileUsage;
psapi_inited = JNI_TRUE;
if ((hInstPsapi = LoadLibrary("PSAPI.DLL")) == NULL) return -1;
if ((lpfnGetProcessMemoryInfo = (LPFNGETPROCESSMEMORYINFO)
GetProcAddress( hInstPsapi, "GetProcessMemoryInfo")) == NULL) {
FreeLibrary(hInstPsapi);
return -1;
}
} }
if (lpfnGetProcessMemoryInfo == NULL) return -1;
lpfnGetProcessMemoryInfo(main_process, &pmc,
sizeof(PROCESS_MEMORY_COUNTERS));
return (jlong) pmc.PagefileUsage;
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
...@@ -148,20 +101,15 @@ Java_com_sun_management_OperatingSystem_getProcessCpuTime ...@@ -148,20 +101,15 @@ Java_com_sun_management_OperatingSystem_getProcessCpuTime
FILETIME process_creation_time, process_exit_time, FILETIME process_creation_time, process_exit_time,
process_user_time, process_kernel_time; process_user_time, process_kernel_time;
// Windows NT only // Using static variables declared above
if (is_nt) { // Units are 100-ns intervals. Convert to ns.
// Using static variables declared above GetProcessTimes(main_process, &process_creation_time,
// Units are 100-ns intervals. Convert to ns. &process_exit_time,
GetProcessTimes(main_process, &process_creation_time, &process_kernel_time, &process_user_time);
&process_exit_time, return (jlong_from(process_user_time.dwHighDateTime,
&process_kernel_time, &process_user_time); process_user_time.dwLowDateTime) +
return (jlong_from(process_user_time.dwHighDateTime, jlong_from(process_kernel_time.dwHighDateTime,
process_user_time.dwLowDateTime) + process_kernel_time.dwLowDateTime)) * 100;
jlong_from(process_kernel_time.dwHighDateTime,
process_kernel_time.dwLowDateTime)) * 100;
} else {
return -1;
}
} }
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
......
...@@ -23,9 +23,9 @@ ...@@ -23,9 +23,9 @@
* questions. * questions.
*/ */
/* Access APIs for Win2K and above */ /* Access APIs for WinXP and above */
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500 #define _WIN32_WINNT 0x0501
#endif #endif
#include <assert.h> #include <assert.h>
...@@ -60,13 +60,17 @@ static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func; ...@@ -60,13 +60,17 @@ static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func;
JNIEXPORT void JNICALL JNIEXPORT void JNICALL
Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls) Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls)
{ {
HANDLE handle; HMODULE handle;
jclass fileClass = (*env)->FindClass(env, "java/io/File"); jclass fileClass = (*env)->FindClass(env, "java/io/File");
if (!fileClass) return; if (!fileClass) return;
ids.path = ids.path =
(*env)->GetFieldID(env, fileClass, "path", "Ljava/lang/String;"); (*env)->GetFieldID(env, fileClass, "path", "Ljava/lang/String;");
handle = LoadLibrary("kernel32");
if (handle != NULL) { // 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) GetFinalPathNameByHandle_func = (GetFinalPathNameByHandleProc)
GetProcAddress(handle, "GetFinalPathNameByHandleW"); GetProcAddress(handle, "GetFinalPathNameByHandleW");
} }
...@@ -824,8 +828,6 @@ Java_java_io_WinNTFileSystem_getDriveDirectory(JNIEnv *env, jobject this, ...@@ -824,8 +828,6 @@ Java_java_io_WinNTFileSystem_getDriveDirectory(JNIEnv *env, jobject this,
return ret; return ret;
} }
typedef BOOL (WINAPI* GetVolumePathNameProc) (LPCWSTR, LPWSTR, DWORD);
JNIEXPORT jlong JNICALL JNIEXPORT jlong JNICALL
Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this, Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this,
jobject file, jint t) jobject file, jint t)
...@@ -834,14 +836,7 @@ Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this, ...@@ -834,14 +836,7 @@ Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this,
jlong rv = 0L; jlong rv = 0L;
WCHAR *pathbuf = fileToNTPath(env, file, ids.path); WCHAR *pathbuf = fileToNTPath(env, file, ids.path);
HMODULE h = LoadLibrary("kernel32"); if (GetVolumePathNameW(pathbuf, volname, MAX_PATH_LENGTH)) {
GetVolumePathNameProc getVolumePathNameW = NULL;
if (h) {
getVolumePathNameW
= (GetVolumePathNameProc)GetProcAddress(h, "GetVolumePathNameW");
}
if (getVolumePathNameW(pathbuf, volname, MAX_PATH_LENGTH)) {
ULARGE_INTEGER totalSpace, freeSpace, usableSpace; ULARGE_INTEGER totalSpace, freeSpace, usableSpace;
if (GetDiskFreeSpaceExW(volname, &usableSpace, &totalSpace, &freeSpace)) { if (GetDiskFreeSpaceExW(volname, &usableSpace, &totalSpace, &freeSpace)) {
switch(t) { switch(t) {
...@@ -860,9 +855,6 @@ Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this, ...@@ -860,9 +855,6 @@ Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this,
} }
} }
if (h) {
FreeLibrary(h);
}
free(pathbuf); free(pathbuf);
return rv; return rv;
} }
...@@ -196,42 +196,23 @@ getHomeFromRegistry() ...@@ -196,42 +196,23 @@ getHomeFromRegistry()
/* /*
* Code to figure out the user's home directory using shell32.dll * Code to figure out the user's home directory using shell32.dll
*/ */
typedef HRESULT (WINAPI *GetSpecialFolderType)(HWND, int, LPITEMIDLIST *);
typedef BOOL (WINAPI *GetPathFromIDListType)(LPCITEMIDLIST, LPSTR);
WCHAR* WCHAR*
getHomeFromShell32() getHomeFromShell32()
{ {
HMODULE lib = LoadLibraryW(L"SHELL32.DLL");
GetSpecialFolderType do_get_folder;
GetPathFromIDListType do_get_path;
HRESULT rc; HRESULT rc;
LPITEMIDLIST item_list = 0; LPITEMIDLIST item_list = 0;
WCHAR *p; WCHAR *p;
WCHAR path[MAX_PATH+1]; WCHAR path[MAX_PATH+1];
int size = MAX_PATH+1; int size = MAX_PATH+1;
if (lib == 0) { rc = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &item_list);
// We can't load the library !!??
return NULL;
}
do_get_folder = (GetSpecialFolderType)GetProcAddress(lib, "SHGetSpecialFolderLocation");
do_get_path = (GetPathFromIDListType)GetProcAddress(lib, "SHGetPathFromIDListW");
if (do_get_folder == 0 || do_get_path == 0) {
// the library doesn't hold the right functions !!??
return NULL;
}
rc = (*do_get_folder)(NULL, CSIDL_DESKTOPDIRECTORY, &item_list);
if (!SUCCEEDED(rc)) { if (!SUCCEEDED(rc)) {
// we can't find the shell folder. // we can't find the shell folder.
return NULL; return NULL;
} }
path[0] = 0; path[0] = 0;
(*do_get_path)(item_list, (LPSTR)path); SHGetPathFromIDListW(item_list, (LPWSTR)path);
/* Get the parent of Desktop directory */ /* Get the parent of Desktop directory */
p = wcsrchr(path, L'\\'); p = wcsrchr(path, L'\\');
...@@ -253,17 +234,7 @@ getHomeFromShell32() ...@@ -253,17 +234,7 @@ getHomeFromShell32()
static boolean static boolean
haveMMX(void) haveMMX(void)
{ {
boolean mmx = 0; return IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE);
HMODULE lib = LoadLibrary("KERNEL32");
if (lib != NULL) {
BOOL (WINAPI *isProcessorFeaturePresent)(DWORD) =
(BOOL (WINAPI *)(DWORD))
GetProcAddress(lib, "IsProcessorFeaturePresent");
if (isProcessorFeaturePresent != NULL)
mmx = isProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE);
FreeLibrary(lib);
}
return mmx;
} }
static const char * static const char *
...@@ -532,10 +503,19 @@ GetJavaProperties(JNIEnv* env) ...@@ -532,10 +503,19 @@ GetJavaProperties(JNIEnv* env)
if (uname != NULL && wcslen(uname) > 0) { if (uname != NULL && wcslen(uname) > 0) {
sprops.user_name = _wcsdup(uname); sprops.user_name = _wcsdup(uname);
} else { } else {
WCHAR buf[100]; DWORD buflen = 0;
int buflen = sizeof(buf); if (GetUserNameW(NULL, &buflen) == 0 &&
sprops.user_name = GetLastError() == ERROR_INSUFFICIENT_BUFFER)
GetUserNameW(buf, &buflen) ? _wcsdup(buf) : L"unknown"; {
uname = (WCHAR*)malloc(buflen * sizeof(WCHAR));
if (uname != NULL && GetUserNameW(uname, &buflen) == 0) {
free(uname);
uname = NULL;
}
} else {
uname = NULL;
}
sprops.user_name = (uname != NULL) ? uname : L"unknown";
} }
} }
...@@ -633,8 +613,8 @@ GetJavaProperties(JNIEnv* env) ...@@ -633,8 +613,8 @@ GetJavaProperties(JNIEnv* env)
/* Current directory */ /* Current directory */
{ {
WCHAR buf[MAX_PATH]; WCHAR buf[MAX_PATH];
GetCurrentDirectoryW(sizeof(buf), buf); if (GetCurrentDirectoryW(sizeof(buf)/sizeof(WCHAR), buf) != 0)
sprops.user_dir = _wcsdup(buf); sprops.user_dir = _wcsdup(buf);
} }
sprops.file_separator = "\\"; sprops.file_separator = "\\";
......
...@@ -36,45 +36,6 @@ ...@@ -36,45 +36,6 @@
*/ */
#define ANY_ACCESS (FILE_GENERIC_READ | FILE_GENERIC_WRITE | FILE_GENERIC_EXECUTE) #define ANY_ACCESS (FILE_GENERIC_READ | FILE_GENERIC_WRITE | FILE_GENERIC_EXECUTE)
/*
* Function prototypes for security functions - we can't statically
* link because these functions aren't on Windows 9x.
*/
typedef BOOL (WINAPI *GetFileSecurityFunc)
(LPCTSTR lpFileName, SECURITY_INFORMATION RequestedInformation,
PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD nLength,
LPDWORD lpnLengthNeeded);
typedef BOOL (WINAPI *GetSecurityDescriptorOwnerFunc)
(PSECURITY_DESCRIPTOR pSecurityDescriptor, PSID *pOwner,
LPBOOL lpbOwnerDefaulted);
typedef BOOL (WINAPI *GetSecurityDescriptorDaclFunc)
(PSECURITY_DESCRIPTOR pSecurityDescriptor, LPBOOL lpbDaclPresent,
PACL *pDacl, LPBOOL lpbDaclDefaulted);
typedef BOOL (WINAPI *GetAclInformationFunc)
(PACL pAcl, LPVOID pAclInformation, DWORD nAclInformationLength,
ACL_INFORMATION_CLASS dwAclInformationClass);
typedef BOOL (WINAPI *GetAceFunc)
(PACL pAcl, DWORD dwAceIndex, LPVOID *pAce);
typedef BOOL (WINAPI *EqualSidFunc)(PSID pSid1, PSID pSid2);
/* Addresses of the security functions */
static GetFileSecurityFunc GetFileSecurity_func;
static GetSecurityDescriptorOwnerFunc GetSecurityDescriptorOwner_func;
static GetSecurityDescriptorDaclFunc GetSecurityDescriptorDacl_func;
static GetAclInformationFunc GetAclInformation_func;
static GetAceFunc GetAce_func;
static EqualSidFunc EqualSid_func;
/* True if this OS is NT kernel based (NT/2000/XP) */
static int isNT;
/* /*
* Returns JNI_TRUE if the specified file is on a file system that supports * Returns JNI_TRUE if the specified file is on a file system that supports
* persistent ACLs (On NTFS file systems returns true, on FAT32 file systems * persistent ACLs (On NTFS file systems returns true, on FAT32 file systems
...@@ -165,7 +126,7 @@ static SECURITY_DESCRIPTOR* getFileSecurityDescriptor(JNIEnv* env, const char* p ...@@ -165,7 +126,7 @@ static SECURITY_DESCRIPTOR* getFileSecurityDescriptor(JNIEnv* env, const char* p
SECURITY_INFORMATION info = SECURITY_INFORMATION info =
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION; OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
(*GetFileSecurity_func)(path, info , 0, 0, &len); GetFileSecurityA(path, info , 0, 0, &len);
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
JNU_ThrowIOExceptionWithLastError(env, "GetFileSecurity failed"); JNU_ThrowIOExceptionWithLastError(env, "GetFileSecurity failed");
return NULL; return NULL;
...@@ -174,7 +135,7 @@ static SECURITY_DESCRIPTOR* getFileSecurityDescriptor(JNIEnv* env, const char* p ...@@ -174,7 +135,7 @@ static SECURITY_DESCRIPTOR* getFileSecurityDescriptor(JNIEnv* env, const char* p
if (sd == NULL) { if (sd == NULL) {
JNU_ThrowOutOfMemoryError(env, 0); JNU_ThrowOutOfMemoryError(env, 0);
} else { } else {
if (!(*GetFileSecurity_func)(path, info, sd, len, &len)) { if (!(*GetFileSecurityA)(path, info, sd, len, &len)) {
JNU_ThrowIOExceptionWithLastError(env, "GetFileSecurity failed"); JNU_ThrowIOExceptionWithLastError(env, "GetFileSecurity failed");
free(sd); free(sd);
return NULL; return NULL;
...@@ -191,7 +152,7 @@ static SID* getFileOwner(JNIEnv* env, SECURITY_DESCRIPTOR* sd) { ...@@ -191,7 +152,7 @@ static SID* getFileOwner(JNIEnv* env, SECURITY_DESCRIPTOR* sd) {
SID* owner; SID* owner;
BOOL defaulted; BOOL defaulted;
if (!(*GetSecurityDescriptorOwner_func)(sd, &owner, &defaulted)) { if (!GetSecurityDescriptorOwner(sd, &owner, &defaulted)) {
JNU_ThrowIOExceptionWithLastError(env, "GetSecurityDescriptorOwner failed"); JNU_ThrowIOExceptionWithLastError(env, "GetSecurityDescriptorOwner failed");
return NULL; return NULL;
} }
...@@ -206,7 +167,7 @@ static ACL* getFileDACL(JNIEnv* env, SECURITY_DESCRIPTOR* sd) { ...@@ -206,7 +167,7 @@ static ACL* getFileDACL(JNIEnv* env, SECURITY_DESCRIPTOR* sd) {
ACL *acl; ACL *acl;
int defaulted, present; int defaulted, present;
if (!(*GetSecurityDescriptorDacl_func)(sd, &present, &acl, &defaulted)) { if (!GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted)) {
JNU_ThrowIOExceptionWithLastError(env, "GetSecurityDescriptorDacl failed"); JNU_ThrowIOExceptionWithLastError(env, "GetSecurityDescriptorDacl failed");
return NULL; return NULL;
} }
...@@ -235,8 +196,8 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) { ...@@ -235,8 +196,8 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) {
/* /*
* Get the ACE count * Get the ACE count
*/ */
if (!(*GetAclInformation_func)(acl, (void *) &acl_size_info, sizeof(acl_size_info), if (!GetAclInformation(acl, (void *) &acl_size_info, sizeof(acl_size_info),
AclSizeInformation)) { AclSizeInformation)) {
JNU_ThrowIOExceptionWithLastError(env, "GetAclInformation failed"); JNU_ThrowIOExceptionWithLastError(env, "GetAclInformation failed");
return JNI_FALSE; return JNI_FALSE;
} }
...@@ -250,7 +211,7 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) { ...@@ -250,7 +211,7 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) {
ACCESS_ALLOWED_ACE *access; ACCESS_ALLOWED_ACE *access;
SID* sid; SID* sid;
if (!(*GetAce_func)(acl, i, &ace)) { if (!GetAce(acl, i, &ace)) {
JNU_ThrowIOExceptionWithLastError(env, "GetAce failed"); JNU_ThrowIOExceptionWithLastError(env, "GetAce failed");
return -1; return -1;
} }
...@@ -280,51 +241,7 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) { ...@@ -280,51 +241,7 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) {
JNIEXPORT void JNICALL Java_sun_management_FileSystemImpl_init0 JNIEXPORT void JNICALL Java_sun_management_FileSystemImpl_init0
(JNIEnv *env, jclass ignored) (JNIEnv *env, jclass ignored)
{ {
OSVERSIONINFO ver; /* nothing to do */
HINSTANCE hInst;
/*
* Get the OS version. If dwPlatformId is VER_PLATFORM_WIN32_NT
* it means we're running on a Windows NT, 2000, or XP machine.
*/
ver.dwOSVersionInfoSize = sizeof(ver);
GetVersionEx(&ver);
isNT = (ver.dwPlatformId == VER_PLATFORM_WIN32_NT);
if (!isNT) {
return;
}
/*
* On NT/2000/XP we need the addresses of the security functions
*/
hInst = LoadLibrary("ADVAPI32.DLL");
if (hInst == NULL) {
JNU_ThrowIOExceptionWithLastError(env, "Unable to load ADVAPI32.DLL");
return;
}
GetFileSecurity_func = (GetFileSecurityFunc)GetProcAddress(hInst, "GetFileSecurityA");
GetSecurityDescriptorOwner_func =
(GetSecurityDescriptorOwnerFunc)GetProcAddress(hInst, "GetSecurityDescriptorOwner");
GetSecurityDescriptorDacl_func =
(GetSecurityDescriptorDaclFunc)GetProcAddress(hInst, "GetSecurityDescriptorDacl");
GetAclInformation_func =
(GetAclInformationFunc)GetProcAddress(hInst, "GetAclInformation");
GetAce_func = (GetAceFunc)GetProcAddress(hInst, "GetAce");
EqualSid_func = (EqualSidFunc)GetProcAddress(hInst, "EqualSid");
if (GetFileSecurity_func == NULL ||
GetSecurityDescriptorDacl_func == NULL ||
GetSecurityDescriptorDacl_func == NULL ||
GetAclInformation_func == NULL ||
GetAce_func == NULL ||
EqualSid_func == NULL)
{
JNU_ThrowIOExceptionWithLastError(env,
"Unable to get address of security functions");
return;
}
} }
/* /*
...@@ -339,10 +256,6 @@ JNIEXPORT jboolean JNICALL Java_sun_management_FileSystemImpl_isSecuritySupporte ...@@ -339,10 +256,6 @@ JNIEXPORT jboolean JNICALL Java_sun_management_FileSystemImpl_isSecuritySupporte
jboolean isCopy; jboolean isCopy;
const char* path; const char* path;
if (!isNT) {
return JNI_FALSE;
}
path = JNU_GetStringPlatformChars(env, str, &isCopy); path = JNU_GetStringPlatformChars(env, str, &isCopy);
if (path != NULL) { if (path != NULL) {
res = isSecuritySupported(env, path); res = isSecuritySupported(env, path);
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
*/ */
#ifndef _WIN32_WINNT #ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500 #define _WIN32_WINNT 0x0501
#endif #endif
#include <stdio.h> #include <stdio.h>
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <windows.h> #include <windows.h>
#include <aclapi.h> #include <aclapi.h>
#include <winioctl.h> #include <winioctl.h>
#include <Sddl.h>
#include "jni.h" #include "jni.h"
#include "jni_util.h" #include "jni_util.h"
...@@ -77,40 +78,20 @@ static jfieldID backupResult_context; ...@@ -77,40 +78,20 @@ static jfieldID backupResult_context;
/** /**
* Win32 APIs not defined in Visual Studio 2003 header files * Win32 APIs not available in Windows XP
*/ */
typedef HANDLE (WINAPI* FindFirstStream_Proc)(LPCWSTR, STREAM_INFO_LEVELS, LPVOID, DWORD);
typedef enum {
FindStreamInfoStandard
} MY_STREAM_INFO_LEVELS;
typedef struct _MY_WIN32_FIND_STREAM_DATA {
LARGE_INTEGER StreamSize;
WCHAR cStreamName[MAX_PATH + 36];
} MY_WIN32_FIND_STREAM_DATA;
typedef HANDLE (WINAPI* FindFirstStream_Proc)(LPCWSTR, MY_STREAM_INFO_LEVELS, LPVOID, DWORD);
typedef BOOL (WINAPI* FindNextStream_Proc)(HANDLE, LPVOID); typedef BOOL (WINAPI* FindNextStream_Proc)(HANDLE, LPVOID);
typedef BOOLEAN (WINAPI* CreateSymbolicLinkProc) (LPCWSTR, LPCWSTR, DWORD); typedef BOOLEAN (WINAPI* CreateSymbolicLinkProc) (LPCWSTR, LPCWSTR, DWORD);
typedef BOOL (WINAPI* CreateHardLinkProc) (LPCWSTR, LPCWSTR, LPSECURITY_ATTRIBUTES);
typedef BOOL (WINAPI* GetFinalPathNameByHandleProc) (HANDLE, LPWSTR, DWORD, DWORD); typedef BOOL (WINAPI* GetFinalPathNameByHandleProc) (HANDLE, LPWSTR, DWORD, DWORD);
typedef BOOL (WINAPI* ConvertSidToStringSidProc) (PSID, LPWSTR*);
typedef BOOL (WINAPI* ConvertStringSidToSidProc) (LPWSTR, PSID*);
typedef DWORD (WINAPI* GetLengthSidProc) (PSID);
static FindFirstStream_Proc FindFirstStream_func; static FindFirstStream_Proc FindFirstStream_func;
static FindNextStream_Proc FindNextStream_func; static FindNextStream_Proc FindNextStream_func;
static CreateSymbolicLinkProc CreateSymbolicLink_func; static CreateSymbolicLinkProc CreateSymbolicLink_func;
static CreateHardLinkProc CreateHardLink_func;
static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func; static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func;
static ConvertSidToStringSidProc ConvertSidToStringSid_func;
static ConvertStringSidToSidProc ConvertStringSidToSid_func;
static GetLengthSidProc GetLengthSid_func;
static void throwWindowsException(JNIEnv* env, DWORD lastError) { static void throwWindowsException(JNIEnv* env, DWORD lastError) {
jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException", jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException",
"(I)V", lastError); "(I)V", lastError);
...@@ -190,33 +171,23 @@ Java_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this) ...@@ -190,33 +171,23 @@ Java_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this)
backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I"); backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I");
backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J"); backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J");
// get handle to kernel32
h = LoadLibrary("kernel32"); if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
if (h != INVALID_HANDLE_VALUE) { GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT),
(LPCWSTR)&CreateFileW, &h) != 0)
{
// requires Windows Server 2003 or newer
FindFirstStream_func = FindFirstStream_func =
(FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW"); (FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW");
FindNextStream_func = FindNextStream_func =
(FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW"); (FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW");
// requires Windows Vista or newer
CreateSymbolicLink_func = CreateSymbolicLink_func =
(CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW"); (CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW");
CreateHardLink_func =
(CreateHardLinkProc)GetProcAddress(h, "CreateHardLinkW");
GetFinalPathNameByHandle_func = GetFinalPathNameByHandle_func =
(GetFinalPathNameByHandleProc)GetProcAddress(h, "GetFinalPathNameByHandleW"); (GetFinalPathNameByHandleProc)GetProcAddress(h, "GetFinalPathNameByHandleW");
FreeLibrary(h);
}
h = LoadLibrary("advapi32");
if (h != INVALID_HANDLE_VALUE) {
ConvertSidToStringSid_func =
(ConvertSidToStringSidProc)GetProcAddress(h, "ConvertSidToStringSidW");
ConvertStringSidToSid_func =
(ConvertStringSidToSidProc)GetProcAddress(h, "ConvertStringSidToSidW");
GetLengthSid_func =
(GetLengthSidProc)GetProcAddress(h, "GetLengthSid");
FreeLibrary(h);
} }
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
...@@ -413,7 +384,7 @@ JNIEXPORT void JNICALL ...@@ -413,7 +384,7 @@ JNIEXPORT void JNICALL
Java_sun_nio_fs_WindowsNativeDispatcher_FindFirstStream0(JNIEnv* env, jclass this, Java_sun_nio_fs_WindowsNativeDispatcher_FindFirstStream0(JNIEnv* env, jclass this,
jlong address, jobject obj) jlong address, jobject obj)
{ {
MY_WIN32_FIND_STREAM_DATA data; WIN32_FIND_STREAM_DATA data;
LPCWSTR lpFileName = jlong_to_ptr(address); LPCWSTR lpFileName = jlong_to_ptr(address);
HANDLE handle; HANDLE handle;
...@@ -443,7 +414,7 @@ JNIEXPORT jstring JNICALL ...@@ -443,7 +414,7 @@ JNIEXPORT jstring JNICALL
Java_sun_nio_fs_WindowsNativeDispatcher_FindNextStream(JNIEnv* env, jclass this, Java_sun_nio_fs_WindowsNativeDispatcher_FindNextStream(JNIEnv* env, jclass this,
jlong handle) jlong handle)
{ {
MY_WIN32_FIND_STREAM_DATA data; WIN32_FIND_STREAM_DATA data;
HANDLE h = (HANDLE)jlong_to_ptr(handle); HANDLE h = (HANDLE)jlong_to_ptr(handle);
if (FindNextStream_func == NULL) { if (FindNextStream_func == NULL) {
...@@ -909,12 +880,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_GetLengthSid(JNIEnv* env, ...@@ -909,12 +880,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_GetLengthSid(JNIEnv* env,
jclass this, jlong address) jclass this, jlong address)
{ {
PSID sid = jlong_to_ptr(address); PSID sid = jlong_to_ptr(address);
return (jint)GetLengthSid(sid);
if (GetLengthSid_func == NULL) {
JNU_ThrowInternalError(env, "Should not get here");
return 0;
}
return (jint)(*GetLengthSid_func)(sid);
} }
...@@ -924,13 +890,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_ConvertSidToStringSid(JNIEnv* env, ...@@ -924,13 +890,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_ConvertSidToStringSid(JNIEnv* env,
{ {
PSID sid = jlong_to_ptr(address); PSID sid = jlong_to_ptr(address);
LPWSTR string; LPWSTR string;
if (ConvertSidToStringSidW(sid, &string) == 0) {
if (ConvertSidToStringSid_func == NULL) {
JNU_ThrowInternalError(env, "Should not get here");
return NULL;
}
if ((*ConvertSidToStringSid_func)(sid, &string) == 0) {
throwWindowsException(env, GetLastError()); throwWindowsException(env, GetLastError());
return NULL; return NULL;
} else { } else {
...@@ -947,15 +907,8 @@ Java_sun_nio_fs_WindowsNativeDispatcher_ConvertStringSidToSid0(JNIEnv* env, ...@@ -947,15 +907,8 @@ Java_sun_nio_fs_WindowsNativeDispatcher_ConvertStringSidToSid0(JNIEnv* env,
{ {
LPWSTR lpStringSid = jlong_to_ptr(address); LPWSTR lpStringSid = jlong_to_ptr(address);
PSID pSid; PSID pSid;
if (ConvertStringSidToSidW(lpStringSid, &pSid) == 0)
if (ConvertStringSidToSid_func == NULL) {
JNU_ThrowInternalError(env, "Should not get here");
return (jlong)0;
}
if ((*ConvertStringSidToSid_func)(lpStringSid, &pSid) == 0)
throwWindowsException(env, GetLastError()); throwWindowsException(env, GetLastError());
return ptr_to_jlong(pSid); return ptr_to_jlong(pSid);
} }
...@@ -1137,11 +1090,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_CreateHardLink0(JNIEnv* env, ...@@ -1137,11 +1090,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_CreateHardLink0(JNIEnv* env,
LPCWSTR newFile = jlong_to_ptr(newFileAddress); LPCWSTR newFile = jlong_to_ptr(newFileAddress);
LPCWSTR existingFile = jlong_to_ptr(existingFileAddress); LPCWSTR existingFile = jlong_to_ptr(existingFileAddress);
if (CreateHardLink_func == NULL) { if (CreateHardLinkW(newFile, existingFile, NULL) == 0)
JNU_ThrowInternalError(env, "Should not get here");
return;
}
if ((*CreateHardLink_func)(newFile, existingFile, NULL) == 0)
throwWindowsException(env, GetLastError()); throwWindowsException(env, GetLastError());
} }
......
...@@ -33,11 +33,6 @@ ...@@ -33,11 +33,6 @@
#include <jni.h> #include <jni.h>
#include "sun_security_provider_NativeSeedGenerator.h" #include "sun_security_provider_NativeSeedGenerator.h"
/* Typedefs for runtime linking. */
typedef BOOL (WINAPI *CryptAcquireContextType)(HCRYPTPROV*, LPCTSTR, LPCTSTR, DWORD, DWORD);
typedef BOOL (WINAPI *CryptGenRandomType)(HCRYPTPROV, DWORD, BYTE*);
typedef BOOL (WINAPI *CryptReleaseContextType)(HCRYPTPROV, DWORD);
/* /*
* Get a random seed from the MS CryptoAPI. Return true if successful, false * Get a random seed from the MS CryptoAPI. Return true if successful, false
* otherwise. * otherwise.
...@@ -49,48 +44,27 @@ typedef BOOL (WINAPI *CryptReleaseContextType)(HCRYPTPROV, DWORD); ...@@ -49,48 +44,27 @@ typedef BOOL (WINAPI *CryptReleaseContextType)(HCRYPTPROV, DWORD);
JNIEXPORT jboolean JNICALL Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed JNIEXPORT jboolean JNICALL Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed
(JNIEnv *env, jclass clazz, jbyteArray randArray) (JNIEnv *env, jclass clazz, jbyteArray randArray)
{ {
HMODULE lib;
CryptAcquireContextType acquireContext;
CryptGenRandomType genRandom;
CryptReleaseContextType releaseContext;
HCRYPTPROV hCryptProv; HCRYPTPROV hCryptProv;
jboolean result = JNI_FALSE; jboolean result = JNI_FALSE;
jsize numBytes; jsize numBytes;
jbyte* randBytes; jbyte* randBytes;
lib = LoadLibrary("ADVAPI32.DLL"); if (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, 0) == FALSE) {
if (lib == NULL) {
return result;
}
acquireContext = (CryptAcquireContextType)GetProcAddress(lib, "CryptAcquireContextA");
genRandom = (CryptGenRandomType)GetProcAddress(lib, "CryptGenRandom");
releaseContext = (CryptReleaseContextType)GetProcAddress(lib, "CryptReleaseContext");
if (acquireContext == NULL || genRandom == NULL || releaseContext == NULL) {
FreeLibrary(lib);
return result;
}
if (acquireContext(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, 0) == FALSE) {
/* If CSP context hasn't been created, create one. */ /* If CSP context hasn't been created, create one. */
if (acquireContext(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, if (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL,
CRYPT_NEWKEYSET) == FALSE) { CRYPT_NEWKEYSET) == FALSE) {
FreeLibrary(lib);
return result; return result;
} }
} }
numBytes = (*env)->GetArrayLength(env, randArray); numBytes = (*env)->GetArrayLength(env, randArray);
randBytes = (*env)->GetByteArrayElements(env, randArray, NULL); randBytes = (*env)->GetByteArrayElements(env, randArray, NULL);
if (genRandom(hCryptProv, numBytes, randBytes)) { if (CryptGenRandom(hCryptProv, numBytes, randBytes)) {
result = JNI_TRUE; result = JNI_TRUE;
} }
(*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0); (*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0);
releaseContext(hCryptProv, 0); CryptReleaseContext(hCryptProv, 0);
FreeLibrary(lib);
return result; return result;
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册