Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Easyhook:非托管挂钩,如何调用原始函数/更改返回状态?_C++_Unmanaged_Easyhook - Fatal编程技术网

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 ....);