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. Si no se inicializa un búfer, se pueden producir datos no utilizados en bytes no inicializados.

En el ejemplo siguiente, un controlador devuelve elementos no utilizados en bytes sin usar.

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

Si se establece IoStatus.Information en el tamaño del búfer de salida, se devuelve el búfer de salida completo 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 compatibilidad del sistema IoGetDeviceProperty no escribe todo el búfer, este IOCTL devuelve datos no inicializados al autor de la llamada.

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 comprobar las marcas IRP para asegurarse de que no se ha establecido IRP_INPUT_OPERATION. 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.