Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • wine/wine
  • rbernon/wine
  • stefan/wine
  • FireBurn/wine
  • alesliehughes/wine
  • zhiyi/wine
  • huw/wine
  • jsikorski/wine
  • hmc/wine
  • dadangnh/wine
  • epo/wine
  • dlesho/wine
  • DarkShadow44/wine
  • iamahuman/wine
  • jacek/wine
  • mstorsjo/wine
  • gofman/wine
  • alexhenrie/wine
  • giomasce/wine
  • tclem/wine
  • besentv/wine
  • dlehman25/wine
  • aeikum/wine
  • cdavis5e/wine
  • sbaars/wine
  • baskanov/wine
  • pperdigao/wine
  • DavidHusicka/wine
  • DadSchoorse/wine
  • gverm/wine
  • bshanks/wine
  • gonzoMD/wine
  • Mystral/wine
  • tmatthies/wine
  • zlice/wine
  • AndreRH/wine
  • madewokherd/wine
  • zfigura/wine
  • fgouget/wine
  • nsivov/wine
  • ElementalWarrior/wine
  • piotr/wine
  • timozuccarello/wine
  • DavidCurtiss/wine
  • cmcadams/wine
  • davidebeatrici/wine
  • hans/wine
  • insn/wine
  • danrm/wine
  • jklemann/wine
  • saedo/wine
  • sgwaki/wine
  • puetzk/wine
  • bernhardu/wine
  • ReDress/wine
  • jlucfarias/wine
  • sloper42/wine
  • ivyl/wine
  • zhui/wine
  • julliard/wine
  • ClearlyClaire/wine
  • Alexander-Wilms/wine
  • rndtrash/wine
  • redmcg/wine
  • jkfloris/wine
  • maljaf/wine
  • Tuupertunut/wine
  • bsjeon/wine
  • tati/wine
  • whydoubt/wine
  • doitsujin/wine
  • shaunren/wine
  • szanni/wine
  • tobi.goergens/wine-cabinet-patch
  • winspool/wine
  • olivierfrdierick/wine
  • linkmauve/wine
  • jin-king1/wine
  • yeyeshun/wine
  • sulix/wine
  • bgc/wine
  • fanwenjie/wine
  • IncubusRK/wine
  • js6pak/wine
  • AurimasF/wine
  • etaash.mathamsetty/wine
  • hverbeet/wine
  • Fox2Code/wine
  • jhol/wine
  • jrueger/wine
  • afrantzis/wine
  • lauri.kentta/wine
  • ehoover/wine
  • cdenton/wine
  • jkloetzke/wine
  • baryluk/wine
  • restet/wine-personal
  • orudge/wine
  • Gcenx/wine
  • mstefani/wine
  • hibbsncc1701/wine
  • jchw/wine
  • moceap/wine
  • Skryptonyte/wine
  • marzent/wine
  • msmeissn/wine
  • learn-more/wine
  • logos128/wine
  • xe/wine
  • florian-kuebler/wine
  • eason329/wine
  • gang65/wine
  • binarymaster/wine
  • nbosio1001/wine
  • sh.owais95/wine
  • yaoyuan.0553/wine
  • AnthonyLaurienti/wine
  • mivanchev/wine
  • Hi-Angel/wine
  • vt/wine
  • wyrquill/wine
  • waynus/wine
  • wuliande/wine
  • yao.yuan.wn/wine
  • K1K1/wine
  • lukehutch1027/wine
  • etang-cw/wine
  • Josueblanco/wine
  • jplotz/wine
  • j20001970/wine
  • jsm174/wine
  • aricstewart/wine
  • uncoveryoureyestheresnosun/wine
  • VitorRamos/wine
  • 0e4ef622/wine
  • tj4048750/wine
  • xantares/wine
  • maxfigura/wine
  • sanane/wine
  • juniorjr9345/wine
  • lucaspereira1234/wine
  • gerald/wine
  • lepemiguel32/wine
  • caibb2018/wine
  • CNB_Kevin/wine
  • thc13/wine
  • jaihysc/wine
  • youngsecurity/wine
  • chendeqiang1024/wine
  • rhendric/wine
  • databoose/wine
  • memory-thrasher/wine
  • salman.tajik22/wine
  • CowFroggers/wine
  • kbdharun/wine
  • dreamer/wine
  • babyjoey711/wine
  • ripxorip/wine
  • PSzczepanski1996/wine
  • steveshe006/wine
  • joshua/wine
  • cmccarthy/wine
  • tomjansen/wine
  • sonyps5201314/wine
  • katelynnking4281/wine
  • dhary686/wine
  • mathematician/wine
  • rhabacker/wine
  • steveschnepp/wine
  • nekotekina/wine
  • Aaron1011/wine
  • catsout/wine
  • kasper93/wine
  • beef331/wine
  • ESD/wine
  • sarosib/wine
  • ghurmcardash/wine
  • AMZN-hgoffin/wine
  • gtmikw/wine
  • Keming/wine
  • dpjh747-gl/wine
  • tzluo/wine
  • rfz/wine
  • illia.a.polishchuk/wine
  • new_kleth/wine
  • serkan-maker/wine
  • w-flo/wine
  • mikayahlevi/wine
  • nulleve/wine
  • pgruebele/wine
  • athiele/wine
  • paparaha4/wine
  • novenary/wine
  • Plavil/wine
  • longjunyu/wine
  • chrisli/wine
  • samkottler/wine
  • danielzgtg/wine
  • twcassel/wine
  • guo/wine
  • didier31/wine
  • Zhaoyi/wine
  • twhitehead/wine
  • svyatpro/wine
  • infyquest/wine-iq-devel
  • sebres/wine
  • endrift/wine
  • zhengbl/wine
  • joelikeyan/wine
  • IsaacMarovitz/wine
  • LouiseTheGoldenGoddess/wine
  • SergeGautherie/wine
  • Klittiklatsch/wine
  • ldhacker/wine
  • dk1006498/wine
  • ishitatsuyuki/wine
  • h3c/wine
  • wincenty.bandyta41/wine
  • ayhankus482/wine
  • q4a/wine
  • mjgarton/wine
  • agusev/wine
  • vovams/wine
  • shardulsb08/wine
  • lylythechosenone/wine
  • artemist/wine
  • dropbear/wine
  • Cherser-s/wine
  • smayr/wine
  • loveptong/wine
  • chendeqiang/wine
  • gaber139/wine
  • shytzedaka/wine
  • ghkmufc/wine
  • TornadoCookie/wine
  • klownwolfman/wine
  • bylaws/wine
  • vitorhnn/wine
  • mide1337/wine
  • mewinkler/wine
  • firelzrd/wine
  • Samsuper/wine
  • kkartaltepe/wine
  • petravion/wine
  • Maaka00524/jacob-wine
  • petrathekat/wine
  • dj/wine
  • liam-middlebrook/wine
  • padolkarlucky/wine
  • maarten/wine
  • yhd986/wine
  • linkmecry/wine
  • tehrantoday/wine
  • xuxin12345/wine
  • dmjc/wine
  • sedwards/wine
  • hanslehnert/wine
  • 3ts75/wine
  • EkaterinePapava/wine
  • lav/wine
  • lygstate/wine
  • mxkrsv/wine
  • xutaxkamay/wine
  • cbialorucki/wine
  • yshui/wine
  • baikaishiuc/wine
  • HuwCampbell/wine
  • llde/wine
  • rockdrilla/wine
  • aidanhs/wine
  • SwimmingTiger/wine
  • fvalasiad/wine
  • zsoltiv/wine
  • mailnew4ster/wine
  • ake.rehnman/wine
  • IDocin/wine
  • dmitry/wine
  • Cthuflu/wine
  • corngood/wine
  • whindsaks/wine
  • telans/wine
  • DmitrySokolov/wine
  • Pospelove/wine
  • ellingtonsantos/wine
  • roro/wine
  • wurenny/wine
  • KokoseiJ/wine
  • amurzeau/wine
  • spazzymoto/wine
  • searchingin/wine
  • marler8997/wine
  • Alcaro/wine
  • aunali1/wine
  • snaccslocc420/wine
  • ajkhoury/wine
  • qsniyg/wine
  • Matheus-TestUser1/wine
  • adamrehn/wine
  • brobston/wine
  • aalyaev/wine
  • thongthai/wine
  • j.bayer1988/wine
  • skitt/wine
  • benben/wine
  • ahmouse15/wine
  • achurch/wine
  • mfaqiri2/wine
  • yseo/wine
  • kingjinni/wine
  • userid0x0/wine
  • titan/wine
  • Komoszek/wine
  • GamzeeRakoon/wine
  • joanluc/wine
  • Alan/wine
  • meshine/wine
  • EBADF/wine
  • vibhavp/wine
  • quininer/wine
  • pawelulita/wine
  • muek2211/wine
  • chenhaoyang/wine
  • nishiyama/wine
  • silviuxgaming/wine
  • nell/wine
  • 29jm/wine
  • arilou/wine
  • Mini-Gaunt/wine
  • DodoGTA/wine
  • davispuh/wine
  • mzent/wine
  • arakmar/wine
  • number201724/wine
  • yhd986/wine-up
  • rpisl/wine
  • zp1/wine-zp-cs-464
  • h0tc0d3/wine
  • Snowiiii/wine
  • gabrielb/wine
  • PureBulb/wine
  • OO/wine
  • Clara/wine
  • Saancreed/wine
  • enolp/wine
  • arthunix/wine
  • halfline/wine
  • carlo-bramini/wine
  • jfmu/wine
  • russelltg/wine
  • ntay/wine
  • YellowOnion/wine
  • niversesu/wine
  • gilvbp/wine
  • tingling0072/wine
  • DandD1517/wine
  • rastos/add-GetAnycastIpAddressTable
  • gnif/wine
  • gibsonpil/wine
  • antenabr2/wine
  • kvashis/wine
  • CKolle/wine
  • kubni/wine
  • ten0s/wine
  • Yvonne8873/wine
  • kurikaesu/wine
  • minggr/wine
  • JohnSebastienNadeau/wine
  • karshnicholas/wine
  • SamB/wine
  • apgrc/wine
  • Samiklom/wine
  • llyyr/wine
  • nberner/wine
  • katharinechui/wine
  • kirill.zhumarin/wine
  • vaxerski/wine
  • infiniteloop/wine
  • K0bin/wine
  • arethusa/wine
  • mrdeathjr28/wine
  • dank_meme/wine
  • dh/wine
  • tuomasjjrasanen/wine
  • mmcdonnell/wine
  • mxnny00/wine-manjaro-arch-compatibility
  • Joan/wine
  • g.mo.alcauter/wine
  • zhenbo_li/wine
  • tsmx/wine
  • xaqumin/wine
  • peterjc123/wine
  • ruslangaripov/wine
  • blyss/wine
  • xanathar/wine
  • michael.bond/wine
  • Quix0r/wine
  • sinisa.susnjar/wine
  • Rapid/wine
  • theli.ua/wine
  • shaun.din/wine
  • zhaohongxin/wine
  • dylan.eskew/wine
  • humbertoperezs991/wine
  • vaevi/wine
  • Riesi/wine
  • francisdb/wine
  • 1480c1/wine
  • trcrsired/wine
  • npatt/wine
  • muhammmadalli/wine9.0
  • Czahrien/wine
  • nilsen.jonas/wine
  • underdogest/wine
  • djordjem/wine
  • frubin/wine
  • LucasChollet/wine
  • lipengfei-loongson/wine
  • JacobCzekalla/wine-fork-jacob
  • omar_elantil/wine
  • lumarel/wine
  • principeagustin/wine
  • gotzl/wine
  • OneTester250376/wine
  • austin987/wine
  • unknown62627/wine
  • navi/wine
  • somedevfox/wine
  • notaz/wine
  • fcasas/wine
  • Asteroz/wine
  • MariusSchiffer/wine
  • kevinrmartinez/wine-devel
  • St1gven/wine
  • maarten256/wine
  • rcstarr87/wine
  • tinozzo123/wine
  • GermanAizek/wine
  • spencerwallace/wine
  • schloegl/wine
  • giuppococco/wine
  • shayan7878/wine
  • N080DY12/wine
  • ralf.habacker/wine
  • oh-ok/wine
  • johnporter/wine
  • Low-power/wine
  • thelande/wine
  • riyu12383/wine
  • kubapet/wine
  • Ivan_83/wine
  • SmithGoll/wine
  • gmesmer/wine
  • akarisu.de/wine
  • jwffrey9046/wine
  • anders/wine
  • markbhasawut/wine
  • dy-tea/wine
  • Benjamin_Loison/wine
  • frmdstryr/wine
  • zzam/wine
  • haydenhestad/wine
  • Deppy04/wine
  • osbre/wine
  • CharlottePabst/wine
  • SunlitTango/wine
  • ritalat/wine
  • AlexeyLushnikov/wine
  • mickdermack/wine
  • s1UMBa/wine
  • huangqinjin/wine
  • caseyr297/wine
  • d1saster/wine
  • ayufdh222/wine
  • janstrakowski/wine
  • petur/wine
  • matheus.venturini/wine-fix-ohm-sign
  • rayrapetyan/wine
  • xiaotong/wine
  • ovarley1/wine
  • dos1/wine
  • BZZZZ/wine
  • joesoroka/wine
  • toadking/wine
  • JoshuaBrest/wine
  • elias/wine
  • michele.dionisio/wine
  • garlett/wine-send-arp
  • eugenemcardle/wine
  • hugwijst/wine
  • whrvt/wine
  • loisgomez/wine
  • ramleejo/wine
  • self/wine
  • fr33z00/wine
  • JoeS209/wine
  • JacKeTUs/wine
  • nak.ak2015/wine
  • morgwai/wine
  • funfunctor/wine
  • donnyjoe/wine
  • sitter/wine
  • atticf/wine
  • xipster/wine
  • sebastian/wine
  • AlexanderWillner/wine
  • yaoyongjie/wine
  • wayne/wine
  • AMark/wine
  • zamaudio/wine
  • TomaszPakula/wine
  • Freakness109/wine
  • amorozov/wine
  • HP/wine
  • danlm/wine
  • rariema/wine
  • Biswa96/wine
  • rlippmann/wine
  • yangkun/wine
  • greyghoster/wine
519 results
Show changes
Commits on Source (63)
Showing
with 1701 additions and 930 deletions
...@@ -1006,6 +1006,7 @@ enable_authz ...@@ -1006,6 +1006,7 @@ enable_authz
enable_avicap32 enable_avicap32
enable_avifil32 enable_avifil32
enable_avrt enable_avrt
enable_bcp47langs
enable_bcrypt enable_bcrypt
enable_bcryptprimitives enable_bcryptprimitives
enable_bluetoothapis enable_bluetoothapis
...@@ -1369,6 +1370,7 @@ enable_pidgen ...@@ -1369,6 +1370,7 @@ enable_pidgen
enable_powrprof enable_powrprof
enable_printui enable_printui
enable_prntvpt enable_prntvpt
enable_profapi
enable_propsys enable_propsys
enable_psapi enable_psapi
enable_pstorec enable_pstorec
...@@ -9529,14 +9531,47 @@ fi ...@@ -9529,14 +9531,47 @@ fi
SYSTEMCONFIGURATION_LIBS="-framework SystemConfiguration" SYSTEMCONFIGURATION_LIBS="-framework SystemConfiguration"
   
   
WINELOADER_LDFLAGS="-Wl,-pie,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist" WINELOADER_LDFLAGS="-Wl,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist"
   
case $HOST_ARCH in case $HOST_ARCH in
i386|x86_64) wine_can_build_preloader=yes ;; i386) wine_use_preloader=yes ;;
*) wine_can_build_preloader=no ;; x86_64)
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-no_huge" >&5
printf %s "checking whether the compiler supports -Wl,-no_huge... " >&6; }
if test ${ac_cv_cflags__Wl__no_huge+y}
then :
printf %s "(cached) " >&6
else $as_nop
ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wl,-no_huge"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"
then :
ac_cv_cflags__Wl__no_huge=yes
else $as_nop
ac_cv_cflags__Wl__no_huge=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam \
conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl__no_huge" >&5
printf "%s\n" "$ac_cv_cflags__Wl__no_huge" >&6; }
if test "x$ac_cv_cflags__Wl__no_huge" = xyes
then :
wine_use_preloader=no
WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-no_pie,-image_base,0x200000000,-no_huge,-no_fixup_chains,-segalign,0x1000,-segaddr,WINE_RESERVE,0x1000,-segaddr,WINE_TOP_DOWN,0x7ff000000000"
else $as_nop
wine_use_preloader=yes
fi
;;
*) wine_use_preloader=no ;;
esac esac
   
