7030249: Eliminate use of LoadLibrary and other clean-ups
Reviewed-by: ohair, chegar, mchung
This commit is contained in:
parent
a50069aa79
commit
e1a6f9cdea
jdk
make/java
src/windows/native
com/sun/management
java
sun
@ -198,10 +198,12 @@ INSTALL_DOT_LIB = true
|
||||
|
||||
#
|
||||
# What to link?
|
||||
# On Windows, shell32 is not normally required and so it is delay loaded.
|
||||
#
|
||||
ifeq ($(PLATFORM),windows)
|
||||
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
|
||||
OTHER_LDLIBS += $(JVMLIB) -lverify $(LIBSOCKET) $(LIBNSL) -ldl \
|
||||
-L$(OBJDIR)/../../../fdlibm/$(OBJDIRNAME) -lfdlibm.$(ARCH)
|
||||
|
@ -86,7 +86,8 @@ OTHER_INCLUDES += \
|
||||
-I$(SHARE_SRC)/native/sun/management
|
||||
|
||||
ifeq ($(PLATFORM),windows)
|
||||
OTHER_LDLIBS += $(JVMLIB)
|
||||
# Need process status helper API (psapi) on Windows
|
||||
OTHER_LDLIBS += $(JVMLIB) psapi.lib
|
||||
endif
|
||||
|
||||
#
|
||||
|
@ -30,6 +30,7 @@
|
||||
#include "management.h"
|
||||
#include "com_sun_management_OperatingSystem.h"
|
||||
|
||||
#include <psapi.h>
|
||||
#include <errno.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -53,41 +54,12 @@ static jlong jlong_from(jint h, jint l) {
|
||||
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;
|
||||
|
||||
JNIEXPORT void JNICALL
|
||||
Java_com_sun_management_OperatingSystem_initialize
|
||||
(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();
|
||||
}
|
||||
|
||||
@ -95,31 +67,12 @@ JNIEXPORT jlong JNICALL
|
||||
Java_com_sun_management_OperatingSystem_getCommittedVirtualMemorySize0
|
||||
(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;
|
||||
|
||||
if (!is_nt) return -1;
|
||||
|
||||
if (!psapi_inited) {
|
||||
psapi_inited = JNI_TRUE;
|
||||
if ((hInstPsapi = LoadLibrary("PSAPI.DLL")) == NULL) return -1;
|
||||
if ((lpfnGetProcessMemoryInfo = (LPFNGETPROCESSMEMORYINFO)
|
||||
GetProcAddress( hInstPsapi, "GetProcessMemoryInfo")) == NULL) {
|
||||
FreeLibrary(hInstPsapi);
|
||||
return -1;
|
||||
}
|
||||
if (GetProcessMemoryInfo(main_process, &pmc, sizeof(PROCESS_MEMORY_COUNTERS)) == 0) {
|
||||
return (jlong)-1L;
|
||||
} else {
|
||||
return (jlong) pmc.PagefileUsage;
|
||||
}
|
||||
|
||||
if (lpfnGetProcessMemoryInfo == NULL) return -1;
|
||||
|
||||
lpfnGetProcessMemoryInfo(main_process, &pmc,
|
||||
sizeof(PROCESS_MEMORY_COUNTERS));
|
||||
return (jlong) pmc.PagefileUsage;
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
@ -148,20 +101,15 @@ Java_com_sun_management_OperatingSystem_getProcessCpuTime
|
||||
FILETIME process_creation_time, process_exit_time,
|
||||
process_user_time, process_kernel_time;
|
||||
|
||||
// Windows NT only
|
||||
if (is_nt) {
|
||||
// Using static variables declared above
|
||||
// Units are 100-ns intervals. Convert to ns.
|
||||
GetProcessTimes(main_process, &process_creation_time,
|
||||
&process_exit_time,
|
||||
&process_kernel_time, &process_user_time);
|
||||
return (jlong_from(process_user_time.dwHighDateTime,
|
||||
process_user_time.dwLowDateTime) +
|
||||
jlong_from(process_kernel_time.dwHighDateTime,
|
||||
process_kernel_time.dwLowDateTime)) * 100;
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
// Using static variables declared above
|
||||
// Units are 100-ns intervals. Convert to ns.
|
||||
GetProcessTimes(main_process, &process_creation_time,
|
||||
&process_exit_time,
|
||||
&process_kernel_time, &process_user_time);
|
||||
return (jlong_from(process_user_time.dwHighDateTime,
|
||||
process_user_time.dwLowDateTime) +
|
||||
jlong_from(process_kernel_time.dwHighDateTime,
|
||||
process_kernel_time.dwLowDateTime)) * 100;
|
||||
}
|
||||
|
||||
JNIEXPORT jlong JNICALL
|
||||
|
@ -23,9 +23,9 @@
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/* Access APIs for Win2K and above */
|
||||
/* Access APIs for WinXP and above */
|
||||
#ifndef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0500
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#endif
|
||||
|
||||
#include <assert.h>
|
||||
@ -60,13 +60,17 @@ static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func;
|
||||
JNIEXPORT void JNICALL
|
||||
Java_java_io_WinNTFileSystem_initIDs(JNIEnv *env, jclass cls)
|
||||
{
|
||||
HANDLE handle;
|
||||
HMODULE 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 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");
|
||||
}
|
||||
@ -824,8 +828,6 @@ Java_java_io_WinNTFileSystem_getDriveDirectory(JNIEnv *env, jobject this,
|
||||
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)
|
||||
@ -834,14 +836,7 @@ Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this,
|
||||
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)) {
|
||||
if (GetVolumePathNameW(pathbuf, volname, MAX_PATH_LENGTH)) {
|
||||
ULARGE_INTEGER totalSpace, freeSpace, usableSpace;
|
||||
if (GetDiskFreeSpaceExW(volname, &usableSpace, &totalSpace, &freeSpace)) {
|
||||
switch(t) {
|
||||
@ -860,9 +855,6 @@ Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this,
|
||||
}
|
||||
}
|
||||
|
||||
if (h) {
|
||||
FreeLibrary(h);
|
||||
}
|
||||
free(pathbuf);
|
||||
return rv;
|
||||
}
|
||||
|
@ -196,42 +196,23 @@ getHomeFromRegistry()
|
||||
/*
|
||||
* 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*
|
||||
getHomeFromShell32()
|
||||
{
|
||||
HMODULE lib = LoadLibraryW(L"SHELL32.DLL");
|
||||
GetSpecialFolderType do_get_folder;
|
||||
GetPathFromIDListType do_get_path;
|
||||
HRESULT rc;
|
||||
LPITEMIDLIST item_list = 0;
|
||||
WCHAR *p;
|
||||
WCHAR path[MAX_PATH+1];
|
||||
int size = MAX_PATH+1;
|
||||
|
||||
if (lib == 0) {
|
||||
// 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);
|
||||
rc = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &item_list);
|
||||
if (!SUCCEEDED(rc)) {
|
||||
// we can't find the shell folder.
|
||||
return NULL;
|
||||
}
|
||||
|
||||
path[0] = 0;
|
||||
(*do_get_path)(item_list, (LPSTR)path);
|
||||
SHGetPathFromIDListW(item_list, (LPWSTR)path);
|
||||
|
||||
/* Get the parent of Desktop directory */
|
||||
p = wcsrchr(path, L'\\');
|
||||
@ -253,17 +234,7 @@ getHomeFromShell32()
|
||||
static boolean
|
||||
haveMMX(void)
|
||||
{
|
||||
boolean mmx = 0;
|
||||
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;
|
||||
return IsProcessorFeaturePresent(PF_MMX_INSTRUCTIONS_AVAILABLE);
|
||||
}
|
||||
|
||||
static const char *
|
||||
@ -532,10 +503,19 @@ GetJavaProperties(JNIEnv* env)
|
||||
if (uname != NULL && wcslen(uname) > 0) {
|
||||
sprops.user_name = _wcsdup(uname);
|
||||
} else {
|
||||
WCHAR buf[100];
|
||||
int buflen = sizeof(buf);
|
||||
sprops.user_name =
|
||||
GetUserNameW(buf, &buflen) ? _wcsdup(buf) : L"unknown";
|
||||
DWORD buflen = 0;
|
||||
if (GetUserNameW(NULL, &buflen) == 0 &&
|
||||
GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
||||
{
|
||||
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)
|
||||
/* Current directory */
|
||||
{
|
||||
WCHAR buf[MAX_PATH];
|
||||
GetCurrentDirectoryW(sizeof(buf), buf);
|
||||
sprops.user_dir = _wcsdup(buf);
|
||||
if (GetCurrentDirectoryW(sizeof(buf)/sizeof(WCHAR), buf) != 0)
|
||||
sprops.user_dir = _wcsdup(buf);
|
||||
}
|
||||
|
||||
sprops.file_separator = "\\";
|
||||
|
@ -36,45 +36,6 @@
|
||||
*/
|
||||
#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
|
||||
* 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
|
||||
SECURITY_INFORMATION info =
|
||||
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION;
|
||||
|
||||
(*GetFileSecurity_func)(path, info , 0, 0, &len);
|
||||
GetFileSecurityA(path, info , 0, 0, &len);
|
||||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "GetFileSecurity failed");
|
||||
return NULL;
|
||||
@ -174,7 +135,7 @@ static SECURITY_DESCRIPTOR* getFileSecurityDescriptor(JNIEnv* env, const char* p
|
||||
if (sd == NULL) {
|
||||
JNU_ThrowOutOfMemoryError(env, 0);
|
||||
} else {
|
||||
if (!(*GetFileSecurity_func)(path, info, sd, len, &len)) {
|
||||
if (!(*GetFileSecurityA)(path, info, sd, len, &len)) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "GetFileSecurity failed");
|
||||
free(sd);
|
||||
return NULL;
|
||||
@ -191,7 +152,7 @@ static SID* getFileOwner(JNIEnv* env, SECURITY_DESCRIPTOR* sd) {
|
||||
SID* owner;
|
||||
BOOL defaulted;
|
||||
|
||||
if (!(*GetSecurityDescriptorOwner_func)(sd, &owner, &defaulted)) {
|
||||
if (!GetSecurityDescriptorOwner(sd, &owner, &defaulted)) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "GetSecurityDescriptorOwner failed");
|
||||
return NULL;
|
||||
}
|
||||
@ -206,7 +167,7 @@ static ACL* getFileDACL(JNIEnv* env, SECURITY_DESCRIPTOR* sd) {
|
||||
ACL *acl;
|
||||
int defaulted, present;
|
||||
|
||||
if (!(*GetSecurityDescriptorDacl_func)(sd, &present, &acl, &defaulted)) {
|
||||
if (!GetSecurityDescriptorDacl(sd, &present, &acl, &defaulted)) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "GetSecurityDescriptorDacl failed");
|
||||
return NULL;
|
||||
}
|
||||
@ -235,8 +196,8 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) {
|
||||
/*
|
||||
* Get the ACE count
|
||||
*/
|
||||
if (!(*GetAclInformation_func)(acl, (void *) &acl_size_info, sizeof(acl_size_info),
|
||||
AclSizeInformation)) {
|
||||
if (!GetAclInformation(acl, (void *) &acl_size_info, sizeof(acl_size_info),
|
||||
AclSizeInformation)) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "GetAclInformation failed");
|
||||
return JNI_FALSE;
|
||||
}
|
||||
@ -250,7 +211,7 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) {
|
||||
ACCESS_ALLOWED_ACE *access;
|
||||
SID* sid;
|
||||
|
||||
if (!(*GetAce_func)(acl, i, &ace)) {
|
||||
if (!GetAce(acl, i, &ace)) {
|
||||
JNU_ThrowIOExceptionWithLastError(env, "GetAce failed");
|
||||
return -1;
|
||||
}
|
||||
@ -280,51 +241,7 @@ static jboolean isAccessUserOnly(JNIEnv* env, SID* owner, ACL* acl) {
|
||||
JNIEXPORT void JNICALL Java_sun_management_FileSystemImpl_init0
|
||||
(JNIEnv *env, jclass ignored)
|
||||
{
|
||||
OSVERSIONINFO ver;
|
||||
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;
|
||||
}
|
||||
/* nothing to do */
|
||||
}
|
||||
|
||||
/*
|
||||
@ -339,10 +256,6 @@ JNIEXPORT jboolean JNICALL Java_sun_management_FileSystemImpl_isSecuritySupporte
|
||||
jboolean isCopy;
|
||||
const char* path;
|
||||
|
||||
if (!isNT) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
|
||||
path = JNU_GetStringPlatformChars(env, str, &isCopy);
|
||||
if (path != NULL) {
|
||||
res = isSecuritySupported(env, path);
|
||||
|
@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
#ifndef _WIN32_WINNT
|
||||
#define _WIN32_WINNT 0x0500
|
||||
#define _WIN32_WINNT 0x0501
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@ -36,6 +36,7 @@
|
||||
#include <windows.h>
|
||||
#include <aclapi.h>
|
||||
#include <winioctl.h>
|
||||
#include <Sddl.h>
|
||||
|
||||
#include "jni.h"
|
||||
#include "jni_util.h"
|
||||
@ -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 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 HANDLE (WINAPI* FindFirstStream_Proc)(LPCWSTR, STREAM_INFO_LEVELS, LPVOID, DWORD);
|
||||
typedef BOOL (WINAPI* FindNextStream_Proc)(HANDLE, LPVOID);
|
||||
|
||||
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* ConvertSidToStringSidProc) (PSID, LPWSTR*);
|
||||
typedef BOOL (WINAPI* ConvertStringSidToSidProc) (LPWSTR, PSID*);
|
||||
typedef DWORD (WINAPI* GetLengthSidProc) (PSID);
|
||||
|
||||
static FindFirstStream_Proc FindFirstStream_func;
|
||||
static FindNextStream_Proc FindNextStream_func;
|
||||
|
||||
static CreateSymbolicLinkProc CreateSymbolicLink_func;
|
||||
static CreateHardLinkProc CreateHardLink_func;
|
||||
static GetFinalPathNameByHandleProc GetFinalPathNameByHandle_func;
|
||||
|
||||
static ConvertSidToStringSidProc ConvertSidToStringSid_func;
|
||||
static ConvertStringSidToSidProc ConvertStringSidToSid_func;
|
||||
static GetLengthSidProc GetLengthSid_func;
|
||||
|
||||
static void throwWindowsException(JNIEnv* env, DWORD lastError) {
|
||||
jobject x = JNU_NewObjectByName(env, "sun/nio/fs/WindowsException",
|
||||
"(I)V", lastError);
|
||||
@ -190,33 +171,23 @@ Java_sun_nio_fs_WindowsNativeDispatcher_initIDs(JNIEnv* env, jclass this)
|
||||
backupResult_bytesTransferred = (*env)->GetFieldID(env, clazz, "bytesTransferred", "I");
|
||||
backupResult_context = (*env)->GetFieldID(env, clazz, "context", "J");
|
||||
|
||||
|
||||
h = LoadLibrary("kernel32");
|
||||
if (h != INVALID_HANDLE_VALUE) {
|
||||
// get handle to kernel32
|
||||
if (GetModuleHandleExW((GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
|
||||
GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT),
|
||||
(LPCWSTR)&CreateFileW, &h) != 0)
|
||||
{
|
||||
// requires Windows Server 2003 or newer
|
||||
FindFirstStream_func =
|
||||
(FindFirstStream_Proc)GetProcAddress(h, "FindFirstStreamW");
|
||||
FindNextStream_func =
|
||||
(FindNextStream_Proc)GetProcAddress(h, "FindNextStreamW");
|
||||
|
||||
// requires Windows Vista or newer
|
||||
CreateSymbolicLink_func =
|
||||
(CreateSymbolicLinkProc)GetProcAddress(h, "CreateSymbolicLinkW");
|
||||
CreateHardLink_func =
|
||||
(CreateHardLinkProc)GetProcAddress(h, "CreateHardLinkW");
|
||||
GetFinalPathNameByHandle_func =
|
||||
(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
|
||||
@ -413,7 +384,7 @@ JNIEXPORT void JNICALL
|
||||
Java_sun_nio_fs_WindowsNativeDispatcher_FindFirstStream0(JNIEnv* env, jclass this,
|
||||
jlong address, jobject obj)
|
||||
{
|
||||
MY_WIN32_FIND_STREAM_DATA data;
|
||||
WIN32_FIND_STREAM_DATA data;
|
||||
LPCWSTR lpFileName = jlong_to_ptr(address);
|
||||
HANDLE handle;
|
||||
|
||||
@ -443,7 +414,7 @@ JNIEXPORT jstring JNICALL
|
||||
Java_sun_nio_fs_WindowsNativeDispatcher_FindNextStream(JNIEnv* env, jclass this,
|
||||
jlong handle)
|
||||
{
|
||||
MY_WIN32_FIND_STREAM_DATA data;
|
||||
WIN32_FIND_STREAM_DATA data;
|
||||
HANDLE h = (HANDLE)jlong_to_ptr(handle);
|
||||
|
||||
if (FindNextStream_func == NULL) {
|
||||
@ -909,12 +880,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_GetLengthSid(JNIEnv* env,
|
||||
jclass this, jlong address)
|
||||
{
|
||||
PSID sid = jlong_to_ptr(address);
|
||||
|
||||
if (GetLengthSid_func == NULL) {
|
||||
JNU_ThrowInternalError(env, "Should not get here");
|
||||
return 0;
|
||||
}
|
||||
return (jint)(*GetLengthSid_func)(sid);
|
||||
return (jint)GetLengthSid(sid);
|
||||
}
|
||||
|
||||
|
||||
@ -924,13 +890,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_ConvertSidToStringSid(JNIEnv* env,
|
||||
{
|
||||
PSID sid = jlong_to_ptr(address);
|
||||
LPWSTR string;
|
||||
|
||||
if (ConvertSidToStringSid_func == NULL) {
|
||||
JNU_ThrowInternalError(env, "Should not get here");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((*ConvertSidToStringSid_func)(sid, &string) == 0) {
|
||||
if (ConvertSidToStringSidW(sid, &string) == 0) {
|
||||
throwWindowsException(env, GetLastError());
|
||||
return NULL;
|
||||
} else {
|
||||
@ -947,15 +907,8 @@ Java_sun_nio_fs_WindowsNativeDispatcher_ConvertStringSidToSid0(JNIEnv* env,
|
||||
{
|
||||
LPWSTR lpStringSid = jlong_to_ptr(address);
|
||||
PSID pSid;
|
||||
|
||||
if (ConvertStringSidToSid_func == NULL) {
|
||||
JNU_ThrowInternalError(env, "Should not get here");
|
||||
return (jlong)0;
|
||||
}
|
||||
|
||||
if ((*ConvertStringSidToSid_func)(lpStringSid, &pSid) == 0)
|
||||
if (ConvertStringSidToSidW(lpStringSid, &pSid) == 0)
|
||||
throwWindowsException(env, GetLastError());
|
||||
|
||||
return ptr_to_jlong(pSid);
|
||||
}
|
||||
|
||||
@ -1137,11 +1090,7 @@ Java_sun_nio_fs_WindowsNativeDispatcher_CreateHardLink0(JNIEnv* env,
|
||||
LPCWSTR newFile = jlong_to_ptr(newFileAddress);
|
||||
LPCWSTR existingFile = jlong_to_ptr(existingFileAddress);
|
||||
|
||||
if (CreateHardLink_func == NULL) {
|
||||
JNU_ThrowInternalError(env, "Should not get here");
|
||||
return;
|
||||
}
|
||||
if ((*CreateHardLink_func)(newFile, existingFile, NULL) == 0)
|
||||
if (CreateHardLinkW(newFile, existingFile, NULL) == 0)
|
||||
throwWindowsException(env, GetLastError());
|
||||
}
|
||||
|
||||
|
@ -33,11 +33,6 @@
|
||||
#include <jni.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
|
||||
* otherwise.
|
||||
@ -49,48 +44,27 @@ typedef BOOL (WINAPI *CryptReleaseContextType)(HCRYPTPROV, DWORD);
|
||||
JNIEXPORT jboolean JNICALL Java_sun_security_provider_NativeSeedGenerator_nativeGenerateSeed
|
||||
(JNIEnv *env, jclass clazz, jbyteArray randArray)
|
||||
{
|
||||
HMODULE lib;
|
||||
CryptAcquireContextType acquireContext;
|
||||
CryptGenRandomType genRandom;
|
||||
CryptReleaseContextType releaseContext;
|
||||
|
||||
HCRYPTPROV hCryptProv;
|
||||
jboolean result = JNI_FALSE;
|
||||
jsize numBytes;
|
||||
jbyte* randBytes;
|
||||
|
||||
lib = LoadLibrary("ADVAPI32.DLL");
|
||||
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 (CryptAcquireContextA(&hCryptProv, "J2SE", NULL, PROV_RSA_FULL, 0) == FALSE) {
|
||||
/* 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) {
|
||||
FreeLibrary(lib);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
numBytes = (*env)->GetArrayLength(env, randArray);
|
||||
randBytes = (*env)->GetByteArrayElements(env, randArray, NULL);
|
||||
if (genRandom(hCryptProv, numBytes, randBytes)) {
|
||||
if (CryptGenRandom(hCryptProv, numBytes, randBytes)) {
|
||||
result = JNI_TRUE;
|
||||
}
|
||||
(*env)->ReleaseByteArrayElements(env, randArray, randBytes, 0);
|
||||
|
||||
releaseContext(hCryptProv, 0);
|
||||
FreeLibrary(lib);
|
||||
CryptReleaseContext(hCryptProv, 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user