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 (25)
Showing with 1271 additions and 1240 deletions
The Wine development release 9.10 is now available. The Wine development release 9.11 is now available.
What's new in this release: What's new in this release:
- Bundled vkd3d upgraded to version 1.12. - C++ exception handling on ARM platforms.
- DPI Awareness support improvements. - More DPI Awareness support improvements.
- C++ RTTI support on ARM platforms.
- More obsolete features removed in WineD3D.
- Various bug fixes. - Various bug fixes.
The source is available at <https://dl.winehq.org/wine/source/9.x/wine-9.10.tar.xz> The source is available at <https://dl.winehq.org/wine/source/9.x/wine-9.11.tar.xz>
Binary packages for various distributions will be available Binary packages for various distributions will be available
from <https://www.winehq.org/download> from <https://www.winehq.org/download>
...@@ -17,340 +15,352 @@ You will find documentation on <https://www.winehq.org/documentation> ...@@ -17,340 +15,352 @@ You will find documentation on <https://www.winehq.org/documentation>
Wine is available thanks to the work of many people. Wine is available thanks to the work of many people.
See the file [AUTHORS][1] for the complete list. See the file [AUTHORS][1] for the complete list.
[1]: https://gitlab.winehq.org/wine/wine/-/raw/wine-9.10/AUTHORS [1]: https://gitlab.winehq.org/wine/wine/-/raw/wine-9.11/AUTHORS
---------------------------------------------------------------- ----------------------------------------------------------------
### Bugs fixed in 9.10 (total 18): ### Bugs fixed in 9.11 (total 27):
- #23434 Race management software hangs & jumps up to 100% processor load - #42270 Settlers 4 Gold - Hardware Rendering mode not working
- #34708 Silent Hill 4: The Room crashes after first videoscene when trying to go to the door. - #49703 Ghost Recon fails to start
- #45493 SRPG Studio games need proper DISPATCH_PROPERTYPUTREF implementation - #50983 Multiple games stuck playing cutscenes (The Long Dark, The Room 4: Old Sins, Saint Kotar)
- #46039 Paint.NET 4.1 (.NET 4.7 app) installer tries to run MS .NET Framework 4.7 installer (Wine-Mono only advertises as .NET 4.5) - #51174 api-ms-win-core-version-l1-1-0: Missing GetFileVersionInfoW and GetFileVersionInfoSizeW
- #46787 Notepad++ rather slow (GetLocaleInfoEx) - #52585 Multiple applications need NtQueryDirectoryObject to return multiple entries (Cygwin shells, WinObj 3.01)
- #50196 can not copy words between wine apps and ubuntu apps - #53960 ucrt has different struct layout than msvcrt
- #50789 Multiple .NET applications crash with unimplemented 'System.Security.Principal.WindowsIdentity.get_Owner' using Wine-Mono (Affinity Photo 1.9.1, Pivot Animator 4.2) - #54615 dwrite:layout - test_system_fallback() gets unexpected "Meiryo UI" font name in Japanese and Chinese on Windows
- #52691 FL Studio 20.9.1 Freezes on start-up - #55362 NeuralNote: Crashes and Rendering issues (alson in VST3 form)
- #54992 EA app launcher does not render correctly - #55472 DTS Encoder Suite gets stuck with encode pending from Wine 8.14
- #56548 reMarkable crashes on start - #56095 Clanbomber 1.05 starts after a long (30 seconds) delay
- #56582 vb3 combobox regression: single click scrolls twice - #56397 Numlock status not recognized when using winewayland.drv
- #56602 DualShock 4 controller behaves incorrectly on Darwin with hidraw enabled - #56451 catch block fetches bogus frame when using alignas with 32 or higher
- #56666 BExAnalyzer from SAP 7.30 does not work correctly - #56460 Multiple games have stutter issues (Overwatch 2, Aimbeast)
- #56674 Multiple games fail to launch (Far Cry 3, Horizon Zero Dawn CE, Metro Exodus) - #56591 Steam doesn't render individual game pages correctly
- #56718 Compilation fails on Ubuntu 20.04 with bison 3.5.1 - #56606 PhysX installer fails to start
- #56724 New chromium versions don't start under wine anymore - #56640 Genshin Impact: The game-launcher cannot be started anymore
- #56730 Access violation in riched20.dll when running EditPad - #56744 Serial number in smbios system table is not filled on Linux in practice
- #56736 App packager from Windows SDK (MakeAppx.exe) 'pack' command crashes on unimplemented function ntdll.dll.RtlLookupElementGenericTableAvl - #56747 Steam won’t load in the new wow64 mode when using DXVK
- #56755 White textures in EverQuest (Unsupported Conversion in windowscodec/convert.c)
### Changes since 9.9: - #56764 Empire Earth Gold doesn't start in virtual desktop mode
- #56766 CDmage 1.01.5 does not redraw window contents fully
- #56781 srcrrun: Dictionary setting item to object fails
- #56788 ComicRackCE crashes when viewing "info" for a comic file
- #56800 Nomad Factory plugins GUI is broken
- #56813 Hard West 2 crashes before entering the main menu (OpenGL renderer)
- #56824 Postal 2 (20th Anniversary update) crashes when loading the map
- #56828 Moku.exe crashes on startup
### Changes since 9.10:
``` ```
Aida Jonikienė (2): Adam Rehn (1):
dxdiagn: Add bIsD3DDebugRuntime property. wineserver: Report non-zero exit code for abnormal process termination.
dxdiagn: Add AGP properties.
Alex Henrie (12):
Alexandre Julliard (52): ntdll/tests: Delete the WineTest registry key when the tests finish.
msvcrt: Add helpers to abstract RVA accesses to RTTI data. ntdll/tests: Rewrite the RtlQueryRegistryValues tests and add more of them.
msvcrt: Unify __RTtypeid implementation. ntdll: Succeed in RtlQueryRegistryValues on direct query of nonexistent value.
msvcrt: Unify __RTDynamicCast implementation. ntdll: Don't call QueryRoutine if RTL_QUERY_REGISTRY_DIRECT is set.
msvcrt: Unify _CxxThrowException implementation. ntdll: Don't call a null QueryRoutine in RtlQueryRegistryValues.
msvcrt: Unify _is_exception_typeof implementation. ntdll/tests: Remove unused WINE_CRASH flag.
msvcrt: Unify __ExceptionPtrCopyException implementation. ntdll: Copy the correct number of bytes with RTL_QUERY_REGISTRY_DIRECT.
msvcrt: Unify exception_ptr_from_record implementation. ntdll: Calculate the default size even without RTL_QUERY_REGISTRY_DIRECT.
msvcrt: Unify call_copy_ctor/call_dtor implementations. ntdll: Don't accept a query routine when using RTL_QUERY_REGISTRY_DIRECT.
msvcp: Unify __ExceptionPtrCopyException implementation. ntdll: Set the string size when using RTL_QUERY_REGISTRY_DIRECT.
msvcp: Unify __ExceptionPtrCurrentException implementation. ntdll: Only allow string default values with RTL_QUERY_REGISTRY_DIRECT.
msvcp: Unify call_copy_ctor/call_dtor implementations. ntdll: Replace the whole string when using RTL_QUERY_REGISTRY_DIRECT.
msvcrt: Use RVAs in rtti and exception data on all platforms except i386.
msvcp: Use RVAs in rtti and exception data on all platforms except i386. Alexandre Julliard (40):
msvcrt/tests: Use function pointers to bypass builtin malloc/realloc. faudio: Import upstream release 24.06.
msvcp/tests: Fix mangled names on ARM. msvcrt: Share a helper macro to print an exception type.
winecrt0: Initialize the Unix call dispatcher on first use. msvcrt: Share the dump_function_descr() helper between platforms.
ntdll: Make __wine_unix_call() an inline function. msvcrt: Fix the ip_to_state() helper for out of bounds values.
wbemprox: Avoid unused function warning. msvcrt: Don't use rva_to_ptr() for non-RVA values.
kernelbase: Fix the name of the default system locale. msvcrt: Use the copy_exception() helper in __CxxExceptionFilter.
wbemprox: Don't reference yysymbol_name on older bisons. msvcrt: Share the __CxxExceptionFilter implementation between platforms.
conhost: Fix a printf format warning. msvcrt: Share the common part of _fpieee_flt between platforms.
winegcc: Don't print a potentially reallocated pointer. msvcrt: Consistently use the rtti_rva() helper.
adsldpc: Add correct C++ mangled names for all platforms. winedump: Fix dumping of catchblocks for 32-bit modules.
dxtrans: Add correct C++ mangled names for all platforms. msvcrt: The catchblock frame member isn't present on 32-bit.
msmpeg2vdec: Add correct C++ mangled names for all platforms. msvcrt: Use pointer-sized types instead of hardcoding 64-bit in __CxxFrameHandler.
vssapi: Add correct C++ mangled names for all platforms. msvcrt: Share __CxxFrameHandler implementation with ARM platforms.
msvcrt: Fix bad_cast_copy_ctor spec entry on ARM. msvcrt: Add platform-specific helpers to call C++ exception handlers.
msvcrt: Export all _ConcRT functions also on ARM. msvcrt: Add platform-specific helpers to retrieve the exception PC.
msvcp120_app: Fix a typo in a C++ mangled name. msvcrt: Use platform-specific handlers also for __CxxFrameHandler4.
msvcp: Replace some stubs by exported functions that already exist for other platforms. ntdll: Fix stack alignment in __C_ExecuteExceptionFilter on ARM.
msvcp: Export the thiscall version of ios_base_Tidy. ntdll: Fix a couple of compiler warnings on ARM64EC.
msvcp140: Sort entry points by function instead of platform. ntdll: Fix inverted floating point masks on ARM64EC.
msvcp: Only export thiscall functions on i386. ntdll: Support x87 control word in __os_arm64x_get_x64_information().
msvcp: Only export stubs of thiscall functions on i386. kernel32/tests: Add test for FPU control words on ARM64EC.
msvcrt: Only export thiscall functions on i386. msvcrt: Reimplement __crtCapturePreviousContext() based on RtlWalkFrameChain().
msvcrt: Only export stubs of thiscall functions on i386. msvcrt: Use the __os_arm64x functions to get/set mxcsr on ARM64EC.
msvcrt: Add missing C++ mangled names for ARM. msvcrt: Implement asm sqrt functions on ARM platforms.
msvcirt: Add missing C++ mangled names for ARM. msvcrt: Disable SSE2 memmove implementation on ARM64EC.
msvcp60: Add missing C++ mangled names for ARM. kernelbase: Implement the GetProcAddress wrapper on ARM64EC.
msvcp70: Add missing C++ mangled names for ARM. kernel32: Implement the GetProcAddress wrapper on ARM64EC.
msvcp71: Add missing C++ mangled names for ARM. winex11: Fix build error when XShm is missing.
msvcp80: Add missing C++ mangled names for ARM. ntdll: Look for hybrid builtins in the PE directory for the host architecture.
msvcp90: Add missing C++ mangled names for ARM. ntdll: Remove some unnecessary asm macros on ARM plaforms.
msvcp100: Add missing C++ mangled names for ARM. winecrt0: Remove some unnecessary asm macros on ARM plaforms.
winedump: Print exported function names in the exception data. makedep: Build and install ARM64EC-only modules.
winedump: Print the export or import name of exception handlers. tests: Use ARM64 as architecture in manifests on ARM64EC.
winedump: Dump exception data for known exception handlers. ntdll: Also load arm64 manifests for amd64 architecture on ARM64EC.
vkd3d: Import upstream release 1.12. ntdll: Reimplement __os_arm64x_check_call in assembly.
msvcrt: Move common exception handling types to the header. ntdll: Move some security Rtl functions to sec.c.
msvcrt: Share the find_caught_type() helper between platforms. ntdll: Move some synchronization Rtl functions to sync.c.
msvcrt: Share the copy_exception() helper between platforms. ntdll: Move the error mode Rtl functions to thread.c.
msvcrt: Share a helper to find a catch block handler. ntdll: Move the PEB lock Rtl functions to env.c.
ntdll: Move the memory copy Rtl functions to string.c.
Alexandros Frantzis (15):
opengl32: Remove the wglDescribePixelFormat driver entry point. Alexandros Frantzis (4):
win32u: Emit number characters for numpad virtual keys. server: Pass desktop to get_first_global_hook.
win32u: Allow drivers to send only the scan code for keyboard events. server: Check message target process for raw input device flags.
win32u: Store the full KBD vkey information in kbd_tables_init_vsc2vk. server: Implement key auto-repeat request.
server: Send numpad virtual keys if NumLock is active. win32u: Implement keyboard auto-repeat using new server request.
user32/tests: Add tests for SendInput with numpad scancodes.
winewayland.drv: Populate vkey to wchar entry for VK_DECIMAL. Alistair Leslie-Hughes (2):
server: Fix handling of KEYEVENTF_UNICODE inputs with a non-zero vkey. odbccp32: Check if a full path was supplied for Driver/Setup/Translator entries.
user32/tests: Add more test for unicode input with vkey. odbccp32: Stop handle leak on error paths.
user32/tests: Add tests for raw keyboard messages.
server: Use right-left modifier vkeys for hooks. Benjamin Mayes (1):
server: Apply modifier vkey transformations regardless of unicode flag. windowscodecs: Add conversions from PixelFormat32bppBGRA->PixelFormat16bppBGRA5551.
server: Don't send raw input events for unicode inputs.
user32/tests: Check async key state in raw nolegacy tests. Brendan McGrath (4):
server: Set VK_PACKET async state in raw input legacy mode. kernel32/tests: Test error code when FindFirstFileA uses file as directory.
ntdll/tests: Test error code when NtOpenFile uses file as directory.
Alistair Leslie-Hughes (10): server: Don't always return STATUS_OBJECT_NAME_INVALID on ENOTDIR.
include: Complete __wine_uuidof for C++. ntdll: Treat XDG_SESSION_TYPE as special env variable.
include: Add C++ support for IUnknown.
odbc32: Correct SQLSetConnectOptionW length parameter type.
include: Added sqlucode.h to sql.h.
include: Correct ListView_GetItemIndexRect macro.
include: Add IFACEMETHOD macros.
include: Add LOGFONTA/W typedef in shtypes.idl.
include: Add IPreviewHandler* interfaces.
include: Correct IRowsetNotify HROW parameter type.
include: Add missing TreeView_* defines.
Anton Baskanov (4):
quartz/tests: Use unaligned width in AVIDec tests to expose incorrect stride calculation.
quartz: Get output format from source, not sink in AVIDec.
quartz: Use the correct stride when calculating image size in AVIDec.
quartz: Hold the streaming lock while calling ICDecompressEnd.
Brendan Shanks (1): Brendan Shanks (1):
ntdll: Don't warn on macOS and FreeBSD when xattr doesn't exist. ntdll: On macOS, check for xattr existence before calling getxattr.
Connor McAdams (1): Connor McAdams (7):
uiautomationcore: NULL initialize SAFEARRAY variable passed to IRawElementProviderFragment::GetRuntimeId(). d3dx9: Refactor WIC GUID to D3DXIMAGE_FILEFORMAT conversion code.
d3dx9: Refactor WIC image info retrieval code in D3DXGetImageInfoFromFileInMemory().
Daniel Lehman (1): d3dx9: Introduce d3dx_image structure for use in D3DXGetImageInfoFromFileInMemory().
odbc32: Allow null handle for SQLSetEnvAttr. d3dx9: Use d3dx_image structure in D3DXLoadSurfaceFromFileInMemory().
d3dx9: Introduce d3dx_load_pixels_from_pixels() helper function.
Danyil Blyschak (3): d3dx9: Use d3dx_pixels structure in decompression helper function.
win32u: Remove external fonts from the registry before writing to it. d3dx9: Use d3dx_load_pixels_from_pixels() in D3DXLoadVolumeFromMemory().
shcore: Check optional pointer in filestream_CopyTo() before writing to it.
wineps.drv: Only merge dmDefaultSource member of devmodes when a slot is found. Daniel Lehman (3):
secur32: Allow overriding GnuTLS debug level.
Davide Beatrici (6): bcrypt: Allow overriding GnuTLS debug level.
winealsa: Return minimum period in get_device_period if requested. crypt32: Allow overriding GnuTLS debug level.
mmdevapi: Adjust timing in AudioClient_Initialize.
winealsa: Remove superfluous timing adjustment. Danyil Blyschak (4):
winecoreaudio: Remove superfluous timing adjustment. wineps.drv: Call ResetDCW() to update Devmode in the Unix interface.
wineoss: Remove superfluous timing adjustment. opcservices: Provide memory allocator functions to zlib.
winepulse: Remove superfluous timing adjustment. opcservices: Suppress unnecessary zlib deflate warnings.
opcservices: Check for memory allocation failure before deflating.
Dmitry Timoshkov (2): Dmitry Timoshkov (2):
comctl32/tests: Create a fully updated ListView window. server: Remove limitation for waiting on idle_event of the current process.
user32/tests: Add a test to show that SendMessage(LB_SETCOUNT) adds a scrollbar. win32u: Limit GDI object generation to 128.
Elizabeth Figura (21): Elizabeth Figura (25):
wined3d: Remove the no longer used STATE_SAMPLER. widl: Assign to the right location variable.
wined3d: Remove the no longer used STATE_POINTSPRITECOORDORIGIN. widl: Allow using UDTs with the keyword even when the identifier is also a typedef.
wined3d: Remove the FFP blitter. widl: Invert "declonly".
wined3d: Remove some obsolete state invalidations. widl: Factor out a define_type() helper.
wined3d: Remove the no longer needed fragment_caps.proj_control flag. widl: Update the type location in define_type().
d3d9/tests: Remove leftover debugging code. widl: Do not write type definitions for types defined in an imported header.
wined3d: Remove the no longer needed fragment_caps.srgb_texture flag. include: Add more types to windows.networking.connectivity.idl.
wined3d: Remove the no longer needed fragment_caps.color_key flag. wined3d: Update multisample state when the sample count changes.
wined3d: Remove the no longer needed wined3d_vertex_caps.xyzrhw flag. wined3d: Invalidate the vertex shader when WINED3D_FFP_PSIZE is toggled.
wined3d: Remove the no longer needed wined3d_vertex_caps.ffp_generic_attributes flag. wined3d: Just check the vertex declaration for point size usage.
wined3d: Remove the no longer used buffer conversion code. wined3d: Just check the vertex declaration for colour usage.
wined3d: Remove the no longer used wined3d_context.fog_coord field. wined3d: Just check the vertex declaration for normal usage.
wined3d: Remove the no longer used wined3d_context_gl.untracked_material_count field. wined3d: Just check the vertex declaration for texcoord usage.
wined3d: Remove the no longer used wined3d_context.use_immediate_mode_draw field. wined3d: Default diffuse to 1.0 in the vertex shader.
wined3d: Remove the no longer used WINED3D_SHADER_CAP_VS_CLIPPING flag. server: Ignore attempts to set a mandatory label on a token.
wined3d: Remove the no longer used wined3d_context.namedArraysLoaded field. server: Inherit the source token's label in token_duplicate().
wined3d: Remove the no longer used WINED3D_SHADER_CAP_SRGB_WRITE flag. advapi32/tests: Test token label inheritance.
wined3d: Move the GL_EXTCALL() definition to wined3d_gl.h. wined3d: Handle a null vertex declaration in glsl_vertex_pipe_vdecl().
wined3d: Remove some no longer used wined3d_context fields. wined3d: Always output normalized fog coordinates from the vertex shader.
wined3d: Remove no longer used "exponent" and "cutoff" precomputed fields. wined3d: Do not create a framebuffer with attachments whose clear is delayed.
wined3d: Remove the no longer used ignore_textype argument of wined3d_ffp_get_fs_settings(). wined3d: Use separate signature elements for oFog and oPts.
server: Don't set error in find_object_index if the object is not found.
Eric Pouech (4): ntdll: Implement reading multiple entries in NtQueryDirectoryObject.
conhost: Fix display of font preview in 64-bit mode. server: Generalize get_directory_entries to single_entry case.
winedump: Dump correct handle information for minidump. ntdll: Move IOCTL_SERIAL_WAIT_ON_MASK to the server.
winedump: Don't dump twice.
winedump: Dump Memory64List streams in minidumps. Eric Pouech (13):
cmd: Introduce a helper to set std handles.
Esme Povirk (14): cmd: Introduce structure CMD_REDIRECTION.
gdiplus: Replace HDC check in GdipFlush. cmd: Create helper to execute a command.
gdiplus: Bracket HDC use in GdipMeasureCharacterRanges. cmd: Let errorlevel be a signed integer.
gdiplus: Bracket HDC use in GdipMeasureString. cmd: Separate IF command parsing from execution.
gdiplus: Bracket HDC use in GdipDrawString. kernelbase/tests: Fix typo in tests.
gdiplus: Bracket HDC use in GDI32_GdipDrawDriverString. msvcrt/tests: Don't print a NULL string.
gitlab: Add unzip to build image. quartz/tests: Fix typo in tests.
gdiplus: Replace HDC use in draw_driver_string. quartz/tests: Add new tests about fullscreen handling.
gdiplus: Bracket HDC use in get_path_hrgn. quartz: Always expose that non fullscreen mode is supported and active.
gdiplus: Bracket HDC use in gdi_transform_acquire/release. quartz: Fix result in put_FullScreenMode().
gdiplus: Do not store HDC on HWND Graphics objects. conhost: Handle WM_CHAR for window console.
gdiplus: Don't call GetDeviceCaps for NULL dc. conhost: Support IME input in window mode.
user32/tests: Rename winevent_hook_todo to msg_todo.
user32/tests: Mark some Wine-todo messages. Esme Povirk (4):
win32u: Implement EVENT_SYSTEM_FOREGROUND. win32u: Send EVENT_OBJECT_FOCUS in more cases.
win32u: Implement EVENT_OBJECT_LOCATIONCHANGE.
Fabian Maurer (5): gdiplus: Fix DIB stride calculation in GdipDrawImagePointsRect.
oleaut32: Add test for invoking a dispatch get-only property with DISPATCH_PROPERTYPUT. win32u: Implement EVENT_SYSTEM_MINIMIZESTART/END.
oleaut32: Handle cases where invoking a get-only property with INVOKE_PROPERTYPUT returns DISP_E_BADPARAMCOUNT.
userenv: Add CreateAppContainerProfile stub. Fabian Maurer (7):
riched20: In para_set_fmt protect against out of bound cTabStop values. msvcrt: Fix _libm_sse2_sqrt_precise not using SSE2 sqrt.
user32/tests: Fix ok_sequence succeeding in todo block not giving a test failure. mmdevapi/tests: Add tests for IAudioSessionControl2 GetDisplayName / SetDisplayName.
mmdevapi/tests: Add tests for IAudioSessionControl2 GetIconPath / SetIconPath.
Francis De Brabandere (1): mmdevapi/tests: Add tests for IAudioSessionControl2 GetGroupingParam / SetGroupingParam.
vbscript/tests: Fix error clear call. mmdevapi: Implement IAudioSessionControl2 GetDisplayName / SetDisplayName.
mmdevapi: Implement IAudioSessionControl2 GetIconPath / SetIconPath.
Ilia Docin (1): mmdevapi: Implement IAudioSessionControl2 GetGroupingParam SetGroupingParam.
sane.ds: Add missing color modes setting support.
Giovanni Mascellani (1):
Jacek Caban (30): d3d11/tests: Add a test for NV12 textures.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlobject.c.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlscript.c. Hans Leidekker (8):
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlselect.c. wmic: Sort the alias list.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlstorage.c. wmic: Add csproduct and systemenclosure aliases.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlstyle.c. ntdll: Provide fallback values for DMI fields only readable by root.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlstyleelem.c. odbc32: Use a fixed size buffer for parameter bindings.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmlstylesheet.c. odbc32: Support SQLSetStmtAttr(SQL_ATTR_ROW_ARRAY_SIZE).
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmltable.c. odbc32: Turn SUCCESS() into a static inline function.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmltextarea.c. odbc32/tests: Add tests for fetching multiple rows at once and parameter binding.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in htmltextnode.c. winscard: Pass ATR buffer to unixlib in SCardStatusA().
mshtml: Use DISPEX_IDISPATCH_IMPL macro in mutation.c.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in omnavigator.c. Jacek Caban (4):
mshtml: Use DISPEX_IDISPATCH_IMPL macro in range.c. mshtml: Use DispatchEx vtbl for document node GetDispID implementation.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in selection.c. mshtml: Use DispatchEx for document node InvokeEx implementation.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in svg.c. mshtml: Use DISPEX_IDISPATCH_IMPL macro for document object implementation.
mshtml: Use DISPEX_IDISPATCH_IMPL macro in xmlhttprequest.c. mshtml: Use DispatchEx for exposing document node IDispatchEx interface.
ntdll: Use assembly wrapper for unixlib calls on ARM64EC.
d3d9/tests: Use GNU assembly syntax on clang x86_64 MSVC target. Jacob Pfeiffer (1):
d3d8/tests: Use GNU assembly syntax on clang x86_64 MSVC target. wininet: Unify timeout values closer to hInternet.
d3d9: Use GNU assembly syntax on clang x86_64 MSVC target.
d3d8: Use GNU assembly syntax on clang x86_64 MSVC target. Jinoh Kang (2):
ddraw: Use GNU assembly syntax on clang x86_64 MSVC target. user32/tests: Print regions in test_swp_paint_regions failure cases.
gitlab: Use --enable-werror for Clang builds. wow64: Implement reading multiple entries in wow64_NtQueryDirectoryObject.
mshtml: Return success in IHTMLWindow2::get_closed stub.
mshtml/tests: Add more custom properties tests. Lucas Chollet (1):
mshtml: Factor out alloc_dynamic_prop. dnsapi: Add a stub for DnsServiceBrowse.
mshtml: Use DispatchEx vtbl for elements as window property lookups.
mshtml: Use DispatchEx vtbl for all window properties. Mohamad Al-Jaf (3):
mshtml: Use macro for window object IDispatch functions implementation. coremessaging: Add stub DLL.
mshtml: Move IDispatchEx forwarding implementation to outer window object. include: Add dispatcherqueue.idl file.
coremessaging: Add CreateDispatcherQueueController() stub.
Krzysztof Bogacki (7):
win32u: Use separate variable for inner loop.
win32u: Log Vulkan GPU's PCI IDs when matching against them.
win32u: Log Vulkan UUIDs when adding GPUs.
win32u: Remove unused variable from add_vulkan_only_gpus.
win32u: Use common name for fake GPUs and prefer Vulkan name over it.
win32u: Prefer Vulkan PCI IDs over empty ones.
win32u: Prefer Vulkan UUIDs over empty ones.
Marcus Meissner (1):
shell32/tests: Fixed sizeof to GetModuleFileName.
Myah Caron (1):
msvcrt: Fix _kbhit ignoring the last event.
Nikolay Sivov (3): Nikolay Sivov (3):
gdi32/text: Make GetTextExtentExPointW() return sizes consistent with ExtTextOutW(). scrrun/dictionary: Implement putref_Item() method.
d3dcompiler/fx: Write empty buffers for compiler versions 33-39. dwrite/tests: Fix a test failure on some Win10 machines with CJK locales.
d3dcompiler: Enable D3DCOMPILE_EFFECT_CHILD_EFFECT option. gdi32/text: Handle null partial extents pointer in GetTextExtentExPointW().
Paul Gofman (4): Paul Gofman (12):
wine.inf: Add InstallationType field to CurrentVersion. ntdll: Fix test_NtQueryDirectoryFile() on Win11.
wine.inf: Add Explorer\Advanced registry key. ntdll: Do not ignore trailing dots in match_filename().
mf/tests: Add a test for MFEnumDeviceSources(). ntdll/tests: Test NtQueryDirectoryFile() masks with more files.
mf: Implement audio capture device enumeration in MFEnumDeviceSources(). ntdll: Ignore leading dots in hash_short_file_name().
ntdll: Mind all the wildcards in has_wildcard().
Piotr Caban (1): ntdll: Match wildcard recursively in match_filename().
ntdll: Fix UNC path handling in alloc_module. ntdll: Add a special handling for .. in match_filename().
ntdll: Implement matching DOS_STAR in NtQueryDirectoryFile().
Rémi Bernon (57): ntdll: Implement matching DOS_DOT in NtQueryDirectoryFile().
win32u: Fix default_update_display_devices return type to NTSTATUS. ntdll: Properly match DOS_QM in match_filename().
win32u: Load the graphics driver vulkan functions lazily. ntdll: Skip name search for wildcards in asterisk handling in match_filename().
win32u: Keep a list of vulkan GPUS in the device manager context. kernelbase: Preprocess wildcarded mask and pass it with NtQueryDirectoryFile().
win32u: Match driver GPUs with vulkan GPUS from their ids, or index.
win32u: Query GPU memory from vulkan physical device. Piotr Caban (8):
win32u: Enumerate offscreen vulkan devices as GPU devices. wineps.drv: Don't use dynamic buffer when writing new page info.
dinput: Dynamically allocate the internal device / event arrays. wineps.drv: Write page orientation hint for every page.
server: Pass the adjusted vkey to send_hook_ll_message. wineps.drv: Take all pages into account when computing bounding box.
winegstreamer: Use DMO_MEDIA_TYPE in the WMA decoder. wineps.drv: Write PageBoundingBox for every page.
winegstreamer: Implement WMA DMO Get(Input|Output)CurrentType. wineps.drv: Add partial support for changing page size.
win32u/tests: Introduce a new run_in_process helper. msvcp140: Use _get_stream_buffer_pointers() to access FILE internal buffers.
win32u/tests: Add NtUser(Get|Set)ProcessDpiAwarenessContext tests. ucrtbase: Fix _iobuf struct layout.
win32u: Fix NtUserSetProcessDpiAwarenessContext. msvcrt: Don't use custom standard streams definition.
user32/tests: Add some SetProcessDpiAwarenessContext tests.
user32/tests: Add more SetThreadDpiAwarenessContext tests. Rémi Bernon (65):
user32: Fix SetProcessDpiAwarenessContext. widl: Use mangled namespace names in typedef pointer types.
winegstreamer: Use a GstCaps for wg_parser current_format. win32u: Move the window surface color bits to the common struct.
winegstreamer: Use a GstCaps instead of preferred_format. win32u: Pass BITMAPINFO and a HBITMAP to window_surface_init.
winegstreamer: Rename get_preferred_format to get_current_format. winex11: Simplify the XSHM extension function calls.
winegstreamer: Use a GstCaps for wg_parser_stream codec format. winex11: Create XImage before initializing the window surface.
win32u: Get rid of the drivers force_display_devices_refresh flag. winex11: Create a HBITMAP for the allocated surface pixels.
win32u: Update the display device cache after loading the driver. win32u: Create a HBITMAP backing the window surface pixels.
win32u: Get rid of the UpdateDisplayDevices force parameter. win32u: Restore surface rect, which may offsetted from the window rect.
user32: Test and fix IsValidDpiAwarenessContext. win32u: Use a dedicated helper to move bits from a previous surface.
user32: Test and implement GetDpiFromDpiAwarenessContext. win32u: Don't map points to the parent window in move_window_bits_parent.
user32/tests: Add more AreDpiAwarenessContextsEqual tests. win32u: Get rid of move_window_bits_parent, using move_window_bits.
user32/tests: Add more GetAwarenessFromDpiAwarenessContext tests. winemac: Merge RESET_DEVICE_METRICS and DISPLAYCHANGE internal messages.
win32u: Use NtUserCallOnParam for SetThreadDpiAwarenessContext. win32u: Fix a restorer_str typo.
win32u: Return UINT from NtUserGetWindowDpiAwarenessContext. win32u: Send display change messages when host display mode changes.
win32u: Use NtGdiDdDDICreateDCFromMemory for gdi16 DIBDRV. win32u: Move desktop resize on WM_DISPLAYCHANGE out of the drivers.
wineandroid: Fix NtUserSendHardwareInput parameter order. gdi32: Use an internal NtUser call for D3DKMTOpenAdapterFromGdiDisplayName.
wineandroid: Use DWORD for pixel pointers. wineandroid: Always clear UpdateLayeredWindow target rectangle.
win32u: Flush window surface when it is fully unlocked. wineandroid: Use the surface bitmap directly in UpdateLayeredWindow.
win32u: Remove surface recursive locking requirement. winemac: Always clear UpdateLayeredWindow target rectangle.
win32u: Stop using a recursive mutex for the offscreen surface. winemac: Use the surface bitmap directly in UpdateLayeredWindow.
wineandroid: Stop using a recursive mutex for the window surfaces. winemac: Blend alpha with NtGdiAlphaBlend instead of window opacity.
winemac: Stop using a recursive mutex for the window surfaces. winex11: Always clear UpdateLayeredWindow target rectangle.
winewayland: Stop using a recursive mutex for the window surfaces. winex11: Use the surface bitmap directly in UpdateLayeredWindow.
winex11: Stop using a recursive mutex for the window surfaces. win32u: Introduce a new CreateLayeredWindow driver entry.
win32u: Get the thread DPI context instead of the awareness. win32u: Move UpdateLayeredWindow implementation out of the drivers.
win32u: Pass the DPI awareness context in win_proc_params. server: Avoid calling set_event from within msg_queue_add_queue.
win32u: Fix SetThreadDpiAwarenessContext. win32u: Introduce new helpers to convert server rectangle_t.
win32u: Only keep DPI awareness context with window objects. win32u: Introduce NtUserAdjustWindowRect call for AdjustWindowRect*.
win32u: Introduce a new window_surface_init helper. win32u: Pass desired DPI to NtUserGet(Client|Window)Rect.
win32u: Move the window surface mutex to the surface header. win32u: Introduce a new get_monitor_rect helper.
win32u: Use helpers to lock/unlock window surfaces. win32u: Pass the rect DPI to NtUserIsWindowRectFullScreen.
win32u: Move window surface bounds to the window_surface base struct. winex11: Wrap more window surface formats with NtGdiDdDDICreateDCFromMemory.
winemac: Get rid of unnecessary blit_data / drawn surface members. winex11: Fix some incorrect usage of NtGdiDdDDICreateDCFromMemory.
wineandroid: Hold the lock while reading window surface bits. gdi.exe16: Fix some incorrect usage of NtGdiDdDDICreateDCFromMemory.
win32u: Use a helper to flush window surface, factor locking and bounds reset. winegstreamer: Allow to clear video decoder input/output types.
win32u: Initialize window surfaces with a hwnd. winegstreamer: Enforce default stride value in the video decoder.
win32u: Split update_surface_region into get_window_region helper. winegstreamer: Enforce default stride presence in the video processor.
server: Merge get_surface_region / get_window_region requests together. winegstreamer: Rename allow_size_change to allow_format_change.
win32u: Intersect the clipping region with the window shape region. winegstreamer: Only report format changes when frontend supports it.
server: Update window surface regions when the window is shaped. winegstreamer: Use a caps to store the desired output format.
wineandroid: Remove now unnecessary set_surface_region calls. winegstreamer: Request the new transform output format explicitly.
win32u: Use a helper to set the window surface clipping, within the lock. winevulkan: Remove some unnecessary casts.
winevulkan: Fix size mismatch when writing to return pointer.
Vijay Kiran Kamuju (1): include: Add and fix some WGL prototypes.
ntdll: Add stub RtlLookupGenericTableAvl function. winewayland: Force the DPI context when restoring cursor clipping.
winex11: Force the DPI context when restoring cursor clipping.
Yuxuan Shui (2): win32u: Use get_monitor_rect in more places.
shell32: Make sure array passed to PathResolve is big enough. win32u: Parameterize get_clip_cursor dpi.
shell32: Fix ShellExecute for non-filespec paths. win32u: Parameterize get_monitor_info dpi.
win32u: Use window monitor DPI in get_windows_offset when dpi is 0.
Zhiyi Zhang (4): winex11: Use NtUserMapWindowPoints instead of NtUserScreenToClient.
comctl32/tests: Add WM_SETFONT tests. win32u: Call NtUserMapWindowPoints with per-monitor DPI from the drivers.
comctl32/syslink: Don't delete font when destroying the control. winemac: Force thread DPI awareness when calling NtUserSetWindowPos.
comctl32/tooltips: Don't duplicate font when handling WM_SETFONT. winewayland: Force thread DPI awareness when calling NtUserSetWindowPos.
comctl32/ipaddress: Delete font when destroying the control. winex11: Force thread DPI awareness when calling NtUserSetWindowPos.
winex11: Force thread DPI awareness when calling NtUserRedrawWindow.
winex11: Force thread DPI awareness when calling NtUserChildWindowFromPointEx.
win32u: Remove unused insert_after WindowPosChanging parameter.
wineandroid: Remove unnecessary visible_rect initialization.
winemac: Remove unnecessary visible_rect initialization.
winex11: Remove unnecessary visible_rect initialization.
win32u: Split WindowPosChanging driver call to a separate CreateWindowSurface.
winex11: Move layered window mapping to X11DRV_UpdateLayeredWindow.
winemac: Move layered window mapping to macdrv_UpdateLayeredWindow.
win32u: Move WM_WINE_DESKTOP_RESIZED into driver internal messages range.
Shengdun Wang (3):
ucrtbase/tests: Add FILE structure tests.
ucrtbase: Always use CRITICAL_SECTION for FILE locking.
ucrtbase: Fix FILE _flag values.
Tim Clem (1):
gitlab: Update configuration for the new Mac runner.
Zhiyi Zhang (2):
ws2_32/tests: Test fromlen for recvfrom().
ntdll: Don't zero out socket address in sockaddr_from_unix().
Ziqing Hui (7):
qasf/tests: Add more tests for dmo_wrapper_sink_Receive.
qasf/dmowrapper: Introduce get_output_samples.
qasf/dmowrapper: Introduce release_output_samples.
qasf/dmowrapper: Return failure in dmo_wrapper_sink_Receive if samples allocating fails.
qasf/dmowrapper: Allocate output samples before calling ProcessInput().
qasf/dmowrapper: Return VFW_E_WRONG_STATE in dmo_wrapper_sink_Receive.
qasf/dmowrapper: Sync Stop() and Receive() for dmo wrapper filter.
``` ```
...@@ -18,6 +18,7 @@ Adam Gashlin ...@@ -18,6 +18,7 @@ Adam Gashlin
Adam Gundy Adam Gundy
Adam Martinson Adam Martinson
Adam Petaccia Adam Petaccia
Adam Rehn
Adam Sacarny Adam Sacarny
Adam Stachowicz Adam Stachowicz
Adam Stoelting Adam Stoelting
...@@ -198,6 +199,7 @@ Benjamin Arai ...@@ -198,6 +199,7 @@ Benjamin Arai
Benjamin Cutler Benjamin Cutler
Benjamin Hodgetts Benjamin Hodgetts
Benjamin Kramer Benjamin Kramer
Benjamin Mayes
Ben Klein Ben Klein
Ben Mayhew Ben Mayhew
Ben Peddell Ben Peddell
...@@ -740,6 +742,7 @@ Jacek Caban ...@@ -740,6 +742,7 @@ Jacek Caban
Jacek Konieczny Jacek Konieczny
Jacob Czekalla Jacob Czekalla
Jacob Lifshay Jacob Lifshay
Jacob Pfeiffer
Jaco Greeff Jaco Greeff
Jactry Zeng Jactry Zeng
Jaekil Lee Jaekil Lee
...@@ -1091,6 +1094,7 @@ Louis Lenders ...@@ -1091,6 +1094,7 @@ Louis Lenders
Louis Philippe Gagnon Louis Philippe Gagnon
L. Rahyen L. Rahyen
Luca Bennati Luca Bennati
Lucas Chollet
Lucas Fialho Zawacki Lucas Fialho Zawacki
Lucian Poston Lucian Poston
Luc Tourangeau Luc Tourangeau
...@@ -1641,6 +1645,7 @@ Shanren Zhou ...@@ -1641,6 +1645,7 @@ Shanren Zhou
Shaun Morris Shaun Morris
Shaun Ren Shaun Ren
Shawn M. Chapla Shawn M. Chapla
Shengdun Wang
Sheri Steeves Sheri Steeves
Shi Quan He Shi Quan He
Shuai Meng Shuai Meng
......
Wine version 9.10 Wine version 9.11
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.71 for Wine 9.10. # Generated by GNU Autoconf 2.71 for Wine 9.11.
# #
# Report bugs to <wine-devel@winehq.org>. # Report bugs to <wine-devel@winehq.org>.
# #
...@@ -611,8 +611,8 @@ MAKEFLAGS= ...@@ -611,8 +611,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='Wine' PACKAGE_NAME='Wine'
PACKAGE_TARNAME='wine' PACKAGE_TARNAME='wine'
PACKAGE_VERSION='9.10' PACKAGE_VERSION='9.11'
PACKAGE_STRING='Wine 9.10' PACKAGE_STRING='Wine 9.11'
PACKAGE_BUGREPORT='wine-devel@winehq.org' PACKAGE_BUGREPORT='wine-devel@winehq.org'
PACKAGE_URL='https://www.winehq.org' PACKAGE_URL='https://www.winehq.org'
   
