亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? interrup.c

?? 使用網絡驅動器接口標準開發的ne2000網卡的NT驅動.
?? C
?? 第 1 頁 / 共 4 頁
字號:

            PacketLen = (Adapter->PacketHeader[2]) + ((Adapter->PacketHeader[3])*256) - 4;

            PacketLen = (PacketLen < Adapter->MaxLookAhead)?
                         PacketLen :
                         Adapter->MaxLookAhead;

            //
            // Copy up the lookahead data
            //
            if (!CardCopyUp(Adapter,
                            Adapter->Lookahead,
                            Adapter->PacketHeaderLoc,
                            PacketLen + NE2000_HEADER_SIZE
                            )) {

                //
                // Failed! Skip this packet
                //
                IndicateStatus = SKIPPED;

            } else {

                //
                // Indicate the packet to the wrapper
                //
                IndicateStatus = Ne2000IndicatePacket(Adapter);

                if (IndicateStatus != CARD_BAD) {

                    Adapter->FramesRcvGood++;

                }

            }

        } else {

            //
            // Packet is corrupt, skip it.
            //
            IF_LOUD( DbgPrint("Packet did not pass OK check\n"); )

            IndicateStatus = SKIPPED;

        }

        //
        // Handle when the card is unable to indicate good packets
        //
        if (IndicateStatus == CARD_BAD) {

#if DBG

            IF_NE2000DEBUG( NE2000_DEBUG_CARD_BAD ) {

                DbgPrint("R: <%x %x %x %x> C %x N %x\n",
                    Adapter->PacketHeader[0],
                    Adapter->PacketHeader[1],
                    Adapter->PacketHeader[2],
                    Adapter->PacketHeader[3],
                    Adapter->Current,
                    Adapter->NicNextPacket);

            }
#endif

            IF_LOG( Ne2000Log('W');)

            //
            // Start off with receive interrupts disabled.
            //

            Adapter->NicInterruptMask = IMR_XMIT | IMR_XMIT_ERR | IMR_OVERFLOW;

            //
            // Reset the adapter
            //
            CardReset(Adapter);

            //
            // Since the adapter was just reset, stop indicating packets.
            //

            break;

        }

        //
        // (IndicateStatus == SKIPPED) is OK, just move to next packet.
        //
        if (IndicateStatus == SKIPPED) {

            SyncCardGetCurrent((PVOID)Adapter);

            Adapter->NicNextPacket = Adapter->Current;

        } else {

            //
            // Free the space used by packet on card.
            //

            Adapter->NicNextPacket = Adapter->PacketHeader[1];

        }

        //
        // This will set BOUNDARY to one behind NicNextPacket.
        //
        CardSetBoundary(Adapter);

        if (Adapter->ReceivePacketCount > 10) {

            //
            // Give transmit interrupts a chance
            //
            Done = FALSE;
            Adapter->ReceivePacketCount = 0;
            break;

        }

    }

    //
    // See if a buffer overflow occured previously.
    //
    if (Adapter->BufferOverflow) {

        //
        // ... and set a flag to restart the card after receiving
        // a packet.
        //
        Adapter->BufferOverflow = FALSE;

        SyncCardAcknowledgeOverflow(Adapter);

        //
        // Undo loopback mode
        //
        CardStart(Adapter);

        IF_LOG( Ne2000Log('f'); )

        //
        // Check if transmission needs to be queued or not
        //
        if (Adapter->OverflowRestartXmitDpc && Adapter->CurBufXmitting != -1) {

            IF_LOUD( DbgPrint("queueing xmit in RcvDpc\n"); )

            Adapter->OverflowRestartXmitDpc = FALSE;

            Adapter->TransmitInterruptPending = TRUE;

            IF_LOG( Ne2000Log('5'); )

            CardStartXmit(Adapter);

        }
    }

    //
    // Finally, indicate ReceiveComplete to all protocols which received packets
    //
    if (Adapter->IndicateReceiveDone) {

        NdisMEthIndicateReceiveComplete(Adapter->MiniportAdapterHandle);

        Adapter->IndicateReceiveDone = FALSE;

    }

    IF_LOUD( DbgPrint( "Ne2000RcvDpc exiting\n" );)

    return (Done);

}


VOID
Ne2000XmitDpc(
    IN PNE2000_ADAPTER Adapter
    )

/*++

Routine Description:

    This is the real interrupt handler for a transmit complete interrupt.
    Ne2000Dpc queues a call to it.

    Called after a transmit complete interrupt. It checks the
    status of the transmission, completes the send if needed,
    and sees if any more packets are ready to be sent.

Arguments:

    Adapter  - Pointer to the adapter block.

Return Value:

    None.

--*/

