内核和用户模式之间共享内存。如何共享句柄?

2024-02-02

我正在尝试在用户进程和内核之间使用共享内存。

选项一 - 让内核创建部分并让用户模式应用程序通过名称“Global\my_mem”打开内存。它仅在只读模式下工作。当我尝试使用 FILE_MAP_WRITE 打开部分时,它会拒绝访问(5)。不确定如何授予访问权限或修改 DACL。

选项二 - 通过 IOCTL 将句柄传回。这是有问题的,因为在 KERNEL 中打开的部分的句柄是 0xFFFFFFFF80001234。据我了解,设置了任何高位的句柄不能在用户模式下使用。特别是如果应用程序是 32 位的话:) 最初我预计该部分句柄将与内核文件句柄有些相似,并且我将能够使用它。

在内核和用户模式之间建立共享内存通道的正确方法是什么?


对于选项 1,您可以通过以下方式指定分配给新创建的对象的安全描述符:SecurityDescriptor的成员OBJECT_ATTRIBUTES结构 https://msdn.microsoft.com/en-us/library/windows/hardware/ff557749%28v=vs.85%29.aspx.

对于选项 2,您需要创建一个附加句柄作为用户句柄,您可以通过不指定OBJ_KERNEL_HANDLE标志在OBJECT_ATTRIBUTES结构。仅当您在属于用户应用程序进程的线程上下文中运行时打开新句柄时,例如,在处理从用户应用程序接收到的 IOCTL 时,这才有效。

另一种选择是内核驱动程序将该部分映射到用户模式应用程序的地址空间本身,使用ZwMapViewOfSection https://msdn.microsoft.com/en-us/library/windows/hardware/ff566481%28v=vs.85%29.aspx.

使用节的一个问题是驱动程序本身只能从系统线程安全地访问它。如果这是一个问题,您可以直接共享内存,而不是通过一个部分。如果在内核模式下分配内存,则可以使用以下命令将其映射到用户模式应用程序的地址空间MmMapLockedPagesSpecifyCache https://msdn.microsoft.com/en-us/library/windows/hardware/ff554629%28v=vs.85%29.aspx.

还有一个选择是驱动程序访问由用户模式进程分配的内存缓冲区 https://stackoverflow.com/a/11047456/886887.

这些方法的缺点是缓冲区(或其共享的部分)必须锁定在内存中,而使用节则允许缓冲区可分页。

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

