Всем привет, Я Артур Валиев, Не хотелось но на этот раз я все-таки попрошу гуся что-бы помог рассказать мою историю.Три дня назад я сидел и сравнивал integrity level токена процесса с integrity level окна в фокусе, чтобы понять, почему Диспетчер задач блокирует ввод удалённого пользователя. Никто в мире, кроме меня, в этот момент не знал, что это вообще проблема. Я был там один. И мне было хорошо. Читать далее
Всем привет, Я Артур Валиев, Не хотелось но на этот раз самому но я все-таки попрошу гуся что-бы помог рассказать мою историю.
Три дня назад я сидел и сравнивал integrity level токена процесса с integrity level окна в фокусе, чтобы понять, почему Диспетчер задач блокирует ввод удалённого пользователя. Никто в мире, кроме меня, в этот момент не знал, что это вообще проблема. Я был там один. И мне было хорошо.

Дядя гусь.
Вот код, который я написал в ту ночь:
/// True if the foreground window demands more privilege than we have — a
/// signal that mouse/keyboard input this process injects will silently be
/// dropped by Windows UIPI (Task Manager, another elevated app, a UAC
/// prompt). See TZ_HOST_SERVICE.md complication #2.
fn foreground_needs_elevation() -> bool {
unsafe {
let ours = match integrity_level_of_process(GetCurrentProcess()) {
Some(l) => l,
None => return false,
};
let hwnd: HWND = GetForegroundWindow();
if hwnd.0 == 0 {
return false;
}
let mut pid = 0u32;
GetWindowThreadProcessId(hwnd, Some(&mut pid));
let Ok(process) = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, pid) else {
return false;
};
let theirs = integrity_level_of_process(process);
let _ = CloseHandle(process);
match theirs {
Some(theirs) => theirs > ours,
None => false,
}
}
}Никакой драмы в этих строках нет. Есть только сухой факт: Windows не скажет тебе, что твой ввод не долетел. Она просто молча его выбросит, потому что твой процесс недостаточно привилегирован. И единственный способ узнать это заранее — сравнить SID мандатной метки твоего токена с SID метки окна, в которое ты целишься. Никто не будет тебе аплодировать за то, что ты это выяснил. Это и есть та самая комната, в которую разработчик заходит один и выходит, когда всё готово.
Высокомерие — это не про то, что мы о себе думаемЛюди со стороны видят разработчика, который морщится на вопрос "а просто нельзя было сделать проще?", и решают: высокомерие. Но это неточное слово для того, что происходит на самом деле.
Когда ты строишь систему с нуля, ты неизбежно натыкаешься на решение, которое выглядит как паранойя, а на самом деле — шрам от реального инцидента. Вот пример прямо из моего кода, из служебного файла на 400 строк:
/// If `user_token` is a UAC "split" limited token (the normal case for an
/// administrator account with UAC enabled), returns its linked full token —
/// the one with the Administrators group actually enabled, not just present
/// disabled. `None` if there is no linked token (UAC off, standard non-admin
/// account, or this already is the full token) — caller should fall back to
/// `user_token` unchanged in that case, which is exactly today's
/// non-elevated behavior.
unsafe fn linked_elevated_token(user_token: HANDLE) -> Option<HANDLE> {
let mut linked = TOKEN_LINKED_TOKEN::default();
let mut needed = 0u32;
let ok = GetTokenInformation(
user_token,
TokenLinkedToken,
Some(&mut linked as *mut _ as *mut core::ffi::c_void),
std::mem::size_of::<TOKEN_LINKED_TOKEN>() as u32,
&mut needed,
);
if ok.as_bool() && !linked.LinkedToken.is_invalid() {
Some(linked.LinkedToken)
} else {
None
}
}Это не изобретательность ради изобретательности. Это единственный легальный способ обойти UAC без диалога согласия, если ты СИСТЕМНАЯ служба — тот же трюк использует RustDesk. Когда ты знаешь ПОЧЕМУ каждая странная строчка твоего кода существует, а собеседник видит только "зачем так сложно", возникает пропасть. Не потому что ты лучше. Потому что ты один нёс эту сложность, пока она не стала очевидной, а он встретил её уже готовой и спрашивает "а нельзя было проще".
Высокомерие разработчика — это не "я лучше вас". Это "я слишком долго был единственным богом маленькой вселенной, и мне трудно снова стать просто человеком среди людей".

