< prev index next >
src/java.base/windows/native/libjava/ProcessHandleImpl_win.c
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -467,20 +467,32 @@
JNU_CHECK_EXCEPTION(env);
}
}
static void getCmdlineInfo(JNIEnv *env, HANDLE handle, jobject jinfo) {
- char exeName[1024];
- int bufsize = sizeof exeName;
- jstring commandObj;
-
- if (QueryFullProcessImageName(handle, 0, exeName, &bufsize)) {
- commandObj = (*env)->NewStringUTF(env, exeName);
+ WCHAR exeName[1024];
+ WCHAR *longPath;
+ DWORD bufsize = sizeof(exeName)/sizeof(WCHAR);
+ jstring commandObj = NULL;
+
+ if (QueryFullProcessImageNameW(handle, 0, exeName, &bufsize)) {
+ commandObj = (*env)->NewString(env, (const jchar *)exeName,
+ (jsize)wcslen(exeName));
+ } else if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
+ bufsize = 32768;
+ longPath = (WCHAR*)malloc(bufsize * sizeof(WCHAR));
+ if (longPath != NULL) {
+ if (QueryFullProcessImageNameW(handle, 0, longPath, &bufsize)) {
+ commandObj = (*env)->NewString(env, (const jchar *)longPath,
+ (jsize)wcslen(longPath));
+ }
+ free(longPath);
+ }
+ }
CHECK_NULL(commandObj);
(*env)->SetObjectField(env, jinfo,
ProcessHandleImpl_Info_commandID, commandObj);
- }
}
static void procToUser(JNIEnv *env, HANDLE handle, jobject jinfo) {
#define TOKEN_LEN 256
DWORD token_len = TOKEN_LEN;
< prev index next >