2017-07-04 10 views
0

DeviceIoControl()Win32 APIを使用して、自分のアプリケーションからカーネルドライバ(WDM)へのIOCTL要求で、同じPIDをユーザモードとカーネルモードの間で得たことに驚いた。プロセスIDはユーザモードとカーネルモードで同じ

私が知る限り、ドライバはカーネルモードで独自のPIDを持っています。アプリケーションはユーザーモードでPIDを所有しており、分離されており、IOCTLを介して通信できます。しかし、今日、私はIOCTL要求でユーザー/カーネルモード間で同じPIDを得ました。私はユーザーモードでGetCurrentProcessId()機能を介してPIDを取得しました。カーネルモードではPsGetCurrentProcessId()機能を介してPIDを取得し、ユーザモードアプリケーションでの結果を示します。これらの2つのPIDは同じです。

誰でも知っていますか?

答えて

1

あなたが見たものは正常です。 Windowsでは、あるスレッドがユーザーモードコードを実行している時間の一部とその時間の一部をカーネルモードコードを実行するのに費やしていたのは正常です。あなたのケースでは、スレッドがIOCTLを実行するための呼び出しを行ったアプリケーションを実行した後、WindowsカーネルはこのIOCTLを処理するためにカーネルモードドライバコードを実行するために同じスレッドを使用しました。

これが役に立ちます。

+0

こんにちは@thtse、ありがとう:) Windowsカーネルはどうやって同じスレッドをもう一度やりますか?アプリケーションはシステムコールによってカーネルにIOCTLを送り、カーネルは要求を処理して結果を返します。ユーザモードとカーネルモードの2つのプロセスがあります。またはWindowsは別の方法でそれを行うのですか?それについて言及している文書はありますか?私はそのメカニズムに興味があります。 – dougpuob

+0

@dougpuob - 実行中のすべてのプロセスとスレッドにはIDがあります。ユーザーやカーネルモードと変わりはありませんが、同じスレッドやプロセスでも同じ結果になります。 「ユーザモードとカーネルモードの2つのプロセスがあります。モードにはまったく関係のないプロセスです。いくつかのプロセスのスレッドはあなたのドライバを呼び出します。ユーザーモードからカーネルに移行します。これは同じスレッド(同じIDを持つ)と同じプロセス内(プロセスIDと同じ) – RbMm

+0

@RbMm、ありがとう。私はあなたのメッセージを得た後、ractosプロジェクトの 'DeviceIoControl()'関数をトレースしました。あなたの言ったことと同じですが、それはユーザーモードからカーネルに移行します。私の考えを明確にするために私に手を差し伸べてください。私が知る限り、Windowsカーネルは、Ring 0に変更されたときに、DeviceIoControl()によってアプリケーション(Ring 3のユーザモード)からの次の呼び出しスタックであるRing 0で実行されるか、この呼び出しスタックは常にRingで実行されます3? [**呼び出しスタック**] – dougpuob

関連する問題