1 /* 2 * PROJECT: ReactOS API tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for NtQueryTimerResolution and NtSetTimerResolution. 5 * PROGRAMMER: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org> 6 */ 7 8 #include <apitest.h> 9 10 #define WIN32_NO_STATUS 11 #include <ndk/ketypes.h> 12 #include <ndk/kefuncs.h> 13 14 #include <stdio.h> 15 16 START_TEST(TimerResolution) 17 { 18 NTSTATUS Status; 19 ULONG CurrentResolution; 20 ULONG MinimumResolution; 21 ULONG MaximumResolution; 22 ULONG CurrentResolution2; 23 24 /* Get the current timer resolution */ 25 Status = NtSetTimerResolution(0, /* Ignored */ 26 FALSE, /* Don't change resolution */ 27 &CurrentResolution); 28 29 /* 30 * If the timer resolution hasn't been changed for this process, 31 * it returns STATUS_TIMER_RESOLUTION_NOT_SET 32 */ 33 ok_hex(Status, STATUS_TIMER_RESOLUTION_NOT_SET); 34 35 /* 36 * Get the timer resolution limits and current timer resolution 37 * using a different method 38 */ 39 Status = NtQueryTimerResolution(&MinimumResolution, 40 &MaximumResolution, 41 &CurrentResolution2); 42 43 /* This function should always return STATUS_SUCCESS */ 44 ok_hex(Status, STATUS_SUCCESS); 45 46 /* The MinimumResolution should be higher than the MaximumResolution */ 47 ok(MinimumResolution >= MaximumResolution, "MaximumResolution higher than MinimumResolution!\n"); 48 49 /* These two values should be the same */ 50 ok_hex(CurrentResolution, CurrentResolution2); 51 52 /* 53 * Even if you give it invalid values, 54 * NtSetTimerResolution will return STATUS_SUCCESS, 55 * but it will not change the resolution. 56 */ 57 Status = NtSetTimerResolution(MinimumResolution + 1, 58 TRUE, 59 &CurrentResolution); 60 ok_hex(Status, STATUS_SUCCESS); 61 printf("Current resolution: %lu ; minimum resolution: %lu\n", CurrentResolution, MinimumResolution); 62 ok(CurrentResolution <= MinimumResolution, "Current resolution: %lu became too high! (minimum resolution: %lu)\n", CurrentResolution, MinimumResolution); 63 64 Status = NtSetTimerResolution(MaximumResolution - 1, 65 TRUE, 66 &CurrentResolution); 67 ok_hex(Status, STATUS_SUCCESS); 68 printf("Current resolution: %lu ; maximum resolution: %lu\n", CurrentResolution, MaximumResolution); 69 ok(CurrentResolution >= MaximumResolution, "Current resolution: %lu became too low! (maximum resolution: %lu)\n", CurrentResolution, MaximumResolution); 70 71 /* Get the current timer resolution */ 72 Status = NtSetTimerResolution(0, /* Ignored */ 73 FALSE, /* Don't change resolution */ 74 &CurrentResolution); 75 76 /* Since we have changed the resolution earlier, it returns STATUS_SUCCESS. */ 77 ok_hex(Status, STATUS_SUCCESS); 78 79 /* Get the current timer resolution again */ 80 Status = NtSetTimerResolution(0, /* Ignored */ 81 FALSE, /* Don't change resolution */ 82 &CurrentResolution); 83 84 /* The resolution is not changed now, so it should return STATUS_TIMER_RESOLUTION_NOT_SET */ 85 ok_hex(Status, STATUS_TIMER_RESOLUTION_NOT_SET); 86 } 87