在 mac OS X 上挂载批准回调

2024-04-26

我想在 Mac OS X 上授权 USB/CD。现在我使用 DiskArbitration 框架在用户模式下获取 MountApprovalCallback。但这个回调的问题在于它没有保证。 如果我会得到回调我正在使用CFUserNotificationReceiveResponse()接受用户的密码。 但当同时显示提示时,用户可以打开 DiskUtility 并可以挂载设备

So,

  1. 还有其他方法可以获取安装批准回调或授权设备吗?
  2. 我如何在内核模式下处理它?

提前致谢。


在 kext 中,您可以通过以下方式获取文件系统挂载回调的授权回调mpo_mount_check_mountMAC (TrustedBSD) 策略框架中的回调。您可以决定安装是否应该继续进行。我怀疑您不会从以下位置获得有关登录用户的任何信息cred参数,因为 mount 系统调用可能是由以 root 身份运行的守护进程启动的。我不知道你是什么actually尝试这样做,因此这可能不是针对您的具体情况解决问题的最佳方法。

/**
  @brief Access control check for mounting a file system
  @param cred Subject credential
  @param vp Vnode that is to be the mount point
  @param vlabel Label associated with the vnode
  @param cnp Component name for vp
  @param vfc_name Filesystem type name

  Determine whether the subject identified by the credential can perform
  the mount operation on the target vnode.

  @return Return 0 if access is granted, otherwise an appropriate value for
  errno should be returned.
*/
typedef int mpo_mount_check_mount_t(
    kauth_cred_t cred,
    struct vnode *vp,
    struct label *vlabel,
    struct componentname *cnp,
    const char *vfc_name
);

请注意,这是一个不支持的KPI,因此苹果表示它可能会在未来的版本中消失或中断。事实上,策略回调函数签名在主要 OS X 版本之间经常发生变化,因此您可能需要在运行时检查 OS X 版本并针对不同版本使用不同的函数。您还需要及时了解 Apple 发布的所有测试版,看看它们是否会破坏您的代码。

抛开这些,下面是实际使用它的方法:

  • 您需要链接到 MAC 框架 KPI,因此添加com.apple.kpi.dsep到你的 kext 的 OSBundleLibraries 字典。 (它使用 darwin 版本控制,因此请使用与其他 com.apple.kpi.* 包相同的版本)
  • #include <security/mac_policy.h> http://www.opensource.apple.com/source/xnu/xnu-2782.1.97/security/mac_policy.h在您的代码中(它已在 Kernel.framework 中提供)
  • 创建一个全局变量,或者在启动时分配一些内存来保存struct mac_policy_ops,并初始化您感兴趣的任何函数指针字段,例如mpo_mount_check_mount.
  • 当您的 kext 启动时,使用以下命令注册您的策略mac_policy_register()并保存它返回的句柄。您需要使用以下方式配置您的策略mac_policy_conf结构体,你设置的地方mpc_ops指向您的策略结构,mpc_loadtime_flags to MPC_LOADTIME_FLAG_UNLOADOK, mpc_name到您的 kext 的反向 DNS 标识符,mpc_fullname为人类可读的字符串,并对其他所有内容进行零初始化。
  • 您将立即开始接收对回调的调用,可能同时来自许多线程和进程,因此确保你的回调是线程安全的.
  • 在卸载之前,您的 kext 需要使用取消注册mac_policy_unregister()以及您收到的句柄mac_policy_register().

还可以找到很多信息在头文件中 http://www.opensource.apple.com/source/xnu/xnu-2782.1.97/security/mac_policy.h.

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

