警告 C28131
I/O マネージャーがバッファを解放するため、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;
}