代码之家  ›  专栏  ›  技术社区  ›  Feem

C中COM对象的实际地址#

  •  0
  • Feem  · 技术社区  · 2 年前

    我有一个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:我知道这是一种不标准的做事方式,但请理解我绝对 必须 能够以这种方式为我正在进行的项目获得这些地址。这是一个关键的阻碍因素。

    1 回复  |  直到 2 年前