Compartir a través de


Advertencia C28131

La rutina DriverEntry debe guardar una copia del argumento, no el puntero, porque el Administrador de E/S libera el búfer.

Comentarios

La rutina del DriverEntry controlador guarda una copia del puntero en el búfer en lugar de guardar una copia del búfer. Dado que el búfer se libera cuando la DriverEntry rutina vuelve, el puntero al búfer pronto no será válido.

Nombre del análisis de código: NOT_COPYING_NAME

Ejemplo

El código siguiente genera esta advertencia. g_RP es de tipo PUNICODE_STRING, que es un puntero al tipo UNICODE_STRINGde datos . Al guardar PUNICODE_STRING RegistryPath, solo se guarda el puntero en el UNICODE_STRING lugar donde existen los datos. Esto se perderá al final de DriverEntry.

PUNICODE_STRING g_RP;

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

El código siguiente corrige este problema. g_RP ahora es un UNICODE_STRING, con su propio búfer. Cuando se copien los datos, se conservará más allá del retorno 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;
}