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

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

?? ide.c

?? 硬盤驅(qū)動(dòng)的例子
?? C
?? 第 1 頁(yè) / 共 4 頁(yè)
字號(hào):
            // check the controller status
            //
            if (controllerStatus & ERROR_STATUS) {

#if DBG
                DbgPrint("IdeDPC: Error for RESET_DRIVER_RECALIBRATION - controllerStatus %x\n",controllerStatus);
#endif

                goto RetryIrp;

            }

            //
            // if we have an irp, then we need to restart the packet
            //
#if DBG
            DbgPrint("IdeDPC: Recalibrating drive : IRP %x\n",irp); 
#endif

            //
            // If the disk operation was a verify then don't retry.
            //
            if ((devExt->IrpRetryCount < MAXIMUM_IRP_RETRY_COUNT) &&
                (ioStack->MajorFunction != IRP_MJ_DEVICE_CONTROL))  {

                devExt->PacketIsBeingRetried = TRUE;

                //
                // Let the disk catch its breath
                //
                KeStallExecutionProcessor(25);

                //
                // and let's try that again
                //
                IdeStartIo(deviceObject, irp);

            } else {

                //
                // We've retried too many times.  Finish the irp with 
                // failure and return.
                //
#if DBG
                DbgPrint( "IdeDPC: too many retries 1; will fail IRP\n");
#endif

                FinishIrp(devExt, STATUS_DISK_RECALIBRATE_FAILED);

            }

            //
            // clear the reset status and return
            //
            devExt->ControllerData->ResettingController = RESET_NOT_RESETTING;

            return;

    }

    //
    // We're not resetting
    //
    // Note that for READ and WRITE operations, if the operation did NOT
    // not complete, that fact will be caught later in the code and some
    // attempts at corrective action will take place.
    //
    if (devExt->OperationType == IRP_MJ_READ)  {

        PVOID BufferToReadTo;
        BOOLEAN CheckDrq = FALSE;

#if DBG
        DbgPrint("IdeDPC: IRP_MJ_READ - RemainingTransferLength %x\n",
                        devExt->RemainingTransferLength);
#endif

        //
        // Make sure that since the IO is complete, the DRQ is low
        // So, first let's wait until the controller is ready.
        //
        ntStatus = STATUS_SUCCESS;

        //
        // If the controller is busy, wait for it to become ready...
        //
        if (READ_PORT_UCHAR(controllerData->ControllerAddress + STATUS_REGISTER) &
                        BUSY_STATUS)  {

#if DBG
            DbgPrint("Extra wait -- READ\n");
#endif

            ntStatus = IdeWaitControllerReady(controllerData, 10, 5000);
        }

        //
        // Did the controller become ready?
        //
        if (NT_SUCCESS(ntStatus))  {

            //
            // We're not in a data request phase, right?
            //
            if (READ_PORT_UCHAR(
                    controllerData->ControllerAddress + STATUS_REGISTER) &
                                    DATA_REQUEST_STATUS) {

                //
                // Data request is ASSERTED?  We must have a problem...
                //
#if DBG
                DbgPrint("IdeDPC: READ data overrun - controller status %x\n",
                                        controllerStatus);
#endif

                controllerStatus |= ERROR_STATUS;

                goto RetryIrp;
            }

        } else {

            //
            // Error reading the controller.  Bummer city.
            //
#if DBG
            DbgPrint("IdeDPC: IdeWaitControllerReady failure during READ\n");
#endif

            controllerStatus |= ERROR_STATUS;

            goto RetryIrp;
        }

    } else  {

        //
        // The operation wasn't a READ, so it BETTER be a WRITE
        //
        ASSERT(devExt->OperationType == IRP_MJ_WRITE);

        //
        // Make sure the controller is happy
        //
#if DBG
        DbgPrint("IdeDPC: IRP_MJ_WRITE - RemainingTransferLength %x\n",
                    devExt->RemainingTransferLength);
#endif


#if DBG
        DbgPrint("Extra wait -- WRITE\n");
#endif

        //
        // Make sure that since the IO is complete, the DRQ is low
        // So, first let's wait until the controller is ready.
        //
        ntStatus = STATUS_SUCCESS;

        //
        // If the controller is busy, wait for it to become ready...
        //
        if (READ_PORT_UCHAR(controllerData->ControllerAddress + STATUS_REGISTER) &
                        BUSY_STATUS)  {

#if DBG
            DbgPrint("Extra wait -- WRITE\n");
#endif

            ntStatus = IdeWaitControllerReady(controllerData, 10, 5000);
        }

        //
        // Did the controller become ready?
        //
        if (NT_SUCCESS(ntStatus))  {

            //
            // Is DRQ low?
            //
            if (READ_PORT_UCHAR(controllerData->ControllerAddress + STATUS_REGISTER) &
                                        DATA_REQUEST_STATUS) {

                //
                // not low => we must have a problem
                //

#if DBG
                DbgPrint("IdeDPC: WRITE data overrun - controller status %x\n",
                            controllerStatus);
#endif

                    controllerStatus |= ERROR_STATUS;

                goto RetryIrp;

            }

        } else {


            //
            // error reading the controller.  Bummer city.
            //
#if DBG
            DbgPrint("IdeDPC: IdeWaitControllerReady failure during WRITE\n");
#endif

            controllerStatus |= ERROR_STATUS;

            goto RetryIrp;

        }

    }



    //
    // If there was a correctable error, let us know, but we can continue.
    //
    if (controllerStatus & CORRECTED_ERROR_STATUS) {

#if DBG
        DbgPrint("IdeDPC: CORRECTABLE ERROR - Continuing Operation\n");
#endif

    }

