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

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

?? isr_dpc.c

?? PCI硬件的驅動程序范例
?? C
?? 第 1 頁 / 共 2 頁
字號:
        //
        // Get the address of the in-progress request
        //
        irp = devExt->CurrentWriteIrp;

        //
        // See if there's an entry on the Write queue that needs to be
        // completed or continued.
        //
        if (irp)  {
            
            //
            // There is an IRP currently in progress.
            //
            baseVa = (PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress)+
                                    devExt->WriteStartingOffset;

            IoFlushAdapterBuffers(devExt->WriteAdapter,
                                 irp->MdlAddress,
                                 devExt->WriteMapRegBase,
                                 baseVa,
                                 devExt->WriteSoFar-devExt->WriteStartingOffset,
                                 TRUE);     // writeToDevice == TRUE

            //
            // Tell the HAL the map registers we were using are free
            //
            IoFreeMapRegisters(devExt->WriteAdapter,
                               devExt->WriteMapRegBase,
                               devExt->MapRegsThisWrite);

            //
            // See if there's more of the user's buffer left for us to DMA.
            // Be sure the request was not cancelled whilst in progress.
            //
            if( (devExt->WriteTotalLength - devExt->WriteSoFar) &&
                (!irp->Cancel) )  {
#if DBG
                DbgPrint("---CONTINUING:\n");
#endif
                //
                // The user buffer has NOT been completely DMA'ed.
                // How many map regs can we use this time?
                //
                mapRegsNeeded = 
                    ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(irp->MdlAddress)+
                                 devExt->WriteSoFar,
                                 devExt->WriteTotalLength-devExt->WriteSoFar);
                    
                devExt->MapRegsThisWrite = ((mapRegsNeeded > devExt->WriteMapRegsGot) ? 
                                          devExt->WriteMapRegsGot : mapRegsNeeded);

#if DBG
                DbgPrint("Continuing: %d. map regs this xfer\n",
                        devExt->MapRegsThisWrite);
#endif

                IoAllocateAdapterChannel(devExt->WriteAdapter,
                                         DeviceObject, 
                                         devExt->MapRegsThisWrite,
                                         OsrAdapterControlWrite,
                                         irp);
            } else  {

                //
                // We're going to complete this request
                //

                //
                // Information field contains number of bytes written
                //
                irp->IoStatus.Information = devExt->WriteTotalLength;

                // and all requests are completed with success...
                //
                irp->IoStatus.Status = STATUS_SUCCESS;


                //
                //
                // ...unless the in-progress I/O operation is cancelled.
                //
                if(irp->Cancel == TRUE)  {

#if DBG
                    DbgPrint("---CANCEL flag set in WRITE IRP to be completed!\n");
#endif
                    irp->IoStatus.Status = STATUS_CANCELLED;
                    irp->IoStatus.Information = 0;

                }

#if DBG
                DbgPrint("---Completing Write IRP 0x%0x\n",irp);
#endif
                //
                // Complete the request now
                //
                IoCompleteRequest(irp, IO_NO_INCREMENT);    

                //
                // N.B.  We're STILL HOLDING the write queue lock.
                //

                //
                // No write in progress right now
                //
                devExt->CurrentWriteIrp = NULL;

                //
                // Keep removing entries until we start one.
                //
                while ( !devExt->CurrentWriteIrp &&
                        !IsListEmpty(&devExt->WriteQueue) ) {

                    entry = RemoveHeadList(&devExt->WriteQueue);

                    irp =  CONTAINING_RECORD(entry, IRP, Tail.Overlay.ListEntry);
#if DBG
                    DbgPrint("---IRP removed from queue in DpcForIsr = 0x%0x\n",irp);
#endif
                    //
                    // If this IRP is cancelled, cancel it now, without
                    // initiating it on the device
                    //
                    if (irp->Cancel) {
#if DBG
                        DbgPrint("---CANCEL flag set in IRP removed from queue 0x%0x\n",irp);
#endif
                        irp->IoStatus.Status = STATUS_CANCELLED;
                        irp->IoStatus.Information = 0;

                        //
                        // Complete the request now
                        //
                        IoCompleteRequest(irp, IO_NO_INCREMENT);    

                    } else {

                        //
                        // Since we do not cancel in-progress requests
                        // on this device, we will reset the cancel
                        // routine in the IRP to NULL.
                        //
                        IoSetCancelRoutine(irp, NULL);

                        //
                        // Make this IRP the current write IRP, and
                        // start the request on the device.  This routine
                        // sets devExt->CurrentWriteIrp
                        //
                        OsrStartWriteIrp(DeviceObject, irp);                
                    }

                }   // while (!devExt->CurrentWriteIrp && 
                    //        !IsListEmpty(devExt->WriteQueue) )
            }
        }                              

        //
        // Drop the lock
        //
        KeReleaseSpinLockFromDpcLevel(&devExt->WriteQueueLock);

    }

    //
    // Read Complete??
    //
    if( KeSynchronizeExecution(devExt->InterruptObject,
                                ReadIsDone,
                                devExt) )  {

#if DBG
        DbgPrint("---Read Done\n");
#endif

        //
        // Get the read queue lock.  We'll hold it throughout the entire
        // process.
        //
        KeAcquireSpinLockAtDpcLevel(&devExt->ReadQueueLock);

        //
        // Get the address of the in-progress request
        //
        irp = devExt->CurrentReadIrp;

        //
        // See if there's an entry on the Read queue that needs to be
        // completed or continued.
        //
        if (irp)  {
            
            //
            // There is an IRP currently in progress.
            //
            baseVa = (PUCHAR)MmGetMdlVirtualAddress(irp->MdlAddress)+
                                    devExt->ReadStartingOffset;

            IoFlushAdapterBuffers(devExt->ReadAdapter,
                                 irp->MdlAddress,
                                 devExt->ReadMapRegBase,
                                 baseVa,
                                 devExt->ReadSoFar-devExt->ReadStartingOffset,
                                 FALSE);     // read == FALSE

            //
            // Tell the HAL the map registers we were using are free
            //
            IoFreeMapRegisters(devExt->ReadAdapter,
                               devExt->ReadMapRegBase,
                               devExt->MapRegsThisRead);

            //
            // See if there's more of the user's buffer left for us to DMA.
            // Be sure the request was not cancelled whilst in progress.
            //
            if( (devExt->ReadTotalLength - devExt->ReadSoFar) &&
                (!irp->Cancel) )  {
#if DBG
                DbgPrint("---CONTINUING:\n");
#endif
                //
                // The user buffer has NOT been completely DMA'ed.
                // How many map regs can we use this time?
                //
                mapRegsNeeded = 
                    ADDRESS_AND_SIZE_TO_SPAN_PAGES(MmGetMdlVirtualAddress(irp->MdlAddress)+
                                 devExt->ReadSoFar,
                                 devExt->ReadTotalLength-devExt->ReadSoFar);
                    
                devExt->MapRegsThisRead = ((mapRegsNeeded > devExt->ReadMapRegsGot) ? 
                                          devExt->ReadMapRegsGot : mapRegsNeeded);

#if DBG
                DbgPrint("Continuing: %d. map regs this xfer\n",
                        devExt->MapRegsThisRead);
#endif

                IoAllocateAdapterChannel(devExt->ReadAdapter,
                                         DeviceObject, 
                                         devExt->MapRegsThisRead,
                                         OsrAdapterControlRead,
                                         irp);
            } else  {

                //
                // We're going to complete this request
                //

                //
                // Information field contains number of bytes written
                //
                irp->IoStatus.Information = devExt->ReadTotalLength;

                // and all requests are completed with success...
                //
                irp->IoStatus.Status = STATUS_SUCCESS;


                //
                //
                // ...unless the in-progress I/O operation is cancelled.
                //
                if(irp->Cancel == TRUE)  {

#if DBG
                    DbgPrint("---CANCEL flag set in READ IRP to be completed!\n");
#endif
                    irp->IoStatus.Status = STATUS_CANCELLED;
                    irp->IoStatus.Information = 0;

                }

#if DBG
                DbgPrint("---Completing Read IRP 0x%0x\n",irp);
#endif
                //
                // Complete the request now
                //
                IoCompleteRequest(irp, IO_NO_INCREMENT);    

                //
                // N.B.  We're STILL HOLDING the read queue lock.
                //

                //
                // No read in progress right now
                //
                devExt->CurrentReadIrp = NULL;

                //
                // Keep removing entries until we start one.
                //
                while ( !devExt->CurrentReadIrp &&
                        !IsListEmpty(&devExt->ReadQueue) ) {

                    entry = RemoveHeadList(&devExt->ReadQueue);

                    irp =  CONTAINING_RECORD(entry, IRP, Tail.Overlay.ListEntry);
#if DBG
                    DbgPrint("---IRP removed from queue in DpcForIsr = 0x%0x\n",irp);
#endif
                    //
                    // If this IRP is cancelled, cancel it now, without
                    // initiating it on the device
                    //
                    if (irp->Cancel) {
#if DBG
                        DbgPrint("---CANCEL flag set in IRP removed from queue 0x%0x\n",irp);
#endif
                        irp->IoStatus.Status = STATUS_CANCELLED;
                        irp->IoStatus.Information = 0;

                        //
                        // Complete the request now
                        //
                        IoCompleteRequest(irp, IO_NO_INCREMENT);    

                    } else {

                        //
                        // Since we do not cancel in-progress requests
                        // on this device, we will reset the cancel
                        // routine in the IRP to NULL.
                        //
                        IoSetCancelRoutine(irp, NULL);

                        //
                        // Make this IRP the current read IRP, and
                        // start the request on the device.  This routine
                        // sets devExt->CurrentReadIrp
                        //
                        OsrStartReadIrp(DeviceObject, irp);                
                    }

                }   // while (!devExt->CurrentReadIrp && 
                    //        !IsListEmpty(devExt->ReadQueue) )
            }
        }                              

        //
        // Drop the read queue lock
        //
        KeReleaseSpinLockFromDpcLevel(&devExt->ReadQueueLock);
    }
    
    //
    // We're outa here...
    //
    return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区三区在线观看国产| 亚洲精品视频在线| 国产欧美日韩激情| 视频一区二区国产| 99久久er热在这里只有精品15| 欧美日本在线一区| 亚洲精品视频在线看| 国产成+人+日韩+欧美+亚洲| 91精品国产综合久久国产大片| 国产精品高清亚洲| 国产精品白丝av| 日韩一区二区免费视频| 亚洲成人av福利| 色婷婷亚洲综合| 中文字幕一区免费在线观看| 国内精品国产成人| 精品国产91九色蝌蚪| 婷婷一区二区三区| 欧美日韩高清在线播放| 亚洲自拍另类综合| 91丝袜美腿高跟国产极品老师| 精品88久久久久88久久久| 奇米在线7777在线精品| 欧美精品99久久久**| 婷婷丁香激情综合| 8x8x8国产精品| 午夜久久久久久久久久一区二区| 欧美性大战xxxxx久久久| 亚洲六月丁香色婷婷综合久久| 成人综合在线视频| 中文字幕一区二区三区视频| 成人免费视频视频| 国产精品久久久久婷婷二区次| 国产成人福利片| 欧美高清在线精品一区| 不卡的电视剧免费网站有什么| 中文字幕第一页久久| 国产精品主播直播| 国产精品国产三级国产有无不卡| 国产不卡一区视频| 国产精品三级电影| 色婷婷久久综合| 亚洲成av人片在线观看无码| 777色狠狠一区二区三区| 麻豆一区二区三| 久久亚洲精华国产精华液 | 国产精品视频在线看| 成人免费看黄yyy456| 国产精品美女久久久久久| 91亚洲午夜精品久久久久久| 一区二区三区欧美视频| 7777精品伊人久久久大香线蕉 | 欧美tk—视频vk| 国产精品18久久久久久vr| 中文字幕国产精品一区二区| 色老汉av一区二区三区| 日韩在线一区二区| 久久久久一区二区三区四区| 91捆绑美女网站| 日韩高清一级片| 欧美国产欧美综合| 欧美性xxxxxx少妇| 久久国产乱子精品免费女| 中文字幕国产一区| 欧美日韩国产高清一区二区三区 | 波多野结衣精品在线| 一区二区三区在线播| 日韩一二三四区| 成人18精品视频| 午夜激情综合网| 国产精品久久久久影院亚瑟 | 首页国产丝袜综合| 2024国产精品| 在线观看不卡一区| 国产精品一区二区在线观看网站| 亚洲精品综合在线| 欧美精品一区二区三区蜜桃 | 国产无遮挡一区二区三区毛片日本| 91丨九色丨黑人外教| 精品一区二区三区久久久| 一区二区三区av电影| 精品日韩一区二区三区| 色婷婷国产精品综合在线观看| 蜜桃精品视频在线观看| 一区二区三区高清在线| 欧美高清在线精品一区| 日韩午夜电影在线观看| 91社区在线播放| 国产成人av一区二区三区在线观看| 日韩在线一二三区| 亚洲国产综合人成综合网站| 亚洲国产精品精华液ab| 日韩午夜激情免费电影| 欧美三级一区二区| 一本久久a久久精品亚洲| 国产91精品一区二区麻豆亚洲| 日本最新不卡在线| 午夜在线电影亚洲一区| 亚洲卡通欧美制服中文| 中文字幕在线不卡一区| 久久蜜桃av一区二区天堂| 欧美一级日韩一级| 欧美精品在线一区二区| 中文字幕一区二区三区在线不卡| 欧美精品aⅴ在线视频| 色婷婷亚洲婷婷| 欧美综合天天夜夜久久| 91久久线看在观草草青青| 91免费版在线看| 91麻豆国产福利在线观看| 成人国产一区二区三区精品| 国产精品18久久久久久久久 | 国产亚洲成年网址在线观看| 精品av综合导航| 精品成人佐山爱一区二区| 欧美电影免费观看高清完整版 | 欧美在线999| 欧美自拍偷拍一区| 精品视频色一区| 欧美性生活大片视频| 欧美在线观看视频一区二区三区| 91黄视频在线| 欧美日韩1区2区| 日韩欧美国产精品| 久久久久久久电影| 国产精品九色蝌蚪自拍| 一个色综合网站| 日韩精品电影在线| 久久成人综合网| 成人黄色av网站在线| 色婷婷av一区二区三区之一色屋| 欧美日韩国产影片| 日韩免费一区二区三区在线播放| 久久久久久影视| 自拍偷拍国产精品| 日韩电影网1区2区| 91精品欧美一区二区三区综合在| 7777精品伊人久久久大香线蕉最新版 | 国产99久久精品| 91蝌蚪porny九色| 欧美一区二区在线免费观看| 久久久电影一区二区三区| 国产精品视频一二三区| 亚洲国产综合人成综合网站| 久久99国产精品免费网站| 国产a区久久久| 欧美日韩精品久久久| 精品国产乱码久久久久久图片| 1000精品久久久久久久久| 亚洲丰满少妇videoshd| 国产成人福利片| 欧美午夜片在线看| 国产免费成人在线视频| 亚洲一区在线看| 成人综合在线观看| 555www色欧美视频| 国产精品福利一区二区三区| 香蕉久久一区二区不卡无毒影院| 国产成人自拍网| 91精品国产欧美一区二区18 | jlzzjlzz国产精品久久| 91精品国产免费久久综合| 成人欧美一区二区三区| 久久精品国产在热久久| 91丨porny丨蝌蚪视频| 久久综合色8888| 天堂成人国产精品一区| 99re热这里只有精品免费视频 | 国产精品水嫩水嫩| 久久精品国产秦先生| 在线影视一区二区三区| 国产三级欧美三级日产三级99 | 大胆欧美人体老妇| 日韩亚洲电影在线| 亚洲午夜精品网| 92国产精品观看| 亚洲国产精华液网站w| 久久66热re国产| 欧美日本免费一区二区三区| 亚洲精品v日韩精品| 成人av网址在线观看| 天堂一区二区在线免费观看| 91热门视频在线观看| 一区免费观看视频| 成人午夜免费电影| 久久久亚洲国产美女国产盗摄| 男人的天堂亚洲一区| 欧美日韩的一区二区| 亚洲精品v日韩精品| 色狠狠av一区二区三区| 国产精品久久夜| 99久久综合精品| 亚洲欧美日本在线| hitomi一区二区三区精品| 国产精品二三区| 国产福利一区二区三区视频| 国产亚洲女人久久久久毛片| 国产伦精品一区二区三区免费 | 在线播放中文一区| 亚洲gay无套男同|