カーネル コントロールを使用して、カーネル エクステンションからユーザーランド プログラムにメッセージを送信したいと考えています。を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);
私が呼び出すと、それはOKctl_register
を返します。0
を呼び出しctl_enqueuedata
て を渡すと、struct kern_ctl_reg
22 が返されます。これはEINVAL
です。これらの引数の 1 つが正しくないようです。私が渡している他の引数は、静的テスト文字列とデータの長さ、およびゼロフラグです。
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 の初期化で何かを見逃していませんか?