ARM64X объединяет код для разных ABI в одном PE‑файле для Windows на Arm. Файл может содержать как классический ARM64, так и ARM64EC‑код; загружающий процесс получает представление о доступных в файле вариантах, и это представление влияет на совместимость с плагинами и библиотеками.
Когда нужно явно выбирать режим запуска
Если приложение загружает плагины или расширения с разными требованиями к ABI, целесообразно задать архитектуру создаваемого процесса заранее. В типичном сценарии одно расширение ожидает ARM64‑процесс, другое — совместимость с x64 через ARM64EC. Без явного указания процесс может быть запущен в режиме, несовместимом с одним из плагинов, что приведёт к ошибкам загрузки.
Для передачи желаемой архитектуры при создании процесса используется атрибут PROC_THREAD_ATTRIBUTE_MACHINE_TYPE. Вызов UpdateProcThreadAttribute принимает указатель на WORD с константой архитектуры; этот атрибут настраивается в структуре STARTUPINFOEX перед CreateProcess и влияет на режим, в котором будет создан дочерний процесс. Атрибут является механизмом подготовки окружения запуска, а не переключателем для уже работающего процесса.
Практические замечания по реализации
- Проверяйте требования загружаемых модулей заранее: определите, какие ABI они поддерживают, и выбирайте режим запуска, совместимый со всеми критичными компонентами.
- Не полагайтесь на автоматическое «переключение» процесса: изменение режима требует создания нового процесса с соответствующими атрибутами.
- Ограничьте количество перезапусков: при ошибках загрузки DLL реализуйте явную политику повторных попыток и отказа, чтобы избежать бесконечных циклов перезапуска между режимами.
- Учтите ограничения ОС и оборудования: наличие ARM64X‑файла не гарантирует нативного запуска на любой x64‑машине; совместимость зависит от конкретной версии Windows, реализованных ABI и поддержки соответствующих механизмов загрузки.
Вывод
Если приложение использует плагины с разными ABI, задавайте архитектуру при создании процесса через PROC_THREAD_ATTRIBUTE_MACHINE_TYPE в STARTUPINFOEX. Это поможет обеспечить совместимость и контролировать поведение при загрузке модулей, при этом следует реализовать защиту от бесконечных перезапусков и учитывать ограничения конкретной ОС и ABI.