exectos/xtoskrnl/ke/apc.c
belliash 9a27d52efe
All checks were successful
ci/woodpecker/push/build Pipeline was successful
Correct typo
2023-02-18 00:07:12 +01:00

92 lines
2.3 KiB
C

/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/ke/apc.c
* DESCRIPTION: Kernel APC objects support
* DEVELOPERS: Rafal Kupiec <belliash@codingworkshop.eu.org>
*/
#include <xtos.h>
/**
* Initializes an APC object.
*
* @param Apc
* Supplies a pointer to the APC object.
*
* @param Thread
* Supplies a pointer to the thread object.
*
* @param Environment
* Specifies an environment in which the APC will run.
*
* @param KernelRoutine
* Supplies a pointer to routine called at APC_LEVEL.
*
* @param RundownRoutine
* Supplies a pointer to routine called on thread exit.
*
* @param NormalRoutine
* Supplies a pointer to routine called at IRQL 0.
*
* @param ApcMode
* Specifies processor mode, in which NormalRoutine gets called.
*
* @param Context
* Supplies a pointer to memory area containing data passed to NormalRoutine.
*
* @return This routine does not return any value.
*
* @since NT 3.5
*/
XTAPI
VOID
KeInitializeApc(IN PKAPC Apc,
IN PKTHREAD Thread,
IN KAPC_ENVIRONMENT Environment,
IN PKKERNEL_ROUTINE KernelRoutine,
IN PKRUNDOWN_ROUTINE RundownRoutine,
IN PKNORMAL_ROUTINE NormalRoutine,
IN KPROCESSOR_MODE ApcMode,
IN PVOID Context)
{
/* Set APC type and thread */
Apc->Type = ApcObject;
Apc->Thread = Thread;
/* Set routines */
Apc->KernelRoutine = KernelRoutine;
Apc->RundownRoutine = RundownRoutine;
Apc->NormalRoutine = NormalRoutine;
/* Check target environment */
if(Environment == CurrentApcEnvironment)
{
/* Use current APC environment taken from thread */
Apc->ApcStateIndex = Thread->ApcStateIndex;
}
else
{
/* Use new APC environment */
Apc->ApcStateIndex = Environment;
}
/* Check if normal routine specified */
if(NormalRoutine)
{
/* Set context and mode for notmal APC */
Apc->ApcMode = ApcMode;
Apc->NormalContext = Context;
}
else
{
/* Set context and mode for special APC */
Apc->ApcMode = KernelMode;
Apc->NormalContext = NULL;
}
/* Mark APC as not inserted yet */
Apc->Inserted = FALSE;
}