C++ 转发不带签名的方法

C++ 转发不带签名的方法,c++,function-pointers,C++,Function Pointers,我正在尝试为libEGL.dll编写一个转发库,以便捕获通过它进行调试的调用 问题是该库缺少两个方法nVEGLGetStdLocaddress和NvEglRegClientApi 这是一个为Arm7 WinCE构建的C库。我为libEGL准备的头文件不包含这两个方法,所以我不知道转发调用的签名是什么 有没有办法在不知道签名的情况下转接电话? 我可以反汇编dll并查找从堆栈中弹出的参数吗 DumpBin在RVA 0x217C和Ox1E5C处显示这些内容,/ALL/DISASM显示从0x11000开

我正在尝试为libEGL.dll编写一个转发库,以便捕获通过它进行调试的调用

问题是该库缺少两个方法nVEGLGetStdLocaddress和NvEglRegClientApi

这是一个为Arm7 WinCE构建的C库。我为libEGL准备的头文件不包含这两个方法,所以我不知道转发调用的签名是什么

有没有办法在不知道签名的情况下转接电话? 我可以反汇编dll并查找从堆栈中弹出的参数吗

DumpBin在RVA 0x217C和Ox1E5C处显示这些内容,/ALL/DISASM显示从0x11000开始的.text部分。如何在这两个偏移之间进行转换

我猜这是行不通的,它会把参数留在堆栈上,然后用局部变量稍微弄乱它们吗?如果有返回值,返回值会发生什么变化

typedef void (*NvEglGetStdProcAddressFunc) (void);
void NvEglGetStdProcAddress()
{
    NvEglGetStdProcAddressFunc ptr = (NvEglGetStdProcAddressFunc)GetProcAddress(hInst, _T("NvEglGetStdProcAddress"));
    ptr();
}
你可以简单地

因此,我的debug libEGL.dll.def文件的顶部现在有两行额外的代码

; libEGL.def
EXPORTS
  NvEglGetStdProcAddress = libEGLOld.NvEglGetStdProcAddress 
  NvEglRegClientApi = libEGLOld.NvEglRegClientApi
  eglBindAPI
  eglBindTexImage
  ...

我的一位同事对此进行了测试并验证了它的有效性,尽管它还要求指定序号

我不知道如何在ARM上调用约定,但从理论上讲,如果你不在代理函数中声明任何局部变量,并使其成为一个没有任何序言或尾声的裸函数,可以直接跳转而不是调用真正的函数地址,然后使用它来完成。这使得添加调试代码比没有局部变量的部分要困难一些,但这并不是不能做到的。@yzt实际上对于这两个,我不需要任何调试,只是为了直接传递调用,所以您可能已经准备好了。请注意,我不知道这是否真的有效!不管怎样,如果您使用的是MSVC,您可以用标记您的函数,使其不会在堆栈上或堆栈下推送或弹出内容。@yzt那么我如何跳转而不是调用呢?我不明白。如果库没有这些函数,那么有人如何调用它们?如果没有人可以打电话给他们,那么就没有需要转发的现有电话。那有什么问题?什么编译器、链接器或运行时错误促使您提出此问题?