Поделиться через


Предупреждение C28131

Подпрограмма DriverEntry должна сохранить копию аргумента, а не указатель, так как диспетчер ввода-вывода освобождает буфер.

Комментарии

Подпрограмма DriverEntry драйвера сохраняет копию указателя на буфер, а не копию буфера. Так как буфер освобождается при возврате DriverEntry подпрограммы, указатель на буфер скоро станет недопустимым.

Имя анализа кода: NOT_COPYING_NAME

Пример

Следующий код создает это предупреждение. g_RP имеет тип PUNICODE_STRING, который является указателем на тип UNICODE_STRINGданных . PUNICODE_STRING RegistryPathСохраняя , мы сохраняем только указатель на объект , UNICODE_STRING в котором существуют данные. Эта функция будет потеряна DriverEntryв конце .

PUNICODE_STRING g_RP;

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

Следующий код устраняет эту проблему. g_RP Теперь является , с собственным буфером UNICODE_STRING. При копировании данные сохраняются после возврата 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;
}