From 9cc776e06adfd30456196ce8c1e10ad5a23dd812 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Wed, 3 Sep 2025 21:00:18 +0200 Subject: [PATCH] Add generic kernel information support --- xtoskrnl/CMakeLists.txt | 1 + xtoskrnl/includes/kei.h | 9 ++++ xtoskrnl/ke/info.c | 94 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 xtoskrnl/ke/info.c diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index 9f208daf..147799ad 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -43,6 +43,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ke/dpc.c ${XTOSKRNL_SOURCE_DIR}/ke/event.c ${XTOSKRNL_SOURCE_DIR}/ke/globals.c + ${XTOSKRNL_SOURCE_DIR}/ke/info.c ${XTOSKRNL_SOURCE_DIR}/ke/kprocess.c ${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/ke/kthread.c diff --git a/xtoskrnl/includes/kei.h b/xtoskrnl/includes/kei.h index 89f6dea5..76c07953 100644 --- a/xtoskrnl/includes/kei.h +++ b/xtoskrnl/includes/kei.h @@ -21,6 +21,15 @@ XTAPI VOID KeClearTimer(IN PKTIMER Timer); +XTAPI +SYSTEM_FIRMWARE_TYPE +KeGetFirmwareType(VOID); + +XTAPI +XTSTATUS +KeGetKernelParameter(IN PCWSTR ParameterName, + OUT PCWSTR *Parameter); + XTAPI VOID KeHaltSystem(VOID); diff --git a/xtoskrnl/ke/info.c b/xtoskrnl/ke/info.c new file mode 100644 index 00000000..8c01ef2f --- /dev/null +++ b/xtoskrnl/ke/info.c @@ -0,0 +1,94 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/ke/info.c + * DESCRIPTION: Generic kernel information support + * DEVELOPERS: Aiken Harris + */ + +#include + + +/** + * Retrieves the system firmware type (BIOS or UEFI). + * + * @return This routine returns the type of the system firmware. + * + * @since XT 1.0 + */ +XTAPI +SYSTEM_FIRMWARE_TYPE +KeGetFirmwareType(VOID) +{ + return KeInitializationBlock->FirmwareInformation.FirmwareType; +} + +/** + * Retrieves a pointer to the specified kernel parameter within the kernel parameters list. + * + * @param ParameterName + * Supplies a pointer to a null-terminated wide string specifying the name of the parameter to search for. + * + * @param Parameter + * Supplies a pointer to a variable that receives a pointer to the matching parameter, or NULL if not found. + * + * @return This routine returns a status code. + * + * @since XT 1.0 + */ +XTAPI +XTSTATUS +KeGetKernelParameter(IN PCWSTR ParameterName, + OUT PCWSTR *Parameter) +{ + PCWSTR KernelParameters,Match, SearchStart; + SIZE_T ParameterNameLength; + + /* Get the kernel parameters */ + KernelParameters = KeInitializationBlock->KernelParameters; + + /* Validate input parameters */ + if(!KernelParameters || !ParameterName || !Parameter) + { + /* Invalid input parameters, return error */ + return STATUS_INVALID_PARAMETER; + } + + /* Get the length of the parameter name we are looking for */ + ParameterNameLength = RtlWideStringLength(ParameterName, 0); + if(ParameterNameLength == 0) + { + /* Do not allow empty parameter names */ + return STATUS_INVALID_PARAMETER; + } + + /* Assume the requested parameter is not present in the kernel parameters */ + *Parameter = NULL; + + /* Start searching from the beginning of the list */ + SearchStart = KernelParameters; + + /* Search for the parameter name */ + while((Match = RtlFindWideStringInsensitive(SearchStart, ParameterName))) + { + /* Check if the match is at the start of the string or preceded by a space */ + if(Match == KernelParameters || *(Match - 1) == L' ') + { + /* Check the character after the match to avoid matching prefixes */ + if(Match[ParameterNameLength] == L'\0' || + Match[ParameterNameLength] == L' ' || + Match[ParameterNameLength] == L'=') + { + /* A valid parameter was found, return a pointer to it */ + *Parameter = Match; + return STATUS_SUCCESS; + } + } + + /* The match was a substring of a larger token, continue searching */ + SearchStart = Match + 1; + } + + /* Parameter not found */ + return STATUS_NOT_FOUND; +}