Первым о тухлости описания начал говорить GSerg:
В моём MSDN говорилось, что функция GlobalAlloc отводит память уже с этим флагом, и особо подчёркивалось, что для выполнения сгенерированного в ней кода больше ничего не нужно.
Итак, мне потребовалось генерить динамический код. GlobalAlloc - подумал я (я ведь не знал что в старом описании такая ошибка
). Меня ждал облом. Пошёл смотреть сюда - ага, есть такое дело.
Мне нужно размещать в памяти маленькие процедурки (отличающиеся друг-от-друга одним лишь DWORD-ом).
Выход: можно резервировать и коммитить для них страницы памяти, самому следить когда коммитить новую страницу под функции, самому дефрагментировать страницы (да - ведь процедурки будут и удаляться, причём в абсолютно хаотичном порядке).
Никаких проблем нет, разве что реализовывать менеждер памяти для всего этого дела - влом и некогда.
Второй вариант: переложить всё это на плечи ОС. И размещать процедурки скажем в куче (а почему бы и нет?). Но у кучи изначально нет execute-права. Значит надо сделать страницы кучи исполнимыми с помощью VirtualProtect (а почем бы и нет?). Но если в какой-то системе попытка "grant PAGE_EXECUTE access" с помощью VirtualProtect обломится (об этом ведь говорил somebody), то я вынужден юзать первый вариант (т.е. управлять памятью самостоятельно).
Вот я и спрашиваю, правда ли то, что
somebody писал(а):в какой-то из осей права на выполнение только из VirtualAlloc.
Короче, там где работает DEP не получится выставить право на исполнение через VirtualProtect. Тока из VirtualAlloc
.