出力バッファーの初期化失敗
ドライバーは、すべての出力バッファーを、呼び出し元に返す前にゼロで適切に初期化する必要があります。 バッファーの初期化に失敗すると、初期化されていないバイトのガベージ データが発生する可能性があります。
次の例では、ドライバーは未使用のバイトにあるガベージを返します。
case IOCTL_GET_NAME: {
...
...
outputBufferLength =
ioStack->Parameters.DeviceIoControl.OutputBufferLength;
outputBuffer = (PGET_NAME) Irp->AssociatedIrp.SystemBuffer;
if (outputBufferLength >= sizeof(GET_NAME)) {
length = outputBufferLength - sizeof(GET_NAME);
ntStatus = IoGetDeviceProperty(
DeviceExtension->PhysicalDeviceObject,
DevicePropertyDriverKeyName,
length,
outputBuffer->DriverKeyName,
&length);
outputBuffer->ActualLength =
length + sizeof(GET_NAME);
Irp->IoStatus.Information = outputBufferLength;
} else {
ntStatus = STATUS_BUFFER_TOO_SMALL;
}
IoStatus.Information を出力バッファー サイズに設定すると、出力バッファー全体が呼び出し元に返されます。 I/O マネージャーは、入力バッファーのサイズを超えてデータを初期化しません。バッファー内の要求の入力バッファーと出力バッファーが重複します。 システム サポート ルーチン IoGetDeviceProperty はバッファー全体を書き込まないため、この IOCTL は初期化されていないデータを呼び出し元に返します。
ドライバーによっては、情報フィールドを使用して、I/O 要求に関する詳細を提供するコードを返します。 それを行う前に、このようなドライバーは、IRP フラグをチェックして、IRP_INPUT_OPERATION が設定されていないことを確認する必要があります。 このフラグが設定されていない場合、IOCTL または FSCTL には出力バッファーがないため、情報フィールドでバッファー サイズを指定する必要はありません。 この場合、次のようになります。 ドライバーは、情報フィールドを安全に使用して独自のコードを返すことができます。