gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:35:41 27 4
gpt4 key购买 nike

我试图在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 .

这篇维基百科文章描述了 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 .本系列文章还介绍了允许用户模式使用 ReadFileWriteFile如果您选择该方法进行交流。

关于winapi - 在用户空间和内核空间之间共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9223590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com