Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Přehled
KeSetEvent nesmí být volána v stránkovaném segmentu, pokud je argument Čekání nastaven na HODNOTU TRUE. To může způsobit pád systému, pokud je segment odložen na disk.
Další informace naleznete v tématu KeSetEvent (wdm.h).
Doporučení
Upravte volání KeSetEvent tak, aby předalo hodnotu FALSE parametru wait.
Příklad
// 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
Další podrobnosti
Tento dotaz najdete v úložišti Microsoft GitHub CodeQL. Podrobnosti o tom, jak mohou vývojáři ovladačů systému Windows stáhnout a spustit CodeQL, najdete na stránce CodeQL and the Static Tools Logo Test.