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

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

?? isopwr.c

?? 嵌入式系統的USB驅動(S3C2410)
?? C
?? 第 1 頁 / 共 3 頁
字號:

Return Value:

    The function value is the final status from the operation.

--*/
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PDEVICE_EXTENSION deviceExtension;
    PIRP pIrp = NULL;

    deviceExtension =  DeviceObject->DeviceExtension;

    // This should have been reset in completion routine
    ISOUSB_ASSERT( !deviceExtension->SelfPowerIrp );

    if (  deviceExtension->CurrentDevicePowerState ==  PowerState.DeviceState )
        return STATUS_SUCCESS;  // nothing to do

    ISOUSB_KdPrint( DBGLVL_HIGH,("Enter IsoUsb_SelfRequestPowerIrp() will request power irp to state %s\n",
        ISOUSB_StringForDevState( PowerState.DeviceState )));

    IsoUsb_IncrementIoCount(DeviceObject);

	// flag we're handling a self-generated power irp
    deviceExtension->SelfPowerIrp = TRUE;

	// actually request the Irp
    ntStatus = PoRequestPowerIrp(deviceExtension->PhysicalDeviceObject, 
                         IRP_MN_SET_POWER,
                         PowerState,
                         IsoUsb_PoSelfRequestCompletion,
                         DeviceObject,
                         NULL);


    if  ( ntStatus == STATUS_PENDING ) { 
        // status pending is the return code we wanted

        // We only need to wait for completion if we're powering up
        if ( (ULONG) PowerState.DeviceState < deviceExtension->PowerDownLevel ) {

            NTSTATUS waitStatus;

            waitStatus = KeWaitForSingleObject(
                           &deviceExtension->SelfRequestedPowerIrpEvent,
                           Suspended,
                           KernelMode,
                           FALSE,
                           NULL);

        }

        ntStatus = STATUS_SUCCESS;

        deviceExtension->SelfPowerIrp = FALSE;

        ISOUSB_KdPrint( DBGLVL_HIGH, ("IsoUsb_SelfRequestPowerIrp() SUCCESS\n    IRP 0x%x to state %s\n",
            pIrp, ISOUSB_StringForDevState(PowerState.DeviceState) ));


    }
    else {
        // The return status was not STATUS_PENDING; any other codes must be considered in error here;
        //  i.e., it is not possible to get a STATUS_SUCCESS  or any other non-error return from this call;
        ISOUSB_KdPrint( DBGLVL_HIGH, ("IsoUsb_SelfRequestPowerIrp() to state %s FAILED, status = 0x%x\n",
            ISOUSB_StringForDevState( PowerState.DeviceState ),ntStatus));
    }

    return ntStatus;
}



NTSTATUS
IsoUsb_PoSelfRequestCompletion(
    IN PDEVICE_OBJECT       DeviceObject,
    IN UCHAR                MinorFunction,
    IN POWER_STATE          PowerState,
    IN PVOID                Context,
    IN PIO_STATUS_BLOCK     IoStatus
    )
/*++

Routine Description:

    This routine is called when the driver completes a self-originated power IRP 
	that was generated by a call to IsoUsb_SelfSuspendOrActivate().
    We power down whenever the last pipe is closed and power up when the first pipe is opened.

    For power-up , we set an event in our FDO extension to signal this IRP done
    so the power request can be treated as a synchronous call.
    We need to know the device is powered up before opening the first pipe, for example.
    For power-down, we do not set the event, as no caller waits for powerdown complete.

Arguments:

    DeviceObject - Pointer to the device object for the class device. ( Physical Device Object )

    Context - Driver defined context, in this case our FDO ( functional device object )

Return Value:

    The function value is the final status from the operation.

--*/
{
    PDEVICE_OBJECT deviceObject = Context;
    PDEVICE_EXTENSION deviceExtension = deviceObject->DeviceExtension;
    NTSTATUS ntStatus = IoStatus->Status;

    // we should not be in the midst of handling a system-generated power irp
    ISOUSB_ASSERT( NULL == deviceExtension->PowerIrp );

    // We only need to set the event if we're powering up;
    // No caller waits on power down complete
    if ( (ULONG) PowerState.DeviceState < deviceExtension->PowerDownLevel ) {

        // Trigger Self-requested power irp completed event;
        //  The caller is waiting for completion
        KeSetEvent(&deviceExtension->SelfRequestedPowerIrpEvent, 1, FALSE);
    }

    IsoUsb_DecrementIoCount(deviceObject);

    ISOUSB_KdPrintCond( DBGLVL_HIGH, !NT_SUCCESS(ntStatus),("Exit IsoUsb_PoSelfRequestCompletion() FAILED, ntStatus = 0x%x\n", ntStatus ));
   
    return ntStatus;
}


