如何在 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 系统扩展中分配内存并将其映射到另一个进程? 的相关文章

  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 如何在 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 系统扩展进程 并且可以