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