2012-08-08 51 views
0

我想使用內核控件將內核擴展中的消息發送到用戶態程序中。致電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_unit0.ctl_id6值。難道ctl_unit值傳遞給ctl_enqueuedata是無效/未初始化?

kern_control.h說ctl_unit的:

此字段用於動態分配的控制ID

這表明它並不總是需要的忽視?

我在初始化我的ep_ctl時錯過了什麼嗎?

回答

0

我建議使用OSX的內核調試工具來弄清楚這裏發生了什麼。這將讓你瀏覽相關的內核代碼,並告訴你它拒絕你的輸入。

+0

我會試試看,謝謝。 – Joe 2012-08-15 21:41:40

1

我相信你提供了錯誤的值作爲ctl_enqueuedata()的第二個參數。而不是ep_ctl.ctl_unit,你必須記住EPHandleConnect()回調中的struct sockaddr_ctl::sc_unit,這就是你應該通過ctl_enqueuedata()

+0

啊哈!下次我看這個代碼時,我會看看。謝謝。 – Joe 2012-11-14 21:55:20