jackzhang
驱动牛犊
驱动牛犊
  • 注册日期2002-03-07
  • 最后登录2014-01-06
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2007回复:3

IMD (PPPoE) Win2K 下死机的原因

楼主#
更多 发布于:2003-07-25 19:06
这几天很郁闷,以前运行的好好的PPPoE驱动程序(虽然偶尔也死机),最近拿出来用的时候竟然必死无疑,而且每次都死在NdisMWanIndicateReceive函数里。
结果在网上看到KB263123的这篇文章。好东西大家分享:

BUG: Intermittent Crashes in NdisMWanIndicateReceive() on Windows 2000
The information in this article applies to:
Microsoft Windows 2000 Driver Development Kit (DDK), when used with:
the operating system: Microsoft Windows 2000
This article was previously published under Q263123
SYMPTOMS
Intermittent system halts (crashes) may occur when an network driver interface specification (NDIS) Wide Area Networking (WAN) driver calls the NdisMWanIndicateReceive function.
CAUSE
NdisMWanIndicateReceive attempts to read the first byte past the end of the packet buffer.
RESOLUTION
Allocate a buffer for the packet that is at least 4 bytes larger than the actual packet size. However, the PacketSize argument in the NdisMWanIndicateReceive call should be set to the actual size of the packet buffer. For example, if the packet buffer needs to be 100 bytes in size, then allocate at least 104 bytes for the buffer (but the PacketSize argument should be equal to 100 bytes).
STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.
Last Reviewed: 5/14/2003
Keywords: kbBug kbNDIS kbnofix KB263123

最新喜欢:

znsoftznsoft
soloz
驱动牛犊
驱动牛犊
  • 注册日期2003-06-02
  • 最后登录2004-10-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-25 20:42
重新分配ppp数据包的时候+4
还是从ptreceive函数里面得到pppoe包的时候+4
???
bluewhite911
驱动牛犊
驱动牛犊
  • 注册日期2007-03-17
  • 最后登录2007-03-30
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-20 14:24
jackzhang   和  soloz  有msn 吗? 想和两位交流一下 win2000下 pppoe驱动引起的死机问题。
我的驱动在有些装win2000系统的机器上,拨号或者断开时死机,不知道原因在哪里?怀疑和机器的硬件和网卡有关系,机器的主板时微星的,网卡为 marvell yokon 集成网卡 (代码如下,pppoe.c)


我的msn是bluewhite7714@hotmail.com





#include "discovery.h"
#include "pppoe.h"
#include "request.h"
#include "debug.h"
#include "miniport.h"
#include "packet.h"

void MyFreeNdisPacket(PNDIS_PACKET p) {
    PNDIS_BUFFER b;
    while(1) {
        NdisUnchainBufferAtFront(p, &b);
        if(b != NULL) {
            NdisFreeBuffer(b);
        } else {
            break;
        }
    }
    NdisFreePacket(p);
}

