Partager via


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

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

Dans l’exemple suivant, un pilote retourne une mémoire 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;
      }

Si vous définissez IoStatus.Information sur la taille de la mémoire tampon de sortie, l’intégralité de la mémoire tampon de sortie est retournée à 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 du système IoGetDeviceProperty n’écrit pas la totalité de la mémoire tampon, cet IOCTL renvoie 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 case activée les indicateurs IRP pour s’assurer que IRP_INPUT_OPERATION n’est pas défini. Lorsque cet indicateur n’est pas défini, l’IOCTL ou LE FSCTL n’a pas de mémoire tampon de sortie. Par conséquent, le champ Informations 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.