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