BOOLEAN
IsoUsb_SetDevicePowerState(
    IN PDEVICE_OBJECT DeviceObject,
    IN DEVICE_POWER_STATE DeviceState
    )
/*++

Routine Description:

    This routine is called when An IRP_MN_SET_POWER of type 'DevicePowerState'
    has been received by IsoUsb_ProcessPowerIrp().


Arguments:

    DeviceObject - Pointer to the device object for the class device.

    DeviceState - Device specific power state to set the device in to.


Return Value:

    For requests to DeviceState D0 ( fully on ), returns TRUE to signal caller 
    that we must set a completion routine and finish there.

--*/
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PDEVICE_EXTENSION deviceExtension;
    BOOLEAN fRes = FALSE;

    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    switch (DeviceState) {
    case PowerDeviceD3:

        //
        // Device will be going OFF, 
		// TODO: add any needed device-dependent code to save state here.
		//  ( We have nothing to do in this sample )
        //

        ISOUSB_KdPrint( DBGLVL_MEDIUM,("IsoUsb_SetDevicePowerState() PowerDeviceD3 (OFF)\n"));

        deviceExtension->CurrentDevicePowerState = DeviceState;
        break;

    case PowerDeviceD1:
    case PowerDeviceD2:
        //
        // power states D1,D2 translate to USB suspend

        ISOUSB_KdPrint( DBGLVL_MEDIUM,("IsoUsb_SetDevicePowerState()  %s\n",
            ISOUSB_StringForDevState(DeviceState) ));

        deviceExtension->CurrentDevicePowerState = DeviceState;
        break;

    case PowerDeviceD0:


        ISOUSB_KdPrint( DBGLVL_MEDIUM,("IsoUsb_SetDevicePowerState() PowerDeviceD0 (ON)\n"));

        // We'll need to finish the rest in the completion routine;
        //   signal caller we're going to D0 and will need to set a completion routine
        fRes = TRUE;

        // Caller will pass on to PDO ( Physical Device object )
        break;

    default:

        ISOUSB_KdPrint( DBGLVL_MEDIUM,(" Bogus DeviceState = %x\n", DeviceState));
    }

    return fRes;
}



NTSTATUS
IsoUsb_QueryCapabilities(
    IN PDEVICE_OBJECT PdoDeviceObject,
    IN PDEVICE_CAPABILITIES DeviceCapabilities
    )

/*++

Routine Description:

    This routine generates an internal IRP from this driver to the PDO
    to obtain information on the Physical Device Object's capabilities.
    We are most interested in learning which system power states
    are to be mapped to which device power states for honoring IRP_MJ_SET_POWER Irps.

    This is a blocking call which waits for the IRP completion routine
    to set an event on finishing.

Arguments:

    DeviceObject        - Physical DeviceObject for this USB controller.

Return Value:

    NTSTATUS value from the IoCallDriver() call.

--*/