RetryIrp:

    //
    // does the controller have a problem?
    //
    if (controllerStatus & ERROR_STATUS) {

        //
        // inform us that we're going to try and recover this irp
        //
#if DBG
        DbgPrint("IdeDPC: IRP recovery: Irp %x - retry %d more times\n",
                    irp,
                    MAXIMUM_IRP_RETRY_COUNT - devExt->IrpRetryCount);
#endif

        //
        // Check if we're exceeded the IRP retry count
        //
        if (devExt->IrpRetryCount < MAXIMUM_IRP_RETRY_COUNT)  {

            //
            // We haven't exceeded our count, so let's reset the disk.
            // Since this will cause an interrupt, we can't do
            // anything more in the DPC, so we just return
            //
            KeSynchronizeExecution(controllerData->InterruptObject,
                            ResetDisk,
                            devExt);

            return;

        } else {

            //
            // Too many retries, so fail the IRP
            //
#if DBG
            DbgPrint("IdeDPC: Disk Controller still fails after %d retries - FAILING operation\n",MAXIMUM_IRP_RETRY_COUNT);
#endif

            returnStatus = STATUS_DISK_OPERATION_FAILED;

        }

    }

    //
    // Now, test for the success/failure of the operation.
    //
    if (NT_SUCCESS(returnStatus) && devExt->RemainingTransferLength == 0) {

        //
        // Success (complete transfer of data).  Let the requestor know.
        //
        returnStatus = STATUS_SUCCESS;

        irp->IoStatus.Information = ioStack->Parameters.Read.Length;

    } else {

        //
        // An error.  Bummer. Oh well...
        //
        // I'm thinkin' we're not big on error recovery in this driver...
        //
        irp->IoStatus.Status =  STATUS_DISK_OPERATION_FAILED;

        irp->IoStatus.Information = 0;

#if DBG
        DbgPrint("IdeDPC: Irp %x fails, status %x info %x\n",
                    irp->IoStatus.Information);
#endif

    }

    //
    // Complete this IRP and call IoStartNextPacketByKey
    //
    FinishIrp(devExt, returnStatus);

}



///////////////////////////////////////////////////////////////////////////////
//
//  FinishIrp
//
//    This routine will request to start the next transaction and
//    complete the current IRP.
//
//  INPUTS:
//
//    devExt          - disk information
//    completionStatus  - status to complete the IRP with
//
//  OUTPUTS:
//  
//    None.
//
//  RETURNS:
//
//    None
//
//      IRQL:
//
//    IRQL_DISPATCH_LEVEL
//
//  NOTES:
//
///////////////////////////////////////////////////////////////////////////////
static VOID
FinishIrp(IN PIDE_DEV_EXT devExt,
          IN NTSTATUS NtStatus)
{
    PIRP irp = devExt->DeviceObject->CurrentIrp;

    //
    // For completing read requests we need to flush the I/O buffers.
    //
    if (IoGetCurrentIrpStackLocation(irp)->MajorFunction == IRP_MJ_READ) {

        KeFlushIoBuffers(irp->MdlAddress, TRUE, FALSE);
    }

    //
    // Start the next packet by keep... Next sector first scan to try to keep
    // the heads moving forward!  Such an optimization...
    //
    IoStartNextPacketByKey(devExt->DeviceObject,
                            FALSE,
                            devExt->FirstSectorOfRequest);

    irp->IoStatus.Status = NtStatus;

#if DBG
    DbgPrint("FinishIrp: Finishing Request of Irp: %x\n", irp); 
#endif

    IoCompleteRequest(irp, IO_DISK_INCREMENT);
}






