共用方式為


無法初始化輸出緩衝區

驅動程式應該先以零初始化所有輸出緩衝區,再將它們傳回給呼叫端。 無法初始化緩衝區可能會導致任何未初始化位元組的垃圾資料。

在下列範例中,驅動程式會以未使用的位元組傳回垃圾。

   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 沒有輸出緩衝區,因此 資訊 欄位不需要提供緩衝區大小。 在此情況下。 驅動程式可以使用 [資訊 ] 欄位安全地傳回自己的程式碼。