/*
* Copyright 2016 Nokia Solutions and Networks
* Licensed under the Apache License, Version 2.0,
* see license.txt file for details.
*/
package org.rf.ide.core.jvmutils.process;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import org.rf.ide.core.executor.RedSystemProperties;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT.HANDLE;
public class WindowsProcessTreeHandler extends AProcessTreeHandler {
WindowsProcessTreeHandler(final OSProcessHelper helper) {
super(helper);
}
@Override
public boolean isSupported(final Process process) {
final String procClassName = process.getClass().getName();
return (procClassName.equals("java.lang.Win32Process") || procClassName.equals("java.lang.ProcessImpl"));
}
@Override
public long getProcessPid(final Process process) {
long pid = ProcessInformation.PROCESS_NOT_FOUND;
try {
final Field f = process.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handle = f.getLong(process);
Kernel32 kernel = Kernel32.INSTANCE;
HANDLE winHandle = new HANDLE();
winHandle.setPointer(Pointer.createConstant(handle));
pid = kernel.GetProcessId(winHandle);
} catch (Throwable e) {
}
return pid;
}
@Override
public List<String> getChildPidsCommand(final long processPid) {
return Arrays.asList("cmd.exe", "/c", "wmic", "process", "where", "ParentProcessID=" + processPid, "get",
"ProcessId", "/format:csv");
}
@Override
public List<String> getKillProcessCommand(final ProcessInformation procInformation) {
return Arrays.asList("cmd.exe", "/c", "wmic", "process", "where", "ProcessID=" + procInformation.pid(),
"delete");
}
@Override
public List<String> getKillProcessTreeCommand(final ProcessInformation procInformation) {
return Arrays.asList("cmd.exe", "/c", "wmic", "process", "where",
"\"ProcessID=" + procInformation.pid() + " or ParentProcessID=" + procInformation.pid() + "\"",
"delete");
}
@Override
public boolean isSupportedOS() {
return RedSystemProperties.isWindowsPlatform();
}
}