From d8c68ed00351e359142500d3e15ae82ed3d9bcc6 Mon Sep 17 00:00:00 2001 From: belliash Date: Wed, 8 Feb 2023 16:33:57 +0100 Subject: [PATCH] Add endian conversion routines --- sdk/xtdk/rtlfuncs.h | 12 +++++++ xtoskrnl/CMakeLists.txt | 1 + xtoskrnl/rtl/byteswap.c | 72 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 xtoskrnl/rtl/byteswap.c diff --git a/sdk/xtdk/rtlfuncs.h b/sdk/xtdk/rtlfuncs.h index 18895c4..bab140e 100644 --- a/sdk/xtdk/rtlfuncs.h +++ b/sdk/xtdk/rtlfuncs.h @@ -91,6 +91,18 @@ RtlStringToWideString(OUT PWCHAR Destination, IN CONST PUCHAR *Source, IN SIZE_T Length); +XTFASTCALL +ULONG +RtlUlongByteSwap(IN ULONG Source); + +XTFASTCALL +ULONGLONG +RtlUlonglongByteSwap(IN ULONGLONG Source); + +XTFASTCALL +USHORT +RtlUshortByteSwap(IN USHORT Source); + XTCDECL INT RtlWideStringCompare(IN CONST PWCHAR String1, diff --git a/xtoskrnl/CMakeLists.txt b/xtoskrnl/CMakeLists.txt index f296af1..2137316 100644 --- a/xtoskrnl/CMakeLists.txt +++ b/xtoskrnl/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND XTOSKRNL_SOURCE ${XTOSKRNL_SOURCE_DIR}/ke/globals.c ${XTOSKRNL_SOURCE_DIR}/ke/krnlinit.c ${XTOSKRNL_SOURCE_DIR}/ke/${ARCH}/krnlinit.c + ${XTOSKRNL_SOURCE_DIR}/rtl/byteswap.c ${XTOSKRNL_SOURCE_DIR}/rtl/memory.c ${XTOSKRNL_SOURCE_DIR}/rtl/plist.c ${XTOSKRNL_SOURCE_DIR}/rtl/string.c diff --git a/xtoskrnl/rtl/byteswap.c b/xtoskrnl/rtl/byteswap.c new file mode 100644 index 0000000..954c89b --- /dev/null +++ b/xtoskrnl/rtl/byteswap.c @@ -0,0 +1,72 @@ +/** + * PROJECT: ExectOS + * COPYRIGHT: See COPYING.md in the top level directory + * FILE: xtoskrnl/rtl/byteswap.c + * DESCRIPTION: Endian conversion routines + * DEVELOPERS: Rafal Kupiec + */ + +#include + + +/** + * This routine converts endianness on 32bit value. + * + * @param Source + * Supplies a value to swap bytes. + * + * @return Swapped 32bit value. + * + * @since NT 4.0 + */ +XTFASTCALL +ULONG +RtlUlongByteSwap(IN ULONG Source) +{ + return (ULONG)(((Source >> 24) & 0x000000FF) | + ((Source >> 8) & 0x0000FF00) | + ((Source << 8) & 0x00FF0000) | + ((Source << 24) & 0xFF000000)); +} + +/** + * This routine converts endianness on 64bit value. + * + * @param Source + * Supplies a value to swap bytes. + * + * @return Swapped 64bit value. + * + * @since NT 4.0 + */ +XTFASTCALL +ULONGLONG +RtlUlonglongByteSwap(IN ULONGLONG Source) +{ + return (ULONGLONG)(((Source >> 56) & 0x00000000000000FF) | + ((Source >> 40) & 0x000000000000FF00) | + ((Source >> 24) & 0x0000000000FF0000) | + ((Source >> 8) & 0x00000000FF000000) | + ((Source << 8) & 0x000000FF00000000) | + ((Source << 24) & 0x0000FF0000000000) | + ((Source << 40) & 0x00FF000000000000) | + ((Source << 56) & 0xFF00000000000000)); +} + +/** + * This routine converts endianness on 16bit value. + * + * @param Source + * Supplies a value to swap bytes. + * + * @return Swapped 16bit value. + * + * @since NT 4.0 + */ +XTFASTCALL +USHORT +RtlUshortByteSwap(IN USHORT Source) +{ + return (USHORT)(((Source >> 8) & 0x00FF) | + ((Source << 8) & 0xFF00)); +}