如何在 DriverKit 系统扩展中分配内存并将其映射到另一个进程?

2023-12-10

我已在应用程序中分配内存并将其指针和大小传递给IOConnectCallStructMethod. Using IOMemoryDescriptor::CreateMapping然后,我将此内存映射到 DriverKit 系统扩展进程,并且可以写入此映射的内存位置并从我的应用程序读取数据。

我现在想对系统扩展中分配的内存执行类似的操作,然后将其映射到使用系统扩展的应用程序。我想在系统扩展中创建一组内存缓冲区,然后从应用程序写入它,然后用信号向系统扩展发出信号IOConnectCallScalarMethod应该将给定的缓冲区发送到 USB 设备,使用IOUSBHostPipe::AsyncIO。当。。。的时候CompleteAsyncIO然后,发送完成后会出现回调,我会通知应用程序现在可以将数据复制到发送的第一个缓冲区。这个机制可能可以通过使用来完成IOConnectCallAsyncStructMethod,以及OSAction在系统扩展中创建的对象。我不明白的是如何将系统扩展中分配的内存映射到应用程序。


这是什么IOUserClient::CopyClientMemoryForType在DriverKit中是for,当你的用户进程调用时它会被调用IOConnectMapMemory64 from IOKit.framework。顺便说一句,kext 的等价物是IOUserClient::clientMemoryForType并且本质上工作原理完全相同。

为了使其工作,您需要覆盖CopyClientMemoryForType用户客户端子类中的虚函数。

在类定义中.iig:

virtual kern_return_t CopyClientMemoryForType(
    uint64_t type, uint64_t *options, IOMemoryDescriptor **memory) override;

在实施中.cpp,沿着这些思路:

kern_return_t IMPL(MyUserClient, CopyClientMemoryForType) //(uint64_t type, uint64_t *options, IOMemoryDescriptor **memory)
{
    kern_return_t res;
    if (type == 0)
    {
        IOBufferMemoryDescriptor* buffer = nullptr;
        res = IOBufferMemoryDescriptor::Create(kIOMemoryDirectionInOut, 128 /* capacity */, 8 /* alignment */, &buffer);
        if (res != kIOReturnSuccess)
        {
            os_log(OS_LOG_DEFAULT, "MyUserClient::CopyClientMemoryForType(): IOBufferMemoryDescriptor::Create failed: 0x%x", res);
        }
        else
        {
            *memory = buffer; // returned with refcount 1
        }
    }
    else
    {
        res = this->CopyClientMemoryForType(type, options, memory, SUPERDISPATCH);
    }
    return res;
}

在用户空间中,您可以调用:

    mach_vm_address_t address = 0;
    mach_vm_size_t size = 0;
    IOReturn res = IOConnectMapMemory64(connection, 0 /*memoryType*/, mach_task_self(), &address, &size, kIOMapAnywhere);

关于此的一些注释:

  • 中的值type参数来自于memoryType参数到IOConnectMapMemory64导致调用此函数的调用。因此,您的驱动程序可以有某种编号约定;在最简单的情况下,您可以像外部方法中的选择器一样对待它。
  • memory实际上是一个输出参数,当函数返回时,您应该在此处返回要映射到用户空间的内存描述符kIOReturnSuccess。该函数具有复制语义,即调用者希望获得内存描述符的所有权,即当不再需要它时,它最终会将引用计数减 1。返回的内存描述符不必是IOBufferMemoryDescriptor正如我在示例中所使用的,它也可以是 PCI BAR 或其他任何东西。
  • The kIOMapAnywhere选项中的IOConnectMapMemory64调用很重要,通常是您想要的:如果您不指定这一点,则atAddress参数成为输入输出参数,并且调用者需要在地址空间中选择驱动程序内存应该映射的位置。通常,您并不关心它在哪里,而且如果那里已经映射了某些内容,那么指定显式位置确实可能很危险。
  • 如果用户空间不得写入映射内存,请设置options参数为CopyClientMemoryForType因此:*options = kIOUserClientMemoryReadOnly;