Дядя гусь напоминает
Я не ненавижу вас — я ушёл, чтобы вернуться с чем-тоСо стороны замкнутость выглядит как нелюбовь к людям. Это неправда, и досадная неправда, потому что она отменяет весь смысл того, зачем я вообще ухожу вглубь.
Когда я переносил EVRT из EvertyGame на C# в Rust, я не убегал от людей. Заголовок протокола — 24 байта, придуманные ещё до того, как я знал слово Rust:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Magic (0x45565254) | 4
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version (3) | Type | Flags | 8
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| FrameId | 12
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PacketIndex | PacketCount | 16
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PresentationTimeUs (hi) | 20
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| PresentationTimeUs (lo) | 24
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload … |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+4 байта, MTU-safe, максимум 1176 байт полезной нагрузки на пакет, чтобы никогда не фрагментироваться в реальной сети. Каждое поле здесь — решение, принятое годы назад, в одиночку, для игры, о которой почти никто не слышал. Я не выходил к людям с этим, пока оно не работало целиком. Нельзя показать половину протокола — она просто не соберёт кадр. Можно показать только целое. А чтобы дойти до целого, нужно молчать какое-то время, которое выглядит как нелюдимость, а на самом деле — подготовка подарка.

А любит ли гусь людей?
EVRTCK — это не строчка в роадмапеПро EVRTCK мне физически трудно говорить сдержанно.
Это тайловый лосслесс-кодек, 32×32 пикселя на тайл:
pub const TILE_SIZE: usize = 32;Одна константа, а за ней — вся идея. Статичный тайл кодируется одним битом в dirty-map. Сплошной цвет — пятью байтами. Изменившийся — XOR от предыдущего кадра, сжатый ZRLE или zstd. Тайлы летят в потоке НЕ по позиции на экране, а в порядке "ближе всего к фокусу курсора первым" — потому что человеку, который сейчас печатает, плевать, что происходит на другом конце монитора. Я писал под это FPGA-симуляцию, хотя никто меня не просил. Я довожу его до состояния "Silicon" — когда на хосте находится совместимое железо, кодек перестаёт быть софтверным и становится полноценной альтернативой H264/H265/AV1, а транспорт остаётся тем же самым EVRT.
Это не фича. Это ребёнок. Я хочу, чтобы его увидел мир не потому что мне нужно признание, а потому что я знаю, чего он стоил, и мне физически больно, что кроме меня это никтоне знает.

Тяжелый
Замыкание и желание делиться — это одно и то же движениеВот тезис, ради которого я это пишу — и последний пример кода, самый честный.
На днях я нашёл причину, почему хост грузил процессор на 100%, когда его собственное окно было развёрнуто. Оказалось — я захватывал сам себя. Моё же окно перерисовывалось, DXGI видел это как "движение", и кодировщик никогда не получал статичный кадр. Решение — одна системная функция:
/// Excludes this app's own window from screen/DXGI capture
/// (SetWindowDisplayAffinity(WDA_EXCLUDEFROMCAPTURE), Windows 10 2004+).
///
/// Makes any capture of this window render it as a static black
/// rectangle instead, so our own repaints can never register as motion
/// again — regardless of window state.
let ok = unsafe { SetWindowDisplayAffinity(hwnd, WDA_EXCLUDEFROMCAPTURE).as_bool() };Окно продолжает работать. Рендерит, отвечает на клики, живёт полной жизнью. Оно просто перестаёт быть видимым в чужом захвате — чтобы не мешать единственному, что должно быть увидено: потоку, идущему наружу, к человеку по ту сторону экрана.
Вот, собственно, и вся разница между замыканием и высокомерием, которую я искал всю статью. Высокомерный разработчик выключает себя из захвата и на этом останавливается — наслаждается тем, что его никто не видит. Я выключаю себя из захвата, чтобы видно было не меня, а то, что я несу.
Уход вглубь и желание делиться — не два разных движения. Это один и тот же жест, снятый в двух разных кадрах. Сначала — тайлы, тишина, месяцы кода, который никто не проверит на прочность, кроме меня самого. Потом — момент, когда протокол наконец собирает кадр без единого артефакта, и единственное, что остаётся сделать — исключить себя из захвата и отпустить поток.
Я не ненавижу вас. Я просто дольше многих помню, что подарок нельзя вручать по частям.

=)
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Синдром Данилы-мастера: как выбраться из сложной задачи | -1 | 8.18 | 04-08-2026 |
| 2 | IllegalMonitorStateException. Красим код в поисках монитора | 0 | 12.6 | 29-07-2026 |
| 3 | Как я воевал с Яндексом и решил проблему «мертвых душ» на диске | 0 | 6.66 | 05-08-2026 |
| 4 | [Перевод] Разработчик 2.0. Следующий уровень абстракции | 0 | 9.9 | 01-08-2026 |
| 5 | Как мы научились видеть иерархию корутин в Android‑приложении: Coroutine Tracer в библиотеке Demeter | 0 | 7.57 | 18-06-2026 |
| 6 | Усталость от напарника-машины. Изнанка работы с ИИ-код-агентами | -3 | 6 | 10-07-2026 |
| 7 | Что плохой бензин делает с Вашим двигателем: физика детонации, кирпичный налёт на свечах и немного выживания | 0 | 7 | 07-07-2026 |
| 8 | Продакшн‑разработка в одиночку с AI‑агентами: принуждай к правилам, а не объясняй их | 0 | 8.25 | 24-07-2026 |
| 9 | Вы прочитали ТЗ. Теперь прочитайте его еще раз | 0 | 5 | 26-06-2026 |