Condividi tramite


Errore durante l'inizializzazione dei buffer di output

I driver devono inizializzare tutti i buffer di output con zeri prima di restituirli al chiamante. Se non si inizializza un buffer, è possibile che i dati di Garbage non possano essere inizializzati in byte.

Nell'esempio seguente un driver restituisce garbage in byte inutilizzati.

   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;
      }

Se si imposta IoStatus.Information sulla dimensione del buffer di output, l'intero buffer di output viene restituito al chiamante. Il gestore di I/O non inizializza i dati oltre le dimensioni del buffer di input, ovvero i buffer di input e output si sovrappongono per una richiesta memorizzata nel buffer. Poiché la routine di supporto del sistema IoGetDeviceProperty non scrive l'intero buffer, questo IOCTL restituisce dati non inizializzati al chiamante.

Alcuni driver usano il campo Informazioni per restituire codici che forniscono dettagli aggiuntivi sulle richieste di I/O. Prima di farlo, tali driver devono controllare i flag IRP per assicurarsi che IRP_INPUT_OPERATION non sia impostato. Quando questo flag non è impostato, IOCTL o MDFTL non dispone di un buffer di output, quindi il campo Informazioni non deve fornire una dimensione del buffer. In questo caso. il driver può usare in modo sicuro il campo Informazioni per restituire il proprio codice.