【问题标题】:Sharing memory between user space and kernel space在用户空间和内核空间之间共享内存
【发布时间】:2012-03-02 16:11:57
【问题描述】:

我正在尝试在 windows xp 中的用户空间和内核空间之间共享内存。我想在用户级别写入内存并从内核驱动程序中读取它。是否有任何可用的内置功能?

【问题讨论】:

    标签: winapi memory kernel


    【解决方案1】:

    用户模式方面:有几种方法。

    1) 最常见/最灵活的方式是使用DeviceIOControl在用户态和内核态之间进行通信,包括传递内存。

    自从我编写最后一个内核驱动程序以来已经有很长一段时间(六年?XP 时间框架),所以这是对过程的概述,而不是确切的代码。但是,您的用户模式程序应该能够通过使用CreateFile 并指定其名称(例如\\.\YourNameHere)来获取“设备”的句柄或驱动程序的打开实例。使用该句柄与之通信(DeviceIOControl 的第一个参数。)

    您会感兴趣的四个参数是:

      __in_opt     LPVOID lpInBuffer,
      __in         DWORD nInBufferSize,
      __out_opt    LPVOID lpOutBuffer,
      __in         DWORD nOutBufferSize,
      __out_opt    LPDWORD lpBytesReturned,
    

    使用这些,您可以将数据提供给驱动程序(通过lpInBuffer 指针和nInBufferSize 参数指定它有多大——这个数据是什么或如何解释它取决于你的驱动程序)和内核——模式层可以通过lpOutBuffer(一个指向您在用户模式下已经分配的内存的指针 - 这不是驱动程序设置的指针!),它在nOutBufferSize 中的字节大小(再次你知道这一点)返回数据,因为你在用户模式下分配了这个缓冲区)然后驱动程序会告诉你它实际填充了多少缓冲区lpBytesReturned

    这篇 Wikipedia 文章描述了 general concept of ioctl functions,其中 DeviceIOControl 就是一个示例。

    注意:您说“我正在尝试在 windows 中的用户空间和内核空间之间共享内存”。这不是完全共享内存——例如,它不是用户模式和内核模式同时读取或写入的内存。它是内存,在DeviceIOControl 函数调用期间,内核模式可以访问您的用户模式分配的内存,您可以向它传递指针(尽管从内存中它比这稍微复杂一些,但这就是效果。)即,当您调用该方法时,它只是“共享”的。

    2) 另一种选择是使用ReadFileWriteFile,如果您只需要简单的数据传输并且内核驱动程序接受它。它不允许您像DeviceIOControl 那样进行双向通信(您提供驱动程序数据并返回错误代码),但它很简单,您可能已经熟悉这些 API。

    内核模式方面:您是否也在编写内核驱动程序?如果是这样,this article has information about implementing the kernel-mode side of IOCTL。本系列文章还介绍了允许用户模式使用ReadFileWriteFile 进行通信(如果您选择这些方法)。

    【讨论】:

    • 这本书 Rootkits: Subverting the Windows Kernel 在前几章中介绍了通过 IRP/DeviceIOControl 与内核驱动程序进行通信(至少,到目前为止我已经了解了这么多。)
    猜你喜欢
    • 2011-12-16
    • 2018-06-08
    • 2016-10-12
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多