KeSetEventPageable(Windows 드라이버 CodeQL 쿼리)
개요
Wait 인수가 TRUE로 설정된 경우 페이징된 세그먼트에서 KeSetEvent를 호출해서는 안 됩니다. 이로 인해 세그먼트가 페이징되는 시스템 크래시가 발생할 수 있습니다.
자세한 내용은 KeSetEvent(wdm.h)를 참조하세요.
추천
대기 매개 변수에 FALSE를 전달하도록 KeSetEvent 호출을 조정합니다.
예시
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
//
// driver_snippet.c
//
#define SET_DISPATCH 1
// Template. Not called in this test.
void top_level_call() {}
#include <wdm.h>
void KeSetEventIrql_Fail1(PRKEVENT Event);
_IRQL_always_function_min_(APC_LEVEL)
void KeSetEventIrql_Fail2(PRKEVENT Event);
_IRQL_always_function_min_(PASSIVE_LEVEL)
void KeSetEventIrql_Pass1(PRKEVENT Event);
_IRQL_always_function_min_(PASSIVE_LEVEL)
void KeSetEventIrql_Pass2(PRKEVENT Event);
#pragma alloc_text(PAGE, KeSetEventIrql_Fail1)
#pragma alloc_text(PAGE, KeSetEventIrql_Fail2)
#pragma alloc_text(PAGE, KeSetEventIrql_Pass2)
void KeSetEventIrql_Fail1(PRKEVENT Event)
{
// This is a paged function. We assume a lower limit of PASSIVE_LEVEL and an upper limit of APC_LEVEL on the IRQL.
KeSetEvent(Event, HIGH_PRIORITY, TRUE); // ERROR: Calling with wait set to TRUE in a pageable context
}
void KeSetEventIrql_Fail2(PRKEVENT Event)
{
// This is a paged function. Even though it runs at APC_LEVEL, not PASSIVE_LEVEL, that's still an error.
KeSetEvent(Event, HIGH_PRIORITY, TRUE); // ERROR: Calling with wait set to TRUE in a pageable context
}
void KeSetEventIrql_Pass1(PRKEVENT Event)
{
// This function will potentially run at passive level but it's not pageable, so there's no issue.
KeSetEvent(Event, HIGH_PRIORITY, TRUE);
}
void KeSetEventIrql_Pass2(PRKEVENT Event)
{
// This function will runs at passive level and is pageable, but correctly uses FALSE in its call to KeSetEvent.
KeSetEvent(Event, HIGH_PRIORITY, FALSE);
}
// TODO multi-threaded tests
// function has max IRQL requirement, creates two threads where one is above that requirement and one is below
추가 정보
이 쿼리는 Microsoft GitHub CodeQL 리포지토리에서 찾을 수 있습니다. Windows 드라이버 개발자가 CodeQL을 다운로드하고 실행하는 방법에 대한 자세한 내용은 CodeQL 및 정적 도구 로고 테스트 페이지를 참조하세요.