ドライバーは、呼び出し元に返す前に、ゼロですべての出力バッファーを初期化する必要があります。 バッファーの初期化に失敗すると、初期化されていないバイトのガベージ データが発生する可能性があります。
次の例では、ドライバーは未使用のバイトで無意味なデータを返します。
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_INPUT_OPERATIONが設定されていないことを確認する IRP フラグを確認する必要があります。 このフラグが設定されていない場合、IOCTL または FSCTL には出力バッファーがないため、[ 情報 ] フィールドでバッファー サイズを指定する必要はありません。 この場合。 ドライバーは、 情報フィールドを 安全に使用して、独自のコードを返すことができます。