Winapi 在用户空间和内核空间之间共享内存

Winapi 在用户空间和内核空间之间共享内存,winapi,memory,kernel,Winapi,Memory,Kernel,我正在windows xp中尝试在用户空间和内核空间之间共享内存。我想在用户级别写入内存并从内核驱动程序读取。是否有任何内置函数?用户模式端:有两种方法 1) 最常见/灵活的方式是在用户模式和内核模式之间进行通信,包括传递内存 自从我编写上一个内核驱动程序以来,已经有很长一段时间了(六年?XP时间段),所以这是对这个过程的概述,而不是确切的代码。但是,您的用户模式程序应该能够通过使用CreateFile并指定其名称(例如\\)。\yourname here获得“设备”的句柄或驱动程序的打开实例。

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

用户模式端:有两种方法

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

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

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

  __in_opt     LPVOID lpInBuffer,
  __in         DWORD nInBufferSize,
  __out_opt    LPVOID lpOutBuffer,
  __in         DWORD nOutBufferSize,
  __out_opt    LPDWORD lpBytesReturned,
使用这些,您可以向驱动程序提供数据(通过
lpInBuffer
指针和
nInBufferSize
参数指定数据的大小-此数据是什么或如何解释它取决于您的驱动程序),内核模式层可以通过
lpburffer
(指向您在用户模式下已经分配的内存的指针-这不是驱动程序设置的指针!),其大小以字节为单位,单位为
nOutBufferSize
(同样,您知道这一点,因为您在用户模式下分配了此缓冲区),然后驱动程序将告诉您它实际填充了多少缓冲区
lpBytesReturned

这篇维基百科文章描述了,DeviceIOControl就是一个例子

注意:您说过“我正在尝试在windows的用户空间和内核空间之间共享内存”。这并不完全是共享内存-例如,用户模式和内核模式都在同时读取或写入的内存不是共享内存。在
DeviceIOControl
函数调用期间,内核模式可以访问用户模式分配的内存,并向其传递指针(虽然从记忆上看,它比那个稍微复杂一点,但这就是效果。)即当你调用那个方法时,它只是“共享”的

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

内核模式方面:您也在编写内核驱动程序吗?如果是的话。本系列文章还介绍了允许用户模式使用
ReadFile
WriteFile
进行通信(如果您选择了这种方法)。

本书在前几章中介绍了通过IRPs/DeviceIOControl与内核驱动程序进行通信(至少,到目前为止,我在这方面已经走了多远。)