{
    //
    // Packet that was transmitted
    //
    PNDIS_PACKET Packet;

    //
    // Status of the send
    //
    NDIS_STATUS Status;

    //
    // Length of the packet sent
    //
    ULONG Len;

    //
    // Temporary loopnig variable
    //
    UINT i;

    IF_VERY_LOUD( DbgPrint( "Ne2000XmitDpc entered\n" );)

    //
    // Verify that we are transmitting a packet
    //
    if ( Adapter->CurBufXmitting == -1 ) {

#if DBG
        DbgPrint( "Ne2000HandleXmitComplete called with nothing transmitting!\n" );
#endif

        NdisWriteErrorLogEntry(
            Adapter->MiniportAdapterHandle,
            NDIS_ERROR_CODE_DRIVER_FAILURE,
            1,
            NE2000_ERRMSG_HANDLE_XMIT_COMPLETE
            );

        return;
    }

    IF_LOG( Ne2000Log('C');)

    //
    // Get the status of the transmit
    //
    SyncCardGetXmitStatus((PVOID)Adapter);

    //
    // Statistics
    //
    if (Adapter->XmitStatus & TSR_XMIT_OK) {

        Adapter->FramesXmitGood++;
        Status = NDIS_STATUS_SUCCESS;

    } else {

        Adapter->FramesXmitBad++;
        Status = NDIS_STATUS_FAILURE;

    }

    //
    // Mark the current transmit as done.
    //
    Len = (Adapter->PacketLens[Adapter->CurBufXmitting] + 255) >> 8;

    ASSERT (Len != 0);

    //
    // Free the transmit buffers
    //
    for (i = Adapter->CurBufXmitting; i < Adapter->CurBufXmitting + Len; i++) {

        Adapter->BufferStatus[i] = EMPTY;

    }

    //
    // Set the next buffer to start transmitting.
    //
    Adapter->NextBufToXmit += Len;

    if (Adapter->NextBufToXmit == MAX_XMIT_BUFS) {

        Adapter->NextBufToXmit = 0;

    }

    if (Adapter->BufferStatus[Adapter->NextBufToXmit] == EMPTY &&
        Adapter->NextBufToFill != Adapter->NextBufToXmit) {

        Adapter->NextBufToXmit = 0;

    }

    //
    // Remove the packet from the outstanding packet list.
    //
    Packet = Adapter->Packets[Adapter->CurBufXmitting];
    Adapter->Packets[Adapter->CurBufXmitting] = (PNDIS_PACKET)NULL;

    //
    // See what to do next.
    //

    switch (Adapter->BufferStatus[Adapter->NextBufToXmit]) {


    case FULL:

        //
        // The next packet is ready to go -- only happens with
        // more than one transmit buffer.
        //

        IF_LOUD( DbgPrint( " next packet ready to go\n" );)

        //
        // Start the transmission and check for more.
        //

        Adapter->CurBufXmitting = Adapter->NextBufToXmit;

        IF_LOG( Ne2000Log('2');)

        //
        // This is used to check if stopping the chip prevented
        // a transmit complete interrupt from coming through (it
        // is cleared in the ISR if a transmit DPC is queued).
        //

        Adapter->TransmitInterruptPending = TRUE;

        IF_LOG( Ne2000Log('6'); )
        CardStartXmit(Adapter);

        break;

    case EMPTY:

        //
        // No packet is ready to transmit.
        //

        IF_LOUD( DbgPrint( " next packet empty\n" );)

        Adapter->CurBufXmitting = (XMIT_BUF)-1;

        break;

    }

    //
    // Start next send
    //

    Ne2000DoNextSend(Adapter);

    IF_VERY_LOUD( DbgPrint( "Ne2000XmitDpc exiting\n" );)

}


BOOLEAN
Ne2000PacketOK(
    IN PNE2000_ADAPTER Adapter
    )

/*++

Routine Description:

    Reads a packet off the card -- checking if the CRC is good.  This is
    a workaround for a bug where bytes in the data portion of the packet
    are shifted either left or right by two in some weird 8390 cases.

    This routine is a combination of Ne2000TransferData (to copy up data
    from the card), CardCalculateCrc and CardCalculatePacketCrc.

Arguments:

    Adapter - pointer to the adapter block.

Return Value:

    TRUE if the packet seems ok, else false.

--*/

