IrqlExAllocatePool 규칙(wdm)
IrqlExAllocatePool 규칙은 드라이버가 IRQL<=DISPATCH_LEVEL 실행되는 경우에만 ExAllocatePoolWithTag 및 ExAllocatePoolWithTagPriority를 호출함을 지정합니다.
DISPATCH_LEVEL 실행되는 호출자는 PoolType에 대해 NonPagedXxx 값을 지정해야 합니다. IRQL <= APC_LEVEL 실행되는 호출자는 POOL_TYPE 값을 지정할 수 있습니다.
드라이버 모델: WDM
버그 검사 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION(0x00020004), 버그 검사 0xA: IRQL_NOT_LESS_OR_EQUAL 규칙으로 발견된 버그 검사
예제
다음 예제에서 ExAllocatePoolWithTag 루틴은 IRQL을 DISPATCH_LEVEL 설정하는 KeAcquireSpinLock 루틴 이후에 호출됩니다. ExAllocatePoolWithTag 루틴은 규칙을 위반하는 PagedPool을 사용하여 호출됩니다.
NTSTATUS
DispatchRequest (
__in PDEVICE_REQUEST DeviceRequest
)
{
KIRQL OldIrql;
KSPIN_LOCK SpinLock;
NTSTATUS Status;
...
KeInitializeSpinLock(&SpinLock);
//
// KeAcquireSpinLock sets IRQL to DISPATCH_LEVEL and the previous IRQL is
// written to OldIrql after the lock is acquired.
//
KeAcquireSpinLock(&SpinLock, &OldIrql);
...
Status = ProcessRequest(DeviceRequest);
//
// KeReleaseSpinLock sets IRQL to the OldIrql returned by KeAcquireSpinLock.
//
KeReleaseSpinLock(&SpinLock, &OldIrql);
...
}
NTSTATUS
ProcessRequest (
__in PDEVICE_REQUEST DeviceRequest
)
{
NTSTATUS Status;
...
//
// RULE VIOLATION! - IrqlExAllocatePool executing at DISPATCH_LEVEL must specify
// a NonPagedXxx value for PoolType.
//
DeviceRequest->Context = ExAllocatePool(PagedPool, sizeof(REQUEST_CONTEXT));
if (DeviceRequest->Context == NULL) {
Status = STATUS_INSUFFICIENT_RESOURCES;
}
...
return Status;
}
테스트 방법
컴파일 시 |
---|
정적 드라이버 검증 도구 를 실행하고 IrqlExAllocatePool 규칙을 지정합니다. 다음 단계를 사용하여 코드 분석을 실행합니다.자세한 내용은 정적 드라이버 검증 도구로 드라이버에서 결함 찾기를 참조하세요. |
런타임 시 |
---|
드라이버 검증 도구 를 실행하고 DDI 준수 확인 옵션을 선택합니다. |
적용 대상
ExAllocatePoolWithTagExAllocatePoolWithTagPriority