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