Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
May 2020
- 79 participants
- 626 discussions
[PATCH] api-ms-win-crt-private-l1-1-0: Implement _o__fileno, _o__setmode, _o__wfopen, _o_fclose, _o_fflush
by Emilio Cobos Álvarez 18 May '20
by Emilio Cobos Álvarez 18 May '20
18 May '20
By delegating to the ucrtbase implementation.
This allows me to get a Firefox build cross-compiled as described in [1], but with newer MSVC
versions.
[1]: https://glandium.org/blog/?p=4020
Signed-off-by: Emilio Cobos Álvarez <emilio(a)crisal.io>
---
.../api-ms-win-crt-private-l1-1-0.spec | 10 +++++-----
dlls/ucrtbase/ucrtbase.spec | 10 +++++-----
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index 01f295f25f..e185c7900d 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -270,7 +270,7 @@
@ stub _o__fgetwchar
@ stub _o__filelength
@ stub _o__filelengthi64
-@ stub _o__fileno
+@ cdecl _o__fileno(ptr) ucrtbase._o__fileno
@ stub _o__findclose
@ stub _o__findfirst32
@ stub _o__findfirst32i64
@@ -673,7 +673,7 @@
@ stub _o__set_thread_local_invalid_parameter_handler
@ stub _o__seterrormode
@ stub _o__setmbcp
-@ stub _o__setmode
+@ cdecl _o__setmode(long long) ucrtbase._o__setmode
@ stub _o__setsystime
@ stub _o__sleep
@ stub _o__sopen
@@ -832,7 +832,7 @@
@ stub _o__wfindnext32i64
@ stub _o__wfindnext64
@ stub _o__wfindnext64i32
-@ stub _o__wfopen
+@ cdecl _o__wfopen(wstr wstr) ucrtbase._o__wfopen
@ stub _o__wfopen_s
@ stub _o__wfreopen
@ stub _o__wfreopen_s
@@ -943,10 +943,10 @@
@ stub _o_exp2l
@ stub _o_expf
@ stub _o_fabs
-@ stub _o_fclose
+@ cdecl _o_fclose(ptr) ucrtbase._o_fclose
@ stub _o_feof
@ stub _o_ferror
-@ stub _o_fflush
+@ cdecl _o_fflush(ptr) ucrtbase._o_fflush
@ stub _o_fgetc
@ stub _o_fgetpos
@ stub _o_fgets
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 1c039d0715..aac19b3ac6 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -934,7 +934,7 @@
@ stub _o__fgetwchar
@ stub _o__filelength
@ stub _o__filelengthi64
-@ stub _o__fileno
+@ cdecl _o__fileno(ptr) MSVCRT__fileno
@ stub _o__findclose
@ stub _o__findfirst32
@ stub _o__findfirst32i64
@@ -1337,7 +1337,7 @@
@ stub _o__set_thread_local_invalid_parameter_handler
@ stub _o__seterrormode
@ stub _o__setmbcp
-@ stub _o__setmode
+@ cdecl _o__setmode(long long) MSVCRT__setmode
@ stub _o__setsystime
@ stub _o__sleep
@ stub _o__sopen
@@ -1496,7 +1496,7 @@
@ stub _o__wfindnext32i64
@ stub _o__wfindnext64
@ stub _o__wfindnext64i32
-@ stub _o__wfopen
+@ cdecl _o__wfopen(wstr wstr) MSVCRT__wfopen
@ stub _o__wfopen_s
@ stub _o__wfreopen
@ stub _o__wfreopen_s
@@ -1607,10 +1607,10 @@
@ stub _o_exp2l
@ stub _o_expf
@ stub _o_fabs
-@ stub _o_fclose
+@ cdecl _o_fclose(ptr) MSVCRT_fclose
@ stub _o_feof
@ stub _o_ferror
-@ stub _o_fflush
+@ cdecl _o_fflush(ptr) MSVCRT_fflush
@ stub _o_fgetc
@ stub _o_fgetpos
@ stub _o_fgets
--
2.26.2
4
7
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49146
Signed-off-by: Gijs Vermeulen <gijsvrm(a)gmail.com>
---
.../api-ms-win-crt-private-l1-1-0.spec | 502 ++++++++---------
dlls/ucrtbase/ucrtbase.spec | 504 +++++++++---------
2 files changed, 503 insertions(+), 503 deletions(-)
diff --git a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
index 01f295f25f..8d6ff5e89f 100644
--- a/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
+++ b/dlls/api-ms-win-crt-private-l1-1-0/api-ms-win-crt-private-l1-1-0.spec
@@ -892,288 +892,288 @@
@ stub _o__y0
@ stub _o__y1
@ stub _o__yn
-@ stub _o_abort
-@ stub _o_acos
-@ stub _o_acosf
-@ stub _o_acosh
-@ stub _o_acoshf
-@ stub _o_acoshl
-@ stub _o_asctime
-@ stub _o_asctime_s
-@ stub _o_asin
-@ stub _o_asinf
-@ stub _o_asinh
-@ stub _o_asinhf
-@ stub _o_asinhl
-@ stub _o_atan
-@ stub _o_atan2
-@ stub _o_atan2f
-@ stub _o_atanf
-@ stub _o_atanh
-@ stub _o_atanhf
-@ stub _o_atanhl
+@ cdecl _o_abort() ucrtbase._o_abort
+@ cdecl _o_acos(double) ucrtbase._o_acos
+@ cdecl -arch=!i386 _o_acosf(float) ucrtbase._o_acosf
+@ cdecl _o_acosh(double) ucrtbase._o_acosh
+@ cdecl _o_acoshf(float) ucrtbase._o_acoshf
+@ cdecl _o_acoshl(double) ucrtbase._o_acoshl
+@ cdecl _o_asctime(ptr) ucrtbase._o_asctime
+@ cdecl _o_asctime_s(ptr long ptr) ucrtbase._o_asctime_s
+@ cdecl _o_asin(double) ucrtbase._o_asin
+@ cdecl -arch=!i386 _o_asinf(float) ucrtbase._o_asinf
+@ cdecl _o_asinh(double) ucrtbase._o_asinh
+@ cdecl _o_asinhf(float) ucrtbase._o_asinhf
+@ cdecl _o_asinhl(double) ucrtbase._o_asinhl
+@ cdecl _o_atan(double) ucrtbase._o_atan
+@ cdecl _o_atan2(double double) ucrtbase._o_atan2
+@ cdecl -arch=!i386 _o_atan2f(float float) ucrtbase._o_atan2f
+@ cdecl -arch=!i386 _o_atanf(float) ucrtbase._o_atanf
+@ cdecl _o_atanh(double) ucrtbase._o_atanh
+@ cdecl _o_atanhf(float) ucrtbase._o_atanhf
+@ cdecl _o_atanhl(double) ucrtbase._o_atanhl
@ cdecl _o_atof(str) ucrtbase._o_atof
@ cdecl _o_atoi(str) ucrtbase._o_atoi
-@ stub _o_atol
-@ stub _o_atoll
-@ stub _o_bsearch
-@ stub _o_bsearch_s
-@ stub _o_btowc
+@ cdecl _o_atol(str) ucrtbase._o_atol
+@ cdecl -ret64 _o_atoll(str) ucrtbase._o_atoll
+@ cdecl _o_bsearch(ptr ptr long long ptr) ucrtbase._o_bsearch
+@ cdecl _o_bsearch_s(ptr ptr long long ptr ptr) ucrtbase._o_bsearch_s
+@ cdecl _o_btowc(long) ucrtbase._o_btowc
@ cdecl _o_calloc(long long) ucrtbase._o_calloc
-@ stub _o_cbrt
-@ stub _o_cbrtf
+@ cdecl _o_cbrt(double) ucrtbase._o_cbrt
+@ cdecl _o_cbrtf(float) ucrtbase._o_cbrtf
@ cdecl _o_ceil(double) ucrtbase._o_ceil
-@ stub _o_ceilf
-@ stub _o_clearerr
-@ stub _o_clearerr_s
-@ stub _o_cos
-@ stub _o_cosf
-@ stub _o_cosh
-@ stub _o_coshf
-@ stub _o_erf
-@ stub _o_erfc
-@ stub _o_erfcf
-@ stub _o_erfcl
-@ stub _o_erff
-@ stub _o_erfl
+@ cdecl -arch=!i386 _o_ceilf(float) ucrtbase._o_ceilf
+@ cdecl _o_clearerr(ptr) ucrtbase._o_clearerr
+@ cdecl _o_clearerr_s(ptr) ucrtbase._o_clearerr_s
+@ cdecl _o_cos(double) ucrtbase._o_cos
+@ cdecl -arch=!i386 _o_cosf(float) ucrtbase._o_cosf
+@ cdecl _o_cosh(double) ucrtbase._o_cosh
+@ cdecl -arch=!i386 _o_coshf(float) ucrtbase._o_coshf
+@ cdecl _o_erf(double) ucrtbase._o_erf
+@ cdecl _o_erfc(double) ucrtbase._o_erfc
+@ cdecl _o_erfcf(float) ucrtbase._o_erfcf
+@ cdecl _o_erfcl(double) ucrtbase._o_erfcl
+@ cdecl _o_erff(float) ucrtbase._o_erff
+@ cdecl _o_erfl(double) ucrtbase._o_erfl
@ cdecl _o_exit(long) ucrtbase._o_exit
-@ stub _o_exp
-@ stub _o_exp2
-@ stub _o_exp2f
-@ stub _o_exp2l
-@ stub _o_expf
-@ stub _o_fabs
-@ stub _o_fclose
-@ stub _o_feof
-@ stub _o_ferror
-@ stub _o_fflush
-@ stub _o_fgetc
-@ stub _o_fgetpos
-@ stub _o_fgets
-@ stub _o_fgetwc
-@ stub _o_fgetws
+@ cdecl _o_exp(double) ucrtbase._o_exp
+@ cdecl _o_exp2(double) ucrtbase._o_exp2
+@ cdecl _o_exp2f(float) ucrtbase._o_exp2f
+@ cdecl _o_exp2l(double) ucrtbase._o_exp2l
+@ cdecl -arch=!i386 _o_expf(float) ucrtbase._o_expf
+@ cdecl _o_fabs(double) ucrtbase._o_fabs
+@ cdecl _o_fclose(ptr) ucrtbase._o_fclose
+@ cdecl _o_feof(ptr) ucrtbase._o_feof
+@ cdecl _o_ferror(ptr) ucrtbase._o_ferror
+@ cdecl _o_fflush(ptr) ucrtbase._o_fflush
+@ cdecl _o_fgetc(ptr) ucrtbase._o_fgetc
+@ cdecl _o_fgetpos(ptr ptr) ucrtbase._o_fgetpos
+@ cdecl _o_fgets(ptr long ptr) ucrtbase._o_fgets
+@ cdecl _o_fgetwc(ptr) ucrtbase._o_fgetwc
+@ cdecl _o_fgetws(ptr long ptr) ucrtbase._o_fgetws
@ cdecl _o_floor(double) ucrtbase._o_floor
-@ stub _o_floorf
-@ stub _o_fma
-@ stub _o_fmaf
-@ stub _o_fmal
+@ cdecl -arch=!i386 _o_floorf(float) ucrtbase._o_floorf
+@ cdecl _o_fma(double double double) ucrtbase._o_fma
+@ cdecl _o_fmaf(float float float) ucrtbase._o_fmaf
+@ cdecl _o_fmal(double double double) ucrtbase._o_fmal
@ cdecl _o_fmod(double double) ucrtbase._o_fmod
@ cdecl -arch=!i386 _o_fmodf(float float) ucrtbase._o_fmodf
-@ stub _o_fopen
-@ stub _o_fopen_s
-@ stub _o_fputc
-@ stub _o_fputs
-@ stub _o_fputwc
-@ stub _o_fputws
-@ stub _o_fread
-@ stub _o_fread_s
+@ cdecl _o_fopen(str str) ucrtbase._o_fopen
+@ cdecl _o_fopen_s(ptr str str) ucrtbase._o_fopen_s
+@ cdecl _o_fputc(long ptr) ucrtbase._o_fputc
+@ cdecl _o_fputs(str ptr) ucrtbase._o_fputs
+@ cdecl _o_fputwc(long ptr) ucrtbase._o_fputwc
+@ cdecl _o_fputws(wstr ptr) ucrtbase._o_fputws
+@ cdecl _o_fread(ptr long long ptr) ucrtbase._o_fread
+@ cdecl _o_fread_s(ptr long long long ptr) ucrtbase._o_fread_s
@ cdecl _o_free(ptr) ucrtbase._o_free
-@ stub _o_freopen
-@ stub _o_freopen_s
-@ stub _o_frexp
-@ stub _o_fseek
-@ stub _o_fsetpos
-@ stub _o_ftell
-@ stub _o_fwrite
-@ stub _o_getc
-@ stub _o_getchar
+@ cdecl _o_freopen(str str ptr) ucrtbase._o_freopen
+@ cdecl _o_freopen_s(ptr str str ptr) ucrtbase._o_freopen_s
+@ cdecl _o_frexp(double ptr) ucrtbase._o_frexp
+@ cdecl _o_fseek(ptr long long) ucrtbase._o_fseek
+@ cdecl _o_fsetpos(ptr ptr) ucrtbase._o_fsetpos
+@ cdecl _o_ftell(ptr) ucrtbase._o_ftell
+@ cdecl _o_fwrite(ptr long long ptr) ucrtbase._o_fwrite
+@ cdecl _o_getc(ptr) ucrtbase._o_getc
+@ cdecl _o_getchar() ucrtbase._o_getchar
@ cdecl _o_getenv(str) ucrtbase._o_getenv
-@ stub _o_getenv_s
-@ stub _o_gets
-@ stub _o_gets_s
-@ stub _o_getwc
-@ stub _o_getwchar
-@ stub _o_hypot
-@ stub _o_is_wctype
+@ cdecl _o_getenv_s(ptr ptr long str) ucrtbase._o_getenv_s
+@ cdecl _o_gets(str) ucrtbase._o_gets
+@ cdecl _o_gets_s(ptr long) ucrtbase._o_gets_s
+@ cdecl _o_getwc(ptr) ucrtbase._o_getwc
+@ cdecl _o_getwchar() ucrtbase._o_getwchar
+@ cdecl _o_hypot(double double) ucrtbase._o_hypot
+@ cdecl _o_is_wctype(long long) ucrtbase._o_is_wctype
@ cdecl _o_isalnum(long) ucrtbase._o_isalnum
@ cdecl _o_isalpha(long) ucrtbase._o_isalpha
-@ stub _o_isblank
-@ stub _o_iscntrl
+@ cdecl _o_isblank(long) ucrtbase._o_isblank
+@ cdecl _o_iscntrl(long) ucrtbase._o_iscntrl
@ cdecl _o_isdigit(long) ucrtbase._o_isdigit
-@ stub _o_isgraph
-@ stub _o_isleadbyte
-@ stub _o_islower
+@ cdecl _o_isgraph(long) ucrtbase._o_isgraph
+@ cdecl _o_isleadbyte(long) ucrtbase._o_isleadbyte
+@ cdecl _o_islower(long) ucrtbase._o_islower
@ cdecl _o_isprint(long) ucrtbase._o_isprint
-@ stub _o_ispunct
-@ stub _o_isspace
-@ stub _o_isupper
-@ stub _o_iswalnum
-@ stub _o_iswalpha
-@ stub _o_iswascii
-@ stub _o_iswblank
-@ stub _o_iswcntrl
-@ stub _o_iswctype
-@ stub _o_iswdigit
-@ stub _o_iswgraph
-@ stub _o_iswlower
-@ stub _o_iswprint
-@ stub _o_iswpunct
-@ stub _o_iswspace
-@ stub _o_iswupper
-@ stub _o_iswxdigit
+@ cdecl _o_ispunct(long) ucrtbase._o_ispunct
+@ cdecl _o_isspace(long) ucrtbase._o_isspace
+@ cdecl _o_isupper(long) ucrtbase._o_isupper
+@ cdecl _o_iswalnum(long) ucrtbase._o_iswalnum
+@ cdecl _o_iswalpha(long) ucrtbase._o_iswalpha
+@ cdecl _o_iswascii(long) ucrtbase._o_iswascii
+@ cdecl _o_iswblank(long) ucrtbase._o_iswblank
+@ cdecl _o_iswcntrl(long) ucrtbase._o_iswcntrl
+@ cdecl _o_iswctype(long long) ucrtbase._o_iswctype
+@ cdecl _o_iswdigit(long) ucrtbase._o_iswdigit
+@ cdecl _o_iswgraph(long) ucrtbase._o_iswgraph
+@ cdecl _o_iswlower(long) ucrtbase._o_iswlower
+@ cdecl _o_iswprint(long) ucrtbase._o_iswprint
+@ cdecl _o_iswpunct(long) ucrtbase._o_iswpunct
+@ cdecl _o_iswspace(long) ucrtbase._o_iswspace
+@ cdecl _o_iswupper(long) ucrtbase._o_iswupper
+@ cdecl _o_iswxdigit(long) ucrtbase._o_iswxdigit
@ cdecl _o_isxdigit(long) ucrtbase._o_isxdigit
-@ stub _o_ldexp
-@ stub _o_lgamma
-@ stub _o_lgammaf
-@ stub _o_lgammal
-@ stub _o_llrint
-@ stub _o_llrintf
-@ stub _o_llrintl
-@ stub _o_llround
-@ stub _o_llroundf
-@ stub _o_llroundl
-@ stub _o_localeconv
+@ cdecl _o_ldexp(double long) ucrtbase._o_ldexp
+@ cdecl _o_lgamma(double) ucrtbase._o_lgamma
+@ cdecl _o_lgammaf(float) ucrtbase._o_lgammaf
+@ cdecl _o_lgammal(double) ucrtbase._o_lgammal
+@ cdecl -ret64 _o_llrint(double) ucrtbase._o_llrint
+@ cdecl -ret64 _o_llrintf(float) ucrtbase._o_llrintf
+@ cdecl -ret64 _o_llrintl(double) ucrtbase._o_llrintl
+@ cdecl -ret64 _o_llround(double) ucrtbase._o_llround
+@ cdecl -ret64 _o_llroundf(float) ucrtbase._o_llroundf
+@ cdecl -ret64 _o_llroundl(double) ucrtbase._o_llroundl
+@ cdecl _o_localeconv() ucrtbase._o_localeconv
@ cdecl _o_log(double) ucrtbase._o_log
-@ stub _o_log10
-@ stub _o_log10f
-@ stub _o_log1p
-@ stub _o_log1pf
-@ stub _o_log1pl
-@ stub _o_log2
-@ stub _o_log2f
-@ stub _o_log2l
-@ stub _o_logb
-@ stub _o_logbf
-@ stub _o_logbl
-@ stub _o_logf
-@ stub _o_lrint
-@ stub _o_lrintf
-@ stub _o_lrintl
-@ stub _o_lround
-@ stub _o_lroundf
-@ stub _o_lroundl
+@ cdecl _o_log10(double) ucrtbase._o_log10
+@ cdecl -arch=!i386 _o_log10f(float) ucrtbase._o_log10f
+@ cdecl _o_log1p(double) ucrtbase._o_log1p
+@ cdecl _o_log1pf(float) ucrtbase._o_log1pf
+@ cdecl _o_log1pl(double) ucrtbase._o_log1pl
+@ cdecl _o_log2(double) ucrtbase._o_log2
+@ cdecl _o_log2f(float) ucrtbase._o_log2f
+@ cdecl _o_log2l(double) ucrtbase._o_log2l
+@ cdecl _o_logb(double) ucrtbase._o_logb
+@ cdecl _o_logbf(float) ucrtbase._o_logbf
+@ cdecl _o_logbl(double) ucrtbase._o_logbl
+@ cdecl -arch=!i386 _o_logf(float) ucrtbase._o_logf
+@ cdecl _o_lrint(double) ucrtbase._o_lrint
+@ cdecl _o_lrintf(float) ucrtbase._o_lrintf
+@ cdecl _o_lrintl(double) ucrtbase._o_lrintl
+@ cdecl _o_lround(double) ucrtbase._o_lround
+@ cdecl _o_lroundf(float) ucrtbase._o_lroundf
+@ cdecl _o_lroundl(double) ucrtbase._o_lroundl
@ cdecl _o_malloc(long) ucrtbase._o_malloc
-@ stub _o_mblen
-@ stub _o_mbrlen
+@ cdecl _o_mblen(ptr long) ucrtbase._o_mblen
+@ cdecl _o_mbrlen(ptr long ptr) ucrtbase._o_mbrlen
@ stub _o_mbrtoc16
@ stub _o_mbrtoc32
-@ stub _o_mbrtowc
-@ stub _o_mbsrtowcs
-@ stub _o_mbsrtowcs_s
-@ stub _o_mbstowcs
-@ stub _o_mbstowcs_s
-@ stub _o_mbtowc
-@ stub _o_memcpy_s
+@ cdecl _o_mbrtowc(ptr str long ptr) ucrtbase._o_mbrtowc
+@ cdecl _o_mbsrtowcs(ptr ptr long ptr) ucrtbase._o_mbsrtowcs
+@ cdecl _o_mbsrtowcs_s(ptr ptr long ptr long ptr) ucrtbase._o_mbsrtowcs_s
+@ cdecl _o_mbstowcs(ptr str long) ucrtbase._o_mbstowcs
+@ cdecl _o_mbstowcs_s(ptr ptr long str long) ucrtbase._o_mbstowcs_s
+@ cdecl _o_mbtowc(ptr str long) ucrtbase._o_mbtowc
+@ cdecl _o_memcpy_s(ptr long ptr long) ucrtbase._o_memcpy_s
@ cdecl _o_modf(double ptr) ucrtbase._o_modf
-@ stub _o_modff
-@ stub _o_nan
-@ stub _o_nanf
-@ stub _o_nanl
-@ stub _o_nearbyint
-@ stub _o_nearbyintf
-@ stub _o_nearbyintl
-@ stub _o_nextafter
-@ stub _o_nextafterf
-@ stub _o_nextafterl
-@ stub _o_nexttoward
-@ stub _o_nexttowardf
-@ stub _o_nexttowardl
+@ cdecl -arch=!i386 _o_modff(float ptr) ucrtbase._o_modff
+@ cdecl _o_nan(str) ucrtbase._o_nan
+@ cdecl _o_nanf(str) ucrtbase._o_nanf
+@ cdecl _o_nanl(str) ucrtbase._o_nanl
+@ cdecl _o_nearbyint(double) ucrtbase._o_nearbyint
+@ cdecl _o_nearbyintf(float) ucrtbase._o_nearbyintf
+@ cdecl _o_nearbyintl(double) ucrtbase._o_nearbyintl
+@ cdecl _o_nextafter(double double) ucrtbase._o_nextafter
+@ cdecl _o_nextafterf(float float) ucrtbase._o_nextafterf
+@ cdecl _o_nextafterl(double double) ucrtbase._o_nextafterl
+@ cdecl _o_nexttoward(double double) ucrtbase._o_nexttoward
+@ cdecl _o_nexttowardf(float double) ucrtbase._o_nexttowardf
+@ cdecl _o_nexttowardl(double double) ucrtbase._o_nexttowardl
@ cdecl _o_pow(double double) ucrtbase._o_pow
-@ stub _o_powf
-@ stub _o_putc
-@ stub _o_putchar
-@ stub _o_puts
-@ stub _o_putwc
-@ stub _o_putwchar
+@ cdecl -arch=!i386 _o_powf(float float) ucrtbase._o_powf
+@ cdecl _o_putc(long ptr) ucrtbase._o_putc
+@ cdecl _o_putchar(long) ucrtbase._o_putchar
+@ cdecl _o_puts(str) ucrtbase._o_puts
+@ cdecl _o_putwc(long ptr) ucrtbase._o_putwc
+@ cdecl _o_putwchar(long) ucrtbase._o_putwchar
@ cdecl _o_qsort(ptr long long ptr) ucrtbase._o_qsort
-@ stub _o_qsort_s
-@ stub _o_raise
-@ stub _o_rand
-@ stub _o_rand_s
+@ cdecl _o_qsort_s(ptr long long ptr ptr) ucrtbase._o_qsort_s
+@ cdecl _o_raise(long) ucrtbase._o_raise
+@ cdecl _o_rand() ucrtbase._o_rand
+@ cdecl _o_rand_s(ptr) ucrtbase._o_rand_s
@ cdecl _o_realloc(ptr long) ucrtbase._o_realloc
-@ stub _o_remainder
-@ stub _o_remainderf
-@ stub _o_remainderl
-@ stub _o_remove
-@ stub _o_remquo
-@ stub _o_remquof
-@ stub _o_remquol
-@ stub _o_rename
-@ stub _o_rewind
-@ stub _o_rint
-@ stub _o_rintf
-@ stub _o_rintl
-@ stub _o_round
-@ stub _o_roundf
-@ stub _o_roundl
-@ stub _o_scalbln
-@ stub _o_scalblnf
-@ stub _o_scalblnl
-@ stub _o_scalbn
-@ stub _o_scalbnf
-@ stub _o_scalbnl
-@ stub _o_set_terminate
-@ stub _o_setbuf
+@ cdecl _o_remainder(double double) ucrtbase._o_remainder
+@ cdecl _o_remainderf(float float) ucrtbase._o_remainderf
+@ cdecl _o_remainderl(double double) ucrtbase._o_remainderl
+@ cdecl _o_remove(str) ucrtbase._o_remove
+@ cdecl _o_remquo(double double ptr) ucrtbase._o_remquo
+@ cdecl _o_remquof(float float ptr) ucrtbase._o_remquof
+@ cdecl _o_remquol(double double ptr) ucrtbase._o_remquol
+@ cdecl _o_rename(str str) ucrtbase._o_rename
+@ cdecl _o_rewind(ptr) ucrtbase._o_rewind
+@ cdecl _o_rint(double) ucrtbase._o_rint
+@ cdecl _o_rintf(float) ucrtbase._o_rintf
+@ cdecl _o_rintl(double) ucrtbase._o_rintl
+@ cdecl _o_round(double) ucrtbase._o_round
+@ cdecl _o_roundf(float) ucrtbase._o_roundf
+@ cdecl _o_roundl(double) ucrtbase._o_roundl
+@ cdecl _o_scalbln(double long) ucrtbase._o_scalbln
+@ cdecl _o_scalblnf(float long) ucrtbase._o_scalblnf
+@ cdecl _o_scalblnl(double long) ucrtbase._o_scalblnl
+@ cdecl _o_scalbn(double long) ucrtbase._o_scalbn
+@ cdecl _o_scalbnf(float long) ucrtbase._o_scalbnf
+@ cdecl _o_scalbnl(double long) ucrtbase._o_scalbnl
+@ cdecl _o_set_terminate(ptr) ucrtbase._o_set_terminate
+@ cdecl _o_setbuf(ptr ptr) ucrtbase._o_setbuf
@ cdecl _o_setlocale(long str) ucrtbase._o_setlocale
-@ stub _o_setvbuf
-@ stub _o_sin
-@ stub _o_sinf
-@ stub _o_sinh
-@ stub _o_sinhf
+@ cdecl _o_setvbuf(ptr str long long) ucrtbase._o_setvbuf
+@ cdecl _o_sin(double) ucrtbase._o_sin
+@ cdecl -arch=!i386 _o_sinf(float) ucrtbase._o_sinf
+@ cdecl _o_sinh(double) ucrtbase._o_sinh
+@ cdecl -arch=!i386 _o_sinhf(float) ucrtbase._o_sinhf
@ cdecl _o_sqrt(double) ucrtbase._o_sqrt
-@ stub _o_sqrtf
-@ stub _o_srand
+@ cdecl -arch=!i386 _o_sqrtf(float) ucrtbase._o_sqrtf
+@ cdecl _o_srand(long) ucrtbase._o_srand
@ cdecl _o_strcat_s(str long str) ucrtbase._o_strcat_s
-@ stub _o_strcoll
-@ stub _o_strcpy_s
-@ stub _o_strerror
-@ stub _o_strerror_s
-@ stub _o_strftime
-@ stub _o_strncat_s
-@ stub _o_strncpy_s
-@ stub _o_strtod
-@ stub _o_strtof
-@ stub _o_strtok
-@ stub _o_strtok_s
-@ stub _o_strtol
+@ cdecl _o_strcoll(str str) ucrtbase._o_strcoll
+@ cdecl _o_strcpy_s(ptr long str) ucrtbase._o_strcpy_s
+@ cdecl _o_strerror(long) ucrtbase._o_strerror
+@ cdecl _o_strerror_s(ptr long long) ucrtbase._o_strerror_s
+@ cdecl _o_strftime(ptr long str ptr) ucrtbase._o_strftime
+@ cdecl _o_strncat_s(str long str long) ucrtbase._o_strncat_s
+@ cdecl _o_strncpy_s(ptr long str long) ucrtbase._o_strncpy_s
+@ cdecl _o_strtod(str ptr) ucrtbase._o_strtod
+@ cdecl _o_strtof(str ptr) ucrtbase._o_strtof
+@ cdecl _o_strtok(str str) ucrtbase._o_strtok
+@ cdecl _o_strtok_s(ptr str ptr) ucrtbase._o_strtok_s
+@ cdecl _o_strtol(str ptr long) ucrtbase._o_strtol
@ stub _o_strtold
-@ stub _o_strtoll
+@ cdecl -ret64 _o_strtoll(str ptr long) ucrtbase._o_strtoll
@ cdecl _o_strtoul(str ptr long) ucrtbase._o_strtoul
-@ stub _o_strtoull
-@ stub _o_system
-@ stub _o_tan
-@ stub _o_tanf
-@ stub _o_tanh
-@ stub _o_tanhf
-@ stub _o_terminate
-@ stub _o_tgamma
-@ stub _o_tgammaf
-@ stub _o_tgammal
-@ stub _o_tmpfile_s
-@ stub _o_tmpnam_s
+@ cdecl -ret64 _o_strtoull(str ptr long) ucrtbase._o_strtoull
+@ cdecl _o_system(str) ucrtbase._o_system
+@ cdecl _o_tan(double) ucrtbase._o_tan
+@ cdecl -arch=!i386 _o_tanf(float) ucrtbase._o_tanf
+@ cdecl _o_tanh(double) ucrtbase._o_tanh
+@ cdecl -arch=!i386 _o_tanhf(float) ucrtbase._o_tanhf
+@ cdecl _o_terminate() ucrtbase._o_terminate
+@ cdecl _o_tgamma(double) ucrtbase._o_tgamma
+@ cdecl _o_tgammaf(float) ucrtbase._o_tgammaf
+@ cdecl _o_tgammal(double) ucrtbase._o_tgammal
+@ cdecl _o_tmpfile_s(ptr) ucrtbase._o_tmpfile_s
+@ cdecl _o_tmpnam_s(ptr long) ucrtbase._o_tmpnam_s
@ cdecl _o_tolower(long) ucrtbase._o_tolower
@ cdecl _o_toupper(long) ucrtbase._o_toupper
-@ stub _o_towlower
-@ stub _o_towupper
-@ stub _o_ungetc
-@ stub _o_ungetwc
-@ stub _o_wcrtomb
-@ stub _o_wcrtomb_s
-@ stub _o_wcscat_s
-@ stub _o_wcscoll
-@ stub _o_wcscpy
-@ stub _o_wcscpy_s
-@ stub _o_wcsftime
-@ stub _o_wcsncat_s
-@ stub _o_wcsncpy_s
-@ stub _o_wcsrtombs
-@ stub _o_wcsrtombs_s
-@ stub _o_wcstod
-@ stub _o_wcstof
-@ stub _o_wcstok
-@ stub _o_wcstok_s
-@ stub _o_wcstol
+@ cdecl _o_towlower(long) ucrtbase._o_towlower
+@ cdecl _o_towupper(long) ucrtbase._o_towupper
+@ cdecl _o_ungetc(long ptr) ucrtbase._o_ungetc
+@ cdecl _o_ungetwc(long ptr) ucrtbase._o_ungetwc
+@ cdecl _o_wcrtomb(ptr long ptr) ucrtbase._o_wcrtomb
+@ cdecl _o_wcrtomb_s(ptr ptr long long ptr) ucrtbase._o_wcrtomb_s
+@ cdecl _o_wcscat_s(wstr long wstr) ucrtbase._o_wcscat_s
+@ cdecl _o_wcscoll(wstr wstr) ucrtbase._o_wcscoll
+@ cdecl _o_wcscpy(ptr wstr) ucrtbase._o_wcscpy
+@ cdecl _o_wcscpy_s(ptr long wstr) ucrtbase._o_wcscpy_s
+@ cdecl _o_wcsftime(ptr long wstr ptr) ucrtbase._o_wcsftime
+@ cdecl _o_wcsncat_s(wstr long wstr long) ucrtbase._o_wcsncat_s
+@ cdecl _o_wcsncpy_s(ptr long wstr long) ucrtbase._o_wcsncpy_s
+@ cdecl _o_wcsrtombs(ptr ptr long ptr) ucrtbase._o_wcsrtombs
+@ cdecl _o_wcsrtombs_s(ptr ptr long ptr long ptr) ucrtbase._o_wcsrtombs_s
+@ cdecl _o_wcstod(wstr ptr) ucrtbase._o_wcstod
+@ cdecl _o_wcstof(ptr ptr) ucrtbase._o_wcstof
+@ cdecl _o_wcstok(wstr wstr ptr) ucrtbase._o_wcstok
+@ cdecl _o_wcstok_s(ptr wstr ptr) ucrtbase._o_wcstok_s
+@ cdecl _o_wcstol(wstr ptr long) ucrtbase._o_wcstol
@ stub _o_wcstold
-@ stub _o_wcstoll
-@ stub _o_wcstombs
-@ stub _o_wcstombs_s
-@ stub _o_wcstoul
-@ stub _o_wcstoull
-@ stub _o_wctob
-@ stub _o_wctomb
-@ stub _o_wctomb_s
-@ stub _o_wmemcpy_s
-@ stub _o_wmemmove_s
+@ cdecl -ret64 _o_wcstoll(wstr ptr long) ucrtbase._o_wcstoll
+@ cdecl _o_wcstombs(ptr ptr long) ucrtbase._o_wcstombs
+@ cdecl _o_wcstombs_s(ptr ptr long wstr long) ucrtbase._o_wcstombs_s
+@ cdecl _o_wcstoul(wstr ptr long) ucrtbase._o_wcstoul
+@ cdecl -ret64 _o_wcstoull(wstr ptr long) ucrtbase._o_wcstoull
+@ cdecl _o_wctob(long) ucrtbase._o_wctob
+@ cdecl _o_wctomb(ptr long) ucrtbase._o_wctomb
+@ cdecl _o_wctomb_s(ptr ptr long long) ucrtbase._o_wctomb_s
+@ cdecl _o_wmemcpy_s(ptr long ptr long) ucrtbase._o_wmemcpy_s
+@ cdecl _o_wmemmove_s(ptr long ptr long) ucrtbase._o_wmemmove_s
@ cdecl _purecall() ucrtbase._purecall
@ stdcall -arch=i386 _seh_longjmp_unwind(ptr) ucrtbase._seh_longjmp_unwind
@ stdcall -arch=i386 _seh_longjmp_unwind4(ptr) ucrtbase._seh_longjmp_unwind4
diff --git a/dlls/ucrtbase/ucrtbase.spec b/dlls/ucrtbase/ucrtbase.spec
index 1c039d0715..d7c0700696 100644
--- a/dlls/ucrtbase/ucrtbase.spec
+++ b/dlls/ucrtbase/ucrtbase.spec
@@ -1556,289 +1556,289 @@
@ stub _o__y0
@ stub _o__y1
@ stub _o__yn
-@ stub _o_abort
-@ stub _o_acos
-@ stub _o_acosf
-@ stub _o_acosh
-@ stub _o_acoshf
-@ stub _o_acoshl
-@ stub _o_asctime
-@ stub _o_asctime_s
-@ stub _o_asin
-@ stub _o_asinf
-@ stub _o_asinh
-@ stub _o_asinhf
-@ stub _o_asinhl
-@ stub _o_atan
-@ stub _o_atan2
-@ stub _o_atan2f
-@ stub _o_atanf
-@ stub _o_atanh
-@ stub _o_atanhf
-@ stub _o_atanhl
+@ cdecl _o_abort() MSVCRT_abort
+@ cdecl _o_acos(double) MSVCRT_acos
+@ cdecl -arch=!i386 _o_acosf(float) MSVCRT_acosf
+@ cdecl _o_acosh(double) MSVCR120_acosh
+@ cdecl _o_acoshf(float) MSVCR120_acoshf
+@ cdecl _o_acoshl(double) MSVCR120_acoshl
+@ cdecl _o_asctime(ptr) MSVCRT_asctime
+@ cdecl _o_asctime_s(ptr long ptr) MSVCRT_asctime_s
+@ cdecl _o_asin(double) MSVCRT_asin
+@ cdecl -arch=!i386 _o_asinf(float) MSVCRT_asinf
+@ cdecl _o_asinh(double) MSVCR120_asinh
+@ cdecl _o_asinhf(float) MSVCR120_asinhf
+@ cdecl _o_asinhl(double) MSVCR120_asinhl
+@ cdecl _o_atan(double) MSVCRT_atan
+@ cdecl _o_atan2(double double) MSVCRT_atan2
+@ cdecl -arch=!i386 _o_atan2f(float float) MSVCRT_atan2f
+@ cdecl -arch=!i386 _o_atanf(float) MSVCRT_atanf
+@ cdecl _o_atanh(double) MSVCR120_atanh
+@ cdecl _o_atanhf(float) MSVCR120_atanhf
+@ cdecl _o_atanhl(double) MSVCR120_atanhl
@ cdecl _o_atof(str) MSVCRT_atof
@ cdecl _o_atoi(str) MSVCRT_atoi
-@ stub _o_atol
-@ stub _o_atoll
-@ stub _o_bsearch
-@ stub _o_bsearch_s
-@ stub _o_btowc
+@ cdecl _o_atol(str) MSVCRT_atol
+@ cdecl -ret64 _o_atoll(str) MSVCRT_atoll
+@ cdecl _o_bsearch(ptr ptr long long ptr) MSVCRT_bsearch
+@ cdecl _o_bsearch_s(ptr ptr long long ptr ptr) MSVCRT_bsearch_s
+@ cdecl _o_btowc(long) MSVCRT_btowc
@ cdecl _o_calloc(long long) MSVCRT_calloc
-@ stub _o_cbrt
-@ stub _o_cbrtf
+@ cdecl _o_cbrt(double) MSVCR120_cbrt
+@ cdecl _o_cbrtf(float) MSVCR120_cbrtf
@ cdecl _o_ceil(double) MSVCRT_ceil
-@ stub _o_ceilf
-@ stub _o_clearerr
-@ stub _o_clearerr_s
-@ stub _o_cos
-@ stub _o_cosf
-@ stub _o_cosh
-@ stub _o_coshf
-@ stub _o_erf
-@ stub _o_erfc
-@ stub _o_erfcf
-@ stub _o_erfcl
-@ stub _o_erff
-@ stub _o_erfl
+@ cdecl -arch=!i386 _o_ceilf(float) MSVCRT_ceilf
+@ cdecl _o_clearerr(ptr) MSVCRT_clearerr
+@ cdecl _o_clearerr_s(ptr) MSVCRT_clearerr_s
+@ cdecl _o_cos(double) MSVCRT_cos
+@ cdecl -arch=!i386 _o_cosf(float) MSVCRT_cosf
+@ cdecl _o_cosh(double) MSVCRT_cosh
+@ cdecl -arch=!i386 _o_coshf(float) MSVCRT_coshf
+@ cdecl _o_erf(double) MSVCR120_erf
+@ cdecl _o_erfc(double) MSVCR120_erfc
+@ cdecl _o_erfcf(float) MSVCR120_erfcf
+@ cdecl _o_erfcl(double) MSVCR120_erfcl
+@ cdecl _o_erff(float) MSVCR120_erff
+@ cdecl _o_erfl(double) MSVCR120_erfl
@ cdecl _o_exit(long) MSVCRT_exit
-@ stub _o_exp
-@ stub _o_exp2
-@ stub _o_exp2f
-@ stub _o_exp2l
-@ stub _o_expf
-@ stub _o_fabs
-@ stub _o_fclose
-@ stub _o_feof
-@ stub _o_ferror
-@ stub _o_fflush
-@ stub _o_fgetc
-@ stub _o_fgetpos
-@ stub _o_fgets
-@ stub _o_fgetwc
-@ stub _o_fgetws
+@ cdecl _o_exp(double) MSVCRT_exp
+@ cdecl _o_exp2(double) MSVCR120_exp2
+@ cdecl _o_exp2f(float) MSVCR120_exp2f
+@ cdecl _o_exp2l(double) MSVCR120_exp2l
+@ cdecl -arch=!i386 _o_expf(float) MSVCRT_expf
+@ cdecl _o_fabs(double) MSVCRT_fabs
+@ cdecl _o_fclose(ptr) MSVCRT_fclose
+@ cdecl _o_feof(ptr) MSVCRT_feof
+@ cdecl _o_ferror(ptr) MSVCRT_ferror
+@ cdecl _o_fflush(ptr) MSVCRT_fflush
+@ cdecl _o_fgetc(ptr) MSVCRT_fgetc
+@ cdecl _o_fgetpos(ptr ptr) MSVCRT_fgetpos
+@ cdecl _o_fgets(ptr long ptr) MSVCRT_fgets
+@ cdecl _o_fgetwc(ptr) MSVCRT_fgetwc
+@ cdecl _o_fgetws(ptr long ptr) MSVCRT_fgetws
@ cdecl _o_floor(double) MSVCRT_floor
-@ stub _o_floorf
-@ stub _o_fma
-@ stub _o_fmaf
-@ stub _o_fmal
+@ cdecl -arch=!i386 _o_floorf(float) MSVCRT_floorf
+@ cdecl _o_fma(double double double) MSVCRT_fma
+@ cdecl _o_fmaf(float float float) MSVCRT_fmaf
+@ cdecl _o_fmal(double double double) MSVCRT_fma
@ cdecl _o_fmod(double double) MSVCRT_fmod
@ cdecl -arch=!i386 _o_fmodf(float float) MSVCRT_fmodf
-@ stub _o_fopen
-@ stub _o_fopen_s
-@ stub _o_fputc
-@ stub _o_fputs
-@ stub _o_fputwc
-@ stub _o_fputws
-@ stub _o_fread
-@ stub _o_fread_s
+@ cdecl _o_fopen(str str) MSVCRT_fopen
+@ cdecl _o_fopen_s(ptr str str) MSVCRT_fopen_s
+@ cdecl _o_fputc(long ptr) MSVCRT_fputc
+@ cdecl _o_fputs(str ptr) MSVCRT_fputs
+@ cdecl _o_fputwc(long ptr) MSVCRT_fputwc
+@ cdecl _o_fputws(wstr ptr) MSVCRT_fputws
+@ cdecl _o_fread(ptr long long ptr) MSVCRT_fread
+@ cdecl _o_fread_s(ptr long long long ptr) MSVCRT_fread_s
@ cdecl _o_free(ptr) MSVCRT_free
-@ stub _o_freopen
-@ stub _o_freopen_s
-@ stub _o_frexp
-@ stub _o_fseek
-@ stub _o_fsetpos
-@ stub _o_ftell
-@ stub _o_fwrite
-@ stub _o_getc
-@ stub _o_getchar
+@ cdecl _o_freopen(str str ptr) MSVCRT_freopen
+@ cdecl _o_freopen_s(ptr str str ptr) MSVCRT_freopen_s
+@ cdecl _o_frexp(double ptr) MSVCRT_frexp
+@ cdecl _o_fseek(ptr long long) MSVCRT_fseek
+@ cdecl _o_fsetpos(ptr ptr) MSVCRT_fsetpos
+@ cdecl _o_ftell(ptr) MSVCRT_ftell
+@ cdecl _o_fwrite(ptr long long ptr) MSVCRT_fwrite
+@ cdecl _o_getc(ptr) MSVCRT_getc
+@ cdecl _o_getchar() MSVCRT_getchar
@ cdecl _o_getenv(str) MSVCRT_getenv
-@ stub _o_getenv_s
-@ stub _o_gets
-@ stub _o_gets_s
-@ stub _o_getwc
-@ stub _o_getwchar
-@ stub _o_hypot
-@ stub _o_is_wctype
+@ cdecl _o_getenv_s(ptr ptr long str) getenv_s
+@ cdecl _o_gets(str) MSVCRT_gets
+@ cdecl _o_gets_s(ptr long) MSVCRT_gets_s
+@ cdecl _o_getwc(ptr) MSVCRT_getwc
+@ cdecl _o_getwchar() MSVCRT_getwchar
+@ cdecl _o_hypot(double double) _hypot
+@ cdecl _o_is_wctype(long long) MSVCRT_iswctype
@ cdecl _o_isalnum(long) MSVCRT_isalnum
@ cdecl _o_isalpha(long) MSVCRT_isalpha
-@ stub _o_isblank
-@ stub _o_iscntrl
+@ cdecl _o_isblank(long) MSVCRT_isblank
+@ cdecl _o_iscntrl(long) MSVCRT_iscntrl
@ cdecl _o_isdigit(long) MSVCRT_isdigit
-@ stub _o_isgraph
-@ stub _o_isleadbyte
-@ stub _o_islower
+@ cdecl _o_isgraph(long) MSVCRT_isgraph
+@ cdecl _o_isleadbyte(long) MSVCRT_isleadbyte
+@ cdecl _o_islower(long) MSVCRT_islower
@ cdecl _o_isprint(long) MSVCRT_isprint
-@ stub _o_ispunct
-@ stub _o_isspace
-@ stub _o_isupper
-@ stub _o_iswalnum
-@ stub _o_iswalpha
-@ stub _o_iswascii
-@ stub _o_iswblank
-@ stub _o_iswcntrl
-@ stub _o_iswctype
-@ stub _o_iswdigit
-@ stub _o_iswgraph
-@ stub _o_iswlower
-@ stub _o_iswprint
-@ stub _o_iswpunct
-@ stub _o_iswspace
-@ stub _o_iswupper
-@ stub _o_iswxdigit
+@ cdecl _o_ispunct(long) MSVCRT_ispunct
+@ cdecl _o_isspace(long) MSVCRT_isspace
+@ cdecl _o_isupper(long) MSVCRT_isupper
+@ cdecl _o_iswalnum(long) MSVCRT_iswalnum
+@ cdecl _o_iswalpha(long) MSVCRT_iswalpha
+@ cdecl _o_iswascii(long) MSVCRT_iswascii
+@ cdecl _o_iswblank(long) MSVCRT_iswblank
+@ cdecl _o_iswcntrl(long) MSVCRT_iswcntrl
+@ cdecl _o_iswctype(long long) MSVCRT_iswctype
+@ cdecl _o_iswdigit(long) MSVCRT_iswdigit
+@ cdecl _o_iswgraph(long) MSVCRT_iswgraph
+@ cdecl _o_iswlower(long) MSVCRT_iswlower
+@ cdecl _o_iswprint(long) MSVCRT_iswprint
+@ cdecl _o_iswpunct(long) MSVCRT_iswpunct
+@ cdecl _o_iswspace(long) MSVCRT_iswspace
+@ cdecl _o_iswupper(long) MSVCRT_iswupper
+@ cdecl _o_iswxdigit(long) MSVCRT_iswxdigit
@ cdecl _o_isxdigit(long) MSVCRT_isxdigit
-@ stub _o_ldexp
-@ stub _o_lgamma
-@ stub _o_lgammaf
-@ stub _o_lgammal
-@ stub _o_llrint
-@ stub _o_llrintf
-@ stub _o_llrintl
-@ stub _o_llround
-@ stub _o_llroundf
-@ stub _o_llroundl
-@ stub _o_localeconv
+@ cdecl _o_ldexp(double long) MSVCRT_ldexp
+@ cdecl _o_lgamma(double) MSVCR120_lgamma
+@ cdecl _o_lgammaf(float) MSVCR120_lgammaf
+@ cdecl _o_lgammal(double) MSVCR120_lgammal
+@ cdecl -ret64 _o_llrint(double) MSVCR120_llrint
+@ cdecl -ret64 _o_llrintf(float) MSVCR120_llrintf
+@ cdecl -ret64 _o_llrintl(double) MSVCR120_llrintl
+@ cdecl -ret64 _o_llround(double) MSVCR120_llround
+@ cdecl -ret64 _o_llroundf(float) MSVCR120_llroundf
+@ cdecl -ret64 _o_llroundl(double) MSVCR120_llroundl
+@ cdecl _o_localeconv() MSVCRT_localeconv
@ cdecl _o_log(double) MSVCRT_log
-@ stub _o_log10
-@ stub _o_log10f
-@ stub _o_log1p
-@ stub _o_log1pf
-@ stub _o_log1pl
-@ stub _o_log2
-@ stub _o_log2f
-@ stub _o_log2l
-@ stub _o_logb
-@ stub _o_logbf
-@ stub _o_logbl
-@ stub _o_logf
-@ stub _o_lrint
-@ stub _o_lrintf
-@ stub _o_lrintl
-@ stub _o_lround
-@ stub _o_lroundf
-@ stub _o_lroundl
+@ cdecl _o_log10(double) MSVCRT_log10
+@ cdecl -arch=!i386 _o_log10f(float) MSVCRT_log10f
+@ cdecl _o_log1p(double) MSVCR120_log1p
+@ cdecl _o_log1pf(float) MSVCR120_log1pf
+@ cdecl _o_log1pl(double) MSVCR120_log1pl
+@ cdecl _o_log2(double) MSVCR120_log2
+@ cdecl _o_log2f(float) MSVCR120_log2f
+@ cdecl _o_log2l(double) MSVCR120_log2l
+@ cdecl _o_logb(double) MSVCRT__logb
+@ cdecl _o_logbf(float) MSVCRT__logbf
+@ cdecl _o_logbl(double) MSVCRT__logb
+@ cdecl -arch=!i386 _o_logf(float) MSVCRT_logf
+@ cdecl _o_lrint(double) MSVCR120_lrint
+@ cdecl _o_lrintf(float) MSVCR120_lrintf
+@ cdecl _o_lrintl(double) MSVCR120_lrintl
+@ cdecl _o_lround(double) MSVCR120_lround
+@ cdecl _o_lroundf(float) MSVCR120_lroundf
+@ cdecl _o_lroundl(double) MSVCR120_lroundl
@ cdecl _o_malloc(long) MSVCRT_malloc
-@ stub _o_mblen
-@ stub _o_mbrlen
+@ cdecl _o_mblen(ptr long) MSVCRT_mblen
+@ cdecl _o_mbrlen(ptr long ptr) MSVCRT_mbrlen
@ stub _o_mbrtoc16
@ stub _o_mbrtoc32
-@ stub _o_mbrtowc
-@ stub _o_mbsrtowcs
-@ stub _o_mbsrtowcs_s
-@ stub _o_mbstowcs
-@ stub _o_mbstowcs_s
-@ stub _o_mbtowc
-@ stub _o_memcpy_s
-@ stub _o_memset
+@ cdecl _o_mbrtowc(ptr str long ptr) MSVCRT_mbrtowc
+@ cdecl _o_mbsrtowcs(ptr ptr long ptr) MSVCRT_mbsrtowcs
+@ cdecl _o_mbsrtowcs_s(ptr ptr long ptr long ptr) MSVCRT_mbsrtowcs_s
+@ cdecl _o_mbstowcs(ptr str long) MSVCRT_mbstowcs
+@ cdecl _o_mbstowcs_s(ptr ptr long str long) MSVCRT__mbstowcs_s
+@ cdecl _o_mbtowc(ptr str long) MSVCRT_mbtowc
+@ cdecl _o_memcpy_s(ptr long ptr long) MSVCRT_memcpy_s
+@ cdecl _o_memset(ptr long long) MSVCRT_memset
@ cdecl _o_modf(double ptr) MSVCRT_modf
-@ stub _o_modff
-@ stub _o_nan
-@ stub _o_nanf
-@ stub _o_nanl
-@ stub _o_nearbyint
-@ stub _o_nearbyintf
-@ stub _o_nearbyintl
-@ stub _o_nextafter
-@ stub _o_nextafterf
-@ stub _o_nextafterl
-@ stub _o_nexttoward
-@ stub _o_nexttowardf
-@ stub _o_nexttowardl
+@ cdecl -arch=!i386 _o_modff(float ptr) MSVCRT_modff
+@ cdecl _o_nan(str) MSVCR120_nan
+@ cdecl _o_nanf(str) MSVCR120_nanf
+@ cdecl _o_nanl(str) MSVCR120_nan
+@ cdecl _o_nearbyint(double) MSVCRT_nearbyint
+@ cdecl _o_nearbyintf(float) MSVCRT_nearbyintf
+@ cdecl _o_nearbyintl(double) MSVCRT_nearbyint
+@ cdecl _o_nextafter(double double) MSVCRT__nextafter
+@ cdecl _o_nextafterf(float float) MSVCRT__nextafterf
+@ cdecl _o_nextafterl(double double) MSVCRT__nextafter
+@ cdecl _o_nexttoward(double double) MSVCRT_nexttoward
+@ cdecl _o_nexttowardf(float double) MSVCRT_nexttowardf
+@ cdecl _o_nexttowardl(double double) MSVCRT_nexttoward
@ cdecl _o_pow(double double) MSVCRT_pow
-@ stub _o_powf
-@ stub _o_putc
-@ stub _o_putchar
-@ stub _o_puts
-@ stub _o_putwc
-@ stub _o_putwchar
+@ cdecl -arch=!i386 _o_powf(float float) MSVCRT_powf
+@ cdecl _o_putc(long ptr) MSVCRT_putc
+@ cdecl _o_putchar(long) MSVCRT_putchar
+@ cdecl _o_puts(str) MSVCRT_puts
+@ cdecl _o_putwc(long ptr) MSVCRT_fputwc
+@ cdecl _o_putwchar(long) MSVCRT__fputwchar
@ cdecl _o_qsort(ptr long long ptr) MSVCRT_qsort
-@ stub _o_qsort_s
-@ stub _o_raise
-@ stub _o_rand
-@ stub _o_rand_s
+@ cdecl _o_qsort_s(ptr long long ptr ptr) MSVCRT_qsort_s
+@ cdecl _o_raise(long) MSVCRT_raise
+@ cdecl _o_rand() MSVCRT_rand
+@ cdecl _o_rand_s(ptr) MSVCRT_rand_s
@ cdecl _o_realloc(ptr long) MSVCRT_realloc
-@ stub _o_remainder
-@ stub _o_remainderf
-@ stub _o_remainderl
-@ stub _o_remove
-@ stub _o_remquo
-@ stub _o_remquof
-@ stub _o_remquol
-@ stub _o_rename
-@ stub _o_rewind
-@ stub _o_rint
-@ stub _o_rintf
-@ stub _o_rintl
-@ stub _o_round
-@ stub _o_roundf
-@ stub _o_roundl
-@ stub _o_scalbln
-@ stub _o_scalblnf
-@ stub _o_scalblnl
-@ stub _o_scalbn
-@ stub _o_scalbnf
-@ stub _o_scalbnl
-@ stub _o_set_terminate
-@ stub _o_setbuf
+@ cdecl _o_remainder(double double) MSVCR120_remainder
+@ cdecl _o_remainderf(float float) MSVCR120_remainderf
+@ cdecl _o_remainderl(double double) MSVCR120_remainderl
+@ cdecl _o_remove(str) MSVCRT_remove
+@ cdecl _o_remquo(double double ptr) MSVCR120_remquo
+@ cdecl _o_remquof(float float ptr) MSVCR120_remquof
+@ cdecl _o_remquol(double double ptr) MSVCR120_remquol
+@ cdecl _o_rename(str str) MSVCRT_rename
+@ cdecl _o_rewind(ptr) MSVCRT_rewind
+@ cdecl _o_rint(double) MSVCR120_rint
+@ cdecl _o_rintf(float) MSVCR120_rintf
+@ cdecl _o_rintl(double) MSVCR120_rintl
+@ cdecl _o_round(double) MSVCR120_round
+@ cdecl _o_roundf(float) MSVCR120_roundf
+@ cdecl _o_roundl(double) MSVCR120_roundl
+@ cdecl _o_scalbln(double long) MSVCRT__scalb
+@ cdecl _o_scalblnf(float long) MSVCRT__scalbf
+@ cdecl _o_scalblnl(double long) MSVCR120_scalbnl
+@ cdecl _o_scalbn(double long) MSVCRT__scalb
+@ cdecl _o_scalbnf(float long) MSVCRT__scalbf
+@ cdecl _o_scalbnl(double long) MSVCR120_scalbnl
+@ cdecl _o_set_terminate(ptr) MSVCRT_set_terminate
+@ cdecl _o_setbuf(ptr ptr) MSVCRT_setbuf
@ cdecl _o_setlocale(long str) MSVCRT_setlocale
-@ stub _o_setvbuf
-@ stub _o_sin
-@ stub _o_sinf
-@ stub _o_sinh
-@ stub _o_sinhf
+@ cdecl _o_setvbuf(ptr str long long) MSVCRT_setvbuf
+@ cdecl _o_sin(double) MSVCRT_sin
+@ cdecl -arch=!i386 _o_sinf(float) MSVCRT_sinf
+@ cdecl _o_sinh(double) MSVCRT_sinh
+@ cdecl -arch=!i386 _o_sinhf(float) MSVCRT_sinhf
@ cdecl _o_sqrt(double) MSVCRT_sqrt
-@ stub _o_sqrtf
-@ stub _o_srand
+@ cdecl -arch=!i386 _o_sqrtf(float) MSVCRT_sqrtf
+@ cdecl _o_srand(long) MSVCRT_srand
@ cdecl _o_strcat_s(str long str) MSVCRT_strcat_s
-@ stub _o_strcoll
-@ stub _o_strcpy_s
-@ stub _o_strerror
-@ stub _o_strerror_s
-@ stub _o_strftime
-@ stub _o_strncat_s
-@ stub _o_strncpy_s
-@ stub _o_strtod
-@ stub _o_strtof
-@ stub _o_strtok
-@ stub _o_strtok_s
-@ stub _o_strtol
+@ cdecl _o_strcoll(str str) MSVCRT_strcoll
+@ cdecl _o_strcpy_s(ptr long str) MSVCRT_strcpy_s
+@ cdecl _o_strerror(long) MSVCRT_strerror
+@ cdecl _o_strerror_s(ptr long long) MSVCRT_strerror_s
+@ cdecl _o_strftime(ptr long str ptr) MSVCRT_strftime
+@ cdecl _o_strncat_s(str long str long) MSVCRT_strncat_s
+@ cdecl _o_strncpy_s(ptr long str long) MSVCRT_strncpy_s
+@ cdecl _o_strtod(str ptr) MSVCRT_strtod
+@ cdecl _o_strtof(str ptr) MSVCRT_strtof
+@ cdecl _o_strtok(str str) MSVCRT_strtok
+@ cdecl _o_strtok_s(ptr str ptr) MSVCRT_strtok_s
+@ cdecl _o_strtol(str ptr long) MSVCRT_strtol
@ stub _o_strtold
-@ stub _o_strtoll
+@ cdecl -ret64 _o_strtoll(str ptr long) MSVCRT_strtoi64
@ cdecl _o_strtoul(str ptr long) MSVCRT_strtoul
-@ stub _o_strtoull
-@ stub _o_system
-@ stub _o_tan
-@ stub _o_tanf
-@ stub _o_tanh
-@ stub _o_tanhf
-@ stub _o_terminate
-@ stub _o_tgamma
-@ stub _o_tgammaf
-@ stub _o_tgammal
-@ stub _o_tmpfile_s
-@ stub _o_tmpnam_s
+@ cdecl -ret64 _o_strtoull(str ptr long) MSVCRT_strtoui64
+@ cdecl _o_system(str) MSVCRT_system
+@ cdecl _o_tan(double) MSVCRT_tan
+@ cdecl -arch=!i386 _o_tanf(float) MSVCRT_tanf
+@ cdecl _o_tanh(double) MSVCRT_tanh
+@ cdecl -arch=!i386 _o_tanhf(float) MSVCRT_tanhf
+@ cdecl _o_terminate() MSVCRT_terminate
+@ cdecl _o_tgamma(double) MSVCR120_tgamma
+@ cdecl _o_tgammaf(float) MSVCR120_tgammaf
+@ cdecl _o_tgammal(double) MSVCR120_tgamma
+@ cdecl _o_tmpfile_s(ptr) MSVCRT_tmpfile_s
+@ cdecl _o_tmpnam_s(ptr long) MSVCRT_tmpnam_s
@ cdecl _o_tolower(long) MSVCRT_tolower
@ cdecl _o_toupper(long) MSVCRT_toupper
-@ stub _o_towlower
-@ stub _o_towupper
-@ stub _o_ungetc
-@ stub _o_ungetwc
-@ stub _o_wcrtomb
-@ stub _o_wcrtomb_s
-@ stub _o_wcscat_s
-@ stub _o_wcscoll
-@ stub _o_wcscpy
-@ stub _o_wcscpy_s
-@ stub _o_wcsftime
-@ stub _o_wcsncat_s
-@ stub _o_wcsncpy_s
-@ stub _o_wcsrtombs
-@ stub _o_wcsrtombs_s
-@ stub _o_wcstod
-@ stub _o_wcstof
-@ stub _o_wcstok
-@ stub _o_wcstok_s
-@ stub _o_wcstol
+@ cdecl _o_towlower(long) MSVCRT_towlower
+@ cdecl _o_towupper(long) MSVCRT_towupper
+@ cdecl _o_ungetc(long ptr) MSVCRT_ungetc
+@ cdecl _o_ungetwc(long ptr) MSVCRT_ungetwc
+@ cdecl _o_wcrtomb(ptr long ptr) MSVCRT_wcrtomb
+@ cdecl _o_wcrtomb_s(ptr ptr long long ptr) MSVCRT_wcrtomb_s
+@ cdecl _o_wcscat_s(wstr long wstr) MSVCRT_wcscat_s
+@ cdecl _o_wcscoll(wstr wstr) MSVCRT_wcscoll
+@ cdecl _o_wcscpy(ptr wstr) ntdll.wcscpy
+@ cdecl _o_wcscpy_s(ptr long wstr) MSVCRT_wcscpy_s
+@ cdecl _o_wcsftime(ptr long wstr ptr) MSVCRT_wcsftime
+@ cdecl _o_wcsncat_s(wstr long wstr long) MSVCRT_wcsncat_s
+@ cdecl _o_wcsncpy_s(ptr long wstr long) MSVCRT_wcsncpy_s
+@ cdecl _o_wcsrtombs(ptr ptr long ptr) MSVCRT_wcsrtombs
+@ cdecl _o_wcsrtombs_s(ptr ptr long ptr long ptr) MSVCRT_wcsrtombs_s
+@ cdecl _o_wcstod(wstr ptr) MSVCRT_wcstod
+@ cdecl _o_wcstof(ptr ptr) MSVCRT_wcstof
+@ cdecl _o_wcstok(wstr wstr ptr) MSVCRT_wcstok
+@ cdecl _o_wcstok_s(ptr wstr ptr) MSVCRT_wcstok_s
+@ cdecl _o_wcstol(wstr ptr long) MSVCRT_wcstol
@ stub _o_wcstold
-@ stub _o_wcstoll
-@ stub _o_wcstombs
-@ stub _o_wcstombs_s
-@ stub _o_wcstoul
-@ stub _o_wcstoull
-@ stub _o_wctob
-@ stub _o_wctomb
-@ stub _o_wctomb_s
-@ stub _o_wmemcpy_s
-@ stub _o_wmemmove_s
+@ cdecl -ret64 _o_wcstoll(wstr ptr long) MSVCRT__wcstoi64
+@ cdecl _o_wcstombs(ptr ptr long) MSVCRT_wcstombs
+@ cdecl _o_wcstombs_s(ptr ptr long wstr long) MSVCRT_wcstombs_s
+@ cdecl _o_wcstoul(wstr ptr long) MSVCRT_wcstoul
+@ cdecl -ret64 _o_wcstoull(wstr ptr long) MSVCRT__wcstoui64
+@ cdecl _o_wctob(long) MSVCRT_wctob
+@ cdecl _o_wctomb(ptr long) MSVCRT_wctomb
+@ cdecl _o_wctomb_s(ptr ptr long long) MSVCRT_wctomb_s
+@ cdecl _o_wmemcpy_s(ptr long ptr long) wmemcpy_s
+@ cdecl _o_wmemmove_s(ptr long ptr long) wmemmove_s
@ varargs _open(str long) MSVCRT__open
@ cdecl _open_osfhandle(long long) MSVCRT__open_osfhandle
@ cdecl _pclose(ptr) MSVCRT__pclose
--
2.26.2
2
1
[PATCH 2/3] wbemprox: Get the operating system serial number from the registry.
by Hans Leidekker 18 May '20
by Hans Leidekker 18 May '20
18 May '20
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/wbemprox/builtin.c | 25 +++++++++++++++++++++++--
1 file changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/wbemprox/builtin.c b/dlls/wbemprox/builtin.c
index 5af47a0ddc4..ddd12d6ebcb 100644
--- a/dlls/wbemprox/builtin.c
+++ b/dlls/wbemprox/builtin.c
@@ -243,7 +243,7 @@ static const struct column col_operatingsystem[] =
{ L"OSProductSuite", CIM_UINT32 },
{ L"OSType", CIM_UINT16 },
{ L"Primary", CIM_BOOLEAN },
- { L"SerialNumber", CIM_STRING },
+ { L"SerialNumber", CIM_STRING|COL_FLAG_DYNAMIC },
{ L"ServicePackMajorVersion", CIM_UINT16 },
{ L"ServicePackMinorVersion", CIM_UINT16 },
{ L"SuiteMask", CIM_UINT32 },
@@ -3360,6 +3360,27 @@ static WCHAR *get_osname( const WCHAR *caption )
memcpy( ret + len, partitionW, sizeof(partitionW) );
return ret;
}
+static WCHAR *get_osserialnumber(void)
+{
+ HKEY hkey = 0;
+ DWORD size, type;
+ WCHAR *ret = NULL;
+
+ if (!RegOpenKeyExW( HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hkey ) &&
+ !RegQueryValueExW( hkey, L"ProductId", NULL, &type, NULL, &size ) && type == REG_SZ &&
+ (ret = heap_alloc( size + sizeof(WCHAR) )))
+ {
+ size += sizeof(WCHAR);
+ if (RegQueryValueExW( hkey, L"ProductId", NULL, NULL, (BYTE *)ret, &size ))
+ {
+ heap_free( ret );
+ ret = NULL;
+ }
+ }
+ if (hkey) RegCloseKey( hkey );
+ if (!ret) return heap_strdupW( L"12345-OEM-1234567-12345" );
+ return ret;
+}
static WCHAR *get_osversion( OSVERSIONINFOEXW *ver )
{
WCHAR *ret = heap_alloc( 33 * sizeof(WCHAR) );
@@ -3414,7 +3435,7 @@ static enum fill_status fill_operatingsystem( struct table *table, const struct
rec->osproductsuite = 2461140; /* Windows XP Professional */
rec->ostype = 18; /* WINNT */
rec->primary = -1;
- rec->serialnumber = L"12345-OEM-1234567-12345";
+ rec->serialnumber = get_osserialnumber();
rec->servicepackmajor = ver.wServicePackMajor;
rec->servicepackminor = ver.wServicePackMinor;
rec->suitemask = 272; /* Single User + Terminal */
--
2.20.1
1
0
[PATCH 1/3] mountmgr: Return the disk serial from IOCTL_MOUNTMGR_QUERY_UNIX_DRIVE.
by Hans Leidekker 18 May '20
by Hans Leidekker 18 May '20
18 May '20
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mountmgr.sys/dbus.c | 13 +++++----
dlls/mountmgr.sys/device.c | 55 ++++++++++++++++++++++++++++++------
dlls/mountmgr.sys/mountmgr.c | 17 +++++++++--
dlls/mountmgr.sys/mountmgr.h | 6 ++--
include/ddk/mountmgr.h | 1 +
5 files changed, 73 insertions(+), 19 deletions(-)
diff --git a/dlls/mountmgr.sys/dbus.c b/dlls/mountmgr.sys/dbus.c
index 27b35acd9ca..98b2a47ba6d 100644
--- a/dlls/mountmgr.sys/dbus.c
+++ b/dlls/mountmgr.sys/dbus.c
@@ -317,7 +317,7 @@ static void udisks_new_device( const char *udi )
if (device)
{
if (removable) add_dos_device( -1, udi, device, mount_point, drive_type, guid_ptr, NULL );
- else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr );
+ else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr, NULL );
}
p_dbus_message_unref( reply );
@@ -385,7 +385,7 @@ static const char *udisks2_string_from_array( DBusMessageIter *iter )
/* find the drive entry in the dictionary and get its parameters */
static void udisks2_get_drive_info( const char *drive_name, DBusMessageIter *dict,
- enum device_type *drive_type, int *removable )
+ enum device_type *drive_type, int *removable, const char **serial )
{
DBusMessageIter iter, drive, variant;
const char *name;
@@ -403,6 +403,8 @@ static void udisks2_get_drive_info( const char *drive_name, DBusMessageIter *dic
p_dbus_message_iter_get_basic( &variant, removable );
else if (!strcmp( name, "MediaCompatibility" ))
*drive_type = udisks_parse_media_compatibility( &variant );
+ else if (!strcmp( name, "Id" ))
+ p_dbus_message_iter_get_basic( &variant, serial );
}
}
}
@@ -415,6 +417,7 @@ static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMess
const char *mount_point = NULL;
const char *type = NULL;
const char *drive = NULL;
+ const char *id = NULL;
GUID guid, *guid_ptr = NULL;
const char *iface, *name;
int removable = FALSE;
@@ -448,7 +451,7 @@ static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMess
else if (!strcmp( name, "Drive" ))
{
p_dbus_message_iter_get_basic( &variant, &drive );
- udisks2_get_drive_info( drive, dict, &drive_type, &removable );
+ udisks2_get_drive_info( drive, dict, &drive_type, &removable, &id );
}
else if (!strcmp( name, "IdUUID" ))
{
@@ -483,7 +486,7 @@ static void udisks2_add_device( const char *udi, DBusMessageIter *dict, DBusMess
if (device)
{
if (removable) add_dos_device( -1, udi, device, mount_point, drive_type, guid_ptr, NULL );
- else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr );
+ else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr, id );
}
}
@@ -799,7 +802,7 @@ static void hal_new_device( LibHalContext *ctx, const char *udi )
/* add property watch for mount point */
p_libhal_device_add_property_watch( ctx, udi, &error );
}
- else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr );
+ else if (guid_ptr) add_volume( udi, device, mount_point, DEVICE_HARDDISK_VOL, guid_ptr, NULL );
done:
if (type) p_libhal_free_string( type );
diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c
index a6794fa6ac4..babdaa3e884 100644
--- a/dlls/mountmgr.sys/device.c
+++ b/dlls/mountmgr.sys/device.c
@@ -89,6 +89,7 @@ struct disk_device
STORAGE_DEVICE_NUMBER devnum; /* device number info */
char *unix_device; /* unix device path */
char *unix_mount; /* unix mount point path */
+ char *serial; /* disk serial number */
};
struct volume
@@ -873,6 +874,7 @@ static void delete_disk_device( struct disk_device *device )
}
RtlFreeHeap( GetProcessHeap(), 0, device->unix_device );
RtlFreeHeap( GetProcessHeap(), 0, device->unix_mount );
+ RtlFreeHeap( GetProcessHeap(), 0, device->serial );
RtlFreeUnicodeString( &device->name );
IoDeleteDevice( device->dev_obj );
}
@@ -1078,9 +1080,40 @@ static BOOL get_volume_device_info( struct volume *volume )
return TRUE;
}
+/* set disk serial for dos devices that reside on a given Unix device */
+static void set_dos_devices_disk_serial( struct disk_device *device )
+{
+ struct dos_drive *drive;
+ struct stat dev_st, drive_st;
+ char *path, *p;
+
+ if (!device->unix_mount || stat( device->unix_mount, &dev_st ) == -1) return;
+
+ if (!(path = get_dosdevices_path( &p ))) return;
+ p[2] = 0;
+
+ LIST_FOR_EACH_ENTRY( drive, &drives_list, struct dos_drive, entry )
+ {
+ /* drives mapped to Unix devices already have serial set, if available */
+ if (drive->volume->device->unix_device) continue;
+
+ p[0] = 'a' + drive->drive;
+
+ /* copy serial if drive resides on this Unix device */
+ if (stat( path, &drive_st ) != -1 && drive_st.st_rdev == dev_st.st_rdev)
+ {
+ HeapFree( GetProcessHeap(), 0, drive->volume->device->serial );
+ drive->volume->device->serial = strdupA( device->serial );
+ }
+ }
+
+ HeapFree( GetProcessHeap(), 0, path );
+}
+
/* change the information for an existing volume */
static NTSTATUS set_volume_info( struct volume *volume, struct dos_drive *drive, const char *device,
- const char *mount_point, enum device_type type, const GUID *guid )
+ const char *mount_point, enum device_type type, const GUID *guid,
+ const char *disk_serial )
{
void *id = NULL;
unsigned int id_len = 0;
@@ -1107,9 +1140,12 @@ static NTSTATUS set_volume_info( struct volume *volume, struct dos_drive *drive,
{
RtlFreeHeap( GetProcessHeap(), 0, disk_device->unix_device );
RtlFreeHeap( GetProcessHeap(), 0, disk_device->unix_mount );
+ RtlFreeHeap( GetProcessHeap(), 0, disk_device->serial );
}
disk_device->unix_device = strdupA( device );
disk_device->unix_mount = strdupA( mount_point );
+ disk_device->serial = strdupA( disk_serial );
+ if (disk_device->serial) set_dos_devices_disk_serial( disk_device );
if (!get_volume_device_info( volume ))
{
@@ -1306,7 +1342,7 @@ static void create_drive_devices(void)
{
/* don't reset uuid if we used an existing volume */
const GUID *guid = volume ? NULL : get_default_uuid(i);
- set_volume_info( drive->volume, drive, device, link, drive_type, guid );
+ set_volume_info( drive->volume, drive, device, link, drive_type, guid, NULL );
}
else
{
@@ -1459,7 +1495,7 @@ void set_scsi_device_name( SCSI_ADDRESS *scsi_addr, const UNICODE_STRING *dev )
/* create a new disk volume */
NTSTATUS add_volume( const char *udi, const char *device, const char *mount_point,
- enum device_type type, const GUID *guid )
+ enum device_type type, const GUID *guid, const char *disk_serial )
{
struct volume *volume;
NTSTATUS status = STATUS_SUCCESS;
@@ -1480,13 +1516,13 @@ NTSTATUS add_volume( const char *udi, const char *device, const char *mount_poin
else status = create_volume( udi, type, &volume );
found:
- if (!status) status = set_volume_info( volume, NULL, device, mount_point, type, guid );
+ if (!status) status = set_volume_info( volume, NULL, device, mount_point, type, guid, disk_serial );
if (volume) release_volume( volume );
LeaveCriticalSection( &device_section );
return status;
}
-/* create a new disk volume */
+/* remove a disk volume */
NTSTATUS remove_volume( const char *udi )
{
NTSTATUS status = STATUS_NO_SUCH_DEVICE;
@@ -1560,7 +1596,7 @@ found:
p[0] = 'a' + drive->drive;
p[2] = 0;
update_symlink( path, mount_point, volume->device->unix_mount );
- set_volume_info( volume, drive, device, mount_point, type, guid );
+ set_volume_info( volume, drive, device, mount_point, type, guid, NULL );
TRACE( "added device %c: udi %s for %s on %s type %u\n",
'a' + drive->drive, wine_dbgstr_a(udi), wine_dbgstr_a(device),
@@ -1656,7 +1692,8 @@ enum mountmgr_fs_type get_mountmgr_fs_type(enum fs_type fs_type)
/* query information about an existing dos drive, by letter or udi */
NTSTATUS query_dos_device( int letter, enum device_type *type, enum mountmgr_fs_type *fs_type,
- DWORD *serial, char **device, char **mount_point, WCHAR **label )
+ DWORD *serial, char **device, char **mount_point, WCHAR **label,
+ char **disk_serial )
{
NTSTATUS status = STATUS_NO_SUCH_DEVICE;
struct dos_drive *drive;
@@ -1673,6 +1710,7 @@ NTSTATUS query_dos_device( int letter, enum device_type *type, enum mountmgr_fs_
if (device) *device = strdupA( disk_device->unix_device );
if (mount_point) *mount_point = strdupA( disk_device->unix_mount );
if (label) *label = strdupW( drive->volume->label );
+ if (disk_serial) *disk_serial = strdupA( disk_device->serial );
status = STATUS_SUCCESS;
break;
}
@@ -1683,7 +1721,7 @@ NTSTATUS query_dos_device( int letter, enum device_type *type, enum mountmgr_fs_
/* query information about an existing unix device, by dev_t */
NTSTATUS query_unix_device( ULONGLONG unix_dev, enum device_type *type,
enum mountmgr_fs_type *fs_type, DWORD *serial, char **device,
- char **mount_point, WCHAR **label )
+ char **mount_point, WCHAR **label, char **disk_serial )
{
NTSTATUS status = STATUS_NO_SUCH_DEVICE;
struct volume *volume;
@@ -1706,6 +1744,7 @@ NTSTATUS query_unix_device( ULONGLONG unix_dev, enum device_type *type,
if (device) *device = strdupA( disk_device->unix_device );
if (mount_point) *mount_point = strdupA( disk_device->unix_mount );
if (label) *label = strdupW( volume->label );
+ if (disk_serial) *disk_serial = strdupA( disk_device->serial );
status = STATUS_SUCCESS;
break;
}
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index cf12f03a73b..bd967793057 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -291,7 +291,7 @@ static NTSTATUS query_unix_drive( void *buff, SIZE_T insize,
{
const struct mountmgr_unix_drive *input = buff;
struct mountmgr_unix_drive *output = NULL;
- char *device, *mount_point;
+ char *device, *mount_point, *disk_serial;
int letter = tolowerW( input->letter );
NTSTATUS status;
DWORD size, type = DEVICE_UNKNOWN, serial;
@@ -303,7 +303,7 @@ static NTSTATUS query_unix_drive( void *buff, SIZE_T insize,
if (!letter)
{
if ((status = query_unix_device( input->unix_dev, &device_type, &fs_type,
- &serial, &device, &mount_point, &label )))
+ &serial, &device, &mount_point, &label, &disk_serial )))
return status;
}
else
@@ -311,7 +311,7 @@ static NTSTATUS query_unix_drive( void *buff, SIZE_T insize,
if (letter < 'a' || letter > 'z') return STATUS_INVALID_PARAMETER;
if ((status = query_dos_device( letter - 'a', &device_type, &fs_type, &serial, &device,
- &mount_point, &label )))
+ &mount_point, &label, &disk_serial )))
return status;
}
@@ -330,6 +330,7 @@ static NTSTATUS query_unix_drive( void *buff, SIZE_T insize,
size = sizeof(*output);
if (device) size += strlen(device) + 1;
if (mount_point) size += strlen(mount_point) + 1;
+ if (disk_serial) size += strlen(disk_serial) + 1;
input = NULL;
output = buff;
@@ -341,6 +342,7 @@ static NTSTATUS query_unix_drive( void *buff, SIZE_T insize,
output->mount_point_offset = 0;
output->device_offset = 0;
output->label_offset = 0;
+ output->disk_serial_offset = 0;
if (size > outsize)
{
@@ -385,6 +387,14 @@ static NTSTATUS query_unix_drive( void *buff, SIZE_T insize,
}
else output->label_offset = 0;
+ if (disk_serial)
+ {
+ output->disk_serial_offset = ptr - (char *)output;
+ strcpy( ptr, disk_serial );
+ ptr += strlen(disk_serial) + 1;
+ }
+ else output->disk_serial_offset = 0;
+
TRACE( "returning %c: dev %s mount %s type %u\n",
letter, debugstr_a(device), debugstr_a(mount_point), type );
@@ -393,6 +403,7 @@ done:
RtlFreeHeap( GetProcessHeap(), 0, device );
RtlFreeHeap( GetProcessHeap(), 0, mount_point );
RtlFreeHeap( GetProcessHeap(), 0, label );
+ RtlFreeHeap( GetProcessHeap(), 0, disk_serial );
return status;
}
diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h
index 82d783a7a04..6462d8719c6 100644
--- a/dlls/mountmgr.sys/mountmgr.h
+++ b/dlls/mountmgr.sys/mountmgr.h
@@ -51,17 +51,17 @@ enum device_type
};
extern NTSTATUS add_volume( const char *udi, const char *device, const char *mount_point,
- enum device_type type, const GUID *guid ) DECLSPEC_HIDDEN;
+ enum device_type type, const GUID *guid, const char *disk_serial ) DECLSPEC_HIDDEN;
extern NTSTATUS remove_volume( const char *udi ) DECLSPEC_HIDDEN;
extern NTSTATUS add_dos_device( int letter, const char *udi, const char *device,
const char *mount_point, enum device_type type, const GUID *guid,
UNICODE_STRING *devname ) DECLSPEC_HIDDEN;
extern NTSTATUS remove_dos_device( int letter, const char *udi ) DECLSPEC_HIDDEN;
extern NTSTATUS query_dos_device( int letter, enum device_type *type, enum mountmgr_fs_type *fs_type, DWORD *serial,
- char **device, char **mount_point, WCHAR **label ) DECLSPEC_HIDDEN;
+ char **device, char **mount_point, WCHAR **label, char **disk_serial ) DECLSPEC_HIDDEN;
extern NTSTATUS query_unix_device( ULONGLONG unix_dev, enum device_type *type,
DWORD *serial, enum mountmgr_fs_type *fs_type, char **device,
- char **mount_point, WCHAR **label ) DECLSPEC_HIDDEN;
+ char **mount_point, WCHAR **label, char **disk_serial ) DECLSPEC_HIDDEN;
extern NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
extern NTSTATUS WINAPI serial_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
extern NTSTATUS WINAPI parallel_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path ) DECLSPEC_HIDDEN;
diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h
index 13829a53954..aa1e7eaee80 100644
--- a/include/ddk/mountmgr.h
+++ b/include/ddk/mountmgr.h
@@ -72,6 +72,7 @@ struct mountmgr_unix_drive
USHORT mount_point_offset;
USHORT device_offset;
USHORT label_offset;
+ USHORT disk_serial_offset;
};
#define IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS CTL_CODE(MOUNTMGRCONTROLTYPE, 64, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
--
2.20.1
1
0
18 May '20
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
v2:
- Remove duplicate error value tests
- Use memcmp
- Test IPv6 flowinfo field too
---
dlls/ws2_32/tests/sock.c | 380 ++++++++++++++-------------------------
1 file changed, 130 insertions(+), 250 deletions(-)
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index b17f076a40..ad8d95013a 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3412,266 +3412,147 @@ end:
closesocket(v6);
}
-static void test_WSAStringToAddressA(void)
+static void test_WSAStringToAddress(void)
{
- INT ret, len;
- SOCKADDR_IN sockaddr;
- SOCKADDR_IN6 sockaddr6;
- int GLE;
-
- CHAR address1[] = "0.0.0.0";
- CHAR address2[] = "127.127.127.127";
- CHAR address3[] = "255.255.255.255";
- CHAR address4[] = "127.127.127.127:65535";
- CHAR address5[] = "255.255.255.255:65535";
- CHAR address6[] = "::1";
- CHAR address7[] = "[::1]";
- CHAR address8[] = "[::1]:65535";
- CHAR address9[] = "2001::1";
-
- len = 0;
- sockaddr.sin_family = AF_INET;
-
- ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( ret == SOCKET_ERROR, "WSAStringToAddressA() succeeded unexpectedly: %d\n",
- WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressA( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( !ret && sockaddr.sin_addr.s_addr == 0,
- "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressA( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
- "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressA( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) ||
- (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
- "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressA( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
- "WSAStringToAddressA() failed unexpectedly: %d\n", WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressA( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) ||
- (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
- "WSAStringToAddressA() failed unexpectedly: %d\n", GLE );
-
- len = sizeof(sockaddr);
-
- ret = WSAStringToAddressA( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
- "WSAStringToAddressA() should have failed with %d\n", GLE );
-
- len = sizeof(sockaddr6);
- memset(&sockaddr6, 0, len);
- sockaddr6.sin6_family = AF_INET6;
-
- ret = WSAStringToAddressA( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
- &len );
- if (ret == SOCKET_ERROR)
+ static struct
{
- win_skip("IPv6 not supported\n");
- return;
+ char input[32];
+ ULONG address;
+ USHORT port;
+ int error;
}
+ ipv4_tests[] =
+ {
+ { "0.0.0.0", 0 },
+ { "127.127.127.127", 0x7f7f7f7f },
+ { "255.255.255.255", 0xffffffff },
+ { "127.127.127.127:65535", 0x7f7f7f7f, 65535 },
+ { "255.255.255.255:65535", 0xffffffff, 65535 },
+ { "2001::1", 0xd1070000, 0, WSAEINVAL },
+ };
+ static struct
+ {
+ char input[64];
+ USHORT address[8];
+ USHORT port;
+ int error;
+ }
+ ipv6_tests[] =
+ {
+ { "::1", { 0, 0, 0, 0, 0, 0, 0, 0x100 } },
+ { "[::1]", { 0, 0, 0, 0, 0, 0, 0, 0x100 } },
+ { "[::1]:65535", { 0, 0, 0, 0, 0, 0, 0, 0x100 }, 0xffff },
+ { "2001::1", { 0x120, 0, 0, 0, 0, 0, 0, 0x100 } },
+ { "::1]:65535", { 0, 0, 0, 0, 0, 0, 0, 0x100 }, 0, WSAEINVAL },
+ { "001::1", { 0x100, 0, 0, 0, 0, 0, 0, 0x100 } },
+ };
- GLE = WSAGetLastError();
- ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
-
- len = sizeof(sockaddr6);
- memset(&sockaddr6, 0, len);
- sockaddr6.sin6_family = AF_INET6;
-
- ret = WSAStringToAddressA( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
- &len );
- GLE = WSAGetLastError();
- ok( ret == 0, "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
-
- len = sizeof(sockaddr6);
- memset(&sockaddr6, 0, len);
- sockaddr6.sin6_family = AF_INET6;
-
- ret = WSAStringToAddressA( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
- &len );
- GLE = WSAGetLastError();
- ok( ret == 0 && sockaddr6.sin6_port == 0xffff,
- "WSAStringToAddressA() failed for IPv6 address: %d\n", GLE);
-
- len = sizeof(sockaddr6);
-
- ret = WSAStringToAddressA( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
- "WSAStringToAddressW() should have failed with %d\n", GLE );
-
- len = sizeof(sockaddr6);
-
- ret = WSAStringToAddressA( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
- "WSAStringToAddressW() should have failed with %d\n", GLE );
-}
-
-static void test_WSAStringToAddressW(void)
-{
- INT ret, len;
- SOCKADDR_IN sockaddr, *sin;
+ WCHAR inputW[64];
+ INT len, ret, expected_ret;
+ short expected_family;
+ SOCKADDR_IN sockaddr;
SOCKADDR_IN6 sockaddr6;
- SOCKADDR_STORAGE sockaddr_storage;
- int GLE;
-
- WCHAR address1[] = { '0','.','0','.','0','.','0', 0 };
- WCHAR address2[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7', 0 };
- WCHAR address3[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', 0 };
- WCHAR address4[] = { '1','2','7','.','1','2','7','.','1','2','7','.','1','2','7',
- ':', '6', '5', '5', '3', '5', 0 };
- WCHAR address5[] = { '2','5','5','.','2','5','5','.','2','5','5','.','2','5','5', ':',
- '6', '5', '5', '3', '5', 0 };
- WCHAR address6[] = {':',':','1','\0'};
- WCHAR address7[] = {'[',':',':','1',']','\0'};
- WCHAR address8[] = {'[',':',':','1',']',':','6','5','5','3','5','\0'};
- WCHAR address9[] = {'2','0','0','1',':',':','1','\0'};
+ int i, j;
len = 0;
- sockaddr.sin_family = AF_INET;
-
- ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( ret == SOCKET_ERROR, "WSAStringToAddressW() failed unexpectedly: %d\n",
- WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressW( address1, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( !ret && sockaddr.sin_addr.s_addr == 0,
- "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
+ WSASetLastError( 0 );
+ ret = WSAStringToAddressA( ipv4_tests[0].input, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
+ ok( ret == SOCKET_ERROR, "WSAStringToAddressA() returned %d, expected SOCKET_ERROR\n", ret );
+ ok( WSAGetLastError() == WSAEFAULT, "WSAStringToAddress() gave error %d, expected WSAEFAULT\n", WSAGetLastError() );
- ret = WSAStringToAddressW( address2, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f,
- "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressW( address3, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff) ||
- (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
- "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressW( address4, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( !ret && sockaddr.sin_addr.s_addr == 0x7f7f7f7f && sockaddr.sin_port == 0xffff,
- "WSAStringToAddressW() failed unexpectedly: %d\n", WSAGetLastError() );
-
- len = sizeof(sockaddr);
- sockaddr.sin_port = 0;
- sockaddr.sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- ok( (ret == 0 && sockaddr.sin_addr.s_addr == 0xffffffff && sockaddr.sin_port == 0xffff) ||
- (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
- "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
-
- /* Test with a larger buffer than necessary */
- len = sizeof(sockaddr_storage);
- sin = (SOCKADDR_IN *)&sockaddr_storage;
- sin->sin_port = 0;
- sin->sin_addr.s_addr = 0;
-
- ret = WSAStringToAddressW( address5, AF_INET, NULL, (SOCKADDR*)sin, &len );
- ok( (ret == 0 && sin->sin_addr.s_addr == 0xffffffff && sin->sin_port == 0xffff) ||
- (ret == SOCKET_ERROR && (GLE == ERROR_INVALID_PARAMETER || GLE == WSAEINVAL)),
- "WSAStringToAddressW() failed unexpectedly: %d\n", GLE );
- ok( len == sizeof(SOCKADDR_IN), "unexpected length %d\n", len );
-
- len = sizeof(sockaddr);
-
- ret = WSAStringToAddressW( address9, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
- "WSAStringToAddressW() should have failed with %d\n", GLE );
-
- len = sizeof(sockaddr6);
- memset(&sockaddr6, 0, len);
- sockaddr6.sin6_family = AF_INET6;
-
- ret = WSAStringToAddressW( address6, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
- &len );
- if (ret == SOCKET_ERROR)
+ for (i = 0; i < 2; i++)
{
- win_skip("IPv6 not supported\n");
- return;
- }
-
- GLE = WSAGetLastError();
- ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
-
- len = sizeof(sockaddr6);
- memset(&sockaddr6, 0, len);
- sockaddr6.sin6_family = AF_INET6;
-
- ret = WSAStringToAddressW( address7, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
- &len );
- GLE = WSAGetLastError();
- ok( ret == 0, "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
-
- len = sizeof(sockaddr6);
- memset(&sockaddr6, 0, len);
- sockaddr6.sin6_family = AF_INET6;
-
- ret = WSAStringToAddressW( address8, AF_INET6, NULL, (SOCKADDR*)&sockaddr6,
- &len );
- GLE = WSAGetLastError();
- ok( ret == 0 && sockaddr6.sin6_port == 0xffff,
- "WSAStringToAddressW() failed for IPv6 address: %d\n", GLE);
-
- len = sizeof(sockaddr6);
+ for (j = 0; j < ARRAY_SIZE(ipv4_tests); j++)
+ {
+ len = sizeof(sockaddr);
+ memset( &sockaddr, 0xab, len );
- ret = WSAStringToAddressW( address7 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
- "WSAStringToAddressW() should have failed with %d\n", GLE );
+ WSASetLastError( 0 );
+ if (i == 0)
+ {
+ ret = WSAStringToAddressA( ipv4_tests[j].input, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
+ }
+ else
+ {
+ MultiByteToWideChar( CP_ACP, 0, ipv4_tests[j].input, -1, inputW, ARRAY_SIZE(inputW) );
+ ret = WSAStringToAddressW( inputW, AF_INET, NULL, (SOCKADDR*)&sockaddr, &len );
+ }
+ expected_ret = ipv4_tests[j].error ? SOCKET_ERROR : 0;
+ expected_family = ipv4_tests[j].error ? 0 : AF_INET;
+ ok( ret == expected_ret,
+ "WSAStringToAddress(%s) returned %d, expected %d\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), ret, expected_ret );
+ ok( WSAGetLastError() == ipv4_tests[j].error,
+ "WSAStringToAddress(%s) gave error %d, expected %d\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), WSAGetLastError(), ipv4_tests[j].error );
+todo_wine_if(ipv4_tests[j].error)
+ ok( sockaddr.sin_family == expected_family,
+ "WSAStringToAddress(%s) gave family %d, expected %d\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_family, expected_family );
+todo_wine_if(ipv4_tests[j].error)
+ ok( sockaddr.sin_addr.s_addr == ipv4_tests[j].address,
+ "WSAStringToAddress(%s) gave address %08x, expected %08x\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_addr.s_addr, ipv4_tests[j].address );
+ ok( sockaddr.sin_port == ipv4_tests[j].port,
+ "WSAStringToAddress(%s) gave port %04x, expected %04x\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), sockaddr.sin_port, ipv4_tests[j].port );
+ }
- len = sizeof(sockaddr6);
+ for (j = 0; j < ARRAY_SIZE(ipv6_tests); j++)
+ {
+ len = sizeof(sockaddr6);
+ memset( &sockaddr6, 0xab, len );
- ret = WSAStringToAddressW( address8 + 1, AF_INET6, NULL, (SOCKADDR*)&sockaddr, &len );
- GLE = WSAGetLastError();
- ok( (ret == SOCKET_ERROR && GLE == WSAEINVAL),
- "WSAStringToAddressW() should have failed with %d\n", GLE );
+ WSASetLastError( 0 );
+ if (i == 0)
+ {
+ ret = WSAStringToAddressA( ipv6_tests[j].input, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, &len );
+ }
+ else
+ {
+ MultiByteToWideChar( CP_ACP, 0, ipv6_tests[j].input, -1, inputW, ARRAY_SIZE(inputW) );
+ ret = WSAStringToAddressW( inputW, AF_INET6, NULL, (SOCKADDR*)&sockaddr6, &len );
+ }
+ if (j == 0 && ret == SOCKET_ERROR)
+ {
+ win_skip("IPv6 not supported\n");
+ break;
+ }
+ expected_ret = ipv6_tests[j].error ? SOCKET_ERROR : 0;
+ expected_family = ipv6_tests[j].error ? 0 : AF_INET6;
+ ok( ret == expected_ret,
+ "WSAStringToAddress(%s) returned %d, expected %d\n",
+ wine_dbgstr_a( ipv6_tests[j].input ), ret, expected_ret );
+ ok( WSAGetLastError() == ipv6_tests[j].error,
+ "WSAStringToAddress(%s) gave error %d, expected %d\n",
+ wine_dbgstr_a( ipv6_tests[j].input ), WSAGetLastError(), ipv6_tests[j].error );
+todo_wine_if(ipv6_tests[j].error)
+ ok( sockaddr6.sin6_family == expected_family,
+ "WSAStringToAddress(%s) gave family %d, expected %d\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_family );
+todo_wine_if(ipv6_tests[j].error)
+ ok( memcmp(&sockaddr6.sin6_addr, ipv6_tests[j].address, sizeof(sockaddr6.sin6_addr)) == 0,
+ "WSAStringToAddress(%s) gave address %x:%x:%x:%x:%x:%x:%x:%x, expected %x:%x:%x:%x:%x:%x:%x:%x\n",
+ wine_dbgstr_a( ipv6_tests[j].input ),
+ sockaddr6.sin6_addr.s6_words[0], sockaddr6.sin6_addr.s6_words[1],
+ sockaddr6.sin6_addr.s6_words[2], sockaddr6.sin6_addr.s6_words[3],
+ sockaddr6.sin6_addr.s6_words[4], sockaddr6.sin6_addr.s6_words[5],
+ sockaddr6.sin6_addr.s6_words[6], sockaddr6.sin6_addr.s6_words[7],
+ ipv6_tests[j].address[0], ipv6_tests[j].address[1],
+ ipv6_tests[j].address[2], ipv6_tests[j].address[3],
+ ipv6_tests[j].address[4], ipv6_tests[j].address[5],
+ ipv6_tests[j].address[6], ipv6_tests[j].address[7] );
+ ok( sockaddr6.sin6_scope_id == 0,
+ "WSAStringToAddress(%s) gave scope %d, expected 0\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_scope_id );
+ ok( sockaddr6.sin6_port == ipv6_tests[j].port,
+ "WSAStringToAddress(%s) gave port %04x, expected %04x\n",
+ wine_dbgstr_a( ipv6_tests[j].input ), sockaddr6.sin6_port, ipv6_tests[j].port );
+ ok( sockaddr6.sin6_flowinfo == 0,
+ "WSAStringToAddress(%s) gave flowinfo %d, expected 0\n",
+ wine_dbgstr_a( ipv4_tests[j].input ), sockaddr6.sin6_flowinfo );
+ }
+ }
}
static DWORD WINAPI SelectReadThread(void *param)
@@ -11677,8 +11558,7 @@ START_TEST( sock )
test_WSAAddressToStringA();
test_WSAAddressToStringW();
- test_WSAStringToAddressA();
- test_WSAStringToAddressW();
+ test_WSAStringToAddress();
test_errors();
test_listen();
--
2.26.2
2
2
18 May '20
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/shell32/tests/shelldispatch.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/dlls/shell32/tests/shelldispatch.c b/dlls/shell32/tests/shelldispatch.c
index e9948ae6305..c1e3fbcdaf1 100644
--- a/dlls/shell32/tests/shelldispatch.c
+++ b/dlls/shell32/tests/shelldispatch.c
@@ -1018,6 +1018,7 @@ static void test_ShellWindows(void)
{
IShellWindows *shellwindows;
LONG cookie, cookie2, ret;
+ ITEMIDLIST *pidl;
IDispatch *disp;
VARIANT v, v2;
HRESULT hr;
@@ -1061,9 +1062,35 @@ todo_wine {
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(cookie2 != 0 && cookie2 != cookie, "got %d\n", cookie2);
}
+
+ pidl = ILCreateFromPathA("C:\\");
+ V_VT(&v) = VT_ARRAY | VT_UI1;
+ V_ARRAY(&v) = SafeArrayCreateVector(VT_UI1, 0, ILGetSize(pidl));
+ memcpy(V_ARRAY(&v)->pvData, pidl, ILGetSize(pidl));
+
+ VariantInit(&v2);
+ hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!ret, "Got window %#x.\n", ret);
+ ok(!disp, "Got IDispatch %p.\n", &disp);
+
+ hr = IShellWindows_OnNavigate(shellwindows, cookie, &v);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+ hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
+ todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+ todo_wine ok(ret == (LONG)(LONG_PTR)hwnd, "Expected %p, got %#x.\n", hwnd, ret);
+ ok(!disp, "Got IDispatch %p.\n", &disp);
+
hr = IShellWindows_Revoke(shellwindows, cookie);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_EXPLORER, &ret, 0, &disp);
+ todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ ok(!ret, "Got window %#x.\n", ret);
+ ok(!disp, "Got IDispatch %p.\n", &disp);
+
hr = IShellWindows_Revoke(shellwindows, cookie2);
todo_wine
ok(hr == S_OK, "got 0x%08x\n", hr);
--
2.26.2
1
4
18 May '20
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/shlwapi/tests/url.c | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c
index d30737f60a4..2e1df632016 100644
--- a/dlls/shlwapi/tests/url.c
+++ b/dlls/shlwapi/tests/url.c
@@ -1052,6 +1052,22 @@ static void test_UrlCanonicalizeA(void)
urllen = lstrlenA(winehqA);
+ /* Parameter checks */
+ dwSize = ARRAY_SIZE(szReturnUrl);
+ hr = pUrlCanonicalizeA(NULL, szReturnUrl, &dwSize, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+ dwSize = ARRAY_SIZE(szReturnUrl);
+ hr = pUrlCanonicalizeA(winehqA, NULL, &dwSize, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+ hr = pUrlCanonicalizeA(winehqA, szReturnUrl, NULL, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+ dwSize = 0;
+ hr = pUrlCanonicalizeA(winehqA, szReturnUrl, &dwSize, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
/* buffer has no space for the result */
dwSize=urllen-1;
memset(szReturnUrl, '#', urllen+4);
@@ -1137,6 +1153,22 @@ static void test_UrlCanonicalizeW(void)
}
urllen = lstrlenW(winehqW);
+ /* Parameter checks */
+ dwSize = ARRAY_SIZE(szReturnUrl);
+ hr = pUrlCanonicalizeW(NULL, szReturnUrl, &dwSize, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+ dwSize = ARRAY_SIZE(szReturnUrl);
+ hr = pUrlCanonicalizeW(winehqW, NULL, &dwSize, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+ hr = pUrlCanonicalizeW(winehqW, szReturnUrl, NULL, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
+ dwSize = 0;
+ hr = pUrlCanonicalizeW(winehqW, szReturnUrl, &dwSize, URL_UNESCAPE);
+ ok(hr == E_INVALIDARG, "Got unexpected hr %#x.\n", hr);
+
/* buffer has no space for the result */
dwSize = (urllen-1);
memset(szReturnUrl, '#', (urllen+4) * sizeof(WCHAR));
--
2.25.1
1
0
[PATCH 1/2] kernelbase: Check NULL canonicalized_len parameter in UrlCanonicalizeW().
by Zhiyi Zhang 18 May '20
by Zhiyi Zhang 18 May '20
18 May '20
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49175
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
dlls/kernelbase/path.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/kernelbase/path.c b/dlls/kernelbase/path.c
index 29887a23537..d7e2f0a2347 100644
--- a/dlls/kernelbase/path.c
+++ b/dlls/kernelbase/path.c
@@ -3521,7 +3521,7 @@ HRESULT WINAPI UrlCanonicalizeW(const WCHAR *src_url, WCHAR *canonicalized, DWOR
TRACE("%s, %p, %p, %#x\n", wine_dbgstr_w(src_url), canonicalized, canonicalized_len, flags);
- if (!src_url || !canonicalized || !canonicalized || !*canonicalized_len)
+ if (!src_url || !canonicalized || !canonicalized_len || !*canonicalized_len)
return E_INVALIDARG;
if (!*src_url)
--
2.25.1
1
0
18 May '20
From: Vincent Povirk <vincent(a)codeweavers.com>
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
---
dlls/gdiplus/metafile.c | 8 +++++++-
dlls/gdiplus/tests/metafile.c | 20 ++++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 3fdbc69fdc5..f0dacab4987 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -4028,9 +4028,15 @@ GpStatus WINGDIPAPI GdipSetMetafileDownLevelRasterizationLimit(GpMetafile *metaf
{
TRACE("(%p,%u)\n", metafile, limitDpi);
- if (!metafile)
+ if (limitDpi == 0)
+ limitDpi = 96;
+
+ if (!metafile || limitDpi < 10)
return InvalidParameter;
+ if (!metafile->record_dc)
+ return WrongState;
+
metafile->limit_dpi = limitDpi;
return Ok;
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index b9dc33fce35..3ffdb7b0e91 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -428,6 +428,23 @@ static void test_empty(void)
expect(Ok, stat);
ok(limit_dpi == 255, "limit_dpi was %d\n", limit_dpi);
+ stat = GdipSetMetafileDownLevelRasterizationLimit(metafile, 0);
+ expect(Ok, stat);
+
+ limit_dpi = 0xdeadbeef;
+ stat = GdipGetMetafileDownLevelRasterizationLimit(metafile, &limit_dpi);
+ expect(Ok, stat);
+ ok(limit_dpi == 96, "limit_dpi was %d\n", limit_dpi);
+
+ stat = GdipSetMetafileDownLevelRasterizationLimit(metafile, 1);
+ expect(InvalidParameter, stat);
+
+ stat = GdipSetMetafileDownLevelRasterizationLimit(metafile, 9);
+ expect(InvalidParameter, stat);
+
+ stat = GdipSetMetafileDownLevelRasterizationLimit(metafile, 10);
+ expect(Ok, stat);
+
stat = GdipGetHemfFromMetafile(metafile, &hemf);
expect(InvalidParameter, stat);
@@ -445,6 +462,9 @@ static void test_empty(void)
expect(WrongState, stat);
expect(0xdeadbeef, limit_dpi);
+ stat = GdipSetMetafileDownLevelRasterizationLimit(metafile, 200);
+ expect(WrongState, stat);
+
check_metafile(metafile, empty_records, "empty metafile", dst_points, &frame, UnitPixel);
sync_metafile(&metafile, "empty.emf");
--
2.17.1
1
0
[PATCH 1/2] gdiplus: Implement GdipGetMetafileDownLevelRasterizationLimit.
by Esme Povirk 18 May '20
by Esme Povirk 18 May '20
18 May '20
From: Vincent Povirk <vincent(a)codeweavers.com>
Signed-off-by: Vincent Povirk <vincent(a)codeweavers.com>
---
Supersedes: 185287,185288
dlls/gdiplus/gdiplus.spec | 2 +-
dlls/gdiplus/gdiplus_private.h | 1 +
dlls/gdiplus/metafile.c | 22 ++++++++++++++++++++++
dlls/gdiplus/tests/metafile.c | 25 +++++++++++++++++++++++++
include/gdiplusflat.h | 1 +
5 files changed, 50 insertions(+), 1 deletion(-)
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 43dc0a82d2b..a722ab7b237 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -298,7 +298,7 @@
298 stdcall GdipGetLogFontA(ptr ptr ptr)
299 stdcall GdipGetLogFontW(ptr ptr ptr)
300 stdcall GdipGetMatrixElements(ptr ptr)
-301 stub GdipGetMetafileDownLevelRasterizationLimit
+301 stdcall GdipGetMetafileDownLevelRasterizationLimit(ptr ptr)
302 stdcall GdipGetMetafileHeaderFromEmf(ptr ptr)
303 stdcall GdipGetMetafileHeaderFromFile(wstr ptr)
304 stdcall GdipGetMetafileHeaderFromMetafile(ptr ptr)
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 39caf1a91e4..9e90a5d28cf 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -407,6 +407,7 @@ struct GpMetafile{
BOOL auto_frame; /* If true, determine the frame automatically */
GpPointF auto_frame_min, auto_frame_max;
DWORD next_object_id;
+ UINT limit_dpi;
/* playback */
GpGraphics *playback_graphics;
diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index 2cb1c5f2847..3fdbc69fdc5 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -810,6 +810,7 @@ GpStatus WINGDIPAPI GdipRecordMetafile(HDC hdc, EmfType type, GDIPCONST GpRectF
(*metafile)->comment_data = NULL;
(*metafile)->comment_data_size = 0;
(*metafile)->comment_data_length = 0;
+ (*metafile)->limit_dpi = 96;
(*metafile)->hemf = NULL;
list_init(&(*metafile)->containers);
@@ -4006,11 +4007,32 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromStream(IStream *stream,
return Ok;
}
+GpStatus WINGDIPAPI GdipGetMetafileDownLevelRasterizationLimit(GDIPCONST GpMetafile *metafile,
+ UINT *limitDpi)
+{
+ TRACE("(%p,%p)\n", metafile, limitDpi);
+
+ if (!metafile || !limitDpi)
+ return InvalidParameter;
+
+ if (!metafile->record_dc)
+ return WrongState;
+
+ *limitDpi = metafile->limit_dpi;
+
+ return Ok;
+}
+
GpStatus WINGDIPAPI GdipSetMetafileDownLevelRasterizationLimit(GpMetafile *metafile,
UINT limitDpi)
{
TRACE("(%p,%u)\n", metafile, limitDpi);
+ if (!metafile)
+ return InvalidParameter;
+
+ metafile->limit_dpi = limitDpi;
+
return Ok;
}
diff --git a/dlls/gdiplus/tests/metafile.c b/dlls/gdiplus/tests/metafile.c
index 49adbf71e30..b9dc33fce35 100644
--- a/dlls/gdiplus/tests/metafile.c
+++ b/dlls/gdiplus/tests/metafile.c
@@ -379,6 +379,7 @@ static void test_empty(void)
static const GpRectF frame = {0.0, 0.0, 100.0, 100.0};
static const GpPointF dst_points[3] = {{0.0,0.0},{100.0,0.0},{0.0,100.0}};
static const WCHAR description[] = {'w','i','n','e','t','e','s','t',0};
+ UINT limit_dpi;
hdc = CreateCompatibleDC(0);
@@ -408,6 +409,25 @@ static void test_empty(void)
if (stat != Ok)
return;
+ stat = GdipGetMetafileDownLevelRasterizationLimit(metafile, NULL);
+ expect(InvalidParameter, stat);
+
+ stat = GdipGetMetafileDownLevelRasterizationLimit(NULL, &limit_dpi);
+ expect(InvalidParameter, stat);
+
+ limit_dpi = 0xdeadbeef;
+ stat = GdipGetMetafileDownLevelRasterizationLimit(metafile, &limit_dpi);
+ expect(Ok, stat);
+ ok(limit_dpi == 96, "limit_dpi was %d\n", limit_dpi);
+
+ stat = GdipSetMetafileDownLevelRasterizationLimit(metafile, 255);
+ expect(Ok, stat);
+
+ limit_dpi = 0xdeadbeef;
+ stat = GdipGetMetafileDownLevelRasterizationLimit(metafile, &limit_dpi);
+ expect(Ok, stat);
+ ok(limit_dpi == 255, "limit_dpi was %d\n", limit_dpi);
+
stat = GdipGetHemfFromMetafile(metafile, &hemf);
expect(InvalidParameter, stat);
@@ -420,6 +440,11 @@ static void test_empty(void)
stat = GdipDeleteGraphics(graphics);
expect(Ok, stat);
+ limit_dpi = 0xdeadbeef;
+ stat = GdipGetMetafileDownLevelRasterizationLimit(metafile, &limit_dpi);
+ expect(WrongState, stat);
+ expect(0xdeadbeef, limit_dpi);
+
check_metafile(metafile, empty_records, "empty metafile", dst_points, &frame, UnitPixel);
sync_metafile(&metafile, "empty.emf");
diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h
index ed0f498483e..b7da5427d4e 100644
--- a/include/gdiplusflat.h
+++ b/include/gdiplusflat.h
@@ -545,6 +545,7 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmfFile(GDIPCONST WCHAR*, GDIPCONST Wm
GpMetafile**);
GpStatus WINGDIPAPI GdipCreateMetafileFromFile(GDIPCONST WCHAR*,GpMetafile**);
GpStatus WINGDIPAPI GdipCreateMetafileFromStream(IStream*,GpMetafile**);
+GpStatus WINGDIPAPI GdipGetMetafileDownLevelRasterizationLimit(GDIPCONST GpMetafile*,UINT*);
GpStatus WINGDIPAPI GdipGetHemfFromMetafile(GpMetafile*,HENHMETAFILE*);
GpStatus WINGDIPAPI GdipPlayMetafileRecord(GDIPCONST GpMetafile*,EmfPlusRecordType,UINT,UINT,GDIPCONST BYTE*);
GpStatus WINGDIPAPI GdipSetMetafileDownLevelRasterizationLimit(GpMetafile*,UINT);
--
2.17.1
1
0