kernal32.dll Windows API 関数から VirtualQueryEx を使用しようとしています。
この関数を呼び出す前に取得したすべてのポインター/アドレスは正しいです。
VirtualQueryEx の呼び出しは 0 を返します。これは、成功しなかったことを意味します。
また、GetLastError() は、アクセスが拒否されたことを意味するエラー コード 5 を返します):
私は何を間違っていますか?
- Windows 8、管理者権限。
JNA マッピング:
public class Test
{
static Kernel32 kernel32 = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
static User32 user32 = (User32) Native.loadLibrary("user32" , User32.class);
public static void main(String[] args)
{
int pid = getProcessId("someWindowName"); // get our process ID
Pointer readprocess = kernel32.OpenProcess(0x0010, false,pid); // open the process ID with read priviledges.
MEMORY_BASIC_INFORMATION l = new MEMORY_BASIC_INFORMATION();
SYSTEM_INFO info = new SYSTEM_INFO();
kernel32.GetSystemInfo(info);
System.out.println(kernel32.VirtualQueryEx(readprocess, info.lpMinimumApplicationAddress, l, l.size()));
System.out.println(kernel32.GetLastError());
}
public static int getProcessId(String window)
{
IntByReference pid = new IntByReference(0);
user32.GetWindowThreadProcessId(user32.FindWindowA(null,window), pid);
return pid.getValue();
}
public static Pointer openProcess(int permissions, int pid)
{
Pointer process = kernel32.OpenProcess(permissions,true, pid);
return process;
}
public static Memory readMemory(Pointer process, int address, int bytesToRead)
{
IntByReference read = new IntByReference(0);
Memory output = new Memory(bytesToRead);
kernel32.ReadProcessMemory(process, address, output, bytesToRead, read);
return output;
}
}
kernal32の内部
int VirtualQueryEx(Pointer readprocess, Pointer lpMinimumApplicationAddress,MEMORY_BASIC_INFORMATION lpBuffer, int dwLength);
memory_basic 構造体:
public class MEMORY_BASIC_INFORMATION extends Structure {
public Pointer baseAddress;
public Pointer allocationBase;
public NativeLong allocationProtect;
public SIZE_T regionSize;
public NativeLong state;
public NativeLong protect;
public NativeLong type;
}
ありがとう !