IOKitベースのDriver/Deamonsプロジェクトには1対多の関係があります。一部のクライアントが接続されていない限り、 "kextunload"でIOKitドライバが停止しないようにする
コアドライバはIOService
から派生したIOKitオブジェクトであり、IOUserClient
から派生したドライバクライアントのプロバイダでもあります。
私の目標は、kextunload
コマンドの場合にドライバがアンロードされないようにすることでした。これは、最後のクライアントが切断されたとき(プロセス終了または私は/ postphoneを無効にする必要があるコマンドをIOKitのかどうか確認するために)手動
をkextunload
を行うために必要がなく、ドライバが(自動的に閉じられます)IOServiceClose
を呼び出して、私はbasidに関連する印刷メッセージとIOService
コールバックを包みました2クライアントが接続されているkextunload
を実行するシナリオでログを観察しました。
kernel: (driver) virtual bool com_osxkernel_driver::terminate(IOOptionBits)
kernel: (driver) virtual bool com_osxkernel_driverClient::terminate(IOOptionBits)
kernel: (driver) virtual bool com_osxkernel_driverClient::terminate(IOOptionBits)
kernel: (driver) virtual void com_osxkernel_driverClient::stop(IOService *)
kernel: (driver) virtual void com_osxkernel_driverClient::stop(IOService *)
kernel: (driver) virtual void com_osxkernel_driver::stop(IOService *)
-
私がそのプロバイダの各IOUserClient
からの参照、および
IOUserClient::clientClose
上で、それらの参照を解放し、とっても
kextunload
コマンドはまだ成功しているようです
。
私が目標を達成するために見つけた唯一の方法は、::terminate
コマンドを延期して、それを::clientClose
から明示的に呼び出すことです。
IOService::terminate
への呼び出しを削除し、から呼び出しました。 ここに関連するコードは:続くとドライバのアンロードのタイミングを制御するからkextunload
を防止することのいずれか、あまりハック方法がある場合
IOReturn com_osxkernel_driverClient::clientClose()
{
myProvider->release();
return super::terminate(kIOServiceSynchronous) ? kIOReturnSuccess : kIOReturnError;
}
bool com_osxkernel_driverClient::terminate(IOOptionBits options) {
os_log_info(g_logger,"%s", __PRETTY_FUNCTION__);
return true;
}
私が知っているように思います。
おかげ
ここで助けてくれてありがとう..ちょうどどこでkextnuloadのソースコードを見つけましたか?おそらくあなたはここにリンクを投稿できますか? – osxUser
@osxUser答えにkextunloadソースリンクを追加しました。 – pmdj