次の方法で共有


出力バッファーの初期化失敗

ドライバーは、すべての出力バッファーを、呼び出し元に返す前にゼロで適切に初期化する必要があります。 バッファーの初期化に失敗すると、初期化されていないバイトのガベージ データが発生する可能性があります。

次の例では、ドライバーは未使用のバイトにあるガベージを返します。

   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 には出力バッファーがないため、情報フィールドでバッファー サイズを指定する必要はありません。 この場合、次のようになります。 ドライバーは、情報フィールドを安全に使用して独自のコードを返すことができます。