void PppoeReceiveDiscovery(PADAPTER a, PPPOE_PACKET *p, UINT size) {
//    UINT count;

    FENTER("PppoeReceiveDiscovery");

    if (size < 20) {
        DbgPrint ("short pppoe discovery packet\n");
        FLEAVE("PppoeReceiveDiscovery");
        return;
    }
    if (PacketCheckHeader(p, size) != 0) {
        DbgPrint("wrong header\n");
        FLEAVE("PppoeReceiveDiscovery");
        return;
    }
    if (PacketParseTags(p) != 0) {
        DbgPrint("failed to parse tags\n");
        FLEAVE("PppoeReceiveDiscovery");
        return;
    }

    switch (p->code) {
    case PPPOE_CODE_PADO:
        if (p->sessionid != 0) {
            DbgPrint("PADO with nonzero session id\n");
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }
        if (MyMemCmp(EthBcast, p->dest, 6) == 0) {
            DbgPrint("PADO to broadcast address\n");
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }

        if (a->pppoeState != PPPOE_STATE_PADI) {
            DbgPrint("PADO in non-PADI state: %d\n", a->pppoeState);
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }
        //判断是否到了等待时间,如果到了等待时间

        PppoeReceivePADO(a, p);
        break;

    case PPPOE_CODE_PADS:
        if (MyMemCmp(EthBcast, p->dest, 6) == 0) {
            DbgPrint("PADS to broadcast address\n");
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }

/*        if (p->sessionid == 0) {
            DbgPrint("PADS with 0 session id\n");
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }
*/
        if (a->pppoeState != PPPOE_STATE_PADR) {
            DbgPrint("PADS in non-PADR state: %d\n", a->pppoeState);
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }

        PppoeReceivePADS(a, p);
        break;

    case PPPOE_CODE_PADT:
        if (MyMemCmp(EthBcast, p->dest, 6) == 0) {
            DbgPrint("PADT to broadcast address\n");
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }
        if (p->sessionid == 0) {
            DbgPrint("PADT with 0 session id\n");
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }

        if (a->pppoeState != PPPOE_STATE_SESSION) {
            DbgPrint("PADS in non-SESSION state: %d\n", a->pppoeState);
            FLEAVE("PppoeReceiveDiscovery");
            return;
        }

        PppoeReceivePADT(a, p);
        break;

    default:
        DbgPrint("packet with code: 0x%x\n", p->code);
        break;
    }

//    for(count = 0; count < 20; count++) DbgPrint("%2.2x ", ((PUCHAR)packet)[count]);
//    DbgPrint("\n");

    FLEAVE("PppoeReceiveDiscovery");
}

void PppoeReceiveSession(PADAPTER a, PPPOE_PACKET *packet, UINT size) {
    UINT length;
    NDIS_STATUS s;
    PUCHAR xx;
    PPP_PACKET *pPPP_Packet;
    LCP_OPTION tag;

    FENTER("PppoeReceiveSession");

    if (size < 20) {
        DbgPrint ("short pppoe session packet\n");
        FLEAVE("PppoeReceiveSession");
        return;
    }
    if (PacketCheckHeader(packet, size) != 0) {
        DbgPrint("wrong header\n");
        FLEAVE("PppoeReceiveSession");
        return;
    }
    if (packet->code != 0) {
        DbgPrint("session stage packet with non-0 code\n");
        FLEAVE("PppoeReceiveSession");
        return;
    }
    if (packet->sessionid != a->pppoeSessionId) {
        DbgPrint("wrong session id\n");
        FLEAVE("PppoeReceiveSession");
        return;
    }
    if (MyMemCmp(packet->source, a->pppoeServerMacAddr, 6) != 0) {
        DbgPrint("session packet not from server\n");
        FLEAVE("PppoeReceiveSession");
        return;
    }
    if (MyMemCmp(packet->dest, a->protoMacAddr, 6) != 0) {
        DbgPrint("session packet not directly to us\n");
        FLEAVE("PppoeReceiveSession");
        return;
    }

    // Packet received. So we won't be needing send lcp-echo request this time.
    a->pppoePacketsReceived++;

    //retrive magic number option
    if(a->MagicNumberLen == 0)
    {
        pPPP_Packet =(PPP_PACKET *)(ULONG) (packet->data);
        
        //得到服务器发送过来的Configure Request ACK 包,通过包得到MagicNumber
        if((NTOHS(pPPP_Packet->protocolType) == PPP_PROTOCOL_LCP)
                            &&(pPPP_Packet->code == PPP_CODE_CONFIGURE_ACK))
        {
            DbgPrint("PPP-LCP data length: %d\n",NTOHS(pPPP_Packet->length));

            if (LcpGetFirstOption(pPPP_Packet, &tag) == 0)
            {
                while (1)
                {
                    DbgPrint("LCP Option: 0x%x, length: %d\n", tag.type, tag.length);
                    
                    switch(tag.type)
                    {
                    case LCP_OPTION_MAGICNUMBER:
                        a->MagicNumberLen =  tag.length-2;
                        if(a->MagicNumberLen > 0)
                        {
                            s=MyAllocateMemory(&a->MagicNumber,a->MagicNumberLen+1,"MagicNumber");
                            if (s==NDIS_STATUS_SUCCESS)
                            {
                                NdisMoveMemory(a->MagicNumber, tag.data , a->MagicNumberLen);
                                a->MagicNumber[a->MagicNumberLen] = 0;    
                            }
                        }
                        
                        break;
                    default:
                        break;
                    }
                    if (LcpGetNextOption(pPPP_Packet, &tag) != 0)
                        break;
                }
            }
        }
    }

    if(a->isWin9x == 0)
    {
        // dirty hack: we need to put ADDRESS CONTROL field in packet, so
        // PPP does not get mad at us.
        //See RFC1841        
        length = (unsigned)NTOHS(packet->len) +2;
        xx = packet->data - 2 ;
        xx[0] = 0xff;
        xx[1] = 0x03;
    }
    else
    {
        length = (unsigned)NTOHS(packet->len);
        xx = packet->data;
        DbgPrint("Win 98 PPP Length is %d",length);
    }

  
    NdisMWanIndicateReceive(&s, a->miniAdapterHandle, a->miniNdisLinkContext,
        xx, length);
    
    FLEAVE("PppoeReceiveSession");
}


