Предупреждение 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;
}