if test "$wine_can_build_preloader" = "yes" if test "$wine_use_preloader" = "yes"
then then
WINEPRELOADER_LDFLAGS="-nostartfiles -nodefaultlibs -e _start -ldylib1.o -mmacosx-version-min=10.7 -Wl,-no_new_main,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist" WINEPRELOADER_LDFLAGS="-nostartfiles -nodefaultlibs -e _start -ldylib1.o -mmacosx-version-min=10.7 -Wl,-no_new_main,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist"
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-no_pie" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-no_pie" >&5
...@@ -9576,8 +9611,6 @@ fi ...@@ -9576,8 +9611,6 @@ fi
;; ;;
esac esac
WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -mmacosx-version-min=10.7" WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -mmacosx-version-min=10.7"
else
as_fn_append wine_warnings "|can't build Wine preloader; many programs won't work"
fi fi
   
if test "x$with_coreaudio" != "xno"; if test "x$with_coreaudio" != "xno";
...@@ -20448,19 +20481,20 @@ case $host_os in ...@@ -20448,19 +20481,20 @@ case $host_os in
linux*) linux*)
if test $HOST_ARCH != unknown if test $HOST_ARCH != unknown
then then
test "$wine_binary" = wine || as_fn_append CONFIGURE_TARGETS " loader/wine-preloader" wine_use_preloader=yes
WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader"
fi
;;
darwin*|macosx*)
if test "$wine_can_build_preloader" = "yes"
then
test "$wine_binary" = wine || as_fn_append CONFIGURE_TARGETS " loader/wine-preloader"
WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader"
fi fi
;; ;;
esac esac
   
