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