阅读:1029回复:1
blue screen,why?zhaock,help me!
我的SendHandler函数调用CheckTcpipSendPacket函数:
NDIS_STATUS NDIS_API TcpipSendHandler( IN PTCPIP_FUNCTION_MAP FunctionMap, IN NDIS_HANDLE MacBindingHandle, IN PNDIS_PACKET Packet ) { NDIS_STATUS status; dprintf(("XF_TcpipSendHandler\n")); if(g_isAclFrame) CheckTcpipSendPacket(Packet); status = FunctionMap -> old_SendHandler(MacBindingHandle, Packet); return (status); } CheckTcpipSendPacket函数: NDIS_STATUS CheckTcpipSendPacket(IN OUT PNDIS_PACKET packet) { PNDIS_BUFFER FirstBuffer = NULL; PNDIS_BUFFER Buffer = NULL; PVOID VirtualAddress = 0; int Length = 0; PETHERNET_FRAME pEthernetFrame = 0; WORD ethernetFrameType = 0; PIP_HEADER pIpHeader = 0; UINT ipHeaderLen = 0; PVOID pIpData = NULL; dprintf(("CheckTcpipSend\n")); NdisQueryPacket(packet , NULL , NULL , &FirstBuffer , NULL ); if(FirstBuffer != NULL) { NdisQueryBufferSafe(FirstBuffer, &VirtualAddress, &Length, HighPagePriority); if(VirtualAddress == NULL || Length < ETHERNET_FRAME_LENGTH) return XF_SUCCESS; pEthernetFrame = (PETHERNET_FRAME)VirtualAddress; ethernetFrameType = ntohs(pEthernetFrame -> FrameType); PrintEthernetFrame(pEthernetFrame, Length); if(ETHERNET_FRAME_TYPE_TCPIP != ethernetFrameType) return XF_SUCCESS; if((Length - ETHERNET_FRAME_LENGTH) >= IP_HEADER_LENGTH) { VirtualAddress = (BYTE*)VirtualAddress + ETHERNET_FRAME_LENGTH; pIpHeader = (PIP_HEADER)(VirtualAddress); Length = Length - ETHERNET_FRAME_LENGTH; } else { NdisGetNextBuffer(FirstBuffer, &Buffer); if(Buffer == NULL) return XF_SUCCESS; NdisQueryBufferSafe(Buffer, &VirtualAddress, &Length, HighPagePriority); if(VirtualAddress == NULL || Length < IP_HEADER_LENGTH) return XF_SUCCESS; pIpHeader = (PIP_HEADER)VirtualAddress; FirstBuffer = Buffer; } PrintIp(pIpHeader, Length); ipHeaderLen = GET_IP_HEADER_LENGTH(pIpHeader->VersionAndHeaderLength); if((Length - ipHeaderLen) > 0) { pIpData = (PVOID)((BYTE*)VirtualAddress + ipHeaderLen); changeIpData(pIpData, Length - ipHeaderLen); } while(TRUE) { NdisGetNextBuffer(FirstBuffer,&Buffer); if(Buffer == NULL) return XF_SUCCESS; NdisQueryBufferSafe(Buffer, &VirtualAddress, &Length,HighPagePriority); if(Length < 1) continue; changeIpData(VirtualAddress,Length); FirstBuffer = Buffer; } } else dprintf(("CheckTcpipSend: invalid ether packet \n\n")); return XF_SUCCESS; } changeIpData函数很简单: VOID changeIpData( IN OUT PVOID pData, IN UINT len ) { UINT i = 0; BYTE* tempL = (BYTE*)pData; for(; i < len; ++i) *tempL++ ^= KEY2; } 为何总是进入用户桌面后重新启动,没有任何提示?why?我没有找到流程哪里错误了?高手们帮帮忙了! |
|
|
沙发#
发布于:2005-06-27 16:40
看了看,流程没有什么问题,还是用softice看吧,看一下崩溃的stack,如果是在死在你的函数函数里,
就比较简单了。 |
|