【发布时间】:2012-03-02 16:11:57
【问题描述】:
我正在尝试在 windows xp 中的用户空间和内核空间之间共享内存。我想在用户级别写入内存并从内核驱动程序中读取它。是否有任何可用的内置功能?
【问题讨论】:
我正在尝试在 windows xp 中的用户空间和内核空间之间共享内存。我想在用户级别写入内存并从内核驱动程序中读取它。是否有任何可用的内置功能?
【问题讨论】:
用户模式方面:有几种方法。
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) 另一种选择是使用ReadFile 和WriteFile,如果您只需要简单的数据传输并且内核驱动程序接受它。它不允许您像DeviceIOControl 那样进行双向通信(您提供驱动程序数据并返回错误代码),但它很简单,您可能已经熟悉这些 API。
内核模式方面:您是否也在编写内核驱动程序?如果是这样,this article has information about implementing the kernel-mode side of IOCTL。本系列文章还介绍了允许用户模式使用ReadFile 和WriteFile 进行通信(如果您选择这些方法)。
【讨论】: