Freigeben über


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_STRINGist. Durch das Speichern PUNICODE_STRING RegistryPathspeichern wir nur den Zeiger auf den UNICODE_STRING Ort, an dem sich die Daten befinden. Dies geht am Ende von DriverEntryverloren.

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