[SDK:RTL] Add RtlInitUnicodeString() and RtlGUIDFromString()
This commit is contained in:
parent
0998d5c417
commit
ceb86e3cb2
@ -17,6 +17,7 @@ Abstract:
|
|||||||
#define _NTRTL_H
|
#define _NTRTL_H
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ntdef.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Memory operations.
|
// Memory operations.
|
||||||
@ -26,4 +27,18 @@ Abstract:
|
|||||||
#define RtlFillMemory(Destination, Length, Fill) memset((Destination), (Fill), (Length))
|
#define RtlFillMemory(Destination, Length, Fill) memset((Destination), (Fill), (Length))
|
||||||
#define RtlZeroMemory(Destination, Length) memset((Destination), 0, (Length))
|
#define RtlZeroMemory(Destination, Length) memset((Destination), 0, (Length))
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlInitUnicodeString (
|
||||||
|
OUT PUNICODE_STRING Destination,
|
||||||
|
IN PCWSTR Source
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlGUIDFromString (
|
||||||
|
IN PUNICODE_STRING String,
|
||||||
|
OUT GUID *Guid
|
||||||
|
);
|
||||||
|
|
||||||
#endif /* !_NTRTL_H */
|
#endif /* !_NTRTL_H */
|
||||||
|
174
SDK/RTL/guid.c
Normal file
174
SDK/RTL/guid.c
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2024, Quinn Stephens.
|
||||||
|
Provided under the BSD 3-Clause license.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
guid.c
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Provides RTL GUID routines.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#include <ntrtl.h>
|
||||||
|
#include <ntstatus.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
ScanHexFormat (
|
||||||
|
IN PCWSTR Buffer,
|
||||||
|
IN ULONG MaximumLength,
|
||||||
|
IN PCWSTR Format,
|
||||||
|
...
|
||||||
|
)
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
Turns a text representation of a GUID into the binary format.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
String - A GUID string in the format {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
|
||||||
|
|
||||||
|
Guid - The GUID structure which is to recieve the data.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
|
||||||
|
Number of parameters scanned if successful.
|
||||||
|
-1 if scanning fails.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
{
|
||||||
|
va_list Args;
|
||||||
|
int FormatCount = 0;
|
||||||
|
int Width, Long;
|
||||||
|
ULONG Number;
|
||||||
|
PVOID Dest;
|
||||||
|
|
||||||
|
va_start(Args, Format);
|
||||||
|
while (*Format != '\0') {
|
||||||
|
//
|
||||||
|
// Ignore some characters.
|
||||||
|
//
|
||||||
|
if (*Format != '%' || *(Format + 1) == '%') {
|
||||||
|
if (!MaximumLength || *Buffer != *Format) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer++;
|
||||||
|
MaximumLength--;
|
||||||
|
Format++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Find format kind.
|
||||||
|
//
|
||||||
|
Format++;
|
||||||
|
Width = 0;
|
||||||
|
Long = 0;
|
||||||
|
while (*Format != 'X' && *Format != 'x') {
|
||||||
|
if (*Format >= '0' && *Format <= '9') {
|
||||||
|
Width = Width * 10 + *Format - '0';
|
||||||
|
} else if (*Format == 'l') {
|
||||||
|
Long++;
|
||||||
|
}
|
||||||
|
Format++;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Calculate number value.
|
||||||
|
//
|
||||||
|
Format++;
|
||||||
|
Number = 0;
|
||||||
|
while (Width--) {
|
||||||
|
if (!MaximumLength) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*Buffer >= '0' && *Buffer <= '9') {
|
||||||
|
Number += *Buffer - '0';
|
||||||
|
} else if (*Buffer >= 'a' && *Buffer <= 'f') {
|
||||||
|
Number += *Buffer - 'a' + 0xa;
|
||||||
|
} else if (*Buffer >= 'A' && *Buffer <= 'F') {
|
||||||
|
Number += *Buffer - 'A' + 0xA;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer++;
|
||||||
|
MaximumLength--;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Store number in destination.
|
||||||
|
//
|
||||||
|
Dest = va_arg(Args, PVOID);
|
||||||
|
if (Long) {
|
||||||
|
*(PULONG)Dest = Number;
|
||||||
|
} else {
|
||||||
|
*(PUSHORT)Dest = (USHORT)Number;
|
||||||
|
}
|
||||||
|
|
||||||
|
FormatCount++;
|
||||||
|
}
|
||||||
|
va_end(Args);
|
||||||
|
|
||||||
|
return (MaximumLength && *Buffer) ? -1:FormatCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
RtlGUIDFromString (
|
||||||
|
IN PUNICODE_STRING String,
|
||||||
|
OUT GUID *Guid
|
||||||
|
)
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
Turns a text representation of a GUID into the binary format.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
String - A GUID string in the format {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}.
|
||||||
|
|
||||||
|
Guid - The GUID structure which is to recieve the data.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
|
||||||
|
STATUS_SUCCESS if successful.
|
||||||
|
STATUS_INVALID_PARAMETER if the string is invalid.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
{
|
||||||
|
USHORT Data4[8];
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert string to GUID data.
|
||||||
|
//
|
||||||
|
if (ScanHexFormat(
|
||||||
|
String->Buffer, String->Length / sizeof(WCHAR),
|
||||||
|
L"{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
||||||
|
&Guid->Data1, &Guid->Data2, &Guid->Data3, &Data4[0], &Data4[1], &Data4[2], &Data4[3], &Data4[4], &Data4[5], &Data4[6], &Data4[7]
|
||||||
|
) == -1) {
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Convert USHORTs to UCHARs.
|
||||||
|
//
|
||||||
|
for (int Index = 0; Index < 8; Index++) {
|
||||||
|
Guid->Data4[Index] = (UCHAR)Data4[Index];
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
63
SDK/RTL/string.c
Normal file
63
SDK/RTL/string.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*++
|
||||||
|
|
||||||
|
Copyright (c) 2024, Quinn Stephens.
|
||||||
|
Provided under the BSD 3-Clause license.
|
||||||
|
|
||||||
|
Module Name:
|
||||||
|
|
||||||
|
string.c
|
||||||
|
|
||||||
|
Abstract:
|
||||||
|
|
||||||
|
Provides RTL string routines.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
#include <ntrtl.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
RtlInitUnicodeString (
|
||||||
|
OUT PUNICODE_STRING Destination,
|
||||||
|
IN PCWSTR Source
|
||||||
|
)
|
||||||
|
|
||||||
|
/*++
|
||||||
|
|
||||||
|
Routine Description:
|
||||||
|
|
||||||
|
Initializes a unicode string structure with an existing string,
|
||||||
|
which may be NULL to initialize an empty unicode string structure.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
Destination - A pointer to the unicode string structure.
|
||||||
|
|
||||||
|
Source - Optionally, a pointer to a null-terminated string to initialize
|
||||||
|
the unicode string structure with.
|
||||||
|
|
||||||
|
Return Value:
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
--*/
|
||||||
|
|
||||||
|
{
|
||||||
|
ULONG Length;
|
||||||
|
|
||||||
|
Destination->Buffer = (PWSTR)Source;
|
||||||
|
if (Source == NULL) {
|
||||||
|
Destination->Length = 0;
|
||||||
|
Destination->MaximumLength = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Length = wcslen(Source) * sizeof(WCHAR);
|
||||||
|
if (Length >= MAX_USTRING) {
|
||||||
|
Length = MAX_USTRING - sizeof(UNICODE_NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
Destination->Length = (USHORT)Length;
|
||||||
|
Destination->MaximumLength = (USHORT)(Length + sizeof(UNICODE_NULL));
|
||||||
|
}
|
12
premake5.lua
12
premake5.lua
@ -31,11 +31,21 @@ project("CRT")
|
|||||||
targetname("crt")
|
targetname("crt")
|
||||||
files({ "SDK/INC/CRT/**.h", "SDK/CRT/**.c" })
|
files({ "SDK/INC/CRT/**.h", "SDK/CRT/**.c" })
|
||||||
|
|
||||||
|
project("RTL")
|
||||||
|
kind("StaticLib")
|
||||||
|
location("SDK/RTL")
|
||||||
|
|
||||||
|
includedirs({ "SDK/INC/CRT", "SDK/INC/NT" })
|
||||||
|
objdir("BUILD/SDK/RTL")
|
||||||
|
targetdir("BUILD/SDK")
|
||||||
|
targetname("rtl")
|
||||||
|
files({ "SDK/INC/NT/ntrtl.h", "SDK/RTL/**.c" })
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
project("BOOT")
|
project("BOOT")
|
||||||
kind("ConsoleApp")
|
kind("ConsoleApp")
|
||||||
|
|
||||||
includedirs({ "BOOT/ENVIRON/INC", "SDK/INC/CRT" })
|
includedirs({ "BOOT/ENVIRON/INC", "SDK/INC" })
|
||||||
objdir("BUILD/BOOT")
|
objdir("BUILD/BOOT")
|
||||||
targetdir("BUILD/BOOT")
|
targetdir("BUILD/BOOT")
|
||||||
files({ "BOOT/ENVIRON/INC/**.h", "BOOT/ENVIRON/**.c" })
|
files({ "BOOT/ENVIRON/INC/**.h", "BOOT/ENVIRON/**.c" })
|
||||||
|
Loading…
Reference in New Issue
Block a user