...@@ -2403,7 +2403,7 @@ if test "$ac_init_help" = "long"; then ...@@ -2403,7 +2403,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures Wine 9.10 to adapt to many kinds of systems. \`configure' configures Wine 9.11 to adapt to many kinds of systems.
   
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
   
...@@ -2473,7 +2473,7 @@ fi ...@@ -2473,7 +2473,7 @@ fi
   
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of Wine 9.10:";; short | recursive ) echo "Configuration of Wine 9.11:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
   
...@@ -2779,7 +2779,7 @@ fi ...@@ -2779,7 +2779,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
Wine configure 9.10 Wine configure 9.11
generated by GNU Autoconf 2.71 generated by GNU Autoconf 2.71
   
Copyright (C) 2021 Free Software Foundation, Inc. Copyright (C) 2021 Free Software Foundation, Inc.
...@@ -3230,7 +3230,7 @@ cat >config.log <<_ACEOF ...@@ -3230,7 +3230,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
   
It was created by Wine $as_me 9.10, which was It was created by Wine $as_me 9.11, which was
generated by GNU Autoconf 2.71. Invocation command line was generated by GNU Autoconf 2.71. Invocation command line was
   
$ $0$ac_configure_args_raw $ $0$ac_configure_args_raw
...@@ -23703,7 +23703,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ...@@ -23703,7 +23703,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by Wine $as_me 9.10, which was This file was extended by Wine $as_me 9.11, which was
generated by GNU Autoconf 2.71. Invocation command line was generated by GNU Autoconf 2.71. Invocation command line was
   
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
...@@ -23767,7 +23767,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\ ...@@ -23767,7 +23767,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped' ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\ ac_cs_version="\\
Wine config.status 9.10 Wine config.status 9.11
configured by $0, generated by GNU Autoconf 2.71, configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
   
......
...@@ -99,25 +99,36 @@ static inline struct audio_client *impl_from_IAudioStreamVolume(IAudioStreamVolu ...@@ -99,25 +99,36 @@ static inline struct audio_client *impl_from_IAudioStreamVolume(IAudioStreamVolu
return CONTAINING_RECORD(iface, struct audio_client, IAudioStreamVolume_iface); return CONTAINING_RECORD(iface, struct audio_client, IAudioStreamVolume_iface);
} }
static HRESULT adjust_timing(struct audio_client *This, static HRESULT get_periods(struct audio_client *client,
REFERENCE_TIME *def_period, REFERENCE_TIME *min_period)
{
static const REFERENCE_TIME min_def_period = 100000; /* 10 ms */
struct get_device_period_params params;
params.device = client->device_name;
params.flow = client->dataflow;
params.def_period = def_period;
params.min_period = min_period;
wine_unix_call(get_device_period, &params);
if (def_period) *def_period = max(*def_period, min_def_period);
return params.result;
}
static HRESULT adjust_timing(struct audio_client *client,
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)
{ {
struct get_device_period_params params;
REFERENCE_TIME def_period, min_period; REFERENCE_TIME def_period, min_period;
HRESULT hr;
TRACE("Requested duration %lu and period %lu\n", (ULONG)*duration, (ULONG)*period); TRACE("Requested duration %lu and period %lu\n", (ULONG)*duration, (ULONG)*period);
params.device = This->device_name; if (FAILED(hr = get_periods(client, &def_period, &min_period)))
params.flow = This->dataflow; return hr;
params.def_period = &def_period;
params.min_period = &min_period;
wine_unix_call(get_device_period, &params);
if (FAILED(params.result))
return params.result;
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);
...@@ -129,21 +140,21 @@ static HRESULT adjust_timing(struct audio_client *This, ...@@ -129,21 +140,21 @@ static HRESULT adjust_timing(struct audio_client *This,
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))
params.result = AUDCLNT_E_UNSUPPORTED_FORMAT; hr = 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)
params.result = AUDCLNT_E_INVALID_DEVICE_PERIOD; hr = 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. */
params.result = AUDCLNT_E_BUFFER_SIZE_ERROR; hr = AUDCLNT_E_BUFFER_SIZE_ERROR;
else if (flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) { else if (flags & AUDCLNT_STREAMFLAGS_EVENTCALLBACK) {
if (*duration != *period) if (*duration != *period)
params.result = AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL; hr = AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL;
FIXME("EXCLUSIVE mode with EVENTCALLBACK\n"); FIXME("EXCLUSIVE mode with EVENTCALLBACK\n");
params.result = AUDCLNT_E_DEVICE_IN_USE; hr = 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. */
} }
...@@ -151,7 +162,7 @@ static HRESULT adjust_timing(struct audio_client *This, ...@@ -151,7 +162,7 @@ static HRESULT adjust_timing(struct audio_client *This,
TRACE("Adjusted duration %lu and period %lu\n", (ULONG)*duration, (ULONG)*period); TRACE("Adjusted duration %lu and period %lu\n", (ULONG)*duration, (ULONG)*period);
return params.result; return hr;
} }
static void dump_fmt(const WAVEFORMATEX *fmt) static void dump_fmt(const WAVEFORMATEX *fmt)
...@@ -748,21 +759,13 @@ static HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIM ...@@ -748,21 +759,13 @@ static HRESULT WINAPI client_GetDevicePeriod(IAudioClient3 *iface, REFERENCE_TIM
REFERENCE_TIME *minperiod) REFERENCE_TIME *minperiod)
{ {
struct audio_client *This = impl_from_IAudioClient3(iface); struct audio_client *This = impl_from_IAudioClient3(iface);
struct get_device_period_params params;
TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod); TRACE("(%p)->(%p, %p)\n", This, defperiod, minperiod);
if (!defperiod && !minperiod) if (!defperiod && !minperiod)
return E_POINTER; return E_POINTER;
params.device = This->device_name; return get_periods(This, defperiod, minperiod);
params.flow = This->dataflow;
params.def_period = defperiod;
params.min_period = minperiod;
wine_unix_call(get_device_period, &params);
return params.result;
} }
static HRESULT WINAPI client_Start(IAudioClient3 *iface) static HRESULT WINAPI client_Start(IAudioClient3 *iface)
......
...@@ -30,6 +30,10 @@ typedef struct audio_session { ...@@ -30,6 +30,10 @@ typedef struct audio_session {
float *channel_vols; float *channel_vols;
BOOL mute; BOOL mute;
WCHAR *display_name;
WCHAR *icon_path;
GUID grouping_param;
struct list entry; struct list entry;
} AudioSession; } AudioSession;
......
...@@ -37,6 +37,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi); ...@@ -37,6 +37,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
extern void sessions_lock(void); extern void sessions_lock(void);
extern void sessions_unlock(void); extern void sessions_unlock(void);
static WCHAR *duplicate_wstr(const WCHAR *str)
{
const WCHAR *source = str ? str : L"";
int len = (wcslen(source) + 1) * sizeof(WCHAR);
WCHAR *ret = CoTaskMemAlloc(len);
memcpy(ret, source, len);
return ret;
}
extern void set_stream_volumes(struct audio_client *This); extern void set_stream_volumes(struct audio_client *This);
static struct list sessions = LIST_INIT(sessions); static struct list sessions = LIST_INIT(sessions);
...@@ -144,46 +153,99 @@ static HRESULT WINAPI control_GetState(IAudioSessionControl2 *iface, AudioSessio ...@@ -144,46 +153,99 @@ static HRESULT WINAPI control_GetState(IAudioSessionControl2 *iface, AudioSessio
static HRESULT WINAPI control_GetDisplayName(IAudioSessionControl2 *iface, WCHAR **name) static HRESULT WINAPI control_GetDisplayName(IAudioSessionControl2 *iface, WCHAR **name)
{ {
struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface);
FIXME("(%p)->(%p) - stub\n", This, name); struct audio_session *session = This->session;
return E_NOTIMPL;
TRACE("(%p)->(%p) - stub\n", This, name);
if (!name)
return E_POINTER;
*name = duplicate_wstr(session->display_name);
return S_OK;
} }
static HRESULT WINAPI control_SetDisplayName(IAudioSessionControl2 *iface, const WCHAR *name, static HRESULT WINAPI control_SetDisplayName(IAudioSessionControl2 *iface, const WCHAR *name,
const GUID *session) const GUID *event_context)
{ {
struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface);
FIXME("(%p)->(%p, %s) - stub\n", This, name, debugstr_guid(session)); struct audio_session *session = This->session;
return E_NOTIMPL;
TRACE("(%p)->(%p, %s) - stub\n", This, name, debugstr_guid(event_context));
FIXME("Ignoring event_context\n");
if (!name)
return HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER);
free(session->display_name);
session->display_name = wcsdup(name);
return S_OK;
} }
static HRESULT WINAPI control_GetIconPath(IAudioSessionControl2 *iface, WCHAR **path) static HRESULT WINAPI control_GetIconPath(IAudioSessionControl2 *iface, WCHAR **path)
{ {
struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface);
FIXME("(%p)->(%p) - stub\n", This, path); struct audio_session *session = This->session;
return E_NOTIMPL;
TRACE("(%p)->(%p) - stub\n", This, path);
if (!path)
return E_POINTER;
*path = duplicate_wstr(session->icon_path);
return S_OK;
} }
static HRESULT WINAPI control_SetIconPath(IAudioSessionControl2 *iface, const WCHAR *path, static HRESULT WINAPI control_SetIconPath(IAudioSessionControl2 *iface, const WCHAR *path,
const GUID *session) const GUID *event_context)
{ {
struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface);
FIXME("(%p)->(%s, %s) - stub\n", This, debugstr_w(path), debugstr_guid(session)); struct audio_session *session = This->session;
return E_NOTIMPL;
TRACE("(%p)->(%s, %s) - stub\n", This, debugstr_w(path), debugstr_guid(event_context));
FIXME("Ignoring event_context\n");
if (!path)
return HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER);
free(session->icon_path);
session->icon_path = wcsdup(path);
return S_OK;
} }
static HRESULT WINAPI control_GetGroupingParam(IAudioSessionControl2 *iface, GUID *group) static HRESULT WINAPI control_GetGroupingParam(IAudioSessionControl2 *iface, GUID *group)
{ {
struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface);
FIXME("(%p)->(%p) - stub\n", This, group); struct audio_session *session = This->session;
return E_NOTIMPL;
TRACE("(%p)->(%p) - stub\n", This, group);
if (!group)
return HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER);
*group = session->grouping_param;
return S_OK;
} }
static HRESULT WINAPI control_SetGroupingParam(IAudioSessionControl2 *iface, const GUID *group, static HRESULT WINAPI control_SetGroupingParam(IAudioSessionControl2 *iface, const GUID *group,
const GUID *session) const GUID *event_context)
{ {
struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface); struct audio_session_wrapper *This = impl_from_IAudioSessionControl2(iface);
FIXME("(%p)->(%s, %s) - stub\n", This, debugstr_guid(group), debugstr_guid(session)); struct audio_session *session = This->session;
return E_NOTIMPL;
TRACE("(%p)->(%s, %s) - stub\n", This, debugstr_guid(group), debugstr_guid(event_context));
FIXME("Ignoring event_context\n");
if (!group)
return HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER);
session->grouping_param = *group;
return S_OK;
} }
static HRESULT WINAPI control_RegisterAudioSessionNotification(IAudioSessionControl2 *iface, static HRESULT WINAPI control_RegisterAudioSessionNotification(IAudioSessionControl2 *iface,
...@@ -586,6 +648,8 @@ static struct audio_session *session_create(const GUID *guid, IMMDevice *device, ...@@ -586,6 +648,8 @@ static struct audio_session *session_create(const GUID *guid, IMMDevice *device,
ret->master_vol = 1.f; ret->master_vol = 1.f;
CoCreateGuid(&ret->grouping_param);
return ret; return ret;
} }
......
...@@ -1453,6 +1453,8 @@ static void test_session(void) ...@@ -1453,6 +1453,8 @@ static void test_session(void)
WAVEFORMATEX *pwfx; WAVEFORMATEX *pwfx;
ULONG ref; ULONG ref;
HRESULT hr; HRESULT hr;
WCHAR *str;
GUID guid1 = GUID_NULL, guid2 = GUID_NULL;
hr = CoCreateGuid(&ses1_guid); hr = CoCreateGuid(&ses1_guid);
ok(hr == S_OK, "CoCreateGuid failed: %08lx\n", hr); ok(hr == S_OK, "CoCreateGuid failed: %08lx\n", hr);
...@@ -1575,6 +1577,80 @@ static void test_session(void) ...@@ -1575,6 +1577,80 @@ static void test_session(void)
ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(hr == S_OK, "GetState failed: %08lx\n", hr);
ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state); ok(state == AudioSessionStateInactive, "Got wrong state: %d\n", state);
/* Test GetDisplayName / SetDisplayName */
hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, NULL);
ok(hr == E_POINTER, "GetDisplayName failed: %08lx\n", hr);
str = NULL;
hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, &str);
ok(hr == S_OK, "GetDisplayName failed: %08lx\n", hr);
ok(str && !wcscmp(str, L""), "Got %s\n", wine_dbgstr_w(str));
if (str)
CoTaskMemFree(str);
hr = IAudioSessionControl2_SetDisplayName(ses1_ctl2, NULL, NULL);
ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetDisplayName failed: %08lx\n", hr);
hr = IAudioSessionControl2_SetDisplayName(ses1_ctl2, L"WineDisplayName", NULL);
ok(hr == S_OK, "SetDisplayName failed: %08lx\n", hr);
str = NULL;
hr = IAudioSessionControl2_GetDisplayName(ses1_ctl2, &str);
ok(hr == S_OK, "GetDisplayName failed: %08lx\n", hr);
ok(str && !wcscmp(str, L"WineDisplayName"), "Got %s\n", wine_dbgstr_w(str));
if (str)
CoTaskMemFree(str);
/* Test GetIconPath / SetIconPath */
hr = IAudioSessionControl2_GetIconPath(ses1_ctl2, NULL);
ok(hr == E_POINTER, "GetIconPath failed: %08lx\n", hr);
str = NULL;
hr = IAudioSessionControl2_GetIconPath(ses1_ctl2, &str);
ok(hr == S_OK, "GetIconPath failed: %08lx\n", hr);
ok(str && !wcscmp(str, L""), "Got %s\n", wine_dbgstr_w(str));
if(str)
CoTaskMemFree(str);
hr = IAudioSessionControl2_SetIconPath(ses1_ctl2, NULL, NULL);
ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetIconPath failed: %08lx\n", hr);
hr = IAudioSessionControl2_SetIconPath(ses1_ctl2, L"WineIconPath", NULL);
ok(hr == S_OK, "SetIconPath failed: %08lx\n", hr);
str = NULL;
hr = IAudioSessionControl2_GetIconPath(ses1_ctl2, &str);
ok(hr == S_OK, "GetIconPath failed: %08lx\n", hr);
ok(str && !wcscmp(str, L"WineIconPath"), "Got %s\n", wine_dbgstr_w(str));
if (str)
CoTaskMemFree(str);
/* Test GetGroupingParam / SetGroupingParam */
hr = IAudioSessionControl2_GetGroupingParam(ses1_ctl2, NULL);
ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "GetGroupingParam failed: %08lx\n", hr);
hr = IAudioSessionControl2_GetGroupingParam(ses1_ctl2, &guid1);
ok(hr == S_OK, "GetGroupingParam failed: %08lx\n", hr);
ok(!IsEqualGUID(&guid1, &guid2), "Expected non null GUID\n"); /* MSDN is wrong here, it is not GUID_NULL */
hr = IAudioSessionControl2_SetGroupingParam(ses1_ctl2, NULL, NULL);
ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "SetGroupingParam failed: %08lx\n", hr);
hr = CoCreateGuid(&guid2);
ok(hr == S_OK, "CoCreateGuid failed: %08lx\n", hr);
hr = IAudioSessionControl2_SetGroupingParam(ses1_ctl2, &guid2, NULL);
ok(hr == S_OK, "SetGroupingParam failed: %08lx\n", hr);
hr = IAudioSessionControl2_GetGroupingParam(ses1_ctl2, &guid1);
ok(hr == S_OK, "GetGroupingParam failed: %08lx\n", hr);
ok(IsEqualGUID(&guid1, &guid2), "Got %s\n", wine_dbgstr_guid(&guid1));
/* Test capture */
if(cap_ctl){ if(cap_ctl){
hr = IAudioSessionControl2_GetState(cap_ctl, &state); hr = IAudioSessionControl2_GetState(cap_ctl, &state);
ok(hr == S_OK, "GetState failed: %08lx\n", hr); ok(hr == S_OK, "GetState failed: %08lx\n", hr);
......
...@@ -106,6 +106,22 @@ static void set_wow64_environment( WCHAR **env ) ...@@ -106,6 +106,22 @@ static void set_wow64_environment( WCHAR **env )
} }
/******************************************************************************
* RtlAcquirePebLock [NTDLL.@]
*/
void WINAPI RtlAcquirePebLock(void)
{
RtlEnterCriticalSection( NtCurrentTeb()->Peb->FastPebLock );
}
/******************************************************************************
* RtlReleasePebLock [NTDLL.@]
*/
void WINAPI RtlReleasePebLock(void)
{
RtlLeaveCriticalSection( NtCurrentTeb()->Peb->FastPebLock );
}
/****************************************************************************** /******************************************************************************
* RtlCreateEnvironment [NTDLL.@] * RtlCreateEnvironment [NTDLL.@]
*/ */
......
...@@ -261,9 +261,20 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -261,9 +261,20 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT) if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT)
{ {
if (str->MaximumLength < default_size) if (pQuery->QueryRoutine)
return STATUS_BUFFER_TOO_SMALL; return STATUS_INVALID_PARAMETER;
memcpy(str->Buffer, pQuery->DefaultData, default_size);
if (pQuery->DefaultType == REG_SZ || pQuery->DefaultType == REG_EXPAND_SZ ||
pQuery->DefaultType == REG_MULTI_SZ || pQuery->DefaultType == REG_LINK)
{
if (!pQuery->DefaultData)
return STATUS_DATA_OVERRUN;
if (str->MaximumLength < default_size)
return STATUS_BUFFER_TOO_SMALL;
memcpy(str->Buffer, pQuery->DefaultData, default_size);
str->Length = default_size - sizeof(WCHAR);
}
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
else if (pQuery->QueryRoutine) else if (pQuery->QueryRoutine)
...@@ -277,6 +288,9 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -277,6 +288,9 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT) if (pQuery->Flags & RTL_QUERY_REGISTRY_DIRECT)
{ {
if (pQuery->QueryRoutine)
return STATUS_INVALID_PARAMETER;
switch(pInfo->Type) switch(pInfo->Type)
{ {
case REG_EXPAND_SZ: case REG_EXPAND_SZ:
...@@ -297,7 +311,12 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, ...@@ -297,7 +311,12 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo,
if (str->Buffer == NULL) if (str->Buffer == NULL)
RtlCreateUnicodeString(str, (WCHAR*)(((CHAR*)pInfo) + pInfo->DataOffset)); RtlCreateUnicodeString(str, (WCHAR*)(((CHAR*)pInfo) + pInfo->DataOffset));
else else
RtlAppendUnicodeToString(str, (WCHAR*)(((CHAR*)pInfo) + pInfo->DataOffset)); {
if (str->MaximumLength < len)
return STATUS_BUFFER_TOO_SMALL;
memcpy(str->Buffer, (char*)pInfo + pInfo->DataOffset, len);
str->Length = len - sizeof(WCHAR);
}
break; break;
case REG_MULTI_SZ: case REG_MULTI_SZ:
......
This diff is collapsed.
...@@ -1540,6 +1540,60 @@ NTSTATUS WINAPI RtlGetAce(PACL pAcl,DWORD dwAceIndex,LPVOID *pAce ) ...@@ -1540,6 +1540,60 @@ NTSTATUS WINAPI RtlGetAce(PACL pAcl,DWORD dwAceIndex,LPVOID *pAce )
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/*************************************************************************
* RtlAreAllAccessesGranted [NTDLL.@]
*/
BOOLEAN WINAPI RtlAreAllAccessesGranted( ACCESS_MASK granted, ACCESS_MASK desired )
{
return (granted & desired) == desired;
}
/*************************************************************************
* RtlAreAnyAccessesGranted [NTDLL.@]
*/
BOOLEAN WINAPI RtlAreAnyAccessesGranted( ACCESS_MASK granted, ACCESS_MASK desired )
{
return (granted & desired) != 0;
}
/*************************************************************************
* RtlMapGenericMask [NTDLL.@]
*/
void WINAPI RtlMapGenericMask( ACCESS_MASK *mask, const GENERIC_MAPPING *mapping )
{
if (*mask & GENERIC_READ) *mask |= mapping->GenericRead;
if (*mask & GENERIC_WRITE) *mask |= mapping->GenericWrite;
if (*mask & GENERIC_EXECUTE) *mask |= mapping->GenericExecute;
if (*mask & GENERIC_ALL) *mask |= mapping->GenericAll;
*mask &= ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL);
}
/*************************************************************************
* RtlCopyLuid [NTDLL.@]
*/
void WINAPI RtlCopyLuid( LUID *dest, const LUID *src )
{
*dest = *src;
}
/*************************************************************************
* RtlEqualLuid [NTDLL.@]
*/
BOOLEAN WINAPI RtlEqualLuid( const LUID *luid1, const LUID *luid2 )
{
return (luid1->LowPart == luid2->LowPart && luid1->HighPart == luid2->HighPart);
}
/*************************************************************************
* RtlCopyLuidAndAttributesArray [NTDLL.@]
*/
void WINAPI RtlCopyLuidAndAttributesArray( ULONG count, const LUID_AND_ATTRIBUTES *src, PLUID_AND_ATTRIBUTES dest )
{
ULONG i;
for (i = 0; i < count; i++) dest[i] = src[i];
}
/* /*
* misc * misc
*/ */
......
...@@ -248,6 +248,79 @@ void *__cdecl memset( void *dst, int c, size_t n ) ...@@ -248,6 +248,79 @@ void *__cdecl memset( void *dst, int c, size_t n )
} }
/******************************************************************************
* RtlCopyMemory (NTDLL.@)
*/
#undef RtlCopyMemory
void WINAPI RtlCopyMemory( void *dest, const void *src, SIZE_T len )
{
memcpy( dest, src, len );
}
/******************************************************************************
* RtlMoveMemory (NTDLL.@)
*/
#undef RtlMoveMemory
void WINAPI RtlMoveMemory( void *dest, const void *src, SIZE_T len )
{
memmove( dest, src, len );
}
/******************************************************************************
* RtlFillMemory (NTDLL.@)
*/
#undef RtlFillMemory
void WINAPI RtlFillMemory( VOID *dest, SIZE_T len, BYTE fill )
{
memset( dest, fill, len );
}
/******************************************************************************
* RtlZeroMemory (NTDLL.@)
*/
#undef RtlZeroMemory
void WINAPI RtlZeroMemory( VOID *dest, SIZE_T len )
{
memset( dest, 0, len );
}
/******************************************************************************
* RtlCompareMemory (NTDLL.@)
*/
SIZE_T WINAPI RtlCompareMemory( const void *src1, const void *src2, SIZE_T len )
{
SIZE_T i = 0;
while (i < len && ((const BYTE *)src1)[i] == ((const BYTE *)src2)[i]) i++;
return i;
}
/******************************************************************************
* RtlCompareMemoryUlong (NTDLL.@)
*/
SIZE_T WINAPI RtlCompareMemoryUlong( void *src, SIZE_T len, ULONG val )
{
SIZE_T i = 0;
len /= sizeof(ULONG);
while (i < len && ((ULONG *)src)[i] == val) i++;
return i * sizeof(ULONG);
}
/*************************************************************************
* RtlFillMemoryUlong (NTDLL.@)
*/
void WINAPI RtlFillMemoryUlong( ULONG *dest, ULONG len, ULONG val )
{
len /= sizeof(ULONG);
while (len--) *dest++ = val;
}
/********************************************************************* /*********************************************************************
* strcat (NTDLL.@) * strcat (NTDLL.@)
*/ */
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "winternl.h" #include "winternl.h"
#include "wine/debug.h" #include "wine/debug.h"
#include "wine/list.h" #include "wine/list.h"
#include "wine/exception.h"
#include "ntdll_misc.h" #include "ntdll_misc.h"
WINE_DEFAULT_DEBUG_CHANNEL(sync); WINE_DEFAULT_DEBUG_CHANNEL(sync);
...@@ -999,3 +1000,374 @@ void WINAPI RtlWakeAddressSingle( const void *addr ) ...@@ -999,3 +1000,374 @@ void WINAPI RtlWakeAddressSingle( const void *addr )
if (tid) NtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)tid ); if (tid) NtAlertThreadByThreadId( (HANDLE)(DWORD_PTR)tid );
} }
/*************************************************************************
* RtlInitializeSListHead (NTDLL.@)
*/
void WINAPI RtlInitializeSListHead(PSLIST_HEADER list)
{
#ifdef _WIN64
list->Alignment = list->Region = 0;
list->Header16.HeaderType = 1; /* we use the 16-byte header */
#else
list->Alignment = 0;
#endif
}
/*************************************************************************
* RtlQueryDepthSList (NTDLL.@)
*/
WORD WINAPI RtlQueryDepthSList(PSLIST_HEADER list)
{
#ifdef _WIN64
return list->Header16.Depth;
#else
return list->Depth;
#endif
}
/*************************************************************************
* RtlFirstEntrySList (NTDLL.@)
*/
PSLIST_ENTRY WINAPI RtlFirstEntrySList(const SLIST_HEADER* list)
{
#ifdef _WIN64
return (SLIST_ENTRY *)((ULONG_PTR)list->Header16.NextEntry << 4);
#else
return list->Next.Next;
#endif
}
/*************************************************************************
* RtlInterlockedFlushSList (NTDLL.@)
*/
PSLIST_ENTRY WINAPI RtlInterlockedFlushSList(PSLIST_HEADER list)
{
SLIST_HEADER old, new;
#ifdef _WIN64
if (!list->Header16.NextEntry) return NULL;
new.Alignment = new.Region = 0;
new.Header16.HeaderType = 1; /* we use the 16-byte header */
do
{
old = *list;
new.Header16.Sequence = old.Header16.Sequence + 1;
} while (!InterlockedCompareExchange128((__int64 *)list, new.Region, new.Alignment, (__int64 *)&old));
return (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4);
#else
if (!list->Next.Next) return NULL;
new.Alignment = 0;
do
{
old = *list;
new.Sequence = old.Sequence + 1;
} while (InterlockedCompareExchange64((__int64 *)&list->Alignment, new.Alignment,
old.Alignment) != old.Alignment);
return old.Next.Next;
#endif
}
/*************************************************************************
* RtlInterlockedPushEntrySList (NTDLL.@)
*/
PSLIST_ENTRY WINAPI RtlInterlockedPushEntrySList(PSLIST_HEADER list, PSLIST_ENTRY entry)
{
SLIST_HEADER old, new;
#ifdef _WIN64
new.Header16.NextEntry = (ULONG_PTR)entry >> 4;
do
{
old = *list;
entry->Next = (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4);
new.Header16.Depth = old.Header16.Depth + 1;
new.Header16.Sequence = old.Header16.Sequence + 1;
} while (!InterlockedCompareExchange128((__int64 *)list, new.Region, new.Alignment, (__int64 *)&old));
return (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4);
#else
new.Next.Next = entry;
do
{
old = *list;
entry->Next = old.Next.Next;
new.Depth = old.Depth + 1;
new.Sequence = old.Sequence + 1;
} while (InterlockedCompareExchange64((__int64 *)&list->Alignment, new.Alignment,
old.Alignment) != old.Alignment);
return old.Next.Next;
#endif
}
/*************************************************************************
* RtlInterlockedPopEntrySList (NTDLL.@)
*/
PSLIST_ENTRY WINAPI RtlInterlockedPopEntrySList(PSLIST_HEADER list)
{
SLIST_HEADER old, new;
PSLIST_ENTRY entry;
#ifdef _WIN64
do
{
old = *list;
if (!(entry = (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4))) return NULL;
/* entry could be deleted by another thread */
__TRY
{
new.Header16.NextEntry = (ULONG_PTR)entry->Next >> 4;
new.Header16.Depth = old.Header16.Depth - 1;
new.Header16.Sequence = old.Header16.Sequence + 1;
}
__EXCEPT_PAGE_FAULT
{
}
__ENDTRY
} while (!InterlockedCompareExchange128((__int64 *)list, new.Region, new.Alignment, (__int64 *)&old));
#else
do
{
old = *list;
if (!(entry = old.Next.Next)) return NULL;
/* entry could be deleted by another thread */
__TRY
{
new.Next.Next = entry->Next;
new.Depth = old.Depth - 1;
new.Sequence = old.Sequence + 1;
}
__EXCEPT_PAGE_FAULT
{
}
__ENDTRY
} while (InterlockedCompareExchange64((__int64 *)&list->Alignment, new.Alignment,
old.Alignment) != old.Alignment);
#endif
return entry;
}
/*************************************************************************
* RtlInterlockedPushListSListEx (NTDLL.@)
*/
PSLIST_ENTRY WINAPI RtlInterlockedPushListSListEx(PSLIST_HEADER list, PSLIST_ENTRY first,
PSLIST_ENTRY last, ULONG count)
{
SLIST_HEADER old, new;
#ifdef _WIN64
new.Header16.NextEntry = (ULONG_PTR)first >> 4;
do
{
old = *list;
new.Header16.Depth = old.Header16.Depth + count;
new.Header16.Sequence = old.Header16.Sequence + 1;
last->Next = (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4);
} while (!InterlockedCompareExchange128((__int64 *)list, new.Region, new.Alignment, (__int64 *)&old));
return (SLIST_ENTRY *)((ULONG_PTR)old.Header16.NextEntry << 4);
#else
new.Next.Next = first;
do
{
old = *list;
new.Depth = old.Depth + count;
new.Sequence = old.Sequence + 1;
last->Next = old.Next.Next;
} while (InterlockedCompareExchange64((__int64 *)&list->Alignment, new.Alignment,
old.Alignment) != old.Alignment);
return old.Next.Next;
#endif
}
/*************************************************************************
* RtlInterlockedPushListSList (NTDLL.@)
*/
DEFINE_FASTCALL_WRAPPER(RtlInterlockedPushListSList, 16)
PSLIST_ENTRY FASTCALL RtlInterlockedPushListSList(PSLIST_HEADER list, PSLIST_ENTRY first,
PSLIST_ENTRY last, ULONG count)
{
return RtlInterlockedPushListSListEx(list, first, last, count);
}
/***********************************************************************
* RtlInitializeResource (NTDLL.@)
*
* xxxResource() functions implement multiple-reader-single-writer lock.
* The code is based on information published in WDJ January 1999 issue.
*/
void WINAPI RtlInitializeResource(LPRTL_RWLOCK rwl)
{
if (!rwl) return;
rwl->iNumberActive = 0;
rwl->uExclusiveWaiters = 0;
rwl->uSharedWaiters = 0;
rwl->hOwningThreadId = 0;
rwl->dwTimeoutBoost = 0; /* no info on this one, default value is 0 */
RtlInitializeCriticalSectionEx( &rwl->rtlCS, 0, RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO );
rwl->rtlCS.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": RTL_RWLOCK.rtlCS");
NtCreateSemaphore( &rwl->hExclusiveReleaseSemaphore, SEMAPHORE_ALL_ACCESS, NULL, 0, 65535 );
NtCreateSemaphore( &rwl->hSharedReleaseSemaphore, SEMAPHORE_ALL_ACCESS, NULL, 0, 65535 );
}
/***********************************************************************
* RtlDeleteResource (NTDLL.@)
*/
void WINAPI RtlDeleteResource(LPRTL_RWLOCK rwl)
{
if (!rwl) return;
RtlEnterCriticalSection( &rwl->rtlCS );
if( rwl->iNumberActive || rwl->uExclusiveWaiters || rwl->uSharedWaiters )
ERR("Deleting active MRSW lock (%p), expect failure\n", rwl );
rwl->hOwningThreadId = 0;
rwl->uExclusiveWaiters = rwl->uSharedWaiters = 0;
rwl->iNumberActive = 0;
NtClose( rwl->hExclusiveReleaseSemaphore );
NtClose( rwl->hSharedReleaseSemaphore );
RtlLeaveCriticalSection( &rwl->rtlCS );
rwl->rtlCS.DebugInfo->Spare[0] = 0;
RtlDeleteCriticalSection( &rwl->rtlCS );
}
/***********************************************************************
* RtlAcquireResourceExclusive (NTDLL.@)
*/
BYTE WINAPI RtlAcquireResourceExclusive(LPRTL_RWLOCK rwl, BYTE fWait)
{
BYTE retVal = 0;
if (!rwl) return 0;
for (;;)
{
RtlEnterCriticalSection( &rwl->rtlCS );
if( rwl->iNumberActive == 0 ) /* lock is free */
{
rwl->iNumberActive = -1;
retVal = 1;
}
else if( rwl->iNumberActive < 0 ) /* exclusive lock in progress */
{
if( rwl->hOwningThreadId == ULongToHandle(GetCurrentThreadId()) )
{
retVal = 1;
rwl->iNumberActive--;
break;
}
wait:
if( fWait )
{
NTSTATUS status;
rwl->uExclusiveWaiters++;
RtlLeaveCriticalSection( &rwl->rtlCS );
status = NtWaitForSingleObject( rwl->hExclusiveReleaseSemaphore, FALSE, NULL );
if( HIWORD(status) ) break;
continue; /* restart the acquisition to avoid deadlocks */
}
}
else /* one or more shared locks are in progress */
if( fWait )
goto wait;
if( retVal == 1 ) rwl->hOwningThreadId = ULongToHandle(GetCurrentThreadId());
break;
}
RtlLeaveCriticalSection( &rwl->rtlCS );
return retVal;
}
/***********************************************************************
* RtlAcquireResourceShared (NTDLL.@)
*/
BYTE WINAPI RtlAcquireResourceShared(LPRTL_RWLOCK rwl, BYTE fWait)
{
NTSTATUS status = STATUS_UNSUCCESSFUL;
BYTE retVal = 0;
if (!rwl) return 0;
for (;;)
{
RtlEnterCriticalSection( &rwl->rtlCS );
if( rwl->iNumberActive < 0 )
{
if( rwl->hOwningThreadId == ULongToHandle(GetCurrentThreadId()) )
{
rwl->iNumberActive--;
retVal = 1;
break;
}
if( fWait )
{
rwl->uSharedWaiters++;
RtlLeaveCriticalSection( &rwl->rtlCS );
status = NtWaitForSingleObject( rwl->hSharedReleaseSemaphore, FALSE, NULL );
if( HIWORD(status) ) break;
continue;
}
}
else
{
if( status != STATUS_WAIT_0 ) /* otherwise RtlReleaseResource() has already done it */
rwl->iNumberActive++;
retVal = 1;
}
break;
}
RtlLeaveCriticalSection( &rwl->rtlCS );
return retVal;
}
/***********************************************************************
* RtlReleaseResource (NTDLL.@)
*/
void WINAPI RtlReleaseResource(LPRTL_RWLOCK rwl)
{
RtlEnterCriticalSection( &rwl->rtlCS );
if( rwl->iNumberActive > 0 ) /* have one or more readers */
{
if( --rwl->iNumberActive == 0 )
{
if( rwl->uExclusiveWaiters )
{
rwl->uExclusiveWaiters--;
NtReleaseSemaphore( rwl->hExclusiveReleaseSemaphore, 1, NULL );
}
}
}
else if( rwl->iNumberActive < 0 ) /* have a writer, possibly recursive */
{
if( ++rwl->iNumberActive == 0 )
{
rwl->hOwningThreadId = 0;
if( rwl->uExclusiveWaiters )
{
rwl->uExclusiveWaiters--;
NtReleaseSemaphore( rwl->hExclusiveReleaseSemaphore, 1, NULL );
}
else if( rwl->uSharedWaiters )
{
UINT n = rwl->uSharedWaiters;
rwl->iNumberActive = rwl->uSharedWaiters; /* prevent new writers from joining until
* all queued readers have done their thing */
rwl->uSharedWaiters = 0;
NtReleaseSemaphore( rwl->hSharedReleaseSemaphore, n, NULL );
}
}
}
RtlLeaveCriticalSection( &rwl->rtlCS );
}
/***********************************************************************
* RtlDumpResource (NTDLL.@)
*/
void WINAPI RtlDumpResource(LPRTL_RWLOCK rwl)
{
if (!rwl) return;
ERR( "%p: active count = %i waiting readers = %i waiting writers = %i owner thread = %p",
rwl, rwl->iNumberActive, rwl->uSharedWaiters, rwl->uExclusiveWaiters, rwl->hOwningThreadId );
ERR( "\n" );
}
...@@ -2601,7 +2601,7 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type, ...@@ -2601,7 +2601,7 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type,
expected_size = 0; expected_size = 0;
} }
if (!expected_size && expected_data) if (!expected_size && expected_data && (expected_type == REG_SZ || expected_type == REG_EXPAND_SZ))
expected_size = (wcslen(expected_data) + 1) * sizeof(WCHAR); expected_size = (wcslen(expected_data) + 1) * sizeof(WCHAR);
todo_wine_if(test->flags & WINE_TODO_TYPE) todo_wine_if(test->flags & WINE_TODO_TYPE)
...@@ -2611,11 +2611,11 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type, ...@@ -2611,11 +2611,11 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type,
ok(value_data_size == expected_size, "Expected size %lu, got %lu\n", expected_size, value_data_size); ok(value_data_size == expected_size, "Expected size %lu, got %lu\n", expected_size, value_data_size);
todo_wine_if(test->flags & WINE_TODO_DATA && !(test->flags & SPLIT_MULTI && query_routine_calls == 0)) todo_wine_if(test->flags & WINE_TODO_DATA && !(test->flags & SPLIT_MULTI && query_routine_calls == 0))
if (expected_data) if (expected_data == query->DefaultData || expected_data == NULL)
ok(value_data == expected_data, "Expected data %p, got %p\n", expected_data, value_data);
else
ok(!memcmp(value_data, expected_data, value_data_size), ok(!memcmp(value_data, expected_data, value_data_size),
"Expected data %s, got %s\n", debugstr_w(expected_data), debugstr_w(value_data)); "Expected data %s, got %s\n", debugstr_w(expected_data), debugstr_w(value_data));
else
ok(!value_data, "Expected null data\n");
} }
query_routine_calls++; query_routine_calls++;
...@@ -2662,12 +2662,22 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2662,12 +2662,22 @@ static struct query_reg_values_test query_reg_values_tests[] =
/* DIRECT doesn't call the query routine and reads directly into a buffer */ /* DIRECT doesn't call the query routine and reads directly into a buffer */
{ {
{{ query_routine, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }}, {{ query_routine, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"WindowsDrive", &query_reg_values_direct_str }},
STATUS_INVALID_PARAMETER, 0, WINE_TODO_RET | WINE_TODO_NAME | WINE_TODO_TYPE | WINE_TODO_SIZE | WINE_TODO_DATA STATUS_INVALID_PARAMETER, 0, 0, REG_NONE, NULL, -1
},
{
{{ query_routine, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"I don't exist",
&query_reg_values_direct_str, REG_SZ, (WCHAR*)L"Some default" }},
STATUS_INVALID_PARAMETER, 0, 0, REG_NONE, NULL, -1
}, },
{ {
{{ 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_SZ, L"C:"
}, },
{
{{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"WindowsDrive",
&query_reg_values_direct_str }},
STATUS_SUCCESS, 0, 0, REG_SZ, L"%SYSTEMDRIVE%"
},
/* DIRECT on a multi-string crashes on Windows without NOEXPAND */ /* DIRECT on a multi-string crashes on Windows without NOEXPAND */
/* { /* {
{{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"CapitalsOfEurope", &query_reg_values_direct_str }}, {{ NULL, RTL_QUERY_REGISTRY_DIRECT, (WCHAR*)L"CapitalsOfEurope", &query_reg_values_direct_str }},
...@@ -2676,7 +2686,7 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2676,7 +2686,7 @@ 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\0Madrid", sizeof(L"Brussels\0Paris\0Madrid") STATUS_SUCCESS, 0, WINE_TODO_DATA, REG_SZ, L"Brussels\0Paris\0Madrid\0", sizeof(L"Brussels\0Paris\0Madrid\0")
}, },
/* DIRECT with a null buffer crashes on Windows */ /* DIRECT with a null buffer crashes on Windows */
/* { /* {
...@@ -2726,6 +2736,10 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2726,6 +2736,10 @@ static struct query_reg_values_test query_reg_values_tests[] =
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_MULTI_SZ, (WCHAR*)L"Brussels\0Paris\0Madrid\0" }}, {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_MULTI_SZ, (WCHAR*)L"Brussels\0Paris\0Madrid\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 | WINE_TODO_CALLS | WINE_TODO_TYPE | WINE_TODO_SIZE
}, },
{
{{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_DWORD, (WCHAR*)0xdeadbeef }},
STATUS_SUCCESS, 1, EXPECT_DEFAULT_DATA
},
{ {
{{ 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_SZ, (WCHAR*)L"Some default", 4 * sizeof(WCHAR) }}, &query_reg_values_direct_str, REG_SZ, (WCHAR*)L"Some default", 4 * sizeof(WCHAR) }},
...@@ -2739,7 +2753,7 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2739,7 +2753,7 @@ static struct query_reg_values_test query_reg_values_tests[] =
{ {
{{ 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_DATA, REG_EXPAND_SZ, L"C:" STATUS_SUCCESS, 0, WINE_TODO_SIZE | WINE_TODO_DATA, REG_EXPAND_SZ, L"C:"
}, },
/* DIRECT with a multi-string default value crashes on Windows */ /* DIRECT with a multi-string default value crashes on Windows */
/* { /* {
...@@ -2759,12 +2773,18 @@ static struct query_reg_values_test query_reg_values_tests[] = ...@@ -2759,12 +2773,18 @@ static struct query_reg_values_test query_reg_values_tests[] =
{ {
{{ 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_SZ }}, &query_reg_values_direct_str, REG_SZ }},
STATUS_DATA_OVERRUN, 0, WINE_TODO_RET STATUS_DATA_OVERRUN, 0, 0, REG_NONE, NULL, -1
}, },
{ {
{{ 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_NONE, (WCHAR*)L"Some default" }}, &query_reg_values_direct_str, REG_NONE, (WCHAR*)L"Some default" }},
STATUS_SUCCESS, 0 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_str, REG_DWORD, (WCHAR*)0xdeadbeef }},
STATUS_SUCCESS, 0, 0, REG_NONE, NULL, -1
}, },
/* 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 */
{ {
...@@ -2815,6 +2835,7 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2815,6 +2835,7 @@ static void test_RtlQueryRegistryValues(void)
RTL_QUERY_REGISTRY_TABLE *query; RTL_QUERY_REGISTRY_TABLE *query;
const WCHAR *expected_data; const WCHAR *expected_data;
ULONG expected_size; ULONG expected_size;
ULONG expected_type;
winetest_push_context("%u/%Iu", i, ARRAY_SIZE(query_reg_values_tests) - 1); winetest_push_context("%u/%Iu", i, ARRAY_SIZE(query_reg_values_tests) - 1);
...@@ -2825,7 +2846,9 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2825,7 +2846,9 @@ static void test_RtlQueryRegistryValues(void)
} }
query_routine_calls = 0; query_routine_calls = 0;
wcscpy(query_reg_values_direct_str.Buffer, L"###"); query_reg_values_direct_str.Length = query_reg_values_direct_str.MaximumLength - sizeof(WCHAR);
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;
status = pRtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, winetestpath.Buffer, test->query_table, test, NULL); status = pRtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, winetestpath.Buffer, test->query_table, test, NULL);
...@@ -2843,20 +2866,29 @@ static void test_RtlQueryRegistryValues(void) ...@@ -2843,20 +2866,29 @@ static void test_RtlQueryRegistryValues(void)
{ {
if (test->flags & EXPECT_DEFAULT_DATA) if (test->flags & EXPECT_DEFAULT_DATA)
{ {
expected_type = query->DefaultType;
expected_data = query->DefaultData; expected_data = query->DefaultData;
expected_size = query->DefaultLength; expected_size = query->DefaultLength;
} }
else else
{ {
expected_type = test->expected_type;
expected_data = test->expected_data; expected_data = test->expected_data;
expected_size = test->expected_data_size; expected_size = test->expected_data_size;
} }
if (!expected_size && expected_data && (expected_type == REG_SZ || expected_type == REG_EXPAND_SZ))
expected_size = (wcslen(expected_data) + 1) * sizeof(WCHAR);
else if (expected_size == -1)
expected_size = query_reg_values_direct_str.MaximumLength;
todo_wine_if(test->flags & WINE_TODO_SIZE)
ok(query_reg_values_direct_str.Length + sizeof(WCHAR) == expected_size,
"Expected size %lu, got %Iu\n", expected_size,
query_reg_values_direct_str.Length + sizeof(WCHAR));
if (expected_data) if (expected_data)
{ {
if (!expected_size)
expected_size = (wcslen(expected_data) + 1) * sizeof(WCHAR);
todo_wine_if(test->flags & WINE_TODO_DATA) todo_wine_if(test->flags & WINE_TODO_DATA)
ok(!memcmp(query_reg_values_direct_str.Buffer, expected_data, expected_size), ok(!memcmp(query_reg_values_direct_str.Buffer, expected_data, expected_size),
"Expected data %s, got %s\n", debugstr_w(expected_data), "Expected data %s, got %s\n", debugstr_w(expected_data),
......
...@@ -414,6 +414,31 @@ BOOLEAN WINAPI RtlIsCurrentThread( HANDLE handle ) ...@@ -414,6 +414,31 @@ BOOLEAN WINAPI RtlIsCurrentThread( HANDLE handle )
} }
/***********************************************************************
* RtlSetThreadErrorMode (NTDLL.@)
*/
NTSTATUS WINAPI RtlSetThreadErrorMode( DWORD mode, LPDWORD oldmode )
{
if (mode & ~0x70)
return STATUS_INVALID_PARAMETER_1;
if (oldmode)
*oldmode = NtCurrentTeb()->HardErrorMode;
NtCurrentTeb()->HardErrorMode = mode;
return STATUS_SUCCESS;
}
/***********************************************************************
* RtlGetThreadErrorMode (NTDLL.@)
*/
DWORD WINAPI RtlGetThreadErrorMode( void )
{
return NtCurrentTeb()->HardErrorMode;
}
/*********************************************************************** /***********************************************************************
* _errno (NTDLL.@) * _errno (NTDLL.@)
*/ */
......
...@@ -341,7 +341,8 @@ static BOOL is_special_env_var( const char *var ) ...@@ -341,7 +341,8 @@ static BOOL is_special_env_var( const char *var )
STARTS_WITH( var, "TEMP=" ) || STARTS_WITH( var, "TEMP=" ) ||
STARTS_WITH( var, "TMP=" ) || STARTS_WITH( var, "TMP=" ) ||
STARTS_WITH( var, "QT_" ) || STARTS_WITH( var, "QT_" ) ||
STARTS_WITH( var, "VK_" )); STARTS_WITH( var, "VK_" ) ||
STARTS_WITH( var, "XDG_SESSION_TYPE=" ));
} }
/* check if an environment variable changes dynamically in every new process */ /* check if an environment variable changes dynamically in every new process */
......
...@@ -979,10 +979,8 @@ typedef struct serial_irq_info ...@@ -979,10 +979,8 @@ typedef struct serial_irq_info
*/ */
typedef struct async_commio typedef struct async_commio
{ {
HANDLE hDevice; struct async_fileio io;
DWORD* events; DWORD* events;
client_ptr_t iosb;
HANDLE hEvent;
UINT evtmask; UINT evtmask;
UINT cookie; UINT cookie;
UINT mstat; UINT mstat;
...@@ -1083,84 +1081,87 @@ static DWORD check_events(int fd, UINT mask, ...@@ -1083,84 +1081,87 @@ static DWORD check_events(int fd, UINT mask,
return ret & mask; return ret & mask;
} }
/*********************************************************************** static BOOL async_wait_proc( void *user, ULONG_PTR *info, unsigned int *status )
* wait_for_event (INTERNAL)
*
* We need to poll for what is interesting
* TIOCMIWAIT only checks modem status line and may not be aborted by a changing mask
*
*/
static void CALLBACK wait_for_event(LPVOID arg)
{ {
async_commio *commio = arg; async_commio *commio = user;
int fd, needs_close; int fd, needs_close;
if (!server_get_unix_fd( commio->hDevice, FILE_READ_DATA | FILE_WRITE_DATA, &fd, &needs_close, NULL, NULL )) if (*status != STATUS_ALERTED)
{
release_fileio( &commio->io );
return TRUE;
}
if (!server_get_unix_fd( commio->io.handle, FILE_READ_DATA | FILE_WRITE_DATA, &fd, &needs_close, NULL, NULL ))
{ {
serial_irq_info new_irq_info; serial_irq_info new_irq_info;
UINT new_mstat, dummy, cookie; UINT new_mstat, dummy, cookie;
LARGE_INTEGER time;
TRACE("device=%p fd=0x%08x mask=0x%08x buffer=%p event=%p irq_info=%p\n", TRACE( "device=%p fd=0x%08x mask=0x%08x buffer=%p irq_info=%p\n",
commio->hDevice, fd, commio->evtmask, commio->events, commio->hEvent, &commio->irq_info); commio->io.handle, fd, commio->evtmask, commio->events, &commio->irq_info );
time.QuadPart = (ULONGLONG)10000; /*
time.QuadPart = -time.QuadPart; * FIXME:
for (;;) * We don't handle the EV_RXFLAG (the eventchar)
*/
get_irq_info(fd, &new_irq_info);
if (get_modem_status(fd, &new_mstat))
{
TRACE("get_modem_status failed\n");
*commio->events = 0;
*status = STATUS_CANCELLED;
*info = 0;
}
else
{ {
/* DWORD events = check_events( fd, commio->evtmask,
* TIOCMIWAIT is not adequate &new_irq_info, &commio->irq_info,
* new_mstat, commio->mstat, commio->pending_write );
* FIXME: TRACE("events %#x\n", (int)events);
* We don't handle the EV_RXFLAG (the eventchar) if (events)
*/
NtDelayExecution(FALSE, &time);
get_irq_info(fd, &new_irq_info);
if (get_modem_status(fd, &new_mstat))
{ {
TRACE("get_modem_status failed\n"); *commio->events = events;
*commio->events = 0; *status = STATUS_SUCCESS;
break; *info = sizeof(events);
} }
*commio->events = check_events(fd, commio->evtmask, else
&new_irq_info, &commio->irq_info,
new_mstat, commio->mstat, commio->pending_write);
if (*commio->events) break;
get_wait_mask(commio->hDevice, &dummy, &cookie, (commio->evtmask & EV_TXEMPTY) ? &commio->pending_write : NULL, FALSE);
if (commio->cookie != cookie)
{ {
*commio->events = 0; get_wait_mask( commio->io.handle, &dummy, &cookie, (commio->evtmask & EV_TXEMPTY) ? &commio->pending_write : NULL, FALSE );
break; if (commio->cookie != cookie)
{
*commio->events = 0;
*status = STATUS_CANCELLED;
*info = 0;
}
else
{
if (needs_close) close( fd );
return FALSE;
}
} }
} }
if (needs_close) close( fd ); if (needs_close) close( fd );
} }
if (*commio->events) set_async_iosb( commio->iosb, STATUS_SUCCESS, sizeof(DWORD) ); stop_waiting( commio->io.handle );
else set_async_iosb( commio->iosb, STATUS_CANCELLED, 0 ); release_fileio( &commio->io );
stop_waiting(commio->hDevice); return TRUE;
if (commio->hEvent) NtSetEvent(commio->hEvent, NULL);
free( commio );
NtTerminateThread( GetCurrentThread(), 0 );
} }
static NTSTATUS wait_on(HANDLE hDevice, int fd, HANDLE hEvent, client_ptr_t iosb_ptr, DWORD* events) static NTSTATUS wait_on( HANDLE handle, int fd, HANDLE event, PIO_APC_ROUTINE apc,
void *apc_user, IO_STATUS_BLOCK *io, DWORD *out_buffer )
{ {
async_commio* commio; async_commio* commio;
NTSTATUS status; NTSTATUS status;
HANDLE handle; HANDLE wait_handle;
ULONG options;
if ((status = NtResetEvent(hEvent, NULL))) if (!(commio = (async_commio *)alloc_fileio( sizeof(*commio), async_wait_proc, handle )))
return status; return STATUS_NO_MEMORY;
commio = malloc( sizeof(async_commio) ); commio->events = out_buffer;
if (!commio) return STATUS_NO_MEMORY;
commio->hDevice = hDevice;
commio->events = events;
commio->iosb = iosb_ptr;
commio->hEvent = hEvent;
commio->pending_write = 0; commio->pending_write = 0;
status = get_wait_mask(commio->hDevice, &commio->evtmask, &commio->cookie, (commio->evtmask & EV_TXEMPTY) ? &commio->pending_write : NULL, TRUE); status = get_wait_mask( handle, &commio->evtmask, &commio->cookie, (commio->evtmask & EV_TXEMPTY) ? &commio->pending_write : NULL, TRUE );
if (status) if (status)
{ {
free( commio ); free( commio );
...@@ -1209,23 +1210,42 @@ static NTSTATUS wait_on(HANDLE hDevice, int fd, HANDLE hEvent, client_ptr_t iosb ...@@ -1209,23 +1210,42 @@ static NTSTATUS wait_on(HANDLE hDevice, int fd, HANDLE hEvent, client_ptr_t iosb
(commio->evtmask & (EV_CTS | EV_DSR| EV_RING| EV_RLSD))) (commio->evtmask & (EV_CTS | EV_DSR| EV_RING| EV_RLSD)))
goto out_now; goto out_now;
/* We might have received something or the TX buffer is delivered */ SERVER_START_REQ( ioctl )
*events = check_events(fd, commio->evtmask,
&commio->irq_info, &commio->irq_info,
commio->mstat, commio->mstat, commio->pending_write);
if (*events)
{ {
status = STATUS_SUCCESS; req->code = IOCTL_SERIAL_WAIT_ON_MASK;
goto out_now; req->async = server_async( handle, &commio->io, event, apc, apc_user, iosb_client_ptr(io) );
status = wine_server_call( req );
wait_handle = wine_server_ptr_handle( reply->wait );
options = reply->options;
} }
SERVER_END_REQ;
/* create the worker thread for the task */ if (status == STATUS_ALERTED)
/* FIXME: should use async I/O instead */ {
status = NtCreateThreadEx( &handle, THREAD_ALL_ACCESS, NULL, GetCurrentProcess(), /* We might have received something or the TX buffer is delivered */
wait_for_event, commio, 0, 0, 0, 0, NULL ); DWORD events = check_events(fd, commio->evtmask,
if (status != STATUS_SUCCESS) goto out_now; &commio->irq_info, &commio->irq_info,
NtClose( handle ); commio->mstat, commio->mstat, commio->pending_write);
return STATUS_PENDING; if (events)
{
status = STATUS_SUCCESS;
io->Status = STATUS_SUCCESS;
io->Information = sizeof(events);
*out_buffer = events;
set_async_direct_result( &wait_handle, STATUS_SUCCESS, sizeof(events), FALSE );
}
else
{
status = STATUS_PENDING;
set_async_direct_result( &wait_handle, STATUS_PENDING, 0, TRUE );
}
}
if (status != STATUS_PENDING)
release_fileio( &commio->io );
if (wait_handle) status = wait_async( wait_handle, options & FILE_SYNCHRONOUS_IO_ALERT );
return status;
#if !defined(TIOCINQ) || (!(defined(TIOCSERGETLSR) && defined(TIOCSER_TEMT)) || !defined(TIOCINQ)) || !defined(TIOCMGET) || !defined(TIOCM_CTS) ||!defined(TIOCM_DSR) || !defined(TIOCM_RNG) || !defined(TIOCM_CAR) #if !defined(TIOCINQ) || (!(defined(TIOCSERGETLSR) && defined(TIOCSER_TEMT)) || !defined(TIOCINQ)) || !defined(TIOCMGET) || !defined(TIOCM_CTS) ||!defined(TIOCM_DSR) || !defined(TIOCM_RNG) || !defined(TIOCM_CAR)
error_caps: error_caps:
...@@ -1233,7 +1253,6 @@ error_caps: ...@@ -1233,7 +1253,6 @@ error_caps:
status = STATUS_INVALID_PARAMETER; status = STATUS_INVALID_PARAMETER;
#endif #endif
out_now: out_now:
stop_waiting(commio->hDevice);
free( commio ); free( commio );
return status; return status;
} }
...@@ -1247,9 +1266,9 @@ static NTSTATUS xmit_immediate(HANDLE hDevice, int fd, const char* ptr) ...@@ -1247,9 +1266,9 @@ static NTSTATUS xmit_immediate(HANDLE hDevice, int fd, const char* ptr)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
static NTSTATUS io_control( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, NTSTATUS serial_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user,
IO_STATUS_BLOCK *io, UINT code, void *in_buffer, IO_STATUS_BLOCK *io, UINT code, void *in_buffer,
UINT in_size, void *out_buffer, UINT out_size ) UINT in_size, void *out_buffer, UINT out_size )
{ {
DWORD sz = 0, access = FILE_READ_DATA; DWORD sz = 0, access = FILE_READ_DATA;
NTSTATUS status = STATUS_SUCCESS; NTSTATUS status = STATUS_SUCCESS;
...@@ -1447,11 +1466,14 @@ static NTSTATUS io_control( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, vo ...@@ -1447,11 +1466,14 @@ static NTSTATUS io_control( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, vo
case IOCTL_SERIAL_WAIT_ON_MASK: case IOCTL_SERIAL_WAIT_ON_MASK:
if (out_buffer && out_size == sizeof(DWORD)) if (out_buffer && out_size == sizeof(DWORD))
{ {
if (!(status = wait_on(device, fd, event, iosb_client_ptr(io), out_buffer))) status = wait_on( device, fd, event, apc, apc_user, io, out_buffer );
sz = sizeof(DWORD); if (needs_close) close( fd );
return status;
} }
else else
{
status = STATUS_INVALID_PARAMETER; status = STATUS_INVALID_PARAMETER;
}
break; break;
default: default:
FIXME("Unsupported IOCTL %x (type=%x access=%x func=%x meth=%x)\n", FIXME("Unsupported IOCTL %x (type=%x access=%x func=%x meth=%x)\n",
...@@ -1464,54 +1486,7 @@ static NTSTATUS io_control( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, vo ...@@ -1464,54 +1486,7 @@ static NTSTATUS io_control( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, vo
error: error:
io->Status = status; io->Status = status;
io->Information = sz; io->Information = sz;
if (event && status != STATUS_PENDING) NtSetEvent(event, NULL); if (event) NtSetEvent(event, NULL);
return status;
}
/******************************************************************
* serial_DeviceIoControl
*/
NTSTATUS serial_DeviceIoControl( HANDLE device, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user,
IO_STATUS_BLOCK *io, UINT code, void *in_buffer,
UINT in_size, void *out_buffer, UINT out_size )
{
NTSTATUS status;
if (code == IOCTL_SERIAL_WAIT_ON_MASK)
{
HANDLE hev = event;
/* this is an ioctl we implement in a non blocking way if event is not null
* so we have to explicitly wait if no event is provided
*/
if (!hev)
{
OBJECT_ATTRIBUTES attr;
attr.Length = sizeof(attr);
attr.RootDirectory = 0;
attr.ObjectName = NULL;
attr.Attributes = OBJ_CASE_INSENSITIVE | OBJ_OPENIF;
attr.SecurityDescriptor = NULL;
attr.SecurityQualityOfService = NULL;
status = NtCreateEvent(&hev, EVENT_ALL_ACCESS, &attr, SynchronizationEvent, FALSE);
if (status) return status;
}
status = io_control( device, hev, apc, apc_user, io, code,
in_buffer, in_size, out_buffer, out_size );
if (hev != event)
{
if (status == STATUS_PENDING)
{
NtWaitForSingleObject(hev, FALSE, NULL);
status = STATUS_SUCCESS;
}
NtClose(hev);
}
}
else status = io_control( device, event, apc, apc_user, io, code,
in_buffer, in_size, out_buffer, out_size );
return status; return status;
} }
......
...@@ -184,6 +184,16 @@ void compress_finalize_archive(struct zip_archive *archive) ...@@ -184,6 +184,16 @@ void compress_finalize_archive(struct zip_archive *archive)
free(archive); free(archive);
} }
static void *zalloc(void *opaque, unsigned int items, unsigned int size)
{
return malloc(items * size);
}
static void zfree(void *opaque, void *ptr)
{
free(ptr);
}
static void compress_write_content(struct zip_archive *archive, IStream *content, static void compress_write_content(struct zip_archive *archive, IStream *content,
OPC_COMPRESSION_OPTIONS options, struct data_descriptor *data_desc) OPC_COMPRESSION_OPTIONS options, struct data_descriptor *data_desc)
{ {
...@@ -192,6 +202,7 @@ static void compress_write_content(struct zip_archive *archive, IStream *content ...@@ -192,6 +202,7 @@ static void compress_write_content(struct zip_archive *archive, IStream *content
LARGE_INTEGER move; LARGE_INTEGER move;
ULONG num_read; ULONG num_read;
HRESULT hr; HRESULT hr;
int init_ret;
data_desc->crc32 = RtlComputeCrc32(0, NULL, 0); data_desc->crc32 = RtlComputeCrc32(0, NULL, 0);
move.QuadPart = 0; move.QuadPart = 0;
...@@ -220,7 +231,10 @@ static void compress_write_content(struct zip_archive *archive, IStream *content ...@@ -220,7 +231,10 @@ static void compress_write_content(struct zip_archive *archive, IStream *content
} }
memset(&z_str, 0, sizeof(z_str)); memset(&z_str, 0, sizeof(z_str));
deflateInit2(&z_str, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY); z_str.zalloc = zalloc;
z_str.zfree = zfree;
if ((init_ret = deflateInit2(&z_str, level, Z_DEFLATED, -MAX_WBITS, MAX_MEM_LEVEL, Z_DEFAULT_STRATEGY)) != Z_OK)
WARN("Failed to allocate memory in deflateInit2, ret %d.\n", init_ret);
do do
{ {
...@@ -245,7 +259,7 @@ static void compress_write_content(struct zip_archive *archive, IStream *content ...@@ -245,7 +259,7 @@ static void compress_write_content(struct zip_archive *archive, IStream *content
z_str.avail_out = sizeof(archive->output_buffer); z_str.avail_out = sizeof(archive->output_buffer);
z_str.next_out = archive->output_buffer; z_str.next_out = archive->output_buffer;
if ((ret = deflate(&z_str, flush))) if ((ret = deflate(&z_str, flush)) < 0)
WARN("Failed to deflate, ret %d.\n", ret); WARN("Failed to deflate, ret %d.\n", ret);
have = sizeof(archive->output_buffer) - z_str.avail_out; have = sizeof(archive->output_buffer) - z_str.avail_out;
compress_write(archive, archive->output_buffer, have); compress_write(archive, archive->output_buffer, have);
......
...@@ -113,9 +113,6 @@ static pa_mainloop *pulse_ml; ...@@ -113,9 +113,6 @@ static pa_mainloop *pulse_ml;
static struct list g_phys_speakers = LIST_INIT(g_phys_speakers); static struct list g_phys_speakers = LIST_INIT(g_phys_speakers);
static struct list g_phys_sources = LIST_INIT(g_phys_sources); static struct list g_phys_sources = LIST_INIT(g_phys_sources);
static const REFERENCE_TIME MinimumPeriod = 30000;
static const REFERENCE_TIME DefaultPeriod = 100000;
static pthread_mutex_t pulse_mutex; static pthread_mutex_t pulse_mutex;
static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER; static pthread_cond_t pulse_cond = PTHREAD_COND_INITIALIZER;
...@@ -750,12 +747,6 @@ static void pulse_probe_settings(int render, const char *pulse_name, WAVEFORMATE ...@@ -750,12 +747,6 @@ static void pulse_probe_settings(int render, const char *pulse_name, WAVEFORMATE
if (length) if (length)
*def_period = *min_period = pa_bytes_to_usec(10 * length, &ss); *def_period = *min_period = pa_bytes_to_usec(10 * length, &ss);
if (*min_period < MinimumPeriod)
*min_period = MinimumPeriod;
if (*def_period < DefaultPeriod)
*def_period = DefaultPeriod;
wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE; wfx->wFormatTag = WAVE_FORMAT_EXTENSIBLE;
wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX); wfx->cbSize = sizeof(WAVEFORMATEXTENSIBLE) - sizeof(WAVEFORMATEX);
......