NDIS_STATUS PppoeSendPacket(PADAPT a, PPPOE_PACKET *p, UINT plen) {
    PTRANSMIT_PROTOINFO pinfo;
    PNDIS_BUFFER buffer;
    PNDIS_PACKET packet;
    NDIS_STATUS s;

    FENTER("PppoeSendPacket");

    NdisAllocatePacket(&s, &packet, a->pppoePacketPoolHandle);
    if (s != NDIS_STATUS_SUCCESS) {
        DbgPrint("failed to allocate packet\n");
        FLEAVE("sendPPPOEPacket");
        return NDIS_STATUS_FAILURE;
    }

    NdisAllocateBuffer(&s, &buffer, a->pppoeBufferPoolHandle, p, PacketLength(p));
    if (s != NDIS_STATUS_SUCCESS) {
        DbgPrint("failed to allocate buffer\n");
        FLEAVE("sendPPPOEPacket");
        return NDIS_STATUS_FAILURE;
    }
    NdisChainBufferAtFront(packet, buffer);

    //保存NDIS_PACKET所对应的PPPOE_PACKET,以便异步发送成功后释放内存空间
    //异步释放代码在PtSendComplete
    pinfo = (PTRANSMIT_PROTOINFO)packet->ProtocolReserved;
    pinfo->pppoePacket = p;
    pinfo->pppoePacketLen = plen;
    pinfo->wanPacket = NULL;

    NdisSend(&s, a->protoBindingHandle, packet);
    if (s == NDIS_STATUS_PENDING) {
        DbgPrint("Packet send pending\n");
            }
    else {
        DbgPrint("NdisSend status: 0x%x\n", s);
       // 但不知道原先的顺序是否可能有问题。直观感觉是有问题的,
        // 因为在PacketFree时,这个p仍然被packet中的buffer引用着
        //释放NDIS_PACKET
        MyFreeNdisPacket(packet);
        //释放PPPOE_PACKAET,用NDISFreeMemory
        PacketFree(p);
    }

    FLEAVE("sendPPPOEPacket");
    return s;
}

static NDIS_STATUS setPacketFilter(PADAPT a, ULONG packetFilter) {
    NDIS_STATUS status;

    FENTER("setPacketFilter");

    status = ProtoSetRequestSync(a, OID_GEN_CURRENT_PACKET_FILTER, (PVOID) &packetFilter, sizeof(packetFilter), NULL);
    if (status != NDIS_STATUS_SUCCESS) {
        DbgPrint("Packet filter failed: 0x%x\n", status);
    }
    else DbgPrint("Packet filter : %x success\n", packetFilter);

    FLEAVE("setPacketFilter");
    return status;
}

void PppoeInitAdapter(PADAPTER a) {
    FENTER("PppoeInitAdapter");
    FLEAVE("PppoeInitAdapter");
}