内核和用户模式之间共享内存。如何共享句柄? 的相关文章

  • 如何在 C# 中将 IEnumerable 转换为 Enum?

    我已将多个字符串解析为枚举标志 但看不到将它们合并为单个枚举位字段的巧妙方法 我使用的方法循环遍历字符串值 然后 将值转换为 Enum 对象 如下所示 Flags public enum MyEnum None 0 First 1 Seco
  • make: *** 没有规则可以创建“all”所需的目标“gcc”。停止

    我正在通过一个eg pgm 来创建一个make 文件 http mrbook org tutorials make http mrbook org tutorials make 我的文件夹eg make creation包含以下文件 des
  • 为什么shared_ptr删除器必须是可复制构造的?

    在 C 11 中std shared ptr有四个构造函数 可以传递删除器对象d类型的D 这些构造函数的签名如下 template
  • 哪些 .NET 依赖注入框架值得研究? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • gcc 无效版本(最大)错误添加符号:错误值

    我已经在 Linux x86 x64 上成功构建了几个 32 位静态和共享库 现在我尝试将它们链接到一个可执行文件 但出现以下错误 usr bin ld foo so moddi3 invalid version 21 max 0 foo
  • .net 日历 - 使整个单元执行回发(可点击)

    我已经启动并运行了一个 net 日历 并从数据库中获取信息 默认情况下 天数会应用回发操作 我想做的是将该操作应用于整个单元格 这样用户就不需要仅单击文本链接 我是 dayRenderer 操作 我有以下行来尝试复制该操作 但第二个参数我不
  • MaxLength 数据注释是否可以与 List 一起使用?

    一个可以用 MaxLength 具有字符串和简单数组的属性 i e MaxLength 500 public string ProductName get set Or MaxLength 50 public string Products
  • C++ 获取两个分隔符字符串之间的字符串

    C C 中是否有任何内置函数可以在两个分隔符字符串之间获取字符串 我的输入看起来像 STARTDELIMITER 0 192 168 1 18 STOPDELIMITER 我的输出应该是 0 192 168 1 18 提前致谢 你可以这样做
  • .NET 可移植类库 [可序列化] 属性

    我有一个公共类库 其中包含适用于我的服务器和客户端的许多模型 由于客户端在 Xamarin 下运行 因此公共库必须是可移植类库 PCL 在我的服务器中 这些对象通过 AppDomain Remoting Marshaling 传递 因此据我
  • 机器人可以从用户处接收图像作为消息或附件吗

    我希望用户能够将图像作为消息发送给机器人 这可能吗 我在网上搜索了解决方案 但我很累 请有人至少可以分享给我一个链接吗 Yes 来自nodejs文档here https learn microsoft com en us azure bot
  • 有丰富的领域模型示例吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个简单的示例来说明使用富域模型的好处 理想情况下 我想要一个之前和之后的代码列表 应该尽可能
  • 如何结束用户会话并确保用户已注销?

    我是 aspx 的新手 现在的问题是 因为我正在做一个支持网络的项目 所以我从用户那里登录了 我拖放登录模板 然后使用 Session Authentication username Tostring 存储当前登录用户的信息等 现在我什至使
  • 为什么指向 int 的指针会转换为 void* 而指向函数的指针会转换为 bool?

    C 标准草案 N3337 对指针转换有以下规定 4 10 指针转换 2 指向的指针 类型的右值cv T 在哪里T是一个对象类型 可以转换为 指向的指针 类型的右值cv void 将 指针转换为cv T 到 指向cv void 指向类型对象的
  • Python 比 C++ 更快、更轻吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么是排列索引?

    我正在阅读 加速 C 我不明白练习 5 1 设计并实现一个程序 根据以下输入生成排列索引 排列索引是其中每个短语由短语中的每个单词索引的索引 The quick brown fox jumped over the fence The qui
  • 检查字符串是否多次包含子字符串[重复]

    这个问题在这里已经有答案了 要搜索字符串内的子字符串 我可以使用contains 功能 但是如何检查一个字符串是否多次包含子字符串呢 优化这一点 对我来说 知道有多个结果而不是有多少就足够了 尝试利用快速IndexOf and LastIn
  • 为数据提供有效类型是否会产生副作用?

    假设我有一大块动态分配的数据 void allocate size t n void foo malloc n return foo 我希望使用指向的数据foo作为一种特殊类型 type t 但我想稍后再这样做 而不是在分配期间这样做 为了
  • 如何显式调用其 conversion-type-id 包含占位符说明符的转换函数

    struct A operator auto return 0 int main A a a operator auto 1 a operator int 2 GCC https godbolt org z 3jdaK9接受 2 是显式调用
  • 如何在类库中添加配置文件,后跟 .NET Core 1.1 的连接字符串

    我正在开发 n 层应用程序 其中有数据访问层 它独立于任何其他应用程序 我已经为 NET Core 1 1 创建了类库 我可以看到依赖项文件夹 但看不到任何配置 JSON 文件 我想知道 我可以在类库项目中添加 AppSetting JSO
  • WPF 中的 InvokeRequired [重复]

    这个问题在这里已经有答案了 我在一个中使用了这个函数Windows forms应用 delegate void ParametrizedMethodInvoker5 int arg private void log left accs in

