Bagikan melalui


Peringatan C28131

Rutinitas DriverEntry harus menyimpan salinan argumen, bukan pointer, karena Manajer I/O membebaskan buffer

Keterangan

Rutinitas driver DriverEntry menyimpan salinan pointer ke buffer alih-alih menyimpan salinan buffer. Karena buffer dikosongkan ketika DriverEntry rutin kembali, penunjuk ke buffer akan segera tidak valid.

Nama analisis kode: NOT_COPYING_NAME

Contoh

Kode berikut menghasilkan peringatan ini. g_RP berjenis PUNICODE_STRING, yang merupakan penunjuk ke jenis UNICODE_STRINGdata . Dengan menyimpan PUNICODE_STRING RegistryPath, kami hanya menyimpan pointer ke UNICODE_STRING tempat data berada. Ini akan hilang di akhir DriverEntry.

PUNICODE_STRING g_RP;

NTSTATUS
DriverEntry(
    PDRIVER_OBJECT DriverObject,
    PUNICODE_STRING RegistryPath
    )
{
    g_RP = RegistryPath;
    return 0;
}

Kode berikut memulihkan masalah ini. g_RP sekarang adalah UNICODE_STRING, dengan buffer sendiri. Ketika data disalin, data akan bertahan di luar pengembalian 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;
}