【问题标题】:C++ function for "kernel memory check" before accessing访问前用于“内核内存检查”的 C++ 函数
【发布时间】:2018-01-11 02:52:12
【问题描述】:

我正在开发一个简单的设备驱动程序供学习。经过大量测试,我创建了如此多的错误,最终导致我的计算机蓝屏。我确信这是内存崩溃的原因。所以现在我想在继续之前检查我的代码是否可以访问内核内存。 我的问题是什么函数可以检查它是否可以在内核内存中访问。例如,有一个包含两个字段的指针结构,我想访问第一个字段,它也是一个指针,但现在知道它是否真的有一个可访问的值或只是垃圾值。 在这个给定的上下文中,我需要检查它以确保我没有出现蓝屏。 提前致谢!

【问题讨论】:

  • 关于内核驱动的问题需要指定相关的操作系统。此外,C 和 C++ 是不同的语言。你的问题似乎是关于 C++ 的;如果这确实是您的意图,请删除 [c] 标签。
  • 如你所说,我应该添加操作系统版本和语言。对于那个很抱歉。是的,Windows7 和 C++ 就是这样。
  • 最好在单独的计算机或虚拟机上进行测试,以免出现蓝屏问题。

标签: windows kernel driver c++14


【解决方案1】:

这对于内核内存是不可能的。您必须确切知道内核地址是否有效并且在访问期间有效。如果您从用户模式获取地址 - 您可以而且必须使用 ProbeForReadProbeForWrite。但这仅适用于 user-mode 缓冲区。对于任何 kernel 内存(甚至是有效的和常驻的),这个函数只会引发异常。从对内核内存地址的无效访问没有任何保护。尝试 - 除了处理程序在这里没有帮助 - 你刚刚得到了 PAGE_FAULT_IN_NONPAGED_AREA 错误检查

例如,有一个包含两个字段的指针结构,我想要 访问也是指针但现在知道的第一个字段 它是否真的具有可访问的价值或只是垃圾价值。

你从哪里得到这个指针?谁来填补这个结构?你不能检查。您必须在开始时知道该指针是有效的,并且结构的上下文在您使用它时将是有效的。否则你的代码已经有问题了

【讨论】:

  • 是的,在用户模式下,我们可以使用该函数“ProbeForRead”,但在内核模式下,从我昨天的测试来看,如果程序运行在同一级别,例如设备驱动程序,我可以访问任何地方.重点是检查指针是否确实指向正确的值。
  • @MinYoungLee - In user mode, we can use that function "ProbeForRead" - 我们可以在 kernel 模式下使用它来检查 user 模式地址。但我们无法检查内核模式地址。你必须知道地址是有效的但不是检查。简单的问题 - 你从哪里得到这个指针?
猜你喜欢
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 2014-07-30
相关资源
最近更新 更多