我试图在windows xp中共享用户空间和内核空间之间的内存.我想在用户级写入内存并从内核驱动程序中读取它.是否有任何可用的内置函数?
用户模式方面:有两种方法.
1)最常见/最灵活的方式是用于DeviceIOControl在用户模式和内核模式之间进行通信,包括传递内存.
自从我编写了上一个内核驱动程序以来,已经很长时间了(6年?XP时间框架),所以这是对流程的概述,而不是确切的代码.但是,您的用户模式程序应该能够通过使用CreateFile和指定其名称来获取"设备"的句柄或驱动程序的打开实例,\\.\YourNameHere例如.使用该句柄与之通信(第一个参数为DeviceIOControl.)
您将感兴趣的四个参数是:
__in_opt LPVOID lpInBuffer,
__in DWORD nInBufferSize,
__out_opt LPVOID lpOutBuffer,
__in DWORD nOutBufferSize,
__out_opt LPDWORD lpBytesReturned,
Run Code Online (Sandbox Code Playgroud)
使用这些,您可以向驱动程序提供数据(通过lpInBuffer指针和nInBufferSize 参数指定它的大小 - 这些数据是什么或如何解释它取决于您的驱动程序)并且内核模式层可以提供数据lpOutBuffer(a指向内存的指针,在用户模式下,已经分配了 - 这不是驱动程序设置的指针!),它的大小以字节为单位nOutBufferSize(再次你知道这一点,因为你在用户模式下分配了这个缓冲区)然后驱动程序将告诉你它实际填充了多少缓冲区lpBytesReturned.
这篇维基百科文章描述了ioctl函数的一般概念,其中DeviceIOControl就是一个例子.
注意:您说"我正在尝试在Windows中的用户空间和内核空间之间共享内存".这不是完全共享的内存 - 例如,用户模式和内核模式不是同时读取或写入的内存.它是内存,在DeviceIOControl函数调用期间,内核模式可以访问你传递指针的用户模式分配的内存(尽管从内存中它稍微复杂一点,但这就是效果.)即它只是在您调用该方法时"共享".
2)另一种选择是使用ReadFile,WriteFile如果你只需要简单的数据传输而内核驱动程序接受它.它不允许你进行双向通信DeviceIOControl(你给出了驱动程序数据并且它给你一些带有错误代码的东西),但它很简单,你可能已经熟悉这些API.
内核模式方面:你也在编写内核驱动程序吗?如果是这样,本文提供了有关实现IOCTL的内核模式方面的信息.本系列文章还介绍了如果您选择这些方法,允许用户模式使用ReadFile和WriteFile进行通信.