我正在尝试与一个相当具体的USB设备进行通信,并开发Windows和Mac代码.
该设备是带有HID接口(3级)的USB设备,带有两个端点,一个中断输入和一个中断输出.设备的性质使得只有在从主机请求数据时才从输入端点上的设备发送数据:主机向其发送设备在其输入中断端点上响应的数据.将数据传输到设备(写入)要简单得多......
Windows的代码非常简单:我获得了设备的句柄,然后调用ReadFile或WriteFile.显然,大部分底层异步行为都被抽象出来了.它似乎工作正常.
然而,在Mac上,它有点粘.我尝试了很多东西,没有一个已经完全成功,但这里有两件似乎最有希望的东西......
1.)尝试通过IOUSBInterfaceInterface访问设备(作为USB),遍历端点以确定输入和输出端点,并(希望)使用ReadPipe和WritePipe进行通信.不幸的是,我无法打开界面,返回值(kIOReturnExclusiveAccess)注意到某些东西已经让设备独占打开.我已经尝试使用IOUSBinterfaceInterface183,因此我可以调用USBInterfaceOpenSeize,但这会导致相同的返回错误值.
---更新
7/30/2010 --- 显然,Apple IOUSBHIDDriver会早期与设备匹配,这可能会阻止打开IOUSBInterfaceInterface.从一些挖掘中可以看出,防止IOUSBHIDDriver匹配的常见方法是编写具有更高探测分数的无代码kext(内核扩展).这将提前匹配,阻止IOUSBHIDDriver打开设备,理论上应该允许我打开接口并直接写入和读取端点.这没关系,但我更希望不必在用户机器上安装额外的东西.如果有人知道一个可靠的选择,我会感谢这些信息.
2.)将设备作为IOHIDDeviceInterface122(或更高版本)打开.为了读取,我设置了一个异步端口,事件源和回调方法,在数据就绪时调用 - 当数据从输入中断端点上的设备发送时.但是,要写入数据 - 设备需要 - 来初始化响应我找不到办法.我很难过.setReport通常写入控制端点,而且我需要一个不期望任何直接响应,没有阻塞的写入.
我在网上看了看并尝试过很多东西,但没有一个能给我带来成功.有什么建议?我不能使用很多Apple HIDManager代码,因为其中大部分是10.5+,我的应用程序也必须在10.4上运行.
我有一台iMac和一台Macbook Pro.我更新了Yosemite beta(公共版).但我的音频接口Focusrite Saffire 24 DSP(Firewire)可以在iMac中正常工作,但不能在Macbook Pro上正常工作.
安装Saffire时,有一个Saffire.kext.当它连接到iMac时,这个kext加载很好,没什么不寻常的.连接到Macbook Pro时,不会加载此kext.我尝试手动加载它,我收到一条错误消息,说它无法加载,因为kext的签名无效.
现在,我检查了两台计算机上的签名,他们都说签名无效.但它在iMac上加载很好,即使签名无效.
这是为什么?我不明白的是什么?
如果有帮助,这是一些控制台输出:
Mattiass-MacBook-Pro:Extensions mono$ codesign -dvvv Saffire.kext/
Executable=/System/Library/Extensions/Saffire.kext/Contents/MacOS/Saffire
Identifier=tc.tctechnologies.driver.Saffire
Format=bundle with Mach-O universal (i386 x86_64)
CodeDirectory v=20100 size=161 flags=0x0(none) hashes=1+3 location=embedded
Hash type=sha1 size=20
CDHash=ebc9c42dbea4f51770ff62d7de12552ae82a1fbc
Signature size=4240
Authority=Developer ID Application: TC Applied Technologies
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Signed Time=13 Mar 2014 02:58:23
Info.plist entries=19
TeamIdentifier=not set
Sealed Resources version=1 rules=4 files=0
Internal requirements count=1 size=180
Mattiass-MacBook-Pro:Extensions mono$ codesign --verify -vvvv Saffire.kext/
Saffire.kext/: invalid signature (code or signature …
Run Code Online (Sandbox Code Playgroud) 在KEXT中,我通过vnode或文件范围监听器监听文件关闭.对于某些(极少数)文件,我需要将文件路径发送到我的系统守护程序,该守护程序执行一些处理(这必须在守护程序中发生)并将结果返回给KEXT.需要阻止文件关闭调用,直到我从守护程序获得响应.根据结果我需要在close调用中进行一些操作并成功返回close调用.论坛上有很多关于KEXT通信相关主题的讨论.但它们并不具有决定性,而且看起来很老(2002年左右).此要求可以由FtlSendMessage(...)
Win32 API 处理.我在Mac上寻找相同的东西
以下是我所看到的并希望总结我的理解:
mach_msg
,mach_port_allocate
,bootstrap_look_up
)并不显得关键绩效指标.mach_msg_send_from_kernel
可以使用mach API ,但仅此一点对双向通信没有帮助.我的理解是对的吗?ioct
l/sysctl
:我对他们了解不多.根据我的阅读,它不推荐使用,特别是对于双向通信支持的平台是(10.5以后).所以看看这个要求,有人可以建议并提供一些关于这个主题的指示吗?
提前致谢.
我希望能够通过特定的网络接口强制套接字.在Linux中,内核允许程序员通过设置所述套接字选项来实现这一点 - 但在OS X中,我处于黑暗中.
因此我的标题问题 - 是否可能?它完成了吗?我不打算重新实现IP堆栈,只是启用了bind-to-interface选项.
我正在为音频设备驱动程序(它的软件,但模拟硬件设备)编写OSX内核扩展.
在开发过程中,完全卸载现有的旧版本然后从头开始构建和安装新版本会很方便.但是,如果没有重新启动系统,有时似乎无法进行此操作.
程序本身没有运行,源文件已从/System/Library/Extensions/
目录中删除.
但kextstat
揭示了一个实例:
$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>
Run Code Online (Sandbox Code Playgroud)
(...含义:)
Index Refs Address Size Wired Name (Version) <Linked Against>
Run Code Online (Sandbox Code Playgroud)
所以我的驱动程序实例有0个参考,但kextunload
有时会失败,抱怨现有的实例:
$ sudo kextunload -b com.foo.driver.bar
(kernel) Can't unload kext com.foo.driver.bar; classes have instances:
(kernel) Kext com.foo.driver.bar class FooBarDriver has 1 instance.
(kernel) Kext com.foo.driver.bar class com_foo_driver_bar has 1 instance.
Failed to unload com.foo.driver.bar - (libkern/kext) kext is in use or retained (cannot unload). …
Run Code Online (Sandbox Code Playgroud) 所以我们有一个允许我们签署kexts的证书,但是当我们运行> sudo kextload friendly.kext时,它失败了,我们签署了我们想要的kext,并证明它已签名,这里是一些诊断输出:
codesign --verify -vvvv friendly.kext
friendly.kext: valid on disk
friendly.kext: satisfies its Designated Requirement
Run Code Online (Sandbox Code Playgroud)
spctl -a -vvvv friendly.kext
friendly.kext: accepted
source=Developer ID
origin=Developer ID Application: Friendly Corporation
/Library/Extensions
Run Code Online (Sandbox Code Playgroud)
codesign -dvvv friendly.kext
Executable=/Library/Extensions/friendly.kext/Contents/MacOS/friendly
Identifier=com.friendly.friendly
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20200 size=502 flags=0x0(none) hashes=18+3 location=embedded
Hash type=sha1 size=20
CDHash=a1e2bf8d53ea67c6cfe9fc3d6d2001fe56c838a7
Signature size=8528
Authority=Developer ID Application: Friendly Corporation
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Oct 9, 2014, 11:49:02 AM
Info.plist entries=21
TeamIdentifier=1234567890
Sealed Resources version=2 rules=12 files=1
Internal requirements …
Run Code Online (Sandbox Code Playgroud) 我在优胜美地的kext上签了代码.但是kextload失败了.
这是版本2的代码签名.codesign --verify
是真的.
但是kextload失败了.为什么不加入约塞米蒂?
这是我的日志.
我已经检查过codesign -dvvv ./myKext.kext
它没问题.
codesign -dvvv ./myKext.kext
返回以下:
Executable=/Path/to/myKext
Identifier=com.myKext.kext.Firewall
Format=bundle with Mach-O thin (x86_64)
CodeDirectory v=20100 size=317 flags=0x0(none) hashes=9+3 location=embedded
Hash type=sha1 size=20
CDHash=d0ff68bd8b49c650f45349c2d1570d45a8c1f148
Signature size=8544
Authority=Developer ID Application: My Kext Co., Ltd. (R2PBZJ465V)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=2014. 10. 31. ?? 11:09:35
Info.plist entries=18
TeamIdentifier=not set
Sealed Resources version=2 rules=12 files=1
Internal requirements count=1 size=188
Run Code Online (Sandbox Code Playgroud)
它显示版本2.
但是sudo kextload ./myKext.kext
返回以下内容:
/Path/to/myKext.kext加载失败 - (libkern/kext)无法加载(原因未指定); 检查系统/内核日志是否有错误或尝试kextutil(8).
cat /var/log/system.log …
我正在尝试从macOS High Sierra中完全卸载Parallels.我删除了磁盘上的所有内容,除了存储在/ Library/StagedExtensions/Parallel Desktop.app下的一些Parallels扩展
我认为该位置与用户批准的扩展程序有关,但我想找到一种方法来删除/卸载它们.如果我尝试删除扩展名,则表示尽管有权限,但不允许操作.
任何的想法?
所以,我想为mac编写一个虚拟监视器驱动程序。这类似于屏幕回收器应用程序所做的事情。我已经阅读了很多关于驱动程序编程和 kext 的一般资源,我已经完成了苹果的基本 iokit 驱动程序教程,但是从哪里开始呢?
本教程提供了对驱动程序的非常基本的了解,但对于我的用例来说,这绝对是不够的。我知道我们必须实现 IOframebuffer 标头,但我不知道其余的?此外 IOframebuffer 标头有一些非常复杂的方法,我不太清楚如何实现这些方法。有人可以向我提供一些关于需要做什么的有用指示吗?
我已经看过这个问题
这些回购,
https://github.com/tSoniq/displayx
https://github.com/mkernel/EWProxyFramebuffer
但问题是,这两个项目在 MAC OS 10.12 中都不起作用,因为它们很长时间没有更新。
我正在寻找一些我需要遵循的指南来编写这样的驱动程序,而苹果文档并没有真正的帮助。
kernel-extension ×10
macos ×9
c++ ×2
kernel ×2
networking ×2
c ×1
code-signing ×1
codesign ×1
driver ×1
firewire ×1
framebuffer ×1
hid ×1
iokit ×1
mach ×1
usb ×1