在 mac OS X 上挂载批准回调 的相关文章

  • 如何在 Mac 操作系统中播放声音?

    我想在专为 Mac OS X Lion 10 7 而不是 iPhone 设计的 Objective C 应用程序中播放 mp3 文件 谢谢 看看NSSound http developer apple com library mac doc
  • 在 OSX 上,Java 线程在不关注时会进入睡眠状态

    我正在编写一个程序来监听系统剪贴板的更改 侦听器在单独的线程上运行 并在剪贴板的内容更改时执行某些操作 例如写入文件 我正在使用轮询剪贴板剪贴板所有者界面 http www javapractices com topic TopicActi
  • 如何在全屏视图前面显示 NSPanel?

    我的应用程序以全屏方式运行 我需要类似 iOS 的 UIPopoverController 之类的东西 第一个想法是使用 NSPanel 但我无法让它显示在全屏视图前 我需要一个类似 UIPopoverController 的 Cocoa
  • 带有存储在文件中的通配符的 grep

    我希望 grep 通过读取需要从文本文件中过滤掉的内容来过滤掉行 这是我给 grep 的内容 它存储在foo txt Users 1337 X Users 1337 R Users 1337 W 这是它应该过滤的内容 它存储在bar txt
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 左右 mac“命令”键的配置不同吗?

    我想知道是否可以将右侧的 mac 命令 设置为像 ctrl 键一样 但保留左侧 命令 键的默认功能 谢谢 有一个非常棒的应用程序 称为 Ukelele 免费 不幸的是 它无法区分左右命令键 然而 我最近发现了一个更好的应用程序 名为 Con
  • Core Data 与 SQLite 3 [关闭]

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

    昨天我拍了很多照片 但我忘记更改相机中的时区 现在所有图片的修改日期都有错误 我想将特定目录中所有文件的修改日期更改为minus 10 hours bin sh for i in Users slick Desktop 100D5200 d
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 将 bash 提示符下的当前命令复制到剪贴板

    我想要一个快速的键盘命令序列 将 bash 提示符处的当前命令复制到剪贴板 例如 要将最后一个 bash 命令复制到剪贴板 我会按 up some command sequence 复制它 或者 例如 要在 bash 历史记录中搜索命令 我
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 使用 NSTokenField 强制 NSPopover 不成为第一响应者

    我有一个 NSTokenField 并且在弹出窗口内提供自定义自动完成功能 不幸的是 一旦显示弹出窗口 它就会强制 NSTokenField 放弃第一响应者 有没有办法显示弹出窗口但不丢失 NSTokenField 上的第一个响应者 重写
  • 使用 Python 查找 Mac OS X 中的当前活动窗口

    有没有办法使用 Python 在 Mac OS X 上查找给定时间当前活动窗口的应用程序名称 这应该有效 usr bin python from AppKit import NSWorkspace activeAppName NSWorks
  • Mac 到 EC2 - 源代码控制三角问题 - git?同步?啥?

    我有一个日常 EC2 实例 事实上 请注意那些更改IP每次重新启动它们时 都会出现另一个问题 实例上有一个文件夹 我在文件夹 mysql express 等 中有一个简单的 比如说 节点项目 比方说 这是一个网站 那么在我的 Mac 上进行
  • 如何自定义 NSSlider

    我正在尝试在 Cocoa 中实现一个具有 5 个值的自定义滑块 查看我的演示项目 可以在此处下载 http s000 tinyupload com index php file id 07311576247413689572 http s0
  • 如何确定两个文件路径(或文件 URL)是否标识 macOS 上的同一文件或目录?

    想象一下 macOS 上两个路径的简单示例 etc hosts private etc hosts 两者都指向同一个文件 但你如何确定这一点呢 另一个例子 Desktop Users yourname Desktop 或者在不区分大小写的文
  • 为什么我突然有一个弹跳的 Python 火箭?

    最近 我对在 OS X 10 10 Python 2 7 6 上运行的一些 matplotlib 代码做了一个简单的更改 注释掉了设置我使用的后端的一行 matplotlib use agg 现在 只要我的代码正在运行 我的扩展坞中就会出现
  • 阻止 OSX 变音符号为所有用户禁用 Java 中的 KeyBindings?

    注 我知道这个问题 https stackoverflow com questions 40335285 java keybinds stop working after holding down a key用户必须输入终端命令才能解决此问
  • 在 Mac OS X 应用程序上找到 Core Data 的 sqlite 数据库

    在哪里可以找到 Mac OS X 应用程序的 Core Data sqlite 数据库 我找到了它 但它是 momd 文件夹 包含 3 个文件 VersionInfo plist mom omo 我怎样才能看到它的内容 在 OS X 10

随机推荐