KeSetEventPageable (Windows-TreibercodeQL-Abfrage)
Übersicht
KeSetEvent darf nicht in einem seitenseitigen Segment aufgerufen werden, wenn das Wait-Argument auf TRUE festgelegt ist. Dies kann zu einem Systemabsturz führen, bei dem das Segment ausgelagert wird.
Weitere Informationen finden Sie unter KeSetEvent (wdm.h).
Empfehlung
Passen Sie den KeSetEvent-Aufruf an, um FALSE an den Wait-Parameter zu übergeben.
Beispiel
// 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
Zusätzliche Details
Diese Abfrage finden Sie im Microsoft GitHub CodeQL-Repository. Details dazu, wie Windows-Treiberentwickler CodeQL herunterladen und ausführen können, finden Sie auf der Seite "CodeQL" und auf der Seite "Logotest für statische Tools".