警告 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;
}