C++ Easyhook:非托管挂钩,如何调用原始函数/更改返回状态?
所以我在C++ Easyhook:非托管挂钩,如何调用原始函数/更改返回状态?,c++,unmanaged,easyhook,C++,Unmanaged,Easyhook,所以我在winspool.drv上有一个钩子函数!WrrexePux,它成功地与非托管C++连接,并被远程注入到SoPoSv.exe.< /P> 目前,钩子似乎要么替换了原来的函数,要么以一种无法检测的方式损坏了堆栈:钩子后,WritePrinter调用导致钩子外没有打印机活动 我发现至少有一种方法可以调用原始函数,即所谓的LhGetOldProc。然而,使用它会导致崩溃,不确定这是与easyhook相关的错误还是糟糕的铸造 那么,如何在Easyhook非托管版本中正确调用原始函数呢? 使用Lh
winspool.drv上有一个钩子函数!WrrexePux</代码>,它成功地与非托管C++连接,并被远程注入到SoPoSv.exe.< /P>
目前,钩子似乎要么替换了原来的函数,要么以一种无法检测的方式损坏了堆栈:钩子后,WritePrinter调用导致钩子外没有打印机活动
我发现至少有一种方法可以调用原始函数,即所谓的LhGetOldProc
。然而,使用它会导致崩溃,不确定这是与easyhook相关的错误还是糟糕的铸造
那么,如何在Easyhook非托管版本中正确调用原始函数呢?
使用LhGetOldProc
钩住回调:
UCHAR *uc = NULL;
LhGetOldProc(hhW, &uc);
typedef BOOL (*wp)(_In_ HANDLE, _In_ LPVOID, _In_ DWORD cbBuf, _Out_ LPDWORD);
wp my_wp = reinterpret_cast<wp>(reinterpret_cast<long>(uc)); // http://stackoverflow.com/questions/1096341/function-pointers-casting-in-c
BOOL res ;
if (my_wp == 0x0) {
return -1;
} else {
res = my_wp(hPrinter, pBuf, cbBuf, pcWritten); // crash
}
TIL:2013年,CodePlex(EasyHook讨论列表所在地)在注册Microsoft帐户时不接受电子邮件的三级域。不打算使用Firebug绕过表单。堆栈已损坏,因为函数指针的调用约定错误
默认的调用约定是uu cdecl,它期望调用方清理堆栈
typedef BOOL (* wp)(_In_ HANDLE ....);
等于:
typedef BOOL (__cdecl* wp)(_In_ HANDLE ...);
但是winapi函数使用u stdcall调用约定,该约定期望被调用方清理堆栈。
您必须键入定义一个stdcall函数:
typedef BOOL (__stdcall* wp)(_In_ HANDLE ....);
必须将讨论迁移到codeplex,这是什么版本的Windows?你能发布更多的代码吗?根据我所看到的一切,你在这里提出的建议不应该起作用。0xF处未处理的异常。。。在spoolsv.exe中:访问冲突执行位置0xF。。(可能是DEP开火了?)向虚空施放*似乎解决了问题,谢谢,@user1283078
typedef BOOL (__stdcall* wp)(_In_ HANDLE ....);