C ++可以访问内核模式注册表项访问?

时间:2011-10-15 18:06:41

标签: c++ windows registry

当我使用C#时,我只能访问用户模式注册表访问。

使用C ++访问内核模式注册表访问是否非常困难?

我记得在某处我可能要创建一个虚拟Windows驱动程序或什么?

编辑:基本上作为一个业余爱好项目,我希望创建一个简单的注册表监视器。但是,我确实希望捕获内核模式(以及用户模式)注册表访问.....上次我这样做,使用C#我无法访问内核模式活动。

1 个答案:

答案 0 :(得分:2)

有两种方法可以实现这一目标:

  • 挂钩内核中的相关功能 - 传统方式 - 需要C / Kernel驱动程序。这在x86 Windows上是可行的,但在x64 Kernel Patch Protection上将检测到这些修改并关闭系统(使用蓝屏)。
  • 构建registry filter driver - 这是现在鼓励的方法来解决此问题,并且是进程监视器的工作方式。您也可以这种方式构建文件系统筛选器驱动程序。基本上,您只需将信息传递回用户区,该用户区可归结为:

    IoRegisterDevice(...somewhere in \Devices\YourDriverName...)
    IoCreateSymbolicLink(\\DosDevices\Name -> \Devices\YourDriverName)
    

    然后C,C ++,C#应用程序应该能够打开文件\\.\YourDriverNameDeviceIoControl并接收回复。

可以使用C ++编写内核驱动程序,但是see this before you embark on doing so。更清楚一点,你需要非常小心内核模式(分页,非分页)中的内存,并且你不会访问大部分标准库。

顺便说一句,你应该知道:

  • 并非所有注册表配置单元都可供内核模式驱动程序访问,具体取决于上下文。
  • 路径并不常见。因此内核访问\Registry\System,而userland访问HKLM