随机推荐

  • 如何使用窗口标题启动powershell?

    我有一个批处理文件 允许我根据我的输入转到特定文件夹 d cd d test bits ECHO off cls start ECHO ECHO 1 Perl ECHO 2 Python set choice set p choice ty
  • Firebase 从 vagrant localhost:5000 提供服务

    我在 mac os high Sierra 上运行 vagrant ubuntu 16 04 我已将端口转发和符号链接设置为awesome local com 基本的node js Web应用程序运行完美 可以在指向awesome loca
  • 如何从 IntelliJ 中删除通过 pom.xml 添加的依赖项?

    我将 Spring Security 添加到 pom xml 和 IntelliJ IDEA 中的依赖项中 然后下载它 我检查了 http localhost 8080 并重定向到 http localhost 8080 login 我现在
  • Java支付网关库[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找类似于 Rails active merchant 的 Java 支付网关库或许多其他平台上可
  • Node.js 续集关联,包含条件

    是否可以在 findAll 查询的包含数组中传递条件 例如 我有 UsersModel PostsModel 和 UserVotesModel 用户可以对帖子进行投票 对于登录用户 我想查询帖子并仅包含当前用户的投票 我无法使用 Seque
  • 在Notepad++中选择换行符

    我注意到 当我加载文本文件时 Notepad 将识别并使用该文件中的任何换行符 n or r n 是否有一些选项可以让我选择默认情况下用于新文档的选项 我查看了帮助并用谷歌搜索 但找不到任何东西 对于任何新文档 Settings gt Pr
  • 如何用MySQL生成随机字符并插入? [复制]

    这个问题在这里已经有答案了 复制 向 MYSQL 数据库插入随机字符 https stackoverflow com questions 2498310 inserting random characters to mysql databa
  • Django Apache/mod_python 管理 CSS 未与管理表一起出现

    我的 Windows XP Django apache mod python 在本地主机上运行 除了管理 CSS 不渲染之外 所有部分都正常工作 管理员可以工作 但没有 html 格式 我做了补充 settings py INSTALLED
  • 字符串内容相同,但 equals 方法返回 false

    我正在使用 StringEscapeUtils 来转义和取消转义 html 我有以下代码 import org apache commons lang StringEscapeUtils public class EscapeUtils p
  • 如何将二进制数据“按原样”写入注册表(即:我仅将可见的二进制数据作为来自注册表编辑器的字符串)

    我一直在谷歌上搜索这个问题 一整天都没有找到可行的解决方案 我对二进制数据类型一无所知 因为我从来没有故意使用过它们 并且我正在尝试将我在注册表中看到的二进制值写入注册表 现在 我看到的只是以下内容 如下所示 如果我尝试将其作为字符串传递给
  • 如何合并二进制文件?

    我的my branch中有一个二进制文件 当我需要对其进行更改时 git当然不会合并它 所以我现在做的是 git checkout my branch make a change to gui bin mv gui bin git comm
  • k3d 尝试拉取 Docker 镜像而不是使用本地镜像

    只需在本地机器 Linux Mint 20 2 上研究K8S的核心即可 使用以下命令在本地创建一个节点集群 k3d集群创建mycluster 现在我想在容器中运行 spring boot 应用程序 我构建本地图像 库 0 1 0 这是摘自D
  • 如何摆脱 jQuery 数据表插件的分页?

    我怎样才能删除分页 and showjQuery 的特点数据表 http datatables net 我只想要它的搜索和排序功能 并想摆脱其他功能 有什么办法吗 如果你不使用 jQuery UI 主题 你可以这样做 document re
  • 如何删除Android Room数据库的文件?

    我已经实现了一个房间数据库 它是从资源文件中分发的SQLite资产助手 https github com jgilfelt android sqlite asset helper第一次启动应用程序时 数据库包含游戏状态数据 因此如果玩家想要
  • 如何生成字母表数组?

    在 Ruby 中我可以做 a z to a to get a b c d z JavaScript 是否提供类似的构造 我个人认为最好的是 alphabet abcdefghijklmnopqrstuvwxyz split 简洁 有效 易读
  • 在 Java 中转换字符

    我正在学习Java 我发现表达式通常必须转换为某种类型才能正确执行 例如 在算术计算期间 字节被提升为整数 因此以下表达式将引发错误 byte b 10 int i i b b ok assigning an integer evaluat
  • 核心文本 - 从 NSRange 获取像素坐标

    我怎样才能得到一个CGRect从一个NSRange对于使用 Core Text 渲染的文本 我正在使用核心文本NSAttributedString 这是绝对的痛苦 但可以做到 您需要使用以下命令获取框架中的所有线条CTFrameGetLin
  • 我正在使用 Redux。我应该管理 Redux 存储中的受控输入状态还是在组件级别使用 setState?

    我一直在试图找出管理我的反应表单的最佳方法 我尝试使用 onChange 来触发操作并使用表单数据更新我的 redux 存储 我还尝试创建本地状态 当提交表单时 我触发并执行操作并更新 redux 存储 我应该如何管理我的受控输入状态 我喜
  • NodeJS 套接字有时可以工作

    因此 我有一个节点服务器 运行expressjs io 使用socket io 并且我正在构建一个跟踪数据库中坐标的网格地图 只是 我遇到了一个特殊的问题 因为我的套接字只监听有时 起初没有错误消息 只是偶然我让页面运行并收到此错误 Unc
  • 内核和用户模式之间共享内存。如何共享句柄?

    我正在尝试在用户进程和内核之间使用共享内存 选项一 让内核创建部分并让用户模式应用程序通过名称 Global my mem 打开内存 它仅在只读模式下工作 当我尝试使用 FILE MAP WRITE 打开部分时 它会拒绝访问 5 不确定如何