我想在 Mac OS X 上授权 USB/CD。现在我正在使用 DiskArbitration 框架在用户模式下获取 MountApprovalCallback。但是这个回调的问题是没有保证。如果我会收到回调,我将使用CFUserNotificationReceiveResponse()
它来接受用户的密码。但是当同时显示提示时,用户可以打开 DiskUtility 并可以挂载设备
所以,
- 有没有其他方法可以获取挂载批准回调或授权设备?
- 我如何在内核模式下处理它?
提前致谢。
我想在 Mac OS X 上授权 USB/CD。现在我正在使用 DiskArbitration 框架在用户模式下获取 MountApprovalCallback。但是这个回调的问题是没有保证。如果我会收到回调,我将使用CFUserNotificationReceiveResponse()
它来接受用户的密码。但是当同时显示提示时,用户可以打开 DiskUtility 并可以挂载设备
所以,
提前致谢。
mpo_mount_check_mount
在 kext 中,您可以通过MAC (TrustedBSD) 策略框架中的回调获取文件系统挂载回调的授权回调。你可以决定坐骑是否应该继续前进。我怀疑您不会从cred
参数中获得有关登录用户的任何信息,因为 mount 系统调用可能是由以 root 身份运行的守护程序启动的。我不知道您实际上要做什么,因此对于您的具体情况,这可能不是解决问题的最佳方法。
/**
@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,因此 Apple 表示它可能会在未来的版本中消失或中断。事实上,策略回调函数签名在 OS X 主要版本之间经常变化,因此您可能需要在运行时检查 OS X 版本,并为不同的版本使用不同的函数。您还需要及时了解 Apple 发布的任何测试版,以查看它们是否会破坏您的代码。
顺便说一句,这就是你实际使用它的方式:
com.apple.kpi.dsep
到您的 kext 的 OSBundleLibraries 字典中。(它使用 darwin 版本控制,因此使用与其他 com.apple.kpi.* 捆绑包相同的版本)#include <security/mac_policy.h>
在您的代码中(它已在 Kernel.framework 中提供)struct mac_policy_ops
,并初始化您感兴趣的任何函数指针字段,例如mpo_mount_check_mount
.mac_policy_register()
并保存它返回的句柄来注册您的策略。您需要使用一个mac_policy_conf
结构来配置您的策略,在该结构中您设置mpc_ops
为指向您的策略结构、mpc_loadtime_flags
指向MPC_LOADTIME_FLAG_UNLOADOK
、指向mpc_name
您的 kext 的反向 DNS 标识符、mpc_fullname
指向人类可读的字符串,并对其他所有内容进行零初始化。mac_policy_unregister()
您从mac_policy_register()
.在头文件中可以找到更多信息。