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的函数,后面我们再提到。
- Windows驱动中的电源管理
- Windows CE设备驱动的电源管理
- 电源管理驱动
- android 电源管理驱动
- 电源管理 第二部分 ---- Windows CE设备驱动开发之电源管理
- Wince电源管理(一) ---- Windows CE设备驱动开发之电源管理
- Wince电源管理(二) ---- Windows CE设备驱动开发之电源管理
- Wince电源管理(三) ---- Windows CE设备驱动开发之电源管理
- Wince电源管理(四) ---- Windows CE设备驱动开发之电源管理
- Wince电源管理(五) ---- Windows CE设备驱动开发之电源管理
- 4.7 电源管理 第一部分 ---- Windows CE设备驱动开发之电源管理
- 4.7 电源管理 第二部分 ---- Windows CE设备驱动开发之电源管理
- 4.7 电源管理 第三部分 ---- Windows CE设备驱动开发之电源管理
- 4.7 电源管理 第四部分 ---- Windows CE设备驱动开发之电源管理
- 4.7 电源管理 第五部分 ---- Windows CE设备驱动开发之电源管理
- Windows CE设备驱动开发之电源管理
- 关于windows电源管理
- Windows CE 电源管理
- 算法研究(一) 旋转字符串的三种算法
- 很不错的Html,Javascript,CSS在线编译器
- 匿名对象
- 我是如何学PHP的
- Struts2框架中s:if标签和s:set标签小结
- Windows驱动中的电源管理
- Android 关闭线程(转)
- CentOS 卸载OpenJdk
- xargs 用法
- windflowers
- C++命名规则之 $ 的用法
- Linux ulimit解决最大打开文件数限制
- PHP 图片防盗链的一段代码
- OpenJDK 和 Sun JDK 什么关系?