static void PppoeInitService(PADAPTER a, PCHAR addr, ULONG alen) {
    NDIS_STATUS s;
    ULONG i = 0;
    PCHAR sn = NULL;
    PCHAR ac = NULL;
    UINT snLen = 0;
    UINT acLen = 0;
    int snRead = 1;

    sn = addr;
    while (1) {
        if (i >= alen) break;
        if (addr == 0) break;

        if (addr == '@' && snRead == 1) {
            ++i;
            snRead = 0;
            ac = &addr;
            continue;
        }

        if (snRead == 1) ++snLen;
        else ++acLen;

        ++i;
    }

    // hack: if no phoneno specified windows gives one space for us
    if (snLen == 1 && sn[0] == ' ') snLen = 0;

    if (snLen > 0) {
        s = MyAllocateMemory(&a->pppoeServiceName, snLen + 1, "pppoeServiceName");
        if (s == NDIS_STATUS_SUCCESS) {
//            NdisMoveMemory(a->pppoeServiceName, sn, snLen);
//            a->pppoeServiceName[snLen] = 0;
//            a->pppoeServiceNameLen = snLen;
        }
        else DbgPrint("can not allocate service name string\n");
    }
    else DbgPrint("Service-Name empty\n");

    if (acLen > 0) {
        s = MyAllocateMemory(&a->pppoeACName, acLen + 1, "pppoeACName");
        if (s == NDIS_STATUS_SUCCESS) {
            NdisMoveMemory(a->pppoeACName, ac, acLen);
            a->pppoeACName[acLen] = 0;
            a->pppoeACNameLen = acLen;
        }
        else DbgPrint("can not allocate AC name string\n");
    }
    else DbgPrint("AC-Name empty\n");
}

static void PppoeTimerfunc(PVOID sys1, PVOID ctx, PVOID sys2, PVOID sys3) {
    PADAPTER a = (PADAPTER)ctx;
    PPPOE_PACKET *p = NULL;
    PPP_PACKET *pPPP = NULL;

    FENTER("PppoeTimerfunc");

    switch (a->pppoeState) {
    case PPPOE_STATE_PADI:
        DbgPrint("State padi\n");

        if (a->pppoeRetries >= 3) {
            DbgPrint("PADI retries exceeded\n");
            PppoeTerminate(a);
            MPEnterCallState(a, LINECALLSTATE_DISCONNECTED, LINEDISCONNECTMODE_NOANSWER);
        }
        else {
            DbgPrint("sending PADI\n");
            ++a->pppoeRetries;

            NdisSetTimer(&a->pppoeTimer, 3000);
            PppoePADI(a);
        }
        break;

    case PPPOE_STATE_PADR:
        DbgPrint("State padr\n");
        if (a->pppoeRetries >= 3) {
            DbgPrint("PADR retries exceeded\n");
            PppoeTerminate(a);
            MPEnterCallState(a, LINECALLSTATE_DISCONNECTED, LINEDISCONNECTMODE_NOANSWER);
        }
        else {
            DbgPrint("sending PADR\n");
            ++a->pppoeRetries;

            NdisSetTimer(&a->pppoeTimer, 3000);
            PppoePADR(a);
        }
        break;

    case PPPOE_STATE_SESSION:
        DbgPrint("State session\n");
        if(a->pppoePacketsReceived == 0)
        {
            if(a->pppoeLcpRetries < 2)
            {
                DbgPrint("Should send lcp echo request\n");
                //create PPPOE header
                p = PacketAllocate(0);
                if (p == NULL)
                {
                    DbgPrint("Can't allocate packet for LCP Echo-request.\n");
                    break;
                }
                
                PacketReset(p);
                
                p->code = 0;
                p->proto = PPPOE_SESSION_PROTO;
                p->sessionid = a->pppoeSessionId;
                NdisMoveMemory(p->source, a->protoMacAddr, 6);
                NdisMoveMemory(p->dest, a->pppoeServerMacAddr, 6);

                pPPP=(PPP_PACKET *)p->data;

                //create PPP header
                pPPP->protocolType=NTOHS(PPP_PROTOCOL_LCP);
                pPPP->code=PPP_CODE_ECHO_REQUEST;
                pPPP->identifer=9;    //TODO: Should be different each time
                if (a->MagicNumberLen > 0) {
                    p->len = NTOHS(8+a->MagicNumberLen);
                    pPPP->length=NTOHS(6+a->MagicNumberLen);
                    NdisMoveMemory(pPPP->data, a->MagicNumber, a->MagicNumberLen);
                } else {
                    p->len=NTOHS(8);
                    pPPP->length=NTOHS(6);
                }
                //send LCP echo-request packet
                //Notice: Because of Sniffer bug, it can't resolve this packet run on the
                //same mashine. Only show PPP unknown  --Yuan
                PppoeSendPacket(a, p, 0);
            }
            else
            {
                DbgPrint("Connections is dead for Echo timeout...:(\n");
                PppoeTerminate(a);
                MPEnterLinedevState(a, LINEDEVSTATE_DISCONNECTED);
                //TODO:
            }
            a->pppoeLcpRetries++;
        } else
        {
            a->pppoeLcpRetries = 0;
        }
        a->pppoePacketsReceived = 0;
        DbgPrint("Sceduling next timer\n");
        NdisSetTimer(&a->pppoeTimer, 10000);
        break;
    default:
        DbgPrint("strange, state %d\n", a->pppoeState);
        break;
    }

    FLEAVE("PppoeTimerfunc");
}

