如何防止手动写页表项(PTE)时Windows内核锁定



我已经阅读了这个主题很多很多小时,并尝试了很多不同的策略,但无法使它以稳定的方式工作。

我在Windows内核中操作。我已经为一个进程分配了用户空间内存供其使用。这个内存需要是可执行的。我得到的最远的解决方案是遍历页表,为分配的用户空间内存找到匹配的PTE,并清除NX位。这"可以工作",但系统最终会死机。WinDbg内核调试器有时会报告死锁。

我认为这是因为Windows内核使用一些内部结构来操作这些表,但当然我没有访问权限。有人知道如何安全地找到并操作pte吗?我强调,当我不运行此代码时,根本不会发生此问题。我100%确定是这个PTE修改,而不是我的代码的其他部分导致了这个问题。

听起来像操作系统在试图访问您正在修改的相同页面时死锁了您。以前的内核版本有一个可以通过EPROCESS结构体访问的超空间锁,但是现在不再需要了。

…现在映射到" hyperspace "所需要的唯一"锁"是引发IRQL: HyperSpaceLock不再需要了。

如果IRQL的死锁问题(好像Geoff Chappell的话还不够)来自microsoft文档"锁、死锁和同步">

考虑在低IRQL下运行的代码成功获得锁的情况,但是线程被中断以运行更高IRQL的代码。如果高irql代码试图获取相同的锁,线程可能永远挂起。在高级irql代码退出之前,低级irql代码不能运行,但是在低级irql代码释放锁之前,高级irql代码不能运行。只涉及到一个线程。为了防止这个问题,获取锁的代码通常会将其IRQL提升到任何获得锁的驱动程序代码可以运行的最高IRQL。

所以,提高你的IRQL,你不应该死锁。只要确保尽快将其降低到被动级别,因为你正在扰乱一些重要的资源。

最新更新