Compartilhar via


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