src/windows/native/java/lang/ProcessImpl_md.c
Print this page
*** 143,156 ****
HANDLE outWrite = INVALID_HANDLE_VALUE;
HANDLE errRead = INVALID_HANDLE_VALUE;
HANDLE errWrite = INVALID_HANDLE_VALUE;
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
! STARTUPINFO si;
! LPTSTR pcmd = NULL;
! LPCTSTR pdir = NULL;
! LPVOID penvBlock = NULL;
jlong *handles = NULL;
jlong ret = 0;
OSVERSIONINFO ver;
jboolean onNT = JNI_FALSE;
DWORD processFlag;
--- 143,156 ----
HANDLE outWrite = INVALID_HANDLE_VALUE;
HANDLE errRead = INVALID_HANDLE_VALUE;
HANDLE errWrite = INVALID_HANDLE_VALUE;
SECURITY_ATTRIBUTES sa;
PROCESS_INFORMATION pi;
! STARTUPINFOW si;
! const jchar* pcmd = NULL;
! const jchar* pdir = NULL;
! const jchar* penvBlock = NULL;
jlong *handles = NULL;
jlong ret = 0;
OSVERSIONINFO ver;
jboolean onNT = JNI_FALSE;
DWORD processFlag;
*** 159,184 ****
GetVersionEx(&ver);
if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT)
onNT = JNI_TRUE;
assert(cmd != NULL);
! pcmd = (LPTSTR) JNU_GetStringPlatformChars(env, cmd, NULL);
if (pcmd == NULL) goto Catch;
if (dir != 0) {
! pdir = (LPCTSTR) JNU_GetStringPlatformChars(env, dir, NULL);
if (pdir == NULL) goto Catch;
- pdir = (LPCTSTR) JVM_NativePath((char *)pdir);
}
-
if (envBlock != NULL) {
! penvBlock = onNT
! ? (LPVOID) ((*env)->GetStringChars(env, envBlock, NULL))
! : (LPVOID) JNU_GetStringPlatformChars(env, envBlock, NULL);
if (penvBlock == NULL) goto Catch;
}
-
assert(stdHandles != NULL);
handles = (*env)->GetLongArrayElements(env, stdHandles, NULL);
if (handles == NULL) goto Catch;
memset(&si, 0, sizeof(si));
--- 159,179 ----
GetVersionEx(&ver);
if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT)
onNT = JNI_TRUE;
assert(cmd != NULL);
! pcmd = (*env)->GetStringChars(env, cmd, NULL);
if (pcmd == NULL) goto Catch;
if (dir != 0) {
! pdir = (*env)->GetStringChars(env, dir, NULL);
if (pdir == NULL) goto Catch;
}
if (envBlock != NULL) {
! penvBlock = ((*env)->GetStringChars(env, envBlock, NULL));
if (penvBlock == NULL) goto Catch;
}
assert(stdHandles != NULL);
handles = (*env)->GetLongArrayElements(env, stdHandles, NULL);
if (handles == NULL) goto Catch;
memset(&si, 0, sizeof(si));
*** 237,265 ****
if (onNT)
processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
else
processFlag = selectProcessFlag(env, cmd);
! /* Java and Windows are both pure Unicode systems at heart.
! * Windows has both a legacy byte-based API and a 16-bit Unicode
! * "W" API. The Right Thing here is to call CreateProcessW, since
! * that will allow all process-related information like command
! * line arguments to be passed properly to the child. We don't do
! * that currently, since we would first have to have "W" versions
! * of JVM_NativePath and perhaps other functions. In the
! * meantime, we can call CreateProcess with the magic flag
! * CREATE_UNICODE_ENVIRONMENT, which passes only the environment
! * in "W" mode. We will fix this later. */
!
! ret = CreateProcess(0, /* executable name */
! pcmd, /* command line */
0, /* process security attribute */
0, /* thread security attribute */
TRUE, /* inherits system handles */
processFlag, /* selected based on exe type */
! penvBlock, /* environment block */
! pdir, /* change to the new current directory */
&si, /* (in) startup information */
&pi); /* (out) process information */
if (!ret) {
win32Error(env, "CreateProcess");
--- 232,249 ----
if (onNT)
processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
else
processFlag = selectProcessFlag(env, cmd);
! ret = CreateProcessW(0, /* executable name */
! (LPWSTR)pcmd, /* command line */
0, /* process security attribute */
0, /* thread security attribute */
TRUE, /* inherits system handles */
processFlag, /* selected based on exe type */
! (LPVOID)penvBlock,/* environment block */
! (LPCWSTR)pdir, /* change to the new current directory */
&si, /* (in) startup information */
&pi); /* (out) process information */
if (!ret) {
win32Error(env, "CreateProcess");
*** 274,295 ****
closeSafely(inRead);
closeSafely(outWrite);
closeSafely(errWrite);
if (pcmd != NULL)
! JNU_ReleaseStringPlatformChars(env, cmd, (char *) pcmd);
if (pdir != NULL)
! JNU_ReleaseStringPlatformChars(env, dir, (char *) pdir);
! if (penvBlock != NULL) {
! if (onNT)
! (*env)->ReleaseStringChars(env, envBlock, (jchar *) penvBlock);
! else
! JNU_ReleaseStringPlatformChars(env, dir, (char *) penvBlock);
! }
if (handles != NULL)
(*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0);
-
return ret;
Catch:
/* Clean up the parent's side of the pipes in case of failure only */
closeSafely(inWrite);
--- 258,274 ----
closeSafely(inRead);
closeSafely(outWrite);
closeSafely(errWrite);
if (pcmd != NULL)
! (*env)->ReleaseStringChars(env, cmd, pcmd);
if (pdir != NULL)
! (*env)->ReleaseStringChars(env, dir, pdir);
! if (penvBlock != NULL)
! (*env)->ReleaseStringChars(env, envBlock, penvBlock);
if (handles != NULL)
(*env)->ReleaseLongArrayElements(env, stdHandles, handles, 0);
return ret;
Catch:
/* Clean up the parent's side of the pipes in case of failure only */
closeSafely(inWrite);