Share via


경고 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;
}