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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? isrdpc.c

?? dma驅(qū)動(dòng)開(kāi)發(fā)程序
?? C
字號(hào):
/*++

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

    isrdpc.c

Abstract:

    This file contains the Interrupt Service Routine (ISR) and Deferred
    Procedure Call (DPC) routines and any associated support routines.

Author:

    Steve Dziok (SteveDz)

Environment:

    Kernel mode

Revision History:


--*/

#include "pcidma.h"


BOOLEAN
PciDmaISR(
    IN PKINTERRUPT Interrupt,
    IN PVOID ServiceContext
    )
/*++

Routine Description:

    This routine assumes that only a single I/O can be completed at a
    time on the hardware (i.e. at most one I/O completed per interrupt).

Arguments:

    Interrupt - Pointer to the driver's interrupt object.

    Context - Pointer to context information as specified in the call to
              IoConnectInterrupt.

Return Value:

    TRUE - Interrupt belongs to this device.
    
--*/
{
    PDEVICE_OBJECT      deviceObject = (PDEVICE_OBJECT)ServiceContext;
    PDEVICE_EXTENSION   deviceExtension = deviceObject->DeviceExtension;

    UCHAR   intStatus;
    UCHAR   intStat0;
    UCHAR   intStat1;
    
    DebugPrint((3, "PciDmaISR \n"));

    //
    // Check if adapter is interrupting.  If not, return FALSE.  It is 
    // critical to check whether this adapter is interrupting as soon as 
    // possible so the operating system can call the next ISR when shared
    // interrupts are used.
    //

    //
    // First, check if device configuration was complete.  If not, return to 
    // caller.  The device should not yet be interrupting.  Also, if 
    // configuration was not complete, we have no safe way to insure the 
    // device registers have been mapped, nor are we sure the device 
    // components have been safely set up.
    //
    // If the system uses shared interrupts, and this ISR is being called
    // for another devices interrupt, we can safely read the ready flag in
    // the device extension.  Don't need to use the interlocked routines to
    // read this flag.
    //
    
    if (!deviceExtension->DeviceConfigured) {
        
        DebugPrint((3, "Device not configured but ISR called \n"));
        
        return FALSE;
    }

///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- START 
//
///////////////////////////////////////////////////////////////
#ifdef VENDORID_1000_DEVICEID_0004

    //
    // Check if the adapter is interrupting.  If not, indicate this fact.
    //

    intStatus = READ_UCHAR(INT_STATUS);
    
    if (!intStatus) {

        //
        // This adapter was not interrupting.
        //

        return FALSE;
    }

    ASSERT(intStatus == 0x02);
    
    //
    // Clear the interrupt.  This sample throws away all the interrupt 
    // information.  Of course a real driver would use this information.
    //

    intStat0 = READ_UCHAR(INT_STAT0);
    intStat1 = READ_UCHAR(INT_STAT1);

    WRITE_UCHAR(TIMER1, 0x00);        

#endif
///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- END
//
///////////////////////////////////////////////////////////////
    
    //
    // Check if there is a current IRP.  If not, then this interrupt cannot
    // do anything.  This driver design requires an I/O to be pending in order
    // to queue the DPC.  If there is no I/O current, then there is no need
    // to have a DPC queued.  This driver also assumes one I/O per interrupt.
    //
    // IMPORTANT: Before returning TRUE, the interrupt must have been cleared
    // on the device or the system will hang trying to service this level 
    // sensitive interrupt.
    //
    
    if (!deviceObject->CurrentIrp) {
        
        DebugPrint((3, "Hardware generated interrupt with no IRP pending \n"));
        
        //
        // Clear the interrupt on the device before returning TRUE.
        //
        
        return TRUE;
    }
    
///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- START 
//
///////////////////////////////////////////////////////////////
#ifdef VENDORID_1000_DEVICEID_0004

    //
    // Interrupt came from this adapter.  Save only as much information as
    // necessary,  clear the interrupt on the adapter, request a DPC and
    // return TRUE.
    //

    //
    // Save information for the DPC.
    //

    //
    // Clear the interrupt from this adapter.
    //

#endif
///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- END
//
///////////////////////////////////////////////////////////////

    //
    // Request the DPC to complete the transfer.
    //

    IoRequestDpc(deviceObject,
                 deviceObject->CurrentIrp,
                 NULL
                 );

    //
    // Indicate that this adapter was interrupting.
    //

    return TRUE;

}   // PciDmaISR