///////////////////////////////////////////////////////////////////////////////
//
//  ResetDisk
//
//    This routine will reset the disk
//
//  INPUTS:
//
//    Context           - really, the devExt
//
//  OUTPUTS:
//  
//    None.
//
//  RETURNS:
//
//    FALSE, every time, all the time
//
//      IRQL:
//
//    DIRQL
//
//  NOTES:
//
//    Has to be called at DIRQL to access the registers and protect against
//    other outstanding interrupts generated by outstanding requests
//
///////////////////////////////////////////////////////////////////////////////
static BOOLEAN
ResetDisk(PVOID Context)
{

    PIDE_DEV_EXT devExt = Context;
    PCONTROLLER_DATA controllerData = devExt->ControllerData;

    //
    // Let it Be Known that we are resetting the controller.
    //

#if DBG
    DbgPrint("ResetDisk: Starting reset with failing extension: %x\n",devExt);
#endif

    controllerData->ResettingController = RESET_DRIVE_SET;

    //
    // Reset the controller, since its state isn't what we expect.
    // Wait up to 2 seconds between writes to the control port.
    // Normally we don't like to wait at DIRQL, but this won't generate
    // an interrupt and 10us isn't so bad.
    //

    WRITE_PORT_UCHAR(controllerData->ControlPortAddress,
                RESET_CONTROLLER);

    IdeWaitControllerBusy(controllerData->ControllerAddress + STATUS_REGISTER,
                    20,
                    75000);

    WRITE_PORT_UCHAR(controllerData->ControlPortAddress,
                    (UCHAR)(ENABLE_INTERRUPTS | controllerData->ControlFlags));

    //
    // Every controller reset must be followed by setting the drive
    // parameters of all attached drives.  This DOES cause an
    // interrupt.
    //
    controllerData->InterruptRequiresDpc = TRUE;

    //
    // Before we write to the controller, wait until we're sure it's
    // not still busy setting itself up.  We don't like waiting here,
    // but there's no interrupt to wait on, the wait should be very
    // short, and this code is only executed if the hardware gets
    // messed up.  If it's not ready after 3 seconds, just blast ahead...
    // the operation won't work, but it will time out and be handled
    // later.  Note that we ordinarily don't want to wait this long
    // in a driver, but we don't wait longer than we have to and we
    // may just have to.  This isn't an ordinary event.
    //
    (VOID) IdeWaitControllerReady(controllerData, 20, 150000);

    WRITE_PORT_UCHAR(controllerData->ControllerAddress + DRIVE_HEAD_REGISTER,
        (UCHAR)(devExt->DeviceUnit | (devExt->TracksPerCylinder - 1)));

    WRITE_PORT_UCHAR((controllerData->ControllerAddress + SECTOR_COUNT_REGISTER),
        (UCHAR)(devExt->SectorsPerTrack));

    WRITE_PORT_UCHAR(controllerData->ControllerAddress + COMMAND_REGISTER,
        SET_DRIVE_PARAMETERS_COMMAND);

    //
    // When the interrupt comes, the DPC will see ResettingController
    // and restarting any packets that were in progress.
    //
    return(FALSE);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区久久久久| 国产九色精品成人porny| 亚洲精品一区二区三区99| 99re这里只有精品首页| 视频在线观看91| 成人欧美一区二区三区白人| 欧美一区二区三区免费在线看| 9久草视频在线视频精品| 蜜桃久久久久久| 亚洲国产精品久久一线不卡| 中国色在线观看另类| 日韩欧美国产精品| 欧美日韩午夜在线| 色综合久久精品| 成人动漫一区二区| 国产激情精品久久久第一区二区 | 国产a级毛片一区| 日本伊人色综合网| 一区二区三区精品视频| 国产精品久久福利| 国产亚洲精品福利| 精品处破学生在线二十三| 欧美日韩电影一区| 欧美日韩你懂的| 欧美在线一区二区三区| 91在线观看免费视频| 国产福利精品导航| 国产乱码精品一区二区三| 免费在线看一区| 日韩精品亚洲专区| 午夜久久久影院| 天天操天天干天天综合网| 一区二区三区中文在线观看| 国产精品青草久久| 国产精品国产三级国产普通话三级 | 亚洲一区精品在线| 一区二区免费在线| 亚洲成va人在线观看| 一区二区三区小说| 一区二区三区高清在线| ...av二区三区久久精品| 国产精品进线69影院| 亚洲国产精品成人综合色在线婷婷| 久久亚洲私人国产精品va媚药| 日韩欧美久久久| 精品久久久久一区| 国产欧美精品在线观看| 中文字幕第一区第二区| 成人欧美一区二区三区在线播放| 亚洲少妇中出一区| 一区二区三区在线观看国产| 亚洲国产精品尤物yw在线观看| 亚洲不卡在线观看| 美女视频一区二区| 国产一区不卡精品| av电影在线观看不卡| 一本久道中文字幕精品亚洲嫩| 日本韩国一区二区三区| 欧美午夜精品理论片a级按摩| 欧美高清激情brazzers| 日韩丝袜情趣美女图片| 久久网站最新地址| 国产精品拍天天在线| 有码一区二区三区| 奇米色一区二区三区四区| 国产一级精品在线| 91福利小视频| 日韩一区二区三区免费观看| 国产女主播一区| 一级做a爱片久久| 蜜桃视频第一区免费观看| 成人午夜激情在线| 欧美性大战xxxxx久久久| 日韩欧美国产一区在线观看| 亚洲国产精品成人久久综合一区 | 日韩精品福利网| 国产一区不卡在线| 欧美影院一区二区三区| 精品久久久久久久久久久久包黑料| 久久精品欧美日韩| 亚洲高清三级视频| 国产精品一区二区三区99| 91国产福利在线| 欧美精品一区二区三区视频| 亚洲视频一二三| 久久精品国产在热久久| av在线播放不卡| 欧美tk—视频vk| 亚洲乱码国产乱码精品精可以看| 美国一区二区三区在线播放| 91婷婷韩国欧美一区二区| 欧美一区二区三区在线观看视频 | 亚洲女与黑人做爰| 久久国产婷婷国产香蕉| 99r国产精品| 久久久激情视频| 日韩精品五月天| 91一区二区三区在线播放| 精品久久久久久亚洲综合网 | 久久亚洲一区二区三区四区| 一级中文字幕一区二区| 成人国产精品免费观看| 日韩精品综合一本久道在线视频| 一区二区三区国产| 成人福利电影精品一区二区在线观看| 欧美一区二区视频免费观看| 一区二区成人在线| a美女胸又www黄视频久久| 日韩精品在线一区| 亚洲高清不卡在线| 91麻豆免费视频| 欧美激情一区二区| 国产一区在线精品| 制服丝袜亚洲色图| 亚洲电影在线免费观看| 99国产麻豆精品| 国产精品天天看| 国产一区不卡精品| 久久综合久久99| 久久99精品一区二区三区三区| 欧美丰满少妇xxxxx高潮对白 | 亚洲欧洲一区二区在线播放| 国产精品夜夜嗨| 久久亚洲春色中文字幕久久久| 麻豆成人91精品二区三区| 欧美久久久一区| 视频一区二区不卡| 欧美精品自拍偷拍| 日韩avvvv在线播放| 欧美精品亚洲一区二区在线播放| 亚洲综合免费观看高清完整版| 不卡的av中国片| 自拍偷自拍亚洲精品播放| av在线不卡网| 一区二区三区欧美日韩| 91久久精品一区二区三| 亚洲欧美一区二区三区极速播放| 成人免费福利片| 亚洲天堂精品视频| 在线观看视频一区二区| 亚洲高清免费一级二级三级| 欧美日韩小视频| 免费高清视频精品| 日韩欧美国产电影| 国产不卡视频在线播放| 中文字幕不卡一区| 色哟哟在线观看一区二区三区| 亚洲综合区在线| 欧美妇女性影城| 国产在线精品一区二区不卡了 | 亚洲国产一区二区视频| 欧美日韩成人在线| 毛片不卡一区二区| 久久久亚洲午夜电影| 成人av中文字幕| 亚洲综合激情另类小说区| 欧美另类变人与禽xxxxx| 免费高清在线一区| 国产精品女主播av| 精品视频色一区| 久久国产剧场电影| 欧美国产日本韩| 欧美三级乱人伦电影| 九九**精品视频免费播放| 国产视频不卡一区| 欧美唯美清纯偷拍| 久久99精品网久久| 亚洲人成伊人成综合网小说| 欧美三级午夜理伦三级中视频| 免费的成人av| 成人欧美一区二区三区| 91精品在线免费观看| 国产激情精品久久久第一区二区| 亚洲乱码一区二区三区在线观看| 91精品国产欧美一区二区成人| 国产成人在线观看| 亚洲狠狠爱一区二区三区| 久久这里都是精品| 在线观看欧美日本| 国产露脸91国语对白| 亚洲免费观看高清| 久久免费的精品国产v∧| 欧美综合欧美视频| 国产91在线观看| 日韩精彩视频在线观看| 中文字幕中文字幕一区二区| 在线综合视频播放| 国产白丝网站精品污在线入口| 亚洲成人av一区二区| 中文字幕 久热精品 视频在线| 777久久久精品| 91精品欧美久久久久久动漫 | 91精品国产丝袜白色高跟鞋| 国产99久久久国产精品潘金| 亚洲成av人片| 国产精品电影一区二区| 日韩欧美自拍偷拍| 欧美日韩久久一区| 成人app下载| 国产精品一区久久久久|