Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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_STRINGde 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;
}