diff --git a/native/envvar-cmdline.cpp b/native/envvar-cmdline.cpp index f8f4425..5b9c866 100644 --- a/native/envvar-cmdline.cpp +++ b/native/envvar-cmdline.cpp @@ -312,22 +312,14 @@ jstring getCmdLineAndEnvVars( return packedStr; } -JNIEXPORT jint JNICALL Java_org_jvnet_winp_Native_getProcessId(JNIEnv* pEnv, jclass clazz, jint handle) { +JNIEXPORT jint JNICALL Java_org_jvnet_winp_Native_getProcessId(JNIEnv* pEnv, jclass clazz, jlong handle) { + char errorBuffer[ERRMSG_SIZE]; HANDLE hProcess = (HANDLE)handle; - PROCESS_BASIC_INFORMATION ProcInfo; - SIZE_T sRead; - if(!NT_SUCCESS(ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &ProcInfo, sizeof(ProcInfo), &sRead))) { - reportError(pEnv,"Failed to ZWQueryInformationProcess"); + DWORD pid = GetProcessId(hProcess); + if (!pid) { + sprintf_s(errorBuffer, "Failed to get process id from handle=%ld.", handle); + reportError(pEnv, errorBuffer); return -1; } - - return (jint)ProcInfo.UniqueProcessId; -/* ULONG id=0; - - if(!ReadProcessMemory(hProcess, ProcInfo.UniqueProcessId, &id, sizeof(ULONG), &_)) { - reportError(pEnv,"Failed to read process ID"); - return NULL; - } - - return id;*/ + return pid; } diff --git a/native/java-interface.h b/native/java-interface.h index b85bfd1..4dd24d4 100644 --- a/native/java-interface.h +++ b/native/java-interface.h @@ -42,10 +42,10 @@ JNIEXPORT jint JNICALL Java_org_jvnet_winp_Native_setPriority /* * Class: org_jvnet_winp_Native * Method: getProcessId - * Signature: (I)I + * Signature: (J)I */ JNIEXPORT jint JNICALL Java_org_jvnet_winp_Native_getProcessId - (JNIEnv *, jclass, jint); + (JNIEnv *, jclass, jlong); /* * Class: org_jvnet_winp_Native diff --git a/native/stdafx.h b/native/stdafx.h index 07b04a9..91e22ad 100644 --- a/native/stdafx.h +++ b/native/stdafx.h @@ -3,7 +3,7 @@ // are changed infrequently #pragma once -#define _WIN32_WINNT 0x500 +#define _WIN32_WINNT 0x501 #include #include diff --git a/src/main/java/org/jvnet/winp/Native.java b/src/main/java/org/jvnet/winp/Native.java index 4d696cc..f937ae6 100755 --- a/src/main/java/org/jvnet/winp/Native.java +++ b/src/main/java/org/jvnet/winp/Native.java @@ -25,7 +25,7 @@ class Native { native static boolean sendCtrlC(int pid, String sendctrlcExePath); native static boolean isCriticalProcess(int pid); native static int setPriority(int pid, int value); - native static int getProcessId(int handle); + native static int getProcessId(long handle); native static boolean exitWindowsEx(int flags,int reasonCode); /** diff --git a/src/main/java/org/jvnet/winp/WinProcess.java b/src/main/java/org/jvnet/winp/WinProcess.java index 0f0c08f..84f3103 100755 --- a/src/main/java/org/jvnet/winp/WinProcess.java +++ b/src/main/java/org/jvnet/winp/WinProcess.java @@ -41,7 +41,7 @@ public WinProcess(Process proc) { try { Field f = proc.getClass().getDeclaredField("handle"); f.setAccessible(true); - int handle = ((Number)f.get(proc)).intValue(); + long handle = f.getLong(proc); pid = Native.getProcessId(handle); } catch (NoSuchFieldException e) { throw new NotWindowsException(e);