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

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

?? power.c

?? 基于DDK的驅動間同步調用測試示例程序,DriverA是目標驅動,DriverB是主驅動,test是MFC測試示例
?? C
?? 第 1 頁 / 共 3 頁
字號:
// power.c
//
// Generated by C DriverWizard 3.2.0 (Build 2485)
// Requires DDK Only
// File created on 3/11/2009
//

#include "pch.h"
#ifdef DRIVERA_WMI_TRACE
#include "power.tmh"
#endif

///////////////////////////////////////////////////////////////////////////////////////////////////
//  DriverAPowerDispatch 
//      Dispatch routine for IRPs of IRP_MJ_POWER type
//
//  Arguments:
//      IN  DeviceObject
//              Device object for our driver
//
//      IN  Irp
//              The power IRP to handle
//
//  Return Value:
//      Status
//
NTSTATUS DriverAPowerDispatch(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
    PDRIVERA_DEVICE_EXTENSION    deviceExtension;
    NTSTATUS                        status;
    PIO_STACK_LOCATION              irpStack;

    DriverADebugPrint(DBG_POWER, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    DriverADumpIrp(Irp);

    // Get our current IRP stack location
    irpStack = IoGetCurrentIrpStackLocation(Irp);

    // Get our device extension
    deviceExtension = (PDRIVERA_DEVICE_EXTENSION)DeviceObject->DeviceExtension;

    // check if device has been removed
    if (!DriverAAcquireRemoveLock(deviceExtension))
    {
        status = STATUS_NO_SUCH_DEVICE;

        PoStartNextPowerIrp(Irp);
        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        DriverADebugPrint(DBG_POWER, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

        return status;
    }

    // If our device has not been started, we just pass the 
    // power requests down the stack
    if (deviceExtension->PnpState == PnpStateNotStarted) 
    {
        PoStartNextPowerIrp(Irp);
        IoSkipCurrentIrpStackLocation(Irp);

        status = PoCallDriver(deviceExtension->LowerDeviceObject, Irp);

        // Release Remove Lock
        DriverAReleaseRemoveLock(deviceExtension);

        DriverADebugPrint(DBG_POWER, DBG_WARN, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);

        return status;
    }

    // Determine the power IRP type
    switch(irpStack->MinorFunction)
    {
    case IRP_MN_QUERY_POWER:

        if (irpStack->Parameters.Power.Type == SystemPowerState)
        {
            // Handle the system power IRP case
            status = DriverASystemPowerDispatch(deviceExtension, Irp);
        }
        else
        {
            // Handle the device power IRP case here

            // we should only get a query when going to a less or same powered state
            ASSERT(irpStack->Parameters.Power.State.DeviceState >= deviceExtension->DevicePowerState);

            // If the query is for our current state, just return SUCCESS
            if (irpStack->Parameters.Power.State.DeviceState == deviceExtension->DevicePowerState)
            {
                // Let the power manager know we can handle new device power IRPs
                PoStartNextPowerIrp(Irp);

                // forward the IRP down the stack
                IoSkipCurrentIrpStackLocation(Irp);
                Irp->IoStatus.Status = STATUS_SUCCESS;
                
                status = PoCallDriver(deviceExtension->LowerDeviceObject, Irp);

                // Adjust our power IRP count
                DriverAReleaseRemoveLock(deviceExtension);
            }
            else
            {
                // Save off our device power IRP
                deviceExtension->DevicePowerIrp = Irp;

                // Mark the IRP pending
                IoMarkIrpPending(Irp);
                status = STATUS_PENDING;

                // handle device power IRP at PASSIVE_LEVEL
                if (KeGetCurrentIrql() < DISPATCH_LEVEL)
                {
                    DriverAPowerDownPrepCallback(DeviceObject, deviceExtension);
                }
                else
                {
                    IoQueueWorkItem(
                        deviceExtension->PowerWorkItem,
                        DriverAPowerDownPrepCallback,
                        DelayedWorkQueue,
                        deviceExtension
                        );
                }
            }
        }
        break;
    case IRP_MN_SET_POWER:

        if (irpStack->Parameters.Power.Type == SystemPowerState)
        {
            // Handle the system power IRP case
            status = DriverASystemPowerDispatch(deviceExtension, Irp);
        }
        else
        {
            // Handle the device power IRP case here

            // determine if we are powering up, powering down, or staying the same
            if (irpStack->Parameters.Power.State.DeviceState < deviceExtension->DevicePowerState)
            {
                // Powering up

                // Powering up needs to happen bottom to top for the device stack
                // so we send the IRP down with a completion routine, and handle
                // our power up tasks in the completion routine

                // Mark the IRP pending, as our completion 
                // routine won't complete it
                IoMarkIrpPending(Irp);
                status = STATUS_PENDING;

                // Prepare the next stack location
                IoCopyCurrentIrpStackLocationToNext(Irp);

                // Insert our completion routine
                IoSetCompletionRoutine(
                    Irp,
                    DriverADeviceSetPowerCompletionRoutine,
                    deviceExtension,
                    TRUE,
                    TRUE,
                    TRUE
                    );

                // send the IRP down the stack
                PoCallDriver(deviceExtension->LowerDeviceObject, Irp);
            }
            else if (irpStack->Parameters.Power.State.DeviceState > deviceExtension->DevicePowerState)
            {
                // Powering down

                // Powering down needs to occur top to bottom for the device stack, so
                // we can handle power down functionality right here

                //*****************************************************************
                //*****************************************************************
                // TODO:  Add device specific power down code here
                //*****************************************************************
                //*****************************************************************

                // Save off our device power IRP
                deviceExtension->DevicePowerIrp = Irp;

                // Mark the IRP pending
                IoMarkIrpPending(Irp);
                status = STATUS_PENDING;

                if (KeGetCurrentIrql() < DISPATCH_LEVEL)
                {
                    DriverAPowerDownPrepCallback(DeviceObject, deviceExtension);
                }
                else
                {
                    IoQueueWorkItem(
                        deviceExtension->PowerWorkItem,
                        DriverAPowerDownPrepCallback,
                        DelayedWorkQueue,
                        deviceExtension
                        );
                }
            }
            else
            {
                // Power stays the same

                // If our current device power state is PowerDeviceD0, then restart
                // our queues
                if (deviceExtension->DevicePowerState == PowerDeviceD0)
                {
                    // Save off our device power IRP
                    deviceExtension->DevicePowerIrp = Irp;

                    // Mark the IRP pending
                    IoMarkIrpPending(Irp);
                    status = STATUS_PENDING;

                    if (KeGetCurrentIrql() < DISPATCH_LEVEL)
                    {
                        DriverAPowerD0PrepCallback(DeviceObject, deviceExtension);
                    }
                    else
                    {
                        IoQueueWorkItem(
                            deviceExtension->PowerWorkItem,
                            DriverAPowerD0PrepCallback,
                            DelayedWorkQueue,
                            deviceExtension
                            );
                    }
                }
                else
                {
                    // Let the power manager know we can handle new
                    // device power IRPs
                    PoStartNextPowerIrp(Irp);

                    // forward the IRP down the stack
                    IoSkipCurrentIrpStackLocation(Irp);
                    Irp->IoStatus.Status = STATUS_SUCCESS;
                    
                    status = PoCallDriver(deviceExtension->LowerDeviceObject, Irp);

                    // Adjust our IRP count
                    DriverAReleaseRemoveLock(deviceExtension);
                }
            }
        }

        break;
    case IRP_MN_WAIT_WAKE:
    case IRP_MN_POWER_SEQUENCE:
    default:
        // default case, just send the IRP down and let other drivers
        // in the stack handle it

        // Let the power manager know we can handle another
        // power IRP of this type
        PoStartNextPowerIrp(Irp);

        // send the IRP down the stack
        IoSkipCurrentIrpStackLocation(Irp);

        // Drivers must use PoCallDriver, rather than IoCallDriver,
        // to pass power IRPs. PoCallDriver allows the Power Manager
        // to ensure that power IRPs are properly synchronized throughout
        // the system.
        status = PoCallDriver(deviceExtension->LowerDeviceObject, Irp);

        // Adjust our IRP count
        DriverAReleaseRemoveLock(deviceExtension);

        break;
    }

    DriverADebugPrint(DBG_POWER, DBG_TRACE, __FUNCTION__"--. IRP %p STATUS %x", Irp, status);
    return status;
}

///////////////////////////////////////////////////////////////////////////////////////////////////
//  DriverASystemPowerDispatch 
//      Dispatch routine for system IRP_MJ_POWER IRPs
//
//  Arguments:
//      IN  DeviceExtension
//              Our device extension
//
//      IN  Irp
//              The power IRP to handle
//
//  Return Value:
//      NT status code
//
NTSTATUS DriverASystemPowerDispatch(
    PDRIVERA_DEVICE_EXTENSION    DeviceExtension,
    IN  PIRP                        Irp
    )
{
    // In this case we have to request a device power IRP
    // before completing the system power IRP.  So, we send
    // the system power IRP down the stack with a completion
    // routine and request the device power IRP from that
    // completion routine.  We specify a power complete callback
    // when requesting the device power IRP, and we complete
    // the system power IRP in that power complete callback.

    DriverADebugPrint(DBG_POWER, DBG_TRACE, __FUNCTION__"++. IRP %p", Irp);

    // Mark the IRP pending
    IoMarkIrpPending(Irp);

    // Prepare the next stack location
    IoCopyCurrentIrpStackLocationToNext(Irp);

    // Insert our completion routine
    IoSetCompletionRoutine(
        Irp,
        DriverASystemPowerCompletionRoutine,
        DeviceExtension,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
麻豆精品久久久| 国产欧美综合在线观看第十页| 久久亚洲一级片| 亚洲第一电影网| 99久久伊人精品| 久久久久久久综合色一本| 亚洲成在人线在线播放| 9久草视频在线视频精品| 久久久美女艺术照精彩视频福利播放| 婷婷开心激情综合| 欧美日韩在线直播| 亚洲午夜免费福利视频| 91搞黄在线观看| 一区二区三区精密机械公司| av一区二区不卡| 一区二区三区国产精品| 色呦呦一区二区三区| 亚洲三级视频在线观看| 91日韩在线专区| 亚洲一区二区三区在线播放| 欧美性猛交一区二区三区精品| 亚洲综合一区二区三区| 欧美日韩一区精品| 久久成人麻豆午夜电影| 日韩免费成人网| 国产91精品一区二区麻豆亚洲| 国产精品色在线| 99久久伊人网影院| 午夜av电影一区| 国产精品久久久久久久久免费桃花| 国内精品久久久久影院色| 国产欧美视频一区二区| 欧美亚洲国产一区在线观看网站 | 日韩国产精品久久| 26uuu亚洲综合色欧美| 99精品欧美一区| 亚洲一区视频在线观看视频| 8x福利精品第一导航| 国产成人免费在线视频| 亚洲成av人片在线| 欧美国产一区在线| 在线视频中文字幕一区二区| 蜜桃免费网站一区二区三区| 久久久精品日韩欧美| 欧美日韩免费高清一区色橹橹| 麻豆高清免费国产一区| 国产精品日韩精品欧美在线| 欧美日韩一区三区| 不卡的av网站| 狠狠色狠狠色综合日日91app| 亚洲男女一区二区三区| 日韩欧美不卡一区| 欧美熟乱第一页| bt欧美亚洲午夜电影天堂| 日本系列欧美系列| 亚洲午夜久久久久久久久电影院| 国产亚洲一二三区| 日韩女优制服丝袜电影| 欧美日韩午夜影院| 在线综合+亚洲+欧美中文字幕| 粉嫩av亚洲一区二区图片| 麻豆国产精品777777在线| 午夜精品久久久久久不卡8050| 国产精品久久久久久久久免费相片| 欧美videos中文字幕| 欧美撒尿777hd撒尿| 在线视频一区二区三| 99精品欧美一区二区三区综合在线| 国产精品中文字幕日韩精品| 久久国产视频网| 韩国在线一区二区| 国内精品久久久久影院薰衣草| 亚洲高清中文字幕| 天天色综合天天| 蜜臀av一区二区三区| 日本不卡在线视频| 麻豆精品视频在线观看视频| 日本视频在线一区| 老色鬼精品视频在线观看播放| 蜜臂av日日欢夜夜爽一区| 久久99精品久久久| 国产一区二区调教| 成人一级黄色片| 一本久道久久综合中文字幕| 91福利小视频| 欧美一区二区三区色| 精品三级av在线| 国产精品美女久久久久久久久 | 免费高清成人在线| 国产一区二区调教| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲国产综合色| 日本不卡一区二区| 国产成人在线视频播放| 99国产精品久久久久久久久久久| 欧美在线免费观看亚洲| 亚洲精品在线网站| 一区二区三区在线免费播放| 免费观看在线综合| 91福利视频在线| 日本一区二区久久| 日本少妇一区二区| 97精品久久久久中文字幕| 欧美日本高清视频在线观看| 国产日韩亚洲欧美综合| 亚洲国产精品麻豆| 成人国产视频在线观看| 51精品视频一区二区三区| 国产农村妇女毛片精品久久麻豆 | 理论片日本一区| 在线亚洲人成电影网站色www| 精品国产91乱码一区二区三区| 亚洲欧美一区二区三区久本道91| 美女视频免费一区| 欧美丝袜第三区| 亚洲另类一区二区| 69av一区二区三区| 亚洲美女精品一区| 成人精品免费视频| 久久久精品日韩欧美| 久久99精品久久久久久动态图| 欧美中文字幕亚洲一区二区va在线| 久久久亚洲国产美女国产盗摄| 亚洲国产欧美日韩另类综合| eeuss影院一区二区三区| 国产区在线观看成人精品| 精品一区二区日韩| 日韩午夜激情av| 免费成人美女在线观看.| 欧美一区二区精品| 经典三级在线一区| 精品国产三级a在线观看| 九色|91porny| 2020国产精品久久精品美国| 狠狠色丁香婷婷综合久久片| 久久综合色综合88| 欧美综合欧美视频| 日韩伦理免费电影| 国产一区美女在线| 日韩欧美一二三| 国产精品正在播放| 国产丝袜美腿一区二区三区| 狠狠色狠狠色综合日日91app| 日韩欧美成人一区二区| 国产一区二区三区精品视频| 91婷婷韩国欧美一区二区| 亚洲欧洲三级电影| 欧美婷婷六月丁香综合色| 亚洲1区2区3区视频| 久久只精品国产| 91网站在线观看视频| 日本欧美大码aⅴ在线播放| 欧美精品一区二区三区蜜臀| 国产成人综合在线播放| 亚洲成人av一区| 欧美亚洲动漫另类| 麻豆视频一区二区| 日韩美女精品在线| 精品久久久久久无| 91麻豆文化传媒在线观看| 老司机午夜精品| 自拍偷拍国产精品| 日韩精品中文字幕在线不卡尤物| 粉嫩13p一区二区三区| 三级成人在线视频| 亚洲天堂精品在线观看| 亚洲精品一区二区三区福利| 色999日韩国产欧美一区二区| 久久er99热精品一区二区| 亚洲欧美一区二区久久| 久久久久国产成人精品亚洲午夜| 91精彩视频在线| 成人app网站| 国产精品一区二区久久精品爱涩| 亚洲国产成人精品视频| 中文字幕在线播放不卡一区| 精品久久五月天| 91精品国产综合久久久久久漫画| 成人免费av资源| 国产成人综合视频| 激情久久久久久久久久久久久久久久| 亚洲影院免费观看| 亚洲乱码国产乱码精品精98午夜 | 久久机这里只有精品| 亚洲成人先锋电影| 亚洲国产精品久久人人爱蜜臀| 亚洲少妇中出一区| 中文字幕亚洲在| 一区免费观看视频| 亚洲丝袜另类动漫二区| 中文字幕中文字幕在线一区| 中文欧美字幕免费| 国产精品三级av在线播放| **网站欧美大片在线观看| 亚洲欧美一区二区久久| 亚洲国产人成综合网站| 午夜精品福利久久久| 日韩成人午夜电影| 激情五月婷婷综合网| 国产成人免费在线视频|