C30033

경고 C30033: POOL_NX_OPTIN 사용하여 컴파일된 드라이버에서 실행 파일 할당이 검색되었습니다. 이 드라이버는 런타임에 다른 드라이버에 의해 로드되도록 결정되었습니다. 로드 드라이버가 DriverEntry에서 ExInitializeDriverRuntime(DrvRtPoolNxOptIn) 을 호출하는지 확인하세요.

BANNED_MEM_ALLOCATION_MAYBE_UNSAFE_DRIVER_LOADED

이는 다른 드라이버에 의해 로드되는 DLL이므로 완전한 초기화 함수가 없는 것으로 확인되었습니다. 로드 드라이버가 다음과 같은지 확인합니다.

  • POOL_NX_OPTIN=1을 사용하여 컴파일됨
  • 초기화 함수에서 ExInitializeDriverRuntime(DrvRtPoolNxOptIn) 을 호출합니다.

로드 드라이버가 이러한 항목을 올바르게 지정하는 경우 경고를 무시할 수 있습니다.

예제

DLL의 모든 로더에 있는 다음 코드는 아래의 안전한 예제에 따라 변경해야 했음을 의미합니다.

원본 파일에서

C_DEFINES=$(C_DEFINES)

DriverEntry에서 메모리 할당이 발생하기 전에 다음을 수행합니다.

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;
…
    // No call to ExInitializeDriverRuntime
    return(status)
}

DLL의 모든 로더에 있는 다음 코드는 경고를 무시할 수 있음을 의미합니다.

원본 파일에서 를 추가합니다.

C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

DriverEntry에서 메모리 할당이 발생하기 전에 다음을 수행합니다.

NTSTATUS
DriverEntry (
    _In_ PDRIVER_OBJECT DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    NTSTATUS status;

    ExInitializeDriverRuntime( DrvRtPoolNxOptIn );
…

예제 #2

이 문제를 해결하는 두 번째 방법은 모든 호출이 실행 불가능한 메모리를 명시적으로 참조하도록 하는 것입니다.

다음 코드는 이 경고를 생성합니다.

ExAllocatePoolWithTag(NonPagedPool, numberOfBytes, 'xppn');

다음 코드는 이 경고를 방지합니다.

ExAllocatePoolWithTag(NonPagedPoolNx, numberOfBytes, 'xppn');