diff --git a/modules/rostests/winetests/ntdll/env.c b/modules/rostests/winetests/ntdll/env.c index d58a71d1391..a489ae9c883 100644 --- a/modules/rostests/winetests/ntdll/env.c +++ b/modules/rostests/winetests/ntdll/env.c @@ -432,6 +432,11 @@ static void test_process_params(void) ok( params->Flags == 0, "wrong Flags %lu\n", params->Flags ); ok( params->DebugFlags == 0, "wrong Flags %lu\n", params->DebugFlags ); ok( params->ConsoleHandle == 0, "wrong ConsoleHandle %p\n", params->ConsoleHandle ); +#ifdef __REACTOS__ + if (GetEnvironmentVariableW(L"ROSAUTOTEST_DIR", NULL, 0)) + ok( params->ConsoleFlags == 1, "wrong ConsoleFlags %lu\n", params->ConsoleFlags ); + else +#endif ok( params->ConsoleFlags == 0, "wrong ConsoleFlags %lu\n", params->ConsoleFlags ); ok( params->hStdInput == 0, "wrong hStdInput %p\n", params->hStdInput ); ok( params->hStdOutput == 0, "wrong hStdOutput %p\n", params->hStdOutput ); diff --git a/modules/rostests/winetests/ntdll/exception.c b/modules/rostests/winetests/ntdll/exception.c index c856022ee0b..75fb1239bfb 100644 --- a/modules/rostests/winetests/ntdll/exception.c +++ b/modules/rostests/winetests/ntdll/exception.c @@ -4575,6 +4575,12 @@ static void test_wow64_context(void) ctx.ContextFlags = WOW64_CONTEXT_ALL | CONTEXT_EXCEPTION_REQUEST; ret = pRtlWow64GetThreadContext( pi.hThread, &ctx ); ok(ret == STATUS_SUCCESS, "got %#lx\n", ret); +#ifdef __REACTOS__ + if (GetNTVersion() <= _WIN32_WINNT_WIN7) + ok( ctx.ContextFlags == (WOW64_CONTEXT_ALL | CONTEXT_EXCEPTION_REQUEST), + "got context flags %#lx\n", ctx.ContextFlags ); + else +#endif ok( (ctx.ContextFlags & CONTEXT_EXCEPTION_REPORTING) || broken( ctx.ContextFlags == WOW64_CONTEXT_ALL ) /*Win 7*/, "got context flags %#lx\n", ctx.ContextFlags ); @@ -4805,7 +4811,9 @@ static LONG WINAPI dbg_except_continue_vectored_handler(struct _EXCEPTION_POINTE if (rec->ExceptionCode == 0xceadbeef) { +#ifndef __REACTOS__ // Broken on Windows Vista and Windows 10 ok(context->P1Home == (ULONG64)0xdeadbeeffeedcafe, "Got unexpected context->P1Home %#Ix.\n", context->P1Home); +#endif context->R12 = test_kiuserexceptiondispatcher_saved_r12; return EXCEPTION_CONTINUE_EXECUTION; } @@ -4838,6 +4846,14 @@ static void * WINAPI hook_KiUserExceptionDispatcher(EXCEPTION_RECORD *rec, CONTE "Got unexpected ExceptionCode %#lx.\n", rec->ExceptionCode); ok( !((ULONG_PTR)context & 15), "unaligned context %p\n", context ); +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_WIN8) + { + win_skip("No extended context support.\n"); + } + else + { +#endif ok( xctx->All.Offset == -sizeof(CONTEXT), "wrong All.Offset %lx\n", xctx->All.Offset ); ok( xctx->All.Length >= sizeof(CONTEXT) + offsetof(CONTEXT_EX, align), "wrong All.Length %lx\n", xctx->All.Length ); ok( xctx->Legacy.Offset == -sizeof(CONTEXT), "wrong Legacy.Offset %lx\n", xctx->All.Offset ); @@ -4845,6 +4861,9 @@ static void * WINAPI hook_KiUserExceptionDispatcher(EXCEPTION_RECORD *rec, CONTE ok( (void *)(xctx + 1) == (void *)rec, "wrong ptrs %p / %p\n", xctx, rec ); ok( frame->rip == context->Rip, "wrong rip %Ix / %Ix\n", frame->rip, context->Rip ); ok( frame->rsp == context->Rsp, "wrong rsp %Ix / %Ix\n", frame->rsp, context->Rsp ); +#ifdef __REACTOS__ + } +#endif hook_KiUserExceptionDispatcher_rip = (void *)context->Rip; hook_exception_address = rec->ExceptionAddress; @@ -5111,7 +5130,9 @@ static void * WINAPI hook_KiUserApcDispatcher(CONTEXT *context) context, context->Rip, context->Rsp, (char *)context->Rsp - (char *)context, context->ContextFlags ); +#ifndef __REACTOS__ // Broken on Windows Vista and Windows 10 ok( context->P1Home == 0x1234, "wrong p1 %#Ix\n", context->P1Home ); +#endif ok( context->P2Home == 0x5678, "wrong p2 %#Ix\n", context->P2Home ); ok( context->P3Home == 0xdeadbeef, "wrong p3 %#Ix\n", context->P3Home ); ok( context->P4Home == (ULONG_PTR)apc_func, "wrong p4 %#Ix / %p\n", context->P4Home, apc_func ); @@ -11877,17 +11898,27 @@ static void test_context_exception_request(void) } #endif - expected_flags = CONTEXT_CONTROL | CONTEXT_EXCEPTION_REQUEST | CONTEXT_EXCEPTION_REPORTING; + expected_flags = CONTEXT_CONTROL | CONTEXT_EXCEPTION_REQUEST | CONTEXT_EXCEPTION_REPORTING; // 0xC0010001 c.ContextFlags = CONTEXT_CONTROL | CONTEXT_EXCEPTION_REQUEST; ret = GetThreadContext( thread, &c ); ok( ret, "got error %lu.\n", GetLastError() ); +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_VISTA) + ok( c.ContextFlags == (expected_flags & ~CONTEXT_EXCEPTION_REPORTING), "got %#lx.\n", c.ContextFlags ); + else +#endif ok( c.ContextFlags == expected_flags, "got %#lx.\n", c.ContextFlags ); c.ContextFlags = CONTEXT_CONTROL | CONTEXT_EXCEPTION_REQUEST | CONTEXT_EXCEPTION_REPORTING | CONTEXT_SERVICE_ACTIVE | CONTEXT_EXCEPTION_ACTIVE; ret = GetThreadContext( thread, &c ); ok( ret, "got error %lu.\n", GetLastError() ); +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_VISTA) + ok( c.ContextFlags == (expected_flags | CONTEXT_SERVICE_ACTIVE | CONTEXT_EXCEPTION_ACTIVE), "got %#lx, expected %#lx.\n", c.ContextFlags, expected_flags ); + else +#endif ok( c.ContextFlags == expected_flags, "got %#lx.\n", c.ContextFlags ); WriteRelease( &p.sync, 6 ); diff --git a/modules/rostests/winetests/ntdll/info.c b/modules/rostests/winetests/ntdll/info.c index b17b13c81c3..bf3b6cceaaf 100644 --- a/modules/rostests/winetests/ntdll/info.c +++ b/modules/rostests/winetests/ntdll/info.c @@ -1610,6 +1610,14 @@ static void test_query_firmware(void) sfti->Action = SystemFirmwareTable_Get; status = pNtQuerySystemInformation(SystemFirmwareTableInformation, sfti, min_sfti_len, &len1); +#ifdef __REACTOS__ + if (status == STATUS_INVALID_DEVICE_REQUEST) + { + win_skip("SystemFirmwareTableInformation not available\n"); + HeapFree(GetProcessHeap(), 0, sfti); + return; + } +#endif ok(status == STATUS_BUFFER_TOO_SMALL, "Expected STATUS_BUFFER_TOO_SMALL, got %08lx\n", status); ok(len1 >= min_sfti_len, "Expected length >= %lu, got %lu\n", min_sfti_len, len1); ok(sfti->TableBufferLength == len1 - min_sfti_len, @@ -2452,6 +2460,11 @@ static void test_query_process_image_info(void) broken( !info.MajorOperatingSystemVersion ), /* <= win8 */ "wrong major OS version %x/%x\n", info.MajorOperatingSystemVersion, nt->OptionalHeader.MajorOperatingSystemVersion ); +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_WIN7) + ok( info.MinorOperatingSystemVersion == 0, "wrong minor version %x/%x\n", info.MinorOperatingSystemVersion, 0 ); + else +#endif ok( info.MinorOperatingSystemVersion == nt->OptionalHeader.MinorOperatingSystemVersion, "wrong minor OS version %x/%x\n", info.MinorOperatingSystemVersion, nt->OptionalHeader.MinorOperatingSystemVersion ); @@ -3596,10 +3609,18 @@ static void test_thread_ideal_processor(void) ok(status == STATUS_INVALID_INFO_CLASS, "Unexpected status %#lx.\n", status); status = pNtQueryInformationThread( GetCurrentThread(), ThreadIdealProcessorEx, &processor, sizeof(processor) + 1, &len ); +#ifdef __REACTOS__ + ok(status == (GetNTVersion() >= _WIN32_WINNT_WIN7 ? STATUS_INFO_LENGTH_MISMATCH : STATUS_INVALID_INFO_CLASS), "Unexpected status %#lx.\n", status); +#else ok(status == STATUS_INFO_LENGTH_MISMATCH, "Unexpected status %#lx.\n", status); +#endif status = pNtQueryInformationThread( GetCurrentThread(), ThreadIdealProcessorEx, &processor, sizeof(processor), &len ); +#ifdef __REACTOS__ + ok(status == (GetNTVersion() >= _WIN32_WINNT_WIN7 ? STATUS_SUCCESS : STATUS_INVALID_INFO_CLASS), "Unexpected status %#lx.\n", status); +#else ok(status == STATUS_SUCCESS, "Unexpected status %#lx.\n", status); +#endif } static void test_thread_info(void) @@ -3913,6 +3934,11 @@ static void test_process_token(int argc, char **argv) ret = DuplicateTokenEx( token, TOKEN_ALL_ACCESS, NULL, SecurityAnonymous, TokenImpersonation, &token_info.Token ); ok( ret, "got error %lu\n", GetLastError() ); status = pNtSetInformationProcess( pi.hProcess, ProcessAccessToken, &token_info, sizeof(token_info) ); +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_WIN7) + todo_wine ok( status == STATUS_BAD_TOKEN_TYPE, "got %#lx\n", status ); + else +#endif todo_wine ok( status == STATUS_BAD_IMPERSONATION_LEVEL, "got %#lx\n", status ); CloseHandle( token_info.Token ); diff --git a/modules/rostests/winetests/ntdll/om.c b/modules/rostests/winetests/ntdll/om.c index 4aa6419cca5..760a63ab42d 100644 --- a/modules/rostests/winetests/ntdll/om.c +++ b/modules/rostests/winetests/ntdll/om.c @@ -666,9 +666,9 @@ static void test_name_limits(void) ok( status == STATUS_SUCCESS, "%u: NtCreateMutant failed %lx\n", str.Length, status ); attr3.RootDirectory = ret; status = pNtOpenMutant( &ret2, GENERIC_ALL, &attr ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenMutant failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenMutant failed %lx\n", str.Length, status); status = pNtOpenMutant( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenMutant failed %lx\n", str.Length, status ); + ok( status == (__REACTOS__WinVer_lt(_WIN32_WINNT_WIN7) ? STATUS_INVALID_HANDLE : STATUS_OBJECT_TYPE_MISMATCH), "%u: NtOpenMutant failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateSemaphore( &ret, GENERIC_ALL, &attr2, 1, 2 ); ok( status == STATUS_SUCCESS, "%u: NtCreateSemaphore failed %lx\n", str.Length, status ); @@ -676,7 +676,7 @@ static void test_name_limits(void) status = pNtOpenSemaphore( &ret2, GENERIC_ALL, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenSemaphore failed %lx\n", str.Length, status ); status = pNtOpenSemaphore( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenSemaphore failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenSemaphore failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateEvent( &ret, GENERIC_ALL, &attr2, SynchronizationEvent, 0 ); ok( status == STATUS_SUCCESS, "%u: NtCreateEvent failed %lx\n", str.Length, status ); @@ -684,7 +684,7 @@ static void test_name_limits(void) status = pNtOpenEvent( &ret2, GENERIC_ALL, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenEvent failed %lx\n", str.Length, status ); status = pNtOpenEvent( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenEvent failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenEvent failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateKeyedEvent( &ret, GENERIC_ALL, &attr2, 0 ); ok( status == STATUS_SUCCESS, "%u: NtCreateKeyedEvent failed %lx\n", str.Length, status ); @@ -692,7 +692,7 @@ static void test_name_limits(void) status = pNtOpenKeyedEvent( &ret2, GENERIC_ALL, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenKeyedEvent failed %lx\n", str.Length, status ); status = pNtOpenKeyedEvent( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenKeyedEvent failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenKeyedEvent failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateTimer( &ret, GENERIC_ALL, &attr2, NotificationTimer ); ok( status == STATUS_SUCCESS, "%u: NtCreateTimer failed %lx\n", str.Length, status ); @@ -700,7 +700,7 @@ static void test_name_limits(void) status = pNtOpenTimer( &ret2, GENERIC_ALL, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenTimer failed %lx\n", str.Length, status ); status = pNtOpenTimer( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenTimer failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenTimer failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateIoCompletion( &ret, GENERIC_ALL, &attr2, 0 ); ok( status == STATUS_SUCCESS, "%u: NtCreateCompletion failed %lx\n", str.Length, status ); @@ -708,7 +708,7 @@ static void test_name_limits(void) status = pNtOpenIoCompletion( &ret2, GENERIC_ALL, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenCompletion failed %lx\n", str.Length, status ); status = pNtOpenIoCompletion( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenCompletion failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenCompletion failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateJobObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_SUCCESS, "%u: NtCreateJobObject failed %lx\n", str.Length, status ); @@ -716,7 +716,7 @@ static void test_name_limits(void) status = pNtOpenJobObject( &ret2, GENERIC_ALL, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenJobObject failed %lx\n", str.Length, status ); status = pNtOpenJobObject( &ret2, GENERIC_ALL, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenJobObject failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenJobObject failed %lx\n", str.Length, status ); pNtClose( ret ); status = pNtCreateDirectoryObject( &ret, GENERIC_ALL, &attr2 ); ok( status == STATUS_SUCCESS, "%u: NtCreateDirectoryObject failed %lx\n", str.Length, status ); @@ -743,7 +743,7 @@ static void test_name_limits(void) status = pNtOpenSection( &ret2, SECTION_MAP_WRITE, &attr ); ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenSection failed %lx\n", str.Length, status ); status = pNtOpenSection( &ret2, SECTION_MAP_WRITE, &attr3 ); - ok( status == STATUS_OBJECT_TYPE_MISMATCH, "%u: NtOpenSection failed %lx\n", str.Length, status ); + ok( status == STATUS_OBJECT_TYPE_MISMATCH || /* __REACTOS__ */ broken(status == STATUS_INVALID_HANDLE), "%u: NtOpenSection failed %lx\n", str.Length, status ); pNtClose( ret ); str.Length = 67; @@ -2334,17 +2334,34 @@ static void test_object_types(void) TYPE( L"File", FILE, 0, 0 ), TYPE( L"IoCompletion", IO_COMPLETION, 0, 0 ), TYPE( L"IoCompletionReserve", IO_COMPLETION_RESERVE, 0, 0 ), +#ifdef __REACTOS__ TYPE( L"Job", JOB_OBJECT, 0, JOB_OBJECT_IMPERSONATE ), + TYPE( L"Key", KEY, SYNCHRONIZE, KEY_CREATE_LINK ), +#else + TYPE( L"Job", JOB_OBJECT, 0, JOB_OBJECT_IMPERSONATE | 0x3C0 ), TYPE( L"Key", KEY, SYNCHRONIZE, 0 ), +#endif TYPE( L"KeyedEvent", KEYEDEVENT, SYNCHRONIZE, 0 ), TYPE( L"Mutant", MUTANT, 0, 0 ), +#ifdef __REACTOS__ + TYPE( L"Process", PROCESS, 0, PROCESS_TERMINATE ), +#else TYPE( L"Process", PROCESS, 0, 0 ), +#endif TYPE( L"Section", SECTION, SYNCHRONIZE, 0 ), TYPE( L"Semaphore", SEMAPHORE, 0, 0 ), TYPE( L"SymbolicLink", SYMBOLIC_LINK, 0, 0xfffe ), +#ifdef __REACTOS__ + TYPE( L"Thread", THREAD, 0, THREAD_RESUME | THREAD_QUERY_LIMITED_INFORMATION ), +#else TYPE( L"Thread", THREAD, 0, THREAD_RESUME ), +#endif TYPE( L"Timer", TIMER, 0, 0 ), +#ifdef __REACTOS__ + TYPE( L"Token", TOKEN, SYNCHRONIZE, TOKEN_QUERY_SOURCE | TOKEN_IMPERSONATE | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY), +#else TYPE( L"Token", TOKEN, SYNCHRONIZE, 0 ), +#endif TYPE( L"Type", TYPE, SYNCHRONIZE, 0 ), TYPE( L"UserApcReserve", USER_APC_RESERVE, 0, 0 ), TYPE( L"WindowStation", WINSTA, 0, 0 ), @@ -2384,6 +2401,17 @@ static void test_object_types(void) for (i = 0; i < ARRAY_SIZE(tests); i++) { +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_WIN7) + { + if (!wcscmp(tests[i].name, L"IoCompletionReserve") || + !wcscmp(tests[i].name, L"UserApcReserve")) + { + skip("%s not implemented before Win7\n", tests[i].name); + break; + } + } +#endif for (j = 0; j < ARRAY_SIZE(all_types); j++) { if (!all_types[j].TypeName.Buffer) continue; diff --git a/modules/rostests/winetests/ntdll/sync.c b/modules/rostests/winetests/ntdll/sync.c index c8bede86f40..90ef0ad896c 100644 --- a/modules/rostests/winetests/ntdll/sync.c +++ b/modules/rostests/winetests/ntdll/sync.c @@ -981,9 +981,9 @@ static void test_completion_port_scheduling(void) BOOL bret; #if defined(__REACTOS__) - if (is_reactos()) + if ((GetNTVersion() < _WIN32_WINNT_WIN7) || is_reactos()) { - skip("Skipping completion port scheduling test, because it hangs on ReactOS\n"); + skip("Skipping completion port scheduling test, because it hangs on Windows 2003, Vista and ReactOS\n"); return; } #endif diff --git a/modules/rostests/winetests/ntdll/time.c b/modules/rostests/winetests/ntdll/time.c index f2ea90ab4ed..444c3080a0c 100644 --- a/modules/rostests/winetests/ntdll/time.c +++ b/modules/rostests/winetests/ntdll/time.c @@ -225,7 +225,7 @@ static void test_RtlQueryPerformanceCounter(void) #define CHECK_CURRENT_TIMER(expected) \ do { \ ok(status == STATUS_SUCCESS, "NtSetTimerResolution failed %lx\n", status); \ - ok(cur2 == (expected) || broken(abs((int)((expected) - cur2)) <= TIMER_LEEWAY), "expected new timer resolution %lu, got %lu\n", (expected), cur2); \ + ok(cur2 == (expected) || broken(abs((int)((expected) - cur2)) <= TIMER_LEEWAY) || /* __REACTOS__ */ broken(GetNTVersion() < _WIN32_WINNT_WIN7), "expected new timer resolution %lu, got %lu\n", (expected), cur2); \ set = cur2; \ min2 = min + 20000; \ cur2 = min2 + 1; \ diff --git a/modules/rostests/winetests/ntdll/virtual.c b/modules/rostests/winetests/ntdll/virtual.c index f74c078b420..6e1e32685aa 100644 --- a/modules/rostests/winetests/ntdll/virtual.c +++ b/modules/rostests/winetests/ntdll/virtual.c @@ -1634,6 +1634,11 @@ static void test_NtMapViewOfSection(void) ok(status == STATUS_SUCCESS || status == STATUS_IMAGE_NOT_AT_BASE, "NtMapViewOfSection returned %08lx\n", status); ok(!((ULONG_PTR)ptr & 0xffff), "returned memory %p is not aligned to 64k\n", ptr); +#ifdef __REACTOS__ + if (GetNTVersion() < _WIN32_WINNT_WIN7 && !is_reactos()) + win_skip("Skipping test on pre-Win7, because it's broken\n"); + else +#endif ok(((UINT_PTR)ptr & ~get_zero_bits_mask(zero_bits)) == 0, "NtMapViewOfSection returned address %p\n", ptr); status = NtUnmapViewOfSection(process, ptr); diff --git a/sdk/include/wine/test.h b/sdk/include/wine/test.h index 621f798e168..cf00a9832a6 100644 --- a/sdk/include/wine/test.h +++ b/sdk/include/wine/test.h @@ -1016,6 +1016,7 @@ extern void winetest_end_nocount(void); #define GetMajorNTVersion() (*(ULONG*)(KUSER_SHARED_DATA_UMPTR + 0x026C)) #define GetMinorNTVersion() (*(ULONG*)(KUSER_SHARED_DATA_UMPTR + 0x0270)) #define GetNTVersion() ((GetMajorNTVersion() << 8) | GetMinorNTVersion()) +#define __REACTOS__WinVer_lt(Ver) ((GetNTVersion() < (Ver))) #ifdef STANDALONE