8

ドライバーチーム用のハードウェアシミュレーターを構築しています。現在、シミュレーターは 2 つのモジュールに分割されています。最初のモジュールはドライバー内でカーネル モードで実行され、ドライバーと HW-Simulator 間のメイン インターフェイスがここにあります。DeviceIOControl2番目のモジュールは、シミュレーター用のデータを生成し、 (Windows APIの下で)への呼び出しを介してシミュレーターに転送する実行可能なユーザーモードコードです。

私の必要性は次のとおりです。カーネルモード内からユーザーモードの実行可能ファイルを実行できるようにしたいです。そして、これを比較的移植性の高い方法で実行できるようにする必要があります。現在、私は Windows でのみ実行していますが、これはすぐに変更されるはずです。さらに、stdin再構成して最終的に閉じるために、パイプを介してユーザーモードコードと通信できる必要があります。

私はこれを見つけました: カーネル空間からユーザー空間関数を実行する

ただし、これは linux-kernel にのみ関連します。よりポータブルな代替手段はありますか? またはWindowsの代替?

ShellExecute/RunAs API 関数を使用するだけで Windows でこれを実行できますか?

注: カーネル空間からユーザー モード コードを呼び出すことに伴うセキュリティ リスクを認識しています。ただし、これはテスト環境としてのみ使用することを意図しており、リリース コードに到達することはないため、心配する必要はありません。

4

2 に答える 2

5

Windows カーネルでこれを行うクリーンな方法はありません。プロセスを作成するためのユーザーモード API CreateProcessは、文書化されていない API ( NtCreateProcess / NtCreateThread ) を使用してプロセスを作成します。

推奨されるのは、IOCTL を使用してドライバーと通信するユーザー モード サービスである "パートナー サービス" を用意することです。逆呼び出しモデルを使用して、ドライバーにサービスを呼び出してプロセスを作成させることができます。

于 2011-06-22T19:35:03.990 に答える
0

実際、ユーザーモードからプロセスの作成をトリガーせずにそれを行う方法は文書化されていません。

ただし、ユーザー モード アプリケーションを作成したくない場合は、文書化されていないトリッキーな方法が 1 つあります。

有効な win32 プロセスを作成するには、ドライバーが CSRSS と通信する必要があります (文書化されていないもの)。

ユーザーモードの APC をキューに入れ、既存のプロセスのコンテキストで APC コードに仮想メモリを割り当てることができます。このコードは、CreateProcess と必要なものを呼び出すだけです。

于 2015-11-09T17:04:58.337 に答える