{
    PIO_STACK_LOCATION nextStack;
    PIRP irp;
    NTSTATUS ntStatus;
    KEVENT event;


    // This is a DDK-defined DBG-only macro that ASSERTS we are not running pageable code
    // at higher than APC_LEVEL.
    PAGED_CODE();


    // Build an IRP for us to generate an internal query request to the PDO
    irp = IoAllocateIrp(PdoDeviceObject->StackSize, FALSE);

    if (!irp) {
        return STATUS_INSUFFICIENT_RESOURCES;
    }


    // IoGetNextIrpStackLocation gives a higher level driver access to the next-lower
    // driver's I/O stack location in an IRP so the caller can set it up for the lower driver.
    nextStack = IoGetNextIrpStackLocation(irp);
    ISOUSB_ASSERT(nextStack != NULL);
    nextStack->MajorFunction= IRP_MJ_PNP;
    nextStack->MinorFunction= IRP_MN_QUERY_CAPABILITIES;

    // init an event to tell us when the completion routine's been called
    KeInitializeEvent(&event, NotificationEvent, FALSE);

    // Set a completion routine so it can signal our event when
    //  the next lower driver is done with the Irp
    IoSetCompletionRoutine(irp,
                           IsoUsb_IrpCompletionRoutine,
                           &event,  // pass the event as Context to completion routine
                           TRUE,    // invoke on success
                           TRUE,    // invoke on error
                           TRUE);   // invoke on cancellation of the Irp


    // set our pointer to the DEVICE_CAPABILITIES struct
    nextStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities;

    ntStatus = IoCallDriver(PdoDeviceObject,
                            irp);

    ISOUSB_KdPrint( DBGLVL_MEDIUM,(" IsoUsb_QueryCapabilities() ntStatus from IoCallDriver to PCI = 0x%x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {
       // wait for irp to complete

       KeWaitForSingleObject(
            &event,
            Suspended,
            KernelMode,
            FALSE,
            NULL);
    }

    // failed? this is probably a bug
    ISOUSB_KdPrintCond( DBGLVL_DEFAULT,(!NT_SUCCESS(ntStatus)), ("IsoUsb_QueryCapabilities() failed\n"));

    IoFreeIrp(irp);

    return ntStatus;
}








?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清不卡在线观看av| 色噜噜偷拍精品综合在线| 国产高清不卡二三区| 色婷婷av一区二区三区软件| 久久久亚洲国产美女国产盗摄 | 一区二区三区欧美日| 日本vs亚洲vs韩国一区三区 | 亚洲欧美激情一区二区| 免费观看久久久4p| 色综合网站在线| 国产日韩欧美在线一区| 日韩国产精品久久久久久亚洲| 成人91在线观看| 日韩欧美国产系列| 亚洲国产毛片aaaaa无费看 | 夜夜嗨av一区二区三区中文字幕| 久久精品国产99国产| 欧美三级在线播放| 亚洲天堂久久久久久久| 国产夫妻精品视频| 日韩欧美一区在线| 午夜精品久久久久久久久| 色哟哟一区二区在线观看| 国产日韩精品一区二区三区| 免费人成黄页网站在线一区二区| 欧美性受极品xxxx喷水| 亚洲精品久久嫩草网站秘色| 成人污视频在线观看| 国产婷婷色一区二区三区| 国产一区不卡在线| 久久亚洲综合av| 国产自产2019最新不卡| 2021久久国产精品不只是精品| 全部av―极品视觉盛宴亚洲| 欧美精品一二三| 香蕉成人伊视频在线观看| 欧美日韩国产bt| 日本va欧美va精品| 欧美一级在线观看| 久久综合综合久久综合| 精品久久一区二区三区| 久久91精品久久久久久秒播| 欧美电影免费观看高清完整版 | 国产精品麻豆视频| 成人激情免费视频| 综合在线观看色| 日本电影亚洲天堂一区| 亚洲国产日日夜夜| 91精品国产色综合久久不卡电影 | 91视频.com| 一级日本不卡的影视| 色视频一区二区| 亚洲成人动漫在线免费观看| 欧美一区二区视频观看视频| 精品亚洲国产成人av制服丝袜| 久久精品一区四区| 91一区二区三区在线观看| 亚洲午夜一二三区视频| 日韩午夜在线观看视频| 国产精品一色哟哟哟| 亚洲天堂精品在线观看| 欧美一区二区三区播放老司机 | 免费观看久久久4p| 国产午夜精品久久| 精品视频免费在线| 精东粉嫩av免费一区二区三区| 国产精品人人做人人爽人人添 | 日韩av中文字幕一区二区| 久久久不卡网国产精品二区| 91麻豆国产在线观看| 美女视频黄久久| 国产精品家庭影院| 日韩一本二本av| 91在线无精精品入口| 蜜桃av噜噜一区| 亚洲欧美激情视频在线观看一区二区三区| 在线观看国产91| 国模大尺度一区二区三区| 欧美区一区二区三区| 久久国产人妖系列| 日本一区二区视频在线观看| 99re这里只有精品首页| 亚洲成a人v欧美综合天堂下载 | 色94色欧美sute亚洲线路二| 亚洲成人精品影院| 久久综合九色综合欧美98 | 欧美在线制服丝袜| 国产女主播一区| 欧美日韩精品系列| 成人黄色免费短视频| 亚洲电影欧美电影有声小说| 久久一区二区三区四区| 欧美中文字幕一二三区视频| 激情综合网av| 亚洲一区二区三区四区在线| 欧美成人精品3d动漫h| 成人av在线观| 石原莉奈一区二区三区在线观看| 国产亚洲精品资源在线26u| 在线观看国产一区二区| 国产91高潮流白浆在线麻豆 | 国产大陆a不卡| 亚洲一区二区三区四区在线观看| 国产亚洲一区二区三区四区| 欧亚一区二区三区| 国产精品主播直播| 亚洲一二三区在线观看| 亚洲激情欧美激情| 欧美激情在线一区二区三区| 欧美一区日韩一区| 欧洲一区在线电影| 99热这里都是精品| 国产精品影视天天线| 亚洲自拍偷拍欧美| 亚洲一区二区在线视频| 中文字幕一区二区三区av| 日韩午夜激情视频| 欧美三区在线视频| 一本大道av伊人久久综合| 成人黄色av电影| 国产另类ts人妖一区二区| 亚洲尤物视频在线| 亚洲国产一二三| 亚洲制服欧美中文字幕中文字幕| 国产精品成人网| 国产视频在线观看一区二区三区 | 亚洲一线二线三线久久久| 中文字幕不卡在线观看| 国产三级精品三级在线专区| 欧美videossexotv100| 欧美精品黑人性xxxx| 不卡av电影在线播放| 99精品欧美一区二区三区综合在线| 国产成人av自拍| 国产精品一区一区三区| 国产福利一区二区三区在线视频| 久久99国产精品麻豆| 国产一区二区三区在线看麻豆| 久99久精品视频免费观看| 秋霞电影一区二区| 国产麻豆欧美日韩一区| 国产.精品.日韩.另类.中文.在线.播放| 蜜臀99久久精品久久久久久软件| 亚洲影院免费观看| 无码av免费一区二区三区试看| 亚洲1区2区3区4区| 日韩中文欧美在线| 夜夜嗨av一区二区三区中文字幕| 免费看日韩精品| 久久99国产精品免费| 国产成都精品91一区二区三| 国产91丝袜在线播放| 色综合久久久久网| 欧美色视频在线| 91福利视频久久久久| 欧美大片一区二区| 久久久久9999亚洲精品| 中文字幕一区av| 亚洲一区二区三区四区在线观看 | 天天综合天天综合色| 蜜桃视频免费观看一区| 国产黑丝在线一区二区三区| 在线一区二区三区| 日韩一区二区三区在线观看| 久久久久久久精| 亚洲精品视频一区| 免费看欧美女人艹b| 成人一区二区视频| 在线观看国产一区二区| 中文字幕第一页久久| 偷拍日韩校园综合在线| 国产麻豆视频精品| 欧美日韩国产首页在线观看| 26uuu精品一区二区三区四区在线| 中文字幕在线播放不卡一区| 国产精品免费视频一区| 日本不卡中文字幕| 91亚洲国产成人精品一区二三| 欧美精品xxxxbbbb| 国产精品女主播av| 麻豆91在线看| 一本大道av伊人久久综合| 91精品国产综合久久久蜜臀粉嫩| 亚洲欧美另类久久久精品| 久久超级碰视频| 在线观看一区日韩| 国产三级欧美三级日产三级99| 亚洲成人动漫精品| caoporn国产一区二区| 欧美一区三区四区| 日韩精品高清不卡| 色吊一区二区三区| 中文字幕一区二区在线观看| 精品亚洲porn| 制服丝袜中文字幕亚洲| 亚洲www啪成人一区二区麻豆| 成人av免费在线| 久久精品男人天堂av| 另类综合日韩欧美亚洲| 欧美精品久久99|