Мб потому что в Винде используется Windows ABI, а не GNU'сный?
Как вы предлагаете линковать либы, например, из современной SDK/WDK? Я вообще не уверен, что gnu бандл содержит адекватные хотя бы основные либы для виндовых фич. Последний раз, когда сталкивался пару лет назад, там было говно мамонта времён раннего pre SP3 Windows XP.
Если вам достаточно gnu тулчейна, значит вы HelloWorld'ы компилите без внешних платформенных зависимостей. Ну или сраные блокчейны с бекендами, перекладывающими байтики, тоже вполне соберутся. А что-то полезное под современную 10/11 винду типа драйверов или системных утилит им никак не слинкуешь.
gnu тулчейн под винду изначально создавался для кросс-компиляции, а не извращений.
Когда будут туториалы "Как включить компьютер", "Как установить Виндавс"?
Если уж на то пошло, то советуйте Even Better TOML вместо Better TOML, который заброшен и не поддерживается уж 4 года как.
Для подсветки синтаксиса и автодополнений есть два наиболее популярных расширения: Rust и rust-analyzer. Они работают немного по-разному и конфликтуют между собой. Я не буду глубоко разбирать, в чём у них различия, но rust-analyzer работает лучше, по тому берём его.
Различия у них в том, что vscode-rust больше года назад забросили, а позже вообще объявили deprecated в RFC2912. Оно не "плохо работает", оно вообще больше не разрабатывается. rust-analyzer ожидается в stable toolchain вместо RLS.
Без проблем всё пробрасывается с одной видеокартой, 5 лет почти сидел на такой системе.
Не знаю как сейчас, но раньше достаточно было выгрузить родной драйвер GPU, отдетачить нулевую vtconsole и разбиндить efi-framebuffer. При этом монитор изчезает, отлаживать можно через ssh. Потом, для каждого пробрасываемого устройства, разбиндить его драйвер и сразу же забиндить vfio-pci модуль на этот vid:did.
Чтобы вернуться в хост, нужно повторить всё в обратном порядке. Раньше даже автодетект работал, не нужно было запоминать прошлый драйвер. Была одна лишь проблема: USB-контроллеры были у меня дванольные, а третьих не было, либо были какие-то драфтовые, без реализованного hci reset, который при возврате в хост происходит. Из-за этого какое-то устройство могло остаться в потустороннем мире до перезагрузки. Решалось перетыкиванием девайсов в те контроллеры, которые умели reset. Сейчас, подозреваю, везде уже xhci, с его возвратом из забвения в реальность проблем вроде как нет.
И, кстати, не нужно ничего хардкодить ни в ядро, ни патчить, всё без проблем динамически делается, в отличие от сказанного в статье. Достаточно разобраться в проблеме, а не нагрести с форумов копипаста, как сделал автор и запилить очередную говностатью.
По поводу производительности. Имелась в те времена карточка GTX1070. По тестам на ФПС при максимальном тюнинге всех возможных параметров были потери порядка 2-3%. Основная проблема была в инпут-лаге. Если задротить в компетишн шутеры, заметна была "аквариумность". Есть вероятность, что в соврмеренных процах поменьше VM-exit'ов происходит на каждый чих, поэтому лаг может быть чуть предсказуемее.
Статья так себе, если честно. Основной смысл работы в такой системе как раз в файн-тюнинге.
Например, выделить память гостю можно через Huge Pages, чтоб поменьше дёргать страничный транслятор. Отключить merging страниц на худой случай, если huge pages против религии.
Вынести IO в отдельный тред, и запинить афинити чтобы, хоть и редкими, но локами, не снижать latency.
Отстроить маппинг очередей virtio-scsi, нативный TRIM, выключить промежуточные кеши. А ещё лучше заморочиться с vhost.
И ещё несколько десятков оптимизаций, которые уменьшат суммарный оверхед до пары процентов.
Для удобства выделения диска отлично подходит LVM thin provisioning: динамический ресайз, снапшоты и т. п. Хотя перформанс просаживал в несколько раз, когда юзал.
По сути, написали на том же Си, но с синтаксисом другого языка, абсолютно не разобравшись в языке.
unsafe в этом случае нужен для того, чтобы сделать safe-обёртку, RAII и т.п. Ваш же код ни на йоту не безопаснее кода на Си. Даже наоборот: unsafe во всех местах, а не в конкретных идиоматических -- верный генератор UB похлеще С++.
Что-то поменялось? windows-rs всегда без проблем работал со stable.
в нём есть библиотека bindings. Цель этой библиотеки — подключать зависимости для того, чтобы вы могли работать с Windows API в вашем приложении.
Цель этой библиотеки -- вынести биндинги в отдельный юнит для компилятора, чтобы каждый раз не запускать кодогенерацию и компиляцию. И не подключает она никаких зависимостей, она генерирует из метаданных обёртки, типы и адаптеры для удобного вызова extern функций. И да, это не биндинги в привычном их понимании, а именно wrapper'ы, которые, по опыту использования, очень хреново инлайнятся и кучу неявных side-эффектов генерят. Например, получая адрес функции, получаешь адрес незаинлайненного thumb wrapper'а, даже если фактический вызов заинлайнился, то есть, по сути, адрес мёртвого кода. При этом адрес получить можно только полным повторным extern fn объявлением для каждой WinAPI функции. Конечно, адреса нужны не всегда, но иногда нужно и много, не зря же Раст -- всё таки системный низкоуровневый язык.
Это — вызов макроса, который подключит все необходимые зависимости.
Опять таки, никаких зависимостей он не подключает, а просто инлайнит сгенерированный из метадаты исходник на Расте из стандартной директории выхлопа генератора.
Первое — функция main теперь должна возвращать windows::Result<()>
2. fn main должна возвращать результат, понятный Windows
Не выдумывайте, откуда вы взяли такое требование? main может возвращать любой тип, который реализует трейт std::process::Termination, хоть пустую юнит-стуктуру делайте и возвращайте из неё 42, никто не запрещает. Похоже, вы скопипастили из примеров код, не разобравшись, зачем там этот тип указан. А указан он для использования оператора ? на std::ops::Try-типах, то есть там, где возвращается либо COM'овский Result, содержащий WinRT'шную ошибку, либо растовый Result, полученный через какой угодно метод конвертации. Вы же ни разу этот оператор не использовали, значит тип возврата main тут не причём и может быть любым impl Termination.
Пишете, что нужно везде использовать W-версии функций, а сами используете A-версии.
deprecated же. RegisterClassEx сейчас рекомендуется использовать.
HWND(0)
То, что HWND == NULL и HWND == 0 имеют одинаковые значения -- чисто случайное implementation defined совпадение и потенциальное UB. В windows-rs трейт std::default::Default мапится на NULL handle.
extern "system" fn wndproc(...){ unsafe{...
Вся функция здесь -- unsafe. Нужно не блок внутри функции делать unsafe, а всё extern-объявление, ибо unsafe интерфейс и unsafe реализация -- разные вещи.
match message as u32
В чём сакральный смысл конвертации u32 в u32?
MessageBoxA(None, "Привет", "Это игра 2048 для Хабры", MB_OK | MB_ICONINFORMATION );
Поэтому нам не нужно извращаться и писать что-то типа:
MessageBoxA(std::ptr::null_mut(), ...
Здесь не стоит путать ABI указателя на ffi функцию и его мапинг из Option'а с костылём, который придумали в windows-rs. Это совершенно разные вещи. Из коробки работает толькоOption<extern fn()>. Другие типы без бубнов так не работают, нужны обёртки из трейтов.
Для этого используется относительная нумерация строк. Достаточно прыгнуть без переноса курсора на нужный экран, найти глазами искомую строку и вместо 200 набрать то число, которое стоит рядом с этой строкой. И выделится именно так, как вы описали с Shift+Click.
Когда это на автомате происходит из мышечной памяти, лично для меня это в разы, если не на порядки быстрее скроллинга и клика мышью.
Учитывая, как аргентинцы относятся к тем самым островам, какое количество плакатов, висящих вдоль трасс с единственной лишь надписью «Las Malvinas son argentinas» вместо рекламы, расставлено по всей Патагонии, вполне логично, что такой троллинг со стороны британцев планировался специально.
Будучи агрессорами в войне за острова, «случайно» выбрали номера с годом той самой войны и названием островов, «случайно» поехали в ту самую Огненную Землю, которой принадлежали острова, и совершенно не случайно там же получили разбитый Порше и камнями по лицу. Совпадение? Не думаю. Хотели знатно хайпануть. У них получилось.
Формат субтитров, который, вполне логично, тупой бот без контекста принял за жопу, и номер машины H982FKL (1982 год, когда была война за острова FalKLands), всё же — немного разное.
Помню проект, ещё когда в нём не было обработки коллизий мешей и мобы выбегали из стен, камней и других непонятных мест и убивали толпой. А в целом только положительные воспоминания из тех лет.
Всё верно, нет НИ ОДНОГО вендора, который бы своевременно закрывал подобные дыры или отзывал сертификаты. Всем абсолютно насрать.
А какой-нибудь Асус вообще превратит все свои драйверы в тыкву, если пофиксит большинство подобных решёт отзывом сертификатов.
На определённых ресурсах базы исчисляются гигабайтами подобных драйверов, подписанных полностью валидной подписью и отлично справляющихся со своими непредусмотренными задачами.
Античиты давно уже на вендоров не надеются, а пилят свои способы защиты.
Кстати, сами античиты — тот ещё рассадник дырявых god-mode API. Вышеупомянутый Black Desert — отличный пример того, как достаточно длительное время школьники хакали игру встроенным в неё же античитом :D
Кто знает, Авито научился бороться со схемой следующего вида?:
— Скамеры покупают компьютерную железку Х с доставкой.
— Просят сделать возврат, якобы (нерабочая / не подошла / не совместима / бес попутал).
— Приходит возвращённая *другая нерабочая/сгоревшая/дешёвая* железка Y.
— Покупатель пропадает.
— Поддержка разводит руками.
Сам не сталкивался, тонокостей не знаю, но слышал, что во время карантина очень много народу таким образом пострадало.
Расскажите, плз, кто знает, схема реальная или сами дураки / что-то делают не так? А то надо продать железок, но чёто очково на подобную хрень нарваться.
Этот Терминал написан с применением нового PTY Api, специально для этого созданном и появившемся в релизе 1809. На прочих версиях, соответственно, этого апи нет, и работать не будет.
Почему именно Мак?
Практически любой ноут с металлическим корпусом, за которым доводилось работать, бил током подобным образом. Это и Asus, и Dell и HP… Уже настолько к подобному привык, что не замечаю, нормой стало.
Флаттер ни под десктоп, ни под веб пока ещё не очень то юзабелен. Даже начальных релизов ещё не было, мастер только тащить. Только под Мак альфа вышла, насколько помню.
Последний раз, когда пробовал его, даже примеры из SDK были поломаны и не собирались. Так что, до Кьюта ему ещё долго ползти.
Мб потому что в Винде используется Windows ABI, а не GNU'сный?
Как вы предлагаете линковать либы, например, из современной SDK/WDK? Я вообще не уверен, что gnu бандл содержит адекватные хотя бы основные либы для виндовых фич. Последний раз, когда сталкивался пару лет назад, там было говно мамонта времён раннего pre SP3 Windows XP.
Если вам достаточно gnu тулчейна, значит вы HelloWorld'ы компилите без внешних платформенных зависимостей. Ну или сраные блокчейны с бекендами, перекладывающими байтики, тоже вполне соберутся. А что-то полезное под современную 10/11 винду типа драйверов или системных утилит им никак не слинкуешь.
gnu тулчейн под винду изначально создавался для кросс-компиляции, а не извращений.
Хабр -- для аутистов!
Когда будут туториалы "Как включить компьютер", "Как установить Виндавс"?
Если уж на то пошло, то советуйте
Even Better TOMLвместоBetter TOML, который заброшен и не поддерживается уж 4 года как.Различия у них в том, что
vscode-rustбольше года назад забросили, а позже вообще объявилиdeprecatedвRFC2912. Оно не "плохо работает", оно вообще больше не разрабатывается.rust-analyzerожидается в stable toolchain вместоRLS.Без проблем всё пробрасывается с одной видеокартой, 5 лет почти сидел на такой системе.
Не знаю как сейчас, но раньше достаточно было выгрузить родной драйвер GPU, отдетачить нулевую
vtconsoleи разбиндитьefi-framebuffer. При этом монитор изчезает, отлаживать можно через ssh. Потом, для каждого пробрасываемого устройства, разбиндить его драйвер и сразу же забиндитьvfio-pciмодуль на этот vid:did.Чтобы вернуться в хост, нужно повторить всё в обратном порядке. Раньше даже автодетект работал, не нужно было запоминать прошлый драйвер. Была одна лишь проблема: USB-контроллеры были у меня дванольные, а третьих не было, либо были какие-то драфтовые, без реализованного
hci reset, который при возврате в хост происходит. Из-за этого какое-то устройство могло остаться в потустороннем мире до перезагрузки. Решалось перетыкиванием девайсов в те контроллеры, которые умелиreset. Сейчас, подозреваю, везде ужеxhci, с его возвратом из забвения в реальность проблем вроде как нет.И, кстати, не нужно ничего хардкодить ни в ядро, ни патчить, всё без проблем динамически делается, в отличие от сказанного в статье. Достаточно разобраться в проблеме, а не нагрести с форумов копипаста, как сделал автор и запилить очередную говностатью.
По поводу производительности. Имелась в те времена карточка GTX1070. По тестам на ФПС при максимальном тюнинге всех возможных параметров были потери порядка 2-3%. Основная проблема была в инпут-лаге. Если задротить в компетишн шутеры, заметна была "аквариумность". Есть вероятность, что в соврмеренных процах поменьше VM-exit'ов происходит на каждый чих, поэтому лаг может быть чуть предсказуемее.
Статья так себе, если честно. Основной смысл работы в такой системе как раз в файн-тюнинге.
Например, выделить память гостю можно через Huge Pages, чтоб поменьше дёргать страничный транслятор. Отключить merging страниц на худой случай, если huge pages против религии.
Вынести IO в отдельный тред, и запинить афинити чтобы, хоть и редкими, но локами, не снижать latency.
Отстроить маппинг очередей virtio-scsi, нативный TRIM, выключить промежуточные кеши. А ещё лучше заморочиться с vhost.
И ещё несколько десятков оптимизаций, которые уменьшат суммарный оверхед до пары процентов.
Для удобства выделения диска отлично подходит LVM thin provisioning: динамический ресайз, снапшоты и т. п. Хотя перформанс просаживал в несколько раз, когда юзал.
Ох, из чего ж статью то высосали, а?
По сути, написали на том же Си, но с синтаксисом другого языка, абсолютно не разобравшись в языке.
unsafeв этом случае нужен для того, чтобы сделать safe-обёртку, RAII и т.п. Ваш же код ни на йоту не безопаснее кода на Си. Даже наоборот: unsafe во всех местах, а не в конкретных идиоматических -- верный генератор UB похлеще С++.Что-то поменялось?
windows-rsвсегда без проблем работал соstable.Цель этой библиотеки -- вынести биндинги в отдельный юнит для компилятора, чтобы каждый раз не запускать кодогенерацию и компиляцию. И не подключает она никаких зависимостей, она генерирует из метаданных обёртки, типы и адаптеры для удобного вызова
externфункций. И да, это не биндинги в привычном их понимании, а именно wrapper'ы, которые, по опыту использования, очень хреново инлайнятся и кучу неявных side-эффектов генерят. Например, получая адрес функции, получаешь адрес незаинлайненного thumb wrapper'а, даже если фактический вызов заинлайнился, то есть, по сути, адрес мёртвого кода. При этом адрес получить можно только полным повторнымextern fnобъявлением для каждой WinAPI функции. Конечно, адреса нужны не всегда, но иногда нужно и много, не зря же Раст -- всё таки системный низкоуровневый язык.Опять таки, никаких зависимостей он не подключает, а просто инлайнит сгенерированный из метадаты исходник на Расте из стандартной директории выхлопа генератора.
Не выдумывайте, откуда вы взяли такое требование?
mainможет возвращать любой тип, который реализует трейт std::process::Termination, хоть пустую юнит-стуктуру делайте и возвращайте из неё42, никто не запрещает. Похоже, вы скопипастили из примеров код, не разобравшись, зачем там этот тип указан. А указан он для использования оператора ? на std::ops::Try-типах, то есть там, где возвращается либо COM'овский Result, содержащий WinRT'шную ошибку, либо растовыйResult, полученный через какой угодно метод конвертации. Вы же ни разу этот оператор не использовали, значит тип возвратаmainтут не причём и может быть любымimpl Termination.Пишете, что нужно везде использовать W-версии функций, а сами используете A-версии.
Доступ в кишки тупла -- такое себе. В
windows-rsэта проверка делается через windows::Handle::is_invalid().deprecated же.
RegisterClassExсейчас рекомендуется использовать.То, что HWND == NULL и HWND == 0 имеют одинаковые значения -- чисто случайное implementation defined совпадение и потенциальное UB. В windows-rs трейт std::default::Default мапится на
NULLhandle.Вся функция здесь --
unsafe. Нужно не блок внутри функции делатьunsafe, а всёextern-объявление, ибо unsafe интерфейс и unsafe реализация -- разные вещи.В чём сакральный смысл конвертации u32 в u32?
Здесь не стоит путать ABI указателя на ffi функцию и его мапинг из
Option'а с костылём, который придумали в windows-rs. Это совершенно разные вещи. Из коробки работает толькоOption<extern fn()>. Другие типы без бубнов так не работают, нужны обёртки из трейтов.Когда это на автомате происходит из мышечной памяти, лично для меня это в разы, если не на порядки быстрее скроллинга и клика мышью.
V200j— и 200 строк выделены за 200мс.$ uptime -s
2021-04-08 12:34:25
$ ps -ejH | grep systemd | awk '{print $5, $6}'
00:02:40 systemd
00:06:33 systemd-journal
00:00:03 systemd-udevd
00:00:27 systemd-timesyn
00:00:07 systemd-logind
00:01:56 systemd-network
Целых 12 минут за 16 дней! 0.0005% драгоценного процессорного времени коту под хвост!
Расточительство!
А ещё невероятные 25 мегабайтов памяти смеет похитить! Как же с этим жить?!
В какой параллельной реальности живут хейтеры системды?
Будучи агрессорами в войне за острова, «случайно» выбрали номера с годом той самой войны и названием островов, «случайно» поехали в ту самую Огненную Землю, которой принадлежали острова, и совершенно не случайно там же получили разбитый Порше и камнями по лицу. Совпадение? Не думаю. Хотели знатно хайпануть. У них получилось.
Формат субтитров, который, вполне логично, тупой бот без контекста принял за жопу, и номер машины H982FKL (1982 год, когда была война за острова FalKLands), всё же — немного разное.
Коннекты на публичные DoH частенько отбивает по TCP RST по нескольку недель. Зависимости не выявил.
Нужно больше приватных серверов!
Помню проект, ещё когда в нём не было обработки коллизий мешей и мобы выбегали из стен, камней и других непонятных мест и убивали толпой. А в целом только положительные воспоминания из тех лет.
Спасибо за проект! =)
ПС Игра реверсилась своими силами, кстати?
Судя по истории, применить больше нигде не удалось?
Всё верно, нет НИ ОДНОГО вендора, который бы своевременно закрывал подобные дыры или отзывал сертификаты. Всем абсолютно насрать.
А какой-нибудь Асус вообще превратит все свои драйверы в тыкву, если пофиксит большинство подобных решёт отзывом сертификатов.
На определённых ресурсах базы исчисляются гигабайтами подобных драйверов, подписанных полностью валидной подписью и отлично справляющихся со своими непредусмотренными задачами.
Античиты давно уже на вендоров не надеются, а пилят свои способы защиты.
Кстати, сами античиты — тот ещё рассадник дырявых god-mode API. Вышеупомянутый Black Desert — отличный пример того, как достаточно длительное время школьники хакали игру встроенным в неё же античитом :D
Давно не читал таких качественных и литературных. Одни надмозги переводят в последнее время…
— Скамеры покупают компьютерную железку Х с доставкой.
— Просят сделать возврат, якобы (нерабочая / не подошла / не совместима / бес попутал).
— Приходит возвращённая *другая нерабочая/сгоревшая/дешёвая* железка Y.
— Покупатель пропадает.
— Поддержка разводит руками.
Сам не сталкивался, тонокостей не знаю, но слышал, что во время карантина очень много народу таким образом пострадало.
Расскажите, плз, кто знает, схема реальная или сами дураки / что-то делают не так? А то надо продать железок, но чёто очково на подобную хрень нарваться.
Практически любой ноут с металлическим корпусом, за которым доводилось работать, бил током подобным образом. Это и Asus, и Dell и HP… Уже настолько к подобному привык, что не замечаю, нормой стало.
Последний раз, когда пробовал его, даже примеры из SDK были поломаны и не собирались. Так что, до Кьюта ему ещё долго ползти.
Больше чем хелло ворлд крякми в нём не сделаешь.
— и так 99.9% кода с полностью завершённым анализом. Определил только пару сотен функций, хотя бинарник в районе 100 мегабайт, ничем не упакован.
Релайзу до нормального инструмента ползти ещё лет 5 минимум.