Aviso C28131
A rotina DriverEntry deve salvar uma cópia do argumento, não o ponteiro, porque o Gerenciador de E/S libera o buffer
Comentários
A rotina do DriverEntry
driver é salvar uma cópia do ponteiro para o buffer em vez de salvar uma cópia do buffer. Como o buffer é liberado quando a DriverEntry
rotina retorna, o ponteiro para o buffer em breve será inválido.
Nome da análise de código: NOT_COPYING_NAME
Exemplo
O código a seguir gera esse aviso. g_RP
é do tipo PUNICODE_STRING
, que é um ponteiro para o tipo UNICODE_STRING
de dados . Ao salvar PUNICODE_STRING RegistryPath
, estamos salvando apenas o ponteiro para o UNICODE_STRING
local em que os dados existem. Isso será perdido no final de DriverEntry
.
PUNICODE_STRING g_RP;
NTSTATUS
DriverEntry(
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
g_RP = RegistryPath;
return 0;
}
O código a seguir corrige esse problema. g_RP
agora é um UNICODE_STRING
, com seu próprio buffer. Quando os dados forem copiados, eles persistirão além do 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;
}