cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
阅读:1028回复:1

blue screen,why?zhaock,help me!

楼主#
更多 发布于:2005-06-27 16:10
  我的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?我没有找到流程哪里错误了?高手们帮帮忙了!
走走看看开源好 Solaris vs Linux
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-27 16:40
看了看,流程没有什么问题,还是用softice看吧,看一下崩溃的stack,如果是在死在你的函数函数里,
就比较简单了。
游客

返回顶部