Всем привет!
Начал разбираться с темой управления питанием в WDM-драйвере.
Взял кусок кода power.c, работающий с IRP питания, генерируемый Walter'ом Oney через wdmwiz.awx. То есть тот, где крутится автомат состояний и который должен работать под всеми NT и даже под 9x.
Чуть адаптировал для компиляции, не задевая логику (добавил к DeviceExtension поля и в AddDevice инициализацию, имена переменных поменял).
Проверяю, как работает. А работает странно. Под wxp успешно заходит в спящий режим и выходит, выдавая в ядерный лог:
12:15:29 - 1.1 is NewIrp in state InitialState
12:15:29 - 1.1 TriageNewIrp
12:15:29 - 1.1 SelectDState
12:15:29 - 1.1 SendDeviceIrp
12:15:29 - 2.1 is NewIrp in state InitialState
12:15:29 - 2.1 TriageNewIrp
12:15:29 - 2.1 QueueStallComplete
12:15:29 - 2.1 DevQueryDown
12:15:29 - 2.1 ForwardMainIrp
12:15:29 - 2.2 is MainIrpComplete in state DevQueryDownPending
12:15:29 - 2.2 DevQueryDownComplete
12:15:29 - 2.2 CompleteMainIrp
12:15:29 - 2.2 DestroyContext
12:15:29 - 1.2 is AsyncNotify in state SubPowerDownPending
12:15:29 - 1.2 SubPowerDownComplete
12:15:29 - 1.2 ForwardMainIrp
12:15:29 - 1.3 is MainIrpComplete in state SysPowerDownPending
12:15:29 - 1.3 SysPowerDownComplete
12:15:29 - 1.3 CompleteMainIrp
12:15:29 - 1.3 DestroyContext
12:15:30 - 3.1 is NewIrp in state InitialState
12:15:30 - 3.1 TriageNewIrp
12:15:30 - 3.1 SelectDState
12:15:30 - 3.1 SendDeviceIrp
12:15:30 - 4.1 is NewIrp in state InitialState
12:15:30 - 4.1 TriageNewIrp
12:15:30 - 4.1 QueueStallComplete
12:15:30 - 4.1 SaveContext
12:15:30 - 4.1 ContextSaveComplete
12:15:30 - 4.1 ForwardMainIrp
12:15:30 - 4.2 is MainIrpComplete in state DevPowerDownPending
12:15:30 - 4.2 CompleteMainIrp
12:15:30 - 4.2 DestroyContext
12:15:30 - 3.2 is AsyncNotify in state SubPowerDownPending
12:15:30 - 3.2 SubPowerDownComplete
12:15:30 - 3.2 ForwardMainIrp
12:15:30 - 3.3 is MainIrpComplete in state SysPowerDownPending
12:15:30 - 3.3 SysPowerDownComplete
12:15:30 - 3.3 CompleteMainIrp
12:15:30 - 3.3 DestroyContext
12:15:45 - 5.1 is NewIrp in state InitialState
12:15:45 - 5.1 TriageNewIrp
12:15:45 - 5.1 ForwardMainIrp
12:15:45 - 5.2 is MainIrpComplete in state SysPowerUpPending
12:15:45 - 5.2 SysPowerUpComplete
12:15:45 - 5.2 SelectDState
12:15:45 - 5.2 SendDeviceIrp
12:15:45 - 5.2 SubPowerUpComplete
12:15:45 - 5.2 CompleteMainIrp
12:15:45 - 5.2 DestroyContext
Где в 12:15:45 - уже успешное пробуждение.
Под w2k, пытаясь зайти в спящий режим, фактически вешает машину. Выключает картинку на мониторе, но вентиляторы и винчестер по-прежнему крутятся. В логе при этом:
45.75407028 - 1.1 is NewIrp in state InitialState
45.75408936 - 1.1 TriageNewIrp
45.75409317 - 1.1 SelectDState
45.75410461 - 1.1 SendDeviceIrp
45.75411224 - 2.1 is NewIrp in state InitialState
45.75411606 - 2.1 TriageNewIrp
45.75412750 - 2.1 QueueStallComplete
45.75413132 - 2.1 DevQueryDown
45.75413895 - 2.1 ForwardMainIrp
45.75415039 - 2.2 is MainIrpComplete in state DevQueryDownPending
45.75415421 - 2.2 DevQueryDownComplete
45.75416183 - 2.2 CompleteMainIrp
45.75416946 - 2.2 DestroyContext
45.75418091 - 1.2 is AsyncNotify in state SubPowerDownPending
45.75418854 - 1.2 SubPowerDownComplete
45.75419617 - 1.2 ForwardMainIrp
45.75420380 - 1.3 is MainIrpComplete in state SysPowerDownPending
45.75421143 - 1.3 SysPowerDownComplete
45.75421524 - 1.3 CompleteMainIrp
45.75422668 - 1.3 DestroyContext
45.75424957 - 3.1 is NewIrp in state InitialState
45.75425339 - 3.1 TriageNewIrp
45.75426483 - 3.1 SelectDState
45.75426865 - 3.1 SendDeviceIrp
45.75428009 - 4.1 is NewIrp in state InitialState
45.75428391 - 4.1 TriageNewIrp
45.75429153 - 4.1 QueueStallComplete
45.75429916 - 4.1 DevQueryDown
45.75430298 - 4.1 ForwardMainIrp
45.75431442 - 4.2 is MainIrpComplete in state DevQueryDownPending
45.75431824 - 4.2 DevQueryDownComplete
45.75432968 - 4.2 CompleteMainIrp
45.75433350 - 4.2 DestroyContext
45.75434494 - 3.2 is AsyncNotify in state SubPowerDownPending
45.75435257 - 3.2 SubPowerDownComplete
45.75436020 - 3.2 ForwardMainIrp
45.75436783 - 3.3 is MainIrpComplete in state SysPowerDownPending
45.75437546 - 3.3 SysPowerDownComplete
45.75437927 - 3.3 CompleteMainIrp
45.75439072 - 3.3 DestroyContext
Отличаются логи, как можно увидеть, только строками
28c28,29
< - 4.1 DevQueryDown
---
> - 4.1 SaveContext
> - 4.1 ContextSaveComplete
30,31c31
< - 4.2 is MainIrpComplete in state DevQueryDownPending
< - 4.2 DevQueryDownComplete
---
> - 4.2 is MainIrpComplete in state DevPowerDownPending
, ну и для xp 5.x, касающихся просыпания.
Касался ли кто-нибудь темы управления питанием, и что можете посоветовать для корректной работы под w2k? Возможно, при адаптации кода power.c к своему драйверу чего-то не учёл?..