moonrun
驱动牛犊
驱动牛犊
  • 注册日期2006-06-27
  • 最后登录2011-06-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1783回复:1

求助:NdisSend在adsl下出现死机现象,请高人指点

楼主#
更多 发布于:2007-01-10 19:05
  这是个SendHandler的处理函数,在原来的系统没问题,在新的笔记本下出现的问题,而且只是在adsl拨号情况下NdisSend函数出现死机现象,,不知是跟硬件有关还是系统有关,新笔记本是compag presario b1900双内核系统,有哪位高人知道或者碰见这种问题请指点一下,代码其实很简单,如下:
NDIS_STATUS
MPTest(
    IN    NDIS_HANDLE                MiniportAdapterContext,
    IN    PNDIS_PACKET            Packet,
    IN    UINT                    Flags
    )
{
    PADAPT            pAdapt = (PADAPT)MiniportAdapterContext;
    NDIS_STATUS        Status;
    PNDIS_PACKET    MyPacket;

        PNDIS_BUFFER buffer, new_buffer = NULL;
        PNDIS_PACKET new_packet = NULL;
        struct protocol_reserved *pr;
        PUCHAR data,dataptr ;
        ULONG size,offsize,tmpsize;
        PNDIS_BUFFER Mdl_Buf,Mdl_Next;
        PUCHAR pointer;
        UINT    buf_len;
        KIRQL irql;
        
        KeAcquireSpinLock(&guard, &irql);        
        NdisQueryPacket(Packet, NULL, NULL, &Mdl_Next, NULL);
        size=0;
        while(Mdl_Next)
        {
            Mdl_Buf=Mdl_Next;
            NdisGetNextBuffer(Mdl_Next,&Mdl_Next);
            NdisQueryBuffer(Mdl_Buf,&pointer,&buf_len);
            size+=buf_len;
        }
        MyDbgPrint(("size=%d!\n",size));
        data= ExAllocatePool(NonPagedPool, (size));
        if (data == NULL) {
            KdPrint(("[ndis_hk] send_out_packet: malloc_np!\n"));
            return STATUS_INSUFFICIENT_RESOURCES;
        }
        NdisQueryPacket(Packet, NULL, NULL, &Mdl_Next, NULL);
        dataptr=data;
        while(Mdl_Next)
        {
            Mdl_Buf=Mdl_Next;
            NdisGetNextBuffer(Mdl_Next,&Mdl_Next);
            NdisQueryBuffer(Mdl_Buf,&pointer,&buf_len);
            RtlCopyMemory(dataptr,pointer,buf_len);
            dataptr=dataptr+buf_len;
        }
        // now create our own new_packet

        NdisAllocateBuffer(&Status, &new_buffer, g_buffer_pool, data, size);
        if (Status != NDIS_STATUS_SUCCESS) {
            KdPrint(("[ndis_hk] send_out_packet: NdisAllocateBuffer: 0x%x\n", Status));
            Status=STATUS_INSUFFICIENT_RESOURCES;
        }
    
        NdisAllocatePacket(&Status, &new_packet, g_packet_pool);
        if (Status != NDIS_STATUS_SUCCESS) {
            KdPrint(("[ndis_hk] send_out_packet: NdisAllocatePacket: 0x%x\n", Status));
            Status=STATUS_INSUFFICIENT_RESOURCES;
        }
        
        NdisChainBufferAtFront(new_packet, new_buffer);
        
        // setup ProtocolReserved for completion
        pr = PROTOCOL_RESERVED(new_packet);
        pr->magic = send_out_packet;
        pr->buffer = new_buffer;
        pr->data = data;
        pr->pkt=Packet;
        NdisSend(&Status,     pAdapt->BindingHandle, new_packet);
        if (Status != NDIS_STATUS_PENDING) {
            NdisIMCopySendCompletePerPacketInfo (Packet, new_packet);
            ExFreePool(data);
            NdisFreeBuffer(new_buffer);
            NdisFreePacket(new_packet);
        }
        KeReleaseSpinLock(&guard, irql);


    return Status;
}
zhuizhuziwo
驱动牛犊
驱动牛犊
  • 注册日期2008-09-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望121点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-04-09 15:46
操作系统式什么系统,你可以用windbg跟踪一下,看看运行到哪里就死机了。这样可以缩小问题的范围
游客

返回顶部