Как указать флаг эмуляции x64 (EC_CODE) для разделов общей памяти для ARM64 Windows?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как указать флаг эмуляции x64 (EC_CODE) для разделов общей памяти для ARM64 Windows?

Сообщение Anonymous »

Я работаю над приложением, которое использует разделы общей памяти между процессами в Windows (для механизма IPC между процессами, когда один процесс генерирует код, который выполняется другим процессом). Я полагаю, что на устройствах Windows ARM64 общая память x64 не транслируется/эмулируется, что приводит к сбоям.
Я читал, что существует флаг MEM_EXTENDED_PARAMETER_EC_CODE (0x40), позволяющий пометить области памяти как содержащие код x64, требующий эмуляции. Я пытался использовать его в NtMapViewOfSectionEx, но он не распознается. как допустимый параметр (

Код: Выделить всё

0xC000000D
).

Код: Выделить всё

HANDLE hSection;
LARGE_INTEGER sectionSize = {0x8000};
NtCreateSection(&hSection, SECTION_ALL_ACCESS, nullptr,
&sectionSize, PAGE_EXECUTE_READWRITE, SEC_COMMIT, nullptr);

MEM_EXTENDED_PARAMETER extParam = {0};
extParam.Type = MemExtendedParameterAttributeFlags;  // Value is 5
extParam.ULong64 = MEM_EXTENDED_PARAMETER_EC_CODE;   // 0x40

PVOID baseAddress = nullptr;
LARGE_INTEGER sectionOffset = {0};
SIZE_T viewSize = 0x8000;

NTSTATUS status = NtMapViewOfSectionEx(
hSection,
targetProcess,
&baseAddress,
&sectionOffset,
&viewSize,
0, // AllocationType
PAGE_EXECUTE_READWRITE,
&extParam,
1 // ExtendedParameterCount
);
Используется следующая подпись:

Код: Выделить всё

typedef NTSTATUS(NTAPI* NtMapViewOfSectionEx)(HANDLE SectionHandle, HANDLE ProcessHandle, PVOID* BaseAddress, PLARGE_INTEGER SectionOffset, PSIZE_T ViewSize, ULONG AllocationType, ULONG Win32Protect, PMEM_EXTENDED_PARAMETER ExtendedParameters, ULONG ExtendedParameterCount);
Без MEM_EXTENDED_PARAMETER_EC_CODE сопоставление выполнено успешно, но не удается на устройствах ARM64 с Windows. Я знаю, что VirtualAlloc2 должен работать, но это противоречит моему варианту использования.

Код: Выделить всё

NtMapViewOfSectionEx
был опробован с флагом EC_CODE, чтобы пометить его как код x64. Результат: 0xC000000D — API не принимает EC_CODE? При использовании NtMapViewOfSectionEx без EC_CODE это работает. Я не уверен, что необходимо для перевода этих разделов.
Я также попытался использовать VirtualAlloc2 после сопоставления памяти, где мы могли бы пометить уже сопоставленную память как EC_CODE, однако это привело бы к поломке общей памяти из-за ее преобразования в частную память (копирование при записи).
Я ожидал, что Windows предоставит какой-то способ пометить память с поддержкой разделов флагом EC_CODE, аналогично тому, как VirtualAlloc2 работает.

Подробнее здесь: https://stackoverflow.com/questions/797 ... -for-arm64
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»