Lua Alien - 指针算术和解除引用

时间:2015-04-25 15:02:35

标签: pointers lua lua-alien

我的目标是致电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中唯一可以解决我尝试做的事情的信息是:

  1. 指针拆包
  2.   

    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函数。而且,更重要的是,这仍然无法解决我能够获取基址之外的元素的问题。

    1. 缓冲器
    2.   

      制作缓冲区后,您可以传递它来代替任何参数   字符串或指针类型。

           

      ...

           

      您还可以将缓冲区或其他用户数据传递给您的新方法   struct类型,在这种情况下,这将是。的后备存储   您正在创建的struct实例。这对解压缩很有用   C函数返回的外部结构。

      这似乎表明我可以使用alien.tochar作为alien.buffer MODULEINFO的参数。缓冲区被描述为字节数组,可以使用这种表示法对其进行索引:LPVOID lpBaseOfDllbuf[1]等。此外,缓冲区按字节进行,因此这将理想地解决所有问题。 (如果我理解正确的话)。

      不幸的是,我找不到任何这方面的例子(不是在docs,stackoverflow,Google等),所以我不知道如何做到这一点。我尝试了一些语法变体,但几乎每一个都会产生运行时错误(其他人根本没有按预期工作)。

      通过解引用和指针算法,我可以通过buf[2]逐字节(C char-by-char)进行任何洞察?

1 个答案:

答案 0 :(得分:1)

  

我需要逐字节,并且没有alien.tochar函数。

听起来像alien.tostring

  

alien.tostring接受userdata(通常从具有指针返回值的函数返回),将其强制转换为char *,并返回Lua字符串。你可以提供一个可选的大小参数(如果你没有Alien首先在缓冲区上调用strlen)。

Lua字符串可以包含任意字节值,包括0(即它们不像C字符串那样以空字符结尾),因此只要将size参数传递给alien.tostring,就可以获取数据为一个字节缓冲区,也就是Lua字符串,用字节做任何你喜欢的事。

听起来你不能告诉它从给定指针地址开始任意偏移。如果文档没有告诉您,最简单的方法是查看源代码。添加偏移参数可能很简单。