要破坏映射,用户空间进程必须调用IOConnectUnmapMemory64().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 DriverKit 系统扩展中分配内存并将其映射到另一个进程? 的相关文章

  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 更改 Qt OpenGL 窗口示例以使用 OpenGL 3.3

    我正在尝试更改 Qt OpenGL 示例以使用更现代的 opengl 版本 330 似乎合适 所以我做了 在 main cpp 上设置版本和配置文件 设置着色器版本 更改着色器以使用统一 它现在构建没有任何错误 但我只看到一个空白窗口 我错
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 在 EnvDTE 中调试时捕获 VS 局部变量

    是否可以使用 EnvDTE 进行 vsix Visual Studio 扩展来捕获本地和调试窗口使用的调试数据 或者可以通过其他方法吗 我想创建一个自定义的本地窗口 我们可以修改它以根据需要显示一些较重的内容 而无需为高级用户牺牲原始的本地
  • 跨多个域的 ASP.NET 会话

    是否有合适的 NET 解决方案来在多个域上提供持久服务器会话 即 如果该网站的用户在 www site1 com 下登录 他们也将在 www site2 com 下登录 安全是我们正在开发的程序的一个问题 Thanks 它是否需要在会话中
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • 如何在 IgGrid 单元格(Infragistics)中获取正则表达式?

    如何在 igGrid 更新中的 igTextEditor 上使用正则表达式 我尝试使用验证选项 但没有成功 schedulerTable igGrid columns scope schedulerColumns width 87 heig
  • 如何使用 React 删除待办事项列表中的项目

    我正在使用 React 创建一个待办事项列表应用程序 在我的应用程序中 当我单击 x 按钮删除项目并使用 console log 检查当前数组时 我可以看到该数组已正确更新为我要删除的项目从数组列表中 但 Dom 只渲染我想要删除的项目而不
  • 提高自定义无限滚动的速度

    我有一个自定义的无限滚动 运行完美 但速度非常慢 这是处理 ajax 请求的脚本 function ga infinite scroll trigger this on infinite scroll add filter woocomme
  • JFreeChart X 轴标签超出图表区域

    我有一个JFreeChart图表与DateAxis作为域 它看起来非常漂亮 但是最后一个轴标签有时会超出图表区域 这是要重现的示例代码 public class LineChart AWT extends ApplicationFrame
  • Visual basic 和 Json.net Web 请求

    基本上我想做的是制作一个程序来列出英雄联盟的游戏信息 使用 API 来提取数据 其工作原理是 您搜索用户名 它会返回链接到该帐户的整数 然后您使用该整数搜索该帐户的所有信息 EG 帐户级别 获胜 损失等 我遇到了一个我似乎无法弄清楚的问题
  • 安装tensorflow需要多少空间?

    我正在尝试跑步pip install tensorflow from a Jupyter笔记本 尝试运行它cmd给出一个更陌生的error 并且我的可用磁盘空间 目前还剩 1 2 GB 在安装过程中似乎会减少 然后我会看到 Errno 28
  • Spark - 评级文件中的相关矩阵

    我对 Scala 和 Spark 还很陌生 无法从评级文件创建相关矩阵 它类似于这个问题但我有矩阵形式的稀疏数据 我的数据如下所示
  • MySQL 进行多个连接时 tmp 表的密钥文件不正确

    我不经常来这里寻求帮助 但我对此感到非常沮丧 我希望有人以前遇到过这种情况 每当我尝试使用多个连接从表中获取记录时 我都会收到此错误 126 Incorrect key file for table tmp sql 64d 0 MYI tr
  • 模块中的 AngularFire2 应用程序初始化与动态配置数据冲突

    我遇到了一个问题 因为我的配置数据是在运行时加载的 而 AnuglarFire2 想要模块声明中的数据 我可以通过直接注入访问数据 但我不知道如何将数据获取到模块文件中的 AngularFireModule 在运行时加载数据是将配置数据获取
  • 编译SDK会影响Android函数返回的值吗?

    假设我有一个设备 A 并且我的应用程序编译了两次 第一次设置compileSDK 8 第二次设置compileSDK 22 当我现在从 Android 系统调用函数时 系统是否有可能返回两个不同的值或对象 我认为这是不可能的 因为这取决于设
  • Tank Auth 添加字段

    我一整天都在使用 Tank Auth 库 对此有一个疑问 我在注册表单中添加了两个字段 分别是名字和姓氏 我试图找出为什么它没有插入到用户个人资料页面中 使用更新后的代码 我收到此错误 遇到 PHP 错误 严重性 警告 消息 Tank au
  • 接收错误警告:mcrypt_decrypt():IV 参数必须与块大小一样长

    我收到此错误 Warning mcrypt decrypt The IV parameter must be as long as the blocksize 它来自于使用与 php 手册站点上的代码基本相同的代码加密变量 http php
  • Pandas - 将列转换为 int 并强制 NaN

    给定如下数据框 colVals 05 17 55 703 21 3 89 891 11 05 17 55 703 21 3 217 891 12 05 17 55 703 21 3 217 891 13 05 17 55 703 21 3
  • 在自定义 TreeView 中添加拖放支持

    我已经成功填充了TreeView通过创建一个TreeDataProvider并定制了图标及其可折叠属性 现在我希望能够拖放其ViewItem s 到 WebView 上 不幸的是 没有用于拖放的示例 阅读通过TreeView来源 ViewI
  • 从 C 中的终端获取所有输出

    我目前正在开发 ssh 程序 我希望能够通过网络完全控制终端 我的问题是 如果我向服务器发送命令以在终端中运行 如何获取终端打印的输出 我看到很多帖子说要使用popen 命令 但根据我的尝试 我无法更改目录并使用它执行其他命令 只能执行简单
  • Maven - NoSuchMethodError:void com.google.common.base.Preconditions.checkArgument(布尔值,java.lang.String,java.lang.Object)

    我面临 Maven 和 Java 16 的问题 问题 当我尝试用 maven 打包我的项目时mvn package 我收到此错误 ERROR Error executing Maven ERROR java lang IllegalStat
  • 警告:不能给函数组件提供引用

    我正在使用 Next js 最新版本来制作我的博客网站 不知道为什么会显示错误 当我尝试制作表单时 会显示如下错误 Warning Function components cannot be given refs Attempts to a
  • 使用 javascript 基于交互式 ggplot 创建过滤器选择

    我创建了以下 Rmarkdown 文件 以根据单击交互式 ggplot 进行选择 在 javascript 块中 我想使用从以下位置获得的字母 A 或 B 代替 A 交互式 ggplot 中的 onclick 事件 如果用户单击多边形 B
  • 如何保护GAE服务器端计算逻辑?

    假设我的 html 表单有 100 个字段 填写所有字段后 系统会计算一些分数并向用户显示 假设分数值从 0 到 3000 当用户更改任何字段中的值时 我们向他显示值范围 0 1000 1001 2000 2001 3000 没有详细分数
  • 如何在 DriverKit 系统扩展中分配内存并将其映射到另一个进程?

    我已在应用程序中分配内存并将其指针和大小传递给IOConnectCallStructMethod Using IOMemoryDescriptor CreateMapping然后 我将此内存映射到 DriverKit 系统扩展进程 并且可以