阅读:1418回复:5
98下使用hooktdi遇到的一个奇怪问题
我使用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的情况中,如果我设置了断点,跟入驱动中单步运行,则一切也是正常的! 请问各位高人,这究竟是怎么回事情???? |
|
沙发#
发布于: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 ; } |
|
板凳#
发布于:2003-06-10 10:39
你的代码死循环我不是很能想明白,不过你的代码居然不烂屏我更想不明白。
你每次发送就一定能保证status == NDIS_STATUS_SUCCESS吗?不能的话你就释放内存了? |
|
地板#
发布于:2003-06-10 16:06
嘿嘿,谢谢指点,确实是我没有保证发送成功,多数情况下是TDI_PENDING。正在改正!
|
|
地下室#
发布于:2003-06-10 19:11
问题解决,谢谢fracker大虾,愚蠢的错误!
不过居然不蓝屏,而且在大多数情况下能正常运行,还是比较奇怪! |
|
5楼#
发布于:2003-06-10 21:03
问题解决,谢谢fracker大虾,愚蠢的错误! 别这么说,大人可以,大虾难听:) |
|