Compartir a través de


Error al inicializar búferes de salida

Los controladores deben inicializar todos los búferes de salida con ceros antes de devolverlos al autor de la llamada. No inicializar un búfer puede resultar en datos basura en cualquier octeto no inicializado.

En el ejemplo siguiente, un controlador devuelve datos basura en bytes no utilizados.

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

Al establecer IoStatus.Information en el tamaño del búfer de salida, el búfer de salida completo se devolverá al autor de la llamada. El administrador de E/S no inicializa los datos más allá del tamaño del búfer de entrada: los búferes de entrada y salida se superponen para una solicitud almacenada en búfer. Dado que la rutina de soporte del sistema IoGetDeviceProperty no escribe todo el contenido del búfer, este IOCTL devuelve datos sin inicializar al llamante.

Algunos controladores usan el campo Información para devolver códigos que proporcionan detalles adicionales sobre las solicitudes de E/S. Antes de hacerlo, estos controladores deben verificar las marcas IRP para asegurarse de que IRP_INPUT_OPERATION no se haya configurado. Cuando no se establece esta marca, el IOCTL o FSCTL no tiene un búfer de salida, por lo que el campo Información no necesita proporcionar un tamaño de búfer. En este caso. el controlador puede usar de forma segura el campo Información para devolver su propio código.