Partager via


Échec de l’initialisation des mémoires tampons de sortie

Les pilotes doivent initialiser toutes les mémoires tampons de sortie avec zéros avant de les renvoyer à l’appelant. L'échec de l'initialisation d'une mémoire tampon peut entraîner des données indésirables dans des octets non-initialisés.

Dans l’exemple suivant, un pilote retourne le garbage en octets inutilisés.

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

La définition d’IoStatus.Information sur la taille de la mémoire tampon de sortie entraîne le retour de la mémoire tampon de sortie entière à l’appelant. Le gestionnaire d’E/S n’initialise pas les données au-delà de la taille de la mémoire tampon d’entrée , les mémoires tampons d’entrée et de sortie se chevauchent pour une demande mise en mémoire tampon. Étant donné que la routine de prise en charge système IoGetDeviceProperty n’écrit pas le tampon entier, cet IOCTL retourne des données non initialisées à l’appelant.

Certains pilotes utilisent le champ Informations pour retourner des codes qui fournissent des détails supplémentaires sur les demandes d’E/S. Avant cela, ces pilotes doivent vérifier les indicateurs IRP pour s’assurer que IRP_INPUT_OPERATION n’est pas définie. Lorsque cet indicateur n’est pas défini, le IOCTL ou le FSCTL n’a pas de mémoire tampon de sortie. Par conséquent, le champ Information n’a pas besoin de fournir une taille de mémoire tampon. Dans ce cas. le pilote peut utiliser en toute sécurité le champ Informations pour retourner son propre code.