0

我想使用内核控件将消息从内核扩展发送到用户程序。我打电话EINVAL时遇到错误ctl_enqueuedata


我已经设置了一个内核控件,我正在尝试使用ctl_enqueuedata. 我在设置

ep_ctl.ctl_flags = 0

在传递给 之前ctl_register文件建议,这应该导致ctl_unit被自动设置。

引用kern_control.h

对于动态分配的控件 ID,不要设置 CTL_FLAG_REG_ID_UNIT 标志。

static struct kern_ctl_reg ep_ctl;
static kern_ctl_ref kctlref;

...

errno_t error;
bzero(&ep_ctl, sizeof(ep_ctl));  // sets ctl_unit to 0
ep_ctl.ctl_id = 0;
ep_ctl.ctl_unit = 0;
strncpy(ep_ctl.ctl_name, CONTROL_NAME, strlen(CONTROL_NAME));
ep_ctl.ctl_flags = 0x0; // not CTL_FLAG_REG_ID_UNIT so unit gets supplied. Not CTL_FLAG_PRIVILEGED either.
ep_ctl.ctl_send = EPHandleSend;
ep_ctl.ctl_getopt = EPHandleGet;
ep_ctl.ctl_setopt = EPHandleSet;
ep_ctl.ctl_connect = EPHandleConnect;
ep_ctl.ctl_disconnect = EPHandleDisconnect;
error = ctl_register(&ep_ctl, &kctlref);

printf("setupControl %d\n", error);

当我打电话ctl_register时,它返回0正常。

当我打电话时ctl_enqueuedata,传入我的struct kern_ctl_reg我得到 22,即EINVAL。其中一个论点似乎是不正确的。我传递的其他参数是静态测试字符串及其数据长度和零标志。

int result = ctl_enqueuedata(kctlref, ep_ctl.ctl_unit, filename, length, 0x0);

myep_ctl.ctl_unit值为0, 的.ctl_id值为6。可能ctl_unit是传递给的值ctl_enqueuedata无效/未初始化吗?

kern_control.h说ctl_unit:

对于动态分配的控件 ID,此字段将被忽略

这表明无论如何都不需要它?

我在初始化 ep_ctl 时错过了什么吗?

4

2 回答 2

1

我相信您提供了错误的值作为ctl_enqueuedata(). 而不是ep_ctl.ctl_unit,您必须struct sockaddr_ctl::sc_unitEPHandleConnect()回调中记住,这就是您应该传递给ctl_enqueuedata().

于 2012-11-13T14:18:28.967 回答
0

我建议使用 OSX 的内核调试工具来弄清楚这里发生了什么。这将让您浏览相关的内核代码,并且应该告诉您它在哪里拒绝您的输入。

于 2012-08-15T21:40:35.867 回答