我想使用內核控件將內核擴展中的消息發送到用戶態程序中。致電ctl_enqueuedata
時,我遇到了EINVAL
錯誤。識別內核控制中的EINVAL ctl_enqueuedata調用
我已經成立了一個內核控制,我想通過它使用ctl_enqueuedata
發送消息。傳遞給ctl_register
,其中,the documents建議之前,我設置
ep_ctl.ctl_flags = 0
,應導致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);
我ep_ctl
的.ctl_unit
是0
的.ctl_id
值6
值。難道ctl_unit
值傳遞給ctl_enqueuedata
是無效/未初始化?
kern_control.h
說ctl_unit的:
此字段用於動態分配的控制ID
這表明它並不總是需要的忽視?
我在初始化我的ep_ctl時錯過了什麼嗎?
我會試試看,謝謝。 – Joe 2012-08-15 21:41:40