2017-11-28 8 views
3

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

私が知っているように思います。

おかげ

答えて

1

あなたはthe kextunload source codeを見れば、あなたはそれがIOCatalogueTerminate()にダウン呼び出す表示されます。カーネルでは、これは最終的にIOCatalogue::_terminateDrivers()関数に入ります。 (XNU源でIOCatalogue.cpp)がありますが、以下がアンロードされているのkextに属するすべてのIOKitのクラスのインスタンスに対して実行されていることがわかります:

if (!service->terminate(kIOServiceRequired|kIOServiceSynchronous)) 
{ 
    ret = kIOReturnUnsupported; 
    break; 
} 

は、これが唯一の方法は、あなたのkextのIORegistryエントリを停止することを示しています実際にはterminate()からfalseを返すことです。

これをハードブロックするかどうかは良い考えですが、もちろん別の質問です。私は、アンロードがオペレーティングシステムの安定性を危険にさらす場合にのみこれを行うことをお勧めします。 kextunloadにはroot権限が必要であることを考慮すると、ほとんどの場合、サービスとユーザークライアントの終了をユーザースペースコードできれいに処理する方が望ましい場合があります。

terminate()からfalseを返す場合は、正当な理由で終了をブロックしないように注意する必要もあります。 (たとえば、デバイスドライバの場合は、ドライバが一致したヌブ(例:IOUSBInterface)は、デバイスがホットプラグされている場合は、ドライバインスタンスterminate()を試すことがあります。)

+0

ここで助けてくれてありがとう..ちょうどどこでkextnuloadのソースコードを見つけましたか?おそらくあなたはここにリンクを投稿できますか? – osxUser

+0

@osxUser答えにkextunloadソースリンクを追加しました。 – pmdj

関連する問題