diff --git a/rostests/kmtests/include/kmt_platform.h b/rostests/kmtests/include/kmt_platform.h index f8f2e4a1d32..8cb2fe5bd0b 100644 --- a/rostests/kmtests/include/kmt_platform.h +++ b/rostests/kmtests/include/kmt_platform.h @@ -56,6 +56,7 @@ typedef ULONG LOGICAL, *PLOGICAL; #define RtlCopyMemoryNonTemporal RtlCopyMemory #define RtlPrefetchMemoryNonTemporal(s, l) #define ExRaiseStatus RtlRaiseStatus +#define KmtIsCheckedBuild FALSE #endif /* defined KMT_EMULATE_KERNEL */ #endif /* defined KMT_USER_MODE */ diff --git a/rostests/kmtests/kmtest_drv/testlist.c b/rostests/kmtests/kmtest_drv/testlist.c index e8b0dc725ea..2fb2f0078e4 100644 --- a/rostests/kmtests/kmtest_drv/testlist.c +++ b/rostests/kmtests/kmtest_drv/testlist.c @@ -59,6 +59,7 @@ KMT_TESTFUNC Test_RtlIntSafe; KMT_TESTFUNC Test_RtlMemory; KMT_TESTFUNC Test_RtlRegistry; KMT_TESTFUNC Test_RtlSplayTree; +KMT_TESTFUNC Test_RtlUnicodeString; KMT_TESTFUNC Test_ZwAllocateVirtualMemory; KMT_TESTFUNC Test_ZwCreateSection; KMT_TESTFUNC Test_ZwMapViewOfSection; @@ -117,6 +118,7 @@ const KMT_TEST TestList[] = { "RtlMemoryKM", Test_RtlMemory }, { "RtlRegistryKM", Test_RtlRegistry }, { "RtlSplayTreeKM", Test_RtlSplayTree }, + { "RtlUnicodeStringKM", Test_RtlUnicodeString }, { "ZwAllocateVirtualMemory", Test_ZwAllocateVirtualMemory }, { "ZwCreateSection", Test_ZwCreateSection }, { "ZwMapViewOfSection", Test_ZwMapViewOfSection }, diff --git a/rostests/kmtests/ntos_fsrtl/FsRtlExpression.c b/rostests/kmtests/ntos_fsrtl/FsRtlExpression.c index eb45b7b0475..48d09d3357e 100644 --- a/rostests/kmtests/ntos_fsrtl/FsRtlExpression.c +++ b/rostests/kmtests/ntos_fsrtl/FsRtlExpression.c @@ -184,10 +184,6 @@ static VOID FsRtlIsNameInExpressionTest() UNICODE_STRING Expression; UNICODE_STRING Name; - /* Don't run Tests which are known to assert in checked builds */ - if (KmtIsCheckedBuild && Tests[i].AssertsInChecked) - continue; - RtlInitUnicodeString(&Expression, Tests[i].Expression); RtlInitUnicodeString(&Name, Tests[i].Name); diff --git a/rostests/kmtests/rtl/RtlUnicodeString.c b/rostests/kmtests/rtl/RtlUnicodeString.c index d17d08f4cff..0c4a9db8913 100644 --- a/rostests/kmtests/rtl/RtlUnicodeString.c +++ b/rostests/kmtests/rtl/RtlUnicodeString.c @@ -87,7 +87,7 @@ TestFindCharInUnicodeString(VOID) Status = RtlFindCharInUnicodeString(7, &String, &Chars4, &Position); ok_eq_hex(Status, STATUS_SUCCESS); ok_eq_uint(Position, 22); - + /* Show that Position is USHORT */ LongPosition = 0x55555555; Status = RtlFindCharInUnicodeString(8, &String, &String, (PUSHORT)&LongPosition); @@ -116,7 +116,7 @@ TestFindCharInUnicodeString(VOID) Status = RtlFindCharInUnicodeString(0, NULL, &String, &Position); KmtEndSeh(STATUS_ACCESS_VIOLATION); ok_eq_uint(Position, 0); - + /* NULL for SearchString and invalid flags */ Position = 123; KmtStartSeh() @@ -150,7 +150,7 @@ TestFindCharInUnicodeString(VOID) KmtEndSeh(STATUS_ACCESS_VIOLATION); ok_eq_uint(Position, 0); #endif - + /* NULL for MatchString and invalid flags */ Position = 123; KmtStartSeh() @@ -173,7 +173,87 @@ TestFindCharInUnicodeString(VOID) #endif } +static +VOID +TestUpcaseUnicodeString(VOID) +{ + NTSTATUS Status; + UNICODE_STRING Lower; + UNICODE_STRING Upper; + PWCHAR Buffer; + + Buffer = KmtAllocateGuarded(sizeof(WCHAR)); + + if (!KmtIsCheckedBuild) + { + RtlInitEmptyUnicodeString(&Lower, NULL, 0); + RtlFillMemory(&Upper, sizeof(Upper), 0x55); + Status = RtlUpcaseUnicodeString(&Upper, &Lower, TRUE); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_uint(Upper.Length, 0); + ok_eq_uint(Upper.MaximumLength, 0); + ok(Upper.Buffer != NULL, "Buffer = %p\n", Upper.Buffer); + RtlFreeUnicodeString(&Upper); + + RtlInitEmptyUnicodeString(&Lower, Buffer, 0); + RtlFillMemory(&Upper, sizeof(Upper), 0x55); + Status = RtlUpcaseUnicodeString(&Upper, &Lower, TRUE); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_uint(Upper.Length, 0); + ok_eq_uint(Upper.MaximumLength, 0); + ok(Upper.Buffer != NULL, "Buffer = %p\n", Upper.Buffer); + RtlFreeUnicodeString(&Upper); + + RtlInitEmptyUnicodeString(&Lower, Buffer, sizeof(WCHAR)); + Buffer[0] = UNICODE_NULL; + RtlFillMemory(&Upper, sizeof(Upper), 0x55); + Status = RtlUpcaseUnicodeString(&Upper, &Lower, TRUE); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_uint(Upper.Length, 0); + ok_eq_uint(Upper.MaximumLength, 0); + ok(Upper.Buffer != NULL, "Buffer = %p\n", Upper.Buffer); + RtlFreeUnicodeString(&Upper); + } + + RtlInitEmptyUnicodeString(&Lower, Buffer, sizeof(WCHAR)); + Lower.Length = sizeof(WCHAR); + Buffer[0] = UNICODE_NULL; + RtlFillMemory(&Upper, sizeof(Upper), 0x55); + Status = RtlUpcaseUnicodeString(&Upper, &Lower, TRUE); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_uint(Upper.Length, sizeof(WCHAR)); + ok_eq_uint(Upper.MaximumLength, sizeof(WCHAR)); + ok(Upper.Buffer != NULL, "Buffer = %p\n", Upper.Buffer); + ok_eq_hex(Upper.Buffer[0], UNICODE_NULL); + RtlFreeUnicodeString(&Upper); + + RtlInitEmptyUnicodeString(&Lower, Buffer, sizeof(WCHAR)); + Lower.Length = sizeof(WCHAR); + Buffer[0] = 'a'; + RtlFillMemory(&Upper, sizeof(Upper), 0x55); + Status = RtlUpcaseUnicodeString(&Upper, &Lower, TRUE); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_uint(Upper.Length, sizeof(WCHAR)); + ok_eq_uint(Upper.MaximumLength, sizeof(WCHAR)); + ok(Upper.Buffer != NULL, "Buffer = %p\n", Upper.Buffer); + ok_eq_hex(Upper.Buffer[0], 'A'); + RtlFreeUnicodeString(&Upper); + + RtlInitUnicodeString(&Lower, L"a"); + RtlFillMemory(&Upper, sizeof(Upper), 0x55); + Status = RtlUpcaseUnicodeString(&Upper, &Lower, TRUE); + ok_eq_hex(Status, STATUS_SUCCESS); + ok_eq_uint(Upper.Length, sizeof(WCHAR)); + ok_eq_uint(Upper.MaximumLength, sizeof(WCHAR)); + ok(Upper.Buffer != NULL, "Buffer = %p\n", Upper.Buffer); + ok_eq_hex(Upper.Buffer[0], 'A'); + RtlFreeUnicodeString(&Upper); + + KmtFreeGuarded(Buffer); +} + START_TEST(RtlUnicodeString) { TestFindCharInUnicodeString(); + TestUpcaseUnicodeString(); }