I/O 制御コードを含む IRP の安全な処理は、IOCTL コードを適切に定義し、ドライバーが IRP で受け取るパラメーターを慎重に調べることによって異なります。
新しい IOCTL コードを定義する場合は、次の規則を使用します。
常に、0x800以上の FunctionCode 値を指定します。
必ず RequiredAccess 値を指定します。 呼び出し元に十分なアクセス権がない場合、I/O マネージャーは IOCTL を送信しません。
呼び出し元がカーネル メモリの非特定領域の読み取りまたは書き込みを許可する IOCTL コードを定義しないでください。
ドライバー内で IOCTL コードを処理する場合は、次の規則を使用します。
ドライバーのディスパッチ ルーチンが受信した IOCTL コードをテストするたびに、常に 32 ビット値全体をテストする必要があります。
ドライバーは 、IoValidateDeviceIoControlAccess を使用して、I/O コントロール コードの定義で RequiredAccess 値で指定されたよりも厳密なアクセス チェックを動的に実行できます。
Irp->AssociatedIrp.SystemBuffer が含むことができるバッファーよりも多くのデータを読み書きしないでください。 そのため、バッファーの制限を決定するには、常にIO_STACK_LOCATION構造体の Parameters.DeviceIoControl.InputBufferLength または Parameters.DeviceIoControl.OutputBufferLength を確認してください。
IOCTL 要求を発生させたアプリケーションを対象としたデータを格納するドライバー割り当てバッファーは常に 0 個です。 そうすることで、機密データを誤ってアプリケーションにコピーすることはありません。
METHOD_IN_DIRECTとMETHOD_OUT_DIRECTの転送については、上記の規則に従ってください。 さらに、マッピングが失敗したか、長さ 0 のバッファーが指定されたことを示す、MmGetSystemAddressForMdlSafe からの NULL 戻り値を確認します。
METHOD_NEITHER転送の場合は、「バッファード I/O もダイレクト I/O も使用しない」に記載されている規則に従ってください。