From 3354075900d7eb2fa9a7c28102c2f22d6efa8669 Mon Sep 17 00:00:00 2001 From: belliash Date: Sat, 18 Feb 2023 00:04:51 +0100 Subject: [PATCH] Initial Asynchronous Procedure Call (APC) support --- sdk/xtdk/kefuncs.h | 11 +++++ sdk/xtdk/ketypes.h | 5 ++- xtoskrnl/CMakeLists.txt | 1 + xtoskrnl/ke/apc.c | 91 +++++++++++++++++++++++++++++++++++++++++ xtoskrnl/xtoskrnl.spec | 1 + 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 xtoskrnl/ke/apc.c diff --git a/sdk/xtdk/kefuncs.h b/sdk/xtdk/kefuncs.h index ddf5c5a..4d38b39 100644 --- a/sdk/xtdk/kefuncs.h +++ b/sdk/xtdk/kefuncs.h @@ -16,6 +16,17 @@ /* Kernel services routines forward references */ +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); + XTAPI VOID KeInitializeSemaphore(IN PKSEMAPHORE Semaphore, diff --git a/sdk/xtdk/ketypes.h b/sdk/xtdk/ketypes.h index b2e50cd..70d4177 100644 --- a/sdk/xtdk/ketypes.h +++ b/sdk/xtdk/ketypes.h @@ -17,7 +17,7 @@ /* Maximum number of exception parameters */ -#define EXCEPTION_MAXIMUM_PARAMETERS 15 +#define EXCEPTION_MAXIMUM_PARAMETERS 15 /* Exception disposition return values */ typedef enum _EXCEPTION_DISPOSITION @@ -171,11 +171,14 @@ typedef struct _KPROCESS typedef struct _KTHREAD { DISPATCHER_HEADER Header; + LIST_ENTRY MutantListHead; PVOID InitialStack; PVOID KernelStack; PVOID StackBase; PVOID StackLimit; + KSPIN_LOCK ThreadLock; KAPC_STATE ApcState; + UCHAR ApcStateIndex; } KTHREAD, *PKTHREAD; #endif /* __XTDK_KEFUNCS_H */ diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index bfdce2d..51a78cf 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -16,6 +16,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/hl/efifb.c ${XTOSKRNL_SOURCE_DIR}/hl/globals.c ${XTOSKRNL_SOURCE_DIR}/hl/${ARCH}/ioport.c + ${XTOSKRNL_SOURCE_DIR}/ke/apc.c ${XTOSKRNL_SOURCE_DIR}/ke/globals.c ${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/ke/semphore.c diff --git a/xtoskrnl/ke/apc.c b/xtoskrnl/ke/apc.c new file mode 100644 index 0000000..001b154 --- /dev/null +++ b/xtoskrnl/ke/apc.c @@ -0,0 +1,91 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/apc.c + * DESCRIPTION: Kernel APC objects support + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * Initializes an APC object. + * + * @param Apc + * Supplies a pointer to the APC object. + * + * @param Thread + * Suppliws 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; +} diff --git a/xtoskrnl/xtoskrnl.spec b/xtoskrnl/xtoskrnl.spec index 1655597..c8bb90e 100644 --- a/xtoskrnl/xtoskrnl.spec +++ b/xtoskrnl/xtoskrnl.spec @@ -4,6 +4,7 @@ @ cdecl HlIoPortOutByte(ptr long) @ cdecl HlIoPortOutLong(ptr long) @ cdecl HlIoPortOutShort(ptr long) +@ stdcall KeInitializeApc(ptr ptr long ptr ptr ptr long ptr) @ stdcall KeInitializeSemaphore(ptr long long) @ stdcall KeInitializeSpinLock(ptr) @ stdcall KeInitializeTimer(ptr)