Перечислите в Windows «Запросы о доступности электропитания» с недокументированной CallNtPowerInformation (GetPowerRequestList ..) - PullRequest
0 голосов
/ 12 июня 2018

В 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 -REQUESTS

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

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

Кто-нибудь знает, как вызвать CallNtPowerInformation (GetPowerRequestList ..)?

Jim

1 Ответ

0 голосов
/ 15 декабря 2018

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

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

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

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

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

...