次の方法で共有


出力バッファーを初期化できない

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

次の例では、ドライバーは未使用のバイトで無意味なデータを返します。

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