Перечисление запросов Windows Power Availability с помощью недокументированного CallNtPowerInformation(GetPowerRequestList..)

В Windows 7 появились «Запросы доступности питания». Эта функция позволяет приложениям уведомлять ОС о том, что им требуется дисплей или вся система, и поэтому управление питанием должно быть временно запрещено. Функция задокументирована здесь:

https://download.microsoft.com/download/7/E/7/7E7662CF-CBEA-470B-A97E-CE7CE0D98DC2/AvailabilityRequests.docx

Функция запросов доступности использует объектную модель и предоставляет функции PowerCreateRequest(), PowerSetRequest() и PowerClearRequest() для создания запросов, их активации и окончательного удаления. Эта функциональность очень похожа на более старый API SetThreadExecutionState(), доступный в Windows 2000, но позволяет создавать несколько запросов для каждого потока и улучшает потенциальную диагностику, требуя, чтобы каждый запрос имел строку причины.

Утилита POWERCFG.EXE, поставляемая ОС, может перечислить текущие невыполненные запросы с помощью команды:

POWERCFG - ЗАПРОСЫ

Microsoft не документирует, как перечислять запросы с помощью Windows API.

Функция CallNtPowerInformation() в SDK была обновлена ​​для поддержки нового информационного уровня под названием «GetPowerRequestList». Это очень похоже на то, что это может быть необходимый API, но это не задокументировано.

Пожалуйста, кто-нибудь знает, как вызвать CallNtPowerInformation(GetPowerRequestList..)?

Джим


person jimc    schedule 12.06.2018    source источник
comment
Уровень информации GetPowerRequestList не задокументирован. Почему вы предполагаете, что это так?   -  person IInspectable    schedule 12.06.2018
comment
GetPowerRequestList находится в более поздних заголовочных файлах Windows SDK.   -  person jimc    schedule 12.06.2018
comment
Я нашел исследовательский проект по powercfg: github.com/diversenok/Powercfg   -  person Winand    schedule 14.03.2021


Ответы (1)


Поздний ответ, но я обнаружил, что вместо этого было проще вызвать эту другую функцию (поскольку CallNtPowerInformation(GetPowerRequestList, ...) вернул неподдерживаемую ошибку):

PowerInformationWithPrivileges(GetPowerRequestList, 0, 0, bufout, 16384);

Подпись функции оказалась такой же, и вам, возможно, придется определить ее и GetProcAddress из powrprof.dll самостоятельно, в зависимости от того, какие библиотеки у вас есть.

Формат вывода, похоже, был двоичным BLOB-объектом. Если бы мне пришлось угадывать, это список int64 (даже в 32-битных приложениях), первая запись — это # ​​записей (назовем их x), следующие x записей — это смещения в большом двоичном объекте для реальных записей, которые сами по себе являются чем-то вроде BLOB/структура переменной длины, вероятно, соответствующая каждому PowerRequest и/или типу запроса. Неполная информация, но она должна заставить других людей начать работу, если они серьезно настроены на то, чтобы заставить эту работу работать.

Вам нужен администратор, чтобы вызвать эту функцию (вам также нужен администратор, чтобы вызвать powercfg /requests, так что это не слишком уж неожиданно, хотя, возможно, недостаток в зависимости от вашего варианта использования).

person vulture    schedule 14.12.2018