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');