From 491138291348dbc72f0be52cecb1459d0281d332 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Thu, 31 May 2018 17:48:29 +0200 Subject: [PATCH] [NDK] Replace the SYSTEMTIME fields StandardDate and DaylightDate in RTL_TIME_ZONE_INFORMATION by TIME_FIELDs and fix resulting errors Patch will be sent upstream. CORE-14658 --- dll/win32/kernel32/wine/timezone.c | 64 ++++++++++++++++++++++++++--- ntoskrnl/ex/sysinfo.c | 10 ++--- ntoskrnl/ex/time.c | 8 ++-- ntoskrnl/include/internal/ex.h | 4 +- sdk/include/ndk/rtltypes.h | 29 +++---------- sdk/include/reactos/wine/winternl.h | 32 ++++++++------- win32ss/user/ntuser/kbdlayout.c | 5 ++- 7 files changed, 96 insertions(+), 56 deletions(-) diff --git a/dll/win32/kernel32/wine/timezone.c b/dll/win32/kernel32/wine/timezone.c index 23c0c473025..8869848d491 100644 --- a/dll/win32/kernel32/wine/timezone.c +++ b/dll/win32/kernel32/wine/timezone.c @@ -261,13 +261,14 @@ DWORD WINAPI GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) { + RTL_TIME_ZONE_INFORMATION TimeZoneInformation; NTSTATUS Status; DPRINT("GetTimeZoneInformation()\n"); Status = NtQuerySystemInformation(SystemCurrentTimeZoneInformation, - lpTimeZoneInformation, - sizeof(TIME_ZONE_INFORMATION), + &TimeZoneInformation, + sizeof(RTL_TIME_ZONE_INFORMATION), NULL); if (!NT_SUCCESS(Status)) { @@ -275,6 +276,32 @@ GetTimeZoneInformation(LPTIME_ZONE_INFORMATION lpTimeZoneInformation) return TIME_ZONE_ID_INVALID; } + lpTimeZoneInformation->Bias = TimeZoneInformation.Bias; + + wcsncpy(lpTimeZoneInformation->StandardName, + TimeZoneInformation.StandardName, + ARRAYSIZE(lpTimeZoneInformation->StandardName)); + lpTimeZoneInformation->StandardDate.wYear = TimeZoneInformation.StandardDate.Year; + lpTimeZoneInformation->StandardDate.wMonth = TimeZoneInformation.StandardDate.Month; + lpTimeZoneInformation->StandardDate.wDay = TimeZoneInformation.StandardDate.Day; + lpTimeZoneInformation->StandardDate.wHour = TimeZoneInformation.StandardDate.Hour; + lpTimeZoneInformation->StandardDate.wMinute = TimeZoneInformation.StandardDate.Minute; + lpTimeZoneInformation->StandardDate.wSecond = TimeZoneInformation.StandardDate.Second; + lpTimeZoneInformation->StandardDate.wDayOfWeek = TimeZoneInformation.StandardDate.Weekday; + lpTimeZoneInformation->StandardBias = TimeZoneInformation.StandardBias; + + wcsncpy(lpTimeZoneInformation->DaylightName, + TimeZoneInformation.DaylightName, + ARRAYSIZE(lpTimeZoneInformation->DaylightName)); + lpTimeZoneInformation->DaylightDate.wYear = TimeZoneInformation.DaylightDate.Year; + lpTimeZoneInformation->DaylightDate.wMonth = TimeZoneInformation.DaylightDate.Month; + lpTimeZoneInformation->DaylightDate.wDay = TimeZoneInformation.DaylightDate.Day; + lpTimeZoneInformation->DaylightDate.wHour = TimeZoneInformation.DaylightDate.Hour; + lpTimeZoneInformation->DaylightDate.wMinute = TimeZoneInformation.DaylightDate.Minute; + lpTimeZoneInformation->DaylightDate.wSecond = TimeZoneInformation.DaylightDate.Second; + lpTimeZoneInformation->DaylightDate.wDayOfWeek = TimeZoneInformation.DaylightDate.Weekday; + lpTimeZoneInformation->DaylightBias = TimeZoneInformation.DaylightBias; + return TIME_ZoneID(lpTimeZoneInformation); } @@ -286,11 +313,38 @@ BOOL WINAPI SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation) { + RTL_TIME_ZONE_INFORMATION TimeZoneInformation; NTSTATUS Status; DPRINT("SetTimeZoneInformation()\n"); - Status = RtlSetTimeZoneInformation((LPTIME_ZONE_INFORMATION)lpTimeZoneInformation); + TimeZoneInformation.Bias = lpTimeZoneInformation->Bias; + + wcsncpy(TimeZoneInformation.StandardName, + lpTimeZoneInformation->StandardName, + ARRAYSIZE(TimeZoneInformation.StandardName)); + TimeZoneInformation.StandardDate.Year = lpTimeZoneInformation->StandardDate.wYear; + TimeZoneInformation.StandardDate.Month = lpTimeZoneInformation->StandardDate.wMonth; + TimeZoneInformation.StandardDate.Day = lpTimeZoneInformation->StandardDate.wDay; + TimeZoneInformation.StandardDate.Hour = lpTimeZoneInformation->StandardDate.wHour; + TimeZoneInformation.StandardDate.Minute = lpTimeZoneInformation->StandardDate.wMinute; + TimeZoneInformation.StandardDate.Second = lpTimeZoneInformation->StandardDate.wSecond; + TimeZoneInformation.StandardDate.Weekday = lpTimeZoneInformation->StandardDate.wDayOfWeek; + TimeZoneInformation.StandardBias = lpTimeZoneInformation->StandardBias; + + wcsncpy(TimeZoneInformation.DaylightName, + lpTimeZoneInformation->DaylightName, + ARRAYSIZE(TimeZoneInformation.DaylightName)); + TimeZoneInformation.DaylightDate.Year = lpTimeZoneInformation->DaylightDate.wYear; + TimeZoneInformation.DaylightDate.Month = lpTimeZoneInformation->DaylightDate.wMonth; + TimeZoneInformation.DaylightDate.Day = lpTimeZoneInformation->DaylightDate.wDay; + TimeZoneInformation.DaylightDate.Hour = lpTimeZoneInformation->DaylightDate.wHour; + TimeZoneInformation.DaylightDate.Minute = lpTimeZoneInformation->DaylightDate.wMinute; + TimeZoneInformation.DaylightDate.Second = lpTimeZoneInformation->DaylightDate.wSecond; + TimeZoneInformation.DaylightDate.Weekday = lpTimeZoneInformation->DaylightDate.wDayOfWeek; + TimeZoneInformation.DaylightBias = lpTimeZoneInformation->DaylightBias; + + Status = RtlSetTimeZoneInformation(&TimeZoneInformation); if (!NT_SUCCESS(Status)) { DPRINT1("RtlSetTimeZoneInformation() failed (Status %lx)\n", Status); @@ -299,8 +353,8 @@ SetTimeZoneInformation(CONST TIME_ZONE_INFORMATION *lpTimeZoneInformation) } Status = NtSetSystemInformation(SystemCurrentTimeZoneInformation, - (PVOID)lpTimeZoneInformation, - sizeof(TIME_ZONE_INFORMATION)); + (PVOID)&TimeZoneInformation, + sizeof(RTL_TIME_ZONE_INFORMATION)); if (!NT_SUCCESS(Status)) { DPRINT1("NtSetSystemInformation() failed (Status %lx)\n", Status); diff --git a/ntoskrnl/ex/sysinfo.c b/ntoskrnl/ex/sysinfo.c index ceb1d22842e..016ac5b1d9b 100644 --- a/ntoskrnl/ex/sysinfo.c +++ b/ntoskrnl/ex/sysinfo.c @@ -1939,9 +1939,9 @@ QSI_DEF(SystemLegacyDriverInformation) /* Class 44 - Current Time Zone Information */ QSI_DEF(SystemCurrentTimeZoneInformation) { - *ReqSize = sizeof(TIME_ZONE_INFORMATION); + *ReqSize = sizeof(RTL_TIME_ZONE_INFORMATION); - if (sizeof(TIME_ZONE_INFORMATION) != Size) + if (sizeof(RTL_TIME_ZONE_INFORMATION) != Size) { return STATUS_INFO_LENGTH_MISMATCH; } @@ -1949,7 +1949,7 @@ QSI_DEF(SystemCurrentTimeZoneInformation) /* Copy the time zone information struct */ memcpy(Buffer, &ExpTimeZoneInfo, - sizeof(TIME_ZONE_INFORMATION)); + sizeof(RTL_TIME_ZONE_INFORMATION)); return STATUS_SUCCESS; } @@ -1958,12 +1958,12 @@ QSI_DEF(SystemCurrentTimeZoneInformation) SSI_DEF(SystemCurrentTimeZoneInformation) { /* Check user buffer's size */ - if (Size < sizeof(TIME_ZONE_INFORMATION)) + if (Size < sizeof(RTL_TIME_ZONE_INFORMATION)) { return STATUS_INFO_LENGTH_MISMATCH; } - return ExpSetTimeZoneInformation((PTIME_ZONE_INFORMATION)Buffer); + return ExpSetTimeZoneInformation((PRTL_TIME_ZONE_INFORMATION)Buffer); } static diff --git a/ntoskrnl/ex/time.c b/ntoskrnl/ex/time.c index a9ae21c1cec..44ce39d9ad9 100644 --- a/ntoskrnl/ex/time.c +++ b/ntoskrnl/ex/time.c @@ -18,7 +18,7 @@ /* GLOBALS ******************************************************************/ /* Note: Bias[minutes] = UTC - local time */ -TIME_ZONE_INFORMATION ExpTimeZoneInfo; +RTL_TIME_ZONE_INFORMATION ExpTimeZoneInfo; ULONG ExpLastTimeZoneBias = -1; LARGE_INTEGER ExpTimeZoneBias; ULONG ExpAltTimeZoneBias; @@ -233,7 +233,7 @@ ExRefreshTimeZoneInformation(IN PLARGE_INTEGER CurrentBootTime) if (!NT_SUCCESS(Status)) { /* Failed, clear all data */ - RtlZeroMemory(&ExpTimeZoneInfo, sizeof(TIME_ZONE_INFORMATION)); + RtlZeroMemory(&ExpTimeZoneInfo, sizeof(RTL_TIME_ZONE_INFORMATION)); ExpTimeZoneBias.QuadPart = (LONGLONG)0; ExpTimeZoneId = TIME_ZONE_ID_UNKNOWN; } @@ -275,7 +275,7 @@ ExRefreshTimeZoneInformation(IN PLARGE_INTEGER CurrentBootTime) } NTSTATUS -ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) +ExpSetTimeZoneInformation(PRTL_TIME_ZONE_INFORMATION TimeZoneInformation) { LARGE_INTEGER LocalTime, SystemTime, OldTime; TIME_FIELDS TimeFields; @@ -303,7 +303,7 @@ ExpSetTimeZoneInformation(PTIME_ZONE_INFORMATION TimeZoneInformation) /* Copy the timezone information */ RtlCopyMemory(&ExpTimeZoneInfo, TimeZoneInformation, - sizeof(TIME_ZONE_INFORMATION)); + sizeof(RTL_TIME_ZONE_INFORMATION)); /* Set the new time zone information */ SharedUserData->TimeZoneBias.High1Time = ExpTimeZoneBias.u.HighPart; diff --git a/ntoskrnl/include/internal/ex.h b/ntoskrnl/include/internal/ex.h index 091b90783d7..740bb965645 100644 --- a/ntoskrnl/include/internal/ex.h +++ b/ntoskrnl/include/internal/ex.h @@ -2,7 +2,7 @@ /* GLOBAL VARIABLES *********************************************************/ -extern TIME_ZONE_INFORMATION ExpTimeZoneInfo; +extern RTL_TIME_ZONE_INFORMATION ExpTimeZoneInfo; extern LARGE_INTEGER ExpTimeZoneBias; extern ULONG ExpTimeZoneId; extern ULONG ExpTickCountMultiplier; @@ -1417,7 +1417,7 @@ ExTryToAcquireResourceExclusiveLite( NTSTATUS ExpSetTimeZoneInformation( - IN PTIME_ZONE_INFORMATION TimeZoneInformation + IN PRTL_TIME_ZONE_INFORMATION TimeZoneInformation ); BOOLEAN diff --git a/sdk/include/ndk/rtltypes.h b/sdk/include/ndk/rtltypes.h index 1371f4c86fe..b526f9ea04f 100644 --- a/sdk/include/ndk/rtltypes.h +++ b/sdk/include/ndk/rtltypes.h @@ -1662,38 +1662,19 @@ typedef struct _RTL_ATOM_TABLE PRTL_ATOM_TABLE_ENTRY Buckets[1]; } RTL_ATOM_TABLE, *PRTL_ATOM_TABLE; -#ifndef _WINBASE_ // -// System Time and Timezone Structures +// Timezone Information // -typedef struct _SYSTEMTIME -{ - USHORT wYear; - USHORT wMonth; - USHORT wDayOfWeek; - USHORT wDay; - USHORT wHour; - USHORT wMinute; - USHORT wSecond; - USHORT wMilliseconds; -} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME; - -typedef struct _TIME_ZONE_INFORMATION +typedef struct _RTL_TIME_ZONE_INFORMATION { LONG Bias; WCHAR StandardName[32]; - SYSTEMTIME StandardDate; + TIME_FIELDS StandardDate; LONG StandardBias; WCHAR DaylightName[32]; - SYSTEMTIME DaylightDate; + TIME_FIELDS DaylightDate; LONG DaylightBias; -} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION; -#endif /* !_WINBASE_ */ - -// -// Native version of Timezone Structure -// -typedef LPTIME_ZONE_INFORMATION PRTL_TIME_ZONE_INFORMATION; +} RTL_TIME_ZONE_INFORMATION, *PRTL_TIME_ZONE_INFORMATION; // // Hotpatch Header diff --git a/sdk/include/reactos/wine/winternl.h b/sdk/include/reactos/wine/winternl.h index 999f544edb2..edd79e5a6f6 100644 --- a/sdk/include/reactos/wine/winternl.h +++ b/sdk/include/reactos/wine/winternl.h @@ -102,6 +102,7 @@ typedef struct _FILETIME } FILETIME, *PFILETIME, *LPFILETIME; #endif /* _FILETIME_ */ +#if 0 /* * RTL_SYSTEM_TIME and RTL_TIME_ZONE_INFORMATION are the same as * the SYSTEMTIME and TIME_ZONE_INFORMATION structures defined @@ -120,14 +121,26 @@ typedef struct _RTL_SYSTEM_TIME { WORD wSecond; WORD wMilliseconds; } RTL_SYSTEM_TIME, *PRTL_SYSTEM_TIME; +#endif + +typedef struct _TIME_FIELDS { + CSHORT Year; + CSHORT Month; + CSHORT Day; + CSHORT Hour; + CSHORT Minute; + CSHORT Second; + CSHORT Milliseconds; + CSHORT Weekday; +} TIME_FIELDS, *PTIME_FIELDS; typedef struct _RTL_TIME_ZONE_INFORMATION { LONG Bias; WCHAR StandardName[32]; - RTL_SYSTEM_TIME StandardDate; + TIME_FIELDS StandardDate; LONG StandardBias; WCHAR DaylightName[32]; - RTL_SYSTEM_TIME DaylightDate; + TIME_FIELDS DaylightDate; LONG DaylightBias; } RTL_TIME_ZONE_INFORMATION, *PRTL_TIME_ZONE_INFORMATION; @@ -135,10 +148,10 @@ typedef struct _RTL_TIME_DYNAMIC_ZONE_INFORMATION { LONG Bias; WCHAR StandardName[32]; - RTL_SYSTEM_TIME StandardDate; + TIME_FIELDS StandardDate; LONG StandardBias; WCHAR DaylightName[32]; - RTL_SYSTEM_TIME DaylightDate; + TIME_FIELDS DaylightDate; LONG DaylightBias; WCHAR TimeZoneKeyName[128]; BOOLEAN DynamicDaylightTimeDisabled; @@ -1647,17 +1660,6 @@ typedef struct _SYSTEM_TIME_ADJUSTMENT { BOOLEAN TimeAdjustmentDisabled; } SYSTEM_TIME_ADJUSTMENT, *PSYSTEM_TIME_ADJUSTMENT; -typedef struct _TIME_FIELDS -{ CSHORT Year; - CSHORT Month; - CSHORT Day; - CSHORT Hour; - CSHORT Minute; - CSHORT Second; - CSHORT Milliseconds; - CSHORT Weekday; -} TIME_FIELDS, *PTIME_FIELDS; - typedef struct _WINSTATIONINFORMATIONW { BYTE Reserved2[70]; ULONG LogonId; diff --git a/win32ss/user/ntuser/kbdlayout.c b/win32ss/user/ntuser/kbdlayout.c index cd57492d99f..f47ece5cbad 100644 --- a/win32ss/user/ntuser/kbdlayout.c +++ b/win32ss/user/ntuser/kbdlayout.c @@ -10,7 +10,10 @@ #include -#include +// Was included only because of CP_ACP and required the +// definition of SYSTEMTIME in ndk\rtltypes.h +//#include +#define CP_ACP 0 DBG_DEFAULT_CHANNEL(UserKbdLayout); -- 2.17.1