首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mac M1 get IOMobileFramebufferUserClient接口

Mac M1 get IOMobileFramebufferUserClient接口
EN

Stack Overflow用户
提问于 2021-03-26 07:50:18
回答 1查看 242关注 0票数 1

我正在尝试访问M1 Mac的框架缓冲区接口。我知道它与其他Mac有很大的不同,因为这些新Mac使用的是IOMobileFrameBuffer (它来自操作系统),而不是传统的IOFrameBuffer。

因此,我试图使用这段代码来访问这个框架缓冲区,但没有成功。

代码语言:javascript
运行
复制
func makeIterator() -> io_iterator_t {
    var port: mach_port_t = 0
    var status = IOMasterPort(mach_port_t(MACH_PORT_NULL), &port)
    guard status == KERN_SUCCESS else { return 0 }
    guard let match = IOBSDNameMatching(port, 0, "AppleMobileCLCD") else { return 0 }
    var iterator: io_iterator_t = 0
    status = IOServiceGetMatchingServices(port, match, &iterator)
    guard status == KERN_SUCCESS else { return 0 }
    return iterator
}

我也尝试过使用"IOMobileFramebuffer“、"AppleCLCD”和"IOMobileFramebufferUserClient“字符串,但是匹配似乎不太好。

我还试图显示ioreg命令,它告诉我:

+-o IOMobileFramebufferUserClient

您知道如何找到访问此用户客户端的字符串吗?或者我的密码完全错了..。我试图在这个界面上寻找一些亮度。我觉得不太好,但我想试试.

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-03-26 14:25:56

匹配(IOServiceGetMatchingServices)调用没有返回要查找的对象的原因是匹配字典不正确。

首先,让我们看看您感兴趣的对象的ioreg输出(命令行:ioreg -w0 -irc IOMobileFramebuffer)。在我的Mac Mini上,它们看起来是这样的:

代码语言:javascript
运行
复制
+-o AppleCLCD2  <class IORegistryEntry:IOService:IOMobileFramebuffer:IOMobileFramebufferService:IOMobileFramebufferAP:UnifiedPipeline2:AppleCLCD2, id 0x100000300, registered, matched, active, busy 0 (0 ms), retain 15>
[…]
+-o AppleCLCD2  <class IORegistryEntry:IOService:IOMobileFramebuffer:IOMobileFramebufferService:IOMobileFramebufferAP:UnifiedPipeline2:AppleCLCD2, id 0x1000002bc, registered, matched, active, busy 0 (0 ms), retain 14>

首先,IOBSDNameMatching用于匹配在BSD子系统中具有等价的设备(本质上,它们出现在/dev/下)--这是macOS上的几种设备的情况,例如块存储设备和串口。(如果它是用于此目的的正确函数,则还需要按照文档的指示传递kIOMasterPortDefault作为第一个参数。)

我不知道您从哪里得到"AppleMobileCLCD",也许这是您系统中条目的名称(而不是Mini上的AppleCLCD2 )。

如果是这样的话,您需要使用IOServiceNameMatching创建匹配的字典。

但是,按照名称进行匹配通常不是一个好主意,除非您有一个很好的理由;相反,使用IOServiceMatching()按类名进行匹配。因此,例如:

代码语言:javascript
运行
复制
    guard let match = IOServiceMatching("IOMobileFramebuffer") else { return 0 }

这应该能行。

您通常无法匹配现有的用户客户端对象,例如您引用的ioreg行中的对象,因为它们通常不会注册以进行匹配。(它们显示为!registered)它们通常也没有任何可用的接口,因为它们是提供者对象的接口。

IOMobileFramebuffer没有任何文档化的接口,但是也许您可以找到一些有用的东西来使用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66812863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档