Проклятие детерминизма, или Меланхолия создателей цифровых миров

от автора

Всем привет, Я Артур Валиев, Не хотелось но на этот раз самому но я все-таки попрошу гуся что-бы помог рассказать мою историю.

Три дня назад я сидел и сравнивал 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() };

Окно продолжает работать. Рендерит, отвечает на клики, живёт полной жизнью. Оно просто перестаёт быть видимым в чужом захвате — чтобы не мешать единственному, что должно быть увидено: потоку, идущему наружу, к человеку по ту сторону экрана.

Вот, собственно, и вся разница между замыканием и высокомерием, которую я искал всю статью. Высокомерный разработчик выключает себя из захвата и на этом останавливается — наслаждается тем, что его никто не видит. Я выключаю себя из захвата, чтобы видно было не меня, а то, что я несу.

Уход вглубь и желание делиться — не два разных движения. Это один и тот же жест, снятый в двух разных кадрах. Сначала — тайлы, тишина, месяцы кода, который никто не проверит на прочность, кроме меня самого. Потом — момент, когда протокол наконец собирает кадр без единого артефакта, и единственное, что остаётся сделать — исключить себя из захвата и отпустить поток.

Я не ненавижу вас. Я просто дольше многих помню, что подарок нельзя вручать по частям.

=)

=)

ссылка на оригинал статьи https://habr.com/ru/articles/1066678/