refactor: single-file stealth build without tray, tables or tests

Keep the fixed scan and priority core in one main.go: PID+creation identity, query-only snapshots with write-only upgrades, single-attempt blocklists, external-change baselines, inherited-IDLE adoption and plain %TEMP% line logging. Drop the tray UI, icons, pretty tables, rotation and test scaffolding.
This commit is contained in:
lzrdblzzrd committed 2026-10-04 19:30:54 +03:00
1 parent 4880aa46dc
commit 4600cc0862
26 files changed
+944 -3128

No files matched your search

+44 -83
View File
@@ -1,39 +1,8 @@
# autoPriority
Windows-утилита для управления приоритетами процессов по расходу оперативной памяти. Работает из одного EXE, без установки и службы.
Тихая Windows-утилита: назначает приоритеты процессам по расходу оперативной памяти. Один файл `main.go` собирается в один EXE без установки, службы, иконок и сторонних модулей. Программа не показывает окон и значков — только процесс в диспетчере задач и строки в журнале.
## Запуск и выход
Запустите `autoPriority.exe`. Первая проверка процессов выполняется при запуске, последующие — через заданный интервал, по умолчанию раз в минуту.
Значок в трее открывает меню с пунктом **«Выход»** по левой, правой, средней или дополнительной кнопке мыши. Меню доступно и с клавиатуры. При выходе программа останавливает проверки, восстанавливает доступные для восстановления приоритеты и убирает значок. Консольная сборка также поддерживает Ctrl+C.
В одном сеансе Windows работает один экземпляр. Повторный запуск завершается, не затрагивая работающий экземпляр и его журнал. Программа не настраивает автозапуск и не запрашивает повышение прав.
## Как назначаются приоритеты
Порог памяти применяется к рабочему набору процесса (RSS).
| Режим и условие | Приоритет |
|---|---|
| Обычный режим: RSS не меньше `-mem` | HIGH |
| Обычный режим: RSS меньше `-mem`, текущий приоритет выше NORMAL | NORMAL |
| Обычный режим: RSS меньше `-mem`, текущий приоритет NORMAL, BELOW_NORMAL или IDLE | Без изменения |
| Игровой режим: процесс достиг `-game-mem` | HIGH |
| Игровой режим: остальные процессы | IDLE |
**Игровой режим не распознаёт игры.** Его может включить любой процесс, достигший `-game-mem`, в том числе браузер. Такой процесс остаётся участником режима до завершения, даже если расход памяти уменьшился. Если участников несколько, режим заканчивается после выхода последнего.
После окончания игрового режима программа снимает временное понижение и применяет обычные правила. При штатном выходе самой autoPriority она восстанавливает собственные изменения, включая повышения вне игрового режима. Замеченное внешнее изменение приоритета становится новой исходной точкой.
## Параметры
| Флаг | По умолчанию | Описание |
|---|---|---|
| `-mem` | `512M` | Обычный порог памяти: положительное целое число с необязательным суффиксом K/M/G |
| `-game-mem` | `2G` | Порог игрового режима: больше `-mem`; `0` отключает режим |
| `-interval` | `1m` | Интервал проверок; значения меньше 10 секунд ограничиваются 10 секундами |
| `-dry-run` | `false` | Запись предполагаемых изменений в журнал без изменения приоритетов |
## Запуск
```text
autoPriority.exe
@@ -42,70 +11,62 @@ autoPriority.exe -game-mem=0
autoPriority.exe -dry-run
```
| Флаг | По умолчанию | Описание |
|---|---|---|
| `-mem` | `512M` | Обычный порог памяти: положительное целое число с суффиксом K/M/G |
| `-game-mem` | `2G` | Порог тяжёлого режима: больше `-mem`; `0` отключает режим |
| `-interval` | `1m` | Интервал проверок; меньше 10 секунд ограничивается 10 секундами |
| `-dry-run` | `false` | Только запись плана в журнал без изменения приоритетов |
Первая проверка выполняется при запуске, дальше — по интервалу. В одном сеансе Windows работает один экземпляр; повторный запуск завершается, не трогая работающий. Программа не настраивает автозапуск и не запрашивает повышение прав.
Остановка — завершением процесса в диспетчере задач или сигналом. При штатном завершении по Ctrl+C / SIGTERM программа один раз восстанавливает собственные изменения. Принудительное завершение восстановления не гарантирует.
## Как назначаются приоритеты
Порог применяется к рабочему набору процесса (RSS).
| Условие | Приоритет |
|---|---|
| RSS не меньше `-mem` | HIGH |
| RSS меньше `-mem`, текущий приоритет выше NORMAL | NORMAL |
| RSS меньше `-mem`, приоритет NORMAL, BELOW_NORMAL или IDLE | Без изменения |
| Процесс достиг `-game-mem` | HIGH, остальным IDLE |
`-game-mem` — просто порог, не распознавание игр: режим может включить любой тяжёлый процесс. Участник остаётся в режиме до завершения, даже если расход памяти упал. После выхода последнего участника временное понижение снимается и применяются обычные правила. При выходе самой программы восстанавливаются её собственные изменения. Чужое изменение приоритета становится новой исходной точкой, а не перезаписывается.
После отказа процесс попадает в блоклист в памяти: повторных попыток нет, остальные обрабатываются независимо. Блоклист очищается при перезапуске. Запись снимается, если PID исчез или его занял другой экземпляр.
## Журнал
Файл журнала находится во временной папке Windows: **`%TEMP%\autopriority.log`**. Путь определяется через `os.TempDir`.
При каждом запуске журнал очищается, архив предыдущей сессии удаляется. В текущей сессии сохраняются основной файл и один архив `autopriority.log.1`, каждый размером до 4 МиБ. Слишком длинная запись сокращается с отметкой.
Изменения выводятся ASCII-таблицей:
Обычные строки во временной папке Windows: **`%TEMP%\autopriority.log`**. При каждом запуске файл очищается. Формат строк:
```text
Процесс | PID | Память | Повышено | Понижено
[04.10.2026 18:14:53] PROMOTE Game.exe (PID 4321) RSS=5.8GB, NORMAL -> HIGH
[04.10.2026 18:14:53] GAME Browser.exe (PID 5678) RSS=740MB, HIGH -> IDLE
[04.10.2026 18:14:53] BLOCK svchost.exe (PID 1448): IDLE: OpenProcess(1448) failed: Access is denied. (повторов не будет)
[04.10.2026 18:14:53] SKIP System (PID 4): ... (повторов не будет)
```
При включении игрового режима его участники идут первыми, фоновые процессы — ниже. Уже установленный HIGH отмечается как «уже HIGH». Если изменить приоритет участника не удалось, его строка содержит отметку «в блоклисте».
Ошибки выводятся отдельным блоком «ОШИБКИ»:
```text
Процесс | PID | Описание ошибки
```
Под таблицей нет дублирующих сообщений. Режим `-dry-run` явно помечает записи как план. При ошибке записи журнала программа завершает работу с попыткой восстановления приоритетов.
## Блоклист
После ошибки чтения или изменения приоритета процесс попадает в блоклист. Повторных попыток для него нет, в том числе при выходе; остальные процессы обрабатываются независимо. Блоклист хранится в памяти и очищается при перезапуске autoPriority.
Если время создания доступно, блокировка привязана к PID и времени создания. Другой экземпляр с тем же PID обрабатывается отдельно. Если Windows запрещает даже чтение процесса, запись снимается при исчезновении PID из снимка либо смене имени или родителя. Замену недоступного процесса другим с тем же PID, именем и родителем между двумя снимками надёжно различить нельзя.
Процесс, доступный для чтения, но недоступный для изменения, может включать игровой режим по расходу памяти.
Режим `-dry-run` помечает строки `[DRY-RUN]`.
## Ограничения
- Восстановление незаблокированного процесса выполняется один раз. Если Windows отказывает в доступе, программа сообщает о невосстановленных приоритетах.
- Принудительное завершение, сбой ОС или отключение питания не позволяют гарантировать восстановление.
- Между чтением и записью приоритета другая программа может изменить его значение.
- Наследованный дочерними процессами IDLE определяется по родству и времени создания. Это эвристика: она может затронуть явно заданный ребёнку IDLE и не обнаружить цепочку, если родитель завершился между проверками.
- Программа не обходит защиту процессов, не включает SeDebugPrivilege и не гарантирует совместимость с античитом или прирост FPS.
- Windows может запретить чтение или изменение приоритета — программа пишет строку в журнал и больше не трогает процесс.
- Восстановление выполняется один раз; о невосстановленном сообщается в журнале.
- Наследованный дочерними процессами IDLE определяется по родству и времени создания. Это эвристика.
- Программа не обходит защиту процессов и не гарантирует совместимость с античитом.
## Сборка и проверки
## Сборка
Для сборки нужны Windows и Go 1.26 или новее. Сторонние Go-модули и CGO не требуются.
Нужны Windows и Go 1.26 или новее, без сторонних модулей и CGO. Скрытый вариант без окна:
```text
go build -trimpath -buildvcs=false -ldflags="-H=windowsgui -s -w -buildid=" -o autoPriority.exe .
go test ./...
go vet ./...
```
Для консольной сборки уберите `-H=windowsgui`.
Консольный вариант для отладки: уберите `-H=windowsgui`. Проверка:
Обычные тесты используют синтетические процессы. Нативные проверки включаются переменными окружения:
- `AP_NATIVE_PROCESSES=1`: проверка Windows API только на специально созданных дочерних процессах.
- `AP_NATIVE_GUI=1`: проверка собственного значка и меню трея; может кратко переключить фокус.
Нативные тесты не запускают системный сканер программы. Запускайте их вне защищённой игры.
## Иконки
Программа использует `chart_bar_edit` для трея и `cross` для пункта «Выход». PNG встроены в EXE.
Silk 1.3, **Mark James**, Creative Commons Attribution 2.5.
- Автор: http://www.famfamfam.com/lab/icons/silk/
- Источник: https://github.com/legacy-icons/famfamfam-silk
- Ревизия: `d6056f5c28e46c28403888ab7c013aced3928ec8`.
- Лицензия и контрольные суммы: `assets/SILK-LICENSE.md`, `assets/SILK-SOURCE.json`.
```text
go vet ./...
```