I/O Kit ドライバーとして使用される OS X カーネル拡張機能 (kext) を開発しています。ただし、このドライバーは厳密に「仮想」です。ハードウェアとのインターフェイスはありません。
OS X は、カーネルにロードされるすべてのドライバーのカタログ (I/O カタログ) を保持します。また、ハードウェア デバイスと一致し、現在ハードウェアを制御している I/O カタログ ドライバを含むレジストリ (I/O レジストリ) も保持します。
私のドライバーはハードウェアに依存せず、「一致」しないため、I/O カタログにロードされるだけで、I/O レジストリには登録されません。これは、I/O ドライバー オブジェクトを取得する API が I/O レジストリに登録されているドライバーに限定され、I/O カタログ内のオブジェクトにアクセスしないため、問題を引き起こします。推奨 API を使用してドライバとのマッチングを試みましたが、前述のとおり、これらの API は I/O カタログ エントリを公開しません。
私の最終的な目標は、「setProperties」メソッドを使用してデータを転送するために、ドライバーへの参照を取得することです。他のすべてが失敗した場合は、syscall、copyin、および copyout を組み合わせて、ドライバーとの間でデータを転送できますが、現時点ではそのソリューションには興味がありません。
要するに、I/O カタログにはあるが I/O レジストリにはないドライバへの参照を取得する方法はありますか?
更新:私の言いたいことを理解するには、IORegistryExplorer の次の 2 つのスクリーン ショットを見てください。
登録済みのドライバーはAPI 経由で簡単にアクセスできますが、未登録のドライバーは IOServiceGetMatchingServices(...) を使用して一致しません。登録されていないロード済みドライバへの参照を取得するにはどうすればよいですか?
詳細については、以下をご覧ください。