ユーザ空間とカーネル空間をWindows XPで共有しようとしています。ユーザレベルのメモリに書き込んでカーネルドライバプログラムから読み込みたいと思います。組み込み関数ですか?ユーザ空間とカーネル空間の間でメモリを共有する
答えて
ユーザーモードの側:いくつかの方法があります。
1)最も一般的な/柔軟な方法は、メモリを通過することを含めて、ユーザーモードとカーネルモードの間で通信するためにDeviceIOControl
を使用することです。
私は最後のカーネルドライバを書いて以来、長い時間がかかりました(6年?XPタイムフレーム)ので、正確なコードではないプロセスの概要です。しかし、あなたのユーザーモードプログラムは、CreateFile
を使用し、その名前を指定することによって、例えばデバイスのハンドルやドライバのオープンインスタンスを得ることができるはずです。たとえば、\\.\YourNameHere
です。それと通信するためにハンドルの使用(。DeviceIOControl
の最初のパラメータ)
あなたが興味があるだろう四つのパラメータは次のとおりです。これらを使用して
__in_opt LPVOID lpInBuffer,
__in DWORD nInBufferSize,
__out_opt LPVOID lpOutBuffer,
__in DWORD nOutBufferSize,
__out_opt LPDWORD lpBytesReturned,
、あなたはlpInBuffer
を通じて(ドライバにデータを与えることができますポインタとnInBufferSize
の大きさを指定するパラメータ - このデータの意味や解釈方法はドライバによって異なります)、カーネルモードのレイヤーはlpOutBuffer
(ユーザーモードのメモリへのポインタは既に割り当てられた - これはドライバが設定するポインタではありません!)、バイト単位のサイズはnOutBufferSize
です。このバッファを見つけてください)、ドライバはそのバッファのどれくらいが実際にlpBytesReturned
で満たされているかを教えてくれます。
このウィキペディアの記事では、general concept of ioctl functionsについて説明しています。そのうちのDeviceIOControlが例です。
注:あなたが「私は窓にユーザ空間とカーネル空間の間でメモリを共有しようとしています」と述べました。これはではなく、正確に共有メモリではありません。たとえば、ユーザーモードとカーネルモードの両方が同時に読み書きされているメモリではありません。 DeviceIOControl
関数呼び出しの間、カーネルモードは、あなたがポインタを渡すあなたのユーザモード割り当てメモリにアクセスするメモリです(ただし、メモリからは少し複雑ですが、それが効果です)。あなたがそのメソッドを呼び出している間は、 'shared'だけです。
2)単純なデータ転送のみが必要で、カーネルドライバがそれを受け入れる必要がある場合は、ReadFile
とWriteFile
を使用することもできます。 DeviceIOControl
(ドライバのデータを渡すとエラーコードで何かを返す)のように、双方向の通信を行うことはできませんが、シンプルで、おそらくそれらのAPIに精通しているでしょう。
カーネルモード側:カーネルドライバも作成していますか?その場合、this article has information about implementing the kernel-mode side of IOCTL。この記事では、ユーザーモードでReadFile
とWriteFile
を使用して、その方法を選択した場合の通信方法についても説明します。
[Rootkits:Subversion of the Windows Kernel](http://www.amazon.com/Rootkits-Subverting-Windows-Greg-Hoglund/dp/0321294319)は、IRPs /最初のいくつかの章のDeviceIOControl(少なくとも、これまでに私がこれまでにやったことはどれくらいですか?) –
- 1. カーネルとユーザ空間の間の共有メモリセグメントの保護
- 2. カーネル/ユーザアドレス空間間の共有ロックフリーキュー
- 3. ユーザー空間とカーネルスレッド間の共有メモリ
- 4. sysを使ってカーネルとユーザー空間の間でメモリを共有する
- 5. カーネル空間とユーザ空間の時間の差異
- 6. カーネル空間からユーザ空間にパケットをバイパスする
- 7. カーネル空間からユーザ空間関数を実行
- 8. ユーザ空間からカーネル空間へのmemcpy
- 9. Linuxユーザー空間とカーネル空間スケジューリング
- 10. kmallocのメモリとユーザ空間のマッピング
- 11. std :: threadsはユーザ空間またはカーネル空間で管理されますか?
- 12. 空間データとメモリ
- 13. ユーザ空間メモリへのOpenGL ESレンダリング
- 14. linuxカーネル空間のユーザー空間スタックトレースを表示するには
- 15. 、Linuxではカーネル空間
- 16. カーネル空間からユーザ空間へ物理メモリへのポインタを渡して仮想空間にマップする方法
- 17. Kubernetes - 名前空間間で秘密を共有する
- 18. 共有ライブラリとSystem.Configuration名前空間
- 19. メモリマップの構造カーネル空間
- 20. SQL Serverとライブラリプロジェクト間の空間コードの共有
- 21. プロセスメモリ、GPU共有メモリ、x64ウィンドウ上のx86プロセスアドレス空間
- 22. Linuxカーネルからユーザー空間のメモリにアクセスするには?
- 23. Unixユーザ空間のリアルタイムIPC
- 24. Pythonプロセス間の共有メモリ
- 25. キャッシュのためにLinuxユーザ空間メモリを使用する
- 26. 複数スレッド間で共有されているPythonメモリ配列(プロセス空間でmemcachedと考える)
- 27. ODBCドライバはカーネル空間またはユーザ空間で動作しますか?どうして?
- 28. モジュール間でメモリを共有する
- 29. メモリーマップドI/O:制御レジスタI/O空間内のメモリ空間が
- 30. ユーザ空間とLinuxカーネルモジュールとの対話
電話DeviceIoControl –