if test "$wine_use_preloader" = "yes"
then
test "$wine_binary" = wine || as_fn_append CONFIGURE_TARGETS " loader/wine-preloader"
WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader"
printf "%s\n" "#define HAVE_WINE_PRELOADER 1" >>confdefs.h
fi
   
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
printf %s "checking for library containing dlopen... " >&6; } printf %s "checking for library containing dlopen... " >&6; }
...@@ -21951,6 +21985,7 @@ wine_fn_config_makefile dlls/avifil32 enable_avifil32 ...@@ -21951,6 +21985,7 @@ wine_fn_config_makefile dlls/avifil32 enable_avifil32
wine_fn_config_makefile dlls/avifil32/tests enable_tests wine_fn_config_makefile dlls/avifil32/tests enable_tests
wine_fn_config_makefile dlls/avifile.dll16 enable_win16 wine_fn_config_makefile dlls/avifile.dll16 enable_win16
wine_fn_config_makefile dlls/avrt enable_avrt wine_fn_config_makefile dlls/avrt enable_avrt
wine_fn_config_makefile dlls/bcp47langs enable_bcp47langs
wine_fn_config_makefile dlls/bcrypt enable_bcrypt wine_fn_config_makefile dlls/bcrypt enable_bcrypt
wine_fn_config_makefile dlls/bcrypt/tests enable_tests wine_fn_config_makefile dlls/bcrypt/tests enable_tests
wine_fn_config_makefile dlls/bcryptprimitives enable_bcryptprimitives wine_fn_config_makefile dlls/bcryptprimitives enable_bcryptprimitives
...@@ -22517,6 +22552,7 @@ wine_fn_config_makefile dlls/powrprof enable_powrprof ...@@ -22517,6 +22552,7 @@ wine_fn_config_makefile dlls/powrprof enable_powrprof
wine_fn_config_makefile dlls/printui enable_printui wine_fn_config_makefile dlls/printui enable_printui
wine_fn_config_makefile dlls/prntvpt enable_prntvpt wine_fn_config_makefile dlls/prntvpt enable_prntvpt
wine_fn_config_makefile dlls/prntvpt/tests enable_tests wine_fn_config_makefile dlls/prntvpt/tests enable_tests
wine_fn_config_makefile dlls/profapi enable_profapi
wine_fn_config_makefile dlls/propsys enable_propsys wine_fn_config_makefile dlls/propsys enable_propsys
wine_fn_config_makefile dlls/propsys/tests enable_tests wine_fn_config_makefile dlls/propsys/tests enable_tests
wine_fn_config_makefile dlls/psapi enable_psapi wine_fn_config_makefile dlls/psapi enable_psapi
......
...@@ -637,14 +637,21 @@ case $host_os in ...@@ -637,14 +637,21 @@ case $host_os in
AC_SUBST(SECURITY_LIBS,"-framework Security -framework CoreFoundation") AC_SUBST(SECURITY_LIBS,"-framework Security -framework CoreFoundation")
AC_SUBST(SYSTEMCONFIGURATION_LIBS,"-framework SystemConfiguration") AC_SUBST(SYSTEMCONFIGURATION_LIBS,"-framework SystemConfiguration")
WINELOADER_LDFLAGS="-Wl,-pie,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist" WINELOADER_LDFLAGS="-Wl,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist"
case $HOST_ARCH in case $HOST_ARCH in
i386|x86_64) wine_can_build_preloader=yes ;; i386) wine_use_preloader=yes ;;
*) wine_can_build_preloader=no ;; x86_64)
dnl If the -no_huge linker option is present (added in Xcode 15.3), use zerofill sections instead of the preloader
WINE_TRY_CFLAGS([-Wl,-no_huge],
[wine_use_preloader=no
WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-no_pie,-image_base,0x200000000,-no_huge,-no_fixup_chains,-segalign,0x1000,-segaddr,WINE_RESERVE,0x1000,-segaddr,WINE_TOP_DOWN,0x7ff000000000"],
[wine_use_preloader=yes])
;;
*) wine_use_preloader=no ;;
esac esac
if test "$wine_can_build_preloader" = "yes" if test "$wine_use_preloader" = "yes"
then then
WINEPRELOADER_LDFLAGS="-nostartfiles -nodefaultlibs -e _start -ldylib1.o -mmacosx-version-min=10.7 -Wl,-no_new_main,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist" WINEPRELOADER_LDFLAGS="-nostartfiles -nodefaultlibs -e _start -ldylib1.o -mmacosx-version-min=10.7 -Wl,-no_new_main,-segalign,0x1000,-pagezero_size,0x1000,-sectcreate,__TEXT,__info_plist,loader/wine_info.plist"
WINE_TRY_CFLAGS([-Wl,-no_pie], WINE_TRY_CFLAGS([-Wl,-no_pie],
...@@ -659,8 +666,6 @@ case $host_os in ...@@ -659,8 +666,6 @@ case $host_os in
esac esac
dnl If preloader is used, the loader needs to be an LC_UNIXTHREAD binary to avoid AppKit/Core Animation problems. dnl If preloader is used, the loader needs to be an LC_UNIXTHREAD binary to avoid AppKit/Core Animation problems.
WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -mmacosx-version-min=10.7" WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -mmacosx-version-min=10.7"
else
WINE_WARNING([can't build Wine preloader; many programs won't work])
fi fi
if test "x$with_coreaudio" != "xno"; if test "x$with_coreaudio" != "xno";
...@@ -2035,19 +2040,18 @@ case $host_os in ...@@ -2035,19 +2040,18 @@ case $host_os in
linux*) linux*)
if test $HOST_ARCH != unknown if test $HOST_ARCH != unknown
then then
test "$wine_binary" = wine || WINE_IGNORE_FILE(loader/wine-preloader) wine_use_preloader=yes
WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader"
fi
;;
darwin*|macosx*)
if test "$wine_can_build_preloader" = "yes"
then
test "$wine_binary" = wine || WINE_IGNORE_FILE(loader/wine-preloader)
WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader"
fi fi
;; ;;
esac esac
if test "$wine_use_preloader" = "yes"
then
test "$wine_binary" = wine || WINE_IGNORE_FILE(loader/wine-preloader)
WINELOADER_PROGRAMS="$WINELOADER_PROGRAMS $wine_binary-preloader"
AC_DEFINE(HAVE_WINE_PRELOADER, 1, [Define to 1 if the Wine preloader is being used.])
fi
dnl **** Check for functions **** dnl **** Check for functions ****
dnl Check for -ldl dnl Check for -ldl
...@@ -2459,6 +2463,7 @@ WINE_CONFIG_MAKEFILE(dlls/avifil32) ...@@ -2459,6 +2463,7 @@ WINE_CONFIG_MAKEFILE(dlls/avifil32)
WINE_CONFIG_MAKEFILE(dlls/avifil32/tests) WINE_CONFIG_MAKEFILE(dlls/avifil32/tests)
WINE_CONFIG_MAKEFILE(dlls/avifile.dll16,enable_win16) WINE_CONFIG_MAKEFILE(dlls/avifile.dll16,enable_win16)
WINE_CONFIG_MAKEFILE(dlls/avrt) WINE_CONFIG_MAKEFILE(dlls/avrt)
WINE_CONFIG_MAKEFILE(dlls/bcp47langs)
WINE_CONFIG_MAKEFILE(dlls/bcrypt) WINE_CONFIG_MAKEFILE(dlls/bcrypt)
WINE_CONFIG_MAKEFILE(dlls/bcrypt/tests) WINE_CONFIG_MAKEFILE(dlls/bcrypt/tests)
WINE_CONFIG_MAKEFILE(dlls/bcryptprimitives) WINE_CONFIG_MAKEFILE(dlls/bcryptprimitives)
...@@ -3025,6 +3030,7 @@ WINE_CONFIG_MAKEFILE(dlls/powrprof) ...@@ -3025,6 +3030,7 @@ WINE_CONFIG_MAKEFILE(dlls/powrprof)
WINE_CONFIG_MAKEFILE(dlls/printui) WINE_CONFIG_MAKEFILE(dlls/printui)
WINE_CONFIG_MAKEFILE(dlls/prntvpt) WINE_CONFIG_MAKEFILE(dlls/prntvpt)
WINE_CONFIG_MAKEFILE(dlls/prntvpt/tests) WINE_CONFIG_MAKEFILE(dlls/prntvpt/tests)
WINE_CONFIG_MAKEFILE(dlls/profapi)
WINE_CONFIG_MAKEFILE(dlls/propsys) WINE_CONFIG_MAKEFILE(dlls/propsys)
WINE_CONFIG_MAKEFILE(dlls/propsys/tests) WINE_CONFIG_MAKEFILE(dlls/propsys/tests)
WINE_CONFIG_MAKEFILE(dlls/psapi) WINE_CONFIG_MAKEFILE(dlls/psapi)
......
apiset api-ms-win-appmodel-runtime-internal-l1-1-1 = kernelbase.dll
apiset api-ms-win-appmodel-runtime-l1-1-2 = kernelbase.dll apiset api-ms-win-appmodel-runtime-l1-1-2 = kernelbase.dll
apiset api-ms-win-base-bootconfig-l1-1-0 = advapi32.dll apiset api-ms-win-base-bootconfig-l1-1-0 = advapi32.dll
apiset api-ms-win-base-util-l1-1-0 = advapi32.dll apiset api-ms-win-base-util-l1-1-0 = advapi32.dll
......
MODULE = bcp47langs.dll
IMPORTLIB = bcp47langs
1 stub GetUnIsoRegionCode
@ stub AppendUserLanguageInputMethods
@ stub AppendUserLanguageInternal
@ stub AppendUserLanguages
@ stub Bcp47BufferFromLcid
@ stub Bcp47FindClosestLanguage
@ stub Bcp47FromCompactTagInternal
@ stub Bcp47FromHkl
@ stub Bcp47FromLcid
@ stub Bcp47GetAbbreviation
@ stub Bcp47GetDirectionality
@ stub Bcp47GetDistance
@ stub Bcp47GetExtensionSingletons
@ stub Bcp47GetExtensionSubstring
@ stub Bcp47GetIsoLanguageCode
@ stub Bcp47GetIsoScriptCode
@ stub Bcp47GetLanguageName
@ stub Bcp47GetMuiForm
@ stub Bcp47GetNeutralForm
@ stub Bcp47GetNlsForm
@ stub Bcp47GetSubtagMapInternal
@ stub Bcp47GetUnIsoRegionCode
@ stub Bcp47IsWellFormed
@ stub Bcp47Normalize
@ stub ClearApplicationLanguageOverride
@ stub ClearApplicationManifestLanguages
@ stub ClearHttpAcceptLanguageOptOut
@ stub ClearUserDisplayLanguageOverride
@ stub ClearUserLocaleFromLanguageProfileOptOut
@ stub CompactTagFromBcp47Internal
@ stub DllGetActivationFactory
@ stub DllGetClassObject
@ stub GetApplicationLanguageOverride
@ stub GetApplicationLanguages
@ stub GetApplicationManifestLanguages
@ stub GetAppropriateUserLocaleForUserLanguages
@ stub GetAppropriateUserPreferredAndDisplayLanguagesForUser
@ stub GetClosestMatchingUserLanguage
@ stub GetDisplayLanguagesForAllUsers
@ stub GetFontFallbackLanguageList
@ stub GetHttpAcceptLanguageOptOut
@ stub GetInputMethodOverrideForUser
@ stub GetPendingUserDisplayLanguage
@ stub GetRelevantLocalesFromLanguageTags
@ stub GetSerializedUserLanguageProfile
@ stub GetSerializedUserLanguagesForUser
@ stub GetStartingUserDisplayLanguage
@ stub GetUserDisplayLanguageOverride
@ stub GetUserLanguageInputMethods
@ stub GetUserLanguageInputMethodsForUser
@ stub GetUserLanguages
@ stub GetUserLanguagesForAllUsers
@ stub GetUserLanguagesForUser
@ stub GetUserLocaleFromLanguageProfileOptOut
@ stub IsTransientLcid
@ stub LanguageListAsMuiForm
@ stub LcidFromBcp47
@ stub RemoveInputsForAllLanguagesInternal
@ stub RemoveUserLanguageInputMethods
@ stub ResolveLanguages
@ stub SetApplicationLanguageOverride
@ stub SetApplicationManifestLanguages
@ stub SetHttpAcceptLanguageOptOut
@ stub SetInputMethodOverride
@ stub SetPreviousUserDisplayLanguages
@ stub SetStartingUserDisplayLanguage
@ stub SetUserDisplayLanguageOverride
@ stub SetUserLanguageInputMethods
@ stub SetUserLanguagesInternal
@ stub SetUserLanguagesInternalCore
@ stub SetUserLocaleFromLanguageProfileOptOut
...@@ -158,6 +158,7 @@ ...@@ -158,6 +158,7 @@
@ stdcall ApplicationRecoveryFinished(long) @ stdcall ApplicationRecoveryFinished(long)
@ stdcall ApplicationRecoveryInProgress(ptr) @ stdcall ApplicationRecoveryInProgress(ptr)
@ stdcall AppPolicyGetMediaFoundationCodecLoading(ptr ptr) kernelbase.AppPolicyGetMediaFoundationCodecLoading @ stdcall AppPolicyGetMediaFoundationCodecLoading(ptr ptr) kernelbase.AppPolicyGetMediaFoundationCodecLoading
@ stdcall AppPolicyGetWindowingModel(ptr ptr) kernelbase.AppPolicyGetWindowingModel
@ stdcall -import AreFileApisANSI() @ stdcall -import AreFileApisANSI()
@ stdcall AssignProcessToJobObject(ptr ptr) @ stdcall AssignProcessToJobObject(ptr ptr)
@ stdcall -import AttachConsole(long) @ stdcall -import AttachConsole(long)
......
...@@ -520,6 +520,298 @@ static void test_internal_structure(void) ...@@ -520,6 +520,298 @@ static void test_internal_structure(void)
ok( EndUpdateResourceW( res, TRUE ), "EndUpdateResourceW failed\n"); ok( EndUpdateResourceW( res, TRUE ), "EndUpdateResourceW failed\n");
} }
static const struct
{
IMAGE_DOS_HEADER dos;
IMAGE_NT_HEADERS nt;
IMAGE_SECTION_HEADER section;
} dll_image =
{
{ IMAGE_DOS_SIGNATURE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, { 0 }, 0, 0, { 0 },
sizeof(IMAGE_DOS_HEADER) },
{
IMAGE_NT_SIGNATURE, /* Signature */
{
#if defined __i386__
IMAGE_FILE_MACHINE_I386, /* Machine */
#elif defined __x86_64__
IMAGE_FILE_MACHINE_AMD64, /* Machine */
#elif defined __arm__
IMAGE_FILE_MACHINE_ARMNT, /* Machine */
#elif defined __aarch64__
IMAGE_FILE_MACHINE_ARM64, /* Machine */
#else
# error You must specify the machine type
#endif
1, /* NumberOfSections */
0, /* TimeDateStamp */
0, /* PointerToSymbolTable */
0, /* NumberOfSymbols */
sizeof(IMAGE_OPTIONAL_HEADER), /* SizeOfOptionalHeader */
IMAGE_FILE_EXECUTABLE_IMAGE | IMAGE_FILE_DLL /* Characteristics */
},
{ IMAGE_NT_OPTIONAL_HDR_MAGIC, /* Magic */
1, /* MajorLinkerVersion */
0, /* MinorLinkerVersion */
0, /* SizeOfCode */
0, /* SizeOfInitializedData */
0, /* SizeOfUninitializedData */
0, /* AddressOfEntryPoint */
0x1000, /* BaseOfCode */
#ifndef _WIN64
0, /* BaseOfData */
#endif
0x10000000, /* ImageBase */
0x1000, /* SectionAlignment */
0x1000, /* FileAlignment */
4, /* MajorOperatingSystemVersion */
0, /* MinorOperatingSystemVersion */
1, /* MajorImageVersion */
0, /* MinorImageVersion */
4, /* MajorSubsystemVersion */
0, /* MinorSubsystemVersion */
0, /* Win32VersionValue */
0x3000, /* SizeOfImage */
sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS),
0, /* CheckSum */
IMAGE_SUBSYSTEM_WINDOWS_CUI, /* Subsystem */
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE | IMAGE_DLLCHARACTERISTICS_NX_COMPAT, /* DllCharacteristics */
0, /* SizeOfStackReserve */
0, /* SizeOfStackCommit */
0, /* SizeOfHeapReserve */
0, /* SizeOfHeapCommit */
0, /* LoaderFlags */
IMAGE_FILE_RESOURCE_DIRECTORY + 1, /* NumberOfRvaAndSizes */
{ { 0 }, { 0 }, { 0x1000, 0x1000 } } /* DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] */
}
},
{ ".rsrc\0\0", { 0 }, 0x1000, 0x1000, 0, 0, 0, 0, 0,
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ }
};
static void create_test_dll( const WCHAR *name )
{
DWORD dummy;
HANDLE handle = CreateFileW( name, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, 0 );
ok( handle != INVALID_HANDLE_VALUE, "failed to create file err %lu\n", GetLastError() );
WriteFile( handle, &dll_image, sizeof(dll_image), &dummy, NULL );
SetFilePointer( handle, dll_image.nt.OptionalHeader.SizeOfImage, NULL, FILE_BEGIN );
SetEndOfFile( handle );
CloseHandle( handle );
}
static struct mui_res
{
DWORD signature;
DWORD size;
DWORD version;
DWORD path_type;
DWORD file_type;
DWORD system_attributes;
DWORD fallback_location;
BYTE service_checksum[16];
BYTE checksum[16];
DWORD unk1[2];
DWORD mui_path_off;
DWORD mui_path_size;
DWORD unk2[2];
DWORD ln_type_name_off;
DWORD ln_type_name_size;
DWORD ln_type_id_off;
DWORD ln_type_id_size;
DWORD mui_type_name_off;
DWORD mui_type_name_size;
DWORD mui_type_id_off;
DWORD mui_type_id_size;
DWORD lang_off;
DWORD lang_size;
DWORD fallback_lang_off;
DWORD fallback_lang_size;
WCHAR ln_type_names[8];
DWORD ln_type_ids[1];
WCHAR mui_type_names[8];
DWORD mui_type_ids[1];
WCHAR lang[8];
WCHAR fallback_lang[8];
} ln_mui_res = {
0xfecdfecd, sizeof(ln_mui_res), 0x10000, 0,
MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN >> 1,
0, 0, {'s','c'}, {'c'}, {0}, 0, 0, {0},
offsetof(struct mui_res, ln_type_names), sizeof(L"MUI\0"),
offsetof(struct mui_res, ln_type_ids), sizeof(ln_mui_res.ln_type_ids),
offsetof(struct mui_res, mui_type_names), sizeof(L"MUI\0"),
offsetof(struct mui_res, mui_type_ids), sizeof(ln_mui_res.mui_type_ids), 0, 0,
offsetof(struct mui_res, fallback_lang), sizeof(L"en-US"),
{'M','U','I',0,0}, {RT_CURSOR}, {'M','U','I',0,0}, {RT_STRING}, {0}, {'e','n','-','U','S',0},
}, en_mui_res = {
0xfecdfecd, sizeof(ln_mui_res), 0x10000, 0,
MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI >> 1,
0, 0, {'s','c'}, {'c'}, {0}, 0, 0, {0},
offsetof(struct mui_res, ln_type_names), sizeof(L"MUI\0"),
offsetof(struct mui_res, ln_type_ids), sizeof(ln_mui_res.ln_type_ids),
0, 0, 0, 0, offsetof(struct mui_res, lang), sizeof(L"en-US"), 0, 0,
{'M','U','I',0,0}, {RT_STRING}, {0}, {0}, {'e','n','-','U','S',0}
};
static void test_mui(void)
{
static const WCHAR ln_dll[] = L"test_mui.dll";
static const WCHAR en_dll[] = L"en-US\\test_mui.dll.mui";
static const BYTE zeros[16] = { 0 };
BYTE buf[1024];
FILEMUIINFO *info = (FILEMUIINFO *)buf;
const WCHAR *str;
DWORD size, *id;
HANDLE res;
BOOL r;
size = 0;
r = GetFileMUIInfo( 0, ln_dll, NULL, &size);
ok( !r, "GetFileMUIInfo succeeded\n" );
ok( GetLastError() == ERROR_FILE_NOT_FOUND, "GetLastError() = %ld\n", GetLastError() );
create_test_dll( ln_dll );
CreateDirectoryW( L"en-US", NULL );
create_test_dll( en_dll );
size = 0;
r = GetFileMUIInfo( 0, ln_dll, NULL, &size );
ok( r, "GetFileMUIInfo failed: %ld\n", GetLastError() );
ok( size == sizeof(*info), "unexpected size: %ld\n", size );
memset( buf, 0xfe, sizeof(buf) );
size = sizeof(buf);
info->dwSize = sizeof(buf);
info->dwVersion = 0;
r = GetFileMUIInfo( 0, ln_dll, info, &size );
ok( !r, "GetFileMUIInfo succeeded\n" );
ok( GetLastError() == ERROR_INVALID_PARAMETER, "GetLastError() = %ld\n", GetLastError() );
ok( !size, "size = %ld\n", size );
size = sizeof(buf);
info->dwVersion = MUI_FILEINFO_VERSION;
r = GetFileMUIInfo( 0, ln_dll, info, &size );
ok( r, "GetFileMUIInfo failed: %ld\n", GetLastError() );
ok( info->dwSize == sizeof(buf), "dwSize = %ld\n", info->dwSize );
ok( info->dwVersion == MUI_FILEINFO_VERSION, "dwVersion = %ld\n", info->dwVersion );
ok( info->dwFileType == MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL, "dwFileType = %ld\n", info->dwFileType );
ok( !memcmp(info->pChecksum, zeros, sizeof(info->pChecksum)), "pChecksum = %s\n",
wine_dbgstr_an((char *)info->pChecksum, sizeof(info->pChecksum)) );
ok( !memcmp(info->pServiceChecksum, zeros, sizeof(info->pServiceChecksum)), "pServiceChecksum = %s\n",
wine_dbgstr_an((char *)info->pServiceChecksum, sizeof(info->pServiceChecksum)) );
ok( !info->dwLanguageNameOffset, "dwLanguageNameOffset = %ld\n", info->dwLanguageNameOffset );
ok( !info->dwTypeIDMainSize, "dwTypeIDMainSize = %ld\n", info->dwTypeIDMainSize );
ok( !info->dwTypeIDMainOffset, "dwTypeIDMainOffset = %ld\n", info->dwTypeIDMainOffset );
ok( !info->dwTypeNameMainOffset, "dwTypeNameMainOffset = %ld\n", info->dwTypeNameMainOffset );
ok( !info->dwTypeIDMUISize, "dwTypeIDMUISize = %ld\n", info->dwTypeIDMUISize );
ok( !info->dwTypeIDMUIOffset, "dwTypeIDMUIOffset = %ld\n", info->dwTypeIDMUIOffset );
ok( !info->dwTypeNameMUIOffset, "dwTypeNameMUIOffset = %ld\n", info->dwTypeNameMUIOffset );
ok( !memcmp(info->abBuffer, zeros, sizeof(info->abBuffer)), "abBuffer = %s\n",
wine_dbgstr_an((char *)info->abBuffer, sizeof(info->abBuffer)) );
res = BeginUpdateResourceW( ln_dll, TRUE );
ok( res != NULL, "BeginUpdateResourceW failed: %ld\n", GetLastError() );
r = UpdateResourceW( res, L"MUI", MAKEINTRESOURCEW(1), 0, &ln_mui_res, 4 );
ok( r, "UpdateResource failed: %ld\n", GetLastError() );
ok( EndUpdateResourceW( res, FALSE ), "EndUpdateResourceW failed: %ld\n", GetLastError() );
size = 0;
r = GetFileMUIInfo( MUI_QUERY_TYPE | MUI_QUERY_CHECKSUM | MUI_QUERY_LANGUAGE_NAME
| MUI_QUERY_RESOURCE_TYPES, ln_dll, NULL, &size );
ok( !r, "GetFileMUIInfo succeeded\n" );
ok( GetLastError() == ERROR_BAD_EXE_FORMAT, "GetLastError() = %ld\n", GetLastError() );
res = BeginUpdateResourceW( ln_dll, TRUE );
ok( res != NULL, "BeginUpdateResourceW failed: %ld\n", GetLastError() );
r = UpdateResourceW( res, L"MUI", MAKEINTRESOURCEW(1), 0, &ln_mui_res, sizeof(ln_mui_res) );
ok( r, "UpdateResource failed: %ld\n", GetLastError() );
ok( EndUpdateResourceW( res, FALSE ), "EndUpdateResourceW failed: %ld\n", GetLastError() );
size = 0;
r = GetFileMUIInfo( MUI_QUERY_TYPE | MUI_QUERY_CHECKSUM | MUI_QUERY_LANGUAGE_NAME
| MUI_QUERY_RESOURCE_TYPES, ln_dll, NULL, &size );
ok( !r, "GetFileMUIInfo succeeded\n" );
ok( GetLastError() == ERROR_INSUFFICIENT_BUFFER, "GetLastError() = %ld\n", GetLastError() );
ok( size, "size was not set\n" );
memset( buf, 0xfe, sizeof(buf) );
size = sizeof(buf);
info->dwSize = sizeof(buf);
info->dwVersion = MUI_FILEINFO_VERSION;
r = GetFileMUIInfo( MUI_QUERY_TYPE | MUI_QUERY_CHECKSUM | MUI_QUERY_LANGUAGE_NAME
| MUI_QUERY_RESOURCE_TYPES, ln_dll, info, &size );
ok( r, "GetFileMUIInfo failed: %ld\n", GetLastError() );
ok( info->dwSize == sizeof(buf), "dwSize = %ld\n", info->dwSize );
ok( info->dwVersion == MUI_FILEINFO_VERSION, "dwVersion = %ld\n", info->dwVersion );
ok( info->dwFileType == MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN, "dwFileType = %ld\n", info->dwFileType );
ok( info->pChecksum[0] == 'c', "pChecksum = %s\n",
wine_dbgstr_an((char *)info->pChecksum, sizeof(info->pChecksum)) );
ok( info->pServiceChecksum[0] == 's', "pServiceChecksum = %s\n",
wine_dbgstr_an((char *)info->pServiceChecksum, sizeof(info->pServiceChecksum)) );
ok( info->dwLanguageNameOffset == 72, "dwLanguageNameOffset = %ld\n", info->dwLanguageNameOffset );
str = (WCHAR *)(buf + info->dwLanguageNameOffset);
ok( !wcscmp(str, L"en-US"), "language name = %s\n", wine_dbgstr_w(str) );
ok( info->dwTypeIDMainSize == 1, "dwTypeIDMainSize = %ld\n", info->dwTypeIDMainSize );
ok( info->dwTypeIDMainOffset == 84, "dwTypeIDMainOffset = %ld\n", info->dwTypeIDMainOffset );
id = (DWORD *)(buf + info->dwTypeIDMainOffset);
ok( id[0] == RT_CURSOR, "type ID main[0] = %ld\n", id[0] );
ok( info->dwTypeNameMainOffset == 88, "dwTypeNameMainOffset = %ld\n", info->dwTypeNameMainOffset );
str = (WCHAR *)(buf + info->dwTypeNameMainOffset);
ok( !wcscmp(str, L"MUI"), "type name main[0] = %s\n", wine_dbgstr_w(str) );
str += wcslen(str) + 1;
ok( !str[0], "string list is not NULL terminated: %s\n", wine_dbgstr_w(str) );
ok( info->dwTypeIDMUISize == 1, "dwTypeIDMUISize = %ld\n", info->dwTypeIDMUISize );
ok( info->dwTypeIDMUIOffset == 98, "dwTypeIDMUIOffset = %ld\n", info->dwTypeIDMUIOffset );
id = (DWORD *)(buf + info->dwTypeIDMUIOffset);
ok( id[0] == RT_STRING, "type ID MUI[0] = %ld\n", id[0] );
ok( info->dwTypeNameMUIOffset == 102, "dwTypeNameMUIOffset = %ld\n", info->dwTypeNameMUIOffset );
str = (WCHAR *)(buf + info->dwTypeNameMUIOffset);
ok( !wcscmp(str, L"MUI"), "type name MUI[0] = %s\n", wine_dbgstr_w(str) );
str += wcslen(str) + 1;
ok( !str[0], "string list is not NULL terminated: %s\n", wine_dbgstr_w(str) );
res = BeginUpdateResourceW( en_dll, TRUE );
ok( res != NULL, "BeginUpdateResourceW failed: %ld\n", GetLastError() );
r = UpdateResourceW( res, L"MUI", MAKEINTRESOURCEW(1), 0, &en_mui_res, sizeof(en_mui_res) );
ok( r, "UpdateResource failed: %ld\n", GetLastError() );
ok( EndUpdateResourceW( res, FALSE ), "EndUpdateResourceW failed: %ld\n", GetLastError() );
memset( buf, 0xfe, sizeof(buf) );
size = sizeof(buf);
info->dwSize = sizeof(buf);
info->dwVersion = MUI_FILEINFO_VERSION;
r = GetFileMUIInfo( MUI_QUERY_TYPE | MUI_QUERY_CHECKSUM | MUI_QUERY_LANGUAGE_NAME
| MUI_QUERY_RESOURCE_TYPES, en_dll, info, &size );
ok( r, "GetFileMUIInfo failed: %ld\n", GetLastError() );
ok( info->dwSize == sizeof(buf), "dwSize = %ld\n", info->dwSize );
ok( info->dwVersion == MUI_FILEINFO_VERSION, "dwVersion = %ld\n", info->dwVersion );
ok( info->dwFileType == MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI, "dwFileType = %ld\n", info->dwFileType );
ok( info->pChecksum[0] == 'c', "pChecksum = %s\n",
wine_dbgstr_an((char *)info->pChecksum, sizeof(info->pChecksum)) );
ok( info->pServiceChecksum[0] == 's', "pServiceChecksum = %s\n",
wine_dbgstr_an((char *)info->pServiceChecksum, sizeof(info->pServiceChecksum)) );
ok( info->dwLanguageNameOffset == 72, "dwLanguageNameOffset = %ld\n", info->dwLanguageNameOffset );
str = (WCHAR *)(buf + info->dwLanguageNameOffset);
ok( !wcscmp(str, L"en-US"), "language name = %s\n", wine_dbgstr_w(str) );
ok( !info->dwTypeIDMainSize, "dwTypeIDMainSize = %ld\n", info->dwTypeIDMainSize );
ok( !info->dwTypeIDMainOffset, "dwTypeIDMainOffset = %ld\n", info->dwTypeIDMainOffset );
ok( !info->dwTypeNameMainOffset, "dwTypeNameMainOffset = %ld\n", info->dwTypeNameMainOffset );
ok( info->dwTypeIDMUISize == 1, "dwTypeIDMUISize = %ld\n", info->dwTypeIDMUISize );
ok( info->dwTypeIDMUIOffset == 84, "dwTypeIDMUIOffset = %ld\n", info->dwTypeIDMUIOffset );
id = (DWORD *)(buf + info->dwTypeIDMUIOffset);
ok( id[0] == RT_STRING, "type ID MUI[0] = %ld\n", id[0] );
ok( info->dwTypeNameMUIOffset == 88, "dwTypeNameMUIOffset = %ld\n", info->dwTypeNameMUIOffset );
str = (WCHAR *)(buf + info->dwTypeNameMUIOffset);
ok( !wcscmp(str, L"MUI"), "type name MUI[0] = %s\n", wine_dbgstr_w(str) );
str += wcslen(str) + 1;
ok( !str[0], "string list is not NULL terminated: %s\n", wine_dbgstr_w(str) );
DeleteFileW( ln_dll );
DeleteFileW( en_dll );
RemoveDirectoryW( L"en-US" );
}
START_TEST(resource) START_TEST(resource)
{ {
DWORD i; DWORD i;
...@@ -552,4 +844,5 @@ START_TEST(resource) ...@@ -552,4 +844,5 @@ START_TEST(resource)
DeleteFileA( filename ); DeleteFileA( filename );
} }
test_find_resource(); test_find_resource();
test_mui();
} }
...@@ -5719,15 +5719,221 @@ done: ...@@ -5719,15 +5719,221 @@ done:
} }
#define MUI_SIGNATURE 0xfecdfecd
struct mui_resource
{
DWORD signature;
DWORD size;
DWORD version;
DWORD path_type;
DWORD file_type;
DWORD system_attributes;
DWORD fallback_location;
BYTE service_checksum[16];
BYTE checksum[16];
DWORD unk1[2];
DWORD mui_path_off;
DWORD mui_path_size;
DWORD unk2[2];
DWORD ln_type_name_off;
DWORD ln_type_name_size;
DWORD ln_type_id_off;
DWORD ln_type_id_size;
DWORD mui_type_name_off;
DWORD mui_type_name_size;
DWORD mui_type_id_off;
DWORD mui_type_id_size;
DWORD lang_off;
DWORD lang_size;
DWORD fallback_lang_off;
DWORD fallback_lang_size;
};
static BOOL validate_mui_resource(struct mui_resource *mui, DWORD size)
{
if (size >= sizeof(DWORD) && mui->signature != MUI_SIGNATURE)
{
SetLastError(ERROR_MUI_INVALID_RC_CONFIG);
return FALSE;
}
size = min( size, mui->size );
if (size < sizeof(*mui) ||
mui->ln_type_name_off >= size || mui->ln_type_name_size > size - mui->ln_type_name_off ||
mui->ln_type_id_off >= size || mui->ln_type_id_size > size - mui->ln_type_id_off ||
mui->mui_type_name_off >= size || mui->mui_type_name_size > size - mui->mui_type_name_off ||
mui->mui_type_id_off >= size || mui->mui_type_id_size > size - mui->mui_type_id_off ||
mui->lang_off >= size || mui->lang_size > size - mui->lang_off ||
mui->fallback_lang_off >= size || mui->fallback_lang_size > size - mui->fallback_lang_off)
{
SetLastError(ERROR_BAD_EXE_FORMAT);
return FALSE;
}
return TRUE;
}
/****************************************************************************** /******************************************************************************
* GetFileMUIInfo (kernelbase.@) * GetFileMUIInfo (kernelbase.@)
*/ */
BOOL WINAPI /* DECLSPEC_HOTPATCH */ GetFileMUIInfo( DWORD flags, const WCHAR *path, BOOL WINAPI DECLSPEC_HOTPATCH GetFileMUIInfo( DWORD flags, const WCHAR *path,
FILEMUIINFO *info, DWORD *size ) FILEMUIINFO *info, DWORD *size )
{ {
FIXME( "stub: %lu, %s, %p, %p\n", flags, debugstr_w(path), info, size ); DWORD off, mui_size, type = MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL;
SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); struct mui_resource *mui = NULL;
return FALSE; HMODULE hmod;
HRSRC hrsrc;
TRACE( "%lu, %s, %p, %p\n", flags, debugstr_w(path), info, size );
if (!path || !size || (*size && !info) ||
(info && (*size < sizeof(*info) || info->dwSize != *size ||
info->dwVersion != MUI_FILEINFO_VERSION)))
{
if (size) *size = 0;
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
if (!flags) flags = MUI_QUERY_TYPE | MUI_QUERY_CHECKSUM;
hmod = LoadLibraryExW( path, NULL, LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE );
if (!hmod) return FALSE;
hrsrc = FindResourceW( hmod, MAKEINTRESOURCEW(1), L"MUI" );
if (hrsrc)
{
mui = LockResource( LoadResource(hmod, hrsrc) );
if (mui) mui_size = SizeofResource( hmod, hrsrc );
if (!mui || !validate_mui_resource( mui, mui_size ))
{
FreeLibrary( hmod );
return FALSE;
}
if (mui->file_type & (MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN >> 1))
type = MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN;
else if (mui->file_type & (MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI >> 1))
type = MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI;
}
if (type == MUI_FILETYPE_NOT_LANGUAGE_NEUTRAL)
{
FreeLibrary( hmod );
if (!info)
{
*size = sizeof(*info);
return TRUE;
}
if (info->dwSize < sizeof(*info))
{
SetLastError( ERROR_INSUFFICIENT_BUFFER );
return FALSE;
}
memset( info, 0, sizeof(*info) );
info->dwSize = *size;
info->dwVersion = MUI_FILEINFO_VERSION;
if (flags & MUI_QUERY_TYPE) info->dwFileType = type;
return TRUE;
}
off = offsetof(FILEMUIINFO, abBuffer);
if (flags & MUI_QUERY_LANGUAGE_NAME)
{
off += type == MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN ?
mui->fallback_lang_size : mui->lang_size;
}
if (flags & MUI_QUERY_RESOURCE_TYPES)
{
if (type == MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN)
off += mui->ln_type_name_size + mui->ln_type_id_size;
off += mui->mui_type_name_size + mui->mui_type_id_size;
}
if (off < sizeof(*info)) off = sizeof(*info);
if (!info || info->dwSize < off)
{
FreeLibrary( hmod );
*size = off;
SetLastError( ERROR_INSUFFICIENT_BUFFER );
return FALSE;
}
off = 0;
memset( info, 0, sizeof(*info) );
info->dwSize = *size;
info->dwVersion = MUI_FILEINFO_VERSION;
if (flags & MUI_QUERY_TYPE) info->dwFileType = type;
if (flags & MUI_QUERY_CHECKSUM)
{
memcpy( info->pChecksum, mui->checksum, sizeof(info->pChecksum) );
memcpy( info->pServiceChecksum, mui->service_checksum, sizeof(info->pServiceChecksum) );
}
if (flags & MUI_QUERY_LANGUAGE_NAME)
{
if (type == MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN && mui->fallback_lang_off)
{
info->dwLanguageNameOffset = offsetof(FILEMUIINFO, abBuffer);
memcpy(info->abBuffer, ((BYTE *)mui) + mui->fallback_lang_off,
mui->fallback_lang_size);
off += mui->fallback_lang_size;
}
if (type == MUI_FILETYPE_LANGUAGE_NEUTRAL_MUI && mui->lang_off)
{
info->dwLanguageNameOffset = offsetof(FILEMUIINFO, abBuffer);
memcpy(info->abBuffer, ((BYTE *)mui) + mui->lang_off, mui->lang_size);
off += mui->lang_size;
}
}
if (flags & MUI_QUERY_RESOURCE_TYPES && type & MUI_FILETYPE_LANGUAGE_NEUTRAL_MAIN)
{
if (mui->ln_type_id_size && mui->ln_type_id_off)
{
info->dwTypeIDMainSize = mui->ln_type_id_size / sizeof(DWORD);
info->dwTypeIDMainOffset = offsetof(FILEMUIINFO, abBuffer[off]);
memcpy(info->abBuffer + off, ((BYTE *)mui) + mui->ln_type_id_off, mui->ln_type_id_size);
off += mui->ln_type_id_size;
}
if (mui->ln_type_name_off)
{
info->dwTypeNameMainOffset = offsetof(FILEMUIINFO, abBuffer[off]);
memcpy(info->abBuffer + off, ((BYTE *)mui) + mui->ln_type_name_off, mui->ln_type_name_size);
off += mui->ln_type_name_size;
}
if (mui->mui_type_id_size && mui->mui_type_id_off)
{
info->dwTypeIDMUISize = mui->mui_type_id_size / sizeof(DWORD);
info->dwTypeIDMUIOffset = offsetof(FILEMUIINFO, abBuffer[off]);
memcpy(info->abBuffer + off, ((BYTE *)mui) + mui->mui_type_id_off, mui->mui_type_id_size);
off += mui->mui_type_id_size;
}
if (mui->mui_type_name_off)
{
info->dwTypeNameMUIOffset = offsetof(FILEMUIINFO, abBuffer[off]);
memcpy(info->abBuffer + off, ((BYTE *)mui) + mui->mui_type_name_off, mui->mui_type_name_size);
off += mui->mui_type_name_size;
}
}
else if(flags & MUI_QUERY_RESOURCE_TYPES)
{
if (mui->ln_type_id_size && mui->ln_type_id_off)
{
info->dwTypeIDMUISize = mui->ln_type_id_size / sizeof(DWORD);
info->dwTypeIDMUIOffset = offsetof(FILEMUIINFO, abBuffer[off]);
memcpy(info->abBuffer + off, ((BYTE *)mui) + mui->ln_type_id_off, mui->ln_type_id_size);
off += mui->ln_type_id_size;
}
if (mui->ln_type_name_off)
{
info->dwTypeNameMUIOffset = offsetof(FILEMUIINFO, abBuffer[off]);
memcpy(info->abBuffer + off, ((BYTE *)mui) + mui->ln_type_name_off, mui->ln_type_name_size);
off += mui->ln_type_name_size;
}
}
FreeLibrary( hmod );
return TRUE;
} }
......
...@@ -117,7 +117,7 @@ static HRESULT get_periods(struct audio_client *client, ...@@ -117,7 +117,7 @@ static HRESULT get_periods(struct audio_client *client,
return params.result; return params.result;
} }
static HRESULT adjust_timing(struct audio_client *client, static HRESULT adjust_timing(struct audio_client *client, const BOOLEAN force_def_period,
REFERENCE_TIME *duration, REFERENCE_TIME *period, REFERENCE_TIME *duration, REFERENCE_TIME *period,
const AUDCLNT_SHAREMODE mode, const DWORD flags, const AUDCLNT_SHAREMODE mode, const DWORD flags,
const WAVEFORMATEX *fmt) const WAVEFORMATEX *fmt)
...@@ -133,28 +133,31 @@ static HRESULT adjust_timing(struct audio_client *client, ...@@ -133,28 +133,31 @@ static HRESULT adjust_timing(struct audio_client *client,
TRACE("Device periods: %lu default and %lu minimum\n", (ULONG)def_period, (ULONG)min_period); TRACE("Device periods: %lu default and %lu minimum\n", (ULONG)def_period, (ULONG)min_period);
if (mode == AUDCLNT_SHAREMODE_SHARED) { if (mode == AUDCLNT_SHAREMODE_SHARED) {
*period = def_period; if (*period == 0 || force_def_period)
*period = def_period;
else if (*period < min_period)
return AUDCLNT_E_INVALID_DEVICE_PERIOD;
if (*duration < 3 * *period) if (*duration < 3 * *period)
*duration = 3 * *period; *duration = 3 * *period;
} else { } else {
const WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE *)fmt; const WAVEFORMATEXTENSIBLE *fmtex = (WAVEFORMATEXTENSIBLE *)fmt;
if (fmtex->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE && if (fmtex->Format.wFormatTag == WAVE_FORMAT_EXTENSIBLE &&
(fmtex->dwChannelMask == 0 || fmtex->dwChannelMask & SPEAKER_RESERVED)) (fmtex->dwChannelMask == 0 || fmtex->dwChannelMask & SPEAKER_RESERVED))
hr = AUDCLNT_E_UNSUPPORTED_FORMAT; return AUDCLNT_E_UNSUPPORTED_FORMAT;
else { else {
if (*period == 0) if (*period == 0)
*period = def_period; *period = def_period;
if (*period < min_period || *period > 5000000) if (*period < min_period || *period > 5000000)
hr = AUDCLNT_E_INVALID_DEVICE_PERIOD; return AUDCLNT_E_INVALID_DEVICE_PERIOD;
else if (*duration > 20000000) /* The smaller the period, the lower this limit. */ else if (*duration > 20000000) /* The smaller the period, the lower this limit. */
hr = AUDCLNT_E_BUFFER_SIZE_ERROR; return AUDCLNT_E_BUFFER_SIZE_ERROR;
else if (flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) { else if (flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) {
if (*duration != *period) if (*duration != *period)
hr = AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL; return AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL;
FIXME("EXCLUSIVE mode with EVENTCALLBACK\n"); FIXME("EXCLUSIVE mode with EVENTCALLBACK\n");
hr = AUDCLNT_E_DEVICE_IN_USE; return AUDCLNT_E_DEVICE_IN_USE;
} else if (*duration < 8 * *period) } else if (*duration < 8 * *period)
*duration = 8 * *period; /* May grow above 2s. */ *duration = 8 * *period; /* May grow above 2s. */
} }
...@@ -355,6 +358,100 @@ skip: ...@@ -355,6 +358,100 @@ skip:
return wcsdup(name); return wcsdup(name);
} }
static HRESULT stream_init(struct audio_client *client, const BOOLEAN force_def_period,
const AUDCLNT_SHAREMODE mode, const DWORD flags,
REFERENCE_TIME duration, REFERENCE_TIME period,
const WAVEFORMATEX *fmt, const GUID *sessionguid)
{
struct create_stream_params params;
UINT32 i, channel_count;
stream_handle stream;
WCHAR *name;
if (!fmt)
return E_POINTER;
dump_fmt(fmt);
if (mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE)
return E_INVALIDARG;
if (flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS |
AUDCLNT_STREAMFLAGS_LOOPBACK |
AUDCLNT_STREAMFLAGS_EVENTCALLBACK |
AUDCLNT_STREAMFLAGS_NOPERSIST |
AUDCLNT_STREAMFLAGS_RATEADJUST |
AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED |
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE |
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED |
AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY |
AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)) {
FIXME("Unknown flags: %08lx\n", flags);
return E_INVALIDARG;
}
if (FAILED(params.result = adjust_timing(client, force_def_period, &duration, &period, mode, flags, fmt)))
return params.result;
sessions_lock();
if (client->stream) {
sessions_unlock();
return AUDCLNT_E_ALREADY_INITIALIZED;
}
if (FAILED(params.result = main_loop_start())) {
sessions_unlock();
return params.result;
}
params.name = name = get_application_name();
params.device = client->device_name;
params.flow = client->dataflow;
params.share = mode;
params.flags = flags;
params.duration = duration;
params.period = period;
params.fmt = fmt;
params.channel_count = &channel_count;
params.stream = &stream;
wine_unix_call(create_stream, &params);
free(name);
if (FAILED(params.result)) {
sessions_unlock();
return params.result;
}
if (!(client->vols = malloc(channel_count * sizeof(*client->vols)))) {
params.result = E_OUTOFMEMORY;
goto exit;
}
for (i = 0; i < channel_count; i++)
client->vols[i] = 1.f;
params.result = get_audio_session(sessionguid, client->parent, channel_count, &client->session);
exit:
if (FAILED(params.result)) {
stream_release(stream, NULL);
free(client->vols);
client->vols = NULL;
} else {
list_add_tail(&client->session->clients, &client->entry);
client->stream = stream;
client->channel_count = channel_count;
set_stream_volumes(client);
}
sessions_unlock();
return params.result;
}
static HRESULT WINAPI capture_QueryInterface(IAudioCaptureClient *iface, REFIID riid, void **ppv) static HRESULT WINAPI capture_QueryInterface(IAudioCaptureClient *iface, REFIID riid, void **ppv)
{ {
struct audio_client *This = impl_from_IAudioCaptureClient(iface); struct audio_client *This = impl_from_IAudioCaptureClient(iface);
...@@ -537,97 +634,12 @@ static HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE ...@@ -537,97 +634,12 @@ static HRESULT WINAPI client_Initialize(IAudioClient3 *iface, AUDCLNT_SHAREMODE
const WAVEFORMATEX *fmt, const GUID *sessionguid) const WAVEFORMATEX *fmt, const GUID *sessionguid)
{ {
struct audio_client *This = impl_from_IAudioClient3(iface); struct audio_client *This = impl_from_IAudioClient3(iface);
struct create_stream_params params;
UINT32 i, channel_count;
stream_handle stream;
WCHAR *name;
TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, wine_dbgstr_longlong(duration), TRACE("(%p)->(%x, %lx, %s, %s, %p, %s)\n", This, mode, flags, wine_dbgstr_longlong(duration),
wine_dbgstr_longlong(period), fmt, wine_dbgstr_longlong(period), fmt,
debugstr_guid(sessionguid)); debugstr_guid(sessionguid));
if (!fmt) return stream_init(This, TRUE, mode, flags, duration, period, fmt, sessionguid);
return E_POINTER;
dump_fmt(fmt);
if (mode != AUDCLNT_SHAREMODE_SHARED && mode != AUDCLNT_SHAREMODE_EXCLUSIVE)
return E_INVALIDARG;
if (flags & ~(AUDCLNT_STREAMFLAGS_CROSSPROCESS |
AUDCLNT_STREAMFLAGS_LOOPBACK |
AUDCLNT_STREAMFLAGS_EVENTCALLBACK |
AUDCLNT_STREAMFLAGS_NOPERSIST |
AUDCLNT_STREAMFLAGS_RATEADJUST |
AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED |
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE |
AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED |
AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY |
AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM)) {
FIXME("Unknown flags: %08lx\n", flags);
return E_INVALIDARG;
}
if (FAILED(params.result = adjust_timing(This, &duration, &period, mode, flags, fmt)))
return params.result;
sessions_lock();
if (This->stream) {
sessions_unlock();
return AUDCLNT_E_ALREADY_INITIALIZED;
}
if (FAILED(params.result = main_loop_start())) {
sessions_unlock();
return params.result;
}
params.name = name = get_application_name();
params.device = This->device_name;
params.flow = This->dataflow;
params.share = mode;
params.flags = flags;
params.duration = duration;
params.period = period;
params.fmt = fmt;
params.channel_count = &channel_count;
params.stream = &stream;
wine_unix_call(create_stream, &params);
free(name);
if (FAILED(params.result)) {
sessions_unlock();
return params.result;
}
if (!(This->vols = malloc(channel_count * sizeof(*This->vols)))) {
params.result = E_OUTOFMEMORY;
goto exit;
}
for (i = 0; i < channel_count; i++)
This->vols[i] = 1.f;
params.result = get_audio_session(sessionguid, This->parent, channel_count, &This->session);
exit:
if (FAILED(params.result)) {
stream_release(stream, NULL);
free(This->vols);
This->vols = NULL;
} else {
list_add_tail(&This->session->clients, &This->entry);
This->stream = stream;
This->channel_count = channel_count;
set_stream_volumes(This);
}
sessions_unlock();
return params.result;
} }
static HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out) static HRESULT WINAPI client_GetBufferSize(IAudioClient3 *iface, UINT32 *out)
...@@ -990,17 +1002,23 @@ static HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface, ...@@ -990,17 +1002,23 @@ static HRESULT WINAPI client_GetSharedModeEnginePeriod(IAudioClient3 *iface,
UINT32 *max_period_frames) UINT32 *max_period_frames)
{ {
struct audio_client *This = impl_from_IAudioClient3(iface); struct audio_client *This = impl_from_IAudioClient3(iface);
FIXME("(%p)->(%p, %p, %p, %p, %p) - partial stub\n", REFERENCE_TIME def_period, min_period;
HRESULT hr;
TRACE("(%p)->(%p, %p, %p, %p, %p)\n",
This, format, default_period_frames, This, format, default_period_frames,
unit_period_frames, min_period_frames, unit_period_frames, min_period_frames,
max_period_frames); max_period_frames);
*default_period_frames = if (FAILED(hr = get_periods(This, &def_period, &min_period)))
*min_period_frames = return hr;
*max_period_frames =
format->nSamplesPerSec / 100; /* ~10ms */ *default_period_frames = def_period * format->nSamplesPerSec / (REFERENCE_TIME)10000000;
*unit_period_frames = 1; *min_period_frames = min_period * format->nSamplesPerSec / (REFERENCE_TIME)10000000;
return S_OK; *max_period_frames = *default_period_frames;
*unit_period_frames = 1;
return hr;
} }
static HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface, static HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *iface,
...@@ -1008,8 +1026,18 @@ static HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *ifa ...@@ -1008,8 +1026,18 @@ static HRESULT WINAPI client_GetCurrentSharedModeEnginePeriod(IAudioClient3 *ifa
UINT32 *cur_period_frames) UINT32 *cur_period_frames)
{ {
struct audio_client *This = impl_from_IAudioClient3(iface); struct audio_client *This = impl_from_IAudioClient3(iface);
FIXME("(%p)->(%p, %p) - stub\n", This, cur_format, cur_period_frames); UINT32 dummy;
return E_NOTIMPL; HRESULT hr;
TRACE("(%p)->(%p, %p)\n", This, cur_format, cur_period_frames);
if (!cur_format || !cur_period_frames)
return E_POINTER;
if (FAILED(hr = client_GetMixFormat(iface, cur_format)))
return hr;
return client_GetSharedModeEnginePeriod(iface, *cur_format, cur_period_frames, &dummy, &dummy, &dummy);
} }
static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, DWORD flags, static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, DWORD flags,
...@@ -1018,14 +1046,16 @@ static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, D ...@@ -1018,14 +1046,16 @@ static HRESULT WINAPI client_InitializeSharedAudioStream(IAudioClient3 *iface, D
const GUID *session_guid) const GUID *session_guid)
{ {
struct audio_client *This = impl_from_IAudioClient3(iface); struct audio_client *This = impl_from_IAudioClient3(iface);
REFERENCE_TIME duration; REFERENCE_TIME period;
FIXME("(%p)->(0x%lx, %u, %p, %s) - partial stub\n", This, flags, period_frames, format, debugstr_guid(session_guid));
TRACE("(%p)->(0x%lx, %u, %p, %s)\n", This, flags, period_frames, format, debugstr_guid(session_guid));
if (!format) if (!format)
return E_POINTER; return E_POINTER;
duration = period_frames * (REFERENCE_TIME)10000000 / format->nSamplesPerSec; period = period_frames * (REFERENCE_TIME)10000000 / format->nSamplesPerSec;
return client_Initialize(iface, AUDCLNT_SHAREMODE_SHARED, flags, duration, 0, format, session_guid);
return stream_init(This, FALSE, AUDCLNT_SHAREMODE_SHARED, flags, 0, period, format, session_guid);
} }
const IAudioClient3Vtbl AudioClient3_Vtbl = const IAudioClient3Vtbl AudioClient3_Vtbl =
......
...@@ -340,7 +340,7 @@ ...@@ -340,7 +340,7 @@
@ stdcall -syscall NtQueueApcThread(long ptr long long long) @ stdcall -syscall NtQueueApcThread(long ptr long long long)
@ stdcall -syscall NtQueueApcThreadEx(long long ptr long long long) @ stdcall -syscall NtQueueApcThreadEx(long long ptr long long long)
@ stdcall -syscall NtRaiseException(ptr ptr long) @ stdcall -syscall NtRaiseException(ptr ptr long)
@ stdcall -syscall NtRaiseHardError(long long ptr ptr long ptr) @ stdcall -syscall NtRaiseHardError(long long long ptr long ptr)
@ stdcall -syscall NtReadFile(long long ptr ptr ptr ptr long ptr ptr) @ stdcall -syscall NtReadFile(long long ptr ptr ptr ptr long ptr ptr)
@ stdcall -syscall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) @ stdcall -syscall NtReadFileScatter(long long ptr ptr ptr ptr long ptr ptr)
# @ stub NtReadRequestData # @ stub NtReadRequestData
...@@ -650,7 +650,7 @@ ...@@ -650,7 +650,7 @@
# @ stub RtlEnumerateGenericTableAvl # @ stub RtlEnumerateGenericTableAvl
# @ stub RtlEnumerateGenericTableLikeADirectory # @ stub RtlEnumerateGenericTableLikeADirectory
@ stdcall RtlEnumerateGenericTableWithoutSplaying(ptr ptr) @ stdcall RtlEnumerateGenericTableWithoutSplaying(ptr ptr)
# @ stub RtlEnumerateGenericTableWithoutSplayingAvl @ stdcall RtlEnumerateGenericTableWithoutSplayingAvl(ptr ptr)
@ stub RtlEnumerateProperties @ stub RtlEnumerateProperties
@ stdcall RtlEqualComputerName(ptr ptr) @ stdcall RtlEqualComputerName(ptr ptr)
@ stdcall RtlEqualDomainName(ptr ptr) @ stdcall RtlEqualDomainName(ptr ptr)
...@@ -743,8 +743,7 @@ ...@@ -743,8 +743,7 @@
# @ stub RtlGetLengthWithoutTrailingPathSeperators # @ stub RtlGetLengthWithoutTrailingPathSeperators
@ stdcall RtlGetLocaleFileMappingAddress(ptr ptr ptr) @ stdcall RtlGetLocaleFileMappingAddress(ptr ptr ptr)
@ stdcall RtlGetLongestNtPathLength() @ stdcall RtlGetLongestNtPathLength()
@ stdcall -syscall -arch=win32 RtlGetNativeSystemInformation(long ptr long ptr) NtWow64GetNativeSystemInformation @ stdcall RtlGetNativeSystemInformation(long ptr long ptr)
@ stdcall -syscall -arch=win64 RtlGetNativeSystemInformation(long ptr long ptr) NtQuerySystemInformation
# @ stub RtlGetNextRange # @ stub RtlGetNextRange
@ stdcall RtlGetNtGlobalFlags() @ stdcall RtlGetNtGlobalFlags()
@ stdcall RtlGetNtProductType(ptr) @ stdcall RtlGetNtProductType(ptr)
...@@ -899,7 +898,7 @@ ...@@ -899,7 +898,7 @@
@ stdcall RtlNtStatusToDosError(long) @ stdcall RtlNtStatusToDosError(long)
@ stdcall RtlNtStatusToDosErrorNoTeb(long) @ stdcall RtlNtStatusToDosErrorNoTeb(long)
@ stdcall RtlNumberGenericTableElements(ptr) @ stdcall RtlNumberGenericTableElements(ptr)
# @ stub RtlNumberGenericTableElementsAvl @ stdcall RtlNumberGenericTableElementsAvl(ptr)
@ stdcall RtlNumberOfClearBits(ptr) @ stdcall RtlNumberOfClearBits(ptr)
@ stdcall RtlNumberOfSetBits(ptr) @ stdcall RtlNumberOfSetBits(ptr)
@ stdcall RtlOemStringToUnicodeSize(ptr) @ stdcall RtlOemStringToUnicodeSize(ptr)
...@@ -1390,7 +1389,7 @@ ...@@ -1390,7 +1389,7 @@
@ stdcall -private -syscall ZwQueueApcThread(long ptr long long long) NtQueueApcThread @ stdcall -private -syscall ZwQueueApcThread(long ptr long long long) NtQueueApcThread
@ stdcall -private -syscall ZwQueueApcThreadEx(long long ptr long long long) NtQueueApcThreadEx @ stdcall -private -syscall ZwQueueApcThreadEx(long long ptr long long long) NtQueueApcThreadEx
@ stdcall -private -syscall ZwRaiseException(ptr ptr long) NtRaiseException @ stdcall -private -syscall ZwRaiseException(ptr ptr long) NtRaiseException
@ stdcall -private -syscall ZwRaiseHardError(long long ptr ptr long ptr) NtRaiseHardError @ stdcall -private -syscall ZwRaiseHardError(long long long ptr long ptr) NtRaiseHardError
@ stdcall -private -syscall ZwReadFile(long long ptr ptr ptr ptr long ptr ptr) NtReadFile @ stdcall -private -syscall ZwReadFile(long long ptr ptr ptr ptr long ptr ptr) NtReadFile
@ stdcall -private -syscall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) NtReadFileScatter @ stdcall -private -syscall ZwReadFileScatter(long long ptr ptr ptr ptr long ptr ptr) NtReadFileScatter
# @ stub ZwReadRequestData # @ stub ZwReadRequestData
......
...@@ -243,58 +243,59 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -243,58 +243,59 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
PRTL_QUERY_REGISTRY_TABLE pQuery, PVOID pContext, PVOID pEnvironment) PRTL_QUERY_REGISTRY_TABLE pQuery, PVOID pContext, PVOID pEnvironment)
{ {
PUNICODE_STRING str = pQuery->EntryContext; PUNICODE_STRING str = pQuery->EntryContext;
ULONG type, len, offset, count, res;
UNICODE_STRING src, dst; UNICODE_STRING src, dst;
WCHAR *data, *wstr;
LONG *bin; LONG *bin;
ULONG offset;
PWSTR wstr;
DWORD res;
NTSTATUS status = STATUS_SUCCESS; NTSTATUS status = STATUS_SUCCESS;
ULONG len;
if (pInfo == NULL) if (pInfo)
{ {
ULONG default_size = pQuery->DefaultLength; type = pInfo->Type;
if (!default_size && pQuery->DefaultType == REG_SZ && pQuery->DefaultData) data = (WCHAR*)((char*)pInfo + pInfo->DataOffset);
default_size = (wcslen(pQuery->DefaultData) + 1) * sizeof(WCHAR); len = pInfo->DataLength;
}
else
{
type = pQuery->DefaultType;
data = pQuery->DefaultData;
len = pQuery->DefaultLength;
if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT) if (!data)
{ return STATUS_DATA_OVERRUN;
if (pQuery->QueryRoutine)
return STATUS_INVALID_PARAMETER;
if (pQuery->DefaultType == REG_SZ || pQuery->DefaultType == REG_EXPAND_SZ || if (!len)
pQuery->DefaultType == REG_MULTI_SZ || pQuery->DefaultType == REG_LINK) {
switch (type)
{ {
if (!pQuery->DefaultData) case REG_SZ:
return STATUS_DATA_OVERRUN; case REG_EXPAND_SZ:
if (str->MaximumLength < default_size) case REG_LINK:
return STATUS_BUFFER_TOO_SMALL; len = (wcslen(data) + 1) * sizeof(WCHAR);
memcpy(str->Buffer, pQuery->DefaultData, default_size); break;
str->Length = default_size - sizeof(WCHAR);
}
return STATUS_SUCCESS; case REG_MULTI_SZ:
} for (wstr = data; *wstr; wstr += count)
else if (pQuery->QueryRoutine) {
{ count = wcslen(wstr) + 1;
status = pQuery->QueryRoutine(pQuery->Name, pQuery->DefaultType, pQuery->DefaultData, len += count * sizeof(WCHAR);
default_size, pContext, pQuery->EntryContext); }
break;
}
} }
return status;
} }
len = pInfo->DataLength;
if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT) if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT)
{ {
if (pQuery->QueryRoutine) if (pQuery->QueryRoutine)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
switch(pInfo->Type) switch (type)
{ {
case REG_EXPAND_SZ: case REG_EXPAND_SZ:
if (!(pQuery->Flags & RTL_QUERY_REGISTRY_NOEXPAND)) if (!(pQuery->Flags & RTL_QUERY_REGISTRY_NOEXPAND))
{ {
RtlInitUnicodeString(&src, (WCHAR*)(((CHAR*)pInfo) + pInfo->DataOffset)); RtlInitUnicodeString(&src, data);
res = 0; res = 0;
dst.MaximumLength = 0; dst.MaximumLength = 0;
RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res);
...@@ -307,12 +308,12 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -307,12 +308,12 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
case REG_SZ: case REG_SZ:
case REG_LINK: case REG_LINK:
if (str->Buffer == NULL) if (str->Buffer == NULL)
RtlCreateUnicodeString(str, (WCHAR*)(((CHAR*)pInfo) + pInfo->DataOffset)); RtlCreateUnicodeString(str, data);
else else
{ {
if (str->MaximumLength < len) if (str->MaximumLength < len)
return STATUS_BUFFER_TOO_SMALL; return STATUS_BUFFER_TOO_SMALL;
memcpy(str->Buffer, (char*)pInfo + pInfo->DataOffset, len); memcpy(str->Buffer, data, len);
str->Length = len - sizeof(WCHAR); str->Length = len - sizeof(WCHAR);
} }
break; break;
...@@ -327,30 +328,30 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -327,30 +328,30 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
str->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, len); str->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, len);
str->MaximumLength = len; str->MaximumLength = len;
} }
len = min(len, str->MaximumLength); else if (str->MaximumLength < len)
return STATUS_BUFFER_TOO_SMALL;
len -= sizeof(WCHAR); len -= sizeof(WCHAR);
memcpy(str->Buffer, ((CHAR*)pInfo) + pInfo->DataOffset, len); memcpy(str->Buffer, data, len);
str->Buffer[len / sizeof(WCHAR)] = 0; str->Buffer[len / sizeof(WCHAR)] = 0;
str->Length = len; str->Length = len;
break; break;
default: default:
bin = pQuery->EntryContext; bin = pQuery->EntryContext;
if (pInfo->DataLength <= sizeof(ULONG)) if (len <= sizeof(ULONG))
memcpy(bin, ((CHAR*)pInfo) + pInfo->DataOffset, memcpy(bin, data, len);
pInfo->DataLength);
else else
{ {
if (bin[0] < 0) if (bin[0] < 0)
{ {
if (pInfo->DataLength <= -bin[0]) if (len <= -bin[0])
memcpy(bin, (char*)pInfo + pInfo->DataOffset, pInfo->DataLength); memcpy(bin, data, len);
} }
else if (pInfo->DataLength <= bin[0]) else if (len <= bin[0])
{ {
bin[0] = len; bin[0] = len;
bin[1] = pInfo->Type; bin[1] = type;
memcpy(bin + 2, (char*)pInfo + pInfo->DataOffset, len); memcpy(bin + 2, data, len);
} }
} }
break; break;
...@@ -359,15 +360,13 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -359,15 +360,13 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
else if (pQuery->QueryRoutine) else if (pQuery->QueryRoutine)
{ {
if((pQuery->Flags & RTL_QUERY_REGISTRY_NOEXPAND) || if((pQuery->Flags & RTL_QUERY_REGISTRY_NOEXPAND) ||
(pInfo->Type != REG_EXPAND_SZ && pInfo->Type != REG_MULTI_SZ)) (type != REG_EXPAND_SZ && type != REG_MULTI_SZ))
{ {
status = pQuery->QueryRoutine(pQuery->Name, pInfo->Type, status = pQuery->QueryRoutine(pQuery->Name, type, data, len, pContext, pQuery->EntryContext);
((CHAR*)pInfo) + pInfo->DataOffset, pInfo->DataLength,
pContext, pQuery->EntryContext);
} }
else if (pInfo->Type == REG_EXPAND_SZ) else if (type == REG_EXPAND_SZ)
{ {
RtlInitUnicodeString(&src, (WCHAR*)(((CHAR*)pInfo) + pInfo->DataOffset)); RtlInitUnicodeString(&src, data);
res = 0; res = 0;
dst.MaximumLength = 0; dst.MaximumLength = 0;
RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res);
...@@ -375,17 +374,16 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -375,17 +374,16 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
dst.MaximumLength = res; dst.MaximumLength = res;
dst.Buffer = RtlAllocateHeap(GetProcessHeap(), 0, res * sizeof(WCHAR)); dst.Buffer = RtlAllocateHeap(GetProcessHeap(), 0, res * sizeof(WCHAR));
RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res); RtlExpandEnvironmentStrings_U(pEnvironment, &src, &dst, &res);
status = pQuery->QueryRoutine(pQuery->Name, pInfo->Type, dst.Buffer, status = pQuery->QueryRoutine(pQuery->Name, REG_SZ, dst.Buffer, res, pContext, pQuery->EntryContext);
dst.Length, pContext, pQuery->EntryContext);
RtlFreeHeap(GetProcessHeap(), 0, dst.Buffer); RtlFreeHeap(GetProcessHeap(), 0, dst.Buffer);
} }
else /* REG_MULTI_SZ */ else /* REG_MULTI_SZ */
{ {
for (offset = 0; offset < pInfo->DataLength; offset += len) for (offset = 0; offset < len; offset += count)
{ {
wstr = (WCHAR*)((char*)pInfo + pInfo->DataOffset + offset); wstr = (WCHAR*)((char*)data + offset);
len = (wcslen(wstr) + 1) * sizeof(WCHAR); count = (wcslen(wstr) + 1) * sizeof(WCHAR);
status = pQuery->QueryRoutine(pQuery->Name, REG_SZ, wstr, len, pContext, pQuery->EntryContext); status = pQuery->QueryRoutine(pQuery->Name, REG_SZ, wstr, count, pContext, pQuery->EntryContext);
if (status != STATUS_SUCCESS && status != STATUS_BUFFER_TOO_SMALL) if (status != STATUS_SUCCESS && status != STATUS_BUFFER_TOO_SMALL)
return status; return status;
} }
......
This diff is collapsed.
...@@ -27,10 +27,12 @@ ...@@ -27,10 +27,12 @@
#include "ntstatus.h" #include "ntstatus.h"
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "winsock2.h"
#include "windef.h" #include "windef.h"
#include "winnt.h" #include "winnt.h"
#include "winternl.h" #include "winternl.h"
#include "ddk/ntddk.h" #include "ddk/ntddk.h"
#include "in6addr.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "ntdll_misc.h" #include "ntdll_misc.h"
...@@ -1943,3 +1945,606 @@ NTSTATUS WINAPI RtlFormatMessageEx( const WCHAR *src, ULONG width, BOOLEAN ignor ...@@ -1943,3 +1945,606 @@ NTSTATUS WINAPI RtlFormatMessageEx( const WCHAR *src, ULONG width, BOOLEAN ignor
*retsize = (buffer - start) * sizeof(WCHAR); *retsize = (buffer - start) * sizeof(WCHAR);
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/***********************************************************************
* IP addresses
***********************************************************************/
#define htons(x) RtlUshortByteSwap(x)
#define ntohs(x) RtlUshortByteSwap(x)
static const signed char hex_table[] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x00-0x0F */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x10-0x1F */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x20-0x2F */
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /* 0x30-0x3F */
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x40-0x4F */
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0x50-0x5F */
-1, 10, 11, 12, 13, 14, 15 /* 0x60-0x66 */
};
static BOOL parse_ipv4_component(const WCHAR **str, BOOL strict, ULONG *value)
{
int base = 10, d;
WCHAR c;
ULONG cur_value, prev_value = 0;
BOOL success = FALSE;
if (**str == '.')
{
*str += 1;
return FALSE;
}
if ((*str)[0] == '0')
{
if ((*str)[1] == 'x' || (*str)[1] == 'X')
{
*str += 2;
if (strict) return FALSE;
base = 16;
}
else if ((*str)[1] >= '0' && (*str)[1] <= '9')
{
*str += 1;
if (strict) return FALSE;
base = 8;
}
}
for (cur_value = 0; **str; *str += 1)
{
c = **str;
if (c >= ARRAY_SIZE(hex_table)) break;
d = hex_table[c];
if (d == -1 || d >= base) break;
cur_value = cur_value * base + d;
success = TRUE;
if (cur_value < prev_value) return FALSE; /* overflow */
prev_value = cur_value;
}
if (success) *value = cur_value;
return success;
}
static NTSTATUS ipv4_string_to_address(const WCHAR *str, BOOL strict,
const WCHAR **terminator, IN_ADDR *address, USHORT *port)
{
ULONG fields[4];
int n = 0;
for (;;)
{
if (!parse_ipv4_component(&str, strict, &fields[n]))
goto error;
n++;
if (*str != '.')
break;
if (n == 4)
goto error;
str++;
}
if (strict && n < 4)
goto error;
switch (n)
{
case 4:
if (fields[0] > 0xFF || fields[1] > 0xFF || fields[2] > 0xFF || fields[3] > 0xFF)
goto error;
address->S_un.S_un_b.s_b1 = fields[0];
address->S_un.S_un_b.s_b2 = fields[1];
address->S_un.S_un_b.s_b3 = fields[2];
address->S_un.S_un_b.s_b4 = fields[3];
break;
case 3:
if (fields[0] > 0xFF || fields[1] > 0xFF || fields[2] > 0xFFFF)
goto error;
address->S_un.S_un_b.s_b1 = fields[0];
address->S_un.S_un_b.s_b2 = fields[1];
address->S_un.S_un_b.s_b3 = (fields[2] & 0xFF00) >> 8;
address->S_un.S_un_b.s_b4 = (fields[2] & 0x00FF);
break;
case 2:
if (fields[0] > 0xFF || fields[1] > 0xFFFFFF)
goto error;
address->S_un.S_un_b.s_b1 = fields[0];
address->S_un.S_un_b.s_b2 = (fields[1] & 0xFF0000) >> 16;
address->S_un.S_un_b.s_b3 = (fields[1] & 0x00FF00) >> 8;
address->S_un.S_un_b.s_b4 = (fields[1] & 0x0000FF);
break;
case 1:
address->S_un.S_un_b.s_b1 = (fields[0] & 0xFF000000) >> 24;
address->S_un.S_un_b.s_b2 = (fields[0] & 0x00FF0000) >> 16;
address->S_un.S_un_b.s_b3 = (fields[0] & 0x0000FF00) >> 8;
address->S_un.S_un_b.s_b4 = (fields[0] & 0x000000FF);
break;
default:
goto error;
}
if (terminator) *terminator = str;
if (*str == ':')
{
str++;
if (!parse_ipv4_component(&str, FALSE, &fields[0]))
goto error;
if (!fields[0] || fields[0] > 0xFFFF || *str)
goto error;
if (port)
{
*port = htons(fields[0]);
if (terminator) *terminator = str;
}
}
if (!terminator && *str)
return STATUS_INVALID_PARAMETER;
return STATUS_SUCCESS;
error:
if (terminator) *terminator = str;
return STATUS_INVALID_PARAMETER;
}
/***********************************************************************
* RtlIpv4StringToAddressExW [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4StringToAddressExW(const WCHAR *str, BOOLEAN strict, IN_ADDR *address, USHORT *port)
{
TRACE("(%s, %u, %p, %p)\n", debugstr_w(str), strict, address, port);
if (!str || !address || !port) return STATUS_INVALID_PARAMETER;
return ipv4_string_to_address(str, strict, NULL, address, port);
}
/***********************************************************************
* RtlIpv4StringToAddressW [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4StringToAddressW(const WCHAR *str, BOOLEAN strict, const WCHAR **terminator, IN_ADDR *address)
{
TRACE("(%s, %u, %p, %p)\n", debugstr_w(str), strict, terminator, address);
return ipv4_string_to_address(str, strict, terminator, address, NULL);
}
/***********************************************************************
* RtlIpv4StringToAddressExA [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4StringToAddressExA(const char *str, BOOLEAN strict, IN_ADDR *address, USHORT *port)
{
WCHAR wstr[32];
if (!str) return STATUS_INVALID_PARAMETER;
RtlMultiByteToUnicodeN(wstr, sizeof(wstr), NULL, str, strlen(str) + 1);
wstr[ARRAY_SIZE(wstr) - 1] = 0;
return RtlIpv4StringToAddressExW(wstr, strict, address, port);
}
/***********************************************************************
* RtlIpv4StringToAddressA [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4StringToAddressA(const char *str, BOOLEAN strict, const char **terminator, IN_ADDR *address)
{
WCHAR wstr[32];
const WCHAR *wterminator;
NTSTATUS ret;
RtlMultiByteToUnicodeN(wstr, sizeof(wstr), NULL, str, strlen(str) + 1);
wstr[ARRAY_SIZE(wstr) - 1] = 0;
ret = RtlIpv4StringToAddressW(wstr, strict, &wterminator, address);
if (terminator) *terminator = str + (wterminator - wstr);
return ret;
}
static BOOL parse_ipv6_component(const WCHAR **str, int base, ULONG *value)
{
WCHAR *terminator;
if (**str >= ARRAY_SIZE(hex_table) || hex_table[**str] == -1) return FALSE;
*value = min(wcstoul(*str, &terminator, base), 0x7FFFFFFF);
if (*terminator == '0') terminator++; /* "0x" but nothing valid after */
else if (terminator == *str) return FALSE;
*str = terminator;
return TRUE;
}
static NTSTATUS ipv6_string_to_address(const WCHAR *str, BOOL ex,
const WCHAR **terminator, IN6_ADDR *address, ULONG *scope, USHORT *port)
{
BOOL expecting_port = FALSE, has_0x = FALSE, too_big = FALSE;
int n_bytes = 0, n_ipv4_bytes = 0, gap = -1;
ULONG ip_component, scope_component = 0, port_component = 0;
const WCHAR *prev_str;
if (str[0] == '[')
{
if (!ex) goto error;
expecting_port = TRUE;
str++;
}
if (str[0] == ':')
{
if (str[1] != ':') goto error;
str++;
address->u.Word[0] = 0;
}
for (;;)
{
if (!n_ipv4_bytes && *str == ':')
{
/* double colon */
if (gap != -1) goto error;
str++;
prev_str = str;
gap = n_bytes;
if (n_bytes == 14 || !parse_ipv6_component(&str, 16, &ip_component)) break;
str = prev_str;
}
else
{
prev_str = str;
}
if (!n_ipv4_bytes && n_bytes <= (gap != -1 ? 10 : 12))
{
if (parse_ipv6_component(&str, 10, &ip_component) && *str == '.')
n_ipv4_bytes = 1;
str = prev_str;
}
if (n_ipv4_bytes)
{
/* IPv4 component */
if (!parse_ipv6_component(&str, 10, &ip_component)) goto error;
if (str - prev_str > 3 || ip_component > 255)
{
too_big = TRUE;
}
else
{
if (*str != '.' && (n_ipv4_bytes < 4 || (n_bytes < 15 && gap == -1))) goto error;
address->u.Byte[n_bytes] = ip_component;
n_bytes++;
}
if (n_ipv4_bytes == 4 || *str != '.') break;
n_ipv4_bytes++;
}
else
{
/* IPv6 component */
if (!parse_ipv6_component(&str, 16, &ip_component)) goto error;
if (prev_str[0] == '0' && (prev_str[1] == 'x' || prev_str[1] == 'X'))
{
/* Windows "feature": the last IPv6 component can start with "0x" and be longer than 4 digits */
if (terminator) *terminator = prev_str + 1; /* Windows says that the "x" is the terminator */
if (n_bytes < 14 && gap == -1) return STATUS_INVALID_PARAMETER;
address->u.Word[n_bytes/2] = htons(ip_component);
n_bytes += 2;
has_0x = TRUE;
goto fill_gap;
}
if (*str != ':' && n_bytes < 14 && gap == -1) goto error;
if (str - prev_str > 4)
too_big = TRUE;
else
address->u.Word[n_bytes/2] = htons(ip_component);
n_bytes += 2;
if (*str != ':' || (gap != -1 && str[1] == ':')) break;
}
if (n_bytes == (gap != -1 ? 14 : 16)) break;
if (too_big) return STATUS_INVALID_PARAMETER;
str++;
}
if (terminator) *terminator = str;
if (too_big) return STATUS_INVALID_PARAMETER;
fill_gap:
if (gap == -1)
{
if (n_bytes < 16) goto error;
}
else
{
memmove(address->u.Byte + 16 - (n_bytes - gap), address->u.Byte + gap, n_bytes - gap);
memset(address->u.Byte + gap, 0, 16 - n_bytes);
}
if (ex)
{
if (has_0x) goto error;
if (*str == '%')
{
str++;
if (!parse_ipv4_component(&str, TRUE, &scope_component)) goto error;
}
if (expecting_port)
{
if (*str != ']') goto error;
str++;
if (*str == ':')
{
str++;
if (!parse_ipv4_component(&str, FALSE, &port_component)) goto error;
if (!port_component || port_component > 0xFFFF || *str) goto error;
port_component = htons(port_component);
}
}
}
if (!terminator && *str) return STATUS_INVALID_PARAMETER;
if (scope) *scope = scope_component;
if (port) *port = port_component;
return STATUS_SUCCESS;
error:
if (terminator) *terminator = str;
return STATUS_INVALID_PARAMETER;
}
/***********************************************************************
* RtlIpv6StringToAddressExW [NTDLL.@]
*/
NTSTATUS NTAPI RtlIpv6StringToAddressExW(const WCHAR *str, IN6_ADDR *address, ULONG *scope, USHORT *port)
{
TRACE("(%s, %p, %p, %p)\n", debugstr_w(str), address, scope, port);
if (!str || !address || !scope || !port) return STATUS_INVALID_PARAMETER;
return ipv6_string_to_address(str, TRUE, NULL, address, scope, port);
}
/***********************************************************************
* RtlIpv6StringToAddressW [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv6StringToAddressW(const WCHAR *str, const WCHAR **terminator, IN6_ADDR *address)
{
TRACE("(%s, %p, %p)\n", debugstr_w(str), terminator, address);
return ipv6_string_to_address(str, FALSE, terminator, address, NULL, NULL);
}
/***********************************************************************
* RtlIpv6StringToAddressExA [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv6StringToAddressExA(const char *str, IN6_ADDR *address, ULONG *scope, USHORT *port)
{
WCHAR wstr[128];
if (!str) return STATUS_INVALID_PARAMETER;
RtlMultiByteToUnicodeN(wstr, sizeof(wstr), NULL, str, strlen(str) + 1);
wstr[ARRAY_SIZE(wstr) - 1] = 0;
return RtlIpv6StringToAddressExW(wstr, address, scope, port);
}
/***********************************************************************
* RtlIpv6StringToAddressA [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv6StringToAddressA(const char *str, const char **terminator, IN6_ADDR *address)
{
WCHAR wstr[128];
const WCHAR *wterminator = NULL;
NTSTATUS ret;
RtlMultiByteToUnicodeN(wstr, sizeof(wstr), NULL, str, strlen(str) + 1);
wstr[ARRAY_SIZE(wstr) - 1] = 0;
ret = RtlIpv6StringToAddressW(wstr, &wterminator, address);
if (terminator && wterminator) *terminator = str + (wterminator - wstr);
return ret;
}
/***********************************************************************
* RtlIpv4AddressToStringExW [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4AddressToStringExW(const IN_ADDR *pin, USHORT port, LPWSTR buffer, PULONG psize)
{
WCHAR tmp_ip[32];
ULONG needed;
if (!pin || !buffer || !psize)
return STATUS_INVALID_PARAMETER;
TRACE("(%p:0x%lx, %d, %p, %p:%ld)\n", pin, pin->S_un.S_addr, port, buffer, psize, *psize);
needed = swprintf(tmp_ip, ARRAY_SIZE(tmp_ip), L"%u.%u.%u.%u",
pin->S_un.S_un_b.s_b1, pin->S_un.S_un_b.s_b2,
pin->S_un.S_un_b.s_b3, pin->S_un.S_un_b.s_b4);
if (port) needed += swprintf(tmp_ip + needed, ARRAY_SIZE(tmp_ip) - needed, L":%u", ntohs(port));
if (*psize > needed) {
*psize = needed + 1;
wcscpy(buffer, tmp_ip);
return STATUS_SUCCESS;
}
*psize = needed + 1;
return STATUS_INVALID_PARAMETER;
}
/***********************************************************************
* RtlIpv4AddressToStringExA [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv4AddressToStringExA(const IN_ADDR *pin, USHORT port, LPSTR buffer, PULONG psize)
{
CHAR tmp_ip[32];
ULONG needed;
if (!pin || !buffer || !psize)
return STATUS_INVALID_PARAMETER;
TRACE("(%p:0x%lx, %d, %p, %p:%ld)\n", pin, pin->S_un.S_addr, port, buffer, psize, *psize);
needed = sprintf(tmp_ip, "%u.%u.%u.%u",
pin->S_un.S_un_b.s_b1, pin->S_un.S_un_b.s_b2,
pin->S_un.S_un_b.s_b3, pin->S_un.S_un_b.s_b4);
if (port) needed += sprintf(tmp_ip + needed, ":%u", ntohs(port));
if (*psize > needed) {
*psize = needed + 1;
strcpy(buffer, tmp_ip);
return STATUS_SUCCESS;
}
*psize = needed + 1;
return STATUS_INVALID_PARAMETER;
}
/***********************************************************************
* RtlIpv4AddressToStringW [NTDLL.@]
*/
WCHAR * WINAPI RtlIpv4AddressToStringW(const IN_ADDR *pin, LPWSTR buffer)
{
ULONG size = 16;
if (RtlIpv4AddressToStringExW(pin, 0, buffer, &size)) size = 0;
return buffer + size - 1;
}
/***********************************************************************
* RtlIpv4AddressToStringA [NTDLL.@]
*/
CHAR * WINAPI RtlIpv4AddressToStringA(const IN_ADDR *pin, LPSTR buffer)
{
ULONG size = 16;
if (RtlIpv4AddressToStringExA(pin, 0, buffer, &size)) size = 0;
return buffer + size - 1;
}
static BOOL is_ipv4_in_ipv6(const IN6_ADDR *address)
{
if (address->s6_words[5] == htons(0x5efe) && (address->s6_words[4] & ~htons(0x200)) == 0)
return TRUE;
if (*(UINT64 *)address != 0)
return FALSE;
if (address->s6_words[4] != 0 && address->s6_words[4] != 0xffff)
return FALSE;
if (address->s6_words[4] == 0 && address->s6_words[5] != 0 && address->s6_words[5] != 0xffff)
return FALSE;
if (address->s6_words[4] == 0xffff && address->s6_words[5] != 0)
return FALSE;
if (address->s6_words[6] == 0)
return FALSE;
return TRUE;
}
/***********************************************************************
* RtlIpv6AddressToStringExA [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv6AddressToStringExA(const IN6_ADDR *address, ULONG scope, USHORT port,
char *str, ULONG *size)
{
char buffer[64], *p = buffer;
int i, len, gap = -1, gap_len = 1, ipv6_end = 8;
ULONG needed;
NTSTATUS ret;
TRACE("(%p %lu %u %p %p)\n", address, scope, port, str, size);
if (!address || !str || !size)
return STATUS_INVALID_PARAMETER;
if (is_ipv4_in_ipv6(address))
ipv6_end = 6;
for (i = 0; i < ipv6_end; i++)
{
len = 0;
while (!address->s6_words[i] && i < ipv6_end)
{
i++;
len++;
}
if (len > gap_len)
{
gap = i - len;
gap_len = len;
}
}
if (port) p += sprintf(p, "[");
i = 0;
while (i < ipv6_end)
{
if (i == gap)
{
p += sprintf(p, ":");
i += gap_len;
if (i == ipv6_end) p += sprintf(p, ":");
continue;
}
if (i > 0) p += sprintf(p, ":");
p += sprintf(p, "%x", ntohs(address->s6_words[i]));
i++;
}
if (ipv6_end == 6)
{
if (p[-1] != ':') p += sprintf(p, ":");
p = RtlIpv4AddressToStringA((IN_ADDR *)(address->s6_words + 6), p);
}
if (scope) p += sprintf(p, "%%%lu", scope);
if (port) p += sprintf(p, "]:%u", ntohs(port));
needed = p - buffer + 1;
if (*size >= needed)
{
strcpy(str, buffer);
ret = STATUS_SUCCESS;
}
else
{
ret = STATUS_INVALID_PARAMETER;
}
*size = needed;
return ret;
}
/***********************************************************************
* RtlIpv6AddressToStringA [NTDLL.@]
*/
char * WINAPI RtlIpv6AddressToStringA(const IN6_ADDR *address, char *str)
{
ULONG size = 46;
if (!address || !str) return str - 1;
str[45] = 0; /* this byte is set even though the string is always shorter */
RtlIpv6AddressToStringExA(address, 0, 0, str, &size);
return str + size - 1;
}
/***********************************************************************
* RtlIpv6AddressToStringExW [NTDLL.@]
*/
NTSTATUS WINAPI RtlIpv6AddressToStringExW(const IN6_ADDR *address, ULONG scope, USHORT port,
WCHAR *str, ULONG *size)
{
char cstr[64];
NTSTATUS ret = RtlIpv6AddressToStringExA(address, scope, port, cstr, size);
if (ret == STATUS_SUCCESS) RtlMultiByteToUnicodeN(str, *size * sizeof(WCHAR), NULL, cstr, *size);
return ret;
}
/***********************************************************************
* RtlIpv6AddressToStringW [NTDLL.@]
*/
WCHAR * WINAPI RtlIpv6AddressToStringW(const IN6_ADDR *address, WCHAR *str)
{
ULONG size = 46;
if (!address || !str) return str;
str[45] = 0; /* this word is set even though the string is always shorter */
if (RtlIpv6AddressToStringExW(address, 0, 0, str, &size) != STATUS_SUCCESS)
return str;
return str + size - 1;
}
...@@ -556,6 +556,25 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec ...@@ -556,6 +556,25 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
} }
/*************************************************************************
* RtlGetNativeSystemInformation (NTDLL.@)
*/
NTSTATUS WINAPI RtlGetNativeSystemInformation( SYSTEM_INFORMATION_CLASS class,
void *info, ULONG size, ULONG *ret_size )
{
return NtWow64GetNativeSystemInformation( class, info, size, ret_size );
}
/***********************************************************************
* RtlIsProcessorFeaturePresent [NTDLL.@]
*/
BOOLEAN WINAPI RtlIsProcessorFeaturePresent( UINT feature )
{
return NtWow64IsProcessorFeaturePresent( feature );
}
/************************************************************************* /*************************************************************************
* RtlWalkFrameChain (NTDLL.@) * RtlWalkFrameChain (NTDLL.@)
*/ */
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "windef.h" #include "windef.h"
#include "winternl.h" #include "winternl.h"
#include "ddk/wdm.h"
#include "wine/exception.h" #include "wine/exception.h"
#include "ntdll_misc.h" #include "ntdll_misc.h"
#include "wine/debug.h" #include "wine/debug.h"
...@@ -590,6 +591,45 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec ...@@ -590,6 +591,45 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
} }
/*************************************************************************
* RtlGetNativeSystemInformation (NTDLL.@)
*/
NTSTATUS WINAPI RtlGetNativeSystemInformation( SYSTEM_INFORMATION_CLASS class,
void *info, ULONG size, ULONG *ret_size )
{
return NtQuerySystemInformation( class, info, size, ret_size );
}
/***********************************************************************
* RtlIsProcessorFeaturePresent [NTDLL.@]
*/
BOOLEAN WINAPI RtlIsProcessorFeaturePresent( UINT feature )
{
static const ULONGLONG arm64_features =
(1ull << PF_COMPARE_EXCHANGE_DOUBLE) |
(1ull << PF_NX_ENABLED) |
(1ull << PF_ARM_VFP_32_REGISTERS_AVAILABLE) |
(1ull << PF_ARM_NEON_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_SECOND_LEVEL_ADDRESS_TRANSLATION) |
(1ull << PF_FASTFAIL_AVAILABLE) |
(1ull << PF_ARM_DIVIDE_INSTRUCTION_AVAILABLE) |
(1ull << PF_ARM_64BIT_LOADSTORE_ATOMIC) |
(1ull << PF_ARM_EXTERNAL_CACHE_AVAILABLE) |
(1ull << PF_ARM_FMAC_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V8_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE) |
(1ull << PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE);
return (feature < PROCESSOR_FEATURE_MAX && (arm64_features & (1ull << feature)) &&
user_shared_data->ProcessorFeatures[feature]);
}
/************************************************************************* /*************************************************************************
* RtlWalkFrameChain (NTDLL.@) * RtlWalkFrameChain (NTDLL.@)
*/ */
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "windef.h" #include "windef.h"
#include "winternl.h" #include "winternl.h"
#include "ddk/wdm.h"
#include "wine/exception.h" #include "wine/exception.h"
#include "wine/list.h" #include "wine/list.h"
#include "ntdll_misc.h" #include "ntdll_misc.h"
...@@ -269,7 +270,7 @@ DEFINE_SYSCALL(NtQueryVolumeInformationFile, (HANDLE handle, IO_STATUS_BLOCK *io ...@@ -269,7 +270,7 @@ DEFINE_SYSCALL(NtQueryVolumeInformationFile, (HANDLE handle, IO_STATUS_BLOCK *io
DEFINE_SYSCALL(NtQueueApcThread, (HANDLE handle, PNTAPCFUNC func, ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)) DEFINE_SYSCALL(NtQueueApcThread, (HANDLE handle, PNTAPCFUNC func, ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3))
DEFINE_SYSCALL(NtQueueApcThreadEx, (HANDLE handle, HANDLE reserve_handle, PNTAPCFUNC func, ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)) DEFINE_SYSCALL(NtQueueApcThreadEx, (HANDLE handle, HANDLE reserve_handle, PNTAPCFUNC func, ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3))
DEFINE_WRAPPED_SYSCALL(NtRaiseException, (EXCEPTION_RECORD *rec, ARM64_NT_CONTEXT *context, BOOL first_chance)) DEFINE_WRAPPED_SYSCALL(NtRaiseException, (EXCEPTION_RECORD *rec, ARM64_NT_CONTEXT *context, BOOL first_chance))
DEFINE_SYSCALL(NtRaiseHardError, (NTSTATUS status, ULONG count, UNICODE_STRING *params_mask, void **params, HARDERROR_RESPONSE_OPTION option, HARDERROR_RESPONSE *response)) DEFINE_SYSCALL(NtRaiseHardError, (NTSTATUS status, ULONG count, ULONG params_mask, void **params, HARDERROR_RESPONSE_OPTION option, HARDERROR_RESPONSE *response))
DEFINE_SYSCALL(NtReadFile, (HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io, void *buffer, ULONG length, LARGE_INTEGER *offset, ULONG *key)) DEFINE_SYSCALL(NtReadFile, (HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io, void *buffer, ULONG length, LARGE_INTEGER *offset, ULONG *key))
DEFINE_SYSCALL(NtReadFileScatter, (HANDLE file, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io, FILE_SEGMENT_ELEMENT *segments, ULONG length, LARGE_INTEGER *offset, ULONG *key)) DEFINE_SYSCALL(NtReadFileScatter, (HANDLE file, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io, FILE_SEGMENT_ELEMENT *segments, ULONG length, LARGE_INTEGER *offset, ULONG *key))
DEFINE_SYSCALL(NtReadVirtualMemory, (HANDLE process, const void *addr, void *buffer, SIZE_T size, SIZE_T *bytes_read)) DEFINE_SYSCALL(NtReadVirtualMemory, (HANDLE process, const void *addr, void *buffer, SIZE_T size, SIZE_T *bytes_read))
...@@ -1194,6 +1195,25 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec ...@@ -1194,6 +1195,25 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec
} }
/*************************************************************************
* RtlGetNativeSystemInformation (NTDLL.@)
*/
NTSTATUS WINAPI RtlGetNativeSystemInformation( SYSTEM_INFORMATION_CLASS class,
void *info, ULONG size, ULONG *ret_size )
{
return NtQuerySystemInformation( class, info, size, ret_size );
}
/***********************************************************************
* RtlIsProcessorFeaturePresent [NTDLL.@]
*/
BOOLEAN WINAPI RtlIsProcessorFeaturePresent( UINT feature )
{
return feature < PROCESSOR_FEATURE_MAX && user_shared_data->ProcessorFeatures[feature];
}
/************************************************************************* /*************************************************************************
* RtlWalkFrameChain (NTDLL.@) * RtlWalkFrameChain (NTDLL.@)
*/ */
......
...@@ -451,6 +451,25 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4, ...@@ -451,6 +451,25 @@ __ASM_STDCALL_FUNC( RtlRaiseException, 4,
"ret $4" ) /* actually never returns */ "ret $4" ) /* actually never returns */
/*************************************************************************
* RtlGetNativeSystemInformation (NTDLL.@)
*/
NTSTATUS WINAPI RtlGetNativeSystemInformation( SYSTEM_INFORMATION_CLASS class,
void *info, ULONG size, ULONG *ret_size )
{
return NtWow64GetNativeSystemInformation( class, info, size, ret_size );
}
/***********************************************************************
* RtlIsProcessorFeaturePresent [NTDLL.@]
*/
BOOLEAN WINAPI RtlIsProcessorFeaturePresent( UINT feature )
{
return NtWow64IsProcessorFeaturePresent( feature );
}
/************************************************************************* /*************************************************************************
* RtlWalkFrameChain (NTDLL.@) * RtlWalkFrameChain (NTDLL.@)
*/ */
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define WIN32_NO_STATUS #define WIN32_NO_STATUS
#include "windef.h" #include "windef.h"
#include "winternl.h" #include "winternl.h"
#include "ddk/wdm.h"
#include "wine/exception.h" #include "wine/exception.h"
#include "wine/list.h" #include "wine/list.h"
#include "ntdll_misc.h" #include "ntdll_misc.h"
...@@ -792,6 +793,25 @@ __ASM_GLOBAL_FUNC( RtlRaiseException, ...@@ -792,6 +793,25 @@ __ASM_GLOBAL_FUNC( RtlRaiseException,
"call " __ASM_NAME("RtlRaiseStatus") /* does not return */ ); "call " __ASM_NAME("RtlRaiseStatus") /* does not return */ );
/*************************************************************************
* RtlGetNativeSystemInformation (NTDLL.@)
*/
NTSTATUS WINAPI RtlGetNativeSystemInformation( SYSTEM_INFORMATION_CLASS class,
void *info, ULONG size, ULONG *ret_size )
{
return NtQuerySystemInformation( class, info, size, ret_size );
}
/***********************************************************************
* RtlIsProcessorFeaturePresent [NTDLL.@]
*/
BOOLEAN WINAPI RtlIsProcessorFeaturePresent( UINT feature )
{
return feature < PROCESSOR_FEATURE_MAX && user_shared_data->ProcessorFeatures[feature];
}
/************************************************************************* /*************************************************************************
* RtlWalkFrameChain (NTDLL.@) * RtlWalkFrameChain (NTDLL.@)
*/ */
......
...@@ -2624,14 +2624,15 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type, ...@@ -2624,14 +2624,15 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type,
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static UNICODE_STRING query_reg_values_direct_str; static WCHAR query_reg_values_direct_str_buf[32];
static UNICODE_STRING query_reg_values_direct_str = {0, 0, query_reg_values_direct_str_buf};
static ULONG query_reg_values_direct_int; static ULONG query_reg_values_direct_int;
static union static union
{ {
ULONG size; ULONG size;
char data[16]; char data[32];
} }
query_reg_values_direct_sized; query_reg_values_direct_sized;
...@@ -2639,7 +2640,7 @@ static struct ...@@ -2639,7 +2640,7 @@ static struct
{ {
ULONG size; ULONG size;
ULONG type; ULONG type;
char data[16]; char data[32];
} }
query_reg_values_direct_typed; query_reg_values_direct_typed;
...@@ -2689,16 +2690,25 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2689,16 +2690,25 @@ static struct query_reg_values_test query_reg_values_tests[] =
}, },
{ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }}, {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_SZ, L"C:" STATUS_SUCCESS, 0, 0, REG_NONE, L"C:"
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_NONE, L"\x2323", 0, 2 * sizeof(WCHAR)
}, },
{ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"WindowsDrive", {{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"WindowsDrive",
&query_reg_values_direct_str }}, &query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_SZ, L"%SYSTEMDRIVE%" STATUS_SUCCESS, 0, 0, REG_NONE, L"%SYSTEMDRIVE%"
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"WindowsDrive",
&query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_NONE, L"\x2323", 0, 2 * sizeof(WCHAR)
}, },
{ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"MeaningOfLife32", &query_reg_values_direct_int }}, {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"MeaningOfLife32", &query_reg_values_direct_int }},
STATUS_SUCCESS, 0, 0, REG_DWORD, (WCHAR*)42 STATUS_SUCCESS, 0, 0, REG_NONE, L"\x2a"
}, },
{ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"MeaningOfLife64", &query_reg_values_direct_sized }}, {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"MeaningOfLife64", &query_reg_values_direct_sized }},
...@@ -2724,7 +2734,12 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2724,7 +2734,12 @@ static struct query_reg_values_test query_reg_values_tests[] =
{ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"CapitalsOfEurope", {{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"CapitalsOfEurope",
&query_reg_values_direct_str }}, &query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_SZ, L"Brussels\0Paris\0%PATH%\0", sizeof(L"Brussels\0Paris\0%PATH%\0") STATUS_SUCCESS, 0, 0, REG_NONE, L"Brussels\0Paris\0%PATH%\0", sizeof(L"Brussels\0Paris\0%PATH%\0")
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"CapitalsOfEurope",
&query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_NONE, L"\x2323", 0, 2 * sizeof(WCHAR)
}, },
/* DIRECT with a null buffer crashes on Windows */ /* DIRECT with a null buffer crashes on Windows */
/* { /* {
...@@ -2768,11 +2783,11 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2768,11 +2783,11 @@ static struct query_reg_values_test query_reg_values_tests[] =
}, },
{ {
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_EXPAND_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_EXPAND_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }},
STATUS_SUCCESS, 1, WINE_TODO_TYPE | WINE_TODO_SIZE, REG_SZ, L"C:" STATUS_SUCCESS, 1, 0, REG_SZ, L"C:"
}, },
{ {
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_MULTI_SZ, (WCHAR*)L"Brussels\0Paris\0%PATH%\0" }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_MULTI_SZ, (WCHAR*)L"Brussels\0Paris\0%PATH%\0" }},
STATUS_SUCCESS, 3, EXPECT_DEFAULT_DATA | SPLIT_MULTI | WINE_TODO_CALLS | WINE_TODO_TYPE | WINE_TODO_SIZE STATUS_SUCCESS, 3, EXPECT_DEFAULT_DATA | SPLIT_MULTI
}, },
{ {
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_DWORD, (WCHAR*)0xdeadbeef }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_DWORD, (WCHAR*)0xdeadbeef }},
...@@ -2788,21 +2803,76 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2788,21 +2803,76 @@ static struct query_reg_values_test query_reg_values_tests[] =
&query_reg_values_direct_str, REG_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }}, &query_reg_values_direct_str, REG_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }},
STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA
}, },
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_str, REG_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }},
STATUS_SUCCESS, 0, 0, REG_NONE, L"\x2323", 0, 2 * sizeof(WCHAR)
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_str, REG_EXPAND_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }},
STATUS_SUCCESS, 0, 0, REG_NONE, L"C:"
},
{ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist", {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_str, REG_EXPAND_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }}, &query_reg_values_direct_str, REG_EXPAND_SZ, (WCHAR*)L"%SYSTEMDRIVE%" }},
STATUS_SUCCESS, 0, WINE_TODO_SIZE | WINE_TODO_DATA, REG_EXPAND_SZ, L"C:" STATUS_SUCCESS, 0, 0, REG_NONE, L"\x2323", 0, 2 * sizeof(WCHAR)
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_int, REG_DWORD, (WCHAR*)0xdeadbeef }},
STATUS_SUCCESS, 0
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_int, REG_DWORD, (WCHAR*)L"\x2a", sizeof(DWORD) }},
STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA
}, },
/* DIRECT with a multi-string default value crashes on Windows */ {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_sized, REG_DWORD, (WCHAR*)L"Some default", sizeof(L"Some default") }},
STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_sized, REG_DWORD, (WCHAR*)L"Some default", sizeof(L"Some default") }},
STATUS_SUCCESS, 0, 0, REG_NONE, L"\xff", 1, 1
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_typed, REG_NONE, (WCHAR*)L"Some default", sizeof(L"Some default") }},
STATUS_SUCCESS, 0, WINE_TODO_TYPE | WINE_TODO_SIZE, 0x23, NULL, -1
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_typed, REG_QWORD, (WCHAR*)L"Some default", sizeof(L"Some default") }},
STATUS_SUCCESS, 0, WINE_TODO_TYPE | WINE_TODO_SIZE, 0x23, NULL, -1
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_typed, REG_QWORD, (WCHAR*)L"\x2a\0\0", sizeof(UINT64) }},
STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA
},
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_typed, REG_QWORD, (WCHAR*)L"\x2a\0\0", sizeof(UINT64) }},
STATUS_SUCCESS, 0, 0, 0x23, L"\x23", 1, 1
},
/* DIRECT with a multi-string default value crashes on Windows without NOEXPAND */
/* { /* {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist", {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_str, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C\0", sizeof(L"A\0B\0C\0") }}, &query_reg_values_direct_str, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C\0", sizeof(L"A\0B\0C\0") }},
STATUS_SUCCESS, EXPECT_DEFAULT_DATA STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA
}, */ }, */
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"I don't exist",
&query_reg_values_direct_str, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C\0", sizeof(L"A\0B\0C\0") }},
STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA | WINE_TODO_SIZE
},
/* The default value is not used if it is not valid */ /* The default value is not used if it is not valid */
{ {
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_SZ }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_SZ }},
STATUS_DATA_OVERRUN, 0, EXPECT_DEFAULT_DATA | WINE_TODO_RET | WINE_TODO_CALLS STATUS_DATA_OVERRUN, 0, EXPECT_DEFAULT_DATA
}, },
{ {
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_NONE, (WCHAR*)L"Some default" }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_NONE, (WCHAR*)L"Some default" }},
...@@ -2818,12 +2888,6 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2818,12 +2888,6 @@ static struct query_reg_values_test query_reg_values_tests[] =
&query_reg_values_direct_str, REG_NONE, (WCHAR*)L"Some default" }}, &query_reg_values_direct_str, REG_NONE, (WCHAR*)L"Some default" }},
STATUS_SUCCESS, 0, 0, REG_NONE, NULL, -1 STATUS_SUCCESS, 0, 0, REG_NONE, NULL, -1
}, },
/* DIRECT additionally requires the default value to be a string */
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_int, REG_DWORD, (WCHAR*)0xdeadbeef }},
STATUS_SUCCESS, 0
},
/* REQUIRED fails if the value doesn't exist and there is no default */ /* REQUIRED fails if the value doesn't exist and there is no default */
{ {
{{ query_routine, RTL_QUERY_REGISTRY_REQUIRED, (WCHAR*)L"I don't exist", {{ query_routine, RTL_QUERY_REGISTRY_REQUIRED, (WCHAR*)L"I don't exist",
...@@ -2838,7 +2902,7 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2838,7 +2902,7 @@ static struct query_reg_values_test query_reg_values_tests[] =
/* DELETE deletes the value after reading it */ /* DELETE deletes the value after reading it */
{ {
{{ query_routine, RTL_QUERY_REGISTRY_DELETE, (WCHAR*)L"WindowsDrive" }}, {{ query_routine, RTL_QUERY_REGISTRY_DELETE, (WCHAR*)L"WindowsDrive" }},
STATUS_SUCCESS, 1, WINE_TODO_TYPE | WINE_TODO_SIZE, REG_SZ, L"C:" STATUS_SUCCESS, 1, 0, REG_SZ, L"C:"
}, },
{ {
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_SZ, (WCHAR*)L"Some default" }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_SZ, (WCHAR*)L"Some default" }},
...@@ -2871,10 +2935,6 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2871,10 +2935,6 @@ static void test_RtlQueryRegistryValues(void)
L"Yellow", sizeof(L"Yellow")); L"Yellow", sizeof(L"Yellow"));
ok(status == ERROR_SUCCESS, "Failed to create registry value Color: %lu\n", status); ok(status == ERROR_SUCCESS, "Failed to create registry value Color: %lu\n", status);
query_reg_values_direct_str.MaximumLength = 32 * sizeof(WCHAR);
query_reg_values_direct_str.Buffer = pRtlAllocateHeap(GetProcessHeap(), 0,
query_reg_values_direct_str.MaximumLength);
for (i = 0; i < ARRAY_SIZE(query_reg_values_tests); i++) for (i = 0; i < ARRAY_SIZE(query_reg_values_tests); i++)
{ {
struct query_reg_values_test *test = &query_reg_values_tests[i]; struct query_reg_values_test *test = &query_reg_values_tests[i];
...@@ -2893,9 +2953,14 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2893,9 +2953,14 @@ static void test_RtlQueryRegistryValues(void)
query_routine_calls = 0; query_routine_calls = 0;
query_reg_values_direct_str.Length = query_reg_values_direct_str.MaximumLength - sizeof(WCHAR); query_reg_values_direct_str.MaximumLength = test->size_limit ? test->size_limit
: sizeof(query_reg_values_direct_str_buf);
if (query_reg_values_direct_str.MaximumLength >= sizeof(WCHAR))
query_reg_values_direct_str.Length = query_reg_values_direct_str.MaximumLength - sizeof(WCHAR);
else
query_reg_values_direct_str.Length = 0;
memset(query_reg_values_direct_str.Buffer, 0x23, query_reg_values_direct_str.Length); memset(query_reg_values_direct_str.Buffer, 0x23, query_reg_values_direct_str.Length);
query_reg_values_direct_str.Buffer[query_reg_values_direct_str.Length] = 0; query_reg_values_direct_str.Buffer[query_reg_values_direct_str.Length / sizeof(WCHAR)] = 0;
query_reg_values_direct_int = 1; query_reg_values_direct_int = 1;
...@@ -2959,12 +3024,12 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2959,12 +3024,12 @@ static void test_RtlQueryRegistryValues(void)
{ {
if (expected_data) if (expected_data)
{ {
ok(!memcmp(&query_reg_values_direct_int, &expected_data, expected_size), ok(!memcmp(&query_reg_values_direct_int, expected_data, expected_size),
"Data does not match\n"); "Data does not match\n");
} }
else else
{ {
- ok(query_reg_values_direct_int == 1, ok(query_reg_values_direct_int == 1,
"Expected data to not change, got %lu\n", query_reg_values_direct_int); "Expected data to not change, got %lu\n", query_reg_values_direct_int);
} }
} }
...@@ -2975,14 +3040,22 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2975,14 +3040,22 @@ static void test_RtlQueryRegistryValues(void)
} }
else if (query->EntryContext == &query_reg_values_direct_typed) else if (query->EntryContext == &query_reg_values_direct_typed)
{ {
if (expected_size == -1)
expected_size = sizeof(query_reg_values_direct_typed.data);
todo_wine_if(test->flags & WINE_TODO_SIZE)
ok(query_reg_values_direct_typed.size == expected_size, ok(query_reg_values_direct_typed.size == expected_size,
"Expected size %lu, got %lu\n", expected_size, query_reg_values_direct_typed.size); "Expected size %lu, got %lu\n", expected_size, query_reg_values_direct_typed.size);
todo_wine_if(test->flags & WINE_TODO_TYPE)
ok(query_reg_values_direct_typed.type == expected_type, ok(query_reg_values_direct_typed.type == expected_type,
"Expected type %lu, got %lu\n", expected_type, query_reg_values_direct_typed.type); "Expected type %lu, got %lu\n", expected_type, query_reg_values_direct_typed.type);
ok(!memcmp(query_reg_values_direct_typed.data, expected_data, expected_size), if (expected_data)
"Data does not match\n"); {
ok(!memcmp(query_reg_values_direct_typed.data, expected_data, expected_size),
"Data does not match\n");
}
} }
} }
} }
...@@ -2992,8 +3065,6 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2992,8 +3065,6 @@ static void test_RtlQueryRegistryValues(void)
status = RegDeleteKeyValueW(HKEY_CURRENT_USER, L"WineTest", L"WindowsDrive"); status = RegDeleteKeyValueW(HKEY_CURRENT_USER, L"WineTest", L"WindowsDrive");
ok(status == ERROR_FILE_NOT_FOUND, "Registry value WindowsDrive should have been deleted already\n"); ok(status == ERROR_FILE_NOT_FOUND, "Registry value WindowsDrive should have been deleted already\n");
pRtlFreeHeap(GetProcessHeap(), 0, query_reg_values_direct_str.Buffer);
} }
START_TEST(reg) START_TEST(reg)
......
...@@ -2822,18 +2822,13 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc ...@@ -2822,18 +2822,13 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc
TRACE( "%p %s %p %d %p %d %p\n", device, iocodex(code), in_buffer, in_size, out_buffer, out_size, io ); TRACE( "%p %s %p %d %p %d %p\n", device, iocodex(code), in_buffer, in_size, out_buffer, out_size, io );
io->Information = 0;
if ((status = server_get_unix_fd( device, 0, &fd, &needs_close, NULL, NULL ))) if ((status = server_get_unix_fd( device, 0, &fd, &needs_close, NULL, NULL )))
{ return status;
if (status == STATUS_BAD_DEVICE_TYPE) return status; /* no associated fd */
goto error;
}
if ((status = CDROM_Open(fd, &dev))) if ((status = CDROM_Open(fd, &dev)))
{ {
if (needs_close) close( fd ); if (needs_close) close( fd );
goto error; return status;
} }
#ifdef __APPLE__ #ifdef __APPLE__
...@@ -2847,16 +2842,13 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc ...@@ -2847,16 +2842,13 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc
* Also for some reason it wants the fd to be closed before we even * Also for some reason it wants the fd to be closed before we even
* open the parent if we're trying to eject the disk. * open the parent if we're trying to eject the disk.
*/ */
if ((status = get_parent_device( fd, name, sizeof(name) ))) goto error; if ((status = get_parent_device( fd, name, sizeof(name) ))) return status;
if (code == IOCTL_STORAGE_EJECT_MEDIA) if (code == IOCTL_STORAGE_EJECT_MEDIA)
NtClose( device ); NtClose( device );
if (needs_close) close( fd ); if (needs_close) close( fd );
TRACE("opening parent %s\n", name ); TRACE("opening parent %s\n", name );
if ((fd = open( name, O_RDONLY )) == -1) if ((fd = open( name, O_RDONLY )) == -1)
{ return errno_to_status( errno );
status = errno_to_status( errno );
goto error;
}
needs_close = 1; needs_close = 1;
} }
#endif #endif
...@@ -3117,13 +3109,10 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc ...@@ -3117,13 +3109,10 @@ NTSTATUS cdrom_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc
break; break;
default: default:
if (needs_close) close( fd ); status = STATUS_NOT_SUPPORTED;
return STATUS_NOT_SUPPORTED;
} }
if (needs_close) close( fd ); if (needs_close) close( fd );
error: if (!NT_ERROR(status))
io->Status = status; file_complete_async( device, event, apc, apc_user, io, status, sz );
io->Information = sz;
if (event) NtSetEvent(event, NULL);
return status; return status;
} }