Warnung C28131
Die DriverEntry-Routine sollte eine Kopie des Arguments und nicht den Zeiger speichern, da der E/A-Manager den Puffer freigibt.
Hinweise
Die Routine des Treibers DriverEntry
speichert eine Kopie des Zeigers auf den Puffer, anstatt eine Kopie des Puffers zu speichern. Da der Puffer freigegeben wird, wenn die DriverEntry
Routine zurückgibt, ist der Zeiger auf den Puffer bald ungültig.
Codeanalysename: NOT_COPYING_NAME
Beispiel
Der folgende Code generiert diese Warnung. g_RP
ist vom Typ PUNICODE_STRING
, was ein Zeiger auf den Datentyp UNICODE_STRING
ist. Durch das Speichern PUNICODE_STRING RegistryPath
speichern wir nur den Zeiger auf den UNICODE_STRING
Ort, an dem sich die Daten befinden. Dies geht am Ende von DriverEntry
verloren.
PUNICODE_STRING g_RP;
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
g_RP = RegistryPath;
return 0;
}
Mit dem folgenden Code wird dieses Problem behoben. g_RP
ist jetzt ein UNICODE_STRING
, mit einem eigenen Puffer. Wenn die Daten kopiert werden, bleiben sie über die Rückgabe von hinaus erhalten. 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;
}