阅读:1057回复:4
98下NDIS hook, 为什么hook可以成功,系统能Call到我的函数,可是函数返回后就兰屏了呢?
我写了个小程序,hook 了ndis.vxd的NdisRegisterProtocol功能,在我的函数里面,我call 回原来的函数,可以看到这些步骤都是成功的,但是在我的函数返回后,系统就兰屏了,我看了PCAUSA的代码,他的调用手法跟我的不一样,但我没有想通他那样做的理由,看了VToolsD里面的hooksvc的例子,好像跟我的也没什么区别。估计问题出在堆栈调整上面,可是不管我的函数定义成__stdcall还是__cdecl,都没什么变化。那位熟悉这个的指点一下。
我的代码如下。 VOID __stdcall MyNdisRegisterProtocol( OUT PNDIS_STATUS Status, OUT PNDIS_HANDLE NdisProtocolHandle, IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics, IN UINT CharacteristicsLength ) { dprintf( \"MyNdisRegisterProtocol called !\\n\" ); g_OrgNdisRegisterProtocol( Status, NdisProtocolHandle, ProtocolCharacteristics, CharacteristicsLength ); dprintf( \"After called the old routine , and we now ready to exit ....\\n\" ); } g_OrgNdisRegisterProtocol = Hook_Device_Service( GetVxDServiceOrdinal(NdisRegisterProtocol), MyNdisRegisterProtocol, &ProThunk ); if( g_OrgNdisRegisterProtocol ) { dprintf( \"Hook success !\\n\" ); } dprintf( \"After hook !\\n\" ); |
|
沙发#
发布于:2002-07-30 11:20
分太少,要去换点分来。
|
|
板凳#
发布于:2002-07-30 12:57
g_OrgNdisRegisterProtocol函数声明为__stdcall还是__cdecl?你可以跟踪一下在调用g_OrgNdisRegisterProtocol之前与之后的堆栈指针ESP是不是相同,如果不同的话,那就有问题了。
[编辑 - 7/30/02 by xdjm] |
|
地板#
发布于:2002-07-30 13:18
说的有道理阿,
|
|
地下室#
发布于:2002-07-30 14:22
果然是这个问题,搞定了,给分了。
|
|