我想使用内核控件将消息从内核扩展发送到用户程序。我打电话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 时错过了什么吗?