package org.fusesource.cloudmix.agent.win32;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
/**
* Interface to access some low level Windows kernel functions.
*
* @author chirino
*/
public interface Kernel32 extends StdCallLibrary {
int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000;
int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x100;
// Constants from http://msdn.microsoft.com/en-us/library/ms684880%28VS.85%29.aspx
int DELETE = 0x00010000;
int READ_CONTROL = 0x00020000;
int SYNCHRONIZE = 0x00100000;
int WRITE_DAC = 0x00040000;
int WRITE_OWNER = 0x00080000;
int PROCESS_TERMINATE = 0x0001;
int PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;
public final class Factory {
static final Kernel32 INSTANCE = create();
private Factory() {
//utility class - never constructed
}
public static Kernel32 create() {
if (!Platform.isWindows()) {
return null;
}
return (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
}
public static Kernel32 get() {
return INSTANCE;
}
public static String getLastErrorAsString() {
int errorCode = INSTANCE.GetLastError();
Memory buffer = new Memory(160);
INSTANCE.FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, Pointer.NULL, errorCode, 0, buffer,
(int)buffer.getSize());
return buffer.getString(0, true);
}
}
//CHECKSTYLE:OFF - the rest of this has Windows specific function names
/**
* http://msdn.microsoft.com/en-us/library/ms683180%28VS.85%29.aspx
*
* @return
*/
int GetCurrentProcessId();
/**
* http://msdn.microsoft.com/en-us/library/ms683179%28VS.85%29.aspx
*
* @return
*/
Pointer GetCurrentProcess();
/**
* See: http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx
*
* @param desiredAccess
* @param inheritHandles
* @param processId
* @return
*/
Pointer OpenProcess(int desiredAccess, int inheritHandle, int processId);
/**
* see: http://msdn.microsoft.com/en-us/library/ms724211%28VS.85%29.aspx
*
* @param handle
* @return
*/
int CloseHandle(Pointer handle);
/**
* see: http://msdn.microsoft.com/en-us/library/ms686714%28VS.85%29.aspx
*
* @param process
* @param exitCode
* @return
*/
int TerminateProcess(Pointer process, int exitCode);
/**
* see: http://msdn.microsoft.com/en-us/library/ms683213%28VS.85%29.aspx
*
* @param process
* @param processAffinityMask
* @param systemAffinityMask
* @return
*/
int GetProcessAffinityMask(Pointer process, IntByReference processAffinityMask,
IntByReference systemAffinityMask);
/**
* see: http://msdn.microsoft.com/en-us/library/ms683182%28VS.85%29.aspx
*
* @return
*/
Pointer GetCurrentThread();
/**
* http://msdn.microsoft.com/en-us/library/ms686253%28VS.85%29.aspx
*
* @param thread
* @param idealProcessor
* @return
*/
int SetThreadIdealProcessor(Pointer thread, int idealProcessor);
/**
* see: http://msdn.microsoft.com/en-us/library/ms679360%28VS.85%29.aspx
*
* @return
*/
int GetLastError();
/**
* @param flags
* @param source
* @param messageId
* @param languageId
* @param buffer
* @param size
* @param arguments
* @return
*/
int FormatMessageW(int flags, Pointer source, int messageId, int languageId, Memory buffer, int size,
Object... arguments);
static final int WAIT_OBJECT_0 = 0x00000000;
/**
* see: http://msdn.microsoft.com/en-us/library/ms687032%28VS.85%29.aspx
*
* @param handle
* @param milliseconds
* @return
*/
int WaitForSingleObject(Pointer handle, int milliseconds);
}