void PppoeInitialize(PADAPTER a) {
    NDIS_STATUS s;

    FENTER("PppoeInitialize");

    //Note: ProtocolReservedLength=16 used on 32-bit system
    NdisAllocatePacketPool(&s, &(a->pppoePacketPoolHandle), PPPOE_POOL_SIZE, 16);
    if (s != NDIS_STATUS_SUCCESS) {
        DbgPrint("failed to allocate packet pool");
        a->pppoePacketPoolHandle = NULL;
    } else {
        DbgPrint("packet pool handle: 0x%x\n", a->pppoePacketPoolHandle);
    }

    //TODO: I don't know why handle==NULL, and whether it has bad effect??? Yuan
    NdisAllocateBufferPool(&s, &(a->pppoeBufferPoolHandle), PPPOE_POOL_SIZE);
    if (s != NDIS_STATUS_SUCCESS) {
        DbgPrint("failed to allocate buffer pool");
        a->pppoeBufferPoolHandle = NULL;
    } else {
        DbgPrint("buffer pool handle: 0x%x\n", a->pppoeBufferPoolHandle);
    }

    a->pppoeState = PPPOE_STATE_IDLE;

    a->pppoeACName = NULL;
    a->pppoeACNameLen = 0;
    a->pppoeServiceName = NULL;
    a->pppoeServiceNameLen = 0;
    a->pppoeRealServiceName = NULL;
    a->pppoeRealServiceNameLen = 0;

    a->pppoeHostUniq = 0;

    a->pppoeACCookie = NULL;
    a->pppoeACCookieLen = 0;

      NdisInitializeTimer(&a->pppoeTimer, &PppoeTimerfunc, a);

    FLEAVE("PppoeInitialize");
}

//提供给TAPI的接口,用于开始的拨号
NDIS_STATUS PppoeConnect(PADAPTER a, PCHAR address, ULONG alen) {
    FENTER("PppoeConnect");

    if (a->pppoeState != PPPOE_STATE_IDLE) {
        DbgPrint("wrong state: %d\n", a->pppoeState);
        FLEAVE("PppoeConnect");
        return NDIS_STATUS_TAPI_INUSE;
    }

    PppoeInitService(a, address, alen);

    a->pppoeState = PPPOE_STATE_PADI;

    setPacketFilter(a, NDIS_PACKET_TYPE_DIRECTED);

    if (a->pppoePacketPoolHandle == NULL) {
        DbgPrint("no packet pool\n");
        FLEAVE("PppoeConnect");
        return NDIS_STATUS_FAILURE;
    }

    // before packet sending, add timeout timer
    a->pppoeRetries = 0;
    NdisSetTimer(&a->pppoeTimer, 3000);

 
//    a->MagicNumber = NULL;
    a->MagicNumberLen = 0;

    PppoePADI(a);

    FLEAVE("PppoeConnect");
    return NDIS_STATUS_SUCCESS;
}

