Macos Mac OS X:自定义HID驱动程序

Macos Mac OS X:自定义HID驱动程序,macos,kernel,hid,Macos,Kernel,Hid,我参与了为Mac OS开发自定义HID设备支持。 然而,它不是隐藏的投诉,也就是说,它被IousB复合驾驶员抓住了 该设备应该用作输入设备(键盘、鼠标),因此我尝试将驱动程序实现为kext。我已尝试从newReportDescriptor()方法中将IOUSBHIDDriver和IOHIDDevice子类化,返回以下报告描述符(取自Windows团队): 然后将以下结构提供给handleReport()方法 但是我看不出有任何影响。我希望会生成按键事件 我错过了什么?这类驱动程序的一般工作流程是

我参与了为Mac OS开发自定义HID设备支持。 然而,它不是隐藏的投诉,也就是说,它被IousB复合驾驶员抓住了

该设备应该用作输入设备(键盘、鼠标),因此我尝试将驱动程序实现为kext。我已尝试从newReportDescriptor()方法中将IOUSBHIDDriver和IOHIDDevice子类化,返回以下报告描述符(取自Windows团队):

然后将以下结构提供给handleReport()方法

但是我看不出有任何影响。我希望会生成按键事件


我错过了什么?这类驱动程序的一般工作流程是什么?

这里有很多问题……从您的信息开始。plist的iokit个性……和OSBundleLibraries(您的所有版本都匹配吗?)您知道您的kext匹配吗?(您可以kextload/kextstat您的驱动程序吗?)?假设您正确地覆盖了::newReportDescriptor(您是否调用了super::newReportDescriptor?),那么如何返回新的描述符

IOBufferMemoryDescriptor* memDesc = IOBufferMemoryDescriptor::withBytes(& g_ReportDescriptor, sizeof(g_ReportDescriptor), kIODirectionOutIn, false);

在代码中添加一些IOLog可能会有助于确保一切按预期进行。

是的!我的kext与操作系统匹配并已加载。我正在用以下代码覆盖newReportDescriptor:
{IOLog(“New Report Descriptor\n”);*Descriptor=IOBufferMemoryDescriptor::withBytes(&g_ReportDescriptor,sizeof(g_ReportDescriptor),kiodirectionout);return kioreturnsucture;}
,此时我只想生成事件,因此,我从start()方法调用HandlerReport()。我仍然希望会生成事件。我认为从start方法调用HandlerReport不会起作用(因为它实际上没有要处理的报告)。我最好的建议是联系dts@apple.com(无空格)以获得“官方”答案。如果可能,请发送您的项目。我的印象是,制作
报告(OP的第二部分)并将其提供给
HandlerReport(报告)
方法将使HID系统根据报告描述符处理该报告。
#define KBD_KEY_CODES        6

#pragma pack(1)
typedef struct _VHID_KEYBOARD_REPORT
{
    UInt8      ReportID;
    // Left Control, Left Shift, Left Alt, Left GUI
    // Right Control, Right Shift, Right Alt, Right GUI
    UInt8      ShiftKeyFlags;
    UInt8      Reserved;
    UInt8      KeyCodes[KBD_KEY_CODES];
} VHID_KEYBOARD_REPORT;

VHID_KEYBOARD_REPORT keyboardReport;

bzero(&keyboardReport, sizeof(keyboardReport));
keyboardReport.ReportID = REPORTID_KEYBOARD;
keyboardReport.ShiftKeyFlags = 0;
keyboardReport.KeyCodes[0] = kHIDUsage_KeyboardA;

IOBufferMemoryDescriptor *report = IOBufferMemoryDescriptor::withBytes(&keyboardReport, sizeof(keyboardReport), kIODirectionInOut);

handleReport(report);
IOBufferMemoryDescriptor* memDesc = IOBufferMemoryDescriptor::withBytes(& g_ReportDescriptor, sizeof(g_ReportDescriptor), kIODirectionOutIn, false);