KeSetEventPageable (query CodeQL del driver di Windows)
Panoramica
KeSetEvent non deve essere chiamato in un segmento di paging quando l'argomento Wait è impostato su TRUE. Questo può causare un arresto anomalo del sistema che il segmento viene impaginato.This can cause a system crash the segment is paged out.
Per altre informazioni, vedere KeSetEvent (wdm.h).
Elemento consigliato
Modificare la chiamata KeSetEvent per passare FAL edizione Standard al parametro di attesa.
Esempio
// 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
Dettagli aggiuntivi
Questa query è disponibile nel repository CodeQL di Microsoft GitHub. Per informazioni dettagliate sul modo in cui gli sviluppatori di Driver Windows possono scaricare ed eseguire CodeQL, vedere la pagina CodeQL e il logo degli strumenti statici.