void PppoeTerminate(PADAPTER a) {
    FENTER("PppoeTerminate");

    if (a->pppoeState == PPPOE_STATE_IDLE) {
        DbgPrint("terminate when IDLE, ignoring\n");
        FLEAVE("PppoeTerminate");
        return;
    }

    if (a->pppoeState == PPPOE_STATE_SESSION) {
        DbgPrint("terminate in SESSION state, sending PADT\n");
        PppoePADT(a);
    }

    if (a->pppoeState != PPPOE_STATE_PADT) {
        DbgPrint("terminate in non PADT state, shuting eth card\n");
        setPacketFilter(a, 0);
    }

    a->pppoeState = PPPOE_STATE_IDLE;

    if (a->pppoeACNameLen != 0) {
        MyFreeMemory(a->pppoeACName);
        a->pppoeACName = NULL;
        a->pppoeACNameLen = 0;
    }

    if (a->pppoeServiceNameLen != 0) {
        MyFreeMemory(a->pppoeServiceName);
        a->pppoeServiceName = NULL;
        a->pppoeServiceNameLen = 0;
    }

    if (a->pppoeRealServiceNameLen != 0) {
        MyFreeMemory(a->pppoeRealServiceName);
        a->pppoeRealServiceName = NULL;
        a->pppoeRealServiceNameLen = 0;
    }

    if (a->pppoeACCookieLen != 0) {
        MyFreeMemory(a->pppoeACCookie);
        a->pppoeACCookie = NULL;
        a->pppoeACCookieLen = 0;
    }

    
    if(a->MagicNumberLen != 0)
    {
        MyFreeMemory(a->MagicNumber);
        a->MagicNumber = NULL;
        a->MagicNumberLen = 0;
    }

    FLEAVE("PppoeTerminate");
}

NDIS_STATUS PppoeTransmit(PADAPTER a, PNDIS_WAN_PACKET p) {
    PNDIS_PACKET packet;
    PNDIS_BUFFER buffer;
    PTRANSMIT_PROTOINFO pinfo;
    PPPOE_PACKET *pack;
    NDIS_STATUS s;

    FENTER("PppoeTransmit");

    if (a->pppoeState != PPPOE_STATE_SESSION) {
        DbgPrint("tx in non-SESSION state\n");

        FLEAVE("PppoeTransmit");
        return NDIS_STATUS_FAILURE;
    }

    NdisAllocatePacket(&s, &packet, a->pppoePacketPoolHandle);
    if (s != NDIS_STATUS_SUCCESS) {
        DbgPrint("failed to allocate packet\n");

        FLEAVE("PppoeTransmit");
        return NDIS_STATUS_FAILURE;
    }

    NdisAllocateBuffer(&s, &buffer, a->pppoeBufferPoolHandle, p->CurrentBuffer - 18, p->CurrentLength + 18);
    if (s != NDIS_STATUS_SUCCESS) {
        DbgPrint("failed to allocate buffer\n");

        FLEAVE("PppoeTransmit");
        return NDIS_STATUS_FAILURE;
    }

    pack = (PPPOE_PACKET *)((ULONG)p->CurrentBuffer - 18);
    NdisMoveMemory(pack->dest, a->pppoeServerMacAddr, 6);
    NdisMoveMemory(pack->source, a->protoMacAddr, 6);
    pack->proto = 0x6488;
    pack->code = 0;
    pack->len = HTONS(p->CurrentLength - 2);
    pack->sessionid = a->pppoeSessionId;
    pack->vertype = 0x11;

    NdisChainBufferAtFront(packet, buffer);

    DbgPrint("Send packet length: %i\n", p->CurrentLength + 18);

    pinfo = (PTRANSMIT_PROTOINFO)packet->ProtocolReserved;
    pinfo->wanPacket = p;
    pinfo->pppoePacket = NULL;

    NdisSend(&s, a->protoBindingHandle, packet);
    if (s == NDIS_STATUS_PENDING) {
        DbgPrint("Packet send pending\n");
    }
    else {
        DbgPrint("NdisSend status: 0x%x\n", s);

        MyFreeNdisPacket(packet);
    }

    FLEAVE("PppoeTransmit");
    return s;
}
附件名称/大小 下载次数 最后更新
pppoe.rar (5KB)  22 2007-03-20 14:35
bluewhite911
驱动牛犊
驱动牛犊
  • 注册日期2007-03-17
  • 最后登录2007-03-30
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-22 17:34
问题解决了:-) 我自问自答吧

原因是以前的pppoe驱动在某些异步请求过程中,加入了NDIS_RW_LOCK ,这样在某些硬件机器上会造成死锁。
 现象就是在登陆或者断开的时候,像“死机”一样。

解决办法:将锁去掉,就ok了
游客

返回顶部