-- v4: Revert "Merge branch wine:master into AddRadeonRX6600"
From: Maarten Jacobs maarten256@hotmail.com
--- dlls/wined3d/directx.c | 1 + dlls/wined3d/wined3d_private.h | 1 + 2 files changed, 2 insertions(+)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index f236a59f963..ea3da476689 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -549,6 +549,7 @@ static const struct wined3d_gpu_description gpu_description_table[] = {HW_VENDOR_AMD, CARD_AMD_RADEON_PRO_V620_VF, "Radeon Pro V620 VF", DRIVER_AMD_RX, 32768}, {HW_VENDOR_AMD, CARD_AMD_VANGOGH, "AMD VANGOGH", DRIVER_AMD_RX, 4096}, {HW_VENDOR_AMD, CARD_AMD_RAPHAEL, "AMD Radeon(TM) Graphics", DRIVER_AMD_RX, 4096}, + {HW_VENDOR_AMD, CARD_AMD_RADEON_RX_NAVI_23, "Radeon RX 6600/6600 XT/6600M", DRIVER_AMD_RX, 8192},
/* Red Hat */ {HW_VENDOR_REDHAT, CARD_REDHAT_VIRGL, "Red Hat VirtIO GPU", DRIVER_REDHAT_VIRGL, 1024}, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 46cc0ec30ce..e4a3fdcbcf3 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2175,6 +2175,7 @@ enum wined3d_pci_device CARD_AMD_RADEON_RX_NAVI_10 = 0x731f, CARD_AMD_RADEON_RX_NAVI_14 = 0x7340, CARD_AMD_RADEON_RX_NAVI_21 = 0x73bf, + CARD_AMD_RADEON_RX_NAVI_23 = 0x73ff, CARD_AMD_RADEON_PRO_V620 = 0x73a1, CARD_AMD_RADEON_PRO_V620_VF = 0x73ae, CARD_AMD_VANGOGH = 0x163f,
From: Maarten Jacobs maarten256@hotmail.com
This reverts commit be42e8fbc873250187933e33f3a9c9dbbe940955 --- ANNOUNCE.md | 814 ++++--- AUTHORS | 1 - MAINTAINERS | 17 + VERSION | 2 +- configure | 18 +- dlls/comctl32/tests/Makefile.in | 2 +- dlls/comctl32/tests/misc.c | 22 - dlls/comctl32/treeview.c | 2 +- dlls/crypt32/cert.c | 13 +- dlls/d3d8/tests/device.c | 13 - dlls/d3d9/device.c | 8 - dlls/d3d9/tests/d3d9ex.c | 140 -- dlls/d3d9/tests/device.c | 13 - dlls/d3d9/tests/visual.c | 7 - dlls/dbghelp/msc.c | 134 +- dlls/ddraw/surface.c | 8 - dlls/ddraw/tests/ddraw1.c | 7 - dlls/ddraw/tests/ddraw2.c | 4 - dlls/ddraw/tests/ddraw4.c | 4 - dlls/ddraw/tests/ddraw7.c | 4 - dlls/dwrite/font.c | 4 +- dlls/dxdiagn/Makefile.in | 2 +- dlls/dxdiagn/dxdiag_main.c | 2 +- dlls/dxdiagn/dxdiag_private.h | 4 + dlls/dxdiagn/provider.c | 73 - dlls/dxdiagn/tests/container.c | 1 - dlls/gdiplus/graphics.c | 23 +- dlls/gdiplus/tests/graphics.c | 2 + dlls/jscript/dispex.c | 25 +- dlls/jscript/jsdisp.idl | 3 - dlls/jscript/regexp.c | 2 +- dlls/light.msstyles/Makefile.in | 4 - .../blue_explorer_listview_item_hot.bmp | Bin 334 -> 0 bytes .../blue_explorer_listview_item_hot.svg | 4 - ...ue_explorer_listview_item_hot_selected.bmp | Bin 334 -> 0 bytes ...ue_explorer_listview_item_hot_selected.svg | 4 - .../blue_explorer_listview_item_selected.bmp | Bin 334 -> 0 bytes .../blue_explorer_listview_item_selected.svg | 4 - ...lorer_listview_item_selected_not_focus.bmp | Bin 334 -> 0 bytes ...lorer_listview_item_selected_not_focus.svg | 4 - dlls/light.msstyles/light.rc | 213 +- dlls/mf/tests/transform.c | 2 - dlls/mfreadwrite/reader.c | 28 +- dlls/msado15/recordset.c | 5 +- dlls/mshtml/dispex.c | 150 +- dlls/mshtml/htmlattr.c | 17 +- dlls/mshtml/htmldoc.c | 30 +- dlls/mshtml/htmlelem.c | 60 +- dlls/mshtml/htmlelemcol.c | 4 +- dlls/mshtml/htmlevent.c | 96 +- dlls/mshtml/htmlevent.h | 4 +- dlls/mshtml/htmlform.c | 2 +- dlls/mshtml/htmlframe.c | 4 +- dlls/mshtml/htmlnode.c | 12 +- dlls/mshtml/htmlobject.c | 2 +- dlls/mshtml/htmlscript.h | 2 +- dlls/mshtml/htmlselect.c | 2 +- dlls/mshtml/htmlstorage.c | 4 +- dlls/mshtml/htmlstyle.c | 2 +- dlls/mshtml/htmlstyle.h | 2 +- dlls/mshtml/htmlstylesheet.c | 8 +- dlls/mshtml/htmlwindow.c | 53 +- dlls/mshtml/mshtml.inf | 4 - dlls/mshtml/mshtml_private.h | 36 +- dlls/mshtml/mutation.c | 4 +- dlls/mshtml/nsembed.c | 3 +- dlls/mshtml/nsevents.c | 8 +- dlls/mshtml/omnavigator.c | 43 +- dlls/mshtml/pluginhost.c | 4 +- dlls/mshtml/pluginhost.h | 2 +- dlls/mshtml/range.c | 7 +- dlls/mshtml/script.c | 10 +- dlls/mshtml/selection.c | 2 +- dlls/mshtml/tests/documentmode.js | 196 +- dlls/mshtml/tests/es5.js | 29 - dlls/mshtml/tests/xhr.js | 1 + dlls/mshtml/xmlhttprequest.c | 4 +- dlls/msv1_0/unixlib.c | 1 - dlls/msvcrt/file.c | 20 +- dlls/msvcrt/msvcrt.h | 7 - dlls/ntdll/ntdll.spec | 1 - dlls/ntdll/reg.c | 32 +- dlls/ntdll/signal_arm64ec.c | 46 +- dlls/ntdll/signal_x86_64.c | 2 - dlls/ntdll/tests/reg.c | 21 +- dlls/ntdll/tests/wow64.c | 32 - dlls/ntdll/unix/loader.c | 3 - dlls/ntdll/unix/signal_arm64.c | 13 +- dlls/ntdll/unix/socket.c | 5 +- dlls/ntdll/unix/unix_private.h | 8 - dlls/ntdll/unwind.h | 2 - dlls/ntoskrnl.exe/tests/ntoskrnl.c | 26 +- dlls/odbc32/odbc32.spec | 46 +- dlls/odbc32/proxyodbc.c | 1888 +++++------------ dlls/odbc32/tests/odbc32.c | 91 +- dlls/odbc32/unixlib.c | 4 +- dlls/odbc32/unixlib.h | 2 - dlls/opengl32/make_opengl | 18 +- dlls/opengl32/unix_wgl.c | 55 +- dlls/opengl32/unixlib.h | 18 +- dlls/opengl32/wgl.c | 12 +- dlls/quartz/vmr9.c | 85 +- dlls/secur32/schannel_gnutls.c | 14 +- dlls/secur32/tests/schannel.c | 25 +- dlls/setupapi/query.c | 70 +- dlls/setupapi/queue.c | 35 +- dlls/setupapi/tests/Makefile.in | 2 +- dlls/setupapi/tests/devinst.c | 595 +----- dlls/setupapi/tests/install.c | 78 - dlls/setupapi/tests/misc.c | 305 +++ dlls/setupapi/tests/query.c | 72 +- dlls/shell32/shellpath.c | 3 +- dlls/ucrtbase/tests/file.c | 6 +- dlls/urlmon/tests/protocol.c | 2 +- dlls/user32/tests/msg.c | 38 +- dlls/win32u/dce.c | 2 + dlls/win32u/input.c | 50 +- dlls/win32u/scroll.c | 18 - dlls/win32u/sysparams.c | 3 - dlls/win32u/win32u_private.h | 1 - dlls/win32u/window.c | 84 +- dlls/wineandroid.drv/android.h | 2 + dlls/wineandroid.drv/init.c | 1 + dlls/wineandroid.drv/keyboard.c | 17 +- dlls/wineandroid.drv/window.c | 69 +- dlls/winebus.sys/bus_sdl.c | 3 +- dlls/winebus.sys/hid.c | 4 +- dlls/wined3d/cs.c | 14 +- dlls/wined3d/device.c | 18 +- dlls/wined3d/ffp_gl.c | 43 +- dlls/wined3d/glsl_shader.c | 315 ++- dlls/wined3d/shader_spirv.c | 3 + dlls/wined3d/stateblock.c | 304 +-- dlls/wined3d/texture.c | 11 - dlls/wined3d/utils.c | 37 +- dlls/wined3d/wined3d_gl.h | 2 - dlls/wined3d/wined3d_private.h | 45 +- dlls/winegstreamer/video_decoder.c | 7 - dlls/winemac.drv/cocoa_window.h | 3 + dlls/winemac.drv/cocoa_window.m | 104 +- dlls/winemac.drv/keyboard.c | 21 +- dlls/winemac.drv/macdrv.h | 2 + dlls/winemac.drv/macdrv_cocoa.h | 4 +- dlls/winemac.drv/surface.c | 37 +- dlls/winemac.drv/window.c | 97 +- dlls/winevulkan/loader.c | 110 +- dlls/winevulkan/make_vulkan | 2 +- dlls/winevulkan/vulkan.c | 178 +- dlls/winevulkan/vulkan_loader.h | 63 +- dlls/winevulkan/vulkan_private.h | 10 +- dlls/winevulkan/vulkan_thunks.c | 12 +- dlls/winewayland.drv/wayland_keyboard.c | 18 +- dlls/winex11.drv/bitblt.c | 19 +- dlls/winex11.drv/keyboard.c | 24 +- dlls/winex11.drv/window.c | 46 +- dlls/winhttp/session.c | 2 +- dlls/winhttp/tests/winhttp.c | 67 +- dlls/wow64/process.c | 9 +- dlls/wow64/syscall.c | 4 +- dlls/wow64/wow64_private.h | 3 +- dlls/wow64win/user.c | 9 +- dlls/xaudio2_7/xaudio_dll.c | 4 +- dlls/xtajit64/cpu.c | 18 - dlls/xtajit64/xtajit64.spec | 4 +- include/ntuser.h | 6 - include/wine/mscvpdb.h | 267 +-- include/wine/server_protocol.h | 5 +- include/x3daudio.h | 4 +- include/xaudio2.idl | 2 +- programs/cmd/batch.c | 222 +- programs/cmd/builtins.c | 374 ++-- programs/cmd/tests/test_builtins.cmd | 42 +- programs/cmd/tests/test_builtins.cmd.exp | 50 +- programs/cmd/wcmd.h | 49 +- programs/cmd/wcmdmain.c | 190 +- server/protocol.def | 5 +- server/queue.c | 88 +- server/sock.c | 2 - server/trace.c | 1 + tools/winedump/minidump.c | 44 +- tools/winedump/msc.c | 99 +- 181 files changed, 3469 insertions(+), 6036 deletions(-) delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_hot.bmp delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_hot.svg delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_hot_selected.bmp delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_hot_selected.svg delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_selected.bmp delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_selected.svg delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.bmp delete mode 100644 dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.svg
diff --git a/ANNOUNCE.md b/ANNOUNCE.md index fd43bb3260f..2bffc05cb42 100644 --- a/ANNOUNCE.md +++ b/ANNOUNCE.md @@ -1,12 +1,13 @@ -The Wine development release 9.13 is now available. +The Wine development release 9.12 is now available.
What's new in this release: - - Support for loading ODBC Windows drivers. - - More user32 data structures in shared memory. - - More rewriting of the CMD.EXE engine. + - Initial support for user32 data structures in shared memory. + - Mono engine updated to version 9.2.0. + - Rewrite of the CMD.EXE engine. + - Fixed handling of async I/O status in new WoW64 mode. - Various bug fixes.
-The source is available at https://dl.winehq.org/wine/source/9.x/wine-9.13.tar.xz +The source is available at https://dl.winehq.org/wine/source/9.x/wine-9.12.tar.xz
Binary packages for various distributions will be available from https://www.winehq.org/download @@ -16,421 +17,410 @@ You will find documentation on https://www.winehq.org/documentation Wine is available thanks to the work of many people. See the file [AUTHORS][1] for the complete list.
-[1]: https://gitlab.winehq.org/wine/wine/-/raw/wine-9.13/AUTHORS +[1]: https://gitlab.winehq.org/wine/wine/-/raw/wine-9.12/AUTHORS
----------------------------------------------------------------
-### Bugs fixed in 9.13 (total 22): - - - #21344 Buffer overflow in WCMD_run_program - - #35163 Victoria 2: A House Divided crashes on start with built-in quartz - - #39206 Lylian demo hangs after intro video - - #44315 Buffer maps cause CPU-GPU synchronization (Guild Wars 2, The Witcher 3) - - #44888 Wrong texture in Assassin's Creed : Revelations - - #45810 WINEPATH maximums - - #52345 Unclosed right-side double quote in if command breaks wine cmd - - #52346 Filename completion is not supported in cmd - - #54246 Full Metal Daemon Muramasa stuck at black screen at boot - - #54499 Native ODBC drivers should be able be used. - - #54575 False positive detection of mmc reader as hard drive since kernel 6.1 - - #55130 IF EXIST fails when its argument ends on a slash - - #55401 CMD 'for loop' params are not recognized - - #56575 CUERipper 2.2.5 Crashes on loading WMA plugin - - #56600 MEGA TECH Faktura Small Business: Access violation in module kernelbase.dll - - #56617 Photoshop CC 2024: crashes after a short period (Unimplemented function NETAPI32.dll.NetGetAadJoinInformation) - - #56882 ConEmu errors: Injecting hooks failed - - #56895 So Blonde (demo): font display bug (regression) - - #56938 msiexec crashes with stack overflow when installing python 3.11+ dev.msi - - #56945 Multiple UI elements in builtin programs is missing (taskbar in Virtual Desktop, right-click menu in RegEdit) - - #56948 Intel Hardware Accelerated Execution Manager needs unimplemented function ntoskrnl.exe.KeQueryGroupAffinity - - #56952 PS installer crashes inside msi (regression) - -### Changes since 9.12: +### Bugs fixed in 9.12 (total 24): + + - #43337 Conditional command with parentheses not working. + - #44063 Parentheses cause cmd.exe failing to recognize '2>&1' + - #47071 Nest or mixed "FOR" and "IF" command sometimes get different result in Wine and Windows. + - #47798 Incorrect substring result using enableDelayedExpansion + - #49993 CUERipper 2.1.x does not work with Wine-Mono + - #50723 Can't recognize ... as an internal or external command, or batch script + - #52344 Can't substitute variables as a command + - #52879 ESET SysInspector 1.4.2.0 crashes on unimplemented function wevtapi.dll.EvtCreateRenderContext + - #53190 cmd.exe incorrectly parses a line with nested if commands + - #54935 Rewrite (VN): black screen videos with WMP backend and gstreamer + - #55947 Serial port event waits should use async I/O + - #56189 quartz:vmr7 - test_default_presenter_allocate() fails on Windows 7 + - #56389 Assassin's Creed & Assassin's Creed: Revelations do not run under new WoW64 + - #56698 SuddenStrike 3 crashes when opening the intro movie + - #56763 Firefox 126.0.1 crashes on startup + - #56769 Death to Spies: intro videos have audio only but no video + - #56771 Receiving mail in BeckyInternetMail freezes + - #56827 Window borders disappear + - #56836 Assassin's Creed III stuck on loading screen (Vulkan renderer) + - #56838 FL Studio 21 gui problem + - #56839 App packager from Windows SDK (MakeAppx.exe) 'pack' command crashes due to unimplemented functions in ntdll.dll + - #56840 Apps don't launch with wayland driver + - #56841 virtual desktop "explorer.exe /desktop=shell,1920x1080" broken + - #56871 The 32-bit wpcap program is working abnormally + +### Changes since 9.11: ``` -Alex Henrie (11): - msi: Initialize size argument to RegGetValueW. - shell32: Pass size in bytes to RegGetValueW. - twinapi.appcore: Initialize size argument to RegGetValueW. - mscoree: Pass size in bytes to RegGetValueW. - wineboot: Correct size argument to SetupDiSetDeviceRegistryPropertyA. - advapi32/tests: Test RegGetValue[AW] null termination. - advapi32/tests: Drop security test workarounds for Windows <= 2000. - windowscodecs: Use RegQueryValueExW in ComponentInfo_GetStringValue. - kernelbase: Ensure null termination in RegGetValue[AW]. - ntdll: Double-null-terminate registry multi-strings in RtlQueryRegistryValues. - ntdll/tests: Remove unused WINE_TODO_DATA flag. - -Alexandre Julliard (26): - kernelbase: Mask extra protection flags in WriteProcessMemory. - wow64: Call pre- and post- memory notifications also in the current process case. - wow64: Add more cross-process notifications. - ntdll/tests: Add tests for in-process memory notifications on ARM64. - wow64: Add a helper to get the 32-bit TEB. - ntdll: Always set the dll name pointer in the 32-bit TEB. - wow64: Fix NtMapViewOfSection CPU backend notifications. - wow64: Add NtReadFile CPU backend notifications. - wow64cpu: Simplify the Unix call thunk. - xtajit64: Add stub dll. - ntdll: Load xtajit64.dll on ARM64EC. - ntdll/tests: Add some tests for xtajit64. - ntdll: Create the cross-process work list at startup on ARM64EC. - ntdll: Support the ARM64EC work list in RtlOpenCrossProcessEmulatorWorkConnection. - ntdll: Call the processor information callback on ARM64EC. - ntdll: Load the processor features from the emulator on ARM64EC. - ntdll: Call the flush instruction cache callback on ARM64EC. - ntdll: Call the memory allocation callbacks on ARM64EC. - ntdll: Call the section map callbacks on ARM64EC. - ntdll: Call the read file callback on ARM64EC. - ntdll: Implement ProcessPendingCrossProcessEmulatorWork on ARM64EC. - wininet/tests: Update issuer check for winehq.org certificate. - wow64: Fix prototype for the NtTerminateThread CPU backend notification. - wow64: Add NtTerminateProcess CPU backend notifications. - ntdll: Call the terminate thread callback on ARM64EC. - ntdll: Call the terminate process callback on ARM64EC. - -Alexandros Frantzis (4): - opengl32: Add default implementation for wglChoosePixelFormatARB. - winex11: Remove driver wglChoosePixelFormatARB implementation. - winewayland: Support WGL_ARB_pixel_format. - winewayland: Support WGL_ARB_pixel_format_float. +Aida Jonikienė (1): + ntdll: Fix params_mask type in NtRaiseHardError(). + +Alex Henrie (6): + ntdll: Fix multi-string callbacks in RtlQueryRegistryValues. + ntdll: Double-null-terminate multi-strings when using RTL_QUERY_REGISTRY_DIRECT. + ntdll: Fix handling of non-string types with RTL_QUERY_REGISTRY_DIRECT. + ntdll: Don't write partial strings with RTL_QUERY_REGISTRY_DIRECT. + ntdll: Fix type and size of expanded strings in RtlQueryRegistryValues. + ntdll: Don't special-case default values in RtlQueryRegistryValues. + +Alexandre Julliard (28): + ntdll/tests: Add test for cross-process notifications on ARM64EC. + kernel32/tests: Add some tests for WriteProcessMemory/NtWriteVirtualMemory. + kernelbase: Make memory writable in WriteProcessMemory if necessary. + kernelbase: Send cross process notifications in WriteProcessMemory on ARM64. + kernelbase: Send cross process notifications in FlushInstructionCache on ARM64. + kernelbase: Don't use WRITECOPY protection on anonymous mappings. + ntdll: Add helper macros to define syscalls on ARM64EC. + ntdll: Send cross-process notification in memory functions on ARM64EC. + ntdll: Fix the fake 32-bit %cs value on ARM64EC. + ntdll: Don't set the TEB ExceptionList to -1 on 64-bit. + ntdll: Simplify preloader execution using HAVE_WINE_PRELOADER. + ntdll: Export a proper function for RtlGetNativeSystemInformation. + ntdll: Move RtlIsProcessorFeaturePresent implementation to the CPU backends. + ntdll: Move the IP string conversion functions to rtlstr.c. + makedep: Add a helper to get a root-relative directory path. + makefiles: Hardcode the fonts directory. + makefiles: Hardcode the nls directory. + makefiles: Hardcode the dll directory. + makefiles: Generate rules to build makedep. + tools: Add helper functions to get the standard directories. + ntdll: Build relative paths at run-time instead of depending on makedep. + loader: Build relative paths at run-time instead of depending on makedep. + server: Build relative paths at run-time instead of depending on makedep. + makefiles: No longer ignore makedep.c. + configure: Disable non-PE import libraries if compiler support is missing. + makedep: Remove the -R option. + makedep: Generate rules for make depend. + makedep: Generate a compile_commands.json file. + +Alexandros Frantzis (5): + opengl32: Add default implementation for wglGetPixelFormatAttribivARB. + opengl32: Add default implementation for wglGetPixelFormatAttribfvARB. + winex11: Update describe_pixel_format coding style. + winex11: Pass wgl_pixel_format to describe_pixel_format. + winex11: Use default wglGetPixelFormatAttribivARB implementation.
Alfred Agrell (10): - include: Fix typo in DXGI_DEBUG_APP. - include: Fix typo in IID_IDWriteStringList. - include: Fix typo in IID_IAudioLoudness. - include: Fix typo in GUID_DEVCLASS_1394DEBUG. - include: Fix typo in IID_IRemoteDebugApplication. - include: Fix typos in MF_MT_VIDEO_3D and MF_MT_AUDIO_FOLDDOWN_MATRIX. - include: Fix typos in IID_IMimeWebDocument and IID_IMimeMessageCallback. - include: Fix typos in IID_IPropertyEnumType2 and CLSID_PropertySystem. - include: Fix typo in MEDIASUBTYPE_P408. - include: Fix typo in CLSID_WICXMPMetadataReader. - -Austin English (2): - netapi32: Add NetGetAadJoinInformation stub. - ntoskrnl.exe: Add a stub for KeQueryGroupAffinity. - -Biswapriyo Nath (5): - include: Add flags for ID3D11ShaderReflection::GetRequiresFlags method in d3d11shader.h. - include: Add macros for d3d12 shader version in d3d12shader.idl. - include: Add new names in D3D_NAME enum in d3dcommon.idl. - include: Fix typo with XINPUT_DEVSUBTYPE_FLIGHT_STICK name in xinput.h. - include: Fix typo with X3DAUDIO_EMITTER structure in x3daudio.h. + quartz: Implement AMT/WMT differences for WMV media type. + winegstreamer: Implement AM_MEDIA_TYPE to wg_format converter for Cinepak video. + winegstreamer: Make AVI splitter use end of previous frame if the current frame doesn't have a timestamp. + quartz/tests: Add Cinepak test to avi splitter. + iccvid: Reject unsupported output types. + msvfw32/tests: Test that Cinepak rejects unsupported output types. + quartz: Allow concurrent calls to AVI decoder qc_Notify and Receive. + quartz/tests: Test that avi_decompressor_source_qc_Notify does not deadlock if called from a foreign thread during IMemInput_Receive. + winegstreamer: Recalculate alignment and bytes per second, instead of copying from input. + mf/tests: Clobber the alignment and bytes per second, to test if the DMO fixes it. + +Alistair Leslie-Hughes (11): + oledb32: Support multiple values when parsing the property Mode. + oledb32: When creating a Data Source, handle non fatal errors. + msado15: Use the correct version when loading the typelib. + odbccp32: Look at the Setup key to find the driver of ODBC config functions. + odbccp32: SQLConfigDataSource/W fix crash with passed NULL attribute parameter. + msado15: Implement _Recordset get/put CacheSize. + msado15: Implement _Recordset get/put MaxRecords. + msado15: Support interface ADOCommandConstruction in _Command. + msado15: Implement _Command::get_Parameters. + msado15: Implement Parameters interface. + msado15: Implement _Command::CreateParameter. + +Arkadiusz Hiler (2): + bcp47langs: Add stub dll. + apisetschema: Add api-ms-win-appmodel-runtime-internal-l1-1-1. + +Aurimas Fišeras (3): + po: Update Lithuanian translation. + po: Update Lithuanian translation. + po: Update Lithuanian translation. + +Biswapriyo Nath (6): + include: Add Windows.Graphics.Capture.IGraphicsCaptureSession2 definition. + include: Add Windows.Graphics.Capture.IGraphicsCaptureSession3 definition. + include: Add windows.graphics.idl file. + include: Add Windows.Graphics.Capture.GraphicsCaptureItem runtimeclass. + include: Add Windows.Graphics.Capture.Direct3D11CaptureFrame runtimeclass. + include: Add Windows.Graphics.Capture.Direct3D11CaptureFramePool runtimeclass.
Brendan McGrath (3): - winegstreamer: Use process affinity to calculate thread_count. - winegstreamer: Use thread_count to determine 'max-threads' value. - winegstreamer: Set 'max_threads' to 4 for 32-bit processors. - -Connor McAdams (14): - d3dx9/tests: Move the images used across multiple test files into a shared header. - d3dx9/tests: Add more D3DXLoadVolumeFromFileInMemory() tests. - d3dx9: Use shared code in D3DXLoadVolumeFromFileInMemory(). - d3dx9/tests: Add more tests for D3DXCreateVolumeTextureFromFileInMemoryEx(). - d3dx9: Refactor texture creation and cleanup in D3DXCreateVolumeTextureFromFileInMemoryEx(). - d3dx9: Cleanup texture value argument handling in D3DXCreateVolumeTextureFromFileInMemoryEx(). - d3dx9: Use d3dx_image structure inside of D3DXCreateVolumeTextureFromFileInMemoryEx(). - d3dx9: Add support for mipmap generation to D3DXCreateVolumeTextureFromFileInMemoryEx(). - d3dx9/tests: Add tests for DDS skip mip level bits. - d3dx9: Apply the DDS skip mip level bitmask. - d3dx9/tests: Add more DDS header tests for volume texture files. - d3dx9: Check the proper flag for DDS files representing a volume texture. - d3dx9/tests: Add more DDS header tests for cube texture files. - d3dx9: Return failure if a cubemap DDS file does not contain all faces. - -Dmitry Timoshkov (3): - msv1_0: Add support for SECPKG_CRED_BOTH. - kerberos: Add support for SECPKG_CRED_BOTH. - crypt32: Make CertFindCertificateInStore(CERT_FIND_ISSUER_NAME) work. - -Elizabeth Figura (19): - d3dcompiler/tests: Use the correct interfaces for some COM calls. - mfplat/tests: Use the correct interfaces for some COM calls. - d3dx9: Use the correct interfaces for some COM calls. - d3dx9/tests: Define COBJMACROS. - mfplat/tests: Add more tests for compressed formats. - winegstreamer: Check the version before calling wg_format_from_caps_video_mpeg1(). - winegstreamer: Implement MPEG-4 audio to wg_format conversion. - winegstreamer: Implement H.264 to wg_format conversion. - winegstreamer: Implement H.264 to IMFMediaType conversion. - winegstreamer: Implement AAC to IMFMediaType conversion. - winegstreamer: Implement WMV to IMFMediaType conversion. - winegstreamer: Implement WMA to IMFMediaType conversion. - winegstreamer: Implement MPEG-1 audio to IMFMediaType conversion. - wined3d: Invalidate the FFP VS when diffuse presence changes. - wined3d: Destroy the push constant buffers on device reset. - wined3d: Feed the fragment part of WINED3D_RS_SPECULARENABLE through a push constant buffer. - wined3d: Feed the FFP color key through a push constant buffer. - wined3d: Reorder light application in wined3d_device_apply_stateblock(). - wined3d: Feed WINED3D_RS_AMBIENT through a push constant buffer. - -Eric Pouech (49): - cmd: Add success/failure tests for file related commands. - cmd: Set success/failure return code for TYPE command. - cmd: Set success/failure return code DELETE command. - cmd: Set success/failure return code for MOVE command. - cmd: Set success/failure return code for RENAME command. - cmd: Set success/failure return code for COPY command. - cmd: Add success/failure tests for dir related commands. - cmd: Add success/failure return code for MKDIR/MD commands. - cmd: Set success/failure return code for CD command. - cmd: Set success/failure return code for DIR command. - cmd: Set success/failure return code for PUSHD command. - cmd: Add some more tests for success/failure. - cmd: Return tri-state for WCMD_ReadParseLine(). - cmd: Improve return code / errorlevel handling. - cmd: Set success/failure return_code for POPD command. - cmd: Set success/failure return code for RMDIR/RD command. - cmd: Don't set ERRORLEVEL in case of redirection error. - cmd/tests: Test success / failure for more commands. - cmd: Set success/failure return code for SETLOCAL/ENDLOCAL commands. - cmd: Set success/failure return code for DATE/TIME commands. - cmd: Set success/failure return code for VER command. - cmd: Set success/failure return code for VERIFY command. - cmd: Set success/failure return code for VOL command. - cmd: Set success/failure return code for LABEL command. - cmd/tests: Add more tests for success/failure. - cmd: Set success/failure return code of PATH command. - cmd: Set success/failure return code for SET command. - cmd: Set success/failure return code for ASSOC,FTYPE commands. - cmd: Set success/failure return code for SHIFT command. - cmd: Set success/failure return code for HELP commands. - cmd: Set success/failure return_code for PROMPT command. - cmd: Add tests for screen/interactive builtin commands. - cmd: Set success/failure return code for CLS command. - cmd: Set success/failure return code for COLOR command. - cmd: Set success/failure return code for TITLE command. - cmd: Use the correct output handle in pipe command. - cmd: Set success/failure return code for CHOICE command. - cmd: Set success/failure return code for MORE command. - cmd: Set success/failure return code for PAUSE command. - cmd: Get rid of CTTY command. - cmd: Add more tests for return codes in builtin commands. - cmd: Set success/failure return code for MKLINK command. - cmd: Set success/failure return code for START command. - cmd: Move empty batch command handling to WCMD_batch() callers. - cmd: Improve return code/errorlevel support for external commands. - cmd: Cleanup transition bits. - cmd: Get rid for CMD_COMMAND structure. - cmd: When parsing, dispose created objects on error path. - cmd: Fix a couple of issues with redirections. - -Fabian Maurer (6): - cmd: Close file opened with popen with correct function (coverity). - mlang/tests: Add test for GetGlobalFontLinkObject allowing IID_IMultiLanguage2. - mlang/tests: Add tests showing which interface is returned by GetGlobalFontLinkObject. - mlang: Return the correct interface in GetGlobalFontLinkObject. - d3dx9: Remove superflous nullcheck (coverity). - msv1_0: Set mode in ntlm_check_version. - -Hans Leidekker (25): - msi: Avoid infinite recursion while processing the DrLocator table. - odbc32: Turn SQLBindParam() into a stub. - odbc32: Replicate Unix data sources to the ODBC Data Sources key. - odbc32: Reimplement SQLDrivers() using registry functions. - odbc32: Reimplement SQLDataSources() using registry functions. - odbc32: Introduce a Windows driver loader and forward a couple of functions. - odbc32: Forward more functions to the Windows driver. - odbc32: Forward yet more functions to the Windows driver. - odbc32: Forward the remaining functions to the Windows driver. - odbc32/tests: Add tests. - msi: Handle failure from MSI_RecordGetInteger(). - msi: Load DrLocator table in ITERATE_AppSearch(). - winhttp: Implement WinHttpQueryOption(WINHTTP_OPTION_URL). - odbc32: Implement SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION). - odbc32: Implement SQLGet/SetConnectAttr(SQL_ATTR_LOGIN_TIMEOUT). - odbc32: Implement SQLGet/SetConnectAttr(SQL_ATTR_CONNECTION_TIMEOUT). - odbc32: Stub SQLGetEnvAttr(SQL_ATTR_CONNECTION_POOLING). - odbc32: Handle options in SQLFreeStmt(). - odbc32: Default to ODBC version 2. - odbc32: Implement SQLGetInfo(SQL_ODBC_VER). - odbc32: Factor out helpers to create driver environment and connection handles. - odbc32: Accept SQL_FETCH_NEXT in SQLDataSources/Drivers() if the key has not been opened. - odbc32: Set parent functions before creating the environment handle. - odbc32: Use SQLFreeHandle() instead of SQLFreeEnv/Connect(). - odbc32: Use SQLSetConnectAttrW() instead of SQLSetConnectAttr() if possible. - -Ilia Docin (1): - comctl32/rebar: Hide chevron if rebar's band is resized back to full size with gripper. - -Jacek Caban (38): - jscript: Factor out find_external_prop. - jscript: Rename PROP_IDX to PROP_EXTERN. - jscript: Introduce lookup_prop callback. - jscript: Factor out lookup_dispex_prop. - jscript: Introduce next_property callback. - jscript: Factor out handle_dispatch_exception. + mf/tests: Add additional tests for MESessionClosed event. + mf: Handle MediaSession Close when state is SESSION_STATE_RESTARTING_SOURCES. + mf: Handle an error during Media Session Close. + +Brendan Shanks (9): + dbghelp: Add ARM/ARM64 machine types for Mach-O. + ntdll: Make __wine_syscall_dispatcher_return a separate function to fix Xcode 16 build errors. + configure: Don't build wineloader on macOS with '-pie'. + configure: Remove warning when not using preloader on macOS. + configure: Rename wine_can_build_preloader to wine_use_preloader, and also use it for Linux. + configure: Define HAVE_WINE_PRELOADER when the preloader is being built. + loader: Use zerofill sections instead of preloader on macOS when building with Xcode 15.3. + winemac.drv: Fix warning in [WineWindow grabDockIconSnapshotFromWindow:force:]. + winemac.drv: Fix warning in [WineContentView viewWillDraw]. + +Connor McAdams (8): + d3dx9/tests: Add tests for the source info argument of D3DXCreateTextureFromFileInMemoryEx(). + d3dx9/tests: Add more tests for loading files with multiple mip levels into textures. + d3dx9: Refactor texture creation and cleanup in D3DXCreateTextureFromFileInMemoryEx(). + d3dx9: Use d3dx_image structure inside of D3DXCreateTextureFromFileInMemoryEx(). + d3dx9: Use struct volume inside of struct d3dx_image for storing dimensions. + d3dx9: Add support for specifying a starting mip level when initializing a d3dx_image structure. + d3dx9: Cleanup texture value argument handling in D3DXCreateTextureFromFileInMemoryEx(). + d3dx9: Add support for specifying which mip level to get pixel data from to d3dx_image_get_pixels(). + +Daniel Lehman (3): + odbc32: Handle both directions for SQLBindParameter(). + odbc32: Numeric attribute pointer may be null if not a numeric type in SQLColAttribute(). + odbc32: StrLen_or_Ind passed to SQLBindCol can be NULL. + +Danyil Blyschak (1): + gdi32/uniscribe: Ensure the cache is initialised. + +Davide Beatrici (7): + mmdevapi: Set the default period to a minimum of 10 ms. + winepulse: Don't set a floor for the period(s). + mmdevapi: Return errors early in adjust_timing(). + mmdevapi: Introduce helper stream_init(). + mmdevapi: Complete IAudioClient3_InitializeSharedAudioStream. + mmdevapi: Complete IAudioClient3_GetSharedModeEnginePeriod. + mmdevapi: Implement IAudioClient3_GetCurrentSharedModeEnginePeriod. + +Elizabeth Figura (41): + server: Check for an existing serial wait ioctl within the ioctl handler. + server: Directly wake up wait asyncs when the serial mask changes. + ntdll/tests: Use NtReadFile to test WoW64 IOSB handling. + ntdll/tests: Test IOSB handling for a synchronous write which cannot be satisfied immediately. + ntdll/tests: Test IOSB handling with NtFlushBuffersFile. + maintainers: Remove myself as a winegstreamer maintainer. + ntdll: Remove the redundant filling of the IOSB in NtDeviceIoControlFile(). + ntdll: Do not fill the IOSB or signal completion on failure in cdrom_DeviceIoControl(). + ntdll: Do not fill the IOSB or signal completion on failure in serial_DeviceIoControl(). + ntdll: Do not fill the IOSB or signal completion on failure in tape_DeviceIoControl(). + ntdll: Do not fill the IOSB in NtFsControlFile() on failure. + ntdll: Do not queue an IOCP packet in complete_async() if an APC routine is specified. + ntdll: Move complete_async() to file.c and use it in NtWriteFileGather(). + ntdll: Use file_complete_async() in tape_DeviceIoControl(). + ntdll: Use file_complete_async() in cdrom_DeviceIoControl(). + ntdll: Use file_complete_async() in serial_DeviceIoControl(). + ntdll: Use file_complete_async() in NtFsControlFile(). + quartz/tests: Handle the case where ddraw returns system memory. + ntdll: Do not set io->Status at the end of sock_ioctl(). + ntdll: Factor filling the IOSB into set_async_direct_result(). + ntdll: Move set_async_direct_result() to file.c. + widl: Do not allow "lu" as an integer suffix. + widl: Store the hexadecimal flag inside of the expr_t union. + widl: Use struct integer for the aNUM and aHEXNUM tokens. + widl: Respect u and l modifiers in expressions. + quartz/tests: Test IVMRWindowlessControl::GetNativeWindowSize() on the default presenter. + quartz: Implement IVMRWindowlessControl::GetNativeVideoSize(). + wined3d: Precompute direction and position in wined3d_light_state_set_light(). + wined3d: Pass the primary stateblock to wined3d_device_process_vertices(). + wined3d: Use the primary stateblock state in wined3d_device_process_vertices() where possible. + wined3d: Pass the constant update mask to wined3d_device_context_push_constants(). + wined3d: Feed WINED3D_TSS_CONSTANT through a push constant buffer. + wined3d: Feed WINED3D_RS_TEXTUREFACTOR through a push constant buffer. + ntdll: Introduce a sync_ioctl() helper. + ntdll: Handle WoW64 file handles in sync_ioctl(). + ntdll: Always fill the 32-bit iosb for overlapped handles, for server I/O. + ntdll: Always fill the 32-bit iosb for overlapped handles, in file_complete_async(). + ntdll: Always fill the 32-bit iosb for overlapped handles, in set_async_direct_result(). + ntdll: Always fill the 32-bit iosb for overlapped handles, for regular read/write. + wined3d: Recheck whether a query is active after wined3d_context_vk_get_command_buffer(). + wined3d: Implement wined3d_check_device_format_conversion(). + +Eric Pouech (36): + cmd: Add more tests about FOR loops. + cmd: Introduce helpers to handle FOR variables. + cmd: Introduce helpers to save and restore FOR loop contexts. + cmd: Enable '%0' through '%9' as valid FOR loop variables. + cmd: Introduce helpers to handle directory walk. + cmd: Split parsing from executing FOR loops for numbers (/L). + cmd: Fix delay expansion in FOR /L loops. + cmd: Split parsing from executing FOR loops for filesets (/F). + cmd: Fix delay expansion in FOR loop for filesets. + cmd: Split parsing from executing FOR loops for file walking. + cmd: Fix delayed expansion in FOR loop on file sets. + cmd: Remove old FOR loop related code. + cmd: Test input has been read before using it. + cmd: Introduce token-based syntax parser for building command nodes. + cmd: Use kernel32's error codes instead of literals. + cmd: Introduce return code to indicate abort of current instruction. + cmd/tests: Add tests for delayed substitution in IF command. + cmd: Expand delayed variables in IF operands. + cmd: Factorize code for reading a new line for parser. + cmd: Remove unrelated parameter to WCMD_show_prompt. + cmd: Move prompt handling into line reading. + cmd: Fix a couple of issues wrt. variable expansion. + cmd: Move depth count inside builder. + cmd: Add more tests about CALL and variable expansion. + cmd: Fix a couple of expansions issues. + cmd: Let redirections be handled by node instead of command. + cmd: Move code around to avoid forward declaration. + cmd: Let token errors be tranlatable. + cmd: Migrate IF/FOR instructions inside CMD_NODE. + cmd: Support help for IF and FOR commands. + cmd: Return sub-block return code for IF and FOR. + cmd: Use precedence in command chaining. + cmd: Add success/failure return code tests for CALL command. + cmd: Set success/failure return code for ECHO command. + cmd: Set success/failure return code for CALL command. + cmd: Implement semantic for chaining in ||, | and && operators. + +Esme Povirk (2): + user32/tests: Fix spurious "Failed sequence" reports on Windows. + mscoree: Update Wine Mono to 9.2.0. + +Fabian Maurer (1): + wow64: In wow64_NtSetInformationToken forward TokenIntegrityLevel. + +Giovanni Mascellani (6): + wined3d: Compile the clear compute shaders at runtime. + d3d11/tests: Check the result of compiling HLSL shaders. + d3d11/tests: Check for NV12 texture support before testing them. + d3d11/tests: Do not check pitches. + d3d11/tests: Test NV12 textures without render target. + d3d11/tests: Test UpdateSubresource() for NV12 textures. + +Hans Leidekker (2): + odbc32: Rebind parameters when the result length array is resized. + wpcap: Handle different layout of the native packet header structure on 32-bit. + +Ilia Docin (2): + sane.ds: Add SANE option settable flag support. + sane.ds: Improve color mode and paper source detection. + +Jacek Caban (12): + mshtml: Introduce IWineJSDispatchHost interface. + mshtml: Rename builtin function helpers. + mshtml: Add support for using call on builtin function objects. + mshtml: Add support for using apply on builtin function objects. + jscript: Fix PROP_DELETED handling in delete_prop. + jscript: Use designated initializers for builtin_info_t. jscript: Use to_disp in a few more places. - mshtml: Factor out dispex_prop_put. - mshtml: Factor out dispex_prop_get. - mshtml: Factor out dispex_prop_call. - jscript: Allow objects to have their own addref and release implementation. - jscript: Introduce IWineJSDispatch insterface. - mshtml: Allow external properties to have arbitrary names. - jscript: Introduce HostObject implementation. - jscript: Support converting host objects to string. - jscript: Support host objects in disp_cmp. - jscript: Use jsdisp_t internally for host objects that support it. - mshtml: Implement jscript IWineJSDispatchHost. - mshtml: Pass an optional script global window to init_dispatch. - mshtml: Support using IWineJSDispatch for DispatchEx implementation. - mshtml: Use IWineJSDispatch for screen object script bindings. - jscript: Factor out native_function_string. - jscript: Add support for host functions. - mshtml/tests: Make todo_wine explicit in builtin_toString tests. - mshtml: Use host object script bindings for DOMImplementation class. - mshtml: Use host object script bindings for History class. - mshtml: Use host object script bindings for PerformanceNavigation class. - mshtml: Use host object script bindings for PerformanceTiming class. - mshtml: Use host object script bindings for Performance class. - mshtml: Store document node instead of GeckoBrowser in DOMImplementation. - mshtml/tests: Add script context test. - mshtml: Store script global object pointer in document object. - mshtml: Use host object script bindings for MediaQueryList class. - mshtml: Use host object script bindings for Navigator class. - mshtml: Use host object script bindings for Selection class. - mshtml: Use host object script bindings for TextRange class. - mshtml: Use host object script bindings for Range class. - mshtml: Use host object script bindings for Console class. - -Marc-Aurel Zent (4): - ntdll: Prefer futex for thread-ID alerts over kqueue. - ntdll: Use USE_FUTEX to indicate futex support. - ntdll: Simplify futex interface from futex_wake() to futex_wake_one(). - ntdll: Implement futex_wait() and futex_wake_one() on macOS. - -Matthias Gorzellik (2): - winebus.sys: Fix rotation for angles < 90deg. - winebus.sys: Align logical max of angles to physical max defined in dinput. - -Mohamad Al-Jaf (7): - include: Add windows.data.json.idl file. - windows.web: Add stub DLL. - windows.web: Implement IActivationFactory::ActivateInstance(). - include: Add IJsonValueStatics interface definition. - windows.web: Add IJsonValueStatics stub interface. - windows.web/tests: Add IJsonValueStatics::CreateStringValue() tests. - windows.web: Implement IJsonValueStatics::CreateStringValue(). - -Nikolay Sivov (2): - winhttp/tests: Add some tests for querying string options with NULL buffer. - winhttp: Fix error handling when returning string options. - -Paul Gofman (14): - ntdll: Report the space completely outside of reserved areas as allocated on i386. - psapi/tests: Add tests for QueryWorkingSetEx() with multiple addresses. - ntdll: Validate length in get_working_set_ex(). - ntdll: Factor OS-specific parts out of get_working_set_ex(). - ntdll: Iterate views instead of requested addresses in get_working_set_ex(). - ntdll: Limit vprot scan range to the needed interval in get_working_set_ex(). - ntdll: Fill range of output in fill_working_set_info(). - ntdll: Buffer pagemap reads in fill_working_set_info(). - winhttp/tests: Add test for trailing spaces in reply header. - winhttp: Construct raw header from the parse result in read_reply(). - winhttp: Skip trailing spaces in reply header names. - win32u: Use FT_LOAD_PEDANTIC on first load try in freetype_get_glyph_outline(). - ntdll: Better track thread pool wait's wait_pending state. - ntdll: Make sure wakeups from already unset events are ignored in waitqueue_thread_proc(). - -Piotr Caban (9): - ucrtbase: Store exception record in ExceptionInformation[6] during unwinding. - xcopy: Exit after displaying help message. - xcopy: Exit on invalid command line argument. - xcopy: Strip quotes only from source and destination arguments. - xcopy: Introduce get_arg helper that duplicates first argument to new string. - xcopy: Handle switch options concatenated with path. - xcopy: Add support for parsing concatenated switches. - kernel32/tests: Fix CompareStringW test crash when linguistic compressions are used. - ucrtbase: Fix FILE no buffering flag value. - -Rémi Bernon (60): - server: Move thread message queue masks to the shared mapping. - win32u: Read the thread message queue masks from the shared memory. - server: Move thread message queue bits to the shared mapping. - win32u: Use the thread message queue shared memory in get_input_state. - win32u: Use the thread message queue shared memory in NtUserGetQueueStatus. - win32u: Use the thread message queue shared memory in wait_message_reply. - mf/session: Don't update transform output type if not needed. - mf/session: Implement D3D device manager propagation. - winegstreamer: Translate GstCaps directly to MFVIDEOFORMAT / WAVEFORMATEX in wg_transform. - winegstreamer: Translate MFVIDEOFORMAT / WAVEFORMATEX directly to GstCaps in wg_transform. - winegstreamer: Create transforms from MFVIDEOFORMAT / WAVEFORMATEX. - winegstreamer: Only use pool and set buffer meta for raw video frames. - winegstreamer: Use a new wg_video_buffer_pool class to add buffer meta. - winegstreamer: Keep the input caps on the transform. - winegstreamer: Use video info stride in buffer meta rather than videoflip. - winegstreamer: Normalize both input and output media types stride at once. - winegstreamer: Normalize video processor and color converter apertures. - winegstreamer: Respect video format padding for input buffers too. - server: Move the desktop flags to the shared memory. - win32u: Use the shared memory to read the desktop flags. - server: Create a thread input shared mapping. - server: Move active window to input shared memory. - server: Move focus window to input shared memory. - server: Move capture window to input shared memory. - server: Move caret window and rect to input shared memory. - win32u: Use input shared memory for NtUserGetGUIThreadInfo. - win32u: Move offscreen window surface creation fallback. - win32u: Split a new create_window_surface helper from apply_window_pos. - win32u: Pass the window surface rect for CreateLayeredWindow. - win32u: Pass whether window is shaped to drivers WindowPosChanging. - win32u: Introduce a new window surface helper to set window shape. - win32u: Use a 1bpp bitmap to store the window surface shape bits. - win32u: Update the window surface shape with color key and alpha. - win32u: Pass the shape bitmap info and bits to window_surface flush. - mfreadwrite/reader: Look for a matching output type if setting it failed. - winex11: Reset window shape whenever window surface is created. - mf/tests: Remove static specifier on variables referencing other variables. - win32u: Allocate heap in peek_message only when necessary. - win32u: Use the thread message queue shared memory in peek_message. - win32u: Simplify the logic for driver messages polling. - ddraw/tests: Make sure the window is restored after some minimize tests. - ddraw/tests: Flush messages and X11 events between some tests. - server: Add a foreground flag to the thread input shared memory. - server: Add cursor handle and count to desktop shared memory. - win32u: Use the thread input shared memory for NtUserGetForegroundWindow. - win32u: Use the thread input shared memory for NtUserGetCursorInfo. - win32u: Use the thread input shared memory for NtUserGetGUIThreadInfo. - server: Use a shared_object_t for the dummy object. - win32u: Check the surface layered nature when reusing window surface. - win32u: Update the window state when WS_EX_LAYERED window style changes. - win32u: Update the layered surface attributes in apply_window_pos. - winex11: Rely on win32u layered window surface attribute updates. - wineandroid: Rely on win32u layered window surface attribute updates. - winemac: Rely on win32u layered window surface attribute updates. - winegstreamer/video_decoder: Generate timestamps relative to the first input sample. - mfreadwrite/reader: Send MFT_MESSAGE_NOTIFY_START_OF_STREAM on start or seek. - mf/tests: Reduce the mute threshold for the transform tests. - win32u: Fix initial value when checking whether WS_EX_LAYERED changes. - win32u: Use the dummy surface for empty layered window surfaces. - maintainers: Remove MF GStreamer section. - -Shaun Ren (1): - dinput: Call handle_foreground_lost() synchronously in cbt_hook_proc(). - -Stefan Dösinger (1): - ddraw: Set dwMaxVertexCount to 2048. - -Zhiyi Zhang (1): - winemac.drv: Remove the clear OpenGL views to black hack. - -Ziqing Hui (18): - winegstreamer/video_encoder: Implement GetInputAvailableType. - winegstreamer/video_encoder: Implement SetInputType. - winegstreamer/video_encoder: Implement GetInputCurrentType. + jscript: Introduce to_jsdispex. + jscript: Consistently use jsdisp_addref and jsdisp_release. + jscript: Use default destructor for array objects. + jscript: Use default destructor for Object instances. + jscript: Always free jsdisp_t in jsdisp_free. + +Marc-Aurel Zent (7): + winemac.drv: Handle length of dead keycodes in ToUnicodeEx correctly. + winemac.drv: Do not append " dead" to dead keycodes in GetKeyNameText. + winemac.drv: Uppercase single keys in GetKeyNameText. + winemac.drv: Use UCCompareText in char_matches_string. + winemac.drv: Resolve symbol vkeys first without modifiers. + winemac.drv: Add additional German symbol vkeys. + winemac.drv: Give dead keys a friendly name in GetKeyNameText. + +Paul Gofman (8): + mmdevapi: Store device_name as a pointer in struct audio_client. + mmdevapi: Adjust timing after main loop start in client_Initialize(). + mmdevapi: Stub AUDCLNT_STREAMFLAGS_LOOPBACK support. + winepulse.drv: Factor out wait_pa_operation_complete(). + winepulse.drv: Implement pulse_get_loopback_capture_device(). + mmdevapi/tests: Add test for capturing render loopback. + ddraw/tests: Add tests for preserving d3d state during primary surface creation. + ddraw: Preserve d3d device state in ddraw_surface_create(). + +Piotr Caban (3): + kernelbase: Add GetFileMUIInfo implementation. + kernel32/tests: Add GetFileMUIInfo tests. + kernel32/tests: Test GetFileMUIInfo on language resource file. + +Rémi Bernon (59): + winewayland: Avoid crashing when the dummy window surface is used. + win32u: Avoid setting the SWP_NOSIZE flag on the initial WM_DISPLAYCHANGE. + win32u: Fix a deadlock when locking the same surface on different DCs. + dwrite/tests: Ignore macOS specific "flip" sbix format. + kernel32/tests: Break debugger loop on unexpected result. + win32u: Use the vulkan functions directly from d3dkmt. + winex11: Don't use the vulkan driver interface for xrandr. + server: Create a global session shared mapping. + include: Add ReadNoFence64 inline helpers. + server: Allocate shared session object for desktops. + server: Return the desktop object locator in (get|set)_thread_desktop. + win32u: Open the desktop shared object in NtUserSetThreadDesktop. + server: Move the cursor position to the desktop session object. + server: Move the last cursor time to the desktop session object. + win32u: Use the desktop shared data for GetCursorPos. + win32u: Remove now unused vulkan_funcs in d3dkmt.c. + winex11: Create a global vulkan instance for xrandr. + include: Add a couple of CRT function declarations. + include: Define frexpf as inline function in more cases. + server: Mark block as writable in mark_block_uninitialized. + server: Store the cursor clip rect in the shared data. + server: Get rid of the global cursor structure. + win32u: Use the shared memory for get_clip_cursor. + server: Use a separate variable to determine the message on Alt release. + server: Use separate functions to update the desktop and input keystates. + server: Move the desktop keystate to shared memory. + win32u: Use the shared data if possible for NtUserGetAsyncKeyState. + winex11: Move window surface creation functions to bitblt.c. + winemac: Move window surface creation functions to surface.c. + winewayland: Move window surface creation functions to window_surface.c. + winemac: Remove unused macdrv_get_surface_display_image copy_data parameter. + winemac: Create a provider for the surface and a HBITMAP wrapping it. + winemac: Create window surface CGImageRef on surface flush. + winemac: Push window surface image updates to the main thread. + winemac: Remove now unnecessary cocoa window surface pointer. + winemac: Remove unnecessary surface_clip_to_visible_rect. + server: Create a thread message queue shared mapping. + server: Keep a reference on the desktop the hook are registered for. + server: Move hooks struct initialization within add_hook. + server: Update the active hooks bitmaps when hooks are added / removed. + win32u: Read the active hooks count from the shared memory. + win32u: Remove now unnecessary thread info active_hooks cache. + server: Remove now unnecessary active_hooks from replies. + winex11: Only clip huge surfaces to the virtual screen rect. + wineandroid: Only clip huge surfaces to the virtual screen rect. + winemac: Clip huge surfaces to the virtual screen rect. + winewayland: Clip huge window surfaces to the virtual screen rect. + win32u: Move the surface rect computation out of the drivers. + win32u: Use the previous surface as default surface when compatible. + win32u: Use the default window surface when window is not visible. + win32u: Move layered surface attributes to the window_surface struct. + win32u: Introduce a new helper to update layered window surface attributes. + win32u: Pass BITMAPINFO and color bits to window surface flush. + win32u: Introduce a new helper to get surface color info and bits. + win32u: Get rid of the unnecessary offscreen window surface struct. + winemac: Remove now unnecessary driver surface BITMAPINFO. + wineandroid: Remove now unnecessary window surface BITMAPINFO. + winewayland: Remove now unnecessary window surface BITMAPINFO. + winex11: Remove now unnecessary window surface BITMAPINFO. + +Santino Mazza (3): + mshtml/tests: Test for IMarkupServices. + mshtml: Implement MarkupServices_CreateMarkupContainer. + mshtml: Implement MarkupServices_ParseString. + +Torge Matthies (4): + winegstreamer: Fix race between wg_parser_stream_en/disable and GST_EVENT_FLUSH_START/STOP. + winegstreamer: Don't only accept segment events when streams are enabled. + winegstreamer: Ignore an assert in wg_parser. + winegstreamer: Handle Gstreamer pipeline flushes gracefully in the media source. + +Vijay Kiran Kamuju (4): + ntdll: Fix RtlEnumerateGenericTableWithoutSplaying function parameters. + ntdll: Add stub RtlEnumerateGenericTableWithoutSplayingAvl function. + ntdll: Add stub RtlNumberGenericTableElementsAvl function. + wevtapi: Add stub EvtCreateRenderContext(). + +Zhiyi Zhang (9): + profapi: Add stub dll. + kernel32: Add AppPolicyGetWindowingModel(). + rometadata: Add initial dll. + include: Add some windows.foundation definitions. + include: Add some windows.system definitions. + include: Add windows.devices.input.idl. + include: Add windows.ui.input.idl. + include: Add some windows.ui.core definitions. + include: Add some windows.applicationmodel definitions. + +Ziqing Hui (8): + mf/tests: Add tests for H264 encoder types. + winegstreamer: Implement stubs for h264 encoder. + winegstreamer/aac_decoder: Support clearing media types. + winegstreamer/color_converter: Support clearing media types. mf/tests: Add more tests for h264 encoder type attributes. - winegstreamer/video_encoder: Introduce create_input_type. - winegstreamer/video_encoder: Check more attributes in SetInputType. - winegstreamer/video_encoder: Implement GetInputStreamInfo. - winegstreamer/video_encoder: Implement GetOutputStreamInfo. - winegstreamer/video_encoder: Rename create_input_type to video_encoder_create_input_type. - winegstreamer/video_encoder: Clear input type when setting output type. - winegstreamer/video_encoder: Create wg_transform. - winegstreamer/video_encoder: Implement ProcessInput. - winegstreamer/video_encoder: Implement ProcessMessage. - winegstreamer/video_encoder: Use MF_ATTRIBUTES_MATCH_INTERSECTION to compare input type. - winegstreamer/video_encoder: Set output info cbSize in SetOutputType. - winegstreamer/wg_transform: Introduce transform_create_decoder_elements. - winegstreamer/wg_transform: Introduce transform_create_converter_elements. - winegstreamer/wg_transform: Support creating encoder transform. + winegstreamer/video_encoder: Implement GetOutputAvailableType. + winegstreamer/video_encoder: Implement SetOutputType. + winegstreamer/video_encoder: Implement GetOutputCurrentType. ``` diff --git a/AUTHORS b/AUTHORS index e05dc43bace..efa29dacb6c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1203,7 +1203,6 @@ Matthew Robertson Matthew Tran Matthias Derer Matthias Fechner -Matthias Gorzellik Matthias Kupfer Matt Jones Matt Robinson diff --git a/MAINTAINERS b/MAINTAINERS index d913427f6a5..29fa77c0404 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -205,6 +205,23 @@ F: dlls/winexinput.sys/ F: dlls/winmm/joystick.c F: dlls/xinput*/
+Media Foundation GStreamer backend +M: Rémi Bernon rbernon@codeweavers.com +P: Nikolay Sivov nsivov@codeweavers.com +P: Elizabeth Figura zfigura@codeweavers.com +F: dlls/mf/tests/transform.c +F: dlls/winegstreamer/aac_decoder.c +F: dlls/winegstreamer/color_convert.c +F: dlls/winegstreamer/media_source.c +F: dlls/winegstreamer/mfplat.c +F: dlls/winegstreamer/resampler.c +F: dlls/winegstreamer/video_decoder.c +F: dlls/winegstreamer/video_processor.c +F: dlls/winegstreamer/wg_sample.c +F: dlls/winegstreamer/wg_transform.c +F: dlls/winegstreamer/wma_decoder.c +F: dlls/winegstreamer/wmv_decoder.c + Microsoft C Runtime M: Piotr Caban piotr@codeweavers.com F: dlls/concrt140/ diff --git a/VERSION b/VERSION index c5f02d202a6..5487ab03171 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Wine version 9.13 +Wine version 9.12 diff --git a/configure b/configure index 5ef0acd586e..ae15f4769cb 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.71 for Wine 9.13. +# Generated by GNU Autoconf 2.71 for Wine 9.12. # # Report bugs to wine-devel@winehq.org. # @@ -611,8 +611,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Wine' PACKAGE_TARNAME='wine' -PACKAGE_VERSION='9.13' -PACKAGE_STRING='Wine 9.13' +PACKAGE_VERSION='9.12' +PACKAGE_STRING='Wine 9.12' PACKAGE_BUGREPORT='wine-devel@winehq.org' PACKAGE_URL='https://www.winehq.org'
@@ -2404,7 +2404,7 @@ if test "$ac_init_help" = "long"; then # 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. cat <<_ACEOF -`configure' configures Wine 9.13 to adapt to many kinds of systems. +`configure' configures Wine 9.12 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -2474,7 +2474,7 @@ fi
if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Wine 9.13:";; + short | recursive ) echo "Configuration of Wine 9.12:";; esac cat <<_ACEOF
@@ -2780,7 +2780,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<_ACEOF -Wine configure 9.13 +Wine configure 9.12 generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc. @@ -3231,7 +3231,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake.
-It was created by Wine $as_me 9.13, which was +It was created by Wine $as_me 9.12, which was generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw @@ -23720,7 +23720,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by Wine $as_me 9.13, which was +This file was extended by Wine $as_me 9.12, which was generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES @@ -23784,7 +23784,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\ -Wine config.status 9.13 +Wine config.status 9.12 configured by $0, generated by GNU Autoconf 2.71, with options \"$ac_cs_config\"
diff --git a/dlls/comctl32/tests/Makefile.in b/dlls/comctl32/tests/Makefile.in index 0c96203a2f6..c9b0d5c578f 100644 --- a/dlls/comctl32/tests/Makefile.in +++ b/dlls/comctl32/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = comctl32.dll -IMPORTS = ole32 user32 gdi32 advapi32 imm32 uxtheme +IMPORTS = ole32 user32 gdi32 advapi32 imm32
SOURCES = \ animate.c \ diff --git a/dlls/comctl32/tests/misc.c b/dlls/comctl32/tests/misc.c index bb3f1993a83..ff6336f31af 100644 --- a/dlls/comctl32/tests/misc.c +++ b/dlls/comctl32/tests/misc.c @@ -21,7 +21,6 @@ #include <stdio.h> #include <windows.h> #include <commctrl.h> -#include <uxtheme.h>
#include "wine/test.h" #include "v6util.h" @@ -830,7 +829,6 @@ static void test_themed_background(void) HMODULE uxtheme; COLORREF color; WNDCLASSA cls; - HRESULT hr; HDC hdc; int i;
@@ -840,7 +838,6 @@ static void test_themed_background(void) DWORD style; const struct message *seq; BOOL todo; - const WCHAR *window_theme; } tests[] = { @@ -889,8 +886,6 @@ static void test_themed_background(void) {TOOLTIPS_CLASSA, 0, empty_seq}, {TRACKBAR_CLASSA, 0, wm_ctlcolorstatic_seq}, {WC_TREEVIEWA, 0, treeview_seq}, - {WC_TREEVIEWA, TVS_HASBUTTONS, treeview_seq}, - {WC_TREEVIEWA, TVS_HASBUTTONS, treeview_seq, FALSE, L"explorer"}, {UPDOWN_CLASSA, 0, empty_seq}, {WC_SCROLLBARA, 0, scrollbar_seq}, {WC_SCROLLBARA, SBS_SIZEBOX, empty_seq}, @@ -938,29 +933,12 @@ static void test_themed_background(void) child = CreateWindowA(tests[i].class_name, " ", WS_CHILD | WS_VISIBLE | tests[i].style, 0, 0, 50, 100, parent, 0, 0, 0); ok(child != NULL, "CreateWindowA failed, error %lu.\n", GetLastError()); - - /* Extra preparations */ - if (tests[i].window_theme) - { - hr = SetWindowTheme(child, tests[i].window_theme, NULL); - ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - } - flush_events(); flush_sequences(sequences, NUM_MSG_SEQUENCES);
RedrawWindow(child, NULL, NULL, RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW | RDW_ERASENOW | RDW_FRAME); ok_sequence(sequences, PARENT_SEQ_INDEX, tests[i].seq, "paint background", tests[i].todo);
- /* Extra background tests */ - if (!lstrcmpA(tests[i].class_name, WC_TREEVIEWA)) - { - hdc = GetDC(child); - color = GetPixel(hdc, 40, 40); - ok(color == 0xffffff, "Expected color %#x, got %#lx.\n", 0xffffff, color); - ReleaseDC(child, hdc); - } - /* For message sequences that contain both DrawThemeParentBackground() messages and * WM_CTLCOLOR*, do a color test to check which is really in effect for controls that can be * tested automatically. For WM_ERASEBKGND from DrawThemeParentBackground(), a red brush is diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index e2a4280f131..036afd15c69 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -2918,7 +2918,7 @@ TREEVIEW_Refresh(TREEVIEW_INFO *infoPtr, HDC hdc, const RECT *rc) if (infoPtr->dwStyle & TVS_HASBUTTONS && (theme = GetWindowTheme(infoPtr->hwnd))) { if (IsThemeBackgroundPartiallyTransparent(theme, TVP_GLYPH, 0)) - FillRect(hdc, &rect, (HBRUSH)(COLOR_WINDOW + 1)); + DrawThemeParentBackground(infoPtr->hwnd, hdc, NULL); }
for (item = infoPtr->root->firstChild; diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index 7b1edaa2236..373805e858f 100644 --- a/dlls/crypt32/cert.c +++ b/dlls/crypt32/cert.c @@ -1482,15 +1482,10 @@ static BOOL compare_cert_by_name(PCCERT_CONTEXT pCertContext, DWORD dwType, CERT_NAME_BLOB *blob = (CERT_NAME_BLOB *)pvPara, *toCompare; BOOL ret;
- if ((dwType & CERT_COMPARE_MASK) == CERT_INFO_SUBJECT_FLAG) + if (dwType & CERT_INFO_SUBJECT_FLAG) toCompare = &pCertContext->pCertInfo->Subject; - else if ((dwType & CERT_COMPARE_MASK) == CERT_INFO_ISSUER_FLAG) - toCompare = &pCertContext->pCertInfo->Issuer; else - { - ERR("dwType %08lx doesn't specify SUBJECT or ISSUER\n", dwType); - return FALSE; - } + toCompare = &pCertContext->pCertInfo->Issuer; ret = CertCompareCertificateName(pCertContext->dwCertEncodingType, toCompare, blob); return ret; @@ -1740,7 +1735,7 @@ static PCCERT_CONTEXT find_cert_by_issuer(HCERTSTORE store, DWORD dwType, } else found = cert_compare_certs_in_store(store, prev, - compare_cert_by_name, CERT_FIND_SUBJECT_NAME, + compare_cert_by_name, CERT_COMPARE_NAME | CERT_COMPARE_SUBJECT_CERT, dwFlags, &subject->pCertInfo->Issuer); return found; } @@ -1752,7 +1747,7 @@ static BOOL compare_cert_by_name_str(PCCERT_CONTEXT pCertContext, DWORD len; BOOL ret = FALSE;
- if ((dwType & CERT_COMPARE_MASK) == CERT_INFO_SUBJECT_FLAG) + if (dwType & CERT_INFO_SUBJECT_FLAG) name = &pCertContext->pCertInfo->Subject; else name = &pCertContext->pCertInfo->Issuer; diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index 10c06b17ba7..8261a3139c5 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -2174,19 +2174,6 @@ static void test_scene(void) hr = IDirect3DDevice8_EndScene(device); ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr);
- /* Calling Reset clears scene state. */ - hr = IDirect3DDevice8_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - reset_device(device, NULL); - hr = IDirect3DDevice8_EndScene(device); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - - hr = IDirect3DDevice8_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice8_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - /* StretchRect does not exit in Direct3D8, so no equivalent to the d3d9 stretchrect tests */
refcount = IDirect3DDevice8_Release(device); diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index b6a3e1f58ba..408dace48ad 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -1185,7 +1185,6 @@ static HRESULT d3d9_device_reset(struct d3d9_device *device, surface->parent_device = &device->IDirect3DDevice9Ex_iface; }
- device->in_scene = FALSE; device->device_state = D3D9_DEVICE_STATE_OK;
if (extended) @@ -1801,13 +1800,6 @@ static HRESULT WINAPI d3d9_device_UpdateSurface(IDirect3DDevice9Ex *iface, return D3DERR_INVALIDCALL; }
- if (src_desc.multisample_type != WINED3D_MULTISAMPLE_NONE || dst_desc.multisample_type != WINED3D_MULTISAMPLE_NONE) - { - wined3d_mutex_unlock(); - WARN("Cannot use UpdateSurface with multisampled surfaces.\n"); - return D3DERR_INVALIDCALL; - } - if (src_rect) wined3d_box_set(&src_box, src_rect->left, src_rect->top, src_rect->right, src_rect->bottom, 0, 1); else diff --git a/dlls/d3d9/tests/d3d9ex.c b/dlls/d3d9/tests/d3d9ex.c index e946b960055..8e7eec13566 100644 --- a/dlls/d3d9/tests/d3d9ex.c +++ b/dlls/d3d9/tests/d3d9ex.c @@ -5058,145 +5058,6 @@ static void test_desktop_window(void) IDirect3DDevice9Ex_Release(device); }
-static void test_scene(void) -{ - IDirect3DSurface9 *surface1, *surface2, *surface3; - IDirect3DSurface9 *backBuffer, *rt, *ds; - RECT rect = {0, 0, 128, 128}; - IDirect3DDevice9Ex *device; - IDirect3D9 *d3d; - ULONG refcount; - D3DCAPS9 caps; - HWND window; - HRESULT hr; - - window = create_window(); - if (!(device = create_device(window, NULL))) - { - skip("Failed to create a D3D device.\n"); - DestroyWindow(window); - return; - } - - hr = IDirect3DDevice9Ex_GetDirect3D(device, &d3d); - ok(SUCCEEDED(hr), "Failed to get Direct3D9, hr %#lx.\n", hr); - - /* Get the caps, they will be needed to tell if an operation is supposed to be valid */ - memset(&caps, 0, sizeof(caps)); - hr = IDirect3DDevice9Ex_GetDeviceCaps(device, &caps); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - /* Test an EndScene without BeginScene. Should return an error */ - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - - /* Test a normal BeginScene / EndScene pair, this should work */ - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - /* Test another EndScene without having begun a new scene. Should return an error */ - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - - /* Two nested BeginScene and EndScene calls */ - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - - /* Calling Reset does not clear scene state, different from d3d9. */ - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - reset_device(device, NULL); - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - /* Create some surfaces to test stretchrect between the scenes */ - hr = IDirect3DDevice9Ex_CreateOffscreenPlainSurface(device, 128, 128, - D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface1, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_CreateOffscreenPlainSurface(device, 128, 128, - D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface2, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_CreateDepthStencilSurface(device, 800, 600, - D3DFMT_D16, D3DMULTISAMPLE_NONE, 0, FALSE, &surface3, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_CreateRenderTarget(device, 128, 128, - D3DFMT_A8R8G8B8, D3DMULTISAMPLE_NONE, 0, FALSE, &rt, NULL); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IDirect3DDevice9Ex_GetBackBuffer(device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_GetDepthStencilSurface(device, &ds); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - /* First make sure a simple StretchRect call works */ - hr = IDirect3DDevice9Ex_StretchRect(device, surface1, NULL, surface2, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_StretchRect(device, backBuffer, &rect, rt, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - if (0) /* Disabled for now because it crashes in wine */ - { - HRESULT expected = caps.DevCaps2 & D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES ? D3D_OK : D3DERR_INVALIDCALL; - hr = IDirect3DDevice9Ex_StretchRect(device, ds, NULL, surface3, NULL, 0); - ok(hr == expected, "Got unexpected hr %#lx, expected %#lx.\n", hr, expected); - } - - /* Now try it in a BeginScene - EndScene pair. Seems to be allowed in a - * BeginScene - Endscene pair with normal surfaces and render targets, but - * not depth stencil surfaces. */ - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - hr = IDirect3DDevice9Ex_StretchRect(device, surface1, NULL, surface2, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_StretchRect(device, backBuffer, &rect, rt, NULL, 0); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - /* This is supposed to fail inside a BeginScene - EndScene pair. */ - hr = IDirect3DDevice9Ex_StretchRect(device, ds, NULL, surface3, NULL, 0); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - /* Does a SetRenderTarget influence BeginScene / EndScene ? - * Set a new render target, then see if it started a new scene. Flip the rt back and see if that maybe - * ended the scene. Expected result is that the scene is not affected by SetRenderTarget - */ - hr = IDirect3DDevice9Ex_SetRenderTarget(device, 0, rt); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_SetRenderTarget(device, 0, backBuffer); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9Ex_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - IDirect3DSurface9_Release(rt); - IDirect3DSurface9_Release(ds); - IDirect3DSurface9_Release(backBuffer); - IDirect3DSurface9_Release(surface1); - IDirect3DSurface9_Release(surface2); - IDirect3DSurface9_Release(surface3); - refcount = IDirect3DDevice9Ex_Release(device); - ok(!refcount, "Device has %lu references left.\n", refcount); - - IDirect3D9_Release(d3d); - DestroyWindow(window); -} - START_TEST(d3d9ex) { DEVMODEW current_mode; @@ -5257,7 +5118,6 @@ START_TEST(d3d9ex) test_sysmem_draw(); test_pinned_buffers(); test_desktop_window(); - test_scene();
UnregisterClassA("d3d9_test_wc", GetModuleHandleA(NULL)); } diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 62f308e0734..53dc9ee55ed 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -2718,19 +2718,6 @@ static void test_scene(void) hr = IDirect3DDevice9_EndScene(device); ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr);
- /* Calling Reset clears scene state. */ - hr = IDirect3DDevice9_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - - reset_device(device, NULL); - hr = IDirect3DDevice9_EndScene(device); - ok(hr == D3DERR_INVALIDCALL, "Got hr %#lx.\n", hr); - - hr = IDirect3DDevice9_BeginScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - hr = IDirect3DDevice9_EndScene(device); - ok(hr == S_OK, "Got hr %#lx.\n", hr); - /* Create some surfaces to test stretchrect between the scenes */ hr = IDirect3DDevice9_CreateOffscreenPlainSurface(device, 128, 128, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface1, NULL); diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index 3f3de411143..724d9ef1e39 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -4546,13 +4546,6 @@ static void test_multisample_stretch_rect(void) hr = IDirect3DDevice9_SetRenderTarget(device, 0, rt); ok(hr == D3D_OK, "Got unexpected hr %#lx.\n", hr);
- /* UpdateSurface does not support multisampled surfaces. */ - hr = IDirect3DDevice9_UpdateSurface(device, rt, NULL, ms_rt, NULL); - ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#lx.\n", hr); - - hr = IDirect3DDevice9_UpdateSurface(device, ms_rt, NULL, rt, NULL); - ok(hr == D3DERR_INVALIDCALL, "Got unexpected hr %#lx.\n", hr); - for (i = 0; i < ARRAY_SIZE(filters); ++i) { hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0f, 0); diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index 6250061296e..b14af240302 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -269,11 +269,10 @@ static void codeview_init_basic_types(struct module* module) cv_basic_types[T_PUINT8] = &symt_new_pointer(module, cv_basic_types[T_UINT8], ptrsz)->symt; }
-static int leaf_as_variant(VARIANT *v, const unsigned char *leaf) +static int leaf_as_variant(VARIANT* v, const unsigned short int* leaf) { - unsigned short int type = *(const unsigned short *)leaf; + unsigned short int type = *leaf++; int length = 2; - leaf += length;
if (type < LF_NUMERIC) { @@ -395,11 +394,10 @@ static int leaf_as_variant(VARIANT *v, const unsigned char *leaf) return length; }
-static int numeric_leaf(int *value, const unsigned char *leaf) +static int numeric_leaf(int* value, const unsigned short int* leaf) { - unsigned short int type = *(const unsigned short int *)leaf; + unsigned short int type = *leaf++; int length = 2; - leaf += length;
if (type < LF_NUMERIC) { @@ -724,31 +722,31 @@ static BOOL codeview_type_extract_name(const union codeview_type* cvtype, { case LF_STRUCTURE_V1: case LF_CLASS_V1: - leaf_len = numeric_leaf(&value, cvtype->struct_v1.data); - p_name = (const struct p_string*)&cvtype->struct_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &cvtype->struct_v1.structlen); + p_name = (const struct p_string*)((const unsigned char*)&cvtype->struct_v1.structlen + leaf_len); break; case LF_STRUCTURE_V2: case LF_CLASS_V2: - leaf_len = numeric_leaf(&value, cvtype->struct_v2.data); - p_name = (const struct p_string*)&cvtype->struct_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &cvtype->struct_v2.structlen); + p_name = (const struct p_string*)((const unsigned char*)&cvtype->struct_v2.structlen + leaf_len); break; case LF_STRUCTURE_V3: case LF_CLASS_V3: - leaf_len = numeric_leaf(&value, cvtype->struct_v3.data); - c_name = (const char*)&cvtype->struct_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &cvtype->struct_v3.structlen); + c_name = (const char*)&cvtype->struct_v3.structlen + leaf_len; decorated = cvtype->struct_v3.property.has_decorated_name; break; case LF_UNION_V1: - leaf_len = numeric_leaf(&value, cvtype->union_v1.data); - p_name = (const struct p_string*)&cvtype->union_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &cvtype->union_v1.un_len); + p_name = (const struct p_string*)((const unsigned char*)&cvtype->union_v1.un_len + leaf_len); break; case LF_UNION_V2: - leaf_len = numeric_leaf(&value, cvtype->union_v2.data); - p_name = (const struct p_string*)&cvtype->union_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &cvtype->union_v2.un_len); + p_name = (const struct p_string*)((const unsigned char*)&cvtype->union_v2.un_len + leaf_len); break; case LF_UNION_V3: - leaf_len = numeric_leaf(&value, cvtype->union_v3.data); - c_name = (const char*)&cvtype->union_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &cvtype->union_v3.un_len); + c_name = (const char*)&cvtype->union_v3.un_len + leaf_len; decorated = cvtype->union_v3.property.has_decorated_name; break; case LF_ENUM_V1: @@ -890,8 +888,8 @@ static BOOL codeview_add_type_enum_field_list(struct codeview_type_parse* ctp, { case LF_ENUMERATE_V1: { - int value, vlen = numeric_leaf(&value, type->enumerate_v1.data); - const struct p_string* p_name = (const struct p_string*)&type->enumerate_v1.data[vlen]; + int value, vlen = numeric_leaf(&value, &type->enumerate_v1.value); + const struct p_string* p_name = (const struct p_string*)((const unsigned char*)&type->enumerate_v1.value + vlen);
symt_add_enum_element(ctp->module, symt, terminate_string(p_name), value); ptr += 2 + 2 + vlen + (1 + p_name->namelen); @@ -899,8 +897,8 @@ static BOOL codeview_add_type_enum_field_list(struct codeview_type_parse* ctp, } case LF_ENUMERATE_V3: { - int value, vlen = numeric_leaf(&value, type->enumerate_v3.data); - const char* name = (const char*)&type->enumerate_v3.data[vlen]; + int value, vlen = numeric_leaf(&value, &type->enumerate_v3.value); + const char* name = (const char*)&type->enumerate_v3.value + vlen;
symt_add_enum_element(ctp->module, symt, name, value); ptr += 2 + 2 + vlen + (1 + strlen(name)); @@ -992,7 +990,7 @@ static int codeview_add_type_struct_field_list(struct codeview_type_parse* ctp, switch (type->generic.id) { case LF_BCLASS_V1: - leaf_len = numeric_leaf(&value, type->bclass_v1.data); + leaf_len = numeric_leaf(&value, &type->bclass_v1.offset);
/* FIXME: ignored for now */
@@ -1000,7 +998,7 @@ static int codeview_add_type_struct_field_list(struct codeview_type_parse* ctp, break;
case LF_BCLASS_V2: - leaf_len = numeric_leaf(&value, type->bclass_v2.data); + leaf_len = numeric_leaf(&value, &type->bclass_v2.offset);
/* FIXME: ignored for now */
@@ -1010,10 +1008,10 @@ static int codeview_add_type_struct_field_list(struct codeview_type_parse* ctp, case LF_VBCLASS_V1: case LF_IVBCLASS_V1: { - const unsigned char* p_vboff; + const unsigned short int* p_vboff; int vpoff, vplen; - leaf_len = numeric_leaf(&value, type->vbclass_v1.data); - p_vboff = &type->vbclass_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->vbclass_v1.vbpoff); + p_vboff = (const unsigned short int*)((const char*)&type->vbclass_v1.vbpoff + leaf_len); vplen = numeric_leaf(&vpoff, p_vboff);
/* FIXME: ignored for now */ @@ -1025,10 +1023,10 @@ static int codeview_add_type_struct_field_list(struct codeview_type_parse* ctp, case LF_VBCLASS_V2: case LF_IVBCLASS_V2: { - const unsigned char* p_vboff; + const unsigned short int* p_vboff; int vpoff, vplen; - leaf_len = numeric_leaf(&value, type->vbclass_v2.data); - p_vboff = &type->vbclass_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->vbclass_v2.vbpoff); + p_vboff = (const unsigned short int*)((const char*)&type->vbclass_v2.vbpoff + leaf_len); vplen = numeric_leaf(&vpoff, p_vboff);
/* FIXME: ignored for now */ @@ -1038,28 +1036,28 @@ static int codeview_add_type_struct_field_list(struct codeview_type_parse* ctp, break;
case LF_MEMBER_V1: - leaf_len = numeric_leaf(&value, type->member_v1.data); - p_name = (const struct p_string*)&type->member_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->member_v1.offset); + p_name = (const struct p_string*)((const char*)&type->member_v1.offset + leaf_len);
- codeview_add_udt_element(ctp, symt, terminate_string(p_name), value, + codeview_add_udt_element(ctp, symt, terminate_string(p_name), value, type->member_v1.type);
ptr += 2 + 2 + 2 + leaf_len + (1 + p_name->namelen); break;
case LF_MEMBER_V2: - leaf_len = numeric_leaf(&value, type->member_v2.data); - p_name = (const struct p_string*)&type->member_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->member_v2.offset); + p_name = (const struct p_string*)((const unsigned char*)&type->member_v2.offset + leaf_len);
- codeview_add_udt_element(ctp, symt, terminate_string(p_name), value, + codeview_add_udt_element(ctp, symt, terminate_string(p_name), value, type->member_v2.type);
ptr += 2 + 2 + 4 + leaf_len + (1 + p_name->namelen); break;
case LF_MEMBER_V3: - leaf_len = numeric_leaf(&value, type->member_v3.data); - c_name = (const char*)&type->member_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->member_v3.offset); + c_name = (const char*)&type->member_v3.offset + leaf_len;
codeview_add_udt_element(ctp, symt, c_name, value, type->member_v3.type);
@@ -1264,23 +1262,23 @@ static struct symt* codeview_parse_one_type(struct codeview_type_parse* ctp, break;
case LF_ARRAY_V1: - leaf_len = numeric_leaf(&value, type->array_v1.data); - p_name = (const struct p_string*)&type->array_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->array_v1.arrlen); + p_name = (const struct p_string*)((const unsigned char*)&type->array_v1.arrlen + leaf_len); symt = codeview_add_type_array(ctp, terminate_string(p_name), type->array_v1.elemtype, type->array_v1.idxtype, value); break; case LF_ARRAY_V2: - leaf_len = numeric_leaf(&value, type->array_v2.data); - p_name = (const struct p_string*)&type->array_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->array_v2.arrlen); + p_name = (const struct p_string*)((const unsigned char*)&type->array_v2.arrlen + leaf_len);
symt = codeview_add_type_array(ctp, terminate_string(p_name), type->array_v2.elemtype, type->array_v2.idxtype, value); break; case LF_ARRAY_V3: - leaf_len = numeric_leaf(&value, type->array_v3.data); - c_name = (const char*)&type->array_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->array_v3.arrlen); + c_name = (const char*)&type->array_v3.arrlen + leaf_len;
symt = codeview_add_type_array(ctp, c_name, type->array_v3.elemtype, @@ -1414,43 +1412,43 @@ static struct symt* codeview_load_forwardable_type(struct codeview_type_parse* c { case LF_STRUCTURE_V1: case LF_CLASS_V1: - leaf_len = numeric_leaf(&value, type->struct_v1.data); - p_name = (const struct p_string*)&type->struct_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->struct_v1.structlen); + p_name = (const struct p_string*)((const unsigned char*)&type->struct_v1.structlen + leaf_len); symt = &symt_new_udt(ctp->module, terminate_string(p_name), value, type->generic.id == LF_CLASS_V1 ? UdtClass : UdtStruct)->symt; break;
case LF_STRUCTURE_V2: case LF_CLASS_V2: - leaf_len = numeric_leaf(&value, type->struct_v2.data); - p_name = (const struct p_string*)&type->struct_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->struct_v2.structlen); + p_name = (const struct p_string*)((const unsigned char*)&type->struct_v2.structlen + leaf_len); symt = &symt_new_udt(ctp->module, terminate_string(p_name), value, type->generic.id == LF_CLASS_V2 ? UdtClass : UdtStruct)->symt; break;
case LF_STRUCTURE_V3: case LF_CLASS_V3: - leaf_len = numeric_leaf(&value, type->struct_v3.data); - c_name = (const char*)&type->struct_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->struct_v3.structlen); + c_name = (const char*)&type->struct_v3.structlen + leaf_len; symt = &symt_new_udt(ctp->module, c_name, value, type->generic.id == LF_CLASS_V3 ? UdtClass : UdtStruct)->symt; break;
case LF_UNION_V1: - leaf_len = numeric_leaf(&value, type->union_v1.data); - p_name = (const struct p_string*)&type->union_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->union_v1.un_len); + p_name = (const struct p_string*)((const unsigned char*)&type->union_v1.un_len + leaf_len); symt = &symt_new_udt(ctp->module, terminate_string(p_name), value, UdtUnion)->symt; break;
case LF_UNION_V2: - leaf_len = numeric_leaf(&value, type->union_v2.data); - p_name = (const struct p_string*)&type->union_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->union_v2.un_len); + p_name = (const struct p_string*)((const unsigned char*)&type->union_v2.un_len + leaf_len); symt = &symt_new_udt(ctp->module, terminate_string(p_name), value, UdtUnion)->symt; break;
case LF_UNION_V3: - leaf_len = numeric_leaf(&value, type->union_v3.data); - c_name = (const char*)&type->union_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->union_v3.un_len); + c_name = (const char*)&type->union_v3.un_len + leaf_len; symt = &symt_new_udt(ctp->module, c_name, value, UdtUnion)->symt; break;
@@ -1577,7 +1575,6 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B unsigned int k; const unsigned int* filetab; const unsigned int* lt_ptr; - const unsigned int* offsets; const unsigned short* linenos; const struct startend* start; unsigned source; @@ -1606,14 +1603,13 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B for (j = 0; j < nseg; j++) { ltb = (const struct codeview_linetab_block*)(linetab + *lt_ptr++); - offsets = (const unsigned int*)<b->data; - linenos = (const unsigned short*)&offsets[ltb->num_lines]; + linenos = (const unsigned short*)<b->offsets[ltb->num_lines]; func_addr0 = codeview_get_address(msc_dbg, ltb->seg, start[j].start); if (!func_addr0) continue; for (func = NULL, k = 0; k < ltb->num_lines; k++) { /* now locate function (if any) */ - addr = func_addr0 + offsets[k] - start[j].start; + addr = func_addr0 + ltb->offsets[k] - start[j].start; /* unfortunately, we can have several functions in the same block, if there's no * gap between them... find the new function if needed */ @@ -1624,7 +1620,7 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B if (!symt_check_tag(&func->symt, SymTagFunction) && !symt_check_tag(&func->symt, SymTagInlineSite)) { WARN("--not a func at %04x:%08x %Ix tag=%d\n", - ltb->seg, offsets[k], addr, func ? func->symt.tag : -1); + ltb->seg, ltb->offsets[k], addr, func ? func->symt.tag : -1); func = NULL; break; } @@ -2583,8 +2579,8 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, struct symt* se; VARIANT v;
- vlen = leaf_as_variant(&v, sym->constant_v1.data); - name = (const struct p_string*)&sym->constant_v1.data[vlen]; + vlen = leaf_as_variant(&v, &sym->constant_v1.cvalue); + name = (const struct p_string*)((const char*)&sym->constant_v1.cvalue + vlen); se = codeview_get_type(sym->constant_v1.type, FALSE);
TRACE("S-Constant-V1 %u %s %x\n", V_INT(&v), terminate_string(name), sym->constant_v1.type); @@ -2599,8 +2595,8 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, struct symt* se; VARIANT v;
- vlen = leaf_as_variant(&v, sym->constant_v2.data); - name = (const struct p_string*)&sym->constant_v2.data[vlen]; + vlen = leaf_as_variant(&v, &sym->constant_v2.cvalue); + name = (const struct p_string*)((const char*)&sym->constant_v2.cvalue + vlen); se = codeview_get_type(sym->constant_v2.type, FALSE);
TRACE("S-Constant-V2 %u %s %x\n", V_INT(&v), terminate_string(name), sym->constant_v2.type); @@ -2615,8 +2611,8 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, struct symt* se; VARIANT v;
- vlen = leaf_as_variant(&v, sym->constant_v3.data); - name = (const char*)&sym->constant_v3.data[vlen]; + vlen = leaf_as_variant(&v, &sym->constant_v3.cvalue); + name = (const char*)&sym->constant_v3.cvalue + vlen; se = codeview_get_type(sym->constant_v3.type, FALSE);
TRACE("S-Constant-V3 %u %s %x\n", V_INT(&v), name, sym->constant_v3.type); @@ -3300,12 +3296,12 @@ static void pdb_convert_symbol_file(const PDB_SYMBOLS* symbols, sfile->symbol_size = sym_file->symbol_size; sfile->lineno_size = sym_file->lineno_size; sfile->lineno2_size = sym_file->lineno2_size; - *size = sizeof(PDB_SYMBOL_FILE); + *size = sizeof(PDB_SYMBOL_FILE) - 1; } else { memcpy(sfile, image, sizeof(PDB_SYMBOL_FILE_EX)); - *size = sizeof(PDB_SYMBOL_FILE_EX); + *size = sizeof(PDB_SYMBOL_FILE_EX) - 1; } }
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index 179262a629e..203f02bbd2d 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -4706,20 +4706,12 @@ static HRESULT WINAPI ddraw_surface1_SetClipper(IDirectDrawSurface *iface, IDire static HRESULT ddraw_surface_set_wined3d_textures_colour_key(struct ddraw_surface *surface, DWORD flags, struct wined3d_color_key *color_key) { - struct d3d_device *device; HRESULT hr;
hr = wined3d_texture_set_color_key(surface->wined3d_texture, flags, color_key); if (surface->draw_texture && SUCCEEDED(hr)) hr = wined3d_texture_set_color_key(surface->draw_texture, flags, color_key);
- LIST_FOR_EACH_ENTRY(device, &surface->ddraw->d3ddevice_list, struct d3d_device, ddraw_entry) - { - wined3d_stateblock_texture_changed(device->state, surface->wined3d_texture); - if (surface->draw_texture) - wined3d_stateblock_texture_changed(device->state, surface->draw_texture); - } - return hr; }
diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c index cfc14600c5c..96047744635 100644 --- a/dlls/ddraw/tests/ddraw1.c +++ b/dlls/ddraw/tests/ddraw1.c @@ -3247,13 +3247,6 @@ static void test_coop_level_mode_set(void) /* For Wine. */ change_ret = ChangeDisplaySettingsW(NULL, CDS_FULLSCREEN); ok(change_ret == DISP_CHANGE_SUCCESSFUL, "Failed to change display mode, ret %#lx.\n", change_ret); - flush_events(); - - if (IsIconic(window)) /* make sure the window is restored, working around some Wine/X11 race condition */ - { - ShowWindow(window, SW_RESTORE); - flush_events(); - }
memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c index 198e40bab55..48a49815c58 100644 --- a/dlls/ddraw/tests/ddraw2.c +++ b/dlls/ddraw/tests/ddraw2.c @@ -16670,8 +16670,6 @@ static void test_d3d_state_reset(void) ok(hr == DD_OK, "got %#lx.\n", hr); hr = IDirect3DDevice2_SetRenderState(device, D3DRENDERSTATE_ZENABLE, TRUE); ok(hr == DD_OK, "got %#lx.\n", hr); - hr = IDirect3DDevice2_BeginScene(device); - ok(hr == DD_OK, "got %#lx.\n", hr);
memset(¶m, 0, sizeof(param)); hr = IDirectDraw2_EnumDisplayModes(ddraw, 0, NULL, ¶m, find_different_mode_callback); @@ -16720,8 +16718,6 @@ static void test_d3d_state_reset(void) hr = IDirect3DDevice2_GetRenderState(device, D3DRENDERSTATE_ZENABLE, &state); ok(hr == DD_OK, "got %#lx.\n", hr); ok(state == TRUE, "got %#lx.\n", state); - hr = IDirect3DDevice2_BeginScene(device); - ok(hr == D3DERR_SCENE_IN_SCENE, "Unexpected hr %#lx.\n", hr);
hr = IDirectDraw2_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(hr == DD_OK, "got %#lx.\n", hr); diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c index 7f7c563303f..8abd9cd44fd 100644 --- a/dlls/ddraw/tests/ddraw4.c +++ b/dlls/ddraw/tests/ddraw4.c @@ -19774,8 +19774,6 @@ static void test_d3d_state_reset(void) ok(hr == DD_OK, "got %#lx.\n", hr); hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_ZENABLE, TRUE); ok(hr == DD_OK, "got %#lx.\n", hr); - hr = IDirect3DDevice3_BeginScene(device); - ok(hr == DD_OK, "got %#lx.\n", hr);
memset(¶m, 0, sizeof(param)); hr = IDirectDraw4_EnumDisplayModes(ddraw, 0, NULL, ¶m, find_different_mode_callback); @@ -19824,8 +19822,6 @@ static void test_d3d_state_reset(void) hr = IDirect3DDevice3_GetRenderState(device, D3DRENDERSTATE_ZENABLE, &state); ok(hr == DD_OK, "got %#lx.\n", hr); ok(state == TRUE, "got %#lx.\n", state); - hr = IDirect3DDevice3_BeginScene(device); - ok(hr == D3DERR_SCENE_IN_SCENE, "Unexpected hr %#lx.\n", hr);
hr = IDirectDraw4_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(hr == DD_OK, "got %#lx.\n", hr); diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c index 76c52be0258..3e03d3e4dd6 100644 --- a/dlls/ddraw/tests/ddraw7.c +++ b/dlls/ddraw/tests/ddraw7.c @@ -20229,8 +20229,6 @@ static void test_d3d_state_reset(void) ok(hr == DD_OK, "got %#lx.\n", hr); hr = IDirect3DDevice7_SetRenderState(device, D3DRENDERSTATE_ZENABLE, TRUE); ok(hr == DD_OK, "got %#lx.\n", hr); - hr = IDirect3DDevice7_BeginScene(device); - ok(hr == DD_OK, "got %#lx.\n", hr);
hr = IDirect3DDevice7_GetViewport(device, &vp1); ok(hr == DD_OK, "got %#lx.\n", hr); @@ -20271,8 +20269,6 @@ static void test_d3d_state_reset(void) hr = IDirect3DDevice7_GetRenderState(device, D3DRENDERSTATE_ZENABLE, &state); ok(hr == DD_OK, "got %#lx.\n", hr); ok(state == TRUE, "got %#lx.\n", state); - hr = IDirect3DDevice7_BeginScene(device); - ok(hr == D3DERR_SCENE_IN_SCENE, "Unexpected hr %#lx.\n", hr);
hr = IDirectDraw7_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); ok(hr == DD_OK, "got %#lx.\n", hr); diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index b34244238a2..83a293e57fe 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -1820,8 +1820,8 @@ static HRESULT WINAPI dwritefontface3_GetRecommendedRenderingMode(IDWriteFontFac
hr = IDWriteRenderingParams_QueryInterface(params, &IID_IDWriteRenderingParams3, (void**)¶ms3); if (hr == S_OK) { - mode = IDWriteRenderingParams3_GetRenderingMode1(params3); - *gridfit_mode = IDWriteRenderingParams3_GetGridFitMode(params3); + *rendering_mode = IDWriteRenderingParams3_GetRenderingMode1(params3); + mode = IDWriteRenderingParams3_GetGridFitMode(params3); IDWriteRenderingParams3_Release(params3); } else diff --git a/dlls/dxdiagn/Makefile.in b/dlls/dxdiagn/Makefile.in index e556a93f8e8..da0b48b9894 100644 --- a/dlls/dxdiagn/Makefile.in +++ b/dlls/dxdiagn/Makefile.in @@ -1,5 +1,5 @@ MODULE = dxdiagn.dll -IMPORTS = strmiids dxguid d3d9 ddraw dsound version ole32 oleaut32 user32 advapi32 +IMPORTS = strmiids dxguid uuid d3d9 ddraw dsound version ole32 oleaut32 user32 advapi32
SOURCES = \ container.c \ diff --git a/dlls/dxdiagn/dxdiag_main.c b/dlls/dxdiagn/dxdiag_main.c index 0198508fd48..90e769cd81f 100644 --- a/dlls/dxdiagn/dxdiag_main.c +++ b/dlls/dxdiagn/dxdiag_main.c @@ -23,13 +23,13 @@
#include <stdarg.h>
-#include "initguid.h" #include "windef.h" #include "winbase.h" #include "objbase.h" #include "oleauto.h" #include "oleidl.h" #include "rpcproxy.h" +#include "initguid.h" #include "dxdiag_private.h" #include "wine/debug.h"
diff --git a/dlls/dxdiagn/dxdiag_private.h b/dlls/dxdiagn/dxdiag_private.h index 5c5f51e7bb5..5f4b7c28fd0 100644 --- a/dlls/dxdiagn/dxdiag_private.h +++ b/dlls/dxdiagn/dxdiag_private.h @@ -23,6 +23,10 @@
#include <stdarg.h>
+#include "windef.h" +#include "winbase.h" +#include "wingdi.h" + #include "wine/list.h" #include "dxdiag.h" #include "resource.h" diff --git a/dlls/dxdiagn/provider.c b/dlls/dxdiagn/provider.c index 88011ac87d2..05fe76849a2 100644 --- a/dlls/dxdiagn/provider.c +++ b/dlls/dxdiagn/provider.c @@ -31,7 +31,6 @@ #include "d3d9.h" #include "strmif.h" #include "initguid.h" -#include "mmdeviceapi.h" #include "wine/fil_data.h" #include "psapi.h" #include "wbemcli.h" @@ -1243,7 +1242,6 @@ static HRESULT build_displaydevices_tree(IDxDiagContainerImpl_Container *node) struct enum_context { IDxDiagContainerImpl_Container *cont; - IMMDeviceCollection *devices; HRESULT hr; int index; }; @@ -1263,7 +1261,6 @@ BOOL CALLBACK dsound_enum(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID cont IDxDiagContainerImpl_Container *device; WCHAR buffer[256]; const WCHAR *p, *name; - UINT32 i, count;
/* the default device is enumerated twice, one time without GUID */ if (!guid) return TRUE; @@ -1299,62 +1296,6 @@ BOOL CALLBACK dsound_enum(LPGUID guid, LPCWSTR desc, LPCWSTR module, LPVOID cont if (FAILED(enum_ctx->hr)) return FALSE;
- if (enum_ctx->devices && SUCCEEDED(IMMDeviceCollection_GetCount(enum_ctx->devices, &count))) - { - static const PROPERTYKEY devicepath_key = - { - {0xb3f8fa53, 0x0004, 0x438e, {0x90, 0x03, 0x51, 0xa4, 0x6e, 0x13, 0x9b, 0xfc}}, 2 - }; - IPropertyStore *ps; - WCHAR *start, *end; - IMMDevice *mmdev; - PROPVARIANT pv; - HRESULT hr; - - for (i = 0; i < count; ++i) - { - mmdev = NULL; - ps = NULL; - hr = IMMDeviceCollection_Item(enum_ctx->devices, i, &mmdev); - if (SUCCEEDED(hr)) - hr = IMMDevice_OpenPropertyStore(mmdev, STGM_READ, &ps); - PropVariantInit(&pv); - if (SUCCEEDED(hr)) - hr = IPropertyStore_GetValue(ps, (const PROPERTYKEY*)&PKEY_AudioEndpoint_GUID, &pv); - if (SUCCEEDED(hr)) - { - StringFromGUID2(guid, buffer, ARRAY_SIZE(buffer)); - hr = pv.vt == VT_LPWSTR && !wcsicmp(buffer, pv.pwszVal) ? S_OK : E_FAIL; - PropVariantClear(&pv); - } - PropVariantInit(&pv); - if (SUCCEEDED(hr)) - hr = IPropertyStore_GetValue(ps, &devicepath_key, &pv); - if (SUCCEEDED(hr) && pv.vt == VT_LPWSTR) - { - if ((start = wcsstr(pv.pwszVal, L"}."))) - start += 2; - else - start = pv.pwszVal; - if (wcsnicmp(start, L"ROOT", 4) && (end = wcschr(start, '\')) && (end = wcschr(end + 1, '\')) - && end - start < ARRAY_SIZE(buffer)) - { - memcpy(buffer, start, (end - start) * sizeof(WCHAR)); - buffer[end - start] = 0; - start = buffer; - } - add_bstr_property(device, L"szHardwareID", start); - PropVariantClear(&pv); - } - if (ps) - IPropertyStore_Release(ps); - if (mmdev) - IMMDevice_Release(mmdev); - if (SUCCEEDED(hr)) - break; - } - } - enum_ctx->index++; return TRUE; } @@ -1363,7 +1304,6 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node) { struct enum_context enum_ctx; IDxDiagContainerImpl_Container *cont; - IMMDeviceEnumerator *mmdevenum;
cont = allocate_information_node(L"DxDiag_SoundDevices"); if (!cont) @@ -1375,20 +1315,7 @@ static HRESULT build_directsound_tree(IDxDiagContainerImpl_Container *node) enum_ctx.hr = S_OK; enum_ctx.index = 0;
- enum_ctx.devices = NULL; - if (SUCCEEDED(CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_INPROC_SERVER, &IID_IMMDeviceEnumerator, - (void **)&mmdevenum))) - { - IMMDeviceEnumerator_EnumAudioEndpoints(mmdevenum, eAll, DEVICE_STATE_ACTIVE, &enum_ctx.devices); - IMMDeviceEnumerator_Release(mmdevenum); - } - DirectSoundEnumerateW(dsound_enum, &enum_ctx); - if (enum_ctx.devices) - { - IMMDeviceCollection_Release(enum_ctx.devices); - enum_ctx.devices = NULL; - } if (FAILED(enum_ctx.hr)) return enum_ctx.hr;
diff --git a/dlls/dxdiagn/tests/container.c b/dlls/dxdiagn/tests/container.c index c511b9da672..146c83070d8 100644 --- a/dlls/dxdiagn/tests/container.c +++ b/dlls/dxdiagn/tests/container.c @@ -945,7 +945,6 @@ static void test_DxDiag_SoundDevices(void) {L"szGuidDeviceID", VT_BSTR}, {L"szDriverName", VT_BSTR}, {L"szDriverPath", VT_BSTR}, - {L"szHardwareID", VT_BSTR}, };
IDxDiagContainer *sound_cont = NULL; diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index bdb2e1c917c..1c0e6aa07d6 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -5826,17 +5826,16 @@ struct measure_string_args { static GpStatus measure_string_callback(struct gdip_format_string_info *info) { struct measure_string_args *args = info->user_data; - RectF *bounds = args->bounds; REAL new_width, new_height;
new_width = info->bounds->Width / args->rel_width; - new_height = (info->bounds->Height + info->bounds->Y) / args->rel_height - bounds->Y; + new_height = (info->bounds->Height + info->bounds->Y) / args->rel_height - args->bounds->Y;
- if (new_width > bounds->Width) - bounds->Width = new_width; + if (new_width > args->bounds->Width) + args->bounds->Width = new_width;
- if (new_height > bounds->Height) - bounds->Height = new_height; + if (new_height > args->bounds->Height) + args->bounds->Height = new_height;
if (args->codepointsfitted) *args->codepointsfitted = info->index + info->length; @@ -5844,18 +5843,6 @@ static GpStatus measure_string_callback(struct gdip_format_string_info *info) if (args->linesfilled) (*args->linesfilled)++;
- switch (info->format ? info->format->align : StringAlignmentNear) - { - case StringAlignmentCenter: - bounds->X = bounds->X + (info->rect->Width/2) - (bounds->Width/2); - break; - case StringAlignmentFar: - bounds->X = bounds->X + info->rect->Width - bounds->Width; - break; - default: - break; - } - return Ok; }
diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 29529463fa5..c1c0fa67669 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -4911,6 +4911,7 @@ static void test_measure_string(void) expect(Ok, status); expect(3, glyphs); expect(1, lines); + todo_wine expectf_(5.0 + width/2.0, bounds.X, 0.01); todo_wine expectf(5.0 + height/2.0, bounds.Y); @@ -4978,6 +4979,7 @@ static void test_measure_string(void) expect(Ok, status); expect(3, glyphs); expect(1, lines); + todo_wine expectf_(5.0 + width, bounds.X, 0.01); todo_wine expectf(5.0 + height, bounds.Y); diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 79aea60de9c..dbdc64659a8 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -325,12 +325,13 @@ static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, HRESULT hres;
prop = lookup_dispex_prop(This, hash, name, case_insens); - if(prop && prop->type != PROP_DELETED) { + if(prop) { *ret = prop; return S_OK; }
- if(!prop && (builtin = find_builtin_prop(This, name, case_insens))) { + builtin = find_builtin_prop(This, name, case_insens); + if(builtin) { unsigned flags = builtin->flags; if(flags & PROPF_METHOD) { jsdisp_t *obj; @@ -361,10 +362,7 @@ static HRESULT find_prop_name(jsdisp_t *This, unsigned hash, const WCHAR *name, return S_OK; }
- hres = find_external_prop(This, name, case_insens, ret); - if(hres == S_OK && !*ret) - *ret = prop; - return hres; + return find_external_prop(This, name, case_insens, ret); }
static HRESULT find_prop_name_prot(jsdisp_t *This, unsigned hash, const WCHAR *name, BOOL case_insens, dispex_prop_t **ret) @@ -2310,20 +2308,6 @@ static void WINAPI WineJSDispatch_Free(IWineJSDispatch *iface) jsdisp_free(This); }
-static HRESULT WINAPI WineJSDispatch_GetScriptGlobal(IWineJSDispatch *iface, IWineJSDispatchHost **ret) -{ - jsdisp_t *This = impl_from_IWineJSDispatch(iface); - IDispatch *disp; - - if(!This->ctx->site) - return E_UNEXPECTED; - - if(!(disp = lookup_global_host(This->ctx))) - return E_NOINTERFACE; - - return IDispatch_QueryInterface(disp, &IID_IWineJSDispatchHost, (void **)ret); -} - static IWineJSDispatchVtbl DispatchExVtbl = { DispatchEx_QueryInterface, DispatchEx_AddRef, @@ -2341,7 +2325,6 @@ static IWineJSDispatchVtbl DispatchExVtbl = { DispatchEx_GetNextDispID, DispatchEx_GetNameSpaceParent, WineJSDispatch_Free, - WineJSDispatch_GetScriptGlobal, };
jsdisp_t *as_jsdisp(IDispatch *disp) diff --git a/dlls/jscript/jsdisp.idl b/dlls/jscript/jsdisp.idl index f01ea95ce48..8ea53396f09 100644 --- a/dlls/jscript/jsdisp.idl +++ b/dlls/jscript/jsdisp.idl @@ -34,8 +34,6 @@ const unsigned int PROPF_ENUMERABLE = 0x0400; const unsigned int PROPF_WRITABLE = 0x0800; const unsigned int PROPF_CONFIGURABLE = 0x1000;
-interface IWineJSDispatchHost; - [ object, uuid(d359f2fe-5531-741b-a41a-5cf92edc971c), @@ -44,7 +42,6 @@ interface IWineJSDispatchHost; interface IWineJSDispatch : IDispatchEx { void Free(); - HRESULT GetScriptGlobal(IWineJSDispatchHost **ret); }
[ diff --git a/dlls/jscript/regexp.c b/dlls/jscript/regexp.c index a29b4bb90e1..325b5ad56d6 100644 --- a/dlls/jscript/regexp.c +++ b/dlls/jscript/regexp.c @@ -45,7 +45,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); #define ReportRegExpErrorHelper(a,b,c,d) throw_error((a)->context, E_FAIL, L"") #define JS_ReportErrorNumber(a,b,c,d) throw_error((a), E_FAIL, L"") #define JS_ReportErrorFlagsAndNumber(a,b,c,d,e,f) throw_error((a), E_FAIL, L"") -#define JS_COUNT_OPERATION(a,b) do { } while(0) +#define JS_COUNT_OPERATION(a,b) throw_error((a), E_FAIL, L"")
typedef BYTE JSPackedBool; diff --git a/dlls/light.msstyles/Makefile.in b/dlls/light.msstyles/Makefile.in index 519830fb31c..1c432b8d911 100644 --- a/dlls/light.msstyles/Makefile.in +++ b/dlls/light.msstyles/Makefile.in @@ -54,10 +54,6 @@ SOURCES = \ blue_edit_border_hvscroll.svg \ blue_edit_border_noscroll.svg \ blue_edit_border_vscroll.svg \ - blue_explorer_listview_item_hot.svg \ - blue_explorer_listview_item_hot_selected.svg \ - blue_explorer_listview_item_selected.svg \ - blue_explorer_listview_item_selected_not_focus.svg \ blue_explorer_treeview_glyph_16px.svg \ blue_explorer_treeview_glyph_20px.svg \ blue_explorer_treeview_glyph_24px.svg \ diff --git a/dlls/light.msstyles/blue_explorer_listview_item_hot.bmp b/dlls/light.msstyles/blue_explorer_listview_item_hot.bmp deleted file mode 100644 index a0a1c73118544101c7b5315a42f0128d083d97bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 334 zcmZ?r^<!iJgDxOh1H|l5%*dd?zzk#`0b)$>pMe2_KvMsm+=GfS)!-LlL6iPDSyyAI FV*uH!WI6x<
diff --git a/dlls/light.msstyles/blue_explorer_listview_item_hot.svg b/dlls/light.msstyles/blue_explorer_listview_item_hot.svg deleted file mode 100644 index 6681bbc5463..00000000000 --- a/dlls/light.msstyles/blue_explorer_listview_item_hot.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg id="bitmap:7-32" width="7" height="7" version="1.1" viewBox="0 0 1.8521 1.8521" xmlns="http://www.w3.org/2000/svg"> - <rect width="1.8521" height="1.8521" fill="#3096fa" fill-opacity=".15686"/> -</svg> diff --git a/dlls/light.msstyles/blue_explorer_listview_item_hot_selected.bmp b/dlls/light.msstyles/blue_explorer_listview_item_hot_selected.bmp deleted file mode 100644 index fd2283b430c93bbf03ac81bbf6ff3a1c0a0d510d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 334 zcmZ?r^<!iJgDxOh1H|l5%*dd?zzk#`0b)$>pMe2_KvMsm+=GfS)!-LlL6iP9&0xV$ F#{d$1e2D-6
diff --git a/dlls/light.msstyles/blue_explorer_listview_item_hot_selected.svg b/dlls/light.msstyles/blue_explorer_listview_item_hot_selected.svg deleted file mode 100644 index 7e6c2570723..00000000000 --- a/dlls/light.msstyles/blue_explorer_listview_item_hot_selected.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg id="bitmap:7-32" width="7" height="7" d="bitmap:7-32" version="1.1" viewBox="0 0 1.8521 1.8521" xmlns="http://www.w3.org/2000/svg"> - <rect width="1.8521" height="1.8521" fill="#3096fa" fill-opacity=".62745"/> -</svg> diff --git a/dlls/light.msstyles/blue_explorer_listview_item_selected.bmp b/dlls/light.msstyles/blue_explorer_listview_item_selected.bmp deleted file mode 100644 index 91a22cfc58af39652acf2454fe7b2ec2a531264f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 334 zcmZ?r^<!iJgDxOh1H|l5%*dd?zzk#`0b)$>pMe2_KvMsm+=GfS)!-LlL6iPD%^+Z? FV*oL(Z3qAW
diff --git a/dlls/light.msstyles/blue_explorer_listview_item_selected.svg b/dlls/light.msstyles/blue_explorer_listview_item_selected.svg deleted file mode 100644 index 67e7733b084..00000000000 --- a/dlls/light.msstyles/blue_explorer_listview_item_selected.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg id="bitmap:7-32" width="7" height="7" d="bitmap:7-32" version="1.1" viewBox="0 0 1.8521 1.8521" xmlns="http://www.w3.org/2000/svg"> - <rect width="1.8521" height="1.8521" fill="#3096fa" fill-opacity=".31373"/> -</svg> diff --git a/dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.bmp b/dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.bmp deleted file mode 100644 index 7300710d1f1b4562d19b850c886928f57fb17f07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001
literal 334 zcmZ?r^<!iJgDxOh1H|l5%*dd?zzk#`0b)$>pMe2_KvMsm+=GfS)!-LlL6csyW{t*B F#{fVoa+Lr8
diff --git a/dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.svg b/dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.svg deleted file mode 100644 index 583498e1463..00000000000 --- a/dlls/light.msstyles/blue_explorer_listview_item_selected_not_focus.svg +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg id="bitmap:7-32" width="7" height="7" d="bitmap:7-32" version="1.1" viewBox="0 0 1.8521 1.8521" xmlns="http://www.w3.org/2000/svg"> - <rect width="1.8521" height="1.8521" fill="#aeaeae" fill-opacity=".15686"/> -</svg> diff --git a/dlls/light.msstyles/light.rc b/dlls/light.msstyles/light.rc index ef580f2f5e2..feb48034dea 100644 --- a/dlls/light.msstyles/light.rc +++ b/dlls/light.msstyles/light.rc @@ -1,5 +1,5 @@ /* - * Copyright 2021-2024 Zhiyi Zhang for CodeWeavers + * Copyright 2021-2022 Zhiyi Zhang for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -113,7 +113,7 @@ BLUE_INI TEXTFILE "HighlightText = 255 255 255\r\n" "BtnFace = 245 245 245\r\n" "BtnShadow = 166 166 166\r\n" -"GrayText = 106 106 106\r\n" +"GrayText = 166 166 166\r\n" "BtnText = 0 0 0\r\n" "InactiveCaptionText = 200 200 200\r\n" "BtnHighlight = 255 255 255\r\n" @@ -906,202 +906,6 @@ BLUE_INI TEXTFILE "SizingMargins = 0, 0, 0, 0\r\n" "ImageFile = blue_listview_column_detail.bmp\r\n"
-"\r\n; Explorer::ListView\r\n" -"[Explorer::ListView]\r\n" -"BgType = BorderFill\r\n" -"BorderSize = 1\r\n" -"FillColor = 255 255 255\r\n" -"BorderColor = 174 174 174\r\n" - -"[Explorer::ListView.ListItem(Hot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_explorer_listview_item_hot.bmp\r\n" - -"[Explorer::ListView.ListItem(Selected)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"TextColor = 0 0 0\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_explorer_listview_item_selected.bmp\r\n" - -"[Explorer::ListView.ListItem(SelectedNotFocus)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_explorer_listview_item_selected_not_focus.bmp\r\n" - -"[Explorer::ListView.ListItem(HotSelected)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_explorer_listview_item_hot_selected.bmp\r\n" - -"[Explorer::ListView.GroupHeader]\r\n" -"BgType = None\r\n" -"Heading1TextColor = 0 0 0\r\n" -"Heading2TextColor = 0 0 0\r\n" -"BodyTextColor = 0 0 0\r\n" -"ContentMargins = 10, 10, 2, 3\r\n" -"Font = Tahoma, 9\r\n" -"Heading1Font = Tahoma, 9\r\n" -"Heading2Font = Tahoma, 9\r\n" -"BodyFont = Tahoma, 9\r\n" - -"[Explorer::ListView.GroupHeader(OpenHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_open_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(OpenSelectedHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_open_selected_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(OpenSelectedNotFocusedHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_open_selected_not_focused_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(OpenMixedSelectionHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_open_mixed_selection_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseSelected)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_selected.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseSelectedHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_selected_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseSelectedNotFocused)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_selected_not_focused.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseSelectedNotFocusedHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_selected_not_focused_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseMixedSelection)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_mixed_selection.bmp\r\n" - -"[Explorer::ListView.GroupHeader(CloseMixedSelectionHot)]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"Transparent = True\r\n" -"SizingMargins = 3, 3, 3, 3\r\n" -"ContentMargins = 1, 1, 1, 1\r\n" -"ImageFile = blue_listview_group_header_close_mixed_selection_hot.bmp\r\n" - -"[Explorer::ListView.GroupHeaderLine]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"ImageLayout = Vertical\r\n" -"ImageCount = 16\r\n" -"Transparent = True\r\n" -"SizingMargins = 0, 0, 0, 0\r\n" -"ImageFile = blue_listview_group_header_line.bmp\r\n" - -"[Explorer::ListView.ExpandButton]\r\n" -"BgType = ImageFile\r\n" -"SizingType = TrueSize\r\n" -"ImageLayout = Vertical\r\n" -"ImageSelectType = Dpi\r\n" -"TrueSizeScalingType = Dpi\r\n" -"ImageCount = 3\r\n" -"ImageFile1 = blue_listview_expand_button_15px.bmp\r\n" -"ImageFile2 = blue_listview_expand_button_19px.bmp\r\n" -"ImageFile3 = blue_listview_expand_button_23px.bmp\r\n" -"ImageFile4 = blue_listview_expand_button_30px.bmp\r\n" -"ImageFile5 = blue_listview_expand_button_37px.bmp\r\n" -"ImageFile6 = blue_listview_expand_button_46px.bmp\r\n" -"ImageFile7 = blue_listview_expand_button_60px.bmp\r\n" -"MinDpi1 = 96\r\n" -"MinDpi2 = 120\r\n" -"MinDpi3 = 144\r\n" -"MinDpi4 = 192\r\n" -"MinDpi5 = 240\r\n" -"MinDpi6 = 288\r\n" -"MinDpi7 = 384\r\n" - -"[Explorer::ListView.CollapseButton]\r\n" -"BgType = ImageFile\r\n" -"SizingType = TrueSize\r\n" -"ImageLayout = Vertical\r\n" -"ImageSelectType = Dpi\r\n" -"TrueSizeScalingType = Dpi\r\n" -"ImageCount = 3\r\n" -"ImageFile1 = blue_listview_collapse_button_15px.bmp\r\n" -"ImageFile2 = blue_listview_collapse_button_19px.bmp\r\n" -"ImageFile3 = blue_listview_collapse_button_23px.bmp\r\n" -"ImageFile4 = blue_listview_collapse_button_30px.bmp\r\n" -"ImageFile5 = blue_listview_collapse_button_37px.bmp\r\n" -"ImageFile6 = blue_listview_collapse_button_46px.bmp\r\n" -"ImageFile7 = blue_listview_collapse_button_60px.bmp\r\n" -"MinDpi1 = 96\r\n" -"MinDpi2 = 120\r\n" -"MinDpi3 = 144\r\n" -"MinDpi4 = 192\r\n" -"MinDpi5 = 240\r\n" -"MinDpi6 = 288\r\n" -"MinDpi7 = 384\r\n" - -"[Explorer::ListView.ColumnDetail]\r\n" -"BgType = ImageFile\r\n" -"SizingType = Stretch\r\n" -"ImageLayout = Vertical\r\n" -"ImageCount = 1\r\n" -"SizingMargins = 0, 0, 0, 0\r\n" -"ImageFile = blue_listview_column_detail.bmp\r\n" - "\r\n; Menu\r\n" "[Menu]\r\n" "BgType = None\r\n" @@ -3502,19 +3306,6 @@ BLUE_LISTVIEW_GROUP_HEADER_OPEN_SELECTED_HOT_BMP BITMAP "blue_listview_group_hea /* @makedep: blue_listview_group_header_open_selected_not_focused_hot.bmp */ BLUE_LISTVIEW_GROUP_HEADER_OPEN_SELECTED_NOT_FOCUSED_HOT_BMP BITMAP "blue_listview_group_header_open_selected_not_focused_hot.bmp"
-/* Explorer::ListView */ -/* @makedep: blue_explorer_listview_item_hot.bmp */ -BLUE_EXPLORER_LISTVIEW_ITEM_HOT_BMP BITMAP "blue_explorer_listview_item_hot.bmp" - -/* @makedep: blue_explorer_listview_item_hot_selected.bmp */ -BLUE_EXPLORER_LISTVIEW_ITEM_HOT_SELECTED_BMP BITMAP "blue_explorer_listview_item_hot_selected.bmp" - -/* @makedep: blue_explorer_listview_item_selected.bmp */ -BLUE_EXPLORER_LISTVIEW_ITEM_SELECTED_BMP BITMAP "blue_explorer_listview_item_selected.bmp" - -/* @makedep: blue_explorer_listview_item_selected_not_focus.bmp */ -BLUE_EXPLORER_LISTVIEW_ITEM_SELECTED_NOT_FOCUS_BMP BITMAP "blue_explorer_listview_item_selected_not_focus.bmp" - /* Menu */ /* @makedep: blue_menu_bar_background.bmp */ BLUE_MENU_BAR_BACKGROUND_BMP BITMAP "blue_menu_bar_background.bmp" diff --git a/dlls/mf/tests/transform.c b/dlls/mf/tests/transform.c index b02c69b357e..3e902aa67f3 100644 --- a/dlls/mf/tests/transform.c +++ b/dlls/mf/tests/transform.c @@ -9725,8 +9725,6 @@ failed:
START_TEST(transform) { - winetest_mute_threshold = 1; - init_functions();
test_sample_copier(); diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c index 28858339d08..0defc5a22e2 100644 --- a/dlls/mfreadwrite/reader.c +++ b/dlls/mfreadwrite/reader.c @@ -967,22 +967,6 @@ static HRESULT source_reader_flush_transform_samples(struct source_reader *reade return next ? source_reader_flush_transform_samples(reader, stream, next) : S_OK; }
-static HRESULT source_reader_notify_transform(struct source_reader *reader, struct media_stream *stream, - struct transform_entry *entry, UINT message) -{ - struct transform_entry *next = NULL; - struct list *ptr; - HRESULT hr; - - if ((ptr = list_next(&stream->transforms, &entry->entry))) - next = LIST_ENTRY(ptr, struct transform_entry, entry); - - if (FAILED(hr = IMFTransform_ProcessMessage(entry->transform, message, 0))) - WARN("Failed to notify transform %p message %#x, hr %#lx\n", entry->transform, message, hr); - - return next ? source_reader_notify_transform(reader, stream, next, message) : S_OK; -} - static HRESULT source_reader_process_sample(struct source_reader *reader, struct media_stream *stream, IMFSample *sample) { @@ -1056,7 +1040,6 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re MediaEventType event_type; LONGLONG timestamp; PROPVARIANT value; - struct list *ptr; unsigned int i; HRESULT hr; DWORD id; @@ -1080,6 +1063,9 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re switch (event_type) { case MEEndOfStream: + { + struct list *ptr; + stream->state = STREAM_STATE_EOS; stream->flags &= ~STREAM_FLAG_SAMPLE_REQUESTED;
@@ -1094,16 +1080,10 @@ static HRESULT source_reader_media_stream_state_handler(struct source_reader *re source_reader_queue_response(reader, stream, S_OK, MF_SOURCE_READERF_ENDOFSTREAM, 0, NULL);
break; + } case MEStreamSeeked: case MEStreamStarted: stream->state = STREAM_STATE_READY; - - if ((ptr = list_head(&stream->transforms))) - { - struct transform_entry *entry = LIST_ENTRY(ptr, struct transform_entry, entry); - if (FAILED(hr = source_reader_notify_transform(reader, stream, entry, MFT_MESSAGE_NOTIFY_START_OF_STREAM))) - WARN("Failed to notify transforms of stream start, hr %#lx.\n", hr); - } break; case MEStreamStopped: stream->flags |= STREAM_FLAG_STOPPED; diff --git a/dlls/msado15/recordset.c b/dlls/msado15/recordset.c index dd8e15cbe86..b288f4c547c 100644 --- a/dlls/msado15/recordset.c +++ b/dlls/msado15/recordset.c @@ -1621,7 +1621,7 @@ static HRESULT WINAPI recordset_CancelUpdate( _Recordset *iface ) return S_OK;
recordset->editmode = adEditNone; - return S_OK; + return E_NOTIMPL; }
static HRESULT WINAPI recordset_Close( _Recordset *iface ) @@ -2361,8 +2361,7 @@ static HRESULT WINAPI recordset_NextRecordset( _Recordset *iface, VARIANT *recor static HRESULT WINAPI recordset_Supports( _Recordset *iface, CursorOptionEnum cursor_options, VARIANT_BOOL *ret ) { FIXME( "%p, %08x, %p\n", iface, cursor_options, ret ); - *ret = VARIANT_TRUE; - return S_OK; + return E_NOTIMPL; }
static HRESULT WINAPI recordset_get_Collect( _Recordset *iface, VARIANT index, VARIANT *var ) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 54e54cfdc96..7b334ac3001 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -999,7 +999,7 @@ static HRESULT function_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPPAR return hres; }
-static HRESULT function_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT function_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { DWORD i;
@@ -1173,7 +1173,7 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re return DISP_E_MEMBERNOTFOUND; }
-static HRESULT get_builtin_id(DispatchEx *This, const WCHAR *name, DWORD grfdex, DISPID *ret) +static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret) { int min, max, n, c; HRESULT hres; @@ -1877,49 +1877,44 @@ static HRESULT WINAPI DispatchEx_Invoke(IWineJSDispatchHost *iface, DISPID dispI pVarResult, pExcepInfo, NULL); }
-HRESULT dispex_get_id(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *pid) +static HRESULT WINAPI DispatchEx_GetDispID(IWineJSDispatchHost *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); dynamic_prop_t *dprop = NULL; HRESULT hres;
- hres = get_builtin_id(dispex, name, flags, pid); + TRACE("%s (%p)->(%s %lx %p)\n", This->info->desc->name, This, debugstr_w(bstrName), grfdex, pid); + + if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) + FIXME("Unsupported grfdex %lx\n", grfdex); + + if(!ensure_real_info(This)) + return E_OUTOFMEMORY; + if(This->jsdisp) + return IWineJSDispatch_GetDispID(This->jsdisp, bstrName, grfdex, pid); + + hres = get_builtin_id(This, bstrName, grfdex, pid); if(hres != DISP_E_UNKNOWNNAME) return hres;
- hres = get_dynamic_prop(dispex, name, flags & ~fdexNameEnsure, &dprop); + hres = get_dynamic_prop(This, bstrName, grfdex & ~fdexNameEnsure, &dprop); if(FAILED(hres)) { - if(dispex->info->desc->vtbl->find_dispid) { - hres = dispex->info->desc->vtbl->find_dispid(dispex, name, flags, pid); + if(This->info->desc->vtbl->find_dispid) { + hres = This->info->desc->vtbl->find_dispid(This, bstrName, grfdex, pid); if(SUCCEEDED(hres)) return hres; } - if(flags & fdexNameEnsure) - hres = alloc_dynamic_prop(dispex, name, dprop, &dprop); + if(grfdex & fdexNameEnsure) + hres = alloc_dynamic_prop(This, bstrName, dprop, &dprop); if(FAILED(hres)) return hres; }
- *pid = DISPID_DYNPROP_0 + (dprop - dispex->dynamic_data->props); + *pid = DISPID_DYNPROP_0 + (dprop - This->dynamic_data->props); return S_OK; }
-static HRESULT WINAPI DispatchEx_GetDispID(IWineJSDispatchHost *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) -{ - DispatchEx *This = impl_from_IWineJSDispatchHost(iface); - - TRACE("%s (%p)->(%s %lx %p)\n", This->info->desc->name, This, debugstr_w(bstrName), grfdex, pid); - - if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) - FIXME("Unsupported grfdex %lx\n", grfdex); - - if(!ensure_real_info(This)) - return E_OUTOFMEMORY; - if(This->jsdisp) - return IWineJSDispatch_GetDispID(This->jsdisp, bstrName, grfdex, pid); - return dispex_get_id(This, bstrName, grfdex, pid); -} - -HRESULT dispex_prop_get(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *r, EXCEPINFO *ei, IServiceProvider *caller) +static HRESULT dispex_prop_get(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *r, EXCEPINFO *ei, IServiceProvider *caller) { switch(get_dispid_type(id)) { case DISPEXPROP_CUSTOM: { @@ -1955,7 +1950,7 @@ HRESULT dispex_prop_get(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *r, EX } }
-HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller) +static HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, IServiceProvider *caller) { static DISPID propput_dispid = DISPID_PROPERTYPUT;
@@ -2163,46 +2158,46 @@ static HRESULT WINAPI DispatchEx_GetMemberProperties(IWineJSDispatchHost *iface, return E_NOTIMPL; }
-HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret) +static HRESULT WINAPI DispatchEx_GetMemberName(IWineJSDispatchHost *iface, DISPID id, BSTR *pbstrName) { + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); func_info_t *func; HRESULT hres;
+ TRACE("%s (%p)->(%lx %p)\n", This->info->desc->name, This, id, pbstrName); + + if(!ensure_real_info(This)) + return E_OUTOFMEMORY; + if(This->jsdisp) + return IWineJSDispatch_GetMemberName(This->jsdisp, id, pbstrName); + if(is_custom_dispid(id)) { - if(dispex->info->desc->vtbl->get_name) - return dispex->info->desc->vtbl->get_name(dispex, id, ret); + if(This->info->desc->vtbl->get_name) + return This->info->desc->vtbl->get_name(This, id, pbstrName); return DISP_E_MEMBERNOTFOUND; }
if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0;
- if(!get_dynamic_data(dispex) || dispex->dynamic_data->prop_cnt <= idx) + if(!get_dynamic_data(This) || This->dynamic_data->prop_cnt <= idx) return DISP_E_MEMBERNOTFOUND;
- *ret = SysAllocString(dispex->dynamic_data->props[idx].name); - return *ret ? S_OK : E_OUTOFMEMORY; + *pbstrName = SysAllocString(This->dynamic_data->props[idx].name); + if(!*pbstrName) + return E_OUTOFMEMORY; + + return S_OK; }
- hres = get_builtin_func(dispex->info, id, &func); + hres = get_builtin_func(This->info, id, &func); if(FAILED(hres)) return hres;
- *ret = SysAllocString(func->name); - return *ret ? S_OK : E_OUTOFMEMORY; -} - -static HRESULT WINAPI DispatchEx_GetMemberName(IWineJSDispatchHost *iface, DISPID id, BSTR *pbstrName) -{ - DispatchEx *This = impl_from_IWineJSDispatchHost(iface); - - TRACE("%s (%p)->(%lx %p)\n", This->info->desc->name, This, id, pbstrName); - - if(!ensure_real_info(This)) + *pbstrName = SysAllocString(func->name); + if(!*pbstrName) return E_OUTOFMEMORY; - if(This->jsdisp) - return IWineJSDispatch_GetMemberName(This->jsdisp, id, pbstrName); - return dispex_prop_name(This, id, pbstrName); + return S_OK; }
static HRESULT next_dynamic_id(DispatchEx *dispex, DWORD idx, DISPID *ret_id) @@ -2220,33 +2215,41 @@ static HRESULT next_dynamic_id(DispatchEx *dispex, DWORD idx, DISPID *ret_id) return S_OK; }
-HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret) +static HRESULT WINAPI DispatchEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD grfdex, DISPID id, DISPID *pid) { + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); func_info_t *func; HRESULT hres;
+ TRACE("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, grfdex, id, pid); + + if(!ensure_real_info(This)) + return E_OUTOFMEMORY; + if(This->jsdisp) + return IWineJSDispatch_GetNextDispID(This->jsdisp, grfdex, id, pid); + if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0;
- if(!get_dynamic_data(dispex) || dispex->dynamic_data->prop_cnt <= idx) + if(!get_dynamic_data(This) || This->dynamic_data->prop_cnt <= idx) return DISP_E_MEMBERNOTFOUND;
- return next_dynamic_id(dispex, idx+1, ret); + return next_dynamic_id(This, idx+1, pid); }
if(!is_custom_dispid(id)) { if(id == DISPID_STARTENUM) { - func = dispex->info->funcs; + func = This->info->funcs; }else { - hres = get_builtin_func(dispex->info, id, &func); + hres = get_builtin_func(This->info, id, &func); if(FAILED(hres)) return hres; func++; }
- while(func < dispex->info->funcs + dispex->info->func_cnt) { + while(func < This->info->funcs + This->info->func_cnt) { if(func->func_disp_idx == -1) { - *ret = func->id; + *pid = func->id; return S_OK; } func++; @@ -2255,32 +2258,19 @@ HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret) id = DISPID_STARTENUM; }
- if(dispex->info->desc->vtbl->next_dispid) { - hres = dispex->info->desc->vtbl->next_dispid(dispex, id, ret); + if(This->info->desc->vtbl->next_dispid) { + hres = This->info->desc->vtbl->next_dispid(This, id, pid); if(hres != S_FALSE) return hres; }
- if(get_dynamic_data(dispex) && dispex->dynamic_data->prop_cnt) - return next_dynamic_id(dispex, 0, ret); + if(get_dynamic_data(This) && This->dynamic_data->prop_cnt) + return next_dynamic_id(This, 0, pid);
- *ret = DISPID_STARTENUM; + *pid = DISPID_STARTENUM; return S_FALSE; }
-static HRESULT WINAPI DispatchEx_GetNextDispID(IWineJSDispatchHost *iface, DWORD grfdex, DISPID id, DISPID *pid) -{ - DispatchEx *This = impl_from_IWineJSDispatchHost(iface); - - TRACE("%s (%p)->(%lx %lx %p)\n", This->info->desc->name, This, grfdex, id, pid); - - if(!ensure_real_info(This)) - return E_OUTOFMEMORY; - if(This->jsdisp) - return IWineJSDispatch_GetNextDispID(This->jsdisp, grfdex, id, pid); - return dispex_next_id(This, id, pid); -} - static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IWineJSDispatchHost *iface, IUnknown **ppunk) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface); @@ -2309,7 +2299,9 @@ static HRESULT WINAPI JSDispatchHost_LookupProperty(IWineJSDispatchHost *iface,
TRACE("%s (%p)->(%s)\n", This->info->desc->name, This, debugstr_w(name));
- hres = get_builtin_id(This, name, flags, &id); + /* FIXME: name cast works as long as the object doesn't require the actual BSTR for its custom + * properties, we will need to fix it properly. */ + hres = get_builtin_id(This, (BSTR)name, flags, &id); if(FAILED(hres)) return hres;
@@ -2581,11 +2573,3 @@ void init_dispatch(DispatchEx *dispex, dispex_static_data_t *data, HTMLInnerWind dispex->info = ensure_dispex_info(dispex, data, compat_mode, script_global); } } - -void init_dispatch_with_owner(DispatchEx *dispex, dispex_static_data_t *desc, DispatchEx *owner) -{ - HTMLInnerWindow *script_global = get_script_global(owner); - init_dispatch(dispex, desc, script_global, dispex_compat_mode(owner)); - if(script_global) - IHTMLWindow2_Release(&script_global->base.IHTMLWindow2_iface); -} diff --git a/dlls/mshtml/htmlattr.c b/dlls/mshtml/htmlattr.c index 31837f06284..b9d3f82e84c 100644 --- a/dlls/mshtml/htmlattr.c +++ b/dlls/mshtml/htmlattr.c @@ -55,13 +55,16 @@ static HRESULT WINAPI HTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute *iface, BS return *p ? S_OK : E_OUTOFMEMORY; }
- return dispex_prop_name(&This->elem->node.event_target.dispex, This->dispid, p); + return IWineJSDispatchHost_GetMemberName(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, This->dispid, p); }
static HRESULT WINAPI HTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute *iface, VARIANT v) { HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface); + DISPID dispidNamed = DISPID_PROPERTYPUT; + DISPPARAMS dp = {&v, &dispidNamed, 1, 1}; EXCEPINFO ei; + VARIANT ret;
TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
@@ -69,7 +72,9 @@ static HRESULT WINAPI HTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute *iface, V return VariantCopy(&This->value, &v);
memset(&ei, 0, sizeof(ei)); - return dispex_prop_put(&This->elem->node.event_target.dispex, This->dispid, LOCALE_SYSTEM_DEFAULT, &v, &ei, NULL); + + return IWineJSDispatchHost_InvokeEx(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, This->dispid, LOCALE_SYSTEM_DEFAULT, + DISPATCH_PROPERTYPUT, &dp, &ret, &ei, NULL); }
static HRESULT WINAPI HTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute *iface, VARIANT *p) @@ -105,7 +110,7 @@ static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, V return S_OK; }
- hres = dispex_prop_name(&This->elem->node.event_target.dispex, This->dispid, &name); + hres = IWineJSDispatchHost_GetMemberName(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, This->dispid, &name); if(FAILED(hres)) return hres;
@@ -417,8 +422,7 @@ HTMLDOMAttribute *unsafe_impl_from_IHTMLDOMAttribute(IHTMLDOMAttribute *iface) return iface->lpVtbl == &HTMLDOMAttributeVtbl ? impl_from_IHTMLDOMAttribute(iface) : NULL; }
-HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dispid, - HTMLDocumentNode *doc, HTMLDOMAttribute **attr) +HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dispid, compat_mode_t compat_mode, HTMLDOMAttribute **attr) { HTMLAttributeCollection *col; HTMLDOMAttribute *ret; @@ -433,8 +437,7 @@ HRESULT HTMLDOMAttribute_Create(const WCHAR *name, HTMLElement *elem, DISPID dis ret->dispid = dispid; ret->elem = elem;
- init_dispatch(&ret->dispex, &HTMLDOMAttribute_dispex, doc->script_global, - dispex_compat_mode(&doc->script_global->event_target.dispex)); + init_dispatch(&ret->dispex, &HTMLDOMAttribute_dispex, NULL, compat_mode);
/* For attributes attached to an element, (elem,dispid) pair should be valid used for its operation. */ if(elem) { diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 6fe1516a720..e761356e05e 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -2819,7 +2819,8 @@ static HRESULT WINAPI HTMLDocument4_get_namespaces(IHTMLDocument4 *iface, IDispa if(!This->namespaces) { HRESULT hres;
- hres = create_namespace_collection(This, &This->namespaces); + hres = create_namespace_collection(dispex_compat_mode(&This->node.event_target.dispex), + &This->namespaces); if(FAILED(hres)) return hres; } @@ -2863,7 +2864,7 @@ static HRESULT WINAPI HTMLDocument4_createEventObject(IHTMLDocument4 *iface, return E_NOTIMPL; }
- return create_event_obj(NULL, This, ppEventObj); + return create_event_obj(NULL, dispex_compat_mode(&This->node.event_target.dispex), ppEventObj); }
static HRESULT WINAPI HTMLDocument4_fireEvent(IHTMLDocument4 *iface, BSTR bstrEventName, @@ -3014,7 +3015,7 @@ static HRESULT WINAPI HTMLDocument5_createAttribute(IHTMLDocument5 *iface, BSTR
TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrattrName), ppattribute);
- hres = HTMLDOMAttribute_Create(bstrattrName, NULL, 0, This, &attr); + hres = HTMLDOMAttribute_Create(bstrattrName, NULL, 0, dispex_compat_mode(&This->node.event_target.dispex), &attr); if(FAILED(hres)) return hres;
@@ -5128,7 +5129,7 @@ static HRESULT WINAPI DocumentRange_createRange(IDocumentRange *iface, IHTMLDOMR if(NS_FAILED(nsIDOMDocument_CreateRange(This->dom_document, &nsrange))) return E_FAIL;
- hres = create_dom_range(nsrange, This, p); + hres = create_dom_range(nsrange, dispex_compat_mode(&This->node.event_target.dispex), p); nsIDOMRange_Release(nsrange); return hres; } @@ -5336,10 +5337,6 @@ static void HTMLDocumentNode_unlink(DispatchEx *dispex) HTMLInnerWindow *window = This->window; HTMLDOMNode_unlink(dispex);
- if(This->script_global) { - list_remove(&This->script_global_entry); - This->script_global = NULL; - } if(window) { This->window = NULL; IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); @@ -5375,7 +5372,7 @@ static HRESULT HTMLDocumentNode_get_name(DispatchEx *dispex, DISPID id, BSTR *na return (*name = SysAllocString(This->elem_vars[idx])) ? S_OK : E_OUTOFMEMORY; }
-static HRESULT HTMLDocumentNode_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLDocumentNode_get_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLDocumentNode *This = impl_from_DispatchEx(dispex); HRESULT hres = DISP_E_UNKNOWNNAME; @@ -5389,7 +5386,7 @@ static HRESULT HTMLDocumentNode_get_dispid(DispatchEx *dispex, const WCHAR *name return hres; }
-static HRESULT HTMLDocumentNode_find_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLDocumentNode_find_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLDocumentNode *This = impl_from_DispatchEx(dispex); HRESULT hres = DISP_E_UNKNOWNNAME; @@ -5712,7 +5709,7 @@ static dispex_static_data_t HTMLDocumentNode_dispex = { HTMLDocumentNode_init_dispex_info };
-static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindow *window, HTMLInnerWindow *script_global) +static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindow *window) { HTMLDocumentNode *doc;
@@ -5741,11 +5738,6 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindo if(window) IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
- if(script_global) { - doc->script_global = script_global; - list_add_tail(&script_global->documents, &doc->script_global_entry); - } - ConnectionPointContainer_Init(&doc->cp_container, (IUnknown*)&doc->IHTMLDocument2_iface, HTMLDocumentNode_cpc); HTMLDocumentNode_Persist_Init(doc); HTMLDocumentNode_Service_Init(doc); @@ -5761,12 +5753,12 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindo }
HRESULT create_document_node(nsIDOMDocument *nsdoc, GeckoBrowser *browser, HTMLInnerWindow *window, - HTMLInnerWindow *script_global, compat_mode_t parent_mode, HTMLDocumentNode **ret) + compat_mode_t parent_mode, HTMLDocumentNode **ret) { HTMLDocumentObj *doc_obj = browser->doc; HTMLDocumentNode *doc;
- doc = alloc_doc_node(doc_obj, window, script_global); + doc = alloc_doc_node(doc_obj, window); if(!doc) return E_OUTOFMEMORY;
@@ -5817,7 +5809,7 @@ static HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *do { HTMLDocumentNode *doc_frag;
- doc_frag = alloc_doc_node(doc_node->doc_obj, doc_node->window, doc_node->script_global); + doc_frag = alloc_doc_node(doc_node->doc_obj, doc_node->window); if(!doc_frag) return E_OUTOFMEMORY;
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 3e45ab5cb0e..581b50ee822 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -1052,12 +1052,12 @@ static void HTMLRectCollection_destructor(DispatchEx *dispex) free(This); }
-static HRESULT HTMLRectCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLRectCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex); - const WCHAR *ptr; UINT32 len = 0; DWORD idx = 0; + WCHAR *ptr;
for(ptr = name; *ptr && is_digit(*ptr); ptr++) idx = idx*10 + (*ptr-'0'); @@ -1149,15 +1149,20 @@ static dispex_static_data_t HTMLRectCollection_dispex = { DISPEX_IDISPATCH_IMPL(HTMLElement, IHTMLElement, impl_from_IHTMLElement(iface)->node.event_target.dispex)
-static inline const WCHAR *translate_attr_name(const WCHAR *attr_name, compat_mode_t compat_mode) +static inline WCHAR *translate_attr_name(WCHAR *attr_name, compat_mode_t compat_mode) { + static WCHAR classNameW[] = L"className"; + WCHAR *ret = attr_name; + if(compat_mode >= COMPAT_MODE_IE8 && !wcsicmp(attr_name, L"class")) - return L"className"; - return attr_name; + ret = classNameW; + return ret; }
static HRESULT set_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, VARIANT *v) { + DISPID propput_dispid = DISPID_PROPERTYPUT; + DISPPARAMS dp = {v, &propput_dispid, 1, 1}; EXCEPINFO ei;
if(dispid == DISPID_IHTMLELEMENT_STYLE) { @@ -1165,7 +1170,8 @@ static HRESULT set_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, V return S_OK; }
- return dispex_prop_put(&elem->node.event_target.dispex, dispid, LOCALE_SYSTEM_DEFAULT, v, &ei, NULL); + return IWineJSDispatchHost_InvokeEx(&elem->node.event_target.dispex.IWineJSDispatchHost_iface, dispid, + LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); }
static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttributeName, @@ -1183,7 +1189,7 @@ static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttr TRACE("(%p)->(%s %s %08lx)\n", This, debugstr_w(strAttributeName), debugstr_variant(&AttributeValue), lFlags);
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) { - hres = dispex_get_id(&This->node.event_target.dispex, translate_attr_name(strAttributeName, compat_mode), + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, translate_attr_name(strAttributeName, compat_mode), (lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive) | fdexNameEnsure, &dispid); if(FAILED(hres)) return hres; @@ -1232,8 +1238,11 @@ done:
HRESULT get_elem_attr_value_by_dispid(HTMLElement *elem, DISPID dispid, VARIANT *ret) { + DISPPARAMS dispParams = {NULL, NULL, 0, 0}; EXCEPINFO excep; - return dispex_prop_get(&elem->node.event_target.dispex, dispid, LOCALE_SYSTEM_DEFAULT, ret, &excep, NULL); + + return IWineJSDispatchHost_InvokeEx(&elem->node.event_target.dispex.IWineJSDispatchHost_iface, dispid, LOCALE_SYSTEM_DEFAULT, + DISPATCH_PROPERTYGET, &dispParams, ret, &excep, NULL); }
HRESULT attr_value_to_string(VARIANT *v) @@ -1279,8 +1288,8 @@ static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttr FIXME("Unsupported flags %lx\n", lFlags);
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) { - hres = dispex_get_id(&This->node.event_target.dispex, translate_attr_name(strAttributeName, compat_mode), - lFlags & ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid); + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, translate_attr_name(strAttributeName, compat_mode), + lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &dispid); if(FAILED(hres)) { V_VT(AttributeValue) = VT_NULL; return (hres == DISP_E_UNKNOWNNAME) ? S_OK : hres; @@ -1327,8 +1336,8 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA TRACE("(%p)->(%s %lx %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
if(compat_mode < COMPAT_MODE_IE9 || !This->dom_element) { - hres = dispex_get_id(&This->node.event_target.dispex, translate_attr_name(strAttributeName, compat_mode), - lFlags & ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &id); + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, translate_attr_name(strAttributeName, compat_mode), + lFlags&ATTRFLAG_CASESENSITIVE ? fdexNameCaseSensitive : fdexNameCaseInsensitive, &id); if(hres == DISP_E_UNKNOWNNAME) { *pfSuccess = VARIANT_FALSE; return S_OK; @@ -2474,7 +2483,8 @@ static HRESULT WINAPI HTMLElement_toString(IHTMLElement *iface, BSTR *String) if(!String) return E_INVALIDARG;
- hres = dispex_prop_get(&This->node.event_target.dispex, DISPID_VALUE, LOCALE_SYSTEM_DEFAULT, &var, NULL, NULL); + hres = IWineJSDispatchHost_InvokeEx(&This->node.event_target.dispex.IWineJSDispatchHost_iface, DISPID_VALUE, + LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, NULL, &var, NULL, NULL); if(SUCCEEDED(hres)) { assert(V_VT(&var) == VT_BSTR); *String = V_BSTR(&var); @@ -4420,7 +4430,8 @@ static HRESULT WINAPI HTMLElement4_setAttributeNode(IHTMLElement4 *iface, IHTMLD return E_INVALIDARG; }
- hres = dispex_get_id(&This->node.event_target.dispex, attr->name, fdexNameCaseInsensitive | fdexNameEnsure, &dispid); + hres = IWineJSDispatchHost_GetDispID(&This->node.event_target.dispex.IWineJSDispatchHost_iface, + attr->name, fdexNameCaseInsensitive|fdexNameEnsure, &dispid); if(FAILED(hres)) return hres;
@@ -6389,7 +6400,7 @@ HRESULT HTMLElement_populate_props(DispatchEx *dispex) continue; }
- hres = dispex_get_id(dispex, name, fdexNameCaseInsensitive, &id); + hres = IWineJSDispatchHost_GetDispID(&dispex->IWineJSDispatchHost_iface, name, fdexNameCaseInsensitive, &id); if(hres != DISP_E_UNKNOWNNAME) { nsIDOMAttr_Release(attr); SysFreeString(name); @@ -7082,7 +7093,7 @@ static HRESULT token_list_value(DispatchEx *dispex, LCID lcid, WORD flags, DISPP return S_OK; }
-static HRESULT token_list_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT token_list_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { WCHAR *end; LONG idx; @@ -7460,9 +7471,9 @@ static void HTMLFiltersCollection_destructor(DispatchEx *dispex) free(This); }
-static HRESULT HTMLFiltersCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLFiltersCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { - const WCHAR *ptr; + WCHAR *ptr; int idx = 0;
for(ptr = name; *ptr && is_digit(*ptr); ptr++) @@ -7534,6 +7545,7 @@ static HRESULT create_filters_collection(compat_mode_t compat_mode, IHTMLFilters
static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LONG *idx, DISPID start, DISPID *dispid) { + IWineJSDispatchHost *dispex = &This->elem->node.event_target.dispex.IWineJSDispatchHost_iface; DISPID id = start; LONG len = -1; HRESULT hres; @@ -7541,7 +7553,7 @@ static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LO FIXME("filter non-enumerable attributes out\n");
while(1) { - hres = dispex_next_id(&This->elem->node.event_target.dispex, id, &id); + hres = IWineJSDispatchHost_GetNextDispID(dispex, fdexEnumAll, id, &id); if(FAILED(hres)) return hres; else if(hres == S_FALSE) @@ -7566,7 +7578,7 @@ static HRESULT get_attr_dispid_by_idx(HTMLAttributeCollection *This, LONG *idx, return get_attr_dispid_by_relative_idx(This, idx, DISPID_STARTENUM, dispid); }
-static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, const WCHAR *name, DISPID *id) +static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, BSTR name, DISPID *id) { HRESULT hres;
@@ -7582,7 +7594,9 @@ static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, con } }
- return dispex_get_id(&This->elem->node.event_target.dispex, name, fdexNameCaseInsensitive, id); + hres = IWineJSDispatchHost_GetDispID(&This->elem->node.event_target.dispex.IWineJSDispatchHost_iface, + name, fdexNameCaseInsensitive, id); + return hres; }
static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG *list_pos, HTMLDOMAttribute **attr) @@ -7601,7 +7615,7 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG }
if(!*attr) { - hres = HTMLDOMAttribute_Create(NULL, This->elem, id, This->elem->node.doc, attr); + hres = HTMLDOMAttribute_Create(NULL, This->elem, id, dispex_compat_mode(&This->elem->node.event_target.dispex), attr); if(FAILED(hres)) return hres; } @@ -8046,7 +8060,7 @@ static void HTMLAttributeCollection_destructor(DispatchEx *dispex) free(This); }
-static HRESULT HTMLAttributeCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLAttributeCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLAttributeCollection *This = HTMLAttributeCollection_from_DispatchEx(dispex); HTMLDOMAttribute *attr; diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index a264813f9bb..92ea4584aa4 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -506,10 +506,10 @@ static void HTMLElementCollection_destructor(DispatchEx *dispex)
#define DISPID_ELEMCOL_0 MSHTML_DISPID_CUSTOM_MIN
-static HRESULT HTMLElementCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLElementCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLElementCollection *This = impl_from_DispatchEx(dispex); - const WCHAR *ptr; + WCHAR *ptr; DWORD idx=0;
if(!*name) diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 6489c557def..29bf94b9eea 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -1815,7 +1815,7 @@ static dispex_static_data_t HTMLEventObj_dispex = { HTMLEventObj_iface_tids };
-static HTMLEventObj *alloc_event_obj(DOMEvent *event, HTMLInnerWindow *script_global) +static HTMLEventObj *alloc_event_obj(DOMEvent *event, compat_mode_t compat_mode) { HTMLEventObj *event_obj;
@@ -1830,21 +1830,18 @@ static HTMLEventObj *alloc_event_obj(DOMEvent *event, HTMLInnerWindow *script_gl event_obj->IHTMLEventObj5_iface.lpVtbl = &HTMLEventObj5Vtbl; event_obj->IHTMLEventObj6_iface.lpVtbl = &HTMLEventObj6Vtbl; event_obj->event = event; - if(event) { + if(event) IDOMEvent_AddRef(&event->IDOMEvent_iface); - init_dispatch_with_owner(&event_obj->dispex, &HTMLEventObj_dispex, &event->dispex); - }else { - init_dispatch(&event_obj->dispex, &HTMLEventObj_dispex, script_global, - dispex_compat_mode(&script_global->event_target.dispex)); - } + + init_dispatch(&event_obj->dispex, &HTMLEventObj_dispex, NULL, compat_mode); return event_obj; }
-HRESULT create_event_obj(DOMEvent *event, HTMLDocumentNode *doc, IHTMLEventObj **ret) +HRESULT create_event_obj(DOMEvent *event, compat_mode_t compat_mode, IHTMLEventObj **ret) { HTMLEventObj *event_obj;
- event_obj = alloc_event_obj(event, doc->script_global); + event_obj = alloc_event_obj(event, compat_mode); if(!event_obj) return E_OUTOFMEMORY;
@@ -3743,7 +3740,7 @@ static dispex_static_data_t DOMStorageEvent_dispex = { };
static void *event_ctor(unsigned size, dispex_static_data_t *dispex_data, nsIDOMEvent *nsevent, eventid_t event_id, - HTMLInnerWindow *script_global, compat_mode_t compat_mode) + compat_mode_t compat_mode) { DOMEvent *event = calloc(1, size);
@@ -3764,7 +3761,7 @@ static void *event_ctor(unsigned size, dispex_static_data_t *dispex_data, nsIDOM
event->time_stamp = get_time_stamp();
- init_dispatch(&event->dispex, dispex_data, script_global, compat_mode); + init_dispatch(&event->dispex, dispex_data, NULL, compat_mode); return event; }
@@ -3774,26 +3771,23 @@ static void fill_parent_ui_event(nsIDOMEvent *nsevent, DOMUIEvent *ui_event) nsIDOMEvent_QueryInterface(nsevent, &IID_nsIDOMUIEvent, (void**)&ui_event->nsevent); }
-static DOMEvent *generic_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *generic_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - return event_ctor(sizeof(DOMEvent), &DOMEvent_dispex, nsevent, event_id, script_global, compat_mode); + return event_ctor(sizeof(DOMEvent), &DOMEvent_dispex, nsevent, event_id, compat_mode); }
-static DOMEvent *ui_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *ui_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMUIEvent *ui_event = event_ctor(sizeof(DOMUIEvent), &DOMUIEvent_dispex, nsevent, event_id, script_global, compat_mode); + DOMUIEvent *ui_event = event_ctor(sizeof(DOMUIEvent), &DOMUIEvent_dispex, nsevent, event_id, compat_mode); if(!ui_event) return NULL; ui_event->IDOMUIEvent_iface.lpVtbl = &DOMUIEventVtbl; ui_event->nsevent = iface; return &ui_event->event; }
-static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMMouseEvent *mouse_event = event_ctor(sizeof(DOMMouseEvent), &DOMMouseEvent_dispex, nsevent, event_id, script_global, compat_mode); + DOMMouseEvent *mouse_event = event_ctor(sizeof(DOMMouseEvent), &DOMMouseEvent_dispex, nsevent, event_id, compat_mode); if(!mouse_event) return NULL; mouse_event->IDOMMouseEvent_iface.lpVtbl = &DOMMouseEventVtbl; mouse_event->nsevent = iface; @@ -3801,11 +3795,9 @@ static DOMEvent *mouse_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t e return &mouse_event->ui_event.event; }
-static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMKeyboardEvent *keyboard_event = event_ctor(sizeof(DOMKeyboardEvent), &DOMKeyboardEvent_dispex, nsevent, event_id, script_global, - compat_mode); + DOMKeyboardEvent *keyboard_event = event_ctor(sizeof(DOMKeyboardEvent), &DOMKeyboardEvent_dispex, nsevent, event_id, compat_mode); if(!keyboard_event) return NULL; keyboard_event->IDOMKeyboardEvent_iface.lpVtbl = &DOMKeyboardEventVtbl; keyboard_event->nsevent = iface; @@ -3813,54 +3805,45 @@ static DOMEvent *keyboard_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_ return &keyboard_event->ui_event.event; }
-static DOMEvent *page_transition_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *page_transition_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMPageTransitionEvent *page_transition_event = event_ctor(sizeof(DOMCustomEvent), &DOMPageTransitionEvent_dispex, nsevent, event_id, - script_global, compat_mode); + DOMPageTransitionEvent *page_transition_event = event_ctor(sizeof(DOMCustomEvent), &DOMPageTransitionEvent_dispex, nsevent, event_id, compat_mode); if(!page_transition_event) return NULL; page_transition_event->IWinePageTransitionEvent_iface.lpVtbl = &DOMPageTransitionEventVtbl; return &page_transition_event->event; }
-static DOMEvent *custom_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *custom_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMCustomEvent *custom_event = event_ctor(sizeof(DOMCustomEvent), &DOMCustomEvent_dispex, nsevent, event_id, script_global, - compat_mode); + DOMCustomEvent *custom_event = event_ctor(sizeof(DOMCustomEvent), &DOMCustomEvent_dispex, nsevent, event_id, compat_mode); if(!custom_event) return NULL; custom_event->IDOMCustomEvent_iface.lpVtbl = &DOMCustomEventVtbl; nsIDOMCustomEvent_Release(iface); return &custom_event->event; }
-static DOMEvent *progress_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *progress_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { DOMProgressEvent *progress_event;
- if(!(progress_event = event_ctor(sizeof(DOMProgressEvent), &DOMProgressEvent_dispex, nsevent, event_id, script_global, compat_mode))) + if(!(progress_event = event_ctor(sizeof(DOMProgressEvent), &DOMProgressEvent_dispex, nsevent, event_id, compat_mode))) return NULL; progress_event->IDOMProgressEvent_iface.lpVtbl = &DOMProgressEventVtbl; progress_event->nsevent = iface; return &progress_event->event; }
-static DOMEvent *message_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *message_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMMessageEvent *message_event = event_ctor(sizeof(DOMMessageEvent), &DOMMessageEvent_dispex, nsevent, event_id, script_global, - compat_mode); + DOMMessageEvent *message_event = event_ctor(sizeof(DOMMessageEvent), &DOMMessageEvent_dispex, nsevent, event_id, compat_mode); if(!message_event) return NULL; message_event->IDOMMessageEvent_iface.lpVtbl = &DOMMessageEventVtbl; return &message_event->event; }
-static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, HTMLInnerWindow *script_global, - compat_mode_t compat_mode) +static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t event_id, compat_mode_t compat_mode) { - DOMStorageEvent *storage_event = event_ctor(sizeof(DOMStorageEvent), &DOMStorageEvent_dispex, nsevent, event_id, script_global, - compat_mode); + DOMStorageEvent *storage_event = event_ctor(sizeof(DOMStorageEvent), &DOMStorageEvent_dispex, nsevent, event_id, compat_mode); if(!storage_event) return NULL; storage_event->IDOMStorageEvent_iface.lpVtbl = &DOMStorageEventVtbl; return &storage_event->event; @@ -3868,7 +3851,7 @@ static DOMEvent *storage_event_ctor(void *iface, nsIDOMEvent *nsevent, eventid_t
static const struct { REFIID iid; - DOMEvent *(*ctor)(void *iface, nsIDOMEvent *nsevent, eventid_t, HTMLInnerWindow *sceript_global, compat_mode_t compat_mode); + DOMEvent *(*ctor)(void *iface, nsIDOMEvent *nsevent, eventid_t, compat_mode_t); compat_mode_t min_compat_mode; } event_types_ctor_table[] = { [EVENT_TYPE_EVENT] = { NULL, generic_event_ctor }, @@ -3885,7 +3868,7 @@ static const struct { [EVENT_TYPE_STORAGE] = { NULL, storage_event_ctor }, };
-static DOMEvent *alloc_event(nsIDOMEvent *nsevent, HTMLInnerWindow *script_global, compat_mode_t compat_mode, event_type_t event_type, +static DOMEvent *alloc_event(nsIDOMEvent *nsevent, compat_mode_t compat_mode, event_type_t event_type, eventid_t event_id) { void *iface = NULL; @@ -3898,12 +3881,12 @@ static DOMEvent *alloc_event(nsIDOMEvent *nsevent, HTMLInnerWindow *script_globa nsIDOMEvent_QueryInterface(nsevent, event_types_ctor_table[event_type].iid, &iface);
/* Transfer the iface ownership to the ctor on success */ - if(!(event = event_types_ctor_table[event_type].ctor(iface, nsevent, event_id, script_global, compat_mode)) && iface) + if(!(event = event_types_ctor_table[event_type].ctor(iface, nsevent, event_id, compat_mode)) && iface) nsISupports_Release(iface); return event; }
-HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, HTMLInnerWindow *script_global, compat_mode_t compat_mode, DOMEvent **ret_event) +HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, compat_mode_t compat_mode, DOMEvent **ret_event) { event_type_t event_type = EVENT_TYPE_EVENT; eventid_t event_id = EVENTID_LAST; @@ -3935,7 +3918,7 @@ HRESULT create_event_from_nsevent(nsIDOMEvent *nsevent, HTMLInnerWindow *script_ } }
- event = alloc_event(nsevent, script_global, compat_mode, event_type, event_id); + event = alloc_event(nsevent, compat_mode, event_type, event_id); if(!event) return E_OUTOFMEMORY;
@@ -3968,7 +3951,8 @@ HRESULT create_document_event_str(HTMLDocumentNode *doc, const WCHAR *type, IDOM } }
- event = alloc_event(nsevent, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), event_type, EVENTID_LAST); + event = alloc_event(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), + event_type, EVENTID_LAST); nsIDOMEvent_Release(nsevent); if(!event) return E_OUTOFMEMORY; @@ -3992,7 +3976,7 @@ HRESULT create_document_event(HTMLDocumentNode *doc, eventid_t event_id, DOMEven return E_FAIL; }
- event = alloc_event(nsevent, doc->script_global, doc->document_mode, event_info[event_id].type, event_id); + event = alloc_event(nsevent, doc->document_mode, event_info[event_id].type, event_id); nsIDOMEvent_Release(nsevent); if(!event) return E_OUTOFMEMORY; @@ -4427,7 +4411,7 @@ static HRESULT dispatch_event_object(EventTarget *event_target, DOMEvent *event, } while(iter);
if(!event->event_obj && !event->no_event_obj) { - event_obj_ref = alloc_event_obj(event, NULL); + event_obj_ref = alloc_event_obj(event, dispex_compat_mode(&event->dispex)); if(event_obj_ref) event->event_obj = &event_obj_ref->IHTMLEventObj_iface; } @@ -4559,7 +4543,7 @@ HRESULT fire_event(HTMLDOMNode *node, const WCHAR *event_name, VARIANT *event_va }
if(!event_obj) { - event_obj = alloc_event_obj(NULL, node->doc->script_global); + event_obj = alloc_event_obj(NULL, dispex_compat_mode(&node->event_target.dispex)); if(!event_obj) return E_OUTOFMEMORY; } @@ -5139,14 +5123,6 @@ void EventTarget_Init(EventTarget *event_target, dispex_static_data_t *dispex_da wine_rb_init(&event_target->handler_map, event_id_cmp); }
-void init_event_target(EventTarget *event_target, dispex_static_data_t *dispex_data, HTMLInnerWindow *script_global) -{ - compat_mode_t compat_mode = script_global && script_global->doc ? script_global->doc->document_mode : COMPAT_MODE_NONE; - init_dispatch(&event_target->dispex, dispex_data, script_global, compat_mode); - event_target->IEventTarget_iface.lpVtbl = &EventTargetVtbl; - wine_rb_init(&event_target->handler_map, event_id_cmp); -} - void traverse_event_target(EventTarget *event_target, nsCycleCollectionTraversalCallback *cb) { listener_container_t *iter; diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index cd099850771..333f8add57e 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -107,7 +107,7 @@ HRESULT fire_event(HTMLDOMNode*,const WCHAR*,VARIANT*,VARIANT_BOOL*); void update_doc_cp_events(HTMLDocumentNode*,cp_static_data_t*); HRESULT doc_init_events(HTMLDocumentNode*); void detach_events(HTMLDocumentNode *doc); -HRESULT create_event_obj(DOMEvent*,HTMLDocumentNode*,IHTMLEventObj**); +HRESULT create_event_obj(DOMEvent*,compat_mode_t,IHTMLEventObj**); void bind_target_event(HTMLDocumentNode*,EventTarget*,const WCHAR*,IDispatch*); HRESULT ensure_doc_nsevent_handler(HTMLDocumentNode*,nsIDOMNode*,eventid_t);
@@ -115,7 +115,7 @@ void dispatch_event(EventTarget*,DOMEvent*);
HRESULT create_document_event(HTMLDocumentNode*,eventid_t,DOMEvent**); HRESULT create_document_event_str(HTMLDocumentNode*,const WCHAR*,IDOMEvent**); -HRESULT create_event_from_nsevent(nsIDOMEvent*,HTMLInnerWindow*,compat_mode_t,DOMEvent**); +HRESULT create_event_from_nsevent(nsIDOMEvent*,compat_mode_t,DOMEvent**); HRESULT create_message_event(HTMLDocumentNode*,IHTMLWindow2*,VARIANT*,DOMEvent**); HRESULT create_storage_event(HTMLDocumentNode*,BSTR,BSTR,BSTR,const WCHAR*,BOOL,DOMEvent**);
diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index b9ed7eabe51..7be9c1c95d7 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -750,7 +750,7 @@ static void HTMLFormElement_unlink(DispatchEx *dispex) unlink_ref(&This->nsform); }
-static HRESULT HTMLFormElement_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLFormElement_get_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLFormElement *This = impl_from_DispatchEx(dispex); nsIDOMHTMLCollection *elements; diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index 78890b43e05..953add5672d 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -860,7 +860,7 @@ static void HTMLFrameElement_destructor(DispatchEx *dispex) HTMLFrameBase_destructor(&This->framebase); }
-static HRESULT HTMLFrameElement_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLFrameElement_get_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLFrameElement *This = frame_from_DispatchEx(dispex);
@@ -1297,7 +1297,7 @@ static void HTMLIFrame_destructor(DispatchEx *dispex) HTMLFrameBase_destructor(&This->framebase); }
-static HRESULT HTMLIFrame_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLIFrame_get_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLIFrame *This = iframe_from_DispatchEx(dispex);
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index f752d2595d0..ceb50a17d02 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -317,10 +317,10 @@ static void HTMLDOMChildrenCollection_destructor(DispatchEx *dispex)
#define DISPID_CHILDCOL_0 MSHTML_DISPID_CUSTOM_MIN
-static HRESULT HTMLDOMChildrenCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLDOMChildrenCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLDOMChildrenCollection *This = impl_from_DispatchEx(dispex); - const WCHAR *ptr; + WCHAR *ptr; DWORD idx=0; UINT32 len = 0;
@@ -1288,11 +1288,7 @@ void HTMLDOMNode_Init(HTMLDocumentNode *doc, HTMLDOMNode *node, nsIDOMNode *nsno node->IHTMLDOMNode2_iface.lpVtbl = &HTMLDOMNode2Vtbl; node->IHTMLDOMNode3_iface.lpVtbl = &HTMLDOMNode3Vtbl;
- /* FIXME: We can't use new bindings for nodes with custom properties yet */ - if(dispex_data->vtbl->get_name) - EventTarget_Init(&node->event_target, dispex_data, doc->document_mode); - else - init_event_target(&node->event_target, dispex_data, doc->script_global); + EventTarget_Init(&node->event_target, dispex_data, doc->document_mode);
if(&doc->node != node) IHTMLDOMNode_AddRef(&doc->node.IHTMLDOMNode_iface); @@ -1414,7 +1410,7 @@ HRESULT get_node(nsIDOMNode *nsnode, BOOL create, HTMLDOMNode **ret)
hres = get_document_node(dom_document, &document); nsIDOMDocument_Release(dom_document); - if(FAILED(hres)) + if(!document) return E_FAIL;
hres = create_node(document, nsnode, ret); diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c index 7c9892ce999..471ea764da8 100644 --- a/dlls/mshtml/htmlobject.c +++ b/dlls/mshtml/htmlobject.c @@ -663,7 +663,7 @@ static void HTMLObjectElement_destructor(DispatchEx *dispex) HTMLElement_destructor(&This->plugin_container.element.node.event_target.dispex); }
-static HRESULT HTMLObjectElement_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLObjectElement_get_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLObjectElement *This = impl_from_DispatchEx(dispex);
diff --git a/dlls/mshtml/htmlscript.h b/dlls/mshtml/htmlscript.h index 6d608d525a1..37a7b8d1f50 100644 --- a/dlls/mshtml/htmlscript.h +++ b/dlls/mshtml/htmlscript.h @@ -47,7 +47,7 @@ void doc_insert_script(HTMLInnerWindow*,HTMLScriptElement*,BOOL); IDispatch *script_parse_event(HTMLInnerWindow*,LPCWSTR); HRESULT exec_script(HTMLInnerWindow*,const WCHAR*,const WCHAR*,VARIANT*); void update_browser_script_mode(GeckoBrowser*,IUri*); -BOOL find_global_prop(HTMLInnerWindow*,const WCHAR*,DWORD,ScriptHost**,DISPID*); +BOOL find_global_prop(HTMLInnerWindow*,BSTR,DWORD,ScriptHost**,DISPID*); IDispatch *get_script_disp(ScriptHost*); IActiveScriptSite *get_first_script_site(HTMLInnerWindow*); void initialize_script_global(HTMLInnerWindow*); diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 8cfbbe58c45..e85ed53c3d5 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -1215,7 +1215,7 @@ static void HTMLSelectElement_unlink(DispatchEx *dispex)
#define DISPID_OPTIONCOL_0 MSHTML_DISPID_CUSTOM_MIN
-static HRESULT HTMLSelectElement_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLSelectElement_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { const WCHAR *ptr; DWORD idx = 0; diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c index 9920a641957..174813a3fef 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -216,7 +216,7 @@ static void storage_event_proc(event_task_t *_task) if(event->event_id == EVENTID_STORAGE && (compat_mode = dispex_compat_mode(&window->event_target.dispex)) >= COMPAT_MODE_IE9) { dispatch_event(&window->event_target, event); if(window->doc) { - hres = create_event_obj(event, window->doc, (IHTMLEventObj**)&V_DISPATCH(&var)); + hres = create_event_obj(event, compat_mode, (IHTMLEventObj**)&V_DISPATCH(&var)); if(SUCCEEDED(hres)) { V_VT(&var) = VT_DISPATCH; fire_event(&window->doc->node, L"onstorage", &var, &cancelled); @@ -1100,7 +1100,7 @@ static HRESULT get_prop(HTMLStorage *This, const WCHAR *name, DISPID *dispid) return S_OK; }
-static HRESULT HTMLStorage_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLStorage_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLStorage *This = impl_from_DispatchEx(dispex); HRESULT hres; diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index cfc50f150ba..def56f7aedb 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -9549,7 +9549,7 @@ void CSSStyle_destructor(DispatchEx *dispex) free(This); }
-HRESULT CSSStyle_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +HRESULT CSSStyle_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { CSSStyle *This = impl_from_DispatchEx(dispex); const style_tbl_entry_t *style_entry; diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h index 0818e555cb9..f6d5ea7c5bb 100644 --- a/dlls/mshtml/htmlstyle.h +++ b/dlls/mshtml/htmlstyle.h @@ -155,7 +155,7 @@ void *CSSStyle_query_interface(DispatchEx*,REFIID); void CSSStyle_traverse(DispatchEx*,nsCycleCollectionTraversalCallback*); void CSSStyle_unlink(DispatchEx*); void CSSStyle_destructor(DispatchEx*); -HRESULT CSSStyle_get_dispid(DispatchEx*,const WCHAR*,DWORD,DISPID*); +HRESULT CSSStyle_get_dispid(DispatchEx*,BSTR,DWORD,DISPID*); void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode);
HRESULT get_style_property(CSSStyle*,styleid_t,BSTR*); diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c index 1e8982ee098..711ef8b4042 100644 --- a/dlls/mshtml/htmlstylesheet.c +++ b/dlls/mshtml/htmlstylesheet.c @@ -292,12 +292,12 @@ static void HTMLStyleSheetRulesCollection_destructor(DispatchEx *dispex) free(This); }
-static HRESULT HTMLStyleSheetRulesCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLStyleSheetRulesCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLStyleSheetRulesCollection *This = HTMLStyleSheetRulesCollection_from_DispatchEx(dispex); - const WCHAR *ptr; UINT32 len = 0; DWORD idx = 0; + WCHAR *ptr;
for(ptr = name; *ptr && is_digit(*ptr); ptr++) idx = idx*10 + (*ptr-'0'); @@ -669,12 +669,12 @@ static void HTMLStyleSheetsCollection_destructor(DispatchEx *dispex) free(This); }
-static HRESULT HTMLStyleSheetsCollection_get_dispid(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *dispid) +static HRESULT HTMLStyleSheetsCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid) { HTMLStyleSheetsCollection *This = HTMLStyleSheetsCollection_from_DispatchEx(dispex); - const WCHAR *ptr; UINT32 len = 0; DWORD idx = 0; + WCHAR *ptr;
for(ptr = name; *ptr && is_digit(*ptr); ptr++) idx = idx*10 + (*ptr-'0'); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index b936a9a844a..7cf4bf9738b 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -109,7 +109,7 @@ static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIAN static void detach_inner_window(HTMLInnerWindow *window) { HTMLOuterWindow *outer_window = window->base.outer_window; - HTMLDocumentNode *doc = window->doc, *doc_iter; + HTMLDocumentNode *doc = window->doc;
while(!list_empty(&window->children)) { HTMLOuterWindow *child = LIST_ENTRY(list_tail(&window->children), HTMLOuterWindow, sibling_entry); @@ -126,8 +126,6 @@ static void detach_inner_window(HTMLInnerWindow *window) if(outer_window && is_main_content_window(outer_window)) window->doc->cp_container.forward_container = NULL;
- LIST_FOR_EACH_ENTRY(doc_iter, &window->documents, HTMLDocumentNode, script_global_entry) - doc_iter->script_global = NULL; if(doc) detach_document_node(doc);
@@ -829,7 +827,7 @@ static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigato
if(!window->navigator) { HRESULT hres; - hres = create_navigator(window, &window->navigator); + hres = create_navigator(dispex_compat_mode(&window->event_target.dispex), &window->navigator); if(FAILED(hres)) return hres; } @@ -3170,7 +3168,7 @@ static HRESULT WINAPI window_private_matchMedia(IWineHTMLWindowPrivate *iface, B
TRACE("iface %p, media_query %s\n", iface, debugstr_w(media_query));
- return create_media_query_list(This->inner_window, media_query, media_query_list); + return create_media_query_list(This, media_query, media_query_list); }
static HRESULT WINAPI window_private_get_console(IWineHTMLWindowPrivate *iface, IDispatch **console) @@ -3181,7 +3179,7 @@ static HRESULT WINAPI window_private_get_console(IWineHTMLWindowPrivate *iface, TRACE("iface %p, console %p.\n", iface, console);
if (!window->console) - create_console(window, &window->console); + create_console(dispex_compat_mode(&window->event_target.dispex), &window->console);
*console = (IDispatch *)window->console; if (window->console) @@ -3309,7 +3307,7 @@ static ULONG WINAPI WindowDispEx_Release(IWineJSDispatchHost *iface) DISPEX_IDISPATCH_NOUNK_IMPL(WindowDispEx, IWineJSDispatchHost, impl_from_IWineJSDispatchHost(iface)->base.inner_window->event_target.dispex)
-static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, const WCHAR *name) +static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, BSTR name) { if(This->global_prop_cnt == This->global_prop_size) { global_prop_t *new_props; @@ -3341,7 +3339,7 @@ static inline DWORD prop_to_dispid(HTMLInnerWindow *This, global_prop_t *prop) return MSHTML_DISPID_CUSTOM_MIN + (prop-This->global_props); }
-HRESULT search_window_props(HTMLInnerWindow *This, const WCHAR *name, DWORD grfdex, DISPID *pid) +HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex, DISPID *pid) { DWORD i; ScriptHost *script_host; @@ -3349,16 +3347,16 @@ HRESULT search_window_props(HTMLInnerWindow *This, const WCHAR *name, DWORD grfd
for(i=0; i < This->global_prop_cnt; i++) { /* FIXME: case sensitivity */ - if(!wcscmp(This->global_props[i].name, name)) { + if(!wcscmp(This->global_props[i].name, bstrName)) { *pid = MSHTML_DISPID_CUSTOM_MIN+i; return S_OK; } }
- if(find_global_prop(This->base.inner_window, name, grfdex, &script_host, &id)) { + if(find_global_prop(This->base.inner_window, bstrName, grfdex, &script_host, &id)) { global_prop_t *prop;
- prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, name); + prop = alloc_global_prop(This, GLOBAL_SCRIPTVAR, bstrName); if(!prop) return E_OUTOFMEMORY;
@@ -3774,19 +3772,19 @@ static HRESULT HTMLWindow_get_name(DispatchEx *dispex, DISPID id, BSTR *name) return (*name = SysAllocString(This->global_props[idx].name)) ? S_OK : E_OUTOFMEMORY; }
-static HRESULT HTMLWindow_lookup_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLWindow_lookup_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex);
return search_window_props(This, name, grfdex, dispid); }
-static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) +static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); HTMLOuterWindow *frame; global_prop_t *prop; - HTMLElement *elem; + IHTMLElement *elem; HRESULT hres;
hres = get_frame_by_name(This->base.outer_window, name, FALSE, &frame); @@ -3799,9 +3797,9 @@ static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, const WCHAR *name, DWO return S_OK; }
- hres = get_doc_elem_by_id(This->doc, name, &elem); + hres = IHTMLDocument3_getElementById(&This->doc->IHTMLDocument3_iface, name, &elem); if(SUCCEEDED(hres) && elem) { - IHTMLElement_Release(&elem->IHTMLElement_iface); + IHTMLElement_Release(elem);
prop = alloc_global_prop(This, GLOBAL_ELEMENTVAR, name); if(!prop) @@ -4208,26 +4206,6 @@ void init_window_cc(void) ccp_init(&outer_window_ccp, &ccp_callback); }
-HTMLInnerWindow *get_script_global(DispatchEx *dispex) -{ - IWineJSDispatchHost *disp; - HTMLInnerWindow *ret; - HRESULT hres; - - if(!dispex->jsdisp) - return NULL; - hres = IWineJSDispatch_GetScriptGlobal(dispex->jsdisp, &disp); - if(FAILED(hres)) - return NULL; - - assert(disp->lpVtbl == &WindowDispExVtbl); - ret = impl_from_IWineJSDispatchHost(disp)->base.inner_window; - if(ret) - IHTMLWindow2_AddRef(&ret->base.IHTMLWindow2_iface); - IWineJSDispatchHost_Release(disp); - return ret; -} - static void *alloc_window(size_t size) { HTMLWindow *window; @@ -4261,7 +4239,6 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, return E_OUTOFMEMORY; window->base.IHTMLWindow2_iface.lpVtbl = &HTMLWindow2Vtbl;
- list_init(&window->documents); list_init(&window->children); list_init(&window->script_hosts); list_init(&window->bindings); @@ -4390,7 +4367,7 @@ HRESULT update_window_doc(HTMLInnerWindow *window) if(outer_window->parent) parent_mode = outer_window->parent->base.inner_window->doc->document_mode;
- hres = create_document_node(nsdoc, outer_window->browser, window, window, parent_mode, &window->doc); + hres = create_document_node(nsdoc, outer_window->browser, window, parent_mode, &window->doc); nsIDOMDocument_Release(nsdoc); if(FAILED(hres)) return hres; diff --git a/dlls/mshtml/mshtml.inf b/dlls/mshtml/mshtml.inf index 3e05d849fe3..fc010bcc593 100644 --- a/dlls/mshtml/mshtml.inf +++ b/dlls/mshtml/mshtml.inf @@ -217,10 +217,6 @@ HKCR,".mpe","Content Type",,"video/mpeg" HKCR,".mpeg","Content Type",,"video/mpeg" HKCR,".mpg","Content Type",,"video/mpeg"
-;; PDF -HKCR,"MIME\Database\Content Type\application/pdf","Extension",,".pdf" -HKCR,".pdf","Content Type",,"application/pdf" - ;; PJPG HKCR,"MIME\Database\Content Type\image/pjpeg","CLSID",,"%CLSID_HTMLDocument%" HKCR,"MIME\Database\Content Type\image/pjpeg","Extension",,".jpg" diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index a7a6a2ed0a2..a5e0f309ed9 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -379,13 +379,13 @@ typedef struct { HRESULT (*value)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
/* Used when the object has custom props, and this returns DISPIDs for them */ - HRESULT (*get_dispid)(DispatchEx*,const WCHAR*,DWORD,DISPID*); + HRESULT (*get_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
/* Similar to get_dispid, but called only when a dynamic property can't be found */ - HRESULT (*find_dispid)(DispatchEx*,const WCHAR*,DWORD,DISPID*); + HRESULT (*find_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
/* Similar to get_dispid, but called before any other lookup */ - HRESULT (*lookup_dispid)(DispatchEx*,const WCHAR*,DWORD,DISPID*); + HRESULT (*lookup_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
/* These are called when the object implements GetMemberName, InvokeEx, DeleteMemberByDispID and GetNextDispID for custom props */ HRESULT (*get_name)(DispatchEx*,DISPID,BSTR*); @@ -492,8 +492,6 @@ extern void (__cdecl *describe_cc_node)(nsCycleCollectingAutoRefCnt*,const char* extern void (__cdecl *note_cc_edge)(nsISupports*,const char*,nsCycleCollectionTraversalCallback*);
void init_dispatch(DispatchEx*,dispex_static_data_t*,HTMLInnerWindow*,compat_mode_t); -void init_dispatch_with_owner(DispatchEx*,dispex_static_data_t*,DispatchEx*); -HTMLInnerWindow *get_script_global(DispatchEx*); void dispex_props_unlink(DispatchEx*); HRESULT change_type(VARIANT*,VARIANT*,VARTYPE,IServiceProvider*); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); @@ -508,13 +506,6 @@ compat_mode_t dispex_compat_mode(DispatchEx*); HRESULT dispex_to_string(DispatchEx*,BSTR*); HRESULT dispex_call_builtin(DispatchEx *dispex, DISPID id, DISPPARAMS *dp, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller); -HRESULT dispex_prop_get(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *r, EXCEPINFO *ei, - IServiceProvider *caller); -HRESULT dispex_prop_put(DispatchEx *dispex, DISPID id, LCID lcid, VARIANT *v, EXCEPINFO *ei, - IServiceProvider *caller); -HRESULT dispex_get_id(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID *pid); -HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret); -HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret);
typedef enum { DISPEXPROP_CUSTOM, @@ -641,7 +632,6 @@ struct HTMLInnerWindow {
struct list children; struct list script_hosts; - struct list documents; IWineJScript *jscript;
IHTMLEventObj *event; @@ -1004,9 +994,6 @@ struct HTMLDocumentNode { GeckoBrowser *browser; struct list browser_entry;
- HTMLInnerWindow *script_global; - struct list script_global_entry; - compat_mode_t document_mode; BOOL document_mode_locked;
@@ -1040,7 +1027,7 @@ struct HTMLDocumentNode { HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**); HRESULT MHTMLDocument_Create(IUnknown*,REFIID,void**); HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**); -HRESULT create_document_node(nsIDOMDocument*,GeckoBrowser*,HTMLInnerWindow*,HTMLInnerWindow*, +HRESULT create_document_node(nsIDOMDocument*,GeckoBrowser*,HTMLInnerWindow*, compat_mode_t,HTMLDocumentNode**); HRESULT create_doctype_node(HTMLDocumentNode*,nsIDOMNode*,HTMLDOMNode**);
@@ -1052,11 +1039,11 @@ HRESULT HTMLOptionElementFactory_Create(HTMLInnerWindow*,HTMLOptionElementFactor HRESULT HTMLImageElementFactory_Create(HTMLInnerWindow*,HTMLImageElementFactory**); HRESULT HTMLXMLHttpRequestFactory_Create(HTMLInnerWindow*,HTMLXMLHttpRequestFactory**); HRESULT create_location(HTMLOuterWindow*,HTMLLocation**); -HRESULT create_navigator(HTMLInnerWindow*,IOmNavigator**); +HRESULT create_navigator(compat_mode_t,IOmNavigator**); HRESULT create_html_screen(HTMLInnerWindow*,IHTMLScreen**); HRESULT create_performance(HTMLInnerWindow*,IHTMLPerformance**); HRESULT create_history(HTMLInnerWindow*,OmHistory**); -HRESULT create_namespace_collection(HTMLDocumentNode*,IHTMLNamespaceCollection**); +HRESULT create_namespace_collection(compat_mode_t,IHTMLNamespaceCollection**); HRESULT create_dom_implementation(HTMLDocumentNode*,IHTMLDOMImplementation**); void detach_dom_implementation(IHTMLDOMImplementation*); HRESULT create_html_storage(HTMLInnerWindow*,BOOL,IHTMLStorage**); @@ -1168,7 +1155,7 @@ HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**); HRESULT create_style_sheet(nsIDOMStyleSheet*,compat_mode_t,IHTMLStyleSheet**); HRESULT create_style_sheet_collection(nsIDOMStyleSheetList*,compat_mode_t, IHTMLStyleSheetsCollection**); -HRESULT create_dom_range(nsIDOMRange*,HTMLDocumentNode*,IHTMLDOMRange**); +HRESULT create_dom_range(nsIDOMRange*,compat_mode_t,IHTMLDOMRange**); HRESULT create_markup_pointer(IMarkupPointer**);
void detach_document_node(HTMLDocumentNode*); @@ -1217,7 +1204,7 @@ typedef struct {
HTMLDOMAttribute *unsafe_impl_from_IHTMLDOMAttribute(IHTMLDOMAttribute*);
-HRESULT HTMLDOMAttribute_Create(const WCHAR*,HTMLElement*,DISPID,HTMLDocumentNode*,HTMLDOMAttribute**); +HRESULT HTMLDOMAttribute_Create(const WCHAR*,HTMLElement*,DISPID,compat_mode_t,HTMLDOMAttribute**);
HRESULT HTMLElement_Create(HTMLDocumentNode*,nsIDOMNode*,BOOL,HTMLElement**); HRESULT HTMLCommentElement_Create(HTMLDocumentNode*,nsIDOMNode*,HTMLElement**); @@ -1254,7 +1241,6 @@ void HTMLDOMNode_Init(HTMLDocumentNode*,HTMLDOMNode*,nsIDOMNode*,dispex_static_d void HTMLElement_Init(HTMLElement*,HTMLDocumentNode*,nsIDOMElement*,dispex_static_data_t*);
void EventTarget_Init(EventTarget*,dispex_static_data_t*,compat_mode_t); -void init_event_target(EventTarget*,dispex_static_data_t*,HTMLInnerWindow*); void *EventTarget_query_interface(EventTarget*,REFIID); void EventTarget_init_dispex_info(dispex_data_t*,compat_mode_t);
@@ -1279,7 +1265,7 @@ HRESULT get_document_node(nsIDOMDocument*,HTMLDocumentNode**);
HTMLElement *unsafe_impl_from_IHTMLElement(IHTMLElement*);
-HRESULT search_window_props(HTMLInnerWindow*,const WCHAR*,DWORD,DISPID*); +HRESULT search_window_props(HTMLInnerWindow*,BSTR,DWORD,DISPID*); HRESULT get_frame_by_name(HTMLOuterWindow*,const WCHAR*,BOOL,HTMLOuterWindow**); HRESULT get_doc_elem_by_id(HTMLDocumentNode*,const WCHAR*,HTMLElement**); HTMLOuterWindow *get_target_window(HTMLOuterWindow*,nsAString*,BOOL*); @@ -1562,7 +1548,7 @@ void set_statustext(HTMLDocumentObj*,INT,LPCWSTR); IInternetSecurityManager *get_security_manager(void);
extern HINSTANCE hInst; -void create_console(HTMLInnerWindow *window, IWineMSHTMLConsole **ret); -HRESULT create_media_query_list(HTMLInnerWindow *window, BSTR media_query, IDispatch **ret); +void create_console(compat_mode_t compat_mode, IWineMSHTMLConsole **ret); +HRESULT create_media_query_list(HTMLWindow *window, BSTR media_query, IDispatch **ret);
HRESULT create_mutation_observer_ctor(compat_mode_t compat_mode, IDispatch **ret); diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 4e0276fd5f6..a502e3c9427 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -312,9 +312,9 @@ static nsresult run_end_load(HTMLDocumentNode *This, nsISupports *arg1, nsISuppo
bind_event_scripts(This);
- if(This->window == window && window->base.outer_window) { + if(This->window == window) { window->dom_interactive_time = get_time_stamp(); - set_ready_state(window->base.outer_window, READYSTATE_INTERACTIVE); + set_ready_state(This->window->base.outer_window, READYSTATE_INTERACTIVE); } IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); return NS_OK; diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index b06c08ff496..1b31e4f7159 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -1663,8 +1663,7 @@ static nsresult NSAPI nsContextMenuListener_OnShowContextMenu(nsIContextMenuList if(FAILED(hres)) return NS_ERROR_FAILURE;
- hres = create_event_from_nsevent(aEvent, This->doc->doc_node->script_global, - dispex_compat_mode(&node->event_target.dispex), &event); + hres = create_event_from_nsevent(aEvent, dispex_compat_mode(&node->event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&node->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 0604fb997c7..c4843fa45b6 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -356,7 +356,7 @@ static nsresult handle_load(HTMLDocumentNode *doc, nsIDOMEvent *event) WARN("no dom_document\n"); }
- hres = create_event_from_nsevent(event, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), &load_event); + hres = create_event_from_nsevent(event, dispex_compat_mode(&doc->node.event_target.dispex), &load_event); if(SUCCEEDED(hres)) { dispatch_event(&doc->window->event_target, load_event); IDOMEvent_Release(&load_event->IDOMEvent_iface); @@ -376,7 +376,7 @@ static nsresult handle_beforeunload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) return NS_OK;
/* Gecko dispatches this to the document, but IE dispatches it to the window */ - hres = create_event_from_nsevent(nsevent, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), &event); + hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&window->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); @@ -399,7 +399,7 @@ static nsresult handle_unload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) if(pending_window) pending_window->unload_event_start_time = get_time_stamp();
- hres = create_event_from_nsevent(nsevent, doc->script_global, dispex_compat_mode(&doc->node.event_target.dispex), &event); + hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&doc->node.event_target.dispex), &event); if(SUCCEEDED(hres)) { dispatch_event(&window->event_target, event); IDOMEvent_Release(&event->IDOMEvent_iface); @@ -444,7 +444,7 @@ static nsresult handle_htmlevent(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) target = &node->event_target; }
- hres = create_event_from_nsevent(nsevent, doc->script_global, dispex_compat_mode(&target->dispex), &event); + hres = create_event_from_nsevent(nsevent, dispex_compat_mode(&target->dispex), &event); if(FAILED(hres)) { IEventTarget_Release(&target->IEventTarget_iface); return NS_OK; diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 900c4ee0ca7..7ba92cca10e 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -48,7 +48,7 @@ typedef struct { IHTMLDOMImplementation2 IHTMLDOMImplementation2_iface;
nsIDOMDOMImplementation *implementation; - HTMLDocumentNode *doc; + GeckoBrowser *browser; } HTMLDOMImplementation;
static inline HTMLDOMImplementation *impl_from_IHTMLDOMImplementation(IHTMLDOMImplementation *iface) @@ -119,7 +119,7 @@ static HRESULT WINAPI HTMLDOMImplementation2_createHTMLDocument(IHTMLDOMImplemen
FIXME("(%p)->(%s %p)\n", This, debugstr_w(title), new_document);
- if(!This->doc || !This->doc->browser) + if(!This->browser) return E_UNEXPECTED;
nsAString_InitDepend(&title_str, title); @@ -130,8 +130,7 @@ static HRESULT WINAPI HTMLDOMImplementation2_createHTMLDocument(IHTMLDOMImplemen return E_FAIL; }
- hres = create_document_node(doc, This->doc->browser, NULL, This->doc->script_global, - dispex_compat_mode(&This->dispex), &new_document_node); + hres = create_document_node(doc, This->browser, NULL, dispex_compat_mode(&This->dispex), &new_document_node); nsIDOMDocument_Release(doc); if(FAILED(hres)) return hres; @@ -198,7 +197,7 @@ static void HTMLDOMImplementation_unlink(DispatchEx *dispex) static void HTMLDOMImplementation_destructor(DispatchEx *dispex) { HTMLDOMImplementation *This = HTMLDOMImplementation_from_DispatchEx(dispex); - assert(!This->doc); + assert(!This->browser); free(This); }
@@ -241,9 +240,9 @@ HRESULT create_dom_implementation(HTMLDocumentNode *doc_node, IHTMLDOMImplementa
dom_implementation->IHTMLDOMImplementation_iface.lpVtbl = &HTMLDOMImplementationVtbl; dom_implementation->IHTMLDOMImplementation2_iface.lpVtbl = &HTMLDOMImplementation2Vtbl; - dom_implementation->doc = doc_node; + dom_implementation->browser = doc_node->browser;
- init_dispatch(&dom_implementation->dispex, &HTMLDOMImplementation_dispex, doc_node->script_global, doc_node->document_mode); + init_dispatch(&dom_implementation->dispex, &HTMLDOMImplementation_dispex, doc_node->window, doc_node->document_mode);
nsres = nsIDOMDocument_GetImplementation(doc_node->dom_document, &dom_implementation->implementation); if(NS_FAILED(nsres)) { @@ -259,7 +258,7 @@ HRESULT create_dom_implementation(HTMLDocumentNode *doc_node, IHTMLDOMImplementa void detach_dom_implementation(IHTMLDOMImplementation *iface) { HTMLDOMImplementation *dom_implementation = impl_from_IHTMLDOMImplementation(iface); - dom_implementation->doc = NULL; + dom_implementation->browser = NULL; }
typedef struct { @@ -685,7 +684,8 @@ static HRESULT create_plugins_collection(OmNavigator *navigator, HTMLPluginsColl col->IHTMLPluginsCollection_iface.lpVtbl = &HTMLPluginsCollectionVtbl; col->navigator = navigator;
- init_dispatch_with_owner(&col->dispex, &HTMLPluginsCollection_dispex, &navigator->dispex); + init_dispatch(&col->dispex, &HTMLPluginsCollection_dispex, NULL, + dispex_compat_mode(&navigator->dispex));
*ret = col; return S_OK; @@ -786,7 +786,8 @@ static HRESULT create_mime_types_collection(OmNavigator *navigator, HTMLMimeType col->IHTMLMimeTypesCollection_iface.lpVtbl = &HTMLMimeTypesCollectionVtbl; col->navigator = navigator;
- init_dispatch_with_owner(&col->dispex, &HTMLMimeTypesCollection_dispex, &navigator->dispex); + init_dispatch(&col->dispex, &HTMLMimeTypesCollection_dispex, NULL, + dispex_compat_mode(&navigator->dispex));
*ret = col; return S_OK; @@ -1157,7 +1158,7 @@ static dispex_static_data_t OmNavigator_dispex = { OmNavigator_iface_tids };
-HRESULT create_navigator(HTMLInnerWindow *script_global, IOmNavigator **navigator) +HRESULT create_navigator(compat_mode_t compat_mode, IOmNavigator **navigator) { OmNavigator *ret;
@@ -1167,8 +1168,7 @@ HRESULT create_navigator(HTMLInnerWindow *script_global, IOmNavigator **navigato
ret->IOmNavigator_iface.lpVtbl = &OmNavigatorVtbl;
- init_dispatch(&ret->dispex, &OmNavigator_dispex, script_global, - dispex_compat_mode(&script_global->event_target.dispex)); + init_dispatch(&ret->dispex, &OmNavigator_dispex, NULL, compat_mode);
*navigator = &ret->IOmNavigator_iface; return S_OK; @@ -1920,7 +1920,7 @@ static dispex_static_data_t HTMLNamespaceCollection_dispex = { HTMLNamespaceCollection_iface_tids };
-HRESULT create_namespace_collection(HTMLDocumentNode *doc, IHTMLNamespaceCollection **ret) +HRESULT create_namespace_collection(compat_mode_t compat_mode, IHTMLNamespaceCollection **ret) { HTMLNamespaceCollection *namespaces;
@@ -1928,8 +1928,7 @@ HRESULT create_namespace_collection(HTMLDocumentNode *doc, IHTMLNamespaceCollect return E_OUTOFMEMORY;
namespaces->IHTMLNamespaceCollection_iface.lpVtbl = &HTMLNamespaceCollectionVtbl; - init_dispatch(&namespaces->dispex, &HTMLNamespaceCollection_dispex, doc->script_global, - dispex_compat_mode(&doc->node.event_target.dispex)); + init_dispatch(&namespaces->dispex, &HTMLNamespaceCollection_dispex, NULL, compat_mode); *ret = &namespaces->IHTMLNamespaceCollection_iface; return S_OK; } @@ -2121,7 +2120,7 @@ static dispex_static_data_t console_dispex = { console_iface_tids };
-void create_console(HTMLInnerWindow *window, IWineMSHTMLConsole **ret) +void create_console(compat_mode_t compat_mode, IWineMSHTMLConsole **ret) { struct console *obj;
@@ -2133,7 +2132,7 @@ void create_console(HTMLInnerWindow *window, IWineMSHTMLConsole **ret) }
obj->IWineMSHTMLConsole_iface.lpVtbl = &WineMSHTMLConsoleVtbl; - init_dispatch(&obj->dispex, &console_dispex, window, dispex_compat_mode(&window->event_target.dispex)); + init_dispatch(&obj->dispex, &console_dispex, NULL, compat_mode);
*ret = &obj->IWineMSHTMLConsole_iface; } @@ -2411,7 +2410,7 @@ static dispex_static_data_t media_query_list_dispex = { media_query_list_iface_tids };
-HRESULT create_media_query_list(HTMLInnerWindow *window, BSTR media_query, IDispatch **ret) +HRESULT create_media_query_list(HTMLWindow *window, BSTR media_query, IDispatch **ret) { struct media_query_list *media_query_list; nsISupports *nsunk; @@ -2433,7 +2432,7 @@ HRESULT create_media_query_list(HTMLInnerWindow *window, BSTR media_query, IDisp media_query_list->callback->ref = 1;
nsAString_InitDepend(&nsstr, media_query); - nsres = nsIDOMWindow_MatchMedia(window->dom_window, &nsstr, &nsunk); + nsres = nsIDOMWindow_MatchMedia(window->outer_window->nswindow, &nsstr, &nsunk); nsAString_Finish(&nsstr); if(NS_FAILED(nsres)) { free(media_query_list->callback); @@ -2449,8 +2448,8 @@ HRESULT create_media_query_list(HTMLInnerWindow *window, BSTR media_query, IDisp
media_query_list->IWineMSHTMLMediaQueryList_iface.lpVtbl = &media_query_list_vtbl; list_init(&media_query_list->listeners); - init_dispatch(&media_query_list->dispex, &media_query_list_dispex, window, - dispex_compat_mode(&window->event_target.dispex)); + init_dispatch(&media_query_list->dispex, &media_query_list_dispex, NULL, + dispex_compat_mode(&window->inner_window->event_target.dispex));
*ret = (IDispatch*)&media_query_list->IWineMSHTMLMediaQueryList_iface; return S_OK; diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c index ce184315127..5f9e3588239 100644 --- a/dlls/mshtml/pluginhost.c +++ b/dlls/mshtml/pluginhost.c @@ -704,7 +704,7 @@ HRESULT get_plugin_disp(HTMLPluginContainer *plugin_container, IDispatch **ret) return S_OK; }
-HRESULT get_plugin_dispid(HTMLPluginContainer *plugin_container, const WCHAR *name, DISPID *ret) +HRESULT get_plugin_dispid(HTMLPluginContainer *plugin_container, WCHAR *name, DISPID *ret) { IDispatch *disp; DISPID id; @@ -720,7 +720,7 @@ HRESULT get_plugin_dispid(HTMLPluginContainer *plugin_container, const WCHAR *na if(!disp) return DISP_E_UNKNOWNNAME;
- hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, (WCHAR **)&name, 1, 0, &id); + hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, &name, 1, 0, &id); if(FAILED(hres)) { TRACE("no prop %s\n", debugstr_w(name)); return DISP_E_UNKNOWNNAME; diff --git a/dlls/mshtml/pluginhost.h b/dlls/mshtml/pluginhost.h index bdef901bc80..0aa70991f68 100644 --- a/dlls/mshtml/pluginhost.h +++ b/dlls/mshtml/pluginhost.h @@ -67,7 +67,7 @@ void update_plugin_window(PluginHost*,HWND,const RECT*); void detach_plugin_host(PluginHost*);
HRESULT get_plugin_disp(HTMLPluginContainer*,IDispatch**); -HRESULT get_plugin_dispid(HTMLPluginContainer*,const WCHAR*,DISPID*); +HRESULT get_plugin_dispid(HTMLPluginContainer*,WCHAR*,DISPID*); HRESULT invoke_plugin_prop(HTMLPluginContainer*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*); void notif_container_change(HTMLPluginContainer*,DISPID); void bind_activex_event(HTMLDocumentNode*,HTMLPluginContainer*,WCHAR*,IDispatch*); diff --git a/dlls/mshtml/range.c b/dlls/mshtml/range.c index 4129834b9b7..10f9de09ca8 100644 --- a/dlls/mshtml/range.c +++ b/dlls/mshtml/range.c @@ -1699,7 +1699,7 @@ HRESULT HTMLTxtRange_Create(HTMLDocumentNode *doc, nsIDOMRange *nsrange, IHTMLTx if(!ret) return E_OUTOFMEMORY;
- init_dispatch(&ret->dispex, &HTMLTxtRange_dispex, doc->script_global, + init_dispatch(&ret->dispex, &HTMLTxtRange_dispex, NULL, dispex_compat_mode(&doc->node.event_target.dispex));
ret->IHTMLTxtRange_iface.lpVtbl = &HTMLTxtRangeVtbl; @@ -1997,7 +1997,7 @@ static dispex_static_data_t HTMLDOMRange_dispex = { HTMLDOMRange_iface_tids };
-HRESULT create_dom_range(nsIDOMRange *nsrange, HTMLDocumentNode *doc, IHTMLDOMRange **p) +HRESULT create_dom_range(nsIDOMRange *nsrange, compat_mode_t compat_mode, IHTMLDOMRange **p) { HTMLDOMRange *ret;
@@ -2005,8 +2005,7 @@ HRESULT create_dom_range(nsIDOMRange *nsrange, HTMLDocumentNode *doc, IHTMLDOMRa if(!ret) return E_OUTOFMEMORY;
- init_dispatch(&ret->dispex, &HTMLDOMRange_dispex, doc->script_global, - dispex_compat_mode(&doc->node.event_target.dispex)); + init_dispatch(&ret->dispex, &HTMLDOMRange_dispex, NULL, compat_mode);
ret->IHTMLDOMRange_iface.lpVtbl = &HTMLDOMRangeVtbl;
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 295c8a0dc15..6a542defa8c 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -1770,17 +1770,13 @@ void bind_event_scripts(HTMLDocumentNode *doc) nsIDOMNodeList_Release(node_list); }
-BOOL find_global_prop(HTMLInnerWindow *window, const WCHAR *name, DWORD flags, ScriptHost **ret_host, DISPID *ret_id) +BOOL find_global_prop(HTMLInnerWindow *window, BSTR name, DWORD flags, ScriptHost **ret_host, DISPID *ret_id) { IDispatchEx *dispex; IDispatch *disp; ScriptHost *iter; - BSTR str; HRESULT hres;
- if(!(str = SysAllocString(name))) - return E_OUTOFMEMORY; - LIST_FOR_EACH_ENTRY(iter, &window->script_hosts, ScriptHost, entry) { disp = get_script_disp(iter); if(!disp) @@ -1788,7 +1784,7 @@ BOOL find_global_prop(HTMLInnerWindow *window, const WCHAR *name, DWORD flags, S
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); if(SUCCEEDED(hres)) { - hres = IDispatchEx_GetDispID(dispex, str, flags & (~fdexNameEnsure), ret_id); + hres = IDispatchEx_GetDispID(dispex, name, flags & (~fdexNameEnsure), ret_id); IDispatchEx_Release(dispex); }else { FIXME("No IDispatchEx\n"); @@ -1797,13 +1793,11 @@ BOOL find_global_prop(HTMLInnerWindow *window, const WCHAR *name, DWORD flags, S
IDispatch_Release(disp); if(SUCCEEDED(hres)) { - SysFreeString(str); *ret_host = iter; return TRUE; } }
- SysFreeString(str); return FALSE; }
diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c index c20c24dad5f..8c457f1813f 100644 --- a/dlls/mshtml/selection.c +++ b/dlls/mshtml/selection.c @@ -253,7 +253,7 @@ HRESULT HTMLSelectionObject_Create(HTMLDocumentNode *doc, nsISelection *nsselect if(!selection) return E_OUTOFMEMORY;
- init_dispatch(&selection->dispex, &HTMLSelectionObject_dispex, doc->script_global, + init_dispatch(&selection->dispex, &HTMLSelectionObject_dispex, NULL, dispex_compat_mode(&doc->node.event_target.dispex));
selection->IHTMLSelectionObject_iface.lpVtbl = &HTMLSelectionObjectVtbl; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 016b51c9eda..7362e0d16bf 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -58,6 +58,7 @@ if(window.addEventListener) { pageshow_fired = true;
var r = Object.prototype.toString.call(e); + todo_wine. ok(r === "[object PageTransitionEvent]", "pageshow toString = " + r); ok("persisted" in e, "'persisted' not in pageshow event"); ok(document.readyState === "complete", "pageshow readyState = " + document.readyState); @@ -69,6 +70,7 @@ if(window.addEventListener) { ok(document.documentMode >= 11, "pagehide fired");
var r = Object.prototype.toString.call(e); + todo_wine. ok(r === "[object PageTransitionEvent]", "pagehide toString = " + r); ok("persisted" in e, "'persisted' not in pagehide event"); }, true); @@ -107,126 +109,126 @@ sync_test("page transition events", function() {
sync_test("builtin_toString", function() { var tags = [ - [ "abbr", "Phrase", -1 ], - [ "acronym", "Phrase", -1 ], - [ "address", "Block", -1 ], + [ "abbr", "Phrase" ], + [ "acronym", "Phrase" ], + [ "address", "Block" ], // [ "applet", "Applet" ], // makes Windows pop up a dialog box [ "article", "" ], [ "aside", "" ], - [ "audio", "Audio", -1 ], - [ "b", "Phrase", -1 ], - [ "base", "Base", -1 ], - [ "basefont", "BaseFont", -1 ], + [ "audio", "Audio" ], + [ "b", "Phrase" ], + [ "base", "Base" ], + [ "basefont", "BaseFont" ], [ "bdi", "Unknown" ], - [ "bdo", "Phrase", -1 ], - [ "big", "Phrase", -1 ], - [ "blockquote", "Block", -1 ], + [ "bdo", "Phrase" ], + [ "big", "Phrase" ], + [ "blockquote", "Block" ], [ "body", "Body" ], - [ "br", "BR", -1 ], + [ "br", "BR" ], [ "button", "Button" ], - [ "canvas", "Canvas", -1 ], - [ "caption", "TableCaption", -1 ], - [ "center", "Block", -1 ], - [ "cite", "Phrase", -1 ], - [ "code", "Phrase", -1 ], - [ "col", "TableCol", -1 ], - [ "colgroup", "TableCol", -1 ], + [ "canvas", "Canvas" ], + [ "caption", "TableCaption" ], + [ "center", "Block" ], + [ "cite", "Phrase" ], + [ "code", "Phrase" ], + [ "col", "TableCol" ], + [ "colgroup", "TableCol" ], [ "data", "Unknown" ], [ "datalist", "DataList", 10 ], - [ "dd", "DD", -1 ], - [ "del", "Mod", -1 ], + [ "dd", "DD" ], + [ "del", "Mod" ], [ "details", "Unknown" ], - [ "dfn", "Phrase", -1 ], + [ "dfn", "Phrase" ], [ "dialog", "Unknown" ], - [ "dir", "Directory", -1 ], - [ "div", "Div", -1 ], - [ "dl", "DList", -1 ], - [ "dt", "DT", -1 ], - [ "em", "Phrase", -1 ], + [ "dir", "Directory" ], + [ "div", "Div" ], + [ "dl", "DList" ], + [ "dt", "DT" ], + [ "em", "Phrase" ], [ "embed", "Embed" ], - [ "fieldset", "FieldSet", -1 ], + [ "fieldset", "FieldSet" ], [ "figcaption", "" ], [ "figure", "" ], - [ "font", "Font", -1 ], + [ "font", "Font" ], [ "footer", "" ], - [ "form", "Form", -1 ], - [ "frame", "Frame", -1 ], - [ "frameset", "FrameSet", -1 ], - [ "h1", "Heading", -1 ], - [ "h2", "Heading", -1 ], - [ "h3", "Heading", -1 ], - [ "h4", "Heading", -1 ], - [ "h5", "Heading", -1 ], - [ "h6", "Heading", -1 ], + [ "form", "Form" ], + [ "frame", "Frame" ], + [ "frameset", "FrameSet" ], + [ "h1", "Heading" ], + [ "h2", "Heading" ], + [ "h3", "Heading" ], + [ "h4", "Heading" ], + [ "h5", "Heading" ], + [ "h6", "Heading" ], [ "h7", "Unknown" ], [ "head", "Head" ], [ "header", "" ], - [ "hr", "HR", -1 ], + [ "hr", "HR" ], [ "html", "Html" ], - [ "i", "Phrase", -1 ], - [ "iframe", "IFrame", -1 ], + [ "i", "Phrase" ], + [ "iframe", "IFrame" ], [ "img", "Image" ], [ "input", "Input" ], - [ "ins", "Mod", -1 ], - [ "kbd", "Phrase", -1 ], + [ "ins", "Mod" ], + [ "kbd", "Phrase" ], [ "label", "Label" ], - [ "legend", "Legend", -1 ], - [ "li", "LI", -1 ], + [ "legend", "Legend" ], + [ "li", "LI" ], [ "link", "Link" ], [ "main", "Unknown" ], - [ "map", "Map", -1 ], + [ "map", "Map" ], [ "mark", "" ], [ "meta", "Meta" ], [ "meter", "Unknown" ], [ "nav", "" ], [ "noframes", "" ], [ "noscript", "" ], - [ "object", "Object", -1 ], - [ "ol", "OList", -1 ], - [ "optgroup", "OptGroup", -1 ], + [ "object", "Object" ], + [ "ol", "OList" ], + [ "optgroup", "OptGroup" ], [ "option", "Option" ], [ "output", "Unknown" ], - [ "p", "Paragraph", -1 ], - [ "param", "Param", -1 ], + [ "p", "Paragraph" ], + [ "param", "Param" ], [ "picture", "Unknown" ], - [ "pre", "Pre", -1 ], + [ "pre", "Pre" ], [ "progress", "Progress", 10 ], - [ "q", "Quote", -1 ], - [ "rp", "Phrase", -1 ], - [ "rt", "Phrase", -1 ], - [ "ruby", "Phrase", -1 ], - [ "s", "Phrase", -1 ], - [ "samp", "Phrase", -1 ], + [ "q", "Quote" ], + [ "rp", "Phrase" ], + [ "rt", "Phrase" ], + [ "ruby", "Phrase" ], + [ "s", "Phrase" ], + [ "samp", "Phrase" ], [ "script", "Script" ], [ "section", "" ], - [ "select", "Select", -1 ], - [ "small", "Phrase", -1 ], - [ "source", "Source", -1 ], - [ "span", "Span", -1 ], - [ "strike", "Phrase", -1 ], - [ "strong", "Phrase", -1 ], + [ "select", "Select" ], + [ "small", "Phrase" ], + [ "source", "Source" ], + [ "span", "Span" ], + [ "strike", "Phrase" ], + [ "strong", "Phrase" ], [ "style", "Style" ], - [ "sub", "Phrase", -1 ], + [ "sub", "Phrase" ], [ "summary", "Unknown" ], - [ "sup", "Phrase", -1 ], + [ "sup", "Phrase" ], [ "svg", "Unknown" ], [ "table", "Table" ], - [ "tbody", "TableSection", -1 ], + [ "tbody", "TableSection" ], [ "td", "TableDataCell" ], [ "template", "Unknown" ], [ "textarea", "TextArea" ], - [ "tfoot", "TableSection", -1 ], - [ "th", "TableHeaderCell", -1 ], - [ "thead", "TableSection", -1 ], + [ "tfoot", "TableSection" ], + [ "th", "TableHeaderCell" ], + [ "thead", "TableSection" ], [ "time", "Unknown" ], [ "title", "Title" ], [ "tr", "TableRow" ], [ "track", "Track", 10 ], - [ "tt", "Phrase", -1 ], - [ "u", "Phrase", -1 ], - [ "ul", "UList", -1 ], - [ "var", "Phrase", -1 ], - [ "video", "Video", -1 ], + [ "tt", "Phrase" ], + [ "u", "Phrase" ], + [ "ul", "UList" ], + [ "var", "Phrase" ], + [ "video", "Video" ], [ "wbr", "" ], [ "winetest", "Unknown" ] ]; @@ -246,17 +248,17 @@ sync_test("builtin_toString", function() {
for(var i = 0; i < tags.length; i++) if(tags[i].length < 3 || v >= tags[i][2]) - test("tag '" + tags[i][0] + "'", document.createElement(tags[i][0]), "HTML" + tags[i][1] + "Element", null, tags[i].length > 2); + test("tag '" + tags[i][0] + "'", document.createElement(tags[i][0]), "HTML" + tags[i][1] + "Element", null, true);
e = document.createElement("a"); ok(e.toString() === "", "tag 'a' (without href) toString returned " + e.toString()); e.href = "https://www.winehq.org/"; - test("tag 'a'", e, "HTMLAnchorElement", "https://www.winehq.org/"); + test("tag 'a'", e, "HTMLAnchorElement", "https://www.winehq.org/", true);
e = document.createElement("area"); ok(e.toString() === "", "tag 'area' (without href) toString returned " + e.toString()); e.href = "https://www.winehq.org/"; - test("tag 'area'", e, "HTMLAreaElement", "https://www.winehq.org/"); + test("tag 'area'", e, "HTMLAreaElement", "https://www.winehq.org/", true);
e = document.createElement("style"); document.body.appendChild(e); @@ -290,7 +292,7 @@ sync_test("builtin_toString", function() { } if(!localStorage) win_skip("localStorage is buggy and not available, skipping");
- test("attribute", document.createAttribute("class"), "Attr"); + test("attribute", document.createAttribute("class"), "Attr", null, true); if(false /* todo_wine */) test("attributes", e.attributes, "NamedNodeMap"); test("childNodes", document.body.childNodes, "NodeList", null, true); if(clientRects) test("clientRect", clientRects[0], "ClientRect", null, true); @@ -302,12 +304,12 @@ sync_test("builtin_toString", function() { test("implementation", document.implementation, "DOMImplementation"); if(localStorage) test("localStorage", localStorage, "Storage", null, true); test("location", window.location, "Object", window.location.href, null, true); - if(v >= 11 /* todo_wine */) test("mimeTypes", window.navigator.mimeTypes, v < 11 ? "MSMimeTypesCollection" : "MimeTypeArray"); - test("navigator", window.navigator, "Navigator"); + if(v >= 11 /* todo_wine */) test("mimeTypes", window.navigator.mimeTypes, v < 11 ? "MSMimeTypesCollection" : "MimeTypeArray", null, true); + test("navigator", window.navigator, "Navigator", null, true); test("performance", window.performance, "Performance"); test("performanceNavigation", window.performance.navigation, "PerformanceNavigation"); test("performanceTiming", window.performance.timing, "PerformanceTiming"); - if(v >= 11 /* todo_wine */) test("plugins", window.navigator.plugins, v < 11 ? "MSPluginsCollection" : "PluginArray"); + if(v >= 11 /* todo_wine */) test("plugins", window.navigator.plugins, v < 11 ? "MSPluginsCollection" : "PluginArray", null, true); test("screen", window.screen, "Screen"); test("sessionStorage", window.sessionStorage, "Storage", null, true); test("style", document.body.style, "MSStyleCSSProperties", null, true); @@ -315,38 +317,38 @@ sync_test("builtin_toString", function() { test("styleSheetRule", sheet.rules[0], "CSSStyleRule", null, true); test("styleSheetRules", sheet.rules, "MSCSSRuleList", null, true); test("styleSheets", document.styleSheets, "StyleSheetList", null, true); - test("textNode", document.createTextNode("testNode"), "Text", v < 9 ? "testNode" : null); - test("textRange", txtRange, "TextRange"); + test("textNode", document.createTextNode("testNode"), "Text", v < 9 ? "testNode" : null, true); + test("textRange", txtRange, "TextRange", null, true); test("window", window, "Window", "[object Window]", true); - test("xmlHttpRequest", new XMLHttpRequest(), "XMLHttpRequest"); + test("xmlHttpRequest", new XMLHttpRequest(), "XMLHttpRequest", null, true); if(v < 10) { - test("namespaces", document.namespaces, "MSNamespaceInfoCollection"); + test("namespaces", document.namespaces, "MSNamespaceInfoCollection", null, true); } if(v < 11) { - test("eventObject", document.createEventObject(), "MSEventObj"); - test("selection", document.selection, "MSSelection"); + test("eventObject", document.createEventObject(), "MSEventObj", null, true); + test("selection", document.selection, "MSSelection", null, true); } if(v >= 9) { test("computedStyle", window.getComputedStyle(e), "CSSStyleDeclaration", null, true); - test("doctype", document.doctype, "DocumentType"); + test("doctype", document.doctype, "DocumentType", null, true);
- test("Event", document.createEvent("Event"), "Event"); - test("CustomEvent", document.createEvent("CustomEvent"), "CustomEvent"); - test("KeyboardEvent", document.createEvent("KeyboardEvent"), "KeyboardEvent"); - test("MouseEvent", document.createEvent("MouseEvent"), "MouseEvent"); - test("UIEvent", document.createEvent("UIEvent"), "UIEvent"); + test("Event", document.createEvent("Event"), "Event", null, true); + test("CustomEvent", document.createEvent("CustomEvent"), "CustomEvent", null, true); + test("KeyboardEvent", document.createEvent("KeyboardEvent"), "KeyboardEvent", null, true); + test("MouseEvent", document.createEvent("MouseEvent"), "MouseEvent", null, true); + test("UIEvent", document.createEvent("UIEvent"), "UIEvent", null, true); } if(v >= 10) { test("classList", e.classList, "DOMTokenList", "testclass another ", true); - test("console", window.console, "Console"); - test("mediaQueryList", window.matchMedia("(hover:hover)"), "MediaQueryList"); + test("console", window.console, "Console", null, true); + test("mediaQueryList", window.matchMedia("(hover:hover)"), "MediaQueryList", null, true); } if(v >= 11) { test("MutationObserver", new window.MutationObserver(function() {}), "MutationObserver", null, true); } if(v >= 9) { document.body.innerHTML = "<!--...-->"; - test("comment", document.body.firstChild, "Comment"); + test("comment", document.body.firstChild, "Comment", null, true); } });
@@ -1956,7 +1958,7 @@ async_test("storage events", function() { return; } var s = Object.prototype.toString.call(e); - todo_wine_if(e.target != window && e.target != document). + todo_wine. ok(s === "[object StorageEvent]", "Object.toString = " + s); ok(e.key === key, "key = " + e.key + ", expected " + key); ok(e.oldValue === oldValue, "oldValue = " + e.oldValue + ", expected " + oldValue); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index f2e025ec864..b04c13de984 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2658,32 +2658,3 @@ sync_test("builtin_func", function() { ok(f.call(o, "test", 1) === false, 'f.call(o, "test", 1) = ' + f.call(o, "test", 1)); ok("" + f === "\nfunction hasFeature() {\n [native code]\n}\n", "f = " + f); }); - -async_test("script_global", function() { - // Created documents share script global, so their objects are instances of Object from - // the current script context. - var doc = document.implementation.createHTMLDocument("test"); - todo_wine. - ok(doc instanceof Object, "created doc is not an instance of Object"); - ok(doc.implementation instanceof Object, "created doc.implementation is not an instance of Object"); - - document.body.innerHTML = ""; - var iframe = document.createElement("iframe"); - - // Documents created in iframe use iframe's script global, so their objects are not instances of - // current script context Object. - iframe.onload = guard(function() { - var doc = iframe.contentWindow.document; - ok(!(doc instanceof Object), "doc is an instance of Object"); - ok(!(doc.implementation instanceof Object), "doc.implementation is an instance of Object"); - - doc = doc.implementation.createHTMLDocument("test"); - ok(!(doc instanceof Object), "created iframe doc is an instance of Object"); - ok(!(doc.implementation instanceof Object), "created iframe doc.implementation is an instance of Object"); - - next_test(); - }); - - iframe.src = "about:blank"; - document.body.appendChild(iframe); -}); diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js index 661eafc54d9..336f03c1b2f 100644 --- a/dlls/mshtml/tests/xhr.js +++ b/dlls/mshtml/tests/xhr.js @@ -306,6 +306,7 @@ function test_timeout() { xhr.onload = function() { ok(false, "onload called"); } xhr.ontimeout = function(e) { var r = Object.prototype.toString.call(e); + todo_wine. ok(r === ("[object " + (v < 10 ? "Event" : "ProgressEvent") + "]"), "Object.toString = " + r); var props = [ "initProgressEvent", "lengthComputable", "loaded", "total" ]; for(r = 0; r < props.length; r++) { diff --git a/dlls/mshtml/xmlhttprequest.c b/dlls/mshtml/xmlhttprequest.c index 0ab7fba2862..efb343e6f16 100644 --- a/dlls/mshtml/xmlhttprequest.c +++ b/dlls/mshtml/xmlhttprequest.c @@ -398,7 +398,7 @@ static nsresult NSAPI XMLHttpReqEventListener_HandleEvent(nsIDOMEventListener *i blocking_xhr = thread_data->blocking_xhr;
compat_mode = dispex_compat_mode(&This->xhr->event_target.dispex); - hres = create_event_from_nsevent(nsevent, This->xhr->window, compat_mode, &event); + hres = create_event_from_nsevent(nsevent, compat_mode, &event); if(FAILED(hres)) { if(!blocking_xhr || This->xhr == blocking_xhr) This->xhr->ready_state = ready_state; @@ -1530,7 +1530,7 @@ static HRESULT WINAPI HTMLXMLHttpRequestFactory_create(IHTMLXMLHttpRequestFactor ret->IHTMLXMLHttpRequest2_iface.lpVtbl = &HTMLXMLHttpRequest2Vtbl; ret->IWineXMLHttpRequestPrivate_iface.lpVtbl = &WineXMLHttpRequestPrivateVtbl; ret->IProvideClassInfo2_iface.lpVtbl = &ProvideClassInfo2Vtbl; - init_event_target(&ret->event_target, &HTMLXMLHttpRequest_dispex, This->window); + EventTarget_Init(&ret->event_target, &HTMLXMLHttpRequest_dispex, This->window->doc->document_mode);
/* Always register the handlers because we need them to track state */ event_listener->nsIDOMEventListener_iface.lpVtbl = &XMLHttpReqEventListenerVtbl; diff --git a/dlls/msv1_0/unixlib.c b/dlls/msv1_0/unixlib.c index 807f3778109..b51dde2ef0a 100644 --- a/dlls/msv1_0/unixlib.c +++ b/dlls/msv1_0/unixlib.c @@ -217,7 +217,6 @@ static NTSTATUS ntlm_check_version( void *args ) struct fork_params params = { &ctx, argv }; int len;
- ctx.mode = MODE_CLIENT; argv[0] = (char *)"ntlm_auth"; argv[1] = (char *)"--version"; argv[2] = NULL; diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 05630fb54b1..0bf8510c5c9 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -883,7 +883,7 @@ static BOOL msvcrt_alloc_buffer(FILE* file) } else { file->_base = (char*)(&file->_charbuf); file->_bufsiz = 2; - file->_flag |= MSVCRT__NOBUF; + file->_flag |= _IONBF; } file->_ptr = file->_base; file->_cnt = 0; @@ -896,7 +896,7 @@ static BOOL add_std_buffer(FILE *file) static char buffers[2][BUFSIZ];
if((file->_file!=STDOUT_FILENO && file->_file!=STDERR_FILENO) - || (file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF)) + || (file->_flag & (_IONBF | _IOMYBUF | MSVCRT__USERBUF)) || !_isatty(file->_file)) return FALSE;
@@ -3885,7 +3885,7 @@ int CDECL _filbuf(FILE* file) return EOF;
/* Allocate buffer if needed */ - if(!(file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF))) + if(!(file->_flag & (_IONBF | _IOMYBUF | MSVCRT__USERBUF))) msvcrt_alloc_buffer(file);
if(!(file->_flag & _IOREAD)) { @@ -4136,7 +4136,7 @@ wchar_t * CDECL fgetws(wchar_t *s, int size, FILE* file) int CDECL _flsbuf(int c, FILE* file) { /* Flush output buffer */ - if(!(file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF))) { + if(!(file->_flag & (_IONBF | _IOMYBUF | MSVCRT__USERBUF))) { msvcrt_alloc_buffer(file); }
@@ -4221,13 +4221,13 @@ size_t CDECL _fwrite_nolock(const void *ptr, size_t size, size_t nmemb, FILE* fi written += pcnt; wrcnt -= pcnt; ptr = (const char*)ptr + pcnt; - } else if((file->_flag & MSVCRT__NOBUF) + } else if((file->_flag & _IONBF) || ((file->_flag & (_IOMYBUF | MSVCRT__USERBUF)) && wrcnt >= file->_bufsiz) || (!(file->_flag & (_IOMYBUF | MSVCRT__USERBUF)) && wrcnt >= MSVCRT_INTERNAL_BUFSIZ)) { size_t pcnt; int bufsiz;
- if(file->_flag & MSVCRT__NOBUF) + if(file->_flag & _IONBF) bufsiz = 1; else if(!(file->_flag & (_IOMYBUF | MSVCRT__USERBUF))) bufsiz = MSVCRT_INTERNAL_BUFSIZ; @@ -4510,7 +4510,7 @@ size_t CDECL _fread_nolock(void *ptr, size_t size, size_t nmemb, FILE* file) } }
- if(rcnt>0 && !(file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF))) + if(rcnt>0 && !(file->_flag & (_IONBF | _IOMYBUF | MSVCRT__USERBUF))) msvcrt_alloc_buffer(file);
while(rcnt>0) @@ -5084,11 +5084,11 @@ int CDECL setvbuf(FILE* file, char *buf, int mode, size_t size) _fflush_nolock(file); if(file->_flag & _IOMYBUF) free(file->_base); - file->_flag &= ~(MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF); + file->_flag &= ~(_IONBF | _IOMYBUF | MSVCRT__USERBUF); file->_cnt = 0;
if(mode == _IONBF) { - file->_flag |= MSVCRT__NOBUF; + file->_flag |= _IONBF; file->_base = file->_ptr = (char*)&file->_charbuf; file->_bufsiz = 2; }else if(buf) { @@ -5823,7 +5823,7 @@ int CDECL _ungetc_nolock(int c, FILE * file) (file->_flag&_IORW && !(file->_flag&_IOWRT)))) return EOF;
- if((!(file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF)) + if((!(file->_flag & (_IONBF | _IOMYBUF | MSVCRT__USERBUF)) && msvcrt_alloc_buffer(file)) || (!file->_cnt && file->_ptr==file->_base)) file->_ptr++; diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index eaaf8b0034d..e95b824f3f3 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -43,13 +43,6 @@ typedef struct _iobuf #define _IOMYBUF 0x0040 #define _IOSTRG 0x1000 #endif - -#define MSVCRT__NOBUF 0x0400 - -#else - -#define MSVCRT__NOBUF _IONBF - #endif
#include <errno.h> diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 85aa48eacb5..78afe2f49f5 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -71,7 +71,6 @@ @ stdcall -norelay KiUserApcDispatcher(ptr long long long ptr) @ stdcall -norelay KiUserCallbackDispatcher(long ptr long) @ stdcall -norelay -arch=arm,arm64,arm64ec KiUserCallbackDispatcherReturn() -@ stdcall -norelay -arch=arm64ec KiUserEmulationDispatcher(ptr) @ stdcall -norelay KiUserExceptionDispatcher(ptr ptr) # @ stub LdrAccessOutOfProcessResource @ stdcall LdrAccessResource(long ptr ptr ptr) diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index fb16f6d2dc6..934124a0360 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -254,16 +254,6 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, type = pInfo->Type; data = (WCHAR*)((char*)pInfo + pInfo->DataOffset); len = pInfo->DataLength; - - /* Ensure that multi-strings from the registry are double-null-terminated */ - if (type == REG_MULTI_SZ) - { - while (len < 2 * sizeof(WCHAR) || data[len / sizeof(WCHAR) - 2] || data[len / sizeof(WCHAR) - 1]) - { - data[len / sizeof(WCHAR)] = 0; - len += sizeof(WCHAR); - } - } } else { @@ -285,13 +275,10 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, break;
case REG_MULTI_SZ: - wstr = data; - for (;;) + for (wstr = data; *wstr; wstr += count) { count = wcslen(wstr) + 1; len += count * sizeof(WCHAR); - if (!*wstr) break; - wstr += count; } break; } @@ -335,6 +322,7 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, if (!(pQuery->Flags & RTL_QUERY_REGISTRY_NOEXPAND)) return STATUS_INVALID_PARAMETER;
+ len += sizeof(WCHAR); if (str->Buffer == NULL) { str->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, len); @@ -342,8 +330,10 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, } else if (str->MaximumLength < len) return STATUS_BUFFER_TOO_SMALL; + len -= sizeof(WCHAR); memcpy(str->Buffer, data, len); - str->Length = (len >= sizeof(WCHAR) ? len - sizeof(WCHAR) : len); + str->Buffer[len / sizeof(WCHAR)] = 0; + str->Length = len; break;
default: @@ -389,7 +379,7 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, } else /* REG_MULTI_SZ */ { - for (offset = 0; offset + 2 * sizeof(WCHAR) < len; offset += count) + for (offset = 0; offset < len; offset += count) { wstr = (WCHAR*)((char*)data + offset); count = (wcslen(wstr) + 1) * sizeof(WCHAR); @@ -554,10 +544,9 @@ NTSTATUS WINAPI RtlQueryRegistryValues(IN ULONG RelativeTo, IN PCWSTR Path, if (status == STATUS_NO_MORE_ENTRIES) break; if (status == STATUS_BUFFER_OVERFLOW || - status == STATUS_BUFFER_TOO_SMALL || - (status == STATUS_SUCCESS && pInfo->Type == REG_MULTI_SZ && buflen < len + 2 * sizeof(L'\0'))) + status == STATUS_BUFFER_TOO_SMALL) { - buflen = len + 2 * sizeof(L'\0'); + buflen = len; RtlFreeHeap(GetProcessHeap(), 0, pInfo); pInfo = RtlAllocateHeap(GetProcessHeap(), 0, buflen); NtEnumerateValueKey(handle, i, KeyValueFullInformation, @@ -589,10 +578,9 @@ NTSTATUS WINAPI RtlQueryRegistryValues(IN ULONG RelativeTo, IN PCWSTR Path, status = NtQueryValueKey(handle, &Value, KeyValueFullInformation, pInfo, buflen, &len); if (status == STATUS_BUFFER_OVERFLOW || - status == STATUS_BUFFER_TOO_SMALL || - (status == STATUS_SUCCESS && pInfo->Type == REG_MULTI_SZ && buflen < len + 2 * sizeof(L'\0'))) + status == STATUS_BUFFER_TOO_SMALL) { - buflen = len + 2 * sizeof(L'\0'); + buflen = len; RtlFreeHeap(GetProcessHeap(), 0, pInfo); pInfo = RtlAllocateHeap(GetProcessHeap(), 0, buflen); status = NtQueryValueKey(handle, &Value, diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index e44ac9fc467..b5ecb643bdb 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -44,7 +44,6 @@ static void (WINAPI *pBTCpu64FlushInstructionCache)(const void*,SIZE_T); static BOOLEAN (WINAPI *pBTCpu64IsProcessorFeaturePresent)(UINT); static void (WINAPI *pBTCpu64NotifyMemoryDirty)(void*,SIZE_T); static void (WINAPI *pBTCpu64NotifyReadFile)(HANDLE,void*,SIZE_T,BOOL,NTSTATUS); -static void (WINAPI *pBeginSimulation)(void); static void (WINAPI *pFlushInstructionCacheHeavy)(const void*,SIZE_T); static NTSTATUS (WINAPI *pNotifyMapViewOfSection)(void*,void*,void*,SIZE_T,ULONG,ULONG); static void (WINAPI *pNotifyMemoryAlloc)(void*,SIZE_T,ULONG,ULONG,BOOL,NTSTATUS); @@ -52,9 +51,7 @@ static void (WINAPI *pNotifyMemoryFree)(void*,SIZE_T,ULONG,BOOL,NTSTATUS); static void (WINAPI *pNotifyMemoryProtect)(void*,SIZE_T,ULONG,BOOL,NTSTATUS); static void (WINAPI *pNotifyUnmapViewOfSection)(void*,BOOL,NTSTATUS); static NTSTATUS (WINAPI *pProcessInit)(void); -static void (WINAPI *pProcessTerm)(HANDLE,BOOL,NTSTATUS); static NTSTATUS (WINAPI *pThreadInit)(void); -static void (WINAPI *pThreadTerm)(HANDLE,LONG); static void (WINAPI *pUpdateProcessorInformation)(SYSTEM_CPU_INFORMATION*);
static BOOLEAN emulated_processor_features[PROCESSOR_FEATURE_MAX]; @@ -158,7 +155,6 @@ NTSTATUS arm64ec_process_init( HMODULE module ) GET_PTR( BTCpu64IsProcessorFeaturePresent ); GET_PTR( BTCpu64NotifyMemoryDirty ); GET_PTR( BTCpu64NotifyReadFile ); - GET_PTR( BeginSimulation ); GET_PTR( FlushInstructionCacheHeavy ); GET_PTR( NotifyMapViewOfSection ); GET_PTR( NotifyMemoryAlloc ); @@ -166,9 +162,7 @@ NTSTATUS arm64ec_process_init( HMODULE module ) GET_PTR( NotifyMemoryProtect ); GET_PTR( NotifyUnmapViewOfSection ); GET_PTR( ProcessInit ); - GET_PTR( ProcessTerm ); GET_PTR( ThreadInit ); - GET_PTR( ThreadTerm ); GET_PTR( UpdateProcessorInformation ); #undef GET_PTR
@@ -436,8 +430,8 @@ DEFINE_SYSCALL(NtSuspendProcess, (HANDLE handle)) DEFINE_SYSCALL(NtSuspendThread, (HANDLE handle, ULONG *count)) DEFINE_SYSCALL(NtSystemDebugControl, (SYSDBG_COMMAND command, void *in_buff, ULONG in_len, void *out_buff, ULONG out_len, ULONG *retlen)) DEFINE_SYSCALL(NtTerminateJobObject, (HANDLE handle, NTSTATUS status)) -DEFINE_WRAPPED_SYSCALL(NtTerminateProcess, (HANDLE handle, LONG exit_code)) -DEFINE_WRAPPED_SYSCALL(NtTerminateThread, (HANDLE handle, LONG exit_code)) +DEFINE_SYSCALL(NtTerminateProcess, (HANDLE handle, LONG exit_code)) +DEFINE_SYSCALL(NtTerminateThread, (HANDLE handle, LONG exit_code)) DEFINE_SYSCALL(NtTestAlert, (void)) DEFINE_SYSCALL(NtTraceControl, (ULONG code, void *inbuf, ULONG inbuf_len, void *outbuf, ULONG outbuf_len, ULONG *size)) DEFINE_SYSCALL(NtUnloadDriver, (const UNICODE_STRING *name)) @@ -644,26 +638,6 @@ NTSTATUS SYSCALL_API NtSetContextThread( HANDLE handle, const CONTEXT *context ) return syscall_NtSetContextThread( handle, &arm_ctx ); }
-NTSTATUS SYSCALL_API NtTerminateProcess( HANDLE handle, LONG exit_code ) -{ - NTSTATUS status; - - if (!handle && pProcessTerm) - { - pProcessTerm( handle, FALSE, 0 ); - status = syscall_NtTerminateProcess( handle, exit_code ); - pProcessTerm( handle, TRUE, status ); - return status; - } - return syscall_NtTerminateProcess( handle, exit_code ); -} - -NTSTATUS SYSCALL_API NtTerminateThread( HANDLE handle, LONG exit_code ) -{ - if (pThreadTerm) pThreadTerm( handle, exit_code ); - return syscall_NtTerminateThread( handle, exit_code ); -} - NTSTATUS SYSCALL_API NtUnmapViewOfSection( HANDLE process, void *addr ) { BOOL is_current = RtlIsCurrentProcess( process ); @@ -1032,22 +1006,6 @@ NTSTATUS call_seh_handlers( EXCEPTION_RECORD *rec, CONTEXT *orig_context ) }
-/******************************************************************* - * KiUserEmulationDispatcher (NTDLL.@) - */ -void dispatch_emulation( ARM64_NT_CONTEXT *arm_ctx ) -{ - context_arm_to_x64( get_arm64ec_cpu_area()->ContextAmd64, arm_ctx ); - pBeginSimulation(); -} -__ASM_GLOBAL_FUNC( "#KiUserEmulationDispatcher", - ".seh_context\n\t" - ".seh_endprologue\n\t" - "mov x0, sp\n\t" /* context */ - "bl dispatch_emulation\n\t" - "brk #1" ) - - /******************************************************************* * KiUserExceptionDispatcher (NTDLL.@) */ diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index 1f02463dffa..0daf27f6850 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -708,7 +708,6 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec rec->ExceptionFlags &= ~EXCEPTION_COLLIDED_UNWIND; break; case ExceptionCollidedUnwind: - context->ContextFlags &= ~0x40; /* clear xstate flag */ new_context = *context; RtlVirtualUnwind( UNW_FLAG_NHANDLER, dispatch.ImageBase, dispatch.ControlPc, dispatch.FunctionEntry, @@ -739,7 +738,6 @@ void WINAPI RtlUnwindEx( PVOID end_frame, PVOID target_ip, EXCEPTION_RECORD *rec rec->ExceptionFlags &= ~EXCEPTION_COLLIDED_UNWIND; break; case ExceptionCollidedUnwind: - context->ContextFlags &= ~0x40; /* clear xstate flag */ new_context = *context; RtlVirtualUnwind( UNW_FLAG_NHANDLER, dispatch.ImageBase, dispatch.ControlPc, dispatch.FunctionEntry, diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index f264f42e98d..b9047c41972 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -2547,6 +2547,7 @@ struct query_reg_values_test WINE_TODO_NAME = 0x40, WINE_TODO_TYPE = 0x80, WINE_TODO_SIZE = 0x100, + WINE_TODO_DATA = 0x200, } flags; ULONG expected_type; @@ -2610,6 +2611,7 @@ static NTSTATUS WINAPI query_routine(const WCHAR *value_name, ULONG value_type, todo_wine_if(test->flags & WINE_TODO_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)) if (expected_data == query->DefaultData || expected_data == NULL) ok(value_data == expected_data, "Expected data %p, got %p\n", expected_data, value_data); else @@ -2768,7 +2770,7 @@ static struct query_reg_values_test query_reg_values_tests[] = }, { {{ query_routine, RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"CapitalsOfEurope" }}, - STATUS_SUCCESS, 1, 0, REG_MULTI_SZ, L"Brussels\0Paris\0%PATH%\0", sizeof(L"Brussels\0Paris\0%PATH%\0") + STATUS_SUCCESS, 1, WINE_TODO_SIZE, REG_MULTI_SZ, L"Brussels\0Paris\0%PATH%\0", sizeof(L"Brussels\0Paris\0%PATH%\0") }, /* The default value is used if the registry value does not exist */ { @@ -2787,16 +2789,6 @@ 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\0%PATH%\0" }}, STATUS_SUCCESS, 3, EXPECT_DEFAULT_DATA | SPLIT_MULTI }, - { - {{ query_routine, 0, (WCHAR*)L"I don't exist", - NULL, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C", sizeof(L"A\0B\0C") }}, - STATUS_SUCCESS, 2, EXPECT_DEFAULT_DATA | SPLIT_MULTI - }, - { - {{ query_routine, 0, (WCHAR*)L"I don't exist", - NULL, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C", sizeof(L"A\0B\0C") - sizeof(L'\0') }}, - STATUS_SUCCESS, 2, EXPECT_DEFAULT_DATA | SPLIT_MULTI - }, { {{ query_routine, 0, (WCHAR*)L"I don't exist", NULL, REG_DWORD, (WCHAR*)0xdeadbeef }}, STATUS_SUCCESS, 1, EXPECT_DEFAULT_DATA @@ -2874,8 +2866,8 @@ static struct query_reg_values_test query_reg_values_tests[] = }, */ { {{ NULL, RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_NOEXPAND, (WCHAR*)L"I don't exist", - &query_reg_values_direct_str, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C", sizeof(L"A\0B\0C") - sizeof(L'\0') }}, - STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA + &query_reg_values_direct_str, REG_MULTI_SZ, (WCHAR*)L"A\0B\0C\0", sizeof(L"A\0B\0C\0") }}, + STATUS_SUCCESS, 0, EXPECT_DEFAULT_DATA | WINE_TODO_SIZE }, /* The default value is not used if it is not valid */ { @@ -2928,7 +2920,7 @@ static void test_RtlQueryRegistryValues(void) ok(status == ERROR_SUCCESS, "Failed to create registry value WindowsDrive: %lu\n", status);
status = RegSetKeyValueW(HKEY_CURRENT_USER, L"WineTest", L"CapitalsOfEurope", REG_MULTI_SZ, - L"Brussels\0Paris\0%PATH%", sizeof(L"Brussels\0Paris\0%PATH%") - sizeof(L'\0')); + L"Brussels\0Paris\0%PATH%", sizeof(L"Brussels\0Paris\0%PATH%")); ok(status == ERROR_SUCCESS, "Failed to create registry value CapitalsOfEurope: %lu\n", status);
status = RegSetKeyValueW(HKEY_CURRENT_USER, L"WineTest", L"MeaningOfLife32", REG_DWORD, @@ -3022,6 +3014,7 @@ static void test_RtlQueryRegistryValues(void)
if (expected_data) { + todo_wine_if(test->flags & WINE_TODO_DATA) ok(!memcmp(query_reg_values_direct_str.Buffer, expected_data, expected_size), "Expected data %s, got %s\n", debugstr_w(expected_data), debugstr_w(query_reg_values_direct_str.Buffer)); diff --git a/dlls/ntdll/tests/wow64.c b/dlls/ntdll/tests/wow64.c index b8b1c11bb7d..0ed151a3200 100644 --- a/dlls/ntdll/tests/wow64.c +++ b/dlls/ntdll/tests/wow64.c @@ -1829,38 +1829,6 @@ static void test_notifications( HMODULE module, CROSS_PROCESS_WORK_LIST *list ) WriteProcessMemory( GetCurrentProcess(), ptr, old_code, sizeof(old_code), NULL ); }
- if ((ptr = hook_notification_function( module, "BTCpuThreadTerm", "ThreadTerm" ))) - { - struct expected_notification expect = { 2, { 0xdead, 0xbeef } }; - - reset_results( results ); - status = NtTerminateThread( (HANDLE)0xdead, 0xbeef ); - ok( status == STATUS_INVALID_HANDLE, "NtTerminateThread failed %lx\n", status ); - expect_notifications( results, 1, &expect ); - - WriteProcessMemory( GetCurrentProcess(), ptr, old_code, sizeof(old_code), NULL ); - } - - if ((ptr = hook_notification_function( module, "BTCpuProcessTerm", "ProcessTerm" ))) - { - struct expected_notification expect[2] = - { - { 3, { 0, 0, 0 } }, - { 3, { 0, 1, 0 } } - }; - - reset_results( results ); - status = NtTerminateProcess( (HANDLE)0xdead, 0xbeef ); - ok( status == STATUS_INVALID_HANDLE, "NtTerminateProcess failed %lx\n", status ); - expect_notifications( results, 0, NULL ); - - status = NtTerminateProcess( 0, 0xbeef ); - ok( !status, "NtTerminateProcess failed %lx\n", status ); - expect_notifications( results, 2, expect ); - - WriteProcessMemory( GetCurrentProcess(), ptr, old_code, sizeof(old_code), NULL ); - } - NtClose( mapping ); NtClose( file ); VirtualFree( code, 0, MEM_RELEASE ); diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 1267469bf37..19fbfb2b68c 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -111,7 +111,6 @@ void *pKiRaiseUserExceptionDispatcher = NULL; void *pKiUserExceptionDispatcher = NULL; void *pKiUserApcDispatcher = NULL; void *pKiUserCallbackDispatcher = NULL; -void *pKiUserEmulationDispatcher = NULL; void *pLdrInitializeThunk = NULL; void *pRtlUserThreadStart = NULL; void *p__wine_ctrl_routine = NULL; @@ -1577,7 +1576,6 @@ static void load_ntdll_functions( HMODULE module ) if (is_arm64ec()) { GET_FUNC( __wine_unix_call_dispatcher_arm64ec ); - GET_FUNC( KiUserEmulationDispatcher ); } *p__wine_syscall_dispatcher = __wine_syscall_dispatcher; *p__wine_unixlib_handle = (UINT_PTR)unix_call_funcs; @@ -1671,7 +1669,6 @@ static void redirect_ntdll_functions( HMODULE module ) REDIRECT( KiUserExceptionDispatcher ); REDIRECT( KiUserApcDispatcher ); REDIRECT( KiUserCallbackDispatcher ); - REDIRECT( KiUserEmulationDispatcher ); REDIRECT( LdrInitializeThunk ); REDIRECT( RtlUserThreadStart ); #undef REDIRECT diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index b54fa30a318..667bc1108cf 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -320,21 +320,10 @@ static void restore_context( const CONTEXT *context, ucontext_t *sigcontext ) */ NTSTATUS signal_set_full_context( CONTEXT *context ) { - struct syscall_frame *frame = arm64_thread_data()->syscall_frame; NTSTATUS status = NtSetContextThread( GetCurrentThread(), context );
if (!status && (context->ContextFlags & CONTEXT_INTEGER) == CONTEXT_INTEGER) - frame->restore_flags |= CONTEXT_INTEGER; - - if (is_arm64ec() && !is_ec_code( frame->pc )) - { - CONTEXT *user_context = (CONTEXT *)((frame->sp - sizeof(CONTEXT)) & ~15); - - user_context->ContextFlags = CONTEXT_FULL; - NtGetContextThread( GetCurrentThread(), user_context ); - frame->sp = (ULONG_PTR)user_context; - frame->pc = (ULONG_PTR)pKiUserEmulationDispatcher; - } + arm64_thread_data()->syscall_frame->restore_flags |= CONTEXT_INTEGER; return status; }
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 53292246648..a2b7b9fd051 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1191,7 +1191,7 @@ NTSTATUS sock_write( HANDLE handle, int fd, HANDLE event, PIO_APC_ROUTINE apc, static const DWORD async_size = offsetof( struct async_send_ioctl, iov[1] ); struct async_send_ioctl *async;
- if (!(async = (struct async_send_ioctl *)alloc_fileio( async_size, async_send_proc, handle ))) + if (!(async = (struct async_send_ioctl *)alloc_fileio( async_size, async_recv_proc, handle ))) return STATUS_NO_MEMORY;
async->count = 1; @@ -1787,7 +1787,8 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc
if (getifaddrs( &ifaddrs ) < 0) { - return sock_errno_to_status( errno ); + status = sock_errno_to_status( errno ); + break; }
for (ifaddr = ifaddrs; ifaddr != NULL; ifaddr = ifaddr->ifa_next) diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 91267f66e76..6cd88a5acc0 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -147,7 +147,6 @@ extern void *pKiRaiseUserExceptionDispatcher; extern void *pKiUserExceptionDispatcher; extern void *pKiUserApcDispatcher; extern void *pKiUserCallbackDispatcher; -extern void *pKiUserEmulationDispatcher; extern void *pLdrInitializeThunk; extern void *pRtlUserThreadStart; extern void *p__wine_ctrl_routine; @@ -416,13 +415,6 @@ static inline BOOL is_inside_signal_stack( void *ptr ) (char *)ptr < (char *)get_signal_stack() + signal_stack_size); }
-static inline BOOL is_ec_code( ULONG_PTR ptr ) -{ - const UINT64 *map = (const UINT64 *)peb->EcCodeBitMap; - ULONG_PTR page = ptr / page_size; - return (map[page / 64] >> (page & 63)) & 1; -} - static inline void mutex_lock( pthread_mutex_t *mutex ) { if (!process_exiting) pthread_mutex_lock( mutex ); diff --git a/dlls/ntdll/unwind.h b/dlls/ntdll/unwind.h index faca8a259fb..5b29969eb81 100644 --- a/dlls/ntdll/unwind.h +++ b/dlls/ntdll/unwind.h @@ -57,7 +57,6 @@ static inline UINT eflags_to_cpsr( UINT eflags ) if (eflags & 0x0001) ret |= 0x20000000; /* carry */ if (eflags & 0x0040) ret |= 0x40000000; /* zero */ if (eflags & 0x0080) ret |= 0x80000000; /* negative */ - if (eflags & 0x0100) ret |= 0x00200000; /* trap */ if (eflags & 0x0800) ret |= 0x10000000; /* overflow */ return ret; } @@ -66,7 +65,6 @@ static inline UINT cpsr_to_eflags( UINT cpsr ) { UINT ret = 0x202;
- if (cpsr & 0x00200000) ret |= 0x0100; /* trap */ if (cpsr & 0x10000000) ret |= 0x0800; /* overflow */ if (cpsr & 0x20000000) ret |= 0x0001; /* carry */ if (cpsr & 0x40000000) ret |= 0x0040; /* zero */ diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 48deda7c455..36983e2c8b8 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -59,6 +59,9 @@ static BOOL (WINAPI *pRtlFreeUnicodeString)(UNICODE_STRING *); static BOOL (WINAPI *pCancelIoEx)(HANDLE, OVERLAPPED *); static BOOL (WINAPI *pIsWow64Process)(HANDLE, BOOL *); static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR); +static HRESULT (WINAPI *pSignerSign)(SIGNER_SUBJECT_INFO *subject, SIGNER_CERT *cert, + SIGNER_SIGNATURE_INFO *signature, SIGNER_PROVIDER_INFO *provider, + const WCHAR *timestamp, CRYPT_ATTRIBUTES *attr, void *sip_data);
static void load_resource(const WCHAR *name, WCHAR *filename) { @@ -246,10 +249,6 @@ static void testsign_cleanup(struct testsign_context *ctx)
static void testsign_sign(struct testsign_context *ctx, const WCHAR *filename) { - static HRESULT (WINAPI *pSignerSign)(SIGNER_SUBJECT_INFO *subject, SIGNER_CERT *cert, - SIGNER_SIGNATURE_INFO *signature, SIGNER_PROVIDER_INFO *provider, - const WCHAR *timestamp, CRYPT_ATTRIBUTES *attr, void *sip_data); - SIGNER_ATTR_AUTHCODE authcode = {sizeof(authcode)}; SIGNER_SIGNATURE_INFO signature = {sizeof(signature)}; SIGNER_SUBJECT_INFO subject = {sizeof(subject)}; @@ -259,9 +258,6 @@ static void testsign_sign(struct testsign_context *ctx, const WCHAR *filename) DWORD index = 0; HRESULT hr;
- if (!pSignerSign) - pSignerSign = (void *)GetProcAddress(LoadLibraryA("mssign32"), "SignerSign"); - subject.dwSubjectChoice = 1; subject.pdwIndex = &index; subject.pSignerFileInfo = &file; @@ -1319,6 +1315,7 @@ static void add_file_to_catalog(HANDLE catalog, const WCHAR *file) { SIP_SUBJECTINFO subject_info = {sizeof(SIP_SUBJECTINFO)}; SIP_INDIRECT_DATA *indirect_data; + const WCHAR *filepart = file; CRYPTCATMEMBER *member; WCHAR hash_buffer[100]; GUID subject_guid; @@ -1333,6 +1330,7 @@ static void add_file_to_catalog(HANDLE catalog, const WCHAR *file) subject_info.pgSubjectType = &subject_guid; subject_info.pwsFileName = file; subject_info.DigestAlgorithm.pszObjId = (char *)szOID_OIWSEC_sha1; + subject_info.dwFlags = SPC_INC_PE_RESOURCES_FLAG | SPC_INC_PE_IMPORT_ADDR_TABLE_FLAG | SPC_EXC_PE_PAGE_HASHES_FLAG | 0x10000; ret = CryptSIPCreateIndirectData(&subject_info, &size, NULL); todo_wine ok(ret, "Failed to get indirect data size, error %lu\n", GetLastError());
@@ -1348,6 +1346,19 @@ static void add_file_to_catalog(HANDLE catalog, const WCHAR *file) member = CryptCATPutMemberInfo(catalog, (WCHAR *)file, hash_buffer, &subject_guid, 0, size, (BYTE *)indirect_data); ok(!!member, "Failed to write member, error %lu\n", GetLastError()); + + if (wcsrchr(file, '\')) + filepart = wcsrchr(file, '\') + 1; + + ret = !!CryptCATPutAttrInfo(catalog, member, (WCHAR *)L"File", + CRYPTCAT_ATTR_NAMEASCII | CRYPTCAT_ATTR_DATAASCII | CRYPTCAT_ATTR_AUTHENTICATED, + (wcslen(filepart) + 1) * 2, (BYTE *)filepart); + ok(ret, "Failed to write attr, error %lu\n", GetLastError()); + + ret = !!CryptCATPutAttrInfo(catalog, member, (WCHAR *)L"OSAttr", + CRYPTCAT_ATTR_NAMEASCII | CRYPTCAT_ATTR_DATAASCII | CRYPTCAT_ATTR_AUTHENTICATED, + sizeof(L"2:6.0"), (BYTE *)L"2:6.0"); + ok(ret, "Failed to write attr, error %lu\n", GetLastError()); }
free(indirect_data); @@ -1894,6 +1905,7 @@ START_TEST(ntoskrnl) pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process"); pSetFileCompletionNotificationModes = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "SetFileCompletionNotificationModes"); + pSignerSign = (void *)GetProcAddress(LoadLibraryA("mssign32"), "SignerSign");
if (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64) { diff --git a/dlls/odbc32/odbc32.spec b/dlls/odbc32/odbc32.spec index 0de9bf2bf70..f94eaabea26 100644 --- a/dlls/odbc32/odbc32.spec +++ b/dlls/odbc32/odbc32.spec @@ -5,16 +5,16 @@ 5 stdcall SQLCancel(long) 6 stdcall SQLColAttributes(long long long ptr long ptr ptr) 7 stdcall SQLConnect(long str long str long str long) - 8 stdcall SQLDescribeCol(long long ptr long ptr ptr ptr ptr ptr) + 8 stdcall SQLDescribeCol(long long str long ptr ptr ptr ptr ptr) 9 stdcall SQLDisconnect(long) - 10 stdcall SQLError(long long long ptr ptr ptr long ptr) + 10 stdcall SQLError(long long long str ptr str long ptr) 11 stdcall SQLExecDirect(long str long) 12 stdcall SQLExecute(long) 13 stdcall SQLFetch(long) 14 stdcall SQLFreeConnect(long) 15 stdcall SQLFreeEnv(long) 16 stdcall SQLFreeStmt(long long ) - 17 stdcall SQLGetCursorName(long ptr long ptr) + 17 stdcall SQLGetCursorName(long str long ptr) 18 stdcall SQLNumResultCols(long ptr) 19 stdcall SQLPrepare(long str long) 20 stdcall SQLRowCount(long ptr) @@ -31,14 +31,14 @@ 31 stdcall SQLFreeHandle(long long) 32 stdcall SQLGetConnectAttr(long long ptr long ptr) 33 stdcall SQLGetDescField(long long long ptr long ptr) - 34 stdcall SQLGetDescRec(long long ptr long ptr ptr ptr ptr ptr ptr ptr) + 34 stdcall SQLGetDescRec(long long str long ptr ptr ptr ptr ptr ptr ptr) 35 stdcall SQLGetDiagField(long long long long ptr long ptr) - 36 stdcall SQLGetDiagRec(long long long ptr ptr ptr long ptr) + 36 stdcall SQLGetDiagRec(long long long str ptr str long ptr) 37 stdcall SQLGetEnvAttr(long long ptr long ptr) 38 stdcall SQLGetStmtAttr(long long ptr long ptr) 39 stdcall SQLSetConnectAttr(long long ptr long) 40 stdcall SQLColumns(long str long str long str long str long) - 41 stdcall SQLDriverConnect(long long str long ptr long ptr long) + 41 stdcall SQLDriverConnect(long long str long str long ptr long) 42 stdcall SQLGetConnectOption(long long ptr) 43 stdcall SQLGetData(long long long ptr long ptr) 44 stdcall SQLGetFunctions(long long ptr) @@ -52,14 +52,14 @@ 52 stdcall SQLSpecialColumns(long long str long str long str long long long) 53 stdcall SQLStatistics(long str long str long str long long long) 54 stdcall SQLTables(long str long str long str long str long) - 55 stdcall SQLBrowseConnect(long str long ptr long ptr) + 55 stdcall SQLBrowseConnect(long str long str long ptr) 56 stdcall SQLColumnPrivileges(long str long str long str long str long) - 57 stdcall SQLDataSources(long long str long ptr ptr long ptr) + 57 stdcall SQLDataSources(long long str long ptr str long ptr) 58 stdcall SQLDescribeParam(long long ptr ptr ptr ptr) 59 stdcall SQLExtendedFetch(long long long ptr ptr) 60 stdcall SQLForeignKeys(long str long str long str long str long str long str long) 61 stdcall SQLMoreResults(long) - 62 stdcall SQLNativeSql(long str long ptr long ptr) + 62 stdcall SQLNativeSql(long str long str long ptr) 63 stdcall SQLNumParams(long ptr) 64 stdcall SQLParamOptions(long long ptr) 65 stdcall SQLPrimaryKeys(long str long str long str long) @@ -68,7 +68,7 @@ 68 stdcall SQLSetPos(long long long long) 69 stdcall SQLSetScrollOptions(long long long long) 70 stdcall SQLTablePrivileges(long str long str long str long) - 71 stdcall SQLDrivers(long long str long ptr ptr long ptr) + 71 stdcall SQLDrivers(long long str long ptr str long ptr) 72 stdcall SQLBindParameter(long long long long long long long ptr long ptr) 73 stdcall SQLSetDescField(long long long ptr long) 74 stdcall SQLSetDescRec(long long long long long long long ptr ptr ptr) @@ -88,22 +88,22 @@ 90 stub ODBCSharedVSFlag 106 stdcall SQLColAttributesW(long long long ptr long ptr ptr) 107 stdcall SQLConnectW(long wstr long wstr long wstr long) -108 stdcall SQLDescribeColW(long long ptr long ptr ptr ptr ptr ptr) -110 stdcall SQLErrorW(long long long ptr ptr ptr long ptr) -111 stdcall SQLExecDirectW(long ptr long) -117 stdcall SQLGetCursorNameW(long ptr long ptr) +108 stdcall SQLDescribeColW(long long wstr long ptr ptr ptr ptr ptr) +110 stdcall SQLErrorW(long long long wstr ptr wstr long ptr) +111 stdcall SQLExecDirectW(long wstr long) +117 stdcall SQLGetCursorNameW(long wstr long ptr) 119 stdcall SQLPrepareW(long wstr long) 121 stdcall SQLSetCursorNameW(long wstr long) 127 stdcall SQLColAttributeW(long long long ptr long ptr ptr) 132 stdcall SQLGetConnectAttrW(long long ptr long ptr) 133 stdcall SQLGetDescFieldW(long long long ptr long ptr) -134 stdcall SQLGetDescRecW(long long ptr long ptr ptr ptr ptr ptr ptr ptr) +134 stdcall SQLGetDescRecW(long long wstr long ptr ptr ptr ptr ptr ptr ptr) 135 stdcall SQLGetDiagFieldW(long long long long ptr long ptr) -136 stdcall SQLGetDiagRecW(long long long ptr ptr ptr long ptr) +136 stdcall SQLGetDiagRecW(long long long wstr ptr wstr long ptr) 138 stdcall SQLGetStmtAttrW(long long ptr long ptr) 139 stdcall SQLSetConnectAttrW(long long ptr long) 140 stdcall SQLColumnsW(long wstr long wstr long wstr long wstr long) -141 stdcall SQLDriverConnectW(long long wstr long ptr long ptr long) +141 stdcall SQLDriverConnectW(long long wstr long wstr long ptr long) 142 stdcall SQLGetConnectOptionW(long long ptr) 145 stdcall SQLGetInfoW(long long ptr long ptr) 147 stdcall SQLGetTypeInfoW(long long) @@ -111,16 +111,16 @@ 152 stdcall SQLSpecialColumnsW(long long wstr long wstr long wstr long long long) 153 stdcall SQLStatisticsW(long wstr long wstr long wstr long long long) 154 stdcall SQLTablesW(long wstr long wstr long wstr long wstr long) -155 stdcall SQLBrowseConnectW(long wstr long ptr long ptr) +155 stdcall SQLBrowseConnectW(long wstr long wstr long ptr) 156 stdcall SQLColumnPrivilegesW(long wstr long wstr long wstr long wstr long) -157 stdcall SQLDataSourcesW(long long wstr long ptr ptr long ptr) +157 stdcall SQLDataSourcesW(long long wstr long ptr wstr long ptr) 160 stdcall SQLForeignKeysW(long wstr long wstr long wstr long wstr long wstr long wstr long) -162 stdcall SQLNativeSqlW(long wstr long ptr long ptr) +162 stdcall SQLNativeSqlW(long wstr long wstr long ptr) 165 stdcall SQLPrimaryKeysW(long wstr long wstr long wstr long) 166 stdcall SQLProcedureColumnsW(long wstr long wstr long wstr long wstr long) 167 stdcall SQLProceduresW(long wstr long wstr long wstr long) 170 stdcall SQLTablePrivilegesW(long wstr long wstr long wstr long) -171 stdcall SQLDriversW(long long wstr long ptr ptr long ptr) +171 stdcall SQLDriversW(long long wstr long ptr wstr long ptr) 173 stdcall SQLSetDescFieldW(long long long ptr long) 176 stdcall SQLSetStmtAttrW(long long ptr long) 206 stub SQLColAttributesA @@ -136,7 +136,7 @@ 233 stub SQLGetDescFieldA 234 stub SQLGetDescRecA 235 stub SQLGetDiagFieldA -236 stdcall SQLGetDiagRecA(long long long ptr ptr ptr long ptr) SQLGetDiagRec +236 stdcall SQLGetDiagRecA(long long long ptr ptr ptr long ptr) 238 stub SQLGetStmtAttrA 239 stub SQLSetConnectAttrA 240 stub SQLColumnsA @@ -150,7 +150,7 @@ 254 stub SQLTablesA 255 stub SQLBrowseConnectA 256 stub SQLColumnPrivilegesA -257 stdcall SQLDataSourcesA(long long str long ptr ptr long ptr) SQLDataSources +257 stdcall SQLDataSourcesA(long long str long ptr str long ptr) 260 stub SQLForeignKeysA 262 stub SQLNativeSqlA 265 stub SQLPrimaryKeysA diff --git a/dlls/odbc32/proxyodbc.c b/dlls/odbc32/proxyodbc.c index c2625fc5f8a..57930e59ad4 100644 --- a/dlls/odbc32/proxyodbc.c +++ b/dlls/odbc32/proxyodbc.c @@ -44,147 +44,147 @@ static BOOL is_wow64;
struct win32_funcs { - SQLRETURN (WINAPI *SQLAllocConnect)(SQLHENV,SQLHDBC*); - SQLRETURN (WINAPI *SQLAllocEnv)(SQLHENV*); - SQLRETURN (WINAPI *SQLAllocHandle)(SQLSMALLINT,SQLHANDLE,SQLHANDLE*); - SQLRETURN (WINAPI *SQLAllocHandleStd)(SQLSMALLINT,SQLHANDLE,SQLHANDLE*); - SQLRETURN (WINAPI *SQLAllocStmt)(SQLHDBC,SQLHSTMT*); - SQLRETURN (WINAPI *SQLBindCol)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); - SQLRETURN (WINAPI *SQLBindParameter)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN, + SQLRETURN WINAPI (*SQLAllocConnect)(SQLHENV,SQLHDBC*); + SQLRETURN WINAPI (*SQLAllocEnv)(SQLHENV*); + SQLRETURN WINAPI (*SQLAllocHandle)(SQLSMALLINT,SQLHANDLE,SQLHANDLE*); + SQLRETURN WINAPI (*SQLAllocHandleStd)(SQLSMALLINT,SQLHANDLE,SQLHANDLE*); + SQLRETURN WINAPI (*SQLAllocStmt)(SQLHDBC,SQLHSTMT*); + SQLRETURN WINAPI (*SQLBindCol)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); + SQLRETURN WINAPI (*SQLBindParameter)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN, SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); - SQLRETURN (WINAPI *SQLBrowseConnect)(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLBrowseConnectW)(SQLHDBC,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLBulkOperations)(SQLHSTMT,SQLSMALLINT); - SQLRETURN (WINAPI *SQLCancel)(SQLHSTMT); - SQLRETURN (WINAPI *SQLCloseCursor)(SQLHSTMT); - SQLRETURN (WINAPI *SQLColAttribute)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLBrowseConnect)(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLBrowseConnectW)(SQLHDBC,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLBulkOperations)(SQLHSTMT,SQLSMALLINT); + SQLRETURN WINAPI (*SQLCancel)(SQLHSTMT); + SQLRETURN WINAPI (*SQLCloseCursor)(SQLHSTMT); + SQLRETURN WINAPI (*SQLColAttribute)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, SQLLEN*); - SQLRETURN (WINAPI *SQLColAttributeW)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLColAttributeW)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, SQLLEN*); - SQLRETURN (WINAPI *SQLColAttributes)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLColAttributes)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, SQLLEN*); - SQLRETURN (WINAPI *SQLColAttributesW)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLColAttributesW)(SQLHSTMT,SQLUSMALLINT,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*, SQLLEN*); - SQLRETURN (WINAPI *SQLColumnPrivileges)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLColumnPrivileges)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLColumnPrivilegesW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLColumnPrivilegesW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLColumns)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*, + SQLRETURN WINAPI (*SQLColumns)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*, SQLSMALLINT); - SQLRETURN (WINAPI *SQLColumnsW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLColumnsW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, SQLWCHAR*, SQLSMALLINT); - SQLRETURN (WINAPI *SQLConnect)(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLConnectW)(SQLHDBC,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLCopyDesc)(SQLHDESC,SQLHDESC); - SQLRETURN (WINAPI *SQLDescribeCol)(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*, + SQLRETURN WINAPI (*SQLConnect)(SQLHDBC,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLConnectW)(SQLHDBC,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLCopyDesc)(SQLHDESC,SQLHDESC); + SQLRETURN WINAPI (*SQLDescribeCol)(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*, SQLSMALLINT*,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLDescribeColW)(SQLHSTMT,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*, + SQLRETURN WINAPI (*SQLDescribeColW)(SQLHSTMT,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*,SQLULEN*, SQLSMALLINT*,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLDescribeParam)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT*,SQLULEN*,SQLSMALLINT*,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLDisconnect)(SQLHDBC); - SQLRETURN (WINAPI *SQLDriverConnect)(SQLHDBC,SQLHWND,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLDescribeParam)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT*,SQLULEN*,SQLSMALLINT*,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLDisconnect)(SQLHDBC); + SQLRETURN WINAPI (*SQLDriverConnect)(SQLHDBC,SQLHWND,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*, SQLUSMALLINT); - SQLRETURN (WINAPI *SQLDriverConnectW)(SQLHDBC,SQLHWND,WCHAR*,SQLSMALLINT,WCHAR*,SQLSMALLINT,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLDriverConnectW)(SQLHDBC,SQLHWND,WCHAR*,SQLSMALLINT,WCHAR*,SQLSMALLINT,SQLSMALLINT*, SQLUSMALLINT); - SQLRETURN (WINAPI *SQLEndTran)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT); - SQLRETURN (WINAPI *SQLError)(SQLHENV,SQLHDBC,SQLHSTMT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLErrorW)(SQLHENV,SQLHDBC,SQLHSTMT,SQLWCHAR*,SQLINTEGER*,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLExecDirect)(SQLHSTMT,SQLCHAR*,SQLINTEGER); - SQLRETURN (WINAPI *SQLExecDirectW)(SQLHSTMT,SQLWCHAR*,SQLINTEGER); - SQLRETURN (WINAPI *SQLExecute)(SQLHSTMT); - SQLRETURN (WINAPI *SQLExtendedFetch)(SQLHSTMT,SQLUSMALLINT,SQLLEN,SQLULEN*,SQLUSMALLINT*); - SQLRETURN (WINAPI *SQLFetch)(SQLHSTMT); - SQLRETURN (WINAPI *SQLFetchScroll)(SQLHSTMT,SQLSMALLINT,SQLLEN); - SQLRETURN (WINAPI *SQLForeignKeys)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLEndTran)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT); + SQLRETURN WINAPI (*SQLError)(SQLHENV,SQLHDBC,SQLHSTMT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLErrorW)(SQLHENV,SQLHDBC,SQLHSTMT,SQLWCHAR*,SQLINTEGER*,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLExecDirect)(SQLHSTMT,SQLCHAR*,SQLINTEGER); + SQLRETURN WINAPI (*SQLExecDirectW)(SQLHSTMT,SQLWCHAR*,SQLINTEGER); + SQLRETURN WINAPI (*SQLExecute)(SQLHSTMT); + SQLRETURN WINAPI (*SQLExtendedFetch)(SQLHSTMT,SQLUSMALLINT,SQLLEN,SQLULEN*,SQLUSMALLINT*); + SQLRETURN WINAPI (*SQLFetch)(SQLHSTMT); + SQLRETURN WINAPI (*SQLFetchScroll)(SQLHSTMT,SQLSMALLINT,SQLLEN); + SQLRETURN WINAPI (*SQLForeignKeys)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLForeignKeysW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLForeignKeysW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLFreeConnect)(SQLHDBC); - SQLRETURN (WINAPI *SQLFreeEnv)(SQLHENV); - SQLRETURN (WINAPI *SQLFreeHandle)(SQLSMALLINT,SQLHANDLE); - SQLRETURN (WINAPI *SQLFreeStmt)(SQLHSTMT,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLGetConnectAttr)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetConnectAttrW)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetConnectOption)(SQLHDBC,SQLUSMALLINT,SQLPOINTER); - SQLRETURN (WINAPI *SQLGetConnectOptionW)(SQLHDBC,SQLUSMALLINT,SQLPOINTER); - SQLRETURN (WINAPI *SQLGetCursorName)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetCursorNameW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetData)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); - SQLRETURN (WINAPI *SQLGetDescField)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetDescFieldW)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetDescRec)(SQLHDESC,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLFreeConnect)(SQLHDBC); + SQLRETURN WINAPI (*SQLFreeEnv)(SQLHENV); + SQLRETURN WINAPI (*SQLFreeHandle)(SQLSMALLINT,SQLHANDLE); + SQLRETURN WINAPI (*SQLFreeStmt)(SQLHSTMT,SQLUSMALLINT); + SQLRETURN WINAPI (*SQLGetConnectAttr)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetConnectAttrW)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetConnectOption)(SQLHDBC,SQLUSMALLINT,SQLPOINTER); + SQLRETURN WINAPI (*SQLGetConnectOptionW)(SQLHDBC,SQLUSMALLINT,SQLPOINTER); + SQLRETURN WINAPI (*SQLGetCursorName)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLGetCursorNameW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLGetData)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLPOINTER,SQLLEN,SQLLEN*); + SQLRETURN WINAPI (*SQLGetDescField)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetDescFieldW)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetDescRec)(SQLHDESC,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*, SQLSMALLINT*,SQLLEN*,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetDescRecW)(SQLHDESC,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*, + SQLRETURN WINAPI (*SQLGetDescRecW)(SQLHDESC,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLSMALLINT*,SQLSMALLINT*, SQLSMALLINT*,SQLLEN*,SQLSMALLINT*,SQLSMALLINT*,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetDiagField)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT, + SQLRETURN WINAPI (*SQLGetDiagField)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT, SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetDiagFieldW)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT, + SQLRETURN WINAPI (*SQLGetDiagFieldW)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLSMALLINT, SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetDiagRec)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLGetDiagRec)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLCHAR*,SQLINTEGER*,SQLCHAR*,SQLSMALLINT, SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetDiagRecW)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLWCHAR*,SQLINTEGER*,SQLWCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLGetDiagRecW)(SQLSMALLINT,SQLHANDLE,SQLSMALLINT,SQLWCHAR*,SQLINTEGER*,SQLWCHAR*,SQLSMALLINT, SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetEnvAttr)(SQLHENV,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetFunctions)(SQLHDBC,SQLUSMALLINT,SQLUSMALLINT*); - SQLRETURN (WINAPI *SQLGetInfo)(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetInfoW)(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLGetStmtAttr)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetStmtAttrW)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLGetStmtOption)(SQLHSTMT,SQLUSMALLINT,SQLPOINTER); - SQLRETURN (WINAPI *SQLGetTypeInfo)(SQLHSTMT,SQLSMALLINT); - SQLRETURN (WINAPI *SQLGetTypeInfoW)(SQLHSTMT,SQLSMALLINT); - SQLRETURN (WINAPI *SQLMoreResults)(SQLHSTMT); - SQLRETURN (WINAPI *SQLNativeSql)(SQLHDBC,SQLCHAR*,SQLINTEGER,SQLCHAR*,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLNativeSqlW)(SQLHDBC,SQLWCHAR*,SQLINTEGER,SQLWCHAR*,SQLINTEGER,SQLINTEGER*); - SQLRETURN (WINAPI *SQLNumParams)(SQLHSTMT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLNumResultCols)(SQLHSTMT,SQLSMALLINT*); - SQLRETURN (WINAPI *SQLParamData)(SQLHSTMT,SQLPOINTER*); - SQLRETURN (WINAPI *SQLParamOptions)(SQLHSTMT,SQLULEN,SQLULEN*); - SQLRETURN (WINAPI *SQLPrepare)(SQLHSTMT,SQLCHAR*,SQLINTEGER); - SQLRETURN (WINAPI *SQLPrepareW)(SQLHSTMT,SQLWCHAR*,SQLINTEGER); - SQLRETURN (WINAPI *SQLPrimaryKeys)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLPrimaryKeysW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLProcedureColumns)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLGetEnvAttr)(SQLHENV,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetFunctions)(SQLHDBC,SQLUSMALLINT,SQLUSMALLINT*); + SQLRETURN WINAPI (*SQLGetInfo)(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLGetInfoW)(SQLHDBC,SQLUSMALLINT,SQLPOINTER,SQLSMALLINT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLGetStmtAttr)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetStmtAttrW)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLGetStmtOption)(SQLHSTMT,SQLUSMALLINT,SQLPOINTER); + SQLRETURN WINAPI (*SQLGetTypeInfo)(SQLHSTMT,SQLSMALLINT); + SQLRETURN WINAPI (*SQLGetTypeInfoW)(SQLHSTMT,SQLSMALLINT); + SQLRETURN WINAPI (*SQLMoreResults)(SQLHSTMT); + SQLRETURN WINAPI (*SQLNativeSql)(SQLHDBC,SQLCHAR*,SQLINTEGER,SQLCHAR*,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLNativeSqlW)(SQLHDBC,SQLWCHAR*,SQLINTEGER,SQLWCHAR*,SQLINTEGER,SQLINTEGER*); + SQLRETURN WINAPI (*SQLNumParams)(SQLHSTMT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLNumResultCols)(SQLHSTMT,SQLSMALLINT*); + SQLRETURN WINAPI (*SQLParamData)(SQLHSTMT,SQLPOINTER*); + SQLRETURN WINAPI (*SQLParamOptions)(SQLHSTMT,SQLULEN,SQLULEN*); + SQLRETURN WINAPI (*SQLPrepare)(SQLHSTMT,SQLCHAR*,SQLINTEGER); + SQLRETURN WINAPI (*SQLPrepareW)(SQLHSTMT,SQLWCHAR*,SQLINTEGER); + SQLRETURN WINAPI (*SQLPrimaryKeys)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLPrimaryKeysW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLProcedureColumns)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLProcedureColumnsW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLProcedureColumnsW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLProcedures)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLProceduresW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLPutData)(SQLHSTMT,SQLPOINTER,SQLLEN); - SQLRETURN (WINAPI *SQLRowCount)(SQLHSTMT,SQLLEN*); - SQLRETURN (WINAPI *SQLSetConnectAttr)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetConnectAttrW)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetConnectOption)(SQLHDBC,SQLUSMALLINT,SQLULEN); - SQLRETURN (WINAPI *SQLSetConnectOptionW)(SQLHDBC,SQLUSMALLINT,SQLULEN); - SQLRETURN (WINAPI *SQLSetCursorName)(SQLHSTMT,SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLSetCursorNameW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLSetDescField)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetDescFieldW)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetDescRec)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLLEN,SQLSMALLINT,SQLSMALLINT, + SQLRETURN WINAPI (*SQLProcedures)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLProceduresW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLPutData)(SQLHSTMT,SQLPOINTER,SQLLEN); + SQLRETURN WINAPI (*SQLRowCount)(SQLHSTMT,SQLLEN*); + SQLRETURN WINAPI (*SQLSetConnectAttr)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetConnectAttrW)(SQLHDBC,SQLINTEGER,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetConnectOption)(SQLHDBC,SQLUSMALLINT,SQLULEN); + SQLRETURN WINAPI (*SQLSetConnectOptionW)(SQLHDBC,SQLUSMALLINT,SQLULEN); + SQLRETURN WINAPI (*SQLSetCursorName)(SQLHSTMT,SQLCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLSetCursorNameW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLSetDescField)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetDescFieldW)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetDescRec)(SQLHDESC,SQLSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLLEN,SQLSMALLINT,SQLSMALLINT, SQLPOINTER,SQLLEN*,SQLLEN*); - SQLRETURN (WINAPI *SQLSetEnvAttr)(SQLHENV,SQLINTEGER,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetParam)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN,SQLSMALLINT,SQLPOINTER, + SQLRETURN WINAPI (*SQLSetEnvAttr)(SQLHENV,SQLINTEGER,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetParam)(SQLHSTMT,SQLUSMALLINT,SQLSMALLINT,SQLSMALLINT,SQLULEN,SQLSMALLINT,SQLPOINTER, SQLLEN*); - SQLRETURN (WINAPI *SQLSetPos)(SQLHSTMT,SQLSETPOSIROW,SQLUSMALLINT,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLSetScrollOptions)(SQLHSTMT,SQLUSMALLINT,SQLLEN,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLSetStmtAttr)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetStmtAttrW)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); - SQLRETURN (WINAPI *SQLSetStmtOption)(SQLHSTMT,SQLUSMALLINT,SQLULEN); - SQLRETURN (WINAPI *SQLSpecialColumns)(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*, + SQLRETURN WINAPI (*SQLSetPos)(SQLHSTMT,SQLSETPOSIROW,SQLUSMALLINT,SQLUSMALLINT); + SQLRETURN WINAPI (*SQLSetScrollOptions)(SQLHSTMT,SQLUSMALLINT,SQLLEN,SQLUSMALLINT); + SQLRETURN WINAPI (*SQLSetStmtAttr)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetStmtAttrW)(SQLHSTMT,SQLINTEGER,SQLPOINTER,SQLINTEGER); + SQLRETURN WINAPI (*SQLSetStmtOption)(SQLHSTMT,SQLUSMALLINT,SQLULEN); + SQLRETURN WINAPI (*SQLSpecialColumns)(SQLHSTMT,SQLUSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*, SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLSpecialColumnsW)(SQLHSTMT,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*, + SQLRETURN WINAPI (*SQLSpecialColumnsW)(SQLHSTMT,SQLUSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*, SQLSMALLINT,SQLUSMALLINT,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLStatistics)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLStatistics)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT, SQLUSMALLINT,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLStatisticsW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, + SQLRETURN WINAPI (*SQLStatisticsW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT, SQLUSMALLINT,SQLUSMALLINT); - SQLRETURN (WINAPI *SQLTablePrivileges)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLTablePrivilegesW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); - SQLRETURN (WINAPI *SQLTables)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*, + SQLRETURN WINAPI (*SQLTablePrivileges)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLTablePrivilegesW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT); + SQLRETURN WINAPI (*SQLTables)(SQLHSTMT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*,SQLSMALLINT,SQLCHAR*, SQLSMALLINT); - SQLRETURN (WINAPI *SQLTablesW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*, + SQLRETURN WINAPI (*SQLTablesW)(SQLHSTMT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*,SQLSMALLINT,SQLWCHAR*, SQLSMALLINT); - SQLRETURN (WINAPI *SQLTransact)(SQLHENV,SQLHDBC,SQLUSMALLINT); + SQLRETURN WINAPI (*SQLTransact)(SQLHENV,SQLHDBC,SQLUSMALLINT); };
struct win32_driver @@ -338,20 +338,32 @@ static const struct win32_funcs *load_driver( const WCHAR *filename ) { HMODULE module; struct win32_driver *driver; - WCHAR *ptr; + WCHAR *ptr, *path = wcsdup( filename ); UINT32 i;
for (i = 0; i < win32_drivers.count; i++) { - if (!wcsicmp( filename, win32_drivers.drivers[i]->filename )) return &win32_drivers.drivers[i]->funcs; + if (!wcsicmp( filename, win32_drivers.drivers[i]->filename )) + { + free( path ); + return &win32_drivers.drivers[i]->funcs; + } }
- if (!(driver = malloc( sizeof(*driver) + (wcslen(filename) + 1) * sizeof(WCHAR) ))) return NULL; + if (!(driver = malloc( sizeof(*driver) + (wcslen(filename) + 1) * sizeof(WCHAR) ))) + { + free( path ); + return NULL; + } ptr = (WCHAR *)(driver + 1); wcscpy( ptr, filename ); driver->filename = ptr;
- module = LoadLibraryExW( filename, NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS ); + if ((ptr = wcsrchr( path, '\' )) || (ptr = wcsrchr( path, '/' ))) *ptr = 0; + SetDllDirectoryW( path ); + module = LoadLibraryW( filename ); + SetDllDirectoryW( NULL ); + free( path ); if (!module) { free( driver ); @@ -373,7 +385,6 @@ static struct handle *create_handle( struct handle *parent ) struct handle *ret; if (!(ret = calloc( 1, sizeof(*ret) ))) return NULL; ret->parent = parent; - ret->env_attr_version = SQL_OV_ODBC2; ret->row_count = 1; return ret; } @@ -662,52 +673,6 @@ SQLRETURN WINAPI SQLCloseCursor(SQLHSTMT StatementHandle) return ret; }
-static SQLRETURN col_attribute_unix_a( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attr, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attr ) -{ - SQLRETURN ret; - INT64 attr; - struct SQLColAttribute_params params = { handle->unix_handle, col, field_id, char_attr, buflen, retlen, &attr }; - if (SUCCESS((ret = ODBC_CALL( SQLColAttribute, ¶ms ))) && num_attr) *num_attr = attr; - return ret; -} - -static SQLRETURN col_attribute_win32_a( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attr, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attr ) -{ - SQLRETURN ret = SQL_ERROR; - - if (handle->win32_funcs->SQLColAttribute) - { - return handle->win32_funcs->SQLColAttribute( handle->win32_handle, col, field_id, char_attr, buflen, - retlen, num_attr ); - } - if (handle->win32_funcs->SQLColAttributeW) - { - if (buflen < 0) - ret = handle->win32_funcs->SQLColAttributeW( handle->win32_handle, col, field_id, char_attr, buflen, - retlen, num_attr ); - else - { - SQLWCHAR *strW; - SQLSMALLINT lenW; - - if (!(strW = malloc( buflen * sizeof(WCHAR) ))) return SQL_ERROR; - ret = handle->win32_funcs->SQLColAttributeW( handle->win32_handle, col, field_id, strW, buflen, &lenW, - num_attr ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, strW, -1, char_attr, buflen, NULL, NULL ); - if (retlen) *retlen = len - 1; - } - free( strW ); - } - } - return ret; -} - /************************************************************************* * SQLColAttribute [ODBC32.027] */ @@ -726,79 +691,22 @@ SQLRETURN WINAPI SQLColAttribute(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNu
if (handle->unix_handle) { - ret = col_attribute_unix_a( handle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, - StringLength, NumericAttribute ); + INT64 num_attr = 0; + struct SQLColAttribute_params params = { handle->unix_handle, ColumnNumber, FieldIdentifier, + CharacterAttribute, BufferLength, StringLength, &num_attr }; + if (SUCCESS(( ret = ODBC_CALL( SQLColAttribute, ¶ms ))) && NumericAttribute) + *NumericAttribute = num_attr; } else if (handle->win32_handle) { - ret = col_attribute_win32_a( handle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, - StringLength, NumericAttribute ); + ret = handle->win32_funcs->SQLColAttribute( handle->win32_handle, ColumnNumber, FieldIdentifier, + CharacterAttribute, BufferLength, StringLength, NumericAttribute ); }
TRACE("Returning %d\n", ret); return ret; }
-static const char *debugstr_sqlstr( const SQLCHAR *str, SQLSMALLINT len ) -{ - if (len == SQL_NTS) len = strlen( (const char *)str ); - return wine_dbgstr_an( (const char *)str, len ); -} - -static SQLWCHAR *strnAtoW( const SQLCHAR *str, int len ) -{ - SQLWCHAR *ret; - int lenW; - - if (!str) return NULL; - - if (len == SQL_NTS) len = strlen( (const char *)str ); - lenW = MultiByteToWideChar( CP_ACP, 0, (const char *)str, len, NULL, 0 ); - if ((ret = malloc( (lenW + 1) * sizeof(SQLWCHAR) ))) - { - MultiByteToWideChar( CP_ACP, 0, (const char *)str, len, ret, lenW ); - ret[lenW] = 0; - } - return ret; -} - -static SQLRETURN columns_unix_a( struct handle *handle, SQLCHAR *catalog, SQLSMALLINT len1, SQLCHAR *schema, - SQLSMALLINT len2, SQLCHAR *table, SQLSMALLINT len3, SQLCHAR *column, - SQLSMALLINT len4 ) -{ - struct SQLColumns_params params = { handle->unix_handle, catalog, len1, schema, len2, table, len3, column, len4 }; - return ODBC_CALL( SQLColumns, ¶ms ); -} - -static SQLRETURN columns_win32_a( struct handle *handle, SQLCHAR *catalog, SQLSMALLINT len1, SQLCHAR *schema, - SQLSMALLINT len2, SQLCHAR *table, SQLSMALLINT len3, SQLCHAR *column, - SQLSMALLINT len4 ) -{ - SQLWCHAR *catalogW = NULL, *schemaW = NULL, *tableW = NULL, *columnW = NULL; - SQLRETURN ret = SQL_ERROR; - - if (handle->win32_funcs->SQLColumns) - { - return handle->win32_funcs->SQLColumns( handle->win32_handle, catalog, len1, schema, len2, table, len3, - column, len4 ); - } - if (handle->win32_funcs->SQLColumnsW) - { - if (!(catalogW = strnAtoW( catalog, len1 ))) return SQL_ERROR; - if (!(schemaW = strnAtoW( schema, len2 ))) goto done; - if (!(tableW = strnAtoW( table, len3 ))) goto done; - if (!(columnW = strnAtoW( column, len4 ))) goto done; - ret = handle->win32_funcs->SQLColumnsW( handle->win32_handle, catalogW, len1, schemaW, len2, tableW, len3, - columnW, len4 ); - } -done: - free( catalogW ); - free( schemaW ); - free( tableW ); - free( columnW ); - return ret; -} - /************************************************************************* * SQLColumns [ODBC32.040] */ @@ -811,21 +719,23 @@ SQLRETURN WINAPI SQLColumns(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLS
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3, - debugstr_sqlstr(ColumnName, NameLength4), NameLength4); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3, + debugstr_an((const char *)ColumnName, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = columns_unix_a( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + struct SQLColumns_params params = { handle->unix_handle, CatalogName, NameLength1, SchemaName, NameLength2, + TableName, NameLength3, ColumnName, NameLength4 }; + ret = ODBC_CALL( SQLColumns, ¶ms ); } else if (handle->win32_handle) { - ret = columns_win32_a( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + ret = handle->win32_funcs->SQLColumns( handle->win32_handle, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, ColumnName, NameLength4 ); }
TRACE("Returning %d\n", ret); @@ -842,9 +752,9 @@ static WCHAR *strdupAW( const char *src ) return dst; }
-static HKEY open_sources_key( HKEY root ) +static HKEY open_odbcini_key( HKEY root ) { - static const WCHAR sourcesW[] = L"Software\ODBC\ODBC.INI\ODBC Data Sources"; + static const WCHAR sourcesW[] = L"Software\ODBC\ODBC.INI"; HKEY key; if (!RegCreateKeyExW( root, sourcesW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &key, NULL )) return key; return NULL; @@ -860,43 +770,27 @@ static WCHAR *get_reg_value( HKEY key, const WCHAR *name ) return NULL; }
-static HKEY open_odbcinst_key( void ) -{ - static const WCHAR odbcinstW[] = L"Software\ODBC\ODBCINST.INI"; - HKEY key; - if (!RegCreateKeyExW( HKEY_LOCAL_MACHINE, odbcinstW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &key, NULL )) return key; - return NULL; -} - static WCHAR *get_driver_filename( const SQLWCHAR *source ) { - HKEY key_sources, key_odbcinst, key_driver; - WCHAR *driver_name, *ret; + HKEY key_root, key_source; + WCHAR *ret = NULL;
- if (!(key_sources = open_sources_key( HKEY_CURRENT_USER ))) return NULL; - if (!(driver_name = get_reg_value( key_sources, source ))) + if (!(key_root = open_odbcini_key( HKEY_CURRENT_USER ))) return NULL; + if (!RegOpenKeyExW( key_root, source, 0, KEY_READ, &key_source )) { - RegCloseKey( key_sources ); - if (!(key_sources = open_sources_key( HKEY_LOCAL_MACHINE ))) return NULL; - if (!(driver_name = get_reg_value( key_sources, source ))) - { - RegCloseKey( key_sources ); - return NULL; - } + ret = get_reg_value( key_source, L"Driver" ); + RegCloseKey( key_source ); } - RegCloseKey( key_sources ); + RegCloseKey( key_root ); + if (ret) return ret;
- if (!(key_odbcinst = open_odbcinst_key()) || RegOpenKeyExW( key_odbcinst, driver_name, 0, KEY_READ, &key_driver )) + if (!(key_root = open_odbcini_key( HKEY_LOCAL_MACHINE ))) return NULL; + if (!RegOpenKeyExW( key_root, source, 0, KEY_READ, &key_source )) { - RegCloseKey( key_odbcinst ); - free( driver_name ); - return NULL; + ret = get_reg_value( key_source, L"Driver" ); + RegCloseKey( key_source ); } - - ret = get_reg_value( key_driver, L"Driver" ); - - RegCloseKey( key_driver ); - RegCloseKey( key_odbcinst ); + RegCloseKey( key_root ); return ret; }
@@ -922,119 +816,14 @@ static SQLRETURN set_env_attr( struct handle *handle, SQLINTEGER attr, SQLPOINTE return ret; }
-#define INT_PTR(val) (SQLPOINTER)(ULONG_PTR)val static SQLRETURN prepare_env( struct handle *handle ) { SQLRETURN ret; - if ((ret = set_env_attr( handle, SQL_ATTR_ODBC_VERSION, INT_PTR(handle->env_attr_version), 0 ))) + if ((ret = set_env_attr( handle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)(ULONG_PTR)handle->env_attr_version, 0 ))) return ret; return SQL_SUCCESS; }
-static SQLRETURN create_env( struct handle *handle, BOOL is_unix ) -{ - SQLRETURN ret; - - if (is_unix) - { - struct SQLAllocEnv_params params = { &handle->unix_handle }; - if ((ret = ODBC_CALL( SQLAllocEnv, ¶ms ))) return ret; - } - else - { - if ((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, &handle->win32_handle ))) return ret; - } - - return prepare_env( handle ); -} - -static SQLRETURN set_con_attr( struct handle *handle, SQLINTEGER attr, SQLPOINTER value, SQLINTEGER len ) -{ - SQLRETURN ret = SQL_ERROR; - - if (handle->unix_handle) - { - struct SQLSetConnectAttr_params params = { handle->unix_handle, attr, value, len }; - ret = ODBC_CALL( SQLSetConnectAttr, ¶ms ); - } - else if (handle->win32_handle) - { - switch (attr) - { - case SQL_ATTR_CURRENT_CATALOG: - case SQL_ATTR_TRACEFILE: - case SQL_ATTR_TRANSLATE_LIB: - ERR( "string attribute %u not handled\n", attr ); - return SQL_ERROR; - default: - break; - } - if (handle->win32_funcs->SQLSetConnectAttrW) - ret = handle->win32_funcs->SQLSetConnectAttrW( handle->win32_handle, attr, value, len ); - else if (handle->win32_funcs->SQLSetConnectAttr) - ret = handle->win32_funcs->SQLSetConnectAttr( handle->win32_handle, attr, value, len ); - } - return ret; -} - -static SQLRETURN prepare_con( struct handle *handle ) -{ - SQLRETURN ret; - - if ((ret = set_con_attr( handle, SQL_ATTR_CONNECTION_TIMEOUT, INT_PTR(handle->con_attr_con_timeout), 0 ))) return ret; - if ((ret = set_con_attr( handle, SQL_ATTR_LOGIN_TIMEOUT, INT_PTR(handle->con_attr_login_timeout), 0 ))) return ret; - return SQL_SUCCESS; -} - -static SQLRETURN create_con( struct handle *handle ) -{ - struct handle *parent = handle->parent; - SQLRETURN ret; - - if (parent->unix_handle) - { - struct SQLAllocConnect_params params = { parent->unix_handle, &handle->unix_handle }; - if ((ret = ODBC_CALL( SQLAllocConnect, ¶ms ))) return ret; - } - else - { - if ((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, parent->win32_handle, &handle->win32_handle ))) - return ret; - } - - return prepare_con( handle ); -} - -static SQLRETURN connect_win32_a( struct handle *handle, SQLCHAR *servername, SQLSMALLINT len1, SQLCHAR *username, - SQLSMALLINT len2, SQLCHAR *auth, SQLSMALLINT len3 ) -{ - SQLRETURN ret = SQL_ERROR; - SQLWCHAR *servernameW = NULL, *usernameW = NULL, *authW = NULL; - - if (handle->win32_funcs->SQLConnect) - return handle->win32_funcs->SQLConnect( handle->win32_handle, servername, len1, username, len2, auth, len3 ); - - if (handle->win32_funcs->SQLConnectW) - { - if (!(servernameW = strnAtoW( servername, len1 ))) return SQL_ERROR; - if (!(usernameW = strnAtoW( username, len2 ))) goto done; - if (!(authW = strnAtoW( auth, len3 ))) goto done; - ret = handle->win32_funcs->SQLConnectW( handle->win32_handle, servernameW, len1, usernameW, len2, authW, len3 ); - } -done: - free( servernameW ); - free( usernameW ); - free( authW ); - return ret; -} - -static SQLRETURN connect_unix_a( struct handle *handle, SQLCHAR *servername, SQLSMALLINT len1, SQLCHAR *username, - SQLSMALLINT len2, SQLCHAR *authentication, SQLSMALLINT len3 ) -{ - struct SQLConnect_params params = { handle->unix_handle, servername, len1, username, len2, authentication, len3 }; - return ODBC_CALL( SQLConnect, ¶ms ); -} - /************************************************************************* * SQLConnect [ODBC32.007] */ @@ -1048,8 +837,9 @@ SQLRETURN WINAPI SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, SQLSM
TRACE("(ConnectionHandle %p, ServerName %s, NameLength1 %d, UserName %s, NameLength2 %d, Authentication %s," " NameLength3 %d)\n", ConnectionHandle, - debugstr_sqlstr(ServerName, NameLength1), NameLength1, debugstr_sqlstr(UserName, NameLength2), - NameLength2, debugstr_sqlstr(Authentication, NameLength3), NameLength3); + debugstr_an((const char *)ServerName, NameLength1), NameLength1, + debugstr_an((const char *)UserName, NameLength2), NameLength2, + debugstr_an((const char *)Authentication, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -1061,26 +851,40 @@ SQLRETURN WINAPI SQLConnect(SQLHDBC ConnectionHandle, SQLCHAR *ServerName, SQLSM
if (has_suffix( filename, L".dll" )) { - if (!(handle->win32_funcs = handle->parent->win32_funcs = load_driver( filename ))) + if (!(handle->win32_funcs = load_driver( filename ))) { WARN( "failed to load driver %s\n", debugstr_w(filename) ); goto done; } TRACE( "using Windows driver %s\n", debugstr_w(filename) );
- if (!SUCCESS((ret = create_env( handle->parent, FALSE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, + &handle->parent->win32_handle )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- ret = connect_win32_a( handle, ServerName, NameLength1, UserName, NameLength2, Authentication, NameLength3 ); + handle->parent->win32_funcs = handle->win32_funcs; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, handle->parent->win32_handle, + &handle->win32_handle )))) goto done; + + ret = handle->win32_funcs->SQLConnect( handle->win32_handle, ServerName, NameLength1, UserName, NameLength2, + Authentication, NameLength3 ); } else { + struct SQLAllocEnv_params params_alloc_env = { &handle->parent->unix_handle }; + struct SQLAllocConnect_params params_alloc_connect = { 0, &handle->unix_handle }; + struct SQLConnect_params params_connect = { 0, ServerName, NameLength1, UserName, NameLength2, + Authentication, NameLength3 }; + TRACE( "using Unix driver %s\n", debugstr_w(filename) ); + if (!SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms_alloc_env )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- if (!SUCCESS((ret = create_env( handle->parent, TRUE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + params_alloc_connect.EnvironmentHandle = handle->parent->unix_handle; + if (!SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms_alloc_connect )))) goto done;
- ret = connect_unix_a( handle, ServerName, NameLength1, UserName, NameLength2, Authentication, NameLength3 ); + params_connect.ConnectionHandle = handle->unix_handle; + ret = ODBC_CALL( SQLConnect, ¶ms_connect ); }
done: @@ -1116,6 +920,14 @@ SQLRETURN WINAPI SQLCopyDesc(SQLHDESC SourceDescHandle, SQLHDESC TargetDescHandl return ret; }
+static HKEY open_sources_key( HKEY root ) +{ + static const WCHAR sourcesW[] = L"Software\ODBC\ODBC.INI\ODBC Data Sources"; + HKEY key; + if (!RegCreateKeyExW( root, sourcesW, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &key, NULL )) return key; + return NULL; +} + /************************************************************************* * SQLDataSources [ODBC32.057] */ @@ -1134,7 +946,7 @@ SQLRETURN WINAPI SQLDataSources(SQLHENV EnvironmentHandle, SQLUSMALLINT Directio
if (!handle) return SQL_INVALID_HANDLE;
- if (Direction == SQL_FETCH_FIRST || (Direction == SQL_FETCH_NEXT && !handle->sources_key)) + if (Direction == SQL_FETCH_FIRST) { handle->sources_idx = 0; handle->sources_system = FALSE; @@ -1184,48 +996,12 @@ done: return ret; }
-static SQLRETURN describe_col_unix_a( struct handle *handle, SQLUSMALLINT col_number, SQLCHAR *col_name, - SQLSMALLINT buflen, SQLSMALLINT *retlen, SQLSMALLINT *data_type, - SQLULEN *col_size, SQLSMALLINT *decimal_digits, SQLSMALLINT *nullable ) -{ - SQLRETURN ret; - SQLSMALLINT dummy; - UINT64 size; - struct SQLDescribeCol_params params = { handle->unix_handle, col_number, col_name, buflen, retlen, data_type, - &size, decimal_digits, nullable }; - if (!retlen) params.NameLength = &dummy; /* workaround for drivers that don't accept NULL NameLength */ - - if (SUCCESS((ret = ODBC_CALL( SQLDescribeCol, ¶ms ))) && col_size) *col_size = size; - return ret; -} - -static SQLRETURN describe_col_win32_a( struct handle *handle, SQLUSMALLINT col_number, SQLCHAR *col_name, - SQLSMALLINT buflen, SQLSMALLINT *retlen, SQLSMALLINT *data_type, - SQLULEN *col_size, SQLSMALLINT *decimal_digits, SQLSMALLINT *nullable ) +SQLRETURN WINAPI SQLDataSourcesA(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, SQLCHAR *ServerName, + SQLSMALLINT BufferLength1, SQLSMALLINT *NameLength1, SQLCHAR *Description, + SQLSMALLINT BufferLength2, SQLSMALLINT *NameLength2) { - SQLRETURN ret = SQL_ERROR; - - if (handle->win32_funcs->SQLDescribeCol) - { - return handle->win32_funcs->SQLDescribeCol( handle->win32_handle, col_number, col_name, buflen, retlen, - data_type, col_size, decimal_digits, nullable ); - } - if (handle->win32_funcs->SQLDescribeColW) - { - SQLWCHAR *nameW; - SQLSMALLINT lenW; - - if (!(nameW = malloc( buflen * sizeof(WCHAR) ))) return SQL_ERROR; - ret = handle->win32_funcs->SQLDescribeColW( handle->win32_handle, col_number, nameW, buflen, &lenW, - data_type, col_size, decimal_digits, nullable ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, nameW, -1, (char *)col_name, buflen, NULL, NULL ); - if (retlen) *retlen = len - 1; - } - free( nameW ); - } - return ret; + return SQLDataSources( EnvironmentHandle, Direction, ServerName, BufferLength1, NameLength1, Description, + BufferLength2, NameLength2 ); }
/************************************************************************* @@ -1246,13 +1022,18 @@ SQLRETURN WINAPI SQLDescribeCol(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNum
if (handle->unix_handle) { - ret = describe_col_unix_a( handle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, - ColumnSize, DecimalDigits, Nullable ); + UINT64 size; + SQLSMALLINT dummy; + struct SQLDescribeCol_params params = { handle->unix_handle, ColumnNumber, ColumnName, BufferLength, + NameLength, DataType, &size, DecimalDigits, Nullable }; + if (!params.NameLength) params.NameLength = &dummy; /* workaround for drivers that don't accept NULL NameLength */ + + if (SUCCESS((ret = ODBC_CALL( SQLDescribeCol, ¶ms ))) && ColumnSize) *ColumnSize = size; } else if (handle->win32_handle) { - ret = describe_col_win32_a( handle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, - ColumnSize, DecimalDigits, Nullable ); + ret = handle->win32_funcs->SQLDescribeCol( handle->win32_handle, ColumnNumber, ColumnName, BufferLength, + NameLength, DataType, ColumnSize, DecimalDigits, Nullable ); }
TRACE("Returning %d\n", ret); @@ -1311,47 +1092,6 @@ SQLRETURN WINAPI SQLEndTran(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLIN return ret; }
-static SQLRETURN error_unix_a( struct handle *env, struct handle *con, struct handle *stmt, SQLCHAR *state, - SQLINTEGER *native_err, SQLCHAR *msg, SQLSMALLINT buflen, SQLSMALLINT *retlen ) -{ - struct SQLError_params params = { env ? env->unix_handle : 0, con ? con->unix_handle : 0, - stmt ? stmt->unix_handle : 0, state, native_err, msg, buflen, retlen }; - return ODBC_CALL( SQLError, ¶ms ); -} - -static SQLRETURN error_win32_a( struct handle *env, struct handle *con, struct handle *stmt, SQLCHAR *state, - SQLINTEGER *native_err, SQLCHAR *msg, SQLSMALLINT buflen, SQLSMALLINT *retlen ) -{ - const struct win32_funcs *win32_funcs; - SQLRETURN ret = SQL_ERROR; - - if (env) win32_funcs = env->win32_funcs; - else if (con) win32_funcs = con->win32_funcs; - else win32_funcs = stmt->win32_funcs; - - if (win32_funcs->SQLError) - return win32_funcs->SQLError( env ? env->win32_handle : NULL, con ? con->win32_handle : NULL, - stmt ? stmt->win32_handle : NULL, state, native_err, msg, buflen, retlen ); - - if (win32_funcs->SQLErrorW) - { - SQLWCHAR stateW[6], *msgW = NULL; - SQLSMALLINT lenW; - - if (!(msgW = malloc( buflen * sizeof(SQLWCHAR) ))) return SQL_ERROR; - ret = win32_funcs->SQLErrorW( env ? env->win32_handle : NULL, con ? con->win32_handle : NULL, - stmt ? stmt->win32_handle : NULL, stateW, native_err, msgW, buflen, &lenW ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, msgW, -1, (char *)msg, buflen, NULL, NULL ); - if (retlen) *retlen = len - 1; - WideCharToMultiByte( CP_ACP, 0, stateW, -1, (char *)state, 6, NULL, NULL ); - } - free( msgW ); - } - return ret; -} - /************************************************************************* * SQLError [ODBC32.010] */ @@ -1366,50 +1106,30 @@ SQLRETURN WINAPI SQLError(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, S " MessageText %p, BufferLength %d, TextLength %p)\n", EnvironmentHandle, ConnectionHandle, StatementHandle, SqlState, NativeError, MessageText, BufferLength, TextLength);
- if (!env && !con && !stmt) return SQL_INVALID_HANDLE; - if ((env && env->unix_handle) || (con && con->unix_handle) || (stmt && stmt->unix_handle)) { - ret = error_unix_a( env, con, stmt, SqlState, NativeError, MessageText, BufferLength, TextLength ); + struct SQLError_params params = { env ? env->unix_handle : 0, + con ? con->unix_handle : 0, + stmt ? stmt->unix_handle : 0, + SqlState, NativeError, MessageText, BufferLength, TextLength }; + ret = ODBC_CALL( SQLError, ¶ms ); } else if ((env && env->win32_handle) || (con && con->win32_handle) || (stmt && stmt->win32_handle)) { - ret = error_win32_a( env, con, stmt, SqlState, NativeError, MessageText, BufferLength, TextLength ); + ret = env->win32_funcs->SQLError( env->win32_handle, con->win32_handle, stmt->win32_handle, SqlState, + NativeError, MessageText, BufferLength, TextLength ); }
if (SUCCESS( ret )) { - TRACE(" SqlState %s\n", debugstr_sqlstr(SqlState, 5)); + TRACE(" SqlState %s\n", debugstr_an((const char *)SqlState, 5)); TRACE(" Error %d\n", *NativeError); - TRACE(" MessageText %s\n", debugstr_sqlstr(MessageText, *TextLength)); + TRACE(" MessageText %s\n", debugstr_an((const char *)MessageText, *TextLength)); } TRACE("Returning %d\n", ret); return ret; }
-static SQLRETURN exec_direct_unix_a( struct handle *handle, SQLCHAR *text, SQLINTEGER len ) -{ - struct SQLExecDirect_params params = { handle->unix_handle, text, len }; - return ODBC_CALL( SQLExecDirect, ¶ms ); -} - -static SQLRETURN exec_direct_win32_a( struct handle *handle, SQLCHAR *text, SQLINTEGER len ) -{ - SQLRETURN ret = SQL_ERROR; - SQLWCHAR *textW; - - if (handle->win32_funcs->SQLExecDirect) - return handle->win32_funcs->SQLExecDirect( handle->win32_handle, text, len ); - - if (handle->win32_funcs->SQLExecDirectW) - { - if (!(textW = strnAtoW( text, len ))) return SQL_ERROR; - ret = handle->win32_funcs->SQLExecDirectW( handle->win32_handle, textW, len ); - free( textW ); - } - return ret; -} - /************************************************************************* * SQLExecDirect [ODBC32.011] */ @@ -1419,17 +1139,18 @@ SQLRETURN WINAPI SQLExecDirect(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, - debugstr_sqlstr(StatementText, TextLength), TextLength); + debugstr_an((const char *)StatementText, TextLength), TextLength);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = exec_direct_unix_a( handle, StatementText, TextLength ); + struct SQLExecDirect_params params = { handle->unix_handle, StatementText, TextLength }; + ret = ODBC_CALL( SQLExecDirect, ¶ms ); } else if (handle->win32_handle) { - ret = exec_direct_win32_a( handle, StatementText, TextLength ); + ret = handle->win32_funcs->SQLExecDirect( handle->win32_handle, StatementText, TextLength ); }
TRACE("Returning %d\n", ret); @@ -1585,12 +1306,12 @@ SQLRETURN WINAPI SQLFreeConnect(SQLHDBC ConnectionHandle)
if (handle->unix_handle) { - struct SQLFreeHandle_params params = { SQL_HANDLE_DBC, handle->unix_handle }; - ret = ODBC_CALL( SQLFreeHandle, ¶ms ); + struct SQLFreeConnect_params params = { handle->unix_handle }; + ret = ODBC_CALL( SQLFreeConnect, ¶ms ); } else if (handle->win32_handle) { - ret = handle->win32_funcs->SQLFreeHandle( SQL_HANDLE_DBC, handle->win32_handle ); + ret = handle->win32_funcs->SQLFreeConnect( handle->win32_handle ); }
free( handle ); @@ -1612,12 +1333,12 @@ SQLRETURN WINAPI SQLFreeEnv(SQLHENV EnvironmentHandle)
if (handle->unix_handle) { - struct SQLFreeHandle_params params = { SQL_HANDLE_ENV, handle->unix_handle }; - ret = ODBC_CALL( SQLFreeHandle, ¶ms ); + struct SQLFreeEnv_params params = { handle->unix_handle }; + ret = ODBC_CALL( SQLFreeEnv, ¶ms ); } else if (handle->win32_handle) { - ret = handle->win32_funcs->SQLFreeHandle( SQL_HANDLE_ENV, handle->win32_handle ); + ret = handle->win32_funcs->SQLFreeEnv( handle->win32_handle ); }
RegCloseKey( handle->drivers_key ); @@ -1628,23 +1349,17 @@ SQLRETURN WINAPI SQLFreeEnv(SQLHENV EnvironmentHandle) return ret; }
-static void free_col_bindings( struct handle *handle ) +static void free_bindings( struct handle *handle ) { if (handle->bind_col.param) { free( handle->bind_col.param->len ); free( handle->bind_col.param ); - handle->bind_col.param = NULL; } -} - -static void free_param_bindings( struct handle *handle ) -{ if (handle->bind_parameter.param) { free( handle->bind_parameter.param->len ); free( handle->bind_parameter.param ); - handle->bind_parameter.param = NULL; } }
@@ -1664,6 +1379,7 @@ SQLRETURN WINAPI SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle) { struct SQLFreeHandle_params params = { HandleType, handle->unix_handle }; ret = ODBC_CALL( SQLFreeHandle, ¶ms ); + free_bindings( handle ); } else if (handle->win32_handle) { @@ -1672,8 +1388,6 @@ SQLRETURN WINAPI SQLFreeHandle(SQLSMALLINT HandleType, SQLHANDLE Handle)
RegCloseKey( handle->drivers_key ); RegCloseKey( handle->sources_key ); - free_col_bindings( handle ); - free_param_bindings( handle ); free( handle );
TRACE("Returning %d\n", ret); @@ -1696,32 +1410,14 @@ SQLRETURN WINAPI SQLFreeStmt(SQLHSTMT StatementHandle, SQLUSMALLINT Option) { struct SQLFreeStmt_params params = { handle->unix_handle, Option }; ret = ODBC_CALL( SQLFreeStmt, ¶ms ); + free_bindings( handle ); } else if (handle->win32_handle) { ret = handle->win32_funcs->SQLFreeStmt( handle->win32_handle, Option ); }
- switch (Option) - { - case SQL_CLOSE: - break; - - case SQL_UNBIND: - free_col_bindings( handle ); - break; - - case SQL_RESET_PARAMS: - free_param_bindings( handle ); - break; - - case SQL_DROP: - default: - free_col_bindings( handle ); - free_param_bindings( handle ); - free( handle ); - break; - } + free( handle );
TRACE("Returning %d\n", ret); return ret; @@ -1734,7 +1430,7 @@ SQLRETURN WINAPI SQLGetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribut SQLINTEGER BufferLength, SQLINTEGER *StringLength) { struct handle *handle = ConnectionHandle; - SQLRETURN ret = SQL_SUCCESS; + SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", ConnectionHandle, Attribute, Value, BufferLength, StringLength); @@ -1752,24 +1448,6 @@ SQLRETURN WINAPI SQLGetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribut ret = handle->win32_funcs->SQLGetConnectAttr( handle->win32_handle, Attribute, Value, BufferLength, StringLength ); } - else - { - switch (Attribute) - { - case SQL_ATTR_CONNECTION_TIMEOUT: - *(SQLINTEGER *)Value = handle->con_attr_con_timeout; - break; - - case SQL_ATTR_LOGIN_TIMEOUT: - *(SQLINTEGER *)Value = handle->con_attr_login_timeout; - break; - - default: - FIXME( "unhandled attribute %d\n", Attribute ); - ret = SQL_ERROR; - break; - } - }
TRACE("Returning %d\n", ret); return ret; @@ -1955,43 +1633,6 @@ SQLRETURN WINAPI SQLGetDiagField(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSM return ret; }
-static SQLRETURN get_diag_rec_unix_a( SQLSMALLINT handle_type, struct handle *handle, SQLSMALLINT rec_num, - SQLCHAR *state, SQLINTEGER *native_err, SQLCHAR *msg, SQLSMALLINT buflen, - SQLSMALLINT *retlen ) -{ - struct SQLGetDiagRec_params params = { handle_type, handle->unix_handle, rec_num, state, native_err, msg, - buflen, retlen }; - return ODBC_CALL( SQLGetDiagRec, ¶ms ); -} - -static SQLRETURN get_diag_rec_win32_a( SQLSMALLINT handle_type, struct handle *handle, SQLSMALLINT rec_num, - SQLCHAR *state, SQLINTEGER *native_err, SQLCHAR *msg, SQLSMALLINT buflen, - SQLSMALLINT *retlen ) -{ - SQLRETURN ret = SQL_ERROR; - SQLWCHAR stateW[6], *msgW; - SQLSMALLINT lenW; - - if (handle->win32_funcs->SQLGetDiagRec) - return handle->win32_funcs->SQLGetDiagRec( handle_type, handle->win32_handle, rec_num, state, native_err, - msg, buflen, retlen ); - - if (handle->win32_funcs->SQLGetDiagRecW) - { - if (!(msgW = malloc( buflen * sizeof(WCHAR) ))) return SQL_ERROR; - ret = handle->win32_funcs->SQLGetDiagRecW( handle_type, handle->win32_handle, rec_num, stateW, native_err, - msgW, buflen, &lenW ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, msgW, -1, (char *)msg, buflen, NULL, NULL ); - if (retlen) *retlen = len - 1; - WideCharToMultiByte( CP_ACP, 0, stateW, -1, (char *)state, 6, NULL, NULL ); - } - free( msgW ); - } - return ret; -} - /************************************************************************* * SQLGetDiagRec [ODBC32.036] */ @@ -2010,13 +1651,14 @@ SQLRETURN WINAPI SQLGetDiagRec(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMAL
if (handle->unix_handle) { - ret = get_diag_rec_unix_a( HandleType, handle, RecNumber, SqlState, NativeError, MessageText, BufferLength, - TextLength ); + struct SQLGetDiagRec_params params = { HandleType, handle->unix_handle, RecNumber, SqlState, NativeError, + MessageText, BufferLength, TextLength }; + ret = ODBC_CALL( SQLGetDiagRec, ¶ms ); } else if (handle->win32_handle) { - ret = get_diag_rec_win32_a( HandleType, handle, RecNumber, SqlState, NativeError, MessageText, BufferLength, - TextLength ); + ret = handle->win32_funcs->SQLGetDiagRec( HandleType, handle->win32_handle, RecNumber, SqlState, NativeError, + MessageText, BufferLength, TextLength ); }
TRACE("Returning %d\n", ret); @@ -2050,10 +1692,6 @@ SQLRETURN WINAPI SQLGetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, { switch (Attribute) { - case SQL_ATTR_CONNECTION_POOLING: - *(SQLINTEGER *)Value = SQL_CP_OFF; - break; - case SQL_ATTR_ODBC_VERSION: *(SQLINTEGER *)Value = handle->env_attr_version; break; @@ -2109,25 +1747,6 @@ SQLRETURN WINAPI SQLGetInfo(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQL
if (!handle) return SQL_INVALID_HANDLE;
- switch (InfoType) - { - case SQL_ODBC_VER: - { - const char version[] = "03.80.0000"; - int len = sizeof(version); - char *value = InfoValue; - - if (StringLength) *StringLength = len; - if (value && BufferLength >= len) - { - strcpy( value, version ); - if (StringLength) *StringLength = len - 1; - } - return SQL_SUCCESS; - } - default: break; - } - if (handle->unix_handle) { struct SQLGetInfo_params params = { handle->unix_handle, InfoType, InfoValue, BufferLength, StringLength }; @@ -2289,7 +1908,7 @@ SQLRETURN WINAPI SQLPrepare(SQLHSTMT StatementHandle, SQLCHAR *StatementText, SQ SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, - debugstr_sqlstr(StatementText, TextLength), TextLength); + debugstr_an((const char *)StatementText, TextLength), TextLength);
if (!handle) return SQL_INVALID_HANDLE;
@@ -2371,7 +1990,7 @@ SQLRETURN WINAPI SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribut SQLINTEGER StringLength) { struct handle *handle = ConnectionHandle; - SQLRETURN ret = SQL_SUCCESS; + SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, Attribute %d, Value %p, StringLength %d)\n", ConnectionHandle, Attribute, Value, StringLength); @@ -2387,24 +2006,6 @@ SQLRETURN WINAPI SQLSetConnectAttr(SQLHDBC ConnectionHandle, SQLINTEGER Attribut { ret = handle->win32_funcs->SQLSetConnectAttr( handle->win32_handle, Attribute, Value, StringLength ); } - else - { - switch (Attribute) - { - case SQL_ATTR_CONNECTION_TIMEOUT: - handle->con_attr_con_timeout = (UINT32)(ULONG_PTR)Value; - break; - - case SQL_ATTR_LOGIN_TIMEOUT: - handle->con_attr_login_timeout = (UINT32)(ULONG_PTR)Value; - break; - - default: - FIXME( "unhandled attribute %d\n", Attribute ); - ret = SQL_ERROR; - break; - } - }
TRACE("Returning %d\n", ret); return ret; @@ -2445,7 +2046,7 @@ SQLRETURN WINAPI SQLSetCursorName(SQLHSTMT StatementHandle, SQLCHAR *CursorName, SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, CursorName %s, NameLength %d)\n", StatementHandle, - debugstr_sqlstr(CursorName, NameLength), NameLength); + debugstr_an((const char *)CursorName, NameLength), NameLength);
if (!handle) return SQL_INVALID_HANDLE;
@@ -2559,10 +2160,6 @@ SQLRETURN WINAPI SQLSetEnvAttr(SQLHENV EnvironmentHandle, SQLINTEGER Attribute, handle->env_attr_version = (UINT32)(ULONG_PTR)Value; break;
- case SQL_ATTR_CONNECTION_POOLING: - FIXME("Ignore Pooling value\n"); - break; - default: FIXME( "unhandled attribute %d\n", Attribute ); ret = SQL_ERROR; @@ -2738,8 +2335,9 @@ SQLRETURN WINAPI SQLSpecialColumns(SQLHSTMT StatementHandle, SQLUSMALLINT Identi
TRACE("(StatementHandle %p, IdentifierType %d, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d," " TableName %s, NameLength3 %d, Scope %d, Nullable %d)\n", StatementHandle, IdentifierType, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3, Scope, Nullable); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3, Scope, Nullable);
if (!handle) return SQL_INVALID_HANDLE;
@@ -2771,8 +2369,9 @@ SQLRETURN WINAPI SQLStatistics(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, S
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d SchemaName %s, NameLength2 %d, TableName %s" " NameLength3 %d, Unique %d, Reserved %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3, Unique, Reserved); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3, Unique, Reserved);
if (!handle) return SQL_INVALID_HANDLE;
@@ -2804,9 +2403,10 @@ SQLRETURN WINAPI SQLTables(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, SQLSM
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, TableType %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3, debugstr_sqlstr(TableType, NameLength4), - NameLength4); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3, + debugstr_an((const char *)TableType, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
@@ -2837,23 +2437,16 @@ SQLRETURN WINAPI SQLTransact(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle TRACE("(EnvironmentHandle %p, ConnectionHandle %p, CompletionType %d)\n", EnvironmentHandle, ConnectionHandle, CompletionType);
- if (!env && !con) return SQL_INVALID_HANDLE; + if (!env || !con) return SQL_INVALID_HANDLE;
- if ( (env && env->unix_handle) || (con && con->unix_handle)) + if (env->unix_handle) { - struct SQLTransact_params params = { env ? env->unix_handle : 0, - con ? con->unix_handle : 0, CompletionType }; + struct SQLTransact_params params = { env->unix_handle, con->unix_handle, CompletionType }; ret = ODBC_CALL( SQLTransact, ¶ms ); } - else if ( (env && env->win32_handle) || (con && con->win32_handle)) + else if (env->win32_handle) { - const struct win32_funcs *win32_funcs; - - if (env) win32_funcs = env->win32_funcs; - else win32_funcs = con->win32_funcs; - - ret = win32_funcs->SQLTransact( env ? env->win32_handle : NULL, - con ? con->win32_handle : NULL, CompletionType ); + ret = env->win32_funcs->SQLTransact( env->win32_handle, con->win32_handle, CompletionType ); }
TRACE("Returning %d\n", ret); @@ -2886,40 +2479,6 @@ static WCHAR *get_datasource( const WCHAR *connection_string ) return ret; }
-static SQLRETURN browse_connect_win32_a( struct handle *handle, SQLCHAR *in_conn_str, SQLSMALLINT inlen, - SQLCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *outlen ) -{ - SQLRETURN ret = SQL_ERROR; - SQLWCHAR *in = NULL, *out = NULL; - SQLSMALLINT lenW; - - if (handle->win32_funcs->SQLBrowseConnect) - return handle->win32_funcs->SQLBrowseConnect( handle->win32_handle, in_conn_str, inlen, out_conn_str, - buflen, outlen ); - if (handle->win32_funcs->SQLBrowseConnectW) - { - if (!(in = strnAtoW( in_conn_str, inlen ))) return SQL_ERROR; - if (!(out = malloc( buflen * sizeof(WCHAR) ))) goto done; - ret = handle->win32_funcs->SQLBrowseConnectW( handle->win32_handle, in, inlen, out, buflen, &lenW ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, out, -1, (char *)out_conn_str, buflen, NULL, NULL ); - if (outlen) *outlen = len - 1; - } - } -done: - free( in ); - free( out ); - return ret; -} - -static SQLRETURN browse_connect_unix_a( struct handle *handle, SQLCHAR *in_conn_str, SQLSMALLINT len, - SQLCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2 ) -{ - struct SQLBrowseConnect_params params = { handle->unix_handle, in_conn_str, len, out_conn_str, buflen, len2 }; - return ODBC_CALL( SQLBrowseConnect, ¶ms ); -} - /************************************************************************* * SQLBrowseConnect [ODBC32.055] */ @@ -2931,7 +2490,7 @@ SQLRETURN WINAPI SQLBrowseConnect(SQLHDBC ConnectionHandle, SQLCHAR *InConnectio SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, InConnectionString %s, StringLength1 %d, OutConnectionString %p, BufferLength, %d, " - "StringLength2 %p)\n", ConnectionHandle, debugstr_sqlstr(InConnectionString, StringLength1), + "StringLength2 %p)\n", ConnectionHandle, debugstr_an((const char *)InConnectionString, StringLength1), StringLength1, OutConnectionString, BufferLength, StringLength2);
if (!handle) return SQL_INVALID_HANDLE; @@ -2950,28 +2509,40 @@ SQLRETURN WINAPI SQLBrowseConnect(SQLHDBC ConnectionHandle, SQLCHAR *InConnectio
if (has_suffix( filename, L".dll" )) { - if (!(handle->win32_funcs = handle->parent->win32_funcs = load_driver( filename ))) + if (!(handle->win32_funcs = load_driver( filename ))) { WARN( "failed to load driver %s\n", debugstr_w(filename) ); goto done; } TRACE( "using Windows driver %s\n", debugstr_w(filename) );
- if (!SUCCESS((ret = create_env( handle->parent, FALSE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, + &handle->parent->win32_handle )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done; + + handle->parent->win32_funcs = handle->win32_funcs; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, handle->parent->win32_handle, + &handle->win32_handle )))) goto done;
- ret = browse_connect_win32_a( handle, InConnectionString, StringLength1, OutConnectionString, - BufferLength, StringLength2 ); + ret = handle->win32_funcs->SQLBrowseConnect( handle->win32_handle, InConnectionString, StringLength1, + OutConnectionString, BufferLength, StringLength2 ); } else { + struct SQLAllocEnv_params params_alloc_env = { &handle->parent->unix_handle }; + struct SQLAllocConnect_params params_alloc_connect = { 0, &handle->unix_handle }; + struct SQLBrowseConnect_params params = { 0, InConnectionString, StringLength1, OutConnectionString, + BufferLength, StringLength2 }; + TRACE( "using Unix driver %s\n", debugstr_w(filename) ); + if (!SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms_alloc_env )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- if (!SUCCESS((ret = create_env( handle->parent, TRUE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + params_alloc_connect.EnvironmentHandle = handle->parent->unix_handle; + if (!SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms_alloc_connect )))) goto done;
- ret = browse_connect_unix_a( handle, InConnectionString, StringLength1, OutConnectionString, - BufferLength, StringLength2 ); + params.ConnectionHandle = handle->unix_handle; + ret = ODBC_CALL( SQLBrowseConnect, ¶ms ); }
done: @@ -3008,52 +2579,6 @@ SQLRETURN WINAPI SQLBulkOperations(SQLHSTMT StatementHandle, SQLSMALLINT Operati return ret; }
-static SQLRETURN col_attributes_unix_a( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attrs, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attrs ) -{ - SQLRETURN ret; - INT64 attrs; - struct SQLColAttributes_params params = { handle->unix_handle, col, field_id, char_attrs, buflen, retlen, &attrs }; - if (SUCCESS((ret = ODBC_CALL( SQLColAttributes, ¶ms )))) *num_attrs = attrs; - return ret; -} - -static SQLRETURN col_attributes_win32_a( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attrs, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attrs ) -{ - SQLRETURN ret = SQL_ERROR; - - if (handle->win32_funcs->SQLColAttributes) - { - return handle->win32_funcs->SQLColAttributes( handle->win32_handle, col, field_id, char_attrs, buflen, - retlen, num_attrs ); - } - if (handle->win32_funcs->SQLColAttributesW) - { - if (buflen < 0) - ret = handle->win32_funcs->SQLColAttributesW( handle->win32_handle, col, field_id, char_attrs, buflen, - retlen, num_attrs ); - else - { - SQLWCHAR *strW; - SQLSMALLINT lenW; - - if (!(strW = malloc( buflen * sizeof(WCHAR) ))) return SQL_ERROR; - ret = handle->win32_funcs->SQLColAttributesW( handle->win32_handle, col, field_id, strW, buflen, &lenW, - num_attrs ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, strW, -1, char_attrs, buflen, NULL, NULL ); - if (retlen) *retlen = len - 1; - } - free( strW ); - } - } - return ret; -} - /************************************************************************* * SQLColAttributes [ODBC32.006] */ @@ -3072,57 +2597,22 @@ SQLRETURN WINAPI SQLColAttributes(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnN
if (handle->unix_handle) { - ret = col_attributes_unix_a( handle, ColumnNumber, FieldIdentifier, CharacterAttributes, BufferLength, - StringLength, NumericAttributes ); + INT64 attrs; + struct SQLColAttributes_params params = { handle->unix_handle, ColumnNumber, FieldIdentifier, + CharacterAttributes, BufferLength, StringLength, &attrs }; + if (SUCCESS((ret = ODBC_CALL( SQLColAttributes, ¶ms )))) *NumericAttributes = attrs; } else if (handle->win32_handle) { - ret = col_attributes_win32_a( handle, ColumnNumber, FieldIdentifier, CharacterAttributes, BufferLength, - StringLength, NumericAttributes ); + ret = handle->win32_funcs->SQLColAttributes( handle->win32_handle, ColumnNumber, FieldIdentifier, + CharacterAttributes, BufferLength, StringLength, + NumericAttributes ); }
TRACE("Returning %d\n", ret); return ret; }
-static SQLRETURN column_privs_unix_a( struct handle *handle, SQLCHAR *catalog, SQLSMALLINT len1, SQLCHAR *schema, - SQLSMALLINT len2, SQLCHAR *table, SQLSMALLINT len3, SQLCHAR *column, - SQLSMALLINT len4 ) -{ - struct SQLColumnPrivileges_params params = { handle->unix_handle, catalog, len1, schema, len2, table, len3, - column, len4 }; - return ODBC_CALL( SQLColumnPrivileges, ¶ms ); -} - -static SQLRETURN column_privs_win32_a( struct handle *handle, SQLCHAR *catalog, SQLSMALLINT len1, SQLCHAR *schema, - SQLSMALLINT len2, SQLCHAR *table, SQLSMALLINT len3, SQLCHAR *column, - SQLSMALLINT len4 ) -{ - SQLWCHAR *catalogW = NULL, *schemaW = NULL, *tableW = NULL, *columnW = NULL; - SQLRETURN ret = SQL_ERROR; - - if (handle->win32_funcs->SQLColumnPrivileges) - { - return handle->win32_funcs->SQLColumnPrivileges( handle->win32_handle, catalog, len1, schema, len2, table, - len3, column, len4 ); - } - if (handle->win32_funcs->SQLColumnPrivilegesW) - { - if (!(catalogW = strnAtoW( catalog, len1 ))) return SQL_ERROR; - if (!(schemaW = strnAtoW( schema, len2 ))) goto done; - if (!(tableW = strnAtoW( table, len3 ))) goto done; - if (!(columnW = strnAtoW( column, len4 ))) goto done; - ret = handle->win32_funcs->SQLColumnPrivilegesW( handle->win32_handle, catalogW, len1, schemaW, len2, tableW, - len3, columnW, len4 ); - } -done: - free( catalogW ); - free( schemaW ); - free( tableW ); - free( columnW ); - return ret; -} - /************************************************************************* * SQLColumnPrivileges [ODBC32.056] */ @@ -3135,21 +2625,23 @@ SQLRETURN WINAPI SQLColumnPrivileges(SQLHSTMT StatementHandle, SQLCHAR *CatalogN
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3, debugstr_sqlstr(ColumnName, NameLength4), - NameLength4); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3, + debugstr_an((const char *)ColumnName, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = column_privs_unix_a( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + struct SQLColumnPrivileges_params params = { handle->unix_handle, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, ColumnName, NameLength4 }; + ret = ODBC_CALL( SQLColumnPrivileges, ¶ms ); } else if (handle->win32_handle) { - ret = column_privs_win32_a( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + ret = handle->win32_funcs->SQLColumnPrivileges( handle->win32_handle, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, ColumnName, NameLength4 ); }
TRACE("Returning %d\n", ret); @@ -3218,53 +2710,6 @@ SQLRETURN WINAPI SQLExtendedFetch(SQLHSTMT StatementHandle, SQLUSMALLINT FetchOr return ret; }
-static SQLRETURN foreign_keys_unix_a( struct handle *handle, SQLCHAR *pk_catalog, SQLSMALLINT len1, - SQLCHAR *pk_schema, SQLSMALLINT len2, SQLCHAR *pk_table, SQLSMALLINT len3, - SQLCHAR *fk_catalog, SQLSMALLINT len4, SQLCHAR *fk_schema, SQLSMALLINT len5, - SQLCHAR *fk_table, SQLSMALLINT len6 ) -{ - struct SQLForeignKeys_params params = { handle->unix_handle, pk_catalog, len1, pk_schema, len2, pk_table, len3, - fk_catalog, len4, fk_schema, len5, fk_table, len6 }; - return ODBC_CALL( SQLForeignKeys, ¶ms ); -} - -static SQLRETURN foreign_keys_win32_a( struct handle *handle, SQLCHAR *pk_catalog, SQLSMALLINT len1, - SQLCHAR *pk_schema, SQLSMALLINT len2, SQLCHAR *pk_table, SQLSMALLINT len3, - SQLCHAR *fk_catalog, SQLSMALLINT len4, SQLCHAR *fk_schema, SQLSMALLINT len5, - SQLCHAR *fk_table, SQLSMALLINT len6 ) -{ - SQLWCHAR *pk_catalogW = NULL, *pk_schemaW = NULL, *pk_tableW = NULL; - SQLWCHAR *fk_catalogW = NULL, *fk_schemaW = NULL, *fk_tableW = NULL; - SQLRETURN ret = SQL_ERROR; - - if (handle->win32_funcs->SQLForeignKeys) - { - return handle->win32_funcs->SQLForeignKeys( handle->win32_handle, pk_catalog, len1, pk_schema, len2, - pk_table, len3, fk_catalog, len4, fk_schema, len5, fk_table, - len6 ); - } - if (handle->win32_funcs->SQLForeignKeysW) - { - if (!(pk_catalogW = strnAtoW( pk_catalog, len1 ))) return SQL_ERROR; - if (!(pk_schemaW = strnAtoW( pk_schema, len2 ))) goto done; - if (!(pk_tableW = strnAtoW( pk_table, len3 ))) goto done; - if (!(fk_catalogW = strnAtoW( fk_catalog, len4 ))) goto done; - if (!(fk_schemaW = strnAtoW( fk_schema, len5 ))) goto done; - if (!(fk_tableW = strnAtoW( fk_table, len6 ))) goto done; - ret = handle->win32_funcs->SQLForeignKeysW( handle->win32_handle, pk_catalogW, len1, pk_schemaW, len2, - pk_tableW, len3, fk_catalogW, len4, fk_schemaW, len5, fk_tableW, - len6 ); - } -done: - free( pk_catalogW ); - free( pk_schemaW ); - free( pk_tableW ); - free( fk_catalogW ); - free( fk_schemaW ); - free( fk_tableW ); - return ret; -} - /************************************************************************* * SQLForeignKeys [ODBC32.060] */ @@ -3280,24 +2725,27 @@ SQLRETURN WINAPI SQLForeignKeys(SQLHSTMT StatementHandle, SQLCHAR *PkCatalogName TRACE("(StatementHandle %p, PkCatalogName %s, NameLength1 %d, PkSchemaName %s, NameLength2 %d," " PkTableName %s, NameLength3 %d, FkCatalogName %s, NameLength4 %d, FkSchemaName %s," " NameLength5 %d, FkTableName %s, NameLength6 %d)\n", StatementHandle, - debugstr_sqlstr(PkCatalogName, NameLength1), NameLength1, debugstr_sqlstr(PkSchemaName, NameLength2), - NameLength2, debugstr_sqlstr(PkTableName, NameLength3), NameLength3, - debugstr_sqlstr(FkCatalogName, NameLength4), NameLength4, debugstr_sqlstr(FkSchemaName, NameLength5), - NameLength5, debugstr_sqlstr(FkTableName, NameLength6), NameLength6); + debugstr_an((const char *)PkCatalogName, NameLength1), NameLength1, + debugstr_an((const char *)PkSchemaName, NameLength2), NameLength2, + debugstr_an((const char *)PkTableName, NameLength3), NameLength3, + debugstr_an((const char *)FkCatalogName, NameLength4), NameLength4, + debugstr_an((const char *)FkSchemaName, NameLength5), NameLength5, + debugstr_an((const char *)FkTableName, NameLength6), NameLength6);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = foreign_keys_unix_a( handle, PkCatalogName, NameLength1, PkSchemaName, NameLength2, PkTableName, - NameLength3, FkCatalogName, NameLength4, FkSchemaName, NameLength5, FkTableName, - NameLength6 ); + struct SQLForeignKeys_params params = { handle->unix_handle, PkCatalogName, NameLength1, PkSchemaName, + NameLength2, PkTableName, NameLength3, FkCatalogName, NameLength4, + FkSchemaName, NameLength5, FkTableName, NameLength6 }; + ret = ODBC_CALL( SQLForeignKeys, ¶ms ); } else if (handle->win32_handle) { - ret = foreign_keys_win32_a( handle, PkCatalogName, NameLength1, PkSchemaName, NameLength2, PkTableName, - NameLength3, FkCatalogName, NameLength4, FkSchemaName, NameLength5, FkTableName, - NameLength6 ); + ret = handle->win32_funcs->SQLForeignKeys( handle->win32_handle, PkCatalogName, NameLength1, PkSchemaName, + NameLength2, PkTableName, NameLength3, FkCatalogName, NameLength4, + FkSchemaName, NameLength5, FkTableName, NameLength6 ); }
TRACE("Returning %d\n", ret); @@ -3340,8 +2788,8 @@ SQLRETURN WINAPI SQLNativeSql(SQLHDBC ConnectionHandle, SQLCHAR *InStatementText SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, InStatementText %s, TextLength1 %d, OutStatementText %p, BufferLength, %d, " - "TextLength2 %p)\n", ConnectionHandle, debugstr_sqlstr(InStatementText, TextLength1), TextLength1, - OutStatementText, BufferLength, TextLength2); + "TextLength2 %p)\n", ConnectionHandle, debugstr_an((const char *)InStatementText, TextLength1), + TextLength1, OutStatementText, BufferLength, TextLength2);
if (!handle) return SQL_INVALID_HANDLE;
@@ -3427,8 +2875,9 @@ SQLRETURN WINAPI SQLPrimaryKeys(SQLHSTMT StatementHandle, SQLCHAR *CatalogName,
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -3460,9 +2909,10 @@ SQLRETURN WINAPI SQLProcedureColumns(SQLHSTMT StatementHandle, SQLCHAR *CatalogN
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, ProcName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(ProcName, NameLength3), NameLength3, debugstr_sqlstr(ColumnName, NameLength4), - NameLength4); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)ProcName, NameLength3), NameLength3, + debugstr_an((const char *)ColumnName, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
@@ -3494,8 +2944,9 @@ SQLRETURN WINAPI SQLProcedures(SQLHSTMT StatementHandle, SQLCHAR *CatalogName, S
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, ProcName %s," " NameLength3 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(ProcName, NameLength3), NameLength3); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)ProcName, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -3556,8 +3007,9 @@ SQLRETURN WINAPI SQLTablePrivileges(SQLHSTMT StatementHandle, SQLCHAR *CatalogNa
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," "NameLength3 %d)\n", StatementHandle, - debugstr_sqlstr(CatalogName, NameLength1), NameLength1, debugstr_sqlstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlstr(TableName, NameLength3), NameLength3); + debugstr_an((const char *)CatalogName, NameLength1), NameLength1, + debugstr_an((const char *)SchemaName, NameLength2), NameLength2, + debugstr_an((const char *)TableName, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -3604,7 +3056,7 @@ SQLRETURN WINAPI SQLDrivers(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction, S
if (!handle) return SQL_INVALID_HANDLE;
- if (Direction == SQL_FETCH_FIRST || (Direction == SQL_FETCH_NEXT && !handle->drivers_key)) + if (Direction == SQL_FETCH_FIRST) { handle->drivers_idx = 0; RegCloseKey( handle->drivers_key ); @@ -3696,45 +3148,6 @@ SQLRETURN WINAPI SQLBindParameter(SQLHSTMT StatementHandle, SQLUSMALLINT Paramet return ret; }
-static SQLRETURN driver_connect_win32_a( struct handle *handle, SQLHWND window, SQLCHAR *in_conn_str, - SQLSMALLINT inlen, SQLCHAR *out_conn_str, SQLSMALLINT buflen, - SQLSMALLINT *outlen, SQLUSMALLINT completion ) -{ - SQLRETURN ret = SQL_ERROR; - SQLWCHAR *in = NULL, *out = NULL; - SQLSMALLINT lenW; - - if (handle->win32_funcs->SQLDriverConnect) - return handle->win32_funcs->SQLDriverConnect( handle->win32_handle, window, in_conn_str, inlen, out_conn_str, - buflen, outlen, completion ); - - if (handle->win32_funcs->SQLDriverConnectW) - { - if (!(in = strnAtoW( in_conn_str, inlen ))) return SQL_ERROR; - if (!(out = malloc( buflen * sizeof(WCHAR) ))) goto done; - ret = handle->win32_funcs->SQLDriverConnectW( handle->win32_handle, window, in, inlen, out, buflen, &lenW, - completion ); - if (SUCCESS( ret )) - { - int len = WideCharToMultiByte( CP_ACP, 0, out, -1, (char *)out_conn_str, buflen, NULL, NULL ); - if (outlen) *outlen = len - 1; - } - } -done: - free( in ); - free( out ); - return ret; -} - -static SQLRETURN driver_connect_unix_a( struct handle *handle, SQLHWND window, SQLCHAR *in_conn_str, SQLSMALLINT len, - SQLCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2, - SQLUSMALLINT completion ) -{ - struct SQLDriverConnect_params params = { handle->unix_handle, window, in_conn_str, len, out_conn_str, buflen, - len2, completion }; - return ODBC_CALL( SQLDriverConnect, ¶ms ); -} - /************************************************************************* * SQLDriverConnect [ODBC32.041] */ @@ -3746,9 +3159,9 @@ SQLRETURN WINAPI SQLDriverConnect(SQLHDBC ConnectionHandle, SQLHWND WindowHandle WCHAR *datasource = NULL, *filename = NULL, *connection_string = strdupAW( (const char *)InConnectionString ); SQLRETURN ret = SQL_ERROR;
- TRACE("(ConnectionHandle %p, WindowHandle %p, InConnectionString %s, Length %d, OutConnectionString %p," - " BufferLength %d, Length2 %p, DriverCompletion %d)\n", ConnectionHandle, WindowHandle, - debugstr_sqlstr(InConnectionString, Length), Length, OutConnectionString, BufferLength, + TRACE("(ConnectionHandle %p, WindowHandle %p, InConnectionString %s, Length %d, OutConnectionString, %p," + " BufferLength, %d, Length2 %p, DriverCompletion %d)\n", ConnectionHandle, WindowHandle, + debugstr_an((const char *)InConnectionString, Length), Length, OutConnectionString, BufferLength, Length2, DriverCompletion);
if (!handle) return SQL_INVALID_HANDLE; @@ -3767,28 +3180,40 @@ SQLRETURN WINAPI SQLDriverConnect(SQLHDBC ConnectionHandle, SQLHWND WindowHandle
if (has_suffix( filename, L".dll" )) { - if (!(handle->win32_funcs = handle->parent->win32_funcs = load_driver( filename ))) + if (!(handle->win32_funcs = load_driver( filename ))) { WARN( "failed to load driver %s\n", debugstr_w(filename) ); goto done; } TRACE( "using Windows driver %s\n", debugstr_w(filename) );
- if (!SUCCESS((ret = create_env( handle->parent, FALSE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, + &handle->parent->win32_handle )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done; + + handle->parent->win32_funcs = handle->win32_funcs; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, handle->parent->win32_handle, + &handle->win32_handle )))) goto done;
- ret = driver_connect_win32_a( handle, WindowHandle, InConnectionString, Length, OutConnectionString, - BufferLength, Length2, DriverCompletion ); + ret = handle->win32_funcs->SQLDriverConnect( handle->win32_handle, WindowHandle, InConnectionString, Length, + OutConnectionString, BufferLength, Length2, DriverCompletion ); } else { + struct SQLAllocEnv_params params_alloc_env = { &handle->parent->unix_handle }; + struct SQLAllocConnect_params params_alloc_connect = { 0, &handle->unix_handle }; + struct SQLDriverConnect_params params = { 0, WindowHandle, InConnectionString, Length, OutConnectionString, + BufferLength, Length2, DriverCompletion }; + TRACE( "using Unix driver %s\n", debugstr_w(filename) ); + if (!SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms_alloc_env )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- if (!SUCCESS((ret = create_env( handle->parent, TRUE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + params_alloc_connect.EnvironmentHandle = handle->parent->unix_handle; + if (!SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms_alloc_connect )))) goto done;
- ret = driver_connect_unix_a( handle, WindowHandle, InConnectionString, Length, OutConnectionString, - BufferLength, Length2, DriverCompletion ); + params.ConnectionHandle = handle->unix_handle; + ret = ODBC_CALL( SQLDriverConnect, ¶ms ); }
done: @@ -3856,37 +3281,6 @@ static BOOL SQLColAttributes_KnownStringAttribute(SQLUSMALLINT fDescType) return FALSE; }
-static SQLRETURN col_attributes_unix_w( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attrs, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attrs ) -{ - SQLRETURN ret; - INT64 attrs; - struct SQLColAttributesW_params params = { handle->unix_handle, col, field_id, char_attrs, buflen, retlen, - &attrs }; - - if (SUCCESS((ret = ODBC_CALL( SQLColAttributesW, ¶ms )))) *num_attrs = attrs; - - if (ret == SQL_SUCCESS && SQLColAttributes_KnownStringAttribute(field_id) && char_attrs && - retlen && *retlen != wcslen( char_attrs ) * sizeof(WCHAR)) - { - TRACE("CHEAT: resetting name length for ADO\n"); - *retlen = wcslen( char_attrs ) * sizeof(WCHAR); - } - return ret; -} - -static SQLRETURN col_attributes_win32_w( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attrs, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attrs ) -{ - if (handle->win32_funcs->SQLColAttributesW) - return handle->win32_funcs->SQLColAttributesW( handle->win32_handle, col, field_id, char_attrs, buflen, - retlen, num_attrs ); - if (handle->win32_funcs->SQLColAttributes) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLColAttributesW [ODBC32.106] */ @@ -3905,41 +3299,29 @@ SQLRETURN WINAPI SQLColAttributesW(SQLHSTMT StatementHandle, SQLUSMALLINT Column
if (handle->unix_handle) { - ret = col_attributes_unix_w( handle, ColumnNumber, FieldIdentifier, CharacterAttributes, BufferLength, - StringLength, NumericAttributes ); + INT64 attrs; + struct SQLColAttributesW_params params = { handle->unix_handle, ColumnNumber, FieldIdentifier, + CharacterAttributes, BufferLength, StringLength, &attrs }; + if (SUCCESS((ret = ODBC_CALL( SQLColAttributesW, ¶ms )))) *NumericAttributes = attrs; + + if (ret == SQL_SUCCESS && SQLColAttributes_KnownStringAttribute(FieldIdentifier) && CharacterAttributes && + StringLength && *StringLength != wcslen(CharacterAttributes) * 2) + { + TRACE("CHEAT: resetting name length for ADO\n"); + *StringLength = wcslen(CharacterAttributes) * 2; + } } else if (handle->win32_handle) { - ret = col_attributes_win32_w( handle, ColumnNumber, FieldIdentifier, CharacterAttributes, BufferLength, - StringLength, NumericAttributes ); + ret = handle->win32_funcs->SQLColAttributesW( handle->win32_handle, ColumnNumber, FieldIdentifier, + CharacterAttributes, BufferLength, StringLength, + NumericAttributes ); }
TRACE("Returning %d\n", ret); return ret; }
-static const char *debugstr_sqlwstr( const SQLWCHAR *str, SQLSMALLINT len ) -{ - if (len == SQL_NTS) len = wcslen( str ); - return wine_dbgstr_wn( str, len ); -} - -static SQLRETURN connect_win32_w( struct handle *handle, SQLWCHAR *servername, SQLSMALLINT len1, SQLWCHAR *username, - SQLSMALLINT len2, SQLWCHAR *auth, SQLSMALLINT len3 ) -{ - if (handle->win32_funcs->SQLConnectW) - return handle->win32_funcs->SQLConnectW( handle->win32_handle, servername, len1, username, len2, auth, len3 ); - if (handle->win32_funcs->SQLConnect) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - -static SQLRETURN connect_unix_w( struct handle *handle, SQLWCHAR *servername, SQLSMALLINT len1, SQLWCHAR *username, - SQLSMALLINT len2, SQLWCHAR *auth, SQLSMALLINT len3 ) -{ - struct SQLConnectW_params params = { handle->unix_handle, servername, len1, username, len2, auth, len3 }; - return ODBC_CALL( SQLConnectW, ¶ms ); -} - /************************************************************************* * SQLConnectW [ODBC32.107] */ @@ -3952,9 +3334,8 @@ SQLRETURN WINAPI SQLConnectW(SQLHDBC ConnectionHandle, WCHAR *ServerName, SQLSMA SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, ServerName %s, NameLength1 %d, UserName %s, NameLength2 %d, Authentication %s," - " NameLength3 %d)\n", ConnectionHandle, debugstr_sqlwstr(ServerName, NameLength1), NameLength1, - debugstr_sqlwstr(UserName, NameLength2), NameLength2, debugstr_sqlwstr(Authentication, NameLength3), - NameLength3); + " NameLength3 %d)\n", ConnectionHandle, debugstr_wn(ServerName, NameLength1), NameLength1, + debugstr_wn(UserName, NameLength2), NameLength2, debugstr_wn(Authentication, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -3966,26 +3347,40 @@ SQLRETURN WINAPI SQLConnectW(SQLHDBC ConnectionHandle, WCHAR *ServerName, SQLSMA
if (has_suffix( filename, L".dll" )) { - if (!(handle->win32_funcs = handle->parent->win32_funcs = load_driver( filename ))) + if (!(handle->win32_funcs = load_driver( filename ))) { WARN( "failed to load driver %s\n", debugstr_w(filename) ); goto done; } TRACE( "using Windows driver %s\n", debugstr_w(filename) );
- if (!SUCCESS((ret = create_env( handle->parent, FALSE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, + &handle->parent->win32_handle )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done; + + handle->parent->win32_funcs = handle->win32_funcs; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, handle->parent->win32_handle, + &handle->win32_handle )))) goto done;
- ret = connect_win32_w( handle, ServerName, NameLength1, UserName, NameLength2, Authentication, NameLength3 ); + ret = handle->win32_funcs->SQLConnectW( handle->win32_handle, ServerName, NameLength1, UserName, NameLength2, + Authentication, NameLength3 ); } else { + struct SQLAllocEnv_params params_alloc_env = { &handle->parent->unix_handle }; + struct SQLAllocConnect_params params_alloc_connect = { 0, &handle->unix_handle }; + struct SQLConnectW_params params_connect = { 0, ServerName, NameLength1, UserName, NameLength2, + Authentication, NameLength3 }; + TRACE( "using Unix driver %s\n", debugstr_w(filename) ); + if (!SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms_alloc_env )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- if (!SUCCESS((ret = create_env( handle->parent, TRUE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + params_alloc_connect.EnvironmentHandle = handle->parent->unix_handle; + if (!SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms_alloc_connect )))) goto done;
- ret = connect_unix_w( handle, ServerName, NameLength1, UserName, NameLength2, Authentication, NameLength3 ); + params_connect.ConnectionHandle = handle->unix_handle; + ret = ODBC_CALL( SQLConnectW, ¶ms_connect ); }
done: @@ -3994,32 +3389,6 @@ done: return ret; }
-static SQLRETURN describe_col_unix_w( struct handle *handle, SQLUSMALLINT col_number, SQLWCHAR *col_name, - SQLSMALLINT buf_len, SQLSMALLINT *name_len, SQLSMALLINT *data_type, - SQLULEN *col_size, SQLSMALLINT *decimal_digits, SQLSMALLINT *nullable ) -{ - SQLRETURN ret; - SQLSMALLINT dummy; - UINT64 size; - struct SQLDescribeColW_params params = { handle->unix_handle, col_number, col_name, buf_len, name_len, - data_type, &size, decimal_digits, nullable }; - if (!name_len) params.NameLength = &dummy; /* workaround for drivers that don't accept NULL NameLength */ - - if (SUCCESS((ret = ODBC_CALL( SQLDescribeColW, ¶ms ))) && col_size) *col_size = size; - return ret; -} - -static SQLRETURN describe_col_win32_w( struct handle *handle, SQLUSMALLINT col_number, SQLWCHAR *col_name, - SQLSMALLINT buf_len, SQLSMALLINT *name_len, SQLSMALLINT *data_type, - SQLULEN *col_size, SQLSMALLINT *decimal_digits, SQLSMALLINT *nullable ) -{ - if (handle->win32_funcs->SQLDescribeColW) - return handle->win32_funcs->SQLDescribeColW( handle->win32_handle, col_number, col_name, buf_len, name_len, - data_type, col_size, decimal_digits, nullable ); - if (handle->win32_funcs->SQLDescribeCol) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLDescribeColW [ODBC32.108] */ @@ -4038,48 +3407,29 @@ SQLRETURN WINAPI SQLDescribeColW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNu
if (handle->unix_handle) { - ret = describe_col_unix_w( handle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, - ColumnSize, DecimalDigits, Nullable ); + SQLSMALLINT dummy; + UINT64 size; + struct SQLDescribeColW_params params = { handle->unix_handle, ColumnNumber, ColumnName, BufferLength, + NameLength, DataType, &size, DecimalDigits, Nullable }; + if (!NameLength) params.NameLength = &dummy; /* workaround for drivers that don't accept NULL NameLength */ + + if (SUCCESS((ret = ODBC_CALL( SQLDescribeCol, ¶ms ))) && ColumnSize) *ColumnSize = size; } else if (handle->win32_handle) { - ret = describe_col_win32_w( handle, ColumnNumber, ColumnName, BufferLength, NameLength, DataType, - ColumnSize, DecimalDigits, Nullable ); + ret = handle->win32_funcs->SQLDescribeColW( handle->win32_handle, ColumnNumber, ColumnName, BufferLength, + NameLength, DataType, ColumnSize, DecimalDigits, Nullable ); }
TRACE("Returning %d\n", ret); return ret; }
-static SQLRETURN error_unix_w( struct handle *env, struct handle *con, struct handle *stmt, SQLWCHAR *state, - SQLINTEGER *native_err, SQLWCHAR *msg, SQLSMALLINT buflen, SQLSMALLINT *retlen ) -{ - struct SQLErrorW_params params = { env ? env->unix_handle : 0, con ? con->unix_handle : 0, - stmt ? stmt->unix_handle : 0, state, native_err, msg, buflen, retlen }; - return ODBC_CALL( SQLErrorW, ¶ms ); -} - -static SQLRETURN error_win32_w( struct handle *env, struct handle *con, struct handle *stmt, SQLWCHAR *state, - SQLINTEGER *native_err, SQLWCHAR *msg, SQLSMALLINT buflen, SQLSMALLINT *retlen ) -{ - const struct win32_funcs *win32_funcs; - - if (env) win32_funcs = env->win32_funcs; - else if (con) win32_funcs = con->win32_funcs; - else win32_funcs = stmt->win32_funcs; - - if (win32_funcs->SQLErrorW) - return win32_funcs->SQLErrorW( env ? env->win32_handle : NULL, con ? con->win32_handle : NULL, - stmt ? stmt->win32_handle : NULL, state, native_err, msg, buflen, retlen ); - if (win32_funcs->SQLError) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLErrorW [ODBC32.110] */ SQLRETURN WINAPI SQLErrorW(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, SQLHSTMT StatementHandle, - SQLWCHAR *SqlState, SQLINTEGER *NativeError, SQLWCHAR *MessageText, + WCHAR *SqlState, SQLINTEGER *NativeError, WCHAR *MessageText, SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) { struct handle *env = EnvironmentHandle, *con = ConnectionHandle, *stmt = StatementHandle; @@ -4089,61 +3439,53 @@ SQLRETURN WINAPI SQLErrorW(SQLHENV EnvironmentHandle, SQLHDBC ConnectionHandle, " MessageText %p, BufferLength %d, TextLength %p)\n", EnvironmentHandle, ConnectionHandle, StatementHandle, SqlState, NativeError, MessageText, BufferLength, TextLength);
- if (!env && !con && !stmt) return SQL_INVALID_HANDLE; - if ((env && env->unix_handle) || (con && con->unix_handle) || (stmt && stmt->unix_handle)) { - ret = error_unix_w( env, con, stmt, SqlState, NativeError, MessageText, BufferLength, TextLength ); + struct SQLErrorW_params params = { env ? env->unix_handle : 0, + con ? con->unix_handle : 0, + stmt ? stmt->unix_handle : 0, + SqlState, NativeError, MessageText, BufferLength, TextLength }; + ret = ODBC_CALL( SQLErrorW, ¶ms ); } else if ((env && env->win32_handle) || (con && con->win32_handle) || (stmt && stmt->win32_handle)) { - ret = error_win32_w( env, con, stmt, SqlState, NativeError, MessageText, BufferLength, TextLength ); + ret = env->win32_funcs->SQLErrorW( env ? env->win32_handle : NULL, + con ? con->win32_handle : NULL, + stmt ? stmt->win32_handle : NULL, + SqlState, NativeError, MessageText, BufferLength, TextLength ); }
- if (SUCCESS( ret )) + if (SUCCESS(ret )) { - TRACE(" SqlState %s\n", debugstr_sqlwstr(SqlState, 5)); + TRACE(" SqlState %s\n", debugstr_wn(SqlState, 5)); TRACE(" Error %d\n", *NativeError); - TRACE(" MessageText %s\n", debugstr_sqlwstr(MessageText, *TextLength)); + TRACE(" MessageText %s\n", debugstr_wn(MessageText, *TextLength)); } TRACE("Returning %d\n", ret); return ret; }
-static SQLRETURN exec_direct_unix_w( struct handle *handle, SQLWCHAR *text, SQLINTEGER len ) -{ - struct SQLExecDirectW_params params = { handle->unix_handle, text, len }; - return ODBC_CALL( SQLExecDirectW, ¶ms ); -} - -static SQLRETURN exec_direct_win32_w( struct handle *handle, SQLWCHAR *text, SQLINTEGER len ) -{ - if (handle->win32_funcs->SQLExecDirectW) - return handle->win32_funcs->SQLExecDirectW( handle->win32_handle, text, len ); - if (handle->win32_funcs->SQLExecDirect) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLExecDirectW [ODBC32.111] */ -SQLRETURN WINAPI SQLExecDirectW(SQLHSTMT StatementHandle, SQLWCHAR *StatementText, SQLINTEGER TextLength) +SQLRETURN WINAPI SQLExecDirectW(SQLHSTMT StatementHandle, WCHAR *StatementText, SQLINTEGER TextLength) { struct handle *handle = StatementHandle; SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, - debugstr_sqlwstr(StatementText, TextLength), TextLength); + debugstr_wn(StatementText, TextLength), TextLength);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = exec_direct_unix_w( handle, StatementText, TextLength ); + struct SQLExecDirectW_params params = { handle->unix_handle, StatementText, TextLength }; + ret = ODBC_CALL( SQLExecDirectW, ¶ms ); } else if (handle->win32_handle) { - ret = exec_direct_win32_w( handle, StatementText, TextLength ); + ret = handle->win32_funcs->SQLExecDirectW( handle->win32_handle, StatementText, TextLength ); }
TRACE("Returning %d\n", ret); @@ -4187,7 +3529,7 @@ SQLRETURN WINAPI SQLPrepareW(SQLHSTMT StatementHandle, WCHAR *StatementText, SQL SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, StatementText %s, TextLength %d)\n", StatementHandle, - debugstr_sqlwstr(StatementText, TextLength), TextLength); + debugstr_wn(StatementText, TextLength), TextLength);
if (!handle) return SQL_INVALID_HANDLE;
@@ -4214,7 +3556,7 @@ SQLRETURN WINAPI SQLSetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, CursorName %s, NameLength %d)\n", StatementHandle, - debugstr_sqlwstr(CursorName, NameLength), NameLength); + debugstr_wn(CursorName, NameLength), NameLength);
if (!handle) return SQL_INVALID_HANDLE;
@@ -4232,36 +3574,6 @@ SQLRETURN WINAPI SQLSetCursorNameW(SQLHSTMT StatementHandle, WCHAR *CursorName, return ret; }
-static SQLRETURN col_attribute_unix_w( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attr, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attr ) -{ - SQLRETURN ret; - INT64 attr; - struct SQLColAttributeW_params params = { handle->unix_handle, col, field_id, char_attr, buflen, retlen, &attr }; - - if (SUCCESS((ret = ODBC_CALL( SQLColAttributeW, ¶ms ))) && num_attr) *num_attr = attr; - - if (ret == SQL_SUCCESS && SQLColAttributes_KnownStringAttribute(field_id) && char_attr && - retlen && *retlen != wcslen( char_attr ) * sizeof(WCHAR)) - { - TRACE("CHEAT: resetting name length for ADO\n"); - *retlen = wcslen( char_attr ) * sizeof(WCHAR); - } - return ret; -} - -static SQLRETURN col_attribute_win32_w( struct handle *handle, SQLUSMALLINT col, SQLUSMALLINT field_id, - SQLPOINTER char_attr, SQLSMALLINT buflen, SQLSMALLINT *retlen, - SQLLEN *num_attr ) -{ - if (handle->win32_funcs->SQLColAttributeW) - return handle->win32_funcs->SQLColAttributeW( handle->win32_handle, col, field_id, char_attr, buflen, - retlen, num_attr ); - if (handle->win32_funcs->SQLColAttribute) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLColAttributeW [ODBC32.127] */ @@ -4281,13 +3593,24 @@ SQLRETURN WINAPI SQLColAttributeW(SQLHSTMT StatementHandle, SQLUSMALLINT ColumnN
if (handle->unix_handle) { - ret = col_attribute_unix_w( handle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, - StringLength, NumericAttribute ); + INT64 attr; + struct SQLColAttributeW_params params = { handle->unix_handle, ColumnNumber, FieldIdentifier, + CharacterAttribute, BufferLength, StringLength, &attr }; + + if (SUCCESS((ret = ODBC_CALL( SQLColAttributeW, ¶ms ))) && NumericAttribute) *NumericAttribute = attr; + + if (ret == SQL_SUCCESS && CharacterAttribute != NULL && SQLColAttributes_KnownStringAttribute(FieldIdentifier) && + StringLength && *StringLength != wcslen(CharacterAttribute) * 2) + { + TRACE("CHEAT: resetting name length for ADO\n"); + *StringLength = wcslen(CharacterAttribute) * 2; + } } else if (handle->win32_handle) { - ret = col_attribute_win32_w( handle, ColumnNumber, FieldIdentifier, CharacterAttribute, BufferLength, - StringLength, NumericAttribute ); + ret = handle->win32_funcs->SQLColAttributeW( handle->win32_handle, ColumnNumber, FieldIdentifier, + CharacterAttribute, BufferLength, StringLength, + NumericAttribute ); }
TRACE("Returning %d\n", ret); @@ -4301,7 +3624,7 @@ SQLRETURN WINAPI SQLGetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribu SQLINTEGER BufferLength, SQLINTEGER *StringLength) { struct handle *handle = ConnectionHandle; - SQLRETURN ret = SQL_SUCCESS; + SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, Attribute %d, Value %p, BufferLength %d, StringLength %p)\n", ConnectionHandle, Attribute, Value, BufferLength, StringLength); @@ -4319,24 +3642,6 @@ SQLRETURN WINAPI SQLGetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribu ret = handle->win32_funcs->SQLGetConnectAttrW( handle->win32_handle, Attribute, Value, BufferLength, StringLength ); } - else - { - switch (Attribute) - { - case SQL_ATTR_CONNECTION_TIMEOUT: - *(SQLINTEGER *)Value = handle->con_attr_con_timeout; - break; - - case SQL_ATTR_LOGIN_TIMEOUT: - *(SQLINTEGER *)Value = handle->con_attr_login_timeout; - break; - - default: - FIXME( "unhandled attribute %d\n", Attribute ); - ret = SQL_ERROR; - break; - } - }
TRACE("Returning %d\n", ret); return ret; @@ -4437,26 +3742,6 @@ SQLRETURN WINAPI SQLGetDiagFieldW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLS return ret; }
-static SQLRETURN get_diag_rec_unix_w( SQLSMALLINT handle_type, struct handle *handle, SQLSMALLINT rec_num, - SQLWCHAR *state, SQLINTEGER *native_err, SQLWCHAR *msg, SQLSMALLINT buflen, - SQLSMALLINT *retlen ) -{ - struct SQLGetDiagRecW_params params = { handle_type, handle->unix_handle, rec_num, state, native_err, msg, - buflen, retlen }; - return ODBC_CALL( SQLGetDiagRecW, ¶ms ); -} - -static SQLRETURN get_diag_rec_win32_w( SQLSMALLINT handle_type, struct handle *handle, SQLSMALLINT rec_num, - SQLWCHAR *state, SQLINTEGER *native_err, SQLWCHAR *msg, SQLSMALLINT buflen, - SQLSMALLINT *retlen ) -{ - if (handle->win32_funcs->SQLGetDiagRecW) - return handle->win32_funcs->SQLGetDiagRecW( handle_type, handle->win32_handle, rec_num, state, native_err, - msg, buflen, retlen ); - if (handle->win32_funcs->SQLGetDiagRec) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLGetDiagRecW [ODBC32.136] */ @@ -4475,13 +3760,14 @@ SQLRETURN WINAPI SQLGetDiagRecW(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMA
if (handle->unix_handle) { - ret = get_diag_rec_unix_w( HandleType, handle, RecNumber, SqlState, NativeError, MessageText, BufferLength, - TextLength ); + struct SQLGetDiagRecW_params params = { HandleType, handle->unix_handle, RecNumber, SqlState, NativeError, + MessageText, BufferLength, TextLength }; + ret = ODBC_CALL( SQLGetDiagRecW, ¶ms ); } else if (handle->win32_handle) { - ret = get_diag_rec_win32_w( HandleType, handle, RecNumber, SqlState, NativeError, MessageText, BufferLength, - TextLength ); + ret = handle->win32_funcs->SQLGetDiagRecW( HandleType, handle->win32_handle, RecNumber, SqlState, NativeError, + MessageText, BufferLength, TextLength ); }
TRACE("Returning %d\n", ret); @@ -4529,7 +3815,7 @@ SQLRETURN WINAPI SQLSetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribu SQLINTEGER StringLength) { struct handle *handle = ConnectionHandle; - SQLRETURN ret = SQL_SUCCESS; + SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, Attribute %d, Value %p, StringLength %d)\n", ConnectionHandle, Attribute, Value, StringLength); @@ -4545,101 +3831,44 @@ SQLRETURN WINAPI SQLSetConnectAttrW(SQLHDBC ConnectionHandle, SQLINTEGER Attribu { ret = handle->win32_funcs->SQLSetConnectAttrW( handle->win32_handle, Attribute, Value, StringLength ); } - else - { - switch (Attribute) - { - case SQL_ATTR_CONNECTION_TIMEOUT: - handle->con_attr_con_timeout = (UINT32)(ULONG_PTR)Value; - break; - - case SQL_ATTR_LOGIN_TIMEOUT: - handle->con_attr_login_timeout = (UINT32)(ULONG_PTR)Value; - break; - - default: - FIXME( "unhandled attribute %d\n", Attribute ); - ret = SQL_ERROR; - break; - } - }
TRACE("Returning %d\n", ret); return ret; }
-static SQLRETURN columns_unix_w( struct handle *handle, SQLWCHAR *catalog, SQLSMALLINT len1, SQLWCHAR *schema, - SQLSMALLINT len2, SQLWCHAR *table, SQLSMALLINT len3, SQLWCHAR *column, - SQLSMALLINT len4 ) -{ - struct SQLColumnsW_params params = { handle->unix_handle, catalog, len1, schema, len2, table, len3, column, len4 }; - return ODBC_CALL( SQLColumnsW, ¶ms ); -} - -static SQLRETURN columns_win32_w( struct handle *handle, SQLWCHAR *catalog, SQLSMALLINT len1, SQLWCHAR *schema, - SQLSMALLINT len2, SQLWCHAR *table, SQLSMALLINT len3, SQLWCHAR *column, - SQLSMALLINT len4 ) -{ - if (handle->win32_funcs->SQLColumnsW) - return handle->win32_funcs->SQLColumnsW( handle->win32_handle, catalog, len1, schema, len2, table, len3, - column, len4 ); - if (handle->win32_funcs->SQLColumns) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLColumnsW [ODBC32.140] */ -SQLRETURN WINAPI SQLColumnsW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQLSMALLINT NameLength1, - SQLWCHAR *SchemaName, SQLSMALLINT NameLength2, SQLWCHAR *TableName, - SQLSMALLINT NameLength3, SQLWCHAR *ColumnName, SQLSMALLINT NameLength4) +SQLRETURN WINAPI SQLColumnsW(SQLHSTMT StatementHandle, WCHAR *CatalogName, SQLSMALLINT NameLength1, + WCHAR *SchemaName, SQLSMALLINT NameLength2, WCHAR *TableName, + SQLSMALLINT NameLength3, WCHAR *ColumnName, SQLSMALLINT NameLength4) { struct handle *handle = StatementHandle; SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, debugstr_sqlwstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(TableName, NameLength3), NameLength3, debugstr_sqlwstr(ColumnName, NameLength4), - NameLength4); + debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(TableName, NameLength3), NameLength3, debugstr_wn(ColumnName, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = columns_unix_w( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + struct SQLColumnsW_params params = { handle->unix_handle, CatalogName, NameLength1, SchemaName, NameLength2, + TableName, NameLength3, ColumnName, NameLength4 }; + ret = ODBC_CALL( SQLColumnsW, ¶ms ); } else if (handle->win32_handle) { - ret = columns_win32_w( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + ret = handle->win32_funcs->SQLColumnsW( handle->win32_handle, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, ColumnName, NameLength4 ); }
TRACE("Returning %d\n", ret); return ret; }
-static SQLRETURN driver_connect_win32_w( struct handle *handle, SQLHWND window, SQLWCHAR *in_conn_str, - SQLSMALLINT len, SQLWCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2, - SQLUSMALLINT completion ) -{ - if (handle->win32_funcs->SQLDriverConnectW) - return handle->win32_funcs->SQLDriverConnectW( handle->win32_handle, window, in_conn_str, len, out_conn_str, - buflen, len2, completion ); - if (handle->win32_funcs->SQLDriverConnect) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - -static SQLRETURN driver_connect_unix_w( struct handle *handle, SQLHWND window, SQLWCHAR *in_conn_str, SQLSMALLINT len, - SQLWCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2, - SQLUSMALLINT completion ) -{ - struct SQLDriverConnectW_params params = { handle->unix_handle, window, in_conn_str, len, out_conn_str, buflen, - len2, completion }; - return ODBC_CALL( SQLDriverConnectW, ¶ms ); -} - /************************************************************************* * SQLDriverConnectW [ODBC32.141] */ @@ -4653,7 +3882,7 @@ SQLRETURN WINAPI SQLDriverConnectW(SQLHDBC ConnectionHandle, SQLHWND WindowHandl
TRACE("(ConnectionHandle %p, WindowHandle %p, InConnectionString %s, Length %d, OutConnectionString %p," " BufferLength %d, Length2 %p, DriverCompletion %d)\n", ConnectionHandle, WindowHandle, - debugstr_sqlwstr(InConnectionString, Length), Length, OutConnectionString, BufferLength, Length2, + debugstr_wn(InConnectionString, Length), Length, OutConnectionString, BufferLength, Length2, DriverCompletion);
if (!handle) return SQL_INVALID_HANDLE; @@ -4672,28 +3901,40 @@ SQLRETURN WINAPI SQLDriverConnectW(SQLHDBC ConnectionHandle, SQLHWND WindowHandl
if (has_suffix( filename, L".dll" )) { - if (!(handle->win32_funcs = handle->parent->win32_funcs = load_driver( filename ))) + if (!(handle->win32_funcs = load_driver( filename ))) { WARN( "failed to load driver %s\n", debugstr_w(filename) ); goto done; } TRACE( "using Windows driver %s\n", debugstr_w(filename) );
- if (!SUCCESS((ret = create_env( handle->parent, FALSE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, + &handle->parent->win32_handle )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- ret = driver_connect_win32_w( handle, WindowHandle, InConnectionString, Length, OutConnectionString, - BufferLength, Length2, DriverCompletion ); + handle->parent->win32_funcs = handle->win32_funcs; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, handle->parent->win32_handle, + &handle->win32_handle )))) goto done; + + ret = handle->win32_funcs->SQLDriverConnectW( handle->win32_handle, WindowHandle, InConnectionString, Length, + OutConnectionString, BufferLength, Length2, DriverCompletion ); } else { + struct SQLAllocEnv_params params_alloc_env = { &handle->parent->unix_handle }; + struct SQLAllocConnect_params params_alloc_connect = { 0, &handle->unix_handle }; + struct SQLDriverConnectW_params params = { 0, WindowHandle, InConnectionString, Length, OutConnectionString, + BufferLength, Length2, DriverCompletion }; + TRACE( "using Unix driver %s\n", debugstr_w(filename) ); + if (!SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms_alloc_env )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- if (!SUCCESS((ret = create_env( handle->parent, TRUE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + params_alloc_connect.EnvironmentHandle = handle->parent->unix_handle; + if (!SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms_alloc_connect )))) goto done;
- ret = driver_connect_unix_w( handle, WindowHandle, InConnectionString, Length, OutConnectionString, - BufferLength, Length2, DriverCompletion ); + params.ConnectionHandle = handle->unix_handle; + ret = ODBC_CALL( SQLDriverConnectW, ¶ms ); }
done: @@ -4743,25 +3984,6 @@ SQLRETURN WINAPI SQLGetInfoW(SQLHDBC ConnectionHandle, SQLUSMALLINT InfoType, SQ
if (!handle) return SQL_INVALID_HANDLE;
- switch (InfoType) - { - case SQL_ODBC_VER: - { - const WCHAR version[] = L"03.80.0000"; - int len = ARRAY_SIZE(version); - WCHAR *value = InfoValue; - - if (StringLength) *StringLength = len; - if (value && BufferLength >= len) - { - wcscpy( value, version ); - if (StringLength) *StringLength = len - 1; - } - return SQL_SUCCESS; - } - default: break; - } - if (handle->unix_handle) { struct SQLGetInfoW_params params = { handle->unix_handle, InfoType, InfoValue, BufferLength, StringLength }; @@ -4841,8 +4063,8 @@ SQLRETURN WINAPI SQLSpecialColumnsW(SQLHSTMT StatementHandle, SQLUSMALLINT Ident
TRACE("(StatementHandle %p, IdentifierType %d, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d," " TableName %s, NameLength3 %d, Scope %d, Nullable %d)\n", StatementHandle, IdentifierType, - debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, debugstr_sqlwstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(TableName, NameLength3), NameLength3, Scope, Nullable); + debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(TableName, NameLength3), NameLength3, Scope, Nullable);
if (!handle) return SQL_INVALID_HANDLE;
@@ -4875,8 +4097,8 @@ SQLRETURN WINAPI SQLStatisticsW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName,
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d SchemaName %s, NameLength2 %d, TableName %s" " NameLength3 %d, Unique %d, Reserved %d)\n", StatementHandle, - debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, debugstr_sqlwstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(TableName, NameLength3), NameLength3, Unique, Reserved); + debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(TableName, NameLength3), NameLength3, Unique, Reserved);
if (!handle) return SQL_INVALID_HANDLE;
@@ -4908,9 +4130,8 @@ SQLRETURN WINAPI SQLTablesW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQL
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, TableType %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, debugstr_sqlwstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(TableName, NameLength3), NameLength3, debugstr_sqlwstr(TableType, NameLength4), - NameLength4); + debugstr_wn(CatalogName, NameLength1), NameLength1, debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(TableName, NameLength3), NameLength3, debugstr_wn(TableType, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
@@ -4930,23 +4151,6 @@ SQLRETURN WINAPI SQLTablesW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQL return ret; }
-static SQLRETURN browse_connect_win32_w( struct handle *handle, SQLWCHAR *in_conn_str, SQLSMALLINT len, - SQLWCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2 ) -{ - if (handle->win32_funcs->SQLBrowseConnectW) - return handle->win32_funcs->SQLBrowseConnectW( handle->win32_handle, in_conn_str, len, out_conn_str, - buflen, len2 ); - if (handle->win32_funcs->SQLBrowseConnect) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - -static SQLRETURN browse_connect_unix_w( struct handle *handle, SQLWCHAR *in_conn_str, SQLSMALLINT len, - SQLWCHAR *out_conn_str, SQLSMALLINT buflen, SQLSMALLINT *len2 ) -{ - struct SQLBrowseConnectW_params params = { handle->unix_handle, in_conn_str, len, out_conn_str, buflen, len2 }; - return ODBC_CALL( SQLBrowseConnectW, ¶ms ); -} - /************************************************************************* * SQLBrowseConnectW [ODBC32.155] */ @@ -4958,7 +4162,7 @@ SQLRETURN WINAPI SQLBrowseConnectW(SQLHDBC ConnectionHandle, SQLWCHAR *InConnect SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, InConnectionString %s, StringLength1 %d, OutConnectionString %p, BufferLength %d, " - "StringLength2 %p)\n", ConnectionHandle, debugstr_sqlwstr(InConnectionString, StringLength1), StringLength1, + "StringLength2 %p)\n", ConnectionHandle, debugstr_wn(InConnectionString, StringLength1), StringLength1, OutConnectionString, BufferLength, StringLength2);
if (!handle) return SQL_INVALID_HANDLE; @@ -4977,28 +4181,40 @@ SQLRETURN WINAPI SQLBrowseConnectW(SQLHDBC ConnectionHandle, SQLWCHAR *InConnect
if (has_suffix( filename, L".dll" )) { - if (!(handle->win32_funcs = handle->parent->win32_funcs = load_driver( filename ))) + if (!(handle->win32_funcs = load_driver( filename ))) { WARN( "failed to load driver %s\n", debugstr_w(filename) ); goto done; } TRACE( "using Windows driver %s\n", debugstr_w(filename) );
- if (!SUCCESS((ret = create_env( handle->parent, FALSE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_ENV, NULL, + &handle->parent->win32_handle )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done; + + handle->parent->win32_funcs = handle->win32_funcs; + if (!SUCCESS((ret = handle->win32_funcs->SQLAllocHandle( SQL_HANDLE_DBC, handle->parent->win32_handle, + &handle->win32_handle )))) goto done;
- ret = browse_connect_win32_w( handle, InConnectionString, StringLength1, OutConnectionString, BufferLength, - StringLength2 ); + ret = handle->win32_funcs->SQLBrowseConnectW( handle->win32_handle, InConnectionString, StringLength1, + OutConnectionString, BufferLength, StringLength2 ); } else { + struct SQLAllocEnv_params params_alloc_env = { &handle->parent->unix_handle }; + struct SQLAllocConnect_params params_alloc_connect = { 0, &handle->unix_handle }; + struct SQLBrowseConnectW_params params = { 0, InConnectionString, StringLength1, OutConnectionString, + BufferLength, StringLength2 }; + TRACE( "using Unix driver %s\n", debugstr_w(filename) ); + if (!SUCCESS((ret = ODBC_CALL( SQLAllocEnv, ¶ms_alloc_env )))) goto done; + if (!SUCCESS((ret = prepare_env( handle->parent )))) goto done;
- if (!SUCCESS((ret = create_env( handle->parent, TRUE )))) goto done; - if (!SUCCESS((ret = create_con( handle )))) goto done; + params_alloc_connect.EnvironmentHandle = handle->parent->unix_handle; + if (!SUCCESS((ret = ODBC_CALL( SQLAllocConnect, ¶ms_alloc_connect )))) goto done;
- ret = browse_connect_unix_w( handle, InConnectionString, StringLength1, OutConnectionString, BufferLength, - StringLength2 ); + params.ConnectionHandle = handle->unix_handle; + ret = ODBC_CALL( SQLBrowseConnectW, ¶ms ); }
done: @@ -5008,26 +4224,6 @@ done: return ret; }
-static SQLRETURN column_privs_unix_w( struct handle *handle, SQLWCHAR *catalog, SQLSMALLINT len1, SQLWCHAR *schema, - SQLSMALLINT len2, SQLWCHAR *table, SQLSMALLINT len3, SQLWCHAR *column, - SQLSMALLINT len4 ) -{ - struct SQLColumnPrivilegesW_params params = { handle->unix_handle, catalog, len1, schema, len2, table, len3, - column, len4 }; - return ODBC_CALL( SQLColumnPrivilegesW, ¶ms ); -} - -static SQLRETURN column_privs_win32_w( struct handle *handle, SQLWCHAR *catalog, SQLSMALLINT len1, SQLWCHAR *schema, - SQLSMALLINT len2, SQLWCHAR *table, SQLSMALLINT len3, SQLWCHAR *column, - SQLSMALLINT len4 ) -{ - if (handle->win32_funcs->SQLColumnPrivilegesW) - return handle->win32_funcs->SQLColumnPrivilegesW( handle->win32_handle, catalog, len1, schema, len2, table, - len3, column, len4 ); - if (handle->win32_funcs->SQLColumnPrivileges) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLColumnPrivilegesW [ODBC32.156] */ @@ -5040,21 +4236,23 @@ SQLRETURN WINAPI SQLColumnPrivilegesW(SQLHSTMT StatementHandle, SQLWCHAR *Catalo
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," " NameLength3 %d, ColumnName %s, NameLength3 %d)\n", StatementHandle, - debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, debugstr_sqlwstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(TableName, NameLength3), NameLength3, debugstr_sqlwstr(ColumnName, NameLength4), - NameLength4); + debugstr_wn(CatalogName, NameLength1), NameLength1, + debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(TableName, NameLength3), NameLength3, + debugstr_wn(ColumnName, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = column_privs_unix_w( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + struct SQLColumnPrivilegesW_params params = { handle->unix_handle, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, ColumnName, NameLength4 }; + ret = ODBC_CALL( SQLColumnPrivilegesW, ¶ms ); } else if (handle->win32_handle) { - ret = column_privs_win32_w( handle, CatalogName, NameLength1, SchemaName, NameLength2, TableName, NameLength3, - ColumnName, NameLength4 ); + ret = handle->win32_funcs->SQLColumnPrivilegesW( handle->win32_handle, CatalogName, NameLength1, SchemaName, + NameLength2, TableName, NameLength3, ColumnName, NameLength4 ); }
TRACE("Returning %d\n", ret); @@ -5079,7 +4277,7 @@ SQLRETURN WINAPI SQLDataSourcesW(SQLHENV EnvironmentHandle, SQLUSMALLINT Directi
if (!handle) return SQL_INVALID_HANDLE;
- if (Direction == SQL_FETCH_FIRST || (Direction == SQL_FETCH_NEXT && !handle->sources_key)) + if (Direction == SQL_FETCH_FIRST) { handle->sources_idx = 0; handle->sources_system = FALSE; @@ -5129,28 +4327,6 @@ done: return ret; }
-static SQLRETURN foreign_keys_unix_w( struct handle *handle, SQLWCHAR *pk_catalog, SQLSMALLINT len1, - SQLWCHAR *pk_schema, SQLSMALLINT len2, SQLWCHAR *pk_table, SQLSMALLINT len3, - SQLWCHAR *fk_catalog, SQLSMALLINT len4, SQLWCHAR *fk_schema, SQLSMALLINT len5, - SQLWCHAR *fk_table, SQLSMALLINT len6 ) -{ - struct SQLForeignKeysW_params params = { handle->unix_handle, pk_catalog, len1, pk_schema, len2, pk_table, len3, - fk_catalog, len4, fk_schema, len5, fk_table, len6 }; - return ODBC_CALL( SQLForeignKeysW, ¶ms ); -} - -static SQLRETURN foreign_keys_win32_w( struct handle *handle, SQLWCHAR *pk_catalog, SQLSMALLINT len1, - SQLWCHAR *pk_schema, SQLSMALLINT len2, SQLWCHAR *pk_table, SQLSMALLINT len3, - SQLWCHAR *fk_catalog, SQLSMALLINT len4, SQLWCHAR *fk_schema, SQLSMALLINT len5, - SQLWCHAR *fk_table, SQLSMALLINT len6 ) -{ - if (handle->win32_funcs->SQLForeignKeysW) - return handle->win32_funcs->SQLForeignKeysW( handle->win32_handle, pk_catalog, len1, pk_schema, len2, pk_table, - len3, fk_catalog, len4, fk_schema, len5, fk_table, len6 ); - if (handle->win32_funcs->SQLForeignKeys) FIXME( "Unicode to ANSI conversion not handled\n" ); - return SQL_ERROR; -} - /************************************************************************* * SQLForeignKeysW [ODBC32.160] */ @@ -5166,24 +4342,27 @@ SQLRETURN WINAPI SQLForeignKeysW(SQLHSTMT StatementHandle, SQLWCHAR *PkCatalogNa TRACE("(StatementHandle %p, PkCatalogName %s, NameLength1 %d, PkSchemaName %s, NameLength2 %d," " PkTableName %s, NameLength3 %d, FkCatalogName %s, NameLength4 %d, FkSchemaName %s," " NameLength5 %d, FkTableName %s, NameLength6 %d)\n", StatementHandle, - debugstr_sqlwstr(PkCatalogName, NameLength1), NameLength1, debugstr_sqlwstr(PkSchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(PkTableName, NameLength3), NameLength3, - debugstr_sqlwstr(FkCatalogName, NameLength4), NameLength4, debugstr_sqlwstr(FkSchemaName, NameLength5), - NameLength5, debugstr_sqlwstr(FkTableName, NameLength6), NameLength6); + debugstr_wn(PkCatalogName, NameLength1), NameLength1, + debugstr_wn(PkSchemaName, NameLength2), NameLength2, + debugstr_wn(PkTableName, NameLength3), NameLength3, + debugstr_wn(FkCatalogName, NameLength4), NameLength4, + debugstr_wn(FkSchemaName, NameLength5), NameLength5, + debugstr_wn(FkTableName, NameLength6), NameLength6);
if (!handle) return SQL_INVALID_HANDLE;
if (handle->unix_handle) { - ret = foreign_keys_unix_w( handle, PkCatalogName, NameLength1, PkSchemaName, NameLength2, PkTableName, - NameLength2, FkCatalogName, NameLength3, FkSchemaName, NameLength5, FkTableName, - NameLength6 ); + struct SQLForeignKeysW_params params = { handle->unix_handle, PkCatalogName, NameLength1, PkSchemaName, + NameLength2, PkTableName, NameLength2, FkCatalogName, NameLength3, + FkSchemaName, NameLength5, FkTableName, NameLength6 }; + ret = ODBC_CALL( SQLForeignKeysW, ¶ms ); } else if (handle->win32_handle) { - ret = foreign_keys_win32_w( handle, PkCatalogName, NameLength1, PkSchemaName, NameLength2, PkTableName, - NameLength3, FkCatalogName, NameLength4, FkSchemaName, NameLength5, FkTableName, - NameLength6 ); + ret = handle->win32_funcs->SQLForeignKeysW( handle->win32_handle, PkCatalogName, NameLength1, PkSchemaName, + NameLength2, PkTableName, NameLength3, FkCatalogName, NameLength4, + FkSchemaName, NameLength5, FkTableName, NameLength6 ); }
TRACE("Returning %d\n", ret); @@ -5200,7 +4379,7 @@ SQLRETURN WINAPI SQLNativeSqlW(SQLHDBC ConnectionHandle, SQLWCHAR *InStatementTe SQLRETURN ret = SQL_ERROR;
TRACE("(ConnectionHandle %p, InStatementText %s, TextLength1 %d, OutStatementText %p, BufferLength %d, " - "TextLength2 %p)\n", ConnectionHandle, debugstr_sqlwstr(InStatementText, TextLength1), TextLength1, + "TextLength2 %p)\n", ConnectionHandle, debugstr_wn(InStatementText, TextLength1), TextLength1, OutStatementText, BufferLength, TextLength2);
if (!handle) return SQL_INVALID_HANDLE; @@ -5232,9 +4411,10 @@ SQLRETURN WINAPI SQLPrimaryKeysW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," - " NameLength3 %d)\n", StatementHandle, debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, - debugstr_sqlwstr(SchemaName, NameLength2), NameLength2, debugstr_sqlwstr(TableName, NameLength3), - NameLength3); + " NameLength3 %d)\n", StatementHandle, + debugstr_wn(CatalogName, NameLength1), NameLength1, + debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(TableName, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -5266,9 +4446,10 @@ SQLRETURN WINAPI SQLProcedureColumnsW(SQLHSTMT StatementHandle, SQLWCHAR *Catalo
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, ProcName %s," " NameLength3 %d, ColumnName %s, NameLength4 %d)\n", StatementHandle, - debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, debugstr_sqlwstr(SchemaName, NameLength2), - NameLength2, debugstr_sqlwstr(ProcName, NameLength3), NameLength3, debugstr_sqlwstr(ColumnName, NameLength4), - NameLength4); + debugstr_wn(CatalogName, NameLength1), NameLength1, + debugstr_wn(SchemaName, NameLength2), NameLength2, + debugstr_wn(ProcName, NameLength3), NameLength3, + debugstr_wn(ColumnName, NameLength4), NameLength4);
if (!handle) return SQL_INVALID_HANDLE;
@@ -5299,9 +4480,8 @@ SQLRETURN WINAPI SQLProceduresW(SQLHSTMT StatementHandle, SQLWCHAR *CatalogName, SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, ProcName %s," - " NameLength3 %d)\n", StatementHandle, debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, - debugstr_sqlwstr(SchemaName, NameLength2), NameLength2, debugstr_sqlwstr(ProcName, NameLength3), - NameLength3); + " NameLength3 %d)\n", StatementHandle, debugstr_wn(CatalogName, NameLength1), NameLength1, + debugstr_wn(SchemaName, NameLength2), NameLength2, debugstr_wn(ProcName, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -5332,9 +4512,8 @@ SQLRETURN WINAPI SQLTablePrivilegesW(SQLHSTMT StatementHandle, SQLWCHAR *Catalog SQLRETURN ret = SQL_ERROR;
TRACE("(StatementHandle %p, CatalogName %s, NameLength1 %d, SchemaName %s, NameLength2 %d, TableName %s," - " NameLength3 %d)\n", StatementHandle, debugstr_sqlwstr(CatalogName, NameLength1), NameLength1, - debugstr_sqlwstr(SchemaName, NameLength2), NameLength2, debugstr_sqlwstr(TableName, NameLength3), - NameLength3); + " NameLength3 %d)\n", StatementHandle, debugstr_wn(CatalogName, NameLength1), NameLength1, + debugstr_wn(SchemaName, NameLength2), NameLength2, debugstr_wn(TableName, NameLength3), NameLength3);
if (!handle) return SQL_INVALID_HANDLE;
@@ -5372,7 +4551,7 @@ SQLRETURN WINAPI SQLDriversW(SQLHENV EnvironmentHandle, SQLUSMALLINT Direction,
if (!handle) return SQL_INVALID_HANDLE;
- if (Direction == SQL_FETCH_FIRST || (Direction == SQL_FETCH_NEXT && !handle->drivers_key)) + if (Direction == SQL_FETCH_FIRST) { handle->drivers_idx = 0; RegCloseKey( handle->drivers_key ); @@ -5480,6 +4659,17 @@ SQLRETURN WINAPI SQLSetStmtAttrW(SQLHSTMT StatementHandle, SQLINTEGER Attribute, return ret; }
+/************************************************************************* + * SQLGetDiagRecA [ODBC32.236] + */ +SQLRETURN WINAPI SQLGetDiagRecA(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLSMALLINT RecNumber, + SQLCHAR *SqlState, SQLINTEGER *NativeError, SQLCHAR *MessageText, + SQLSMALLINT BufferLength, SQLSMALLINT *TextLength) +{ + return SQLGetDiagRec( HandleType, Handle, RecNumber, SqlState, NativeError, MessageText, BufferLength, + TextLength ); +} + /*********************************************************************** * DllMain [Internal] Initializes the internal 'ODBC32.DLL'. */ diff --git a/dlls/odbc32/tests/odbc32.c b/dlls/odbc32/tests/odbc32.c index 10b5b933d80..950b86ba036 100644 --- a/dlls/odbc32/tests/odbc32.c +++ b/dlls/odbc32/tests/odbc32.c @@ -66,7 +66,7 @@ static void diag( SQLHANDLE handle, SQLSMALLINT type ) { SQLINTEGER err; SQLSMALLINT len; - SQLCHAR state[6], msg[256]; + SQLCHAR state[5], msg[256]; SQLRETURN ret;
state[0] = 0; @@ -82,7 +82,7 @@ static void test_SQLConnect( void ) SQLHENV env; SQLHDBC con; SQLRETURN ret; - SQLINTEGER size, version, pooling; + SQLINTEGER size, version; SQLUINTEGER timeout; SQLSMALLINT len; char str[32]; @@ -99,28 +99,10 @@ static void test_SQLConnect( void ) ok( size == -1, "size set\n" ); trace( "ODBC version %d\n", version );
- pooling = -1; - ret = SQLGetEnvAttr( env, SQL_ATTR_CONNECTION_POOLING, &pooling, sizeof(pooling), NULL ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( !pooling, "got %d\n", pooling ); - ret = SQLAllocConnect( env, &con ); ok( ret == SQL_SUCCESS, "got %d\n", ret );
- len = -1; - ret = SQLGetInfo( con, SQL_ODBC_VER, NULL, 0, &len ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( len != -1, "len not set\n" ); - - memset( str, 0, sizeof(str) ); - ret = SQLGetInfo( con, SQL_ODBC_VER, str, sizeof(str), &len ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( str[0], "empty string\n" ); - ok( len == strlen(str), "got %d\n", len ); - trace( "version %s\n", str ); - - ret = SQLConnect( con, (SQLCHAR *)"winetest", SQL_NTS, (SQLCHAR *)"winetest", SQL_NTS, (SQLCHAR *)"winetest", - SQL_NTS ); + ret = SQLConnect( con, (SQLCHAR *)"winetest", 8, (SQLCHAR *)"winetest", 8, (SQLCHAR *)"winetest", 8 ); if (ret == SQL_ERROR) diag( con, SQL_HANDLE_DBC ); if (ret != SQL_SUCCESS) { @@ -137,17 +119,15 @@ static void test_SQLConnect( void ) ok( timeout != 0xdeadbeef, "timeout not set\n" ); ok( size == -1, "size set\n" );
- ret = SQLTransact( NULL, NULL, SQL_COMMIT ); - ok( ret == SQL_INVALID_HANDLE, "got %d\n", ret ); - - ret = SQLTransact( env, NULL, SQL_COMMIT ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - - ret = SQLTransact( NULL, con, SQL_COMMIT ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - - ret = SQLTransact( env, con, SQL_COMMIT ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); + len = -1; + memset( str, 0, sizeof(str) ); + ret = SQLGetInfo( con, SQL_ODBC_VER, str, sizeof(str), &len ); + if (ret == SQL_SUCCESS) + { + ok( str[0], "empty string\n" ); + ok( len != -1, "len not set\n" ); + trace( "version %s\n", str ); + }
ret = SQLDisconnect( con ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); @@ -313,9 +293,8 @@ static void test_SQLExecDirect( void ) SQLRETURN ret; SQLLEN count, len_id[2], len_name[2]; SQLULEN rows_fetched; - SQLINTEGER id[2], err; - SQLCHAR name[32], msg[32], state[6]; - SQLSMALLINT len; + SQLINTEGER id[2]; + SQLCHAR name[32];
ret = SQLAllocEnv( &env ); ok( ret == SQL_SUCCESS, "got %d\n", ret ); @@ -462,18 +441,6 @@ static void test_SQLExecDirect( void ) ret = SQLExecDirect( stmt, (SQLCHAR *)"DROP TABLE winetest", ARRAYSIZE("DROP TABLE winetest") - 1 ); ok( ret == SQL_SUCCESS, "got %d\n", ret );
- ret = SQLError( NULL, NULL, NULL, state, &err, msg, sizeof(msg), &len ); - ok( ret == SQL_INVALID_HANDLE, "got %d\n", ret ); - - ret = SQLError( env, NULL, NULL, state, &err, msg, sizeof(msg), &len ); - ok( ret == SQL_NO_DATA, "got %d\n", ret ); - - ret = SQLError( env, con, NULL, state, &err, msg, sizeof(msg), &len ); - ok( ret == SQL_NO_DATA, "got %d\n", ret ); - - ret = SQLError( env, con, stmt, state, &err, msg, sizeof(msg), &len ); - ok( ret == SQL_NO_DATA, "got %d\n", ret ); - ret = SQLFreeStmt( stmt, SQL_UNBIND ); ok( ret == SQL_SUCCESS, "got %d\n", ret );
@@ -511,35 +478,6 @@ static void test_SQLSetEnvAttr(void) ok( ret == SQL_SUCCESS, "got %d\n", ret ); }
-static void test_SQLSetConnectAttr(void) -{ - SQLUINTEGER timeout; - SQLHENV env; - SQLHDBC con; - SQLRETURN ret; - - ret = SQLAllocEnv( &env ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - - ret = SQLAllocConnect( env, &con ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - - timeout = 10; - ret = SQLSetConnectAttr( con, SQL_ATTR_LOGIN_TIMEOUT, (SQLPOINTER)(ULONG_PTR)timeout, sizeof(timeout) ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - - timeout = 0; - ret = SQLGetConnectAttr( con, SQL_ATTR_LOGIN_TIMEOUT, &timeout, sizeof(timeout), NULL ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - ok( timeout == 10, "wrong timeout %d\n", timeout ); - - ret = SQLFreeConnect( con ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); - - ret = SQLFreeEnv( env ); - ok( ret == SQL_SUCCESS, "got %d\n", ret ); -} - START_TEST(odbc32) { test_SQLAllocHandle(); @@ -550,5 +488,4 @@ START_TEST(odbc32) test_SQLDrivers(); test_SQLExecDirect(); test_SQLSetEnvAttr(); - test_SQLSetConnectAttr(); } diff --git a/dlls/odbc32/unixlib.c b/dlls/odbc32/unixlib.c index 550a0681a9f..6f244514d7d 100644 --- a/dlls/odbc32/unixlib.c +++ b/dlls/odbc32/unixlib.c @@ -209,7 +209,7 @@ static void replicate_odbcinst_to_registry( SQLHENV env )
if ((key_driver = create_key( key_odbcinst, desc, wcslen( desc ) * sizeof(WCHAR) ))) { - static const WCHAR driverW[] = {'D','r','i','v','e','r'}, driver_eqW[] = {'D','r','i','v','e','r','='}; + static const WCHAR driverW[] = {'D','r','i','v','e','r',0}, driver_eqW[] = {'D','r','i','v','e','r','='}; const WCHAR *driver = NULL, *ptr = attrs;
while (*ptr) @@ -223,7 +223,7 @@ static void replicate_odbcinst_to_registry( SQLHENV env ) ptr += wcslen( ptr ) + 1; } if (driver) set_value( key_driver, driverW, sizeof(driverW), REG_SZ, (const BYTE *)driver, - (wcslen(driver) + 1) * sizeof(WCHAR) ); + wcslen(driver) * sizeof(WCHAR) ); NtClose( key_driver ); } } diff --git a/dlls/odbc32/unixlib.h b/dlls/odbc32/unixlib.h index 4241d06c892..966ade5ad72 100644 --- a/dlls/odbc32/unixlib.h +++ b/dlls/odbc32/unixlib.h @@ -192,8 +192,6 @@ struct handle struct handle *parent; /* attributes */ UINT32 env_attr_version; - UINT32 con_attr_con_timeout; - UINT32 con_attr_login_timeout; /* drivers and data sources */ UINT32 drivers_idx; void *drivers_key; diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 4c2b2f77167..54873150da3 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -1079,16 +1079,18 @@ foreach (sort keys %ext_functions) } print OUT "};\n\n";
+print OUT "typedef void (WINAPI *gl_debug_cb)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *, const void *);\n"; print OUT "struct wine_gl_debug_message_params\n"; print OUT "{\n"; -print OUT " UINT64 debug_callback; /* client pointer */\n"; -print OUT " UINT64 debug_user; /* client pointer */\n"; -print OUT " UINT32 source;\n"; -print OUT " UINT32 type;\n"; -print OUT " UINT32 id;\n"; -print OUT " UINT32 severity;\n"; -print OUT " UINT32 length;\n"; -print OUT " char message[1];\n"; +print OUT " gl_debug_cb user_callback;\n"; +print OUT " const void *user_data;\n"; +print OUT "\n"; +print OUT " GLenum source;\n"; +print OUT " GLenum type;\n"; +print OUT " GLuint id;\n"; +print OUT " GLenum severity;\n"; +print OUT " GLsizei length;\n"; +print OUT " const GLchar *message;\n"; print OUT "};\n\n";
print OUT "#define UNIX_CALL( func, params ) WINE_UNIX_CALL( unix_ ## func, params )\n\n"; diff --git a/dlls/opengl32/unix_wgl.c b/dlls/opengl32/unix_wgl.c index c5c584fc848..093dab4efb8 100644 --- a/dlls/opengl32/unix_wgl.c +++ b/dlls/opengl32/unix_wgl.c @@ -66,8 +66,8 @@ enum wgl_handle_type struct opengl_context { DWORD tid; /* thread that the context is current in */ - UINT64 debug_callback; /* client pointer */ - UINT64 debug_user; /* client pointer */ + void (CALLBACK *debug_callback)( GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *, const void * ); /* debug callback */ + const void *debug_user; /* debug user parameter */ GLubyte *extensions; /* extension string */ GLuint *disabled_exts; /* indices of disabled extensions */ struct wgl_context *drv_ctx; /* driver context */ @@ -896,15 +896,21 @@ static BOOL wrap_wglSetPbufferAttribARB( HPBUFFERARB handle, const int *attribs }
static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GLenum severity, - GLsizei length, const GLchar *message, const void *user ) + GLsizei length, const GLchar *message, const void *userParam ) { - struct wine_gl_debug_message_params *params; + struct wine_gl_debug_message_params params = + { + .source = source, + .type = type, + .id = id, + .severity = severity, + .length = length, + .message = message, + }; void *ret_ptr; ULONG ret_len; - struct wgl_handle *ptr = (struct wgl_handle *)user; - UINT len = strlen( message ) + 1, size; + struct wgl_handle *ptr = (struct wgl_handle *)userParam;
- if (!ptr->u.context->debug_callback) return; if (!NtCurrentTeb()) { fprintf( stderr, "msg:gl_debug_message_callback called from native thread, severity %#x, message "%.*s".\n", @@ -912,55 +918,46 @@ static void gl_debug_message_callback( GLenum source, GLenum type, GLuint id, GL return; }
- size = offsetof(struct wine_gl_debug_message_params, message[len] ); - if (!(params = malloc( size ))) return; - params->debug_callback = ptr->u.context->debug_callback; - params->debug_user = ptr->u.context->debug_user; - params->source = source; - params->type = type; - params->id = id; - params->severity = severity; - params->length = length; - memcpy( params->message, message, len ); - - KeUserModeCallback( NtUserCallOpenGLDebugMessageCallback, params, size, + if (!(params.user_callback = ptr->u.context->debug_callback)) return; + params.user_data = ptr->u.context->debug_user; + + KeUserModeCallback( NtUserCallOpenGLDebugMessageCallback, ¶ms, sizeof(params), &ret_ptr, &ret_len ); - free( params ); }
-static void wrap_glDebugMessageCallback( TEB *teb, GLDEBUGPROC callback, const void *user ) +static void wrap_glDebugMessageCallback( TEB *teb, GLDEBUGPROC callback, const void *userParam ) { struct wgl_handle *ptr = get_current_context_ptr( teb ); const struct opengl_funcs *funcs = teb->glTable;
if (!funcs->ext.p_glDebugMessageCallback) return;
- ptr->u.context->debug_callback = (UINT_PTR)callback; - ptr->u.context->debug_user = (UINT_PTR)user; + ptr->u.context->debug_callback = callback; + ptr->u.context->debug_user = userParam; funcs->ext.p_glDebugMessageCallback( gl_debug_message_callback, ptr ); }
-static void wrap_glDebugMessageCallbackAMD( TEB *teb, GLDEBUGPROCAMD callback, void *user ) +static void wrap_glDebugMessageCallbackAMD( TEB *teb, GLDEBUGPROCAMD callback, void *userParam ) { struct wgl_handle *ptr = get_current_context_ptr( teb ); const struct opengl_funcs *funcs = teb->glTable;
if (!funcs->ext.p_glDebugMessageCallbackAMD) return;
- ptr->u.context->debug_callback = (UINT_PTR)callback; - ptr->u.context->debug_user = (UINT_PTR)user; + ptr->u.context->debug_callback = callback; + ptr->u.context->debug_user = userParam; funcs->ext.p_glDebugMessageCallbackAMD( gl_debug_message_callback, ptr ); }
-static void wrap_glDebugMessageCallbackARB( TEB *teb, GLDEBUGPROCARB callback, const void *user ) +static void wrap_glDebugMessageCallbackARB( TEB *teb, GLDEBUGPROCARB callback, const void *userParam ) { struct wgl_handle *ptr = get_current_context_ptr( teb ); const struct opengl_funcs *funcs = teb->glTable;
if (!funcs->ext.p_glDebugMessageCallbackARB) return;
- ptr->u.context->debug_callback = (UINT_PTR)callback; - ptr->u.context->debug_user = (UINT_PTR)user; + ptr->u.context->debug_callback = callback; + ptr->u.context->debug_user = userParam; funcs->ext.p_glDebugMessageCallbackARB( gl_debug_message_callback, ptr ); }
diff --git a/dlls/opengl32/unixlib.h b/dlls/opengl32/unixlib.h index 46b081e0b18..301038ca102 100644 --- a/dlls/opengl32/unixlib.h +++ b/dlls/opengl32/unixlib.h @@ -28377,16 +28377,18 @@ enum unix_funcs unix_wglSwapIntervalEXT, };
+typedef void (WINAPI *gl_debug_cb)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *, const void *); struct wine_gl_debug_message_params { - UINT64 debug_callback; /* client pointer */ - UINT64 debug_user; /* client pointer */ - UINT32 source; - UINT32 type; - UINT32 id; - UINT32 severity; - UINT32 length; - char message[1]; + gl_debug_cb user_callback; + const void *user_data; + + GLenum source; + GLenum type; + GLuint id; + GLenum severity; + GLsizei length; + const GLchar *message; };
#define UNIX_CALL( func, params ) WINE_UNIX_CALL( unix_ ## func, params ) diff --git a/dlls/opengl32/wgl.c b/dlls/opengl32/wgl.c index b4daa642348..19d989e44fc 100644 --- a/dlls/opengl32/wgl.c +++ b/dlls/opengl32/wgl.c @@ -1875,15 +1875,11 @@ GLboolean WINAPI glUnmapNamedBufferEXT( GLuint buffer ) return gl_unmap_named_buffer( unix_glUnmapNamedBufferEXT, buffer ); }
-typedef void (WINAPI *gl_debug_message)(GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar *, const void *); - -static NTSTATUS WINAPI call_gl_debug_message_callback( void *args, ULONG size ) +static NTSTATUS WINAPI call_opengl_debug_message_callback( void *args, ULONG size ) { struct wine_gl_debug_message_params *params = args; - gl_debug_message callback = (void *)(UINT_PTR)params->debug_callback; - const void *user = (void *)(UINT_PTR)params->debug_user; - callback( params->source, params->type, params->id, params->severity, - params->length, params->message, user ); + params->user_callback( params->source, params->type, params->id, params->severity, + params->length, params->message, params->user_data ); return STATUS_SUCCESS; }
@@ -1905,7 +1901,7 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) }
kernel_callback_table = NtCurrentTeb()->Peb->KernelCallbackTable; - kernel_callback_table[NtUserCallOpenGLDebugMessageCallback] = call_gl_debug_message_callback; + kernel_callback_table[NtUserCallOpenGLDebugMessageCallback] = call_opengl_debug_message_callback; /* fallthrough */ case DLL_THREAD_ATTACH: if ((status = UNIX_CALL( thread_attach, NtCurrentTeb() ))) diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index ef8c78951c8..9d95cda9def 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -181,42 +181,6 @@ static inline struct quartz_vmr *impl_from_IBaseFilter(IBaseFilter *iface) return CONTAINING_RECORD(iface, struct quartz_vmr, renderer.filter.IBaseFilter_iface); }
-static void copy_plane(BYTE **dstp, unsigned int dst_pitch, unsigned int dst_height, - const BYTE **srcp, unsigned int src_pitch, int src_height) -{ - size_t copy_size = min(src_pitch, dst_pitch); - const BYTE *src = *srcp; - BYTE *dst = *dstp; - unsigned int i; - - if (src_height < 0) - { - TRACE("Inverting image.\n"); - - src_height = -src_height; - src += src_height * src_pitch; - - for (i = 0; i < src_height; ++i) - { - src -= src_pitch; - memcpy(dst, src, copy_size); - dst += dst_pitch; - } - } - else - { - for (i = 0; i < src_height; ++i) - { - memcpy(dst, src, copy_size); - dst += dst_pitch; - src += src_pitch; - } - } - - *srcp += src_pitch * src_height; - *dstp += dst_pitch * dst_height; -} - static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample) { struct quartz_vmr *filter = impl_from_IBaseFilter(&iface->filter.IBaseFilter_iface); @@ -225,7 +189,6 @@ static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample) REFERENCE_TIME start_time, end_time; VMR9PresentationInfo info = {}; D3DLOCKED_RECT locked_rect; - D3DSURFACE_DESC dst_desc; BYTE *data = NULL; HRESULT hr; int height; @@ -277,56 +240,42 @@ static HRESULT vmr_render(struct strmbase_renderer *iface, IMediaSample *sample) info.szAspectRatio.cy = height; info.lpSurf = filter->surfaces[(++filter->cur_surface) % filter->num_surfaces];
- if (FAILED(hr = IDirect3DSurface9_GetDesc(info.lpSurf, &dst_desc))) - { - ERR("Failed to get rendering surface description.\n"); - return hr; - } - - if (width > dst_desc.Width || abs(height) > dst_desc.Height) - FIXME("src surface (%ux%u) larger than rendering surface (%ux%u).\n", width, height, - dst_desc.Width, dst_desc.Height); - if (FAILED(hr = IDirect3DSurface9_LockRect(info.lpSurf, &locked_rect, NULL, D3DLOCK_DISCARD))) { ERR("Failed to lock surface, hr %#lx.\n", hr); return hr; }
- if (bitmap_header->biCompression == mmioFOURCC('N','V','1','2')) + if (height > 0 && bitmap_header->biCompression == BI_RGB) { - BYTE *dst = locked_rect.pBits; + BYTE *dst = (BYTE *)locked_rect.pBits + (height * locked_rect.Pitch); const BYTE *src = data;
- copy_plane(&dst, locked_rect.Pitch, dst_desc.Height, &src, src_pitch, height); - copy_plane(&dst, locked_rect.Pitch, dst_desc.Height / 2, &src, src_pitch, height / 2); - } - else if (bitmap_header->biCompression == mmioFOURCC('Y','V','1','2')) - { - BYTE *dst = locked_rect.pBits; - const BYTE *src = data; - - copy_plane(&dst, locked_rect.Pitch, dst_desc.Height, &src, src_pitch, height); - copy_plane(&dst, locked_rect.Pitch / 2, dst_desc.Height / 2, &src, src_pitch / 2, height / 2); - copy_plane(&dst, locked_rect.Pitch / 2, dst_desc.Height / 2, &src, src_pitch / 2, height / 2); - } - else if (height > 0 && bitmap_header->biCompression == BI_RGB) - { - BYTE *dst = locked_rect.pBits; - const BYTE *src = data; + TRACE("Inverting image.\n");
- copy_plane(&dst, locked_rect.Pitch, dst_desc.Height, &src, src_pitch, -height); + while (height--) + { + dst -= locked_rect.Pitch; + memcpy(dst, src, width * depth / 8); + src += src_pitch; + } } else if (locked_rect.Pitch != src_pitch) { BYTE *dst = locked_rect.pBits; const BYTE *src = data;
+ height = abs(height); + TRACE("Source pitch %u does not match dest pitch %u; copying manually.\n", src_pitch, locked_rect.Pitch);
- height = abs(height); - copy_plane(&dst, locked_rect.Pitch, dst_desc.Height, &src, src_pitch, height); + while (height--) + { + memcpy(dst, src, width * depth / 8); + src += src_pitch; + dst += locked_rect.Pitch; + } } else { diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c index aaebfda062b..1af0682b269 100644 --- a/dlls/secur32/schannel_gnutls.c +++ b/dlls/secur32/schannel_gnutls.c @@ -904,7 +904,6 @@ static const WCHAR *get_hash_str( gnutls_session_t session, BOOL full ) static const WCHAR sha384W[] = {'S','H','A','3','8','4',0}; static const WCHAR sha512W[] = {'S','H','A','5','1','2',0}; static const WCHAR unknownW[] = {'<','u','n','k','n','o','w','n','>',0}; - static const WCHAR emptyW[] = {0}; gnutls_mac_algorithm_t mac = pgnutls_mac_get( session );
switch (mac) @@ -914,7 +913,6 @@ static const WCHAR *get_hash_str( gnutls_session_t session, BOOL full ) case GNUTLS_MAC_SHA256: return sha256W; case GNUTLS_MAC_SHA384: return sha384W; case GNUTLS_MAC_SHA512: return sha512W; - case GNUTLS_MAC_AEAD: return emptyW; default: FIXME( "unknown mac %u\n", mac ); return unknownW; @@ -993,16 +991,14 @@ static const WCHAR *get_chaining_mode_str( gnutls_session_t session )
static NTSTATUS schan_get_cipher_info( void *args ) { - static const WCHAR tlsW[] = {'T','L','S','_',0}; - static const WCHAR underscoreW[] = {'_',0}; - static const WCHAR widthW[] = {'_','W','I','T','H','_',0}; - static const WCHAR sha384W[] = {'S','H','A','3','8','4',0}; + const WCHAR tlsW[] = {'T','L','S','_',0}; + const WCHAR underscoreW[] = {'_',0}; + const WCHAR widthW[] = {'_','W','I','T','H','_',0}; const struct get_cipher_info_params *params = args; gnutls_session_t session = session_from_handle( params->session ); SecPkgContext_CipherInfo *info = params->info; char buf[11]; WCHAR *ptr; - const WCHAR *hash; int len;
info->dwProtocol = get_protocol_version( session ); @@ -1032,9 +1028,7 @@ static NTSTATUS schan_get_cipher_info( void *args ) wcscat( info->szCipherSuite, underscoreW ); wcscat( info->szCipherSuite, get_chaining_mode_str( session ) ); wcscat( info->szCipherSuite, underscoreW ); - hash = get_hash_str( session, FALSE ); - if (hash[0]) wcscat( info->szCipherSuite, hash ); - else wcscat( info->szCipherSuite, sha384W ); /* FIXME */ + wcscat( info->szCipherSuite, get_hash_str( session, FALSE ) ); return SEC_E_OK; }
diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c index d17d6345af3..412d3703453 100644 --- a/dlls/secur32/tests/schannel.c +++ b/dlls/secur32/tests/schannel.c @@ -1014,7 +1014,7 @@ static void test_communication(void)
/* Create client credentials */ init_cred(&cred); - cred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT; + cred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT; cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS|SCH_CRED_MANUAL_CRED_VALIDATION;
status = AcquireCredentialsHandleA(NULL, (SEC_CHAR *)UNISP_NAME_A, SECPKG_CRED_OUTBOUND, NULL, @@ -1265,7 +1265,7 @@ static void test_communication(void) ok(status == SEC_E_OK, "QueryContextAttributesW(SECPKG_ATTR_CONNECTION_INFO) failed: %08lx\n", status); if(status == SEC_E_OK) { ok(conn_info.dwCipherStrength >= 128, "conn_info.dwCipherStrength = %ld\n", conn_info.dwCipherStrength); - ok(!conn_info.dwHashStrength, "conn_info.dwHashStrength = %ld\n", conn_info.dwHashStrength); + ok(conn_info.dwHashStrength >= 128, "conn_info.dwHashStrength = %ld\n", conn_info.dwHashStrength); }
memset(&cipher, 0, sizeof(cipher)); @@ -1274,16 +1274,17 @@ static void test_communication(void) ok(status == SEC_E_OK, "got %08lx\n", status); if (status == SEC_E_OK) { - ok(cipher.dwProtocol == 0x303, "got %lx\n", cipher.dwProtocol); - todo_wine ok(cipher.dwCipherSuite == 0xc030, "got %lx\n", cipher.dwCipherSuite); - todo_wine ok(cipher.dwBaseCipherSuite == 0xc030, "got %lx\n", cipher.dwBaseCipherSuite); - ok(!wcscmp(cipher.szCipherSuite, L"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"), + ok(cipher.dwProtocol == 0x301, "got %lx\n", cipher.dwProtocol); + todo_wine ok(cipher.dwCipherSuite == 0xc014, "got %lx\n", cipher.dwCipherSuite); + todo_wine ok(cipher.dwBaseCipherSuite == 0xc014, "got %lx\n", cipher.dwBaseCipherSuite); + ok(!wcscmp(cipher.szCipherSuite, L"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA") || + !wcscmp(cipher.szCipherSuite, L"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256"), /* < win10 */ "got %s\n", wine_dbgstr_w(cipher.szCipherSuite)); ok(!wcscmp(cipher.szCipher, L"AES"), "got %s\n", wine_dbgstr_w(cipher.szCipher)); ok(cipher.dwCipherLen == 256, "got %lu\n", cipher.dwCipherLen); ok(cipher.dwCipherBlockLen == 16, "got %lu\n", cipher.dwCipherBlockLen); - ok(!cipher.szHash[0], "got %s\n", wine_dbgstr_w(cipher.szHash)); - ok(!cipher.dwHashLen, "got %lu\n", cipher.dwHashLen); + ok(!wcscmp(cipher.szHash, L"SHA1"), "got %s\n", wine_dbgstr_w(cipher.szHash)); + ok(cipher.dwHashLen == 160, "got %lu\n", cipher.dwHashLen); ok(!wcscmp(cipher.szExchange, L"ECDH") || !wcscmp(cipher.szExchange, L"ECDH_P256"), /* < win10 */ "got %s\n", wine_dbgstr_w(cipher.szExchange)); ok(cipher.dwMinExchangeLen == 0 || cipher.dwMinExchangeLen == 256, /* < win10 */ @@ -1380,11 +1381,11 @@ static void test_communication(void) status = DecryptMessage(&context, &buffers[0], 0, NULL); ok(status == SEC_I_RENEGOTIATE, "Expected SEC_I_RENEGOTIATE, got %08lx\n", status); ok(buffers[0].pBuffers[0].BufferType == SECBUFFER_STREAM_HEADER, "got %lu\n", buffers[0].pBuffers[0].BufferType); - todo_wine ok(buffers[0].pBuffers[0].cbBuffer == 13, "got %lu\n", buffers[0].pBuffers[0].cbBuffer); + ok(buffers[0].pBuffers[0].cbBuffer == 5, "got %lu\n", buffers[0].pBuffers[0].cbBuffer); ok(buffers[0].pBuffers[1].BufferType == SECBUFFER_DATA, "got %lu\n", buffers[0].pBuffers[1].BufferType); ok(buffers[0].pBuffers[1].cbBuffer == 0, "got %lu\n", buffers[0].pBuffers[1].cbBuffer); ok(buffers[0].pBuffers[2].BufferType == SECBUFFER_STREAM_TRAILER, "got %lu\n", buffers[0].pBuffers[2].BufferType); - todo_wine ok(buffers[0].pBuffers[2].cbBuffer == 20, "got %lu\n", buffers[0].pBuffers[2].cbBuffer); + todo_wine ok(buffers[0].pBuffers[2].cbBuffer == 32, "got %lu\n", buffers[0].pBuffers[2].cbBuffer);
pfx.pbData = (BYTE *)pfxdata; pfx.cbData = sizeof(pfxdata); @@ -1453,7 +1454,7 @@ static void test_communication(void) ISC_REQ_USE_SUPPLIED_CREDS, 0, 0, &buffers[1], 0, &context2, &buffers[0], &attrs, NULL); buffers[1].pBuffers[0].cbBuffer = buf_size; } - ok (status == SEC_E_ALGORITHM_MISMATCH, "got %08lx\n", status); + ok (status == SEC_E_CERT_EXPIRED, "got %08lx\n", status);
done: DeleteSecurityContext(&context); @@ -1493,7 +1494,7 @@ static void test_application_protocol_negotiation(void) if ((sock = create_ssl_socket( "test.winehq.org" )) == -1) return;
init_cred(&cred); - cred.grbitEnabledProtocols = SP_PROT_TLS1_2_CLIENT; + cred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT; cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS|SCH_CRED_MANUAL_CRED_VALIDATION;
status = AcquireCredentialsHandleA(NULL, (SEC_CHAR *)UNISP_NAME_A, SECPKG_CRED_OUTBOUND, NULL, diff --git a/dlls/setupapi/query.c b/dlls/setupapi/query.c index 707492ac984..88efea17473 100644 --- a/dlls/setupapi/query.c +++ b/dlls/setupapi/query.c @@ -369,6 +369,36 @@ BOOL WINAPI SetupGetSourceFileLocationA( HINF hinf, PINFCONTEXT context, PCSTR f return ret; }
+static LPWSTR get_source_id( HINF hinf, PINFCONTEXT context, PCWSTR filename ) +{ + DWORD size; + LPWSTR source_id; + + if (!SetupFindFirstLineW( hinf, source_disks_files_platform, filename, context ) && + !SetupFindFirstLineW( hinf, source_disks_files, filename, context )) + return NULL; + + if (!SetupGetStringFieldW( context, 1, NULL, 0, &size )) + return NULL; + + if (!(source_id = malloc( size * sizeof(WCHAR) ))) + return NULL; + + if (!SetupGetStringFieldW( context, 1, source_id, size, NULL )) + { + free( source_id ); + return NULL; + } + + if (!SetupFindFirstLineW( hinf, source_disks_names_platform, source_id, context ) && + !SetupFindFirstLineW( hinf, source_disks_names, source_id, context )) + { + free( source_id ); + return NULL; + } + return source_id; +} + /*********************************************************************** * SetupGetSourceFileLocationW (SETUPAPI.@) */ @@ -378,45 +408,25 @@ BOOL WINAPI SetupGetSourceFileLocationW( HINF hinf, PINFCONTEXT context, PCWSTR PDWORD required_size ) { INFCONTEXT ctx; - int id; + WCHAR *end, *source_id_str;
TRACE("%p, %p, %s, %p, %p, 0x%08lx, %p\n", hinf, context, debugstr_w(filename), source_id, buffer, buffer_size, required_size);
- if (context) - { - WCHAR *ctx_filename; - DWORD filename_size; - - if (!SetupGetStringFieldW( context, 1, NULL, 0, &filename_size )) - return FALSE; - if (!(ctx_filename = malloc( filename_size * sizeof(WCHAR) ))) - return FALSE; - SetupGetStringFieldW( context, 1, ctx_filename, filename_size, NULL ); + if (!context) context = &ctx;
- if (!SetupFindFirstLineW( hinf, source_disks_files_platform, ctx_filename, &ctx ) && - !SetupFindFirstLineW( hinf, source_disks_files, ctx_filename, &ctx )) - { - free( ctx_filename ); - return FALSE; - } + if (!(source_id_str = get_source_id( hinf, context, filename ))) + return FALSE;
- free( ctx_filename ); - } - else + *source_id = wcstol( source_id_str, &end, 10 ); + if (end == source_id_str || *end) { - if (!SetupFindFirstLineW( hinf, source_disks_files_platform, filename, &ctx ) && - !SetupFindFirstLineW( hinf, source_disks_files, filename, &ctx )) - { - return FALSE; - } - } - - if (!SetupGetIntField( &ctx, 1, &id )) + free( source_id_str ); return FALSE; - *source_id = id; + } + free( source_id_str );
- if (SetupGetStringFieldW( &ctx, 2, buffer, buffer_size, required_size )) + if (SetupGetStringFieldW( context, 4, buffer, buffer_size, required_size )) return TRUE;
if (required_size) *required_size = 1; diff --git a/dlls/setupapi/queue.c b/dlls/setupapi/queue.c index 1c43808bc5f..40e106fffcd 100644 --- a/dlls/setupapi/queue.c +++ b/dlls/setupapi/queue.c @@ -293,30 +293,43 @@ UINT CALLBACK QUEUE_callback_WtoA( void *context, UINT notification, static void get_source_info( HINF hinf, const WCHAR *src_file, SP_FILE_COPY_PARAMS_W *params, WCHAR *src_root, WCHAR *src_path) { - UINT diskid; + INFCONTEXT file_ctx, disk_ctx; + INT id, diskid; DWORD len;
- if (!SetupGetSourceFileLocationW( hinf, NULL, src_file, &diskid, src_path, MAX_PATH, &len )) - return; + /* find the SourceDisksFiles entry */ + if (!SetupFindFirstLineW( hinf, L"SourceDisksFiles", src_file, &file_ctx )) return; + if (!SetupGetIntField( &file_ctx, 1, &diskid )) return;
- if (len > 1) - params->SourcePath = src_path; + /* now find the diskid in the SourceDisksNames section */ + if (!SetupFindFirstLineW( hinf, L"SourceDisksNames", NULL, &disk_ctx )) return; + for (;;) + { + if (SetupGetIntField( &disk_ctx, 0, &id ) && (id == diskid)) break; + if (!SetupFindNextLine( &disk_ctx, &disk_ctx )) return; + }
- if (SetupGetSourceInfoW( hinf, diskid, SRCINFO_DESCRIPTION, NULL, 0, &len ) && len > 1 + if (SetupGetStringFieldW( &disk_ctx, 1, NULL, 0, &len ) && len > sizeof(WCHAR) && (params->SourceDescription = malloc( len * sizeof(WCHAR) ))) - SetupGetSourceInfoW( hinf, diskid, SRCINFO_DESCRIPTION, (WCHAR *)params->SourceDescription, len, NULL ); + SetupGetStringFieldW( &disk_ctx, 1, (WCHAR *)params->SourceDescription, len, NULL );
- if (SetupGetSourceInfoW( hinf, diskid, SRCINFO_TAGFILE, NULL, 0, &len ) && len > 1 + if (SetupGetStringFieldW( &disk_ctx, 2, NULL, 0, &len ) && len > sizeof(WCHAR) && (params->SourceTagfile = malloc( len * sizeof(WCHAR) ))) - SetupGetSourceInfoW( hinf, diskid, SRCINFO_TAGFILE, (WCHAR *)params->SourceTagfile, len, NULL ); + SetupGetStringFieldW( &disk_ctx, 2, (WCHAR *)params->SourceTagfile, len, NULL );
- if (SetupGetSourceInfoW( hinf, diskid, SRCINFO_PATH, NULL, 0, &len ) && len > 1 + if (SetupGetStringFieldW( &disk_ctx, 4, NULL, 0, &len ) && len > sizeof(WCHAR) && len < MAX_PATH - lstrlenW( src_root ) - 1) { lstrcatW( src_root, L"\" ); - SetupGetSourceInfoW( hinf, diskid, SRCINFO_PATH, src_root + lstrlenW( src_root ), + SetupGetStringFieldW( &disk_ctx, 4, src_root + lstrlenW( src_root ), MAX_PATH - lstrlenW( src_root ), NULL ); } + + if (SetupGetStringFieldW( &file_ctx, 2, NULL, 0, &len ) && len > sizeof(WCHAR) && len < MAX_PATH) + { + SetupGetStringFieldW( &file_ctx, 2, src_path, MAX_PATH, NULL ); + params->SourcePath = src_path; + } }
/*********************************************************************** diff --git a/dlls/setupapi/tests/Makefile.in b/dlls/setupapi/tests/Makefile.in index 0c9ab9af3a9..85be56de556 100644 --- a/dlls/setupapi/tests/Makefile.in +++ b/dlls/setupapi/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = setupapi.dll -IMPORTS = advapi32 cabinet crypt32 ole32 setupapi shell32 uuid user32 wintrust +IMPORTS = advapi32 cabinet ole32 setupapi shell32 uuid user32
selfreg_IMPORTS = uuid advapi32 ole32
diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c index 194fa50f6d0..1d8df5faea1 100644 --- a/dlls/setupapi/tests/devinst.c +++ b/dlls/setupapi/tests/devinst.c @@ -20,17 +20,12 @@
#include <stdarg.h> #include <stdio.h> -#include <time.h>
#include "windef.h" #include "winbase.h" #include "wingdi.h" -#include "winnls.h" #include "winuser.h" #include "winreg.h" -#include "ntsecapi.h" -#include "wincrypt.h" -#include "mscat.h" #include "devguid.h" #include "initguid.h" #include "devpkey.h" @@ -39,7 +34,6 @@ #include "cguid.h"
#include "wine/test.h" -#include "wine/mssign.h"
/* This is a unique guid for testing purposes */ static GUID guid = {0x6a55b5a4, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}}; @@ -47,9 +41,8 @@ static GUID guid2 = {0x6a55b5a5, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c, static GUID iface_guid = {0xdeadbeef, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}}; static GUID iface_guid2 = {0xdeadf00d, 0x3f65, 0x11db, {0xb7,0x04,0x00,0x11,0x95,0x5c,0x2b,0xdb}};
-static BOOL (WINAPI *pSetupDiSetDevicePropertyW)(HDEVINFO, SP_DEVINFO_DATA *, const DEVPROPKEY *, DEVPROPTYPE, const BYTE *, DWORD, DWORD); -static BOOL (WINAPI *pSetupDiGetDevicePropertyW)(HDEVINFO, SP_DEVINFO_DATA *, const DEVPROPKEY *, DEVPROPTYPE *, BYTE *, DWORD, DWORD *, DWORD); -static BOOL (WINAPI *pSetupQueryInfOriginalFileInformationA)(SP_INF_INFORMATION *, UINT, SP_ALTPLATFORM_INFO *, SP_ORIGINAL_FILE_INFO_A *); +BOOL (WINAPI *pSetupDiSetDevicePropertyW)(HDEVINFO, PSP_DEVINFO_DATA, const DEVPROPKEY *, DEVPROPTYPE, const BYTE *, DWORD, DWORD); +BOOL (WINAPI *pSetupDiGetDevicePropertyW)(HDEVINFO, PSP_DEVINFO_DATA, const DEVPROPKEY *, DEVPROPTYPE *, BYTE *, DWORD, DWORD *, DWORD);
static BOOL wow64;
@@ -84,241 +77,6 @@ static void load_resource(const char *name, const char *filename) CloseHandle( file ); }
-struct testsign_context -{ - HCRYPTPROV provider; - const CERT_CONTEXT *cert, *root_cert, *publisher_cert; - HCERTSTORE root_store, publisher_store; -}; - -static BOOL testsign_create_cert(struct testsign_context *ctx) -{ - BYTE encoded_name[100], encoded_key_id[200], public_key_info_buffer[1000]; - WCHAR container_name[26]; - BYTE hash_buffer[16], cert_buffer[1000], provider_nameA[100], serial[16]; - CERT_PUBLIC_KEY_INFO *public_key_info = (CERT_PUBLIC_KEY_INFO *)public_key_info_buffer; - CRYPT_KEY_PROV_INFO provider_info = {0}; - CRYPT_ALGORITHM_IDENTIFIER algid = {0}; - CERT_AUTHORITY_KEY_ID_INFO key_info; - CERT_INFO cert_info = {0}; - WCHAR provider_nameW[100]; - CERT_EXTENSION extension; - HCRYPTKEY key; - DWORD size; - BOOL ret; - - memset(ctx, 0, sizeof(*ctx)); - - srand(time(NULL)); - swprintf(container_name, ARRAY_SIZE(container_name), L"wine_testsign%u", rand()); - - ret = CryptAcquireContextW(&ctx->provider, container_name, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET); - ok(ret, "Failed to create container, error %#lx\n", GetLastError()); - - ret = CryptGenKey(ctx->provider, AT_SIGNATURE, CRYPT_EXPORTABLE, &key); - ok(ret, "Failed to create key, error %#lx\n", GetLastError()); - ret = CryptDestroyKey(key); - ok(ret, "Failed to destroy key, error %#lx\n", GetLastError()); - ret = CryptGetUserKey(ctx->provider, AT_SIGNATURE, &key); - ok(ret, "Failed to get user key, error %#lx\n", GetLastError()); - ret = CryptDestroyKey(key); - ok(ret, "Failed to destroy key, error %#lx\n", GetLastError()); - - size = sizeof(encoded_name); - ret = CertStrToNameA(X509_ASN_ENCODING, "CN=winetest_cert", CERT_X500_NAME_STR, NULL, encoded_name, &size, NULL); - ok(ret, "Failed to convert name, error %#lx\n", GetLastError()); - key_info.CertIssuer.cbData = size; - key_info.CertIssuer.pbData = encoded_name; - - size = sizeof(public_key_info_buffer); - ret = CryptExportPublicKeyInfo(ctx->provider, AT_SIGNATURE, X509_ASN_ENCODING, public_key_info, &size); - ok(ret, "Failed to export public key, error %#lx\n", GetLastError()); - cert_info.SubjectPublicKeyInfo = *public_key_info; - - size = sizeof(hash_buffer); - ret = CryptHashPublicKeyInfo(ctx->provider, CALG_MD5, 0, X509_ASN_ENCODING, public_key_info, hash_buffer, &size); - ok(ret, "Failed to hash public key, error %#lx\n", GetLastError()); - - key_info.KeyId.cbData = size; - key_info.KeyId.pbData = hash_buffer; - - RtlGenRandom(serial, sizeof(serial)); - key_info.CertSerialNumber.cbData = sizeof(serial); - key_info.CertSerialNumber.pbData = serial; - - size = sizeof(encoded_key_id); - ret = CryptEncodeObject(X509_ASN_ENCODING, X509_AUTHORITY_KEY_ID, &key_info, encoded_key_id, &size); - ok(ret, "Failed to convert name, error %#lx\n", GetLastError()); - - extension.pszObjId = (char *)szOID_AUTHORITY_KEY_IDENTIFIER; - extension.fCritical = TRUE; - extension.Value.cbData = size; - extension.Value.pbData = encoded_key_id; - - cert_info.dwVersion = CERT_V3; - cert_info.SerialNumber = key_info.CertSerialNumber; - cert_info.SignatureAlgorithm.pszObjId = (char *)szOID_RSA_SHA1RSA; - cert_info.Issuer = key_info.CertIssuer; - GetSystemTimeAsFileTime(&cert_info.NotBefore); - GetSystemTimeAsFileTime(&cert_info.NotAfter); - cert_info.NotAfter.dwHighDateTime += 1; - cert_info.Subject = key_info.CertIssuer; - cert_info.cExtension = 1; - cert_info.rgExtension = &extension; - algid.pszObjId = (char *)szOID_RSA_SHA1RSA; - size = sizeof(cert_buffer); - ret = CryptSignAndEncodeCertificate(ctx->provider, AT_SIGNATURE, X509_ASN_ENCODING, - X509_CERT_TO_BE_SIGNED, &cert_info, &algid, NULL, cert_buffer, &size); - ok(ret, "Failed to create certificate, error %#lx\n", GetLastError()); - - ctx->cert = CertCreateCertificateContext(X509_ASN_ENCODING, cert_buffer, size); - ok(!!ctx->cert, "Failed to create context, error %#lx\n", GetLastError()); - - size = sizeof(provider_nameA); - ret = CryptGetProvParam(ctx->provider, PP_NAME, provider_nameA, &size, 0); - ok(ret, "Failed to get prov param, error %#lx\n", GetLastError()); - MultiByteToWideChar(CP_ACP, 0, (char *)provider_nameA, -1, provider_nameW, ARRAY_SIZE(provider_nameW)); - - provider_info.pwszContainerName = (WCHAR *)container_name; - provider_info.pwszProvName = provider_nameW; - provider_info.dwProvType = PROV_RSA_FULL; - provider_info.dwKeySpec = AT_SIGNATURE; - ret = CertSetCertificateContextProperty(ctx->cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &provider_info); - ok(ret, "Failed to set provider info, error %#lx\n", GetLastError()); - - ctx->root_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, "root"); - if (!ctx->root_store && GetLastError() == ERROR_ACCESS_DENIED) - { - skip("Failed to open root store.\n"); - - ret = CertFreeCertificateContext(ctx->cert); - ok(ret, "Failed to free certificate, error %lu\n", GetLastError()); - ret = CryptReleaseContext(ctx->provider, 0); - ok(ret, "failed to release context, error %lu\n", GetLastError()); - - return FALSE; - } - ok(!!ctx->root_store, "Failed to open store, error %lu\n", GetLastError()); - ret = CertAddCertificateContextToStore(ctx->root_store, ctx->cert, CERT_STORE_ADD_ALWAYS, &ctx->root_cert); - if (!ret && GetLastError() == ERROR_ACCESS_DENIED) - { - skip("Failed to add self-signed certificate to store.\n"); - - ret = CertFreeCertificateContext(ctx->cert); - ok(ret, "Failed to free certificate, error %lu\n", GetLastError()); - ret = CertCloseStore(ctx->root_store, CERT_CLOSE_STORE_CHECK_FLAG); - ok(ret, "Failed to close store, error %lu\n", GetLastError()); - ret = CryptReleaseContext(ctx->provider, 0); - ok(ret, "failed to release context, error %lu\n", GetLastError()); - - return FALSE; - } - ok(ret, "Failed to add certificate, error %lu\n", GetLastError()); - - ctx->publisher_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0, - CERT_SYSTEM_STORE_LOCAL_MACHINE, "trustedpublisher"); - ok(!!ctx->publisher_store, "Failed to open store, error %lu\n", GetLastError()); - ret = CertAddCertificateContextToStore(ctx->publisher_store, ctx->cert, - CERT_STORE_ADD_ALWAYS, &ctx->publisher_cert); - ok(ret, "Failed to add certificate, error %lu\n", GetLastError()); - - return TRUE; -} - -static void testsign_cleanup(struct testsign_context *ctx) -{ - BOOL ret; - - ret = CertFreeCertificateContext(ctx->cert); - ok(ret, "Failed to free certificate, error %lu\n", GetLastError()); - - ret = CertFreeCertificateContext(ctx->root_cert); - ok(ret, "Failed to free certificate context, error %lu\n", GetLastError()); - ret = CertCloseStore(ctx->root_store, CERT_CLOSE_STORE_CHECK_FLAG); - ok(ret, "Failed to close store, error %lu\n", GetLastError()); - - ret = CertFreeCertificateContext(ctx->publisher_cert); - ok(ret, "Failed to free certificate context, error %lu\n", GetLastError()); - ret = CertCloseStore(ctx->publisher_store, CERT_CLOSE_STORE_CHECK_FLAG); - ok(ret, "Failed to close store, error %lu\n", GetLastError()); - - ret = CryptReleaseContext(ctx->provider, 0); - ok(ret, "failed to release context, error %lu\n", GetLastError()); -} - -static void testsign_sign(struct testsign_context *ctx, const WCHAR *filename) -{ - static HRESULT (WINAPI *pSignerSign)(SIGNER_SUBJECT_INFO *subject, SIGNER_CERT *cert, - SIGNER_SIGNATURE_INFO *signature, SIGNER_PROVIDER_INFO *provider, - const WCHAR *timestamp, CRYPT_ATTRIBUTES *attr, void *sip_data); - - SIGNER_ATTR_AUTHCODE authcode = {sizeof(authcode)}; - SIGNER_SIGNATURE_INFO signature = {sizeof(signature)}; - SIGNER_SUBJECT_INFO subject = {sizeof(subject)}; - SIGNER_CERT_STORE_INFO store = {sizeof(store)}; - SIGNER_CERT cert_info = {sizeof(cert_info)}; - SIGNER_FILE_INFO file = {sizeof(file)}; - DWORD index = 0; - HRESULT hr; - - if (!pSignerSign) - pSignerSign = (void *)GetProcAddress(LoadLibraryA("mssign32"), "SignerSign"); - - subject.dwSubjectChoice = 1; - subject.pdwIndex = &index; - subject.pSignerFileInfo = &file; - file.pwszFileName = (WCHAR *)filename; - cert_info.dwCertChoice = 2; - cert_info.pCertStoreInfo = &store; - store.pSigningCert = ctx->cert; - store.dwCertPolicy = 0; - signature.algidHash = CALG_SHA_256; - signature.dwAttrChoice = SIGNER_AUTHCODE_ATTR; - signature.pAttrAuthcode = &authcode; - authcode.pwszName = L""; - authcode.pwszInfo = L""; - hr = pSignerSign(&subject, &cert_info, &signature, NULL, NULL, NULL, NULL); - todo_wine ok(hr == S_OK || broken(hr == NTE_BAD_ALGID) /* < 7 */, "Failed to sign, hr %#lx\n", hr); -} - -static void add_file_to_catalog(HANDLE catalog, const WCHAR *file) -{ - SIP_SUBJECTINFO subject_info = {sizeof(SIP_SUBJECTINFO)}; - SIP_INDIRECT_DATA *indirect_data; - CRYPTCATMEMBER *member; - WCHAR hash_buffer[100]; - GUID subject_guid; - unsigned int i; - DWORD size; - BOOL ret; - - ret = CryptSIPRetrieveSubjectGuidForCatalogFile(file, NULL, &subject_guid); - todo_wine ok(ret, "Failed to get subject guid, error %lu\n", GetLastError()); - - size = 0; - subject_info.pgSubjectType = &subject_guid; - subject_info.pwsFileName = file; - subject_info.DigestAlgorithm.pszObjId = (char *)szOID_OIWSEC_sha1; - ret = CryptSIPCreateIndirectData(&subject_info, &size, NULL); - todo_wine ok(ret, "Failed to get indirect data size, error %lu\n", GetLastError()); - - indirect_data = malloc(size); - ret = CryptSIPCreateIndirectData(&subject_info, &size, indirect_data); - todo_wine ok(ret, "Failed to get indirect data, error %lu\n", GetLastError()); - if (ret) - { - memset(hash_buffer, 0, sizeof(hash_buffer)); - for (i = 0; i < indirect_data->Digest.cbData; ++i) - swprintf(&hash_buffer[i * 2], 2, L"%02X", indirect_data->Digest.pbData[i]); - - member = CryptCATPutMemberInfo(catalog, (WCHAR *)file, - hash_buffer, &subject_guid, 0, size, (BYTE *)indirect_data); - ok(!!member, "Failed to write member, error %lu\n", GetLastError()); - } - - free(indirect_data); -} - static void test_create_device_list_ex(void) { static const WCHAR machine[] = { 'd','u','m','m','y',0 }; @@ -2348,7 +2106,7 @@ static void test_device_interface_key(void) ok(ret == ERROR_FILE_NOT_FOUND, "key shouldn't exist\n");
dikey = SetupDiCreateDeviceInterfaceRegKeyA(set, &iface, 0, KEY_ALL_ACCESS, NULL, NULL); - ok(dikey != INVALID_HANDLE_VALUE, "Got error %#lx\n", GetLastError()); + ok(dikey != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError());
ret = RegOpenKeyA(parent, "#\Device Parameters", &key); ok(!ret, "key should exist: %lu\n", ret); @@ -2364,7 +2122,7 @@ static void test_device_interface_key(void) RegCloseKey(key);
ret = SetupDiDeleteDeviceInterfaceRegKey(set, &iface, 0); - ok(ret, "Got error %#lx\n", GetLastError()); + ok(ret, "got error %lu\n", GetLastError());
ret = RegOpenKeyA(parent, "#\Device Parameters", &key); ok(ret == ERROR_FILE_NOT_FOUND, "key shouldn't exist\n"); @@ -3649,349 +3407,11 @@ todo_wine { SetupDiDestroyDeviceInfoList(set); }
-static BOOL file_exists(const char *path) -{ - return GetFileAttributesA(path) != INVALID_FILE_ATTRIBUTES; -} - -static BOOL is_in_inf_dir(const char *path) -{ - char expect[MAX_PATH]; - - GetWindowsDirectoryA(expect, sizeof(expect)); - strcat(expect, "\inf\"); - return !strncasecmp(path, expect, strrchr(path, '\') - path); -} - -static void check_original_file_name(const char *dest_inf, const char *src_inf, const char *src_catalog) -{ - SP_ORIGINAL_FILE_INFO_A orig_info; - SP_INF_INFORMATION *inf_info; - DWORD size; - HINF hinf; - BOOL res; - - if (!pSetupQueryInfOriginalFileInformationA) - { - win_skip("SetupQueryInfOriginalFileInformationA is not available\n"); - return; - } - - hinf = SetupOpenInfFileA(dest_inf, NULL, INF_STYLE_WIN4, NULL); - ok(hinf != NULL, "Failed to open INF file, error %lu.\n", GetLastError()); - - res = SetupGetInfInformationA(hinf, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size); - ok(res, "Failed to get INF information, error %lu.\n", GetLastError()); - - inf_info = malloc(size); - - res = SetupGetInfInformationA(hinf, INFINFO_INF_SPEC_IS_HINF, inf_info, size, NULL); - ok(res, "Failed to get INF information, error %lu.\n", GetLastError()); - - orig_info.cbSize = 0; - SetLastError(0xdeadbeef); - res = pSetupQueryInfOriginalFileInformationA(inf_info, 0, NULL, &orig_info); - ok(!res, "Got %d.\n", res); - ok(GetLastError() == ERROR_INVALID_USER_BUFFER, "Got error %#lx.\n", GetLastError()); - - orig_info.cbSize = sizeof(orig_info); - SetLastError(0xdeadbeef); - res = pSetupQueryInfOriginalFileInformationA(inf_info, 0, NULL, &orig_info); - ok(res == TRUE, "Got %d.\n", res); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(!strcmp(orig_info.OriginalCatalogName, src_catalog), "Expected original catalog name %s, got %s.\n", - debugstr_a(src_catalog), debugstr_a(orig_info.OriginalCatalogName)); - ok(!strcmp(orig_info.OriginalInfName, src_inf), "Expected orignal inf name %s, got %s.\n", - debugstr_a(src_inf), debugstr_a(orig_info.OriginalInfName)); - - free(inf_info); - - SetupCloseInfFile(hinf); -} - -static void test_copy_oem_inf(struct testsign_context *ctx) -{ - char path[MAX_PATH * 2], dest[MAX_PATH], orig_dest[MAX_PATH]; - char orig_cwd[MAX_PATH], *cwd, *filepart, pnf[MAX_PATH]; - SYSTEM_INFO system_info; - HANDLE catalog; - DWORD size; - BOOL ret; - - static const char inf_data1[] = - "[Version]\n" - "Signature="$Chicago$"\n" - "CatalogFile=winetest.cat\n" - /* Windows 10 needs a non-empty Manufacturer section, otherwise - * SetupUninstallOEMInf() fails with ERROR_INVALID_PARAMETER. */ - "[Manufacturer]\n" - "mfg1=mfg_section,NT" MYEXT "\n" - "; This is a WINE test INF file\n"; - - static const char inf_data2[] = - "[Version]\n" - "Signature="$Chicago$"\n" - "CatalogFile=winetest2.cat\n" - "[Manufacturer]\n" - "mfg1=mfg_section,NT" MYEXT "\n" - "; This is another WINE test INF file\n"; - - if (wow64) - return; - - GetSystemInfo(&system_info); - - GetCurrentDirectoryA(sizeof(orig_cwd), orig_cwd); - cwd = tempnam(NULL, "wine"); - ret = CreateDirectoryA(cwd, NULL); - ok(ret, "Failed to create %s, error %#lx.\n", debugstr_a(cwd), GetLastError()); - ret = SetCurrentDirectoryA(cwd); - ok(ret, "Failed to cd to %s, error %#lx.\n", debugstr_a(cwd), GetLastError()); - - /* try NULL SourceInfFileName */ - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(NULL, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_INVALID_PARAMETER, "Got error %#lx.\n", GetLastError()); - - /* try empty SourceInfFileName */ - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA("", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_FILE_NOT_FOUND - || GetLastError() == ERROR_INVALID_PARAMETER /* vista, 2k8 */, "Got error %#lx.\n", GetLastError()); - - /* try a relative nonexistent SourceInfFileName */ - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA("nonexistent", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got error %#lx.\n", GetLastError()); - - /* try an absolute nonexistent SourceInfFileName */ - GetCurrentDirectoryA(sizeof(path), path); - strcat(path, "\nonexistent"); - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got error %#lx.\n", GetLastError()); - - create_file("winetest.inf", inf_data1); - - catalog = CryptCATOpen((WCHAR *)L"winetest.cat", CRYPTCAT_OPEN_CREATENEW, 0, CRYPTCAT_VERSION_1, 0); - ok(catalog != INVALID_HANDLE_VALUE, "Failed to create catalog, error %#lx\n", GetLastError()); - - add_file_to_catalog(catalog, L"winetest.inf"); - - ret = CryptCATPersistStore(catalog); - todo_wine ok(ret, "Failed to write catalog, error %#lx\n", GetLastError()); - - ret = CryptCATClose(catalog); - ok(ret, "Failed to close catalog, error %#lx\n", GetLastError()); - - testsign_sign(ctx, L"winetest.cat"); - - /* Test with a relative path. */ - SetLastError(0xdeadbeef); - memset(dest, 0xcc, sizeof(dest)); - ret = SetupCopyOEMInfA("winetest.inf", NULL, 0, SP_COPY_NOOVERWRITE, dest, sizeof(dest), NULL, &filepart); - todo_wine ok(ret == TRUE, "Got %d.\n", ret); - todo_wine ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(file_exists("winetest.inf"), "Expected source inf to exist.\n"); - if (ret) - { - ok(file_exists(dest), "Expected dest file to exist.\n"); - ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); - ok(filepart == strrchr(dest, '\') + 1, "Got unexpected file part %s.\n", filepart); - - ret = SetupUninstallOEMInfA("bogus.inf", 0, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got error %#lx.\n", GetLastError()); - - strcpy(pnf, dest); - *(strrchr(pnf, '.') + 1) = 'p'; - SetLastError(0xdeadbeef); - ret = SetupUninstallOEMInfA(filepart, 0, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(!file_exists(dest), "Expected inf '%s' not to exist.\n", dest); - DeleteFileA(dest); - ok(!file_exists(pnf), "Expected pnf '%s' not to exist.\n", pnf); - } - - /* try SP_COPY_REPLACEONLY, dest does not exist */ - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Got error %#lx.\n", GetLastError()); - ok(file_exists("winetest.inf"), "Expected source inf to exist.\n"); - - /* Test a successful call. */ - GetCurrentDirectoryA(sizeof(path), path); - strcat(path, "\winetest.inf"); - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(file_exists(path), "Expected source inf to exist.\n"); - ok(file_exists(dest), "Expected dest file to exist.\n"); - ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); - strcpy(orig_dest, dest); - - check_original_file_name(dest, "winetest.inf", "winetest.cat"); - - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(file_exists(path), "Expected source inf to exist.\n"); - ok(file_exists(dest), "Expected dest file to exist.\n"); - ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); - - /* On Windows 7 and earlier, trying to install the same file with a - * different base name does nothing and returns the existing driver store - * location and INF directory file. - * On Windows 8 and later, it's installed to a new location. */ - - /* try SP_COPY_REPLACEONLY, dest exists */ - GetCurrentDirectoryA(sizeof(path), path); - strcat(path, "\winetest.inf"); - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, dest, sizeof(dest), NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(file_exists(path), "Expected source inf to exist.\n"); - ok(file_exists(dest), "Expected dest file to exist.\n"); - ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); - - strcpy(dest, "aaa"); - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_NOOVERWRITE, dest, sizeof(dest), NULL, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_FILE_EXISTS, "Got error %#lx.\n", GetLastError()); - ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); - - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, NULL, 0, NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(file_exists(path), "Expected source inf to exist.\n"); - ok(file_exists(orig_dest), "Expected dest file to exist.\n"); - - strcpy(dest, "aaa"); - size = 0; - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, 5, &size, NULL); - ok(!ret, "Got %d.\n", ret); - ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Got error %#lx.\n", GetLastError()); - ok(file_exists(path), "Expected source inf to exist.\n"); - ok(file_exists(orig_dest), "Expected dest inf to exist.\n"); - ok(!strcmp(dest, "aaa"), "Expected dest to be unchanged\n"); - ok(size == strlen(orig_dest) + 1, "Got %ld.\n", size); - - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), &size, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); - ok(size == strlen(dest) + 1, "Got %ld.\n", size); - - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, &filepart); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); - ok(filepart == strrchr(dest, '\') + 1, "Got unexpected file part %s.\n", filepart); - - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_DELETESOURCE, NULL, 0, NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(!file_exists(path), "Expected source inf not to exist.\n"); - - strcpy(pnf, dest); - *(strrchr(pnf, '.') + 1) = 'p'; - - ret = SetupUninstallOEMInfA(strrchr(dest, '\') + 1, 0, NULL); - ok(ret, "Failed to uninstall '%s', error %#lx.\n", dest, GetLastError()); - todo_wine ok(!file_exists(dest), "Expected inf '%s' not to exist.\n", dest); - DeleteFileA(dest); - todo_wine ok(!file_exists(pnf), "Expected pnf '%s' not to exist.\n", pnf); - - create_file("winetest.inf", inf_data1); - SetLastError(0xdeadbeef); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); - strcpy(orig_dest, dest); - - create_file("winetest2.inf", inf_data2); - - catalog = CryptCATOpen((WCHAR *)L"winetest2.cat", CRYPTCAT_OPEN_CREATENEW, 0, CRYPTCAT_VERSION_1, 0); - ok(catalog != INVALID_HANDLE_VALUE, "Failed to create catalog, error %#lx\n", GetLastError()); - - add_file_to_catalog(catalog, L"winetest2.inf"); - - ret = CryptCATPersistStore(catalog); - todo_wine ok(ret, "Failed to write catalog, error %#lx\n", GetLastError()); - - ret = CryptCATClose(catalog); - ok(ret, "Failed to close catalog, error %#lx\n", GetLastError()); - - testsign_sign(ctx, L"winetest2.cat"); - - SetLastError(0xdeadbeef); - GetCurrentDirectoryA(sizeof(path), path); - strcat(path, "\winetest2.inf"); - ret = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); - ok(ret == TRUE, "Got %d.\n", ret); - ok(!GetLastError(), "Got error %#lx.\n", GetLastError()); - ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); - ok(strcmp(dest, orig_dest), "Expected INF files to be copied to different paths.\n"); - - ret = SetupUninstallOEMInfA(strrchr(dest, '\') + 1, 0, NULL); - ok(ret, "Failed to uninstall '%s', error %#lx.\n", dest, GetLastError()); - todo_wine ok(!file_exists(dest), "Expected inf '%s' not to exist.\n", dest); - DeleteFileA(dest); - strcpy(pnf, dest); - *(strrchr(pnf, '.') + 1) = 'p'; - todo_wine ok(!file_exists(pnf), "Expected pnf '%s' not to exist.\n", pnf); - - ret = SetupUninstallOEMInfA(strrchr(orig_dest, '\') + 1, 0, NULL); - ok(ret, "Failed to uninstall '%s', error %#lx.\n", orig_dest, GetLastError()); - todo_wine ok(!file_exists(orig_dest), "Expected inf '%s' not to exist.\n", dest); - DeleteFileA(orig_dest); - strcpy(pnf, dest); - *(strrchr(pnf, '.') + 1) = 'p'; - todo_wine ok(!file_exists(pnf), "Expected pnf '%s' not to exist.\n", pnf); - - ret = DeleteFileA("winetest2.cat"); - ok(ret, "Failed to delete file, error %#lx.\n", GetLastError()); - - ret = DeleteFileA("winetest2.inf"); - ok(ret, "Failed to delete file, error %#lx.\n", GetLastError()); - - ret = DeleteFileA("winetest.cat"); - ok(ret, "Failed to delete file, error %#lx.\n", GetLastError()); - - ret = DeleteFileA("winetest.inf"); - ok(ret, "Failed to delete file, error %#lx.\n", GetLastError()); - - SetCurrentDirectoryA(orig_cwd); - ret = RemoveDirectoryA(cwd); - ok(ret, "Failed to delete %s, error %#lx.\n", cwd, GetLastError()); - -} - START_TEST(devinst) { static BOOL (WINAPI *pIsWow64Process)(HANDLE, BOOL *); - HMODULE module = GetModuleHandleA("setupapi.dll"); - struct testsign_context ctx; HKEY hkey;
- pSetupQueryInfOriginalFileInformationA = (void *)GetProcAddress(module, "SetupQueryInfOriginalFileInformationA"); - test_get_actual_section();
if ((hkey = SetupDiOpenClassRegKey(NULL, KEY_ALL_ACCESS)) == INVALID_HANDLE_VALUE) @@ -4026,11 +3446,4 @@ START_TEST(devinst) test_driver_list(); test_call_class_installer(); test_get_class_devs(); - - if (!testsign_create_cert(&ctx)) - return; - - test_copy_oem_inf(&ctx); - - testsign_cleanup(&ctx); } diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c index 9f5260359a5..d33925f128e 100644 --- a/dlls/setupapi/tests/install.c +++ b/dlls/setupapi/tests/install.c @@ -35,23 +35,6 @@
#include "wine/test.h"
-#ifdef __i386__ -#define MYEXT "x86" -#define WRONGEXT "ARM" -#elif defined(__x86_64__) -#define MYEXT "AMD64" -#define WRONGEXT "ARM64" -#elif defined(__arm__) -#define MYEXT "ARM" -#define WRONGEXT "x86" -#elif defined(__aarch64__) -#define MYEXT "ARM64" -#define WRONGEXT "AMD64" -#else -#define MYEXT -#define WRONGEXT -#endif - static const char inffile[] = "test.inf"; static const WCHAR inffileW[] = {'t','e','s','t','.','i','n','f',0}; static char CURR_DIR[MAX_PATH]; @@ -106,12 +89,6 @@ static void create_file(const char *filename) create_inf_file(filename, "dummy"); }
-static void create_directory(const char *name) -{ - BOOL ret = CreateDirectoryA(name, NULL); - ok(ret, "Failed to create %s, error %lu.\n", name, GetLastError()); -} - static BOOL delete_file(const char *filename) { if (GetFileAttributesA(filename) & FILE_ATTRIBUTE_DIRECTORY) @@ -2416,60 +2393,6 @@ static void test_append_reg(void) ok(ret, "Failed to delete INF file, error %lu.\n", GetLastError()); }
-static void test_source_disks_architecture(void) -{ - static const char inf_data[] = - "[Version]\n" - "Signature="$Chicago$"\n" - "[install_section]\n" - "CopyFiles=section1\n" - "[section1]\n" - "one.txt\n" - "[SourceDisksNames." MYEXT "]\n" - "1=,,,heis\n" - "2=,,,duo\n" - "[SourceDisksNames." WRONGEXT "]\n" - "1=,,,treis\n" - "2=,,,tessares\n" - "[SourceDisksFiles." MYEXT "]\n" - "one.txt=1\n" - "[SourceDisksFiles." WRONGEXT "]\n" - "one.txt=2\n" - "[DestinationDirs]\n" - "DefaultDestDir=40000,dst\n"; - - char path[MAX_PATH]; - void *context; - HINF hinf; - BOOL ret; - - create_inf_file(inffile, inf_data); - - sprintf(path, "%s\%s", CURR_DIR, inffile); - hinf = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); - ok(hinf != INVALID_HANDLE_VALUE, "Failed to open INF file, error %#lx.\n", GetLastError()); - - create_directory("src"); - create_directory("src/heis"); - create_file("src/heis/one.txt"); - create_directory("dst"); - - context = SetupInitDefaultQueueCallbackEx(NULL, INVALID_HANDLE_VALUE, 0, 0, 0); - ret = SetupInstallFromInfSectionA(NULL, hinf, "install_section", SPINST_FILES, - NULL, "src", 0, SetupDefaultQueueCallbackA, context, NULL, NULL); - ok(ret, "Failed to install, error %#lx.\n", GetLastError()); - SetupTermDefaultQueueCallback(context); - - ok(delete_file("dst/one.txt"), "Destination file should exist.\n"); - - SetupCloseInfFile(hinf); - delete_file("src/heis/one.txt"); - delete_file("src/heis"); - delete_file("src/"); - delete_file("dst/"); - ok(delete_file(inffile), "Failed to delete INF file.\n"); -} - static WCHAR service_name[] = L"Wine Test Service"; static SERVICE_STATUS_HANDLE service_handle; static HANDLE stop_event; @@ -2580,7 +2503,6 @@ START_TEST(install) test_register_dlls(); test_rename(); test_append_reg(); - test_source_disks_architecture();
UnhookWindowsHookEx(hhook);
diff --git a/dlls/setupapi/tests/misc.c b/dlls/setupapi/tests/misc.c index adace3324de..6fda69f9e39 100644 --- a/dlls/setupapi/tests/misc.c +++ b/dlls/setupapi/tests/misc.c @@ -49,6 +49,309 @@ static CHAR CURR_DIR[MAX_PATH];
static void (WINAPI *pMyFree)(void*); static BOOL (WINAPI *pSetupGetFileCompressionInfoExA)(PCSTR, PSTR, DWORD, PDWORD, PDWORD, PDWORD, PUINT); +static BOOL (WINAPI *pSetupQueryInfOriginalFileInformationA)(PSP_INF_INFORMATION, UINT, PSP_ALTPLATFORM_INFO, PSP_ORIGINAL_FILE_INFO_A); + +static void create_file(const char *name, const char *data) +{ + HANDLE file; + DWORD size; + BOOL ret; + + file = CreateFileA(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); + ok(file != INVALID_HANDLE_VALUE, "Failed to create %s, error %lu.\n", name, GetLastError()); + ret = WriteFile(file, data, strlen(data), &size, NULL); + ok(ret && size == strlen(data), "Failed to write %s, error %lu.\n", name, GetLastError()); + CloseHandle(file); +} + +static void get_temp_filename(LPSTR path) +{ + CHAR temp[MAX_PATH]; + LPSTR ptr; + + GetTempFileNameA(CURR_DIR, "set", 0, temp); + ptr = strrchr(temp, '\'); + + strcpy(path, ptr + 1); +} + +static BOOL file_exists(LPSTR path) +{ + return GetFileAttributesA(path) != INVALID_FILE_ATTRIBUTES; +} + +static BOOL is_in_inf_dir(const char *path) +{ + char expect[MAX_PATH]; + + GetWindowsDirectoryA(expect, sizeof(expect)); + strcat(expect, "\inf\"); + return !strncasecmp(path, expect, strrchr(path, '\') - path); +} + +static void test_original_file_name(LPCSTR original, LPCSTR dest) +{ + HINF hinf; + PSP_INF_INFORMATION pspii; + SP_ORIGINAL_FILE_INFO_A spofi; + BOOL res; + DWORD size; + + if (!pSetupQueryInfOriginalFileInformationA) + { + win_skip("SetupQueryInfOriginalFileInformationA is not available\n"); + return; + } + + hinf = SetupOpenInfFileA(dest, NULL, INF_STYLE_WIN4, NULL); + ok(hinf != NULL, "SetupOpenInfFileA failed with error %ld\n", GetLastError()); + + res = SetupGetInfInformationA(hinf, INFINFO_INF_SPEC_IS_HINF, NULL, 0, &size); + ok(res, "SetupGetInfInformation failed with error %ld\n", GetLastError()); + + pspii = malloc(size); + + res = SetupGetInfInformationA(hinf, INFINFO_INF_SPEC_IS_HINF, pspii, size, NULL); + ok(res, "SetupGetInfInformation failed with error %ld\n", GetLastError()); + + spofi.cbSize = 0; + res = pSetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi); + ok(!res && GetLastError() == ERROR_INVALID_USER_BUFFER, + "SetupQueryInfOriginalFileInformationA should have failed with ERROR_INVALID_USER_BUFFER instead of %ld\n", GetLastError()); + + spofi.cbSize = sizeof(spofi); + res = pSetupQueryInfOriginalFileInformationA(pspii, 0, NULL, &spofi); + ok(res, "SetupQueryInfOriginalFileInformationA failed with error %ld\n", GetLastError()); + ok(!spofi.OriginalCatalogName[0], "spofi.OriginalCatalogName should have been "" instead of "%s"\n", spofi.OriginalCatalogName); + ok(!strcmp(original, spofi.OriginalInfName), "spofi.OriginalInfName of %s didn't match real original name %s\n", spofi.OriginalInfName, original); + + free(pspii); + + SetupCloseInfFile(hinf); +} + +static void test_SetupCopyOEMInf(void) +{ + char path[MAX_PATH * 2], dest[MAX_PATH], tmpfile[MAX_PATH], orig_dest[MAX_PATH]; + char *filepart, pnf[MAX_PATH]; + DWORD size; + BOOL res; + + static const char inf_data1[] = + "[Version]\n" + "Signature="$Chicago$"\n" + "; This is a WINE test INF file\n"; + + static const char inf_data2[] = + "[Version]\n" + "Signature="$Chicago$"\n" + "; This is another WINE test INF file\n"; + + /* try NULL SourceInfFileName */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(NULL, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError()); + + /* try empty SourceInfFileName */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA("", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_FILE_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER, /* Vista, W2K8 */ + "Unexpected error : %ld\n", GetLastError()); + + /* try a relative nonexistent SourceInfFileName */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA("nonexistent", NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError()); + + /* try an absolute nonexistent SourceInfFileName */ + strcpy(path, CURR_DIR); + strcat(path, "\nonexistent"); + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError()); + + get_temp_filename(tmpfile); + create_file(tmpfile, inf_data1); + + /* try a relative SourceInfFileName */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(tmpfile, NULL, 0, SP_COPY_NOOVERWRITE, NULL, 0, NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + if (GetLastError() == ERROR_WRONG_INF_TYPE || GetLastError() == ERROR_UNSUPPORTED_TYPE /* Win7 */) + { + /* FIXME: + * Vista needs a [Manufacturer] entry in the inf file. Doing this will give some + * popups during the installation though as it also needs a catalog file (signed?). + */ + win_skip("Needs a different inf file on Vista+\n"); + DeleteFileA(tmpfile); + return; + } + + ok(GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError()); + ok(file_exists(tmpfile), "Expected tmpfile to exist\n"); + + /* try SP_COPY_REPLACEONLY, dest does not exist */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, NULL, 0, NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %ld\n", GetLastError()); + ok(file_exists(tmpfile), "Expected source inf to exist\n"); + + /* Test a successful call. */ + strcpy(path, CURR_DIR); + strcat(path, "\"); + strcat(path, tmpfile); + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); + if (!res && GetLastError() == ERROR_ACCESS_DENIED) + { + skip("SetupCopyOEMInfA() failed on insufficient permissions\n"); + DeleteFileA(tmpfile); + return; + } + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(file_exists(path), "Expected source inf to exist.\n"); + ok(file_exists(dest), "Expected dest file to exist.\n"); + ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); + strcpy(orig_dest, dest); + + /* Existing INF files are checked for a match. */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(file_exists(path), "Expected source inf to exist.\n"); + ok(file_exists(dest), "Expected dest file to exist.\n"); + ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); + + /* try SP_COPY_REPLACEONLY, dest exists */ + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_REPLACEONLY, dest, sizeof(dest), NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(file_exists(path), "Expected source inf to exist.\n"); + ok(file_exists(dest), "Expected dest file to exist.\n"); + ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); + + strcpy(dest, "aaa"); + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_NOOVERWRITE, dest, sizeof(dest), NULL, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_FILE_EXISTS, + "Expected ERROR_FILE_EXISTS, got %ld\n", GetLastError()); + ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); + + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, NULL, 0, NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(file_exists(path), "Expected source inf to exist.\n"); + ok(file_exists(orig_dest), "Expected dest file to exist.\n"); + + strcpy(dest, "aaa"); + size = 0; + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, 5, &size, NULL); + ok(res == FALSE, "Expected FALSE, got %d\n", res); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "Expected ERROR_INSUFFICIENT_BUFFER, got %ld\n", GetLastError()); + ok(file_exists(path), "Expected source inf to exist\n"); + ok(file_exists(orig_dest), "Expected dest inf to exist\n"); + ok(!strcmp(dest, "aaa"), "Expected dest to be unchanged\n"); + ok(size == strlen(orig_dest) + 1, "Got %ld.\n", size); + + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), &size, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); + ok(size == strlen(dest) + 1, "Got %ld.\n", size); + + test_original_file_name(strrchr(path, '\') + 1, dest); + + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, &filepart); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(!strcmp(orig_dest, dest), "Expected '%s', got '%s'.\n", orig_dest, dest); + ok(filepart == strrchr(dest, '\') + 1, "Got unexpected file part %s.\n", filepart); + + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, SP_COPY_DELETESOURCE, NULL, 0, NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(!file_exists(path), "Expected source inf to not exist\n"); + + strcpy(pnf, dest); + *(strrchr(pnf, '.') + 1) = 'p'; + + res = SetupUninstallOEMInfA(strrchr(dest, '\') + 1, 0, NULL); + ok(res, "Failed to uninstall '%s', error %lu.\n", dest, GetLastError()); + todo_wine ok(!file_exists(dest), "Expected inf '%s' to not exist\n", dest); + DeleteFileA(dest); + ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf); + + create_file(tmpfile, inf_data1); + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); + strcpy(orig_dest, dest); + + create_file(tmpfile, inf_data2); + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(is_in_inf_dir(dest), "Got unexpected path '%s'.\n", dest); + ok(strcmp(dest, orig_dest), "Expected INF files to be copied to different paths.\n"); + + res = SetupUninstallOEMInfA(strrchr(dest, '\') + 1, 0, NULL); + ok(res, "Failed to uninstall '%s', error %lu.\n", dest, GetLastError()); + todo_wine ok(!file_exists(dest), "Expected inf '%s' to not exist\n", dest); + DeleteFileA(dest); + strcpy(pnf, dest); + *(strrchr(pnf, '.') + 1) = 'p'; + todo_wine ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf); + + res = SetupUninstallOEMInfA(strrchr(orig_dest, '\') + 1, 0, NULL); + ok(res, "Failed to uninstall '%s', error %lu.\n", orig_dest, GetLastError()); + todo_wine ok(!file_exists(orig_dest), "Expected inf '%s' to not exist\n", dest); + DeleteFileA(orig_dest); + strcpy(pnf, dest); + *(strrchr(pnf, '.') + 1) = 'p'; + todo_wine ok(!file_exists(pnf), "Expected pnf '%s' to not exist\n", pnf); + + GetWindowsDirectoryA(orig_dest, sizeof(orig_dest)); + strcat(orig_dest, "\inf\"); + strcat(orig_dest, tmpfile); + res = CopyFileA(tmpfile, orig_dest, TRUE); + ok(res, "Failed to copy file, error %lu.\n", GetLastError()); + SetLastError(0xdeadbeef); + res = SetupCopyOEMInfA(path, NULL, SPOST_NONE, 0, dest, sizeof(dest), NULL, NULL); + ok(res == TRUE, "Expected TRUE, got %d\n", res); + ok(GetLastError() == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %ld\n", GetLastError()); + ok(!strcasecmp(dest, orig_dest), "Expected '%s', got '%s'.\n", orig_dest, dest); + + /* Since it wasn't actually installed, SetupUninstallOEMInf would fail here. */ + res = DeleteFileA(dest); + ok(res, "Failed to delete '%s', error %lu.\n", tmpfile, GetLastError()); + + res = DeleteFileA(tmpfile); + ok(res, "Failed to delete '%s', error %lu.\n", tmpfile, GetLastError()); +}
static void create_source_file(LPSTR filename, const BYTE *data, DWORD size) { @@ -607,9 +910,11 @@ START_TEST(misc)
pMyFree = (void*)GetProcAddress(hsetupapi, "MyFree"); pSetupGetFileCompressionInfoExA = (void*)GetProcAddress(hsetupapi, "SetupGetFileCompressionInfoExA"); + pSetupQueryInfOriginalFileInformationA = (void*)GetProcAddress(hsetupapi, "SetupQueryInfOriginalFileInformationA");
GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
+ test_SetupCopyOEMInf(); test_SetupGetFileCompressionInfo();
if (pSetupGetFileCompressionInfoExA) diff --git a/dlls/setupapi/tests/query.c b/dlls/setupapi/tests/query.c index d5de41b368a..f7aeba41153 100644 --- a/dlls/setupapi/tests/query.c +++ b/dlls/setupapi/tests/query.c @@ -47,21 +47,10 @@ static const char inf_data1[] = "[Version]\n" "Signature="$Chicago$"\n" "AdvancedINF=2.5\n" - "[copy_section]\n" - "one.txt,,2\n" - "two.txt\n" - "four.txt,five.txt\n" - "six.txt,seven.txt\n" "[SourceDisksNames]\n" "2 = %SrcDiskName%, LANCOM\LANtools\lanconf.cab\n" - "4=,,,here\n" - "8=name\n" "[SourceDisksFiles]\n" - "one.txt=2\n" - "two.txt=4,there\n" - "three.txt=6\n" - "five.txt=8\n" - "six.txt=10\n" + "lanconf.exe = 2\n" "[DestinationDirs]\n" "DefaultDestDir = 24, %DefaultDest%\n" "[Strings]\n" @@ -323,7 +312,6 @@ static void test_SetupGetSourceFileLocation(void) char buffer[MAX_PATH] = "not empty", inf_filename[MAX_PATH]; UINT source_id; DWORD required, error; - INFCONTEXT ctx; HINF hinf; BOOL ret;
@@ -339,67 +327,13 @@ static void test_SetupGetSourceFileLocation(void) required = 0; source_id = 0;
- ret = SetupGetSourceFileLocationA(hinf, NULL, "one.txt", &source_id, buffer, sizeof(buffer), &required); + ret = SetupGetSourceFileLocationA(hinf, NULL, "lanconf.exe", &source_id, buffer, sizeof(buffer), &required); ok(ret, "SetupGetSourceFileLocation failed\n");
ok(required == 1, "unexpected required size: %ld\n", required); ok(source_id == 2, "unexpected source id: %d\n", source_id); ok(!lstrcmpA("", buffer), "unexpected result string: %s\n", buffer);
- ret = SetupGetSourceFileLocationA(hinf, NULL, "two.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(ret, "Got error %lu.\n", GetLastError()); - ok(source_id == 4, "Got source id %u.\n", source_id); - ok(!strcmp(buffer, "there"), "Got relative path %s.\n", debugstr_a(buffer)); - - ret = SetupFindFirstLineA(hinf, "copy_section", NULL, &ctx); - ok(ret, "Got error %lu.\n", GetLastError()); - - ret = SetupGetSourceFileLocationA(hinf, &ctx, "two.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(ret, "Got error %lu.\n", GetLastError()); - ok(source_id == 2, "Got source id %u.\n", source_id); - ok(!strcmp(buffer, ""), "Got relative path %s.\n", debugstr_a(buffer)); - - /* ctx should not be changed. */ - ret = SetupGetLineTextA(&ctx, NULL, NULL, NULL, buffer, sizeof(buffer), NULL); - ok(!strcmp(buffer, "one.txt,,2"), "Got line %s.\n", debugstr_a(buffer)); - - /* Test when the source name differs from the destination name. - * It seems SetupGetSourceFileLocation() is buggy and doesn't take that - * into account; it always uses the destination name. */ - - ret = SetupFindNextLine(&ctx, &ctx); - ok(ret, "Got error %lu.\n", GetLastError()); - ret = SetupFindNextLine(&ctx, &ctx); - ok(ret, "Got error %lu.\n", GetLastError()); - - SetLastError(0xdeadbeef); - ret = SetupGetSourceFileLocationA(hinf, &ctx, "two.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(!ret, "Expected failure.\n"); - ok(GetLastError() == ERROR_LINE_NOT_FOUND, "Got error %lu.\n", GetLastError()); - - ret = SetupFindNextLine(&ctx, &ctx); - ok(ret, "Got error %lu.\n", GetLastError()); - - ret = SetupGetSourceFileLocationA(hinf, &ctx, "two.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(ret, "Got error %lu.\n", GetLastError()); - ok(source_id == 10, "Got source id %u.\n", source_id); - ok(!strcmp(buffer, ""), "Got relative path %s.\n", debugstr_a(buffer)); - - ret = SetupGetSourceFileLocationA(hinf, NULL, "three.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(ret, "Got error %lu.\n", GetLastError()); - ok(source_id == 6, "Got source id %u.\n", source_id); - ok(!strcmp(buffer, ""), "Got relative path %s.\n", debugstr_a(buffer)); - - SetLastError(0xdeadbeef); - ret = SetupGetSourceFileLocationA(hinf, NULL, "four.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(!ret, "Expected failure.\n"); - ok(GetLastError() == ERROR_LINE_NOT_FOUND, "Got error %lu.\n", GetLastError()); - - ret = SetupGetSourceFileLocationA(hinf, NULL, "five.txt", &source_id, buffer, sizeof(buffer), NULL); - ok(ret, "Got error %lu.\n", GetLastError()); - ok(source_id == 8, "Got source id %u.\n", source_id); - ok(!strcmp(buffer, ""), "Got relative path %s.\n", debugstr_a(buffer)); - SetupCloseInfFile(hinf); DeleteFileA(inf_filename);
@@ -414,10 +348,8 @@ static void test_SetupGetSourceFileLocation(void) hinf = SetupOpenInfFileA(inf_filename, NULL, INF_STYLE_OLDNT, NULL); ok(hinf != INVALID_HANDLE_VALUE, "could not open inf file\n");
- SetLastError(0xdeadbeef); ret = SetupGetSourceFileLocationA(hinf, NULL, "", &source_id, buffer, sizeof(buffer), &required); ok(!ret, "SetupGetSourceFileLocation succeeded\n"); - ok(GetLastError() == ERROR_LINE_NOT_FOUND, "Got error %lu.\n", GetLastError());
SetupCloseInfFile(hinf); DeleteFileA(inf_filename); diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index 4330ee367b3..7fbded5743b 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -3263,7 +3263,8 @@ static HRESULT create_extra_folders(void) ret = RegCreateKeyW( HKEY_CURRENT_USER, L"Environment", &hkey ); if (ret) return HRESULT_FROM_WIN32( ret );
- hr = SHGetFolderPathAndSubDirW( 0, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, + /* FIXME: should be under AppData, but we don't want spaces in the temp path */ + hr = SHGetFolderPathAndSubDirW( 0, CSIDL_PROFILE | CSIDL_FLAG_CREATE, NULL, SHGFP_TYPE_DEFAULT, L"Temp", path ); if (SUCCEEDED(hr)) { diff --git a/dlls/ucrtbase/tests/file.c b/dlls/ucrtbase/tests/file.c index d128a9bffb0..e739934de02 100644 --- a/dlls/ucrtbase/tests/file.c +++ b/dlls/ucrtbase/tests/file.c @@ -107,7 +107,7 @@ static void test_iobuf_layout(void) fp.f = fopen(tempf, "wb"); ok(fp.f != NULL, "fopen failed with error: %d\n", errno);
- ok(!(fp.iobuf->_flag & 0x440), "fp.iobuf->_flag = %x\n", fp.iobuf->_flag); + ok(!(fp.iobuf->_flag & 0x40), "fp.iobuf->_flag = %x\n", fp.iobuf->_flag); r = fprintf(fp.f, "%s", "init"); ok(r == 4, "fprintf returned %d\n", r); ok(fp.iobuf->_flag & 0x40, "fp.iobuf->_flag = %x\n", fp.iobuf->_flag); @@ -129,10 +129,6 @@ static void test_iobuf_layout(void) ok(file_ptr == &fp.iobuf->_ptr, "_ptr = %p, expected %p\n", file_ptr, &fp.iobuf->_ptr); ok(file_cnt == &fp.iobuf->_cnt, "_cnt = %p, expected %p\n", file_cnt, &fp.iobuf->_cnt);
- r = setvbuf(fp.f, NULL, _IONBF, 0); - ok(!r, "setvbuf returned %d\n", r); - ok(fp.iobuf->_flag & 0x400, "fp.iobuf->_flag = %x\n", fp.iobuf->_flag); - ok(TryEnterCriticalSection(&fp.iobuf->_crit), "TryEnterCriticalSection section returned FALSE\n"); LeaveCriticalSection(&fp.iobuf->_crit);
diff --git a/dlls/urlmon/tests/protocol.c b/dlls/urlmon/tests/protocol.c index 0df64f6f3d9..ead7bbd2e70 100644 --- a/dlls/urlmon/tests/protocol.c +++ b/dlls/urlmon/tests/protocol.c @@ -854,7 +854,7 @@ static HRESULT WINAPI ProtocolSink_ReportProgress(IInternetProtocolSink *iface, !memcmp(szStatusText, text_plain, lstrlenW(text_plain)*sizeof(WCHAR)), "szStatusText != text/plain\n"); else if(empty_file) - ok(!lstrcmpW(szStatusText, L"text/javascript"), "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); + ok(!lstrcmpW(szStatusText, L"application/javascript"), "szStatusText = %s\n", wine_dbgstr_w(szStatusText)); else if((pi & PI_MIMEVERIFICATION) && emulate_prot && !mimefilter_test && tested_protocol==HTTP_TEST && !short_read) ok(lstrlenW(gifW) <= lstrlenW(szStatusText) && diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index e62616ff456..398bb0a69ed 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -725,7 +725,7 @@ static const struct message WmDestroyOverlappedSeq[] = { { WM_KILLFOCUS, sent|optional|wparam, 0 }, { WM_IME_SETCONTEXT, sent|wparam|optional, 0 }, { WM_IME_NOTIFY, sent|wparam|optional|defwinproc, 1 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } @@ -1644,7 +1644,7 @@ static const struct message WmDestroyChildSeq[] = { { WM_IME_SETCONTEXT, sent|wparam|parent|optional, 1 }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, { WM_SETFOCUS, sent|parent }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_DESTROY, sent|optional }, /* some other (IME?) window */ { WM_NCDESTROY, sent|optional }, /* some other (IME?) window */ @@ -1664,7 +1664,7 @@ static const struct message WmDestroyInvisibleChildSeq[] = { { 0x0090, sent|optional }, { WM_PARENTNOTIFY, sent|parent|wparam, WM_DESTROY }, { WM_SHOWWINDOW, sent|wparam, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } @@ -2009,7 +2009,7 @@ static const struct message WmSetRedrawTrueSeq[] = static const struct message WmEnableWindowSeq_1[] = { { WM_CANCELMODE, sent|wparam|lparam, 0, 0 }, - { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { HCBT_SETFOCUS, hook|optional }, { WM_KILLFOCUS, sent|optional }, { WM_ENABLE, sent|wparam|lparam, FALSE, 0 }, @@ -2025,7 +2025,7 @@ static const struct message WmEnableWindowSeq_2[] =
static const struct message WmEnableWindowSeq_3[] = { - { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_ENABLE, sent|wparam|lparam, TRUE, 0 }, { 0 } }; @@ -2057,12 +2057,12 @@ static const struct message WmSetScrollRangeSeq[] = /* SetScrollRange for a window without a non-client area */ static const struct message WmSetScrollRangeHSeq_empty[] = { - { EVENT_OBJECT_VALUECHANGE, winevent_hook|wparam|lparam, OBJID_HSCROLL, 0 }, + { EVENT_OBJECT_VALUECHANGE, winevent_hook|wparam|lparam|msg_todo, OBJID_HSCROLL, 0 }, { 0 } }; static const struct message WmSetScrollRangeVSeq_empty[] = { - { EVENT_OBJECT_VALUECHANGE, winevent_hook|wparam|lparam, OBJID_VSCROLL, 0 }, + { EVENT_OBJECT_VALUECHANGE, winevent_hook|wparam|lparam|msg_todo, OBJID_VSCROLL, 0 }, { 0 } }; static const struct message WmSetScrollRangeHVSeq[] = @@ -3017,7 +3017,7 @@ static const struct message WmDestroyMDIframeSeq[] = { { WM_ACTIVATE, sent|wparam|optional, 0 }, /* Win9x */ { WM_ACTIVATEAPP, sent|wparam|optional, 0 }, /* Win9x */ { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam|msg_todo, OBJID_CARET, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } @@ -3066,7 +3066,7 @@ static const struct message WmDestroyMDIclientSeq[] = { { WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, { WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } @@ -3268,7 +3268,7 @@ static const struct message WmDestroyMDIchildInvisibleSeq[] = { */ { 0x0090, sent|optional }, { WM_PARENTNOTIFY, sent /*|wparam, WM_DESTROY*/ }, /* in MDI client */ - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } @@ -12806,7 +12806,7 @@ static const struct message destroy_window_with_children[] = { { WM_DESTROY, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */ { WM_CAPTURECHANGED, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */ { WM_NCDESTROY, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */ - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, /* parent */ + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, /* parent */ { WM_DESTROY, sent|wparam|lparam, 0, WND_PARENT_ID }, /* parent */ { WM_DESTROY, sent|wparam|lparam, 0, WND_CHILD_ID + 2 }, /* child2 */ { WM_DESTROY, sent|wparam|lparam, 0, WND_CHILD_ID + 1 }, /* child1 */ @@ -14493,7 +14493,7 @@ static const struct message WmQuitDialogSeq[] = { { EVENT_SYSTEM_DIALOGEND, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { HCBT_DESTROYWND, hook }, { 0x0090, sent|optional }, /* Vista */ - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_DESTROY, sent }, { WM_NCDESTROY, sent }, { 0 } @@ -15991,7 +15991,7 @@ static void test_dialog_messages(void) static void test_enddialog_seq(HWND dialog, HWND owner) { const struct message seq[] = { - { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_ENABLE, sent }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { HCBT_ACTIVATE, hook|wparam, (WPARAM)owner }, @@ -16019,7 +16019,7 @@ static void test_enddialog_seq(HWND dialog, HWND owner) static void test_enddialog_seq2(HWND dialog, HWND owner) { const struct message seq[] = { - { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_STATECHANGE, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_ENABLE, parent|sent }, { WM_WINDOWPOSCHANGING, sent|wparam, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE }, { HCBT_ACTIVATE, hook|wparam, (WPARAM)owner }, @@ -17245,7 +17245,7 @@ static const struct message wm_popup_menu_1[] = { EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|msg_todo, OBJID_CLIENT, 0 }, { HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't create a window */ { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_UNINITMENUPOPUP, sent|lparam, 0, 0 }, { WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 }, { WM_EXITMENULOOP, sent|wparam|lparam, 0, 0 }, @@ -17295,12 +17295,12 @@ static const struct message wm_popup_menu_2[] = { EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|msg_todo, OBJID_CLIENT, 0 }, { HCBT_DESTROYWND, hook }, { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_UNINITMENUPOPUP, sent|lparam, 0, 0 }, { EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|msg_todo, OBJID_CLIENT, 0 }, { HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't send it */ { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_UNINITMENUPOPUP, sent|lparam, 0, 0 }, { WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 }, { WM_EXITMENULOOP, sent|wparam|lparam, 0, 0 }, @@ -17350,12 +17350,12 @@ static const struct message wm_popup_menu_3[] = { EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|msg_todo, OBJID_CLIENT, 0 }, { HCBT_DESTROYWND, hook }, { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_UNINITMENUPOPUP, sent|lparam, 0, 0 }, { EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|msg_todo, OBJID_CLIENT, 0 }, { HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't send it */ { EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 }, - { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, + { EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|msg_todo, 0, 0 }, { WM_UNINITMENUPOPUP, sent|lparam, 0, 0 }, { WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 }, { WM_EXITMENULOOP, sent|wparam|lparam, 0, 0 }, diff --git a/dlls/win32u/dce.c b/dlls/win32u/dce.c index 4a672d6c519..aa6836e3440 100644 --- a/dlls/win32u/dce.c +++ b/dlls/win32u/dce.c @@ -479,6 +479,8 @@ W32KAPI void window_surface_set_layered( struct window_surface *surface, COLORRE } } window_surface_unlock( surface ); + + window_surface_flush( surface ); }
W32KAPI void window_surface_set_clip( struct window_surface *surface, HRGN clip_region ) diff --git a/dlls/win32u/input.c b/dlls/win32u/input.c index 3a5802b75b6..794dde58359 100644 --- a/dlls/win32u/input.c +++ b/dlls/win32u/input.c @@ -955,19 +955,9 @@ HKL WINAPI NtUserGetKeyboardLayout( DWORD thread_id ) */ SHORT WINAPI NtUserGetKeyState( INT vkey ) { - struct object_lock lock = OBJECT_LOCK_INIT; - const input_shm_t *input_shm; - BOOL ret = FALSE; SHORT retval = 0; - NTSTATUS status;
- while ((status = get_shared_input( GetCurrentThreadId(), &lock, &input_shm )) == STATUS_PENDING) - { - ret = !!input_shm->keystate_lock; /* needs a request for sync_input_keystate */ - retval = (signed char)(input_shm->keystate[vkey & 0xff] & 0x81); - } - - if (!ret) SERVER_START_REQ( get_key_state ) + SERVER_START_REQ( get_key_state ) { req->key = vkey; if (!wine_server_call( req )) retval = (signed char)(reply->state & 0x81); @@ -982,37 +972,21 @@ SHORT WINAPI NtUserGetKeyState( INT vkey ) */ BOOL WINAPI NtUserGetKeyboardState( BYTE *state ) { - struct object_lock lock = OBJECT_LOCK_INIT; - const input_shm_t *input_shm; - NTSTATUS status; + BOOL ret; UINT i;
TRACE("(%p)\n", state);
- while ((status = get_shared_input( GetCurrentThreadId(), &lock, &input_shm )) == STATUS_PENDING) - memcpy( state, (const void *)input_shm->keystate, 256 ); - if (status) memset( state, 0, 256 ); - - for (i = 0; i < 256; i++) state[i] &= 0x81; - return TRUE; -} - -/*********************************************************************** - * get_async_keyboard_state - */ -BOOL get_async_keyboard_state( BYTE state[256] ) -{ - struct object_lock lock = OBJECT_LOCK_INIT; - const desktop_shm_t *desktop_shm; - NTSTATUS status; - - TRACE("(%p)\n", state); - - while ((status = get_shared_desktop( &lock, &desktop_shm )) == STATUS_PENDING) - memcpy( state, (const void *)desktop_shm->keystate, 256 ); - if (status) memset( state, 0, 256 ); - - return !status; + memset( state, 0, 256 ); + SERVER_START_REQ( get_key_state ) + { + req->key = -1; + wine_server_set_reply( req, state, 256 ); + ret = !wine_server_call_err( req ); + for (i = 0; i < 256; i++) state[i] &= 0x81; + } + SERVER_END_REQ; + return ret; }
/********************************************************************** diff --git a/dlls/win32u/scroll.c b/dlls/win32u/scroll.c index a42a7437175..da52a7a4fba 100644 --- a/dlls/win32u/scroll.c +++ b/dlls/win32u/scroll.c @@ -1024,24 +1024,6 @@ done: refresh_scroll_bar( hwnd, bar, TRUE, TRUE ); else if (action & SA_SSI_REPAINT_ARROWS) refresh_scroll_bar( hwnd, bar, TRUE, FALSE ); - - if (redraw) - { - switch (bar) - { - case SB_CTL: - NtUserNotifyWinEvent( EVENT_OBJECT_VALUECHANGE, hwnd, OBJID_CLIENT, 0 ); - break; - case SB_HORZ: - if (get_window_long( hwnd, GWL_STYLE ) & WS_HSCROLL) - NtUserNotifyWinEvent( EVENT_OBJECT_VALUECHANGE, hwnd, OBJID_HSCROLL, 0 ); - break; - case SB_VERT: - if (get_window_long( hwnd, GWL_STYLE ) & WS_VSCROLL) - NtUserNotifyWinEvent( EVENT_OBJECT_VALUECHANGE, hwnd, OBJID_VSCROLL, 0 ); - break; - } - } }
return ret; /* Return current position */ diff --git a/dlls/win32u/sysparams.c b/dlls/win32u/sysparams.c index 807f2f4ae81..9a06db2c7f6 100644 --- a/dlls/win32u/sysparams.c +++ b/dlls/win32u/sysparams.c @@ -6488,9 +6488,6 @@ ULONG_PTR WINAPI NtUserCallOneParam( ULONG_PTR arg, ULONG code ) case NtUserCallOneParam_D3DKMTOpenAdapterFromGdiDisplayName: return d3dkmt_open_adapter_from_gdi_display_name( (void *)arg );
- case NtUserCallOneParam_GetAsyncKeyboardState: - return get_async_keyboard_state( (void *)arg ); - /* temporary exports */ case NtUserGetDeskPattern: return get_entry( &entry_DESKPATTERN, 256, (WCHAR *)arg ); diff --git a/dlls/win32u/win32u_private.h b/dlls/win32u/win32u_private.h index fc0f0c62c93..0a82c2175ae 100644 --- a/dlls/win32u/win32u_private.h +++ b/dlls/win32u/win32u_private.h @@ -96,7 +96,6 @@ extern HWND get_capture(void); extern BOOL get_cursor_pos( POINT *pt ); extern HWND get_focus(void); extern DWORD get_input_state(void); -extern BOOL get_async_keyboard_state( BYTE state[256] ); extern BOOL release_capture(void); extern BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ); extern BOOL set_caret_blink_time( unsigned int time ); diff --git a/dlls/win32u/window.c b/dlls/win32u/window.c index 4499e226a7b..ad4d49ca034 100644 --- a/dlls/win32u/window.c +++ b/dlls/win32u/window.c @@ -825,12 +825,7 @@ BOOL enable_window( HWND hwnd, BOOL enable ) if (enable) { ret = (set_window_style( hwnd, 0, WS_DISABLED ) & WS_DISABLED) != 0; - if (ret) - { - NtUserNotifyWinEvent( EVENT_OBJECT_STATECHANGE, hwnd, OBJID_WINDOW, 0 ); - - send_message( hwnd, WM_ENABLE, TRUE, 0 ); - } + if (ret) send_message( hwnd, WM_ENABLE, TRUE, 0 ); } else { @@ -839,8 +834,6 @@ BOOL enable_window( HWND hwnd, BOOL enable ) ret = (set_window_style( hwnd, WS_DISABLED, 0 ) & WS_DISABLED) != 0; if (!ret) { - NtUserNotifyWinEvent( EVENT_OBJECT_STATECHANGE, hwnd, OBJID_WINDOW, 0 ); - if (hwnd == get_focus()) NtUserSetFocus( 0 ); /* A disabled window can't have the focus */
@@ -1209,7 +1202,7 @@ static HWND set_window_owner( HWND hwnd, HWND owner ) /* Helper function for SetWindowLong(). */ LONG_PTR set_window_long( HWND hwnd, INT offset, UINT size, LONG_PTR newval, BOOL ansi ) { - BOOL ok, made_visible = FALSE, layered = FALSE; + BOOL ok, made_visible = FALSE; LONG_PTR retval = 0; STYLESTRUCT style; WND *win; @@ -1396,8 +1389,8 @@ LONG_PTR set_window_long( HWND hwnd, INT offset, UINT size, LONG_PTR newval, BOO } SERVER_END_REQ;
- if (offset == GWL_EXSTYLE && ((style.styleOld ^ style.styleNew) & WS_EX_LAYERED)) layered = TRUE; - if ((offset == GWL_STYLE && ((style.styleOld ^ style.styleNew) & WS_VISIBLE)) || layered) + if ((offset == GWL_STYLE && ((style.styleOld ^ style.styleNew) & WS_VISIBLE)) || + (offset == GWL_EXSTYLE && ((style.styleOld ^ style.styleNew) & WS_EX_LAYERED))) { made_visible = (win->dwStyle & WS_VISIBLE) != 0; invalidate_dce( win, NULL ); @@ -1411,7 +1404,7 @@ LONG_PTR set_window_long( HWND hwnd, INT offset, UINT size, LONG_PTR newval, BOO style.styleOld = retval; style.styleNew = newval; user_driver->pSetWindowStyle( hwnd, offset, &style ); - if (made_visible || layered) update_window_state( hwnd ); + if (made_visible) update_window_state( hwnd ); send_message( hwnd, WM_STYLECHANGED, offset, (LPARAM)&style ); }
@@ -1839,11 +1832,10 @@ static BOOL get_default_window_surface( HWND hwnd, const RECT *surface_rect, str return TRUE; }
-static struct window_surface *create_window_surface( HWND hwnd, UINT swp_flags, BOOL create_layered, - const RECT *window_rect, const RECT *client_rect, +static struct window_surface *create_window_surface( HWND hwnd, UINT swp_flags, const RECT *window_rect, const RECT *client_rect, RECT *visible_rect, RECT *surface_rect ) { - BOOL shaped, needs_surface, create_opaque, is_layered; + BOOL shaped, needs_surface, layered, ulw_layered = FALSE; struct window_surface *new_surface; RECT dummy; HRGN shape; @@ -1860,38 +1852,19 @@ static struct window_surface *create_window_surface( HWND hwnd, UINT swp_flags, if (!get_surface_rect( visible_rect, surface_rect )) needs_surface = FALSE; if (!get_default_window_surface( hwnd, surface_rect, &new_surface )) return NULL;
- is_layered = new_surface && new_surface->alpha_mask; - create_opaque = !(get_window_long( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED); - - if ((create_opaque && is_layered) || (create_layered && !is_layered)) - { - window_surface_release( new_surface ); - new_surface = &dummy_surface; - window_surface_add_ref( new_surface ); - } - if (!needs_surface || IsRectEmpty( visible_rect )) needs_surface = FALSE; /* use default surface */ else needs_surface = !user_driver->pCreateWindowSurface( hwnd, surface_rect, &new_surface );
+ if ((layered = !!(get_window_long( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED))) + ulw_layered = !NtUserGetLayeredWindowAttributes( hwnd, NULL, NULL, NULL ); + /* create or update window surface for top-level windows if the driver doesn't implement CreateWindowSurface */ - if (needs_surface && new_surface == &dummy_surface && (create_opaque && !create_layered)) + if (needs_surface && new_surface == &dummy_surface && (!layered || !ulw_layered)) { window_surface_release( new_surface ); create_offscreen_window_surface( hwnd, surface_rect, &new_surface ); }
- if (new_surface && !is_layered) - { - DWORD lwa_flags = 0; - COLORREF key; - BYTE alpha; - - if (!NtUserGetLayeredWindowAttributes( hwnd, &key, &alpha, &lwa_flags )) lwa_flags = 0; - if (!(lwa_flags & LWA_ALPHA)) alpha = 255; - if (!(lwa_flags & LWA_COLORKEY)) key = CLR_INVALID; - window_surface_set_layered( new_surface, key, alpha << 24, 0 ); - } - return new_surface; }
@@ -2230,15 +2203,14 @@ BOOL WINAPI NtUserUpdateLayeredWindow( HWND hwnd, HDC hdc_dst, const POINT *pts_ TRACE( "window %p win %s client %s\n", hwnd, wine_dbgstr_rect(&window_rect), wine_dbgstr_rect(&client_rect) );
- surface = create_window_surface( hwnd, swp_flags, TRUE, &window_rect, &client_rect, &visible_rect, &surface_rect ); + surface = create_window_surface( hwnd, swp_flags, &window_rect, &client_rect, &visible_rect, &surface_rect ); apply_window_pos( hwnd, 0, swp_flags, surface, &window_rect, &client_rect, &visible_rect, NULL ); if (surface) window_surface_release( surface );
if (!(flags & ULW_COLORKEY)) key = CLR_INVALID; - if (IsRectEmpty( &surface_rect )) window_surface_add_ref( (surface = &dummy_surface) ); - else if (!(user_driver->pCreateLayeredWindow( hwnd, &surface_rect, key, &surface )) || !surface) return FALSE; + if (!(user_driver->pCreateLayeredWindow( hwnd, &surface_rect, key, &surface )) || !surface) return FALSE;
- if (!hdc_src || surface == &dummy_surface) ret = TRUE; + if (!hdc_src) ret = TRUE; else { BLENDFUNCTION src_blend = { AC_SRC_OVER, 0, 255, 0 }; @@ -2268,8 +2240,6 @@ BOOL WINAPI NtUserUpdateLayeredWindow( HWND hwnd, HDC hdc_dst, const POINT *pts_
NtGdiDeleteObjectApp( hdc ); window_surface_unlock( surface ); - - window_surface_set_layered( surface, key, -1, 0xff000000 ); window_surface_flush( surface );
user_driver->pUpdateLayeredWindow( hwnd, &window_rect, key, alpha, flags ); @@ -3551,7 +3521,7 @@ BOOL set_window_pos( WINDOWPOS *winpos, int parent_x, int parent_y ) calc_ncsize( winpos, &old_window_rect, &old_client_rect, &new_window_rect, &new_client_rect, valid_rects, parent_x, parent_y );
- surface = create_window_surface( winpos->hwnd, winpos->flags, FALSE, &new_window_rect, &new_client_rect, + surface = create_window_surface( winpos->hwnd, winpos->flags, &new_window_rect, &new_client_rect, &visible_rect, &surface_rect ); if (!apply_window_pos( winpos->hwnd, winpos->hwndInsertAfter, winpos->flags, surface, &new_window_rect, &new_client_rect, &visible_rect, valid_rects )) @@ -4350,7 +4320,7 @@ void update_window_state( HWND hwnd ) get_window_rects( hwnd, COORDS_PARENT, &window_rect, &client_rect, get_thread_dpi() ); valid_rects[0] = valid_rects[1] = client_rect;
- surface = create_window_surface( hwnd, swp_flags, FALSE, &window_rect, &client_rect, &visible_rect, &surface_rect ); + surface = create_window_surface( hwnd, swp_flags, &window_rect, &client_rect, &visible_rect, &surface_rect ); apply_window_pos( hwnd, 0, swp_flags, surface, &window_rect, &client_rect, &visible_rect, valid_rects ); if (surface) window_surface_release( surface );
@@ -4766,7 +4736,7 @@ HICON WINAPI NtUserInternalGetWindowIcon( HWND hwnd, UINT type ) /*********************************************************************** * send_destroy_message */ -static void send_destroy_message( HWND hwnd, BOOL winevent ) +static void send_destroy_message( HWND hwnd ) { GUITHREADINFO info;
@@ -4779,9 +4749,6 @@ static void send_destroy_message( HWND hwnd, BOOL winevent )
if (hwnd == NtUserGetClipboardOwner()) release_clipboard_owner( hwnd );
- if (winevent) - NtUserNotifyWinEvent( EVENT_OBJECT_DESTROY, hwnd, OBJID_WINDOW, 0 ); - send_message( hwnd, WM_DESTROY, 0, 0);
/* @@ -4797,7 +4764,7 @@ static void send_destroy_message( HWND hwnd, BOOL winevent )
for (i = 0; children[i]; i++) { - if (is_window( children[i] )) send_destroy_message( children[i], FALSE ); + if (is_window( children[i] )) send_destroy_message( children[i] ); } free( children ); } @@ -4907,7 +4874,7 @@ LRESULT destroy_window( HWND hwnd ) /*********************************************************************** * NtUserDestroyWindow (win32u.@) */ -static BOOL user_destroy_window( HWND hwnd, BOOL winevent ) +BOOL WINAPI NtUserDestroyWindow( HWND hwnd ) { BOOL is_child;
@@ -4967,7 +4934,7 @@ static BOOL user_destroy_window( HWND hwnd, BOOL winevent ) if (get_window_relative( children[i], GW_OWNER ) != hwnd) continue; if (is_current_thread_window( children[i] )) { - user_destroy_window( children[i], FALSE ); + NtUserDestroyWindow( children[i] ); got_one = TRUE; continue; } @@ -4978,18 +4945,13 @@ static BOOL user_destroy_window( HWND hwnd, BOOL winevent ) } }
- send_destroy_message( hwnd, winevent ); + send_destroy_message( hwnd ); if (!is_window( hwnd )) return TRUE;
destroy_window( hwnd ); return TRUE; }
-BOOL WINAPI NtUserDestroyWindow( HWND hwnd ) -{ - return user_destroy_window( hwnd, TRUE ); -} - /***************************************************************************** * destroy_thread_windows * @@ -5402,7 +5364,7 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, if (cs.x > 0x7fffffff - cx) rect.right = 0x7fffffff; if (cs.y > 0x7fffffff - cy) rect.bottom = 0x7fffffff;
- surface = create_window_surface( hwnd, SWP_NOZORDER | SWP_NOACTIVATE, FALSE, &rect, &rect, &visible_rect, &surface_rect ); + surface = create_window_surface( hwnd, SWP_NOZORDER | SWP_NOACTIVATE, &rect, &rect, &visible_rect, &surface_rect ); if (!apply_window_pos( hwnd, 0, SWP_NOZORDER | SWP_NOACTIVATE, surface, &rect, &rect, &visible_rect, NULL )) { if (surface) window_surface_release( surface ); @@ -5441,7 +5403,7 @@ HWND WINAPI NtUserCreateWindowEx( DWORD ex_style, UNICODE_STRING *class_name, send_message( hwnd, WM_NCCALCSIZE, FALSE, (LPARAM)&client_rect ); map_window_points( 0, parent, (POINT *)&client_rect, 2, win_dpi );
- surface = create_window_surface( hwnd, SWP_NOACTIVATE, FALSE, &rect, &client_rect, &visible_rect, &surface_rect ); + surface = create_window_surface( hwnd, SWP_NOACTIVATE, &rect, &client_rect, &visible_rect, &surface_rect ); apply_window_pos( hwnd, insert_after, SWP_NOACTIVATE, surface, &rect, &client_rect, &visible_rect, NULL ); if (surface) window_surface_release( surface ); } diff --git a/dlls/wineandroid.drv/android.h b/dlls/wineandroid.drv/android.h index 9f6bb2b999c..54062b04db0 100644 --- a/dlls/wineandroid.drv/android.h +++ b/dlls/wineandroid.drv/android.h @@ -92,6 +92,8 @@ extern BOOL ANDROID_CreateWindow( HWND hwnd ); extern void ANDROID_DestroyWindow( HWND hwnd ); extern BOOL ANDROID_ProcessEvents( DWORD mask ); extern LRESULT ANDROID_DesktopWindowProc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp ); +extern void ANDROID_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alpha, + DWORD flags ); extern void ANDROID_SetParent( HWND hwnd, HWND parent, HWND old_parent ); extern void ANDROID_SetCapture( HWND hwnd, UINT flags ); extern void ANDROID_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ); diff --git a/dlls/wineandroid.drv/init.c b/dlls/wineandroid.drv/init.c index 25055ece395..73fd28c7c69 100644 --- a/dlls/wineandroid.drv/init.c +++ b/dlls/wineandroid.drv/init.c @@ -344,6 +344,7 @@ static const struct user_driver_funcs android_drv_funcs = .pDestroyWindow = ANDROID_DestroyWindow, .pProcessEvents = ANDROID_ProcessEvents, .pSetCapture = ANDROID_SetCapture, + .pSetLayeredWindowAttributes = ANDROID_SetLayeredWindowAttributes, .pSetParent = ANDROID_SetParent, .pSetWindowStyle = ANDROID_SetWindowStyle, .pShowWindow = ANDROID_ShowWindow, diff --git a/dlls/wineandroid.drv/keyboard.c b/dlls/wineandroid.drv/keyboard.c index b53bf64abc1..b0380d147da 100644 --- a/dlls/wineandroid.drv/keyboard.c +++ b/dlls/wineandroid.drv/keyboard.c @@ -654,6 +654,21 @@ static const char* vkey_to_name( UINT vkey ) return NULL; }
+static BOOL get_async_key_state( BYTE state[256] ) +{ + BOOL ret; + + SERVER_START_REQ( get_key_state ) + { + req->async = 1; + req->key = -1; + wine_server_set_reply( req, state, 256 ); + ret = !wine_server_call( req ); + } + SERVER_END_REQ; + return ret; +} + static void send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, DWORD flags ) { INPUT input; @@ -675,7 +690,7 @@ void update_keyboard_lock_state( WORD vkey, UINT state ) { BYTE keystate[256];
- if (!NtUserGetAsyncKeyboardState( keystate )) return; + if (!get_async_key_state( keystate )) return;
if (!(keystate[VK_CAPITAL] & 0x01) != !(state & AMETA_CAPS_LOCK_ON) && vkey != VK_CAPITAL) { diff --git a/dlls/wineandroid.drv/window.c b/dlls/wineandroid.drv/window.c index 553ed985fae..0f8cedfbd0b 100644 --- a/dlls/wineandroid.drv/window.c +++ b/dlls/wineandroid.drv/window.c @@ -561,6 +561,25 @@ static struct android_window_surface *get_android_surface( struct window_surface return (struct android_window_surface *)surface; }
+/* store the palette or color mask data in the bitmap info structure */ +static void set_color_info( BITMAPINFO *info, BOOL has_alpha ) +{ + DWORD *colors = (DWORD *)info->bmiColors; + + info->bmiHeader.biSize = sizeof(info->bmiHeader); + info->bmiHeader.biClrUsed = 0; + info->bmiHeader.biBitCount = 32; + if (has_alpha) + { + info->bmiHeader.biCompression = BI_RGB; + return; + } + info->bmiHeader.biCompression = BI_BITFIELDS; + colors[0] = 0xff0000; + colors[1] = 0x00ff00; + colors[2] = 0x0000ff; +} + /* apply the window region to a single line of the destination image. */ static void apply_line_region( DWORD *dst, int width, int x, int y, const RECT *rect, const RECT *end ) { @@ -698,7 +717,8 @@ static BOOL is_argb_surface( struct window_surface *surface ) /*********************************************************************** * create_surface */ -static struct window_surface *create_surface( HWND hwnd, const RECT *rect ) +static struct window_surface *create_surface( HWND hwnd, const RECT *rect, + BYTE alpha, COLORREF color_key, BOOL src_alpha ) { struct android_window_surface *surface; int width = rect->right - rect->left, height = rect->bottom - rect->top; @@ -706,13 +726,11 @@ static struct window_surface *create_surface( HWND hwnd, const RECT *rect ) BITMAPINFO *info = (BITMAPINFO *)buffer;
memset( info, 0, sizeof(*info) ); - info->bmiHeader.biSize = sizeof(info->bmiHeader); - info->bmiHeader.biWidth = width; - info->bmiHeader.biHeight = -height; /* top-down */ - info->bmiHeader.biPlanes = 1; - info->bmiHeader.biBitCount = 32; - info->bmiHeader.biSizeImage = get_dib_image_size(info); - info->bmiHeader.biCompression = BI_RGB; + set_color_info( info, src_alpha ); + info->bmiHeader.biWidth = width; + info->bmiHeader.biHeight = -height; /* top-down */ + info->bmiHeader.biPlanes = 1; + info->bmiHeader.biSizeImage = get_dib_image_size( info );
if (!(surface = calloc( 1, sizeof(*surface) ))) return NULL; if (!window_surface_init( &surface->header, &android_surface_funcs, hwnd, rect, info, 0 )) goto failed; @@ -721,6 +739,9 @@ static struct window_surface *create_surface( HWND hwnd, const RECT *rect )
TRACE( "created %p hwnd %p %s\n", surface, hwnd, wine_dbgstr_rect(rect) );
+ if (src_alpha) window_surface_set_layered( &surface->header, color_key, -1, 0xff000000 ); + else window_surface_set_layered( &surface->header, color_key, alpha << 24, 0 ); + return &surface->header;
failed: @@ -1068,6 +1089,10 @@ done: BOOL ANDROID_CreateWindowSurface( HWND hwnd, const RECT *surface_rect, struct window_surface **surface ) { struct android_win_data *data; + DWORD flags; + COLORREF key; + BYTE alpha; + BOOL layered = NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED;
TRACE( "hwnd %p, surface_rect %s, surface %p\n", hwnd, wine_dbgstr_rect( surface_rect ), surface );
@@ -1085,8 +1110,12 @@ BOOL ANDROID_CreateWindowSurface( HWND hwnd, const RECT *surface_rect, struct wi } }
+ if (!layered || !NtUserGetLayeredWindowAttributes( hwnd, &key, &alpha, &flags )) flags = 0; + if (!(flags & LWA_ALPHA)) alpha = 255; + if (!(flags & LWA_COLORKEY)) key = CLR_INVALID; + if (*surface) window_surface_release( *surface ); - *surface = create_surface( data->hwnd, surface_rect ); + *surface = create_surface( data->hwnd, surface_rect, alpha, key, FALSE );
done: release_win_data( data ); @@ -1251,11 +1280,30 @@ void ANDROID_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ) if (data->surface) window_surface_release( data->surface ); data->surface = NULL; } + else if (data->surface) window_surface_set_layered( data->surface, CLR_INVALID, -1, 0 ); } release_win_data( data ); }
+/*********************************************************************** + * ANDROID_SetLayeredWindowAttributes + */ +void ANDROID_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alpha, DWORD flags ) +{ + struct android_win_data *data; + + if (!(flags & LWA_ALPHA)) alpha = 255; + if (!(flags & LWA_COLORKEY)) key = CLR_INVALID; + + if ((data = get_win_data( hwnd ))) + { + if (data->surface) window_surface_set_layered( data->surface, key, alpha << 24, 0 ); + release_win_data( data ); + } +} + + /***************************************************************************** * ANDROID_CreateLayeredWindow */ @@ -1276,10 +1324,11 @@ BOOL ANDROID_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF
if (!surface || !EqualRect( &surface->rect, surface_rect )) { - data->surface = create_surface( data->hwnd, surface_rect ); + data->surface = create_surface( data->hwnd, surface_rect, 255, color_key, TRUE ); if (surface) window_surface_release( surface ); surface = data->surface; } + else window_surface_set_layered( surface, color_key, -1, 0xff000000 );
if ((*window_surface = surface)) window_surface_add_ref( surface ); release_win_data( data ); diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c index 71f91162fb1..2a60f112a83 100644 --- a/dlls/winebus.sys/bus_sdl.c +++ b/dlls/winebus.sys/bus_sdl.c @@ -661,7 +661,7 @@ static NTSTATUS sdl_device_physical_effect_update(struct unix_device *iface, BYT struct sdl_device *impl = impl_from_unix_device(iface); int id = impl->effect_ids[index]; SDL_HapticEffect effect = {0}; - INT16 direction; + UINT16 direction; NTSTATUS status;
TRACE("iface %p, index %u, params %p.\n", iface, index, params); @@ -672,7 +672,6 @@ static NTSTATUS sdl_device_physical_effect_update(struct unix_device *iface, BYT /* The first direction we get from PID is in polar coordinate space, so we need to * remove 90° to make it match SDL spherical coordinates. */ direction = (params->direction[0] - 9000) % 36000; - if (direction < 0) direction += 36000;
switch (params->effect_type) { diff --git a/dlls/winebus.sys/hid.c b/dlls/winebus.sys/hid.c index 78efe6116ce..d31718c6293 100644 --- a/dlls/winebus.sys/hid.c +++ b/dlls/winebus.sys/hid.c @@ -600,7 +600,7 @@ static BOOL hid_descriptor_add_set_periodic(struct unix_device *iface) UNIT(1, 0x14), /* Eng Rot:Angular Pos */ UNIT_EXPONENT(1, -2), LOGICAL_MINIMUM(1, 0), - LOGICAL_MAXIMUM(4, 35900), + LOGICAL_MAXIMUM(4, 36000), REPORT_SIZE(1, 16), REPORT_COUNT(1, 1), OUTPUT(1, Data|Var|Abs), @@ -960,7 +960,7 @@ BOOL hid_device_add_physical(struct unix_device *iface, USAGE *usages, USHORT co UNIT(1, 0x14), /* Eng Rot:Angular Pos */ UNIT_EXPONENT(1, -2), LOGICAL_MINIMUM(1, 0), - LOGICAL_MAXIMUM(4, 35900), + LOGICAL_MAXIMUM(4, 36000), REPORT_SIZE(1, 16), REPORT_COUNT(1, 2), OUTPUT(1, Data|Var|Abs), diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index f7f8021e8ba..81a66ab3cf7 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -1580,6 +1580,9 @@ static void wined3d_cs_exec_set_texture(struct wined3d_cs *cs, const void *data)
if (new_use_color_key != old_use_color_key) device_invalidate_state(cs->c.device, STATE_RENDER(WINED3D_RS_COLORKEYENABLE)); + + if (new_use_color_key) + device_invalidate_state(cs->c.device, STATE_COLOR_KEY); }
void wined3d_device_context_emit_set_texture(struct wined3d_device_context *context, @@ -1954,6 +1957,7 @@ static void wined3d_cs_exec_set_color_key(struct wined3d_cs *cs, const void *dat case WINED3D_CKEY_SRC_BLT: if (texture == wined3d_state_get_ffp_texture(&cs->state, 0)) { + device_invalidate_state(cs->c.device, STATE_COLOR_KEY); if (!(texture->async.color_key_flags & WINED3D_CKEY_SRC_BLT)) device_invalidate_state(cs->c.device, STATE_RENDER(WINED3D_RS_COLORKEYENABLE)); } @@ -2061,10 +2065,12 @@ static void wined3d_cs_exec_set_light(struct wined3d_cs *cs, const void *data) { if (light_info->OriginalParms.type != op->light.OriginalParms.type) device_invalidate_state(cs->c.device, STATE_LIGHT_TYPE); + device_invalidate_state(cs->c.device, STATE_ACTIVELIGHT(light_info->glIndex)); }
light_info->OriginalParms = op->light.OriginalParms; - light_info->constants = op->light.constants; + light_info->position = op->light.position; + light_info->direction = op->light.direction; }
void wined3d_device_context_emit_set_light(struct wined3d_device_context *context, @@ -2084,6 +2090,7 @@ static void wined3d_cs_exec_set_light_enable(struct wined3d_cs *cs, const void * const struct wined3d_cs_set_light_enable *op = data; struct wined3d_device *device = cs->c.device; struct wined3d_light_info *light_info; + int prev_idx;
if (!(light_info = wined3d_light_state_get_light(&cs->state.light_state, op->idx))) { @@ -2091,8 +2098,12 @@ static void wined3d_cs_exec_set_light_enable(struct wined3d_cs *cs, const void * return; }
+ prev_idx = light_info->glIndex; if (wined3d_light_state_enable_light(&cs->state.light_state, &device->adapter->d3d_info, light_info, op->enable)) + { device_invalidate_state(device, STATE_LIGHT_TYPE); + device_invalidate_state(device, STATE_ACTIVELIGHT(op->enable ? light_info->glIndex : prev_idx)); + } }
void wined3d_device_context_emit_set_light_enable(struct wined3d_device_context *context, unsigned int idx, BOOL enable) @@ -2141,7 +2152,6 @@ wined3d_cs_push_constant_info[] = [WINED3D_PUSH_CONSTANTS_PS_I] = {sizeof(struct wined3d_ivec4), WINED3D_MAX_CONSTS_I, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_INT_CONSTANT_REGISTER}, [WINED3D_PUSH_CONSTANTS_VS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, [WINED3D_PUSH_CONSTANTS_PS_B] = {sizeof(BOOL), WINED3D_MAX_CONSTS_B, WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_BOOL_CONSTANT_REGISTER}, - [WINED3D_PUSH_CONSTANTS_VS_FFP] = {1, sizeof(struct wined3d_ffp_vs_constants), WINED3D_SHADER_TYPE_VERTEX, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, [WINED3D_PUSH_CONSTANTS_PS_FFP] = {1, sizeof(struct wined3d_ffp_ps_constants), WINED3D_SHADER_TYPE_PIXEL, VKD3D_SHADER_D3DBC_FLOAT_CONSTANT_REGISTER}, };
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 47469027ba7..acc70256462 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -2999,7 +2999,7 @@ static void init_transformed_lights(struct lights_settings *ls, continue;
light = &ls->lights[index]; - wined3d_vec4_transform(&vec4, &light_info->constants.direction, &state->transforms[WINED3D_TS_VIEW]); + wined3d_vec4_transform(&vec4, &light_info->direction, &state->transforms[WINED3D_TS_VIEW]); light->direction = *(struct wined3d_vec3 *)&vec4; wined3d_vec3_normalise(&light->direction);
@@ -3017,7 +3017,7 @@ static void init_transformed_lights(struct lights_settings *ls,
light = &ls->lights[index];
- wined3d_vec4_transform(&light->position, &light_info->constants.position, &state->transforms[WINED3D_TS_VIEW]); + wined3d_vec4_transform(&light->position, &light_info->position, &state->transforms[WINED3D_TS_VIEW]); light->range = light_info->OriginalParms.range; light->c_att = light_info->OriginalParms.attenuation0; light->l_att = light_info->OriginalParms.attenuation1; @@ -3037,8 +3037,8 @@ static void init_transformed_lights(struct lights_settings *ls,
light = &ls->lights[index];
- wined3d_vec4_transform(&light->position, &light_info->constants.position, &state->transforms[WINED3D_TS_VIEW]); - wined3d_vec4_transform(&vec4, &light_info->constants.direction, &state->transforms[WINED3D_TS_VIEW]); + wined3d_vec4_transform(&light->position, &light_info->position, &state->transforms[WINED3D_TS_VIEW]); + wined3d_vec4_transform(&vec4, &light_info->direction, &state->transforms[WINED3D_TS_VIEW]); light->direction = *(struct wined3d_vec3 *)&vec4; wined3d_vec3_normalise(&light->direction); light->range = light_info->OriginalParms.range; @@ -3063,7 +3063,7 @@ static void init_transformed_lights(struct lights_settings *ls,
light = &ls->lights[index];
- wined3d_vec4_transform(&vec4, &light_info->constants.position, &state->transforms[WINED3D_TS_VIEW]); + wined3d_vec4_transform(&vec4, &light_info->position, &state->transforms[WINED3D_TS_VIEW]); *(struct wined3d_vec3 *)&light->position = *(struct wined3d_vec3 *)&vec4; wined3d_vec3_normalise((struct wined3d_vec3 *)&light->position); light->diffuse = light_info->OriginalParms.diffuse; @@ -5020,12 +5020,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, wined3d_texture_decref(device->cursor_texture); device->cursor_texture = NULL; } - for (unsigned int i = 0; i < ARRAY_SIZE(device->push_constants); ++i) - { - if (device->push_constants[i]) - wined3d_buffer_decref(device->push_constants[i]); - device->push_constants[i] = NULL; - } state_unbind_resources(state); }
@@ -5233,8 +5227,6 @@ HRESULT CDECL wined3d_device_reset(struct wined3d_device *device, if (reset_state) { TRACE("Resetting state.\n"); - if (device->inScene) - wined3d_device_end_scene(device); wined3d_device_context_emit_reset_state(&device->cs->c, false); state_cleanup(state);
diff --git a/dlls/wined3d/ffp_gl.c b/dlls/wined3d/ffp_gl.c index f1f995f6e4c..bab0f752df8 100644 --- a/dlls/wined3d/ffp_gl.c +++ b/dlls/wined3d/ffp_gl.c @@ -1035,29 +1035,35 @@ static void shader_bumpenv(struct wined3d_context *context, const struct wined3d
void clipplane(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { - context->constant_update_mask |= WINED3D_SHADER_CONST_VS_CLIP_PLANES; -} + const struct wined3d_gl_info *gl_info = wined3d_context_gl(context)->gl_info; + UINT index = state_id - STATE_CLIPPLANE(0); + GLdouble plane[4];
-void ffp_vertex_update_clip_plane_constants(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state) -{ - for (unsigned int i = 0; i < gl_info->limits.user_clip_distances; ++i) - { - GLdouble plane[4]; + if (index >= gl_info->limits.user_clip_distances) + return; + + gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW); + gl_info->gl_ops.gl.p_glPushMatrix();
- gl_info->gl_ops.gl.p_glMatrixMode(GL_MODELVIEW); - gl_info->gl_ops.gl.p_glPushMatrix(); + /* Clip Plane settings are affected by the model view in OpenGL, the View transform in direct3d */ + if (!use_vs(state)) + gl_info->gl_ops.gl.p_glLoadMatrixf(&state->transforms[WINED3D_TS_VIEW]._11); + else + /* With vertex shaders, clip planes are not transformed in Direct3D, + * while in OpenGL they are still transformed by the model view matrix. */ gl_info->gl_ops.gl.p_glLoadIdentity();
- plane[0] = state->clip_planes[i].x; - plane[1] = state->clip_planes[i].y; - plane[2] = state->clip_planes[i].z; - plane[3] = state->clip_planes[i].w; + plane[0] = state->clip_planes[index].x; + plane[1] = state->clip_planes[index].y; + plane[2] = state->clip_planes[index].z; + plane[3] = state->clip_planes[index].w;
- gl_info->gl_ops.gl.p_glClipPlane(GL_CLIP_PLANE0 + i, plane); - checkGLcall("glClipPlane"); + TRACE("Clipplane [%.8e, %.8e, %.8e, %.8e]\n", + plane[0], plane[1], plane[2], plane[3]); + gl_info->gl_ops.gl.p_glClipPlane(GL_CLIP_PLANE0 + index, plane); + checkGLcall("glClipPlane");
- gl_info->gl_ops.gl.p_glPopMatrix(); - } + gl_info->gl_ops.gl.p_glPopMatrix(); }
static void streamsrc(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) @@ -1673,7 +1679,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) { 39, 40}, { 42, 47}, { 49, 135}, - {138, 139}, + {138, 138}, {144, 144}, {149, 150}, {153, 153}, @@ -1711,6 +1717,7 @@ static void validate_state_table(struct wined3d_state_entry *state_table) STATE_BASEVERTEXINDEX, STATE_FRAMEBUFFER, STATE_POINT_ENABLE, + STATE_COLOR_KEY, STATE_BLEND, STATE_BLEND_FACTOR, STATE_DEPTH_STENCIL, diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 3fe7640106f..3c97eebe124 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -1477,6 +1477,18 @@ static void reset_program_constant_version(struct wine_rb_entry *entry, void *co WINE_RB_ENTRY_VALUE(entry, struct glsl_shader_prog_link, program_lookup_entry)->constant_version = 0; }
+static void transpose_matrix(struct wined3d_matrix *out, const struct wined3d_matrix *m) +{ + struct wined3d_matrix temp; + unsigned int i, j; + + for (i = 0; i < 4; ++i) + for (j = 0; j < 4; ++j) + (&temp._11)[4 * j + i] = (&m->_11)[4 * i + j]; + + *out = temp; +} + static void shader_glsl_ffp_vertex_normalmatrix_uniform(const struct wined3d_context_gl *context_gl, const struct wined3d_state *state, struct glsl_shader_prog_link *prog) { @@ -1495,17 +1507,18 @@ static void shader_glsl_ffp_vertex_normalmatrix_uniform(const struct wined3d_con }
static void shader_glsl_ffp_vertex_texmatrix_uniform(const struct wined3d_context_gl *context_gl, - const struct wined3d_ffp_vs_constants *constants, unsigned int tex, struct glsl_shader_prog_link *prog) + const struct wined3d_state *state, unsigned int tex, struct glsl_shader_prog_link *prog) { const struct wined3d_gl_info *gl_info = context_gl->gl_info; + struct wined3d_matrix mat;
if (tex >= WINED3D_MAX_FFP_TEXTURES) return; if (prog->vs.texture_matrix_location[tex] == -1) return;
- GL_EXTCALL(glUniformMatrix4fv(prog->vs.texture_matrix_location[tex], - 1, FALSE, &constants->texture_matrices[tex]._11)); + get_texture_matrix(&context_gl->c, state, tex, &mat); + GL_EXTCALL(glUniformMatrix4fv(prog->vs.texture_matrix_location[tex], 1, FALSE, &mat._11)); checkGLcall("glUniformMatrix4fv"); }
@@ -1522,50 +1535,68 @@ static void shader_glsl_ffp_vertex_material_uniform(const struct wined3d_context checkGLcall("setting FFP material uniforms"); }
+static void shader_glsl_ffp_vertex_lightambient_uniform(const struct wined3d_context_gl *context_gl, + const struct wined3d_state *state, struct glsl_shader_prog_link *prog) +{ + const struct wined3d_gl_info *gl_info = context_gl->gl_info; + struct wined3d_color color; + + wined3d_color_from_d3dcolor(&color, state->render_states[WINED3D_RS_AMBIENT]); + GL_EXTCALL(glUniform3fv(prog->vs.light_ambient_location, 1, &color.r)); + checkGLcall("glUniform3fv"); +} + static void shader_glsl_ffp_vertex_light_uniform(const struct wined3d_context_gl *context_gl, - const struct wined3d_state *state, unsigned int light, enum wined3d_light_type type, - const struct wined3d_light_constants *constants, struct glsl_shader_prog_link *prog) + const struct wined3d_state *state, unsigned int light, const struct wined3d_light_info *light_info, + struct glsl_shader_prog_link *prog) { + const struct wined3d_matrix *view = &state->transforms[WINED3D_TS_VIEW]; const struct wined3d_gl_info *gl_info = context_gl->gl_info; + struct wined3d_vec4 vec4;
- GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].diffuse, 1, &constants->diffuse.r)); - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].specular, 1, &constants->specular.r)); - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].ambient, 1, &constants->ambient.r)); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].diffuse, 1, &light_info->OriginalParms.diffuse.r)); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].specular, 1, &light_info->OriginalParms.specular.r)); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].ambient, 1, &light_info->OriginalParms.ambient.r));
- switch (type) + switch (light_info->OriginalParms.type) { case WINED3D_LIGHT_POINT: - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &constants->position.x)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].range, constants->range)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].c_att, constants->const_att)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].l_att, constants->linear_att)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].q_att, constants->quad_att)); + wined3d_vec4_transform(&vec4, &light_info->position, view); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &vec4.x)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].range, light_info->OriginalParms.range)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].c_att, light_info->OriginalParms.attenuation0)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].l_att, light_info->OriginalParms.attenuation1)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].q_att, light_info->OriginalParms.attenuation2)); break;
case WINED3D_LIGHT_SPOT: - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &constants->position.x)); + wined3d_vec4_transform(&vec4, &light_info->position, view); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &vec4.x));
- GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &constants->direction.x)); + wined3d_vec4_transform(&vec4, &light_info->direction, view); + GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &vec4.x));
- GL_EXTCALL(glUniform1f(prog->vs.light_location[light].range, constants->range)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].falloff, constants->falloff)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].c_att, constants->const_att)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].l_att, constants->linear_att)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].q_att, constants->quad_att)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].cos_htheta, constants->cos_half_theta)); - GL_EXTCALL(glUniform1f(prog->vs.light_location[light].cos_hphi, constants->cos_half_phi)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].range, light_info->OriginalParms.range)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].falloff, light_info->OriginalParms.falloff)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].c_att, light_info->OriginalParms.attenuation0)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].l_att, light_info->OriginalParms.attenuation1)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].q_att, light_info->OriginalParms.attenuation2)); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].cos_htheta, cosf(light_info->OriginalParms.theta / 2.0f))); + GL_EXTCALL(glUniform1f(prog->vs.light_location[light].cos_hphi, cosf(light_info->OriginalParms.phi / 2.0f))); break;
case WINED3D_LIGHT_DIRECTIONAL: - GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &constants->direction.x)); + wined3d_vec4_transform(&vec4, &light_info->direction, view); + GL_EXTCALL(glUniform3fv(prog->vs.light_location[light].direction, 1, &vec4.x)); break;
case WINED3D_LIGHT_PARALLELPOINT: - GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &constants->position.x)); + wined3d_vec4_transform(&vec4, &light_info->position, view); + GL_EXTCALL(glUniform4fv(prog->vs.light_location[light].position, 1, &vec4.x)); break;
default: - FIXME("Unrecognized light type %#x.\n", type); + FIXME("Unrecognized light type %#x.\n", light_info->OriginalParms.type); } checkGLcall("setting FFP lights uniforms"); } @@ -1623,8 +1654,31 @@ static void shader_glsl_clip_plane_uniform(const struct wined3d_context_gl *cont const struct wined3d_state *state, unsigned int index, struct glsl_shader_prog_link *prog) { const struct wined3d_gl_info *gl_info = context_gl->gl_info; + struct wined3d_matrix matrix; + struct wined3d_vec4 plane; + + plane = state->clip_planes[index];
- GL_EXTCALL(glUniform4fv(prog->vs.clip_planes_location + index, 1, &state->clip_planes[index].x)); + /* Clip planes are affected by the view transform in d3d for FFP draws. */ + if (!use_vs(state)) + { + invert_matrix(&matrix, &state->transforms[WINED3D_TS_VIEW]); + transpose_matrix(&matrix, &matrix); + wined3d_vec4_transform(&plane, &plane, &matrix); + } + + GL_EXTCALL(glUniform4fv(prog->vs.clip_planes_location + index, 1, &plane.x)); +} + +/* Context activation is done by the caller (state handler). */ +static void shader_glsl_load_color_key_constant(const struct glsl_ps_program *ps, + const struct wined3d_gl_info *gl_info, const struct wined3d_state *state) +{ + struct wined3d_color float_key[2]; + const struct wined3d_texture *texture = wined3d_state_get_ffp_texture(state, 0); + + wined3d_format_get_float_color_key(texture->resource.format, &texture->async.src_blt_color_key, float_key); + GL_EXTCALL(glUniform4fv(ps->color_key_location, 2, &float_key[0].r)); }
static void shader_glsl_load_constants(struct shader_glsl_priv *priv, @@ -1663,15 +1717,8 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv,
if (update_mask & WINED3D_SHADER_CONST_VS_CLIP_PLANES) { - if (gl_info->supported[WINED3D_GLSL_130]) - { - for (i = 0; i < gl_info->limits.user_clip_distances; ++i) - shader_glsl_clip_plane_uniform(context_gl, state, i, prog); - } - else - { - ffp_vertex_update_clip_plane_constants(gl_info, state); - } + for (i = 0; i < gl_info->limits.user_clip_distances; ++i) + shader_glsl_clip_plane_uniform(context_gl, state, i, prog); }
if (update_mask & WINED3D_SHADER_CONST_VS_POINTSIZE) @@ -1734,12 +1781,8 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv,
if (update_mask & WINED3D_SHADER_CONST_FFP_TEXMATRIX) { - const struct wined3d_ffp_vs_constants *constants; - - constants = wined3d_buffer_load_sysmem(context->device->push_constants[WINED3D_PUSH_CONSTANTS_VS_FFP], context); - for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) - shader_glsl_ffp_vertex_texmatrix_uniform(context_gl, constants, i, prog); + shader_glsl_ffp_vertex_texmatrix_uniform(context_gl, state, i, prog); }
if (update_mask & WINED3D_SHADER_CONST_FFP_MATERIAL) @@ -1747,13 +1790,10 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv,
if (update_mask & WINED3D_SHADER_CONST_FFP_LIGHTS) { - const struct wined3d_ffp_vs_constants *constants; + unsigned int point_idx, spot_idx, directional_idx, parallel_point_idx; DWORD point_count = 0; DWORD spot_count = 0; DWORD directional_count = 0; - DWORD parallel_point_count = 0; - - constants = wined3d_buffer_load_sysmem(context->device->push_constants[WINED3D_PUSH_CONSTANTS_VS_FFP], context);
for (i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) { @@ -1772,29 +1812,46 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, ++directional_count; break; case WINED3D_LIGHT_PARALLELPOINT: - ++parallel_point_count; break; default: FIXME("Unhandled light type %#x.\n", state->light_state.lights[i]->OriginalParms.type); break; } } + point_idx = 0; + spot_idx = point_idx + point_count; + directional_idx = spot_idx + spot_count; + parallel_point_idx = directional_idx + directional_count; + + shader_glsl_ffp_vertex_lightambient_uniform(context_gl, state, prog); + for (i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) + { + const struct wined3d_light_info *light_info = state->light_state.lights[i]; + unsigned int idx;
- GL_EXTCALL(glUniform3fv(prog->vs.light_ambient_location, 1, &constants->light.ambient.r)); - checkGLcall("glUniform3fv"); + if (!light_info) + continue;
- for (i = 0; i < point_count; ++i) - shader_glsl_ffp_vertex_light_uniform(context_gl, state, i, - WINED3D_LIGHT_POINT, &constants->light.lights[i], prog); - for (; i < point_count + spot_count; ++i) - shader_glsl_ffp_vertex_light_uniform(context_gl, state, i, - WINED3D_LIGHT_SPOT, &constants->light.lights[i], prog); - for (; i < point_count + spot_count + directional_count; ++i) - shader_glsl_ffp_vertex_light_uniform(context_gl, state, i, - WINED3D_LIGHT_DIRECTIONAL, &constants->light.lights[i], prog); - for (; i < point_count + spot_count + directional_count + parallel_point_count; ++i) - shader_glsl_ffp_vertex_light_uniform(context_gl, state, i, - WINED3D_LIGHT_PARALLELPOINT, &constants->light.lights[i], prog); + switch (light_info->OriginalParms.type) + { + case WINED3D_LIGHT_POINT: + idx = point_idx++; + break; + case WINED3D_LIGHT_SPOT: + idx = spot_idx++; + break; + case WINED3D_LIGHT_DIRECTIONAL: + idx = directional_idx++; + break; + case WINED3D_LIGHT_PARALLELPOINT: + idx = parallel_point_idx++; + break; + default: + FIXME("Unhandled light type %#x.\n", light_info->OriginalParms.type); + continue; + } + shader_glsl_ffp_vertex_light_uniform(context_gl, state, idx, light_info, prog); + } }
if (update_mask & WINED3D_SHADER_CONST_PS_F) @@ -1832,12 +1889,7 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, }
if (update_mask & WINED3D_SHADER_CONST_FFP_COLOR_KEY) - { - const struct wined3d_ffp_ps_constants *constants = wined3d_buffer_load_sysmem( - context_gl->c.device->push_constants[WINED3D_PUSH_CONSTANTS_PS_FFP], &context_gl->c); - - GL_EXTCALL(glUniform4fv(prog->ps.color_key_location, 2, &constants->color_key[0].r)); - } + shader_glsl_load_color_key_constant(&prog->ps, gl_info, state);
if (update_mask & WINED3D_SHADER_CONST_FFP_PS) { @@ -1849,7 +1901,10 @@ static void shader_glsl_load_constants(struct shader_glsl_priv *priv, if (prog->ps.tex_factor_location != -1) GL_EXTCALL(glUniform4fv(prog->ps.tex_factor_location, 1, &constants->texture_factor.r));
- GL_EXTCALL(glUniform4fv(prog->ps.specular_enable_location, 1, &constants->specular_enable.r)); + if (state->render_states[WINED3D_RS_SPECULARENABLE]) + GL_EXTCALL(glUniform4f(prog->ps.specular_enable_location, 1.0f, 1.0f, 1.0f, 0.0f)); + else + GL_EXTCALL(glUniform4f(prog->ps.specular_enable_location, 0.0f, 0.0f, 0.0f, 0.0f));
for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) { @@ -9192,52 +9247,46 @@ static GLuint shader_glsl_generate_ffp_vertex_shader(struct shader_glsl_priv *pr
for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) { - struct wined3d_string_buffer *texcoord = string_buffer_get(&priv->string_buffers); - bool output_texcoord = true; - - if (!settings->transformed) - shader_addline(texcoord, "ffp_texture_matrix[%u] * ", i); + BOOL output_legacy_texcoord = legacy_syntax;
switch (settings->texgen[i] & 0xffff0000) { case WINED3DTSS_TCI_PASSTHRU: if (settings->texcoords & (1u << i)) - shader_addline(texcoord, "ffp_attrib_texcoord%u", i); + shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u] * ffp_attrib_texcoord%u;\n", + i, i, i); else if (shader_glsl_full_ffp_varyings(gl_info)) - shader_addline(texcoord, "vec4(0.0)"); + shader_addline(buffer, "ffp_varying_texcoord[%u] = vec4(0.0);\n", i); else - output_texcoord = false; + output_legacy_texcoord = FALSE; break;
case WINED3DTSS_TCI_CAMERASPACENORMAL: - shader_addline(texcoord, "vec4(normal, 1.0)"); + shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u] * vec4(normal, 1.0);\n", i, i); break;
case WINED3DTSS_TCI_CAMERASPACEPOSITION: - shader_addline(texcoord, "ec_pos"); + shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u] * ec_pos;\n", i, i); break;
case WINED3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR: - shader_addline(texcoord, "vec4(reflect(ffp_normalize(ec_pos.xyz), normal), 1.0)"); + shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u]" + " * vec4(reflect(ffp_normalize(ec_pos.xyz), normal), 1.0);\n", i, i); break;
case WINED3DTSS_TCI_SPHEREMAP: shader_addline(buffer, "r = reflect(ffp_normalize(ec_pos.xyz), normal);\n"); shader_addline(buffer, "m = 2.0 * length(vec3(r.x, r.y, r.z + 1.0));\n"); - shader_addline(texcoord, "vec4(r.x / m + 0.5, r.y / m + 0.5, 0.0, 1.0)"); + shader_addline(buffer, "ffp_varying_texcoord[%u] = ffp_texture_matrix[%u]" + " * vec4(r.x / m + 0.5, r.y / m + 0.5, 0.0, 1.0);\n", i, i); break;
default: ERR("Unhandled texgen %#x.\n", settings->texgen[i]); break; } - if (output_texcoord) - { - shader_addline(buffer, "ffp_varying_texcoord[%u] = %s;\n", i, texcoord->buffer); - if (legacy_syntax) - shader_addline(buffer, "gl_TexCoord[%u] = ffp_varying_texcoord[%u];\n", i, i); - } - string_buffer_release(&priv->string_buffers, texcoord); + if (output_legacy_texcoord) + shader_addline(buffer, "gl_TexCoord[%u] = ffp_varying_texcoord[%u];\n", i, i); }
switch (settings->fog_mode) @@ -11712,12 +11761,14 @@ static void glsl_vertex_pipe_vdecl(struct wined3d_context *context, const struct wined3d_vertex_declaration *vdecl = state->vertex_declaration; struct wined3d_context_gl *context_gl = wined3d_context_gl(context); const struct wined3d_gl_info *gl_info = context_gl->gl_info; + const BOOL legacy_clip_planes = needs_legacy_glsl_syntax(gl_info); BOOL transformed = context->stream_info.position_transformed; BOOL wasrhw = context->last_was_rhw; bool point_size = vdecl && vdecl->point_size; bool specular = vdecl && vdecl->specular; bool diffuse = vdecl && vdecl->diffuse; bool normal = vdecl && vdecl->normal; + unsigned int i;
context->last_was_rhw = transformed;
@@ -11732,6 +11783,17 @@ static void glsl_vertex_pipe_vdecl(struct wined3d_context *context,
if (!use_vs(state)) { + if (context->last_was_vshader) + { + if (legacy_clip_planes) + for (i = 0; i < gl_info->limits.user_clip_distances; ++i) + clipplane(context, state, STATE_CLIPPLANE(i)); + else + context->constant_update_mask |= WINED3D_SHADER_CONST_VS_CLIP_PLANES; + } + + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_TEXMATRIX; + /* Because of settings->texcoords, we have to regenerate the vertex * shader on a vdecl change if there aren't enough varyings to just * always output all the texture coordinates. @@ -11749,6 +11811,18 @@ static void glsl_vertex_pipe_vdecl(struct wined3d_context *context, && state->shader[WINED3D_SHADER_TYPE_PIXEL]->reg_maps.shader_version.minor <= 3) context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; } + else + { + if (!context->last_was_vshader) + { + /* Vertex shader clipping ignores the view matrix. Update all clip planes. */ + if (legacy_clip_planes) + for (i = 0; i < gl_info->limits.user_clip_distances; ++i) + clipplane(context, state, STATE_CLIPPLANE(i)); + else + context->constant_update_mask |= WINED3D_SHADER_CONST_VS_CLIP_PLANES; + } + }
context->last_was_vshader = use_vs(state); context->last_was_diffuse = diffuse; @@ -11822,8 +11896,26 @@ static void glsl_vertex_pipe_vertexblend(struct wined3d_context *context,
static void glsl_vertex_pipe_view(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { + struct wined3d_context_gl *context_gl = wined3d_context_gl(context); + const struct wined3d_gl_info *gl_info = context_gl->gl_info; + unsigned int k; + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MODELVIEW + | WINED3D_SHADER_CONST_FFP_LIGHTS | WINED3D_SHADER_CONST_FFP_VERTEXBLEND; + + if (needs_legacy_glsl_syntax(gl_info)) + { + for (k = 0; k < gl_info->limits.user_clip_distances; ++k) + { + if (!isStateDirty(context, STATE_CLIPPLANE(k))) + clipplane(context, state, STATE_CLIPPLANE(k)); + } + } + else + { + context->constant_update_mask |= WINED3D_SHADER_CONST_VS_CLIP_PLANES; + } }
static void glsl_vertex_pipe_projection(struct wined3d_context *context, @@ -11847,12 +11939,24 @@ static void glsl_vertex_pipe_viewport(struct wined3d_context *context, context->constant_update_mask |= WINED3D_SHADER_CONST_POS_FIXUP; }
+static void glsl_vertex_pipe_texmatrix(struct wined3d_context *context, + const struct wined3d_state *state, DWORD state_id) +{ + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_TEXMATRIX; +} + static void glsl_vertex_pipe_material(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_MATERIAL; }
+static void glsl_vertex_pipe_light(struct wined3d_context *context, + const struct wined3d_state *state, DWORD state_id) +{ + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_LIGHTS; +} + static void glsl_vertex_pipe_pointsize(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -11922,15 +12026,39 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_CLIPPLANE(7), {STATE_CLIPPLANE(7), clipplane }, WINED3D_GL_EXT_NONE }, /* Lights */ {STATE_LIGHT_TYPE, {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(0), {STATE_ACTIVELIGHT(0), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(1), {STATE_ACTIVELIGHT(1), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(2), {STATE_ACTIVELIGHT(2), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(3), {STATE_ACTIVELIGHT(3), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(4), {STATE_ACTIVELIGHT(4), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(5), {STATE_ACTIVELIGHT(5), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(6), {STATE_ACTIVELIGHT(6), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, + {STATE_ACTIVELIGHT(7), {STATE_ACTIVELIGHT(7), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, /* Viewport */ {STATE_VIEWPORT, {STATE_VIEWPORT, glsl_vertex_pipe_viewport}, WINED3D_GL_EXT_NONE }, /* Transform states */ {STATE_TRANSFORM(WINED3D_TS_VIEW), {STATE_TRANSFORM(WINED3D_TS_VIEW), glsl_vertex_pipe_view }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_PROJECTION), {STATE_TRANSFORM(WINED3D_TS_PROJECTION), glsl_vertex_pipe_projection}, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE0), {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE1), {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE2), {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE3), {STATE_TEXTURESTAGE(3, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE4), {STATE_TEXTURESTAGE(4, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE5), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE6), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_TRANSFORM(WINED3D_TS_TEXTURE7), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)), {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(0)), glsl_vertex_pipe_world }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(1)), {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(1)), glsl_vertex_pipe_vertexblend }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(2)), {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(2)), glsl_vertex_pipe_vertexblend }, WINED3D_GL_EXT_NONE }, {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(3)), {STATE_TRANSFORM(WINED3D_TS_WORLD_MATRIX(3)), glsl_vertex_pipe_vertexblend }, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(3, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(3, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(4, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(4, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, + {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_vertex_pipe_texmatrix}, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(0, WINED3D_TSS_TEXCOORD_INDEX), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(1, WINED3D_TSS_TEXCOORD_INDEX), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(2, WINED3D_TSS_TEXCOORD_INDEX), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, @@ -11947,6 +12075,7 @@ static const struct wined3d_state_entry_template glsl_vertex_pipe_vp_states[] = {STATE_RENDER(WINED3D_RS_CLIPPING), {STATE_RENDER(WINED3D_RS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_CLIPPLANEENABLE), {STATE_RENDER(WINED3D_RS_CLIPPING), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_LIGHTING), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_RENDER(WINED3D_RS_AMBIENT), {STATE_RENDER(WINED3D_RS_AMBIENT), glsl_vertex_pipe_light }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_COLORVERTEX), {STATE_RENDER(WINED3D_RS_COLORVERTEX), glsl_vertex_pipe_shader}, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_LOCALVIEWER), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), {STATE_SHADER(WINED3D_SHADER_TYPE_VERTEX), NULL }, WINED3D_GL_EXT_NONE }, @@ -12157,6 +12286,12 @@ static void glsl_fragment_pipe_tex_transform(struct wined3d_context *context, context->shader_update_mask |= 1u << WINED3D_SHADER_TYPE_PIXEL; }
+static void glsl_fragment_pipe_invalidate_constants(struct wined3d_context *context, + const struct wined3d_state *state, DWORD state_id) +{ + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_PS; +} + static void glsl_fragment_pipe_alpha_test_func(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -12200,6 +12335,12 @@ static void glsl_fragment_pipe_core_alpha_test_ref(struct wined3d_context *conte context->constant_update_mask |= WINED3D_SHADER_CONST_PS_ALPHA_TEST; }
+static void glsl_fragment_pipe_color_key(struct wined3d_context *context, + const struct wined3d_state *state, DWORD state_id) +{ + context->constant_update_mask |= WINED3D_SHADER_CONST_FFP_COLOR_KEY; +} + static void glsl_fragment_pipe_shademode(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id) { @@ -12290,6 +12431,7 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), glsl_fragment_pipe_alpha_test }, WINED3D_GL_LEGACY_CONTEXT}, {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), {STATE_RENDER(WINED3D_RS_ALPHATESTENABLE), glsl_fragment_pipe_core_alpha_test }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_COLORKEYENABLE), {STATE_SHADER(WINED3D_SHADER_TYPE_PIXEL), NULL }, WINED3D_GL_EXT_NONE }, + {STATE_COLOR_KEY, { STATE_COLOR_KEY, glsl_fragment_pipe_color_key }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), glsl_fragment_pipe_fog }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGTABLEMODE), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_FOGVERTEXMODE), {STATE_RENDER(WINED3D_RS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE }, @@ -12309,6 +12451,7 @@ static const struct wined3d_state_entry_template glsl_fragment_pipe_state_templa {STATE_TEXTURESTAGE(5,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(5, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(6,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(6, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, {STATE_TEXTURESTAGE(7,WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), {STATE_TEXTURESTAGE(7, WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS), glsl_fragment_pipe_tex_transform }, WINED3D_GL_EXT_NONE }, + {STATE_RENDER(WINED3D_RS_SPECULARENABLE), {STATE_RENDER(WINED3D_RS_SPECULARENABLE), glsl_fragment_pipe_invalidate_constants}, WINED3D_GL_EXT_NONE }, {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, glsl_fragment_pipe_shader }, WINED3D_GL_EXT_NONE }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), glsl_fragment_pipe_shademode }, WINED3D_GLSL_130 }, {STATE_RENDER(WINED3D_RS_SHADEMODE), {STATE_RENDER(WINED3D_RS_SHADEMODE), state_shademode }, WINED3D_GL_EXT_NONE }, diff --git a/dlls/wined3d/shader_spirv.c b/dlls/wined3d/shader_spirv.c index a4b311ae8d2..b4ef9f61f43 100644 --- a/dlls/wined3d/shader_spirv.c +++ b/dlls/wined3d/shader_spirv.c @@ -1160,6 +1160,7 @@ static const struct wined3d_state_entry_template spirv_vertex_pipe_vk_vp_states[ {STATE_RENDER(WINED3D_RS_RANGEFOGENABLE), {STATE_RENDER(WINED3D_RS_RANGEFOGENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_CLIPPING), {STATE_RENDER(WINED3D_RS_CLIPPING), state_nop}}, {STATE_RENDER(WINED3D_RS_LIGHTING), {STATE_RENDER(WINED3D_RS_LIGHTING), state_nop}}, + {STATE_RENDER(WINED3D_RS_AMBIENT), {STATE_RENDER(WINED3D_RS_AMBIENT), state_nop}}, {STATE_RENDER(WINED3D_RS_COLORVERTEX), {STATE_RENDER(WINED3D_RS_COLORVERTEX), state_nop}}, {STATE_RENDER(WINED3D_RS_LOCALVIEWER), {STATE_RENDER(WINED3D_RS_LOCALVIEWER), state_nop}}, {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), {STATE_RENDER(WINED3D_RS_NORMALIZENORMALS), state_nop}}, @@ -1252,6 +1253,7 @@ static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_state {STATE_RENDER(WINED3D_RS_ALPHAREF), {STATE_RENDER(WINED3D_RS_ALPHAREF), state_nop}}, {STATE_RENDER(WINED3D_RS_ALPHAFUNC), {STATE_RENDER(WINED3D_RS_ALPHAFUNC), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGENABLE), {STATE_RENDER(WINED3D_RS_FOGENABLE), state_nop}}, + {STATE_RENDER(WINED3D_RS_SPECULARENABLE), {STATE_RENDER(WINED3D_RS_SPECULARENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGCOLOR), {STATE_RENDER(WINED3D_RS_FOGCOLOR), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGTABLEMODE), {STATE_RENDER(WINED3D_RS_FOGTABLEMODE), state_nop}}, {STATE_RENDER(WINED3D_RS_FOGSTART), {STATE_RENDER(WINED3D_RS_FOGSTART), state_nop}}, @@ -1262,6 +1264,7 @@ static const struct wined3d_state_entry_template spirv_fragment_pipe_vk_fp_state {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), {STATE_RENDER(WINED3D_RS_POINTSPRITEENABLE), state_nop}}, {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), {STATE_RENDER(WINED3D_RS_SRGBWRITEENABLE), state_nop}}, {STATE_POINT_ENABLE, {STATE_POINT_ENABLE, state_nop}}, + {STATE_COLOR_KEY, {STATE_COLOR_KEY, state_nop}}, {0}, /* Terminate */ };
diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index 0d5d62359f7..28aa2a46f08 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -61,7 +61,6 @@ struct wined3d_saved_states /* Flags only consumed by wined3d_device_apply_stateblock(), concerned with * translation from stateblock formats to wined3d_state formats. */ uint32_t ffp_ps_constants : 1; - uint32_t texture_matrices : 1; };
struct stage_state @@ -250,19 +249,6 @@ static const DWORD vertex_states_sampler[] = WINED3D_SAMP_DMAP_OFFSET, };
-static void transpose_matrix(struct wined3d_matrix *out, const struct wined3d_matrix *m) -{ - struct wined3d_matrix temp; - - for (unsigned int i = 0; i < 4; ++i) - { - for (unsigned int j = 0; j < 4; ++j) - (&temp._11)[4 * j + i] = (&m->_11)[4 * i + j]; - } - - *out = temp; -} - static inline void stateblock_set_all_bits(uint32_t *map, UINT map_size) { DWORD mask = (1u << (map_size & 0x1f)) - 1; @@ -675,7 +661,6 @@ static void set_light_changed(struct wined3d_stateblock *stateblock, struct wine static HRESULT wined3d_light_state_set_light(struct wined3d_light_state *state, unsigned int light_idx, const struct wined3d_light *params, struct wined3d_light_info **light_info) { - struct wined3d_light_constants *constants; struct wined3d_light_info *object;
if (!(object = wined3d_light_state_get_light(state, light_idx))) @@ -692,8 +677,6 @@ static HRESULT wined3d_light_state_set_light(struct wined3d_light_state *state, rb_put(&state->lights_tree, (void *)(ULONG_PTR)light_idx, &object->entry); }
- constants = &object->constants; - object->OriginalParms = *params;
/* Initialize the object. */ @@ -706,58 +689,46 @@ static HRESULT wined3d_light_state_set_light(struct wined3d_light_state *state, params->direction.x, params->direction.y, params->direction.z, params->range, params->falloff, params->theta, params->phi);
- constants->diffuse = params->diffuse; - constants->specular = params->specular; - constants->ambient = params->ambient; - - constants->range = params->range; - constants->falloff = params->falloff; - constants->const_att = params->attenuation0; - constants->linear_att = params->attenuation1; - constants->quad_att = params->attenuation2; - constants->cos_half_theta = cosf(params->theta / 2.0f); - constants->cos_half_phi = cosf(params->phi / 2.0f); - switch (params->type) { case WINED3D_LIGHT_POINT: /* Position */ - constants->position.x = params->position.x; - constants->position.y = params->position.y; - constants->position.z = params->position.z; - constants->position.w = 1.0f; + object->position.x = params->position.x; + object->position.y = params->position.y; + object->position.z = params->position.z; + object->position.w = 1.0f; /* FIXME: Range */ break;
case WINED3D_LIGHT_DIRECTIONAL: /* Direction */ - constants->direction.x = -params->direction.x; - constants->direction.y = -params->direction.y; - constants->direction.z = -params->direction.z; - constants->direction.w = 0.0f; + object->direction.x = -params->direction.x; + object->direction.y = -params->direction.y; + object->direction.z = -params->direction.z; + object->direction.w = 0.0f; break;
case WINED3D_LIGHT_SPOT: /* Position */ - constants->position.x = params->position.x; - constants->position.y = params->position.y; - constants->position.z = params->position.z; - constants->position.w = 1.0f; + object->position.x = params->position.x; + object->position.y = params->position.y; + object->position.z = params->position.z; + object->position.w = 1.0f;
/* Direction */ - constants->direction.x = params->direction.x; - constants->direction.y = params->direction.y; - constants->direction.z = params->direction.z; - constants->direction.w = 0.0f; + object->direction.x = params->direction.x; + object->direction.y = params->direction.y; + object->direction.z = params->direction.z; + object->direction.w = 0.0f;
/* FIXME: Range */ break;
case WINED3D_LIGHT_PARALLELPOINT: - constants->position.x = params->position.x; - constants->position.y = params->position.y; - constants->position.z = params->position.z; - constants->position.w = 1.0f; + object->position.x = params->position.x; + object->position.y = params->position.y; + object->position.z = params->position.z; + object->position.w = 1.0f; break;
default: @@ -1545,10 +1516,6 @@ void CDECL wined3d_stateblock_set_vertex_declaration(struct wined3d_stateblock * wined3d_vertex_declaration_decref(stateblock->stateblock_state.vertex_declaration); stateblock->stateblock_state.vertex_declaration = declaration; stateblock->changed.vertexDecl = TRUE; - /* Texture matrices depend on the format of the TEXCOORD attributes. */ - /* FIXME: They also depend on whether the draw is pretransformed, - * but that should go away. */ - stateblock->changed.texture_matrices = TRUE; }
void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateblock, @@ -1575,7 +1542,6 @@ void CDECL wined3d_stateblock_set_render_state(struct wined3d_stateblock *stateb } break;
- case WINED3D_RS_SPECULARENABLE: case WINED3D_RS_TEXTUREFACTOR: stateblock->changed.ffp_ps_constants = 1; break; @@ -1623,20 +1589,8 @@ void CDECL wined3d_stateblock_set_texture_stage_state(struct wined3d_stateblock stateblock->stateblock_state.texture_states[stage][state] = value; stateblock->changed.textureState[stage] |= 1u << state;
- switch (state) - { - case WINED3D_TSS_CONSTANT: - stateblock->changed.ffp_ps_constants = 1; - break; - - case WINED3D_TSS_TEXCOORD_INDEX: - case WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS: - stateblock->changed.texture_matrices = 1; - break; - - default: - break; - } + if (state == WINED3D_TSS_CONSTANT) + stateblock->changed.ffp_ps_constants = 1; }
void CDECL wined3d_stateblock_set_texture(struct wined3d_stateblock *stateblock, @@ -1670,9 +1624,6 @@ void CDECL wined3d_stateblock_set_transform(struct wined3d_stateblock *statebloc stateblock->stateblock_state.transforms[d3dts] = *matrix; stateblock->changed.transform[d3dts >> 5] |= 1u << (d3dts & 0x1f); stateblock->changed.transforms = 1; - - if (d3dts >= WINED3D_TS_TEXTURE0 && d3dts <= WINED3D_TS_TEXTURE7) - stateblock->changed.texture_matrices = 1; }
void CDECL wined3d_stateblock_multiply_transform(struct wined3d_stateblock *stateblock, @@ -2242,16 +2193,6 @@ static void wined3d_stateblock_state_init(struct wined3d_stateblock_state *state
}
-/* FFP push constant buffers do not have a "default" state on the CS side. - * We need to explicitly invalidate them when initializing the context or - * resetting. */ -static void wined3d_stateblock_invalidate_push_constants(struct wined3d_stateblock *stateblock) -{ - stateblock->changed.ffp_ps_constants = 1; - stateblock->changed.lights = 1; - stateblock->changed.texture_matrices = 1; -} - static HRESULT stateblock_init(struct wined3d_stateblock *stateblock, const struct wined3d_stateblock *device_state, struct wined3d_device *device, enum wined3d_stateblock_type type) { @@ -2266,7 +2207,9 @@ static HRESULT stateblock_init(struct wined3d_stateblock *stateblock, const stru stateblock->changed.store_stream_offset = 1; list_init(&stateblock->changed.changed_lights);
- wined3d_stateblock_invalidate_push_constants(stateblock); + /* FFP push constant buffers need to be set if used; the backend does not + * have a default state for them. */ + stateblock->changed.ffp_ps_constants = 1;
if (type == WINED3D_SBT_RECORDED || type == WINED3D_SBT_PRIMARY) return WINED3D_OK; @@ -2343,7 +2286,6 @@ void CDECL wined3d_stateblock_reset(struct wined3d_stateblock *stateblock) memset(&stateblock->stateblock_state, 0, sizeof(stateblock->stateblock_state)); stateblock->stateblock_state.light_state = &stateblock->light_state; wined3d_stateblock_state_init(&stateblock->stateblock_state, stateblock->device, WINED3D_STATE_INIT_DEFAULT); - wined3d_stateblock_invalidate_push_constants(stateblock); }
static void wined3d_device_set_base_vertex_index(struct wined3d_device *device, int base_index) @@ -2732,8 +2674,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, bool set_blend_state = false, set_depth_stencil_state = false, set_rasterizer_state = false;
const struct wined3d_stateblock_state *state = &stateblock->stateblock_state; + const struct wined3d_saved_states *changed = &stateblock->changed; const unsigned int word_bit_count = sizeof(DWORD) * CHAR_BIT; - struct wined3d_saved_states *changed = &stateblock->changed; struct wined3d_device_context *context = &device->cs->c; unsigned int i, j, start, idx; bool set_depth_bounds = false; @@ -2743,12 +2685,7 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, TRACE("device %p, stateblock %p.\n", device, stateblock);
if (changed->vertexShader) - { wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_VERTEX, state->vs); - /* Clip planes are affected by the view matrix, but only if not using - * vertex shaders. */ - changed->clipplane = wined3d_mask_from_size(WINED3D_MAX_CLIP_DISTANCES); - } if (changed->pixelShader) wined3d_device_context_set_shader(context, WINED3D_SHADER_TYPE_PIXEL, state->ps);
@@ -2804,6 +2741,19 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, wined3d_device_set_ps_consts_b(device, range.offset, range.size, &state->ps_consts_b[range.offset]); }
+ if (changed->lights) + { + struct wined3d_light_info *light, *cursor; + + LIST_FOR_EACH_ENTRY_SAFE(light, cursor, &changed->changed_lights, struct wined3d_light_info, changed_entry) + { + wined3d_device_context_set_light(context, light->OriginalIndex, &light->OriginalParms); + wined3d_device_set_light_enable(device, light->OriginalIndex, light->glIndex != -1); + list_remove(&light->changed_entry); + light->changed = false; + } + } + for (i = 0; i < ARRAY_SIZE(changed->renderState); ++i) { map = changed->renderState[i]; @@ -2865,10 +2815,6 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, set_depth_bounds = true; break;
- case WINED3D_RS_AMBIENT: - changed->lights = 1; - break; - case WINED3D_RS_ADAPTIVETESS_Y: case WINED3D_RS_TEXTUREFACTOR: break; @@ -3333,20 +3279,9 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, { j = wined3d_bit_scan(&map); idx = i * word_bit_count + j; - - if (idx == WINED3D_TS_VIEW) - { - changed->lights = 1; - changed->clipplane = wined3d_mask_from_size(WINED3D_MAX_CLIP_DISTANCES); - } - - if (!(idx >= WINED3D_TS_TEXTURE0 && idx <= WINED3D_TS_TEXTURE7)) - wined3d_device_set_transform(device, idx, &state->transforms[idx]); + wined3d_device_set_transform(device, idx, &state->transforms[idx]); } } - - /* Clip planes are affected by the view matrix. */ - changed->clipplane = wined3d_mask_from_size(WINED3D_MAX_CLIP_DISTANCES); }
if (changed->indices) @@ -3371,170 +3306,19 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device, map = changed->textures; while (map) { - struct wined3d_color float_key[2]; - struct wined3d_texture *texture; - i = wined3d_bit_scan(&map); - texture = state->textures[i]; - wined3d_device_set_texture(device, i, texture); - - if (!i && texture && (texture->color_key_flags & WINED3D_CKEY_SRC_BLT)) - { - wined3d_format_get_float_color_key(texture->resource.format, &texture->src_blt_color_key, float_key); - wined3d_device_context_push_constants(context, - WINED3D_PUSH_CONSTANTS_PS_FFP, WINED3D_SHADER_CONST_FFP_COLOR_KEY, - offsetof(struct wined3d_ffp_ps_constants, color_key), sizeof(float_key), float_key); - } + wined3d_device_set_texture(device, i, state->textures[i]); }
map = changed->clipplane; while (map) { i = wined3d_bit_scan(&map); - - /* In Direct3D, clipping is done based on the position as transformed - * by the world (model) matrix, but not the view matrix. - * - * GL and Vulkan do not distinguish the world and view, so we pass them - * as a single uniform. That means, however, that we need to unapply the - * view matrix from the clip planes that we are applying. We do this by - * multiplying by the transpose of the inverse of the view matrix. - * - * This works mathematically (c = clip plane, p = position): - * - * clip distance = dot((V⁻¹)ᵀc, VMp) - * = ((V⁻¹)ᵀc)ᵀVMp - * = cᵀV⁻¹VMp - * = cᵀMp - * = dot(c, Mp) - */ - - if (!state->vs) - { - struct wined3d_matrix matrix; - struct wined3d_vec4 plane; - - invert_matrix(&matrix, &state->transforms[WINED3D_TS_VIEW]); - transpose_matrix(&matrix, &matrix); - wined3d_vec4_transform(&plane, &state->clip_planes[i], &matrix); - wined3d_device_set_clip_plane(device, i, &plane); - } - else - { - wined3d_device_set_clip_plane(device, i, &state->clip_planes[i]); - } - } - - if (changed->lights) - { - unsigned int point_idx, spot_idx, directional_idx, parallel_point_idx; - unsigned int point_count = 0, spot_count = 0, directional_count = 0; - struct wined3d_ffp_light_constants constants; - struct wined3d_light_info *light, *cursor; - - LIST_FOR_EACH_ENTRY_SAFE(light, cursor, &changed->changed_lights, struct wined3d_light_info, changed_entry) - { - wined3d_device_context_set_light(context, light->OriginalIndex, &light->OriginalParms); - wined3d_device_set_light_enable(device, light->OriginalIndex, light->glIndex != -1); - list_remove(&light->changed_entry); - light->changed = false; - } - - wined3d_color_from_d3dcolor(&constants.ambient, state->rs[WINED3D_RS_AMBIENT]); - - for (unsigned int i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) - { - if (!state->light_state->lights[i]) - continue; - - switch (state->light_state->lights[i]->OriginalParms.type) - { - case WINED3D_LIGHT_POINT: - ++point_count; - break; - case WINED3D_LIGHT_SPOT: - ++spot_count; - break; - case WINED3D_LIGHT_DIRECTIONAL: - ++directional_count; - break; - case WINED3D_LIGHT_PARALLELPOINT: - break; - default: - FIXME("Unhandled light type %#x.\n", state->light_state->lights[i]->OriginalParms.type); - break; - } - } - point_idx = 0; - spot_idx = point_idx + point_count; - directional_idx = spot_idx + spot_count; - parallel_point_idx = directional_idx + directional_count; - - for (unsigned int i = 0; i < WINED3D_MAX_ACTIVE_LIGHTS; ++i) - { - const struct wined3d_light_info *light_info = state->light_state->lights[i]; - const struct wined3d_light_constants *light_constants; - enum wined3d_light_type type; - unsigned int idx; - - if (!light_info) - continue; - type = light_info->OriginalParms.type; - light_constants = &state->light_state->lights[i]->constants; - - switch (type) - { - case WINED3D_LIGHT_POINT: - idx = point_idx++; - break; - case WINED3D_LIGHT_SPOT: - idx = spot_idx++; - break; - case WINED3D_LIGHT_DIRECTIONAL: - idx = directional_idx++; - break; - case WINED3D_LIGHT_PARALLELPOINT: - idx = parallel_point_idx++; - break; - default: - FIXME("Unhandled light type %#x.\n", type); - continue; - } - constants.lights[idx] = *light_constants; - - if (type != WINED3D_LIGHT_DIRECTIONAL) - wined3d_vec4_transform(&constants.lights[idx].position, - &light_constants->position, &state->transforms[WINED3D_TS_VIEW]); - if (type == WINED3D_LIGHT_SPOT || type == WINED3D_LIGHT_DIRECTIONAL) - wined3d_vec4_transform(&constants.lights[idx].direction, - &light_constants->direction, &state->transforms[WINED3D_TS_VIEW]); - } - - wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_LIGHTS, - offsetof(struct wined3d_ffp_vs_constants, light), sizeof(constants), &constants); - } - - if (changed->texture_matrices) - { - struct wined3d_ffp_vs_constants constants; - struct wined3d_stream_info si; - - /* FIXME: This is a bit fragile. Ideally we should be calculating - * stream info from the stateblock state. */ - wined3d_stream_info_from_declaration(&si, context->state, &device->adapter->d3d_info); - - for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) - get_texture_matrix(&si, state, i, &constants.texture_matrices[i]); - wined3d_device_context_push_constants(context, - WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_SHADER_CONST_FFP_TEXMATRIX, - offsetof(struct wined3d_ffp_vs_constants, texture_matrices), - sizeof(constants.texture_matrices), constants.texture_matrices); + wined3d_device_set_clip_plane(device, i, &state->clip_planes[i]); }
if (changed->ffp_ps_constants) { - static const struct wined3d_color specular_enabled = {1.0f, 1.0f, 1.0f, 0.0f}; - static const struct wined3d_color specular_disabled; struct wined3d_ffp_ps_constants constants;
for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i) @@ -3542,10 +3326,8 @@ void CDECL wined3d_device_apply_stateblock(struct wined3d_device *device,
wined3d_color_from_d3dcolor(&constants.texture_factor, state->rs[WINED3D_RS_TEXTUREFACTOR]);
- constants.specular_enable = state->rs[WINED3D_RS_SPECULARENABLE] ? specular_enabled : specular_disabled; - wined3d_device_context_push_constants(context, WINED3D_PUSH_CONSTANTS_PS_FFP, - WINED3D_SHADER_CONST_FFP_PS, 0, offsetof(struct wined3d_ffp_ps_constants, color_key), &constants); + WINED3D_SHADER_CONST_FFP_PS, 0, sizeof(constants), &constants); }
assert(list_empty(&stateblock->changed.changed_lights)); diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 2efdaf91438..eeb2ea3a7cc 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -1770,17 +1770,6 @@ HRESULT CDECL wined3d_texture_set_color_key(struct wined3d_texture *texture, return WINED3DERR_INVALIDCALL; }
- if (color_key) - { - if (flags & WINED3D_CKEY_SRC_BLT) - texture->src_blt_color_key = *color_key; - texture->color_key_flags |= flags; - } - else - { - texture->color_key_flags &= ~flags; - } - wined3d_cs_emit_set_color_key(device->cs, texture, flags, color_key);
return WINED3D_OK; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index cd3458770aa..779af782b6c 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5365,6 +5365,8 @@ const char *debug_d3dstate(uint32_t state) return "STATE_VIEWPORT"; if (STATE_IS_LIGHT_TYPE(state)) return "STATE_LIGHT_TYPE"; + if (STATE_IS_ACTIVELIGHT(state)) + return wine_dbg_sprintf("STATE_ACTIVELIGHT(%#x)", state - STATE_ACTIVELIGHT(0)); if (STATE_IS_SCISSORRECT(state)) return "STATE_SCISSORRECT"; if (STATE_IS_CLIPPLANE(state)) @@ -5381,6 +5383,8 @@ const char *debug_d3dstate(uint32_t state) return "STATE_FRAMEBUFFER"; if (STATE_IS_POINT_ENABLE(state)) return "STATE_POINT_ENABLE"; + if (STATE_IS_COLOR_KEY(state)) + return "STATE_COLOR_KEY"; if (STATE_IS_STREAM_OUTPUT(state)) return "STATE_STREAM_OUTPUT"; if (STATE_IS_BLEND(state)) @@ -5687,11 +5691,11 @@ void get_projection_matrix(const struct wined3d_context *context, const struct w
/* Setup this textures matrix according to the texture flags. */ static void compute_texture_matrix(const struct wined3d_matrix *matrix, uint32_t flags, BOOL calculated_coords, - enum wined3d_format_id format_id, struct wined3d_matrix *out_matrix) + BOOL transformed, enum wined3d_format_id format_id, struct wined3d_matrix *out_matrix) { struct wined3d_matrix mat;
- if (flags == WINED3D_TTFF_DISABLE || flags == WINED3D_TTFF_COUNT1) + if (flags == WINED3D_TTFF_DISABLE || flags == WINED3D_TTFF_COUNT1 || transformed) { get_identity_matrix(out_matrix); return; @@ -5746,23 +5750,20 @@ static void compute_texture_matrix(const struct wined3d_matrix *matrix, uint32_t *out_matrix = mat; }
-void get_texture_matrix(const struct wined3d_stream_info *si, - const struct wined3d_stateblock_state *state, const unsigned int tex, struct wined3d_matrix *mat) +void get_texture_matrix(const struct wined3d_context *context, const struct wined3d_state *state, + const unsigned int tex, struct wined3d_matrix *mat) { BOOL generated = (state->texture_states[tex][WINED3D_TSS_TEXCOORD_INDEX] & 0xffff0000) != WINED3DTSS_TCI_PASSTHRU; unsigned int coord_idx = min(state->texture_states[tex][WINED3D_TSS_TEXCOORD_INDEX] & 0x0000ffff, WINED3D_MAX_FFP_TEXTURES - 1); - enum wined3d_format_id attribute_format; - - if (si->use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx))) - attribute_format = si->elements[WINED3D_FFP_TEXCOORD0 + coord_idx].format->id; - else - attribute_format = WINED3DFMT_UNKNOWN;
compute_texture_matrix(&state->transforms[WINED3D_TS_TEXTURE0 + tex], state->texture_states[tex][WINED3D_TSS_TEXTURE_TRANSFORM_FLAGS], - generated, attribute_format, mat); + generated, context->stream_info.position_transformed, + context->stream_info.use_map & (1u << (WINED3D_FFP_TEXCOORD0 + coord_idx)) + ? context->stream_info.elements[WINED3D_FFP_TEXCOORD0 + coord_idx].format->id + : WINED3DFMT_UNKNOWN, mat); }
void get_pointsize_minmax(const struct wined3d_context *context, const struct wined3d_state *state, @@ -6114,7 +6115,7 @@ static float color_to_float(DWORD color, DWORD size, DWORD offset) void wined3d_format_get_float_color_key(const struct wined3d_format *format, const struct wined3d_color_key *key, struct wined3d_color *float_colors) { - struct wined3d_color slop = {INFINITY, INFINITY, INFINITY, INFINITY}; + struct wined3d_color slop;
switch (format->id) { @@ -6136,14 +6137,10 @@ void wined3d_format_get_float_color_key(const struct wined3d_format *format, case WINED3DFMT_R8G8B8X8_UNORM: case WINED3DFMT_R16G16_UNORM: case WINED3DFMT_B10G10R10A2_UNORM: - if (format->red_size) - slop.r = 0.5f / wined3d_mask_from_size(format->red_size); - if (format->green_size) - slop.g = 0.5f / wined3d_mask_from_size(format->green_size); - if (format->blue_size) - slop.b = 0.5f / wined3d_mask_from_size(format->blue_size); - if (format->alpha_size) - slop.a = 0.5f / wined3d_mask_from_size(format->alpha_size); + slop.r = 0.5f / wined3d_mask_from_size(format->red_size); + slop.g = 0.5f / wined3d_mask_from_size(format->green_size); + slop.b = 0.5f / wined3d_mask_from_size(format->blue_size); + slop.a = 0.5f / wined3d_mask_from_size(format->alpha_size);
float_colors[0].r = color_to_float(key->color_space_low_value, format->red_size, format->red_offset) - slop.r; diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index 039f652adb9..ac875ce1fe7 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -773,8 +773,6 @@ void wined3d_ffp_blitter_create(struct wined3d_blitter **next, const struct wine struct wined3d_blitter *wined3d_glsl_blitter_create(struct wined3d_blitter **next, const struct wined3d_device *device); void wined3d_raw_blitter_create(struct wined3d_blitter **next, const struct wined3d_gl_info *gl_info);
-void ffp_vertex_update_clip_plane_constants(const struct wined3d_gl_info *gl_info, const struct wined3d_state *state); - struct wined3d_caps_gl_ctx { HDC dc; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 2654657e219..e4a3fdcbcf3 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -1750,8 +1750,10 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state
#define STATE_LIGHT_TYPE (STATE_VIEWPORT + 1) #define STATE_IS_LIGHT_TYPE(a) ((a) == STATE_LIGHT_TYPE) +#define STATE_ACTIVELIGHT(a) (STATE_LIGHT_TYPE + 1 + (a)) +#define STATE_IS_ACTIVELIGHT(a) ((a) >= STATE_ACTIVELIGHT(0) && (a) < STATE_ACTIVELIGHT(WINED3D_MAX_ACTIVE_LIGHTS))
-#define STATE_SCISSORRECT (STATE_LIGHT_TYPE + 1) +#define STATE_SCISSORRECT (STATE_ACTIVELIGHT(WINED3D_MAX_ACTIVE_LIGHTS - 1) + 1) #define STATE_IS_SCISSORRECT(a) ((a) == STATE_SCISSORRECT)
#define STATE_CLIPPLANE(a) (STATE_SCISSORRECT + 1 + (a)) @@ -1775,7 +1777,10 @@ void dispatch_compute(struct wined3d_device *device, const struct wined3d_state #define STATE_POINT_ENABLE (STATE_FRAMEBUFFER + 1) #define STATE_IS_POINT_ENABLE(a) ((a) == STATE_POINT_ENABLE)
-#define STATE_STREAM_OUTPUT (STATE_POINT_ENABLE + 1) +#define STATE_COLOR_KEY (STATE_POINT_ENABLE + 1) +#define STATE_IS_COLOR_KEY(a) ((a) == STATE_COLOR_KEY) + +#define STATE_STREAM_OUTPUT (STATE_COLOR_KEY + 1) #define STATE_IS_STREAM_OUTPUT(a) ((a) == STATE_STREAM_OUTPUT)
#define STATE_BLEND (STATE_STREAM_OUTPUT + 1) @@ -2062,14 +2067,6 @@ void context_state_drawbuf(struct wined3d_context *context, void context_state_fb(struct wined3d_context *context, const struct wined3d_state *state, DWORD state_id);
-struct wined3d_light_constants -{ - struct wined3d_color diffuse, specular, ambient; - struct wined3d_vec4 position, direction; - float range, falloff, cos_half_theta, cos_half_phi; - float const_att, linear_att, quad_att; -}; - /***************************************************************************** * Internal representation of a light */ @@ -2080,8 +2077,9 @@ struct wined3d_light_info LONG glIndex; BOOL enabled;
- /* Computed constants used by the vertex pipe. */ - struct wined3d_light_constants constants; + /* Converted parms to speed up swapping lights */ + struct wined3d_vec4 position; + struct wined3d_vec4 direction;
struct rb_entry entry; struct list changed_entry; @@ -2770,24 +2768,10 @@ BOOL wined3d_get_app_name(char *app_name, unsigned int app_name_size); * i.e. only used when shaders are disabled. */
-struct wined3d_ffp_vs_constants -{ - struct wined3d_matrix texture_matrices[WINED3D_MAX_FFP_TEXTURES]; - struct wined3d_ffp_light_constants - { - struct wined3d_color ambient; - struct wined3d_light_constants lights[8]; - } light; -}; - struct wined3d_ffp_ps_constants { struct wined3d_color texture_constants[WINED3D_MAX_FFP_TEXTURES]; struct wined3d_color texture_factor; - /* (1, 1, 1, 0) or (0, 0, 0, 0), which shaders will multiply with the - * specular color. */ - struct wined3d_color specular_enable; - struct wined3d_color color_key[2]; };
enum wined3d_push_constants @@ -2798,7 +2782,6 @@ enum wined3d_push_constants WINED3D_PUSH_CONSTANTS_PS_I, WINED3D_PUSH_CONSTANTS_VS_B, WINED3D_PUSH_CONSTANTS_PS_B, - WINED3D_PUSH_CONSTANTS_VS_FFP, WINED3D_PUSH_CONSTANTS_PS_FFP, WINED3D_PUSH_CONSTANTS_COUNT, }; @@ -3348,10 +3331,6 @@ struct wined3d_texture DWORD color_key_flags; } async;
- /* Color key field accessed from the client side. */ - struct wined3d_color_key src_blt_color_key; - uint32_t color_key_flags; - struct wined3d_dirty_regions { struct wined3d_box *boxes; @@ -4384,8 +4363,8 @@ void get_modelview_matrix(const struct wined3d_context *context, const struct wi unsigned int index, struct wined3d_matrix *mat); void get_projection_matrix(const struct wined3d_context *context, const struct wined3d_state *state, struct wined3d_matrix *mat); -void get_texture_matrix(const struct wined3d_stream_info *si, - const struct wined3d_stateblock_state *state, const unsigned int tex, struct wined3d_matrix *mat); +void get_texture_matrix(const struct wined3d_context *context, const struct wined3d_state *state, + unsigned int tex, struct wined3d_matrix *mat); void get_pointsize_minmax(const struct wined3d_context *context, const struct wined3d_state *state, float *out_min, float *out_max); void get_pointsize(const struct wined3d_context *context, const struct wined3d_state *state, diff --git a/dlls/winegstreamer/video_decoder.c b/dlls/winegstreamer/video_decoder.c index 53d9e00b137..3e91e55a779 100644 --- a/dlls/winegstreamer/video_decoder.c +++ b/dlls/winegstreamer/video_decoder.c @@ -796,10 +796,6 @@ static HRESULT WINAPI transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_ case MFT_MESSAGE_COMMAND_FLUSH: return wg_transform_flush(decoder->wg_transform);
- case MFT_MESSAGE_NOTIFY_START_OF_STREAM: - decoder->sample_time = -1; - return S_OK; - default: FIXME("Ignoring message %#x.\n", message); return S_OK; @@ -815,9 +811,6 @@ static HRESULT WINAPI transform_ProcessInput(IMFTransform *iface, DWORD id, IMFS if (!decoder->wg_transform) return MF_E_TRANSFORM_TYPE_NOT_SET;
- if (decoder->sample_time == -1 && FAILED(IMFSample_GetSampleTime(sample, (LONGLONG *)&decoder->sample_time))) - decoder->sample_time = 0; - return wg_transform_push_mf(decoder->wg_transform, sample, decoder->wg_sample_queue); }
diff --git a/dlls/winemac.drv/cocoa_window.h b/dlls/winemac.drv/cocoa_window.h index 804297f55a0..b5168d0c128 100644 --- a/dlls/winemac.drv/cocoa_window.h +++ b/dlls/winemac.drv/cocoa_window.h @@ -52,6 +52,9 @@ @interface WineWindow : NSPanel <NSWindowDelegate>
BOOL shapeChangedSinceLastDraw;
+ BOOL colorKeyed; + CGFloat colorKeyRed, colorKeyGreen, colorKeyBlue; + BOOL usePerPixelAlpha;
NSUInteger lastModifierFlags; diff --git a/dlls/winemac.drv/cocoa_window.m b/dlls/winemac.drv/cocoa_window.m index 866306d3511..bae2e21fb48 100644 --- a/dlls/winemac.drv/cocoa_window.m +++ b/dlls/winemac.drv/cocoa_window.m @@ -367,7 +367,6 @@ @interface WineContentView : WineBaseView <NSTextInputClient, NSViewLayerContent { CGRect surfaceRect; CGImageRef colorImage; - CGImageRef shapeImage;
NSMutableArray* glContexts; NSMutableArray* pendingGlContexts; @@ -414,6 +413,8 @@ @interface WineWindow () @property (nonatomic) BOOL shapeChangedSinceLastDraw; @property (readonly, nonatomic) BOOL needsTransparency;
+@property (nonatomic) BOOL colorKeyed; +@property (nonatomic) CGFloat colorKeyRed, colorKeyGreen, colorKeyBlue; @property (nonatomic) BOOL usePerPixelAlpha;
@property (assign, nonatomic) void* himc; @@ -502,7 +503,6 @@ - (void) dealloc [glContexts release]; [pendingGlContexts release]; CGImageRelease(colorImage); - CGImageRelease(shapeImage); [super dealloc]; }
@@ -519,7 +519,7 @@ - (BOOL) wantsUpdateLayer - (void) updateLayer { WineWindow* window = (WineWindow*)[self window]; - CGImageRef image, maskedImage; + CGImageRef image; CGRect imageRect; CALayer* layer = [self layer];
@@ -535,10 +535,21 @@ - (void) updateLayer imageRect.size.width *= layer.contentsScale; imageRect.size.height *= layer.contentsScale;
- maskedImage = shapeImage ? CGImageCreateWithMask(colorImage, shapeImage) - : CGImageRetain(colorImage); - image = CGImageCreateWithImageInRect(maskedImage, imageRect); - CGImageRelease(maskedImage); + image = CGImageCreateWithImageInRect(colorImage, imageRect); + + if (window.colorKeyed) + { + CGImageRef maskedImage; + CGFloat components[] = { window.colorKeyRed - 0.5, window.colorKeyRed + 0.5, + window.colorKeyGreen - 0.5, window.colorKeyGreen + 0.5, + window.colorKeyBlue - 0.5, window.colorKeyBlue + 0.5 }; + maskedImage = CGImageCreateWithMaskingColors(image, components); + if (maskedImage) + { + CGImageRelease(image); + image = maskedImage; + } + }
if (image) { @@ -550,7 +561,7 @@ - (void) updateLayer // If the window may be transparent, then we have to invalidate the // shadow every time we draw. Also, if this is the first time we've // drawn since changing from transparent to opaque. - if (shapeImage || window.usePerPixelAlpha || window.shapeChangedSinceLastDraw) + if (window.colorKeyed || window.usePerPixelAlpha || window.shapeChangedSinceLastDraw) { window.shapeChangedSinceLastDraw = FALSE; [window invalidateShadow]; @@ -569,17 +580,6 @@ - (void) setColorImage:(CGImageRef)image colorImage = CGImageRetain(image); }
- - (void) setShapeImage:(CGImageRef)image - { - CGImageRelease(shapeImage); - shapeImage = CGImageRetain(image); - } - - - (BOOL) hasShapeImage - { - return !!shapeImage; - } - - (void) viewWillDraw { [super viewWillDraw]; @@ -1017,6 +1017,7 @@ @implementation WineWindow @synthesize disabled, noForeground, preventsAppActivation, floating, fullscreen, fakingClose, closing, latentParentWindow, hwnd, queue; @synthesize drawnSinceShown; @synthesize shapeChangedSinceLastDraw; + @synthesize colorKeyed, colorKeyRed, colorKeyGreen, colorKeyBlue; @synthesize usePerPixelAlpha; @synthesize himc, commandDone;
@@ -2070,9 +2071,8 @@ - (void) setDisabled:(BOOL)newValue
- (BOOL) needsTransparency { - WineContentView *view = self.contentView; - return self.contentView.layer.mask || [view hasShapeImage] || self.usePerPixelAlpha || - (gl_surface_mode == GL_SURFACE_BEHIND && [view hasGLDescendant]); + return self.contentView.layer.mask || self.colorKeyed || self.usePerPixelAlpha || + (gl_surface_mode == GL_SURFACE_BEHIND && [(WineContentView*)self.contentView hasGLDescendant]); }
- (void) checkTransparency @@ -3521,30 +3521,6 @@ void macdrv_window_set_color_image(macdrv_window w, CGImageRef image, CGRect rec } }
- -/*********************************************************************** - * macdrv_window_set_shape_image - */ -void macdrv_window_set_shape_image(macdrv_window w, CGImageRef image) -{ -@autoreleasepool -{ - WineWindow* window = (WineWindow*)w; - - CGImageRetain(image); - - OnMainThreadAsync(^{ - WineContentView *view = [window contentView]; - - [view setShapeImage:image]; - [view setNeedsDisplay:true]; - [window checkTransparency]; - - CGImageRelease(image); - }); -} -} - /*********************************************************************** * macdrv_set_window_shape * @@ -3591,6 +3567,42 @@ void macdrv_set_window_alpha(macdrv_window w, CGFloat alpha) } }
+/*********************************************************************** + * macdrv_set_window_color_key + */ +void macdrv_set_window_color_key(macdrv_window w, CGFloat keyRed, CGFloat keyGreen, + CGFloat keyBlue) +{ +@autoreleasepool +{ + WineWindow* window = (WineWindow*)w; + + OnMainThread(^{ + window.colorKeyed = TRUE; + window.colorKeyRed = keyRed; + window.colorKeyGreen = keyGreen; + window.colorKeyBlue = keyBlue; + [window checkTransparency]; + }); +} +} + +/*********************************************************************** + * macdrv_clear_window_color_key + */ +void macdrv_clear_window_color_key(macdrv_window w) +{ +@autoreleasepool +{ + WineWindow* window = (WineWindow*)w; + + OnMainThread(^{ + window.colorKeyed = FALSE; + [window checkTransparency]; + }); +} +} + /*********************************************************************** * macdrv_window_use_per_pixel_alpha */ diff --git a/dlls/winemac.drv/keyboard.c b/dlls/winemac.drv/keyboard.c index 832e6178466..0431cc22150 100644 --- a/dlls/winemac.drv/keyboard.c +++ b/dlls/winemac.drv/keyboard.c @@ -1043,6 +1043,25 @@ static void macdrv_send_keyboard_input(HWND hwnd, WORD vkey, WORD scan, unsigned }
+/*********************************************************************** + * get_async_key_state + */ +static BOOL get_async_key_state(BYTE state[256]) +{ + BOOL ret; + + SERVER_START_REQ(get_key_state) + { + req->async = 1; + req->key = -1; + wine_server_set_reply(req, state, 256); + ret = !wine_server_call(req); + } + SERVER_END_REQ; + return ret; +} + + /*********************************************************************** * update_modifier_state */ @@ -1171,7 +1190,7 @@ void macdrv_hotkey_press(const macdrv_event *event) BOOL got_keystate; DWORD flags;
- if ((got_keystate = NtUserGetAsyncKeyboardState(keystate))) + if ((got_keystate = get_async_key_state(keystate))) { update_modifier_state(MOD_ALT, event->hotkey_press.mod_flags, keystate, VK_LMENU, VK_RMENU, 0x38, 0x138, event->hotkey_press.time_ms, FALSE); diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 6c9735bd8e4..8b9e908bc1a 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -189,6 +189,7 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p RECT whole_rect; /* Mac window rectangle for the whole window relative to parent */ RECT client_rect; /* client area relative to parent */ int pixel_format; /* pixel format for GL */ + COLORREF color_key; /* color key for layered window; CLR_INVALID is not color keyed */ HANDLE drag_event; /* event to signal that Cocoa-driven window dragging has ended */ unsigned int on_screen : 1; /* is window ordered in? (minimized or not) */ unsigned int shaped : 1; /* is window using a custom region shape? */ @@ -207,6 +208,7 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p extern macdrv_window macdrv_get_cocoa_window(HWND hwnd, BOOL require_on_screen); extern RGNDATA *get_region_data(HRGN hrgn, HDC hdc_lptodp); extern void activate_on_following_focus(void); +extern void set_surface_use_alpha(struct window_surface *window_surface, BOOL use_alpha);
extern void macdrv_handle_event(const macdrv_event *event);
diff --git a/dlls/winemac.drv/macdrv_cocoa.h b/dlls/winemac.drv/macdrv_cocoa.h index 94821eef6bf..30ab06c3662 100644 --- a/dlls/winemac.drv/macdrv_cocoa.h +++ b/dlls/winemac.drv/macdrv_cocoa.h @@ -553,9 +553,11 @@ extern void macdrv_order_cocoa_window(macdrv_window w, macdrv_window prev, extern void macdrv_get_cocoa_window_frame(macdrv_window w, CGRect* out_frame); extern void macdrv_set_cocoa_parent_window(macdrv_window w, macdrv_window parent); extern void macdrv_window_set_color_image(macdrv_window w, CGImageRef image, CGRect rect, CGRect dirty); -extern void macdrv_window_set_shape_image(macdrv_window w, CGImageRef image); extern void macdrv_set_window_shape(macdrv_window w, const CGRect *rects, int count); extern void macdrv_set_window_alpha(macdrv_window w, CGFloat alpha); +extern void macdrv_set_window_color_key(macdrv_window w, CGFloat keyRed, CGFloat keyGreen, + CGFloat keyBlue); +extern void macdrv_clear_window_color_key(macdrv_window w); extern void macdrv_window_use_per_pixel_alpha(macdrv_window w, int use_per_pixel_alpha); extern void macdrv_give_cocoa_window_focus(macdrv_window w, int activate); extern void macdrv_set_window_min_max_sizes(macdrv_window w, CGSize min_size, CGSize max_size); diff --git a/dlls/winemac.drv/surface.c b/dlls/winemac.drv/surface.c index fa47c7e474e..fa34a5122ab 100644 --- a/dlls/winemac.drv/surface.c +++ b/dlls/winemac.drv/surface.c @@ -95,31 +95,6 @@ static BOOL macdrv_surface_flush(struct window_surface *window_surface, const RE macdrv_window_set_color_image(surface->window, image, cgrect_from_rect(*rect), cgrect_from_rect(*dirty)); CGImageRelease(image);
- if (shape_changed) - { - if (!shape_bits) - macdrv_window_set_shape_image(surface->window, NULL); - else - { - const BYTE *src = shape_bits; - CGDataProviderRef provider; - CGImageRef image; - BYTE *dst; - UINT i; - - if (!(provider = data_provider_create(shape_info->bmiHeader.biSizeImage, (void **)&dst))) return TRUE; - for (i = 0; i < shape_info->bmiHeader.biSizeImage; i++) dst[i] = ~src[i]; /* CGImage mask bits are inverted */ - - image = CGImageMaskCreate(shape_info->bmiHeader.biWidth, abs(shape_info->bmiHeader.biHeight), 1, 1, - shape_info->bmiHeader.biSizeImage / abs(shape_info->bmiHeader.biHeight), - provider, NULL, retina_on); - CGDataProviderRelease(provider); - - macdrv_window_set_shape_image(surface->window, image); - CGImageRelease(image); - } - } - return TRUE; }
@@ -152,7 +127,7 @@ static struct macdrv_window_surface *get_mac_surface(struct window_surface *surf * create_surface */ static struct window_surface *create_surface(HWND hwnd, macdrv_window window, const RECT *rect, - struct window_surface *old_surface) + struct window_surface *old_surface, BOOL use_alpha) { struct macdrv_window_surface *surface = NULL; int width = rect->right - rect->left, height = rect->bottom - rect->top; @@ -191,7 +166,7 @@ static struct window_surface *create_surface(HWND hwnd, macdrv_window window, co } if (desc.hDeviceDc) NtUserReleaseDC(hwnd, desc.hDeviceDc);
- if (!(surface = calloc(1, sizeof(*surface)))) return NULL; + if (!(surface = calloc(1, sizeof(*surface)))) goto failed; if (!window_surface_init(&surface->header, &macdrv_surface_funcs, hwnd, rect, info, bitmap)) goto failed;
surface->window = window; @@ -203,6 +178,9 @@ static struct window_surface *create_surface(HWND hwnd, macdrv_window window, co
TRACE("created %p for %p %s\n", surface, window, wine_dbgstr_rect(rect));
+ if (use_alpha) window_surface_set_layered( &surface->header, CLR_INVALID, -1, 0xff000000 ); + else window_surface_set_layered( &surface->header, CLR_INVALID, -1, 0 ); + return &surface->header;
failed: @@ -238,7 +216,7 @@ BOOL macdrv_CreateWindowSurface(HWND hwnd, const RECT *surface_rect, struct wind } }
- *surface = create_surface(data->hwnd, data->cocoa_window, surface_rect, data->surface); + *surface = create_surface(data->hwnd, data->cocoa_window, surface_rect, data->surface, FALSE);
done: release_win_data(data); @@ -263,7 +241,7 @@ BOOL macdrv_CreateLayeredWindow(HWND hwnd, const RECT *surface_rect, COLORREF co surface = data->surface; if (!surface || !EqualRect(&surface->rect, surface_rect)) { - data->surface = create_surface(data->hwnd, data->cocoa_window, surface_rect, NULL); + data->surface = create_surface(data->hwnd, data->cocoa_window, surface_rect, NULL, TRUE); if (surface) window_surface_release(surface); surface = data->surface; if (data->unminimized_surface) @@ -272,6 +250,7 @@ BOOL macdrv_CreateLayeredWindow(HWND hwnd, const RECT *surface_rect, COLORREF co data->unminimized_surface = NULL; } } + else window_surface_set_layered(surface, color_key, -1, 0xff000000);
if ((*window_surface = surface)) window_surface_add_ref(surface);
diff --git a/dlls/winemac.drv/window.c b/dlls/winemac.drv/window.c index 029715e4180..0784b0e4e39 100644 --- a/dlls/winemac.drv/window.c +++ b/dlls/winemac.drv/window.c @@ -278,6 +278,7 @@ static struct macdrv_win_data *alloc_win_data(HWND hwnd) if ((data = calloc(1, sizeof(*data)))) { data->hwnd = hwnd; + data->color_key = CLR_INVALID; data->swap_interval = 1; pthread_mutex_lock(&win_data_mutex); if (!win_datas) @@ -403,18 +404,68 @@ static void set_cocoa_window_properties(struct macdrv_win_data *data) */ static void sync_window_region(struct macdrv_win_data *data, HRGN win_region) { + HRGN hrgn = win_region; + RGNDATA *region_data; + const CGRect* rects; + int count; + if (!data->cocoa_window) return; + data->shaped = FALSE;
if (IsRectEmpty(&data->window_rect)) /* set an empty shape */ { - data->shaped = FALSE; TRACE("win %p/%p setting empty shape for zero-sized window\n", data->hwnd, data->cocoa_window); macdrv_set_window_shape(data->cocoa_window, &CGRectZero, 1); return; }
- /* use surface shape instead */ - macdrv_set_window_shape(data->cocoa_window, NULL, 0); + if (hrgn == (HRGN)1) /* hack: win_region == 1 means retrieve region from server */ + { + if (!(hrgn = NtGdiCreateRectRgn(0, 0, 0, 0))) return; + if (NtUserGetWindowRgnEx(data->hwnd, hrgn, 0) == ERROR) + { + NtGdiDeleteObjectApp(hrgn); + hrgn = 0; + } + } + + if (hrgn && NtUserGetWindowLongW(data->hwnd, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) + NtUserMirrorRgn(data->hwnd, hrgn); + if (hrgn) + { + NtGdiOffsetRgn(hrgn, data->window_rect.left - data->whole_rect.left, + data->window_rect.top - data->whole_rect.top); + } + region_data = get_region_data(hrgn, 0); + if (region_data) + { + rects = (CGRect*)region_data->Buffer; + count = region_data->rdh.nCount; + /* Special case optimization. If the region entirely encloses the Cocoa + window, it's the same as there being no region. It's potentially + hard/slow to test this for arbitrary regions, so we just check for + very simple regions. */ + if (count == 1 && CGRectContainsRect(rects[0], + CGRectOffset(cgrect_from_rect(data->whole_rect), -data->whole_rect.left, -data->whole_rect.top))) + { + TRACE("optimizing for simple region that contains Cocoa content rect\n"); + rects = NULL; + count = 0; + } + } + else + { + rects = NULL; + count = 0; + } + + TRACE("win %p/%p win_region %p rects %p count %d\n", data->hwnd, data->cocoa_window, win_region, rects, count); + macdrv_set_window_shape(data->cocoa_window, rects, count); + + free(region_data); + data->shaped = (region_data != NULL); + + if (hrgn && hrgn != win_region) NtGdiDeleteObjectApp(hrgn); }
@@ -434,7 +485,7 @@ static inline void add_bounds_rect(RECT *bounds, const RECT *rect) /*********************************************************************** * sync_window_opacity */ -static void sync_window_opacity(struct macdrv_win_data *data, BYTE alpha, +static void sync_window_opacity(struct macdrv_win_data *data, COLORREF key, BYTE alpha, BOOL per_pixel_alpha, DWORD flags) { CGFloat opacity = 1.0; @@ -445,6 +496,33 @@ static void sync_window_opacity(struct macdrv_win_data *data, BYTE alpha, TRACE("setting window %p/%p alpha to %g\n", data->hwnd, data->cocoa_window, opacity); macdrv_set_window_alpha(data->cocoa_window, opacity);
+ if (flags & LWA_COLORKEY) + { + /* FIXME: treat PALETTEINDEX and DIBINDEX as black */ + if ((key & (1 << 24)) || key >> 16 == 0x10ff) + key = RGB(0, 0, 0); + } + else + key = CLR_INVALID; + + if (data->color_key != key) + { + if (key == CLR_INVALID) + { + TRACE("clearing color-key for window %p/%p\n", data->hwnd, data->cocoa_window); + macdrv_clear_window_color_key(data->cocoa_window); + } + else + { + TRACE("setting color-key for window %p/%p to RGB %d,%d,%d\n", data->hwnd, data->cocoa_window, + GetRValue(key), GetGValue(key), GetBValue(key)); + macdrv_set_window_color_key(data->cocoa_window, GetRValue(key), GetGValue(key), GetBValue(key)); + } + + data->color_key = key; + needs_flush = TRUE; + } + if (!data->per_pixel_alpha != !per_pixel_alpha) { TRACE("setting window %p/%p per-pixel-alpha to %d\n", data->hwnd, data->cocoa_window, per_pixel_alpha); @@ -679,7 +757,7 @@ static void create_cocoa_window(struct macdrv_win_data *data)
/* set the window opacity */ if (!NtUserGetLayeredWindowAttributes(data->hwnd, &key, &alpha, &layered_flags)) layered_flags = 0; - sync_window_opacity(data, alpha, FALSE, layered_flags); + sync_window_opacity(data, key, alpha, FALSE, layered_flags);
done: if (win_rgn) NtGdiDeleteObjectApp(win_rgn); @@ -700,6 +778,7 @@ static void destroy_cocoa_window(struct macdrv_win_data *data) macdrv_destroy_cocoa_window(data->cocoa_window); data->cocoa_window = 0; data->on_screen = FALSE; + data->color_key = CLR_INVALID; if (data->surface) window_surface_release(data->surface); data->surface = NULL; if (data->unminimized_surface) window_surface_release(data->unminimized_surface); @@ -1604,9 +1683,10 @@ void macdrv_SetLayeredWindowAttributes(HWND hwnd, COLORREF key, BYTE alpha, DWOR { data->layered = TRUE; data->ulw_layered = FALSE; + if (data->surface) window_surface_set_layered(data->surface, key, alpha << 24, 0); if (data->cocoa_window) { - sync_window_opacity(data, alpha, FALSE, flags); + sync_window_opacity(data, key, alpha, FALSE, flags); /* since layered attributes are now set, can now show the window */ if ((NtUserGetWindowLongW(hwnd, GWL_STYLE) & WS_VISIBLE) && !data->on_screen) show_window(data); @@ -1701,7 +1781,8 @@ void macdrv_SetWindowStyle(HWND hwnd, INT offset, STYLESTRUCT *style) { data->layered = FALSE; data->ulw_layered = FALSE; - sync_window_opacity(data, 0, FALSE, 0); + sync_window_opacity(data, 0, 0, FALSE, 0); + if (data->surface) window_surface_set_layered(data->surface, CLR_INVALID, -1, 0); }
if (offset == GWL_EXSTYLE && (changed & WS_EX_LAYOUTRTL)) @@ -1824,7 +1905,7 @@ void macdrv_UpdateLayeredWindow(HWND hwnd, const RECT *window_rect, COLORREF col show_window(data);
/* The ULW flags are a superset of the LWA flags. */ - sync_window_opacity(data, 255, TRUE, flags); + sync_window_opacity(data, color_key, 255, TRUE, flags); release_win_data(data); } } diff --git a/dlls/winevulkan/loader.c b/dlls/winevulkan/loader.c index 5e32490e610..bd49b08057d 100644 --- a/dlls/winevulkan/loader.c +++ b/dlls/winevulkan/loader.c @@ -230,101 +230,6 @@ VkResult WINAPI vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t *supported_ver return VK_SUCCESS; }
-static NTSTATUS WINAPI call_vulkan_debug_report_callback(void *args, ULONG size) -{ - struct wine_vk_debug_report_params *params = args; - PFN_vkDebugReportCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; - const char *strings = (char *)(params + 1), *layer = NULL, *message = NULL; - void *user_data = (void *)(UINT_PTR)params->user_data; - VkBool32 ret; - - if (params->layer_len) layer = strings; - strings += params->layer_len; - if (params->message_len) message = strings; - - ret = callback(params->flags, params->object_type, params->object_handle, params->location, - params->code, layer, message, user_data); - return NtCallbackReturn(&ret, sizeof(ret), STATUS_SUCCESS); -} - -static NTSTATUS WINAPI call_vulkan_debug_utils_callback(void *args, ULONG size) -{ - struct wine_vk_debug_utils_params *params = args; - PFN_vkDebugUtilsMessengerCallbackEXT callback = (void *)(UINT_PTR)params->user_callback; - void *user_data = (void *)(UINT_PTR)params->user_data; - VkDeviceAddressBindingCallbackDataEXT address_binding = - { - .sType = VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT, - .flags = params->address_binding.flags, - .baseAddress = params->address_binding.base_address, - .size = params->address_binding.size, - .bindingType = params->address_binding.binding_type, - }; - VkDebugUtilsMessengerCallbackDataEXT data = - { - .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT, - .flags = params->flags, - .messageIdNumber = params->message_id_number, - .queueLabelCount = params->queue_label_count, - .cmdBufLabelCount = params->cmd_buf_label_count, - .objectCount = params->object_count, - }; - VkDebugUtilsObjectNameInfoEXT *objects; - VkDebugUtilsLabelEXT *labels; - const char *ptr, *strings; - VkBool32 ret = VK_FALSE; - UINT i; - - size = sizeof(*params); - size += sizeof(struct debug_utils_label) * (data.queueLabelCount + data.cmdBufLabelCount); - size += sizeof(struct debug_utils_object) * data.objectCount; - - ptr = (char *)(params + 1); - strings = (char *)(params + size); - - if (params->has_address_binding) data.pNext = &address_binding; - if (params->message_id_name_len) data.pMessageIdName = strings; - strings += params->message_id_name_len; - if (params->message_len) data.pMessage = strings; - strings += params->message_len; - - if ((labels = calloc(data.queueLabelCount + data.cmdBufLabelCount + 1, sizeof(*data.pQueueLabels))) && - (objects = calloc(data.objectCount + 1, sizeof(*data.pObjects)))) - { - for (i = 0; i < data.queueLabelCount + data.cmdBufLabelCount; i++) - { - struct debug_utils_label *label = (struct debug_utils_label *)ptr; - labels[i].sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT; - memcpy(labels[i].color, label->color, sizeof(label->color)); - if (label->label_name_len) labels[i].pLabelName = strings; - strings += label->label_name_len; - ptr += sizeof(*label); - } - if (data.queueLabelCount) data.pQueueLabels = labels; - labels += data.queueLabelCount; - if (data.cmdBufLabelCount) data.pCmdBufLabels = labels; - - for (i = 0; i < data.objectCount; i++) - { - struct debug_utils_object *object = (struct debug_utils_object *)ptr; - objects[i].sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT; - objects[i].objectType = object->object_type; - objects[i].objectHandle = object->object_handle; - if (object->object_name_len) objects[i].pObjectName = strings; - strings += object->object_name_len; - ptr += sizeof(*object); - } - data.pObjects = objects; - - ret = callback(params->severity, params->message_types, &data, user_data); - - free(objects); - } - free(labels); - - return NtCallbackReturn(&ret, sizeof(ret), STATUS_SUCCESS); -} - static BOOL WINAPI wine_vk_init(INIT_ONCE *once, void *param, void **context) { return !__wine_init_unix_call() && !UNIX_CALL(init, NULL); @@ -697,6 +602,21 @@ void WINAPI vkFreeCommandBuffers(VkDevice device, VkCommandPool cmd_pool, uint32 } }
+static NTSTATUS WINAPI call_vulkan_debug_report_callback( void *args, ULONG size ) +{ + struct wine_vk_debug_report_params *params = args; + VkBool32 ret = params->user_callback(params->flags, params->object_type, params->object_handle, params->location, + params->code, params->layer_prefix, params->message, params->user_data); + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); +} + +static NTSTATUS WINAPI call_vulkan_debug_utils_callback( void *args, ULONG size ) +{ + struct wine_vk_debug_utils_params *params = args; + VkBool32 ret = params->user_callback(params->severity, params->message_types, ¶ms->data, params->user_data); + return NtCallbackReturn( &ret, sizeof(ret), STATUS_SUCCESS ); +} + BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved) { KERNEL_CALLBACK_PROC *kernel_callback_table; diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 6d68d794835..dbdbc48a058 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -1293,7 +1293,7 @@ class VkVariable(object): return self.pointer and self.pointer.count('*') > 1
def is_pointer_size(self): - if self.type in ["size_t", "HWND", "HINSTANCE"] or self.type.startswith("PFN"): + if self.type in ["size_t", "HWND", "HINSTANCE"]: return True if self.is_handle() and self.handle.is_dispatchable(): return True diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 041fb4c4c4b..f6e06bcc085 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -169,45 +169,16 @@ static uint64_t client_handle_from_host(struct wine_instance *instance, uint64_t return result; }
-static UINT append_string(const char *name, char *strings, UINT *strings_len) -{ - UINT len = name ? strlen(name) + 1 : 0; - if (strings && len) memcpy(strings + *strings_len, name, len); - *strings_len += len; - return len; -} - -static void append_debug_utils_label(const VkDebugUtilsLabelEXT *label, struct debug_utils_label *dst, - char *strings, UINT *strings_len) -{ - if (label->pNext) FIXME("Unsupported VkDebugUtilsLabelEXT pNext chain\n"); - memcpy(dst->color, label->color, sizeof(dst->color)); - dst->label_name_len = append_string(label->pLabelName, strings, strings_len); -} - -static void append_debug_utils_object(const VkDebugUtilsObjectNameInfoEXT *object, struct debug_utils_object *dst, - char *strings, UINT *strings_len) -{ - if (object->pNext) FIXME("Unsupported VkDebugUtilsObjectNameInfoEXT pNext chain\n"); - dst->object_type = object->objectType; - dst->object_handle = object->objectHandle; - dst->object_name_len = append_string(object->pObjectName, strings, strings_len); -} - static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT message_types, const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data) { - const VkDeviceAddressBindingCallbackDataEXT *address = NULL; - struct wine_vk_debug_utils_params *params; + struct wine_vk_debug_utils_params params; + VkDebugUtilsObjectNameInfoEXT *object_name_infos; struct wine_debug_utils_messenger *object; - struct debug_utils_object dummy_object, *objects; - struct debug_utils_label dummy_label, *labels; - UINT size, strings_len; - char *ptr, *strings; - ULONG ret_len; void *ret_ptr; + ULONG ret_len; unsigned int i;
TRACE("%i, %u, %p, %p\n", severity, message_types, callback_data, user_data); @@ -220,85 +191,44 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB return VK_FALSE; }
- if ((address = callback_data->pNext)) - { - if (address->sType != VK_STRUCTURE_TYPE_DEVICE_ADDRESS_BINDING_CALLBACK_DATA_EXT) address = NULL; - if (!address || address->pNext) FIXME("Unsupported VkDebugUtilsMessengerCallbackDataEXT pNext chain\n"); - } - - strings_len = 0; - append_string(callback_data->pMessageIdName, NULL, &strings_len); - append_string(callback_data->pMessage, NULL, &strings_len); - for (i = 0; i < callback_data->queueLabelCount; i++) - append_debug_utils_label(callback_data->pQueueLabels + i, &dummy_label, NULL, &strings_len); - for (i = 0; i < callback_data->cmdBufLabelCount; i++) - append_debug_utils_label(callback_data->pCmdBufLabels + i, &dummy_label, NULL, &strings_len); - for (i = 0; i < callback_data->objectCount; i++) - append_debug_utils_object(callback_data->pObjects + i, &dummy_object, NULL, &strings_len); - - size = sizeof(*params); - size += sizeof(*labels) * (callback_data->queueLabelCount + callback_data->cmdBufLabelCount); - size += sizeof(*object) * callback_data->objectCount; + /* FIXME: we should pack all referenced structs instead of passing pointers */ + params.user_callback = object->user_callback; + params.user_data = object->user_data; + params.severity = severity; + params.message_types = message_types; + params.data = *((VkDebugUtilsMessengerCallbackDataEXT *) callback_data);
- if (!(params = malloc(size + strings_len))) return VK_FALSE; - ptr = (char *)(params + 1); - strings = (char *)(params + size); + object_name_infos = calloc(params.data.objectCount, sizeof(*object_name_infos));
- params->user_callback = object->user_callback; - params->user_data = object->user_data; - params->severity = severity; - params->message_types = message_types; - params->flags = callback_data->flags; - params->message_id_number = callback_data->messageIdNumber; - - strings_len = 0; - params->message_id_name_len = append_string(callback_data->pMessageIdName, strings, &strings_len); - params->message_len = append_string(callback_data->pMessage, strings, &strings_len); - - labels = (void *)ptr; - for (i = 0; i < callback_data->queueLabelCount; i++) - append_debug_utils_label(callback_data->pQueueLabels + i, labels + i, strings, &strings_len); - params->queue_label_count = callback_data->queueLabelCount; - ptr += callback_data->queueLabelCount * sizeof(*labels); - - labels = (void *)ptr; - for (i = 0; i < callback_data->cmdBufLabelCount; i++) - append_debug_utils_label(callback_data->pCmdBufLabels + i, labels + i, strings, &strings_len); - params->cmd_buf_label_count = callback_data->cmdBufLabelCount; - ptr += callback_data->cmdBufLabelCount * sizeof(*labels); - - objects = (void *)ptr; - for (i = 0; i < callback_data->objectCount; i++) + for (i = 0; i < params.data.objectCount; i++) { - append_debug_utils_object(callback_data->pObjects + i, objects + i, strings, &strings_len); + object_name_infos[i].sType = callback_data->pObjects[i].sType; + object_name_infos[i].pNext = callback_data->pObjects[i].pNext; + object_name_infos[i].objectType = callback_data->pObjects[i].objectType; + object_name_infos[i].pObjectName = callback_data->pObjects[i].pObjectName;
- if (wine_vk_is_type_wrapped(objects[i].object_type)) + if (wine_vk_is_type_wrapped(callback_data->pObjects[i].objectType)) { - objects[i].object_handle = client_handle_from_host(object->instance, objects[i].object_handle); - if (!objects[i].object_handle) + object_name_infos[i].objectHandle = client_handle_from_host(object->instance, callback_data->pObjects[i].objectHandle); + if (!object_name_infos[i].objectHandle) { WARN("handle conversion failed 0x%s\n", wine_dbgstr_longlong(callback_data->pObjects[i].objectHandle)); - free(params); + free(object_name_infos); return VK_FALSE; } } + else + { + object_name_infos[i].objectHandle = callback_data->pObjects[i].objectHandle; + } } - params->object_count = callback_data->objectCount; - ptr += callback_data->objectCount * sizeof(*objects);
- if (address) - { - params->has_address_binding = TRUE; - params->address_binding.flags = address->flags; - params->address_binding.base_address = address->baseAddress; - params->address_binding.size = address->size; - params->address_binding.binding_type = address->bindingType; - } + params.data.pObjects = object_name_infos;
/* applications should always return VK_FALSE */ - KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, params, size + strings_len, &ret_ptr, &ret_len ); - free(params); + KeUserModeCallback( NtUserCallVulkanDebugUtilsCallback, ¶ms, sizeof(params), &ret_ptr, &ret_len );
+ free(object_name_infos); if (ret_len == sizeof(VkBool32)) return *(VkBool32 *)ret_ptr; return VK_FALSE; } @@ -306,12 +236,10 @@ static VkBool32 debug_utils_callback_conversion(VkDebugUtilsMessageSeverityFlagB static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT object_type, uint64_t object_handle, size_t location, int32_t code, const char *layer_prefix, const char *message, void *user_data) { - struct wine_vk_debug_report_params *params; + struct wine_vk_debug_report_params params; struct wine_debug_report_callback *object; - UINT strings_len; - ULONG ret_len; void *ret_ptr; - char *strings; + ULONG ret_len;
TRACE("%#x, %#x, 0x%s, 0x%s, %d, %p, %p, %p\n", flags, object_type, wine_dbgstr_longlong(object_handle), wine_dbgstr_longlong(location), code, layer_prefix, message, user_data); @@ -324,29 +252,21 @@ static VkBool32 debug_report_callback_conversion(VkDebugReportFlagsEXT flags, Vk return VK_FALSE; }
- strings_len = 0; - append_string(layer_prefix, NULL, &strings_len); - append_string(message, NULL, &strings_len); - - if (!(params = malloc(sizeof(*params) + strings_len))) return VK_FALSE; - strings = (char *)(params + 1); - - params->user_callback = object->user_callback; - params->user_data = object->user_data; - params->flags = flags; - params->object_type = object_type; - params->location = location; - params->code = code; - params->object_handle = client_handle_from_host(object->instance, object_handle); - if (!params->object_handle) params->object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT; - - strings_len = 0; - params->layer_len = append_string(layer_prefix, strings, &strings_len); - params->message_len = append_string(message, strings, &strings_len); + /* FIXME: we should pack all referenced structs instead of passing pointers */ + params.user_callback = object->user_callback; + params.user_data = object->user_data; + params.flags = flags; + params.object_type = object_type; + params.location = location; + params.code = code; + params.layer_prefix = layer_prefix; + params.message = message;
- KeUserModeCallback(NtUserCallVulkanDebugReportCallback, params, sizeof(*params) + strings_len, &ret_ptr, &ret_len); - free(params); + params.object_handle = client_handle_from_host(object->instance, object_handle); + if (!params.object_handle) + params.object_type = VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT;
+ KeUserModeCallback( NtUserCallVulkanDebugReportCallback, ¶ms, sizeof(params), &ret_ptr, &ret_len ); if (ret_len == sizeof(VkBool32)) return *(VkBool32 *)ret_ptr; return VK_FALSE; } @@ -680,8 +600,8 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context *
object->utils_messengers[i].instance = object; object->utils_messengers[i].host_debug_messenger = VK_NULL_HANDLE; - object->utils_messengers[i].user_callback = (UINT_PTR)debug_utils_messenger->pfnUserCallback; - object->utils_messengers[i].user_data = (UINT_PTR)debug_utils_messenger->pUserData; + object->utils_messengers[i].user_callback = debug_utils_messenger->pfnUserCallback; + object->utils_messengers[i].user_data = debug_utils_messenger->pUserData;
/* convert_VkInstanceCreateInfo_* already copied the chain, so we can modify it in-place. */ debug_utils_messenger->pfnUserCallback = (void *) &debug_utils_callback_conversion; @@ -692,8 +612,8 @@ static VkResult wine_vk_instance_convert_create_info(struct conversion_context * { object->default_callback.instance = object; object->default_callback.host_debug_callback = VK_NULL_HANDLE; - object->default_callback.user_callback = (UINT_PTR)debug_report_callback->pfnCallback; - object->default_callback.user_data = (UINT_PTR)debug_report_callback->pUserData; + object->default_callback.user_callback = debug_report_callback->pfnCallback; + object->default_callback.user_data = debug_report_callback->pUserData;
debug_report_callback->pfnCallback = (void *) &debug_report_callback_conversion; debug_report_callback->pUserData = &object->default_callback; @@ -2363,8 +2283,8 @@ VkResult wine_vkCreateDebugUtilsMessengerEXT(VkInstance handle, return VK_ERROR_OUT_OF_HOST_MEMORY;
object->instance = instance; - object->user_callback = (UINT_PTR)create_info->pfnUserCallback; - object->user_data = (UINT_PTR)create_info->pUserData; + object->user_callback = create_info->pfnUserCallback; + object->user_data = create_info->pUserData;
wine_create_info = *create_info;
@@ -2418,8 +2338,8 @@ VkResult wine_vkCreateDebugReportCallbackEXT(VkInstance handle, return VK_ERROR_OUT_OF_HOST_MEMORY;
object->instance = instance; - object->user_callback = (UINT_PTR)create_info->pfnCallback; - object->user_data = (UINT_PTR)create_info->pUserData; + object->user_callback = create_info->pfnCallback; + object->user_data = create_info->pUserData;
wine_create_info = *create_info;
diff --git a/dlls/winevulkan/vulkan_loader.h b/dlls/winevulkan/vulkan_loader.h index 2b5e734a68b..710c07772fc 100644 --- a/dlls/winevulkan/vulkan_loader.h +++ b/dlls/winevulkan/vulkan_loader.h @@ -107,59 +107,28 @@ void *wine_vk_get_instance_proc_addr(const char *name);
/* debug callbacks params */
-struct debug_utils_label -{ - UINT32 label_name_len; - float color[4]; -}; - -struct debug_utils_object -{ - UINT32 object_type; - UINT64 object_handle; - UINT32 object_name_len; -}; - -struct debug_device_address_binding -{ - UINT32 flags; - UINT64 base_address; - UINT64 size; - UINT32 binding_type; -}; - struct wine_vk_debug_utils_params { - UINT64 user_callback; /* client pointer */ - UINT64 user_data; /* client pointer */ - - UINT32 severity; - UINT32 message_types; - UINT32 flags; - UINT32 message_id_number; - - UINT32 message_id_name_len; - UINT32 message_len; - UINT32 queue_label_count; - UINT32 cmd_buf_label_count; - UINT32 object_count; - - UINT8 has_address_binding; - struct debug_device_address_binding address_binding; + PFN_vkDebugUtilsMessengerCallbackEXT user_callback; + void *user_data; + + VkDebugUtilsMessageSeverityFlagBitsEXT severity; + VkDebugUtilsMessageTypeFlagsEXT message_types; + VkDebugUtilsMessengerCallbackDataEXT data; };
struct wine_vk_debug_report_params { - UINT64 user_callback; /* client pointer */ - UINT64 user_data; /* client pointer */ - - UINT32 flags; - UINT32 object_type; - UINT64 object_handle; - UINT64 location; - UINT32 code; - UINT32 layer_len; - UINT32 message_len; + PFN_vkDebugReportCallbackEXT user_callback; + void *user_data; + + VkDebugReportFlagsEXT flags; + VkDebugReportObjectTypeEXT object_type; + uint64_t object_handle; + size_t location; + int32_t code; + const char *layer_prefix; + const char *message; };
struct is_available_instance_function_params diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index b4cbf12c949..5e66a6c9670 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -103,8 +103,9 @@ struct wine_debug_report_callback struct wine_instance *instance; /* parent */ VkDebugReportCallbackEXT host_debug_callback;
- UINT64 user_callback; /* client pointer */ - UINT64 user_data; /* client pointer */ + /* application callback + data */ + PFN_vkDebugReportCallbackEXT user_callback; + void *user_data;
struct wrapper_entry wrapper_entry; }; @@ -199,8 +200,9 @@ struct wine_debug_utils_messenger struct wine_instance *instance; /* parent */ VkDebugUtilsMessengerEXT host_debug_messenger;
- UINT64 user_callback; /* client pointer */ - UINT64 user_data; /* client pointer */ + /* application callback + data */ + PFN_vkDebugUtilsMessengerCallbackEXT user_callback; + void *user_data;
struct wrapper_entry wrapper_entry; }; diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index 90a8474370a..c3063df1101 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -1638,7 +1638,7 @@ typedef struct VkDebugReportCallbackCreateInfoEXT32 VkStructureType sType; PTR32 pNext; VkDebugReportFlagsEXT flags; - PTR32 pfnCallback; + PFN_vkDebugReportCallbackEXT pfnCallback; PTR32 pUserData; } VkDebugReportCallbackCreateInfoEXT32;
@@ -1649,7 +1649,7 @@ typedef struct VkDebugUtilsMessengerCreateInfoEXT32 VkDebugUtilsMessengerCreateFlagsEXT flags; VkDebugUtilsMessageSeverityFlagsEXT messageSeverity; VkDebugUtilsMessageTypeFlagsEXT messageType; - PTR32 pfnUserCallback; + PFN_vkDebugUtilsMessengerCallbackEXT pfnUserCallback; PTR32 pUserData; } VkDebugUtilsMessengerCreateInfoEXT32;
@@ -11159,7 +11159,7 @@ static inline void convert_VkDebugReportCallbackCreateInfoEXT_win32_to_host(cons out->sType = in->sType; out->pNext = NULL; out->flags = in->flags; - out->pfnCallback = (PFN_vkDebugReportCallbackEXT)UlongToPtr(in->pfnCallback); + out->pfnCallback = in->pfnCallback; out->pUserData = UlongToPtr(in->pUserData); if (in->pNext) FIXME("Unexpected pNext\n"); @@ -11174,7 +11174,7 @@ static inline void convert_VkDebugUtilsMessengerCreateInfoEXT_win32_to_host(cons out->flags = in->flags; out->messageSeverity = in->messageSeverity; out->messageType = in->messageType; - out->pfnUserCallback = (PFN_vkDebugUtilsMessengerCallbackEXT)UlongToPtr(in->pfnUserCallback); + out->pfnUserCallback = in->pfnUserCallback; out->pUserData = UlongToPtr(in->pUserData); if (in->pNext) FIXME("Unexpected pNext\n"); @@ -18141,7 +18141,7 @@ static inline void convert_VkInstanceCreateInfo_win32_to_host(struct conversion_ out_ext->sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; out_ext->pNext = NULL; out_ext->flags = in_ext->flags; - out_ext->pfnCallback = (PFN_vkDebugReportCallbackEXT)UlongToPtr(in_ext->pfnCallback); + out_ext->pfnCallback = in_ext->pfnCallback; out_ext->pUserData = UlongToPtr(in_ext->pUserData); out_header->pNext = (void *)out_ext; out_header = (void *)out_ext; @@ -18194,7 +18194,7 @@ static inline void convert_VkInstanceCreateInfo_win32_to_host(struct conversion_ out_ext->flags = in_ext->flags; out_ext->messageSeverity = in_ext->messageSeverity; out_ext->messageType = in_ext->messageType; - out_ext->pfnUserCallback = (PFN_vkDebugUtilsMessengerCallbackEXT)UlongToPtr(in_ext->pfnUserCallback); + out_ext->pfnUserCallback = in_ext->pfnUserCallback; out_ext->pUserData = UlongToPtr(in_ext->pUserData); out_header->pNext = (void *)out_ext; out_header = (void *)out_ext; diff --git a/dlls/winewayland.drv/wayland_keyboard.c b/dlls/winewayland.drv/wayland_keyboard.c index 5c2fe15273e..bdef56e8f0c 100644 --- a/dlls/winewayland.drv/wayland_keyboard.c +++ b/dlls/winewayland.drv/wayland_keyboard.c @@ -617,13 +617,29 @@ static BOOL find_xkb_layout_variant(const char *name, const char **layout, const return FALSE; }
+static BOOL get_async_key_state(BYTE state[256]) +{ + BOOL ret; + + SERVER_START_REQ(get_key_state) + { + req->async = 1; + req->key = -1; + wine_server_set_reply(req, state, 256); + ret = !wine_server_call(req); + } + SERVER_END_REQ; + + return ret; +} + static void release_all_keys(HWND hwnd) { BYTE state[256]; int vkey; INPUT input = {.type = INPUT_KEYBOARD};
- NtUserGetAsyncKeyboardState(state); + get_async_key_state(state);
for (vkey = 1; vkey < 256; vkey++) { diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c index 8c3e4f54437..5c08c1a2120 100644 --- a/dlls/winex11.drv/bitblt.c +++ b/dlls/winex11.drv/bitblt.c @@ -1882,7 +1882,7 @@ static const struct window_surface_funcs x11drv_surface_funcs = * create_surface */ static struct window_surface *create_surface( HWND hwnd, Window window, const XVisualInfo *vis, const RECT *rect, - BOOL use_alpha ) + COLORREF color_key, BOOL use_alpha ) { const XPixmapFormatValues *format = pixmap_formats[vis->depth]; char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )]; @@ -1946,9 +1946,15 @@ static struct window_surface *create_surface( HWND hwnd, Window window, const XV surface->window = window; surface->gc = XCreateGC( gdi_display, window, 0, NULL ); XSetSubwindowMode( gdi_display, surface->gc, IncludeInferiors ); +#ifdef HAVE_LIBXSHAPE + XShapeCombineMask( gdi_display, surface->window, ShapeBounding, 0, 0, None, ShapeSet ); +#endif
TRACE( "created %p for %lx %s image %p\n", surface, window, wine_dbgstr_rect(rect), surface->image->ximage->data );
+ if (use_alpha) window_surface_set_layered( &surface->header, color_key, -1, 0xff000000 ); + else window_surface_set_layered( &surface->header, color_key, -1, 0 ); + return &surface->header;
failed: @@ -1989,6 +1995,8 @@ HRGN expose_surface( struct window_surface *window_surface, const RECT *rect ) BOOL X11DRV_CreateWindowSurface( HWND hwnd, const RECT *surface_rect, struct window_surface **surface ) { struct x11drv_win_data *data; + DWORD flags; + COLORREF key; BOOL layered = NtUserGetWindowLongW( hwnd, GWL_EXSTYLE ) & WS_EX_LAYERED;
TRACE( "hwnd %p, surface_rect %s, surface %p\n", hwnd, wine_dbgstr_rect( surface_rect ), surface ); @@ -2014,7 +2022,10 @@ BOOL X11DRV_CreateWindowSurface( HWND hwnd, const RECT *surface_rect, struct win } }
- *surface = create_surface( data->hwnd, data->whole_window, &data->vis, surface_rect, FALSE ); + if (!layered || !NtUserGetLayeredWindowAttributes( hwnd, &key, NULL, &flags ) || !(flags & LWA_COLORKEY)) + key = CLR_INVALID; + + *surface = create_surface( data->hwnd, data->whole_window, &data->vis, surface_rect, key, FALSE );
done: release_win_data( data ); @@ -2039,10 +2050,12 @@ BOOL X11DRV_CreateLayeredWindow( HWND hwnd, const RECT *surface_rect, COLORREF c surface = data->surface; if (!surface || !EqualRect( &surface->rect, surface_rect )) { - data->surface = create_surface( data->hwnd, data->whole_window, &data->vis, surface_rect, data->use_alpha ); + data->surface = create_surface( data->hwnd, data->whole_window, &data->vis, surface_rect, + color_key, data->use_alpha ); if (surface) window_surface_release( surface ); surface = data->surface; } + else window_surface_set_layered( surface, color_key, -1, 0xff000000 );
if ((*window_surface = surface)) window_surface_add_ref( surface ); release_win_data( data ); diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index bb5bf6220e1..23f07b851a7 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -1135,6 +1135,24 @@ static void X11DRV_send_keyboard_input( HWND hwnd, WORD vkey, WORD scan, UINT fl }
+/*********************************************************************** + * get_async_key_state + */ +static BOOL get_async_key_state( BYTE state[256] ) +{ + BOOL ret; + + SERVER_START_REQ( get_key_state ) + { + req->async = 1; + req->key = -1; + wine_server_set_reply( req, state, 256 ); + ret = !wine_server_call( req ); + } + SERVER_END_REQ; + return ret; +} + /*********************************************************************** * set_async_key_state */ @@ -1187,7 +1205,7 @@ BOOL X11DRV_KeymapNotify( HWND hwnd, XEvent *event ) keymapnotify_hwnd = thread_data->keymapnotify_hwnd; thread_data->keymapnotify_hwnd = NULL;
- if (!NtUserGetAsyncKeyboardState( keystate )) return FALSE; + if (!get_async_key_state( keystate )) return FALSE;
memset(keys, 0, sizeof(keys));
@@ -1274,7 +1292,7 @@ static void adjust_lock_state( BYTE *keystate, HWND hwnd, WORD vkey, WORD scan, * to block changing state, we can't prevent it on X server side. Having * different states would cause us to try to adjust it again on the next * key event. We prevent that by overriding hooks and setting key states here. */ - if (NtUserGetAsyncKeyboardState( keystate ) && (keystate[vkey] & 0x01) == prev_state) + if (get_async_key_state( keystate ) && (keystate[vkey] & 0x01) == prev_state) { WARN("keystate %x not changed (%#.2x), probably blocked by hooks\n", vkey, keystate[vkey]); keystate[vkey] ^= 0x01; @@ -1289,7 +1307,7 @@ static void update_lock_state( HWND hwnd, WORD vkey, UINT state, UINT time ) /* Note: X sets the below states on key down and clears them on key up. Windows triggers them on key down. */
- if (!NtUserGetAsyncKeyboardState( keystate )) return; + if (!get_async_key_state( keystate )) return;
/* Adjust the CAPSLOCK state if it has been changed outside wine */ if (!(keystate[VK_CAPITAL] & 0x01) != !(state & LockMask) && vkey != VK_CAPITAL) diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 98cb7952164..9e51d76e5ab 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -374,23 +374,6 @@ static void sync_window_style( struct x11drv_win_data *data ) } }
-static void sync_empty_window_shape( struct x11drv_win_data *data ) -{ -#ifdef HAVE_LIBXSHAPE - if (IsRectEmpty( &data->window_rect )) /* set an empty shape */ - { - static XRectangle empty_rect; - XShapeCombineRectangles( data->display, data->whole_window, ShapeBounding, 0, 0, - &empty_rect, 1, ShapeSet, YXBanded ); - } - else - { - XShapeCombineMask( gdi_display, data->whole_window, ShapeBounding, 0, 0, None, ShapeSet ); - /* invalidate surface shape to make sure it gets updated again */ - if (data->surface) window_surface_set_shape( data->surface, 0 ); - } -#endif -}
/*********************************************************************** * sync_window_region @@ -403,6 +386,16 @@ static void sync_window_region( struct x11drv_win_data *data, HRGN win_region ) HRGN hrgn = win_region;
if (!data->whole_window) return; + + if (IsRectEmpty( &data->window_rect )) /* set an empty shape */ + { + static XRectangle empty_rect; + data->shaped = FALSE; + XShapeCombineRectangles( data->display, data->whole_window, ShapeBounding, 0, 0, + &empty_rect, 1, ShapeSet, YXBanded ); + return; + } + if (data->surface) return; /* use surface shape instead */ data->shaped = FALSE;
@@ -445,7 +438,8 @@ static void sync_window_region( struct x11drv_win_data *data, HRGN win_region ) /*********************************************************************** * sync_window_opacity */ -static void sync_window_opacity( Display *display, Window win, BYTE alpha, DWORD flags ) +static void sync_window_opacity( Display *display, Window win, + COLORREF key, BYTE alpha, DWORD flags ) { unsigned long opacity = 0xffffffff;
@@ -1441,7 +1435,7 @@ static void sync_window_position( struct x11drv_win_data *data, XReconfigureWMWindow( data->display, data->whole_window, data->vis.screen, mask, &changes ); #ifdef HAVE_LIBXSHAPE if (IsRectEmpty( old_window_rect ) != IsRectEmpty( &data->window_rect )) - sync_empty_window_shape( data ); + sync_window_region( data, (HRGN)1 ); if (data->shaped) { int old_x_offset = old_window_rect->left - old_whole_rect->left; @@ -1796,12 +1790,11 @@ static void create_whole_window( struct x11drv_win_data *data ) sync_window_text( data->display, data->whole_window, text );
/* set the window region */ - if (IsRectEmpty( &data->window_rect )) sync_empty_window_shape( data ); - else if (win_rgn) sync_window_region( data, win_rgn ); + if (win_rgn || IsRectEmpty( &data->window_rect )) sync_window_region( data, win_rgn );
/* set the window opacity */ if (!NtUserGetLayeredWindowAttributes( data->hwnd, &key, &alpha, &layered_flags )) layered_flags = 0; - sync_window_opacity( data->display, data->whole_window, alpha, layered_flags ); + sync_window_opacity( data->display, data->whole_window, key, alpha, layered_flags );
XFlush( data->display ); /* make sure the window exists before we start painting to it */
@@ -1926,7 +1919,8 @@ void X11DRV_SetWindowStyle( HWND hwnd, INT offset, STYLESTRUCT *style ) { data->layered = FALSE; set_window_visual( data, &default_visual, FALSE ); - sync_window_opacity( data->display, data->whole_window, 0, 0 ); + sync_window_opacity( data->display, data->whole_window, 0, 0, 0 ); + if (data->surface) window_surface_set_layered( data->surface, CLR_INVALID, -1, 0 ); } done: release_win_data( data ); @@ -2902,7 +2896,9 @@ void X11DRV_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alpha, DWO set_window_visual( data, &default_visual, FALSE );
if (data->whole_window) - sync_window_opacity( data->display, data->whole_window, alpha, flags ); + sync_window_opacity( data->display, data->whole_window, key, alpha, flags ); + if (data->surface) + window_surface_set_layered( data->surface, (flags & LWA_COLORKEY) ? key : CLR_INVALID, alpha << 24, 0 );
data->layered = TRUE; if (!data->mapped) /* mapping is delayed until attributes are set */ @@ -2924,7 +2920,7 @@ void X11DRV_SetLayeredWindowAttributes( HWND hwnd, COLORREF key, BYTE alpha, DWO Window win = X11DRV_get_whole_window( hwnd ); if (win) { - sync_window_opacity( gdi_display, win, alpha, flags ); + sync_window_opacity( gdi_display, win, key, alpha, flags ); if (flags & LWA_COLORKEY) FIXME( "LWA_COLORKEY not supported on foreign process window %p\n", hwnd ); } diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index e8e286145ca..d579d72583e 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -685,7 +685,7 @@ static BOOL return_string_option( WCHAR *buffer, const WCHAR *str, LPDWORD bufle { int len = sizeof(WCHAR); if (str) len += lstrlenW( str ) * sizeof(WCHAR); - if (buffer && *buflen >= len) + if (buffer && *buflen > len) { if (str) memcpy( buffer, str, len ); len -= sizeof(WCHAR); diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 5ea0c45b183..a1f8c15e356 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -3332,13 +3332,6 @@ static void test_redirect(int port) ok(ret, "got %lu\n", GetLastError()); ok(!wcscmp(url, expected), "expected %s got %s\n", wine_dbgstr_w(expected), wine_dbgstr_w(url));
- /* Exact buffer size match. */ - url[0] = 0; - size = (lstrlenW(expected) + 1) * sizeof(WCHAR); - ret = WinHttpQueryOption(req, WINHTTP_OPTION_URL, url, &size); - ok(ret, "got %lu\n", GetLastError()); - ok(!wcscmp(url, expected), "expected %s got %s\n", wine_dbgstr_w(expected), wine_dbgstr_w(url)); - ret = WinHttpReceiveResponse(req, NULL); ok(ret, "failed to receive response %lu\n", GetLastError());
@@ -4424,14 +4417,6 @@ static void test_credentials(void) ok(!wcscmp(buffer, proxy_userW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(proxy_userW) * sizeof(WCHAR), "unexpected result %lu\n", size);
- /* Exact buffer size match. */ - size = (lstrlenW(proxy_userW) + 1) * sizeof(WCHAR); - buffer[0] = 0; - ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, &buffer, &size); - ok(ret, "failed to query proxy username %lu\n", GetLastError()); - ok(!wcscmp(buffer, proxy_userW), "unexpected result %s\n", wine_dbgstr_w(buffer)); - ok(size == lstrlenW(proxy_userW) * sizeof(WCHAR), "unexpected result %lu\n", size); - buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_USERNAME, &buffer, &size); @@ -4478,14 +4463,6 @@ static void test_credentials(void) ok(!wcscmp(buffer, proxy_passW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(proxy_passW) * sizeof(WCHAR), "unexpected result %lu\n", size);
- /* Exact buffer size match. */ - size = (lstrlenW(proxy_passW) + 1) * sizeof(WCHAR); - buffer[0] = 0; - ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, &buffer, &size); - ok(ret, "failed to query proxy password %lu\n", GetLastError()); - ok(!wcscmp(buffer, proxy_passW), "unexpected result %s\n", wine_dbgstr_w(buffer)); - ok(size == lstrlenW(proxy_passW) * sizeof(WCHAR), "unexpected result %lu\n", size); - buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PROXY_PASSWORD, &buffer, &size); @@ -4508,14 +4485,6 @@ static void test_credentials(void) ok(!wcscmp(buffer, userW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(userW) * sizeof(WCHAR), "unexpected result %lu\n", size);
- /* Exact buffer size match. */ - size = (lstrlenW(userW) + 1) * sizeof(WCHAR); - buffer[0] = 0; - ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, &buffer, &size); - ok(ret, "failed to query username %lu\n", GetLastError()); - ok(!wcscmp(buffer, userW), "unexpected result %s\n", wine_dbgstr_w(buffer)); - ok(size == lstrlenW(userW) * sizeof(WCHAR), "unexpected result %lu\n", size); - buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_USERNAME, &buffer, &size); @@ -4538,14 +4507,6 @@ static void test_credentials(void) ok(!wcscmp(buffer, passW), "unexpected result %s\n", wine_dbgstr_w(buffer)); ok(size == lstrlenW(passW) * sizeof(WCHAR), "unexpected result %lu\n", size);
- /* Exact buffer size match. */ - buffer[0] = 0; - size = (lstrlenW(passW) + 1) * sizeof(WCHAR); - ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, &buffer, &size); - ok(ret, "failed to query password %lu\n", GetLastError()); - ok(!wcscmp(buffer, passW), "unexpected result %s\n", wine_dbgstr_w(buffer)); - ok(size == lstrlenW(passW) * sizeof(WCHAR), "unexpected result %lu\n", size); - buffer[0] = 0x1; SetLastError(0xdeadbeef); ret = WinHttpQueryOption(req, WINHTTP_OPTION_PASSWORD, &buffer, &size); @@ -5111,9 +5072,8 @@ static void test_IWinHttpRequest(int port) SysFreeString( url );
hr = IWinHttpRequest_Send( req, empty ); - ok( hr == S_OK || - hr == HRESULT_FROM_WIN32( ERROR_WINHTTP_INVALID_SERVER_RESPONSE ) || - hr == HRESULT_FROM_WIN32( ERROR_WINHTTP_SECURE_CHANNEL_ERROR ) /* win7 */, "got %#lx\n", hr ); + ok( hr == S_OK || hr == HRESULT_FROM_WIN32( ERROR_WINHTTP_INVALID_SERVER_RESPONSE ) || + hr == SEC_E_ILLEGAL_MESSAGE /* winxp */, "got %#lx\n", hr ); if (hr != S_OK) goto done;
hr = IWinHttpRequest_get_ResponseText( req, &response ); @@ -5796,9 +5756,7 @@ static void test_max_http_automatic_redirects (void) size = sizeof(url); ret = WinHttpQueryOption(request, WINHTTP_OPTION_URL, url, &size); ok(ret, "got %lu\n", GetLastError()); - ok(!wcscmp(url, L"http://test.winehq.org/tests/redirecttest.php?id=2&max=3") || - broken(!wcscmp(url, L"http://test.winehq.org/tests/redirecttest.php?id=1&max=3")) /* < Win10 1809 */, - "got %s\n", wine_dbgstr_w(url)); + ok(!wcscmp(url, L"http://test.winehq.org/tests/redirecttest.php?id=2&max=3"), "got %s\n", wine_dbgstr_w(url));
done: ret = WinHttpCloseHandle(request); @@ -6054,6 +6012,7 @@ static const BYTE pfxdata[] = static void test_client_cert_authentication(void) { HINTERNET ses, req, con; + DWORD protocols; BOOL ret; CRYPT_DATA_BLOB pfx; HCERTSTORE store; @@ -6062,6 +6021,16 @@ static void test_client_cert_authentication(void) ses = WinHttpOpen( L"winetest", WINHTTP_ACCESS_TYPE_NO_PROXY, NULL, NULL, 0 ); ok( ses != NULL, "failed to open session %lu\n", GetLastError() );
+ protocols = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1; + ret = WinHttpSetOption( ses, WINHTTP_OPTION_SECURE_PROTOCOLS, &protocols, sizeof(protocols) ); + if (!ret && GetLastError() == ERROR_INVALID_PARAMETER) /* vista */ + { + win_skip( "can't set secure protocols\n" ); + WinHttpCloseHandle( ses ); + return; + } + ok( ret, "failed to set protocols %lu\n", GetLastError() ); + con = WinHttpConnect( ses, L"test.winehq.org", 443, 0 ); ok( con != NULL, "failed to open a connection %lu\n", GetLastError() );
@@ -6069,9 +6038,7 @@ static void test_client_cert_authentication(void) ok( req != NULL, "failed to open a request %lu\n", GetLastError() );
ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); - ok( ret || broken(!ret && GetLastError() == ERROR_WINHTTP_SECURE_FAILURE) /* win7 */, - "failed to send request %lu\n", GetLastError() ); - if (!ret) goto done; + ok( ret, "failed to send request %lu\n", GetLastError() );
SetLastError( 0xdeadbeef ); ret = WinHttpReceiveResponse( req, NULL ); @@ -6096,13 +6063,11 @@ static void test_client_cert_authentication(void) ret = WinHttpReceiveResponse( req, NULL ); todo_wine { ok( !ret, "unexpected success\n" ); - ok( GetLastError() == ERROR_WINHTTP_SECURE_FAILURE || GetLastError() == SEC_E_CERT_EXPIRED, /* win8 */ - "got %lu\n", GetLastError() ); + ok( GetLastError() == SEC_E_CERT_EXPIRED, "got %lu\n", GetLastError() ); }
CertFreeCertificateContext( cert ); CertCloseStore( store, 0 ); -done: WinHttpCloseHandle( req ); WinHttpCloseHandle( con ); WinHttpCloseHandle( ses ); diff --git a/dlls/wow64/process.c b/dlls/wow64/process.c index d117c158096..4a769c042c5 100644 --- a/dlls/wow64/process.c +++ b/dlls/wow64/process.c @@ -1061,12 +1061,7 @@ NTSTATUS WINAPI wow64_NtTerminateProcess( UINT *args ) HANDLE handle = get_handle( &args ); LONG exit_code = get_ulong( &args );
- NTSTATUS status; - - if (!handle && pBTCpuProcessTerm) pBTCpuProcessTerm( handle, FALSE, 0 ); - status = NtTerminateProcess( handle, exit_code ); - if (!handle && pBTCpuProcessTerm) pBTCpuProcessTerm( handle, TRUE, status ); - return status; + return NtTerminateProcess( handle, exit_code ); }
@@ -1078,7 +1073,7 @@ NTSTATUS WINAPI wow64_NtTerminateThread( UINT *args ) HANDLE handle = get_handle( &args ); LONG exit_code = get_ulong( &args );
- if (pBTCpuThreadTerm) pBTCpuThreadTerm( handle, exit_code ); + if (pBTCpuThreadTerm) pBTCpuThreadTerm( handle );
return NtTerminateThread( handle, exit_code ); } diff --git a/dlls/wow64/syscall.c b/dlls/wow64/syscall.c index 55433f13569..c436a2e1ea3 100644 --- a/dlls/wow64/syscall.c +++ b/dlls/wow64/syscall.c @@ -115,8 +115,7 @@ void (WINAPI *pBTCpuNotifyReadFile)( HANDLE, void *, SIZE_T, BOOL, NTSTATUS void (WINAPI *pBTCpuNotifyUnmapViewOfSection)( void *, BOOL, NTSTATUS ) = NULL; NTSTATUS (WINAPI *pBTCpuResetToConsistentState)( EXCEPTION_POINTERS * ) = NULL; void (WINAPI *pBTCpuUpdateProcessorInformation)( SYSTEM_CPU_INFORMATION * ) = NULL; -void (WINAPI *pBTCpuProcessTerm)( HANDLE, BOOL, NTSTATUS ) = NULL; -void (WINAPI *pBTCpuThreadTerm)( HANDLE, LONG ) = NULL; +void (WINAPI *pBTCpuThreadTerm)( HANDLE ) = NULL;
BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, void *reserved ) { @@ -815,7 +814,6 @@ static DWORD WINAPI process_init( RTL_RUN_ONCE *once, void *param, void **contex GET_PTR( BTCpuNotifyReadFile ); GET_PTR( BTCpuNotifyUnmapViewOfSection ); GET_PTR( BTCpuUpdateProcessorInformation ); - GET_PTR( BTCpuProcessTerm ); GET_PTR( BTCpuThreadTerm ); GET_PTR( __wine_get_unix_opcode );
diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h index deca72d445c..d6a8c740ba4 100644 --- a/dlls/wow64/wow64_private.h +++ b/dlls/wow64/wow64_private.h @@ -49,8 +49,7 @@ extern void (WINAPI *pBTCpuNotifyMemoryProtect)( void *, SIZE_T, ULONG, BOOL extern void (WINAPI *pBTCpuNotifyReadFile)( HANDLE, void *, SIZE_T, BOOL, NTSTATUS ); extern void (WINAPI *pBTCpuNotifyUnmapViewOfSection)( void *, BOOL, NTSTATUS ); extern void (WINAPI *pBTCpuUpdateProcessorInformation)( SYSTEM_CPU_INFORMATION * ); -extern void (WINAPI *pBTCpuProcessTerm)( HANDLE, BOOL, NTSTATUS ); -extern void (WINAPI *pBTCpuThreadTerm)( HANDLE, LONG ); +extern void (WINAPI *pBTCpuThreadTerm)( HANDLE );
struct object_attr64 { diff --git a/dlls/wow64win/user.c b/dlls/wow64win/user.c index db0fed3d97d..2f41820abbd 100644 --- a/dlls/wow64win/user.c +++ b/dlls/wow64win/user.c @@ -1457,17 +1457,20 @@ static NTSTATUS WINAPI wow64_NtUserThunkLock( void *arg, ULONG size )
static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugReportCallback( void *arg, ULONG size ) { - return dispatch_callback( NtUserCallVulkanDebugReportCallback, arg, size ); + FIXME( "\n" ); + return 0; }
static NTSTATUS WINAPI wow64_NtUserCallVulkanDebugUtilsCallback( void *arg, ULONG size ) { - return dispatch_callback( NtUserCallVulkanDebugUtilsCallback, arg, size ); + FIXME( "\n" ); + return 0; }
static NTSTATUS WINAPI wow64_NtUserCallOpenGLDebugMessageCallback( void *arg, ULONG size ) { - return dispatch_callback( NtUserCallOpenGLDebugMessageCallback, arg, size ); + FIXME( "\n" ); + return 0; }
static NTSTATUS WINAPI wow64_NtUserDriverCallbackFirst0( void *arg, ULONG size ) diff --git a/dlls/xaudio2_7/xaudio_dll.c b/dlls/xaudio2_7/xaudio_dll.c index 43537589823..a51bb499793 100644 --- a/dlls/xaudio2_7/xaudio_dll.c +++ b/dlls/xaudio2_7/xaudio_dll.c @@ -1353,14 +1353,14 @@ static void WINAPI XA2M_DestroyVoice(IXAudio2MasteringVoice *iface) }
#if XAUDIO2_VER >= 8 -static HRESULT WINAPI XA2M_GetChannelMask(IXAudio2MasteringVoice *iface, +static void WINAPI XA2M_GetChannelMask(IXAudio2MasteringVoice *iface, DWORD *pChannelMask) { XA2VoiceImpl *This = impl_from_IXAudio2MasteringVoice(iface);
TRACE("%p, %p\n", This, pChannelMask);
- return FAudioMasteringVoice_GetChannelMask(This->faudio_voice, (uint32_t *)pChannelMask); + FAudioMasteringVoice_GetChannelMask(This->faudio_voice, (uint32_t *)pChannelMask); } #endif
diff --git a/dlls/xtajit64/cpu.c b/dlls/xtajit64/cpu.c index fec5f233eec..82d741dde82 100644 --- a/dlls/xtajit64/cpu.c +++ b/dlls/xtajit64/cpu.c @@ -193,15 +193,6 @@ NTSTATUS WINAPI ProcessInit(void) }
-/********************************************************************** - * ProcessTerm (xtajit64.@) - */ -void WINAPI ProcessTerm( HANDLE handle, BOOL is_post, NTSTATUS status ) -{ - TRACE( "%p\n", handle ); -} - - /********************************************************************** * ThreadInit (xtajit64.@) */ @@ -211,15 +202,6 @@ NTSTATUS WINAPI ThreadInit(void) }
-/********************************************************************** - * ThreadTerm (xtajit64.@) - */ -void WINAPI ThreadTerm( HANDLE handle, LONG exit_code ) -{ - TRACE( "%p %lx\n", handle, exit_code ); -} - - /********************************************************************** * UpdateProcessorInformation (xtajit64.@) */ diff --git a/dlls/xtajit64/xtajit64.spec b/dlls/xtajit64/xtajit64.spec index 2da5d1dc49b..83d8e56dd2d 100644 --- a/dlls/xtajit64/xtajit64.spec +++ b/dlls/xtajit64/xtajit64.spec @@ -13,8 +13,8 @@ @ stdcall NotifyMemoryProtect(ptr long long long long) @ stdcall NotifyUnmapViewOfSection(ptr long long) @ stdcall ProcessInit() -@ stdcall ProcessTerm(ptr long long) +#@ stub ProcessTerm #@ stub ResetToConsistentState @ stdcall ThreadInit() -@ stdcall ThreadTerm(ptr long) +#@ stub ThreadTerm @ stdcall UpdateProcessorInformation(ptr) diff --git a/include/ntuser.h b/include/ntuser.h index 4148c8cf0b6..bd11567290f 100644 --- a/include/ntuser.h +++ b/include/ntuser.h @@ -912,7 +912,6 @@ enum NtUserCallOneParam_SetKeyboardAutoRepeat, NtUserCallOneParam_SetThreadDpiAwarenessContext, NtUserCallOneParam_D3DKMTOpenAdapterFromGdiDisplayName, - NtUserCallOneParam_GetAsyncKeyboardState, /* temporary exports */ NtUserGetDeskPattern, }; @@ -1038,11 +1037,6 @@ static inline NTSTATUS NtUserD3DKMTOpenAdapterFromGdiDisplayName( D3DKMT_OPENADA return NtUserCallOneParam( (UINT_PTR)desc, NtUserCallOneParam_D3DKMTOpenAdapterFromGdiDisplayName ); }
-static inline BOOL NtUserGetAsyncKeyboardState( BYTE state[256] ) -{ - return NtUserCallOneParam( (UINT_PTR)state, NtUserCallOneParam_GetAsyncKeyboardState ); -} - /* NtUserCallTwoParam codes, not compatible with Windows */ enum { diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h index d389d5d22d0..08353f11811 100644 --- a/include/wine/mscvpdb.h +++ b/include/wine/mscvpdb.h @@ -83,11 +83,10 @@ * symbol size (to be greater than 256), which was likely needed for * complex C++ types (nested + templates). * - * It's not possible to represent some disk layout with C structures - * as there are several contiguous entries of variable length. - * Of example of them is called 'numeric leaf' and represent several - * leaf values (integers, reals...). - * All of these contiguous values are packed in a flexible array member. + * It's somehow difficult to represent the layout of those types on + * disk because: + * - some integral values are stored as numeric leaf, which size is + * variable depending on its value * * Symbols internal stream * ----------------------- @@ -102,13 +101,10 @@ * Internal types * ======================================== */
-/* First versions (v1, v2) of CV data is stored as Pascal strings. - * Third version uses C string instead. - */ struct p_string { unsigned char namelen; - char name[]; + char name[1]; };
typedef unsigned short cv_typ16_t; @@ -187,9 +183,10 @@ union codeview_type unsigned short int id; cv_typ16_t elemtype; cv_typ16_t idxtype; - unsigned char data[]; - /* <numeric leaf> arrlen; */ - /* struct p_string p_name; */ + unsigned short int arrlen; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } array_v1;
struct @@ -198,9 +195,10 @@ union codeview_type unsigned short int id; cv_typ_t elemtype; cv_typ_t idxtype; - unsigned char data[]; - /* <numeric leaf> arrlen; */ - /* struct p_string p_name; */ + unsigned short int arrlen; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } array_v2;
struct @@ -209,9 +207,10 @@ union codeview_type unsigned short int id; cv_typ_t elemtype; cv_typ_t idxtype; - unsigned char data[]; - /* <numeric leaf> arrlen; */ - /* char name[]; */ + unsigned short int arrlen; /* numeric leaf */ +#if 0 + char name[1]; +#endif } array_v3;
struct @@ -223,9 +222,10 @@ union codeview_type cv_property_t property; cv_typ16_t derived; cv_typ16_t vshape; - unsigned char data[]; - /* <numeric leaf> structlen; */ - /* struct p_string p_name; */ + unsigned short int structlen; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } struct_v1;
struct @@ -237,9 +237,10 @@ union codeview_type cv_typ_t fieldlist; cv_typ_t derived; cv_typ_t vshape; - unsigned char data[]; - /* <numeric leaf> structlen; */ - /* struct p_string p_name; */ + unsigned short int structlen; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } struct_v2;
struct @@ -251,9 +252,10 @@ union codeview_type cv_typ_t fieldlist; cv_typ_t derived; cv_typ_t vshape; - unsigned char data[]; - /* <numeric leaf> structlen; */ - /* char name[]; */ + unsigned short int structlen; /* numeric leaf */ +#if 0 + char name[1]; +#endif } struct_v3;
struct @@ -263,9 +265,10 @@ union codeview_type short int count; cv_typ16_t fieldlist; cv_property_t property; - unsigned char data[]; - /* <numeric leaf> unionlen; */ - /* struct p_string p_name; */ + unsigned short int un_len; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } union_v1;
struct @@ -275,9 +278,10 @@ union codeview_type short int count; cv_property_t property; cv_typ_t fieldlist; - unsigned char data[]; - /* <numeric leaf> unionlen; */ - /* struct p_string p_name; */ + unsigned short int un_len; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } union_v2;
struct @@ -287,9 +291,10 @@ union codeview_type short int count; cv_property_t property; cv_typ_t fieldlist; - unsigned char data[]; - /* <numeric leaf> unionlen; */ - /* char name[]; */ + unsigned short int un_len; /* numeric leaf */ +#if 0 + char name[1]; +#endif } union_v3;
struct @@ -322,7 +327,7 @@ union codeview_type cv_property_t property; cv_typ_t type; cv_typ_t fieldlist; - char name[]; + char name[1]; } enumeration_v3;
struct @@ -382,7 +387,7 @@ union codeview_type unsigned short int id; /* LF_FUNC_ID */ cv_itemid_t scopeId; cv_typ_t type; - char name[]; + char name[1]; } func_id_v3;
struct @@ -391,7 +396,7 @@ union codeview_type unsigned short int id; /* LF_MFUNC_ID */ cv_typ_t parentType; cv_typ_t type; - char name[]; + char name[1]; } mfunc_id_v3;
struct @@ -399,7 +404,7 @@ union codeview_type unsigned short int len; unsigned short int id; /* LF_STRING_ID */ cv_itemid_t strid; - char name[]; + char name[1]; } string_id_v3;
struct @@ -426,7 +431,7 @@ union codeview_type unsigned short int len; unsigned short int id; /* LF_BUILDINFO */ unsigned short count; - cv_itemid_t arg[]; + cv_itemid_t arg[1]; } buildinfo_v3;
}; @@ -443,7 +448,7 @@ union codeview_reftype { unsigned short int len; unsigned short int id; - unsigned char list[]; + unsigned char list[1]; } fieldlist;
struct @@ -469,7 +474,7 @@ union codeview_reftype unsigned short int len; unsigned short int id; unsigned short num; - cv_typ16_t args[]; + cv_typ16_t args[1]; } arglist_v1;
struct @@ -477,7 +482,7 @@ union codeview_reftype unsigned short int len; unsigned short int id; unsigned num; - cv_typ_t args[]; + cv_typ_t args[1]; } arglist_v2;
struct @@ -485,7 +490,7 @@ union codeview_reftype unsigned short int len; unsigned short int id; unsigned short num; - cv_typ16_t drvdcls[]; + cv_typ16_t drvdcls[1]; } derived_v1;
struct @@ -493,7 +498,7 @@ union codeview_reftype unsigned short int len; unsigned short int id; unsigned num; - cv_typ_t drvdcls[]; + cv_typ_t drvdcls[1]; } derived_v2;
struct @@ -504,7 +509,7 @@ union codeview_reftype cv_typ_t baseVftable; unsigned offsetInObjectLayout; unsigned cbstr; - char names[]; /* array of len 0-terminated strings (size of cbstr in char:s) */ + char names[1]; /* array of len 0-terminated strings (size of cbstr in char:s) */ } vftable_v3; };
@@ -520,8 +525,7 @@ union codeview_fieldtype unsigned short int id; cv_typ16_t type; short int attribute; - unsigned char data[]; - /* <numeric leaf> offset; */ + unsigned short int offset; /* numeric leaf */ } bclass_v1;
struct @@ -529,8 +533,7 @@ union codeview_fieldtype unsigned short int id; short int attribute; cv_typ_t type; - unsigned char data[]; - /* <numeric leaf> offset; */ + unsigned short int offset; /* numeric leaf */ } bclass_v2;
struct @@ -539,9 +542,10 @@ union codeview_fieldtype cv_typ16_t btype; cv_typ16_t vbtype; short int attribute; - unsigned char data[]; - /* <numeric leaf> vbpoff; */ - /* <numeric leaf> vboff; */ + unsigned short int vbpoff; /* numeric leaf */ +#if 0 + unsigned short int vboff; /* numeric leaf */ +#endif } vbclass_v1;
struct @@ -550,27 +554,30 @@ union codeview_fieldtype short int attribute; cv_typ_t btype; cv_typ_t vbtype; - unsigned char data[]; - /* <numeric leaf> vbpoff; */ - /* <numeric leaf> vboff; */ + unsigned short int vbpoff; /* numeric leaf */ +#if 0 + unsigned short int vboff; /* numeric leaf */ +#endif } vbclass_v2;
struct { unsigned short int id; short int attribute; - unsigned char data[]; - /* <numeric leaf> value; */ - /* struct p_string p_name; */ + unsigned short int value; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } enumerate_v1;
struct { unsigned short int id; short int attribute; - unsigned char data[]; - /* <numeric leaf> value; */ - /* char name[]; */ + unsigned short int value; /* numeric leaf */ +#if 0 + char name[1]; +#endif } enumerate_v3;
struct @@ -593,7 +600,7 @@ union codeview_fieldtype unsigned short int id; short int _pad0; cv_typ_t type; - char name[]; + char name[1]; } friendfcn_v3;
struct @@ -601,9 +608,10 @@ union codeview_fieldtype unsigned short int id; cv_typ16_t type; short int attribute; - unsigned char data[]; - /* <numeric leaf> offset; */ - /* struct p_string p_name; */ + unsigned short int offset; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } member_v1;
struct @@ -611,9 +619,10 @@ union codeview_fieldtype unsigned short int id; short int attribute; cv_typ_t type; - unsigned char data[]; - /* <numeric leaf> offset; */ - /* struct p_string p_name; */ + unsigned short int offset; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } member_v2;
struct @@ -621,9 +630,10 @@ union codeview_fieldtype unsigned short int id; short int attribute; cv_typ_t type; - unsigned char data[]; - /* <numeric leaf> offset; */ - /* char name[]; */ + unsigned short int offset; /* numeric leaf */ +#if 0 + char name[1]; +#endif } member_v3;
@@ -648,7 +658,7 @@ union codeview_fieldtype unsigned short int id; short int attribute; cv_typ_t type; - char name[]; + char name[1]; } stmember_v3;
struct @@ -672,7 +682,7 @@ union codeview_fieldtype unsigned short int id; short int count; cv_typ_t mlist; - char name[]; + char name[1]; } method_v3;
struct @@ -695,7 +705,7 @@ union codeview_fieldtype unsigned short int id; short int _pad0; cv_typ_t type; - char name[]; + char name[1]; } nesttype_v3;
struct @@ -745,7 +755,7 @@ union codeview_fieldtype unsigned short int id; short int attribute; cv_typ_t type; - char name[]; + char name[1]; } onemethod_v3;
struct @@ -772,7 +782,7 @@ union codeview_fieldtype short int attribute; cv_typ_t type; unsigned int vtab_offset; - char name[]; + char name[1]; } onemethod_virt_v3;
struct @@ -1416,7 +1426,7 @@ union codeview_symbol cv_typ_t symtype; unsigned int offset; unsigned short segment; - char name[]; + char name[1]; } data_v3;
struct @@ -1444,7 +1454,7 @@ union codeview_symbol unsigned short segment; unsigned short thunk_len; unsigned char thtype; - char name[]; + char name[1]; } thunk_v3;
struct @@ -1495,7 +1505,7 @@ union codeview_symbol unsigned int offset; unsigned short segment; unsigned char flags; - char name[]; + char name[1]; } proc_v3;
struct @@ -1525,7 +1535,7 @@ union codeview_symbol unsigned int pubsymflags; unsigned int offset; unsigned short segment; - char name[]; + char name[1]; } public_v3;
struct @@ -1552,7 +1562,7 @@ union codeview_symbol unsigned short int id; /* Always S_BPREL32 */ int offset; /* Stack offset relative to BP */ cv_typ_t symtype; - char name[]; + char name[1]; } stack_v3;
struct @@ -1562,7 +1572,7 @@ union codeview_symbol int offset; /* Stack offset relative to BP */ cv_typ_t symtype; unsigned short reg; - char name[]; + char name[1]; } regrel_v3;
struct @@ -1591,7 +1601,7 @@ union codeview_symbol unsigned short int id; /* Always S_REGISTER */ cv_typ_t type; /* check whether type & reg are correct */ unsigned short reg; - char name[]; + char name[1]; /* don't handle register tracking */ } register_v3;
@@ -1616,7 +1626,7 @@ union codeview_symbol unsigned int length; unsigned int offset; unsigned short segment; - char name[]; + char name[1]; } block_v3;
struct @@ -1648,7 +1658,7 @@ union codeview_symbol unsigned int offset; unsigned short segment; unsigned char flags; - char name[]; + char name[1]; } label_v3;
struct @@ -1656,9 +1666,10 @@ union codeview_symbol unsigned short int len; unsigned short int id; cv_typ16_t type; - unsigned char data[]; - /* <numeric leaf> cvalue; */ - /* struct p_string p_name; */ + unsigned short cvalue; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } constant_v1;
struct @@ -1666,9 +1677,10 @@ union codeview_symbol unsigned short int len; unsigned short int id; cv_typ_t type; - unsigned char data[]; - /* <numeric leaf> cvalue; */ - /* struct p_string p_name; */ + unsigned short cvalue; /* numeric leaf */ +#if 0 + struct p_string p_name; +#endif } constant_v2;
struct @@ -1676,9 +1688,10 @@ union codeview_symbol unsigned short int len; unsigned short int id; cv_typ_t type; - unsigned char data[]; - /* <numeric leaf> cvalue; */ - /* char name; */ + unsigned short cvalue; +#if 0 + char name[1]; +#endif } constant_v3;
struct @@ -1702,7 +1715,7 @@ union codeview_symbol unsigned short int len; unsigned short int id; cv_typ_t type; - char name[]; + char name[1]; } udt_v3;
struct @@ -1718,7 +1731,7 @@ union codeview_symbol unsigned short int len; unsigned short int id; unsigned signature; - char name[]; + char name[1]; } objname_v3;
struct @@ -1770,7 +1783,7 @@ union codeview_symbol unsigned short be_major; unsigned short be_minor; unsigned short be_build; - char name[]; + char name[1]; } compile2_v3;
struct @@ -1791,7 +1804,7 @@ union codeview_symbol unsigned short be_minor; unsigned short be_build; unsigned short be_qfe; - char name[]; + char name[1]; } compile3_v3;
struct @@ -1821,7 +1834,7 @@ union codeview_symbol cv_typ_t symtype; unsigned int offset; unsigned short segment; - char name[]; + char name[1]; } thread_v3;
struct @@ -1831,7 +1844,7 @@ union codeview_symbol unsigned int sumName; unsigned int ibSym; unsigned short imod; - char name[]; + char name[1]; } refsym2_v3;
struct @@ -1879,7 +1892,7 @@ union codeview_symbol unsigned short int id; cv_typ_t symtype; struct cv_local_varflag varflags; - char name[]; + char name[1]; } local_v3;
struct @@ -1888,7 +1901,7 @@ union codeview_symbol unsigned short int id; unsigned int program; struct cv_addr_range range; - struct cv_addr_gap gaps[]; + struct cv_addr_gap gaps[0]; } defrange_v3;
struct @@ -1898,7 +1911,7 @@ union codeview_symbol unsigned int program; unsigned int offParent; struct cv_addr_range range; - struct cv_addr_gap gaps[]; + struct cv_addr_gap gaps[0]; } defrange_subfield_v3;
struct @@ -1908,7 +1921,7 @@ union codeview_symbol unsigned short reg; unsigned short attr; struct cv_addr_range range; - struct cv_addr_gap gaps[]; + struct cv_addr_gap gaps[0]; } defrange_register_v3;
struct @@ -1917,7 +1930,7 @@ union codeview_symbol unsigned short int id; int offFramePointer; struct cv_addr_range range; - struct cv_addr_gap gaps[]; + struct cv_addr_gap gaps[0]; } defrange_frameptrrel_v3;
struct @@ -1995,9 +2008,10 @@ union codeview_symbol unsigned short int len; unsigned short int id; unsigned int count; - unsigned char data[]; - /* cv_typ_t functions[count]; */ - /* unsigned int invocations[count]; */ + cv_typ_t funcs[0]; /* array of cuntions, count entries */ +#if 0 + unsigned int invocations[0]; /* array of count entries, paires with funcs */ +#endif } function_list_v3;
struct @@ -2007,7 +2021,7 @@ union codeview_symbol cv_typ_t typind; unsigned int modOffset; struct cv_local_varflag varflags; - char name[]; + char name[1]; } file_static_v3;
struct @@ -2021,7 +2035,7 @@ union codeview_symbol { unsigned short int len; unsigned short int id; - char name[]; + char name[1]; } unamespace_v3;
struct @@ -2045,7 +2059,7 @@ union codeview_symbol unsigned int off; unsigned short int seg; unsigned short int csz; /* number of bytes in following array */ - char rgsz[]; /* array of null terminated strings (bounded by csz) */ + char rgsz[1]; /* array of null terminated strings (bounded by csz) */ } annotation_v3;
struct @@ -2346,9 +2360,8 @@ struct codeview_linetab_block { unsigned short seg; unsigned short num_lines; - unsigned char data[]; - /* unsigned int offsets[num_lines]; */ - /* unsigned short linenos[]; */ + unsigned int offsets[1]; /* in fact num_lines */ +/* unsigned short linenos[]; */ };
struct startend @@ -2376,7 +2389,7 @@ struct PDB_JG_HEADER unsigned short free_list_block; unsigned short total_alloc; struct PDB_JG_STREAM toc; - unsigned short toc_block[]; + unsigned short toc_block[1]; };
struct PDB_DS_HEADER @@ -2393,13 +2406,13 @@ struct PDB_DS_HEADER struct PDB_JG_TOC { unsigned int num_streams; - struct PDB_JG_STREAM streams[]; + struct PDB_JG_STREAM streams[1]; };
struct PDB_DS_TOC { unsigned int num_streams; - unsigned int stream_size[]; + unsigned int stream_size[1]; };
struct PDB_JG_ROOT @@ -2408,7 +2421,7 @@ struct PDB_JG_ROOT unsigned int TimeDateStamp; unsigned int Age; unsigned int cbNames; - char names[]; + char names[1]; };
struct PDB_DS_ROOT @@ -2418,7 +2431,7 @@ struct PDB_DS_ROOT unsigned int Age; GUID guid; unsigned int cbNames; - char names[]; + char names[1]; };
typedef struct _PDB_TYPES_OLD @@ -2485,7 +2498,7 @@ typedef struct _PDB_SYMBOL_FILE unsigned int lineno2_size; unsigned int nSrcFiles; unsigned int attribute; - char filename[]; + char filename[1]; } PDB_SYMBOL_FILE, *PPDB_SYMBOL_FILE;
typedef struct _PDB_SYMBOL_FILE_EX @@ -2500,14 +2513,14 @@ typedef struct _PDB_SYMBOL_FILE_EX unsigned int nSrcFiles; unsigned int attribute; unsigned int reserved[2]; - char filename[]; + char filename[1]; } PDB_SYMBOL_FILE_EX, *PPDB_SYMBOL_FILE_EX;
typedef struct _PDB_SYMBOL_SOURCE { unsigned short nModules; unsigned short nSrcFiles; - unsigned short table[]; + unsigned short table[1]; } PDB_SYMBOL_SOURCE, *PPDB_SYMBOL_SOURCE;
typedef struct _PDB_SYMBOL_IMPORT @@ -2516,7 +2529,7 @@ typedef struct _PDB_SYMBOL_IMPORT unsigned int unknown2; unsigned int TimeDateStamp; unsigned int Age; - char filename[]; + char filename[1]; } PDB_SYMBOL_IMPORT, *PPDB_SYMBOL_IMPORT;
typedef struct _PDB_SYMBOLS_OLD @@ -2670,7 +2683,7 @@ typedef struct OMFSignatureRSDS char Signature[4]; GUID guid; unsigned int age; - char name[]; + char name[1]; } OMFSignatureRSDS;
typedef struct _CODEVIEW_PDB_DATA @@ -2679,7 +2692,7 @@ typedef struct _CODEVIEW_PDB_DATA int filepos; unsigned int timestamp; unsigned int age; - char name[]; + char name[1]; } CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
typedef struct OMFDirHeader diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 13002594662..411ced944a3 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -919,8 +919,6 @@ typedef volatile struct rectangle_t caret_rect; user_handle_t cursor; int cursor_count; - unsigned char keystate[256]; - int keystate_lock; } input_shm_t;
typedef volatile union @@ -4095,6 +4093,7 @@ struct get_key_state_reply { struct reply_header __header; unsigned char state; + /* VARARG(keystate,bytes); */ char __pad_9[7]; };
@@ -6598,7 +6597,7 @@ union generic_reply
/* ### protocol_version begin ### */
-#define SERVER_PROTOCOL_VERSION 833 +#define SERVER_PROTOCOL_VERSION 830
/* ### protocol_version end ### */
diff --git a/include/x3daudio.h b/include/x3daudio.h index e9685127e02..26e2d1df728 100644 --- a/include/x3daudio.h +++ b/include/x3daudio.h @@ -68,8 +68,8 @@ typedef struct X3DAUDIO_EMITTER { X3DAUDIO_DISTANCE_CURVE *pLPFDirectCurve; X3DAUDIO_DISTANCE_CURVE *pLPFReverbCurve; X3DAUDIO_DISTANCE_CURVE *pReverbCurve; - float CurveDistanceScaler; - float DopplerScaler; + float CurveDistanceScalar; + float DopplerScalar; } X3DAUDIO_EMITTER;
typedef struct X3DAUDIO_DSP_SETTINGS { diff --git a/include/xaudio2.idl b/include/xaudio2.idl index 5f73ced16e5..b07c562914b 100644 --- a/include/xaudio2.idl +++ b/include/xaudio2.idl @@ -459,7 +459,7 @@ interface IXAudio2SubmixVoice : IXAudio2Voice interface IXAudio2MasteringVoice : IXAudio2Voice { #if XAUDIO2_VER >= 8 - HRESULT GetChannelMask([out] DWORD *pChannelMask); + void GetChannelMask([out] DWORD *pChannelMask); #endif }
diff --git a/programs/cmd/batch.c b/programs/cmd/batch.c index 0a1b364fe19..d2ad690967d 100644 --- a/programs/cmd/batch.c +++ b/programs/cmd/batch.c @@ -22,36 +22,9 @@ #include "wcmd.h" #include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(cmd); - -static RETURN_CODE WCMD_batch_main_loop(void) -{ - RETURN_CODE return_code = NO_ERROR; - /* Work through the file line by line until an exit is called. */ - while (!context->skip_rest) - { - CMD_NODE *node; - - switch (WCMD_ReadAndParseLine(NULL, &node)) - { - case RPL_EOF: - context->skip_rest = TRUE; - break; - case RPL_SUCCESS: - return_code = node_execute(node); - node_dispose_tree(node); - break; - case RPL_SYNTAXERROR: - return_code = RETURN_CODE_SYNTAX_ERROR; - break; - } - } - - /* If there are outstanding setlocal's to the current context, unwind them. */ - while (WCMD_endlocal() == NO_ERROR) {} +extern struct env_stack *saved_environment;
- return return_code; -} +WINE_DEFAULT_DEBUG_CHANNEL(cmd);
/**************************************************************************** * WCMD_batch @@ -69,28 +42,87 @@ static RETURN_CODE WCMD_batch_main_loop(void) * a label to goto once opened. */
-RETURN_CODE WCMD_call_batch(const WCHAR *file, WCHAR *command) +RETURN_CODE WCMD_batch(const WCHAR *file, WCHAR *command, const WCHAR *startLabel, HANDLE pgmHandle) { - BATCH_CONTEXT *prev_context; - RETURN_CODE return_code = NO_ERROR; - - /* Create a context structure for this batch file. */ - prev_context = context; - context = malloc(sizeof (BATCH_CONTEXT)); - context->file_position.QuadPart = 0; - context->batchfileW = xstrdupW(file); - context->command = command; - memset(context->shift_count, 0x00, sizeof(context->shift_count)); - context->prev_context = prev_context; - context->skip_rest = FALSE; - - return_code = WCMD_batch_main_loop(); - - free(context->batchfileW); - free(context); - context = prev_context; - - return return_code; + HANDLE h = INVALID_HANDLE_VALUE; + BATCH_CONTEXT *prev_context; + RETURN_CODE return_code = NO_ERROR; + + if (startLabel == NULL) { + h = CreateFileW (file, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + SetLastError (ERROR_FILE_NOT_FOUND); + WCMD_print_error (); + return ERROR_INVALID_FUNCTION; + } + } else { + DuplicateHandle(GetCurrentProcess(), pgmHandle, + GetCurrentProcess(), &h, + 0, FALSE, DUPLICATE_SAME_ACCESS); + } + +/* + * Create a context structure for this batch file. + */ + + prev_context = context; + context = LocalAlloc (LMEM_FIXED, sizeof (BATCH_CONTEXT)); + context -> h = h; + context->batchfileW = xstrdupW(file); + context -> command = command; + memset(context -> shift_count, 0x00, sizeof(context -> shift_count)); + context -> prev_context = prev_context; + context -> skip_rest = FALSE; + + /* If processing a call :label, 'goto' the label in question */ + if (startLabel) { + lstrcpyW(param1, startLabel); + WCMD_goto(); + } + +/* + * Work through the file line by line. Specific batch commands are processed here, + * the rest are handled by the main command processor. + */ + + while (!context->skip_rest) + { + CMD_NODE *node; + + switch (WCMD_ReadAndParseLine(NULL, &node, h)) + { + case RPL_EOF: + context->skip_rest = TRUE; + break; + case RPL_SUCCESS: + return_code = node_execute(node); + node_dispose_tree(node); + break; + case RPL_SYNTAXERROR: + return_code = RETURN_CODE_SYNTAX_ERROR; + break; + } + } + CloseHandle (h); + +/* + * If there are outstanding setlocal's to the current context, unwind them. + */ + while (saved_environment && saved_environment->batchhandle == context->h) { + WCMD_endlocal(); + } + +/* + * If invoked by a CALL, we return to the context of our caller. Otherwise return + * to the caller's caller. + */ + + free(context->batchfileW); + LocalFree(context); + context = prev_context; + + return return_code; }
/******************************************************************* @@ -648,8 +680,8 @@ RETURN_CODE WCMD_call(WCHAR *command) } else if (context) { + LARGE_INTEGER li; WCHAR gotoLabel[MAX_PATH]; - BATCH_CONTEXT *prev_context;
lstrcpyW(gotoLabel, param1);
@@ -657,24 +689,14 @@ RETURN_CODE WCMD_call(WCHAR *command) as for loop variables do not survive a call */ WCMD_save_for_loop_context(TRUE);
- prev_context = context; - context = malloc(sizeof (BATCH_CONTEXT)); - context->file_position = prev_context->file_position; /* will be overwritten by WCMD_GOTO below */ - context->batchfileW = prev_context->batchfileW; - context->command = buffer; - memset(context->shift_count, 0x00, sizeof(context->shift_count)); - context->prev_context = prev_context; - context->skip_rest = FALSE; - - /* FIXME as commands here can temper with param1 global variable (ugly) */ - lstrcpyW(param1, gotoLabel); - WCMD_goto(); - - WCMD_batch_main_loop(); - - free(context); - context = prev_context; + /* Save the current file position, call the same file, + restore position */ + li.QuadPart = 0; + li.u.LowPart = SetFilePointer(context->h, li.u.LowPart, + &li.u.HighPart, FILE_CURRENT); + WCMD_batch(context->batchfileW, buffer, gotoLabel, context->h); return_code = errorlevel; + SetFilePointer(context->h, li.u.LowPart, &li.u.HighPart, FILE_BEGIN);
/* Restore the for loop context */ WCMD_restore_for_loop_context(); @@ -684,67 +706,3 @@ RETURN_CODE WCMD_call(WCHAR *command) } return return_code; } - -void WCMD_set_label_end(WCHAR *string) -{ - static const WCHAR labelEndsW[] = L"><|& :\t"; - WCHAR *p; - - /* Label ends at whitespace or redirection characters */ - if ((p = wcspbrk(string, labelEndsW))) *p = L'\0'; -} - -static BOOL find_next_label(HANDLE h, ULONGLONG end, WCHAR candidate[MAXSTRING]) -{ - while (WCMD_fgets(candidate, MAXSTRING, h)) - { - WCHAR *str = candidate; - - /* Ignore leading whitespace or no-echo character */ - while (*str == L'@' || iswspace(*str)) str++; - - /* If the first real character is a : then this is a label */ - if (*str == L':') - { - /* Skip spaces between : and label */ - for (str++; iswspace(*str); str++) {} - memmove(candidate, str, (wcslen(str) + 1) * sizeof(WCHAR)); - WCMD_set_label_end(candidate); - - return TRUE; - } - if (end) - { - LARGE_INTEGER li = {.QuadPart = 0}, curli; - if (!SetFilePointerEx(h, li, &curli, FILE_CURRENT)) return FALSE; - if (curli.QuadPart > end) break; - } - } - return FALSE; -} - -BOOL WCMD_find_label(HANDLE h, const WCHAR *label, LARGE_INTEGER *pos) -{ - LARGE_INTEGER where = *pos, zeroli = {.QuadPart = 0}; - WCHAR candidate[MAXSTRING]; - - if (!*label) return FALSE; - - if (!SetFilePointerEx(h, *pos, NULL, FILE_BEGIN)) return FALSE; - while (find_next_label(h, ~(ULONGLONG)0, candidate)) - { - TRACE("comparing found label %s\n", wine_dbgstr_w(candidate)); - if (!lstrcmpiW(candidate, label)) - return SetFilePointerEx(h, zeroli, pos, FILE_CURRENT); - } - TRACE("Label not found, trying from beginning of file\n"); - if (!SetFilePointerEx(h, zeroli, NULL, FILE_BEGIN)) return FALSE; - while (find_next_label(h, where.QuadPart, candidate)) - { - TRACE("comparing found label %s\n", wine_dbgstr_w(candidate)); - if (!lstrcmpiW(candidate, label)) - return SetFilePointerEx(h, zeroli, pos, FILE_CURRENT); - } - TRACE("Reached wrap point, label not found\n"); - return FALSE; -} diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index f8ec0fbb6f4..17671c32eba 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -94,7 +94,7 @@ static const WCHAR externals[][10] = { };
static HINSTANCE hinst; -static struct env_stack *saved_environment; +struct env_stack *saved_environment; static BOOL verify_mode = FALSE;
/* set /a routines work from single character operators, but some of the @@ -279,200 +279,168 @@ RETURN_CODE WCMD_clear_screen(void) * */
-RETURN_CODE WCMD_choice(WCHAR *args) +RETURN_CODE WCMD_choice (const WCHAR * args) { - RETURN_CODE return_code = NO_ERROR; WCHAR answer[16]; WCHAR buffer[16]; WCHAR *ptr = NULL; WCHAR *opt_c = NULL; - WCHAR *opt_m = NULL; + WCHAR *my_command = NULL; WCHAR opt_default = 0; - DWORD opt_timeout = -1; - WCHAR *end; + DWORD opt_timeout = 0; + DWORD count; DWORD oldmode; BOOL have_console; BOOL opt_n = FALSE; - BOOL opt_cs = FALSE; - int argno; + BOOL opt_s = FALSE;
- for (argno = 0; ; argno++) - { - WCHAR *arg = WCMD_parameter(args, argno, NULL, FALSE, FALSE); - if (!*arg) break; + have_console = GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &oldmode); + my_command = xstrdupW(WCMD_skip_leading_spaces((WCHAR*)args));
- if (!wcsicmp(arg, L"/N")) opt_n = TRUE; - else if (!wcsicmp(arg, L"/CS")) opt_cs = TRUE; - else if (arg[0] == L'/' && wcschr(L"CDTM", towupper(arg[1]))) - { - WCHAR opt = towupper(arg[1]); - if (arg[2] == L'\0') - { - arg = WCMD_parameter(args, ++argno, NULL, FALSE, FALSE); - if (!*arg) - { - return_code = ERROR_INVALID_FUNCTION; - break; + ptr = my_command; + /* syntax errors are reported with ERRORLEVEL=1, which doesn't allow to + * discriminate from a choosen option! + */ + while (*ptr == '/') { + switch (towupper(ptr[1])) { + case 'C': + ptr += 2; + /* the colon is optional */ + if (*ptr == ':') + ptr++; + + if (!*ptr || iswspace(*ptr)) { + WINE_FIXME("bad parameter %s for /C\n", wine_dbgstr_w(ptr)); + free(my_command); + return errorlevel = ERROR_INVALID_FUNCTION; } - } - else if (arg[2] == L':') - arg += 3; - else - { - return_code = ERROR_INVALID_FUNCTION; - break; - } - switch (opt) - { - case L'C': - opt_c = wcsdup(arg); + + /* remember the allowed keys (overwrite previous /C option) */ + opt_c = ptr; + while (*ptr && (!iswspace(*ptr))) + ptr++; + + if (*ptr) { + /* terminate allowed chars */ + *ptr = 0; + ptr = WCMD_skip_leading_spaces(&ptr[1]); + } + WINE_TRACE("answer-list: %s\n", wine_dbgstr_w(opt_c)); break; - case L'M': - opt_m = wcsdup(arg); + + case 'N': + opt_n = TRUE; + ptr = WCMD_skip_leading_spaces(&ptr[2]); break; - case L'D': - opt_default = *arg; + + case 'S': + opt_s = TRUE; + ptr = WCMD_skip_leading_spaces(&ptr[2]); break; - case L'T': - opt_timeout = wcstol(arg, &end, 10); - if (end == arg || (*end && !iswspace(*end))) - opt_timeout = 10000; + + case 'T': + ptr = &ptr[2]; + /* the colon is optional */ + if (*ptr == ':') + ptr++; + + opt_default = *ptr++; + + if (!opt_default || (*ptr != ',')) { + WINE_FIXME("bad option %s for /T\n", opt_default ? wine_dbgstr_w(ptr) : ""); + free(my_command); + return errorlevel = ERROR_INVALID_FUNCTION; + } + ptr++; + + count = 0; + while (((answer[count] = *ptr)) && iswdigit(*ptr) && (count < 15)) { + count++; + ptr++; + } + + answer[count] = 0; + opt_timeout = wcstol(answer, NULL, 10); + + ptr = WCMD_skip_leading_spaces(ptr); break; - } + + default: + WINE_FIXME("bad parameter: %s\n", wine_dbgstr_w(ptr)); + free(my_command); + return errorlevel = ERROR_INVALID_FUNCTION; } - else - return_code = ERROR_INVALID_FUNCTION; }
+ if (opt_timeout) + WINE_FIXME("timeout not supported: %c,%ld\n", opt_default, opt_timeout); + + if (have_console) + SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0); + /* use default keys, when needed: localized versions of "Y"es and "No" */ - if (!opt_c) - { + if (!opt_c) { LoadStringW(hinst, WCMD_YES, buffer, ARRAY_SIZE(buffer)); LoadStringW(hinst, WCMD_NO, buffer + 1, ARRAY_SIZE(buffer) - 1); opt_c = buffer; - buffer[2] = L'\0'; - } - /* validate various options */ - if (!opt_cs) wcsupr(opt_c); - /* check that default is in the choices list */ - if (!wcschr(opt_c, opt_cs ? opt_default : towupper(opt_default))) - return_code = ERROR_INVALID_FUNCTION; - /* check that there's no duplicates in the choices list */ - for (ptr = opt_c; *ptr; ptr++) - if (wcschr(ptr + 1, opt_cs ? *ptr : towupper(*ptr))) - return_code = ERROR_INVALID_FUNCTION; - - TRACE("CHOICE message(%s) choices(%s) timeout(%ld) default(%c)\n", - debugstr_w(opt_m), debugstr_w(opt_c), opt_timeout, opt_default ? opt_default : '?'); - if (return_code != NO_ERROR || - (opt_timeout == -1) != (opt_default == L'\0') || - (opt_timeout != -1 && opt_timeout > 9999)) - { - WCMD_output_stderr(WCMD_LoadMessage(WCMD_ARGERR)); - errorlevel = 255; - if (opt_c != buffer) free(opt_c); - free(opt_m); - return ERROR_INVALID_FUNCTION; + buffer[2] = 0; }
- have_console = GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &oldmode); - if (have_console) - SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), 0); - /* print the question, when needed */ - if (opt_m) - WCMD_output_asis(opt_m); + if (*ptr) + WCMD_output_asis(ptr);
- if (!opt_n) - { + if (!opt_s) { + wcsupr(opt_c); + WINE_TRACE("case insensitive answer-list: %s\n", wine_dbgstr_w(opt_c)); + } + + if (!opt_n) { /* print a list of all allowed answers inside brackets */ - if (opt_m) WCMD_output_asis(L" "); WCMD_output_asis(L"["); - answer[1] = L'\0'; - for (ptr = opt_c; *ptr; ptr++) - { - if (ptr != opt_c) - WCMD_output_asis(L","); - answer[0] = *ptr; + ptr = opt_c; + answer[1] = 0; + while ((answer[0] = *ptr++)) { WCMD_output_asis(answer); + if (*ptr) + WCMD_output_asis(L","); } WCMD_output_asis(L"]?"); }
- while (return_code == NO_ERROR) - { - if (opt_timeout == 0) - answer[0] = opt_default; - else - { - LARGE_INTEGER li, zeroli = {0}; - OVERLAPPED overlapped = {0}; - DWORD count; + while (TRUE) {
- overlapped.hEvent = CreateEventW(NULL, TRUE, FALSE, NULL); - if (SetFilePointerEx(GetStdHandle(STD_INPUT_HANDLE), zeroli, &li, FILE_CURRENT)) - { - overlapped.Offset = li.LowPart; - overlapped.OffsetHigh = li.HighPart; - } - if (ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, NULL, &overlapped)) - { - switch (WaitForSingleObject(overlapped.hEvent, opt_timeout == -1 ? INFINITE : opt_timeout * 1000)) - { - case WAIT_OBJECT_0: - break; - case WAIT_TIMEOUT: - answer[0] = opt_default; - break; - default: - return_code = ERROR_INVALID_FUNCTION; - } - } - else if (ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, &count, NULL)) - { - if (count == 0) - { - if (opt_timeout != -1) - answer[0] = opt_default; - else - return_code = ERROR_INVALID_FUNCTION; - } - } - else - return_code = ERROR_INVALID_FUNCTION; - CloseHandle(overlapped.hEvent); - } - if (return_code != NO_ERROR) + /* FIXME: Add support for option /T */ + answer[1] = 0; /* terminate single character string */ + if (!WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, 1, &count) || !count) { - errorlevel = 255; - break; + free(my_command); + /* FIXME: is this choice 1 or ERROR_INVALID_FUNCTION? */ + return errorlevel = 1; } - if (!opt_cs) + + if (!opt_s) answer[0] = towupper(answer[0]);
- answer[1] = L'\0'; /* terminate single character string */ ptr = wcschr(opt_c, answer[0]); - if (ptr) - { + if (ptr) { WCMD_output_asis(answer); WCMD_output_asis(L"\r\n"); + if (have_console) + SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldmode);
- return_code = errorlevel = (ptr - opt_c) + 1; - TRACE("answer: %d\n", return_code); + errorlevel = (ptr - opt_c) + 1; + TRACE("answer: %d\n", errorlevel); + free(my_command); + return errorlevel; } else { /* key not allowed: play the bell */ - TRACE("key not allowed: %s\n", wine_dbgstr_w(answer)); + WINE_TRACE("key not allowed: %s\n", wine_dbgstr_w(answer)); WCMD_output_asis(L"\a"); } } - if (have_console) - SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), oldmode); - - if (opt_c != buffer) free(opt_c); - free(opt_m); - return return_code; }
/**************************************************************************** @@ -1815,45 +1783,89 @@ RETURN_CODE WCMD_give_help(WCHAR *args)
RETURN_CODE WCMD_goto(void) { - if (context != NULL) - { - WCHAR *paramStart = param1; - HANDLE h; - BOOL ret; + WCHAR string[MAX_PATH]; + WCHAR *labelend = NULL; + const WCHAR labelEndsW[] = L"><|& :\t";
- if (!param1[0]) - { - WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOARG)); - return ERROR_INVALID_FUNCTION; - } + if (context != NULL) { + WCHAR *paramStart = param1, *str;
- /* Handle special :EOF label */ - if (lstrcmpiW(L":eof", param1) == 0) - { - context->skip_rest = TRUE; - return RETURN_CODE_ABORTED; - } - h = CreateFileW(context->batchfileW, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) - { - SetLastError(ERROR_FILE_NOT_FOUND); - WCMD_print_error(); - return ERROR_INVALID_FUNCTION; - } + if (param1[0] == 0x00) { + WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOARG)); + return ERROR_INVALID_FUNCTION; + }
- /* Support goto :label as well as goto label plus remove trailing chars */ - if (*paramStart == ':') paramStart++; - WCMD_set_label_end(paramStart); - TRACE("goto label: '%s'\n", wine_dbgstr_w(paramStart)); + /* Handle special :EOF label */ + if (lstrcmpiW(L":eof", param1) == 0) { + context -> skip_rest = TRUE; + return RETURN_CODE_ABORTED; + }
- ret = WCMD_find_label(h, paramStart, &context->file_position); - CloseHandle(h); - if (ret) return RETURN_CODE_ABORTED; - WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOTARGET)); - context->skip_rest = TRUE; + /* Support goto :label as well as goto label plus remove trailing chars */ + if (*paramStart == ':') paramStart++; + labelend = wcspbrk(paramStart, labelEndsW); + if (labelend) *labelend = 0x00; + WINE_TRACE("goto label: '%s'\n", wine_dbgstr_w(paramStart)); + + /* Loop through potentially twice - once from current file position + through to the end, and second time from start to current file + position */ + if (*paramStart) { + int loop; + LARGE_INTEGER startli; + for (loop=0; loop<2; loop++) { + if (loop==0) { + /* On first loop, save the file size */ + startli.QuadPart = 0; + startli.u.LowPart = SetFilePointer(context -> h, startli.u.LowPart, + &startli.u.HighPart, FILE_CURRENT); + } else { + /* On second loop, start at the beginning of the file */ + WINE_TRACE("Label not found, trying from beginning of file\n"); + if (loop==1) SetFilePointer (context -> h, 0, NULL, FILE_BEGIN); + } + + while (WCMD_fgets (string, ARRAY_SIZE(string), context -> h)) { + str = string; + + /* Ignore leading whitespace or no-echo character */ + while (*str=='@' || iswspace (*str)) str++; + + /* If the first real character is a : then this is a label */ + if (*str == ':') { + str++; + + /* Skip spaces between : and label */ + while (iswspace (*str)) str++; + WINE_TRACE("str before brk %s\n", wine_dbgstr_w(str)); + + /* Label ends at whitespace or redirection characters */ + labelend = wcspbrk(str, labelEndsW); + if (labelend) *labelend = 0x00; + WINE_TRACE("comparing found label %s\n", wine_dbgstr_w(str)); + + if (lstrcmpiW (str, paramStart) == 0) return RETURN_CODE_ABORTED; + } + + /* See if we have gone beyond the end point if second time through */ + if (loop==1) { + LARGE_INTEGER curli; + curli.QuadPart = 0; + curli.u.LowPart = SetFilePointer(context -> h, curli.u.LowPart, + &curli.u.HighPart, FILE_CURRENT); + if (curli.QuadPart > startli.QuadPart) { + WINE_TRACE("Reached wrap point, label not found\n"); + break; + } + } + } + } } - return ERROR_INVALID_FUNCTION; + + WCMD_output_stderr(WCMD_LoadMessage(WCMD_NOTARGET)); + context -> skip_rest = TRUE; + } + return ERROR_INVALID_FUNCTION; }
/***************************************************************************** @@ -2328,7 +2340,7 @@ RETURN_CODE WCMD_setlocal(WCHAR *args) env_copy->strings = WCMD_dupenv (env); if (env_copy->strings) { - env_copy->context = context; + env_copy->batchhandle = context->h; env_copy->next = saved_environment; env_copy->delayedsubst = delayedsubst; delayedsubst = newdelay; @@ -2363,7 +2375,7 @@ RETURN_CODE WCMD_endlocal(void)
/* setlocal needs a saved environment from within the same context (batch program) as it was saved in */ - if (!saved_environment || saved_environment->context != context) + if (!saved_environment || saved_environment->batchhandle != context->h) return ERROR_INVALID_FUNCTION;
/* pop the old environment from the stack */ diff --git a/programs/cmd/tests/test_builtins.cmd b/programs/cmd/tests/test_builtins.cmd index e8a2cadd515..66d5e894662 100644 --- a/programs/cmd/tests/test_builtins.cmd +++ b/programs/cmd/tests/test_builtins.cmd @@ -217,20 +217,6 @@ type C (if 1==0 (echo A) else echo B) > C type C (if 1==0 (echo A > B) else echo C) -echo --- multiredirections -erase /q a b & (echo >a >b) -if exist a echo a shouldn't exist -if not exist b echo b should exist -erase /q a b & (echo >a >>b) -if exist a echo a shouldn't exist -if not exist b echo b should exist -erase /q a b & (echo >a | (echo b > b)) -if not exist a echo a should exist -if not exist b echo b should exist -erase /q a b & (echo cc1 2>a 1>&2 2>b) -if exist a echo a shouldn't exist -if not exist b (echo b should exist) else (echo cc2 & type b) - cd .. & rd /s/q foobar
echo ------------ Testing circumflex escape character ------------ @@ -467,13 +453,12 @@ if 1==0 (echo q1) else echo q2&echo q3 echo ------------- Testing internal commands return codes setlocal EnableDelayedExpansion
-echo --- success/failure for basics +echo --- call and IF/FOR blocks call :setError 0 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! call :setError 33 &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel! call :setError 666 & (echo foo &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (echo foo >> h:\i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & echo foo >> h:\i\dont\exist\at\all.txt & echo ERRORLEVEL !errorlevel! -echo --- success/failure for IF/FOR blocks call :setError 666 & ((if 1==1 echo "">NUL) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & ((if 1==0 echo "">NUL) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & ((if 1==1 (call :setError 33)) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) @@ -482,6 +467,7 @@ call :setError 666 & ((for %%i in () do echo "") &&echo SUCCESS !errorlevel!||ec call :setError 666 & ((for %%i in () do call :setError 33) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & ((for %%i in (a) do call :setError 0) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & ((for %%i in (a) do call :setError 33) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) + echo --- success/failure for external command mkdir foo & cd foo call :setError 666 & (I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) @@ -503,18 +489,6 @@ call :setError 666 & (call cmd.exe /c "echo foo & exit /b 0" &&echo SUCCESS !err call :setError 666 & (call cmd.exe /c "echo foo & exit /b 1025" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) call :setError 666 & (call rmdir foobar.dir &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) cd .. && rd /q /s foo -echo --- success/failure for pipes -call :setError 666 & ((echo a | echo b) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & ((echo a | call :setError 34) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & ((call :setError 33 | echo a) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & ((echo a | rmdir I\dont\exist\at\all) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & ((rmdir I\dont\exist\at\all | echo a) &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -rem in a pipe, if LHS or RHS can't be started, the whole cmd is abandonned (not just the pipe!!) -echo ^( %%1 ^| %%2 ^) > foo.bat -echo echo AFTER %%ERRORLEVEL%% >> foo.bat -call :setError 666 & (cmd.exe /q /c "call foo.bat echo I\dont\exist.exe" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (cmd.exe /q /c "call foo.bat I\dont\exist.exe echo" &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -erase /q foo.bat echo --- success/failure for START command call :setError 666 & (start "" /foobar >NUL &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) rem call :setError 666 & (start /B I\dont\exist.exe &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) @@ -580,12 +554,6 @@ call :setError 666 & (erase i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!| call :setError 666 & (erase file* i\dont\exist\at\all.txt &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) cd .. && rd /q /s foo
-echo --- success/failure for change drive command -call :setError 666 & (c: &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (1: &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (call c: &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) -call :setError 666 & (call 1: &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) - echo --- success/failure for MKDIR,MD command mkdir foo & cd foo call :setError 666 & (mkdir &&echo SUCCESS !errorlevel!||echo FAILURE !errorlevel!) @@ -3911,12 +3879,6 @@ echo abc > 012345678901234 if exist 012345678901234 (echo Failure) else echo Success popd rmdir /s /q c:\abcdefghij -echo ---- Testing nasty bits ---- -echo erase /q foobar.bat > foobar.bat -echo echo shouldnot >> foobar.bat -call foobar.bat -if exist foobar.bat (echo stillthere & erase /q foobar.bat >NUL) - echo ------------ Testing combined CALLs/GOTOs ------------ echo @echo off>foo.cmd echo goto :eof>>foot.cmd diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index d61d81fbfe5..a96c7dde10b 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -202,8 +202,8 @@ fooc@space@ food1 food2 food21 -foo7@space@@space@@or_broken@not supported@space@ -foo@or_broken@not supported +@todo_wine@foo7@space@@space@@or_broken@not supported@space@ +@todo_wine@foo@or_broken@not supported --- redirect at beginning of line foo foo1 @@ -229,8 +229,6 @@ foo A B C ---- multiredirections -cc2@space@ ------------ Testing circumflex escape character ------------ hello, world hello, world @@ -452,14 +450,13 @@ p2 q2 q3 ------------- Testing internal commands return codes ---- success/failure for basics +--- call and IF/FOR blocks SUCCESS 0 FAILURE 33 foo@space@ SUCCESS 666 FAILURE 1 ERRORLEVEL 666 ---- success/failure for IF/FOR blocks SUCCESS 666 SUCCESS 666 FAILURE 33 @@ -486,17 +483,6 @@ SUCCESS 0 foo@space@ FAILURE 1025 FAILURE 2 ---- success/failure for pipes -b -SUCCESS 0 -FAILURE 1 -a -SUCCESS 0 -FAILURE 3 -a -SUCCESS 0 -FAILURE 255 -FAILURE 255 --- success/failure for START command @todo_wine@FAILURE 1 foo@space@ @@ -533,11 +519,6 @@ FAILURE 1 SUCCESS 0 FAILURE 1 FAILURE 1 ---- success/failure for change drive command -SUCCESS 666 -FAILURE 1 -SUCCESS 0 -FAILURE 1 --- success/failure for MKDIR,MD command FAILURE 1 SUCCESS 0 @@ -707,19 +688,19 @@ I'm here!@space@ I'm here!@space@ I'm here!@space@ ------------ Testing 'choice' ------------ -Example message [A,B,C]?A@or_broken@choice unavailable -1@or_broken@9009 -Example message [A,B,C]?B@or_broken@choice unavailable -2@or_broken@9009 -[D,E,F]?F@or_broken@choice unavailable -3@or_broken@9009 -[A,B,C,X,Y,Z]?Y@or_broken@choice unavailable -5@or_broken@9009 -A@or_broken@choice unavailable +@todo_wine@Example message [A,B,C]?A@or_broken@choice unavailable 1@or_broken@9009 -[a,b,c,A,B,C]?A@or_broken@choice unavailable -4@or_broken@9009 -255@or_broken@9009 +@todo_wine@Example message [A,B,C]?B@or_broken@choice unavailable +@todo_wine@2@or_broken@9009 +@todo_wine@[D,E,F]?F@or_broken@choice unavailable +@todo_wine@3@or_broken@9009 +@todo_wine@[A,B,C,X,Y,Z]?Y@or_broken@choice unavailable +@todo_wine@5@or_broken@9009 +@todo_wine@A@or_broken@choice unavailable +@todo_wine@1@or_broken@9009 +@todo_wine@[a,b,c,A,B,C]?A@or_broken@choice unavailable +@todo_wine@4@or_broken@9009 +@todo_wine@255@or_broken@9009 ------------ Testing variable expansion ------------ ~p0 should be path containing batch file @path@ @@ -2009,7 +1990,6 @@ Normal+tab+garbage @todo_wine@21 Success @todo_wine@Success ----- Testing nasty bits ---- ------------ Testing combined CALLs/GOTOs ------------ world cheball diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index cf51a5e44de..6c25b86f7d1 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -108,13 +108,18 @@ typedef struct _CMD_FOR_CONTROL }; } CMD_FOR_CONTROL;
+typedef struct _CMD_COMMAND +{ + WCHAR *command; /* Command string to execute */ +} CMD_COMMAND; + typedef struct _CMD_NODE { CMD_OPERATOR op; /* operator */ CMD_REDIRECTION *redirects; /* Redirections */ union { - WCHAR *command; /* CMD_SINGLE */ + CMD_COMMAND *command; /* CMD_SINGLE */ struct /* binary operator (CMD_CONCAT, ONFAILURE, ONSUCCESS, PIPE) */ { struct _CMD_NODE *left; @@ -155,8 +160,9 @@ typedef int RETURN_CODE; BOOL WCMD_print_volume_information(const WCHAR *);
RETURN_CODE WCMD_assoc(const WCHAR *, BOOL); +RETURN_CODE WCMD_batch(const WCHAR *, WCHAR *, const WCHAR *, HANDLE); RETURN_CODE WCMD_call(WCHAR *command); -RETURN_CODE WCMD_choice(WCHAR *); +RETURN_CODE WCMD_choice(const WCHAR *); RETURN_CODE WCMD_clear_screen(void); RETURN_CODE WCMD_color(void); RETURN_CODE WCMD_copy(WCHAR *); @@ -216,14 +222,10 @@ WCHAR *WCMD_strsubstW(WCHAR *start, const WCHAR* next, const WCHAR* insert, int BOOL WCMD_ReadFile(const HANDLE hIn, WCHAR *intoBuf, const DWORD maxChars, LPDWORD charsRead);
enum read_parse_line {RPL_SUCCESS, RPL_EOF, RPL_SYNTAXERROR}; -enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *initialcmd, CMD_NODE **output); +enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *initialcmd, CMD_NODE **output, HANDLE readFrom); void node_dispose_tree(CMD_NODE *cmds); RETURN_CODE node_execute(CMD_NODE *node);
-RETURN_CODE WCMD_call_batch(const WCHAR *, WCHAR *); -BOOL WCMD_find_label(HANDLE h, const WCHAR*, LARGE_INTEGER *pos); -void WCMD_set_label_end(WCHAR *string); - void *xrealloc(void *, size_t) __WINE_ALLOC_SIZE(2) __WINE_DEALLOC(free);
static inline void *xalloc(size_t sz) __WINE_MALLOC; @@ -256,29 +258,28 @@ int evaluate_if_condition(WCHAR *p, WCHAR **command, int *test, int *negate);
/* Data structure to hold context when executing batch files */
-typedef struct _BATCH_CONTEXT -{ - WCHAR *command; /* The command which invoked the batch file */ - LARGE_INTEGER file_position; - WCHAR *batchfileW; /* Name of same */ - int shift_count[10]; /* Offset in terms of shifts for %0 - %9 */ - struct _BATCH_CONTEXT *prev_context; /* Pointer to the previous context block */ - BOOL skip_rest; /* Skip the rest of the batch program and exit */ +typedef struct _BATCH_CONTEXT { + WCHAR *command; /* The command which invoked the batch file */ + HANDLE h; /* Handle to the open batch file */ + WCHAR *batchfileW; /* Name of same */ + int shift_count[10]; /* Offset in terms of shifts for %0 - %9 */ + struct _BATCH_CONTEXT *prev_context; /* Pointer to the previous context block */ + BOOL skip_rest; /* Skip the rest of the batch program and exit */ + CMD_NODE *toExecute; /* Commands left to be executed */ } BATCH_CONTEXT;
/* Data structure to handle building lists during recursive calls */
struct env_stack { - BATCH_CONTEXT *context; - struct env_stack *next; - union - { - int stackdepth; /* Only used for pushd and popd */ - WCHAR cwd; /* Only used for set/endlocal */ - } u; - WCHAR *strings; - BOOL delayedsubst; /* Is delayed substitution in effect */ + struct env_stack *next; + union { + int stackdepth; /* Only used for pushd and popd */ + WCHAR cwd; /* Only used for set/endlocal */ + } u; + WCHAR *strings; + HANDLE batchhandle; /* Used to ensure set/endlocals stay in scope */ + BOOL delayedsubst; /* Is delayed substitution in effect */ };
/* Data structure to save setlocal and pushd information */ diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 2c64785d44a..d44a505dc47 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -986,12 +986,23 @@ static const char *debugstr_redirection(const CMD_REDIRECTION *redir) } }
-static WCHAR *command_create(const WCHAR *ptr, size_t len) +static CMD_COMMAND *command_create(const WCHAR *ptr, size_t len) { - WCHAR *command = xalloc((len + 1) * sizeof(WCHAR)); - memcpy(command, ptr, len * sizeof(WCHAR)); - command[len] = L'\0'; - return command; + CMD_COMMAND *ret = xalloc(sizeof(CMD_COMMAND)); + + ret->command = xalloc((len + 1) * sizeof(WCHAR)); + memcpy(ret->command, ptr, len * sizeof(WCHAR)); + ret->command[len] = L'\0'; + return ret; +} + +static void command_dispose(CMD_COMMAND *cmd) +{ + if (cmd) + { + free(cmd->command); + free(cmd); + } }
static void for_control_dispose(CMD_FOR_CONTROL *for_ctrl) @@ -1252,7 +1263,7 @@ void node_dispose_tree(CMD_NODE *node) switch (node->op) { case CMD_SINGLE: - free(node->command); + command_dispose(node->command); break; case CMD_CONCAT: case CMD_PIPE: @@ -1275,7 +1286,7 @@ void node_dispose_tree(CMD_NODE *node) free(node); }
-static CMD_NODE *node_create_single(WCHAR *c) +static CMD_NODE *node_create_single(CMD_COMMAND *c) { CMD_NODE *new = xalloc(sizeof(CMD_NODE));
@@ -1583,7 +1594,7 @@ RETURN_CODE WCMD_run_program(WCHAR *command, BOOL called) BOOL oldinteractive = interactive;
interactive = FALSE; - return_code = WCMD_call_batch(thisDir, command); + return_code = WCMD_batch(thisDir, command, NULL, INVALID_HANDLE_VALUE); interactive = oldinteractive; if (context && !called) { TRACE("Batch completed, but was not 'called' so skipping outer batch too\n"); @@ -1649,6 +1660,12 @@ RETURN_CODE WCMD_run_program(WCHAR *command, BOOL called) return ERROR_INVALID_FUNCTION; }
+/* this is obviously wrong... will require more work to be fixed */ +static inline unsigned clamp_fd(unsigned fd) +{ + return fd <= 2 ? fd : 1; +} + static BOOL set_std_redirections(CMD_REDIRECTION *redir) { static DWORD std_index[3] = {STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, STD_ERROR_HANDLE}; @@ -1658,12 +1675,6 @@ static BOOL set_std_redirections(CMD_REDIRECTION *redir)
for (; redir; redir = redir->next) { - CMD_REDIRECTION *next; - - /* if we have several elements changing same std stream, only use last one */ - for (next = redir->next; next; next = next->next) - if (redir->fd == next->fd) break; - if (next) continue; switch (redir->kind) { case REDIR_READ_FROM: @@ -1697,26 +1708,17 @@ static BOOL set_std_redirections(CMD_REDIRECTION *redir) } break; case REDIR_WRITE_CLONE: - if (redir->clone > 2 || redir->clone == redir->fd) - { - WARN("Can't duplicate %d from %d\n", redir->fd, redir->clone); - return FALSE; - } if (!DuplicateHandle(GetCurrentProcess(), - GetStdHandle(std_index[redir->clone]), + GetStdHandle(std_index[clamp_fd(redir->clone)]), GetCurrentProcess(), &h, 0, TRUE, DUPLICATE_SAME_ACCESS)) { WARN("Duplicating handle failed with gle %ld\n", GetLastError()); - return FALSE; } break; } - if (redir->fd > 2) - CloseHandle(h); - else - SetStdHandle(std_index[redir->fd], h); + SetStdHandle(std_index[clamp_fd(redir->fd)], h); } return TRUE; } @@ -1732,7 +1734,7 @@ static RETURN_CODE execute_single_command(const WCHAR *command) { RETURN_CODE return_code; WCHAR *cmd, *parms_start; - int cmd_index, count; + int status, cmd_index, count; WCHAR *whichcmd; WCHAR *new_cmd = NULL; BOOL prev_echo_mode; @@ -1767,29 +1769,27 @@ static RETURN_CODE execute_single_command(const WCHAR *command) * else if it exists after whitespace is ignored */
- if (cmd[1] == L':' && (!cmd[2] || iswspace(cmd[2]))) { + if ((cmd[1] == ':') && IsCharAlphaW(cmd[0]) && + (!cmd[2] || cmd[2] == ' ' || cmd[2] == '\t')) { WCHAR envvar[5]; WCHAR dir[MAX_PATH];
/* Ignore potential garbage on the same line */ - cmd[2] = L'\0'; + cmd[2]=0x00;
/* According to MSDN CreateProcess docs, special env vars record the current directory on each drive, in the form =C: so see if one specified, and if so go back to it */ lstrcpyW(envvar, L"="); lstrcatW(envvar, cmd); - if (GetEnvironmentVariableW(envvar, dir, ARRAY_SIZE(dir)) == 0) { + if (GetEnvironmentVariableW(envvar, dir, MAX_PATH) == 0) { wsprintfW(cmd, L"%s\", cmd); WINE_TRACE("No special directory settings, using dir of %s\n", wine_dbgstr_w(cmd)); } WINE_TRACE("Got directory %s as %s\n", wine_dbgstr_w(envvar), wine_dbgstr_w(cmd)); - if (!SetCurrentDirectoryW(cmd)) - { - WCMD_print_error(); - return_code = errorlevel = ERROR_INVALID_FUNCTION; - } - else return_code = NO_ERROR; + status = SetCurrentDirectoryW(cmd); + if (!status) WCMD_print_error (); + return_code = ERROR_INVALID_FUNCTION; goto cleanup; }
@@ -2198,7 +2198,7 @@ syntax_error: /* used to store additional information dedicated a given token */ union token_parameter { - WCHAR *command; + CMD_COMMAND *command; CMD_REDIRECTION *redirection; void *none; }; @@ -2228,7 +2228,7 @@ static const char* debugstr_token(enum builder_token tkn, union token_parameter if (tkn >= ARRAY_SIZE(tokens)) return "<<<>>>"; switch (tkn) { - case TKN_COMMAND: return wine_dbg_sprintf("%s {{%s}}", tokens[tkn], debugstr_w(tkn_pmt.command)); + case TKN_COMMAND: return wine_dbg_sprintf("%s {{%ls}}", tokens[tkn], tkn_pmt.command ? tkn_pmt.command->command : L"<<nul>>"); case TKN_REDIRECTION: return wine_dbg_sprintf("%s {{%s}}", tokens[tkn], debugstr_redirection(tkn_pmt.redirection)); default: return wine_dbg_sprintf("%s", tokens[tkn]); } @@ -2327,7 +2327,6 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence CMD_REDIRECTION *redir = NULL; unsigned bogus_line; CMD_NODE *left = NULL, *right; - CMD_FOR_CONTROL *for_ctrl = NULL; union token_parameter pmt; enum builder_token tkn; BOOL done; @@ -2338,7 +2337,7 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence tkn = node_builder_peek_next_token(builder, &pmt); done = FALSE;
- TRACE("\t%u/%u) %s\n", builder->pos, builder->num, debugstr_token(tkn, pmt)); + TRACE("\t%u/%u) %s", builder->pos, builder->num, debugstr_token(tkn, pmt)); switch (tkn) { case TKN_EOF: @@ -2447,15 +2446,15 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence node_builder_consume(builder); tkn = node_builder_peek_next_token(builder, &pmt); ERROR_IF(tkn != TKN_COMMAND); - if (!wcscmp(pmt.command, L"/?")) + if (!wcscmp(pmt.command->command, L"/?")) { node_builder_consume(builder); - free(pmt.command); + command_dispose(pmt.command); left = node_create_single(command_create(L"help if", 7)); break; } - ERROR_IF(!if_condition_parse(pmt.command, &end, &cond)); - free(pmt.command); + ERROR_IF(!if_condition_parse(pmt.command->command, &end, &cond)); + command_dispose(pmt.command); node_builder_consume(builder); if (!node_builder_parse(builder, 0, &then_block)) { @@ -2482,21 +2481,22 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence ERROR_IF(left); ERROR_IF(redir); { + CMD_FOR_CONTROL *for_ctrl; CMD_NODE *do_block;
node_builder_consume(builder); tkn = node_builder_peek_next_token(builder, &pmt); ERROR_IF(tkn != TKN_COMMAND); - if (!wcscmp(pmt.command, L"/?")) + if (!wcscmp(pmt.command->command, L"/?")) { node_builder_consume(builder); - free(pmt.command); + command_dispose(pmt.command); left = node_create_single(command_create(L"help for", 8)); break; } node_builder_consume(builder); - for_ctrl = for_control_parse(pmt.command); - free(pmt.command); + for_ctrl = for_control_parse(pmt.command->command); + command_dispose(pmt.command); ERROR_IF(for_ctrl == NULL); ERROR_IF(!node_builder_expect_token(builder, TKN_IN)); ERROR_IF(!node_builder_expect_token(builder, TKN_OPENPAR)); @@ -2506,8 +2506,8 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence switch (tkn) { case TKN_COMMAND: - for_control_append_set(for_ctrl, pmt.command); - free(pmt.command); + for_control_append_set(for_ctrl, pmt.command->command); + command_dispose(pmt.command); break; case TKN_EOL: case TKN_CLOSEPAR: @@ -2517,10 +2517,13 @@ static BOOL node_builder_parse(struct node_builder *builder, unsigned precedence } node_builder_consume(builder); } while (tkn != TKN_CLOSEPAR); - ERROR_IF(!node_builder_expect_token(builder, TKN_DO)); - ERROR_IF(!node_builder_parse(builder, 0, &do_block)); + if (!node_builder_expect_token(builder, TKN_DO) || + !node_builder_parse(builder, 0, &do_block)) + { + for_control_dispose(for_ctrl); + ERROR_IF(TRUE); + } left = node_create_for(for_ctrl, do_block); - for_ctrl = NULL; } break; case TKN_REDIRECTION: @@ -2537,7 +2540,6 @@ error_handling: TRACE("Parser failed at line %u:token %s\n", bogus_line, debugstr_token(tkn, pmt)); node_dispose_tree(left); redirection_dispose_list(redir); - if (for_ctrl) for_control_dispose(for_ctrl);
return FALSE; } @@ -2567,7 +2569,7 @@ static BOOL node_builder_generate(struct node_builder *builder, CMD_NODE **node) switch (tkn) { case TKN_COMMAND: - tknstr = tkn_pmt.command; + tknstr = tkn_pmt.command->command; break; case TKN_EOF: tknstr = WCMD_LoadMessage(WCMD_ENDOFFILE); @@ -2606,7 +2608,7 @@ static BOOL node_builder_generate(struct node_builder *builder, CMD_NODE **node) { tkn = node_builder_peek_next_token(builder, &tkn_pmt); if (tkn == TKN_EOF) break; - if (tkn == TKN_COMMAND) free(tkn_pmt.command); + if (tkn == TKN_COMMAND) command_dispose(tkn_pmt.command); if (tkn == TKN_REDIRECTION) redirection_dispose_list(tkn_pmt.redirection); node_builder_consume(builder); } @@ -2677,7 +2679,7 @@ static void lexer_push_command(struct node_builder *builder, *copyTo = command; }
-static WCHAR *fetch_next_line(BOOL feed, BOOL first_line, WCHAR* buffer) +static WCHAR *fetch_next_line(BOOL feed, BOOL first_line, HANDLE from, WCHAR* buffer) { /* display prompt */ if (interactive && !context) @@ -2689,35 +2691,10 @@ static WCHAR *fetch_next_line(BOOL feed, BOOL first_line, WCHAR* buffer) WCMD_show_prompt(); }
- if (feed) + if (feed && !WCMD_fgets(buffer, MAXSTRING, from)) { - BOOL ret; - if (context) - { - LARGE_INTEGER zeroli = {.QuadPart = 0}; - HANDLE h = CreateFileW(context->batchfileW, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - if (h == INVALID_HANDLE_VALUE) - { - SetLastError(ERROR_FILE_NOT_FOUND); - WCMD_print_error(); - ret = FALSE; - } - else - { - ret = SetFilePointerEx(h, context->file_position, NULL, FILE_BEGIN) && - !!WCMD_fgets(buffer, MAXSTRING, h) && - SetFilePointerEx(h, zeroli, &context->file_position, FILE_CURRENT); - CloseHandle(h); - } - } - else - ret = !!WCMD_fgets(buffer, MAXSTRING, GetStdHandle(STD_INPUT_HANDLE)); - if (!ret) - { - buffer[0] = L'\0'; - return NULL; - } + buffer[0] = L'\0'; + return NULL; } /* Handle truncated input - issue warning */ if (wcslen(buffer) == MAXSTRING - 1) @@ -2778,7 +2755,7 @@ static WCHAR *fetch_next_line(BOOL feed, BOOL first_line, WCHAR* buffer) * - Anything else gets put into the command string (including * redirects) */ -enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_NODE **output) +enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_NODE **output, HANDLE readFrom) { WCHAR *curPos; int inQuotes = 0; @@ -2813,7 +2790,7 @@ enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_NODE ** /* If initial command read in, use that, otherwise get input from handle */ if (optionalcmd) wcscpy(extraSpace, optionalcmd); - if (!(curPos = fetch_next_line(optionalcmd == NULL, TRUE, extraSpace))) + if (!(curPos = fetch_next_line(optionalcmd == NULL, TRUE, readFrom, extraSpace))) return RPL_EOF;
TRACE("About to parse line (%ls)\n", extraSpace); @@ -3076,13 +3053,12 @@ enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_NODE ** if (curPos[1] == L'\0') { TRACE("Caret found at end of line\n"); extraSpace[0] = L'^'; - if (optionalcmd) break; - if (!fetch_next_line(TRUE, FALSE, extraSpace + 1)) + if (!fetch_next_line(TRUE, FALSE, readFrom, extraSpace + 1)) break; if (!extraSpace[1]) /* empty line */ { extraSpace[1] = L'\r'; - if (!fetch_next_line(TRUE, FALSE, extraSpace + 2)) + if (!fetch_next_line(TRUE, FALSE, readFrom, extraSpace + 2)) break; } curPos = extraSpace; @@ -3153,7 +3129,7 @@ enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_NODE ** node_builder_push_token(&builder, TKN_EOL);
/* If we have reached the end of the string, see if bracketing is outstanding */ - if (builder.opened_parenthesis > 0 && optionalcmd == NULL) { + if (builder.opened_parenthesis > 0 && readFrom != INVALID_HANDLE_VALUE) { TRACE("Need to read more data as outstanding brackets or carets\n"); inOneLine = FALSE; ignoreBracket = FALSE; @@ -3163,7 +3139,7 @@ enum read_parse_line WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_NODE **
/* fetch next non empty line */ do { - curPos = fetch_next_line(TRUE, FALSE, extraSpace); + curPos = fetch_next_line(TRUE, FALSE, readFrom, extraSpace); } while (curPos && *curPos == L'\0'); if (!curPos) curPos = extraSpace; @@ -3691,13 +3667,14 @@ RETURN_CODE node_execute(CMD_NODE *node) if (!set_std_redirections(node->redirects)) { WCMD_print_error(); - return_code = ERROR_INVALID_FUNCTION; + /* FIXME potentially leaking here (if first redir created ok, and second failed */ + return ERROR_INVALID_FUNCTION; } - else switch (node->op) + switch (node->op) { case CMD_SINGLE: - if (node->command[0] != ':') - return_code = execute_single_command(node->command); + if (node->command->command[0] != ':') + return_code = execute_single_command(node->command->command); else return_code = NO_ERROR; break; case CMD_CONCAT: @@ -3726,10 +3703,7 @@ RETURN_CODE node_execute(CMD_NODE *node) WCHAR filename[MAX_PATH]; CMD_REDIRECTION *output; HANDLE saved_output; - BATCH_CONTEXT *saved_context = context;
- /* pipe LHS & RHS are run outside of any batch context */ - context = NULL; /* FIXME: a real pipe instead of writing to an intermediate file would be * better. * But waiting for completion of commands will require more work. @@ -3749,13 +3723,12 @@ RETURN_CODE node_execute(CMD_NODE *node) if (set_std_redirections(output)) { RETURN_CODE return_code_left = node_execute(node->left); + return_code = NO_ERROR; + CloseHandle(GetStdHandle(STD_OUTPUT_HANDLE)); SetStdHandle(STD_OUTPUT_HANDLE, saved_output);
- if (errorlevel == RETURN_CODE_CANT_LAUNCH && saved_context) - ExitProcess(255); - return_code = ERROR_INVALID_FUNCTION; - if (return_code_left != RETURN_CODE_ABORTED && errorlevel != RETURN_CODE_CANT_LAUNCH) + if (return_code == NO_ERROR) { HANDLE h = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_EXISTING, @@ -3764,16 +3737,15 @@ RETURN_CODE node_execute(CMD_NODE *node) { SetStdHandle(STD_INPUT_HANDLE, h); return_code = node_execute(node->right); - if (errorlevel == RETURN_CODE_CANT_LAUNCH && saved_context) - ExitProcess(255); } + else return_code = ERROR_INVALID_FUNCTION; } DeleteFileW(filename); - errorlevel = return_code; + if (return_code_left != NO_ERROR || return_code != NO_ERROR) + errorlevel = ERROR_INVALID_FUNCTION; } else return_code = ERROR_INVALID_FUNCTION; redirection_dispose_list(output); - context = saved_context; } break; case CMD_IF: @@ -4079,7 +4051,7 @@ int __cdecl wmain (int argc, WCHAR *argvW[]) */
/* Parse the command string, without reading any more input */ - rpl_status = WCMD_ReadAndParseLine(cmd, &toExecute); + rpl_status = WCMD_ReadAndParseLine(cmd, &toExecute, INVALID_HANDLE_VALUE); if (rpl_status == RPL_SUCCESS && toExecute) { node_execute(toExecute); @@ -4163,7 +4135,7 @@ int __cdecl wmain (int argc, WCHAR *argvW[])
if (opt_k) { - rpl_status = WCMD_ReadAndParseLine(cmd, &toExecute); + rpl_status = WCMD_ReadAndParseLine(cmd, &toExecute, INVALID_HANDLE_VALUE); /* Parse the command string, without reading any more input */ if (rpl_status == RPL_SUCCESS && toExecute) { @@ -4183,7 +4155,7 @@ int __cdecl wmain (int argc, WCHAR *argvW[]) if (!opt_k) WCMD_output_asis(version_string); if (echo_mode) WCMD_output_asis(L"\r\n"); /* Read until EOF (which for std input is never, but if redirect in place, may occur */ - while ((rpl_status = WCMD_ReadAndParseLine(NULL, &toExecute)) != RPL_EOF) + while ((rpl_status = WCMD_ReadAndParseLine(NULL, &toExecute, GetStdHandle(STD_INPUT_HANDLE))) != RPL_EOF) { if (rpl_status == RPL_SUCCESS && toExecute) { diff --git a/server/protocol.def b/server/protocol.def index 12eef14cc67..91257fce3a1 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -935,8 +935,6 @@ typedef volatile struct rectangle_t caret_rect; /* caret rectangle */ user_handle_t cursor; /* handle to the cursor */ int cursor_count; /* cursor show count */ - unsigned char keystate[256]; /* key state */ - int keystate_lock; /* keystate is locked */ } input_shm_t;
typedef volatile union @@ -2948,9 +2946,10 @@ enum coords_relative /* Retrieve queue keyboard state for current thread or global async state */ @REQ(get_key_state) int async; /* whether to query the async state */ - int key; /* key code */ + int key; /* optional key code or -1 */ @REPLY unsigned char state; /* state of specified key */ + VARARG(keystate,bytes); /* state array for all the keys */ @END
/* Set queue keyboard state for current thread */ diff --git a/server/queue.c b/server/queue.c index 0156a4c66f2..ee03ceb55c8 100644 --- a/server/queue.c +++ b/server/queue.c @@ -107,7 +107,9 @@ struct thread_input int caret_hide; /* caret hide count */ int caret_state; /* caret on/off state */ struct list msg_list; /* list of hardware messages */ + unsigned char keystate[256]; /* state of each key */ unsigned char desktop_keystate[256]; /* desktop keystate when keystate was synced */ + int keystate_lock; /* keystate is locked */ const input_shm_t *shared; /* thread input in session shared memory */ };
@@ -249,6 +251,8 @@ static struct thread_input *create_thread_input( struct thread *thread ) if ((input = alloc_object( &thread_input_ops ))) { list_init( &input->msg_list ); + memset( input->keystate, 0, sizeof(input->keystate) ); + input->keystate_lock = 0; input->shared = NULL;
if (!(input->desktop = get_thread_desktop( thread, 0 /* FIXME: access rights */ ))) @@ -276,8 +280,6 @@ static struct thread_input *create_thread_input( struct thread *thread ) set_caret_window( input, shared, 0 ); shared->cursor = 0; shared->cursor_count = 0; - memset( (void *)shared->keystate, 0, sizeof(shared->keystate) ); - shared->keystate_lock = 0; } SHARED_WRITE_END; } @@ -358,49 +360,30 @@ void free_msg_queue( struct thread *thread ) /* synchronize thread input keystate with the desktop */ static void sync_input_keystate( struct thread_input *input ) { - const input_shm_t *input_shm = input->shared; const desktop_shm_t *desktop_shm; - struct desktop *desktop; int i;
- if (!(desktop = input->desktop) || input_shm->keystate_lock) return; + if (!input->desktop || input->keystate_lock) return; desktop_shm = input->desktop->shared;
- SHARED_WRITE_BEGIN( input_shm, input_shm_t ) + for (i = 0; i < sizeof(input->keystate); ++i) { - for (i = 0; i < sizeof(shared->keystate); ++i) - { - if (input->desktop_keystate[i] == desktop_shm->keystate[i]) continue; - shared->keystate[i] = input->desktop_keystate[i] = desktop_shm->keystate[i]; - } + if (input->desktop_keystate[i] == desktop_shm->keystate[i]) continue; + input->keystate[i] = input->desktop_keystate[i] = desktop_shm->keystate[i]; } - SHARED_WRITE_END; }
/* locks thread input keystate to prevent synchronization */ static void lock_input_keystate( struct thread_input *input ) { - const input_shm_t *input_shm = input->shared; - - SHARED_WRITE_BEGIN( input_shm, input_shm_t ) - { - shared->keystate_lock++; - } - SHARED_WRITE_END; + input->keystate_lock++; }
/* unlock the thread input keystate and synchronize it again */ static void unlock_input_keystate( struct thread_input *input ) { - const input_shm_t *input_shm = input->shared; - - SHARED_WRITE_BEGIN( input_shm, input_shm_t ) - { - shared->keystate_lock--; - } - SHARED_WRITE_END; - - if (!input_shm->keystate_lock) sync_input_keystate( input ); + input->keystate_lock--; + if (!input->keystate_lock) sync_input_keystate( input ); }
/* change the thread input data of a given thread */ @@ -1453,15 +1436,7 @@ int attach_thread_input( struct thread *thread_from, struct thread *thread_to ) }
ret = assign_thread_input( thread_from, input ); - if (ret) - { - const input_shm_t *input_shm = input->shared; - SHARED_WRITE_BEGIN( input_shm, input_shm_t ) - { - memset( (void *)shared->keystate, 0, sizeof(shared->keystate) ); - } - SHARED_WRITE_END; - } + if (ret) memset( input->keystate, 0, sizeof(input->keystate) ); release_object( input ); return ret; } @@ -1718,12 +1693,7 @@ static void update_key_state( volatile unsigned char *keystate, unsigned int msg
static void update_thread_input_key_state( struct thread_input *input, unsigned int msg, lparam_t wparam ) { - const input_shm_t *input_shm = input->shared; - SHARED_WRITE_BEGIN( input_shm, input_shm_t ) - { - update_key_state( shared->keystate, msg, wparam, 0 ); - } - SHARED_WRITE_END; + update_key_state( input->keystate, msg, wparam, 0 ); }
static void update_desktop_key_state( struct desktop *desktop, unsigned int msg, lparam_t wparam ) @@ -3729,25 +3699,33 @@ DECL_HANDLER(get_thread_input) DECL_HANDLER(get_key_state) { struct desktop *desktop; + data_size_t size = min( 256, get_reply_max_size() );
if (req->async) /* get global async key state */ { if (!(desktop = get_thread_desktop( current, 0 ))) return; - SHARED_WRITE_BEGIN( desktop->shared, desktop_shm_t ) + if (req->key >= 0) { - reply->state = shared->keystate[req->key & 0xff]; - shared->keystate[req->key & 0xff] &= ~0x40; + SHARED_WRITE_BEGIN( desktop->shared, desktop_shm_t ) + { + reply->state = shared->keystate[req->key & 0xff]; + shared->keystate[req->key & 0xff] &= ~0x40; + } + SHARED_WRITE_END; } - SHARED_WRITE_END; + set_reply_data( (const void *)desktop->shared->keystate, size ); release_object( desktop ); } else { struct msg_queue *queue = get_current_queue(); - const input_shm_t *input_shm = queue->input->shared; - unsigned char *keystate = (void *)input_shm->keystate; - sync_input_keystate( queue->input ); - reply->state = keystate[req->key & 0xff]; + unsigned char *keystate = queue->input->keystate; + if (req->key >= 0) + { + sync_input_keystate( queue->input ); + reply->state = keystate[req->key & 0xff]; + } + set_reply_data( keystate, size ); } }
@@ -3758,14 +3736,8 @@ DECL_HANDLER(set_key_state) struct msg_queue *queue = get_current_queue(); struct desktop *desktop = queue->input->desktop; data_size_t size = min( 256, get_req_data_size() ); - const input_shm_t *input_shm = queue->input->shared; - - SHARED_WRITE_BEGIN( input_shm, input_shm_t ) - { - memcpy( (void *)shared->keystate, get_req_data(), size ); - } - SHARED_WRITE_END;
+ memcpy( queue->input->keystate, get_req_data(), size ); memcpy( queue->input->desktop_keystate, (const void *)desktop->shared->keystate, sizeof(queue->input->desktop_keystate) );
diff --git a/server/sock.c b/server/sock.c index 06ffd1b81f8..8a95caded8b 100644 --- a/server/sock.c +++ b/server/sock.c @@ -2045,7 +2045,6 @@ static struct sock *accept_socket( struct sock *sock ) release_object( acceptsock ); return NULL; } - allow_fd_caching( acceptsock->fd ); unix_len = sizeof(unix_addr); if (!getsockname( acceptfd, &unix_addr.addr, &unix_len )) { @@ -2094,7 +2093,6 @@ static int accept_into_socket( struct sock *sock, struct sock *acceptsock ) get_fd_options( acceptsock->fd ) ))) return FALSE; } - allow_fd_caching( newfd );
acceptsock->state = SOCK_CONNECTED; acceptsock->bound = 1; diff --git a/server/trace.c b/server/trace.c index d10bb978f83..be81af3d55f 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3544,6 +3544,7 @@ static void dump_get_key_state_request( const struct get_key_state_request *req static void dump_get_key_state_reply( const struct get_key_state_reply *req ) { fprintf( stderr, " state=%02x", req->state ); + dump_varargs_bytes( ", keystate=", cur_size ); }
static void dump_set_key_state_request( const struct set_key_state_request *req ) diff --git a/tools/winedump/minidump.c b/tools/winedump/minidump.c index d8010ea0159..80057a21829 100644 --- a/tools/winedump/minidump.c +++ b/tools/winedump/minidump.c @@ -76,7 +76,7 @@ void mdmp_dump(void)
if (!hdr) { - printf("Corrupt file, cannot get Minidump header\n"); + printf("Cannot get Minidump header\n"); return; }
@@ -89,21 +89,13 @@ void mdmp_dump(void) printf(" TimeDateStamp: %s\n", get_time_str(hdr->TimeDateStamp)); printf("Flags: %s\n", get_hexint64_str(hdr->Flags));
- if (!PRD(hdr->StreamDirectoryRva, hdr->NumberOfStreams * sizeof(MINIDUMP_DIRECTORY))) - { - printf("Corrupt file, can't read all minidump directories\n"); - return; - } for (idx = 0; idx < hdr->NumberOfStreams; ++idx) { dir = PRD(hdr->StreamDirectoryRva + idx * sizeof(MINIDUMP_DIRECTORY), sizeof(*dir)); + if (!dir) break;
stream = PRD(dir->Location.Rva, dir->Location.DataSize); - if (!stream) - { - printf("Stream [%u]: corrupt file, stream is larger that file\n", idx); - continue; - } + switch (dir->StreamType) { case UnusedStream: @@ -854,36 +846,6 @@ void mdmp_dump(void) } } break; - case CommentStreamA: - { - /* MSDN states an ANSI string, so stopping at first '\0' if any */ - const char *end = memchr(stream, '\0', dir->Location.DataSize); - printf("Stream [%u]: CommentA\n", idx); - printf("--- start of comment\n"); - write(1, stream, end ? end - (const char*)stream : dir->Location.DataSize); - printf("--- end of comment\n"); - if (globals_dump_sect("content")) - dump_mdmp_data(&dir->Location, " "); - } - break; - case CommentStreamW: - { - const WCHAR *ptr; - - /* MSDN states an UNICODE string, so stopping at first L'\0' if any */ - printf("Stream [%u]: CommentW\n", idx); - printf("--- start of comment\n"); - for (ptr = stream; ptr + 1 <= (const WCHAR *)((const char *)stream + dir->Location.DataSize) && *ptr; ptr++) - { - if (*ptr== L'\n' || *ptr== L'\r' || *ptr== L'\t' || (*ptr >= L' ' && *ptr < 127)) - putchar((char)*ptr); - else printf("\u%04x", *ptr); - } - printf("--- end of comment\n"); - if (globals_dump_sect("content")) - dump_mdmp_data(&dir->Location, " "); - } - break; default: printf("Stream [%u]: NIY %d\n", idx, dir->StreamType); printf(" RVA: %#x\n", (UINT)dir->Location.Rva); diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c index 997daab501b..cb5fbb0b9ad 100644 --- a/tools/winedump/msc.c +++ b/tools/winedump/msc.c @@ -52,12 +52,11 @@ struct full_value } v; };
-static int full_numeric_leaf(struct full_value *fv, const unsigned char *leaf) +static int full_numeric_leaf(struct full_value* fv, const unsigned short int* leaf) { - unsigned short int type = *(const unsigned short *)leaf; + unsigned short int type = *leaf++; int length = 2;
- leaf += length; fv->type = fv_integer; if (type < LF_NUMERIC) { @@ -185,7 +184,7 @@ static const char* full_value_string(const struct full_value* fv) return tmp; }
-static int numeric_leaf(int* value, const unsigned char* leaf) +static int numeric_leaf(int* value, const unsigned short int* leaf) { struct full_value fv; int len = full_numeric_leaf(&fv, leaf); @@ -519,24 +518,24 @@ static void do_field(const unsigned char* start, const unsigned char* end) switch (fieldtype->generic.id) { case LF_ENUMERATE_V1: - leaf_len = full_numeric_leaf(&full_value, fieldtype->enumerate_v1.data); - pstr = (const struct p_string*)&fieldtype->enumerate_v1.data[leaf_len]; + leaf_len = full_numeric_leaf(&full_value, &fieldtype->enumerate_v1.value); + pstr = PSTRING(&fieldtype->enumerate_v1.value, leaf_len); printf("\t\tEnumerate V1: '%s' value:%s\n", p_string(pstr), full_value_string(&full_value)); ptr += 2 + 2 + leaf_len + 1 + pstr->namelen; break;
case LF_ENUMERATE_V3: - leaf_len = full_numeric_leaf(&full_value, fieldtype->enumerate_v3.data); - cstr = (const char*)&fieldtype->enumerate_v3.data[leaf_len]; + leaf_len = full_numeric_leaf(&full_value, &fieldtype->enumerate_v3.value); + cstr = (const char*)&fieldtype->enumerate_v3.value + leaf_len; printf("\t\tEnumerate V3: '%s' value:%s\n", cstr, full_value_string(&full_value)); ptr += 2 + 2 + leaf_len + strlen(cstr) + 1; break;
case LF_MEMBER_V1: - leaf_len = numeric_leaf(&value, fieldtype->member_v1.data); - pstr = (const struct p_string *)&fieldtype->member_v1.data[leaf_len]; + leaf_len = numeric_leaf(&value, &fieldtype->member_v1.offset); + pstr = PSTRING(&fieldtype->member_v1.offset, leaf_len); printf("\t\tMember V1: '%s' type:%x attr:%s @%d\n", p_string(pstr), fieldtype->member_v1.type, get_attr(fieldtype->member_v1.attribute), value); @@ -544,8 +543,8 @@ static void do_field(const unsigned char* start, const unsigned char* end) break;
case LF_MEMBER_V2: - leaf_len = numeric_leaf(&value, fieldtype->member_v2.data); - pstr = (const struct p_string *)&fieldtype->member_v2.data[leaf_len]; + leaf_len = numeric_leaf(&value, &fieldtype->member_v2.offset); + pstr = PSTRING(&fieldtype->member_v2.offset, leaf_len); printf("\t\tMember V2: '%s' type:%x attr:%s @%d\n", p_string(pstr), fieldtype->member_v2.type, get_attr(fieldtype->member_v2.attribute), value); @@ -553,10 +552,10 @@ static void do_field(const unsigned char* start, const unsigned char* end) break;
case LF_MEMBER_V3: - leaf_len = numeric_leaf(&value, fieldtype->member_v3.data); - cstr = (const char*)&fieldtype->member_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &fieldtype->member_v3.offset); + cstr = (const char*)&fieldtype->member_v3.offset + leaf_len; printf("\t\tMember V3: '%s' type:%x attr:%s @%d\n", - cstr, fieldtype->member_v3.type, + cstr, fieldtype->member_v3.type, get_attr(fieldtype->member_v3.attribute), value); ptr += 2 + 2 + 4 + leaf_len + strlen(cstr) + 1; break; @@ -694,43 +693,43 @@ static void do_field(const unsigned char* start, const unsigned char* end) break;
case LF_BCLASS_V1: - leaf_len = numeric_leaf(&value, fieldtype->bclass_v1.data); + leaf_len = numeric_leaf(&value, &fieldtype->bclass_v1.offset); printf("\t\tBase class V1: type:%x attr:%s @%d\n", - fieldtype->bclass_v1.type, + fieldtype->bclass_v1.type, get_attr(fieldtype->bclass_v1.attribute), value); ptr += 2 + 2 + 2 + leaf_len; break;
case LF_BCLASS_V2: - leaf_len = numeric_leaf(&value, fieldtype->bclass_v2.data); + leaf_len = numeric_leaf(&value, &fieldtype->bclass_v2.offset); printf("\t\tBase class V2: type:%x attr:%s @%d\n", - fieldtype->bclass_v2.type, + fieldtype->bclass_v2.type, get_attr(fieldtype->bclass_v2.attribute), value); ptr += 2 + 2 + 4 + leaf_len; break;
case LF_VBCLASS_V1: case LF_IVBCLASS_V1: - leaf_len = numeric_leaf(&value, fieldtype->vbclass_v1.data); + leaf_len = numeric_leaf(&value, &fieldtype->vbclass_v1.vbpoff); printf("\t\t%sirtual base class V1: type:%x (ptr:%x) attr:%s vbpoff:%d ", (fieldtype->generic.id == LF_VBCLASS_V2) ? "V" : "Indirect v", fieldtype->vbclass_v1.btype, fieldtype->vbclass_v1.vbtype, get_attr(fieldtype->vbclass_v1.attribute), value); ptr += 2 + 2 + 2 + 2 + leaf_len; - leaf_len = numeric_leaf(&value, ptr); + leaf_len = numeric_leaf(&value, (const unsigned short*)ptr); printf("vboff:%d\n", value); ptr += leaf_len; break;
case LF_VBCLASS_V2: case LF_IVBCLASS_V2: - leaf_len = numeric_leaf(&value, fieldtype->vbclass_v1.data); + leaf_len = numeric_leaf(&value, &fieldtype->vbclass_v1.vbpoff); printf("\t\t%sirtual base class V2: type:%x (ptr:%x) attr:%s vbpoff:%d ", (fieldtype->generic.id == LF_VBCLASS_V2) ? "V" : "Indirect v", fieldtype->vbclass_v2.btype, fieldtype->vbclass_v2.vbtype, get_attr(fieldtype->vbclass_v2.attribute), value); ptr += 2 + 2 + 4 + 4 + leaf_len; - leaf_len = numeric_leaf(&value, ptr); + leaf_len = numeric_leaf(&value, (const unsigned short*)ptr); printf("vboff:%d\n", value); ptr += leaf_len; break; @@ -827,20 +826,20 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type curr_type, type->pointer_v2.datatype); break; case LF_ARRAY_V1: - leaf_len = numeric_leaf(&value, type->array_v1.data); + leaf_len = numeric_leaf(&value, &type->array_v1.arrlen); printf("\t%x => Array V1-'%s'[%u type:%x] type:%x\n", - curr_type, p_string((const struct p_string *)&type->array_v1.data[leaf_len]), + curr_type, p_string(PSTRING(&type->array_v1.arrlen, leaf_len)), value, type->array_v1.idxtype, type->array_v1.elemtype); break; case LF_ARRAY_V2: - leaf_len = numeric_leaf(&value, type->array_v2.data); + leaf_len = numeric_leaf(&value, &type->array_v2.arrlen); printf("\t%x => Array V2-'%s'[%u type:%x] type:%x\n", - curr_type, p_string((const struct p_string *)&type->array_v2.data[leaf_len]), + curr_type, p_string(PSTRING(&type->array_v2.arrlen, leaf_len)), value, type->array_v2.idxtype, type->array_v2.elemtype); break; case LF_ARRAY_V3: - leaf_len = numeric_leaf(&value, type->array_v3.data); - str = (const char*)&type->array_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->array_v3.arrlen); + str = (const char*)&type->array_v3.arrlen + leaf_len; printf("\t%x => Array V3-'%s'[%u type:%x] type:%x\n", curr_type, str, value, type->array_v3.idxtype, type->array_v3.elemtype); @@ -871,10 +870,10 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type
case LF_STRUCTURE_V1: case LF_CLASS_V1: - leaf_len = numeric_leaf(&value, type->struct_v1.data); + leaf_len = numeric_leaf(&value, &type->struct_v1.structlen); printf("\t%x => %s V1 '%s' elts:%u property:%s fieldlist-type:%x derived-type:%x vshape:%x size:%u\n", curr_type, type->generic.id == LF_CLASS_V1 ? "Class" : "Struct", - p_string((const struct p_string *)&type->struct_v1.data[leaf_len]), + p_string(PSTRING(&type->struct_v1.structlen, leaf_len)), type->struct_v1.n_element, get_property(type->struct_v1.property), type->struct_v1.fieldlist, type->struct_v1.derived, type->struct_v1.vshape, value); @@ -882,11 +881,11 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type
case LF_STRUCTURE_V2: case LF_CLASS_V2: - leaf_len = numeric_leaf(&value, type->struct_v2.data); + leaf_len = numeric_leaf(&value, &type->struct_v2.structlen); printf("\t%x => %s V2 '%s' elts:%u property:%s\n" " fieldlist-type:%x derived-type:%x vshape:%x size:%u\n", curr_type, type->generic.id == LF_CLASS_V2 ? "Class" : "Struct", - p_string((const struct p_string *)&type->struct_v2.data[leaf_len]), + p_string(PSTRING(&type->struct_v2.structlen, leaf_len)), type->struct_v2.n_element, get_property(type->struct_v2.property), type->struct_v2.fieldlist, type->struct_v2.derived, type->struct_v2.vshape, value); @@ -894,8 +893,8 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type
case LF_STRUCTURE_V3: case LF_CLASS_V3: - leaf_len = numeric_leaf(&value, type->struct_v3.data); - str = (const char*)&type->struct_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->struct_v3.structlen); + str = (const char*)&type->struct_v3.structlen + leaf_len; printf("\t%x => %s V3 '%s' elts:%u property:%s\n" " fieldlist-type:%x derived-type:%x vshape:%x size:%u\n", curr_type, type->generic.id == LF_CLASS_V3 ? "Class" : "Struct", @@ -907,24 +906,24 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type break;
case LF_UNION_V1: - leaf_len = numeric_leaf(&value, type->union_v1.data); + leaf_len = numeric_leaf(&value, &type->union_v1.un_len); printf("\t%x => Union V1 '%s' count:%u property:%s fieldlist-type:%x size:%u\n", - curr_type, p_string((const struct p_string *)&type->union_v1.data[leaf_len]), + curr_type, p_string(PSTRING(&type->union_v1.un_len, leaf_len)), type->union_v1.count, get_property(type->union_v1.property), type->union_v1.fieldlist, value); break;
case LF_UNION_V2: - leaf_len = numeric_leaf(&value, type->union_v2.data); + leaf_len = numeric_leaf(&value, &type->union_v2.un_len); printf("\t%x => Union V2 '%s' count:%u property:%s fieldlist-type:%x size:%u\n", - curr_type, p_string((const struct p_string *)&type->union_v2.data[leaf_len]), + curr_type, p_string(PSTRING(&type->union_v2.un_len, leaf_len)), type->union_v2.count, get_property(type->union_v2.property), type->union_v2.fieldlist, value); break;
case LF_UNION_V3: - leaf_len = numeric_leaf(&value, type->union_v3.data); - str = (const char*)&type->union_v3.data[leaf_len]; + leaf_len = numeric_leaf(&value, &type->union_v3.un_len); + str = (const char*)&type->union_v3.un_len + leaf_len; printf("\t%x => Union V3 '%s' count:%u property:%s fieldlist-type:%x size:%u\n", curr_type, str, type->union_v3.count, get_property(type->union_v3.property), @@ -1699,9 +1698,9 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long int vlen; struct full_value fv;
- vlen = full_numeric_leaf(&fv, sym->constant_v2.data); + vlen = full_numeric_leaf(&fv, &sym->constant_v2.cvalue); printf("Constant V2 '%s' = %s type:%x\n", - p_string((const struct p_string *)&sym->constant_v2.data[vlen]), + p_string(PSTRING(&sym->constant_v2.cvalue, vlen)), full_value_string(&fv), sym->constant_v2.type); } break; @@ -1711,9 +1710,9 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long int vlen; struct full_value fv;
- vlen = full_numeric_leaf(&fv, sym->constant_v3.data); + vlen = full_numeric_leaf(&fv, &sym->constant_v3.cvalue); printf("Constant V3 '%s' = %s type:%x\n", - (const char*)&sym->constant_v3.data[vlen], + (const char*)&sym->constant_v3.cvalue + vlen, full_value_string(&fv), sym->constant_v3.type); } break; @@ -1889,7 +1888,6 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long case S_INLINEES: { unsigned i, ninvoc; - const cv_typ_t *functions; const unsigned* invoc; const char* tag;
@@ -1897,15 +1895,12 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long else if (sym->generic.id == S_CALLEES) tag = "Callees"; else tag = "Inlinees"; printf("%s V3 count:%u\n", tag, sym->function_list_v3.count); - functions = (const cv_typ_t *)&sym->function_list_v3.data; - invoc = (const unsigned*)&functions[sym->function_list_v3.count]; + invoc = (const unsigned*)&sym->function_list_v3.funcs[sym->function_list_v3.count]; ninvoc = (const unsigned*)get_last(sym) - invoc; - if (ninvoc < sym->function_list_v3.count) ninvoc = sym->function_list_v3.count;
- for (i = 0; i < ninvoc; ++i) + for (i = 0; i < sym->function_list_v3.count; ++i) printf("%*s| func:%x invoc:%u\n", - indent, "", functions[i], invoc[i]); - if (i < sym->function_list_v3.count) printf("Number of entries exceed symbol serialized size\n"); + indent, "", sym->function_list_v3.funcs[i], i < ninvoc ? invoc[i] : 0); } break;
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147258
Your paranoid android.
=== debian11 (build log) ===
Task: Patch failed to apply
=== debian11b (build log) ===
Task: Patch failed to apply
This merge request was closed by Maarten Jacobs.