Всем привет, Я Артур Валиев, Не хотелось но на этот раз самому но я все-таки попрошу гуся что-бы помог рассказать мою историю.
Три дня назад я сидел и сравнивал 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() };
Я не мог до конца сформулировать эту статью, пока не написал этот код, а потом не понял: вот она, метафора, которую я искал. Окно продолжает работать. Оно рендерит, отвечает на клики, живёт полной жизнью. Оно просто перестаёт быть видимым в чужом захвате — чтобы не мешать тому единственному, что действительно должно быть увидено: потоку, который идёт наружу, к человеку по ту сторону экрана.
Вот и всё, что я хотел сказать про уход вглубь. Люди думают, что интроверсия и желание делиться — противоположности, что нужно выбрать одно из двух. Это ложная дихотомия для тех, кто строит вещи. Уход вглубь — не побег от людей, это единственный известный мне способ принести им что-то, что стоит их времени. Разработчик, который никогда не уходит в одиночество, никогда не напишет EVRTCK — он напишет очередной созвон о том, как было бы неплохо его написать. А тот, кто уходит и не возвращается — эгоист, и я не хочу им быть.
Настоящее движение — спираль: уйти вглубь, сделать вещь целиком, вернуться и отдать. Я ушёл не потому что ненавижу вас. Я ушёл, потому что это единственный способ, которым я умею вас любить — принести вам то, во что я верю, доведённым до конца, а не наполовину, и исключить из захвата только себя, а не тот сигнал, который идёт к вам.

Замыкание и желание делиться — это одно и то же движение
Вот тезис, ради которого я это пишу — и последний пример кода, самый честный.
На днях я нашёл причину, почему хост грузил процессор на 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() };
Окно продолжает работать. Рендерит, отвечает на клики, живёт полной жизнью. Оно просто перестаёт быть видимым в чужом захвате — чтобы не мешать единственному, что должно быть увидено: потоку, идущему наружу, к человеку по ту сторону экрана.
Вот, собственно, и вся разница между замыканием и высокомерием, которую я искал всю статью. Высокомерный разработчик выключает себя из захвата и на этом останавливается — наслаждается тем, что его никто не видит. Я выключаю себя из захвата, чтобы видно было не меня, а то, что я несу.
Уход вглубь и желание делиться — не два разных движения. Это один и тот же жест, снятый в двух разных кадрах. Сначала — тайлы, тишина, месяцы кода, который никто не проверит на прочность, кроме меня самого. Потом — момент, когда протокол наконец собирает кадр без единого артефакта, и единственное, что остаётся сделать — исключить себя из захвата и отпустить поток.
Я не ненавижу вас. Я просто дольше многих помню, что подарок нельзя вручать по частям.

iWowik
Что-то копипасты много. Два раздела одинаковых