Windows CE

  
のプロセス間メモリ注射の原則近年、プログラミングのニーズに、私が原因この地域で発見少なく、国内のマニュアルをメモリレイアウトWincowsCEの研究を行い、その研究では、この例の形成の機会に終わりました文書、希望に他のマスターが正しい取得を開始します。

まず、プログラムの実施のための前提条件

Windowsは、メッセージングシステムが常に指定されたフォームに特定のプロセスメッセージ機能を提供されて形成されるため。だから、ローカルプロセス内の他のプロセス(アプリケーション)のメッセージフォームの一部は二つの部分で実装されている必要があります:

1は、ターゲットプロセスのアドレス空間にフォームのコードをフックする必要があります。行きます。

図2に示すように、このコードの一部、およびターゲットプロセスウィンドウメッセージへのアクセスの実現。

これらの2つのステップは、単純なように見えるかもしれないが、それは、実装プロセスでより困難です。組み込みオペレーティングシステム、およびWindows 98/2000 /XPおよびその他のデスクトップオペレーティングシステムとしてのWindows CEモバイルデバイスは、デザインコンセプトのコアに大きな違いがあり、APIをサポートしているので。これは、従来のグローバルマウスフック注入/リモートスレッド注入を使用してデスクトップに直接つながった他の方法は、CEを完全にすることができませんでした。しかし、良いニュースは、Microsoftが行うことができるので、それは、CEは、プロセス間のメモリの完全なセットを持っている必要があります内側と言うことです、Microsoftの開発ツールとしてremotexxxリモートデバッガは、この目標の私を認識させる、不可能な仕事ではないですアクセスコードインジェクション機構/。 PerformCallBack4、伝説的な機能:

第二に、プログラムの実装
の基本原則

インターネット上のGoogle検索の2日後、私はMicrosoftのドキュメントで宣言されていない面白いAPI関数を見つけました指定されたプロセスで独自のアプリケーションの機能で実行、とてもクールすることができます!これは私が必要とする正確に何のようです。 !オンライン噂もこの噂が唯一の

PerformCallBack4定義関数
を報告実績のある実際には、サポートされていないこの機能をWM5が:
[DLLIMPORT(" COREDLL.DLL")]パブリック静的にextern UINT PerformCallBack4(CallBackInfo CallBackInfo、のIntPtr ni_pVoid1、のIntPtr ni_pVoid2、のIntPtr ni_pVoid3 REF);


パラメータCallBackInfo構造関数が定義されている前記
[StructLayout(LayoutKind.Sequential)]パブリック構造体CallBackInfo {公共のIntPtr hProc; //リモートターゲット処理公共のIntPtr PFN、リモートターゲット処理関数アドレスへの公共のIntPtr pvArg0 //ポインタ; //最初のパラメータ必要関数} //端構造体


ni_pVoid2のni_pVoid1 PerformCallback4、ni_pVoid3は、リモートターゲット・プロセスに渡される三つのパラメータのための他の機能を実行します。

ターゲットプロセスのメモリ空間にコードとして、我々はCEの設計上の機能を使用することができますメモリの使用量を節約するために

1、CEダイナミックリンクライブラリのすべての呼び出しプログラム( DLL)が同じメモリアドレスにマッピングされています。

2、スロット0のメモリ位置の描写におけるCEのメモリレイアウト、このメモリロケーションを実行するプロセスによって占有され、それぞれ特定のタイムスライス、唯一のプロセスがこのメモリを占めることができますスペース。プロセスを実行するために必要な場合、システムは直接コードメモリロケーション処理が、実行のslot0のコピーを生成するためにコードのコピーメモリ・ロケーションを実行する処理を実行しません。コード自体がslot0処理コードに位置し、プロセスが実行されているメモリ内に存在する:メモリのプロセスの実装では、そのプロセスは、コードの2つの完全に異なるバージョンを実行する必要があります。 Test.dllのLoadLibrary関数によるローディングプロセスA場合、プロセスBも同じTest.dllのLoadLibrary関数によってロードされ、プロセスA Test.dllの中のすべての機能:

この機能では、結論付けることができます実装プロセス及びBの相対は、同じアドレスを取得するコードの実行の過程でSLOT0します。

3、CEにおいて、メモリシステムは、33のスロットに分割されて実行されているスロット0のプロセスのために予約、プロセスはスロットにすべてのコードを開始する(こと以外のslot0 CEは、悪名高いメモリシステム)がない以上32以下のプログラム実行理由の最大限界を有することが可能です。場合は、プロセスの実行、専用メモリスロットスロット0メモリアドレス空間にアクセスすることができ、アプリケーションのデフォルトのアドレス空間への各メモリアクセスとプロセスがです。しかし、彼らが必要とする他のアプリケーションへのデータにアクセスできるデバイスドライバを作るために、CEはSetKmode機能は、現在、カーネルモードで実行中のプロセスを実行する必要があるかどうかをシステムに指示し、この制限、SetKmodeとSetProcPermissionを破るために二つの機能を提供します。 SetProcPermission関数は、スロットに対して、各アクセス制御コードのビットマスクを取ることができる1人の代表は、スロットのメモリ内容にアクセスすることができます。 0は、スロットのないアクセスメモリの内容を意味しません。これらの二つの機能を使用すると、MSDNのドキュメントを参照してくださいすることができ、MSDNのドキュメントに役立ちます。


Copyright © Windowsの知識 All Rights Reserved