MS Detours库,绕行非win api函数
Posted
技术标签:
【中文标题】MS Detours库,绕行非win api函数【英文标题】:MS Detours Library, detouring non win api function 【发布时间】:2011-01-07 22:43:40 【问题描述】:我想使用windows detours库来绕过一个非win api函数。该函数是 Qt 库 (QtGui4.dll) 的一部分。我想知道如何设置函数签名:
void QPainter::drawText ( const QPointF & position, const QString & text )
我对此进行了尝试,它收到了我通常的错误,对需求的一些解释也会很有趣:
void (QPainter * real_drawText)(const QPointF & position, const QString & text) = drawText
这是它们在 Windows API 下 TextOut 的样子:
BOOL (WINAPI * Real_TextOut)(HDC a0, int a1, int a2, LPCWSTR a3, int a4) = TextOutW;
BOOL WINAPI Mine_TextOut(HDC hdc,int X,int Y,LPCWSTR text,int textLen)
BOOL rv = Real_TextOut(hdc, X, Y, text, textLen);
HWND hWindow = WindowFromDC(hdc);
SendTextMessage(hWindow, text);
return rv;
所以,我尝试了 Gene 的建议:
typedef void (QPainter::* Real_qp_drawText)(const QPointF & position, const QString & text);
void Mine_drawText(const QPointF & position, const QString & text)
Real_qp_drawText(position,text);
但是得到了错误,'a function-style conversion to an built-in type can only take one parameter.
所以不管怎样,他们都说有点当众羞辱对灵魂有好处,我的灵魂一定是度过了最美好的时光......
谢谢。
【问题讨论】:
【参考方案1】:你的函数类型是 FnType:
typedef void (QPainter::*FnType)(const QPointF &, const QString &);
但看起来他们期望的是 WINIAPI
= __stdcall
C 函数。您可能会想是否可以将您的函数包装成 C 函数。
【讨论】:
对不起,吉恩,这对我来说是全新的,所以我想问一下,我该怎么做?【参考方案2】:请记住,非静态成员函数确实有一个隐式的this
指针作为参数,您必须在绕行时声明它。
【讨论】:
以上是关于MS Detours库,绕行非win api函数的主要内容,如果未能解决你的问题,请参考以下文章
Detours - 挂钩类成员函数 - 设置目标函数偏移的语法?
C++——Detours(Win32 API劫持)——劫持类方法
C++——Detours(Win32 API劫持)——劫持类方法