警告 C28131
DriverEntry 例程应保存 参数的副本,而不是指针,因为 I/O 管理器释放缓冲区
注解
驱动程序的 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;
}