我有一个COM对象,我试图获取它的实际底层地址,这样我就可以获取vtable的地址。我需要这是一个有效的数字地址,因为我需要能够添加到其中。例如,如果我想调用vtable中的第三个函数,我需要能够调用以下内容:
Marshal.GetDelegateForFunctionPointer(vtableaddr + (3 * 8), ...)
;//第三个条目,64位模式下的8字节指针。
调用vtable中的第三个函数。
也就是说,我需要能够对指针地址进行加法。
我指定的原因
实际的
在问题标题中,获取底层对象地址的所有标准方法似乎都没有返回真实的地址。
var item = /*... my COM object */;
var pUnk = Marshal.GetIUnknownForObject(item);
var pVtbl = Marshal.ReadIntPtr(pUnk);
运行此代码时,两者
pUnk
和
pVtbl
将具有非常大的数值。类似于0x1F3110D7948,即2143474776392。我的系统肯定没有2万亿字节的RAM。所以我假设指针在高字节中包含额外的信息?
我也尝试过这样的代码:
var gch = GCHandle.Alloc(pUnk, GCHandleType.Pinned);
var intptr = gch.AddrOfPinnedObject();
var pVtbl = Marshal.ReadIntPtr(intptr);
并得到类似的大数字。打电话
GCHandle.ToIntPtr(gch)
也无济于事。
所以我需要知道如何获得
真实的
内存中实际存储底层COM对象的地址。
PS:我知道这是一种不标准的做事方式,但请理解我绝对
必须
能够以这种方式为我正在进行的项目获得这些地址。这是一个关键的阻碍因素。