警告 C28131

DriverEntry 例程应保存 参数的副本,而不是指针,因为 I/O 管理器释放缓冲区

注解

驱动程序的 DriverEntry 例程保存指向缓冲区的指针的副本,而不是保存缓冲区的副本。 由于在例程返回时 DriverEntry 释放缓冲区,因此指向缓冲区的指针将很快无效。

代码分析名称:NOT_COPYING_NAME

示例

下面的代码将生成此警告。 g_RPPUNICODE_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;
}