问题标签 [kernel-extension]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - 在 Mac 上使用 KEXT 进行文件 I/O
观察到有vn_xxx api对文件进行操作,例如vn_rdwr(...)。从网上搜索,似乎不建议使用 vn_rdwr(...) 。
几乎没有相同的查询:
- 这个 vn_xxx api 在 Mac OS X 版本之间是否不兼容?
- 使用它不安全吗?有没有我可以参考的例子来看看 vn_rdwr 是如何使用的?
- 除了将文件 I/O 委托给守护进程之外,还有其他选择吗?
如果有人可以提供评论\建议会很棒吗?
gcc - 使用 GCC 导入 AIX 内核扩展文件
我正在 AIX 6.1 上使用内核扩展构建示例程序。
实际上,我做了一个扩展文件,但我不知道如何导入它。
通常使用 IBM C 编译器的人可以使用“-bI:test.esp”来导入它。当我将此选项用于测试程序时。我收到以下错误。
c - 执行 AIX 内核扩展程序时出错
我是 AIX 的新手。我在编译内核扩展时遇到了很多错误。在那之后,我终于编译并链接了。
但是当我执行二进制文件时,我得到了这个错误。
有人可以帮我吗?
我是这样编译的。我误会了什么?
macos - 如何识别正在关闭的文件在 Mac KEXT 的操作 KAUTH_FILEOP_CLOSE 中被修改或创建
观察到在文件修改或文件复制期间,FWRITE 或 KAUTH_FILEOP_CLOSE_MODIFIED 在动作 KAUTH_FILEOP_CLOSE 中的设置不一致。
我的用例是 - 我试图弄清楚正在关闭的文件是修改后的文件还是新创建的文件。我想忽略未修改的文件。
根据文档,当文件操作为 KAUTH_FILEOP_CLOSE 时,我正在检查 KAUTH_FILEOP_CLOSE_MODIFIED 标志。大多数时候,我观察到当文件从一个位置复制到另一个位置或文件被修改时,未设置 KAUTH_FILEOP_CLOSE_MODIFIED。
我还观察到设置了 FWRITE 标志,但对于修改或复制的文件并不一致。我只是想知道为什么行为如此不一致。
我在想的另一种方法是依赖 vnode 操作 KAUTH_VNODE_WRITE_DATA,但我观察到在 KAUTH_FILEOP_CLOSE 之后甚至没有修改文件时也有多次调用 KAUTH_VNODE_WRITE_DATA。
知道为什么存在这种行为吗?
提前致谢。
问候,
鲁佩什
macos - OS X 上的 USB 设备枚举
我有一个用于连接 USB 单芯片设备 (CSR BC4) 的无代码 kext - 效果很好。如果我将多个设备连接到外部集线器,它仍然可以正常工作。
在我的 info.plist 的 IOKitPersonalities 字典中,对于设备和接口字典,我一直在 IOBluetoothFamily.kext 中的 CSR 驱动程序上匹配一个引用该 CSR kext 和该包中的 IOClass 的 CFBundleIdentifier。
快进到在内部集线器上使用多个 CSR BC7 芯片的新设备。长话短说,我无法让该设备正确匹配设备中的所有芯片。苹果驱动程序通常会抓取两个芯片。如果我插入两个设备,我会从一个设备中获取所有芯片,而从另一个设备中获取任何芯片。几天的挖掘随之而来。我一直在 Apple 列表中看到有关使用“com.apple.kernel.iokit”或“com.apple.kpi.iokit”的 CFBundleIdentifier 和“IOService”的 IOClass 的参考资料
我尝试了 com.apple.kernel.iokit,但我的两个设备都没有运气。由于我在 64 位平台上,我决定尝试 com.apple.kpi.iokit - 宾果游戏!两种设备都像魅力一样工作。
我的问题是我真正匹配的是什么?我可以理解将设备与现有驱动程序匹配,但在这种情况下我匹配的是什么?我无法从 Apple 那里找到任何能真正告诉我我在做什么的确切信息。
任何帮助表示赞赏!
初始人格示例:
当前人格示例:
macos - 在内核控制 ctl_enqueuedata 调用中识别 EINVAL
我想使用内核控件将消息从内核扩展发送到用户程序。我打电话EINVAL
时遇到错误ctl_enqueuedata
。
我已经设置了一个内核控件,我正在尝试使用ctl_enqueuedata
. 我在设置
在传递给 之前ctl_register
,文件建议,这应该导致ctl_unit
被自动设置。
引用kern_control.h
:
对于动态分配的控件 ID,不要设置 CTL_FLAG_REG_ID_UNIT 标志。
...
当我打电话ctl_register
时,它返回0
正常。
当我打电话时ctl_enqueuedata
,传入我的struct kern_ctl_reg
我得到 22,即EINVAL
。其中一个论点似乎是不正确的。我传递的其他参数是静态测试字符串及其数据长度和零标志。
myep_ctl
的.ctl_unit
值为0
, 的.ctl_id
值为6
。可能ctl_unit
是传递给的值ctl_enqueuedata
无效/未初始化吗?
kern_control.h
说ctl_unit:
对于动态分配的控件 ID,此字段将被忽略
这表明无论如何都不需要它?
我在初始化 ep_ctl 时错过了什么吗?
kernel-extension - 内核通信
我想将一组数据发送到内核空间,(我在我的 kext 中使用了回调函数)问题是当我使用发送函数时,我看到了一些奇怪的东西,我在 2 个场景中解释了:1)... char f[] ={'1','2','3','4','5','6'}; 发送(袜子,f,sizeof(f),0);好吧,当我 printf 我在 kext 中收到的内容时:123456
2) ... // 我用 0 替换 f[2]
字符 f[]={'1','2', 0 ,'4','5','6'}; 发送(袜子,f,sizeof(f),0);
但是这一次,当我 printf 我在 kext 中收到的内容时:120000
似乎发送函数在第一个 0 字节之后的每个字节都为零?到底是怎么回事?这是发送功能错误吗?我使用了 xcode 4.1,我的操作系统是 lion 这里是用户空间部分:
这是负责获取用户空间数据的内核空间代码的一部分:
好吧,它在控制台中打印:61 6C 69 30 31 32 34 6C 69 0 0 0 0 0 0 0 0 当我将发送数据更改为:
{'a','l','i','0','1','2','4','l','i',**'0'**,'1','2','4','l','i','0','1'};
我得到正确的,实际上我在发送数据中的第一个零字节之后得到所有 0
macos - 为什么我的内核扩展没有写入 kernel.log
我有一个简单的内核扩展:
我正在通过以下方式编译和加载:
它出现在 kextstat 列表中:
但是,我在 kernel.log(或 system.log)中什么都没有——我应该看到我的 printf() 语句。知道为什么吗?
macos - 无代码 kext 无法打开 CFBundle
我会很感激任何帮助,并承认我现在已经正式超越了我的头脑。
我迫切需要一个无代码的 kext 来防止 USB 设备被邪恶的 Apple 通用驱动程序占用。我已经阅读了我能找到的每一个问题和任何建议,甚至翻阅了 Apple 文档,如果我知道自己在做什么,那就太好了,但我不知道。
我的 kext 文件位于 /system/library/extensions、chown、chmod 和 kextcache -e 中。无法打开 CFBundle
该设备是一个小型设备,在其状态区域内包含一些参数,因此我只需要获得控制级别访问权限。没有大的读取或写入。
我们将不胜感激地收到任何建议、指点或帮助。ViD 和 PiD 以及 BCDDevic 数字是正确的。我在某处读到的 CF Bundle 标识符与原始的相同是解决方案,但这对我来说毫无意义,因为没有原始驱动程序。
这是我的 kext 文件
macos - Mac:加载 Mass Storage Driver Kext 进行测试
我正在为 Mac 编写一个定制的海量存储内核扩展,从IOSCSIPeripheralDeviceType05
逻辑单元驱动程序子类化。我已经编译了一个 .kext 文件,它通过了kextutil -n -t ...
,但我无法加载它进行测试。
IOKitDebug
我在 .plist 中有一个非零字段,GetDeviceConfiguration
看起来像这样:
但是,当我将它复制到/System/Library/Extensions/
并使用它执行时kextutil /System/Library/Extension/MyDriver.kext
,什么也没有发生,并且/var/log/system.log
.
如何加载此 .kext 以便能够对其进行调试?