我的目标是致电Windows' GetModuleInformation函数可以返回MODULEINFO结构。这一切都很好。问题来自于我想要对LPVOID lpBaseOfDll
的{{1}}进行指针算术和解除引用。
这是我在Lua中调用函数的代码:
MODULEINFO
此时,require "luarocks.require"
require "alien"
sizeofMODULEINFO = 12 --Gotten from sizeof(MODULEINFO) from Visual Studio
MODULEINFO = alien.defstruct{
{"lpBaseOfDll", "pointer"}; --Does this need to be a buffer? If so, how?
{"SizeOfImage", "ulong"};
{"EntryPoint", "pointer"};
}
local GetModuleInformation = alien.Kernel32.K32GetModuleInformation
GetModuleInformation:types{ret = "int", abi = "stdcall", "long", "pointer", "pointer", "ulong"}
local GetModuleHandle = alien.Kernel32.GetModuleHandleA
GetModuleHandle:types{ret = "pointer", abi = "stdcall", "pointer"}
local GetCurrentProcess = alien.Kernel32.GetCurrentProcess
GetCurrentProcess:types{ret = "long", abi = "stdcall"}
local mod = MODULEINFO:new() --Create struct (needs buffer?)
local currentProcess = GetCurrentProcess()
local moduleHandle = GetModuleHandle("myModule.dll")
local success = GetModuleInformation(currentProcess, moduleHandle, mod(), sizeofMODULEINFO)
if success == 0 then --If there is an error, exit
return 0
end
local dataPtr = mod.lpBaseOfDll
--Now how do I do pointer arithmetic and/or dereference "dataPtr"?
似乎正在给我正确的值,因此我知道正在调用函数并且正在填充结构。但是,我似乎无法在mod.SizeOfImage
上进行指针运算,因为它是mod.lpBaseOfDll
。
Alien Documentation中唯一可以解决我尝试做的事情的信息是:
Alien还提供三种便利功能 取消引用指针并将值转换为Lua类型:
alien.tostring接受一个userdata(通常从具有指针返回值的函数返回),将其强制转换为char *,并返回一个Lua 串。您可以提供可选的大小参数(如果您不是Alien 首先在缓冲区上调用strlen。)
alien.toint获取userdata,将其强制转换为int *,取消引用并将其作为数字返回。如果你传给它一个数字,它就假设了 userdata是一个包含这个元素数的数组。
alien.toshort,alien.tolong,alien.tofloat和alien.todouble就像alien.toint,但与各自的类型组合一起使用。 也可以使用未签名的版本。
我的问题是,我需要逐个字节地进行,并且没有UserData
函数。而且,更重要的是,这仍然无法解决我能够获取基址之外的元素的问题。
制作缓冲区后,您可以传递它来代替任何参数 字符串或指针类型。
...
您还可以将缓冲区或其他用户数据传递给您的新方法 struct类型,在这种情况下,这将是。的后备存储 您正在创建的struct实例。这对解压缩很有用 C函数返回的外部结构。
这似乎表明我可以使用alien.tochar
作为alien.buffer
MODULEINFO
的参数。缓冲区被描述为字节数组,可以使用这种表示法对其进行索引:LPVOID lpBaseOfDll
,buf[1]
等。此外,缓冲区按字节进行,因此这将理想地解决所有问题。 (如果我理解正确的话)。
不幸的是,我找不到任何这方面的例子(不是在docs,stackoverflow,Google等),所以我不知道如何做到这一点。我尝试了一些语法变体,但几乎每一个都会产生运行时错误(其他人根本没有按预期工作)。
通过解引用和指针算法,我可以通过buf[2]
逐字节(C char-by-char)进行任何洞察?
答案 0 :(得分:1)
我需要逐字节,并且没有alien.tochar函数。
听起来像alien.tostring
:
alien.tostring接受userdata(通常从具有指针返回值的函数返回),将其强制转换为char *,并返回Lua字符串。你可以提供一个可选的大小参数(如果你没有Alien首先在缓冲区上调用strlen)。
Lua字符串可以包含任意字节值,包括0(即它们不像C字符串那样以空字符结尾),因此只要将size参数传递给alien.tostring
,就可以获取数据为一个字节缓冲区,也就是Lua字符串,用字节做任何你喜欢的事。
听起来你不能告诉它从给定指针地址开始任意偏移。如果文档没有告诉您,最简单的方法是查看源代码。添加偏移参数可能很简单。