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);

私が呼び出すと、それはOKctl_registerを返します。0

を呼び出しctl_enqueuedataて を渡すと、struct kern_ctl_reg22 が返されます。これはEINVALです。これらの引数の 1 つが正しくないようです。私が渡している他の引数は、静的テスト文字列とデータの長さ、およびゼロフラグです。

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

myep_ctlの値.ctl_unit0、の値は.ctl_idです6ctl_unit渡された値ctl_enqueuedataが無効/初期化されていない可能性がありますか?

kern_control.hctl_unit について次のように述べています。

このフィールドは、動的に割り当てられたコントロール ID では無視されます

とにかくそれが必要ではないことを示唆していますか?

ep_ctl の初期化で何かを見逃していませんか?

4

2 に答える 2

1

の 2 番目のパラメーターとして間違った値を指定していると思います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 に答える