我有一个COM对象,我正在try 获取其实际底层地址,这样我就可以获得vtable的地址.我需要这是一个有效的数字地址,因为我需要能够添加到它.例如,如果我想调用vtable中的第三个函数,我需要能够调用如下内容:
Marshal.GetDelegateForFunctionPointer(vtableaddr + (3 * 8), ...)
;//第三项,64位模式下的8字节指针.
调用vtable中的第三个函数.
也就是说,我需要能够对指针地址进行加法运算.
我在问题标题中指定actual的原因是,所有获取底层对象地址的标准方法似乎都没有返回一个真正的地址.
var item = /*... my COM object */;
var pUnk = Marshal.GetIUnknownForObject(item);
var pVtbl = Marshal.ReadIntPtr(pUnk);
当运行这段代码时,pUnk
和pVtbl
都会有非常大的数值.类似于0x1F3110D7948,即2,143,474,776,392.我的系统绝对没有两万亿字节的RAM.所以我假设指针在高位字节中包含附加信息?
我还try 了如下代码:
var gch = GCHandle.Alloc(pUnk, GCHandleType.Pinned);
var intptr = gch.AddrOfPinnedObject();
var pVtbl = Marshal.ReadIntPtr(intptr);
也会得到同样大的数字.拨打GCHandle.ToIntPtr(gch)
也无济于事.
因此,我需要知道如何在内存中获取底层COM对象实际存储位置的real地址.
PS:我知道这是一种非标准的方式,但请理解,我绝对must能够通过这种方式为我正在工作的项目获得这些地址.这是一场关键的精彩表演.