Clerk да, все просто... когда есть исходник =) а ведь походу эта функция работает с флагами как с полями, потому они они и не сбрасываются.. интересно, это так специально задумано? =\ зы. кстати, откуда исходник-то? что-то я не нагуглил ничо подобного..
Ох, как не хотелось кусками формулировать из-за всяких таких мелких различий в версиях и возникающих несообразностей, но таки уже никуда не деться, не так ли? Все опции инклюзивны – они добавляются к уже существующим; убрать однажды выставленные флаги нельзя. Исключение – неинклюзивный бит 'ExecuteDisable'; более того, если он передан, то бит 'ExecuteEnable' функция также начинает рассматривать как неинклюзивный. Кроме того, как уже показал Clerk, если в результирующих опциях процесса начнёт присутствовать 'ExecuteEnable', то функция KeSetExecuteOptions() добавит флаги 'ExecuteDispatchEnable' и 'ImageDispatchEnable' (убрать их будет уже нельзя). Однако есть одно несоответствие: в xp sp2 [5.1.2600.2180] бит 'ExecuteEnable' всегда строго инклюзивен. Снять действительно нельзя. Для nt5: s/KeSetExecuteOptions/MmSetExecuteOptions. >так что же это значит, - тупик (для user-mode)? Тупик для устаревшей системы Позволим себе напомнить, что sp2 будет дропнут меньше чем через месяц. После этого никаких заплаток, никакого ничего. Хотя сама ветка nt5 ещё подёргается.
вобщем, удалось решить проблему патчем mmSetExecuteOptions в ntkrnlpa.exe, теперь значения флагов выставляются как нужно =). конечно это не универсальный способ (да может быть и нехороший), но раз ms... попутно был обнаружен небольшой жучок, скорее всего по вине компилятора: Код (Text): if ((ExecuteOptions & ~(MEM_EXECUTE_OPTION_VALID_FLAGS)) != 0) { return STATUS_INVALID_PARAMETER; Код (Text): :00444583 8B5D08 mov ebx, dword ptr [ebp+08] :00444586 81E3FFFF0000 and ebx, 0000FFFF :0044458C F7C3C0FFFFFF test ebx, FFFFFFC0 :00444592 7407 je 0044459B :00444594 B80D0000C0 mov eax, C000000D :00444599 EB7A jmp 00444615 and ebx, 0000FFFF приводит к тому что функция возвращает SUCCESS при установке флагов выше 0x0000FFFF (проверено на NtSetInformationProcess), впрочем более ни к чему не приводит (эти флаги не устанавливаются во флаги процесса). но, по сути поста, заплатка получилась довольно элегантной (как мне показалось) =), - с заменой всего одного байта: было: Код (Text): if (CurrentProcess->Pcb.Flags.Permanent == 0) { CurrentProcess->Pcb.Flags.ExecuteDisable = 0; ... стало: Код (Text): if (CurrentProcess->Pcb.Flags.Permanent == 0) { CurrentProcess->Pcb.Flags.ExecuteEnable = 0; ... оффсет 0x000445BF в файле, меняем FE на FD и сохраняем. прилепляю исходник утилиты, которая делает это сама + дамп MmSetExecuteOptions. ну вот собсно... leo, Clerk, Sol_Ksacap - АГРОМНОЕ спасибо за ваши посты! сам бы я давно уже забил.. и лишь благодаря вашим постам, которые подгоняли меня как кнут старую клячу, наконец-то все заработало как надо =) зы. кстати поначалу я не так понял насчет PAE (да и ваще я нуб по сабжу, - не судите строго): на самом деле ВСЕ процессы в Windows запускаются в PAE режиме (а значит могут быть легко переключены в DEP) если юзаеся ntkrnlpa (а не ntoskrnl), при этом в boot.ini стоят опции отличные от /execute, я имею ввиду /NoExecute= [OptIn, OptOut, Always...]. исходя из этого некоторые мои предыдущие посты могут иметь мало смысла..