Add basic unicode string support
Some checks failed
Builds / ExectOS (amd64, debug) (push) Failing after 33s
Builds / ExectOS (i686, debug) (push) Failing after 30s
Builds / ExectOS (i686, release) (push) Failing after 57s
Builds / ExectOS (amd64, release) (push) Failing after 1m0s

This commit is contained in:
2026-06-24 09:37:42 +02:00
parent 195c4a34ad
commit 7b27b09748
6 changed files with 167 additions and 0 deletions

115
xtoskrnl/rtl/unicode.cc Normal file
View File

@@ -0,0 +1,115 @@
/**
* PROJECT: ExectOS
* COPYRIGHT: See COPYING.md in the top level directory
* FILE: xtoskrnl/rtl/unicode.cc
* DESCRIPTION: Unicode support
* DEVELOPERS: Aiken Harris <harraiken91@gmail.com>
*/
#include <xtos.hh>
/**
* Copies a source Unicode string to a destination Unicode string.
*
* @param Destination
* Supplies a pointer to the destination string.
*
* @param Source
* Supplies an optional pointer to the source string. If this parameter is not provided,
* the destination string is effectively emptied.
*
* @return This routine does not return any value.
*
* @since XT 1.0
*/
XTAPI
VOID
RTL::Unicode::CopyString(IN OUT PUNICODE_STRING Destination,
IN PCUNICODE_STRING Source)
{
ULONG Length;
/* Check if the source string pointer is valid */
if(!Source)
{
/* Source is missing, clear the destination string and return */
Destination->Length = 0;
return;
}
/* Calculate the length to copy */
Length = MIN(Source->Length, Destination->MaximumLength);
Destination->Length = Length;
/* Copy the source string data into the destination buffer */
RTL::Memory::CopyMemory(Destination->Buffer, Source->Buffer, Length);
/* Check if there is enough space left in the buffer to NULL-terminate */
if(Destination->Length < Destination->MaximumLength)
{
/* Append a NULL terminator */
Destination->Buffer[Length / sizeof(WCHAR)] = (WCHAR)0;
}
}
/**
* Initializes a Unicode string.
*
* @param Destination
* Supplies a pointer to the UNICODE_STRING structure to be initialized.
*
* @param Source
* Supplies an optional pointer to a NULL-terminated wide character string.
*
* @param Truncate
* Specifies whether to truncate the source string to the maximum allowed length.
*
* @return This routine returns a status code indicating the success or failure of the operation.
*
* @since XT 1.0
*/
XTAPI
XTSTATUS
RTL::Unicode::InitializeString(OUT PUNICODE_STRING Destination,
IN PCWSTR Source,
IN BOOLEAN Truncate)
{
ULONG Size;
/* Check if the source string pointer is valid */
if(!Source)
{
/* Source is missing, initialize the destination as empty string */
Destination->Length = 0;
Destination->MaximumLength = 0;
/* Return success */
return STATUS_SUCCESS;
}
/* Calculate the size of the string in bytes */
Size = RTL::WideString::WideStringLength(Source, 0) * sizeof(WCHAR);
/* Check if the size exceeds the maximum allowed */
if(Size > ((MAXUSHORT & ~1) - sizeof(WCHAR)))
{
/* Check if truncation is not explicitly forced */
if(!Truncate)
{
/* Return error code */
return STATUS_NAME_TOO_LONG;
}
/* Force truncation to the maximum safe length */
Size = (MAXUSHORT & ~1) - sizeof(WCHAR);
}
/* Initialize the destination string fields */
Destination->Buffer = (PWCHAR)Source;
Destination->Length = (USHORT)Size;
Destination->MaximumLength = (USHORT)Size + sizeof(WCHAR);
/* Return success */
return STATUS_SUCCESS;
}