VOID
PciDmaDpc(
    IN PKDPC Dpc,
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
/*++

Routine Description:

    The DPC routine does most of the work of servicing the interrupt.  If
    the original I/O transfer was too large for the adapter and split into
    multiple transfers, the remaining partial transfers must be completed.  
    If the original transfer is completed, the IRP must be completed, and 
    the next packet started.

    This routine assumes that only a single I/O can be completed at a
    time on the hardware (i.e. at most one I/O completed per interrupt).

    Remember that if this routine needs to access hardware registers or data
    shared with the ISR, it must use a SynchCritSection routine (i.e. use
    KeSynchronizeExecution).

Arguments:

    Dpc - Pointer to kernel DPC object.
    
    DeviceObject - Object representing a particular adapter.

    Irp - Current IRP for the specified device.
    
    Context - Driver determined context information.  For this driver,
              the context is not used.
    
Return Value:

    None
    
--*/
{
    PDEVICE_EXTENSION   deviceExtension = DeviceObject->DeviceExtension;
    
    PTRANSFER_INFO      transferInfo = deviceExtension->TransferInfo;
    
    PIO_STACK_LOCATION  irpStack = IoGetCurrentIrpStackLocation(Irp);


    DebugPrint((3, "PciDmaDpc \n"));

///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- START 
//
///////////////////////////////////////////////////////////////
#ifdef VENDORID_1000_DEVICEID_0004

    //
    // Check if the I/O failed.  If so, the I/O can be retried or completed 
    // with an error status at this point.  Also, we may want to write 
    // information to the event log about the error.  Don't forget to start 
    // the next I/O on failure.
    //

#endif
///////////////////////////////////////////////////////////////
//
// VENDOR_UNIQUE  -- Vendor unique code -- END
//
///////////////////////////////////////////////////////////////

    //
    // Given the current IRP, find the correct transfer info.  Since this 
    // driver handles only one IRP on the device at a time, the transfer 
    // info is the only one in the device extension.
    //

    ASSERT(Irp == transferInfo->Irp);
        
    //
    // On success, flush the adapter buffers.
    //

    IoFlushAdapterBuffers(deviceExtension->AdapterObject,
                          Irp->MdlAddress,
                          deviceExtension->MapRegisterBase,
                          transferInfo->CurrentVA,
                          transferInfo->ByteCount,
                          transferInfo->WriteToDevice
                          );
    
    //
    // Free the map registers.
    //
    
    IoFreeMapRegisters(deviceExtension->AdapterObject,
                       transferInfo->MapRegisterBase,
                       transferInfo->NumberOfMapRegisters
                       );                      
    
    //
    // For this sample, indicate success and set the transfer length to the 
    // length requested.  A real driver would set the length according to the
    // length of data actually transferred.
    //

    DebugPrint((2,
                "Completing IRP %8x \n",
                Irp
                ));
    
    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = transferInfo->ByteCount;

    //
    // Clear out the transfer info.
    //
    
    RtlZeroMemory(transferInfo, sizeof(TRANSFER_INFO));
    
    //
    // Try to start the next I/O packet, if any.
    //

    IoStartNextPacket(DeviceObject, FALSE);

    //
    // Choose an appropriate priority increment for IoCompleteRequest.  See
    // NTDDK.H for details.
    //

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

}   // PciDmaDpc


?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧美日韩一区二区| 看国产成人h片视频| 91精彩视频在线| 久久精品国产精品亚洲红杏| 一区精品在线播放| 另类欧美日韩国产在线| 日本一区二区三区国色天香 | 欧美一区二区三区四区五区| 国产精品一区二区久久精品爱涩 | 成人美女在线观看| 国内精品视频666| 欧美国产一区视频在线观看| 精品视频一区三区九区| 日韩精品一区二区三区视频| 亚洲午夜激情av| 日本电影亚洲天堂一区| 中文字幕一区二区三区视频| 欧美精品乱人伦久久久久久| 极品少妇一区二区三区精品视频| 午夜天堂影视香蕉久久| 欧美日韩aaaaa| 大美女一区二区三区| 日韩欧美在线影院| 日韩激情av在线| 欧美日韩精品高清| 亚洲大型综合色站| 91福利资源站| 亚洲影视资源网| 欧洲精品一区二区| 亚洲精品国产品国语在线app| 成人国产一区二区三区精品| 国产精品拍天天在线| 风间由美中文字幕在线看视频国产欧美| 日韩精品一区二区三区中文精品| 日韩国产欧美视频| 制服丝袜av成人在线看| 日本美女一区二区| 精品国产a毛片| 国产成人无遮挡在线视频| 久久精品视频在线看| 成人福利在线看| 亚洲女人****多毛耸耸8| 在线观看免费视频综合| 亚洲制服丝袜av| 91精品国产乱码久久蜜臀| 老司机精品视频在线| 久久久夜色精品亚洲| 99久久精品免费| 亚洲成人777| 欧美大片一区二区| 国产a久久麻豆| 亚洲综合激情小说| 欧美一区午夜视频在线观看| 国内精品久久久久影院一蜜桃| 久久久亚洲精华液精华液精华液| 丁香婷婷深情五月亚洲| 亚洲已满18点击进入久久| 日韩一区二区三区高清免费看看| 国内一区二区在线| 亚洲日本欧美天堂| 日韩欧美国产不卡| 不卡视频在线观看| 日本中文字幕一区| 国产精品国产三级国产aⅴ无密码| 欧美在线观看一区二区| 国产一区二区三区免费观看| 亚洲欧美日韩久久精品| 91精品国产乱码| 99久久精品一区| 国模娜娜一区二区三区| 亚洲欧洲国产专区| 精品国产欧美一区二区| 欧美在线一二三四区| 国产美女久久久久| 天堂午夜影视日韩欧美一区二区| 久久激情五月激情| 在线视频你懂得一区二区三区| 免费在线视频一区| 亚洲欧美日韩系列| 国产亚洲精品资源在线26u| 欧美日韩精品一区二区三区四区| 春色校园综合激情亚洲| 免费日韩伦理电影| 亚洲高清一区二区三区| 最新国产精品久久精品| 精品久久久久久久久久久久包黑料 | 久久精品夜色噜噜亚洲a∨| 成人av综合在线| 亚洲激情综合网| 欧美精品一区二区三区久久久| 国产激情一区二区三区四区| 伊人开心综合网| 亚洲精品在线免费播放| 国产精品一区免费在线观看| 日本视频在线一区| 亚洲色欲色欲www在线观看| 91麻豆精品国产91久久久久久 | 亚洲bt欧美bt精品777| 欧美日韩大陆在线| 91黄色激情网站| 国产风韵犹存在线视精品| 日韩精品欧美精品| 亚洲激情av在线| 欧美韩国日本综合| 日韩免费观看2025年上映的电影| 91丨porny丨蝌蚪视频| 久久69国产一区二区蜜臀| 亚洲图片一区二区| 亚洲色大成网站www久久九九| 欧美v亚洲v综合ⅴ国产v| 欧美日韩成人一区| 国产白丝网站精品污在线入口| 狠狠色2019综合网| 美女视频一区在线观看| 亚洲国产欧美日韩另类综合| 国产精品不卡在线| 中日韩av电影| 中文久久乱码一区二区| 日韩视频在线观看一区二区| 欧美色爱综合网| 色综合色综合色综合| 高清不卡一区二区| 成人网在线播放| 国产福利一区二区| hitomi一区二区三区精品| 极品销魂美女一区二区三区| 免费观看在线综合| 免费在线成人网| 欧美一区二区精品| 麻豆精品一二三| 国产凹凸在线观看一区二区| 精品中文字幕一区二区| 精品系列免费在线观看| 国产在线视视频有精品| 精品一区二区三区香蕉蜜桃| 日本中文在线一区| 久久97超碰国产精品超碰| 精油按摩中文字幕久久| 波多野洁衣一区| 色综合久久中文综合久久牛| 日本高清视频一区二区| 岛国精品在线观看| 国产精品正在播放| 福利91精品一区二区三区| 久久99精品久久久久久| 免费观看30秒视频久久| 青青青伊人色综合久久| 日韩一区欧美二区| 日本特黄久久久高潮| 日本亚洲一区二区| 一区二区三区四区在线播放| 国产视频一区不卡| 欧美日韩国产一级| 欧美高清dvd| 91成人在线免费观看| 91精品福利在线| 91黄色激情网站| 欧美成人猛片aaaaaaa| 国产精品乱码人人做人人爱| 国产肉丝袜一区二区| 蜜桃视频免费观看一区| 国产揄拍国内精品对白| 欧美成人福利视频| 精品在线免费观看| 欧洲一区二区三区在线| 欧亚一区二区三区| 欧美亚洲一区二区三区四区| 欧美日韩在线播放一区| 日韩欧美在线观看一区二区三区| 亚洲靠逼com| 国产欧美精品一区二区色综合朱莉| 在线成人小视频| 欧美精品一区二区三区蜜桃视频| 亚洲婷婷综合色高清在线| 视频一区二区中文字幕| 国产99精品在线观看| 717成人午夜免费福利电影| 国产亲近乱来精品视频| 午夜精品免费在线| 欧美无砖砖区免费| 亚洲欧美另类久久久精品| 奇米一区二区三区| 91蜜桃在线观看| 久久亚洲影视婷婷| 日韩国产精品久久| 91在线观看视频| 国产免费久久精品| 另类中文字幕网| 日韩一区二区三区视频| 亚洲精品日日夜夜| 成年人国产精品| 久久精品一区四区| 蜜臀av一级做a爰片久久| 成人国产精品免费网站| 亚洲国产精品二十页| 久久se精品一区二区| 色一情一伦一子一伦一区| 中文字幕在线观看一区| 国产一区二区在线免费观看| 欧美精品在线观看播放|