Windows驱动中的电源管理

来源:互联网 发布:宾馆307网络歌手 编辑:程序博客网 时间:2024/05/22 10:36

               

           想来想去,今天还是更新一章,虽然回来点晚!因为,可能以后的时间会越来越少,一方面,是案子马上会非常忙,还有更重要的是,宝宝要会回来了!

           不知道,为什么,今天一直在想,怎么去准备创业,哪个方向,才是适合自己的。想来想去,都没觉得合适的。还是需要机会,和积累的,你积淀了该需要的,唯一就是机会的。而现在,我还不够,远远不够。

           我们知道,在WDM中,所有的电源管理都需要自己处理,哪怕是过滤驱动,因为,如果你不处理这些IRP,系统返回错误。要不是,就是你的驱动卸载,或者系统直接崩溃。一般都是在IRP_MJ_POWER和IRP_MJ_PNP的主IRP中处理的,即插即用和电源管理,一般都是放在一起的,因为没电了,设备当然不能工作,也不可用。设备直接拔除,当然电源也没有了。

             我们看WDF中的处理,我们先回忆下,之前,在设备对象一章有讲过。关于WDFDEVICE_INIT,它是创建设备对象的一个参数。WdfDeviceCreate(&DeviceInit, &attributes, &device);我们知道,这个参数,都是一些关于设备对象的域,不过很可惜,MSFT没有公开这个结构体。但是使用了非常多个宏,来设置这些域。如下所示:

              

WdfDeviceInitAssignName

WdfDeviceInitAssignSDDLString

WdfDeviceInitAssignWdmIrpPreprocessCallback

WdfDeviceInitFree

WdfDeviceInitRegisterPnpStateChangeCallback

WdfDeviceInitRegisterPowerStateChangeCallback

WdfDeviceInitRegisterPowerPolicyStateChangeCallback

WdfDeviceInitSetCharacteristics

WdfDeviceInitSetDeviceClass

WdfDeviceInitSetDeviceType

WdfDeviceInitSetExclusive

WdfDeviceInitSetFileObjectConfig

WdfDeviceInitSetIoInCallerContextCallback

WdfDeviceInitSetIoType

WdfDeviceInitSetPnpPowerEventCallbacks

WdfDeviceInitSetPowerInrush

WdfDeviceInitSetPowerNotPageable

WdfDeviceInitSetPowerPageable

WdfDeviceInitSetPowerPolicyEventCallbacks

WdfDeviceInitSetPowerPolicyOwnership

WdfDeviceInitSetRequestAttributes

             今天我们只讲里面的一个宏WdfDeviceInitSetPnpPowerEventCallbacks,这个宏定义了,一些基本,我们需要知道,一些电源管理方面的回调函数。我们有WDF_PNPPOWER_EVENT_CALLBACKS这个结构体,

             记得上次有帖出来过,今天再此贴一下:

              typedef struct _WDF_PNPPOWER_EVENT_CALLBACKS {
                          ULONG Size;
                          PFN_WDF_DEVICE_D0_ENTRY  EvtDeviceD0Entry;
                          PFN_WDF_DEVICE_D0_ENTRY_POST_INTERRUPTS_ENABLED  EvtDeviceD0EntryPostInterruptsEnabled;
                          PFN_WDF_DEVICE_D0_EXIT  EvtDeviceD0Exit;
                          PFN_WDF_DEVICE_D0_EXIT_PRE_INTERRUPTS_DISABLED
                          EvtDeviceD0ExitPreInterruptsDisabled;
                          PFN_WDF_DEVICE_PREPARE_HARDWARE  EvtDevicePrepareHardware;
                          PFN_WDF_DEVICE_RELEASE_HARDWARE  EvtDeviceReleaseHardware;
                         PFN_WDF_DEVICE_SELF_MANAGED_IO_CLEANUP  EvtDeviceSelfManagedIoCleanup;
                         PFN_WDF_DEVICE_SELF_MANAGED_IO_FLUSH  EvtDeviceSelfManagedIoFlush;
                         PFN_WDF_DEVICE_SELF_MANAGED_IO_INIT  EvtDeviceSelfManagedIoInit;
                         PFN_WDF_DEVICE_SELF_MANAGED_IO_SUSPEND  EvtDeviceSelfManagedIoSuspend;
                         PFN_WDF_DEVICE_SELF_MANAGED_IO_RESTART  EvtDeviceSelfManagedIoRestart;
                         PFN_WDF_DEVICE_SURPRISE_REMOVAL  EvtDeviceSurpriseRemoval;
                         PFN_WDF_DEVICE_QUERY_REMOVE  EvtDeviceQueryRemove;
                         PFN_WDF_DEVICE_QUERY_STOP  EvtDeviceQueryStop;
                         PFN_WDF_DEVICE_USAGE_NOTIFICATION  EvtDeviceUsageNotification;
                         PFN_WDF_DEVICE_RELATIONS_QUERY  EvtDeviceRelationsQuery;
                               } WDF_PNPPOWER_EVENT_CALLBACKS, *PWDF_PNPPOWER_EVENT_CALLBACKS;

             在这里面,一般我们需要填充,EvtDeviceD0Entry,EvtDeviceD0Exit,EvtDevicePrepareHardware,想必知道这几个回调函数的意思,我们再看一点代码。

            WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);

           pnpPowerCallbacks.EvtDevicePrepareHardware = OsrFxEvtDevicePrepareHardware;

           pnpPowerCallbacks.EvtDeviceD0Entry = OsrFxEvtDeviceD0Entry;

           pnpPowerCallbacks.EvtDeviceD0Exit = OsrFxEvtDeviceD0Exit;

           WdfDeviceInitSetPnpPowerEventCallbacks(DeviceInit, &pnpPowerCallbacks);

           WdfDeviceInitSetIoType(DeviceInit, WdfDeviceIoBuffered);

           WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);

           // Create a framework device object.

            status = WdfDeviceCreate(&DeviceInit, &attributes, &device);

            if (!NT_SUCCESS(status))

            { return status; }

             我们看到上面是一堆的WdfDeviceInitXXXXXXXX的函数,因为这些是需要在创建设备对象之前调用的,当然我们还会有一些属性需要,在设备对象创建之后,进行设置,所以,肯定会有一堆WdfDeviceSetXXXXXXXXXXXXX的函数,后面我们再提到。

 

 

            

原创粉丝点击