Внешний источник телеметрии — SDK 0.3
Это отдельный канал именованных скалярных данных. Он не заменяет LocalDataSource
и не передаёт адреса, байты памяти, modules/regions/threads/handles или драйверные
команды. Process API продолжает работать только через выбранные Windows handles.
Запуск
- Запустите bin/EasyTelemetryProvider.exe demo. Это пример собственной телеметрии;
он печатает свой PID и автоматически заканчивает работу через пять минут.
- Пакет sdk/templates/external-telemetry объявляет external_source=demo,
source.read и source.write, api=0.3. Скопируйте пакет перед редактированием.
- Откройте
bin/EasyUniversal.exe, выберите пакет и откройте Settings. Укажите
напечатанный Provider PID или нажмите Choose provider. Чтение подключается
автоматически при запуске скрипта. Для изменения собственных значений
провайдера включите Allow provider writes.
Вернитесь к Details и нажмите Load script.
Без второго согласия источник доступен только для чтения. Это не запись памяти.
PID приложения для
Process API и PID провайдера — разные разрешения; один не включает другой.
API AngelScript
bool source::enabled();
string source::kind();
uint source::provider_pid();
string source::status();
string source::last_error();
bool source::has_capability(const string &in name);
string source::snapshot();
bool source::update(const string &in key,const string &in jsonScalar);
string source::update_status();
bool source::read_number(const string &in key,double &out value);
bool source::read_text(const string &in key,string &out value);
bool source::read_bool(const string &in key,bool &out value);
enabled безопасен без согласия. Остальное требует source.read и явного PID;
update дополнительно требует manifest source.write и отдельного write-grant.
kind возвращает telemetry_ipc. После согласия status: waiting/ready/unavailable.
Отсутствие согласия проверяется через enabled; остальные вызовы в этом случае
возвращают script exception, а не предоставляют данные.
snapshot возвращает JSON-объект с числами, строками и bool; при недоступности — {}.
Числа конечные, по модулю ≤1e12; строки ≤1024 байт, до 64 ключей SDK-ID.
has_capability возвращает эффективные snapshot/update, с учётом согласия и свежести.
Typed reads не требуют парсить JSON: возвращают false и очищают out (0/""/false)
для отсутствующего ключа, неверного типа или недоступного источника. Числа читаются
как double; отдельные вызовы не гарантируют один атомарный снимок.
update принимает JSON-скаляр до 2048 байт кодированного JSON, например "7" или "true". Для строки передавайте
JSON с кавычками. true означает помещение в очередь, не завершение операции.
До 8 разных ключей; повтор ключа заменяет ещё не отправленное значение.
update_status: idle/queued/accepted/rejected/unknown. unknown означает ошибку
доставки/ответа; операция на стороне провайдера уже могла произойти. Автоматического
повтора и отката нет. Последний статус не является журналом отдельных операций.
IPC-протокол
Локальная message-mode pipe: \\.\pipe\EasyUniversalTelemetry-ID.
ID должен совпадать с external_source из manifest. Один провайдер выбран на сеанс.
Runtime удерживает handle его процесса для проверки срока жизни и сравнивает
GetNamedPipeServerProcessId с явно разрешённым PID. Процесс не запускается
автоматически, имя источника и права не могут измениться через Reload.
Один запрос на соединение, UTF-8 JSON ≤8192 байт, глубина ≤4:
{"protocol":1,"sequence":1,"op":"snapshot","updates":{}}
Ответ — ровно шесть полей; sequence повторяет запрос:
{"protocol":1,"sequence":1,"provider":"demo","capabilities":["snapshot","update"],"values":{"rpm":1200},"accepted":true}
snapshot обязателен; update опционален. Неизвестные и повторные capabilities
отклоняются. accepted сообщает результат всей переданной группы updates;
провайдер отвечает за применение без частичных изменений. После чтения клиент
отправляет однобайтовое подтверждение !, затем закрывает соединение.
Background thread опрашивает источник примерно раз в 200 мс. Общий номинальный
дедлайн write/read — 300 мс; overlapped I/O отменяется при превышении. Outer worker
watchdog остаётся страховкой от зависшего native teardown, это не hard real-time.
Снимок истекает через секунду; неверный ответ/отключение очищают его немедленно.
Callbacks читают копии, а не блокируются на pipe. Между отдельными вызовами API
снимок может обновиться: сохраните результат snapshot в локальную переменную.
Пример и ограничения
Исходник reference provider: sdk/provider/main.cpp. Сборка входит в build.ps1;
исходники документации доступны только admin. Провайдер запрещает удалённые
pipe-клиенты и использует Windows default DACL. Клиент не даёт провайдеру
impersonation выше identification. Это не аутентификация автора и не OS-песочница:
запускайте доверенные пакеты и провайдеры. Runtime и provider не должны работать
с повышенными правами без необходимости.
Проверки: tests/external_telemetry.ps1 и external_source_protocol.cpp. Они используют
только собственные данные. Наличие этого канала не доказывает поддержку игры,
kernel/DMA/hypervisor или доступ к защищённой памяти.
Состояние в клиенте — 0.3.5
В Settings под разрешениями провайдера отображаются его ID, выбранный PID,
состояние waiting/ready/unavailable, доступные snapshot/update и последняя ошибка.
До Load script подключение не выполняется. Возможность update видна только при
поддержке провайдера и отдельном согласии пользователя. После завершения сессии
клиент перестаёт показывать источник как подключённый.
Наведите мышь на блок состояния на две секунды, чтобы увидеть полный ID и
результат последнего update. Неверный PID, таймаут, разрыв соединения и ошибочный
ответ доступны в этом блоке даже если скрипт сам не выводит диагностику.
Передаются только метаданные состояния; значения телеметрии в GUI не копируются.
Проверки и подключение идут в worker, UI получает проверенную копию метаданных.