wysf1981
驱动牛犊
驱动牛犊
  • 注册日期2003-05-27
  • 最后登录2003-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1366回复:5

98下使用hooktdi遇到的一个奇怪问题

楼主#
更多 发布于:2003-06-09 19:45
我使用VtoolsD提供的hooktdi作模板,在senddatagram中修改特定的udp数据报。程序运行中遇见了一个奇怪的现象:
1、如果第一次进入senddatagram中的数据不是我感兴趣的数据,就pass through,从此后驱动运行正常;
2、如果第一次进入senddatagram中的数据是我感兴趣的数据,我修改数据并新建一个NDIS_BUFFER将其发送下去,这时程序就进入死循环:TEST EAX,EAX; JNZ..(CTL+D呼出SOFTICE看到的结果)
0028:C003497A   MOV   EBP,[EAX+0C]
0028:C003497D MOV EAX,[EAX]
0028:C003497F ADD ECX,EBP
0028:C0034981 TEST EAX,EAX
0028:C0034983 JNZ C003497A
死循环!而且每次的指令地址都是不变!而且从dprintf的信息中发现已经执行过了我的程序,并且程序已经从senddatagram中出来了!(我自己的全部代码都在senddatagram中)
察看堆栈信息如下:
:stack
FrameEBP RetEIP Symbol
C178D4F0 C1763628 NDIS(01)+54F7      
3、尤其奇怪的是,在2的情况中,如果我设置了断点,跟入驱动中单步运行,则一切也是正常的!
请问各位高人,这究竟是怎么回事情????
wysf1981
驱动牛犊
驱动牛犊
  • 注册日期2003-05-27
  • 最后登录2003-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-10 09:54
附上我修改的代码:
TDI_STATUS MySendDatagram(
PTDI_REQUEST Request,
PTDI_CONNECTION_INFORMATION ConnInfo,
UINT DataSize,
UINT *BytesSent,
PNDIS_BUFFER Buffer
)
{
TDI_STATUS status;  
UINT MyDataSize;
UINT *MyBytesSent=0;
PNDIS_BUFFER MyBuffer;
NDIS_HANDLE PoolHandle;
PVOID pVa;
if (是我感兴趣的数据)
{
ParseRequest(DataSize,Buffer,&PoolHandle,&MyDataSize,&MyBuffer);
status = RealSendDatagramEntry(Request, ConnInfo, MyDataSize, MyBytesSent, MyBuffer);
*BytesSent = *MyBytesSent;
}
else
{
status = RealSendDatagramEntry(Request, ConnInfo, DataSize, BytesSent, Buffer);
}

if (如果我分配了内存,在这里释放)
{
NdisQueryBuffer(MyBuffer,&pVa,&MyDataSize);
NdisFreeBufferPool(PoolHandle);
NdisFreeBuffer(MyBuffer);
NdisFreeMemory(pVa,MyDataSize,0);
}
dprintf(\"MySendDatagram after call\\n\");
return status;
}


VOID
ParseRequest(
IN  UINT DataSize,
IN  PNDIS_BUFFER Buffer,
OUT NDIS_HANDLE *pPoolHandle,
OUT UINT *MyDataSize,
OUT PNDIS_BUFFER *MyBuffer
)
{
NDIS_STATUS status;

PVOID pVa;
PVOID    pNewMemory;
PNDIS_BUFFER newBuffer;
UINT Length;

if (如果是我需要的数据,分配新的内存)
{
status = NdisAllocateMemory(&pNewMemory,Length+FIX_LEN,0,-1);//分配内存
if (status == NDIS_STATUS_FAILURE)
{
return;
}
使用MyNdisCopyMemory为分配的内存设置数据
NdisAllocateBufferPool(&status,pPoolHandle,1);
if (status == NDIS_STATUS_FAILURE)
{
goto poolfail;
}
NdisAllocateBuffer(&status,&newBuffer,*pPoolHandle,pNewMemory,Length+DNS_FIX_LEN);
if (status == NDIS_STATUS_FAILURE)
{
goto bufferfail;
}
*MyBuffer = newBuffer;
*MyDataSize = DataSize + DNS_FIX_LEN;
}
return;

bufferfail:
NdisFreeBufferPool(*pPoolHandle);
poolfail:
NdisFreeMemory(pNewMemory,Length+FIX_LEN,0);

return ;
}
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
板凳#
发布于:2003-06-10 10:39
你的代码死循环我不是很能想明白,不过你的代码居然不烂屏我更想不明白。
你每次发送就一定能保证status == NDIS_STATUS_SUCCESS吗?不能的话你就释放内存了?
wysf1981
驱动牛犊
驱动牛犊
  • 注册日期2003-05-27
  • 最后登录2003-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-10 16:06
嘿嘿,谢谢指点,确实是我没有保证发送成功,多数情况下是TDI_PENDING。正在改正!
wysf1981
驱动牛犊
驱动牛犊
  • 注册日期2003-05-27
  • 最后登录2003-08-11
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-10 19:11
问题解决,谢谢fracker大虾,愚蠢的错误!
不过居然不蓝屏,而且在大多数情况下能正常运行,还是比较奇怪!
fracker
驱动太牛
驱动太牛
  • 注册日期2001-06-28
  • 最后登录2021-03-30
  • 粉丝0
  • 关注0
  • 积分219分
  • 威望81点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分1分
  • 社区居民
5楼#
发布于:2003-06-10 21:03
问题解决,谢谢fracker大虾,愚蠢的错误!
不过居然不蓝屏,而且在大多数情况下能正常运行,还是比较奇怪!

别这么说,大人可以,大虾难听:)
游客

返回顶部