ドライバー開発に関するコードプロジェクトの記事をいくつか読んでいますが、IOCTL と IRP について混乱しています。私が見たところ、IOCTL はユーザーモードから送信され、IRP に変換されているようです。また、IRP は OS とデバイスの間のメッセージですが、これは私が読んでいる説明と一致していないようです...何かが足りないのではないかと思います。
TLDR IOCTL と IRP の違いは何ですか?
IOCTL は、IO 制御コードのニーモニック、または IO マネージャにバッファリングやその他の情報を提供するビット フィールドが定義された 32 ビット値です。IRP (IO 要求パケット) は、IO マネージャーによって作成される構造体または定義されたメモリのチャンクであり、IOCTL を含む、IO 要求に対してドライバーが特定のアクションを実行するために必要なすべての情報が含まれています。IOCTL はカーネル モードとユーザー モードの両方で使用されますが、IRP はカーネルと対象のドライバーまたはドライバー スタック内でのみ有効です。
ユーザー空間アプリケーション DeviceIoControl() から -> kernel32.dll -> ntdll.dll -> ユーザー モードからカーネル モードに移行する瞬間 -> I/O マネージャー -> IRP