diff --git a/rostests/apitests/ntdll/CMakeLists.txt b/rostests/apitests/ntdll/CMakeLists.txt index 7e51573c5c6..4fa5026dd84 100644 --- a/rostests/apitests/ntdll/CMakeLists.txt +++ b/rostests/apitests/ntdll/CMakeLists.txt @@ -18,6 +18,7 @@ list(APPEND SOURCE RtlGetLongestNtPathLength.c RtlInitializeBitMap.c SystemInfo.c + Timer.c ZwContinue.c testlist.c) diff --git a/rostests/apitests/ntdll/Timer.c b/rostests/apitests/ntdll/Timer.c new file mode 100644 index 00000000000..1bda9d0a7ee --- /dev/null +++ b/rostests/apitests/ntdll/Timer.c @@ -0,0 +1,66 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Test for NtQueryTimerResolution and NtSetTimerResolution. + * PROGRAMMER: Aleksandar Andrejevic + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +#include + +START_TEST(TimerResolution) +{ + NTSTATUS Status; + ULONG CurrentResolution; + ULONG MinimumResolution; + ULONG MaximumResolution; + ULONG CurrentResolution2; + + /* Get the current timer resolution */ + Status = NtSetTimerResolution(0, /* Ignored */ + FALSE, /* Don't change resolution */ + &CurrentResolution); + + /* + * When not setting the resolution, it always + * returns STATUS_TIMER_RESOLUTION_NOT_SET + */ + ok_hex(Status, STATUS_TIMER_RESOLUTION_NOT_SET); + + /* + * Get the timer resolution limits and current timer resolution + * using a different method + */ + Status = NtQueryTimerResolution(&MinimumResolution, + &MaximumResolution, + &CurrentResolution2); + + /* This function should always return STATUS_SUCCESS */ + ok_hex(Status, STATUS_SUCCESS); + + /* These two values should be the same */ + ok_hex(CurrentResolution, CurrentResolution2); + + /* + * Even if you give it invalid values, + * NtSetTimerResolution will return STATUS_SUCCESS, + * but it will not change the resolution. + */ + Status = NtSetTimerResolution(MinimumResolution - 1, + TRUE, + &CurrentResolution); + ok_hex(Status, STATUS_SUCCESS); + printf("Current resolution: %d ; minimum resolution: %d\n", CurrentResolution, MinimumResolution); + ok(CurrentResolution >= MinimumResolution, "Current resolution: %d became too low! (minimum resolution: %d)\n", CurrentResolution, MinimumResolution); + + Status = NtSetTimerResolution(MaximumResolution + 1, + TRUE, + &CurrentResolution); + ok_hex(Status, STATUS_SUCCESS); + printf("Current resolution: %d ; maximum resolution: %d\n", CurrentResolution, MaximumResolution); + ok(CurrentResolution <= MaximumResolution, "Current resolution: %d became too high! (maximum resolution: %d)\n", CurrentResolution, MaximumResolution); +} diff --git a/rostests/apitests/ntdll/testlist.c b/rostests/apitests/ntdll/testlist.c index 56e15ab1b23..4279fdbcf30 100644 --- a/rostests/apitests/ntdll/testlist.c +++ b/rostests/apitests/ntdll/testlist.c @@ -22,6 +22,7 @@ extern void func_RtlGetFullPathName_UstrEx(void); extern void func_RtlGetLongestNtPathLength(void); extern void func_RtlInitializeBitMap(void); extern void func_ZwContinue(void); +extern void func_TimerResolution(void); const struct test winetest_testlist[] = { @@ -44,6 +45,7 @@ const struct test winetest_testlist[] = { "RtlGetLongestNtPathLength", func_RtlGetLongestNtPathLength }, { "RtlInitializeBitMap", func_RtlInitializeBitMap }, { "ZwContinue", func_ZwContinue }, + { "TimerResolution", func_TimerResolution }, { 0, 0 } };