есть (необычная) ситуация когда ring0 вызывает функцию в юзермодной длл. (как и для чего это делается отдельный вопрос, не относящийся к сути проблемы). на xp/2003/vista/2008/win7/win8 (32 и 64) всё работает стабильно. а вот на win 8.1 32 бит PAE (64 пока не смотрел) — вываливается в BSOD при попытке исполнения первой инструкции в user space.
#pf — ATTEMPTED_EXECUTE_OF_NOEXECUTE_MEMORY
Page-Fault Error Code: 0x11
the page fault was caused by a page-protection violation.
page fault is a memory read
access in supervisor mode
access that caused the page fault was an instruction fetch.
Virtual address for the attempted execute — совпадает с адрессом функцию в юзермодной длл (он же в CR2)
смотрю в PTE он валидный и NX бит в нём не установлен !
вообще все соседние PTE 'правильные' — там где в длл данные — есть NX для этих страниц, где код — нет
ну и если просто в ring3 вызвать функцию — то всё ok.
вообщем что-то никак не могу понять — почему процессор генерит исключение, если память executable (нет NX бита) и только в ring0 (по идее не должно зависит от этого а только от NX). ну и как я писал выше проблема появилась только на 8.1 — на всех предыдущих системах работает. есть какие-то мысли почему это происходит ?