From: Paul Gofman pgofman@codeweavers.com
--- dlls/msvcp140_atomic_wait/main.c | 33 +++++++++++++++++++ .../msvcp140_atomic_wait.spec | 4 +-- .../tests/msvcp140_atomic_wait.c | 20 ++++++++++- 3 files changed, 54 insertions(+), 3 deletions(-)
diff --git a/dlls/msvcp140_atomic_wait/main.c b/dlls/msvcp140_atomic_wait/main.c index b79241571cc..76d83d03e7f 100644 --- a/dlls/msvcp140_atomic_wait/main.c +++ b/dlls/msvcp140_atomic_wait/main.c @@ -197,6 +197,12 @@ struct tzdb_time_zones char **links; };
+struct tzdb_current_zone +{ + ULONG_PTR unk; + char *name; +}; + struct tzdb_time_zones * __stdcall __std_tzdb_get_time_zones(void) { DYNAMIC_TIME_ZONE_INFORMATION tzd; @@ -240,3 +246,30 @@ void __stdcall __std_tzdb_delete_time_zones(struct tzdb_time_zones *z) } free(z); } + +struct tzdb_current_zone * __stdcall __std_tzdb_get_current_zone(void) +{ + DYNAMIC_TIME_ZONE_INFORMATION tzd; + struct tzdb_current_zone *c; + unsigned int i; + + FIXME("returning Windows time zone name.\n"); + + if (GetDynamicTimeZoneInformation(&tzd) == TIME_ZONE_ID_INVALID) + return NULL; + + c = calloc(1, sizeof(*c)); + c->name = malloc(wcslen(tzd.StandardName) + 1); + i = 0; + while ((c->name[i] = tzd.StandardName[i])) + ++i; + return c; +} + +void __stdcall __std_tzdb_delete_current_zone(struct tzdb_current_zone *c) +{ + TRACE("(%p)\n", c); + + free(c->name); + free(c); +} diff --git a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec index 9cad0f9d0fb..164e562baa8 100644 --- a/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec +++ b/dlls/msvcp140_atomic_wait/msvcp140_atomic_wait.spec @@ -21,11 +21,11 @@ @ stdcall __std_parallel_algorithms_hw_threads() @ stdcall __std_release_shared_mutex_for_instance(ptr) @ stdcall __std_submit_threadpool_work(ptr) -@ stub __std_tzdb_delete_current_zone +@ stdcall __std_tzdb_delete_current_zone(ptr) @ stub __std_tzdb_delete_leap_seconds @ stub __std_tzdb_delete_sys_info @ stdcall __std_tzdb_delete_time_zones(ptr) -@ stub __std_tzdb_get_current_zone +@ stdcall __std_tzdb_get_current_zone() @ stub __std_tzdb_get_leap_seconds @ stub __std_tzdb_get_sys_info @ stdcall __std_tzdb_get_time_zones() diff --git a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c index 6c0f0eafec4..70615e78843 100644 --- a/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c +++ b/dlls/msvcp140_atomic_wait/tests/msvcp140_atomic_wait.c @@ -37,6 +37,12 @@ struct tzdb_time_zones char **links; };
+struct tzdb_current_zone +{ + ULONG_PTR unk; + char *name; +}; + static unsigned int (__stdcall *p___std_parallel_algorithms_hw_threads)(void);
static void (__stdcall *p___std_bulk_submit_threadpool_work)(PTP_WORK, size_t); @@ -52,6 +58,8 @@ static shared_mutex* (__stdcall *p___std_acquire_shared_mutex_for_instance)(void static void (__stdcall *p___std_release_shared_mutex_for_instance)(void*); static struct tzdb_time_zones * (__stdcall *p___std_tzdb_get_time_zones)(void); static void (__stdcall *p___std_tzdb_delete_time_zones)(struct tzdb_time_zones *); +static struct tzdb_current_zone * (__stdcall *p___std_tzdb_get_current_zone)(void); +static void (__stdcall *p___std_tzdb_delete_current_zone)(struct tzdb_current_zone *);
#define SETNOFAIL(x,y) x = (void*)GetProcAddress(msvcp,y) #define SET(x,y) do { SETNOFAIL(x,y); ok(x != NULL, "Export '%s' not found\n", y); } while(0) @@ -77,6 +85,8 @@ static HMODULE init(void) SET(p___std_release_shared_mutex_for_instance, "__std_release_shared_mutex_for_instance"); SET(p___std_tzdb_get_time_zones, "__std_tzdb_get_time_zones"); SET(p___std_tzdb_delete_time_zones, "__std_tzdb_delete_time_zones"); + SET(p___std_tzdb_get_current_zone, "__std_tzdb_get_current_zone"); + SET(p___std_tzdb_delete_current_zone, "__std_tzdb_delete_current_zone"); return msvcp; }
@@ -340,6 +350,7 @@ static void test___std_acquire_shared_mutex_for_instance(void)
static void test___std_tzdb(void) { + struct tzdb_current_zone *c; struct tzdb_time_zones *z; unsigned int i;
@@ -363,11 +374,18 @@ static void test___std_tzdb(void) *(volatile char *)z->ver |= 0;
trace("ver %s.\n", debugstr_a(z->ver)); + c = p___std_tzdb_get_current_zone(); + ok(!!c, "got NULL.\n"); + ok(!!c->name, "got NULL.\n"); + ok(!c->unk, "got %#Ix.\n", c->unk); for (i = 0; i < z->count; ++i) { - ok(!!z->names[i], "got NULL.\n"); + if (!strcmp(c->name, z->names[i])) + break; } + ok(i < z->count, "current zone %s not found.\n", c->name);
+ p___std_tzdb_delete_current_zone(c); p___std_tzdb_delete_time_zones(z); }