{

    //
    // Length of the packet
    //
    UINT PacketLen;

    //
    // Guess at where the packet is located
    //
    PUCHAR PacketLoc;

    //
    // Header Validation Variables
    //
    BOOLEAN FrameAlign;
    PUCHAR PacketRcvStatus;
    PUCHAR NextPacket;
    PUCHAR PacketLenLo;
    PUCHAR PacketLenHi;
    PUCHAR ReceiveDestAddrLo;
    UINT FrameAlignCount;
    UCHAR OldPacketLenHi;
    UCHAR TempPacketHeader[6];
    PUCHAR BeginPacketHeader;

    //
    // First copy up the four-byte header the card attaches
    // plus first two bytes of the data packet (which contain
    // the destination address of the packet).  We use the extra
    // two bytes in case the packet was shifted right 1 or 2 bytes
    //
    PacketLoc = Adapter->PageStart +
        256*(Adapter->NicNextPacket-Adapter->NicPageStart);

    if (!CardCopyUp(Adapter, TempPacketHeader, PacketLoc, 6)) {

        return FALSE;

    }
    PacketLoc += 4;

    //
    // Validate the header
    //
    FrameAlignCount = 0;
    BeginPacketHeader = TempPacketHeader;

    //
    // Sometimes the Ne2000 will misplace a packet and shift the
    // entire packet and header by a byte, either up by 1 or 2 bytes.
    // This loop will look for the packet in the expected place,
    // and then shift up in an effort to find the packet.
    //
    do {

        //
        // Set where we think the packet is
        //
        PacketRcvStatus = BeginPacketHeader;
        NextPacket = BeginPacketHeader + 1;
        PacketLenLo = BeginPacketHeader + 2;
        PacketLenHi = BeginPacketHeader + 3;
        OldPacketLenHi = *PacketLenHi;
        ReceiveDestAddrLo = BeginPacketHeader + 4;
        FrameAlign = FALSE;

        //
        // Check if the status makes sense as is.
        //
        if (*PacketRcvStatus & 0x05E){

            FrameAlign = TRUE;

        } else if ((*PacketRcvStatus & RSR_MULTICAST)   // If a multicast packet
                     && (!FrameAlignCount)              // and hasn't been aligned
                     && !(*ReceiveDestAddrLo & 1)       // and lsb is set on dest addr
                  ){

            FrameAlign = TRUE;

        } else {

            //
            // Compare high and low address bytes.  If the same, the low
            // byte may have been copied into the high byte.
            //

            if (*PacketLenLo == *PacketLenHi){

                //
                // Save the old packetlenhi
                //
                OldPacketLenHi = *PacketLenHi;

                //
                // Compute new packet length
                //
                *PacketLenHi = *NextPacket - Adapter->NicNextPacket - 1;

                if (*PacketLenHi < 0) {

                    *PacketLenHi = (Adapter->NicPageStop - Adapter->NicNextPacket) +
                        (*NextPacket - Adapter->NicPageStart) - 1;

                }

                if (*PacketLenLo > 0xFC) {

                    *PacketLenHi++;
                }

            }

            PacketLen = (*PacketLenLo) + ((*PacketLenHi)*256) - 4;

            //
            // Does it make sense?
            //
            if ((PacketLen > 1514) || (PacketLen < 60)){

                //
                // Bad length.  Restore the old packetlenhi
                //
                *PacketLenHi = OldPacketLenHi;

                FrameAlign = TRUE;

            }

            //
            // Did we recover the frame?
            //

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久美女毛片| 蜜桃视频在线一区| 视频一区视频二区中文| 国内成人精品2018免费看| 不卡的av电影| 日韩一区二区三区免费看| 亚洲欧美另类图片小说| 国内欧美视频一区二区| 日本韩国视频一区二区| 国产亚洲精品aa午夜观看| 天堂久久一区二区三区| 色妹子一区二区| 国产日韩欧美一区二区三区综合| 亚洲国产aⅴ天堂久久| 97精品国产露脸对白| xnxx国产精品| 奇米色一区二区三区四区| 91免费在线播放| 国产精品人成在线观看免费| 蜜臀久久99精品久久久久宅男| 99精品视频在线免费观看| 26uuu亚洲综合色| 美日韩黄色大片| 欧美蜜桃一区二区三区| 亚洲激情图片一区| 日本精品一区二区三区四区的功能| 国产女人水真多18毛片18精品视频 | 色一区在线观看| 国产目拍亚洲精品99久久精品| 免费成人在线网站| 在线成人午夜影院| 五月婷婷久久丁香| 欧美精品v日韩精品v韩国精品v| 亚洲伊人伊色伊影伊综合网| 91视频在线看| 亚洲黄色片在线观看| 色狠狠桃花综合| 亚洲嫩草精品久久| 欧美亚洲一区三区| 亚洲五码中文字幕| 制服丝袜激情欧洲亚洲| 日本成人在线不卡视频| 日韩一区二区三区观看| 加勒比av一区二区| 久久综合色鬼综合色| 国产精品自拍网站| 中文字幕欧美一| 欧美性大战久久久久久久蜜臀| 洋洋av久久久久久久一区| 欧美网站大全在线观看| 日韩av二区在线播放| xf在线a精品一区二区视频网站| 欧美亚洲动漫精品| 午夜精品久久久久久久蜜桃app| 欧美视频在线一区| 蜜桃av噜噜一区| 中文字幕第一区第二区| 91在线观看美女| 香港成人在线视频| 精品裸体舞一区二区三区| 粉嫩欧美一区二区三区高清影视 | 欧美熟乱第一页| 婷婷六月综合网| 精品久久久久久无| 不卡的av电影| 午夜在线电影亚洲一区| 久久久久久黄色| 欧美午夜理伦三级在线观看| 麻豆成人久久精品二区三区小说| 国产婷婷色一区二区三区四区| 99久久99久久综合| 日本视频一区二区三区| 中文字幕在线视频一区| 欧美日韩精品一区二区三区蜜桃| 精品午夜一区二区三区在线观看 | av男人天堂一区| 视频一区视频二区中文字幕| 欧美激情艳妇裸体舞| 91精品国产综合久久久久| 国产91精品免费| 日产国产高清一区二区三区 | 国产亚洲欧美日韩在线一区| 色94色欧美sute亚洲线路二| 美国毛片一区二区| 一区二区三区小说| 国产欧美一区二区三区沐欲| 欧美日韩精品免费观看视频 | 国产久卡久卡久卡久卡视频精品| 亚洲国产美国国产综合一区二区| 精品999久久久| 欧美日韩一区在线| 91蜜桃在线观看| 国产精品亚洲视频| 精品一区二区三区在线观看 | 亚洲日本一区二区三区| 国产亚洲一区字幕| 欧美大片免费久久精品三p| 欧美伊人久久久久久久久影院 | 99re6这里只有精品视频在线观看| 美国毛片一区二区三区| 午夜亚洲国产au精品一区二区| 国产精品高潮呻吟| 国产日韩精品一区二区三区| 日韩欧美一级片| 91精品国产综合久久久久久久 | 精品一区二区三区在线播放| 天堂va蜜桃一区二区三区 | 欧美日韩一二区| 国产无人区一区二区三区| 日韩三区在线观看| 7777精品伊人久久久大香线蕉的| 欧美在线视频全部完| 91免费小视频| 欧美在线999| 色素色在线综合| 91福利视频网站| 色综合天天视频在线观看| 99re亚洲国产精品| 99re成人精品视频| 色悠悠久久综合| 欧美综合一区二区| 欧美日韩国产bt| 欧美精品免费视频| 欧美一级精品在线| 精品国产亚洲一区二区三区在线观看| 日韩精品资源二区在线| 欧美电视剧在线看免费| 精品精品欲导航| 久久一日本道色综合| 欧美国产一区二区在线观看 | 欧美一区二区私人影院日本| 制服丝袜亚洲播放| 精品理论电影在线观看| 国产亚洲欧美日韩俺去了| 国产精品丝袜黑色高跟| 亚洲天堂免费看| 亚洲超碰97人人做人人爱| 卡一卡二国产精品| 成人综合在线观看| 色噜噜狠狠成人网p站| 欧美巨大另类极品videosbest | 日韩一级在线观看| 国产肉丝袜一区二区| 亚洲丝袜制服诱惑| 午夜激情久久久| 国产一区在线精品| 99精品在线免费| 在线成人小视频| 欧美国产激情一区二区三区蜜月 | 久久久国产精华| 亚洲欧美一区二区久久| 日本伊人色综合网| 成人免费视频app| 欧美在线|欧美| 久久色.com| 亚洲综合图片区| 国产乱码精品一区二区三区五月婷| 99久久国产综合色|国产精品| 欧美日本免费一区二区三区| 久久人人97超碰com| 一区二区三区精品视频| 国产一区二区三区国产| 国产成人高清在线| 亚洲激情网站免费观看| 亚洲另类春色校园小说| 免费不卡在线观看| 97精品国产97久久久久久久久久久久| 国产精品妹子av| 美国三级日本三级久久99| 色综合天天综合色综合av| 精品日韩欧美在线| 午夜精品视频一区| 色综合久久88色综合天天免费| 精品国产乱码久久久久久图片 | 国产a区久久久| 欧美精品一卡两卡| 中文字幕在线观看不卡视频| 激情深爱一区二区| 欧美精品国产精品| 一个色在线综合| 成人免费看片app下载| 欧美变态tickling挠脚心| 依依成人精品视频| 成人国产精品免费观看动漫| 精品免费国产一区二区三区四区| 亚洲午夜精品网| 色悠悠亚洲一区二区| 亚洲欧美怡红院| 国产91精品入口| 久久精品水蜜桃av综合天堂| 免费人成在线不卡| 日韩一区二区视频| 日本美女一区二区| 在线不卡一区二区| 午夜精品福利一区二区三区av | 亚洲黄色录像片| 99在线视频精品| 亚洲日韩欧美一区二区在线| av在线播放不卡| 亚洲人成在线观看一区二区|