Partager via


Avertissement C28131

La routine DriverEntry doit enregistrer une copie de l’argument, et non le pointeur, car le Gestionnaire d’E/S libère la mémoire tampon

Remarques

La routine du DriverEntry pilote enregistre une copie du pointeur vers la mémoire tampon au lieu d’enregistrer une copie de la mémoire tampon. Étant donné que la mémoire tampon est libérée lorsque la DriverEntry routine est retournée, le pointeur vers la mémoire tampon ne sera bientôt pas valide.

Nom de l’analyse du code : NOT_COPYING_NAME

Exemple

Le code suivant génère cet avertissement. g_RP est de type PUNICODE_STRING, qui est un pointeur vers le type UNICODE_STRINGde données . En enregistrant PUNICODE_STRING RegistryPath, nous enregistrons uniquement le pointeur vers l’emplacement UNICODE_STRING où les données existent. Cela sera perdu à la fin de DriverEntry.

PUNICODE_STRING g_RP;

NTSTATUS
DriverEntry(
    PDRIVER_OBJECT DriverObject,
    PUNICODE_STRING RegistryPath
    )
{
    g_RP = RegistryPath;
    return 0;
}

Le code suivant corrige ce problème. g_RP est maintenant un UNICODE_STRING, avec sa propre mémoire tampon. Lorsque les données sont copiées, elles sont conservées au-delà du retour de DriverEntry

UNICODE_STRING g_RP;

NTSTATUS
DriverEntry(
    PDRIVER_OBJECT DriverObject,
    PUNICODE_STRING RegistryPath
    )
{
    g_RP = CloneRegistryPath(RegistryPath);  // CloneRegistryPath is an example helper function that copies over the data.
    return 0;
}