一般に、カーネルサービスを呼び出すためにユーザーモードコードがカーネルモードに移行するための古いディスパッチャーメカニズムは、によって実装されていましたint 2Eh
(現在はに置き換えられていsysenter
ます)。またint 3
、今日までブレークポイント用に予約されています。
基本的に、カーネルは特定の割り込みに対してトラップを設定し(ただし、すべてかどうかは覚えていません)、トラップコードに応じて、ユーザーモードの呼び出し元に対して何らかのサービスを実行します。それが不可能な場合は、アプリケーションが強制終了されます。特権操作。
詳細はとにかく、あなたが呼び出そうとしていた正確な割り込みに依存します。たとえば、関数DbgBreakPoint
(ntdll.dll
)とDebugBreak
( )は、呼び出し(または実際には特定のオペコード)kernel32.dll
以外は何もしません。int 3
int3
編集1:新しいWindowsバージョン(XP SP2以降、IIRC)では、回答に書いたようにsysenter
置き換えられます。int 2Eh
終了する理由の1つとして考えられるのは、例外処理によってこれをキャッチできるはずですが、スタックで期待されるパラメーターを渡さないためです。基本的に、ネイティブAPIのusermode部分は、呼び出すシステムサービスのパラメーターをスタックに配置し、サービスの番号(システムサービスディスパッチテーブルのインデックス-SSDT、場合によってはSDT)を特定のレジスタに配置してから呼び出します。新しいシステムsysenter
と古いシステムint 2Eh
。