При записи ring0-кодом в нижние 2Гб, перезаписываемая страница изменяется для всех процессов в которые она отображена. А нужно чтобы создавалась измененная страница именно для данного процесса, как это делается при записи в ring3. Как быть?
Изначально страницы PE-файла в нижних 2Гб общие для нескольких процессов. Т.е. например страница из Kernel32.dll находится в одном экземпляре в оперативной памяти (или swop-файле) для всех текущих процессов. При попытке записи на такую страницу ring3-кодом (не важно в каком процессе) система создает копию данной страницы именно для этого процесса, и после этого данная страница изменяется только для этого процесса (все это написано у Рихтера). Так вот нужно, чтобы такое происходило при записи на страницу в ring0. А при записи в ring0, копирования при записи не происходит.
Все будет работать, нужно просто выставить странице PAGE_EXECUTE_WRITECOPY,из ядра это можно сделать правкой PTE или вызовом NtProtectVirtualMemory.
Т.н. "механизм copy-on-write" есть ни что иное как некоторый код, который процессор x486 выполняет в ответ на распознанное им исключение при обращении к некоторым образом описанной странице. А вообще, проблема решилась!!!!!!!!!!!!! Путем прямого прыжка на не экспортируемые из ntoskrnl NtProtectVirtualMemory/NtWriteVirtualMemory Главное чобы аргументы лежали в нижних 2Гб.