From ff7126b75a8f721838c9c9678a1dcd48effbdc2b Mon Sep 17 00:00:00 2001 From: Jan Zerebecki Date: Sat, 6 Sep 2008 13:15:47 +0200 Subject: [PATCH] push ecbf641448c0bfa9cef0bbdfb59876e45db6a304 --- .gitignore | 11 + ANNOUNCE | 1738 +++++++++----------- VERSION | 2 +- configure | 25 +- configure.ac | 8 + dlls/advapi32/tests/crypt_lmhash.c | 14 +- dlls/advapi32/tests/security.c | 2 +- dlls/advapi32/tests/service.c | 12 +- dlls/appwiz.cpl/No.rc | 6 +- dlls/appwiz.cpl/Ru.rc | 79 + dlls/appwiz.cpl/Zh.rc | 143 ++ dlls/appwiz.cpl/appwiz.rc | 2 + dlls/avifil32/avifile_Zh.rc | 90 + dlls/avifil32/rsrc.rc | 1 + dlls/browseui/rsrc.rc | 1 + dlls/browseui/rsrc_Zh.rc | 65 + dlls/comctl32/comctl32.h | 4 +- dlls/comctl32/comctl_Zh.rc | 79 +- dlls/comctl32/listview.c | 5 +- dlls/comctl32/monthcal.c | 10 + dlls/comctl32/tests/comboex.c | 3 +- dlls/comctl32/tests/listview.c | 4 +- dlls/comdlg32/cdlg.h | 2 +- dlls/comdlg32/cdlg_Ja.rc | 142 +- dlls/comdlg32/cdlg_Zh.rc | 10 +- dlls/comdlg32/printdlg.c | 32 +- dlls/credui/credui.rc | 1 + dlls/credui/credui_Zh.rc | 86 + dlls/crypt32/Makefile.in | 1 + dlls/crypt32/collectionstore.c | 81 + dlls/crypt32/crypt32.spec | 2 +- dlls/crypt32/crypt32_private.h | 1 + dlls/crypt32/ctl.c | 673 ++++++++ dlls/crypt32/filestore.c | 24 +- dlls/crypt32/msg.c | 83 +- dlls/crypt32/provstore.c | 84 + dlls/crypt32/regstore.c | 29 +- dlls/crypt32/store.c | 122 +- dlls/crypt32/tests/Makefile.in | 1 + dlls/crypt32/tests/cert.c | 35 +- dlls/crypt32/tests/chain.c | 20 +- dlls/crypt32/tests/ctl.c | 422 +++++ dlls/crypt32/tests/encode.c | 96 +- dlls/crypt32/tests/main.c | 7 +- dlls/crypt32/tests/message.c | 40 +- dlls/crypt32/tests/msg.c | 78 +- dlls/crypt32/tests/store.c | 12 +- dlls/d3d8/directx.c | 2 +- dlls/d3d9/directx.c | 2 +- dlls/d3d9/tests/device.c | 96 ++ dlls/d3d9/tests/texture.c | 88 + dlls/d3dxof/d3dxof.c | 133 +- dlls/d3dxof/d3dxof_private.h | 2 + dlls/dbghelp/dbghelp_private.h | 7 +- dlls/dbghelp/dwarf.h | 39 +- dlls/dbghelp/module.c | 4 + dlls/dbghelp/msc.c | 31 +- dlls/dbghelp/path.c | 330 ++-- dlls/dbghelp/pe_module.c | 58 +- dlls/ddraw/ddraw.c | 8 +- dlls/ddraw/device.c | 55 +- dlls/ddraw/direct3d.c | 3 +- dlls/ddraw/tests/Makefile.in | 1 + dlls/ddraw/tests/overlay.c | 228 +++ dlls/ddraw/utils.c | 5 + dlls/dinput/dinput_main.c | 6 +- dlls/dplayx/tests/dplayx.c | 16 +- dlls/dsound/buffer.c | 7 +- dlls/dsound/mixer.c | 50 +- dlls/dsound/tests/ds3d.c | 3 + dlls/dsound/tests/dsound.c | 2 +- dlls/dsound/tests/dsound8.c | 2 +- dlls/gdi32/freetype.c | 6 + dlls/gdi32/tests/palette.c | 4 +- dlls/gdiplus/brush.c | 160 +- dlls/gdiplus/customlinecap.c | 105 ++ dlls/gdiplus/font.c | 22 + dlls/gdiplus/gdiplus.spec | 28 +- dlls/gdiplus/gdiplus_private.h | 4 + dlls/gdiplus/graphics.c | 253 ++- dlls/gdiplus/graphicspath.c | 228 ++- dlls/gdiplus/image.c | 45 +- dlls/gdiplus/imageattributes.c | 6 + dlls/gdiplus/matrix.c | 43 + dlls/gdiplus/region.c | 26 +- dlls/gdiplus/tests/brush.c | 25 + dlls/gdiplus/tests/graphics.c | 15 +- dlls/gdiplus/tests/graphicspath.c | 45 +- dlls/gdiplus/tests/image.c | 9 +- dlls/gphoto2.ds/gphoto2_Zh.rc | 96 ++ dlls/gphoto2.ds/rsrc.rc | 1 + dlls/hhctrl.ocx/Zh.rc | 100 ++ dlls/hhctrl.ocx/hhctrl.h | 8 +- dlls/hhctrl.ocx/hhctrl.rc | 1 + dlls/iphlpapi/tests/iphlpapi.c | 3 +- dlls/jscript/Makefile.in | 11 +- dlls/jscript/dispex.c | 230 +++ dlls/jscript/engine.c | 560 +++++++ dlls/jscript/engine.h | 441 +++++ dlls/jscript/jscript.c | 257 ++- dlls/jscript/jscript.h | 60 + dlls/jscript/jscript_main.c | 1 - dlls/jscript/jsutils.c | 112 ++ dlls/jscript/lex.c | 687 ++++++++ dlls/jscript/parser.y | 1550 +++++++++++++++++ dlls/jscript/tests/Makefile.in | 5 +- dlls/jscript/tests/jscript.c | 226 ++- dlls/jscript/tests/run.c | 362 ++++ dlls/kernel32/kernel32.spec | 12 +- dlls/kernel32/module.c | 6 + dlls/kernel32/sync.c | 212 ++- dlls/kernel32/tests/environ.c | 4 +- dlls/kernel32/tests/file.c | 34 + dlls/kernel32/tests/module.c | 19 +- dlls/kernel32/tests/pipe.c | 5 +- dlls/kernel32/tests/version.c | 11 +- dlls/localspl/localspl.rc | 1 + dlls/localspl/localspl_private.h | 2 +- .../oleview/rsrc.rc => dlls/localspl/spl_Zh.rc | 34 +- dlls/localui/localui.rc | 1 + dlls/localui/ui_Zh.rc | 94 ++ dlls/mlang/tests/mlang.c | 9 - dlls/mpr/mpr.rc | 1 + dlls/mpr/mpr_Zh.rc | 78 + dlls/msacm32/msacm.rc | 1 + dlls/msacm32/msacm_Zh.rc | 98 ++ dlls/mshtml/Zh.rc | 98 ++ dlls/mshtml/dispex.c | 8 + dlls/mshtml/htmlbody.c | 39 +- dlls/mshtml/mshtml_private.h | 16 +- dlls/mshtml/rsrc.rc | 1 + dlls/mshtml/tests/dom.c | 4 +- dlls/mshtml/tests/script.c | 10 + dlls/msi/action.c | 3 +- dlls/msi/msi.rc | 1 + dlls/msi/msi_Zh.rc | 54 + dlls/msi/msipriv.h | 4 + dlls/msi/tests/automation.c | 13 +- dlls/msi/tests/install.c | 61 +- dlls/msimtf/main.c | 2 +- dlls/mstask/mstask_main.c | 4 +- dlls/mstask/tests/task.c | 6 +- dlls/mstask/tests/task_scheduler.c | 2 +- dlls/msvcrt/tests/printf.c | 15 +- dlls/msvfw32/msvfw32_Zh.rc | 92 ++ dlls/msvfw32/msvideo_main.c | 6 +- dlls/msvfw32/rsrc.rc | 1 + dlls/msxml3/dispex.c | 1 + dlls/msxml3/domdoc.c | 27 +- dlls/msxml3/msxml_private.h | 1 + dlls/msxml3/node.c | 2 +- dlls/msxml3/tests/domdoc.c | 8 + dlls/msxml3/tests/saxreader.c | 8 +- dlls/msxml3/tests/xmldoc.c | 2 + dlls/msxml3/tests/xmlelem.c | 14 +- dlls/netapi32/tests/access.c | 8 +- dlls/ntdll/nt.c | 44 +- dlls/ntdll/ntdll.spec | 44 +- dlls/ntdll/process.c | 22 + dlls/ntdll/sync.c | 76 + dlls/ntdll/tests/file.c | 70 + dlls/ntdll/tests/path.c | 19 +- dlls/ntdll/tests/rtlstr.c | 7 +- dlls/ntoskrnl.exe/ntoskrnl.c | 64 +- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 12 +- dlls/ole32/Makefile.in | 9 +- .../winver/winver.c => dlls/ole32/ole32_objidl.idl | 20 +- .../ole32/ole32_oleidl.idl | 13 +- .../winver/winver.c => dlls/ole32/ole32_unknwn.idl | 20 +- dlls/ole32/oleproxy.c | 1116 ++----------- dlls/ole32/tests/compobj.c | 8 +- dlls/ole32/tests/moniker.c | 20 +- dlls/ole32/usrmarshal.c | 799 +++++++++ dlls/oleaut32/Makefile.in | 3 +- dlls/oleaut32/hash.c | 1 + dlls/oleaut32/oleaut.c | 3 +- dlls/oleaut32/oleaut32.rc | 1 + .../rsrc.rc => dlls/oleaut32/oleaut32_Zh.rc | 42 +- .../oleaut32/oleaut32_ocidl.idl | 13 +- dlls/oleaut32/typelib.c | 2 + dlls/oleaut32/usrmarshal.c | 184 +++ dlls/oledlg/oledlg_Zh.rc | 180 ++ dlls/oledlg/rsrc.rc | 1 + dlls/quartz/pin.c | 1 + dlls/quartz/tests/avisplitter.c | 2 + dlls/rasapi32/tests/rasapi.c | 18 +- dlls/riched20/editor.h | 4 +- dlls/riched20/table.c | 4 +- dlls/riched20/tests/editor.c | 15 +- dlls/riched20/wrap.c | 2 +- dlls/rpcrt4/tests/ndr_marshall.c | 1 - dlls/rpcrt4/tests/rpc.c | 4 +- dlls/sane.ds/rsrc.rc | 1 + dlls/sane.ds/sane_Zh.rc | 66 + dlls/schannel/tests/main.c | 4 +- dlls/serialui/Zh.rc | 72 + dlls/serialui/serialui_rc.rc | 1 + dlls/setupapi/Zh.rc | 54 + dlls/setupapi/setupapi.rc | 1 + dlls/shdoclc/Zh.rc | 483 ++++++ dlls/shdoclc/rsrc.rc | 1 + dlls/shdocvw/tests/intshcut.c | 2 +- dlls/shell32/Makefile.in | 1 + dlls/shell32/appbar.c | 122 ++ dlls/shell32/shell32_main.c | 55 - dlls/shell32/tests/Makefile.in | 1 + dlls/shell32/tests/appbar.c | 405 +++++ dlls/shell32/tests/shlfolder.c | 5 + dlls/shell32/tests/systray.c | 63 +- dlls/shlwapi/shlwapi.rc | 1 + dlls/shlwapi/shlwapi_Zh.rc | 72 + dlls/shlwapi/tests/ordinal.c | 22 +- dlls/shlwapi/tests/path.c | 12 +- dlls/shlwapi/tests/url.c | 4 +- dlls/urlmon/tests/stream.c | 26 +- dlls/user32/dde_client.c | 2 - dlls/user32/dde_misc.c | 2 +- dlls/user32/dde_server.c | 4 +- dlls/user32/tests/dde.c | 313 +++- dlls/user32/tests/input.c | 2 +- dlls/user32/tests/menu.c | 21 +- dlls/winealsa.drv/dsoutput.c | 4 + dlls/winealsa.drv/waveout.c | 3 - dlls/wined3d/arb_program_shader.c | 435 +++-- dlls/wined3d/context.c | 34 +- dlls/wined3d/device.c | 71 +- dlls/wined3d/directx.c | 59 +- dlls/wined3d/drawprim.c | 25 +- dlls/wined3d/nvidia_texture_shader.c | 2 +- dlls/wined3d/state.c | 526 +++--- dlls/wined3d/stateblock.c | 30 + dlls/wined3d/surface.c | 68 +- dlls/wined3d/swapchain_base.c | 9 + dlls/wined3d/utils.c | 14 +- dlls/wined3d/wined3d_private.h | 7 +- dlls/winenas.drv/audio.c | 2 +- dlls/wineps.drv/rsrc.rc | 1 + dlls/wineps.drv/wps_Zh.rc | 64 + dlls/winhttp/main.c | 41 +- dlls/winhttp/net.c | 7 +- dlls/winhttp/request.c | 257 ++- dlls/winhttp/session.c | 194 ++- dlls/winhttp/tests/Makefile.in | 1 + dlls/winhttp/tests/notification.c | 267 +++ dlls/winhttp/tests/winhttp.c | 58 +- dlls/winhttp/winhttp_private.h | 5 +- dlls/wininet/rsrc.rc | 1 + dlls/wininet/wininet_Zh.rc | 78 + dlls/winspool.drv/Zh.rc | 64 + dlls/winspool.drv/tests/info.c | 4 +- dlls/winspool.drv/winspool.rc | 1 + dlls/wintrust/tests/asn.c | 2 + dlls/ws2_32/tests/sock.c | 12 +- include/Makefile.in | 1 + include/commctrl.h | 8 + include/ddk/ntddk.h | 5 + include/ddk/wdm.h | 6 + include/dxfile.h | 12 +- include/gdiplusflat.h | 10 + include/gdiplusgpstubs.h | 2 + include/mimeole.idl | 48 + include/mshtmdid.h | 80 + include/mshtml.idl | 1676 +++++++++++++++++-- include/objbase.h | 2 +- include/rpcndr.h | 2 +- include/shlobj.h | 2 +- include/srrestoreptapi.h | 58 + include/winbase.h | 19 +- include/wincrypt.h | 4 +- include/wine/mscvpdb.h | 4 +- include/wine/wined3d_gl.h | 1 + include/wine/wined3d_interface.h | 4 +- include/winnt.h | 29 + include/winternl.h | 16 +- libs/wine/loader.c | 2 +- libs/wine/mmap.c | 25 + programs/clock/Ja.rc | 2 +- programs/control/Makefile.in | 1 + programs/control/control.c | 4 +- programs/eject/Makefile.in | 1 + programs/expand/Makefile.in | 1 + programs/expand/expand.c | 4 +- programs/explorer/Makefile.in | 2 + programs/explorer/appbar.c | 300 ++++ programs/explorer/desktop.c | 1 + programs/explorer/explorer_private.h | 1 + programs/explorer/systray.c | 12 +- programs/hh/Makefile.in | 1 + programs/hh/main.c | 2 +- programs/icinfo/Makefile.in | 1 + programs/iexplore/Makefile.in | 1 + programs/msiexec/Makefile.in | 1 + programs/msiexec/msiexec.c | 4 +- programs/msiexec/service.c | 6 +- programs/notepad/Zh.rc | 8 +- programs/oleview/Zh.rc | 410 +++++ programs/oleview/rsrc.rc | 1 + programs/reg/Makefile.in | 2 +- programs/reg/reg.c | 4 +- programs/regedit/Ja.rc | 105 +- programs/regedit/Zh.rc | 656 ++++++++ programs/regedit/childwnd.c | 123 +- programs/regedit/edit.c | 143 +- programs/regedit/framewnd.c | 133 +- programs/regedit/listview.c | 107 +- programs/regedit/main.c | 6 +- programs/regedit/main.h | 18 +- programs/regedit/regproc.c | 33 +- programs/regedit/rsrc.rc | 1 + programs/regedit/treeview.c | 75 +- programs/regsvr32/Makefile.in | 1 + programs/regsvr32/regsvr32.c | 2 +- programs/rpcss/Makefile.in | 1 + programs/secedit/Makefile.in | 1 + programs/services/Makefile.in | 1 + programs/spoolsv/Makefile.in | 1 + programs/start/Makefile.in | 1 + programs/start/start.c | 6 +- programs/svchost/Makefile.in | 1 + programs/taskmgr/Ja.rc | 80 +- programs/taskmgr/Zh.rc | 935 +++++++++++ programs/taskmgr/taskmgr.rc | 1 + programs/uninstaller/Makefile.in | 1 + programs/uninstaller/Zh.rc | 38 + programs/uninstaller/rsrc.rc | 1 + programs/view/Zh.rc | 124 ++ programs/view/viewrc.rc | 1 + programs/wineboot/Makefile.in | 1 + programs/wineboot/shutdown.c | 2 +- programs/wineboot/wineboot.rc | 1 + programs/wineboot/wineboot_Zh.rc | 55 + programs/winebrowser/Makefile.in | 1 + programs/winebrowser/main.c | 6 +- programs/winecfg/Ja.rc | 53 +- programs/winedbg/debugger.h | 1 + programs/winedbg/gdbproxy.c | 2 +- programs/winedbg/tgt_active.c | 2 +- programs/winedbg/tgt_minidump.c | 2 +- programs/winedbg/tgt_module.c | 2 +- programs/winedbg/winedbg.c | 39 + programs/winedevice/Makefile.in | 1 + programs/winemenubuilder/Makefile.in | 1 + programs/winemine/Ja.rc | 92 ++ programs/winemine/Zh.rc | 166 ++ programs/winemine/rsrc.rc | 2 + programs/winepath/Makefile.in | 1 + programs/winepath/winepath.c | 4 +- programs/winetest/gui.c | 4 + programs/winetest/main.c | 2 +- programs/winevdm/Makefile.in | 1 + programs/winevdm/winevdm.c | 2 +- programs/winhlp32/Zh.rc | 4 +- programs/winver/Makefile.in | 1 + programs/winver/winver.c | 6 +- programs/wordpad/Ja.rc | 241 +++ programs/wordpad/Zh.rc | 472 ++++++ programs/wordpad/rsrc.rc | 2 + programs/write/Makefile.in | 1 + programs/write/write.c | 4 +- programs/xcopy/Makefile.in | 2 +- programs/xcopy/xcopy.c | 56 +- tools/widl/client.c | 3 +- tools/widl/header.c | 64 +- tools/widl/header.h | 2 - tools/widl/proxy.c | 87 +- tools/widl/server.c | 21 +- tools/widl/typegen.c | 9 +- tools/wine.inf.in | 1 + tools/winebuild/import.c | 12 +- tools/winedump/debug.c | 4 +- 370 files changed, 21890 insertions(+), 4369 deletions(-) rewrite ANNOUNCE (96%) create mode 100644 dlls/appwiz.cpl/Ru.rc create mode 100644 dlls/appwiz.cpl/Zh.rc create mode 100644 dlls/avifil32/avifile_Zh.rc create mode 100644 dlls/browseui/rsrc_Zh.rc create mode 100644 dlls/credui/credui_Zh.rc create mode 100644 dlls/crypt32/ctl.c create mode 100644 dlls/crypt32/tests/ctl.c create mode 100644 dlls/ddraw/tests/overlay.c create mode 100644 dlls/gphoto2.ds/gphoto2_Zh.rc create mode 100644 dlls/hhctrl.ocx/Zh.rc create mode 100644 dlls/jscript/dispex.c create mode 100644 dlls/jscript/engine.c create mode 100644 dlls/jscript/engine.h create mode 100644 dlls/jscript/jsutils.c create mode 100644 dlls/jscript/lex.c create mode 100644 dlls/jscript/parser.y create mode 100644 dlls/jscript/tests/run.c copy programs/oleview/rsrc.rc => dlls/localspl/spl_Zh.rc (60%) create mode 100644 dlls/localui/ui_Zh.rc create mode 100644 dlls/mpr/mpr_Zh.rc create mode 100644 dlls/msacm32/msacm_Zh.rc create mode 100644 dlls/mshtml/Zh.rc create mode 100644 dlls/msi/msi_Zh.rc create mode 100644 dlls/msvfw32/msvfw32_Zh.rc copy programs/winver/winver.c => dlls/ole32/ole32_objidl.idl (66%) copy programs/explorer/explorer_private.h => dlls/ole32/ole32_oleidl.idl (74%) copy programs/winver/winver.c => dlls/ole32/ole32_unknwn.idl (66%) rewrite dlls/ole32/oleproxy.c (91%) copy programs/oleview/rsrc.rc => dlls/oleaut32/oleaut32_Zh.rc (57%) copy programs/explorer/explorer_private.h => dlls/oleaut32/oleaut32_ocidl.idl (74%) create mode 100644 dlls/oledlg/oledlg_Zh.rc create mode 100644 dlls/sane.ds/sane_Zh.rc create mode 100644 dlls/serialui/Zh.rc create mode 100644 dlls/setupapi/Zh.rc create mode 100644 dlls/shdoclc/Zh.rc create mode 100644 dlls/shell32/appbar.c create mode 100644 dlls/shell32/tests/appbar.c create mode 100644 dlls/shlwapi/shlwapi_Zh.rc create mode 100644 dlls/wineps.drv/wps_Zh.rc create mode 100644 dlls/winhttp/tests/notification.c create mode 100644 dlls/wininet/wininet_Zh.rc create mode 100644 dlls/winspool.drv/Zh.rc create mode 100644 include/srrestoreptapi.h create mode 100644 programs/explorer/appbar.c create mode 100644 programs/oleview/Zh.rc create mode 100644 programs/regedit/Zh.rc create mode 100644 programs/taskmgr/Zh.rc create mode 100644 programs/uninstaller/Zh.rc create mode 100644 programs/view/Zh.rc create mode 100644 programs/wineboot/wineboot_Zh.rc create mode 100644 programs/winemine/Ja.rc create mode 100644 programs/winemine/Zh.rc create mode 100644 programs/wordpad/Ja.rc create mode 100644 programs/wordpad/Zh.rc diff --git a/.gitignore b/.gitignore index 50351514356..1caea1bc939 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,8 @@ dlls/display.drv16 dlls/gdi.exe16 dlls/imm.dll16 dlls/jscript/jsglobal.tlb +dlls/jscript/parser.tab.c +dlls/jscript/parser.tab.h dlls/kernel32/nls/winerr_deu.mc.rc dlls/kernel32/nls/winerr_enu.mc.rc dlls/kernel32/nls/winerr_fra.mc.rc @@ -70,10 +72,19 @@ dlls/ole2nls.dll16 dlls/ole2prox.dll16 dlls/ole2thk.dll16 dlls/ole32/dcom.h +dlls/ole32/dcom_p.c dlls/ole32/irot.h dlls/ole32/irot_c.c +dlls/ole32/ole32_objidl.h +dlls/ole32/ole32_objidl_p.c +dlls/ole32/ole32_oleidl.h +dlls/ole32/ole32_oleidl_p.c +dlls/ole32/ole32_unknwn.h +dlls/ole32/ole32_unknwn_p.c dlls/oleaut32/oleaut32_oaidl.h dlls/oleaut32/oleaut32_oaidl_p.c +dlls/oleaut32/oleaut32_ocidl.h +dlls/oleaut32/oleaut32_ocidl_p.c dlls/oleaut32/tests/test_tlb.tlb dlls/oleaut32/tests/tmarshal.h dlls/oleaut32/tests/tmarshal.tlb diff --git a/ANNOUNCE b/ANNOUNCE dissimilarity index 96% index b692da06983..7a2c6111333 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,934 +1,804 @@ -The Wine development release 1.1.3 is now available. - -What's new in this release (see below for details): - - Beginnings of ddraw overlay support. - - Many more crypt32 functions. - - Improved support for tables in Richedit. - - Support for NETWM window maximization. - - Many installer fixes. - - Tweaks for better PulseAudio support. - - Various bug fixes. - -The source is available from the following locations: - - http://ibiblio.org/pub/linux/system/emulators/wine/wine-1.1.3.tar.bz2 - http://prdownloads.sourceforge.net/wine/wine-1.1.3.tar.bz2 - -Binary packages for various distributions will be available from: - - http://www.winehq.org/site/download - -You will find documentation on http://www.winehq.org/site/documentation - -You can also get the current source directly from the git -repository. Check http://www.winehq.org/site/git for details. - -Wine is available thanks to the work of many people. See the file -AUTHORS in the distribution for the complete list. - ----------------------------------------------------------------- - -Bugs fixed in 1.1.3: - - 1439 commdlg.dll.so comdlg32.dll.so, a possible font dialog bug ? - 2538 Reaktor menus not displayed properly - gray bars - 2605 Borland qtinf70 draw problems - 3307 wininet: A cookie set during a 302 response won't be used during an automatic redirect - 3332 Explore Folder using ShellExecute fails - 3546 CLSID_InternetShortcut not available... - 4101 Picasa: Unable to use Blogthis after signin. - 5033 WINE_GET_SONAME does not pick up libjack soname - 5286 TreeView in Becky! Internet Mail doesn't work properly - 5504 riched20:Spinner on textfields and comboboxes - 6160 eDrawings somewhat installs completely but fails to run - 6519 Wine blacks out rotated font bitmap - 6534 Counter Strike 1.6 crashes after asking for the gecko engine - 7118 Wine does not listen to the clipboard - 7211 Wine does not correctly launch Guild Wars - 8829 EVE Online model of Large Artillery Battery structure is mostly transparent - 9670 SparVoip crashes - 10303 Unable to play Windows Media files - 10437 Altium Designer crash - 10620 PAF 5 help viewer hits unhandled page fault while closing - 10684 Some games fail to restore pre-launch gamma - 10951 Flashlight is darker then it should be in Half-Life 2: Episode 2 - 11029 Black & White game does not respond to mouse clicks - 11098 Vaz Modular 3.03 hangs on exit - 11526 Wine dies when starting Sigma Photo Pro 3.0 - 11616 Soulbringer crashes after intro - 11766 Heap corruption in crypt32 during Sandra benchmark? - 12087 winrar add file dialog cannot get multi-select files correctly - 12089 winrar crashes when I try to add a file with a long file name - 12206 Can't install Timeshift Demo - 12364 Overlapping of windows within Photoshop CS2 - 12486 Microsoft Office Standard 2007 installation failure - 12521 Origin 8.0: License expires immediately without native msxml3 - 12624 Installer failes to register typelib - 12634 WMP10 main window spurious window decorations - 12839 iphplapi: iphplapi.ok test fails in PC-BSD but not Linux - 12856 user32: menu.ok test fails in PC-BSD but not Linux - 12919 kernel32: virtual test fails in PC-BSD but not Linux - 12921 kernel32: toolhelp test fails in PC-BSD but not Linux - 13051 UI elements in Picasa displayed incorrectly after minimize and restore - 13173 Dragon NaturallySpeaking 9.0 Preferred crash on unimplemented gdiplus.dll.GdipCreateLineBrushFromRectWithAngleI - 13191 Trackmania Nations Forever doesn't work with PC2/3 shaders or with bloom-effect - 13217 Minimize/restore needs to send a WM_SYSCOMMAND message - 13231 msi: source.ok fails in Opensolaris - 13236 shell32: shlexec.ok fails in Opensolaris - 13256 Age of Mythology: missing bilinear filtering - 13268 MsiExec Runtime Error during install - 13446 Joining certain servers crashes Counter Strike: Source - 13550 Wrong textures being displayed at wrong places. - 13573 Room Arranger 5.04 needs GdipDrawEllipseI - 13586 Prince of Persia The Two Thrones: weird rendering bug - duplications on the sides - 13590 MS Office 2003: Cannot install Service Pack - 13601 can't compile wine with Xcode 3.1 or iPhone SDK - 13785 Opera 9.27 crashes at MSI install when you choose target location - 13877 Microsoft Office Enterprise 2007 fails to install - 14031 Max Payne 2: GL_INVALID_OPERATION in texture_activate_dimensions - 14038 Max Payne 2: bullet time screen filled with solid color - 14122 MagicMaps crashes in 2D window when user session via nxclient - 14183 HttpSendRequest() should fetch connection parameters instead of HttpOpenRequest(), especially Cookies. - 14192 ElsterFormular 2007/2008: Data submission fails with "Errorcode 49152" - 14199 Vertical text not rendered in schematic view of Altium DXP 2004 - 14227 MathCAD 2000 Pro 2D graph text label bug - 14268 carto exploreur 3 - crash - 14280 Richedit's EM_SETTEXTEX ignores ST_SELECTION - 14339 Download does not initialize when using Blizzard Downloader. - 14379 Ares does not connect to its network - 14384 Can not install MSDN - installer crashes - 14468 Hearts of Iron 2: Armageddon stops loading savegames - 14509 RegGetValue sometimes doesn't work properly - 14513 msysgit installer fails due to missing CreateHardLinkA stub - 14591 Oblivion crashes in wine 1.1.1 - 14594 crypt32.CryptHashMessage needed for VS.NET 2005 (deployment project type creation) - 14605 Star Wars Galaxies: USB joystick crashes application - 14615 rks_trial game is drawn out of place in its window - 14635 Regression - Cups printer not showing after upgrade to 1.1.2 - 14678 Office 2003 Pro installer page faults at end of install process - 14679 Diablo II Installer from Blizzard account download doesnt work. - 14683 Microsoft Money 2007: Crash on program startup - 14696 Mordor: the Depths of Dejenol installer crashes when running UNWIP.EXE - 14706 Max Payne 2: Windows no longer transparent - 14712 offcolour ingame text in Battlefield 1942 - 14714 intermittant crashes while playing bf1942 - 14716 distant objects not obscured by fog in bf1942 - 14720 Steam: uninstaller no longer launches from wine uninstaller - 14724 Max Payne 2: PP effect performance (ORM=fbo) - 14725 unimplemented function gdiplus.dll.GdipSetStringFormatTabStops - 14726 AW broser crashes, starts fine with native wininet - 14738 Sacred Underworld crashes when opening a lan game - 14745 wined3d BltOverride - blits from non-pow2 surfaces cause issues without GL_ARB_texture_non_power_of_two - 14790 after full tilt poker upgrade, client crashes randomly - 14816 Build breaks on "Solaris Express Community Edition" (SX:CE) (Solaris 11) at git + many warnings - 14908 listview items does not appear selected - 14911 Unable to run Drakensang demo - 14917 Ddraw Realizepalette regression - ----------------------------------------------------------------- - -Changes since 1.1.2: - -Adam Petaccia (11): - gdiplus: Implement GdipGetRegionData. - gdiplus: Implement GdipCreateRegionPath. - gdiplus: Implement GdipCreateRegionRect. - gdiplus: Implement GdipCreateRegionRectI. - gdiplus: Implement GdipCloneRegion. - gdiplus: Implement GdipCombineRegionRect. - gdiplus: Implement GdipCombineRegionRectI. - gdiplus: Implement GdipCombineRegionRegion. - gdiplus: Implement GdipCombineRegionPath. - gdiplus: Add another test to getregiondata. - gdiplus: Skip the generic font tests if we don't have the required fonts. - -Alexander Dorofeyev (5): - wined3d: Add ActivateContext in color_fill_fbo. - ddraw/tests: Skip cubemap tests when cubemap isn't supported. - wined3d: Disable TEXTURE_RECTANGLE in SetupForBlit. - wined3d: Set D3DPTEXTURECAPS_TRANSPARENCY. - wined3d: Fix copy paste error in IWineGDISurfaceImpl_RealizePalette. - -Alexander Morozov (4): - include/ddk/wdm.h: Add defines. - ntoskrnl.exe: Add stubs for IoAllocateIrp, IoInitializeIrp and IoFreeIrp. - ntoskrnl.exe: Add stub for IoDeleteSymbolicLink. - kernel32: Fix a typo. - -Alexander Nicolaysen Sørnes (13): - dpnet: Add basic DirectPlay8ThreadPool implementation. - shell32: Update Norwegian Bokmål translation. - appwiz.cpl: Fix overlapping controls. - appwiz.cpl: Add Norwegian Bokmål translation. - regedit: Convert deletion to unicode. - regedit: Convert printing&help to unicode. - regedit: Convert clipboard handling to unicode. - kernel32/winerr: Add Norwegian Bokmål translation. - regedit: Fix passing null pointer. - winhlp32: Update Norwegian Bokmål translation. - regedit: Convert key creation to unicode. - regedit: Convert AddEntryToTree to unicode. - dpnet: Add stubbed DirectPlay8Peer interface. - -Alexandre Julliard (24): - configure: Don't use cups-config --libs, it returns garbage. - wine.inf; Don't overwrite path and temp dir environment variables on upgrades. - ntdll: Use the generic int 0x91 syscall on Solaris so that it works on all CPUs. - user32/tests: Fix some tests on Win9x. - user32: Return a proper rectangle from WINPOS_MinMaximize. - user32: Add an entry point for ShowWindow to the driver interface. - winex11: Fetch the current X window position on ShowWindow resulting from a window manager event. - winex11: Send WM_SYSCOMMAND instead of calling ShowWindow directly to minimize/restore a window. - winex11: Check for wm maximized state in ConfigureNotify and update the window state accordingly. - winex11: Also check the maximized when restoring a minimized window. - user32/tests: Fix some message test failures on various Windows versions. - gdi32/tests: Allow some more rounding errors in glyph sizes. - test.h: Fetch environment variables from the Win32 environment not the Unix one. - winetest: Set environment variables in the Win32 environment. - user32/tests: Fix the listbox LB_DIR tests when directories are present. - user32/tests: Don't check last error on success in the broadcast tests. - user32/tests: Fix some test failures on win9x. - user32/tests: Fix a number of message sequence tests that could sometimes fail. - gdi32/tests: Fix some test failures on Win9x. - makefiles: Add missing entries for mstask tests. - configure: Require autoconf version 2.59d. - configure: Generate the makefiles list in configure instead of make_makefiles. - kernel32: Fix a compiler warning on Mac OS. - Avoid some size_t printf format warnings. - -Alistair Leslie-Hughes (10): - msxml3: Format get_xml string to be more like msxml3. - advapi32: Fix two tests for w2k8. - advapi32: Fix test under w2k8. - msxml3: Added and corrected trace string. - mshtml: Implement HTMLStyle get_background. - mshtml: Implement IDispatch for IHTMLStyle. - mshtml: Implement IDispatch for IHTMLElement. - mshtml: Implement IDispatch for IHTMLElement2. - mshtml: Implement IDispatch for IHTMLAnchorElement. - ole32: Stop crash under w2k8. - -Andre Wisplinghoff (2): - user32: Make dde test use skip function. - user32: Add a test for ToUnicode. - -Andrew Talbot (18): - advapi32: Remove unused variable. - browseui: Sign-compare warning fix. - appwiz.cpl: Sign-compare warning fix. - dmband: Sign-compare warning fix. - dmcompos: Sign-compare warning fix. - dmime: Sign-compare warning fix. - dmloader: Sign-compare warning fix. - dmscript: Sign-compare warning fix. - dmsynth: Sign-compare warning fix. - dmusic: Sign-compare warning fix. - d3dxof: Sign-compare warning fix. - dmstyle: Sign-compare warning fix. - dnsapi: Sign-compare warnings fix. - dswave: Sign-compare warning fix. - fusion: Sign-compare warnings fix. - gphoto2.ds: Sign-compare warning fix. - hhctrl.ocx: Sign-compare warning fix. - dmime: Indirection levels fix. - -Aric Stewart (4): - mlang: Japanese conversion tests. - wined3d: Check validity of rects before locking surface in Blt. - wined3d: Rework surface Blt a bit to only lock the part of the destination surface being drawn to. - dinput: The DIK_ keycode is not the same as the scancode. - -Austin English (1): - user32: Test what FindWindow does when window isn't found. - -Christian Costa (8): - winmm: Implement stub for midiConnect and midiDisconnect. - winealsa.drv: Improve midi port names. - d3dxof: Implement some parsing in RegisterTemplates. - d3dxof: Create FileEnumObject using its constructor. - d3dxof: Create FileData object using its constructor. Fix return value of CreateEnumObject. - d3dxof: Add basic tests. - d3dxof: Add text format support to RegisterTemplates and fix corresponding test. - msvcirt: Implement some ostream stubs. - -Colin Finck (3): - Fix some hackish usages of WideCharToMultiByte. - kernel32: Add a lot of new tests for the actual WideCharToMultiByte string conversion as well. - kernel32/tests: Fix a wrong length passed to a WideCharToMultiByte test, which led to a use of uninitialized stack memory. - -Damjan Jovanovic (3): - shdocvw: Add IUniformResourceLocator declarations to intshcut.h. - shdocvw: Rudimentary implementation of CLSID_InternetShortcut. - oleaut32: Add a failing VarFormat test. - -Dan Hipschman (6): - ntdll: Fix a small timer-queue bug whereby a deleted timer may still expire. - ntdll: Add support for a default timer queue. - kernel32/tests: Add tests for undocumented default timer queue "features". - widl: Honor typedef pointer attributes. - advapi32: Implement GetSecurityInfo. - advapi32/tests: Add tests for GetSecurityInfo with a NULL security descriptor pointer. - -Dan Kegel (2): - wininet: HTTP_QUERY_RAW_HEADERS_CRLF length shouldn't include nul. - shell32/tests: Test whether SHGetFileInfo should clear hIcon. - -David Adam (6): - d3dx8: Only the points in the positive ray are taken in account in D3DXSphereBoundProbe. - d3dx8: Implement D3DXBoxBoundProbe. - wordpad: Update the French translation. - appwiz.cpl: Add the French resource. - ddraw: Only ddraw checks wether one can give a null pointer to SetMaterial. - d3d8/d3d9: Remove unconsistent tests for SetMaterial. - -Detlef Riekenberg (9): - kernel32/tests: Fix a crash on win9x (lpDefault is truncated inplace). - crypt32/tests: Fix test on win9x (CreateFileW not implemented). - shlwapi/tests: Fix a buffer overflow that results in a crash on Win9x. - advapi32/tests: Handle the results from Win9x in the registry tests. - shell32/tests: Do not crash on Win9x when testing shlfileop. - shlwapi/tests: Fix istream tests on win9x (GetTempPathW). - shell32/tests: Fix shelllink test on win9x (GetTempPathW). - spoolss/tests: Fix a test on vista/w2k8. - winealsa.drv: Fix a typo in an error message. - -Dmitry Timoshkov (6): - mlang: Add a test for a CodePageToCodePages failure, make it pass under Wine. - mlang: Remove noise from mlang test output. - mlang: Do not use MAX_PATH for not path related things. - mlang: Remove debugging stuff. - gdi32: Avoid loading a bitmap if a glyph transformation is being requested. - gdi32: Replace DC transform by font scaling for bitmap fonts. - -Dustin Brody (1): - riched20: EM_SETTEXTTEX obeys ST_SELECTION with RTF inputs. - -Dylan Smith (18): - richedit: Added OleInitialize for clipboard operations. - richedit: Use tabstops to store cell positions. - richedit: Joined paragraph format depends on number of characters deleted. - richedit: Fixed rtf reader bug that caused large start indents. - richedit: Removed assumption about the order of rtf indent control words. - richedit: Word/Line/Paragraph selection had selection anchor on wrong side. - richedit: Handle tab key properly within table cells. - richedit: Protect deletion of cell boundaries when not deleting row. - richedit: Reversed deletion direction so tables are inserted forwards. - richedit: Each cell can contain multiple paragraphs in msftedit. - richedit: Added in support for streaming in and out nested tables. - richedit: EM_[SG]ETPARAFORMAT returned the wrong value. - richedit: Substitute space for \tab and \par control words for simple tables. - richedit: Removed an unused local variable and assignments to it. - richedit: Adjust table spacing with horizontal gap and left edge. - richedit: Borders are drawn for simple tables. - richedit: Borders are now drawn for tables and nested tables. - richedit: Added support for changing cell border colours. - -Eric Pouech (1): - winedbg: Don't force integral values while displaying a stack value, it doesn't work for float/double values. - -Francois Gouget (12): - gdiplus: Add a trailing '\n' to a Wine trace. - appwiz.cpl: Fix compilation on systems that don't support nameless unions. - appwiz.cpl: Fix the CPlApplet() prototype. - gdi32: Include config.h before using HAVE_XXX. - quartz: assert.h is not a local include. - winex11.drv: Fix the SysCommand() and ImeGetRegisterWordStyle() prototypes. - mscoree: Fix the ND_WI8() prototype. - Add some API documentation stubs to make winapi_check happy. - configure: Fix the 'no sound card' warning. - d3d9: Add an API documentation stub to make winapi_check happy. - Assorted spelling fixes. - dplayx/tests: Fix compilation on systems that don't support nameless unions. - -Frans Kool (1): - appwiz.cpl: Added Dutch resources. - -François Dorin (1): - ole32: Fix return value for DefaultHandler_SetExtent. - -Gerald Pfeifer (4): - comctl32: Push down function scope variable into the different case statements which allows us using more specific types in case. - comctl32: Remove unused parameter from _read_bitmap(). - Add return statements to avoid gcc warnings. - winhttp: #include for sockaddr_in. - -H. Verbeet (17): - wined3d: Container dirtification is already handled in ModifyLocation(). - wined3d: FBO texture == drawable handling is already handled in LoadLocation(). - wined3d: Call LoadLocation() on higher render targets as well, simplify some code in drawPrimitive. - wined3d: Move setting the draw buffer to a separate function. - wined3d: Use CTXUSAGE_RESOURCELOAD for ActivateContext() in color_fill_fbo(). - wined3d: Mark STATE_SCISSORRECT dirty in color_fill_fbo(). - wined3d: Apply FBO state in ActivateContext(). - wined3d: Handle CTXUSAGE_BLIT with offscreen targets and FBO ORM. - wined3d: Move creating a texture id from PreLoad to BindTexture. - d3d8: Don't store shader_handle's. - secur32: Reserved3 / Reserved4 are actually EncryptMessage / DecryptMessage. - wined3d: Don't free backends if they're not created yet. - wined3d: Don't allocate This->draw_buffers in the error path for Init3D(). - mountmgr: Include the terminating NULL in mount ids. - wined3d: Move depth stencil location handling code up a couple of lines. - wined3d: Track FBOs per-context. - wined3d: Remove useless hash_table_entry_t typedef. - -Hans Leidekker (17): - wininet: Use getaddrinfo for thread-safe resolving if available. - wininet: Properly initialize access type when no proxy is configured. - winhttp: Add a handle management implementation. - winhttp: Implement WinHttpOpen and WinHttpCloseHandle. - winhttp: Implement WinHttpConnect. - winhttp: Implement WinHttpOpenRequest. - winhttp: Implement WinHttpSetStatusCallback. Start sending notifications. - winhttp: Add stub implementations for WinHttpGetDefaultProxyConfiguration, WinHttpGetProxyForUrl and WinHttpSetDefaultProxyConfiguration. - winhttp: Forward WinHttpCrackUrl and WinHttpCreateUrl to wininet for the time being. - winhttp: Implement WinHttpTimeFromSystemTime and WinHttpTimeToSystemTime. - include: Add prototype for WinHttpQueryOption. - winhttp: Deliver status notifications to the application. - winhttp: Add a stub implementation for WinHttpSetTimeouts. - winhttp: Implement WinHttpAddRequestHeaders. - winhttp: Implement WinHttpQueryHeaders. - winhttp: Use default values for verb, object and version parameters in WinHttpOpenRequest. - winhttp: Add some tests for WinHttpAddRequestHeaders. - -Hongbo Ni (13): - user32: Implement WM_UNICHAR for edit control. - riched32: Implement WM_UNICHAR support. - msvcmaker: Fix msvc project file generation under MinGW32. - notepad: Update simplified Chinese resource. - clock: Update simplified Chinese resource. - winhlp32: Update simplified Chinese resource. - winefile: Update simplified Chinese resource. - winconsole: Update simplified Chinese resource. - progman: Update simplified Chinese resource. - user32: Update simplified Chinese resource. - shell32: Update simplified Chinese resource. - comdlg32: Update simplified Chinese resource. - comctl32: Update simplified Chinese resource. - -Huw Davies (9): - gdi32: Keep track of the number of unique fonts that are created and return this in the second DWORD of the GdiRealizationInfo structure. - kernel32: GetCalendarInfo shouldn't return HRESULT codes. Change a MESSAGE to a FIXME. - wineps.drv: Make sure we call CreateFontIndirect with zero width, otherwise we'll get a scaled-width font. - gdi32: Don't use biSizeImage for a BI_BITFIELDS dib. - include: Fix CRYPT_SMIME_CAPABILITIES definition. - crypt32: Don't write to pvStructInfo if it's NULL. - crypt32: Initialize the size to zero. - crypt32: Don't decrease the size of the buffer, since we're already counting the characters that we're adding to it. - crypt32: Remove some unnecessary code. - -Hwang YunSong(황윤성) (1): - shell32: Updated Korean resource. - -Ismael Barros (28): - dplayx: Fix the definition of DirectPlayCreate. - dplayx: Changed debug channel from dplayx to dplay. - dplayx: Tests for DirectPlayCreate. - dplayx: Tests for EnumConnections. - dplayx: Tests for InitializeConnection. - dplayx: Tests for GetCaps. - dplayx: Tests for Open. - dplayx: Tests for EnumSessions. - dplayx: Tests for Get/SetSessionDesc. - dplayx: Tests for CreatePlayer. - dplayx: Tests for GetPlayerCaps. - dplayx: Tests for Get/SetPlayerData. - dplayx: Tests for Get/SetPlayerName. - dplayx: Tests for GetPlayerAccount. - dplayx: Tests for GetPlayerAddress. - dplayx: Tests for GetPlayerFlags. - dplayx: Tests for CreateGroup. - dplayx: Tests for GroupOwner. - dplayx: Tests for EnumPlayers. - dplayx: Tests for EnumGroups. - dplayx: Tests for EnumGroupsInGroup. - dplayx: Tests for checking the behaviour of groups in a p2p session. - dplayx: Tests for checking the behaviour of groups in a C/S session. - dplayx: Tests for Send. - dplayx: Tests for Receive. - dplayx: Tests for GetMessageCount. - dplayx: Tests for GetMessageQueue. - dplayx: Tests for checking remote data replication. - -Jacek Caban (8): - mshtml: Added IHTMLElement2::get_scrollHeight implementation. - mshtml: Added IOmNavigator::get_platform implementation. - mshtml: Added IHTMLElement2::get_scrollWidth implementation. - mshtml: Forward IHTMLTextContainer::get_scroll[Hight|Width] implementation to IHTMLElement2. - mshtml: Added IHTMLElement2::get_scrollTop implementation. - mshtml: Forward IHTMLTextContainer::get_scrollTop to IHTMLElement2. - mshtml: Added IHTMLElement::get_offsetHeight implementation. - mshtml: Use heap_alloc_zero for HTMLWindow allocation. - -James Hawkins (42): - msi: Handle the package context when unpublishing the product. - msi: Validate the szProduct parameter of MsiConfigureProductEx. - msi: Properly locate the published product in MsiConfigureProductEx. - msi: Handle the INSTALLSTATE_ABSENT state in MsiConfigureProductEx. - msi: Set the ALLUSERS property for the machine context. - msi: Add tests for MsiConfigureProductEx. - msi: Directly register the typelib if it's not embedded in a PE module. - msi: Reimplement MsiOpenProduct. - msi: Add tests for MsiOpenProduct. - msi: Add a stub implementation of MsiEnumPatchesEx. - msi: Change an ERR that was supposed to be a TRACE. - winex11: Reduce console spam for AlphaBlend deficiencies. - advpack: Skip the TranslateInfEx tests in win9x. - advpack: Fix a failing test in win98. - msi: Test how MsiConfigureProductEx locates the source package. - msi: Also check the LocalPackage install property when searching for the product package. - ole32: Test the file access and share modes of StgCreateDocFile. - fusion: Handle loading 64-bit .NET assemblies. - fusion: Align the metadata header pointer on a DWORD boundary. - fusion: Ignore the case of the assembly filename extension. - msi: Ignore all non-stream elements when filling the _Streams table. - msi: Perform costing again for the InstallExecute sequence. - msi: Factor out media handling and use the new interface to efficiently extract assemblies. - msi: Ignore a file that has a missing component. - msi: Don't check for a NULL component, as the component is guaranteed to exist. - msi: Don't remove a file if the old file is strictly newer than the version to be installed. - msi: A file's component's state does not determine file removal. - msi: Remove misc files from the RemoveFile table. - msi: Test the file access and share modes of MsiOpenDatabase. - ole32: Storage sharing should be implemented in ole32, not the lower-level file API. - msi: Add more tests for feature and component states. - msi: Base removal of a file on the component's action, not the file's state. - msi: Use MsiQueryComponent state to determine the component's state. - msi: Use MsiQueryFeatureState to determine the feature's state. - msi: Handle processing a component that is installed to source. - msi: If the filename is empty or NULL, remove the directory. - msi: Downgrade an ERR to a TRACE. - msi: Handle components installed as source in MsiQueryComponentState. - msi: Remove an invalid setting of the install state. - msi: Don't remove a file that is installed as source. - msi: Fix the logic to determine the appropriate action of the component. - msi: Don't remove a misc file if the action is unknown. - -Jeff Latimer (5): - user32: DdeClientTransaction should return 0 in the last param for DDE_DATA. - user32: DdeQueryString returns a NULL str if there is no handle. - user32: DdeClientTransaction should check that pData is not NULL for XTYP_REQUEST. - user32/tests: Add tests for for invalid DDE conditions. - user32: Check for invalid conversation and return the correct error. - -Jeff Zaroyko (1): - winmm: Remove misleading message. - -Juan Lang (54): - shlwapi: Use CharNextA to iterate through characters in PathAddBackslashA. Fixes problems with MBCS paths. - crypt32: Move simplified message functions to their own file. - crypt32: Move simplified message tests to their own file. - crypt32: Add stub for CryptHashMessage. - crypt32: Add tests for CryptHashMessage. - crypt32: Implement CryptHashMessage. - rsaenh: Test and correct the maximum allowable salt length. - crypt32: Add test showing only file header is checked for cabinet files. - crypt32: Fix some test failures on Win9x. - msisip: Add stub dll. - msisip: Implement DllRegisterServer/DllUnregisterServer. - msisip: Implement MsiSIPIsMyTypeOfFile. - msisip: Implement MsiSIPGetSignedDataMsg. - tools/wine.inf: Register msisip.dll. - crypt32: Use ReadFile rather than a memory-mapped file to check the type of a file. - crypt32: Create a helper to load a SIP function from an open key. - crypt32: More fully implement CryptSIPRetrieveSubjectGuid. - crypt32: Use CryptSIPRetrieveSubjectGuid to determine how to read a message object from a file, rather than assuming the source file is always a PE executable. - ws2_32: Delay import iphlpapi. - crypt32: Add stub for CryptMsgGetAndVerifySigner. - crypt32: Add tests for CryptMsgGetAndVerifySigner. - crypt32: Implement CryptMsgGetAndVerifySigner. - crypt32: Add stub for CryptMsgVerifyCountersignatureEncodedEx. - crypt32: Add stub for CryptHashToBeSigned. - crypt32: Add tests for CryptHashToBeSigned. - crypt32: Implement CryptHashToBeSigned. - crypt32: Implement CERT_SIGNATURE_HASH_PROP_ID. - crypt32: Implement CertFindCertificateInStore for CERT_FIND_SIGNATURE_HASH. - crypt32: Set *pcbStructInfo on more success paths. - crypt32: Fix length calculation for decoding CRL_DIST_POINT_NAME. - crypt32: Free memory using the correct function on failure. - wincrypt.h: Add more missing definitions. - crypt32: Add tests for encoding/decoding CMSG_CMS_SIGNER_INFO. - crypt32: Implement CMSG_CMS_SIGNER_INFO encoding. - crypt32: Implement decoding CMSG_CMS_SIGNER_INFO. - crypt32: Allow messages to be opened when compiled with CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS if CMS fields aren't actually used. - crypt32: Allow messages to be opened when compiled with CMSG_SIGNED_ENCODE_INFO_HAS_CMS_FIELDS if CMS fields aren't actually used. - crypt32: Allow CMS fields to be set when opening a signed message to encode. - crypt32: Always set *pcbStructInfo. - crypt32: Use CMS messages rather than PKCS messages internally. - crypt32: Test and correct encoding of signed CMS messages. - crypt32: Add more tests for the version of encoded signed CMS messages. - crypt32: Add tests for CMSG_CMS_SIGNER_INFO_PARAM. - crypt32: Implement CMSG_CMS_SIGNER_INFO_PARAM. - crypt32: Support the KeyId type of signer in CMSG_SIGNER_INFO_PARAM. - crypt32: Support the KeyId type of signer in CMSG_SIGNER_CERT_INFO_PARAM. - crypt32: Pass address of blob to store data rather than message to CDecodeMsg_CopyData. - crypt32: Rewrite CDecodeMsg_Update for better detached data handling. - crypt32: Handle the detached portion of detached signed messages. - crypt32: Remove an unneeded helper. - crypt32: Reduce excessive indenting. - crypt32: Add tests for encoding/decoding PKCS_SMIME_CAPABILITIES. With help from Huw Davies. - crypt32: Add support for encoding PKCS_SMIME_CAPABILITIES. - crypt32: Add support for decoding PKCS_SMIME_CAPABILITIES. - -Ken Thomases (1): - kernel32: Strip modifiers from the Mac locale so setlocale can parse it. - -Kirill K. Smirnov (10): - winhlp32: Remove superfluous buttons from propsheet dialog templates. - winhlp32: Remove outdated comment. - wineconsole: Check return value of CreateWindow() for errors, do not rely upon callback function. - winhlp32: Fix parsing system header of win3.0 help file. - winhlp32: Fix off-by-one error. - winhlp32: Clear richedit area before setting text. - winhlp32: Set correct font size while generating rtf stream. - winhlp32: Load internal file containing pagenum->topicoffset mapping. - winhlp32: Fix offsets handling for old 3.0 files. - winhlp32: Use TopicOffset mapping and get rid of unused function. - -Lei Zhang (4): - cmd: Check the return value from HeapAlloc. - comctl32: Add a test for TTM_GETTEXT. - shell32: Handle directories in ShellExecute. - comctl32: Set listview focus on WM_LBUTTONUP instead of WM_LBUTTONDOWN. - -Luis C. Busquets Pérez (3): - d3dx9: Implementation of D3DXGetPixelShaderProfile. - d3dx9: Implementation of D3DXGetVertexShaderProfile. - d3dx9: Avoid assignment in D3DXGetVertexShaderProfile. - -Maarten Lankhorst (14): - qcap: Make the server directly register a filter instead of the workarounds. - uuids: Add MEDIASUBTYPE_AYUV. - quartz: Trace the iface pointer in the memory allocator. - quartz: Make transform filter return hresult from running/pausing. - quartz: Use correct media type in transformfilter's QueryAccept. - quartz: Pass InputPin as parameter to transform filter. - quartz: Fix end of file handling when first request is already end of file. - quartz: Fix support for files with multiple odml indexes. - winealsa.drv: Add ability to recover from underruns to directsound driver. - winealsa.drv: Fix compiler warnings and remove deprecated calls. - dsound: Remove int24_struct from conversion routines. - winmm: Test opening the same device twice. - winealsa.drv: Tune some parameters to make pulseaudio work. - dsound: Tune some parameters to make pulseaudio work. - -Michael Karcher (6): - winex11: Fix GetDIBits with monochrome pixmaps. - kernel32: Fix profile sharing mode. - msvcrt/file: stdio should clamp characters to 8 bits. - kernel32/tests: Fix profile crash on NT and up. - ntdll: Add sub-second resolution to NtQueryInformationFile. - kernel32: Fix profile cache logic and don't cache new files. - -Michael Stefaniuc (4): - msxml3: Remove redundant NULL checks before HeapFree and fix a memleak (Smatch). - advapi/tests: CreateFile returns INVALID_HANDLE_VALUE on error (Smatch). - riched20: Remove redundant NULL check before HeapFree (Smatch). - d3dxof: Remove unreachable break after return (Smatch). - -Mikołaj Zalewski (1): - shell32: autocomplete: There is no need for separate IAutoComplete and IAutoComplete2 vtbls. - -Muneyuki Noguchi (3): - regedit: Update Japanese translation. - notepad: Update Japanese translation. - winecfg: Update Japanese translation. - -Nikolay Sivov (30): - gdiplus: Added testfile for customlinecap + constr./destr. tests. - gdiplus: Implemented GdipGetCustomLineCapStrokeJoin with basic test. - gdiplus: Implemented GdipSetCustomLineCapStrokeJoin + tests. - gdiplus: Implemented GdipGetCustomLineCapBaseInset + test. - gdiplus: Implemented GdipGetCustomLineCapWidthScale with some tests. - gdiplus: Add a test that shows GdipCreateFontFromLogfontW problem with empty FaceName. - gdiplus: GdipGetStringFormatDigitSubstitution implemented. - gdiplus: GdipSetStringFormatDigitSubstitution implemented. - gdiplus: GdipStringFormatGetGenericTypographic implemented. - gdiplus: GdipGetStringFormatTabStopCount implementation with tests. - gdiplus: Implemented Gdip[Get/Set]StringFormatTabStops with tests. - gdiplus: Use LANG_NEUTRAL instead of 0. - gdiplus: Implemented GdipStringFormatGetGenericDefault with tests. - gdiplus: Implemented Gdip[Get/Set]PenMode. - gdiplus: Implemented GdipGetPenCustom[Start/End]Cap. - gdiplus: Implemented GdipFillPolygon2/GdipFillPolygon2I. - gdiplus: Move some Beziers helpers to gdiplus.c to use them for graphicspath. - gdiplus: Implemented GdipAddPathCurve2 with tests. - gdiplus: Implemented GdipAddPathCurve2I using GdipAddPathCurve2. - gdiplus: Implemented GdipAddPathCurve/GdipAddPathCurveI. - gdiplus: Implemented GdipAddPathClosedCurve2 with tests. - gdiplus: Implemented GdipAddPathClosedCurve2I using GdipAddPathClosedCurve2. - gdiplus: Implemented GdipAddPathClosedCurve/GdipAddPathClosedCurveI. - gdiplus: Implemented GdipReversePath with tests. - gdiplus: Implemented GdipAddPathPie/GdipAddPathPieI with test. - gdiplus: Implemented GdipPathIterIsValid with tests. - gdiplus: Implemented GdipPathIterNextSubpathPath with tests. - gdiplus: Implemented GdipResetWorldTransform. - gdiplus: Implemented GdipPathIterNextMarkerPath with tests. - gdiplus: Implemented GdipFillClosedCurve2[I]. - -Owen Rudge (5): - winefile: Fix absolute pidl conversion for non-filesystem shell objects. - shell32: Fix descriptions being applied to wrong entries in control panel. - shell32: Ensure status bar in control panel is reset when menu closed. Also reset to blank when item deselected. - appwiz.cpl: Gather extra information for Support Info dialog. - uninstaller: Remove GUI portion of Wine uninstaller. - -Paul Vriens (20): - comctl32/tests: Run tests again on Win95. - crypt32/tests: Don't crash on some win9x boxes. - gdi32/tests: Don't test unimplemented functions. - mshtml/tests: Don't fail on unimplemented function. - crypt32/tests: Use CryptAcquireContextA instead of CryptAcquireContextW. - kernel32/tests: Skip tests when codepage is not available. - mlang/tests: Skip tests for unsupported code page identifiers. - crypt32/tests: Don't crash on some win9x boxes. - iphlpapi/tests: Skip some tests for unsupported functions. - kernel32/tests: Fix a test failure on Win9x. - quartz/tests: Skip some tests on NT4. - kernel32/tests: Show the setting of the debugger registry value. - include/wine/svcctl.idl: Remove duplicate define. - ole32/tests: Fix a test on win98 and W2K. - advapi32/tests: Add helper function to get function pointers. - advapi32/tests: Add tests for QueryServiceStatus. - advapi32/tests: Add tests for QueryServiceStatusEx. - advapi32/tests: Add tests for EnumServicesStatusA. - advapi32: Prevent a crash when passing an allowed NULL parameter. - advapi32/tests: Add tests for EnumServicesStatusExA. - -Piotr Caban (33): - msxml3: Generalize bsc_t implementation. - msxml3: Added ISAXXMLReader_parseURL implementation. - msxml3/tests: Added test for ISAXXMLReader_parseURL. - msxml3: Added stub implementation of ISAXAttributes. - msxml3: Initialize ISAXAttribute structure. - msxml3: Add ISAXAttribute_getLength implementation. - msxml3: Added ISAXAttributes_getLocalName implementation. - msxml3: Added ISAXAttributes_getValue implementation. - msxml3: Reorganize parse_buffer function (make use of libxml2 parserInternals.h). - msxml3: Added ISAXAttributes_getQName implementation. - msxml3: Prepare functions for IVBSAX... interfaces implementation. - msxml3: Added IVBSAXAttributes implementation. - msxml3: Prepare libxml2 callbacks for IVBSAX... interfaces implementation. - msxml3: Add IVBSAXLocator implementation. - msxml3: Integrate implementation of IVBSAXXMLReader and ISAXXMLReader interfaces. - msxml3: Return QNames properly. - msxml3: Add NULL pointers check in getLocalName, getQName and getValue. - msxml3: Add implementation of ISAXAttributes_getURI. - msxml3: Add ISAXContentHandler_startPrefixMapping event. - msxml3: Add namespaces to attributes. - msxml3: Add ISAXContentHandler_endPrefix event. - msxml3: Fix checking if ContentHandler was set. - msxml3: Add ISAXAttributes_getName implementation. - msxml3: Add ISAXAttributes_getIndexFromName implementation. - msxml3: Add ISAXAttributes_getIndexFromQName implementation. - msxml3: Add ISAXAttributes_getValueFromName implementation. - msxml3: Add ISAXAttributes_getValueFromQName implementation. - msxml3: Add error handling when reading from IStream. - msxml3: Fix IVBErrorHandler related bugs. - msxml3: Use LoadTypeLibEx to register typelib. - msxml3: Code clean up. - msxml3: Added queryresult's IDispatchEx implementation. - msxml3: Added IDispatchEx QueryInterface test. - -Reece Dunn (6): - crypt32: Check Vista error codes for the msg tests. - secur32: Fix the ntlm tests crashing on Vista. - secur32: Fix the schannel tests crashing on Vista. - shell32: Fix shlexec crashing on Vista. - crypt32: Removed the failing base64 test in Vista. - shlwapi: Fixed the string tests on Vista. - -Rico Schüller (1): - inetmib1: Fix wrong arguments. - -Rob Shearman (50): - oleaut32: Use the typelib debug channel for debug messages output during loading of SLTG typelibs. - oleaut32: Move the debug logging of the variable type in SLTG_DoVars. - oleaut32: Dump the loaded module in SLTG_ProcessModule. - oleaut32: Handle strings with a length of 0xffff in SLTG_DoVars. - oleaut32: Fix the loading of the parameter name for SLTG propget functions. - rpcrt4: Validate the uuid portion of the string passed to RpcStringBindingParseA/W. - rpcrt4: Factorise conformant array NDR functions and use them to fix the wire-representation of complex structures with conformant arrays. - rpcrt4: Add tests for a complex struct with conformant array. - rpcrt4: Factorise conformant varying array functions into array_* functions. - rpcrt4: Factorise conformant string functions into array_* functions. - rpcrt4: Re-implement part of the conformant varying structure processing routines using array_* functions. - rpcrt4: Fix a typo in the ncalrpc protseq in the epm_endpoints structure. - rpcrt4: Fix crash calculation of tower size in rpcrt4_ncalrpc_get_top_of_tower. - rpcrt4: Fix crash in rpcrt4_ncalrpc_parse_top_of_tower due to unconditionally dereferencing networkaddr and endpoint variables. - rpcrt4: Fix the protid used in ncalrpc tower functions. - rpcss: Warn in ept_insert if TowerExplode fails. - rpcss: Register the endpoint for the ncalrpc protseq for the endpoint mapper. - rpcrt4: Check that strings in SMB, NB and pipe floors are nul-terminated before copying the data. - include: Fix the WINELIB_NAME_AW macro for RpcBindingToStringBinding. - rpcrt4: Add test for RpcBindingToStringBindingA. - rpcrt4: Fix RpcBindingToStringBinding to not generate a UUID string if the object UUID is nil. - rpcrt4: Print a warning if connecting to a named pipe failed in rpcrt4_conn_open_pipe in the !wait case. - rpcrt4: Fix RpcStringBindingComposeA/W and RpcStringBindingParseA/W to escape and unescape delimiters in the string binding. - oleaut32: Avoid unnecessary allocations in TLB_MultiByteToBSTR and SLTG_ReadString. - oleaut32: Fix invalid free of import library entry name with SLTG typelibs. - cryptnet: Fix mismatch between sizeof and countof quantities in CRYPT_GetUrlFromCertificateCRLDistPoint. - appwiz.cpl: Fix leak of thread and process handles in UninstallProgram. - d3d9: Fix variable type in IDirect3DDevice9Impl_GetSoftwareVertexProcessing. - d3d9: Remove unneeded local variable in IDirect3DDevice9Impl_SetFVF. - include: Remove superfluous semi-colons from wine/wined3d_gl.h. - hhctl.ocx: Fix reference count leak in InPlace_OnPosRectChange. - comctl32: Fix use of arithmetic operator on Boolean type in TREEVIEW_ComputeItemInternalMetrics. - msrle32: Fix uses of arithmetic operators on Boolean types in MSRLE32_CompressRLE4Line and MSRLE32_CompressRLE8Line. - msi: Fix handle leak in ITERATE_SelfRegModules. - ole32: Fix testing of HRESULT types with not operator instead of comparing against S_OK. - oleaut32: Fix testing of HRESULT types with not operator instead of comparing against S_OK. - quartz: Fix testing of HRESULT types with not operator instead of comparing against S_OK. - shlwapi: Fix testing of HRESULT types with not operator instead of comparing against S_OK. - urlmon: Fix testing of HRESULT types with not operator instead of comparing against S_OK. - shell32: Don't assign a result from a function that returns a BOOL to an HRESULT in shellex_get_dataobj. - oleaut32: Fix buffer length passed to VARIANT_DI_tostringW in VarBstrFromCy. - hhctrl.ocx: Nul-terminate url_indicator constant in NavigateToUrl. - quartz: Use memcmp instead of strncmp in MPEGSplitter_pre_connect. - rpcrt4: Remove unreachable code in EmbeddedComplexSize. - ole32: Remove dead code in StorageImpl_LoadFileHeader. - kernel32: Fix a typo in the leadin check in WaitNamedPipeW. - rpcrt4: Test the endpoint mapper for the ncalrpc protseq as well as the ncacn_np protseq. - rpcrt4: Check for previous association being NULL in RPCRT4_ResolveBinding. - rpcrt4: Don't get or create an association for bindings with incomplete endpoints. - rpcrt4: Implement RpcBindingReset. - -Roderick Colenbrander (2): - wined3d: Fix BltOverride regression. - wined3d: Fix window rewrite regression. - -Roy Shea (24): - mstask: Implemented DllRegisterServer. - mstask: Implemented DllUnregisterServer. - mstask/test: NewWorkItem conformance test. - mstask: Task stub with AddRef, QueryInterface, and Release. - mstask: Implemented NewWorkItem. - mstask: Activate conformance test. - mstask: Stub implementation of Activate. - include: Add task scheduler specific error codes. - include: Added defines used by TASK_TRIGGER members. - mstask/test: Conformance test for (Set|Get)ApplicationName. - mstask/test: Conformance test for CreateTrigger. - mstask/tests: Conformance test for (Set|Get)Parameters. - mstask/tests: Conformance test for (Set|Get)Comment. - mstask/tests: Conformance test for (Set|Get)MaxRunTime. - mstask/tests: Basic conformance test for (Set|Get)AccountInformation. - mstask: TaskTrigger stub with AddRef, QueryInterface, and Release. - mstask/tests: Conformance test for (Set|Get)Trigger. - mstask: Implemented (Set|Get)ApplicationName. - expand: Extended expand program to accept /r argument. - mstask: Task PersistFile AddRef, QueryInterface, and Release. - mstask: Implement (Set|Get)Parameters. - mstask: Implemented (Set|Get)Comment. - mstask: Implemented (Set|Get)MaxRunTime. - mstask: Implemented partial stub for (Set|Get)AccountInformation. - -Stefan Dösinger (50): - wined3d: Do not enable GL_TEXTURE_SHADER_NV unconditionally. - wined3d: Add fog and tex types to the ffp fragment description. - wined3d: Use C bitfields to compact the ffp description. - wined3d: Use a hashmap to store the ffp shaders. - wined3d: GL_ARB_fragment_program ffp implementation. - wined3d: Initialize the texture op function properly. - wined3d: Clamp results in the arbfp pipeline replacement. - wined3d: Beware of the frontbuffer coordinate system difference. - ddraw: Set ddraw caps in wined3d. - wined3d: Only set D3D caps when GL was loaded successfully. - wined3d: Report the pitch alignment to ddraw. - wined3d: Always load glFinish and glFlush from opengl32.dll. - d3d9: Skip gracefully if A16R16G16B16 is not supported. - wined3d: Call glFlush outside the GL lock. - wined3d: Remove a glFlush. - wined3d: Move the pshader fog update to the vertex pipeline. - wined3d: Implement overlay position tracking. - wined3d: Basic overlay emulation with opengl. - wined3d: Implement overlay flipping. - wined3d: Update the surface locations in Present. - wined3d: Track overlay surfaces in the overlayed surface. - wined3d: Move some swapchain code into a base class. - wined3d: Remove unused enum entry. - wined3d: Use a swapchain for GDI surfaces. - wined3d: Support redirecting the primary context. - d3d: Remove IWineD3DDevice::SetHwnd. - wined3d: Remove the device-global fullscreen flag. - wined3d: Remove the ddraw_window device member. - wined3d: Add a swapchain method to set the dest override. - ddraw: Send the ddraw output to the clipper window, if any. - ddraw: Implement IDirectDraw7::GetFourCCCodes. - wined3d: Support YUV formats with GL_APPLE_ycbcr_422. - wined3d: Start a framework for color conversion shaders in blits. - wined3d: Test formats for surface support. - wined3d: Ask the ffp/shader/blit implementation about format support. - wined3d: Implement YUV emulation with GL_ARB_fragment_program. - ddraw: Do not set the rendertarget flag just because of the backbuffer flag. - wined3d: Keep track of the last used device. - ddraw: Set the bitdepth on YUV formats. - wined3d: Fix the unused arg marker. - wined3d: Update the overlay when the destination was drawn to. - d3d9: Test for fixed function value clamping. - winex11: Do not cap the cursor size. - wined3d: Prefer aux buffer matches over alpha matches. - wined3d: Don't enable texture dimensions with shaders. - wined3d: Don't skip applying texdims with shaders. - wined3d: Set the texture wrap default with the NP2 emulation properly. - d3d9: Make the bumpmap test less picky. - wined3d: De-pickify the texbem test. - wined3d: Filter out more spam. - -Stefan Leichter (3): - rasapi32: Fix building the tests with MSVC (based on a patch by Reece Dunn). - rasapi32: Skip RasEnumDevicesA tests on configuration problems. - rasapi: Fix test failure on platforms vista, w2k8. - -Tobias Jakobi (2): - ddraw: Fix typo in copy_mipmap_chain. - wined3d: Remove arb_tex_npot for NV FX series in fixup_extensions. - -Tony Wasserka (1): - d3dx9: Add stubs for the ID3DXSprite functions. - -Vijay Kiran Kamuju (1): - d3drm: Add minimal d3drmobj.h. - -Vincent Povirk (2): - wininet: Default to keep-alive when the server is HTTP/1.1, not when it isn't. - user32: Implement TPM_*ALIGN flags. - -Vitaliy Margolen (3): - dinput: Implement saturation property for evdev joystick driver. - dinput: Zero the out buffer. - dinput: Add mouse warp override config option. - -Vladimir Pankratov (14): - taskmgr: Update Russian translation. - shell32: Update Russian translation. - taskmgr: Remove unused code. - taskmgr: Update Russian translation. - netapi32: Add stub for NetWkstaUserEnum. - netapi32: Add stub for NetGroupEnum. - taskmgr: Converted some functions to Unicode. - winecfg: Update Russian translation. - shell32: Update Russian translation. - taskmgr: Converted some functions and variables to Unicode. - taskmgr: Converted some functions and variables to Unicode. - taskmgr: Converted some functions and variables to Unicode. - taskmgr: Converted some functions and variables to Unicode. - taskmgr: Converted some functions and variables to Unicode. - -Will Tipton (1): - comctl32: Added input validation to TOOLTIPS_GetTextW() in order to handle gracefully the case where it is called with an empty tooltip. - -Zac Brown (10): - include/winhttp.h: Add WINHTTP_TIME_FORMAT_BUFSIZE. - winhttp: Add stub implementation for WinHttpWriteData. - winhttp/tests: Add test for sending request. - winhttp: Add stub implementation for WinHttpTimeFromSystemTime. - winhttp: Add test for WinHttpTimeFromSystemTime. - winhttp: Add stub implementation for WinHttpTimeToSystemTime. - winhttp: Add test for WinHttpTimeToSystemTime. - winhttp: Add stub implementation for WinHttpQueryHeaders. - winhttp: Add stub implementation for WinHttpAddRequestHeaders. - winhttp: Add test for adding/querying headers. - --- -Alexandre Julliard -julliard@winehq.org +The Wine development release 1.1.4 is now available. + +What's new in this release (see below for details): + - Substantial chunks of WinHTTP are implemented. + - More JavaScript support. + - Beginnings of shell AppBar implementation. + - Several fixes for Google Chrome support. + - Chinese translations. + - Various bug fixes. + +The source is available from the following locations: + + http://ibiblio.org/pub/linux/system/emulators/wine/wine-1.1.4.tar.bz2 + http://prdownloads.sourceforge.net/wine/wine-1.1.4.tar.bz2 + +Binary packages for various distributions will be available from: + + http://www.winehq.org/site/download + +You will find documentation on http://www.winehq.org/site/documentation + +You can also get the current source directly from the git +repository. Check http://www.winehq.org/site/git for details. + +Wine is available thanks to the work of many people. See the file +AUTHORS in the distribution for the complete list. + +---------------------------------------------------------------- + +Bugs fixed in 1.1.4: + + 1411 Crimson Skies trial won't run + 2424 Genotyper crashes when the registration dialog should appear + 3326 Subtitle Workshop & weird errors + 4065 picasa2: Korean fonts render with boxes + 5031 First Encounter Assault Recon (FEAR) SP Demo Crashes on Start + 5807 Mercora IMRadio crashes while attempting to run + 6299 steam pop-ups appear as small blue boxes without anything in them + 6486 Terragen water levels + 6609 Unable to install K-Lite Codec Pack + 7273 Several graphical corruptions in Railroad Tycoon 3 + 7755 Mafia (v1.2): Game runs but there is a choppy sound. + 8210 Atlantis Quest 1.0 demo crashes at startup + 8512 Saving in Google SketchUp6 doesn't work + 9119 VAZ Modular 3.03 Live Input module doesn't work. + 9537 Running JSmooth triggers Unhandled page fault + 10023 Vaz Modular 3.03 OSS driver output broken. + 10229 Serious Sam TSE 1.07 - network connection fails + 10414 Minimap in Warhammer 40k: Dark Crusade is offset + 10661 regedit imports wrong binary data from .reg files (affects FAR Manager) fix proposed + 10902 Steam and PulseAudio + 11119 XML Notepad 2007 won't start + 11301 documentElement.ownerDocument.createElement fails + 11357 Reflections in Tomb Raider - Anniversary Demo are buggy + 11688 Lego Star Wars II: In-game sound does not work + 11885 Supreme Commander is black It doesn't render anything. + 11962 regedit highlights the wrong item when searching + 12041 STALKER 1.0004-Trainer.exe crashes in dsound + 12285 BabasChess icons/buttons don't show after upgrading from wine 0.9.57 + 12573 Notation Composer: font glitch - boxes scattered around on initial screen + 12817 Music in Solfege still loopback repeatedly + 13118 Rome Total War Gold v1.5 stops responding in main menu after a while + 13229 Lunar Magic's level and overworld rendering area don't appear properly + 13321 WoW EULA fails to activate "Agree" button during installation (gecko wrapper) + 13327 StarryNight Pro: Window is painted black + 13523 distorted sound in Suboceanic 64k demo + 13526 Ableton Live window rendering bug (Worked in 0.9.13) + 13646 d3d9 device tests crash on XP + 13698 HyperChem 8.0.3: Error at beginning of InstallShield wizard + 13701 MBAC Ver. B Trial crash + 13899 Touhou games STILL don't show backgrounds at startup + 14104 Chessbase Fritz 10 does not start + 14241 FedExShipManager installer fails with "fixme:msxml:domdoc_createNode unhandled node type 2" + 14265 AxCrypt 1.6.4.4 can not be installed + 14291 winhelp: font sizes are smaller than with Windows WINHLP32.EXE + 14301 winhelp: Selecting a topic does not aways go to the correct page + 14576 DrawIconEx isn't up to date. + 14734 PowerPoint Viewer 2007 fails to start + 14760 Morrowind does not run and crashes + 14779 Painkiller doesn't start anymore + 14781 Kontakt, Kore Player: crash on start + 14842 Graphics glitch in DAZ Studio + 14946 Aliens vs Predator exits while starting game engine + 14958 Supreme Commander: Background grid gets Moiré pattern + 14977 Text in AVI-Mux GUI shows as garbage + 14992 Diablo 2 crash introduced in 1.1.3 + 15006 Problem rendering sky on Rose Online + 15020 assertion failed in GPSS World + 15035 Gothic 2, Aplication error - access violation + 15074 System Shock 2: randomly disappearing sound (esp. when loading level) + 15116 Google Chrome URL bar does not render properly + +---------------------------------------------------------------- + +Changes since 1.1.3: + +Adam Petaccia (16): + gdiplus: Stub GdipGetFamily. + gdiplus: Stub GdipGetFontStyle. + gdiplus: Test for GdipGetFamily. + gdiplus: Test for GdipGetFontStyle. + gdiplus: Implement GdipGetFamily. + gdiplus: Implement GdipGetFontStyle. + gdiplus: Implement GdipGetFontHeight. + gdiplus: Don't create a font if there is no facename. + gdiplus: GdipGetFontHeightGivenDPI: Return a valid value for UnitPixel. + gdiplus: Stub GdipTranslateLineTransform. + gdiplus: Stub GdipCreateTexture. + gdiplus: Stub GdipCreateTexture2. + gdiplus: Stub GdipCreateTexture2I. + gdiplus: Implement GdipCreateTexture. + gdiplus: Implement GdipCreateTexture2. + gdiplus: Implement GdipCreateTexture2I. + +Alexander Dorofeyev (6): + wined3d: Add glFlush when clearing the front buffer in ClearSurface. + wined3d: Remove glFlush in RealizePalette. + wined3d: Make the condition to enter p8 conversion shader path more strict. + wined3d: Remove glDrawBuffer calls in BltOverride. + wined3d: Get rid of gl buffer variable in BltOverride. + wined3d: Remove obsolete code & ModifyLocation TODO. + +Alexander Nicolaysen Sørnes (32): + regedit: Remove unneeded character conversions. + regedit: Fix possible memory leaks. + regedit: Convert favourites handling to unicode. + regedit: Fix memory leaks in favourites handling. + regedit: Convert searching to Unicode. + regedit: Convert treeview init to Unicode. + regedit: Use only SendMessageW in treeview.c. + regedit: Convert menu & statusbar handling to unicode. + regedit: Fix leak in GetItemFullPathW. + regedit: Add listview entries as unicode. + regedit: Ignore case when sorting values. + regedit: Fix concat handling for ANSI files. + regedit: Avoid conversion to ANSI when importing hex values. + regedit: Use Unicode strings when updating listview. + regedit: Convert value creation to unicode. + regedit: Convert value editing to unicode. + regedit: Remove old fixme. + regedit: Don't try to convert NULL pointers. + regedit: Convert value renaming to unicode. + regedit: Convert key renaming to unicode. + regedit: Remove some ANSI functions. + regedit: Fix a memory leak. + regedit: Convert listview init to unicode. + regedit: Set the unicode flag for the listview. + regedit: Remove an ANSI function. + regedit: Set the unicode flag for the treeview. + include: Define some Get/SetUnicodeFormat macros. + regedit: Fix some references to TCHARs. + regedit: Remove some unused code. + regedit: Some minor unicode conversions. + regedit: Convert open/save dialogues to unicode. + regedit: Fix a memory leak in export handling. + +Alexandre Julliard (46): + configure: Generate the dlls directory lists in configure instead of make_makefiles. + configure: Add possibility to exclude some directories from the generated lists. + configure: Use the generic directory enabling mechanism to turn off dlls that depend on external libraries. + configure: Allow multiple variables in makefile output, and generate the programs directory lists. + d3dxof: Don't make local variables static. + makefiles: Recurse into all directories for install-lib and install-dev too. + configure: Generate the list of top-level directories to install. + gdi32: Add missing WineEngRealizationInfo function for the non-freetype case. + winhttp: Fix WinHttpSetDefaultProxyConfiguration spec entry. + winhttp: Add support for building on Windows. + dnsapi: Fix compile without the resolv library. + wininet/tests: Add support for optional notifications. Fix the test to pass again on Windows and Wine. + shell32/tests: Fix an unsigned comparison warning. + ntdll/tests: Allow alternate results in the env test to make it pass on Vista. + ntdll/tests: Allow alternate results in the info test to make it pass on Vista. + ntdll/tests: Allow alternate results in the string tests to make them pass on Vista. + msvcrt/tests: Add support for some broken demangle results on older Windows versions. + wininet: Avoid testing errno when it isn't set. Simplify NETCON_getNextLine a bit. + wininet/tests: Add a couple more optional notifications. + Include sys/filio.h to get the FIONREAD definition on Solaris. + ntdll/tests: Handle a couple of failures on NT4. + user32: Apply the SendMessage recursion counter to DispatchMessage too. + ntdll/tests: Fix a few more failures in the info test. + configure: Build the winetest dependencies in configure instead of make_makefiles. + winetest: Build the test list from the makefile instead of make_makefiles. + winex11: Allocate image data from the process heap where possible. + winex11: Always set the z-order when a window is being made visible. + shell32: Merge Chinese resources into a single file. + comdlg32: Merge Chinese resources into a single file. + comctl32: Rename the Chinese resources to comctl_Zh.rc. + widl: Replace write_name() by get_name() to make the code more readable. + widl: Add support for finally function in proxy methods. + programs: Build the programs that support it with -DWINE_NO_UNICODE_MACROS. + libwine: Reserve some malloc space on Solaris before we start mapping other things. + msvcrt/tests: Fix the %n format test for Vista. + configure: Disable by default some modules that cannot work on Windows. + reg.exe: Get rid of remaining uses of Unicode macros. + xcopy.exe: Get rid of remaining uses of Unicode macros. + libwine: Add support for relocating MS-style imports that use OriginalFirstThunk. + winebuild: Generate MS-style imports using the OriginalFirstThunk field. + ntdll: Implemented NtOpenProcessTokenEx and NtOpenThreadTokenEx. + ntdll: Add stubs for all the job object functions. + kernel32: Implemented the wrapper functions for job objects. + shlwapi/tests: Avoid sizeof in traces. + jscript: Avoid an uninitialized variable warning on older gcc. + crypt32: Avoid some uninitialized variable warnings on older gcc. + +Alistair Leslie-Hughes (11): + msxml3: Correct unsupported functions in IDispatchEx. + mshtml: Implement IDispatch for IHTMLBodyElement. + mshtml: Add missing defines. + mshtml: Add missing IDispatchEx tids. + mshtml: Add missing interfaces. + mshtml: Add dispinterface DispHTMLBody. + mshtml: Make IHTMLBodyElement use correct IDispatchEx interface. + mshtml: Add IHTMLElementBody test. + msxml3: Correct FIXME. + msxml3: Add IDispatchEx support to IXMLDOMDocument2. + msxml3: Add IDispatchEx test. + +Andrew Talbot (6): + dxdiagn: Sign-compare warning fix. + iphlpapi: Sign-compare warning fix. + jscript: Sign-compare warnings fix. + msimtf: Sign-compare warning fix. + mstask: Sign-compare warnings fix. + msvfw32: Sign-compare warning fix. + +Aric Stewart (3): + user32: Add test demonstrating the WM_PAINT loop. + systray: Keep systray hidden when requested by moving it off screen. + comctl32: monthcal: Set the stStart parameter when sending the MCN_GETDAYSTATE notification. + +Chris Robinson (2): + wined3d: Use 8 bits-per-component for the PBO test internal format. + wined3d: Use the proper internal type for some formats. + +Christian Costa (6): + d3dxof: Implement storage of parsed information. + d3dxof: Fix guid syntax. + d3dxof: Some fixes for template parsing in text mode. + d3dxof: Fix IDirectXFileDataReference macros. + d3dxof: Start implementing IDirectXFile_CreateEnumObject. + d3dxof: Handle comments in templates text format. + +Damjan Jovanovic (2): + oleaut32: Fix negative number handling in VarFormat. + oleaut32: Thousands separator support for VarFormat. + +Dan Hipschman (5): + ole32: Add widl-generated proxies for unknwn.idl and dcom.idl. + ole32: Add a widl-generated proxy file for objidl.idl. + ole32: Add a widl-generated proxy file for oleidl.idl. + widl: Output NULL for inherited methods in the vtbl. + oleaut32: Add a widl-generated proxy file for ocidl.idl. + +David Adam (1): + d3dx8: Remove useless variables. + +Detlef Riekenberg (5): + include: Declare TranslateURL and needed flags. + shlwapi: Fix parameters for RegQueryValueExW to read the default value. + shlwapi: Fix results for UrlApplyScheme. + shlwapi/tests: Add tests for UrlApplyScheme. + oleaut32: Add entry for 16-bit LHashValOfNameSys. + +Dmitry Timoshkov (3): + user32: Add a test for monitor work area, fix some failures. + user32: Partially revert 499c26ce66ec6cbbb3569c69ca95c9dfac01d39f. + ntdll: Add support for NtSetInformationProcess(ProcessExecuteFlags). + +Dylan Smith (6): + richedit: Pressing tab with selection back to start of table. + richedit: Fixed a bug in protecting table cell boundaries. + richedit: Copy cell border properties when appending a row to the table. + richedit: Prevent streaming in rich text at end of table row. + richedit: Prevent typing text at end of table row. + richedit: Prevent integer overflow in wrapping code with no wrap. + +Eric Pouech (6): + dbghelp: Added the definitions for Dwarf3 specifications. + winedump, dbghelp: Correctly name the age field in PDB headers. + dbghelp: Improve the symbol loader. + dbghelp: Improve the symbol loader for .DBG files. + dbghelp: SymFindFileInPath doesn't check for the parameters passed when looking in a directory, whatever the dbghelp's options. + winedbg: Search default debuggee dir for symbol information. + +Francois Gouget (19): + Assorted spelling fixes. + gdiplus: Add some documentation stubs to make winapicheck happy. + msxml3: Add a '\n' to a Wine trace. + winhttp/tests: Add a trailing '\n' to an ok() call. + user32/tests: Add a trailing '\n' to an ok() call. + dplayx/tests: Fix compilation on systems that don't support nameless unions. + appwiz.cpl: Remove spaces before '...' in the Norwegian resources. + notepad: Remove spaces before '\n' in the Chinese resources. + winhlp32: Remove spaces before '...' in the Chinese resources. + wined3d: Add a '\n' to Wine traces. + gdiplus/tests: Remove unneeded casts. + d3dxof: Remove spaces before '\n', add '\n' in Wine traces. + crypt32: Fix compilation on systems that don't support nameless unions. + oleaut32: Improve the LHashValOfNameSys() documentation a bit. + crypt32/tests: Add a trailing '\n' to an ok() call. + wined3d: Remove spaces before '\n' in Wine traces. + gdiplus: Add/fix the trailing '\n' in Wine traces. + kernel32/tests: Add a trailing '\n' to an ok() call. + d3dxof: Add a '\n' to a Wine trace. + +Gerald Pfeifer (3): + winhttp: Include . + quartz: Add return statement to PullPin_Thread_Main(). + winenas: Add return statement to wodPlayer(). + +Hans Leidekker (26): + winhttp: Add support for querying most of the standard header attributes. + winhttp: Add networking infrastructure. + winhttp: Implement WinHttpSendRequest. + winhttp: Implement WinHttpReceiveResponse. + winhttp: Implement WinHttpQueryDataAvailable. + winhttp: Implement WinHttpReadData. + winhttp: Implement WinHttpWriteData. + winhttp: Remove some unneeded includes. + winhttp: Implement WinHttpQueryAuthSchemes. + winhttp: Implement WinHttpSetCredentials. + winhttp: Add support for secure connections. + winhttp: Test secure connections. Fix a crash when no response is returned. + winhttp: Use default values when empty strings are passed for verb, object and version parameters. + winhttp: Avoid testing errno when it isn't set. + winhttp: Allow reusing a secure connection. + winhttp: WinHttpCrackUrl and InternetCrackUrlW use different scheme constants. + winhttp: Move handling of default request parameters into build_request_string(). + winhttp: Handle redirects. + winhttp: Add an initial implementation of WinHttpQueryOption and WinHttpSetOption. + winhttp: Add status notification tests. Make them pass. + winhttp: Add zero value content length header to POST requests without additional data. + winhttp: A non-standard port must be included in the host header. + winhttp: Implement some more options. + winhttp: Implement WinHttpQueryOption(WINHTTP_OPTION_SECURITY_FLAGS). + winhttp: Implement WinHttpQueryHeaders(WINHTTP_QUERY_RAW_HEADERS). + winhttp: The last parameter of WinHttpQueryDataAvailable and WinHttpReadData is optional. + +Henri Verbeet (12): + wined3d: glDeleteFramebuffersEXT() needs a context. + wined3d: Move a TRACE up a few lines. + d3dx9: Improve a few TRACEs. + wined3d: Remove useless hash_table_t typedef. + msvcrt: Don't depend on the system's implementation of acos() & asin(). + wined3d: Be more careful when deleting FBOs. + wined3d: Depth stencil tracking depends on the value of This->render_offscreen. + wined3d: Use the correct representative for texture transform states. + wined3d: Fix a variable name inside a VTRACE. + wined3d: Correct a TRACE and remove an incorrect comment. + wined3d: IWineD3DSurface_PreLoad() doesn't do an implicit glBindTexture() anymore. + wined3d: Set the viewport to the texture size in depth_blt(). + +Hongbo Ni (60): + notepad: Convert simplified Chinese resource to utf8. + winhlp32: Convert simplified Chinese resource to utf8. + winefile: Convert simplified Chinese resource to utf8. + comctl32: Convert simplified Chinese resource to utf8. + shell32: Convert simplified Chinese resource to utf8. + wineconsole: Convert simplified Chinese resource to utf8. + progman: Convert simplified Chinese resource to utf8. + comdlg32: Convert traditional Chinese resource to utf8. + comdlg32: Convert simplified Chinese resource to utf8. + clock: Convert simplified Chinese resource to utf8. + user32: Convert Chinese resource to utf8. + winecfg: Convert traditional Chinese resource to utf8. + shell32: Convert traditional Chinese resource to utf8. + clock: Add traditional Chinese resource. + progman: Add traditional Chinese resource. + winhlp32: Add traditional Chinese resource. + winefile: Add traditional Chinese resource. + wineconsole: Add traditional Chinese resource. + winecfg: Update traditional Chinese resource. + winecfg: Add simplified Chinese resource. + notepad: Add traditional Chinese resource. + user32: Update traditional Chinese resource. + shell32: Update traditional Chinese resource. + shell32: Update simplified Chinese resource. + comdlg32: Update traditional Chinese resource. + comdlg32: Update simplified Chinese resource. + comctl32: Add traditional Chinese resources. + comdlg32: Update simplified Chinese resource. + notepad: Update Chinese resources - dialog font. + wordpad: Add simplified and traditional Chinese resources. + winemine: Add simplified and traditional Chinese resources. + wineboot: Add simplified and traditional Chinese resources. + view: Add simplified and traditional Chinese resources. + uninstaller: Add simplified and traditional Chinese resources. + taskmgr: Add simplified and traditional Chinese resources. + appwiz: Add simplified and traditional Chinese resources. + avifil32: Add simplified and traditional Chinese resources. + browseui: Add simplified and traditional Chinese resou. + credui: Add simplified and traditional Chinese resources. + gphoto2: Add simplified and traditional Chinese resources. + htctrl: Add simplified and traditional Chinese resources. + localspl: Add simplified and traditional Chinese resources. + localui: Add simplified and traditional Chinese resources. + mpr: Add simplified and traditional Chinese resources. + msacm32: Add simplified and traditional Chinese resources. + mshtml: Add simplified and traditional Chinese resources. + msi: Add simplified and traditional Chinese resources. + msvfw32: Add simplified and traditional Chinese resources. + oleaut32: Add simplified and traditional Chinese resources. + oledlg: Add simplified and traditional Chinese resources. + sane.ds: Add simplified and traditional Chinese resources. + serialui: Add simplified and traditional Chinese resources. + setupapi: Add simplified and traditional Chinese resources. + shdoclc: Add simplified and traditional Chinese resources. + shlwapi: Add simplified and traditional Chinese resources. + wineps: Add simplified and traditional Chinese resources. + wininet: Add simplified and traditional Chinese resources. + winspool: Add simplified and traditional Chinese resources. + oleview: Add simplified and traditional Chinese resources. + regedit: Add simplified and traditional Chinese resources. + +Huw Davies (5): + cryptdlg: Add stubs for CertViewProperties. + crypt32: Add support for CERT_NAME_STR_REVERSE_FLAG. + crypt32/tests: Add a test for streamed, detached updates. + crypt32: Fix streamed, detached updates. + include: Add a few more things to mimeole.idl. + +Jacek Caban (19): + mshtml: Added IHTMLDocument::get_Script implementation. + mshtml: Added IHTMLElement::get_parentElement implementation. + jscript: Added JSGlobal typelib. + shdocvw: Pass the right IDispatch to NavigateComplete2 and DocumentComplete. + jscript: Added IActiveScriptParse::InitNew implementation. + jscript: Added IActiveScript::SetScriptSite. + jscript: Added IActiveScript::Close implementation. + jscript: Added script site tests. + jscript: Added IActiveScript::GetScriptDispatch implementation. + jscript: Added IDispatchEx::GetIDsOfNames implementation. + jscript: Added IDispatchEx::Invoke implementation. + jscript: Added IActiveScript::GetScriptState implementation. + jscript: Added parser. + jscript: Added lexer. + jscript: Added parser memory managment. + jscript: Added IActiveScript::ParseScriptText implementation. + jscript: Added SCRIPTSTATE_STARTED implementation. + jscript: Added ParseScriptText test. + jscript: Added empty statement implementation. + +James Hawkins (64): + msi: Handle features installed as source in MsiQueryFeatureState. + msi: Fix the logic to determine the appropriate action of the feature. + msi: Only set the action to source if the component has a local feature. + msi: Don't install a feature that is disabled. + msi: Skip the feature action detection logic if there is no product code. + msi: Skip the component action detection logic if there is no product code. + msi: Store the _Columns and _Tables tables in the database structure. + advapi32: Fix a few failing tests in Vista. + advapi32: Fix another set of failures on some Vista systems. + comctl32: Fix a few failing tests in win2000. + comctl32: Fix a failing test in XP. + advapi32: Print the actual result of several failing tests. + advapi32: Fix several failing tests in Vista. + crypt32: Fix a failing test in XP. + crypt32: Fix a failing test in Vista. + gdi32: Fix a failing test in win98. + kernel32: Fix a failing test in win95. + kernel32: Trace the modified buffer on error. + kernel32: Fix two failing tests in win95. + kernel32: Trace the last error on failure. + lz32: Fix several failing tests in win95. + crypt32: Fix a failing test in Vista. + rpcrt4: Fix several test failures in Vista. + comctl32: Fix several test failures in win98. + comctl32: Fix a test failure in win98. + comctl32: Trace the message sequences. + comctl32: Fix a failing test in win2000. + crypt32: Split the test for ret and last error up. + msi: Handle converting a value of REG_DWORD in MsiSourceListEnumMediaDisks. + msi: Add tests for opening an empty package. + kernel32: Add tests for LoadLibraryEx. + advapi32: Fix a few test failures in Vista. + advapi32: Fix the process access rights value for Vista. + crypt32: Fix a test that fails in Vista. + crypt32: Remove a test with a binary result that behaves differently across platforms. + crypt32: Fix a failing test in Vista. + kernel32: Fix a failing test in Vista. + kernel32: Fix two tests that fail in win2k3 and modify LoadLibraryEx to match this behavior. + kernel32: Fix a test that fails in win2k3. + mlang: Remove a test that fails on all systems. + mshtml: Fix a test that fails in Vista. + msi: Fix a failing test in Vista. + msvcrt: Trace the results of two failing tests. + ntdll: Fix a few failing tests in Vista. + ole32: Fix a failing test in Vista. + riched20: Trace the result of a failing test. + rpcrt4: Remove a test that was replaced by a better test. + shlwapi: Fix a few failing tests in Vista. + rpcrt4: Fix a failing test in Vista. + schannel: Fix a failing test in Vista. + comctl32: Fix a failing test in win98. + comctl32: Fix a failing test in win9x. + crypt32: Fix several failing tests in win9x. + crypt32: Fix several test failures in win9x. + crypt32: Fix several failing tests in win9x. + crypt32: Fix a few test failures in win9x. + gdi32: Fix a failing test in win9x. + iphlapi: Fix a failing test in win95. + kernel32: Fix a failing test in win95. + netapi32: Fix two failing tests in NT4. + ntdll: Fix a failing test in NT4. + rasapi32: Fix several failing tests in win98. + ole32: Fix two failing tests in win9x. + msi: Source for new patch files can only be compressed. + +Jan de Mooij (2): + comdlg32/printdlg: If ToPages field is left empty set it to FromPages value. + comdlg32/printdlg: Leave FromPages/ToPages empty if it contains max. WORD value. + +Jeff Latimer (6): + user32/tests: Deregister the class created by create_dde_window. + user32: Make some DDE traces more meaningful. + user32/tests: Test infrastructure for testing ddeml end to end. + user32: DdeConnect causes 2 XTYP_CONNECT_CONFIRM messages to flow. Delete one. + user32/tests: Tests for a W interface connection adding some todo_wine tests. + user32/tests: Add more A and W test combinations for dde. + +Jeff Zaroyko (5): + msvcrt: Add a test for unlinking non-empty directories. + kernel32: Add some tests for DeleteFile. + ntdll: Add some tests for NtDeleteFile. + winetest: Check that user enters a tag. + dsound: Check for invalid parameter when unlocking secondary buffers. + +Jim Cameron (9): + user32: Fixed bug in loading .cur files. + user32/tests: Add a regression test for CreateIconFromResource. + dinput: Add IID_IUnknown to DICF_CreateInstance(), DirectInputCreateEx(). + ntoskrnl.exe: Add stub for IoGetDeviceObjectPointer(). + ntoskrnl.exe: Add stub for IoGetRelatedDeviceObject(). + ntoskrnl.exe: Add stub for IoRegisterDriverReinitialization(). + ntoskrnl.exe: Add stub for IoRegisterShutdownNotification(). + ntoskrnl.exe: Add stub for ObReferenceObjectByHandle(). + ntoskrnl.exe: Add stub for ObfDereferenceObject(). + +Juan Lang (36): + crypt32: Add tests for verifying the hash of a detached hash message. + crypt32: Separate decoding data from finalizing (hashing or signing) it. + crypt32: Fix verifying the hash of a detached hash message. + crypt32: Add stub for CryptVerifyDetachedMessageHash. + crypt32: Add tests for CryptVerifyDetachedHashMessage. + crypt32: Implement CryptVerifyDetachedMessageHash. + cryptuiapi.h: Add missing definitions. + crypt32: Test encoding/decoding the authority info access extension. + crypt32: Implement authority info access encoding. + crypt32: Implement authority info access decoding. + crypt32: Don't ignore errors when encoding items in an array. + crypt32: Add tests for encoding/decoding CTLs. + crypt32: Implement encoding CTLs. + crypt32: Implement CTL decoding. + wincrypt.h: Fix typos. + wincrypt.h: Add missing definitions. + crypt32: Fix typo. + crypt32: Fix typo. + crypt32: Add tests showing signed CTLs aren't decoded by CryptDecodeObject. + cryptuiapi: Add a stub for CryptUIDlgCertMgr. + crypt32: Add tests for CertCreateCTLContext. + crypt32: Implement CertCreateCTLContext and CertFreeCTLContext. + crypt32: Add tests for CertGetCTLContextProperty. + crypt32: Add support for CTL properties. + crypt32: Implement CertDuplicateCTLContext. + crypt32: Implement CertAddEncodedCTLToStore. + crypt32: Add CTLs to the memory store. + crypt32: Add CTLs to the collection store. + crypt32: Add CTLs to the provider store. + crypt32: Add CTLs to the file store. + crypt32: Add CTLs to the registry store. + crypt32: Implement CertEnumCTLsInStore. + crypt32: Implement CertDeleteCTLFromStore. + crypt32: Implement CertFindCTLInStore. + crypt32: Add tests for CertAddEncodedCTLToStore. + crypt32: Implement CertAddCTLContextToStore. + +Katayama Hirofumi MZ (1): + wordpad: Added Japanese resource. + +Lei Zhang (3): + regedit: Fix typo in commit c6d01ac847edc2ad02ef02c7a0ead7a833539c3c. + wininet: Work around NULL headers when handling HTTP_QUERY_RAW_HEADERS_CRLF. + wininet: Remove redundant CrLf variables. + +Louis Lenders (4): + shlwapi: Add test showing UrlUnEscape should convert the url in place when URL_UNESCAPE_INPLACE is set. + shlwapi: Fix UrlUnEscape to expand URLs in-place even if the output buffer is NULL. + shobjidl.idl: Add Taskbarlist interface definitions. + wine.inf: Add default Directx registry key for InstalledVersion. + +Luis C. Busquets Pérez (2): + d3dx8: D3DXQuaternionRotationMatrix correct compare value for the trace. + d3dx9: Add types to d3dx9shader.h. + +Maarten Lankhorst (1): + winealsa.drv/dsound: Handle underruns better. + +Marcus Meissner (2): + msxml3: Fixed incorrect MultiByteToWideChar. + Annotate with allocation size attribute. + +Markus Hitter (1): + user32: Better reflect the current state of DrawIconEx. + +Martin Profittlich (1): + user32: Make RegisterDeviceNotificationW behave likeRegisterDeviceNotificationA. + +Michael Stefaniuc (2): + winhttp: Move the wine includes after the system includes. + jscript: Move 'inline' right after the storage specifier in a declaration. + +Muneyuki Noguchi (13): + comdlg32: Update Japanese translation. + shell32: Update Japanese translation. + user32: Update Japanese translation. + clock: Add Japanese resources. + winhlp32: Add Japanese resources. + winecfg: Update Japanese translation. + winefile: Add a Japanese resource file. + comdlg32: Update Japanese translation. + winemine: Add Japanese translation. + clock: Update Japanese translation. + winecfg: Update Japanese translation. + taskmgr: Update Japanese translation. + regedit: Update Japanese translation. + +Nicolas Le Cam (1): + comctl32: Implement LVM_GETUNICODEFORMAT. + +Nikolay Sivov (38): + gdiplus: Free memory after some Graphics tests. + gdiplus: Use GdipFree instead of HeapFree in GdipDeleteGraphics. + gdiplus: Free memory after some GraphicsPath tests. + gdiplus: Added a test for GdipGetDC/GdipReleaseDC behaviour + fixes to be able to run it. + gdiplus: Basic GdipGetDC/GdipReleaseDC implementation. + gdiplus: Made Graphics calls check for busy state. + gdiplus: GdipDeleteGraphics affected by busy state too. Test added. + gdiplus: Basic parameter check in GdipTransformPoints with tests. + gdiplus: Test for default Graphics clipping region. + gdiplus: Implemented GdipIsInfiniteRegion with tests. + gdiplus: GdipPathIterNextPathType stub added with test. + gdiplus: Add gdiplus debug channel to matrix.c. + gdiplus: Fix for GpRegion clone helper. + gdiplus: Implemented GdipGetClip. + gdiplus: Added TRACE/FIXME to all PathIterator calls. + gdiplus: Move some TRACE() higher in region.c. + gdiplus: Implemented GdipIsEmptyRegion with tests. + gdiplus: Implemented GdipSetClipRegion with basic tests. + gdiplus: Added test shows that CombineModeReplace actually replaces data. + gdiplus: Fix for CombineModeReplace with some tests. + gdiplus: Implemented GdipResetClip with tests. + gdiplus: Implemented GdipIsEmptyClip with tests. + gdiplus: Add TRACE(..) to graphicspath.c. + gdiplus: Stub for GdipFlattenPath with tests. + gdiplus: Add some TRACE(..) to Graphics. + gdiplus: Fix API documentation name. + gdiplus: Add TRACE(..) to CustomLineCap. + gdiplus: Add TRACE(..) for brush calls. + gdiplus: GdipGetLineGammaCorrection should check result pointer. Test added. + gdiplus: Add TRACE(..) for font calls. + gdiplus: Add few TRACE(..) for ImageAttributes. + gdiplus: Add few TRACE(..) for Matrix. + gdiplus: Initial GdipFlattenPath implementation. + gdiplus: Fix curve closing in GdipDrawClosedCurve2. + gdiplus: Stubs for AdjustableArrowCap calls. + gdiplus: Implemented GdipGraphicsClear. + gdiplus: Implemented GdipCloneImage. + gdiplus: Fix for GdipGraphicsClear. + +Paul Vriens (39): + advapi32/tests: Remove duplicate test. + advapi32/tests: Fix a crash. + advapi32/tests: SC_MANAGER_ENUMERATE_SERVICE is enough. + advapi32/tests: Don't test unimplemented functions. + kernel32/tests: Fix two failures on win9x. + kernel32/tests: Use a file that is available on all platforms. + kernel32/tests: Use skip instead of trace. + d3dxof/tests: Run tests again on win9x. + shell32/tests: Run tests again on win95. + crypt32/tests: Use CryptAcquireContextA instead of CryptAcquireContextW. + shlwapi/tests: Fix a test on Vista. + comctl32/tests: Don't assert on not implemented function. + mstask/tests: Skip tests for security services if they are not implemented. + advapi32/tests: Remove tests for calculation with drivers. + netapi32/tests: Fix the error text. + msi/tests: Remove service tests. + oleaut32/tests: Skip some tests on win9x. + rpcrt4/tests: Skip ok check for win9x. + quartz/tests: Use CreateFileA instead of CreateFileW to please win9x. + msi/tests: Add a missing CoUninitialize. + include: Add a system restore header. + msi/tests: Create a system restore point when needed. + shell32/tests: Don't test unimplemented functions. + shlwapi/tests: Don't test unimplemented functions. + msxml3/tests: Add a missing CoUninitialize. + msxml3/tests: Add a missing CoUninitialize. + dplayx/tests: Remove a stray CoInitialize. + ddraw/tests: Let tests run again on win9x. + dplayx/tests: Add a few missing HeapFree's. + msxml3/tests: Use CreateFileA to please win98. + msxml3/tests: Fix a test on win98. + ws2_32/tests: Use CreateEventA for win9x. + kernel32/tests: Split the test for ret and last error. + crypt32/tests: Don't crash on Vista. + urlmon/tests: Fix test on win98. + dsound/tests: Fix typos in tests. + quartz/tests: Add a missing CoUninitialize. + wintrust/tests: Add a missing FreeLibrary. + winspool.drv/tests: Fix a test on Vista/W2K8. + +Piotr Caban (1): + msxml3: Added custom queryresult DISPIDs implementation. + +Rico Schüller (1): + wined3d/d3d9: Set the initial scissorrect to the dimesions of the backbuffer from the first swapchain of the device. + +Rob Shearman (4): + widl: Raise RPC_X_SS_IN_NULL_CONTEXT exception for NULL in-only context handles instead of RPC_X_NULL_REF_PTR. + rpcrt4: Add tests for RpcBindingReset. + winealsa.drv: Use CP_UNIXCP instead of CP_ACP for strings obtained from native OS functions. + msxml3: Use CP_UNIXCP instead of CP_ACP in libxmlFatalError as the input string is one generated by a native OS function. + +Roy Shea (3): + mstask: Implemented PersistFile_Save stub. + mstask: Implemented CreateTrigger. + mstask: Implemented (Set|Get)Trigger. + +Shunichi Fuji (1): + gdi32: Adjust FT_MulFix function to Freetype cvs head. + +Stefan Dösinger (50): + wined3d: Override the default filter of conditional np2 textures. + wined3d: Make sure the pixel shader is compiled. + wined3d: Remove a few texture initializations. + wined3d: Get a GL context before creating a PBO. + wined3d: Add fixed function sRGB write correction. + wined3d: Disable D3DFMT_A4L4. + wined3d: Disable D3DFMT_A2W10V10U10. + wined3d: Fix the drawStridedSlow callback function calling convention. + wined3d: Don't retry less strict formats if a match was found. + ddraw: Don't destroy the application's window. + wined3d: Fix the texcoord size mask. + wined3d: Implement D3DTOP_BUMPENVMAPLUMINANCE. + wined3d: Implement D3DTA_ALPHAREPLICATE in arbfp and atifs. + wined3d: Fix projected bump mapping. + wined3d: Use the correct texture limit. + wined3d: Declare the texture factor when D3DTOP_BLENDFACTORALPHA is used. + wined3d: The final luminance factor is clamped. + wined3d: Make the alphaop == colorop matching a bit smarter. + winex11: Add a run-total fps counter to the fps debug channel. + wined3d: Disable D3DFMT_R3G3B2. + wined3d: Advertise a few line caps. + wined3d: D3DTOP_DOTPRODUCT3 colorop overrides the alphaop. + wined3d: Clean up the texbeml parameter forward. + wined3d: Handle texture transforms in the TEXTURETRANSFORMFLAGS state. + wined3d: Update the arbfp shader on a texturetransformflags change. + wined3d: Remove some junk. + wined3d: Remove dead code. + wined3d: Remove unneeded code. + wined3d: Make the texture stage mapping nvrc independent. + wined3d: Replace an #if 0 with if(0). + wined3d: Remove BaseTexture::UnBindTexture. + wined3d: Remove some more junk code. + wined3d: Replace a #if 0 with if(0). + wined3d: Handle projected+bump mapped textures in atifs. + wined3d: Silence some format spam. + wined3d: Handle projected textures properly in arbfp and atifs. + wined3d: Implement YV12 support for emulated overlays. + wined3d: BLENDTEXTUREALPHAPM reads the texture. + wined3d: Report incorrect filtering settings in ValidateDevice. + wined3d: Implement secondary color in the arbfp ffp pipeline. + ddraw: Beware of the surface type when checking for format support. + ddraw: Catch attempts to opengl-render to the desktop window. + ddraw: Pass proper parameters to CheckDeviceFormat. + wined3d: Optimize the projected bump map handling. + ddraw: Add some overlay tests. + wined3d: Compressed surface sizes are multiples of 4. + wined3d: Pack the ffp_desc structure better. + wined3d: Fix the pixelformat selection logic. + wined3d: Close a pshader on-off switching loophole. + wined3d: Fix uploading higher transform matrices. + +Stefan Leichter (1): + rasapi32: Fix tests on platforms winme and some win98. + +Vijay Kiran Kamuju (2): + advapi32: Add stub for ConvertToAutoInheritPrivateObjectSecurity. + d3drm: Include d3drmobj.h in d3drm.h. + +Vincent Povirk (6): + user32/tests: Don't check menu items when testing MNS_CHECKORBMP. + shell32: Move SHAppBarMessage implementation from shell32 to explorer. + shell32: Add tests for SHAppBarMessage. + explorer: Implement ABM_ADD and ABM_REMOVE. + explorer: Track appbar positions and send ABN_POSCHANGED notifications. + explorer: Modify rects passed to SHAppBarMessage to not interfere with existing appbars. + +Vladimir Pankratov (2): + shell32: Update Russian translation. + appwiz.cpl: Add Russian translation. + +-- +Alexandre Julliard +julliard@winehq.org diff --git a/VERSION b/VERSION index ede4ec6e847..cd289fc7fdb 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -Wine version 1.1.3 +Wine version 1.1.4 diff --git a/configure b/configure index c8a4bb64711..d8c126343b6 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.61 for Wine 1.1.3. +# Generated by GNU Autoconf 2.61 for Wine 1.1.4. # # Report bugs to . # @@ -574,8 +574,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='Wine' PACKAGE_TARNAME='wine' -PACKAGE_VERSION='1.1.3' -PACKAGE_STRING='Wine 1.1.3' +PACKAGE_VERSION='1.1.4' +PACKAGE_STRING='Wine 1.1.4' PACKAGE_BUGREPORT='wine-devel@winehq.org' ac_unique_file="server/atom.c" @@ -1305,7 +1305,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 1.1.3 to adapt to many kinds of systems. +\`configure' configures Wine 1.1.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1374,7 +1374,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of Wine 1.1.3:";; + short | recursive ) echo "Configuration of Wine 1.1.4:";; esac cat <<\_ACEOF @@ -1504,7 +1504,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -Wine configure 1.1.3 +Wine configure 1.1.4 generated by GNU Autoconf 2.61 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1518,7 +1518,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 1.1.3, which was +It was created by Wine $as_me 1.1.4, which was generated by GNU Autoconf 2.61. Invocation command line was $ $0 $@ @@ -8597,6 +8597,13 @@ fi IMPLIBEXT="a" WIN16_FILES="" WIN16_INSTALL="" + enable_iphlpapi=${enable_iphlpapi:-no} + enable_kernel32=${enable_kernel32:-no} + enable_msvcrt=${enable_msvcrt:-no} + enable_ntdll=${enable_ntdll:-no} + enable_ws2_32=${enable_ws2_32:-no} + enable_loader=${enable_loader:-no} + enable_server=${enable_server:-no} ;; darwin*|macosx*) DLLEXT=".so" @@ -26081,7 +26088,7 @@ exec 6>&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 1.1.3, which was +This file was extended by Wine $as_me 1.1.4, which was generated by GNU Autoconf 2.61. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -26134,7 +26141,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -Wine config.status 1.1.3 +Wine config.status 1.1.4 configured by $0, generated by GNU Autoconf 2.61, with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 0a4679a1365..920308143d8 100644 --- a/configure.ac +++ b/configure.ac @@ -484,6 +484,14 @@ case $host_os in dnl We can't build 16-bit NE dlls WIN16_FILES="" WIN16_INSTALL="" + dnl Disable modules that can't be used on Windows + enable_iphlpapi=${enable_iphlpapi:-no} + enable_kernel32=${enable_kernel32:-no} + enable_msvcrt=${enable_msvcrt:-no} + enable_ntdll=${enable_ntdll:-no} + enable_ws2_32=${enable_ws2_32:-no} + enable_loader=${enable_loader:-no} + enable_server=${enable_server:-no} ;; darwin*|macosx*) DLLEXT=".so" diff --git a/dlls/advapi32/tests/crypt_lmhash.c b/dlls/advapi32/tests/crypt_lmhash.c index 9f2b24e694f..63ab2c0da4d 100644 --- a/dlls/advapi32/tests/crypt_lmhash.c +++ b/dlls/advapi32/tests/crypt_lmhash.c @@ -348,20 +348,24 @@ static void test_SystemFunction005(void) out.Length = 0; out.MaximumLength = 0; r = pSystemFunction005(&out, &key, &res); - ok(r == STATUS_SUCCESS, "Expected STATUS_SUCCESS, got %08x\n", r); + ok(r == STATUS_SUCCESS || + r == STATUS_INVALID_PARAMETER_1, /* Vista */ + "Expected STATUS_SUCCESS or STATUS_INVALID_PARAMETER_1, got %08x\n", r); ok(res.Length == in.Length, "Length wrong\n"); ok(!memcmp(res.Buffer, in.Buffer, in.Length), "data wrong\n"); res.MaximumLength = 0; r = pSystemFunction005(&out, &key, &res); - ok(r == STATUS_BUFFER_TOO_SMALL, - "Expected STATUS_BUFFER_TOO_SMALL, got %08x\n", r); + ok(r == STATUS_BUFFER_TOO_SMALL || + r == STATUS_INVALID_PARAMETER_1, /* Vista */ + "Expected STATUS_BUFFER_TOO_SMALL or STATUS_INVALID_PARAMETER_1, got %08x\n", r); key.Length = 1; r = pSystemFunction005(&out, &key, &res); - ok(r == STATUS_UNKNOWN_REVISION, - "Expected STATUS_UNKNOWN_REVISION, got %08x\n", r); + ok(r == STATUS_UNKNOWN_REVISION || + r == STATUS_INVALID_PARAMETER_1, /* Vista */ + "Expected STATUS_UNKNOWN_REVISION or STATUS_INVALID_PARAMETER_1, got %08x\n", r); key.Length = 0; r = pSystemFunction005(&out, &key, &res); diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 978cc469071..99dbce88d92 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1900,7 +1900,7 @@ static void test_process_security_child(void) &handle, PROCESS_ALL_ACCESS, TRUE, 0 ), "duplicating handle err:%d\n", GetLastError()); TEST_GRANTED_ACCESS2( handle, PROCESS_ALL_ACCESS, - STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL ); + PROCESS_ALL_ACCESS | PROCESS_QUERY_LIMITED_INFORMATION ); ok(DuplicateHandle( GetCurrentProcess(), handle, GetCurrentProcess(), &handle1, PROCESS_VM_READ, TRUE, 0 ), "duplicating handle err:%d\n", GetLastError()); diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c index 268827e043c..da62b0b5e8b 100644 --- a/dlls/advapi32/tests/service.c +++ b/dlls/advapi32/tests/service.c @@ -1110,7 +1110,7 @@ static void test_enum_svc(void) /* Store the number of returned services */ tempreturned = returned; - /* Allocate less then the needed bytes and don't specify a resume handle */ + /* Allocate less than the needed bytes and don't specify a resume handle */ services = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); bufsize = tempneeded - 1; needed = 0xdeadbeef; @@ -1128,7 +1128,7 @@ static void test_enum_svc(void) } HeapFree(GetProcessHeap(), 0, services); - /* Allocate less then the needed bytes, this time with a correct resume handle */ + /* Allocate less than the needed bytes, this time with a correct resume handle */ services = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); bufsize = tempneeded - 1; needed = 0xdeadbeef; @@ -1173,8 +1173,8 @@ static void test_enum_svc(void) /* Vista only shows the drivers with a state of SERVICE_RUNNING as active * and doesn't count the others as inactive. This means that Vista could - * show a total that is greater then the sum of active and inactive drivers. - * + * show a total that is greater than the sum of active and inactive + * drivers. * The number of active and inactive drivers is greatly influenced by the * time when tests are run, immediately after boot or later for example. * @@ -1460,7 +1460,7 @@ static void test_enum_svc(void) /* Store the number of returned services */ tempreturned = returned; - /* Allocate less then the needed bytes and don't specify a resume handle */ + /* Allocate less than the needed bytes and don't specify a resume handle */ exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); bufsize = tempneeded - 1; needed = 0xdeadbeef; @@ -1478,7 +1478,7 @@ static void test_enum_svc(void) } HeapFree(GetProcessHeap(), 0, exservices); - /* Allocate less then the needed bytes, this time with a correct resume handle */ + /* Allocate less than the needed bytes, this time with a correct resume handle */ exservices = HeapAlloc(GetProcessHeap(), 0, tempneeded - 1); bufsize = tempneeded - 1; needed = 0xdeadbeef; diff --git a/dlls/appwiz.cpl/No.rc b/dlls/appwiz.cpl/No.rc index 43f503c82f1..5658773d79b 100644 --- a/dlls/appwiz.cpl/No.rc +++ b/dlls/appwiz.cpl/No.rc @@ -43,13 +43,13 @@ CAPTION "Installer/Avinstaller" FONT 8, "MS Sans Serif" { CONTROL "Trykk «Installer» for å installere et program fra en diskett, CD-stasjon eller annet medium.", 1000, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 7, 270, 20 - CONTROL "&Installer ...", IDC_INSTALL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 26, 64, 14 + CONTROL "&Installer...", IDC_INSTALL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 26, 64, 14 CONTROL "", -1, "STATIC", SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE, 7, 46, 303, 1 CONTROL 2, 1001, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 7, 21, 20 CONTROL "Følgende programmer kan fjernes automatisk. Merk et program og trykk «Legg til/Fjern» for å fjerne det eller endre installerte komponenter", 1002, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 57, 270, 30 CONTROL "", IDL_PROGRAMS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SORTASCENDING | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 90, 303, 100 - CONTROL "Legg til/Fje&rn ...", IDC_ADDREMOVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 198, 64, 14 - CONTROL "&Støtteinformasjon ...", IDC_SUPPORT_INFO, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 170, 198, 70, 14 + CONTROL "Legg til/Fje&rn...", IDC_ADDREMOVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 198, 64, 14 + CONTROL "&Støtteinformasjon...", IDC_SUPPORT_INFO, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 170, 198, 70, 14 CONTROL 3, 1003, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 57, 21, 20 } diff --git a/dlls/appwiz.cpl/Ru.rc b/dlls/appwiz.cpl/Ru.rc new file mode 100644 index 00000000000..cfb77c01db2 --- /dev/null +++ b/dlls/appwiz.cpl/Ru.rc @@ -0,0 +1,79 @@ +/* +* Add/Remove Programs Russian resources +* +* Copyright 2008 Vladimir Pankratov +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +* +*/ + +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +STRINGTABLE +{ + IDS_CPL_TITLE, "Óñòàíîâêà/Óäàëåíèå ïðîãðàìì" + IDS_CPL_DESC, "Ïîçâîëÿåò óñòàíàâëèâàòü íîâîå ÏÎ, èëè óäàëÿòü ñóùåñòâóþùåå ñ Âàøåãî êîìïüþòåðà." + IDS_TAB1_TITLE, "Ïðèëîæåíèÿ" + + IDS_UNINSTALL_FAILED, "Íåâîçìîæíî âûïîëíèòü, '%s'. Âû õîòèòå óäàëèòü ïðîãðàììó èç ñïèñêà?" + IDS_NOT_SPECIFIED, "Îòñóòñòâóåò" + + IDS_COLUMN_NAME, "Íàçâàíèå" + IDS_COLUMN_PUBLISHER, "Èçäàòåëü" + IDS_COLUMN_VERSION, "Âåðñèÿ" +} + +/* TODO: it's best to use the constant WC_LISTVIEW instead of SysListView32 directly, but the Wine resource compiler doesn't seem to like that... */ + +IDD_MAIN DIALOG 0, 0, 320, 235 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Óñòàíîâêà/Óäàëåíèå" +FONT 8, "MS Sans Serif" +{ +CONTROL "×òîáû óñòàíîâèòü ïðîãðàììó ñ CD-ROM, äèñêåòû èëè æ¸ñòêîãî äèñêà, íàæìèòå Óñòàíîâèòü.", 1000, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 7, 270, 20 + CONTROL "Óñ&òàíîâèòü...", IDC_INSTALL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 26, 64, 14 + CONTROL "", -1, "STATIC", SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE, 7, 46, 303, 1 + CONTROL 2, 1001, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 7, 21, 20 + CONTROL "&Ïåðå÷èñëåííûå ïðîãðàììû ìîæíî óäàëèòü èëè ïåðåóñòàíîâèòü àâòîìàòè÷åñêè. ×òîáû óäàëèòü ïðîãðàììó èëè èçìåíèòü ñîñòàâ óñòàíîâëåííûõ êîìïîíåíòîâ, âûáåðèòå íóæíûé ïóíêò ñïèñêà è íàæìèòå êíîïêó Óñòàíîâèòü/Óäàëèòü.", 1002, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 55, 270, 32 + CONTROL "", IDL_PROGRAMS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SORTASCENDING | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 90, 303, 100 + CONTROL "Óñòàíîâèòü/&Óäàëèòü...", IDC_ADDREMOVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 216, 198, 94, 14 + CONTROL "&Ñâåäåíèÿ î ïîääåðæêå...", IDC_SUPPORT_INFO, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 116, 198, 94, 14 + CONTROL 3, 1003, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 57, 21, 20 +} + +IDD_INFO DIALOG 0, 0, 256, 138 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Ñâåäåíèÿ î ïîääåðæêå" +FONT 8, "MS Sans Serif" +{ + CONTROL "OK", IDOK, "BUTTON", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 103, 116, 50, 14 + CONTROL "Ïåðå÷èñëåííàÿ èíôîðìàöèÿ ìîæåò áûòü èñïîëüçîâàíà äëÿ ïîëó÷åíèÿ òåõíè÷åñêîé ïîääåðæêè ïðèëîæåíèÿ %s:", IDC_INFO_LABEL, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 12, 9, 228, 23 + CONTROL "Èçäàòåëü:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 33, 60, 8 + CONTROL "Âåðñèÿ:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 43, 60, 8 + CONTROL "Êîíòàêòíîå ëèöî:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 53, 60, 8 + CONTROL "Ïîääåðæêà:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 63, 64, 8 + CONTROL "Òåëåôîí:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 73, 68, 8 + CONTROL "Ôàéë 'Readme':", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 83, 60, 8 + CONTROL "Îáíîâëåíèÿ:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 93, 60, 8 + CONTROL "Êîììåíòàðèé:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 103, 60, 8 + CONTROL "", IDC_INFO_PUBLISHER, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 33, 136, 8 + CONTROL "", IDC_INFO_VERSION, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 43, 136, 8 + CONTROL "", IDC_INFO_CONTACT, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 53, 136, 8 + CONTROL "", IDC_INFO_SUPPORT, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 63, 136, 8 + CONTROL "", IDC_INFO_PHONE, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 73, 136, 8 + CONTROL "", IDC_INFO_README, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 83, 136, 8 + CONTROL "", IDC_INFO_UPDATES, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 93, 136, 8 + CONTROL "", IDC_INFO_COMMENTS, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 103, 136, 8 +} diff --git a/dlls/appwiz.cpl/Zh.rc b/dlls/appwiz.cpl/Zh.rc new file mode 100644 index 00000000000..8f67b0ccfe5 --- /dev/null +++ b/dlls/appwiz.cpl/Zh.rc @@ -0,0 +1,143 @@ +/* +* Add/Remove Programs (Simplified and Traditional Chinese Resources) +* +* Copyright 2008 Hongbo Ni +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +* +*/ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE +{ + IDS_CPL_TITLE, "添加/删除程序" + IDS_CPL_DESC, "允许你安装新软件, 和从你的电脑里删除现有程序." + IDS_TAB1_TITLE, "运用程序" + + IDS_UNINSTALL_FAILED, "不能运行卸载程序 '%s'. 你想把这个卸载程序从注册表中删除吗?" + IDS_NOT_SPECIFIED, "没指定" + + IDS_COLUMN_NAME, "名称" + IDS_COLUMN_PUBLISHER, "生产商" + IDS_COLUMN_VERSION, "版本" +} + +/* TODO: it's best to use the constant WC_LISTVIEW instead of SysListView32 directly, but the Wine resource compiler doesn't seem to like that... */ + +IDD_MAIN DIALOG 0, 0, 320, 220 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "安装/卸载" +FONT 9, "MS Song" +{ + CONTROL "要从软盘,光盘或硬盘安装新程序,请按'安装'.", 1000, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 7, 270, 20 + CONTROL "安装(&I)...", IDC_INSTALL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 26, 64, 14 + CONTROL "", -1, "STATIC", SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE, 7, 46, 303, 1 + CONTROL 2, 1001, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 7, 21, 20 + CONTROL "下列软件可以自动卸载. 按'添加/删除'可卸载选定程序或者调整已安装部件.", 1002, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 57, 270, 30 + CONTROL "", IDL_PROGRAMS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SORTASCENDING | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 90, 303, 100 + CONTROL "添加/删除(&R)...", IDC_ADDREMOVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 198, 64, 14 + CONTROL "技术支持(&S)...", IDC_SUPPORT_INFO, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 176, 198, 64, 14 + CONTROL 3, 1003, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 57, 21, 20 +} + +IDD_INFO DIALOG 0, 0, 256, 138 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "技术支持信息" +FONT 9, "MS Song" +{ + CONTROL "确定", IDOK, "BUTTON", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 103, 116, 50, 14 + CONTROL "%s 技术支持信息:", IDC_INFO_LABEL, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 12, 9, 228, 19 + CONTROL "生产商:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 30, 60, 8 + CONTROL "版本:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 40, 60, 8 + CONTROL "联系人:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 50, 60, 8 + CONTROL "支持信息:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 60, 64, 8 + CONTROL "支持电话:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 70, 68, 8 + CONTROL "产品说明:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 80, 60, 8 + CONTROL "产品更新:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 90, 60, 8 + CONTROL "备注:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 100, 60, 8 + CONTROL "", IDC_INFO_PUBLISHER, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 30, 136, 8 + CONTROL "", IDC_INFO_VERSION, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 40, 136, 8 + CONTROL "", IDC_INFO_CONTACT, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 50, 136, 8 + CONTROL "", IDC_INFO_SUPPORT, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 60, 136, 8 + CONTROL "", IDC_INFO_PHONE, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 70, 136, 8 + CONTROL "", IDC_INFO_README, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 80, 136, 8 + CONTROL "", IDC_INFO_UPDATES, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 90, 136, 8 + CONTROL "", IDC_INFO_COMMENTS, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 100, 136, 8 +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE +{ + IDS_CPL_TITLE, "添加/刪除程式" + IDS_CPL_DESC, "允許你安裝新軟件, 和從你的電腦裡刪除現有程式." + IDS_TAB1_TITLE, "運用程式" + + IDS_UNINSTALL_FAILED, "不能執行卸載程式 '%s'. 你想把這個卸載程式從註冊表中刪除嗎?" + IDS_NOT_SPECIFIED, "沒指定" + + IDS_COLUMN_NAME, "名稱" + IDS_COLUMN_PUBLISHER, "生產商" + IDS_COLUMN_VERSION, "版本" +} + +/* TODO: it's best to use the constant WC_LISTVIEW instead of SysListView32 directly, but the Wine resource compiler doesn't seem to like that... */ + +IDD_MAIN DIALOG 0, 0, 320, 220 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "安裝/卸載" +FONT 8, "PMingLiu" +{ + CONTROL "要從軟碟,光碟或硬碟安裝新程式,請按'安裝'.", 1000, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 7, 270, 20 + CONTROL "安裝(&I)...", IDC_INSTALL, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 26, 64, 14 + CONTROL "", -1, "STATIC", SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE, 7, 46, 303, 1 + CONTROL 2, 1001, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 7, 21, 20 + CONTROL "下列軟件可以自動卸載. 按'添加/刪除'可卸載選定程式或者調整已安裝部件.", 1002, "STATIC", SS_LEFT | WS_CHILD | WS_VISIBLE | WS_GROUP, 40, 57, 270, 30 + CONTROL "", IDL_PROGRAMS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SORTASCENDING | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 7, 90, 303, 100 + CONTROL "添加/刪除(&R)...", IDC_ADDREMOVE, "BUTTON", BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 246, 198, 64, 14 + CONTROL "技術支援(&S)...", IDC_SUPPORT_INFO, "button", BS_PUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 176, 198, 64, 14 + CONTROL 3, 1003, "STATIC", SS_ICON | WS_CHILD | WS_VISIBLE, 7, 57, 21, 20 +} + +IDD_INFO DIALOG 0, 0, 256, 138 +STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "技術支援資訊" +FONT 8, "PMingLiu" +{ + CONTROL "確定", IDOK, "BUTTON", BS_DEFPUSHBUTTON | BS_CENTER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 103, 116, 50, 14 + CONTROL "%s 技術支援資訊:", IDC_INFO_LABEL, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 12, 9, 228, 19 + CONTROL "生產商:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 30, 60, 8 + CONTROL "版本:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 40, 60, 8 + CONTROL "聯繫人:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 50, 60, 8 + CONTROL "支援資訊:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 60, 64, 8 + CONTROL "支援電話:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 70, 68, 8 + CONTROL "產品說明:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 80, 60, 8 + CONTROL "產品更新:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 90, 60, 8 + CONTROL "備註:", -1, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 16, 100, 60, 8 + CONTROL "", IDC_INFO_PUBLISHER, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 30, 136, 8 + CONTROL "", IDC_INFO_VERSION, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 40, 136, 8 + CONTROL "", IDC_INFO_CONTACT, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 50, 136, 8 + CONTROL "", IDC_INFO_SUPPORT, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 60, 136, 8 + CONTROL "", IDC_INFO_PHONE, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 70, 136, 8 + CONTROL "", IDC_INFO_README, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 80, 136, 8 + CONTROL "", IDC_INFO_UPDATES, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 90, 136, 8 + CONTROL "", IDC_INFO_COMMENTS, "static", SS_LEFT | WS_CHILD | WS_VISIBLE, 104, 100, 136, 8 +} + +#pragma code_page(default) diff --git a/dlls/appwiz.cpl/appwiz.rc b/dlls/appwiz.cpl/appwiz.rc index c86f9a86a7d..e0e03b4721b 100644 --- a/dlls/appwiz.cpl/appwiz.rc +++ b/dlls/appwiz.cpl/appwiz.rc @@ -29,6 +29,8 @@ #include "Fr.rc" #include "Nl.rc" #include "No.rc" +#include "Ru.rc" +#include "Zh.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/dlls/avifil32/avifile_Zh.rc b/dlls/avifil32/avifile_Zh.rc new file mode 100644 index 00000000000..eacc35ebf76 --- /dev/null +++ b/dlls/avifil32/avifile_Zh.rc @@ -0,0 +1,90 @@ +/* + * avifile (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "压缩选项" +FONT 9, "MS Song" +BEGIN + LTEXT "选择来源(&C):",-1,2,5,154,10 + COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "选项(&O)...",IDC_OPTIONS,170,17,50,14 + AUTOCHECKBOX "交织: 每",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP + EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL + LTEXT "帧数",-1,129,43,36,9 + LTEXT "当前格式:",-1,3,56,73,9 + LTEXT "(?)",IDC_FORMATTEXT,75,56,90,26 + DEFPUSHBUTTON "确定",IDOK,170,42,50,14 + PUSHBUTTON "取消",IDCANCEL,170,61,50,14 +END + +STRINGTABLE DISCARDABLE +{ + IDS_WAVESTREAMFORMAT "波形: %s" + IDS_WAVEFILETYPE "波形" + IDS_ALLMULTIMEDIA "所有多媒体文件" + IDS_ALLFILES "所有文件 (*.*)@*.*" + IDS_VIDEO "视频" + IDS_AUDIO "音频" + IDS_AVISTREAMFORMAT "%s %s #%d" + IDS_AVIFILETYPE "Wine AVI-默认处理器" + IDS_UNCOMPRESSED "未压缩" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_SAVEOPTIONS DIALOG FIXED IMPURE 43, 37, 226, 82 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "壓縮選項" +FONT 8, "PMingLiu" +BEGIN + LTEXT "選擇來源(&C):",-1,2,5,154,10 + COMBOBOX IDC_STREAM,2,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL | + WS_TABSTOP + PUSHBUTTON "選項(&O)...",IDC_OPTIONS,170,17,50,14 + AUTOCHECKBOX "交織: 每",IDC_INTERLEAVE,3,42,85,11,WS_TABSTOP + EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL + LTEXT "幀數",-1,129,43,36,9 + LTEXT "當前格式:",-1,3,56,73,9 + LTEXT "(?)",IDC_FORMATTEXT,75,56,90,26 + DEFPUSHBUTTON "確定",IDOK,170,42,50,14 + PUSHBUTTON "取消",IDCANCEL,170,61,50,14 +END + +STRINGTABLE DISCARDABLE +{ + IDS_WAVESTREAMFORMAT "波形: %s" + IDS_WAVEFILETYPE "波形" + IDS_ALLMULTIMEDIA "所有多媒體檔案" + IDS_ALLFILES "所有檔案 (*.*)@*.*" + IDS_VIDEO "視頻" + IDS_AUDIO "音頻" + IDS_AVISTREAMFORMAT "%s %s #%d" + IDS_AVIFILETYPE "Wine AVI-默認處理器" + IDS_UNCOMPRESSED "未壓縮" +} + +#pragma code_page(default) diff --git a/dlls/avifil32/rsrc.rc b/dlls/avifil32/rsrc.rc index bd56594586d..1872deb27b9 100644 --- a/dlls/avifil32/rsrc.rc +++ b/dlls/avifil32/rsrc.rc @@ -56,3 +56,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "avifile_Si.rc" #include "avifile_Sv.rc" #include "avifile_Tr.rc" +#include "avifile_Zh.rc" diff --git a/dlls/browseui/rsrc.rc b/dlls/browseui/rsrc.rc index 4fae12abeb5..dd6dd0d8810 100644 --- a/dlls/browseui/rsrc.rc +++ b/dlls/browseui/rsrc.rc @@ -35,3 +35,4 @@ #include "rsrc_Ro.rc" #include "rsrc_Ru.rc" #include "rsrc_Si.rc" +#include "rsrc_Zh.rc" diff --git a/dlls/browseui/rsrc_Zh.rc b/dlls/browseui/rsrc_Zh.rc new file mode 100644 index 00000000000..386ee753a80 --- /dev/null +++ b/dlls/browseui/rsrc_Zh.rc @@ -0,0 +1,65 @@ +/* + * browseui (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE +{ + IDS_CANCELLING "正在取消..." +} + +IDD_PROGRESS_DLG DIALOG 0, 0, 260, 85 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 9, "MS Song" +{ + CONTROL "", IDC_ANIMATION, ANIMATE_CLASSA, 0, 12, 10, 236, 25 /* TODO: style */ + LTEXT "", IDC_TEXT_LINE, 7, 45, 250, 10, SS_LEFT|SS_NOPREFIX + LTEXT "", IDC_TEXT_LINE + 1, 7, 55, 250, 10, SS_LEFT|SS_NOPREFIX + CONTROL "", IDC_PROGRESS_BAR, PROGRESS_CLASSA, WS_BORDER, 7, 65, 190, 8 + PUSHBUTTON "取消(&C)", IDCANCEL, 205, 65, 40, 15, WS_GROUP | WS_TABSTOP | WS_VISIBLE + LTEXT "", IDC_TEXT_LINE + 2, 7, 75, 190, 10, SS_LEFT|SS_NOPREFIX +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE +{ + IDS_CANCELLING "正在取消..." +} + +IDD_PROGRESS_DLG DIALOG 0, 0, 260, 85 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "PMingLiu" +{ + CONTROL "", IDC_ANIMATION, ANIMATE_CLASSA, 0, 12, 10, 236, 25 /* TODO: style */ + LTEXT "", IDC_TEXT_LINE, 7, 45, 250, 10, SS_LEFT|SS_NOPREFIX + LTEXT "", IDC_TEXT_LINE + 1, 7, 55, 250, 10, SS_LEFT|SS_NOPREFIX + CONTROL "", IDC_PROGRESS_BAR, PROGRESS_CLASSA, WS_BORDER, 7, 65, 190, 8 + PUSHBUTTON "取消(&C)", IDCANCEL, 205, 65, 40, 15, WS_GROUP | WS_TABSTOP | WS_VISIBLE + LTEXT "", IDC_TEXT_LINE + 2, 7, 75, 190, 10, SS_LEFT|SS_NOPREFIX +} + +#pragma code_page(default) diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h index 2c8e53816d6..872638dc873 100644 --- a/dlls/comctl32/comctl32.h +++ b/dlls/comctl32/comctl32.h @@ -175,8 +175,8 @@ typedef struct /* undocumented functions */ -LPVOID WINAPI Alloc (DWORD); -LPVOID WINAPI ReAlloc (LPVOID, DWORD); +LPVOID WINAPI Alloc (DWORD) __WINE_ALLOC_SIZE(1); +LPVOID WINAPI ReAlloc (LPVOID, DWORD) __WINE_ALLOC_SIZE(2); BOOL WINAPI Free (LPVOID); DWORD WINAPI GetSize (LPVOID); diff --git a/dlls/comctl32/comctl_Zh.rc b/dlls/comctl32/comctl_Zh.rc index a7a58eee414..9e3158d981b 100644 --- a/dlls/comctl32/comctl_Zh.rc +++ b/dlls/comctl32/comctl_Zh.rc @@ -1,5 +1,8 @@ /* + * comctl32 (simplified and traditional Chinese resources) + * * Copyright 2002 Tisheng Chen + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -24,7 +27,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140 STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "属性 %s" -FONT 8, "MS Shell Dlg" +FONT 9, "MS Song" BEGIN DEFPUSHBUTTON "确定", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP PUSHBUTTON "取消", IDCANCEL,58,122,50,14 @@ -37,7 +40,7 @@ END IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE CAPTION "向导" -FONT 8, "MS Shell Dlg" +FONT 9, "MS Song" BEGIN PUSHBUTTON "< 上一步(&B)", IDC_BACK_BUTTON,71,138,50,14 DEFPUSHBUTTON "下一步(&N) >", IDC_NEXT_BUTTON,121,138,50,14 @@ -53,7 +56,7 @@ END IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "自定义工具栏" -FONT 8, "MS Shell Dlg" +FONT 9, "MS Song" BEGIN DEFPUSHBUTTON "关闭(&C)", IDCANCEL,308,6,44,14 PUSHBUTTON "重置(&e)", IDC_RESET_BTN,308,23,44,14 @@ -89,4 +92,74 @@ STRINGTABLE DISCARDABLE HKY_NONE "无" } +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "屬性 %s" +FONT 8, "PMingLiu" +BEGIN + DEFPUSHBUTTON "確定", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP + PUSHBUTTON "取消", IDCANCEL,58,122,50,14 + PUSHBUTTON "套用(&A)", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED + PUSHBUTTON "幫助", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP + CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114 +END + + +IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "向導" +FONT 8, "PMingLiu" +BEGIN + PUSHBUTTON "< 上一步(&B)", IDC_BACK_BUTTON,71,138,50,14 + DEFPUSHBUTTON "下一步(&N) >", IDC_NEXT_BUTTON,121,138,50,14 + DEFPUSHBUTTON "結束", IDC_FINISH_BUTTON,121,138,50,14 + PUSHBUTTON "取消", IDCANCEL,178,138,50,14 + PUSHBUTTON "幫助", IDHELP,235,138,50,14,WS_GROUP + LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN + CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5 + LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE +END + + +IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "自定義工具欄" +FONT 8, "PMingLiu" +BEGIN + DEFPUSHBUTTON "關閉(&C)", IDCANCEL,308,6,44,14 + PUSHBUTTON "重置(&e)", IDC_RESET_BTN,308,23,44,14 + PUSHBUTTON "幫助(&H)", IDC_HELP_BTN,308,40,44,14 + PUSHBUTTON "上移(&U)", IDC_MOVEUP_BTN,308,74,44,14 + PUSHBUTTON "下移(&D)", IDC_MOVEDN_BTN,308,91,44,14 + LTEXT "可用工具欄按鈕(&V):", -1,4,5,84,10 + LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + PUSHBUTTON "添加(&A) ->", IDOK, 131, 42, 44, 14 + PUSHBUTTON "<- 刪除(&R)", IDC_REMOVE_BTN,131,62,44,14 + LTEXT "當前工具欄按鈕(&T):", -1,182,5,78,10 + LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP +END + +STRINGTABLE DISCARDABLE +{ + IDS_CLOSE "關閉" +} + +STRINGTABLE DISCARDABLE +{ + IDM_TODAY "今天:" + IDM_GOTODAY "轉到今天" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SEPARATOR "分隔符" +} + +STRINGTABLE DISCARDABLE +{ + HKY_NONE "無" +} + #pragma code_page(default) diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index c620892aa1a..35fd1317d22 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -9709,9 +9709,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) case LVM_GETTOPINDEX: return LISTVIEW_GetTopIndex(infoPtr); - /*case LVM_GETUNICODEFORMAT: - FIXME("LVM_GETUNICODEFORMAT: unimplemented\n"); - return FALSE;*/ + case LVM_GETUNICODEFORMAT: + return (infoPtr->notifyFormat == NFR_UNICODE); /* case LVM_GETVIEW: */ diff --git a/dlls/comctl32/monthcal.c b/dlls/comctl32/monthcal.c index 9ca6fcc5e7f..0c0a45c0692 100644 --- a/dlls/comctl32/monthcal.c +++ b/dlls/comctl32/monthcal.c @@ -1303,6 +1303,11 @@ static void MONTHCAL_GoToNextMonth(MONTHCAL_INFO *infoPtr) nmds.cDayState = infoPtr->monthRange; nmds.prgDayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE)); + nmds.stStart = infoPtr->todaysDate; + nmds.stStart.wYear = infoPtr->currentYear; + nmds.stStart.wMonth = infoPtr->currentMonth; + nmds.stStart.wDay = 1; + SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds); for(i=0; imonthRange; i++) infoPtr->monthdayState[i] = nmds.prgDayState[i]; @@ -1333,6 +1338,11 @@ static void MONTHCAL_GoToPrevMonth(MONTHCAL_INFO *infoPtr) nmds.prgDayState = Alloc (infoPtr->monthRange * sizeof(MONTHDAYSTATE)); + nmds.stStart = infoPtr->todaysDate; + nmds.stStart.wYear = infoPtr->currentYear; + nmds.stStart.wMonth = infoPtr->currentMonth; + nmds.stStart.wDay = 1; + SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds); for(i=0; imonthRange; i++) infoPtr->monthdayState[i] = nmds.prgDayState[i]; diff --git a/dlls/comctl32/tests/comboex.c b/dlls/comctl32/tests/comboex.c index d0e0bb62547..7add84bfb43 100644 --- a/dlls/comctl32/tests/comboex.c +++ b/dlls/comctl32/tests/comboex.c @@ -271,7 +271,8 @@ static void test_WM_LBUTTONDOWN(void) result = SendMessage(hList, WM_LBUTTONUP, 0, MAKELPARAM(x, y)); ok(!result, "WM_LBUTTONUP was not processed. LastError=%d\n", GetLastError()); - todo_wine ok(GetFocus() == hEdit, + todo_wine ok(GetFocus() == hEdit || + broken(GetFocus() == hCombo), /* win98 */ "Focus not on ComboBoxEx's Edit Control, instead on %p\n", GetFocus()); diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c index 2e00e6752e5..805a48a3d2a 100644 --- a/dlls/comctl32/tests/listview.c +++ b/dlls/comctl32/tests/listview.c @@ -735,7 +735,9 @@ static void test_columns(void) /* Check its width */ rc = ListView_GetColumnWidth(hwnd, 0); - ok(rc==10, "Inserting column with no mask failed to set width to 10 with %d\n", rc); + ok(rc==10 || + broken(rc==0), /* win9x */ + "Inserting column with no mask failed to set width to 10 with %d\n", rc); DestroyWindow(hwnd); } diff --git a/dlls/comdlg32/cdlg.h b/dlls/comdlg32/cdlg.h index d0c0591e5c4..f6a9cbc232d 100644 --- a/dlls/comdlg32/cdlg.h +++ b/dlls/comdlg32/cdlg.h @@ -30,7 +30,7 @@ extern HINSTANCE COMDLG32_hInstance; void COMDLG32_SetCommDlgExtendedError(DWORD err); -LPVOID COMDLG32_AllocMem(int size); +LPVOID COMDLG32_AllocMem(int size) __WINE_ALLOC_SIZE(1); /* handle<-handle16 conversion */ #define HINSTANCE_32(h16) ((HINSTANCE)(ULONG_PTR)(h16)) diff --git a/dlls/comdlg32/cdlg_Ja.rc b/dlls/comdlg32/cdlg_Ja.rc index a5e8a0c461b..0b352366e61 100644 --- a/dlls/comdlg32/cdlg_Ja.rc +++ b/dlls/comdlg32/cdlg_Ja.rc @@ -141,7 +141,7 @@ FONT 9, "MS UI Gothic" CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP GROUPBOX "ƒTƒ“ƒvƒ‹",grp2,98,72,120,36,WS_GROUP CTEXT "AaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE - LTEXT "Scr&ipt (translate):",stc7 ,98,114,80,9 + LTEXT "•¶ŽšƒZƒbƒg(&I):",stc7 ,98,114,80,9 COMBOBOX cmb5,98,124,120,90,CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP } @@ -295,6 +295,36 @@ BEGIN CONTROL "‰¡(&A)", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 END +PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "ƒy�[ƒW�Ý’è" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", rct1, "Static", SS_WHITERECT, 80, 8, 80, 80 + CONTROL "", rct2, "Static", SS_GRAYRECT, 160, 12, 4, 80 + CONTROL "", rct3, "Static", SS_GRAYRECT, 84, 88, 80, 4 + GROUPBOX "—pŽ†", grp2, 8, 96, 224, 56, BS_GROUPBOX + LTEXT "ƒTƒCƒY(&S):", stc2, 16, 112, 36, 8 + COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + LTEXT "‹‹Ž†•û–@(&T):", stc3, 16, 132, 36, 8 + COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + GROUPBOX "ˆó�ü‚ÌŒü‚«", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "�c(&P)", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "‰¡(&L)", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "—]”’", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "�¶(&E):", stc15, 88, 172, 21, 8 + EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "‰E(&R):", stc16, 159, 172, 27, 8 + EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "�ã(&O):", stc17, 88, 192, 21, 8 + EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "‰º(&B):", stc18, 159, 192, 23, 8 + EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹", IDCANCEL, 126, 220, 50, 14 + PUSHBUTTON "ƒvƒŠƒ“ƒ^(&R)...", psh3, 184, 220, 48, 14 +END + NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN CAPTION "ƒtƒ@ƒCƒ‹‚ðŠJ‚­" @@ -338,9 +368,115 @@ STRINGTABLE DISCARDABLE IDS_FILENOTFOUND "ƒtƒ@ƒCƒ‹‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ�B" IDS_VERIFYFILE "ƒtƒ@ƒCƒ‹–¼‚ðŠm”F‚µ‚Ä‚­‚¾‚³‚¢�B" IDS_CREATEFILE "‚±‚̃tƒ@ƒCƒ‹‚Í‘¶�Ý‚µ‚Ü‚¹‚ñ�B\n�ì�¬‚µ‚Ü‚·‚©?" - IDS_OVERWRITEFILE "File already exists.\nDo you want to replace it?" + IDS_OVERWRITEFILE "ƒtƒ@ƒCƒ‹‚ÍŠù‚É‘¶�Ý‚µ‚Ü‚·�B\n�ã�‘‚«‚µ‚Ü‚·‚©?" IDS_INVALID_FILENAME_TITLE "Invalid character(s) in path" - IDS_INVALID_FILENAME "A filename cannot contain any of the following characters:\n / : < > |" + IDS_INVALID_FILENAME "ƒtƒ@ƒCƒ‹–¼‚ɂ͈ȉº‚Ì•¶Žš‚ÍŽg‚¦‚Ü‚¹‚ñ:\n / : < > |" IDS_PATHNOTEXISTING "Path does not exist" IDS_FILENOTEXISTING "File does not exist" } + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "Up One Level" + IDS_NEWFOLDER "Create New Folder" + IDS_LISTVIEW "List" + IDS_REPORTVIEW "Details" + IDS_TODESKTOP "Browse to Desktop" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "Print" + + PD32_VALUE_UREADABLE "Unreadable Entry" + PD32_INVALID_PAGE_RANGE "This value does not lie within the page range.\n\ +Please enter a value between %d and %d." + PD32_FROM_NOT_ABOVE_TO "The 'from' entry cannot exceed the \ +'to' entry." + PD32_MARGINS_OVERLAP "Margins overlap or fall outside \ +Paper boundaries.\nPlease reenter margins." + PD32_NR_OF_COPIES_EMPTY "The number of 'Number of copies' \ +value cannot be empty." + PD32_TOO_LARGE_COPIES "This large number of copies is not \ +supported by your printer.\nPlease enter a value between 1 and %d." + PD32_PRINT_ERROR "A printer error occurred." + PD32_NO_DEFAULT_PRINTER "No default printer defined." + PD32_CANT_FIND_PRINTER "Cannot find the printer." + PD32_OUT_OF_MEMORY "Out of memory." + PD32_GENERIC_ERROR "An error occurred." + PD32_DRIVER_UNKNOWN "Unknown printer driver." + PD32_NO_DEVICES "Before you can perform printer-related tasks \ +such as page setup or printing a document, you need to install a printer. \ +Please install one and retry." + + PD32_DEFAULT_PRINTER "Default Printer; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "There are %d documents in the queue" + PD32_MARGINS_IN_INCHES "Margins [inches]" + PD32_MARGINS_IN_MILIMETERS "Margins [mm]" + PD32_MILIMETERS "mm" + + PD32_PRINTER_STATUS_READY "Ready" + PD32_PRINTER_STATUS_PAUSED "Paused; " + PD32_PRINTER_STATUS_ERROR "Error; " + PD32_PRINTER_STATUS_PENDING_DELETION "Pending deletion; " + PD32_PRINTER_STATUS_PAPER_JAM "Paper jam; " + PD32_PRINTER_STATUS_PAPER_OUT "Out of paper; " + PD32_PRINTER_STATUS_MANUAL_FEED "Feed paper manual; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "Paper problem; " + PD32_PRINTER_STATUS_OFFLINE "Printer offline; " + PD32_PRINTER_STATUS_IO_ACTIVE "I/O Active; " + PD32_PRINTER_STATUS_BUSY "Busy; " + PD32_PRINTER_STATUS_PRINTING "Printing; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "Output tray is full; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "Not available; " + PD32_PRINTER_STATUS_WAITING "Waiting; " + PD32_PRINTER_STATUS_PROCESSING "Processing; " + PD32_PRINTER_STATUS_INITIALIZING "Initialising; " + PD32_PRINTER_STATUS_WARMING_UP "Warming up; " + PD32_PRINTER_STATUS_TONER_LOW "Toner low; " + PD32_PRINTER_STATUS_NO_TONER "No toner; " + PD32_PRINTER_STATUS_PAGE_PUNT "Page punt; " + PD32_PRINTER_STATUS_USER_INTERVENTION "Interrupted by user; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "Out of memory; " + PD32_PRINTER_STATUS_DOOR_OPEN "The printer door is open; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "Print server unknown; " + PD32_PRINTER_STATUS_POWER_SAVE "Power save mode; " +} + +STRINGTABLE DISCARDABLE /* Font styles */ +{ + IDS_FONT_REGULAR "•W�€" + IDS_FONT_BOLD "‘¾Žš" + IDS_FONT_ITALIC "ŽÎ‘Ì" + IDS_FONT_BOLD_ITALIC "‘¾Žš ŽÎ‘Ì" +} + +STRINGTABLE DISCARDABLE /* Color names */ +{ + IDS_COLOR_BLACK "�•" + IDS_COLOR_MAROON "’ƒ�F" + IDS_COLOR_GREEN "—Î" + IDS_COLOR_OLIVE "ƒIƒŠ�[ƒu" + IDS_COLOR_NAVY "�®" + IDS_COLOR_PURPLE "Ž‡" + IDS_COLOR_TEAL "�—Î" + IDS_COLOR_GRAY "ŠD�F" + IDS_COLOR_SILVER "‹â�F" + IDS_COLOR_RED "�Ô" + IDS_COLOR_LIME "‰©—Î" + IDS_COLOR_YELLOW "‰©" + IDS_COLOR_BLUE "�Â" + IDS_COLOR_FUCHSIA "�ÔŽ‡" + IDS_COLOR_AQUA "�…�F" + IDS_COLOR_WHITE "”’" +} + +STRINGTABLE DISCARDABLE +{ + IDS_FONT_SIZE "Select a font size between %d and %d points." + IDS_SAVE_BUTTON "&Save" + IDS_SAVE_IN "Save &in:" + IDS_SAVE "Save" + IDS_SAVE_AS "Save as" + IDS_OPEN_FILE "Open File" +} diff --git a/dlls/comdlg32/cdlg_Zh.rc b/dlls/comdlg32/cdlg_Zh.rc index 870ae481d17..14017ea8e62 100644 --- a/dlls/comdlg32/cdlg_Zh.rc +++ b/dlls/comdlg32/cdlg_Zh.rc @@ -182,7 +182,7 @@ FONT 9, "MS Song" DEFPUSHBUTTON "确定", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "取消", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "帮助", pshHelp,100,166, 44, 14 - PUSHBUTTON "添加到自定制颜色(&A)", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "添加到自定义颜色(&A)", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "规定自定义颜色(&D)>>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ } @@ -195,11 +195,11 @@ FONT 9, "MS Song" { LTEXT "查找(&n):", -1, 4, 8, 42, 8 EDITTEXT edt1, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "全字匹配(&W)", chx1, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "全字匹配(&W)", chx1, 4, 26, 64, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP CHECKBOX "区分大小写(&C)", chx2, 4, 42, 64, 12, BS_AUTOCHECKBOX | WS_TABSTOP - GROUPBOX "方向", grp1, 107, 26, 68, 28 - CONTROL "上(&U)", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 20, 12 - CONTROL "下(&D)", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + GROUPBOX "方向", 1072, 78, 28, 97, 28 + CONTROL "向上(&U)", 1056, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 83, 40, 42, 12 + CONTROL "向下(&D)", 1057, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 128, 40, 42, 12 DEFPUSHBUTTON "找下一个(&F)", IDOK, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON PUSHBUTTON "取消", IDCANCEL , 182, 23, 50, 14, WS_GROUP | WS_TABSTOP diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c index 52ac3c6dfe2..ccf5145b74e 100644 --- a/dlls/comdlg32/printdlg.c +++ b/dlls/comdlg32/printdlg.c @@ -309,8 +309,13 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, if (IsDlgButtonChecked(hDlg, rad3) == BST_CHECKED) { /* Pages */ WORD nToPage; WORD nFromPage; + BOOL translated; nFromPage = GetDlgItemInt(hDlg, edt1, NULL, FALSE); - nToPage = GetDlgItemInt(hDlg, edt2, NULL, FALSE); + nToPage = GetDlgItemInt(hDlg, edt2, &translated, FALSE); + + /* if no ToPage value is entered, use the FromPage value */ + if(!translated) nToPage = nFromPage; + if (nFromPage < lppd->nMinPage || nFromPage > lppd->nMaxPage || nToPage < lppd->nMinPage || nToPage > lppd->nMaxPage) { WCHAR resourcestr[256]; @@ -407,8 +412,13 @@ static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg, if (IsDlgButtonChecked(hDlg, rad3) == BST_CHECKED) { /* Pages */ WORD nToPage; WORD nFromPage; + BOOL translated; nFromPage = GetDlgItemInt(hDlg, edt1, NULL, FALSE); - nToPage = GetDlgItemInt(hDlg, edt2, NULL, FALSE); + nToPage = GetDlgItemInt(hDlg, edt2, &translated, FALSE); + + /* if no ToPage value is entered, use the FromPage value */ + if(!translated) nToPage = nFromPage; + if (nFromPage < lppd->nMinPage || nFromPage > lppd->nMaxPage || nToPage < lppd->nMinPage || nToPage > lppd->nMaxPage) { WCHAR resourcestr[256]; @@ -946,9 +956,12 @@ BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, lpdm = PrintStructures->lpDevMode; /* use this as a shortcut */ if(!(lppd->Flags & PD_PRINTSETUP)) { - /* Print range (All/Range/Selection) */ - SetDlgItemInt(hDlg, edt1, lppd->nFromPage, FALSE); - SetDlgItemInt(hDlg, edt2, lppd->nToPage, FALSE); + /* Print range (All/Range/Selection) */ + if(lppd->nFromPage != 0xffff) + SetDlgItemInt(hDlg, edt1, lppd->nFromPage, FALSE); + if(lppd->nToPage != 0xffff) + SetDlgItemInt(hDlg, edt2, lppd->nToPage, FALSE); + CheckRadioButton(hDlg, rad1, rad3, rad1); /* default */ if (lppd->Flags & PD_NOSELECTION) EnableWindow(GetDlgItem(hDlg, rad2), FALSE); @@ -1150,9 +1163,12 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, lpdm = PrintStructures->lpDevMode; /* use this as a shortcut */ if(!(lppd->Flags & PD_PRINTSETUP)) { - /* Print range (All/Range/Selection) */ - SetDlgItemInt(hDlg, edt1, lppd->nFromPage, FALSE); - SetDlgItemInt(hDlg, edt2, lppd->nToPage, FALSE); + /* Print range (All/Range/Selection) */ + if(lppd->nFromPage != 0xffff) + SetDlgItemInt(hDlg, edt1, lppd->nFromPage, FALSE); + if(lppd->nToPage != 0xffff) + SetDlgItemInt(hDlg, edt2, lppd->nToPage, FALSE); + CheckRadioButton(hDlg, rad1, rad3, rad1); /* default */ if (lppd->Flags & PD_NOSELECTION) EnableWindow(GetDlgItem(hDlg, rad2), FALSE); diff --git a/dlls/credui/credui.rc b/dlls/credui/credui.rc index 1de419fd4b4..17cdc199288 100644 --- a/dlls/credui/credui.rc +++ b/dlls/credui/credui.rc @@ -39,3 +39,4 @@ IDB_BANNER BITMAP LOADONCALL DISCARDABLE banner.bmp #include "credui_Ru.rc" #include "credui_Si.rc" #include "credui_Sv.rc" +#include "credui_Zh.rc" diff --git a/dlls/credui/credui_Zh.rc b/dlls/credui/credui_Zh.rc new file mode 100644 index 00000000000..45c324960b4 --- /dev/null +++ b/dlls/credui/credui_Zh.rc @@ -0,0 +1,86 @@ +/* + * Credentials UI (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "IDS_TITLEFORMAT" +FONT 9, "MS Song" +BEGIN + CONTROL IDB_BANNER,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE,0, + 0,213,37 + LTEXT "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP + LTEXT "用户名(&U):",IDC_STATIC,8,62,72,12,SS_CENTERIMAGE + CONTROL "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN | + CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87 + LTEXT "密码(&P):",IDC_STATIC,8,80,72,12,SS_CENTERIMAGE + EDITTEXT IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "记住我的密码(&R)",IDC_SAVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12 + DEFPUSHBUTTON "确定",IDOK,97,128,50,14 + PUSHBUTTON "取消",IDCANCEL,156,128,50,14 +END + +STRINGTABLE DISCARDABLE +{ + IDS_TITLEFORMAT "连接到 %s" + IDS_MESSAGEFORMAT "正在连接到 %s" + IDS_INCORRECTPASSWORDTITLE "登录失败" + IDS_INCORRECTPASSWORD "请确认你输入的用户名和密码\n是否正确." + IDS_CAPSLOCKONTITLE "大写锁定开着" + IDS_CAPSLOCKON "开着大写锁定可能导致你输入错误的密码." +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_CREDDIALOG DIALOG DISCARDABLE 0, 0, 213, 149 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "IDS_TITLEFORMAT" +FONT 8, "PMingLiu" +BEGIN + CONTROL IDB_BANNER,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE,0, + 0,213,37 + LTEXT "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP + LTEXT "用戶名(&U):",IDC_STATIC,8,62,72,12,SS_CENTERIMAGE + CONTROL "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN | + CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87 + LTEXT "密碼(&P):",IDC_STATIC,8,80,72,12,SS_CENTERIMAGE + EDITTEXT IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL + CONTROL "記住我的密碼(&R)",IDC_SAVE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12 + DEFPUSHBUTTON "確定",IDOK,97,128,50,14 + PUSHBUTTON "取消",IDCANCEL,156,128,50,14 +END + +STRINGTABLE DISCARDABLE +{ + IDS_TITLEFORMAT "連接到 %s" + IDS_MESSAGEFORMAT "正在連接到 %s" + IDS_INCORRECTPASSWORDTITLE "登錄失敗" + IDS_INCORRECTPASSWORD "請確認你輸入的用戶名和密碼\n是否正確." + IDS_CAPSLOCKONTITLE "大寫鎖定開著" + IDS_CAPSLOCKON "開著大寫鎖定可能導致你輸入錯誤的密碼." +} + +#pragma code_page(default) diff --git a/dlls/crypt32/Makefile.in b/dlls/crypt32/Makefile.in index 16fbd5e86c1..10ffda94463 100644 --- a/dlls/crypt32/Makefile.in +++ b/dlls/crypt32/Makefile.in @@ -14,6 +14,7 @@ C_SRCS = \ collectionstore.c \ context.c \ crl.c \ + ctl.c \ decode.c \ encode.c \ filestore.c \ diff --git a/dlls/crypt32/collectionstore.c b/dlls/crypt32/collectionstore.c index 9bf6d1daa7c..41b644a841e 100644 --- a/dlls/crypt32/collectionstore.c +++ b/dlls/crypt32/collectionstore.c @@ -341,6 +341,84 @@ static BOOL CRYPT_CollectionDeleteCRL(PWINECRYPT_CERTSTORE store, return ret; } +static BOOL CRYPT_CollectionAddCTL(PWINECRYPT_CERTSTORE store, void *ctl, + void *toReplace, const void **ppStoreContext) +{ + BOOL ret; + void *childContext = NULL; + PWINE_COLLECTIONSTORE cs = (PWINE_COLLECTIONSTORE)store; + + ret = CRYPT_CollectionAddContext(cs, offsetof(WINECRYPT_CERTSTORE, ctls), + ctl, toReplace, sizeof(CTL_CONTEXT), &childContext); + if (ppStoreContext && childContext) + { + PWINE_STORE_LIST_ENTRY storeEntry = *(PWINE_STORE_LIST_ENTRY *) + Context_GetExtra(childContext, sizeof(CTL_CONTEXT)); + PCTL_CONTEXT context = + CRYPT_CollectionCreateContextFromChild(cs, storeEntry, childContext, + sizeof(CTL_CONTEXT), TRUE); + + if (context) + context->hCertStore = store; + *ppStoreContext = context; + } + CertFreeCTLContext((PCCTL_CONTEXT)childContext); + return ret; +} + +static void *CRYPT_CollectionEnumCTL(PWINECRYPT_CERTSTORE store, void *pPrev) +{ + PWINE_COLLECTIONSTORE cs = (PWINE_COLLECTIONSTORE)store; + void *ret; + + TRACE("(%p, %p)\n", store, pPrev); + + EnterCriticalSection(&cs->cs); + if (pPrev) + { + PWINE_STORE_LIST_ENTRY storeEntry = + *(PWINE_STORE_LIST_ENTRY *)Context_GetExtra(pPrev, + sizeof(CTL_CONTEXT)); + + ret = CRYPT_CollectionAdvanceEnum(cs, storeEntry, + &storeEntry->store->ctls, pCTLInterface, pPrev, sizeof(CTL_CONTEXT)); + } + else + { + if (!list_empty(&cs->stores)) + { + PWINE_STORE_LIST_ENTRY storeEntry = LIST_ENTRY(cs->stores.next, + WINE_STORE_LIST_ENTRY, entry); + + ret = CRYPT_CollectionAdvanceEnum(cs, storeEntry, + &storeEntry->store->ctls, pCTLInterface, NULL, + sizeof(CTL_CONTEXT)); + } + else + { + SetLastError(CRYPT_E_NOT_FOUND); + ret = NULL; + } + } + LeaveCriticalSection(&cs->cs); + if (ret) + ((PCTL_CONTEXT)ret)->hCertStore = store; + TRACE("returning %p\n", ret); + return ret; +} + +static BOOL CRYPT_CollectionDeleteCTL(PWINECRYPT_CERTSTORE store, + void *pCtlContext) +{ + BOOL ret; + + TRACE("(%p, %p)\n", store, pCtlContext); + + ret = CertDeleteCTLFromStore((PCCTL_CONTEXT) + Context_GetLinkedContext(pCtlContext, sizeof(CTL_CONTEXT))); + return ret; +} + PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, const void *pvPara) { @@ -365,6 +443,9 @@ PWINECRYPT_CERTSTORE CRYPT_CollectionOpenStore(HCRYPTPROV hCryptProv, store->hdr.crls.addContext = CRYPT_CollectionAddCRL; store->hdr.crls.enumContext = CRYPT_CollectionEnumCRL; store->hdr.crls.deleteContext = CRYPT_CollectionDeleteCRL; + store->hdr.ctls.addContext = CRYPT_CollectionAddCTL; + store->hdr.ctls.enumContext = CRYPT_CollectionEnumCTL; + store->hdr.ctls.deleteContext = CRYPT_CollectionDeleteCTL; InitializeCriticalSection(&store->cs); store->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PWINE_COLLECTIONSTORE->cs"); list_init(&store->stores); diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec index a5af07d8d89..8476345cb71 100644 --- a/dlls/crypt32/crypt32.spec +++ b/dlls/crypt32/crypt32.spec @@ -38,7 +38,7 @@ @ stdcall CertEnumSystemStore(long ptr ptr ptr) @ stdcall CertFindAttribute(str long ptr) @ stdcall CertFindCRLInStore(long long long long ptr ptr) -@ stub CertFindCTLInStore +@ stdcall CertFindCTLInStore(long long long long ptr ptr) @ stdcall CertFindCertificateInStore(long long long long ptr ptr) @ stdcall CertFindCertificateInCRL(ptr ptr long ptr ptr) @ stdcall CertFindExtension(str long ptr) diff --git a/dlls/crypt32/crypt32_private.h b/dlls/crypt32/crypt32_private.h index c0805408dd2..46bc8c5524e 100644 --- a/dlls/crypt32/crypt32_private.h +++ b/dlls/crypt32/crypt32_private.h @@ -227,6 +227,7 @@ typedef struct WINE_CRYPTCERTSTORE PFN_CERT_STORE_PROV_CLOSE closeStore; CONTEXT_FUNCS certs; CONTEXT_FUNCS crls; + CONTEXT_FUNCS ctls; PFN_CERT_STORE_PROV_CONTROL control; /* optional */ PCONTEXT_PROPERTY_LIST properties; } WINECRYPT_CERTSTORE, *PWINECRYPT_CERTSTORE; diff --git a/dlls/crypt32/ctl.c b/dlls/crypt32/ctl.c new file mode 100644 index 00000000000..9b6d2e0128c --- /dev/null +++ b/dlls/crypt32/ctl.c @@ -0,0 +1,673 @@ +/* + * Copyright 2008 Juan Lang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +#include +#include + +#define NONAMELESSUNION +#include "windef.h" +#include "winbase.h" +#include "wincrypt.h" +#include "wine/debug.h" +#include "crypt32_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(crypt); + +#define CtlContext_CopyProperties(to, from) \ + Context_CopyProperties((to), (from), sizeof(CTL_CONTEXT)) + +BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, + PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, + PCCTL_CONTEXT* ppStoreContext) +{ + PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)hCertStore; + BOOL ret = TRUE; + PCCTL_CONTEXT toAdd = NULL, existing = NULL; + + TRACE("(%p, %p, %08x, %p)\n", hCertStore, pCtlContext, dwAddDisposition, + ppStoreContext); + + if (dwAddDisposition != CERT_STORE_ADD_ALWAYS) + { + existing = CertFindCTLInStore(hCertStore, 0, 0, CTL_FIND_EXISTING, + pCtlContext, NULL); + } + + switch (dwAddDisposition) + { + case CERT_STORE_ADD_ALWAYS: + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_NEW: + if (existing) + { + TRACE("found matching CTL, not adding\n"); + SetLastError(CRYPT_E_EXISTS); + ret = FALSE; + } + else + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_NEWER: + if (existing) + { + LONG newer = CompareFileTime(&existing->pCtlInfo->ThisUpdate, + &pCtlContext->pCtlInfo->ThisUpdate); + + if (newer < 0) + toAdd = CertDuplicateCTLContext(pCtlContext); + else + { + TRACE("existing CTL is newer, not adding\n"); + SetLastError(CRYPT_E_EXISTS); + ret = FALSE; + } + } + else + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_REPLACE_EXISTING: + toAdd = CertDuplicateCTLContext(pCtlContext); + break; + case CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES: + toAdd = CertDuplicateCTLContext(pCtlContext); + if (existing) + CtlContext_CopyProperties(toAdd, existing); + break; + case CERT_STORE_ADD_USE_EXISTING: + if (existing) + CtlContext_CopyProperties(existing, pCtlContext); + break; + default: + FIXME("Unimplemented add disposition %d\n", dwAddDisposition); + ret = FALSE; + } + + if (toAdd) + { + if (store) + ret = store->ctls.addContext(store, (void *)toAdd, + (void *)existing, (const void **)ppStoreContext); + else if (ppStoreContext) + *ppStoreContext = CertDuplicateCTLContext(toAdd); + CertFreeCTLContext(toAdd); + } + CertFreeCTLContext(existing); + + TRACE("returning %d\n", ret); + return ret; +} + +BOOL WINAPI CertAddEncodedCTLToStore(HCERTSTORE hCertStore, + DWORD dwMsgAndCertEncodingType, const BYTE *pbCtlEncoded, DWORD cbCtlEncoded, + DWORD dwAddDisposition, PCCTL_CONTEXT *ppCtlContext) +{ + PCCTL_CONTEXT ctl = CertCreateCTLContext(dwMsgAndCertEncodingType, + pbCtlEncoded, cbCtlEncoded); + BOOL ret; + + TRACE("(%p, %08x, %p, %d, %08x, %p)\n", hCertStore, + dwMsgAndCertEncodingType, pbCtlEncoded, cbCtlEncoded, dwAddDisposition, + ppCtlContext); + + if (ctl) + { + ret = CertAddCTLContextToStore(hCertStore, ctl, dwAddDisposition, + ppCtlContext); + CertFreeCTLContext(ctl); + } + else + ret = FALSE; + return ret; +} + +PCCTL_CONTEXT WINAPI CertEnumCTLsInStore(HCERTSTORE hCertStore, + PCCTL_CONTEXT pPrev) +{ + WINECRYPT_CERTSTORE *hcs = (WINECRYPT_CERTSTORE *)hCertStore; + PCCTL_CONTEXT ret; + + TRACE("(%p, %p)\n", hCertStore, pPrev); + if (!hCertStore) + ret = NULL; + else if (hcs->dwMagic != WINE_CRYPTCERTSTORE_MAGIC) + ret = NULL; + else + ret = (PCCTL_CONTEXT)hcs->ctls.enumContext(hcs, (void *)pPrev); + return ret; +} + +typedef BOOL (*CtlCompareFunc)(PCCTL_CONTEXT pCtlContext, DWORD dwType, + DWORD dwFlags, const void *pvPara); + +static BOOL compare_ctl_any(PCCTL_CONTEXT pCtlContext, DWORD dwType, + DWORD dwFlags, const void *pvPara) +{ + return TRUE; +} + +static BOOL compare_ctl_by_md5_hash(PCCTL_CONTEXT pCtlContext, DWORD dwType, + DWORD dwFlags, const void *pvPara) +{ + BOOL ret; + BYTE hash[16]; + DWORD size = sizeof(hash); + + ret = CertGetCTLContextProperty(pCtlContext, CERT_MD5_HASH_PROP_ID, hash, + &size); + if (ret) + { + const CRYPT_HASH_BLOB *pHash = (const CRYPT_HASH_BLOB *)pvPara; + + if (size == pHash->cbData) + ret = !memcmp(pHash->pbData, hash, size); + else + ret = FALSE; + } + return ret; +} + +static BOOL compare_ctl_by_sha1_hash(PCCTL_CONTEXT pCtlContext, DWORD dwType, + DWORD dwFlags, const void *pvPara) +{ + BOOL ret; + BYTE hash[20]; + DWORD size = sizeof(hash); + + ret = CertGetCTLContextProperty(pCtlContext, CERT_SHA1_HASH_PROP_ID, hash, + &size); + if (ret) + { + const CRYPT_HASH_BLOB *pHash = (const CRYPT_HASH_BLOB *)pvPara; + + if (size == pHash->cbData) + ret = !memcmp(pHash->pbData, hash, size); + else + ret = FALSE; + } + return ret; +} + +static BOOL compare_ctl_existing(PCCTL_CONTEXT pCtlContext, DWORD dwType, + DWORD dwFlags, const void *pvPara) +{ + BOOL ret; + + if (pvPara) + { + PCCTL_CONTEXT ctl = (PCCTL_CONTEXT)pvPara; + + if (pCtlContext->cbCtlContext == ctl->cbCtlContext) + { + if (ctl->cbCtlContext) + ret = !memcmp(pCtlContext->pbCtlContext, ctl->pbCtlContext, + ctl->cbCtlContext); + else + ret = TRUE; + } + else + ret = FALSE; + } + else + ret = FALSE; + return ret; +} + +PCCTL_CONTEXT WINAPI CertFindCTLInStore(HCERTSTORE hCertStore, + DWORD dwCertEncodingType, DWORD dwFindFlags, DWORD dwFindType, + const void *pvFindPara, PCCTL_CONTEXT pPrevCtlContext) +{ + PCCTL_CONTEXT ret; + CtlCompareFunc compare; + + TRACE("(%p, %d, %d, %d, %p, %p)\n", hCertStore, dwCertEncodingType, + dwFindFlags, dwFindType, pvFindPara, pPrevCtlContext); + + switch (dwFindType) + { + case CTL_FIND_ANY: + compare = compare_ctl_any; + break; + case CTL_FIND_SHA1_HASH: + compare = compare_ctl_by_sha1_hash; + break; + case CTL_FIND_MD5_HASH: + compare = compare_ctl_by_md5_hash; + break; + case CTL_FIND_EXISTING: + compare = compare_ctl_existing; + break; + default: + FIXME("find type %08x unimplemented\n", dwFindType); + compare = NULL; + } + + if (compare) + { + BOOL matches = FALSE; + + ret = pPrevCtlContext; + do { + ret = CertEnumCTLsInStore(hCertStore, ret); + if (ret) + matches = compare(ret, dwFindType, dwFindFlags, pvFindPara); + } while (ret != NULL && !matches); + if (!ret) + SetLastError(CRYPT_E_NOT_FOUND); + } + else + { + SetLastError(CRYPT_E_NOT_FOUND); + ret = NULL; + } + return ret; +} + +BOOL WINAPI CertDeleteCTLFromStore(PCCTL_CONTEXT pCtlContext) +{ + BOOL ret; + + TRACE("(%p)\n", pCtlContext); + + if (!pCtlContext) + ret = TRUE; + else if (!pCtlContext->hCertStore) + { + ret = TRUE; + CertFreeCTLContext(pCtlContext); + } + else + { + PWINECRYPT_CERTSTORE hcs = + (PWINECRYPT_CERTSTORE)pCtlContext->hCertStore; + + if (hcs->dwMagic != WINE_CRYPTCERTSTORE_MAGIC) + ret = FALSE; + else + ret = hcs->ctls.deleteContext(hcs, (void *)pCtlContext); + CertFreeCTLContext(pCtlContext); + } + return ret; +} + +PCCTL_CONTEXT WINAPI CertCreateCTLContext(DWORD dwMsgAndCertEncodingType, + const BYTE *pbCtlEncoded, DWORD cbCtlEncoded) +{ + PCTL_CONTEXT ctl = NULL; + HCRYPTMSG msg; + BOOL ret; + BYTE *content = NULL; + DWORD contentSize = 0, size; + PCTL_INFO ctlInfo = NULL; + + TRACE("(%08x, %p, %d)\n", dwMsgAndCertEncodingType, pbCtlEncoded, + cbCtlEncoded); + + if (GET_CERT_ENCODING_TYPE(dwMsgAndCertEncodingType) != X509_ASN_ENCODING) + { + SetLastError(E_INVALIDARG); + return NULL; + } + if (!pbCtlEncoded || !cbCtlEncoded) + { + SetLastError(ERROR_INVALID_DATA); + return NULL; + } + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING, 0, 0, + 0, NULL, NULL); + if (!msg) + return NULL; + ret = CryptMsgUpdate(msg, pbCtlEncoded, cbCtlEncoded, TRUE); + if (!ret) + { + SetLastError(ERROR_INVALID_DATA); + goto end; + } + /* Check that it's really a CTL */ + ret = CryptMsgGetParam(msg, CMSG_INNER_CONTENT_TYPE_PARAM, 0, NULL, &size); + if (ret) + { + char *innerContent = CryptMemAlloc(size); + + if (innerContent) + { + ret = CryptMsgGetParam(msg, CMSG_INNER_CONTENT_TYPE_PARAM, 0, + innerContent, &size); + if (ret) + { + if (strcmp(innerContent, szOID_CTL)) + { + SetLastError(ERROR_INVALID_DATA); + ret = FALSE; + } + } + CryptMemFree(innerContent); + } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; + } + } + if (!ret) + goto end; + ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, NULL, &contentSize); + if (!ret) + goto end; + content = CryptMemAlloc(contentSize); + if (content) + { + ret = CryptMsgGetParam(msg, CMSG_CONTENT_PARAM, 0, content, + &contentSize); + if (ret) + { + ret = CryptDecodeObjectEx(dwMsgAndCertEncodingType, PKCS_CTL, + content, contentSize, CRYPT_DECODE_ALLOC_FLAG, NULL, + (BYTE *)&ctlInfo, &size); + if (ret) + { + ctl = (PCTL_CONTEXT)Context_CreateDataContext( + sizeof(CTL_CONTEXT)); + if (ctl) + { + BYTE *data = CryptMemAlloc(cbCtlEncoded); + + if (data) + { + memcpy(data, pbCtlEncoded, cbCtlEncoded); + ctl->dwMsgAndCertEncodingType = + X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; + ctl->pbCtlEncoded = data; + ctl->cbCtlEncoded = cbCtlEncoded; + ctl->pCtlInfo = ctlInfo; + ctl->hCertStore = NULL; + ctl->hCryptMsg = msg; + ctl->pbCtlContext = content; + ctl->cbCtlContext = contentSize; + } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; + } + } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; + } + } + } + } + else + { + SetLastError(ERROR_OUTOFMEMORY); + ret = FALSE; + } + +end: + if (!ret) + { + CryptMemFree(ctl); + ctl = NULL; + LocalFree(ctlInfo); + CryptMemFree(content); + CryptMsgClose(msg); + } + return (PCCTL_CONTEXT)ctl; +} + +PCCTL_CONTEXT WINAPI CertDuplicateCTLContext(PCCTL_CONTEXT pCtlContext) +{ + TRACE("(%p)\n", pCtlContext); + Context_AddRef((void *)pCtlContext, sizeof(CTL_CONTEXT)); + return pCtlContext; +} + +static void CTLDataContext_Free(void *context) +{ + PCTL_CONTEXT ctlContext = (PCTL_CONTEXT)context; + + CryptMsgClose(ctlContext->hCryptMsg); + CryptMemFree(ctlContext->pbCtlEncoded); + CryptMemFree(ctlContext->pbCtlContext); + LocalFree(ctlContext->pCtlInfo); +} + +BOOL WINAPI CertFreeCTLContext(PCCTL_CONTEXT pCTLContext) +{ + TRACE("(%p)\n", pCTLContext); + + if (pCTLContext) + Context_Release((void *)pCTLContext, sizeof(CTL_CONTEXT), + CTLDataContext_Free); + return TRUE; +} + +DWORD WINAPI CertEnumCTLContextProperties(PCCTL_CONTEXT pCTLContext, + DWORD dwPropId) +{ + PCONTEXT_PROPERTY_LIST properties = Context_GetProperties( + (void *)pCTLContext, sizeof(CTL_CONTEXT)); + DWORD ret; + + TRACE("(%p, %d)\n", pCTLContext, dwPropId); + + if (properties) + ret = ContextPropertyList_EnumPropIDs(properties, dwPropId); + else + ret = 0; + return ret; +} + +static BOOL CTLContext_SetProperty(PCCTL_CONTEXT context, DWORD dwPropId, + DWORD dwFlags, const void *pvData); + +static BOOL CTLContext_GetHashProp(PCCTL_CONTEXT context, DWORD dwPropId, + ALG_ID algID, const BYTE *toHash, DWORD toHashLen, void *pvData, + DWORD *pcbData) +{ + BOOL ret = CryptHashCertificate(0, algID, 0, toHash, toHashLen, pvData, + pcbData); + if (ret) + { + CRYPT_DATA_BLOB blob = { *pcbData, pvData }; + + ret = CTLContext_SetProperty(context, dwPropId, 0, &blob); + } + return ret; +} + +static BOOL CTLContext_GetProperty(PCCTL_CONTEXT context, DWORD dwPropId, + void *pvData, DWORD *pcbData) +{ + PCONTEXT_PROPERTY_LIST properties = + Context_GetProperties(context, sizeof(CTL_CONTEXT)); + BOOL ret; + CRYPT_DATA_BLOB blob; + + TRACE("(%p, %d, %p, %p)\n", context, dwPropId, pvData, pcbData); + + if (properties) + ret = ContextPropertyList_FindProperty(properties, dwPropId, &blob); + else + ret = FALSE; + if (ret) + { + if (!pvData) + *pcbData = blob.cbData; + else if (*pcbData < blob.cbData) + { + SetLastError(ERROR_MORE_DATA); + *pcbData = blob.cbData; + ret = FALSE; + } + else + { + memcpy(pvData, blob.pbData, blob.cbData); + *pcbData = blob.cbData; + } + } + else + { + /* Implicit properties */ + switch (dwPropId) + { + case CERT_SHA1_HASH_PROP_ID: + ret = CTLContext_GetHashProp(context, dwPropId, CALG_SHA1, + context->pbCtlEncoded, context->cbCtlEncoded, pvData, pcbData); + break; + case CERT_MD5_HASH_PROP_ID: + ret = CTLContext_GetHashProp(context, dwPropId, CALG_MD5, + context->pbCtlEncoded, context->cbCtlEncoded, pvData, pcbData); + break; + default: + SetLastError(CRYPT_E_NOT_FOUND); + } + } + TRACE("returning %d\n", ret); + return ret; +} + +BOOL WINAPI CertGetCTLContextProperty(PCCTL_CONTEXT pCTLContext, + DWORD dwPropId, void *pvData, DWORD *pcbData) +{ + BOOL ret; + + TRACE("(%p, %d, %p, %p)\n", pCTLContext, dwPropId, pvData, pcbData); + + switch (dwPropId) + { + case 0: + case CERT_CERT_PROP_ID: + case CERT_CRL_PROP_ID: + case CERT_CTL_PROP_ID: + SetLastError(E_INVALIDARG); + ret = FALSE; + break; + case CERT_ACCESS_STATE_PROP_ID: + if (!pvData) + { + *pcbData = sizeof(DWORD); + ret = TRUE; + } + else if (*pcbData < sizeof(DWORD)) + { + SetLastError(ERROR_MORE_DATA); + *pcbData = sizeof(DWORD); + ret = FALSE; + } + else + { + if (pCTLContext->hCertStore) + ret = CertGetStoreProperty(pCTLContext->hCertStore, dwPropId, + pvData, pcbData); + else + *(DWORD *)pvData = 0; + ret = TRUE; + } + break; + default: + ret = CTLContext_GetProperty(pCTLContext, dwPropId, pvData, + pcbData); + } + return ret; +} + +static BOOL CTLContext_SetProperty(PCCTL_CONTEXT context, DWORD dwPropId, + DWORD dwFlags, const void *pvData) +{ + PCONTEXT_PROPERTY_LIST properties = + Context_GetProperties(context, sizeof(CTL_CONTEXT)); + BOOL ret; + + TRACE("(%p, %d, %08x, %p)\n", context, dwPropId, dwFlags, pvData); + + if (!properties) + ret = FALSE; + else if (!pvData) + { + ContextPropertyList_RemoveProperty(properties, dwPropId); + ret = TRUE; + } + else + { + switch (dwPropId) + { + case CERT_AUTO_ENROLL_PROP_ID: + case CERT_CTL_USAGE_PROP_ID: /* same as CERT_ENHKEY_USAGE_PROP_ID */ + case CERT_DESCRIPTION_PROP_ID: + case CERT_FRIENDLY_NAME_PROP_ID: + case CERT_HASH_PROP_ID: + case CERT_KEY_IDENTIFIER_PROP_ID: + case CERT_MD5_HASH_PROP_ID: + case CERT_NEXT_UPDATE_LOCATION_PROP_ID: + case CERT_PUBKEY_ALG_PARA_PROP_ID: + case CERT_PVK_FILE_PROP_ID: + case CERT_SIGNATURE_HASH_PROP_ID: + case CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID: + case CERT_SUBJECT_NAME_MD5_HASH_PROP_ID: + case CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID: + case CERT_ENROLLMENT_PROP_ID: + case CERT_CROSS_CERT_DIST_POINTS_PROP_ID: + case CERT_RENEWAL_PROP_ID: + { + PCRYPT_DATA_BLOB blob = (PCRYPT_DATA_BLOB)pvData; + + ret = ContextPropertyList_SetProperty(properties, dwPropId, + blob->pbData, blob->cbData); + break; + } + case CERT_DATE_STAMP_PROP_ID: + ret = ContextPropertyList_SetProperty(properties, dwPropId, + (const BYTE *)pvData, sizeof(FILETIME)); + break; + default: + FIXME("%d: stub\n", dwPropId); + ret = FALSE; + } + } + TRACE("returning %d\n", ret); + return ret; +} + +BOOL WINAPI CertSetCTLContextProperty(PCCTL_CONTEXT pCTLContext, + DWORD dwPropId, DWORD dwFlags, const void *pvData) +{ + BOOL ret; + + TRACE("(%p, %d, %08x, %p)\n", pCTLContext, dwPropId, dwFlags, pvData); + + /* Handle special cases for "read-only"/invalid prop IDs. Windows just + * crashes on most of these, I'll be safer. + */ + switch (dwPropId) + { + case 0: + case CERT_ACCESS_STATE_PROP_ID: + case CERT_CERT_PROP_ID: + case CERT_CRL_PROP_ID: + case CERT_CTL_PROP_ID: + SetLastError(E_INVALIDARG); + return FALSE; + } + ret = CTLContext_SetProperty(pCTLContext, dwPropId, dwFlags, pvData); + TRACE("returning %d\n", ret); + return ret; +} diff --git a/dlls/crypt32/filestore.c b/dlls/crypt32/filestore.c index 4c8c4a14a82..cfa29b33563 100644 --- a/dlls/crypt32/filestore.c +++ b/dlls/crypt32/filestore.c @@ -88,6 +88,26 @@ static BOOL WINAPI CRYPT_FileDeleteCRL(HCERTSTORE hCertStore, return TRUE; } +static BOOL WINAPI CRYPT_FileWriteCTL(HCERTSTORE hCertStore, + PCCTL_CONTEXT ctl, DWORD dwFlags) +{ + PWINE_FILESTOREINFO store = (PWINE_FILESTOREINFO)hCertStore; + + TRACE("(%p, %p, %d)\n", hCertStore, ctl, dwFlags); + store->dirty = TRUE; + return TRUE; +} + +static BOOL WINAPI CRYPT_FileDeleteCTL(HCERTSTORE hCertStore, + PCCTL_CONTEXT pCtlContext, DWORD dwFlags) +{ + PWINE_FILESTOREINFO store = (PWINE_FILESTOREINFO)hCertStore; + + TRACE("(%p, %p, %08x)\n", hCertStore, pCtlContext, dwFlags); + store->dirty = TRUE; + return TRUE; +} + static BOOL CRYPT_ReadBlobFromFile(HANDLE file, PCERT_BLOB blob) { BOOL ret = TRUE; @@ -187,8 +207,8 @@ static void *fileProvFuncs[] = { CRYPT_FileDeleteCRL, NULL, /* CERT_STORE_PROV_SET_CRL_PROPERTY_FUNC */ NULL, /* CERT_STORE_PROV_READ_CTL_FUNC */ - NULL, /* CERT_STORE_PROV_WRITE_CTL_FUNC */ - NULL, /* CERT_STORE_PROV_DELETE_CTL_FUNC */ + CRYPT_FileWriteCTL, + CRYPT_FileDeleteCTL, NULL, /* CERT_STORE_PROV_SET_CTL_PROPERTY_FUNC */ CRYPT_FileControl, }; diff --git a/dlls/crypt32/msg.c b/dlls/crypt32/msg.c index 449b944a154..1c07e05cd1f 100644 --- a/dlls/crypt32/msg.c +++ b/dlls/crypt32/msg.c @@ -20,6 +20,7 @@ #include "wine/port.h" #include +#define NONAMELESSUNION #include "windef.h" #include "winbase.h" #include "wincrypt.h" @@ -662,19 +663,19 @@ static BOOL CRYPT_IsValidSigner(CMSG_SIGNER_ENCODE_INFO_WITH_CMS *signer) } break; case CERT_ID_ISSUER_SERIAL_NUMBER: - if (!signer->SignerId.IssuerSerialNumber.SerialNumber.cbData) + if (!signer->SignerId.u.IssuerSerialNumber.SerialNumber.cbData) { SetLastError(E_INVALIDARG); return FALSE; } - if (!signer->SignerId.IssuerSerialNumber.Issuer.cbData) + if (!signer->SignerId.u.IssuerSerialNumber.Issuer.cbData) { SetLastError(E_INVALIDARG); return FALSE; } break; case CERT_ID_KEY_IDENTIFIER: - if (!signer->SignerId.KeyId.cbData) + if (!signer->SignerId.u.KeyId.cbData) { SetLastError(E_INVALIDARG); return FALSE; @@ -808,11 +809,11 @@ static BOOL CSignerInfo_Construct(CMSG_CMS_SIGNER_INFO *info, if (in->cbSize == sizeof(CMSG_SIGNER_ENCODE_INFO)) { info->dwVersion = CMSG_SIGNER_INFO_V1; - ret = CRYPT_ConstructBlob(&info->SignerId.IssuerSerialNumber.Issuer, + ret = CRYPT_ConstructBlob(&info->SignerId.u.IssuerSerialNumber.Issuer, &in->pCertInfo->Issuer); if (ret) ret = CRYPT_ConstructBlob( - &info->SignerId.IssuerSerialNumber.SerialNumber, + &info->SignerId.u.IssuerSerialNumber.SerialNumber, &in->pCertInfo->SerialNumber); info->SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; } @@ -824,11 +825,11 @@ static BOOL CSignerInfo_Construct(CMSG_CMS_SIGNER_INFO *info, if (!in->SignerId.dwIdChoice) { info->dwVersion = CMSG_SIGNER_INFO_V1; - ret = CRYPT_ConstructBlob(&info->SignerId.IssuerSerialNumber.Issuer, + ret = CRYPT_ConstructBlob(&info->SignerId.u.IssuerSerialNumber.Issuer, &in->pCertInfo->Issuer); if (ret) ret = CRYPT_ConstructBlob( - &info->SignerId.IssuerSerialNumber.SerialNumber, + &info->SignerId.u.IssuerSerialNumber.SerialNumber, &in->pCertInfo->SerialNumber); info->SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; } @@ -836,20 +837,20 @@ static BOOL CSignerInfo_Construct(CMSG_CMS_SIGNER_INFO *info, { info->dwVersion = CMSG_SIGNER_INFO_V1; info->SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; - ret = CRYPT_ConstructBlob(&info->SignerId.IssuerSerialNumber.Issuer, - &in->SignerId.IssuerSerialNumber.Issuer); + ret = CRYPT_ConstructBlob(&info->SignerId.u.IssuerSerialNumber.Issuer, + &in->SignerId.u.IssuerSerialNumber.Issuer); if (ret) ret = CRYPT_ConstructBlob( - &info->SignerId.IssuerSerialNumber.SerialNumber, - &in->SignerId.IssuerSerialNumber.SerialNumber); + &info->SignerId.u.IssuerSerialNumber.SerialNumber, + &in->SignerId.u.IssuerSerialNumber.SerialNumber); } else { /* Implicitly dwIdChoice == CERT_ID_KEY_IDENTIFIER */ info->dwVersion = CMSG_SIGNER_INFO_V3; info->SignerId.dwIdChoice = CERT_ID_KEY_IDENTIFIER; - ret = CRYPT_ConstructBlob(&info->SignerId.KeyId, - &in->SignerId.KeyId); + ret = CRYPT_ConstructBlob(&info->SignerId.u.KeyId, + &in->SignerId.u.KeyId); } } /* Assumption: algorithm IDs will point to static strings, not @@ -876,11 +877,11 @@ static void CSignerInfo_Free(CMSG_CMS_SIGNER_INFO *info) if (info->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { - CryptMemFree(info->SignerId.IssuerSerialNumber.Issuer.pbData); - CryptMemFree(info->SignerId.IssuerSerialNumber.SerialNumber.pbData); + CryptMemFree(info->SignerId.u.IssuerSerialNumber.Issuer.pbData); + CryptMemFree(info->SignerId.u.IssuerSerialNumber.SerialNumber.pbData); } else - CryptMemFree(info->SignerId.KeyId.pbData); + CryptMemFree(info->SignerId.u.KeyId.pbData); CryptMemFree(info->HashAlgorithm.Parameters.pbData); CryptMemFree(info->EncryptedHash.pbData); for (i = 0; i < info->AuthAttrs.cAttr; i++) @@ -2072,19 +2073,19 @@ static BOOL CRYPT_CopyKeyIdAsIssuerAndSerial(CERT_NAME_BLOB *issuer, static BOOL CRYPT_CopySignerInfo(void *pvData, DWORD *pcbData, const CMSG_CMS_SIGNER_INFO *in) { - DWORD size = sizeof(CMSG_SIGNER_INFO), rdnSize; + DWORD size = sizeof(CMSG_SIGNER_INFO), rdnSize = 0; BOOL ret; TRACE("(%p, %d, %p)\n", pvData, pvData ? *pcbData : 0, in); if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { - size += in->SignerId.IssuerSerialNumber.Issuer.cbData; - size += in->SignerId.IssuerSerialNumber.SerialNumber.cbData; + size += in->SignerId.u.IssuerSerialNumber.Issuer.cbData; + size += in->SignerId.u.IssuerSerialNumber.SerialNumber.cbData; } else { - rdnSize = CRYPT_SizeOfKeyIdAsIssuerAndSerial(&in->SignerId.KeyId); + rdnSize = CRYPT_SizeOfKeyIdAsIssuerAndSerial(&in->SignerId.u.KeyId); size += rdnSize; } if (in->HashAlgorithm.pszObjId) @@ -2120,13 +2121,13 @@ static BOOL CRYPT_CopySignerInfo(void *pvData, DWORD *pcbData, if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { CRYPT_CopyBlob(&out->Issuer, - &in->SignerId.IssuerSerialNumber.Issuer, &nextData); + &in->SignerId.u.IssuerSerialNumber.Issuer, &nextData); CRYPT_CopyBlob(&out->SerialNumber, - &in->SignerId.IssuerSerialNumber.SerialNumber, &nextData); + &in->SignerId.u.IssuerSerialNumber.SerialNumber, &nextData); } else ret = CRYPT_CopyKeyIdAsIssuerAndSerial(&out->Issuer, &out->SerialNumber, - &in->SignerId.KeyId, rdnSize, &nextData); + &in->SignerId.u.KeyId, rdnSize, &nextData); if (ret) { CRYPT_CopyAlgorithmId(&out->HashAlgorithm, &in->HashAlgorithm, @@ -2155,11 +2156,11 @@ static BOOL CRYPT_CopyCMSSignerInfo(void *pvData, DWORD *pcbData, if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { - size += in->SignerId.IssuerSerialNumber.Issuer.cbData; - size += in->SignerId.IssuerSerialNumber.SerialNumber.cbData; + size += in->SignerId.u.IssuerSerialNumber.Issuer.cbData; + size += in->SignerId.u.IssuerSerialNumber.SerialNumber.cbData; } else - size += in->SignerId.KeyId.cbData; + size += in->SignerId.u.KeyId.cbData; if (in->HashAlgorithm.pszObjId) size += strlen(in->HashAlgorithm.pszObjId) + 1; size += in->HashAlgorithm.Parameters.cbData; @@ -2192,13 +2193,13 @@ static BOOL CRYPT_CopyCMSSignerInfo(void *pvData, DWORD *pcbData, out->SignerId.dwIdChoice = in->SignerId.dwIdChoice; if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { - CRYPT_CopyBlob(&out->SignerId.IssuerSerialNumber.Issuer, - &in->SignerId.IssuerSerialNumber.Issuer, &nextData); - CRYPT_CopyBlob(&out->SignerId.IssuerSerialNumber.SerialNumber, - &in->SignerId.IssuerSerialNumber.SerialNumber, &nextData); + CRYPT_CopyBlob(&out->SignerId.u.IssuerSerialNumber.Issuer, + &in->SignerId.u.IssuerSerialNumber.Issuer, &nextData); + CRYPT_CopyBlob(&out->SignerId.u.IssuerSerialNumber.SerialNumber, + &in->SignerId.u.IssuerSerialNumber.SerialNumber, &nextData); } else - CRYPT_CopyBlob(&out->SignerId.KeyId, &in->SignerId.KeyId, &nextData); + CRYPT_CopyBlob(&out->SignerId.u.KeyId, &in->SignerId.u.KeyId, &nextData); CRYPT_CopyAlgorithmId(&out->HashAlgorithm, &in->HashAlgorithm, &nextData); CRYPT_CopyAlgorithmId(&out->HashEncryptionAlgorithm, @@ -2218,19 +2219,19 @@ static BOOL CRYPT_CopyCMSSignerInfo(void *pvData, DWORD *pcbData, static BOOL CRYPT_CopySignerCertInfo(void *pvData, DWORD *pcbData, const CMSG_CMS_SIGNER_INFO *in) { - DWORD size = sizeof(CERT_INFO), rdnSize; + DWORD size = sizeof(CERT_INFO), rdnSize = 0; BOOL ret; TRACE("(%p, %d, %p)\n", pvData, pvData ? *pcbData : 0, in); if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { - size += in->SignerId.IssuerSerialNumber.Issuer.cbData; - size += in->SignerId.IssuerSerialNumber.SerialNumber.cbData; + size += in->SignerId.u.IssuerSerialNumber.Issuer.cbData; + size += in->SignerId.u.IssuerSerialNumber.SerialNumber.cbData; } else { - rdnSize = CRYPT_SizeOfKeyIdAsIssuerAndSerial(&in->SignerId.KeyId); + rdnSize = CRYPT_SizeOfKeyIdAsIssuerAndSerial(&in->SignerId.u.KeyId); size += rdnSize; } if (!pvData) @@ -2253,14 +2254,14 @@ static BOOL CRYPT_CopySignerCertInfo(void *pvData, DWORD *pcbData, if (in->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { CRYPT_CopyBlob(&out->Issuer, - &in->SignerId.IssuerSerialNumber.Issuer, &nextData); + &in->SignerId.u.IssuerSerialNumber.Issuer, &nextData); CRYPT_CopyBlob(&out->SerialNumber, - &in->SignerId.IssuerSerialNumber.SerialNumber, &nextData); + &in->SignerId.u.IssuerSerialNumber.SerialNumber, &nextData); ret = TRUE; } else ret = CRYPT_CopyKeyIdAsIssuerAndSerial(&out->Issuer, &out->SerialNumber, - &in->SignerId.KeyId, rdnSize, &nextData); + &in->SignerId.u.KeyId, rdnSize, &nextData); } TRACE("returning %d\n", ret); return ret; @@ -2563,12 +2564,12 @@ static BOOL CDecodeSignedMsg_VerifySignature(CDecodeMsg *msg, PCERT_INFO info) if (signerInfo->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { ret = CertCompareCertificateName(X509_ASN_ENCODING, - &signerInfo->SignerId.IssuerSerialNumber.Issuer, + &signerInfo->SignerId.u.IssuerSerialNumber.Issuer, &info->Issuer); if (ret) { ret = CertCompareIntegerBlob( - &signerInfo->SignerId.IssuerSerialNumber.SerialNumber, + &signerInfo->SignerId.u.IssuerSerialNumber.SerialNumber, &info->SerialNumber); if (ret) break; @@ -2802,7 +2803,7 @@ BOOL WINAPI CryptMsgGetAndVerifySigner(HCRYPTMSG hCryptMsg, DWORD cSignerStore, DWORD *pdwSignerIndex) { HCERTSTORE store; - DWORD i, signerIndex; + DWORD i, signerIndex = 0; PCCERT_CONTEXT signerCert = NULL; BOOL ret = FALSE; diff --git a/dlls/crypt32/provstore.c b/dlls/crypt32/provstore.c index 33f765d633f..fba11ebc23f 100644 --- a/dlls/crypt32/provstore.c +++ b/dlls/crypt32/provstore.c @@ -36,6 +36,8 @@ typedef struct _WINE_PROVIDERSTORE PFN_CERT_STORE_PROV_DELETE_CERT provDeleteCert; PFN_CERT_STORE_PROV_WRITE_CRL provWriteCrl; PFN_CERT_STORE_PROV_DELETE_CRL provDeleteCrl; + PFN_CERT_STORE_PROV_WRITE_CTL provWriteCtl; + PFN_CERT_STORE_PROV_DELETE_CTL provDeleteCtl; PFN_CERT_STORE_PROV_CONTROL provControl; } WINE_PROVIDERSTORE, *PWINE_PROVIDERSTORE; @@ -178,6 +180,73 @@ static BOOL CRYPT_ProvDeleteCRL(PWINECRYPT_CERTSTORE store, void *crl) return ret; } +static BOOL CRYPT_ProvAddCTL(PWINECRYPT_CERTSTORE store, void *ctl, + void *toReplace, const void **ppStoreContext) +{ + PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store; + BOOL ret; + + TRACE("(%p, %p, %p, %p)\n", store, ctl, toReplace, ppStoreContext); + + if (toReplace) + ret = ps->memStore->ctls.addContext(ps->memStore, ctl, toReplace, + ppStoreContext); + else + { + if (ps->hdr.dwOpenFlags & CERT_STORE_READONLY_FLAG) + { + SetLastError(ERROR_ACCESS_DENIED); + ret = FALSE; + } + else + { + ret = TRUE; + if (ps->provWriteCtl) + ret = ps->provWriteCtl(ps->hStoreProv, (PCCTL_CONTEXT)ctl, + CERT_STORE_PROV_WRITE_ADD_FLAG); + if (ret) + ret = ps->memStore->ctls.addContext(ps->memStore, ctl, NULL, + ppStoreContext); + } + } + /* dirty trick: replace the returned context's hCertStore with + * store. + */ + if (ppStoreContext) + (*(PCTL_CONTEXT *)ppStoreContext)->hCertStore = store; + return ret; +} + +static void *CRYPT_ProvEnumCTL(PWINECRYPT_CERTSTORE store, void *pPrev) +{ + PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store; + void *ret; + + ret = ps->memStore->ctls.enumContext(ps->memStore, pPrev); + if (ret) + { + /* same dirty trick: replace the returned context's hCertStore with + * store. + */ + ((PCTL_CONTEXT)ret)->hCertStore = store; + } + return ret; +} + +static BOOL CRYPT_ProvDeleteCTL(PWINECRYPT_CERTSTORE store, void *ctl) +{ + PWINE_PROVIDERSTORE ps = (PWINE_PROVIDERSTORE)store; + BOOL ret = TRUE; + + TRACE("(%p, %p)\n", store, ctl); + + if (ps->provDeleteCtl) + ret = ps->provDeleteCtl(ps->hStoreProv, ctl, 0); + if (ret) + ret = ps->memStore->ctls.deleteContext(ps->memStore, ctl); + return ret; +} + static BOOL WINAPI CRYPT_ProvControl(HCERTSTORE hCertStore, DWORD dwFlags, DWORD dwCtrlType, void const *pvCtrlPara) { @@ -217,6 +286,9 @@ PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags, ret->hdr.crls.addContext = CRYPT_ProvAddCRL; ret->hdr.crls.enumContext = CRYPT_ProvEnumCRL; ret->hdr.crls.deleteContext = CRYPT_ProvDeleteCRL; + ret->hdr.ctls.addContext = CRYPT_ProvAddCTL; + ret->hdr.ctls.enumContext = CRYPT_ProvEnumCTL; + ret->hdr.ctls.deleteContext = CRYPT_ProvDeleteCTL; ret->hdr.control = CRYPT_ProvControl; if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CLOSE_FUNC) ret->provCloseStore = @@ -248,6 +320,18 @@ PWINECRYPT_CERTSTORE CRYPT_ProvCreateStore(DWORD dwFlags, else ret->provDeleteCrl = NULL; if (pProvInfo->cStoreProvFunc > + CERT_STORE_PROV_WRITE_CTL_FUNC) + ret->provWriteCtl = pProvInfo->rgpvStoreProvFunc[ + CERT_STORE_PROV_WRITE_CTL_FUNC]; + else + ret->provWriteCtl = NULL; + if (pProvInfo->cStoreProvFunc > + CERT_STORE_PROV_DELETE_CTL_FUNC) + ret->provDeleteCtl = pProvInfo->rgpvStoreProvFunc[ + CERT_STORE_PROV_DELETE_CTL_FUNC]; + else + ret->provDeleteCtl = NULL; + if (pProvInfo->cStoreProvFunc > CERT_STORE_PROV_CONTROL_FUNC) ret->provControl = pProvInfo->rgpvStoreProvFunc[ CERT_STORE_PROV_CONTROL_FUNC]; diff --git a/dlls/crypt32/regstore.c b/dlls/crypt32/regstore.c index 35928b8960a..5574a5e42dc 100644 --- a/dlls/crypt32/regstore.c +++ b/dlls/crypt32/regstore.c @@ -43,6 +43,7 @@ typedef struct _WINE_REGSTOREINFO CRITICAL_SECTION cs; struct list certsToDelete; struct list crlsToDelete; + struct list ctlsToDelete; } WINE_REGSTOREINFO, *PWINE_REGSTOREINFO; static void CRYPT_HashToStr(const BYTE *hash, LPWSTR asciiHash) @@ -251,7 +252,7 @@ static BOOL CRYPT_RegWriteToReg(PWINE_REGSTOREINFO store) const WINE_CONTEXT_INTERFACE * const interfaces[] = { pCertInterface, pCRLInterface, pCTLInterface }; struct list *listToDelete[] = { &store->certsToDelete, &store->crlsToDelete, - NULL }; + &store->ctlsToDelete }; BOOL ret = TRUE; DWORD i; @@ -430,6 +431,27 @@ static BOOL WINAPI CRYPT_RegDeleteCRL(HCERTSTORE hCertStore, pCRLInterface); } +static BOOL WINAPI CRYPT_RegWriteCTL(HCERTSTORE hCertStore, + PCCTL_CONTEXT ctl, DWORD dwFlags) +{ + PWINE_REGSTOREINFO store = (PWINE_REGSTOREINFO)hCertStore; + + TRACE("(%p, %p, %d)\n", hCertStore, ctl, dwFlags); + + return CRYPT_RegWriteContext(store, ctl, dwFlags); +} + +static BOOL WINAPI CRYPT_RegDeleteCTL(HCERTSTORE hCertStore, + PCCTL_CONTEXT pCtlContext, DWORD dwFlags) +{ + PWINE_REGSTOREINFO store = (PWINE_REGSTOREINFO)hCertStore; + + TRACE("(%p, %p, %08x)\n", store, pCtlContext, dwFlags); + + return CRYPT_RegDeleteContext(store, &store->ctlsToDelete, pCtlContext, + pCTLInterface); +} + static BOOL WINAPI CRYPT_RegControl(HCERTSTORE hCertStore, DWORD dwFlags, DWORD dwCtrlType, void const *pvCtrlPara) { @@ -475,8 +497,8 @@ static void *regProvFuncs[] = { CRYPT_RegDeleteCRL, NULL, /* CERT_STORE_PROV_SET_CRL_PROPERTY_FUNC */ NULL, /* CERT_STORE_PROV_READ_CTL_FUNC */ - NULL, /* CERT_STORE_PROV_WRITE_CTL_FUNC */ - NULL, /* CERT_STORE_PROV_DELETE_CTL_FUNC */ + CRYPT_RegWriteCTL, + CRYPT_RegDeleteCTL, NULL, /* CERT_STORE_PROV_SET_CTL_PROPERTY_FUNC */ CRYPT_RegControl, }; @@ -529,6 +551,7 @@ PWINECRYPT_CERTSTORE CRYPT_RegOpenStore(HCRYPTPROV hCryptProv, DWORD dwFlags, regInfo->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PWINE_REGSTOREINFO->cs"); list_init(®Info->certsToDelete); list_init(®Info->crlsToDelete); + list_init(®Info->ctlsToDelete); CRYPT_RegReadFromReg(regInfo->key, regInfo->memStore); regInfo->dirty = FALSE; provInfo.cbSize = sizeof(provInfo); diff --git a/dlls/crypt32/store.c b/dlls/crypt32/store.c index 9534e5c2d3a..6d9177e9931 100644 --- a/dlls/crypt32/store.c +++ b/dlls/crypt32/store.c @@ -91,6 +91,7 @@ typedef struct _WINE_MEMSTORE WINECRYPT_CERTSTORE hdr; struct ContextList *certs; struct ContextList *crls; + struct ContextList *ctls; } WINE_MEMSTORE, *PWINE_MEMSTORE; void CRYPT_InitStore(WINECRYPT_CERTSTORE *store, DWORD dwFlags, @@ -229,6 +230,47 @@ static BOOL CRYPT_MemDeleteCrl(PWINECRYPT_CERTSTORE store, void *pCrlContext) return TRUE; } +static BOOL CRYPT_MemAddCtl(PWINECRYPT_CERTSTORE store, void *ctl, + void *toReplace, const void **ppStoreContext) +{ + WINE_MEMSTORE *ms = (WINE_MEMSTORE *)store; + PCTL_CONTEXT context; + + TRACE("(%p, %p, %p, %p)\n", store, ctl, toReplace, ppStoreContext); + + context = (PCTL_CONTEXT)ContextList_Add(ms->ctls, ctl, toReplace); + if (context) + { + context->hCertStore = store; + if (ppStoreContext) + *ppStoreContext = CertDuplicateCTLContext(context); + } + return context ? TRUE : FALSE; +} + +static void *CRYPT_MemEnumCtl(PWINECRYPT_CERTSTORE store, void *pPrev) +{ + WINE_MEMSTORE *ms = (WINE_MEMSTORE *)store; + void *ret; + + TRACE("(%p, %p)\n", store, pPrev); + + ret = ContextList_Enum(ms->ctls, pPrev); + if (!ret) + SetLastError(CRYPT_E_NOT_FOUND); + + TRACE("returning %p\n", ret); + return ret; +} + +static BOOL CRYPT_MemDeleteCtl(PWINECRYPT_CERTSTORE store, void *pCtlContext) +{ + WINE_MEMSTORE *ms = (WINE_MEMSTORE *)store; + + ContextList_Delete(ms->ctls, pCtlContext); + return TRUE; +} + static void WINAPI CRYPT_MemCloseStore(HCERTSTORE hCertStore, DWORD dwFlags) { WINE_MEMSTORE *store = (WINE_MEMSTORE *)hCertStore; @@ -239,6 +281,7 @@ static void WINAPI CRYPT_MemCloseStore(HCERTSTORE hCertStore, DWORD dwFlags) ContextList_Free(store->certs); ContextList_Free(store->crls); + ContextList_Free(store->ctls); CRYPT_FreeStore((PWINECRYPT_CERTSTORE)store); } @@ -268,11 +311,16 @@ static WINECRYPT_CERTSTORE *CRYPT_MemOpenStore(HCRYPTPROV hCryptProv, store->hdr.crls.addContext = CRYPT_MemAddCrl; store->hdr.crls.enumContext = CRYPT_MemEnumCrl; store->hdr.crls.deleteContext = CRYPT_MemDeleteCrl; + store->hdr.ctls.addContext = CRYPT_MemAddCtl; + store->hdr.ctls.enumContext = CRYPT_MemEnumCtl; + store->hdr.ctls.deleteContext = CRYPT_MemDeleteCtl; store->hdr.control = NULL; store->certs = ContextList_Create(pCertInterface, sizeof(CERT_CONTEXT)); store->crls = ContextList_Create(pCRLInterface, sizeof(CRL_CONTEXT)); + store->ctls = ContextList_Create(pCTLInterface, + sizeof(CTL_CONTEXT)); /* Mem store doesn't need crypto provider, so close it */ if (hCryptProv && !(dwFlags & CERT_STORE_NO_CRYPT_RELEASE_FLAG)) CryptReleaseContext(hCryptProv, 0); @@ -1043,58 +1091,6 @@ PCCRL_CONTEXT WINAPI CertEnumCRLsInStore(HCERTSTORE hCertStore, return ret; } -PCCTL_CONTEXT WINAPI CertCreateCTLContext(DWORD dwCertEncodingType, - const BYTE* pbCtlEncoded, DWORD cbCtlEncoded) -{ - FIXME("(%08x, %p, %08x): stub\n", dwCertEncodingType, pbCtlEncoded, - cbCtlEncoded); - return NULL; -} - -BOOL WINAPI CertAddEncodedCTLToStore(HCERTSTORE hCertStore, - DWORD dwMsgAndCertEncodingType, const BYTE *pbCtlEncoded, DWORD cbCtlEncoded, - DWORD dwAddDisposition, PCCTL_CONTEXT *ppCtlContext) -{ - FIXME("(%p, %08x, %p, %d, %08x, %p): stub\n", hCertStore, - dwMsgAndCertEncodingType, pbCtlEncoded, cbCtlEncoded, dwAddDisposition, - ppCtlContext); - return FALSE; -} - -BOOL WINAPI CertAddCTLContextToStore(HCERTSTORE hCertStore, - PCCTL_CONTEXT pCtlContext, DWORD dwAddDisposition, - PCCTL_CONTEXT* ppStoreContext) -{ - FIXME("(%p, %p, %08x, %p): stub\n", hCertStore, pCtlContext, - dwAddDisposition, ppStoreContext); - return TRUE; -} - -PCCTL_CONTEXT WINAPI CertDuplicateCTLContext(PCCTL_CONTEXT pCtlContext) -{ - FIXME("(%p): stub\n", pCtlContext ); - return pCtlContext; -} - -BOOL WINAPI CertFreeCTLContext(PCCTL_CONTEXT pCtlContext) -{ - FIXME("(%p): stub\n", pCtlContext ); - return TRUE; -} - -BOOL WINAPI CertDeleteCTLFromStore(PCCTL_CONTEXT pCtlContext) -{ - FIXME("(%p): stub\n", pCtlContext); - return TRUE; -} - -PCCTL_CONTEXT WINAPI CertEnumCTLsInStore(HCERTSTORE hCertStore, - PCCTL_CONTEXT pPrev) -{ - FIXME("(%p, %p): stub\n", hCertStore, pPrev); - return NULL; -} - HCERTSTORE WINAPI CertDuplicateStore(HCERTSTORE hCertStore) { WINECRYPT_CERTSTORE *hcs = (WINECRYPT_CERTSTORE *)hCertStore; @@ -1248,28 +1244,6 @@ BOOL WINAPI CertSetStoreProperty(HCERTSTORE hCertStore, DWORD dwPropId, return ret; } -DWORD WINAPI CertEnumCTLContextProperties(PCCTL_CONTEXT pCTLContext, - DWORD dwPropId) -{ - FIXME("(%p, %d): stub\n", pCTLContext, dwPropId); - return 0; -} - -BOOL WINAPI CertGetCTLContextProperty(PCCTL_CONTEXT pCTLContext, - DWORD dwPropId, void *pvData, DWORD *pcbData) -{ - FIXME("(%p, %d, %p, %p): stub\n", pCTLContext, dwPropId, pvData, pcbData); - return FALSE; -} - -BOOL WINAPI CertSetCTLContextProperty(PCCTL_CONTEXT pCTLContext, - DWORD dwPropId, DWORD dwFlags, const void *pvData) -{ - FIXME("(%p, %d, %08x, %p): stub\n", pCTLContext, dwPropId, dwFlags, - pvData); - return FALSE; -} - static LONG CRYPT_OpenParentStore(DWORD dwFlags, void *pvSystemStoreLocationPara, HKEY *key) { diff --git a/dlls/crypt32/tests/Makefile.in b/dlls/crypt32/tests/Makefile.in index 07f0daec822..d02912fac99 100644 --- a/dlls/crypt32/tests/Makefile.in +++ b/dlls/crypt32/tests/Makefile.in @@ -10,6 +10,7 @@ CTESTS = \ cert.c \ chain.c \ crl.c \ + ctl.c \ encode.c \ main.c \ message.c \ diff --git a/dlls/crypt32/tests/cert.c b/dlls/crypt32/tests/cert.c index cd0808aa3ae..b4f876036e9 100644 --- a/dlls/crypt32/tests/cert.c +++ b/dlls/crypt32/tests/cert.c @@ -513,7 +513,8 @@ static void testCertProperties(void) CERT_SIGNATURE_HASH_PROP_ID, NULL, &size); ok(!ret && (GetLastError() == CRYPT_E_ASN1_BADTAG || - GetLastError() == CRYPT_E_NOT_FOUND), + GetLastError() == CRYPT_E_NOT_FOUND || + GetLastError() == OSS_DATA_ERROR), /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); /* Test key contexts and handles and such */ @@ -1815,7 +1816,9 @@ static void testSignAndEncodeCert(void) */ ret = CryptSignAndEncodeCertificate(0, 0, X509_ASN_ENCODING, X509_CERT_TO_BE_SIGNED, &info, &algID, NULL, NULL, &size); - ok(!ret && GetLastError() == NTE_BAD_ALGID, + ok(!ret && + (GetLastError() == NTE_BAD_ALGID || + GetLastError() == OSS_BAD_PTR), /* win9x */ "Expected NTE_BAD_ALGID, got %08x\n", GetLastError()); algID.pszObjId = oid_rsa_md5rsa; ret = CryptSignAndEncodeCertificate(0, 0, X509_ASN_ENCODING, @@ -2625,19 +2628,25 @@ static void testHashToBeSigned(void) "expected ERROR_FILE_NOT_FOUND, got %d\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, NULL, 0, NULL, &size); - ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG), /* win9x */ "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); /* Can't sign anything: has to be asn.1 encoded, at least */ SetLastError(0xdeadbeef); ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, int1, sizeof(int1), NULL, &size); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_MORE_INPUT), /* win9x */ "expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); /* Can't be empty, either */ SetLastError(0xdeadbeef); ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, emptyCert, sizeof(emptyCert), NULL, &size); - ok(!ret && GetLastError() == CRYPT_E_ASN1_CORRUPT, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_CORRUPT || + GetLastError() == OSS_DATA_ERROR), /* win9x */ "expected CRYPT_E_ASN1_CORRUPT, got %08x\n", GetLastError()); /* Signing a cert works */ ret = CryptHashToBeSigned(0, X509_ASN_ENCODING, md5SignedEmptyCert, @@ -3021,7 +3030,9 @@ static void testGetPublicKeyLength(void) ret, GetLastError()); SetLastError(0xdeadbeef); ret = CertGetPublicKeyLength(X509_ASN_ENCODING, &info); - ok(ret == 0 && GetLastError() == CRYPT_E_ASN1_EOD, + ok(ret == 0 && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG), /* win9x */ "Expected length 0 and CRYPT_E_ASN1_EOD, got length %d, %08x\n", ret, GetLastError()); /* With a nearly-empty public key info */ @@ -3033,7 +3044,9 @@ static void testGetPublicKeyLength(void) ret, GetLastError()); SetLastError(0xdeadbeef); ret = CertGetPublicKeyLength(X509_ASN_ENCODING, &info); - ok(ret == 0 && GetLastError() == CRYPT_E_ASN1_EOD, + ok(ret == 0 && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG), /* win9x */ "Expected length 0 and CRYPT_E_ASN1_EOD, got length %d, %08x\n", ret, GetLastError()); /* With a bogus key */ @@ -3046,7 +3059,9 @@ static void testGetPublicKeyLength(void) ret, GetLastError()); SetLastError(0xdeadbeef); ret = CertGetPublicKeyLength(X509_ASN_ENCODING, &info); - ok(ret == 0 && GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(ret == 0 && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH), /* win9x */ "Expected length 0 and CRYPT_E_ASN1_BADTAGTAG, got length %d, %08x\n", ret, GetLastError()); /* With a believable RSA key but a bogus OID */ @@ -3065,7 +3080,9 @@ static void testGetPublicKeyLength(void) info.Algorithm.pszObjId = oid_rsa_dh; SetLastError(0xdeadbeef); ret = CertGetPublicKeyLength(X509_ASN_ENCODING, &info); - ok(ret == 0 && GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(ret == 0 && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == E_INVALIDARG), /* win9x */ "Expected length 0 and CRYPT_E_ASN1_BADTAG, got length %d, %08x\n", ret, GetLastError()); /* With the RSA OID */ diff --git a/dlls/crypt32/tests/chain.c b/dlls/crypt32/tests/chain.c index 5bae989367a..ccb4cfc2afe 100644 --- a/dlls/crypt32/tests/chain.c +++ b/dlls/crypt32/tests/chain.c @@ -1579,9 +1579,13 @@ static void testGetCertChain(void) DWORD i; /* Basic parameter checks */ - ret = pCertGetCertificateChain(NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %08x\n", GetLastError()); + if (0) + { + /* Crash on Vista */ + ret = pCertGetCertificateChain(NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08x\n", GetLastError()); + } ret = pCertGetCertificateChain(NULL, NULL, NULL, NULL, NULL, 0, NULL, &chain); ok(!ret && GetLastError() == E_INVALIDARG, @@ -1593,9 +1597,13 @@ static void testGetCertChain(void) */ cert = CertCreateCertificateContext(X509_ASN_ENCODING, bigCert, sizeof(bigCert)); - ret = pCertGetCertificateChain(NULL, cert, NULL, NULL, NULL, 0, NULL, NULL); - ok(!ret && GetLastError() == E_INVALIDARG, - "Expected E_INVALIDARG, got %08x\n", GetLastError()); + if (0) + { + /* Crash on Vista */ + ret = pCertGetCertificateChain(NULL, cert, NULL, NULL, NULL, 0, NULL, NULL); + ok(!ret && GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08x\n", GetLastError()); + } /* Crash ret = pCertGetCertificateChain(NULL, cert, NULL, NULL, ¶, 0, NULL, NULL); */ diff --git a/dlls/crypt32/tests/ctl.c b/dlls/crypt32/tests/ctl.c new file mode 100644 index 00000000000..d8c4a62599f --- /dev/null +++ b/dlls/crypt32/tests/ctl.c @@ -0,0 +1,422 @@ +/* + * crypt32 CTL functions tests + * + * Copyright 2008 Juan Lang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "wine/test.h" + +static const BYTE emptyCTL[] = { +0x30,0x17,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00 }; +static const BYTE ctlWithOneEntry[] = { +0x30,0x2a,0x30,0x00,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30, +0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00,0x30,0x11,0x30,0x0f,0x04, +0x01,0x01,0x31,0x0a,0x30,0x08,0x06,0x02,0x2a,0x03,0x31,0x02,0x30,0x00 }; +static const BYTE signedCTL[] = { +0x30,0x81,0xc7,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xb9,0x30,0x81,0xb6,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x28,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x1b,0x04,0x19,0x30,0x17,0x30,0x00, +0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x30,0x02,0x06,0x00,0x31,0x77,0x30,0x75,0x02,0x01,0x01,0x30,0x1a, +0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75, +0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x04,0x06,0x00,0x05, +0x00,0x04,0x40,0xca,0xd8,0x32,0xd1,0xbd,0x97,0x61,0x54,0xd6,0x80,0xcf,0x0d, +0xbd,0xa2,0x42,0xc7,0xca,0x37,0x91,0x7d,0x9d,0xac,0x8c,0xdf,0x05,0x8a,0x39, +0xc6,0x07,0xc1,0x37,0xe6,0xb9,0xd1,0x0d,0x26,0xec,0xa5,0xb0,0x8a,0x51,0x26, +0x2b,0x4f,0x73,0x44,0x86,0x83,0x5e,0x2b,0x6e,0xcc,0xf8,0x1b,0x85,0x53,0xe9, +0x7a,0x80,0x8f,0x6b,0x42,0x19,0x93 }; +static const BYTE signedCTLWithSubjectAlgorithm[] = { +0x30,0x81,0xd1,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0, +0x81,0xc3,0x30,0x81,0xc0,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08,0x2a, +0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x32,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x07,0x01,0xa0,0x25,0x04,0x23,0x30,0x21,0x30,0x00, +0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05, +0x00,0x31,0x77,0x30,0x75,0x02,0x01,0x01,0x30,0x1a,0x30,0x15,0x31,0x13,0x30, +0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61, +0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7, +0x0d,0x02,0x05,0x05,0x00,0x30,0x04,0x06,0x00,0x05,0x00,0x04,0x40,0xca,0x7a, +0xfa,0xbf,0x44,0x36,0xfd,0xb2,0x84,0x70,0x0f,0xf5,0x66,0xcb,0x68,0xdb,0x45, +0x74,0xa1,0xed,0xe3,0x30,0x4a,0x11,0xd2,0x7b,0xf5,0xa9,0x68,0x8d,0x36,0xe8, +0x79,0xff,0xa2,0xf2,0x4c,0x8a,0xa9,0x65,0x03,0xf8,0x77,0xa5,0x01,0xd3,0x46, +0x8a,0xcc,0x93,0x36,0x30,0xe1,0xa4,0x47,0x70,0x3d,0xb3,0x97,0xfc,0x6d,0x24, +0xe9,0xf9 }; +static const BYTE signedCTLWithCTLInnerContent[] = { +0x30,0x82,0x01,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x00,0x30,0x81,0xfd,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06, +0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x30,0x06,0x09, +0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0xa0,0x23,0x30,0x21,0x30,0x00, +0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05, +0x00,0x31,0x81,0xb5,0x30,0x81,0xb2,0x02,0x01,0x01,0x30,0x1a,0x30,0x15,0x31, +0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20, +0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48, +0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0xa0,0x3b,0x30,0x18,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0b,0x06,0x09,0x2b,0x06,0x01,0x04, +0x01,0x82,0x37,0x0a,0x01,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x01,0x09,0x04,0x31,0x12,0x04,0x10,0x54,0x71,0xbc,0xe1,0x56,0x31,0xa2,0xf9, +0x65,0x70,0x34,0xf8,0xe2,0xe9,0xb4,0xf4,0x30,0x04,0x06,0x00,0x05,0x00,0x04, +0x40,0x2f,0x1b,0x9f,0x5a,0x4a,0x15,0x73,0xfa,0xb1,0x93,0x3d,0x09,0x52,0xdf, +0x6b,0x98,0x4b,0x13,0x5e,0xe7,0xbf,0x65,0xf4,0x9c,0xc2,0xb1,0x77,0x09,0xb1, +0x66,0x4d,0x72,0x0d,0xb1,0x1a,0x50,0x20,0xe0,0x57,0xa2,0x39,0xc7,0xcd,0x7f, +0x8e,0xe7,0x5f,0x76,0x2b,0xd1,0x6a,0x82,0xb3,0x30,0x25,0x61,0xf6,0x25,0x23, +0x57,0x6c,0x0b,0x47,0xb8 }; +static const BYTE signedCTLWithCTLInnerContentAndBadSig[] = { +0x30,0x82,0x01,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x00,0x30,0x81,0xfd,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06, +0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x30,0x06,0x09, +0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0xa0,0x23,0x30,0x21,0x30,0x00, +0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30, +0x30,0x5a,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05, +0x00,0x31,0x81,0xb5,0x30,0x81,0xb2,0x02,0x01,0x01,0x30,0x1a,0x30,0x15,0x31, +0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20, +0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48, +0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0xa0,0x3b,0x30,0x18,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0b,0x06,0x09,0x2b,0x06,0x01,0x04, +0x01,0x82,0x37,0x0a,0x01,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x01,0x09,0x04,0x31,0x12,0x04,0x10,0x54,0x71,0xbc,0xe1,0x56,0x31,0xa2,0xf9, +0x65,0x70,0x34,0xf8,0xe2,0xe9,0xb4,0xf4,0x30,0x04,0x06,0x00,0x05,0x00,0x04, +0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff }; + +static void testCreateCTL(void) +{ + PCCTL_CONTEXT ctl; + + SetLastError(0xdeadbeef); + ctl = CertCreateCTLContext(0, NULL, 0); + ok(!ctl && GetLastError() == E_INVALIDARG, + "expected E_INVALIDARG, got %08x\n", GetLastError()); + SetLastError(0xdeadbeef); + ctl = CertCreateCTLContext(X509_ASN_ENCODING, NULL, 0); + ok(!ctl && + (GetLastError() == ERROR_INVALID_DATA || + GetLastError() == OSS_MORE_INPUT), /* win9x */ + "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError()); + /* An empty CTL can't be created.. */ + SetLastError(0xdeadbeef); + ctl = CertCreateCTLContext(X509_ASN_ENCODING, emptyCTL, sizeof(emptyCTL)); + ok(!ctl && + (GetLastError() == ERROR_INVALID_DATA || + GetLastError() == OSS_DATA_ERROR), /* win9x */ + "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError()); + /* Nor can any of these "signed" CTLs whose inner content OID isn't + * szOID_CTL. + */ + SetLastError(0xdeadbeef); + ctl = CertCreateCTLContext(X509_ASN_ENCODING, signedCTL, sizeof(signedCTL)); + ok(!ctl && + (GetLastError() == ERROR_INVALID_DATA || + GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE), /* win9x */ + "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError()); + SetLastError(0xdeadbeef); + ctl = CertCreateCTLContext(X509_ASN_ENCODING, ctlWithOneEntry, + sizeof(ctlWithOneEntry)); + ok(!ctl && + (GetLastError() == ERROR_INVALID_DATA || + GetLastError() == OSS_DATA_ERROR), /* win9x */ + "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError()); + SetLastError(0xdeadbeef); + ctl = CertCreateCTLContext(X509_ASN_ENCODING, + signedCTLWithSubjectAlgorithm, sizeof(signedCTLWithSubjectAlgorithm)); + ok(!ctl && + (GetLastError() == ERROR_INVALID_DATA || + GetLastError() == CRYPT_E_UNEXPECTED_MSG_TYPE), /* win9x */ + "expected ERROR_INVALID_DATA, got %d (0x%08x)\n", GetLastError(), + GetLastError()); + /* This signed CTL with the appropriate inner content type can be decoded. + */ + ctl = CertCreateCTLContext(X509_ASN_ENCODING, + signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent)); + ok(ctl != NULL, "CertCreateCTLContext failed: %08x\n", GetLastError()); + if (ctl) + { + /* Even though the CTL was decoded with X509_ASN_ENCODING, the + * message encoding type is included in the CTL's encoding type. + */ + ok(ctl->dwMsgAndCertEncodingType == + (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING), + "expected X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, got %08x\n", + ctl->dwMsgAndCertEncodingType); + CertFreeCTLContext(ctl); + } + /* This CTL with a bad signature can also be decoded, so the sig isn't + * checked when loading the CTL. + */ + ctl = CertCreateCTLContext(X509_ASN_ENCODING, + signedCTLWithCTLInnerContentAndBadSig, + sizeof(signedCTLWithCTLInnerContentAndBadSig)); + ok(ctl != NULL, "CertCreateCTLContext failed: %08x\n", GetLastError()); + if (ctl) + CertFreeCTLContext(ctl); +} + +static void checkHash(const BYTE *data, DWORD dataLen, ALG_ID algID, + PCCTL_CONTEXT context, DWORD propID) +{ + BYTE hash[20] = { 0 }, hashProperty[20]; + BOOL ret; + DWORD size; + + memset(hash, 0, sizeof(hash)); + memset(hashProperty, 0, sizeof(hashProperty)); + size = sizeof(hash); + ret = CryptHashCertificate(0, algID, 0, data, dataLen, hash, &size); + ret = CertGetCTLContextProperty(context, propID, hashProperty, &size); + ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); + if (ret) + ok(!memcmp(hash, hashProperty, size), + "Unexpected hash for property %d\n", propID); +} + +static void testCTLProperties(void) +{ + PCCTL_CONTEXT ctl; + BOOL ret; + DWORD propID, numProps, access, size; + + ctl = CertCreateCTLContext(X509_ASN_ENCODING, + signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent)); + if (!ctl) + { + skip("CertCreateCTLContext failed: %08x\n", GetLastError()); + return; + } + + /* No properties as yet */ + propID = 0; + numProps = 0; + do { + propID = CertEnumCTLContextProperties(ctl, propID); + if (propID) + numProps++; + } while (propID != 0); + ok(numProps == 0, "Expected 0 properties, got %d\n", numProps); + + /* An implicit property */ + ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, NULL, + &size); + ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); + ret = CertGetCTLContextProperty(ctl, CERT_ACCESS_STATE_PROP_ID, &access, + &size); + ok(ret, "CertGetCTLContextProperty failed: %08x\n", GetLastError()); + ok(!(access & CERT_ACCESS_STATE_WRITE_PERSIST_FLAG), + "Didn't expect a persisted cert\n"); + + checkHash(signedCTLWithCTLInnerContent, + sizeof(signedCTLWithCTLInnerContent), CALG_SHA1, ctl, CERT_HASH_PROP_ID); + + /* Now that the hash property is set, we should get one property when + * enumerating. + */ + propID = 0; + numProps = 0; + do { + propID = CertEnumCTLContextProperties(ctl, propID); + if (propID) + numProps++; + } while (propID != 0); + ok(numProps == 1, "Expected 1 properties, got %d\n", numProps); + + checkHash(signedCTLWithCTLInnerContent, + sizeof(signedCTLWithCTLInnerContent), CALG_MD5, ctl, + CERT_MD5_HASH_PROP_ID); + + CertFreeCTLContext(ctl); +} + +static const BYTE signedCTLWithUsage[] = { +0x30,0x82,0x01,0x0f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x82,0x01,0x00,0x30,0x81,0xfd,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06, +0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x30,0x06,0x09, +0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0xa0,0x23,0x30,0x21,0x30,0x0a, +0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x18,0x0f,0x31,0x36,0x30, +0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5a,0x30,0x02,0x06, +0x00,0x31,0x81,0xb5,0x30,0x81,0xb2,0x02,0x01,0x01,0x30,0x1a,0x30,0x15,0x31, +0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20, +0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01,0x30,0x0c,0x06,0x08,0x2a,0x86,0x48, +0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0xa0,0x3b,0x30,0x18,0x06,0x09,0x2a,0x86, +0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0b,0x06,0x09,0x2b,0x06,0x01,0x04, +0x01,0x82,0x37,0x0a,0x01,0x30,0x1f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d, +0x01,0x09,0x04,0x31,0x12,0x04,0x10,0xc4,0x3e,0x7e,0xc8,0xf9,0x85,0xf3,0x27, +0x7d,0xc0,0x38,0xb2,0x7f,0xc7,0x76,0x85,0x30,0x04,0x06,0x00,0x05,0x00,0x04, +0x40,0x90,0x33,0x1b,0xb4,0x88,0x35,0xe6,0xf7,0x7f,0x93,0x05,0xc9,0x1a,0x0e, +0x8f,0x21,0xc0,0xaa,0xb3,0xab,0x3e,0x4a,0xa6,0x63,0x74,0xfd,0xef,0x11,0xbd, +0x67,0x3a,0x1b,0x07,0x4b,0x88,0x59,0x31,0xd5,0x08,0xf9,0x09,0x2f,0x0b,0x85, +0x62,0x5a,0x67,0x3b,0x62,0x7e,0x81,0x31,0xea,0xa4,0x36,0x5f,0x9a,0x92,0xb6, +0x66,0xa5,0x00,0x60,0x96 }; +static const BYTE signedCTLWithListID1[] = { +0x30,0x82,0x01,0x07,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x81,0xf9,0x30,0x81,0xf6,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x29,0x06,0x09,0x2b, +0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0xa0,0x1c,0x30,0x1a,0x30,0x00,0x04, +0x01,0x01,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00,0x31,0x81,0xb5,0x30,0x81,0xb2,0x02, +0x01,0x01,0x30,0x1a,0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03, +0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01, +0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0xa0, +0x3b,0x30,0x18,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31, +0x0b,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0x30,0x1f,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x12,0x04,0x10,0xbc, +0x13,0xde,0x17,0xc7,0x7c,0x67,0x5b,0xf9,0xa9,0x7c,0xb0,0xd9,0xf2,0x84,0xd5, +0x30,0x04,0x06,0x00,0x05,0x00,0x04,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }; +static const BYTE signedCTLWithListID2[] = { +0x30,0x82,0x01,0x07,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02, +0xa0,0x81,0xf9,0x30,0x81,0xf6,0x02,0x01,0x01,0x31,0x0e,0x30,0x0c,0x06,0x08, +0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0x30,0x29,0x06,0x09,0x2b, +0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0xa0,0x1c,0x30,0x1a,0x30,0x00,0x04, +0x01,0x02,0x18,0x0f,0x31,0x36,0x30,0x31,0x30,0x31,0x30,0x31,0x30,0x30,0x30, +0x30,0x30,0x30,0x5a,0x30,0x02,0x06,0x00,0x31,0x81,0xb5,0x30,0x81,0xb2,0x02, +0x01,0x01,0x30,0x1a,0x30,0x15,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03, +0x13,0x0a,0x4a,0x75,0x61,0x6e,0x20,0x4c,0x61,0x6e,0x67,0x00,0x02,0x01,0x01, +0x30,0x0c,0x06,0x08,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x02,0x05,0x05,0x00,0xa0, +0x3b,0x30,0x18,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31, +0x0b,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x0a,0x01,0x30,0x1f,0x06, +0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x12,0x04,0x10,0x60, +0x6b,0x10,0xb6,0xb8,0x74,0xb8,0xf3,0x79,0xd5,0x42,0x15,0x4a,0x60,0x93,0x1f, +0x30,0x04,0x06,0x00,0x05,0x00,0x04,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff }; + +static void testAddCTLToStore(void) +{ + HCERTSTORE store; + BOOL ret; + DWORD numCTLs; + PCCTL_CONTEXT ctl; + + store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + /* Add two CTLs */ + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), + CERT_STORE_ADD_ALWAYS, NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithCTLInnerContentAndBadSig, + sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_ALWAYS, + NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + /* Check that two exist */ + numCTLs = 0; + ctl = NULL; + do { + ctl = CertEnumCTLsInStore(store, ctl); + if (ctl) + numCTLs++; + } while (ctl); + ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); + CertCloseStore(store, 0); + + store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + /* Add the two CTLs again. They're identical except for the signature.. */ + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), + CERT_STORE_ADD_NEW, NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + /* so adding the second CTL fails. */ + SetLastError(0xdeadbeef); + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithCTLInnerContentAndBadSig, + sizeof(signedCTLWithCTLInnerContentAndBadSig), CERT_STORE_ADD_NEW, + NULL); + ok(!ret && + (GetLastError() == CRYPT_E_EXISTS || + GetLastError() == CRYPT_E_NOT_FOUND), /* win9x */ + "expected CRYPT_E_EXISTS, got %08x\n", GetLastError()); + CertCloseStore(store, 0); + + store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + /* Add two CTLs. These two have different usages, so they're considered + * different. + */ + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithCTLInnerContent, sizeof(signedCTLWithCTLInnerContent), + CERT_STORE_ADD_NEW, NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithUsage, sizeof(signedCTLWithUsage), CERT_STORE_ADD_NEW, + NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + /* Check that two exist */ + numCTLs = 0; + ctl = NULL; + do { + ctl = CertEnumCTLsInStore(store, ctl); + if (ctl) + numCTLs++; + } while (ctl); + ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); + CertCloseStore(store, 0); + + store = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, + CERT_STORE_CREATE_NEW_FLAG, NULL); + /* Add two CTLs. Now they have the same (empty) usages and different list + * IDs, so they're different. + */ + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithListID1, sizeof(signedCTLWithListID1), CERT_STORE_ADD_NEW, + NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + ret = CertAddEncodedCTLToStore(store, X509_ASN_ENCODING, + signedCTLWithListID2, sizeof(signedCTLWithListID2), CERT_STORE_ADD_NEW, + NULL); + ok(ret, "CertAddEncodedCTLToStore failed: %08x\n", GetLastError()); + /* Check that two exist */ + numCTLs = 0; + ctl = NULL; + do { + ctl = CertEnumCTLsInStore(store, ctl); + if (ctl) + numCTLs++; + } while (ctl); + ok(numCTLs == 2, "expected 2 CTLs, got %d\n", numCTLs); + CertCloseStore(store, 0); +} + +START_TEST(ctl) +{ + testCreateCTL(); + testCTLProperties(); + testAddCTLToStore(); +} diff --git a/dlls/crypt32/tests/encode.c b/dlls/crypt32/tests/encode.c index 2b2119c444c..5b4b332c612 100644 --- a/dlls/crypt32/tests/encode.c +++ b/dlls/crypt32/tests/encode.c @@ -4822,7 +4822,7 @@ static void test_encodeAuthorityInfoAccess(DWORD dwEncoding) ok(!ret && GetLastError() == E_INVALIDARG, "expected E_INVALIDARG, got %08x\n", GetLastError()); accessDescription[0].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; - accessDescription[0].AccessLocation.pwszURL = (LPWSTR)url; + U(accessDescription[0].AccessLocation).pwszURL = (LPWSTR)url; ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); ok(ret, "CryptEncodeObjectEx failed: %08x\n", GetLastError()); @@ -4838,9 +4838,9 @@ static void test_encodeAuthorityInfoAccess(DWORD dwEncoding) accessDescription[1].pszAccessMethod = oid2; accessDescription[1].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_IP_ADDRESS; - accessDescription[1].AccessLocation.IPAddress.cbData = + U(accessDescription[1].AccessLocation).IPAddress.cbData = sizeof(encodedIPAddr); - accessDescription[1].AccessLocation.IPAddress.pbData = + U(accessDescription[1].AccessLocation).IPAddress.pbData = (LPBYTE)encodedIPAddr; aia.cAccDescr = 2; ret = CryptEncodeObjectEx(dwEncoding, X509_AUTHORITY_INFO_ACCESS, &aia, @@ -4909,7 +4909,7 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) accessDescription.pszAccessMethod = oid1; accessDescription.AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; - accessDescription.AccessLocation.pwszURL = (LPWSTR)url; + U(accessDescription.AccessLocation).pwszURL = (LPWSTR)url; aia.cAccDescr = 1; aia.rgAccDescr = &accessDescription; compareAuthorityInfoAccess("AIA with URL", &aia, @@ -4929,13 +4929,13 @@ static void test_decodeAuthorityInfoAccess(DWORD dwEncoding) accessDescription[0].pszAccessMethod = oid1; accessDescription[0].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_URL; - accessDescription[0].AccessLocation.pwszURL = (LPWSTR)url; + U(accessDescription[0].AccessLocation).pwszURL = (LPWSTR)url; accessDescription[1].pszAccessMethod = oid2; accessDescription[1].AccessLocation.dwAltNameChoice = CERT_ALT_NAME_IP_ADDRESS; - accessDescription[1].AccessLocation.IPAddress.cbData = + U(accessDescription[1].AccessLocation).IPAddress.cbData = sizeof(encodedIPAddr); - accessDescription[1].AccessLocation.IPAddress.pbData = + U(accessDescription[1].AccessLocation).IPAddress.pbData = (LPBYTE)encodedIPAddr; aia.cAccDescr = 2; aia.rgAccDescr = accessDescription; @@ -6395,9 +6395,9 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) * the encoding must include PKCS_7_ASN_ENCODING. * (That isn't enough to be decoded, see decoding tests.) */ - info.SignerId.IssuerSerialNumber.Issuer.cbData = + U(info.SignerId).IssuerSerialNumber.Issuer.cbData = sizeof(encodedCommonNameNoNull); - info.SignerId.IssuerSerialNumber.Issuer.pbData = encodedCommonNameNoNull; + U(info.SignerId).IssuerSerialNumber.Issuer.pbData = encodedCommonNameNoNull; SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, CMS_SIGNER_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); @@ -6414,8 +6414,8 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) LocalFree(buf); } } - info.SignerId.IssuerSerialNumber.SerialNumber.cbData = sizeof(serialNum); - info.SignerId.IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum; + U(info.SignerId).IssuerSerialNumber.SerialNumber.cbData = sizeof(serialNum); + U(info.SignerId).IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum; SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, CMS_SIGNER_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); @@ -6434,8 +6434,8 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) } } info.SignerId.dwIdChoice = CERT_ID_KEY_IDENTIFIER; - info.SignerId.KeyId.cbData = sizeof(serialNum); - info.SignerId.KeyId.pbData = (BYTE *)serialNum; + U(info.SignerId).KeyId.cbData = sizeof(serialNum); + U(info.SignerId).KeyId.pbData = (BYTE *)serialNum; SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, CMS_SIGNER_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); @@ -6458,8 +6458,8 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) * (see RFC 3852, section 5.3.) */ info.SignerId.dwIdChoice = CERT_ID_SHA1_HASH; - info.SignerId.HashId.cbData = sizeof(hash); - info.SignerId.HashId.pbData = (BYTE *)hash; + U(info.SignerId).HashId.cbData = sizeof(hash); + U(info.SignerId).HashId.pbData = (BYTE *)hash; SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, CMS_SIGNER_INFO, &info, CRYPT_ENCODE_ALLOC_FLAG, NULL, (BYTE *)&buf, &size); @@ -6467,9 +6467,9 @@ static void test_encodeCMSSignerInfo(DWORD dwEncoding) "Expected E_INVALIDARG, got %08x\n", GetLastError()); /* Now with a hash algo */ info.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; - info.SignerId.IssuerSerialNumber.Issuer.cbData = + U(info.SignerId).IssuerSerialNumber.Issuer.cbData = sizeof(encodedCommonNameNoNull); - info.SignerId.IssuerSerialNumber.Issuer.pbData = encodedCommonNameNoNull; + U(info.SignerId).IssuerSerialNumber.Issuer.pbData = encodedCommonNameNoNull; info.HashAlgorithm.pszObjId = oid1; SetLastError(0xdeadbeef); ret = CryptEncodeObjectEx(dwEncoding, CMS_SIGNER_INFO, &info, @@ -6556,17 +6556,17 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) ok(info->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER, "Expected CERT_ID_ISSUER_SERIAL_NUMBER, got %d\n", info->SignerId.dwIdChoice); - ok(info->SignerId.IssuerSerialNumber.Issuer.cbData == + ok(U(info->SignerId).IssuerSerialNumber.Issuer.cbData == sizeof(encodedCommonNameNoNull), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.Issuer.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.Issuer.pbData, + U(info->SignerId).IssuerSerialNumber.Issuer.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.Issuer.pbData, encodedCommonNameNoNull, - info->SignerId.IssuerSerialNumber.Issuer.cbData), + U(info->SignerId).IssuerSerialNumber.Issuer.cbData), "Unexpected value\n"); - ok(info->SignerId.IssuerSerialNumber.SerialNumber.cbData == + ok(U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData == sizeof(serialNum), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.SerialNumber.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.SerialNumber.pbData, + U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.SerialNumber.pbData, serialNum, sizeof(serialNum)), "Unexpected value\n"); LocalFree(buf); } @@ -6582,17 +6582,17 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) ok(info->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER, "Expected CERT_ID_ISSUER_SERIAL_NUMBER, got %d\n", info->SignerId.dwIdChoice); - ok(info->SignerId.IssuerSerialNumber.Issuer.cbData == + ok(U(info->SignerId).IssuerSerialNumber.Issuer.cbData == sizeof(encodedCommonNameNoNull), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.Issuer.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.Issuer.pbData, + U(info->SignerId).IssuerSerialNumber.Issuer.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.Issuer.pbData, encodedCommonNameNoNull, - info->SignerId.IssuerSerialNumber.Issuer.cbData), + U(info->SignerId).IssuerSerialNumber.Issuer.cbData), "Unexpected value\n"); - ok(info->SignerId.IssuerSerialNumber.SerialNumber.cbData == + ok(U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData == sizeof(serialNum), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.SerialNumber.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.SerialNumber.pbData, + U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.SerialNumber.pbData, serialNum, sizeof(serialNum)), "Unexpected value\n"); ok(!strcmp(info->HashAlgorithm.pszObjId, oid1), "Expected %s, got %s\n", oid1, info->HashAlgorithm.pszObjId); @@ -6611,17 +6611,17 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) ok(info->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER, "Expected CERT_ID_ISSUER_SERIAL_NUMBER, got %d\n", info->SignerId.dwIdChoice); - ok(info->SignerId.IssuerSerialNumber.Issuer.cbData == + ok(U(info->SignerId).IssuerSerialNumber.Issuer.cbData == sizeof(encodedCommonNameNoNull), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.Issuer.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.Issuer.pbData, + U(info->SignerId).IssuerSerialNumber.Issuer.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.Issuer.pbData, encodedCommonNameNoNull, - info->SignerId.IssuerSerialNumber.Issuer.cbData), + U(info->SignerId).IssuerSerialNumber.Issuer.cbData), "Unexpected value\n"); - ok(info->SignerId.IssuerSerialNumber.SerialNumber.cbData == + ok(U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData == sizeof(serialNum), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.SerialNumber.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.SerialNumber.pbData, + U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.SerialNumber.pbData, serialNum, sizeof(serialNum)), "Unexpected value\n"); ok(!strcmp(info->HashAlgorithm.pszObjId, oid1), "Expected %s, got %s\n", oid1, info->HashAlgorithm.pszObjId); @@ -6641,17 +6641,17 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) ok(info->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER, "Expected CERT_ID_ISSUER_SERIAL_NUMBER, got %d\n", info->SignerId.dwIdChoice); - ok(info->SignerId.IssuerSerialNumber.Issuer.cbData == + ok(U(info->SignerId).IssuerSerialNumber.Issuer.cbData == sizeof(encodedCommonNameNoNull), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.Issuer.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.Issuer.pbData, + U(info->SignerId).IssuerSerialNumber.Issuer.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.Issuer.pbData, encodedCommonNameNoNull, - info->SignerId.IssuerSerialNumber.Issuer.cbData), + U(info->SignerId).IssuerSerialNumber.Issuer.cbData), "Unexpected value\n"); - ok(info->SignerId.IssuerSerialNumber.SerialNumber.cbData == + ok(U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData == sizeof(serialNum), "Unexpected size %d\n", - info->SignerId.IssuerSerialNumber.SerialNumber.cbData); - ok(!memcmp(info->SignerId.IssuerSerialNumber.SerialNumber.pbData, + U(info->SignerId).IssuerSerialNumber.SerialNumber.cbData); + ok(!memcmp(U(info->SignerId).IssuerSerialNumber.SerialNumber.pbData, serialNum, sizeof(serialNum)), "Unexpected value\n"); ok(!strcmp(info->HashAlgorithm.pszObjId, oid1), "Expected %s, got %s\n", oid1, info->HashAlgorithm.pszObjId); @@ -6675,9 +6675,9 @@ static void test_decodeCMSSignerInfo(DWORD dwEncoding) ok(info->SignerId.dwIdChoice == CERT_ID_KEY_IDENTIFIER, "Expected CERT_ID_KEY_IDENTIFIER, got %d\n", info->SignerId.dwIdChoice); - ok(info->SignerId.KeyId.cbData == sizeof(serialNum), - "Unexpected size %d\n", info->SignerId.KeyId.cbData); - ok(!memcmp(info->SignerId.KeyId.pbData, serialNum, sizeof(serialNum)), + ok(U(info->SignerId).KeyId.cbData == sizeof(serialNum), + "Unexpected size %d\n", U(info->SignerId).KeyId.cbData); + ok(!memcmp(U(info->SignerId).KeyId.pbData, serialNum, sizeof(serialNum)), "Unexpected value\n"); LocalFree(buf); } diff --git a/dlls/crypt32/tests/main.c b/dlls/crypt32/tests/main.c index 43c07bf1692..3d54b3b3e74 100644 --- a/dlls/crypt32/tests/main.c +++ b/dlls/crypt32/tests/main.c @@ -200,8 +200,7 @@ static void test_cryptAllocate(void) buf = CryptMemAlloc(0); ok(buf != NULL, "CryptMemAlloc failed: %08x\n", GetLastError()); CryptMemFree(buf); - buf = CryptMemRealloc(NULL, 0); - ok(!buf, "Expected NULL\n"); + /* CryptMemRealloc(NULL, 0) fails pre-Vista */ buf = CryptMemAlloc(0); buf = CryptMemRealloc(buf, 1); ok(buf != NULL, "CryptMemRealloc failed: %08x\n", GetLastError()); @@ -361,7 +360,9 @@ static void test_CryptInstallOssGlobal(void) for(i=0;i<30;i++) { ret = pI_CryptInstallOssGlobal(rand(),rand(),rand()); - ok((9+i) == ret,"Expected %d, got %d\n",(9+i),ret); + ok((9+i) == ret || + ret == 0, /* Vista */ + "Expected %d or 0, got %d\n",(9+i),ret); } } diff --git a/dlls/crypt32/tests/message.c b/dlls/crypt32/tests/message.c index 1072185ab90..d515d9b4049 100644 --- a/dlls/crypt32/tests/message.c +++ b/dlls/crypt32/tests/message.c @@ -59,13 +59,15 @@ static void test_msg_get_signer_count(void) SetLastError(0xdeadbeef); count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, NULL, 0); ok(count == -1, "Expected -1, got %d\n", count); - ok(GetLastError() == CRYPT_E_ASN1_EOD, + ok(GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG, /* win9x */ "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, dataEmptyBareContent, sizeof(dataEmptyBareContent)); ok(count == -1, "Expected -1, got %d\n", count); - ok(GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH, /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, @@ -77,11 +79,14 @@ static void test_msg_get_signer_count(void) count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, signedEmptyBareContent, sizeof(signedEmptyBareContent)); ok(count == -1, "Expected -1, got %d\n", count); - ok(GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR, /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); count = CryptGetMessageSignerCount(PKCS_7_ASN_ENCODING, signedEmptyContent, sizeof(signedEmptyContent)); - ok(count == 1, "Expected 1, got %d\n", count); + ok(count == 1 || + broken(count == -1), /* win9x */ + "Expected 1, got %d\n", count); } static BYTE detachedHashContent[] = { @@ -121,7 +126,9 @@ static void test_verify_detached_message_hash(void) SetLastError(0xdeadbeef); ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, NULL); - ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG), /* win9x */ "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); para.dwMsgEncodingType = X509_ASN_ENCODING; SetLastError(0xdeadbeef); @@ -133,7 +140,9 @@ static void test_verify_detached_message_hash(void) SetLastError(0xdeadbeef); ret = CryptVerifyDetachedMessageHash(¶, NULL, 0, 0, NULL, NULL, NULL, NULL); - ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG), /* win9x */ "expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); /* Curiously, passing no data to hash succeeds.. */ ret = CryptVerifyDetachedMessageHash(¶, detachedHashContent, @@ -282,7 +291,9 @@ static void test_verify_message_signature(void) para.cbSize = sizeof(para); SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, NULL, 0, NULL, 0, NULL); - ok(!ret && GetLastError() == CRYPT_E_ASN1_EOD, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_EOD || + GetLastError() == OSS_BAD_ARG), /* win9x */ "Expected CRYPT_E_ASN1_EOD, got %08x\n", GetLastError()); /* Check whether cert is set on error */ cert = (PCCERT_CONTEXT)0xdeadbeef; @@ -296,7 +307,8 @@ static void test_verify_message_signature(void) SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, dataEmptyBareContent, sizeof(dataEmptyBareContent), NULL, 0, NULL); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_PDU_MISMATCH, /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, dataEmptyContent, @@ -306,17 +318,23 @@ static void test_verify_message_signature(void) SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, signedEmptyBareContent, sizeof(signedEmptyBareContent), NULL, 0, NULL); - ok(!ret && GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(!ret && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR), /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, signedEmptyContent, sizeof(signedEmptyContent), NULL, 0, NULL); - ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND, + ok(!ret && + (GetLastError() == CRYPT_E_NOT_FOUND || + GetLastError() == OSS_DATA_ERROR), /* win9x */ "Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); SetLastError(0xdeadbeef); ret = CryptVerifyMessageSignature(¶, 0, signedContent, sizeof(signedContent), NULL, 0, NULL); - ok(!ret && GetLastError() == CRYPT_E_NOT_FOUND, + ok(!ret && + (GetLastError() == CRYPT_E_NOT_FOUND || + GetLastError() == OSS_DATA_ERROR), /* win9x */ "Expected CRYPT_E_NOT_FOUND, got %08x\n", GetLastError()); /* FIXME: Windows fails with CRYPT_E_NOT_FOUND for these messages, but * their signer certs have invalid public keys that fail to decode. In diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index aa969e1251a..2783815fdb6 100644 --- a/dlls/crypt32/tests/msg.c +++ b/dlls/crypt32/tests/msg.c @@ -1112,13 +1112,13 @@ static void test_signed_msg_open(void) certInfo.Issuer.cbData = 0; certInfo.SerialNumber.cbData = 0; signer.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; - signer.SignerId.IssuerSerialNumber.Issuer.cbData = + U(signer.SignerId).IssuerSerialNumber.Issuer.cbData = sizeof(encodedCommonName); - signer.SignerId.IssuerSerialNumber.Issuer.pbData = + U(signer.SignerId).IssuerSerialNumber.Issuer.pbData = (BYTE *)encodedCommonName; - signer.SignerId.IssuerSerialNumber.SerialNumber.cbData = + U(signer.SignerId).IssuerSerialNumber.SerialNumber.cbData = sizeof(serialNum); - signer.SignerId.IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum; + U(signer.SignerId).IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum; msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo, NULL, NULL); ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError()); @@ -1661,8 +1661,8 @@ static void test_signed_msg_encoding(void) certInfo.SerialNumber.cbData = 0; certInfo.Issuer.cbData = 0; signer.SignerId.dwIdChoice = CERT_ID_KEY_IDENTIFIER; - signer.SignerId.KeyId.cbData = sizeof(serialNum); - signer.SignerId.KeyId.pbData = (BYTE *)serialNum; + U(signer.SignerId).KeyId.cbData = sizeof(serialNum); + U(signer.SignerId).KeyId.pbData = (BYTE *)serialNum; msg = CryptMsgOpenToEncode(PKCS_7_ASN_ENCODING, 0, CMSG_SIGNED, &signInfo, NULL, NULL); ok(msg != NULL, "CryptMsgOpenToEncode failed: %x\n", GetLastError()); @@ -1888,13 +1888,13 @@ static void test_signed_msg_get_param(void) certInfo.SerialNumber.cbData = 0; certInfo.Issuer.cbData = 0; signer.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; - signer.SignerId.IssuerSerialNumber.Issuer.cbData = + U(signer.SignerId).IssuerSerialNumber.Issuer.cbData = sizeof(encodedCommonName); - signer.SignerId.IssuerSerialNumber.Issuer.pbData = + U(signer.SignerId).IssuerSerialNumber.Issuer.pbData = (BYTE *)encodedCommonName; - signer.SignerId.IssuerSerialNumber.SerialNumber.cbData = + U(signer.SignerId).IssuerSerialNumber.SerialNumber.cbData = sizeof(serialNum); - signer.SignerId.IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum; + U(signer.SignerId).IssuerSerialNumber.SerialNumber.pbData = (BYTE *)serialNum; ret = pCryptAcquireContextA(&signer.hCryptProv, cspNameA, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET); if (!ret && GetLastError() == NTE_EXISTS) @@ -1933,8 +1933,8 @@ static void test_signed_msg_get_param(void) * the CMS version. */ signer.SignerId.dwIdChoice = CERT_ID_KEY_IDENTIFIER; - signer.SignerId.KeyId.cbData = sizeof(serialNum); - signer.SignerId.KeyId.pbData = (BYTE *)serialNum; + U(signer.SignerId).KeyId.cbData = sizeof(serialNum); + U(signer.SignerId).KeyId.pbData = (BYTE *)serialNum; ret = pCryptAcquireContextA(&signer.hCryptProv, cspNameA, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET); if (!ret && GetLastError() == NTE_EXISTS) @@ -2291,32 +2291,32 @@ static void compare_cms_signer_info(const CMSG_CMS_SIGNER_INFO *got, { if (got->SignerId.dwIdChoice == CERT_ID_ISSUER_SERIAL_NUMBER) { - ok(got->SignerId.IssuerSerialNumber.Issuer.cbData == - expected->SignerId.IssuerSerialNumber.Issuer.cbData, + ok(U(got->SignerId).IssuerSerialNumber.Issuer.cbData == + U(expected->SignerId).IssuerSerialNumber.Issuer.cbData, "Expected issuer size %d, got %d\n", - expected->SignerId.IssuerSerialNumber.Issuer.cbData, - got->SignerId.IssuerSerialNumber.Issuer.cbData); - ok(!memcmp(got->SignerId.IssuerSerialNumber.Issuer.pbData, - expected->SignerId.IssuerSerialNumber.Issuer.pbData, - got->SignerId.IssuerSerialNumber.Issuer.cbData), + U(expected->SignerId).IssuerSerialNumber.Issuer.cbData, + U(got->SignerId).IssuerSerialNumber.Issuer.cbData); + ok(!memcmp(U(got->SignerId).IssuerSerialNumber.Issuer.pbData, + U(expected->SignerId).IssuerSerialNumber.Issuer.pbData, + U(got->SignerId).IssuerSerialNumber.Issuer.cbData), "Unexpected issuer\n"); - ok(got->SignerId.IssuerSerialNumber.SerialNumber.cbData == - expected->SignerId.IssuerSerialNumber.SerialNumber.cbData, + ok(U(got->SignerId).IssuerSerialNumber.SerialNumber.cbData == + U(expected->SignerId).IssuerSerialNumber.SerialNumber.cbData, "Expected serial number size %d, got %d\n", - expected->SignerId.IssuerSerialNumber.SerialNumber.cbData, - got->SignerId.IssuerSerialNumber.SerialNumber.cbData); - ok(!memcmp(got->SignerId.IssuerSerialNumber.SerialNumber.pbData, - expected->SignerId.IssuerSerialNumber.SerialNumber.pbData, - got->SignerId.IssuerSerialNumber.SerialNumber.cbData), + U(expected->SignerId).IssuerSerialNumber.SerialNumber.cbData, + U(got->SignerId).IssuerSerialNumber.SerialNumber.cbData); + ok(!memcmp(U(got->SignerId).IssuerSerialNumber.SerialNumber.pbData, + U(expected->SignerId).IssuerSerialNumber.SerialNumber.pbData, + U(got->SignerId).IssuerSerialNumber.SerialNumber.cbData), "Unexpected serial number\n"); } else { - ok(got->SignerId.KeyId.cbData == expected->SignerId.KeyId.cbData, + ok(U(got->SignerId).KeyId.cbData == U(expected->SignerId).KeyId.cbData, "expected key id size %d, got %d\n", - expected->SignerId.KeyId.cbData, got->SignerId.KeyId.cbData); - ok(!memcmp(expected->SignerId.KeyId.pbData, - got->SignerId.KeyId.pbData, got->SignerId.KeyId.cbData), + U(expected->SignerId).KeyId.cbData, U(got->SignerId).KeyId.cbData); + ok(!memcmp(U(expected->SignerId).KeyId.pbData, + U(got->SignerId).KeyId.pbData, U(got->SignerId).KeyId.cbData), "unexpected key id\n"); } } @@ -2429,12 +2429,12 @@ static void test_decode_msg_get_param(void) signer.dwVersion = 1; signer.SignerId.dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER; - signer.SignerId.IssuerSerialNumber.Issuer.cbData = + U(signer.SignerId).IssuerSerialNumber.Issuer.cbData = sizeof(encodedCommonName); - signer.SignerId.IssuerSerialNumber.Issuer.pbData = encodedCommonName; - signer.SignerId.IssuerSerialNumber.SerialNumber.cbData = + U(signer.SignerId).IssuerSerialNumber.Issuer.pbData = encodedCommonName; + U(signer.SignerId).IssuerSerialNumber.SerialNumber.cbData = sizeof(serialNum); - signer.SignerId.IssuerSerialNumber.SerialNumber.pbData = serialNum; + U(signer.SignerId).IssuerSerialNumber.SerialNumber.pbData = serialNum; signer.HashAlgorithm.pszObjId = oid_rsa_md5; CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, buf, &size); compare_cms_signer_info((CMSG_CMS_SIGNER_INFO *)buf, &signer); @@ -2521,8 +2521,8 @@ static void test_decode_msg_get_param(void) signer.dwVersion = CMSG_SIGNED_DATA_V3; signer.SignerId.dwIdChoice = CERT_ID_KEY_IDENTIFIER; - signer.SignerId.KeyId.cbData = sizeof(serialNum); - signer.SignerId.KeyId.pbData = (BYTE *)serialNum; + U(signer.SignerId).KeyId.cbData = sizeof(serialNum); + U(signer.SignerId).KeyId.pbData = (BYTE *)serialNum; signer.HashAlgorithm.pszObjId = oid_rsa_md5; CryptMsgGetParam(msg, CMSG_CMS_SIGNER_INFO_PARAM, 0, buf, &size); compare_cms_signer_info((CMSG_CMS_SIGNER_INFO *)buf, &signer); @@ -2712,8 +2712,10 @@ static void test_msg_control(void) SetLastError(0xdeadbeef); ret = CryptMsgUpdate(msg, msgData, sizeof(msgData), TRUE); todo_wine - ok(!ret && GetLastError() == NTE_BAD_HASH_STATE, - "Expected NTE_BAD_HASH_STATE, got %08x\n", GetLastError()); + ok(!ret && + (GetLastError() == NTE_BAD_HASH_STATE || + GetLastError() == CRYPT_E_MSG_ERROR), /* Vista */ + "Expected NTE_BAD_HASH_STATE or CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); CryptMsgClose(msg); /* Finally, verifying the hash of a detached message in the correct order: diff --git a/dlls/crypt32/tests/store.c b/dlls/crypt32/tests/store.c index db1447a0b45..b982c565337 100644 --- a/dlls/crypt32/tests/store.c +++ b/dlls/crypt32/tests/store.c @@ -830,7 +830,9 @@ static void testRegStore(void) if (context) certCount++; } while (context != NULL); - ok(certCount == 1, "Expected 1 certificates, got %d\n", certCount); + ok(certCount == 1 || + broken(certCount == 2), /* win9x */ + "Expected 1 certificates, got %d\n", certCount); /* Try again with the correct hash... */ ptr = buf + sizeof(*hdr); @@ -1029,7 +1031,9 @@ static void testSystemStore(void) /* Check opening a bogus store */ store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER | CERT_STORE_OPEN_EXISTING_FLAG, BogusW); - ok(!store && GetLastError() == ERROR_FILE_NOT_FOUND, + ok((!store || + broken(store != 0)) && /* win9x */ + GetLastError() == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError()); store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_CURRENT_USER, BogusW); @@ -1544,7 +1548,9 @@ static void testMessageStore(void) blob.pbData = (LPBYTE)hashBareContent; SetLastError(0xdeadbeef); store = CertOpenStore(CERT_STORE_PROV_PKCS7, 0, 0, 0, &blob); - ok(!store && GetLastError() == CRYPT_E_ASN1_BADTAG, + ok(!store && + (GetLastError() == CRYPT_E_ASN1_BADTAG || + GetLastError() == OSS_DATA_ERROR), /* win9x */ "Expected CRYPT_E_ASN1_BADTAG, got %08x\n", GetLastError()); } diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c index 6bffcb14226..afcb0fe38d5 100644 --- a/dlls/d3d8/directx.c +++ b/dlls/d3d8/directx.c @@ -184,7 +184,7 @@ static HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat (LPDIRECT3D8 i EnterCriticalSection(&d3d8_cs); hr = IWineD3D_CheckDeviceFormat(This->WineD3D, Adapter, DeviceType, AdapterFormat, - Usage, RType, CheckFormat); + Usage, RType, CheckFormat, SURFACE_OPENGL); LeaveCriticalSection(&d3d8_cs); return hr; } diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c index 78244ec1751..b605f44da7a 100644 --- a/dlls/d3d9/directx.c +++ b/dlls/d3d9/directx.c @@ -186,7 +186,7 @@ static HRESULT WINAPI IDirect3D9Impl_CheckDeviceFormat(LPDIRECT3D9EX iface, EnterCriticalSection(&d3d9_cs); hr = IWineD3D_CheckDeviceFormat(This->WineD3D, Adapter, DeviceType, AdapterFormat, - Usage, RType, CheckFormat); + Usage, RType, CheckFormat, SURFACE_OPENGL); LeaveCriticalSection(&d3d9_cs); return hr; } diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 3164b811df2..41dcafb7c20 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -3,6 +3,7 @@ * Copyright (C) 2006 Chris Robinson * Copyright (C) 2006-2007 Stefan Dösinger(For CodeWeavers) * Copyright 2007 Henri Verbeet + * Copyright (C) 2008 Rico Schüller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -2016,6 +2017,100 @@ static void test_display_formats() if(d3d9) IDirect3D9_Release(d3d9); } +static void test_scissor_size(void) +{ + IDirect3D9 *d3d9_ptr = 0; + int i; + static const struct { + int winx; int winy; int backx; int backy; BOOL window; + } scts[] = { /* scissor tests */ + {800, 600, 640, 480, TRUE}, + {800, 600, 640, 480, FALSE}, + {640, 480, 800, 600, TRUE}, + {640, 480, 800, 600, FALSE}, + }; + + d3d9_ptr = pDirect3DCreate9(D3D_SDK_VERSION); + ok(d3d9_ptr != NULL, "Failed to create IDirect3D9 object\n"); + if (!d3d9_ptr){ + skip("Failed to create IDirect3D9 object\n"); + return; + } + + for(i=0; i(%p,%x,%p) stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj); + FIXME("(%p/%p)->(%p,%x,%p) partial stub!\n", This, iface, pvSource, dwLoadOptions, ppEnumObj); + + if (!ppEnumObj) + return DXFILEERR_BADVALUE; if (dwLoadOptions == DXFILELOAD_FROMFILE) { - HANDLE hFile; TRACE("Open source file '%s'\n", (char*)pvSource); + hFile = CreateFileA((char*)pvSource, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { TRACE("File '%s' not found\n", (char*)pvSource); return DXFILEERR_FILENOTFOUND; } - CloseHandle(hFile); + + if (!ReadFile(hFile, header, 16, &size, NULL)) + { + hr = DXFILEERR_BADVALUE; + goto error; + } + + if (size < 16) + { + hr = DXFILEERR_BADFILETYPE; + goto error; + } + + if (TRACE_ON(d3dxof)) + { + char string[17]; + memcpy(string, header, 16); + string[16] = 0; + TRACE("header = '%s'\n", string); + } } else { FIXME("Source type %d is not handled yet\n", dwLoadOptions); + hr = DXFILEERR_NOTDONEYET; + goto error; + } + + if (header[0] != XOFFILE_FORMAT_MAGIC) + { + hr = DXFILEERR_BADFILETYPE; + goto error; + } + + if (header[1] != XOFFILE_FORMAT_VERSION) + { + hr = DXFILEERR_BADFILEVERSION; + goto error; + } + + if ((header[2] != XOFFILE_FORMAT_BINARY) && (header[2] != XOFFILE_FORMAT_TEXT) && (header[2] != XOFFILE_FORMAT_COMPRESSED)) + { + hr = DXFILEERR_BADFILETYPE; + goto error; } + if (header[2] == XOFFILE_FORMAT_BINARY) + { + FIXME("Binary format not supported yet\n"); + hr = DXFILEERR_NOTDONEYET; + goto error; + } + + if (header[2] == XOFFILE_FORMAT_COMPRESSED) + { + FIXME("Compressed formats not supported yet\n"); + hr = DXFILEERR_BADVALUE; + goto error; + } + + if ((header[3] != XOFFILE_FORMAT_FLOAT_BITS_32) && (header[3] != XOFFILE_FORMAT_FLOAT_BITS_64)) + { + hr = DXFILEERR_BADFILEFLOATSIZE; + goto error; + } + + TRACE("Header is correct\n"); + hr = IDirectXFileEnumObjectImpl_Create(&object); if (!SUCCEEDED(hr)) - return hr; + goto error; + + object->source = dwLoadOptions; + object->hFile = hFile; *ppEnumObj = (LPDIRECTXFILEENUMOBJECT)object; return DXFILE_OK; + +error: + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle(hFile); + *ppEnumObj = NULL; + + return hr; } static HRESULT WINAPI IDirectXFileImpl_CreateSaveObject(IDirectXFile* iface, LPCSTR szFileName, DXFILEFORMAT dwFileFormat, LPDIRECTXFILESAVEOBJECT* ppSaveObj) @@ -353,7 +430,7 @@ static WORD get_keyword_token(parse_buffer* buf) return TOKEN_SDWORD; if (is_keyword(buf, "VOID")) return TOKEN_VOID; - if (is_keyword(buf, "LPSTR")) + if (is_keyword(buf, "STRING")) return TOKEN_LPSTR; if (is_keyword(buf, "UNICODE")) return TOKEN_UNICODE; @@ -385,7 +462,7 @@ static BOOL is_guid(parse_buffer* buf) tmp[pos] = 0; if (pos != 38 /* <+36+> */) { - TRACE("Wrong guid %s (%d) \n", tmp, pos); + TRACE("Wrong guid %s (%d)\n", tmp, pos); return FALSE; } buf->buffer += pos; @@ -394,10 +471,10 @@ static BOOL is_guid(parse_buffer* buf) ret = sscanf(tmp, CLSIDFMT, &class_id.Data1, tab, tab+1, tab+2, tab+3, tab+4, tab+5, tab+6, tab+7, tab+8, tab+9); if (ret != 11) { - TRACE("Wrong guid %s (%d) \n", tmp, pos); + TRACE("Wrong guid %s (%d)\n", tmp, pos); return FALSE; } - TRACE("Found guid %s (%d) \n", tmp, pos); + TRACE("Found guid %s (%d)\n", tmp, pos); class_id.Data2 = tab[0]; class_id.Data3 = tab[1]; @@ -423,7 +500,7 @@ static BOOL is_name(parse_buffer* buf) BOOL error = 0; while (!is_separator(c = *(buf->buffer+pos))) { - if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')))) + if (!(((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || ((c >= '0') && (c <= '9')))) error = 1; tmp[pos++] = c; } @@ -483,6 +560,24 @@ static WORD parse_TOKEN_dbg_opt(parse_buffer * buf, BOOL show_token) if (!read_bytes(buf, &c, 1)) return 0; /*TRACE("char = '%c'\n", is_space(c) ? ' ' : c);*/ + if ((c == '#') || (c == '/')) + { + /* Handle comment (# or //) */ + if (c == '/') + { + if (!read_bytes(buf, &c, 1)) + return 0; + if (c != '/') + return 0; + } + c = 0; + while (c != 0x0A) + { + if (!read_bytes(buf, &c, 1)) + return 0; + } + continue; + } if (is_space(c)) continue; if (is_operator(c) && (c != '<')) @@ -597,7 +692,7 @@ static const char* get_primitive_string(WORD token) case TOKEN_VOID: return "VOID"; case TOKEN_LPSTR: - return "LPSTR"; + return "STRING"; case TOKEN_UNICODE: return "UNICODE"; case TOKEN_CSTRING: @@ -778,7 +873,7 @@ static BOOL parse_template_members_list(parse_buffer * buf) } if (cur_member->idx_template == buf->pdxf->nb_xtemplates) { - TRACE("Reference to non existing template '%s'\n", (char*)buf->value); + TRACE("Reference to a nonexistent template '%s'\n", (char*)buf->value); return FALSE; } if (check_TOKEN(buf) == TOKEN_NAME) @@ -817,7 +912,7 @@ static BOOL parse_template_members_list(parse_buffer * buf) } if (cur_member->idx_template == buf->pdxf->nb_xtemplates) { - TRACE("Reference to non existing template '%s'\n", (char*)buf->value); + TRACE("Reference to nonexistent template '%s'\n", (char*)buf->value); return FALSE; } } @@ -927,13 +1022,10 @@ static BOOL parse_template(parse_buffer * buf) if (buf->txt) { /* Go to the next template */ - while (buf->rem_bytes) + while (buf->rem_bytes && is_space(*buf->buffer)) { - if (is_space(*buf->buffer)) - { - buf->buffer++; - buf->rem_bytes--; - } + buf->buffer++; + buf->rem_bytes--; } } @@ -992,7 +1084,7 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP if (token_header == XOFFILE_FORMAT_COMPRESSED) { - FIXME("Compressed formats not supported yet"); + FIXME("Compressed formats not supported yet\n"); return DXFILEERR_BADVALUE; } @@ -1021,7 +1113,8 @@ static HRESULT WINAPI IDirectXFileImpl_RegisterTemplates(IDirectXFile* iface, LP i = This->nb_xtemplates - 1; clsid = &This->xtemplates[i].class_id; - DPRINTF("template %s {\n", This->xtemplates[i].name); + DPRINTF("template %s\n", This->xtemplates[i].name); + DPRINTF("{\n"); DPRINTF(CLSIDFMT "\n", clsid->Data1, clsid->Data2, clsid->Data3, clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3], clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7]); for (j = 0; j < This->xtemplates[i].nb_members; j++) diff --git a/dlls/d3dxof/d3dxof_private.h b/dlls/d3dxof/d3dxof_private.h index 9bbf62927f6..2e9964cf93e 100644 --- a/dlls/d3dxof/d3dxof_private.h +++ b/dlls/d3dxof/d3dxof_private.h @@ -88,6 +88,8 @@ typedef struct { typedef struct { IDirectXFileEnumObject lpVtbl; LONG ref; + DXFILELOADOPTIONS source; + HANDLE hFile; } IDirectXFileEnumObjectImpl; typedef struct { diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index e4cae5befdc..26c3a3dd403 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -303,7 +303,8 @@ enum module_type DMT_UNKNOWN, /* for lookup, not actually used for a module */ DMT_ELF, /* a real ELF shared module */ DMT_PE, /* a native or builtin PE module */ - DMT_PDB, /* PDB file */ + DMT_PDB, /* .PDB file */ + DMT_DBG, /* .DBG file */ }; struct process; @@ -473,6 +474,10 @@ extern BOOL pe_load_debug_directory(const struct process* pcs, const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg); extern BOOL pdb_fetch_file_info(struct pdb_lookup* pdb_lookup); +/* path.c */ +extern BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path, + const GUID* guid, DWORD dw1, DWORD dw2, PSTR buffer); + /* pe_module.c */ extern BOOL pe_load_nt_header(HANDLE hProc, DWORD base, IMAGE_NT_HEADERS* nth); extern struct module* diff --git a/dlls/dbghelp/dwarf.h b/dlls/dbghelp/dwarf.h index 6a34bb59b0b..e7a0a7e4824 100644 --- a/dlls/dbghelp/dwarf.h +++ b/dlls/dbghelp/dwarf.h @@ -68,6 +68,16 @@ typedef enum dwarf_tag_e DW_TAG_variant_part = 0x33, DW_TAG_variable = 0x34, DW_TAG_volatile_type = 0x35, + /** Dwarf3 new values */ + DW_TAG_dwarf_procedure = 0x36, + DW_TAG_restrict_type = 0x37, + DW_TAG_interface_type = 0x38, + DW_TAG_namespace = 0x39, + DW_TAG_imported_module = 0x3a, + DW_TAG_unspecified_type = 0x3b, + DW_TAG_partial_unit = 0x3c, + DW_TAG_imported_unit = 0x3d, + DW_TAG_mutable_type = 0x3e, /** extensions */ DW_TAG_MIPS_loop = 0x4081, DW_TAG_format_label = 0x4101, @@ -139,8 +149,20 @@ typedef enum dwarf_attribute_e DW_AT_variable_parameter = 0x4b, DW_AT_virtuality = 0x4c, DW_AT_vtable_elem_location = 0x4d, - + /** Dwarf3 new values */ + DW_AT_allocated = 0x4e, + DW_AT_associated = 0x4f, + DW_AT_data_location = 0x50, + DW_AT_stride = 0x51, + DW_AT_entry_pc = 0x52, + DW_AT_use_UTF8 = 0x53, + DW_AT_extension = 0x54, DW_AT_ranges = 0x55, + DW_AT_trampoline = 0x56, + DW_AT_call_column = 0x57, + DW_AT_call_file = 0x58, + DW_AT_call_line = 0x59, + DW_AT_description = 0x5a, /* extensions */ DW_AT_MIPS_fde = 0x2001, DW_AT_MIPS_loop_begin = 0x2002, @@ -197,7 +219,9 @@ typedef enum dwarf_type_e DW_ATE_signed = 0x5, DW_ATE_signed_char = 0x6, DW_ATE_unsigned = 0x7, - DW_ATE_unsigned_char = 0x8 + DW_ATE_unsigned_char = 0x8, + /* Dwarf3 new values */ + DW_ATE_imaginary_float = 0x9 } dwarf_type_t; typedef enum dwarf_operation_e @@ -346,7 +370,12 @@ typedef enum dwarf_operation_e DW_OP_piece = 0x93, DW_OP_deref_size = 0x94, DW_OP_xderef_size = 0x95, - DW_OP_nop = 0x96 + DW_OP_nop = 0x96, + /** Dwarf3 new values */ + DW_OP_push_object_address = 0x97, + DW_OP_call2 = 0x98, + DW_OP_call4 = 0x99, + DW_OP_call_ref = 0x9a, } dwarf_operation_t; enum dwarf_calling_convention @@ -369,6 +398,10 @@ enum dwarf_calling_convention #define DW_LNS_set_basic_block 0x07 #define DW_LNS_const_add_pc 0x08 #define DW_LNS_fixed_advance_pc 0x09 +/* Dwarf3 new values */ +#define DW_LNS_set_prologue_end 0x0a +#define DW_LNS_set_epilogue_begin 0x0b +#define DW_LNS_set_isa 0x0c #define DW_LNE_end_sequence 0x01 #define DW_LNE_set_address 0x02 diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index a53e6b568b9..ddc6d3d89bd 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -36,6 +36,7 @@ const WCHAR S_ElfW[] = {'<','e','l','f','>','\0'}; const WCHAR S_WineLoaderW[] = {'<','w','i','n','e','-','l','o','a','d','e','r','>','\0'}; static const WCHAR S_DotSoW[] = {'.','s','o','\0'}; static const WCHAR S_DotPdbW[] = {'.','p','d','b','\0'}; +static const WCHAR S_DotDbgW[] = {'.','d','b','g','\0'}; const WCHAR S_WinePThreadW[] = {'w','i','n','e','-','p','t','h','r','e','a','d','\0'}; const WCHAR S_WineKThreadW[] = {'w','i','n','e','-','k','t','h','r','e','a','d','\0'}; const WCHAR S_SlashW[] = {'/','\0'}; @@ -424,6 +425,9 @@ enum module_type module_get_type_by_name(const WCHAR* name) if (len > 4 && !strncmpiW(name + len - 4, S_DotPdbW, 4)) return DMT_PDB; + if (len > 4 && !strncmpiW(name + len - 4, S_DotDbgW, 4)) + return DMT_DBG; + /* wine-[kp]thread is also an ELF module */ if (((len > 12 && name[len - 13] == '/') || len == 12) && (!strncmpiW(name + len - 12, S_WinePThreadW, 12) || diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index d04ebfb2c5c..04b0224eb94 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -1952,18 +1952,6 @@ static void pdb_convert_symbol_file(const PDB_SYMBOLS* symbols, } } -static BOOL CALLBACK pdb_match(const char* file, void* user) -{ - /* accept first file that exists */ - HANDLE h = CreateFileA(file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - TRACE("match with %s returns %p\n", file, h); - if (INVALID_HANDLE_VALUE != h) { - CloseHandle(h); - return FALSE; - } - return TRUE; -} - static HANDLE open_pdb_file(const struct process* pcs, const struct pdb_lookup* lookup) { @@ -1974,15 +1962,12 @@ static HANDLE open_pdb_file(const struct process* pcs, switch (lookup->kind) { case PDB_JG: - ret = SymFindFileInPath(pcs->handle, NULL, lookup->filename, - (PVOID)(DWORD_PTR)lookup->u.jg.timestamp, - lookup->age, 0, SSRVOPT_DWORD, - dbg_file_path, pdb_match, NULL); + ret = path_find_symbol_file(pcs, lookup->filename, NULL, lookup->u.jg.timestamp, + lookup->age, dbg_file_path); break; case PDB_DS: - ret = SymFindFileInPath(pcs->handle, NULL, lookup->filename, - (PVOID)&lookup->u.ds.guid, lookup->age, 0, - SSRVOPT_GUIDPTR, dbg_file_path, pdb_match, NULL); + ret = path_find_symbol_file(pcs, lookup->filename, &lookup->u.ds.guid, 0, + lookup->age, dbg_file_path); break; } if (!ret) @@ -2496,7 +2481,7 @@ static BOOL codeview_process_info(const struct process* pcs, pdb_lookup.kind = PDB_JG; pdb_lookup.u.jg.timestamp = pdb->timestamp; pdb_lookup.u.jg.toc = NULL; - pdb_lookup.age = pdb->unknown; + pdb_lookup.age = pdb->age; ret = pdb_process_file(pcs, msc_dbg, &pdb_lookup); break; } @@ -2504,13 +2489,13 @@ static BOOL codeview_process_info(const struct process* pcs, { const OMFSignatureRSDS* rsds = (const OMFSignatureRSDS*)msc_dbg->root; - TRACE("Got RSDS type of PDB file: guid=%s unk=%08x name=%s\n", - wine_dbgstr_guid(&rsds->guid), rsds->unknown, rsds->name); + TRACE("Got RSDS type of PDB file: guid=%s age=%08x name=%s\n", + wine_dbgstr_guid(&rsds->guid), rsds->age, rsds->name); pdb_lookup.filename = rsds->name; pdb_lookup.kind = PDB_DS; pdb_lookup.u.ds.guid = rsds->guid; pdb_lookup.u.ds.toc = NULL; - pdb_lookup.age = rsds->unknown; + pdb_lookup.age = rsds->age; ret = pdb_process_file(pcs, msc_dbg, &pdb_lookup); break; } diff --git a/dlls/dbghelp/path.c b/dlls/dbghelp/path.c index 7057e265c3e..3ae492139f4 100644 --- a/dlls/dbghelp/path.c +++ b/dlls/dbghelp/path.c @@ -1,7 +1,7 @@ /* * File path.c - managing path in debugging environments * - * Copyright (C) 2004, Eric Pouech + * Copyright (C) 2004,2008, Eric Pouech * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -329,18 +329,6 @@ BOOL WINAPI EnumDirTree(HANDLE hProcess, PCSTR root, PCSTR file, struct sffip { - enum module_type kind; - /* pe: id -> DWORD:timestamp - * two -> size of image (from PE header) - * pdb: id -> PDB signature - * I think either DWORD:timestamp or GUID:guid depending on PDB version - * two -> PDB age ??? - * elf: id -> DWORD:CRC 32 of ELF image (Wine only) - */ - PVOID id; - DWORD two; - DWORD three; - DWORD flags; PFINDFILEINPATHCALLBACKW cb; void* user; }; @@ -353,12 +341,139 @@ struct sffip static BOOL CALLBACK sffip_cb(PCWSTR buffer, PVOID user) { struct sffip* s = (struct sffip*)user; - DWORD size, checksum; - /* FIXME: should check that id/two/three match the file pointed + if (!s->cb) return TRUE; + /* yes, EnumDirTree/do_search and SymFindFileInPath callbacks use the opposite + * convention to stop/continue enumeration. sigh. + */ + return !(s->cb)((WCHAR*)buffer, s->user); +} + +/****************************************************************** + * SymFindFileInPathW (DBGHELP.@) + * + */ +BOOL WINAPI SymFindFileInPathW(HANDLE hProcess, PCWSTR searchPath, PCWSTR full_path, + PVOID id, DWORD two, DWORD three, DWORD flags, + PWSTR buffer, PFINDFILEINPATHCALLBACKW cb, + PVOID user) +{ + struct sffip s; + struct process* pcs = process_find_by_handle(hProcess); + WCHAR tmp[MAX_PATH]; + WCHAR* ptr; + const WCHAR* filename; + + TRACE("(hProcess = %p, searchPath = %s, full_path = %s, id = %p, two = 0x%08x, three = 0x%08x, flags = 0x%08x, buffer = %p, cb = %p, user = %p)\n", + hProcess, debugstr_w(searchPath), debugstr_w(full_path), + id, two, three, flags, buffer, cb, user); + + if (!pcs) return FALSE; + if (!searchPath) searchPath = pcs->search_path; + + s.cb = cb; + s.user = user; + + filename = file_nameW(full_path); + + /* first check full path to file */ + if (sffip_cb(full_path, &s)) + { + strcpyW(buffer, full_path); + return TRUE; + } + + while (searchPath) + { + ptr = strchrW(searchPath, ';'); + if (ptr) + { + memcpy(tmp, searchPath, (ptr - searchPath) * sizeof(WCHAR)); + tmp[ptr - searchPath] = 0; + searchPath = ptr + 1; + } + else + { + strcpyW(tmp, searchPath); + searchPath = NULL; + } + if (do_searchW(filename, tmp, FALSE, sffip_cb, &s)) + { + strcpyW(buffer, tmp); + return TRUE; + } + } + return FALSE; +} + +/****************************************************************** + * SymFindFileInPath (DBGHELP.@) + * + */ +BOOL WINAPI SymFindFileInPath(HANDLE hProcess, PCSTR searchPath, PCSTR full_path, + PVOID id, DWORD two, DWORD three, DWORD flags, + PSTR buffer, PFINDFILEINPATHCALLBACK cb, + PVOID user) +{ + WCHAR searchPathW[MAX_PATH]; + WCHAR full_pathW[MAX_PATH]; + WCHAR bufferW[MAX_PATH]; + struct enum_dir_treeWA edt; + BOOL ret; + + /* a PFINDFILEINPATHCALLBACK and a PENUMDIRTREE_CALLBACK have actually the + * same signature & semantics, hence we can reuse the EnumDirTree W->A + * conversion helper + */ + edt.cb = cb; + edt.user = user; + if (searchPath) + MultiByteToWideChar(CP_ACP, 0, searchPath, -1, searchPathW, MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, full_path, -1, full_pathW, MAX_PATH); + if ((ret = SymFindFileInPathW(hProcess, searchPath ? searchPathW : NULL, full_pathW, + id, two, three, flags, + bufferW, enum_dir_treeWA, &edt))) + WideCharToMultiByte(CP_ACP, 0, bufferW, -1, buffer, MAX_PATH, NULL, NULL); + return ret; +} + +struct module_find +{ + enum module_type kind; + /* pe: dw1 DWORD:timestamp + * dw2 size of image (from PE header) + * pdb: guid PDB guid (if DS PDB file) + * or dw1 PDB timestamp (if JG PDB file) + * dw2 PDB age + * elf: dw1 DWORD:CRC 32 of ELF image (Wine only) + */ + const GUID* guid; + DWORD dw1; + DWORD dw2; + WCHAR filename[MAX_PATH]; + unsigned matched; +}; + +/* checks that buffer (as found by matching the name) matches the info + * (information is based on file type) + * returns TRUE when file is found, FALSE to continue searching + * (NB this is the opposite convention of SymFindFileInPathProc) + */ +static BOOL CALLBACK module_find_cb(PCWSTR buffer, PVOID user) +{ + struct module_find* mf = (struct module_find*)user; + DWORD size, checksum, timestamp; + unsigned matched = 0; + + /* the matching weights: + * +1 if a file with same name is found and is a decent file of expected type + * +1 if first parameter and second parameter match + */ + + /* FIXME: should check that id/two match the file pointed * by buffer */ - switch (s->kind) + switch (mf->kind) { case DMT_PE: { @@ -366,8 +481,8 @@ static BOOL CALLBACK sffip_cb(PCWSTR buffer, PVOID user) void* mapping; DWORD timestamp; - timestamp = ~(DWORD_PTR)s->id; - size = ~s->two; + timestamp = ~mf->dw1; + size = ~mf->dw2; hFile = CreateFileW(buffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) return FALSE; @@ -376,6 +491,8 @@ static BOOL CALLBACK sffip_cb(PCWSTR buffer, PVOID user) if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL) { IMAGE_NT_HEADERS* nth = RtlImageNtHeader(mapping); + + matched++; timestamp = nth->FileHeader.TimeDateStamp; size = nth->OptionalHeader.SizeOfImage; UnmapViewOfFile(mapping); @@ -383,22 +500,21 @@ static BOOL CALLBACK sffip_cb(PCWSTR buffer, PVOID user) CloseHandle(hMap); } CloseHandle(hFile); - if (timestamp != (DWORD_PTR)s->id || size != s->two) - { - WARN("Found %s, but wrong size or timestamp\n", debugstr_w(buffer)); - return FALSE; - } + if (timestamp != mf->dw1) + WARN("Found %s, but wrong timestamp\n", debugstr_w(buffer)); + if (size != mf->dw2) + WARN("Found %s, but wrong size\n", debugstr_w(buffer)); + if (timestamp == mf->dw1 && size == mf->dw2) matched++; } break; case DMT_ELF: if (elf_fetch_file_info(buffer, 0, &size, &checksum)) { - if (checksum != (DWORD_PTR)s->id) - { - WARN("Found %s, but wrong checksums: %08x %08lx\n", - debugstr_w(buffer), checksum, (DWORD_PTR)s->id); - return FALSE; - } + matched++; + if (checksum == mf->dw1) matched++; + else + WARN("Found %s, but wrong checksums: %08x %08x\n", + debugstr_w(buffer), checksum, mf->dw1); } else { @@ -415,90 +531,112 @@ static BOOL CALLBACK sffip_cb(PCWSTR buffer, PVOID user) pdb_lookup.filename = fn; if (!pdb_fetch_file_info(&pdb_lookup)) return FALSE; + matched++; switch (pdb_lookup.kind) { case PDB_JG: - if (s->flags & SSRVOPT_GUIDPTR) + if (mf->guid) { WARN("Found %s, but wrong PDB version\n", debugstr_w(buffer)); - return FALSE; - } - if (pdb_lookup.u.jg.timestamp != (DWORD_PTR)s->id) - { - WARN("Found %s, but wrong signature: %08x %08lx\n", - debugstr_w(buffer), pdb_lookup.u.jg.timestamp, (DWORD_PTR)s->id); - return FALSE; } + else if (pdb_lookup.u.jg.timestamp == mf->dw1) + matched++; + else + WARN("Found %s, but wrong signature: %08x %08x\n", + debugstr_w(buffer), pdb_lookup.u.jg.timestamp, mf->dw1); break; case PDB_DS: - if (!(s->flags & SSRVOPT_GUIDPTR)) + if (!mf->guid) { WARN("Found %s, but wrong PDB version\n", debugstr_w(buffer)); - return FALSE; } - if (memcmp(&pdb_lookup.u.ds.guid, (GUID*)s->id, sizeof(GUID))) - { + else if (!memcmp(&pdb_lookup.u.ds.guid, mf->guid, sizeof(GUID))) + matched++; + else WARN("Found %s, but wrong GUID: %s %s\n", debugstr_w(buffer), debugstr_guid(&pdb_lookup.u.ds.guid), - debugstr_guid((GUID*)s->id)); - return FALSE; - } + debugstr_guid(mf->guid)); break; } - if (pdb_lookup.age != s->two) + if (pdb_lookup.age != mf->dw2) { + matched--; WARN("Found %s, but wrong age: %08x %08x\n", - debugstr_w(buffer), pdb_lookup.age, s->two); - return FALSE; + debugstr_w(buffer), pdb_lookup.age, mf->dw2); + } + } + break; + case DMT_DBG: + { + HANDLE hFile, hMap; + void* mapping; + + timestamp = ~mf->dw1; + hFile = CreateFileW(buffer, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile == INVALID_HANDLE_VALUE) return FALSE; + if ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != NULL) + { + if ((mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL) + { + const IMAGE_SEPARATE_DEBUG_HEADER* hdr; + hdr = (const IMAGE_SEPARATE_DEBUG_HEADER*)mapping; + + if (hdr->Signature == IMAGE_SEPARATE_DEBUG_SIGNATURE) + { + matched++; + timestamp = hdr->TimeDateStamp; + } + UnmapViewOfFile(mapping); + } + CloseHandle(hMap); } + CloseHandle(hFile); + if (timestamp == mf->dw1) matched++; + else WARN("Found %s, but wrong timestamp\n", debugstr_w(buffer)); } break; default: FIXME("What the heck??\n"); return FALSE; } + if (matched > mf->matched) + { + strcpyW(mf->filename, buffer); + mf->matched = matched; + } /* yes, EnumDirTree/do_search and SymFindFileInPath callbacks use the opposite * convention to stop/continue enumeration. sigh. */ - return !(s->cb)((WCHAR*)buffer, s->user); + return mf->matched == 2; } -/****************************************************************** - * SymFindFileInPathW (DBGHELP.@) - * - */ -BOOL WINAPI SymFindFileInPathW(HANDLE hProcess, PCWSTR searchPath, PCWSTR full_path, - PVOID id, DWORD two, DWORD three, DWORD flags, - PWSTR buffer, PFINDFILEINPATHCALLBACKW cb, - PVOID user) +BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path, + const GUID* guid, DWORD dw1, DWORD dw2, PSTR buffer) { - struct sffip s; - struct process* pcs = process_find_by_handle(hProcess); + struct module_find mf; + WCHAR full_pathW[MAX_PATH]; WCHAR tmp[MAX_PATH]; WCHAR* ptr; const WCHAR* filename; + WCHAR* searchPath = pcs->search_path; - TRACE("(hProcess = %p, searchPath = %s, full_path = %s, id = %p, two = 0x%08x, three = 0x%08x, flags = 0x%08x, buffer = %p, cb = %p, user = %p)\n", - hProcess, debugstr_w(searchPath), debugstr_w(full_path), - id, two, three, flags, buffer, cb, user); + TRACE("(pcs = %p, full_path = %s, guid = %s, dw1 = 0x%08x, dw2 = 0x%08x, buffer = %p)\n", + pcs, debugstr_a(full_path), debugstr_guid(guid), dw1, dw2, buffer); - if (!pcs) return FALSE; - if (!searchPath) searchPath = pcs->search_path; + mf.guid = guid; + mf.dw1 = dw1; + mf.dw2 = dw2; + mf.matched = 0; - s.id = id; - s.two = two; - s.three = three; - s.flags = flags; - s.cb = cb; - s.user = user; - - filename = file_nameW(full_path); - s.kind = module_get_type_by_name(filename); + MultiByteToWideChar(CP_ACP, 0, full_path, -1, full_pathW, MAX_PATH); + filename = file_nameW(full_pathW); + mf.kind = module_get_type_by_name(filename); /* first check full path to file */ - if (sffip_cb(full_path, &s)) + if (module_find_cb(full_pathW, &mf)) { - strcpyW(buffer, full_path); + WideCharToMultiByte(CP_ACP, 0, full_pathW, -1, buffer, MAX_PATH, NULL, NULL); return TRUE; } @@ -508,7 +646,7 @@ BOOL WINAPI SymFindFileInPathW(HANDLE hProcess, PCWSTR searchPath, PCWSTR full_p if (ptr) { memcpy(tmp, searchPath, (ptr - searchPath) * sizeof(WCHAR)); - tmp[ptr - searchPath] = 0; + tmp[ptr - searchPath] = '\0'; searchPath = ptr + 1; } else @@ -516,42 +654,18 @@ BOOL WINAPI SymFindFileInPathW(HANDLE hProcess, PCWSTR searchPath, PCWSTR full_p strcpyW(tmp, searchPath); searchPath = NULL; } - if (do_searchW(filename, tmp, FALSE, sffip_cb, &s)) + if (do_searchW(filename, tmp, FALSE, module_find_cb, &mf)) { - strcpyW(buffer, tmp); + /* return first fully matched file */ + WideCharToMultiByte(CP_ACP, 0, tmp, -1, buffer, MAX_PATH, NULL, NULL); return TRUE; } } + /* if no fully matching file is found, return the best matching file if any */ + if ((dbghelp_options & SYMOPT_LOAD_ANYTHING) && mf.matched) + { + WideCharToMultiByte(CP_ACP, 0, mf.filename, -1, buffer, MAX_PATH, NULL, NULL); + return TRUE; + } return FALSE; } - -/****************************************************************** - * SymFindFileInPath (DBGHELP.@) - * - */ -BOOL WINAPI SymFindFileInPath(HANDLE hProcess, PCSTR searchPath, PCSTR full_path, - PVOID id, DWORD two, DWORD three, DWORD flags, - PSTR buffer, PFINDFILEINPATHCALLBACK cb, - PVOID user) -{ - WCHAR searchPathW[MAX_PATH]; - WCHAR full_pathW[MAX_PATH]; - WCHAR bufferW[MAX_PATH]; - struct enum_dir_treeWA edt; - BOOL ret; - - /* a PFINDFILEINPATHCALLBACK and a PENUMDIRTREE_CALLBACK have actually the - * same signature & semantics, hence we can reuse the EnumDirTree W->A - * conversion helper - */ - edt.cb = cb; - edt.user = user; - if (searchPath) - MultiByteToWideChar(CP_ACP, 0, searchPath, -1, searchPathW, MAX_PATH); - MultiByteToWideChar(CP_ACP, 0, full_path, -1, full_pathW, MAX_PATH); - if ((ret = SymFindFileInPathW(hProcess, searchPath ? searchPathW : NULL, full_pathW, - id, two, three, flags, - bufferW, enum_dir_treeWA, &edt))) - WideCharToMultiByte(CP_ACP, 0, bufferW, -1, buffer, MAX_PATH, NULL, NULL); - return ret; -} diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c index 283962cb367..7b62529a211 100644 --- a/dlls/dbghelp/pe_module.c +++ b/dlls/dbghelp/pe_module.c @@ -79,12 +79,6 @@ static BOOL pe_load_stabs(const struct process* pcs, struct module* module, return ret; } -static BOOL CALLBACK dbg_match(const char* file, void* user) -{ - /* accept first file */ - return FALSE; -} - /****************************************************************** * pe_load_dbg_file * @@ -96,51 +90,35 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module, char tmp[MAX_PATH]; HANDLE hFile = INVALID_HANDLE_VALUE, hMap = 0; const BYTE* dbg_mapping = NULL; - const IMAGE_SEPARATE_DEBUG_HEADER* hdr; - const IMAGE_DEBUG_DIRECTORY* dbg; BOOL ret = FALSE; - WINE_TRACE("Processing DBG file %s\n", debugstr_a(dbg_name)); + TRACE("Processing DBG file %s\n", debugstr_a(dbg_name)); - if (SymFindFileInPath(pcs->handle, NULL, dbg_name, NULL, 0, 0, 0, tmp, dbg_match, NULL) && + if (path_find_symbol_file(pcs, dbg_name, NULL, timestamp, 0, tmp) && (hFile = CreateFileA(tmp, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE && ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != 0) && ((dbg_mapping = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)) != NULL)) { + const IMAGE_SEPARATE_DEBUG_HEADER* hdr; + const IMAGE_SECTION_HEADER* sectp; + const IMAGE_DEBUG_DIRECTORY* dbg; + hdr = (const IMAGE_SEPARATE_DEBUG_HEADER*)dbg_mapping; - if (hdr->TimeDateStamp != timestamp) - { - WINE_ERR("Warning - %s has incorrect internal timestamp\n", - debugstr_a(dbg_name)); - /* - * Well, sometimes this happens to DBG files which ARE REALLY the - * right .DBG files but nonetheless this check fails. Anyway, - * WINDBG (debugger for Windows by Microsoft) loads debug symbols - * which have incorrect timestamps. - */ - } - if (hdr->Signature == IMAGE_SEPARATE_DEBUG_SIGNATURE) - { - /* section headers come immediately after debug header */ - const IMAGE_SECTION_HEADER *sectp = - (const IMAGE_SECTION_HEADER*)(hdr + 1); - /* and after that and the exported names comes the debug directory */ - dbg = (const IMAGE_DEBUG_DIRECTORY*) - (dbg_mapping + sizeof(*hdr) + - hdr->NumberOfSections * sizeof(IMAGE_SECTION_HEADER) + - hdr->ExportedNamesSize); - - - ret = pe_load_debug_directory(pcs, module, dbg_mapping, sectp, - hdr->NumberOfSections, dbg, - hdr->DebugDirectorySize / sizeof(*dbg)); - } - else - ERR("Wrong signature in .DBG file %s\n", debugstr_a(tmp)); + /* section headers come immediately after debug header */ + sectp = (const IMAGE_SECTION_HEADER*)(hdr + 1); + /* and after that and the exported names comes the debug directory */ + dbg = (const IMAGE_DEBUG_DIRECTORY*) + (dbg_mapping + sizeof(*hdr) + + hdr->NumberOfSections * sizeof(IMAGE_SECTION_HEADER) + + hdr->ExportedNamesSize); + + ret = pe_load_debug_directory(pcs, module, dbg_mapping, sectp, + hdr->NumberOfSections, dbg, + hdr->DebugDirectorySize / sizeof(*dbg)); } else - WINE_ERR("-Unable to peruse .DBG file %s (%s)\n", debugstr_a(dbg_name), debugstr_a(tmp)); + ERR("Couldn't find .DBG file %s (%s)\n", debugstr_a(dbg_name), debugstr_a(tmp)); if (dbg_mapping) UnmapViewOfFile(dbg_mapping); if (hMap) CloseHandle(hMap); diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index 436846cb4df..9fdbd27ff1a 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -887,6 +887,7 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, DWORD count = 0, i, outsize; HRESULT hr; WINED3DDISPLAYMODE d3ddm; + WINED3DSURFTYPE type = This->ImplType; TRACE("(%p)->(%p, %p)\n", This, NumCodes, Codes); IWineD3DDevice_GetDisplayMode(This->wineD3DDevice, @@ -895,6 +896,8 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, outsize = NumCodes && Codes ? *NumCodes : 0; + if(type == SURFACE_UNKNOWN) type = SURFACE_GDI; + for(i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) { hr = IWineD3D_CheckDeviceFormat(This->wineD3D, WINED3DADAPTER_DEFAULT, @@ -902,7 +905,8 @@ IDirectDrawImpl_GetFourCCCodes(IDirectDraw7 *iface, d3ddm.Format /* AdapterFormat */, 0 /* usage */, WINED3DRTYPE_SURFACE, - formats[i]); + formats[i], + type); if(SUCCEEDED(hr)) { if(count < outsize) { Codes[count] = formats[i]; @@ -3275,7 +3279,7 @@ IDirectDrawImpl_AttachD3DDevice(IDirectDrawImpl *This, TRACE("(%p)->(%p)\n", This, primary); /* If there's no window, create a hidden window. WineD3D needs it */ - if(window == 0) + if(window == 0 || window == GetDesktopWindow()) { window = CreateWindowExA(0, This->classname, "Hidden D3D Window", WS_DISABLED, 0, 0, diff --git a/dlls/ddraw/device.c b/dlls/ddraw/device.c index edcb88f956e..84d55e08090 100644 --- a/dlls/ddraw/device.c +++ b/dlls/ddraw/device.c @@ -1164,6 +1164,7 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, { ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice7, iface); HRESULT hr; + WINED3DDISPLAYMODE mode; int i; WINED3DFORMAT FormatList[] = { @@ -1202,15 +1203,27 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, return DDERR_INVALIDPARAMS; EnterCriticalSection(&ddraw_cs); + + memset(&mode, 0, sizeof(mode)); + hr = IWineD3DDevice_GetDisplayMode(This->ddraw->wineD3DDevice, + 0, + &mode); + if(FAILED(hr)) { + LeaveCriticalSection(&ddraw_cs); + WARN("Cannot get the current adapter format\n"); + return hr; + } + for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++) { hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D, - 0 /* Adapter */, - 0 /* DeviceType */, - 0 /* AdapterFormat */, + WINED3DADAPTER_DEFAULT, + WINED3DDEVTYPE_HAL, + mode.Format, 0 /* Usage */, - 0 /* ResourceType */, - FormatList[i]); + WINED3DRTYPE_TEXTURE, + FormatList[i], + SURFACE_OPENGL); if(hr == D3D_OK) { DDPIXELFORMAT pformat; @@ -1233,12 +1246,13 @@ IDirect3DDeviceImpl_7_EnumTextureFormats(IDirect3DDevice7 *iface, for(i = 0; i < sizeof(BumpFormatList) / sizeof(WINED3DFORMAT); i++) { hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D, - 0 /* Adapter */, - 0 /* DeviceType */, - 0 /* AdapterFormat */, + WINED3DADAPTER_DEFAULT, + WINED3DDEVTYPE_HAL, + mode.Format, WINED3DUSAGE_QUERY_LEGACYBUMPMAP, - 0 /* ResourceType */, - BumpFormatList[i]); + WINED3DRTYPE_TEXTURE, + BumpFormatList[i], + SURFACE_OPENGL); if(hr == D3D_OK) { DDPIXELFORMAT pformat; @@ -1315,6 +1329,7 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface, ICOM_THIS_FROM(IDirect3DDeviceImpl, IDirect3DDevice2, iface); HRESULT hr; int i; + WINED3DDISPLAYMODE mode; WINED3DFORMAT FormatList[] = { /* 32 bit */ @@ -1339,15 +1354,27 @@ IDirect3DDeviceImpl_2_EnumTextureFormats(IDirect3DDevice2 *iface, return DDERR_INVALIDPARAMS; EnterCriticalSection(&ddraw_cs); + + memset(&mode, 0, sizeof(mode)); + hr = IWineD3DDevice_GetDisplayMode(This->ddraw->wineD3DDevice, + 0, + &mode); + if(FAILED(hr)) { + LeaveCriticalSection(&ddraw_cs); + WARN("Cannot get the current adapter format\n"); + return hr; + } + for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++) { hr = IWineD3D_CheckDeviceFormat(This->ddraw->wineD3D, 0 /* Adapter */, - 0 /* DeviceType */, - 0 /* AdapterFormat */, + WINED3DDEVTYPE_HAL, + mode.Format, 0 /* Usage */, - 0 /* ResourceType */, - FormatList[i]); + WINED3DRTYPE_TEXTURE, + FormatList[i], + SURFACE_OPENGL); if(hr == D3D_OK) { DDSURFACEDESC sdesc; diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 6c47e695a67..d3ce886c10e 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -1205,7 +1205,8 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface, d3ddm.Format /* AdapterFormat */, WINED3DUSAGE_DEPTHSTENCIL /* Usage */, WINED3DRTYPE_SURFACE, - FormatList[i]); + FormatList[i], + SURFACE_OPENGL); if(hr == D3D_OK) { DDPIXELFORMAT pformat; diff --git a/dlls/ddraw/tests/Makefile.in b/dlls/ddraw/tests/Makefile.in index a0930a76cae..74e20d7bb51 100644 --- a/dlls/ddraw/tests/Makefile.in +++ b/dlls/ddraw/tests/Makefile.in @@ -9,6 +9,7 @@ CTESTS = \ d3d.c \ ddrawmodes.c \ dsurface.c \ + overlay.c \ refcount.c \ visual.c diff --git a/dlls/ddraw/tests/overlay.c b/dlls/ddraw/tests/overlay.c new file mode 100644 index 00000000000..10f66b484fc --- /dev/null +++ b/dlls/ddraw/tests/overlay.c @@ -0,0 +1,228 @@ +/* + * Unit tests for DirectDraw overlay functions + * + * Copyright (C) 2008 Stefan Dösinger for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ +#define COBJMACROS + +#include +#include "wine/test.h" +#include "ddraw.h" +#include "unknwn.h" + +static HRESULT (WINAPI *pDirectDrawCreateEx)(LPGUID,LPVOID*,REFIID,LPUNKNOWN); + +static IDirectDraw7 *ddraw = NULL; +static IDirectDrawSurface7 *primary = NULL; + +static IDirectDrawSurface7 *create_overlay(DWORD width, DWORD height, DWORD format) { + DDSURFACEDESC2 ddsd; + HRESULT hr; + IDirectDrawSurface7 *ret; + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + ddsd.dwWidth = width; + ddsd.dwHeight = height; + ddsd.ddsCaps.dwCaps = DDSCAPS_OVERLAY; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC; + ddsd.ddpfPixelFormat.dwFourCC = format; + hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &ret, NULL); + if(FAILED(hr)) return NULL; + else return ret; +} + +static BOOL CreateDirectDraw(void) +{ + HRESULT hr; + DDSURFACEDESC2 ddsd; + IDirectDrawSurface7 *overlay = NULL; + HMODULE hmod = GetModuleHandleA("ddraw.dll"); + + pDirectDrawCreateEx = (void*)GetProcAddress(hmod, "DirectDrawCreateEx"); + if (!pDirectDrawCreateEx) { + win_skip("DirectDrawCreateEx is not available\n"); + return FALSE; + } + + hr = pDirectDrawCreateEx(NULL, (void**)&ddraw, &IID_IDirectDraw7, NULL); + ok(hr == DD_OK || hr == DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreateEx returned: %x\n", hr); + if (!ddraw) { + trace("DirectDrawCreateEx() failed with an error %x\n", hr); + return FALSE; + } + + hr = IDirectDraw_SetCooperativeLevel(ddraw, NULL, DDSCL_NORMAL); + ok(hr == DD_OK, "SetCooperativeLevel returned: %x\n", hr ); + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &primary, NULL); + if (!SUCCEEDED(hr)) { + IDirectDraw7_Release(ddraw); + trace("IDirectDraw7_CreateSurface() failed with an error %x\n", hr); + return FALSE; + } + + overlay = create_overlay(64, 64, MAKEFOURCC('U','Y','V','Y')); + if (!overlay) { + IDirectDrawSurface7_Release(primary); + IDirectDraw7_Release(ddraw); + skip("Failed to create an overlay - assuming not supported\n"); + return FALSE; + } + IDirectDraw7_Release(overlay); + + return TRUE; +} + +static void rectangle_settings(void) { + IDirectDrawSurface7 *overlay = create_overlay(64, 64, MAKEFOURCC('U','Y','V','Y')); + HRESULT hr; + RECT rect = {0, 0, 64, 64}; + LONG posx, posy; + + /* The dx sdk sort of implies that rect must be set when DDOVER_SHOW is used. Show that this is wrong */ + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, primary, &rect, DDOVER_SHOW, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, primary, NULL, DDOVER_HIDE, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, primary, NULL, DDOVER_SHOW, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + + /* Show that the overlay position is the (top, left) coordinate of the dest rectangle */ + rect.top += 16; + rect.left += 32; + rect.bottom += 16; + rect.right += 32; + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, primary, &rect, DDOVER_SHOW, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + posx = -1; posy = -1; + hr = IDirectDrawSurface7_GetOverlayPosition(overlay, &posx, &posy); + ok(hr == DD_OK, "IDirectDrawSurface7_GetOverlayPosition failed with hr=0x%08x\n", hr); + ok(posx == rect.left && posy == rect.top, "Overlay position is (%d, %d), expected (%d, %d)\n", + posx, posy, rect.left, rect.top); + + /* Passing a NULL dest rect sets the position to 0/0 . Visually it can be seen that the overlay overlays the whole primary(==screen)*/ + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, primary, NULL, 0, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + hr = IDirectDrawSurface7_GetOverlayPosition(overlay, &posx, &posy); + ok(hr == DD_OK, "IDirectDrawSurface7_GetOverlayPosition failed with hr=0x%08x\n", hr); + ok(posx == 0 && posy == 0, "Overlay position is (%d, %d), expected (%d, %d)\n", + posx, posy, 0, 0); + + /* The position cannot be retrieved when the overlay is not shown */ + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, primary, &rect, DDOVER_HIDE, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + posx = -1; posy = -1; + hr = IDirectDrawSurface7_GetOverlayPosition(overlay, &posx, &posy); + ok(hr == DDERR_OVERLAYNOTVISIBLE, "IDirectDrawSurface7_GetOverlayPosition failed with hr=0x%08x\n", hr); + ok(posx == 0 && posy == 0, "Overlay position is (%d, %d), expected (%d, %d)\n", + posx, posy, 0, 0); + + IDirectDrawSurface7_Release(overlay); +} + +static void offscreen_test(void) { + IDirectDrawSurface7 *overlay = create_overlay(64, 64, MAKEFOURCC('U','Y','V','Y')), *offscreen = NULL; + HRESULT hr; + DDSURFACEDESC2 ddsd; + + /* Try to overlay a NULL surface */ + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, NULL, NULL, DDOVER_SHOW, NULL); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, NULL, NULL, DDOVER_HIDE, NULL); + ok(hr == DDERR_INVALIDPARAMS, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + + /* Try to overlay an offscreen surface */ + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + ddsd.dwWidth = 64; + ddsd.dwHeight = 64; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + ddsd.ddpfPixelFormat.dwFourCC = 0; + ddsd.ddpfPixelFormat.dwRGBBitCount = 16; + ddsd.ddpfPixelFormat.dwRBitMask = 0xF800; + ddsd.ddpfPixelFormat.dwGBitMask = 0x07e0; + ddsd.ddpfPixelFormat.dwBBitMask = 0x001F; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + hr = IDirectDraw7_CreateSurface(ddraw, &ddsd, &offscreen, NULL); + ok(hr == DD_OK, "IDirectDraw7_CreateSurface failed with hr=0x%08x\n", hr); + + hr = IDirectDrawSurface7_UpdateOverlay(overlay, NULL, offscreen, NULL, DDOVER_SHOW, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + + /* Try to overlay the primary with a non-overlay surface */ + hr = IDirectDrawSurface7_UpdateOverlay(offscreen, NULL, primary, NULL, DDOVER_SHOW, NULL); + ok(hr == DDERR_NOTAOVERLAYSURFACE, "IDirectDrawSurface7_UpdateOverlay failed with hr=0x%08x\n", hr); + + IDirectDrawSurface7_Release(offscreen); + IDirectDrawSurface7_Release(overlay); +} + +static void yv12_test(void) +{ + HRESULT hr; + DDSURFACEDESC2 desc; + IDirectDrawSurface7 *surface; + + surface = create_overlay(256, 256, MAKEFOURCC('Y','V','1','2')); + if(!surface) { + skip("YV12 surfaces not available\n"); + return; + } + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = sizeof(desc); + hr = IDirectDrawSurface7_Lock(surface, NULL, &desc, 0, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_Lock returned 0x%08x, expected DD_OK\n", hr); + + ok(desc.dwFlags == (DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_CAPS | DDSD_PITCH), + "Unexpected desc.dwFlags 0x%08x\n", desc.dwFlags); + ok(desc.ddsCaps.dwCaps == (DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY | DDSCAPS_LOCALVIDMEM), + "Unexpected desc.ddsCaps.dwCaps 0x%08x\n", desc.ddsCaps.dwCaps); + ok(desc.dwWidth == 256 && desc.dwHeight == 256, "Expected size 64x64, got %ux%u\n", + desc.dwWidth, desc.dwHeight); + /* The overlay pitch seems to have 256 byte alignment */ + ok(desc.lPitch == 256, "Unexpected pitch %u, expected 256\n", desc.lPitch); + + hr = IDirectDrawSurface7_Unlock(surface, NULL); + ok(hr == DD_OK, "IDirectDrawSurface7_Unlock returned 0x%08x, expected DD_OK\n", hr); + + IDirectDrawSurface7_Release(surface); +} + +START_TEST(overlay) +{ + if(CreateDirectDraw() == FALSE) { + skip("Failed to initialize ddraw\n"); + return; + } + + rectangle_settings(); + offscreen_test(); + yv12_test(); + + if(primary) IDirectDrawSurface7_Release(primary); + if(ddraw) IDirectDraw7_Release(ddraw); +} diff --git a/dlls/ddraw/utils.c b/dlls/ddraw/utils.c index 5d96b367d1b..937caa4d2da 100644 --- a/dlls/ddraw/utils.c +++ b/dlls/ddraw/utils.c @@ -255,6 +255,11 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, break; case WINED3DFMT_YV12: + DDPixelFormat->u1.dwYUVBitCount = 12; + DDPixelFormat->dwFlags = DDPF_FOURCC; + DDPixelFormat->dwFourCC = WineD3DFormat; + break; + case WINED3DFMT_DXT1: case WINED3DFMT_DXT2: case WINED3DFMT_DXT3: diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c index f28fe259970..6b52de4a871 100644 --- a/dlls/dinput/dinput_main.c +++ b/dlls/dinput/dinput_main.c @@ -114,7 +114,8 @@ HRESULT WINAPI DirectInputCreateEx( TRACE("(%p,%04x,%s,%p,%p)\n", hinst, dwVersion, debugstr_guid(riid), ppDI, punkOuter); - if (IsEqualGUID( &IID_IDirectInputA, riid ) || + if (IsEqualGUID( &IID_IUnknown, riid ) || + IsEqualGUID( &IID_IDirectInputA, riid ) || IsEqualGUID( &IID_IDirectInput2A, riid ) || IsEqualGUID( &IID_IDirectInput7A, riid ) || IsEqualGUID( &IID_IDirectInputW, riid ) || @@ -817,7 +818,8 @@ static HRESULT WINAPI DICF_CreateInstance( IClassFactoryImpl *This = (IClassFactoryImpl *)iface; TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj); - if ( IsEqualGUID( &IID_IDirectInputA, riid ) || + if ( IsEqualGUID( &IID_IUnknown, riid ) || + IsEqualGUID( &IID_IDirectInputA, riid ) || IsEqualGUID( &IID_IDirectInputW, riid ) || IsEqualGUID( &IID_IDirectInput2A, riid ) || IsEqualGUID( &IID_IDirectInput2W, riid ) || diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c index 19c42b4d276..0f6d9799aae 100644 --- a/dlls/dplayx/tests/dplayx.c +++ b/dlls/dplayx/tests/dplayx.c @@ -695,6 +695,8 @@ static void init_TCPIP_provider( LPDIRECTPLAY4 pDP, hr = IDirectPlayX_InitializeConnection( pDP, pAddress, 0 ); todo_wine checkHR( DP_OK, hr ); + HeapFree( GetProcessHeap(), 0, pAddress ); + } static BOOL CALLBACK EnumSessions_cb_join( LPCDPSESSIONDESC2 lpThisSD, @@ -1223,8 +1225,6 @@ static LPDIRECTPLAY4 create_session(DPSESSIONDESC2 *lpdpsd) DPID dpid; HRESULT hr; - CoInitialize(NULL); - CoCreateInstance( &CLSID_DirectPlay, NULL, CLSCTX_ALL, &IID_IDirectPlay4A, (LPVOID*) &pDP ); @@ -1781,6 +1781,7 @@ static void test_SessionDesc(void) checkStr( "S1,S1,S1,S1,S1,S1,", callbackData.szTrace1 ); checkStr( "90,90,90,90,90,90,", callbackData.szTrace2 ); + HeapFree( GetProcessHeap(), 0, lpDataMsg ); for (i=0; i<2; i++) { HeapFree( GetProcessHeap(), 0, lpData[i] ); @@ -3179,7 +3180,7 @@ static void test_CreateGroup(void) groupName.dwSize = sizeof(DPNAME); - groupName.lpszShortNameA = (LPSTR) lpData; + U1(groupName).lpszShortNameA = (LPSTR) lpData; hr = IDirectPlayX_CreateGroup( pDP, &idGroup, @@ -3198,14 +3199,14 @@ static void test_CreateGroup(void) hr = IDirectPlayX_Receive( pDP, &idFrom, &idTo, 0, (LPVOID) lpDataGet, &dwDataSizeGet ); checkHR( DP_OK, hr ); - if ( NULL == lpDataGet->dpnName.lpszShortNameA ) + if ( NULL == U1(lpDataGet->dpnName).lpszShortNameA ) { check( 48, dwDataSizeGet ); } else { check( 48 + dwDataSize, dwDataSizeGet ); - checkStr( lpData, lpDataGet->dpnName.lpszShortNameA ); + checkStr( lpData, U1(lpDataGet->dpnName).lpszShortNameA ); } check( DPID_SYSMSG, idFrom ); checkConv( DPSYS_CREATEPLAYERORGROUP, lpDataGet->dwType, dpMsgType2str ); @@ -5305,7 +5306,7 @@ static void test_Receive(void) check( DPPLAYERTYPE_PLAYER, lpDataCreate->dwPlayerType ); checkLP( NULL, lpDataCreate->lpData ); check( 0, lpDataCreate->dwDataSize ); - checkLP( NULL, lpDataCreate->dpnName.lpszShortNameA ); + checkLP( NULL, U1(lpDataCreate->dpnName).lpszShortNameA ); check( 0, lpDataCreate->dpIdParent ); } else /* Player destruction */ @@ -5319,7 +5320,7 @@ static void test_Receive(void) check( 0, lpDataDestroy->dwLocalDataSize ); checkLP( NULL, lpDataDestroy->lpRemoteData ); check( 0, lpDataDestroy->dwRemoteDataSize ); - checkLP( NULL, lpDataDestroy->dpnName.lpszShortNameA ); + checkLP( NULL, U1(lpDataDestroy->dpnName).lpszShortNameA ); check( 0, lpDataDestroy->dpIdParent ); } @@ -6208,6 +6209,7 @@ static void test_remote_data_replication(void) checkStr( "", callbackData.szTrace1 ); + HeapFree( GetProcessHeap(), 0, lpDataGet ); HeapFree( GetProcessHeap(), 0, lpData ); IDirectPlayX_Release( pDP[0] ); IDirectPlayX_Release( pDP[1] ); diff --git a/dlls/dsound/buffer.c b/dlls/dsound/buffer.c index 480e8a134de..6659a47dcc1 100644 --- a/dlls/dsound/buffer.c +++ b/dlls/dsound/buffer.c @@ -735,7 +735,12 @@ static HRESULT WINAPI IDirectSoundBufferImpl_Unlock( { RtlAcquireResourceShared(&iter->lock, TRUE); if (x1) - DSOUND_MixToTemporary(iter, (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory, x1, FALSE); + { + if(x1 + (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory > iter->buflen) + hres = DSERR_INVALIDPARAM; + else + DSOUND_MixToTemporary(iter, (DWORD_PTR)p1 - (DWORD_PTR)iter->buffer->memory, x1, FALSE); + } if (x2) DSOUND_MixToTemporary(iter, 0, x2, FALSE); RtlReleaseResource(&iter->lock); diff --git a/dlls/dsound/mixer.c b/dlls/dsound/mixer.c index 7fe94239f12..3c13e8f1060 100644 --- a/dlls/dsound/mixer.c +++ b/dlls/dsound/mixer.c @@ -826,8 +826,32 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) mixplaypos = DSOUND_bufpos_to_mixpos(device, device->playpos); mixplaypos2 = DSOUND_bufpos_to_mixpos(device, playpos); - /* wipe out just-played sound data */ - if (playpos < device->playpos) { + + /* calc maximum prebuff */ + prebuff_max = (device->prebuf * device->fraglen); + if (!device->hwbuf && playpos + prebuff_max >= device->helfrags * device->fraglen) + prebuff_max += device->buflen - device->helfrags * device->fraglen; + + /* check how close we are to an underrun. It occurs when the writepos overtakes the mixpos */ + prebuff_left = DSOUND_BufPtrDiff(device->buflen, device->mixpos, playpos); + writelead = DSOUND_BufPtrDiff(device->buflen, writepos, playpos); + + /* check for underrun. underrun occurs when the write position passes the mix position + * also wipe out just-played sound data */ + if((prebuff_left > prebuff_max) || (device->state == STATE_STOPPED) || (device->state == STATE_STARTING)){ + if (device->state == STATE_STOPPING || device->state == STATE_PLAYING) + WARN("Probable buffer underrun\n"); + else TRACE("Buffer starting or buffer underrun\n"); + + /* recover mixing for all buffers */ + recover = TRUE; + + /* reset mix position to write position */ + device->mixpos = writepos; + + ZeroMemory(device->mix_buffer, device->mix_buffer_len); + ZeroMemory(device->buffer, device->buflen); + } else if (playpos < device->playpos) { buf1 = device->buffer + device->playpos; buf2 = device->buffer; size1 = device->buflen - device->playpos; @@ -861,34 +885,12 @@ static void DSOUND_PerformMix(DirectSoundDevice *device) } device->playpos = playpos; - /* calc maximum prebuff */ - prebuff_max = (device->prebuf * device->fraglen); - if (!device->hwbuf && playpos + prebuff_max >= device->helfrags * device->fraglen) - prebuff_max += device->buflen - device->helfrags * device->fraglen; - - /* check how close we are to an underrun. It occurs when the writepos overtakes the mixpos */ - prebuff_left = DSOUND_BufPtrDiff(device->buflen, device->mixpos, playpos); - writelead = DSOUND_BufPtrDiff(device->buflen, writepos, playpos); - /* find the maximum we can prebuffer from current write position */ maxq = (writelead < prebuff_max) ? (prebuff_max - writelead) : 0; TRACE("prebuff_left = %d, prebuff_max = %dx%d=%d, writelead=%d\n", prebuff_left, device->prebuf, device->fraglen, prebuff_max, writelead); - /* check for underrun. underrun occurs when the write position passes the mix position */ - if((prebuff_left > prebuff_max) || (device->state == STATE_STOPPED) || (device->state == STATE_STARTING)){ - if (device->state == STATE_STOPPING || device->state == STATE_PLAYING) - WARN("Probable buffer underrun\n"); - else TRACE("Buffer starting or buffer underrun\n"); - - /* recover mixing for all buffers */ - recover = TRUE; - - /* reset mix position to write position */ - device->mixpos = writepos; - } - /* Do we risk an 'underrun' if we don't advance pointer? */ if (writelead/device->fraglen <= ds_snd_queue_min || recover) mustlock = TRUE; diff --git a/dlls/dsound/tests/ds3d.c b/dlls/dsound/tests/ds3d.c index de3e38c2037..c3fa0ed7aa3 100644 --- a/dlls/dsound/tests/ds3d.c +++ b/dlls/dsound/tests/ds3d.c @@ -197,6 +197,9 @@ static int buffer_refill(play_state_t* state, DWORD size) state->written+=len2; } state->offset=state->written % state->buffer_size; + /* some apps blindly pass &ptr1 instead of ptr1 */ + rc=IDirectSoundBuffer_Unlock(state->dsbo,&ptr1,len1,ptr2,len2); + ok(rc==DSERR_INVALIDPARAM, "IDDirectSoundBuffer_Unlock(): expected %08x got %08x, %p %p\n",DSERR_INVALIDPARAM, rc, &ptr1, ptr1); rc=IDirectSoundBuffer_Unlock(state->dsbo,ptr1,len1,ptr2,len2); ok(rc==DS_OK,"IDirectSoundBuffer_Unlock() failed: %08x\n", rc); if (rc!=DS_OK) diff --git a/dlls/dsound/tests/dsound.c b/dlls/dsound/tests/dsound.c index 14a6a778e17..d6c0f29f211 100644 --- a/dlls/dsound/tests/dsound.c +++ b/dlls/dsound/tests/dsound.c @@ -759,7 +759,7 @@ static HRESULT test_secondary(LPGUID lpGuid) wfxe.Format.cbSize = sizeof(wfxe) - sizeof(wfx) + 1; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(DSERR_CONTROLUNAVAIL && !secondary, + ok(rc==DSERR_CONTROLUNAVAIL && !secondary, "IDirectSound_CreateSoundBuffer() returned: %08x %p\n", rc, secondary); if (secondary) diff --git a/dlls/dsound/tests/dsound8.c b/dlls/dsound/tests/dsound8.c index e45f28914c6..8edb9b482d4 100644 --- a/dlls/dsound/tests/dsound8.c +++ b/dlls/dsound/tests/dsound8.c @@ -753,7 +753,7 @@ static HRESULT test_secondary8(LPGUID lpGuid) wfxe.Format.cbSize = sizeof(wfxe) - sizeof(wfx) + 1; rc=IDirectSound_CreateSoundBuffer(dso,&bufdesc,&secondary,NULL); - ok(DSERR_CONTROLUNAVAIL && !secondary, + ok(rc==DSERR_CONTROLUNAVAIL && !secondary, "IDirectSound_CreateSoundBuffer() returned: %08x %p\n", rc, secondary); if (secondary) diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index cb351db7693..74e70ea2714 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -163,7 +163,11 @@ MAKE_FUNCPTR(FT_Get_Sfnt_Table); MAKE_FUNCPTR(FT_Init_FreeType); MAKE_FUNCPTR(FT_Load_Glyph); MAKE_FUNCPTR(FT_Matrix_Multiply); +#ifdef FT_MULFIX_INLINED +#define pFT_MulFix FT_MULFIX_INLINED +#else MAKE_FUNCPTR(FT_MulFix); +#endif MAKE_FUNCPTR(FT_New_Face); MAKE_FUNCPTR(FT_New_Memory_Face); MAKE_FUNCPTR(FT_Outline_Get_Bitmap); @@ -2434,7 +2438,9 @@ static BOOL init_freetype(void) LOAD_FUNCPTR(FT_Init_FreeType) LOAD_FUNCPTR(FT_Load_Glyph) LOAD_FUNCPTR(FT_Matrix_Multiply) +#ifndef FT_MULFIX_INLINED LOAD_FUNCPTR(FT_MulFix) +#endif LOAD_FUNCPTR(FT_New_Face) LOAD_FUNCPTR(FT_New_Memory_Face) LOAD_FUNCPTR(FT_Outline_Get_Bitmap) diff --git a/dlls/gdi32/tests/palette.c b/dlls/gdi32/tests/palette.c index c9455cab659..851c3213e14 100644 --- a/dlls/gdi32/tests/palette.c +++ b/dlls/gdi32/tests/palette.c @@ -110,7 +110,9 @@ static void test_DIB_PAL_COLORS(void) { SetPixel( memhdc, 0, 0, setColor ); chkColor = RGB( logpalettedata[3].peRed, logpalettedata[3].peGreen, logpalettedata[3].peBlue ); getColor = GetPixel( memhdc, 0, 0 ); - ok( getColor == chkColor, "getColor=%08X\n", (UINT)getColor ); + ok( getColor == chkColor || + broken(getColor == 0), /* win9x */ + "getColor=%08X\n", (UINT)getColor ); SelectPalette( memhdc, hpalOld, FALSE ); DeleteObject( hpal ); diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c index 13cd3abdf05..067fdde75c5 100644 --- a/dlls/gdiplus/brush.c +++ b/dlls/gdiplus/brush.c @@ -36,6 +36,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); GpStatus WINGDIPAPI GdipCloneBrush(GpBrush *brush, GpBrush **clone) { + TRACE("(%p, %p)\n", brush, clone); + if(!brush || !clone) return InvalidParameter; @@ -125,6 +127,9 @@ GpStatus WINGDIPAPI GdipCreateLineBrush(GDIPCONST GpPointF* startpoint, { COLORREF col = ARGB2COLORREF(startcolor); + TRACE("(%p, %p, %x, %x, %d, %p)\n", startpoint, endpoint, + startcolor, endcolor, wrap, line); + if(!line || !startpoint || !endpoint || wrap == WrapModeClamp) return InvalidParameter; @@ -156,6 +161,9 @@ GpStatus WINGDIPAPI GdipCreateLineBrushI(GDIPCONST GpPoint* startpoint, GpPointF stF; GpPointF endF; + TRACE("(%p, %p, %x, %x, %d, %p)\n", startpoint, endpoint, + startcolor, endcolor, wrap, line); + if(!startpoint || !endpoint) return InvalidParameter; @@ -173,6 +181,9 @@ GpStatus WINGDIPAPI GdipCreateLineBrushFromRect(GDIPCONST GpRectF* rect, { GpPointF start, end; + TRACE("(%p, %x, %x, %d, %d, %p)\n", rect, startcolor, endcolor, mode, + wrap, line); + if(!line || !rect) return InvalidParameter; @@ -190,6 +201,9 @@ GpStatus WINGDIPAPI GdipCreateLineBrushFromRectI(GDIPCONST GpRect* rect, { GpRectF rectF; + TRACE("(%p, %x, %x, %d, %d, %p)\n", rect, startcolor, endcolor, mode, + wrap, line); + rectF.X = (REAL) rect->X; rectF.Y = (REAL) rect->Y; rectF.Width = (REAL) rect->Width; @@ -205,6 +219,9 @@ GpStatus WINGDIPAPI GdipCreateLineBrushFromRectWithAngle(GDIPCONST GpRectF* rect ARGB startcolor, ARGB endcolor, REAL angle, BOOL isAngleScalable, GpWrapMode wrap, GpLineGradient **line) { + TRACE("(%p, %x, %x, %.2f, %d, %d, %p)\n", rect, startcolor, endcolor, angle, isAngleScalable, + wrap, line); + return GdipCreateLineBrushFromRect(rect, startcolor, endcolor, LinearGradientModeForwardDiagonal, wrap, line); } @@ -213,6 +230,9 @@ GpStatus WINGDIPAPI GdipCreateLineBrushFromRectWithAngleI(GDIPCONST GpRect* rect ARGB startcolor, ARGB endcolor, REAL angle, BOOL isAngleScalable, GpWrapMode wrap, GpLineGradient **line) { + TRACE("(%p, %x, %x, %.2f, %d, %d, %p)\n", rect, startcolor, endcolor, angle, isAngleScalable, + wrap, line); + return GdipCreateLineBrushFromRectI(rect, startcolor, endcolor, LinearGradientModeForwardDiagonal, wrap, line); } @@ -222,6 +242,8 @@ GpStatus WINGDIPAPI GdipCreatePathGradient(GDIPCONST GpPointF* points, { COLORREF col = ARGB2COLORREF(0xffffffff); + TRACE("(%p, %d, %d, %p)\n", points, count, wrap, grad); + if(!points || !grad) return InvalidParameter; @@ -278,6 +300,8 @@ GpStatus WINGDIPAPI GdipCreatePathGradientI(GDIPCONST GpPoint* points, GpStatus ret; INT i; + TRACE("(%p, %d, %d, %p)\n", points, count, wrap, grad); + if(!points || !grad) return InvalidParameter; @@ -305,6 +329,8 @@ GpStatus WINGDIPAPI GdipCreatePathGradientFromPath(GDIPCONST GpPath* path, { COLORREF col = ARGB2COLORREF(0xffffffff); + TRACE("(%p, %p)\n", path, grad); + if(!path || !grad) return InvalidParameter; @@ -357,6 +383,8 @@ GpStatus WINGDIPAPI GdipCreateSolidFill(ARGB color, GpSolidFill **sf) { COLORREF col = ARGB2COLORREF(color); + TRACE("(%x, %p)\n", color, sf); + if(!sf) return InvalidParameter; *sf = GdipAlloc(sizeof(GpSolidFill)); @@ -373,6 +401,53 @@ GpStatus WINGDIPAPI GdipCreateSolidFill(ARGB color, GpSolidFill **sf) return Ok; } +/******************************************************************************* + * GdipCreateTexture [GDIPLUS.@] + * + * PARAMS + * image [I] image to use + * wrapmode [I] optional + * texture [O] pointer to the resulting texturebrush + * + * RETURNS + * SUCCESS: Ok + * FAILURE: element of GpStatus + */ +GpStatus WINGDIPAPI GdipCreateTexture(GpImage *image, GpWrapMode wrapmode, + GpTexture **texture) +{ + UINT width, height; + GpImageAttributes attributes; + GpStatus stat; + + TRACE("%p, %d %p\n", image, wrapmode, texture); + + if (!(image && texture)) + return InvalidParameter; + + stat = GdipGetImageWidth(image, &width); + if (stat != Ok) return stat; + stat = GdipGetImageHeight(image, &height); + if (stat != Ok) return stat; + attributes.wrap = wrapmode; + + return GdipCreateTextureIA(image, &attributes, 0, 0, width, height, + texture); +} + +GpStatus WINGDIPAPI GdipCreateTexture2(GpImage *image, GpWrapMode wrapmode, + REAL x, REAL y, REAL width, REAL height, GpTexture **texture) +{ + GpImageAttributes attributes; + + TRACE("%p %d %f %f %f %f %p\n", image, wrapmode, + x, y, width, height, texture); + + attributes.wrap = wrapmode; + return GdipCreateTextureIA(image, &attributes, x, y, width, height, + texture); +} + /* FIXME: imageattr ignored */ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image, GDIPCONST GpImageAttributes *imageattr, REAL x, REAL y, REAL width, @@ -387,6 +462,9 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image, BOOL bm_is_selected; BYTE *dibits, *buff, *textbits; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %p)\n", image, imageattr, x, y, width, height, + texture); + if(!image || !texture || x < 0.0 || y < 0.0 || width < 0.0 || height < 0.0) return InvalidParameter; @@ -491,11 +569,29 @@ GpStatus WINGDIPAPI GdipCreateTextureIA(GpImage *image, GpStatus WINGDIPAPI GdipCreateTextureIAI(GpImage *image, GDIPCONST GpImageAttributes *imageattr, INT x, INT y, INT width, INT height, GpTexture **texture) { + TRACE("(%p, %p, %d, %d, %d, %d, %p)\n", image, imageattr, x, y, width, height, + texture); + return GdipCreateTextureIA(image,imageattr,(REAL)x,(REAL)y,(REAL)width,(REAL)height,texture); } +GpStatus WINGDIPAPI GdipCreateTexture2I(GpImage *image, GpWrapMode wrapmode, + INT x, INT y, INT width, INT height, GpTexture **texture) +{ + GpImageAttributes imageattr; + + TRACE("%p %d %d %d %d %d %p\n", image, wrapmode, x, y, width, height, + texture); + + imageattr.wrap = wrapmode; + + return GdipCreateTextureIA(image, &imageattr, x, y, width, height, texture); +} + GpStatus WINGDIPAPI GdipGetBrushType(GpBrush *brush, GpBrushType *type) { + TRACE("(%p, %p)\n", brush, type); + if(!brush || !type) return InvalidParameter; *type = brush->bt; @@ -505,6 +601,8 @@ GpStatus WINGDIPAPI GdipGetBrushType(GpBrush *brush, GpBrushType *type) GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush) { + TRACE("(%p)\n", brush); + if(!brush) return InvalidParameter; switch(brush->bt) @@ -531,7 +629,9 @@ GpStatus WINGDIPAPI GdipDeleteBrush(GpBrush *brush) GpStatus WINGDIPAPI GdipGetLineGammaCorrection(GpLineGradient *line, BOOL *usinggamma) { - if(!line) + TRACE("(%p, %p)\n", line, usinggamma); + + if(!line || !usinggamma) return InvalidParameter; *usinggamma = line->gamma; @@ -541,6 +641,8 @@ GpStatus WINGDIPAPI GdipGetLineGammaCorrection(GpLineGradient *line, GpStatus WINGDIPAPI GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapmode) { + TRACE("(%p, %p)\n", brush, wrapmode); + if(!brush || !wrapmode) return InvalidParameter; @@ -552,6 +654,8 @@ GpStatus WINGDIPAPI GdipGetLineWrapMode(GpLineGradient *brush, GpWrapMode *wrapm GpStatus WINGDIPAPI GdipGetPathGradientBlend(GpPathGradient *brush, REAL *blend, REAL *positions, INT count) { + TRACE("(%p, %p, %p, %d)\n", brush, blend, positions, count); + if(!brush || !blend || !positions || count <= 0) return InvalidParameter; @@ -568,6 +672,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientBlend(GpPathGradient *brush, REAL *blend, GpStatus WINGDIPAPI GdipGetPathGradientBlendCount(GpPathGradient *brush, INT *count) { + TRACE("(%p, %p)\n", brush, count); + if(!brush || !count) return InvalidParameter; @@ -579,6 +685,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientBlendCount(GpPathGradient *brush, INT *co GpStatus WINGDIPAPI GdipGetPathGradientCenterPoint(GpPathGradient *grad, GpPointF *point) { + TRACE("(%p, %p)\n", grad, point); + if(!grad || !point) return InvalidParameter; @@ -594,6 +702,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientCenterPointI(GpPathGradient *grad, GpStatus ret; GpPointF ptf; + TRACE("(%p, %p)\n", grad, point); + if(!point) return InvalidParameter; @@ -610,6 +720,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientCenterPointI(GpPathGradient *grad, GpStatus WINGDIPAPI GdipGetPathGradientFocusScales(GpPathGradient *grad, REAL *x, REAL *y) { + TRACE("(%p, %p, %p)\n", grad, x, y); + if(!grad || !x || !y) return InvalidParameter; @@ -622,6 +734,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientFocusScales(GpPathGradient *grad, GpStatus WINGDIPAPI GdipGetPathGradientGammaCorrection(GpPathGradient *grad, BOOL *gamma) { + TRACE("(%p, %p)\n", grad, gamma); + if(!grad || !gamma) return InvalidParameter; @@ -633,6 +747,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientGammaCorrection(GpPathGradient *grad, GpStatus WINGDIPAPI GdipGetPathGradientPointCount(GpPathGradient *grad, INT *count) { + TRACE("(%p, %p)\n", grad, count); + if(!grad || !count) return InvalidParameter; @@ -647,6 +763,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientRect(GpPathGradient *brush, GpRectF *rect GpPath* path; GpStatus stat; + TRACE("(%p, %p)\n", brush, rect); + if(!brush || !rect) return InvalidParameter; @@ -672,6 +790,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientRectI(GpPathGradient *brush, GpRect *rect GpRectF rectf; GpStatus stat; + TRACE("(%p, %p)\n", brush, rect); + if(!brush || !rect) return InvalidParameter; @@ -703,6 +823,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush, GpWrapMode *wrapmode) { + TRACE("(%p, %p)\n", brush, wrapmode); + if(!brush || !wrapmode) return InvalidParameter; @@ -713,6 +835,8 @@ GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush, GpStatus WINGDIPAPI GdipGetSolidFillColor(GpSolidFill *sf, ARGB *argb) { + TRACE("(%p, %p)\n", sf, argb); + if(!sf || !argb) return InvalidParameter; @@ -738,6 +862,8 @@ GpStatus WINGDIPAPI GdipSetLineBlend(GpLineGradient *brush, GpStatus WINGDIPAPI GdipSetLineGammaCorrection(GpLineGradient *line, BOOL usegamma) { + TRACE("(%p, %d)\n", line, usegamma); + if(!line) return InvalidParameter; @@ -763,6 +889,8 @@ GpStatus WINGDIPAPI GdipSetLineSigmaBlend(GpLineGradient *line, REAL focus, GpStatus WINGDIPAPI GdipSetLineWrapMode(GpLineGradient *line, GpWrapMode wrap) { + TRACE("(%p, %d)\n", line, wrap); + if(!line || wrap == WrapModeClamp) return InvalidParameter; @@ -774,6 +902,8 @@ GpStatus WINGDIPAPI GdipSetLineWrapMode(GpLineGradient *line, GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad, ARGB argb) { + TRACE("(%p, %x)\n", grad, argb); + if(!grad) return InvalidParameter; @@ -789,6 +919,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad, GpStatus WINGDIPAPI GdipSetPathGradientCenterPoint(GpPathGradient *grad, GpPointF *point) { + TRACE("(%p, %p)\n", grad, point); + if(!grad || !point) return InvalidParameter; @@ -803,6 +935,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientCenterPointI(GpPathGradient *grad, { GpPointF ptf; + TRACE("(%p, %p)\n", grad, point); + if(!point) return InvalidParameter; @@ -815,6 +949,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientCenterPointI(GpPathGradient *grad, GpStatus WINGDIPAPI GdipSetPathGradientFocusScales(GpPathGradient *grad, REAL x, REAL y) { + TRACE("(%p, %.2f, %.2f)\n", grad, x, y); + if(!grad) return InvalidParameter; @@ -827,6 +963,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientFocusScales(GpPathGradient *grad, GpStatus WINGDIPAPI GdipSetPathGradientGammaCorrection(GpPathGradient *grad, BOOL gamma) { + TRACE("(%p, %d)\n", grad, gamma); + if(!grad) return InvalidParameter; @@ -867,6 +1005,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient GpStatus WINGDIPAPI GdipSetPathGradientWrapMode(GpPathGradient *grad, GpWrapMode wrap) { + TRACE("(%p, %d)\n", grad, wrap); + if(!grad) return InvalidParameter; @@ -877,6 +1017,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientWrapMode(GpPathGradient *grad, GpStatus WINGDIPAPI GdipSetSolidFillColor(GpSolidFill *sf, ARGB argb) { + TRACE("(%p, %x)\n", sf, argb); + if(!sf) return InvalidParameter; @@ -906,6 +1048,8 @@ GpStatus WINGDIPAPI GdipSetTextureTransform(GpTexture *texture, GpStatus WINGDIPAPI GdipSetLineColors(GpLineGradient *brush, ARGB color1, ARGB color2) { + TRACE("(%p, %x, %x)\n", brush, color1, color2); + if(!brush) return InvalidParameter; @@ -917,6 +1061,8 @@ GpStatus WINGDIPAPI GdipSetLineColors(GpLineGradient *brush, ARGB color1, GpStatus WINGDIPAPI GdipGetLineColors(GpLineGradient *brush, ARGB *colors) { + TRACE("(%p, %p)\n", brush, colors); + if(!brush || !colors) return InvalidParameter; @@ -959,8 +1105,18 @@ GpStatus WINGDIPAPI GdipSetLineTransform(GpLineGradient *brush, return NotImplemented; } +GpStatus WINGDIPAPI GdipTranslateLineTransform(GpLineGradient* brush, + REAL dx, REAL dy, GpMatrixOrder order) +{ + FIXME("stub: %p %f %f %d\n", brush, dx, dy, order); + + return NotImplemented; +} + GpStatus WINGDIPAPI GdipGetLineRect(GpLineGradient *brush, GpRectF *rect) { + TRACE("(%p, %p)\n", brush, rect); + if(!brush || !rect) return InvalidParameter; @@ -978,6 +1134,8 @@ GpStatus WINGDIPAPI GdipGetLineRectI(GpLineGradient *brush, GpRect *rect) GpRectF rectF; GpStatus ret; + TRACE("(%p, %p)\n", brush, rect); + if(!rect) return InvalidParameter; diff --git a/dlls/gdiplus/customlinecap.c b/dlls/gdiplus/customlinecap.c index 48a20dfbc10..5658e69c00d 100644 --- a/dlls/gdiplus/customlinecap.c +++ b/dlls/gdiplus/customlinecap.c @@ -33,6 +33,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); GpStatus WINGDIPAPI GdipCloneCustomLineCap(GpCustomLineCap* from, GpCustomLineCap** to) { + TRACE("(%p, %p)\n", from, to); + if(!from || !to) return InvalidParameter; @@ -108,6 +110,8 @@ GpStatus WINGDIPAPI GdipCreateCustomLineCap(GpPath* fillPath, GpPath* strokePath GpStatus WINGDIPAPI GdipDeleteCustomLineCap(GpCustomLineCap *customCap) { + TRACE("(%p)\n", customCap); + if(!customCap) return InvalidParameter; @@ -121,6 +125,8 @@ GpStatus WINGDIPAPI GdipDeleteCustomLineCap(GpCustomLineCap *customCap) GpStatus WINGDIPAPI GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpLineJoin* lineJoin) { + TRACE("(%p, %p)\n", customCap, lineJoin); + if(!customCap || !lineJoin) return InvalidParameter; @@ -132,6 +138,8 @@ GpStatus WINGDIPAPI GdipGetCustomLineCapStrokeJoin(GpCustomLineCap* customCap, GpStatus WINGDIPAPI GdipGetCustomLineCapWidthScale(GpCustomLineCap* custom, REAL* widthScale) { + TRACE("(%p, %p)\n", custom, widthScale); + if(!custom || !widthScale) return InvalidParameter; @@ -168,6 +176,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapBaseCap(GpCustomLineCap* custom, GpStatus WINGDIPAPI GdipGetCustomLineCapBaseInset(GpCustomLineCap* custom, REAL* inset) { + TRACE("(%p, %p)\n", custom, inset); + if(!custom || !inset) return InvalidParameter; @@ -191,6 +201,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapBaseInset(GpCustomLineCap* custom, GpStatus WINGDIPAPI GdipSetCustomLineCapStrokeJoin(GpCustomLineCap* custom, GpLineJoin join) { + TRACE("(%p, %d)\n", custom, join); + if(!custom) return InvalidParameter; @@ -212,6 +224,8 @@ GpStatus WINGDIPAPI GdipSetCustomLineCapWidthScale(GpCustomLineCap* custom, GpStatus WINGDIPAPI GdipGetCustomLineCapBaseCap(GpCustomLineCap *customCap, GpLineCap *baseCap) { + TRACE("(%p, %p)\n", customCap, baseCap); + if(!customCap || !baseCap) return InvalidParameter; @@ -219,3 +233,94 @@ GpStatus WINGDIPAPI GdipGetCustomLineCapBaseCap(GpCustomLineCap *customCap, GpLi return Ok; } + +GpStatus WINGDIPAPI GdipCreateAdjustableArrowCap(REAL height, REAL width, BOOL fill, + GpAdjustableArrowCap **cap) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL* fill) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL* height) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL* middle) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL* width) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap* cap, BOOL fill) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap* cap, REAL height) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap* cap, REAL middle) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} + +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap* cap, REAL width) +{ + static int calls; + + if(!(calls++)) + FIXME("not implemented\n"); + + return NotImplemented; +} diff --git a/dlls/gdiplus/font.c b/dlls/gdiplus/font.c index 3a9d36ddd50..210ebfff3c7 100644 --- a/dlls/gdiplus/font.c +++ b/dlls/gdiplus/font.c @@ -166,6 +166,8 @@ GpStatus WINGDIPAPI GdipCreateFontFromLogfontW(HDC hdc, HFONT hfont, oldfont; TEXTMETRICW textmet; + TRACE("(%p, %p, %p)\n", hdc, logfont, font); + if(!logfont || !font) return InvalidParameter; @@ -206,6 +208,8 @@ GpStatus WINGDIPAPI GdipCreateFontFromLogfontA(HDC hdc, { LOGFONTW lfw; + TRACE("(%p, %p, %p)\n", hdc, lfa, font); + if(!lfa || !font) return InvalidParameter; @@ -224,6 +228,8 @@ GpStatus WINGDIPAPI GdipCreateFontFromLogfontA(HDC hdc, */ GpStatus WINGDIPAPI GdipDeleteFont(GpFont* font) { + TRACE("(%p)\n", font); + if(!font) return InvalidParameter; @@ -240,6 +246,8 @@ GpStatus WINGDIPAPI GdipCreateFontFromDC(HDC hdc, GpFont **font) HFONT hfont; LOGFONTW lfw; + TRACE("(%p, %p)\n", hdc, font); + if(!font) return InvalidParameter; @@ -294,6 +302,8 @@ GpStatus WINGDIPAPI GdipGetFamily(GpFont *font, GpFontFamily **family) */ GpStatus WINGDIPAPI GdipGetFontSize(GpFont *font, REAL *size) { + TRACE("(%p, %p)\n", font, size); + if (!(font && size)) return InvalidParameter; *size = font->emSize; @@ -348,6 +358,8 @@ GpStatus WINGDIPAPI GdipGetFontStyle(GpFont *font, INT *style) */ GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit) { + TRACE("(%p, %p)\n", font, unit); + if (!(font && unit)) return InvalidParameter; *unit = font->unit; @@ -361,6 +373,8 @@ GpStatus WINGDIPAPI GdipGetFontUnit(GpFont *font, Unit *unit) GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics, LOGFONTW *lfw) { + TRACE("(%p, %p, %p)\n", font, graphics, lfw); + /* FIXME: use graphics */ if(!font || !graphics || !lfw) return InvalidParameter; @@ -375,6 +389,8 @@ GpStatus WINGDIPAPI GdipGetLogFontW(GpFont *font, GpGraphics *graphics, */ GpStatus WINGDIPAPI GdipCloneFont(GpFont *font, GpFont **cloneFont) { + TRACE("(%p, %p)\n", font, cloneFont); + if(!font || !cloneFont) return InvalidParameter; @@ -624,6 +640,8 @@ GpStatus WINGDIPAPI GdipGetCellAscent(GDIPCONST GpFontFamily *family, GpStatus WINGDIPAPI GdipGetCellDescent(GDIPCONST GpFontFamily *family, INT style, UINT16* CellDescent) { + TRACE("(%p, %d, %p)\n", family, style, CellDescent); + if (!(family && CellDescent)) return InvalidParameter; *CellDescent = family->tmw.tmDescent; @@ -730,6 +748,8 @@ GpStatus WINGDIPAPI GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily) { static const WCHAR TimesNewRoman[] = {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n','\0'}; + TRACE("(%p)\n", nativeFamily); + if (nativeFamily == NULL) return InvalidParameter; return GdipCreateFontFamilyFromName(TimesNewRoman, NULL, nativeFamily); @@ -753,6 +773,8 @@ GpStatus WINGDIPAPI GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamil * affect anything */ static const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'}; + TRACE("(%p)\n", nativeFamily); + if (nativeFamily == NULL) return InvalidParameter; return GdipCreateFontFamilyFromName(MSSansSerif, NULL, nativeFamily); diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index 725c0246a4f..f7b1d5d3e57 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -69,7 +69,7 @@ @ stdcall GdipConvertToEmfPlus(ptr ptr ptr long ptr ptr) @ stub GdipConvertToEmfPlusToFile @ stub GdipConvertToEmfPlusToStream -@ stub GdipCreateAdjustableArrowCap +@ stdcall GdipCreateAdjustableArrowCap(long long long ptr) @ stub GdipCreateBitmapFromDirectDrawSurface @ stdcall GdipCreateBitmapFromFile(wstr ptr) @ stdcall GdipCreateBitmapFromFileICM(wstr ptr) @@ -131,9 +131,9 @@ @ stdcall GdipCreateSolidFill(long ptr) @ stdcall GdipCreateStreamOnFile(ptr long ptr) @ stdcall GdipCreateStringFormat(long long ptr) -@ stub GdipCreateTexture2 -@ stub GdipCreateTexture2I -@ stub GdipCreateTexture +@ stdcall GdipCreateTexture2(ptr long long long long long ptr) +@ stdcall GdipCreateTexture2I(ptr long long long long long ptr) +@ stdcall GdipCreateTexture(ptr long ptr) @ stdcall GdipCreateTextureIA(ptr ptr long long long long ptr) @ stdcall GdipCreateTextureIAI(ptr ptr long long long long ptr) @ stdcall GdipDeleteBrush(ptr) @@ -236,10 +236,10 @@ @ stdcall GdipFlattenPath(ptr ptr long) @ stdcall GdipFlush(ptr long) @ stdcall GdipFree(ptr) -@ stub GdipGetAdjustableArrowCapFillState -@ stub GdipGetAdjustableArrowCapHeight -@ stub GdipGetAdjustableArrowCapMiddleInset -@ stub GdipGetAdjustableArrowCapWidth +@ stdcall GdipGetAdjustableArrowCapFillState(ptr ptr) +@ stdcall GdipGetAdjustableArrowCapHeight(ptr ptr) +@ stdcall GdipGetAdjustableArrowCapMiddleInset(ptr ptr) +@ stdcall GdipGetAdjustableArrowCapWidth(ptr ptr) @ stub GdipGetAllPropertyItems @ stdcall GdipGetBrushType(ptr ptr) @ stdcall GdipGetCellAscent(ptr long ptr) @@ -403,7 +403,7 @@ @ stub GdipGetVisibleClipBounds @ stub GdipGetVisibleClipBoundsI @ stdcall GdipGetWorldTransform(ptr ptr) -@ stub GdipGraphicsClear +@ stdcall GdipGraphicsClear(ptr long) @ stub GdipGraphicsSetAbort @ stub GdipImageForceValidation @ stdcall GdipImageGetFrameCount(ptr ptr ptr) @@ -502,10 +502,10 @@ @ stub GdipScalePenTransform @ stub GdipScaleTextureTransform @ stdcall GdipScaleWorldTransform(ptr long long long) -@ stub GdipSetAdjustableArrowCapFillState -@ stub GdipSetAdjustableArrowCapHeight -@ stub GdipSetAdjustableArrowCapMiddleInset -@ stub GdipSetAdjustableArrowCapWidth +@ stdcall GdipSetAdjustableArrowCapFillState(ptr long) +@ stdcall GdipSetAdjustableArrowCapHeight(ptr long) +@ stdcall GdipSetAdjustableArrowCapMiddleInset(ptr long) +@ stdcall GdipSetAdjustableArrowCapWidth(ptr long) @ stub GdipSetClipGraphics @ stub GdipSetClipHrgn @ stub GdipSetClipPath @@ -611,7 +611,7 @@ @ stdcall GdipTransformRegion(ptr ptr) @ stub GdipTranslateClip @ stub GdipTranslateClipI -@ stub GdipTranslateLineTransform +@ stdcall GdipTranslateLineTransform(ptr long long long) @ stdcall GdipTranslateMatrix(ptr long long long) @ stub GdipTranslatePathGradientTransform @ stub GdipTranslatePenTransform diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index 4eb847c8c47..8a6ddecfd49 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -167,6 +167,10 @@ struct GpCustomLineCap{ REAL scale; }; +struct GpAdustableArrowCap{ + GpCustomLineCap cap; +}; + struct GpImage{ IPicture* picture; ImageType type; diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index d91d825b3db..c1e63f64916 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -717,6 +717,8 @@ end: GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics) { + TRACE("(%p, %p)\n", hdc, graphics); + return GdipCreateFromHDC2(hdc, NULL, graphics); } @@ -724,6 +726,8 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra { GpStatus retval; + TRACE("(%p, %p, %p)\n", hdc, hDevice, graphics); + if(hDevice != NULL) { FIXME("Don't know how to hadle parameter hDevice\n"); return NotImplemented; @@ -750,7 +754,7 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra } (*graphics)->hdc = hdc; - (*graphics)->hwnd = NULL; + (*graphics)->hwnd = WindowFromDC(hdc); (*graphics)->smoothing = SmoothingModeDefault; (*graphics)->compqual = CompositingQualityDefault; (*graphics)->interpolation = InterpolationModeDefault; @@ -767,6 +771,8 @@ GpStatus WINGDIPAPI GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics) { GpStatus ret; + TRACE("(%p, %p)\n", hwnd, graphics); + if((ret = GdipCreateFromHDC(GetDC(hwnd), graphics)) != Ok) return ret; @@ -778,6 +784,8 @@ GpStatus WINGDIPAPI GdipCreateFromHWND(HWND hwnd, GpGraphics **graphics) /* FIXME: no icm handling */ GpStatus WINGDIPAPI GdipCreateFromHWNDICM(HWND hwnd, GpGraphics **graphics) { + TRACE("(%p, %p)\n", hwnd, graphics); + return GdipCreateFromHWND(hwnd, graphics); } @@ -804,6 +812,8 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, HENHMETAFILE hemf; GpStatus retval = GenericError; + TRACE("(%p, %d, %p, %p)\n", hwmf, delete, placeable, metafile); + if(!hwmf || !metafile || !placeable) return InvalidParameter; @@ -877,6 +887,8 @@ GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, DWORD dwMode; HRESULT ret; + TRACE("(%s, %u, %p)\n", debugstr_w(filename), access, stream); + if(!stream || !filename) return InvalidParameter; @@ -894,6 +906,8 @@ GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR * filename, GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics) { + TRACE("(%p)\n", graphics); + if(!graphics) return InvalidParameter; if(graphics->busy) return ObjectBusy; @@ -914,6 +928,9 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, GpPointF points[MAX_ARC_PTS]; GpStatus retval; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x, y, + width, height, startAngle, sweepAngle); + if(!graphics || !pen || width <= 0 || height <= 0) return InvalidParameter; @@ -934,6 +951,9 @@ GpStatus WINGDIPAPI GdipDrawArc(GpGraphics *graphics, GpPen *pen, REAL x, GpStatus WINGDIPAPI GdipDrawArcI(GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) { + TRACE("(%p, %p, %d, %d, %d, %d, %.2f, %.2f)\n", graphics, pen, x, y, + width, height, startAngle, sweepAngle); + return GdipDrawArc(graphics,pen,(REAL)x,(REAL)y,(REAL)width,(REAL)height,startAngle,sweepAngle); } @@ -944,6 +964,9 @@ GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics *graphics, GpPen *pen, REAL x1, GpPointF pt[4]; GpStatus retval; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x1, y1, + x2, y2, x3, y3, x4, y4); + if(!graphics || !pen) return InvalidParameter; @@ -975,6 +998,9 @@ GpStatus WINGDIPAPI GdipDrawBezierI(GpGraphics *graphics, GpPen *pen, INT x1, GpPointF pt[4]; GpStatus retval; + TRACE("(%p, %p, %d, %d, %d, %d, %d, %d, %d, %d)\n", graphics, pen, x1, y1, + x2, y2, x3, y3, x4, y4); + if(!graphics || !pen) return InvalidParameter; @@ -1005,6 +1031,8 @@ GpStatus WINGDIPAPI GdipDrawBeziers(GpGraphics *graphics, GpPen *pen, INT i; GpStatus ret; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + if(!graphics || !pen || !points || (count <= 0)) return InvalidParameter; @@ -1031,6 +1059,8 @@ GpStatus WINGDIPAPI GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GpStatus ret; INT i; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + if(!graphics || !pen || !points || (count <= 0)) return InvalidParameter; @@ -1056,39 +1086,45 @@ GpStatus WINGDIPAPI GdipDrawBeziersI(GpGraphics *graphics, GpPen *pen, GpStatus WINGDIPAPI GdipDrawClosedCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count) { + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + return GdipDrawClosedCurve2(graphics, pen, points, count, 1.0); } GpStatus WINGDIPAPI GdipDrawClosedCurveI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count) { + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + return GdipDrawClosedCurve2I(graphics, pen, points, count, 1.0); } GpStatus WINGDIPAPI GdipDrawClosedCurve2(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count, REAL tension) { - GpPointF *ptf; + GpPath *path; GpStatus stat; + TRACE("(%p, %p, %p, %d, %.2f)\n", graphics, pen, points, count, tension); + if(!graphics || !pen || !points || count <= 0) return InvalidParameter; if(graphics->busy) return ObjectBusy; - /* make a full points copy.. */ - ptf = GdipAlloc(sizeof(GpPointF)*(count+1)); - if(!ptf) - return OutOfMemory; - memcpy(ptf, points, sizeof(GpPointF)*count); + if((stat = GdipCreatePath(FillModeAlternate, &path)) != Ok) + return stat; - /* ..and add a first point as a last one */ - ptf[count] = ptf[0]; + stat = GdipAddPathClosedCurve2(path, points, count, tension); + if(stat != Ok){ + GdipDeletePath(path); + return stat; + } - stat = GdipDrawCurve2(graphics, pen, ptf, count + 1, tension); + stat = GdipDrawPath(graphics, pen, path); - GdipFree(ptf); + GdipDeletePath(path); return stat; } @@ -1100,6 +1136,8 @@ GpStatus WINGDIPAPI GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen, GpStatus stat; INT i; + TRACE("(%p, %p, %p, %d, %.2f)\n", graphics, pen, points, count, tension); + if(!points || count <= 0) return InvalidParameter; @@ -1122,6 +1160,8 @@ GpStatus WINGDIPAPI GdipDrawClosedCurve2I(GpGraphics *graphics, GpPen *pen, GpStatus WINGDIPAPI GdipDrawCurve(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count) { + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + return GdipDrawCurve2(graphics,pen,points,count,1.0); } @@ -1132,6 +1172,8 @@ GpStatus WINGDIPAPI GdipDrawCurveI(GpGraphics *graphics, GpPen *pen, GpStatus ret; INT i; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + if(!points || count <= 0) return InvalidParameter; @@ -1160,6 +1202,8 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, REAL x1, x2, y1, y2; GpStatus retval; + TRACE("(%p, %p, %p, %d, %.2f)\n", graphics, pen, points, count, tension); + if(!graphics || !pen) return InvalidParameter; @@ -1213,6 +1257,8 @@ GpStatus WINGDIPAPI GdipDrawCurve2I(GpGraphics *graphics, GpPen *pen, GpStatus ret; INT i; + TRACE("(%p, %p, %p, %d, %.2f)\n", graphics, pen, points, count, tension); + if(!points || count <= 0) return InvalidParameter; @@ -1238,6 +1284,8 @@ GpStatus WINGDIPAPI GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, GpPointF ptf[2]; POINT pti[2]; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x, y, width, height); + if(!graphics || !pen) return InvalidParameter; @@ -1264,12 +1312,16 @@ GpStatus WINGDIPAPI GdipDrawEllipse(GpGraphics *graphics, GpPen *pen, REAL x, GpStatus WINGDIPAPI GdipDrawEllipseI(GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height) { + TRACE("(%p, %p, %d, %d, %d, %d)\n", graphics, pen, x, y, width, height); + return GdipDrawEllipse(graphics,pen,(REAL)x,(REAL)y,(REAL)width,(REAL)height); } GpStatus WINGDIPAPI GdipDrawImage(GpGraphics *graphics, GpImage *image, REAL x, REAL y) { + TRACE("(%p, %p, %.2f, %.2f)\n", graphics, image, x, y); + /* IPicture::Render uses LONG coords */ return GdipDrawImageI(graphics,image,roundr(x),roundr(y)); } @@ -1279,6 +1331,8 @@ GpStatus WINGDIPAPI GdipDrawImageI(GpGraphics *graphics, GpImage *image, INT x, { UINT width, height, srcw, srch; + TRACE("(%p, %p, %d, %d)\n", graphics, image, x, y); + if(!graphics || !image) return InvalidParameter; @@ -1311,8 +1365,8 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image POINT pti[3]; REAL dx, dy; - TRACE("%p %p %p %d %f %f %f %f %d %p %p %p\n", graphics, image, points, count, - srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, + TRACE("(%p, %p, %p, %d, %f, %f, %f, %f, %d, %p, %p, %p)\n", graphics, image, points, + count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); if(!graphics || !image || !points || count != 3) @@ -1362,6 +1416,10 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRectI(GpGraphics *graphics, GpImage *imag GpPointF pointsF[3]; INT i; + TRACE("(%p, %p, %p, %d, %d, %d, %d, %d, %d, %p, %p, %p)\n", graphics, image, points, count, + srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, + callbackData); + if(!points || count!=3) return InvalidParameter; @@ -1383,6 +1441,10 @@ GpStatus WINGDIPAPI GdipDrawImageRectRect(GpGraphics *graphics, GpImage *image, { GpPointF points[3]; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %d, %p, %p, %p)\n", + graphics, image, dstx, dsty, dstwidth, dstheight, srcx, srcy, + srcwidth, srcheight, srcUnit, imageattr, callback, callbackData); + points[0].X = dstx; points[0].Y = dsty; points[1].X = dstx + dstwidth; @@ -1400,7 +1462,11 @@ GpStatus WINGDIPAPI GdipDrawImageRectRectI(GpGraphics *graphics, GpImage *image, GDIPCONST GpImageAttributes* imageAttributes, DrawImageAbort callback, VOID * callbackData) { - GpPointF points[3]; + GpPointF points[3]; + + TRACE("(%p, %p, %d, %d, %d, %d, %d, %d, %d, %d, %d, %p, %p, %p)\n", + graphics, image, dstx, dsty, dstwidth, dstheight, srcx, srcy, + srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); points[0].X = dstx; points[0].Y = dsty; @@ -1420,6 +1486,8 @@ GpStatus WINGDIPAPI GdipDrawImageRect(GpGraphics *graphics, GpImage *image, GpUnit unit; GpStatus ret; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, image, x, y, width, height); + if(!graphics || !image) return InvalidParameter; @@ -1435,6 +1503,8 @@ GpStatus WINGDIPAPI GdipDrawImageRect(GpGraphics *graphics, GpImage *image, GpStatus WINGDIPAPI GdipDrawImageRectI(GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height) { + TRACE("(%p, %p, %d, %d, %d, %d)\n", graphics, image, x, y, width, height); + return GdipDrawImageRect(graphics, image, (REAL)x, (REAL)y, (REAL)width, (REAL)height); } @@ -1445,6 +1515,8 @@ GpStatus WINGDIPAPI GdipDrawLine(GpGraphics *graphics, GpPen *pen, REAL x1, GpPointF pt[2]; GpStatus retval; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x1, y1, x2, y2); + if(!pen || !graphics) return InvalidParameter; @@ -1472,6 +1544,8 @@ GpStatus WINGDIPAPI GdipDrawLineI(GpGraphics *graphics, GpPen *pen, INT x1, GpPointF pt[2]; GpStatus retval; + TRACE("(%p, %p, %d, %d, %d, %d)\n", graphics, pen, x1, y1, x2, y2); + if(!pen || !graphics) return InvalidParameter; @@ -1498,6 +1572,8 @@ GpStatus WINGDIPAPI GdipDrawLines(GpGraphics *graphics, GpPen *pen, GDIPCONST INT save_state; GpStatus retval; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + if(!pen || !graphics || (count < 2)) return InvalidParameter; @@ -1521,6 +1597,8 @@ GpStatus WINGDIPAPI GdipDrawLinesI(GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *ptf = NULL; int i; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + if(!pen || !graphics || (count < 2)) return InvalidParameter; @@ -1550,6 +1628,8 @@ GpStatus WINGDIPAPI GdipDrawPath(GpGraphics *graphics, GpPen *pen, GpPath *path) INT save_state; GpStatus retval; + TRACE("(%p, %p, %p)\n", graphics, pen, path); + if(!pen || !graphics) return InvalidParameter; @@ -1571,6 +1651,9 @@ GpStatus WINGDIPAPI GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, { INT save_state; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x, y, + width, height, startAngle, sweepAngle); + if(!graphics || !pen) return InvalidParameter; @@ -1590,6 +1673,9 @@ GpStatus WINGDIPAPI GdipDrawPie(GpGraphics *graphics, GpPen *pen, REAL x, GpStatus WINGDIPAPI GdipDrawPieI(GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) { + TRACE("(%p, %p, %d, %d, %d, %d, %.2f, %.2f)\n", graphics, pen, x, y, + width, height, startAngle, sweepAngle); + return GdipDrawPie(graphics,pen,(REAL)x,(REAL)y,(REAL)width,(REAL)height,startAngle,sweepAngle); } @@ -1600,6 +1686,8 @@ GpStatus WINGDIPAPI GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, GpPointF ptf[4]; POINT pti[4]; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, pen, x, y, width, height); + if(!pen || !graphics) return InvalidParameter; @@ -1629,6 +1717,8 @@ GpStatus WINGDIPAPI GdipDrawRectangle(GpGraphics *graphics, GpPen *pen, REAL x, GpStatus WINGDIPAPI GdipDrawRectangleI(GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height) { + TRACE("(%p, %p, %d, %d, %d, %d)\n", graphics, pen, x, y, width, height); + return GdipDrawRectangle(graphics,pen,(REAL)x,(REAL)y,(REAL)width,(REAL)height); } @@ -1639,6 +1729,8 @@ GpStatus WINGDIPAPI GdipDrawRectangles(GpGraphics *graphics, GpPen *pen, POINT *pti; INT save_state, i; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, rects, count); + if(!graphics || !pen || !rects || count < 1) return InvalidParameter; @@ -1684,6 +1776,8 @@ GpStatus WINGDIPAPI GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, GpStatus ret; INT i; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, rects, count); + if(!rects || count<=0) return InvalidParameter; @@ -1865,6 +1959,9 @@ GpStatus WINGDIPAPI GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush, GpPath *path; GpStatus stat; + TRACE("(%p, %p, %p, %d, %.2f, %d)\n", graphics, brush, points, + count, tension, fill); + if(!graphics || !brush || !points) return InvalidParameter; @@ -1899,6 +1996,9 @@ GpStatus WINGDIPAPI GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush, GpStatus stat; INT i; + TRACE("(%p, %p, %p, %d, %.2f, %d)\n", graphics, brush, points, + count, tension, fill); + if(!points || count <= 0) return InvalidParameter; @@ -1925,6 +2025,8 @@ GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x GpPointF ptf[2]; POINT pti[2]; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, brush, x, y, width, height); + if(!graphics || !brush) return InvalidParameter; @@ -1953,6 +2055,8 @@ GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x GpStatus WINGDIPAPI GdipFillEllipseI(GpGraphics *graphics, GpBrush *brush, INT x, INT y, INT width, INT height) { + TRACE("(%p, %p, %d, %d, %d, %d)\n", graphics, brush, x, y, width, height); + return GdipFillEllipse(graphics,brush,(REAL)x,(REAL)y,(REAL)width,(REAL)height); } @@ -1961,6 +2065,8 @@ GpStatus WINGDIPAPI GdipFillPath(GpGraphics *graphics, GpBrush *brush, GpPath *p INT save_state; GpStatus retval; + TRACE("(%p, %p, %p)\n", graphics, brush, path); + if(!brush || !graphics || !path) return InvalidParameter; @@ -1996,6 +2102,9 @@ GpStatus WINGDIPAPI GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, { INT save_state; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", + graphics, brush, x, y, width, height, startAngle, sweepAngle); + if(!graphics || !brush) return InvalidParameter; @@ -2017,6 +2126,9 @@ GpStatus WINGDIPAPI GdipFillPie(GpGraphics *graphics, GpBrush *brush, REAL x, GpStatus WINGDIPAPI GdipFillPieI(GpGraphics *graphics, GpBrush *brush, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle) { + TRACE("(%p, %p, %d, %d, %d, %d, %.2f, %.2f)\n", + graphics, brush, x, y, width, height, startAngle, sweepAngle); + return GdipFillPie(graphics,brush,(REAL)x,(REAL)y,(REAL)width,(REAL)height,startAngle,sweepAngle); } @@ -2028,6 +2140,8 @@ GpStatus WINGDIPAPI GdipFillPolygon(GpGraphics *graphics, GpBrush *brush, POINT *pti = NULL; GpStatus retval = Ok; + TRACE("(%p, %p, %p, %d, %d)\n", graphics, brush, points, count, fillMode); + if(!graphics || !brush || !points || !count) return InvalidParameter; @@ -2070,6 +2184,8 @@ GpStatus WINGDIPAPI GdipFillPolygonI(GpGraphics *graphics, GpBrush *brush, POINT *pti = NULL; GpStatus retval = Ok; + TRACE("(%p, %p, %p, %d, %d)\n", graphics, brush, points, count, fillMode); + if(!graphics || !brush || !points || !count) return InvalidParameter; @@ -2110,12 +2226,16 @@ end: GpStatus WINGDIPAPI GdipFillPolygon2(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count) { + TRACE("(%p, %p, %p, %d)\n", graphics, brush, points, count); + return GdipFillPolygon(graphics, brush, points, count, FillModeAlternate); } GpStatus WINGDIPAPI GdipFillPolygon2I(GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, INT count) { + TRACE("(%p, %p, %p, %d)\n", graphics, brush, points, count); + return GdipFillPolygonI(graphics, brush, points, count, FillModeAlternate); } @@ -2126,6 +2246,8 @@ GpStatus WINGDIPAPI GdipFillRectangle(GpGraphics *graphics, GpBrush *brush, GpPointF ptf[4]; POINT pti[4]; + TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, brush, x, y, width, height); + if(!graphics || !brush) return InvalidParameter; @@ -2162,6 +2284,8 @@ GpStatus WINGDIPAPI GdipFillRectangleI(GpGraphics *graphics, GpBrush *brush, GpPointF ptf[4]; POINT pti[4]; + TRACE("(%p, %p, %d, %d, %d, %d)\n", graphics, brush, x, y, width, height); + if(!graphics || !brush) return InvalidParameter; @@ -2197,6 +2321,8 @@ GpStatus WINGDIPAPI GdipFillRectangles(GpGraphics *graphics, GpBrush *brush, GDI GpStatus ret; INT i; + TRACE("(%p, %p, %p, %d)\n", graphics, brush, rects, count); + if(!rects) return InvalidParameter; @@ -2215,6 +2341,8 @@ GpStatus WINGDIPAPI GdipFillRectanglesI(GpGraphics *graphics, GpBrush *brush, GD GpStatus ret; INT i; + TRACE("(%p, %p, %p, %d)\n", graphics, brush, rects, count); + if(!rects || count <= 0) return InvalidParameter; @@ -2269,6 +2397,8 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics *graphics, CompositingMode *mode) { + TRACE("(%p, %p)\n", graphics, mode); + if(!graphics || !mode) return InvalidParameter; @@ -2284,6 +2414,8 @@ GpStatus WINGDIPAPI GdipGetCompositingMode(GpGraphics *graphics, GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics *graphics, CompositingQuality *quality) { + TRACE("(%p, %p)\n", graphics, quality); + if(!graphics || !quality) return InvalidParameter; @@ -2299,6 +2431,8 @@ GpStatus WINGDIPAPI GdipGetCompositingQuality(GpGraphics *graphics, GpStatus WINGDIPAPI GdipGetInterpolationMode(GpGraphics *graphics, InterpolationMode *mode) { + TRACE("(%p, %p)\n", graphics, mode); + if(!graphics || !mode) return InvalidParameter; @@ -2312,6 +2446,8 @@ GpStatus WINGDIPAPI GdipGetInterpolationMode(GpGraphics *graphics, GpStatus WINGDIPAPI GdipGetPageScale(GpGraphics *graphics, REAL *scale) { + TRACE("(%p, %p)\n", graphics, scale); + if(!graphics || !scale) return InvalidParameter; @@ -2325,6 +2461,8 @@ GpStatus WINGDIPAPI GdipGetPageScale(GpGraphics *graphics, REAL *scale) GpStatus WINGDIPAPI GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit) { + TRACE("(%p, %p)\n", graphics, unit); + if(!graphics || !unit) return InvalidParameter; @@ -2340,6 +2478,8 @@ GpStatus WINGDIPAPI GdipGetPageUnit(GpGraphics *graphics, GpUnit *unit) GpStatus WINGDIPAPI GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode *mode) { + TRACE("(%p, %p)\n", graphics, mode); + if(!graphics || !mode) return InvalidParameter; @@ -2354,6 +2494,8 @@ GpStatus WINGDIPAPI GdipGetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode /* FIXME: Smoothing mode is not used anywhere except the getter/setter. */ GpStatus WINGDIPAPI GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *mode) { + TRACE("(%p, %p)\n", graphics, mode); + if(!graphics || !mode) return InvalidParameter; @@ -2369,6 +2511,8 @@ GpStatus WINGDIPAPI GdipGetSmoothingMode(GpGraphics *graphics, SmoothingMode *mo GpStatus WINGDIPAPI GdipGetTextRenderingHint(GpGraphics *graphics, TextRenderingHint *hint) { + TRACE("(%p, %p)\n", graphics, hint); + if(!graphics || !hint) return InvalidParameter; @@ -2382,6 +2526,8 @@ GpStatus WINGDIPAPI GdipGetTextRenderingHint(GpGraphics *graphics, GpStatus WINGDIPAPI GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix) { + TRACE("(%p, %p)\n", graphics, matrix); + if(!graphics || !matrix) return InvalidParameter; @@ -2392,8 +2538,45 @@ GpStatus WINGDIPAPI GdipGetWorldTransform(GpGraphics *graphics, GpMatrix *matrix return Ok; } +GpStatus WINGDIPAPI GdipGraphicsClear(GpGraphics *graphics, ARGB color) +{ + GpSolidFill *brush; + GpStatus stat; + RECT rect; + + TRACE("(%p, %x)\n", graphics, color); + + if(!graphics) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + if((stat = GdipCreateSolidFill(color, &brush)) != Ok) + return stat; + + if(graphics->hwnd){ + if(!GetWindowRect(graphics->hwnd, &rect)){ + GdipDeleteBrush((GpBrush*)brush); + return GenericError; + } + + GdipFillRectangle(graphics, (GpBrush*)brush, 0.0, 0.0, (REAL)(rect.right - rect.left), + (REAL)(rect.bottom - rect.top)); + } + else + GdipFillRectangle(graphics, (GpBrush*)brush, 0.0, 0.0, (REAL)GetDeviceCaps(graphics->hdc, HORZRES), + (REAL)GetDeviceCaps(graphics->hdc, VERTRES)); + + GdipDeleteBrush((GpBrush*)brush); + + return Ok; +} + GpStatus WINGDIPAPI GdipIsClipEmpty(GpGraphics *graphics, BOOL *res) { + TRACE("(%p, %p)\n", graphics, res); + if(!graphics || !res) return InvalidParameter; @@ -2524,6 +2707,8 @@ GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) { + TRACE("(%p)\n", graphics); + if(!graphics) return InvalidParameter; @@ -2535,6 +2720,8 @@ GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) GpStatus WINGDIPAPI GdipResetWorldTransform(GpGraphics *graphics) { + TRACE("(%p)\n", graphics); + if(!graphics) return InvalidParameter; @@ -2567,6 +2754,8 @@ GpStatus WINGDIPAPI GdipRestoreGraphics(GpGraphics *graphics, GraphicsState stat GpStatus WINGDIPAPI GdipRotateWorldTransform(GpGraphics *graphics, REAL angle, GpMatrixOrder order) { + TRACE("(%p, %.2f, %d)\n", graphics, angle, order); + if(!graphics) return InvalidParameter; @@ -2592,6 +2781,8 @@ GpStatus WINGDIPAPI GdipSaveGraphics(GpGraphics *graphics, GraphicsState *state) GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, REAL sy, GpMatrixOrder order) { + TRACE("(%p, %.2f, %.2f, %d)\n", graphics, sx, sy, order); + if(!graphics) return InvalidParameter; @@ -2604,6 +2795,8 @@ GpStatus WINGDIPAPI GdipScaleWorldTransform(GpGraphics *graphics, REAL sx, GpStatus WINGDIPAPI GdipSetCompositingMode(GpGraphics *graphics, CompositingMode mode) { + TRACE("(%p, %d)\n", graphics, mode); + if(!graphics) return InvalidParameter; @@ -2618,6 +2811,8 @@ GpStatus WINGDIPAPI GdipSetCompositingMode(GpGraphics *graphics, GpStatus WINGDIPAPI GdipSetCompositingQuality(GpGraphics *graphics, CompositingQuality quality) { + TRACE("(%p, %d)\n", graphics, quality); + if(!graphics) return InvalidParameter; @@ -2632,6 +2827,8 @@ GpStatus WINGDIPAPI GdipSetCompositingQuality(GpGraphics *graphics, GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics, InterpolationMode mode) { + TRACE("(%p, %d)\n", graphics, mode); + if(!graphics) return InvalidParameter; @@ -2645,6 +2842,8 @@ GpStatus WINGDIPAPI GdipSetInterpolationMode(GpGraphics *graphics, GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics *graphics, REAL scale) { + TRACE("(%p, %.2f)\n", graphics, scale); + if(!graphics || (scale <= 0.0)) return InvalidParameter; @@ -2658,6 +2857,8 @@ GpStatus WINGDIPAPI GdipSetPageScale(GpGraphics *graphics, REAL scale) GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics *graphics, GpUnit unit) { + TRACE("(%p, %d)\n", graphics, unit); + if(!graphics) return InvalidParameter; @@ -2675,6 +2876,8 @@ GpStatus WINGDIPAPI GdipSetPageUnit(GpGraphics *graphics, GpUnit unit) GpStatus WINGDIPAPI GdipSetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode mode) { + TRACE("(%p, %d)\n", graphics, mode); + if(!graphics) return InvalidParameter; @@ -2688,6 +2891,8 @@ GpStatus WINGDIPAPI GdipSetPixelOffsetMode(GpGraphics *graphics, PixelOffsetMode GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode mode) { + TRACE("(%p, %d)\n", graphics, mode); + if(!graphics) return InvalidParameter; @@ -2702,6 +2907,8 @@ GpStatus WINGDIPAPI GdipSetSmoothingMode(GpGraphics *graphics, SmoothingMode mod GpStatus WINGDIPAPI GdipSetTextRenderingHint(GpGraphics *graphics, TextRenderingHint hint) { + TRACE("(%p, %d)\n", graphics, hint); + if(!graphics) return InvalidParameter; @@ -2715,6 +2922,8 @@ GpStatus WINGDIPAPI GdipSetTextRenderingHint(GpGraphics *graphics, GpStatus WINGDIPAPI GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix) { + TRACE("(%p, %p)\n", graphics, matrix); + if(!graphics || !matrix) return InvalidParameter; @@ -2728,6 +2937,8 @@ GpStatus WINGDIPAPI GdipSetWorldTransform(GpGraphics *graphics, GpMatrix *matrix GpStatus WINGDIPAPI GdipTranslateWorldTransform(GpGraphics *graphics, REAL dx, REAL dy, GpMatrixOrder order) { + TRACE("(%p, %.2f, %.2f, %d)\n", graphics, dx, dy, order); + if(!graphics) return InvalidParameter; @@ -2786,6 +2997,8 @@ GpStatus WINGDIPAPI GdipDrawPolygon(GpGraphics *graphics,GpPen *pen,GDIPCONST Gp INT save_state; POINT *pti; + TRACE("(%p, %p, %d)\n", graphics, points, count); + if(!graphics || !pen || count<=0) return InvalidParameter; @@ -2813,6 +3026,8 @@ GpStatus WINGDIPAPI GdipDrawPolygonI(GpGraphics *graphics,GpPen *pen,GDIPCONST G GpPointF *ptf; INT i; + TRACE("(%p, %p, %p, %d)\n", graphics, pen, points, count); + if(count<=0) return InvalidParameter; ptf = GdipAlloc(sizeof(GpPointF) * count); @@ -2829,6 +3044,8 @@ GpStatus WINGDIPAPI GdipDrawPolygonI(GpGraphics *graphics,GpPen *pen,GDIPCONST G GpStatus WINGDIPAPI GdipGetDpiX(GpGraphics *graphics, REAL* dpi) { + TRACE("(%p, %p)\n", graphics, dpi); + if(!graphics || !dpi) return InvalidParameter; @@ -2842,6 +3059,8 @@ GpStatus WINGDIPAPI GdipGetDpiX(GpGraphics *graphics, REAL* dpi) GpStatus WINGDIPAPI GdipGetDpiY(GpGraphics *graphics, REAL* dpi) { + TRACE("(%p, %p)\n", graphics, dpi); + if(!graphics || !dpi) return InvalidParameter; @@ -2859,6 +3078,8 @@ GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST G GpMatrix m; GpStatus ret; + TRACE("(%p, %p, %d)\n", graphics, matrix, order); + if(!graphics || !matrix) return InvalidParameter; @@ -2876,6 +3097,8 @@ GpStatus WINGDIPAPI GdipMultiplyWorldTransform(GpGraphics *graphics, GDIPCONST G GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) { + TRACE("(%p, %p)\n", graphics, hdc); + if(!graphics || !hdc) return InvalidParameter; @@ -2890,6 +3113,8 @@ GpStatus WINGDIPAPI GdipGetDC(GpGraphics *graphics, HDC *hdc) GpStatus WINGDIPAPI GdipReleaseDC(GpGraphics *graphics, HDC hdc) { + TRACE("(%p, %p)\n", graphics, hdc); + if(!graphics) return InvalidParameter; diff --git a/dlls/gdiplus/graphicspath.c b/dlls/gdiplus/graphicspath.c index d0f5dc0f89d..9318e1a94c3 100644 --- a/dlls/gdiplus/graphicspath.c +++ b/dlls/gdiplus/graphicspath.c @@ -33,6 +33,135 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); +typedef struct path_list_node_t path_list_node_t; +struct path_list_node_t { + GpPointF pt; + BYTE type; /* PathPointTypeStart or PathPointTypeLine */ + path_list_node_t *next; +}; + +/* init list */ +static BOOL init_path_list(path_list_node_t **node, REAL x, REAL y) +{ + *node = GdipAlloc(sizeof(path_list_node_t)); + if(!*node) + return FALSE; + + (*node)->pt.X = x; + (*node)->pt.Y = y; + (*node)->type = PathPointTypeStart; + (*node)->next = NULL; + + return TRUE; +} + +/* free all nodes including argument */ +static void free_path_list(path_list_node_t *node) +{ + path_list_node_t *n = node; + + while(n){ + n = n->next; + GdipFree(node); + node = n; + } +} + +/* Add a node after 'node' */ +/* + * Returns + * pointer on success + * NULL on allocation problems + */ +static path_list_node_t* add_path_list_node(path_list_node_t *node, REAL x, REAL y, BOOL type) +{ + path_list_node_t *new; + + new = GdipAlloc(sizeof(path_list_node_t)); + if(!new) + return NULL; + + new->pt.X = x; + new->pt.Y = y; + new->type = type; + new->next = node->next; + node->next = new; + + return new; +} + +/* returns element count */ +static INT path_list_count(path_list_node_t *node) +{ + INT count = 1; + + while((node = node->next)) + ++count; + + return count; +} + +/* GdipFlattenPath helper */ +/* + * Used to recursively flatten single Bezier curve + * Parameters: + * - start : pointer to start point node; + * - (x2, y2): first control point; + * - (x3, y3): second control point; + * - end : pointer to end point node + * - flatness: admissible error of linear approximation. + * + * Return value: + * TRUE : success + * FALSE: out of memory + * + * TODO: used quality criteria should be revised to match native as + * closer as possible. + */ +static BOOL flatten_bezier(path_list_node_t *start, REAL x2, REAL y2, REAL x3, REAL y3, + path_list_node_t *end, REAL flatness) +{ + /* this 5 middle points with start/end define to half-curves */ + GpPointF mp[5]; + GpPointF pt, pt_st; + path_list_node_t *node; + + /* calculate bezier curve middle points == new control points */ + mp[0].X = (start->pt.X + x2) / 2.0; + mp[0].Y = (start->pt.Y + y2) / 2.0; + /* middle point between control points */ + pt.X = (x2 + x3) / 2.0; + pt.Y = (y2 + y3) / 2.0; + mp[1].X = (mp[0].X + pt.X) / 2.0; + mp[1].Y = (mp[0].Y + pt.Y) / 2.0; + mp[4].X = (end->pt.X + x3) / 2.0; + mp[4].Y = (end->pt.Y + y3) / 2.0; + mp[3].X = (mp[4].X + pt.X) / 2.0; + mp[3].Y = (mp[4].Y + pt.Y) / 2.0; + + mp[2].X = (mp[1].X + mp[3].X) / 2.0; + mp[2].Y = (mp[1].Y + mp[3].Y) / 2.0; + + pt = end->pt; + pt_st = start->pt; + /* check flatness as a half of distance between middle point and a linearized path */ + if(fabs(((pt.Y - pt_st.Y)*mp[2].X + (pt_st.X - pt.X)*mp[2].Y + + (pt_st.Y*pt.X - pt_st.X*pt.Y))) <= + (0.5 * flatness*sqrtf((powf(pt.Y - pt_st.Y, 2.0) + powf(pt_st.X - pt.X, 2.0))))){ + return TRUE; + } + else + /* add a middle point */ + if(!(node = add_path_list_node(start, mp[2].X, mp[2].Y, PathPointTypeLine))) + return FALSE; + + /* do the same with halfs */ + flatten_bezier(start, mp[0].X, mp[0].Y, mp[1].X, mp[1].Y, node, flatness); + flatten_bezier(node, mp[3].X, mp[3].Y, mp[4].X, mp[4].Y, end, flatness); + + return TRUE; +} + GpStatus WINGDIPAPI GdipAddPathArc(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2, REAL startAngle, REAL sweepAngle) { @@ -818,15 +947,106 @@ GpStatus WINGDIPAPI GdipDeletePath(GpPath *path) GpStatus WINGDIPAPI GdipFlattenPath(GpPath *path, GpMatrix* matrix, REAL flatness) { - static int calls; + path_list_node_t *list, *node; + GpPointF pt; + INT i = 1; + INT startidx = 0; + + TRACE("(%p, %p, %.2f)\n", path, matrix, flatness); if(!path) return InvalidParameter; - if(!(calls++)) - FIXME("not implemented\n"); + if(matrix){ + WARN("transformation not supported yet!\n"); + return NotImplemented; + } - return NotImplemented; + if(path->pathdata.Count == 0) + return Ok; + + pt = path->pathdata.Points[0]; + if(!init_path_list(&list, pt.X, pt.Y)) + return OutOfMemory; + + node = list; + + while(i < path->pathdata.Count){ + + BYTE type = path->pathdata.Types[i] & PathPointTypePathTypeMask; + path_list_node_t *start; + + pt = path->pathdata.Points[i]; + + /* save last start point index */ + if(type == PathPointTypeStart) + startidx = i; + + /* always add line points and start points */ + if((type == PathPointTypeStart) || (type == PathPointTypeLine)){ + type = (path->pathdata.Types[i] & ~PathPointTypeBezier) | PathPointTypeLine; + if(!add_path_list_node(node, pt.X, pt.Y, type)) + goto memout; + + node = node->next; + continue; + } + + /* Bezier curve always stored as 4 points */ + if((path->pathdata.Types[i-1] & PathPointTypePathTypeMask) != PathPointTypeStart){ + type = (path->pathdata.Types[i] & ~PathPointTypeBezier) | PathPointTypeLine; + if(!add_path_list_node(node, pt.X, pt.Y, type)) + goto memout; + + node = node->next; + } + + /* test for closed figure */ + if(path->pathdata.Types[i+1] & PathPointTypeCloseSubpath){ + pt = path->pathdata.Points[startidx]; + ++i; + } + else + { + i += 2; + pt = path->pathdata.Points[i]; + }; + + start = node; + /* add Bezier end point */ + type = (path->pathdata.Types[i] & ~PathPointTypeBezier) | PathPointTypeLine; + if(!add_path_list_node(node, pt.X, pt.Y, type)) + goto memout; + node = node->next; + + /* flatten curve */ + if(!flatten_bezier(start, path->pathdata.Points[i-2].X, path->pathdata.Points[i-2].Y, + path->pathdata.Points[i-1].X, path->pathdata.Points[i-1].Y, + node, flatness)) + goto memout; + + ++i; + }/* while */ + + /* store path data back */ + i = path_list_count(list); + if(!lengthen_path(path, i)) + goto memout; + path->pathdata.Count = i; + + node = list; + for(i = 0; i < path->pathdata.Count; i++){ + path->pathdata.Points[i] = node->pt; + path->pathdata.Types[i] = node->type; + node = node->next; + } + + free_path_list(list); + return Ok; + +memout: + free_path_list(list); + return OutOfMemory; } GpStatus WINGDIPAPI GdipGetPathData(GpPath *path, GpPathData* pathData) diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 197665d0299..bcdc64f7738 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -242,11 +242,50 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits(GpBitmap* bitmap, GpStatus WINGDIPAPI GdipCloneImage(GpImage *image, GpImage **cloneImage) { - if (!(image && cloneImage)) return InvalidParameter; + IStream* stream; + HRESULT hr; + INT size; - FIXME("stub: %p, %p\n", image, cloneImage); + TRACE("%p, %p\n", image, cloneImage); - return NotImplemented; + if (!image || !cloneImage) + return InvalidParameter; + + hr = CreateStreamOnHGlobal(0, TRUE, &stream); + if (FAILED(hr)) + return GenericError; + + *cloneImage = GdipAlloc(sizeof(GpImage)); + if (!*cloneImage) + { + IStream_Release(stream); + return OutOfMemory; + } + (*cloneImage)->type = image->type; + (*cloneImage)->flags = image->flags; + + hr = IPicture_SaveAsFile(image->picture, stream, FALSE, &size); + if(FAILED(hr)) + { + WARN("Failed to save image on stream\n"); + goto out; + } + + hr = OleLoadPicture(stream, size, FALSE, &IID_IPicture, + (LPVOID*) &(*cloneImage)->picture); + if (FAILED(hr)) + { + WARN("Failed to load image from stream\n"); + goto out; + } + + IStream_Release(stream); + return Ok; +out: + IStream_Release(stream); + GdipFree(*cloneImage); + *cloneImage = NULL; + return GenericError; } GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename, diff --git a/dlls/gdiplus/imageattributes.c b/dlls/gdiplus/imageattributes.c index dcee68b0cd2..55bff18c629 100644 --- a/dlls/gdiplus/imageattributes.c +++ b/dlls/gdiplus/imageattributes.c @@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus); GpStatus WINGDIPAPI GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imageattr, GpImageAttributes **cloneImageattr) { + TRACE("(%p, %p)\n", imageattr, cloneImageattr); + if(!imageattr || !cloneImageattr) return InvalidParameter; @@ -40,6 +42,8 @@ GpStatus WINGDIPAPI GdipCloneImageAttributes(GDIPCONST GpImageAttributes *imagea GpStatus WINGDIPAPI GdipCreateImageAttributes(GpImageAttributes **imageattr) { + TRACE("(%p)\n", imageattr); + if(!imageattr) return InvalidParameter; @@ -51,6 +55,8 @@ GpStatus WINGDIPAPI GdipCreateImageAttributes(GpImageAttributes **imageattr) GpStatus WINGDIPAPI GdipDisposeImageAttributes(GpImageAttributes *imageattr) { + TRACE("(%p)\n", imageattr); + if(!imageattr) return InvalidParameter; diff --git a/dlls/gdiplus/matrix.c b/dlls/gdiplus/matrix.c index 008dcae33cd..d2e15116d6c 100644 --- a/dlls/gdiplus/matrix.c +++ b/dlls/gdiplus/matrix.c @@ -61,6 +61,8 @@ static REAL matrix_det(GDIPCONST GpMatrix *matrix) GpStatus WINGDIPAPI GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy, GpMatrix **matrix) { + TRACE("(%.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %p)\n", m11, m12, m21, m22, dx, dy, matrix); + if(!matrix) return InvalidParameter; @@ -83,6 +85,8 @@ GpStatus WINGDIPAPI GdipCreateMatrix2(REAL m11, REAL m12, REAL m21, REAL m22, GpStatus WINGDIPAPI GdipCreateMatrix3(GDIPCONST GpRectF *rect, GDIPCONST GpPointF *pt, GpMatrix **matrix) { + TRACE("(%p, %p, %p)\n", rect, pt, matrix); + if(!matrix) return InvalidParameter; @@ -103,6 +107,8 @@ GpStatus WINGDIPAPI GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint GpRectF rectF; GpPointF ptF; + TRACE("(%p, %p, %p)\n", rect, pt, matrix); + rectF.X = (REAL)rect->X; rectF.Y = (REAL)rect->Y; rectF.Width = (REAL)rect->Width; @@ -116,6 +122,8 @@ GpStatus WINGDIPAPI GdipCreateMatrix3I(GDIPCONST GpRect *rect, GDIPCONST GpPoint GpStatus WINGDIPAPI GdipCloneMatrix(GpMatrix *matrix, GpMatrix **clone) { + TRACE("(%p, %p)\n", matrix, clone); + if(!matrix || !clone) return InvalidParameter; @@ -129,6 +137,8 @@ GpStatus WINGDIPAPI GdipCloneMatrix(GpMatrix *matrix, GpMatrix **clone) GpStatus WINGDIPAPI GdipCreateMatrix(GpMatrix **matrix) { + TRACE("(%p)\n", matrix); + if(!matrix) return InvalidParameter; @@ -147,6 +157,8 @@ GpStatus WINGDIPAPI GdipCreateMatrix(GpMatrix **matrix) GpStatus WINGDIPAPI GdipDeleteMatrix(GpMatrix *matrix) { + TRACE("(%p)\n", matrix); + if(!matrix) return InvalidParameter; @@ -158,6 +170,8 @@ GpStatus WINGDIPAPI GdipDeleteMatrix(GpMatrix *matrix) GpStatus WINGDIPAPI GdipGetMatrixElements(GDIPCONST GpMatrix *matrix, REAL *out) { + TRACE("(%p, %p)\n", matrix, out); + if(!matrix || !out) return InvalidParameter; @@ -172,6 +186,8 @@ GpStatus WINGDIPAPI GdipInvertMatrix(GpMatrix *matrix) REAL det; BOOL invertible; + TRACE("(%p)\n", matrix); + if(!matrix) return InvalidParameter; @@ -195,6 +211,8 @@ GpStatus WINGDIPAPI GdipInvertMatrix(GpMatrix *matrix) GpStatus WINGDIPAPI GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *result) { + TRACE("(%p, %p)\n", matrix, result); + if(!matrix || !result) return InvalidParameter; @@ -206,6 +224,8 @@ GpStatus WINGDIPAPI GdipIsMatrixInvertible(GDIPCONST GpMatrix *matrix, BOOL *res GpStatus WINGDIPAPI GdipMultiplyMatrix(GpMatrix *matrix, GpMatrix* matrix2, GpMatrixOrder order) { + TRACE("(%p, %p, %d)\n", matrix, matrix2, order); + if(!matrix || !matrix2) return InvalidParameter; @@ -222,6 +242,8 @@ GpStatus WINGDIPAPI GdipRotateMatrix(GpMatrix *matrix, REAL angle, { REAL cos_theta, sin_theta, rotate[6]; + TRACE("(%p, %.2f, %d)\n", matrix, angle, order); + if(!matrix) return InvalidParameter; @@ -249,6 +271,8 @@ GpStatus WINGDIPAPI GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY, { REAL scale[6]; + TRACE("(%p, %.2f, %.2f, %d)\n", matrix, scaleX, scaleY, order); + if(!matrix) return InvalidParameter; @@ -270,6 +294,9 @@ GpStatus WINGDIPAPI GdipScaleMatrix(GpMatrix *matrix, REAL scaleX, REAL scaleY, GpStatus WINGDIPAPI GdipSetMatrixElements(GpMatrix *matrix, REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy) { + TRACE("(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n", matrix, m11, m12, + m21, m22, dx, dy); + if(!matrix) return InvalidParameter; @@ -288,6 +315,8 @@ GpStatus WINGDIPAPI GdipShearMatrix(GpMatrix *matrix, REAL shearX, REAL shearY, { REAL shear[6]; + TRACE("(%p, %.2f, %.2f, %d)\n", matrix, shearX, shearY, order); + if(!matrix) return InvalidParameter; @@ -313,6 +342,8 @@ GpStatus WINGDIPAPI GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, REAL x, y; INT i; + TRACE("(%p, %p, %d)\n", matrix, pts, count); + if(!matrix || !pts || count <= 0) return InvalidParameter; @@ -334,6 +365,8 @@ GpStatus WINGDIPAPI GdipTransformMatrixPointsI(GpMatrix *matrix, GpPoint *pts, I GpStatus ret; INT i; + TRACE("(%p, %p, %d)\n", matrix, pts, count); + if(count <= 0) return InvalidParameter; @@ -363,6 +396,8 @@ GpStatus WINGDIPAPI GdipTranslateMatrix(GpMatrix *matrix, REAL offsetX, { REAL translate[6]; + TRACE("(%p, %.2f, %.2f, %d)\n", matrix, offsetX, offsetY, order); + if(!matrix) return InvalidParameter; @@ -386,6 +421,8 @@ GpStatus WINGDIPAPI GdipVectorTransformMatrixPoints(GpMatrix *matrix, GpPointF * REAL x, y; INT i; + TRACE("(%p, %p, %d)\n", matrix, pts, count); + if(!matrix || !pts || count <= 0) return InvalidParameter; @@ -407,6 +444,8 @@ GpStatus WINGDIPAPI GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint * GpStatus ret; INT i; + TRACE("(%p, %p, %d)\n", matrix, pts, count); + if(count <= 0) return InvalidParameter; @@ -434,6 +473,8 @@ GpStatus WINGDIPAPI GdipVectorTransformMatrixPointsI(GpMatrix *matrix, GpPoint * GpStatus WINGDIPAPI GdipIsMatrixEqual(GDIPCONST GpMatrix *matrix, GDIPCONST GpMatrix *matrix2, BOOL *result) { + TRACE("(%p, %p, %p)\n", matrix, matrix2, result); + if(!matrix || !matrix2 || !result) return InvalidParameter; /* based on single array member of GpMatrix */ @@ -448,6 +489,8 @@ GpStatus WINGDIPAPI GdipIsMatrixIdentity(GDIPCONST GpMatrix *matrix, BOOL *resul GpStatus ret; BOOL isIdentity; + TRACE("(%p, %p)\n", matrix, result); + if(!matrix || !result) return InvalidParameter; diff --git a/dlls/gdiplus/region.c b/dlls/gdiplus/region.c index f1142b78db6..90aaf9e26af 100644 --- a/dlls/gdiplus/region.c +++ b/dlls/gdiplus/region.c @@ -227,6 +227,9 @@ GpStatus WINGDIPAPI GdipCloneRegion(GpRegion *region, GpRegion **clone) return clone_element(®ion->node, &element); } +/***************************************************************************** + * GdipCombineRegionPath [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode mode) { GpRegion *path_region; @@ -270,6 +273,9 @@ out: return stat; } +/***************************************************************************** + * GdipCombineRegionRect [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect, CombineMode mode) { @@ -314,6 +320,9 @@ out: return stat; } +/***************************************************************************** + * GdipCombineRegionRectI [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect, CombineMode mode) { @@ -373,6 +382,9 @@ GpStatus WINGDIPAPI GdipCombineRegionRegion(GpRegion *region1, return Ok; } +/***************************************************************************** + * GdipCreateRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCreateRegion(GpRegion **region) { TRACE("%p\n", region); @@ -505,6 +517,9 @@ GpStatus WINGDIPAPI GdipCreateRegionPath(GpPath *path, GpRegion **region) return Ok; } +/***************************************************************************** + * GdipCreateRegionRect [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipCreateRegionRect(GDIPCONST GpRectF *rect, GpRegion **region) { @@ -734,6 +749,9 @@ GpStatus WINGDIPAPI GdipGetRegionData(GpRegion *region, BYTE *buffer, UINT size, return Ok; } +/***************************************************************************** + * GdipGetRegionDataSize [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipGetRegionDataSize(GpRegion *region, UINT *needed) { TRACE("%p, %p\n", region, needed); @@ -778,9 +796,12 @@ GpStatus WINGDIPAPI GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGra return NotImplemented; } -/* I think graphics is ignored here */ +/***************************************************************************** + * GdipIsInfiniteRegion [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics, BOOL *res) { + /* I think graphics is ignored here */ TRACE("(%p, %p, %p)\n", region, graphics, res); if(!region || !graphics || !res) @@ -791,6 +812,9 @@ GpStatus WINGDIPAPI GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics, return Ok; } +/***************************************************************************** + * GdipSetEmpty [GDIPLUS.@] + */ GpStatus WINGDIPAPI GdipSetEmpty(GpRegion *region) { GpStatus stat; diff --git a/dlls/gdiplus/tests/brush.c b/dlls/gdiplus/tests/brush.c index 6711fe48c47..c9f98260907 100644 --- a/dlls/gdiplus/tests/brush.c +++ b/dlls/gdiplus/tests/brush.c @@ -145,6 +145,30 @@ static void test_getbounds(void) GdipDeleteBrush((GpBrush*) brush); } +static void test_getgamma(void) +{ + GpStatus status; + GpLineGradient *line; + GpPointF start, end; + BOOL gamma; + + start.X = start.Y = 0.0; + end.X = end.Y = 100.0; + + status = GdipCreateLineBrush(&start, &end, (ARGB)0xdeadbeef, 0xdeadbeef, WrapModeTile, &line); + expect(Ok, status); + + /* NULL arguments */ + status = GdipGetLineGammaCorrection(NULL, NULL); + expect(InvalidParameter, status); + status = GdipGetLineGammaCorrection(line, NULL); + expect(InvalidParameter, status); + status = GdipGetLineGammaCorrection(NULL, &gamma); + expect(InvalidParameter, status); + + GdipDeleteBrush((GpBrush*)line); +} + START_TEST(brush) { struct GdiplusStartupInput gdiplusStartupInput; @@ -162,6 +186,7 @@ START_TEST(brush) test_gradientblendcount(); test_getblend(); test_getbounds(); + test_getgamma(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index b0858e1eb6c..a011b9132fb 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -540,9 +540,9 @@ static void test_Get_Release_DC(void) status = GdipGetDC(NULL, &retdc); expect(InvalidParameter, status); - status = GdipReleaseDC(NULL, (HDC)0); + status = GdipReleaseDC(NULL, NULL); expect(InvalidParameter, status); - status = GdipReleaseDC(graphics, (HDC)0); + status = GdipReleaseDC(graphics, NULL); expect(InvalidParameter, status); status = GdipReleaseDC(NULL, (HDC)0xdeadbeef); expect(InvalidParameter, status); @@ -672,6 +672,8 @@ static void test_Get_Release_DC(void) expect(ObjectBusy, status); status = Ok; status = GdipGetWorldTransform(graphics, m); expect(ObjectBusy, status); status = Ok; + status = GdipGraphicsClear(graphics, 0xdeadbeef); + expect(ObjectBusy, status); status = Ok; /* GdipMeasureCharacterRanges */ /* GdipMeasureString */ status = GdipResetClip(graphics); @@ -878,6 +880,14 @@ static void test_isempty(void) ReleaseDC(0, hdc); } +static void test_clear(void) +{ + GpStatus status; + + status = GdipGraphicsClear(NULL, 0xdeadbeef); + expect(InvalidParameter, status); +} + START_TEST(graphics) { struct GdiplusStartupInput gdiplusStartupInput; @@ -901,6 +911,7 @@ START_TEST(graphics) test_transformpoints(); test_get_set_clip(); test_isempty(); + test_clear(); GdiplusShutdown(gdiplusToken); } diff --git a/dlls/gdiplus/tests/graphicspath.c b/dlls/gdiplus/tests/graphicspath.c index 47d82058ec8..7a5fbc2b47c 100644 --- a/dlls/gdiplus/tests/graphicspath.c +++ b/dlls/gdiplus/tests/graphicspath.c @@ -888,10 +888,10 @@ static void test_addpie(void) static path_test_t flattenellipse_path[] = { {100.0, 25.0,PathPointTypeStart, 0, 0}, /*0*/ - {99.0, 30.0, PathPointTypeLine, 0, 1}, /*1*/ - {96.0, 34.8, PathPointTypeLine, 0, 1}, /*2*/ - {91.5, 39.0, PathPointTypeLine, 0, 1}, /*3*/ - {85.5, 42.8, PathPointTypeLine, 0, 1}, /*4*/ + {99.0, 30.0, PathPointTypeLine, 0, 0}, /*1*/ + {96.0, 34.8, PathPointTypeLine, 0, 0}, /*2*/ + {91.5, 39.0, PathPointTypeLine, 0, 0}, /*3*/ + {85.5, 42.8, PathPointTypeLine, 0, 0}, /*4*/ {69.5, 48.0, PathPointTypeLine, 0, 1}, /*5*/ {50.0, 50.0, PathPointTypeLine, 0, 1}, /*6*/ {30.5, 48.0, PathPointTypeLine, 0, 1}, /*7*/ @@ -916,14 +916,26 @@ static path_test_t flattenellipse_path[] = { static path_test_t flattenarc_path[] = { {100.0, 25.0,PathPointTypeStart, 0, 0}, /*0*/ - {99.0, 30.0, PathPointTypeLine, 0, 1}, /*1*/ - {96.0, 34.8, PathPointTypeLine, 0, 1}, /*2*/ - {91.5, 39.0, PathPointTypeLine, 0, 1}, /*3*/ - {85.5, 42.8, PathPointTypeLine, 0, 1}, /*4*/ + {99.0, 30.0, PathPointTypeLine, 0, 0}, /*1*/ + {96.0, 34.8, PathPointTypeLine, 0, 0}, /*2*/ + {91.5, 39.0, PathPointTypeLine, 0, 0}, /*3*/ + {85.5, 42.8, PathPointTypeLine, 0, 0}, /*4*/ {69.5, 48.0, PathPointTypeLine, 0, 1}, /*5*/ {50.0, 50.0, PathPointTypeLine, 0, 1} /*6*/ }; +static path_test_t flattenquater_path[] = { + {100.0, 50.0,PathPointTypeStart, 0, 0}, /*0*/ + {99.0, 60.0, PathPointTypeLine, 0, 0}, /*1*/ + {96.0, 69.5, PathPointTypeLine, 0, 0}, /*2*/ + {91.5, 78.0, PathPointTypeLine, 0, 0}, /*3*/ + {85.5, 85.5, PathPointTypeLine, 0, 0}, /*4*/ + {78.0, 91.5, PathPointTypeLine, 0, 0}, /*5*/ + {69.5, 96.0, PathPointTypeLine, 0, 0}, /*6*/ + {60.0, 99.0, PathPointTypeLine, 0, 0}, /*7*/ + {50.0, 100.0,PathPointTypeLine, 0, 0} /*8*/ + }; + static void test_flatten(void) { GpStatus status; @@ -941,11 +953,15 @@ static void test_flatten(void) status = GdipFlattenPath(NULL, m, 0.0); expect(InvalidParameter, status); + /* flatten empty path */ + status = GdipFlattenPath(path, NULL, 1.0); + expect(Ok, status); + status = GdipAddPathEllipse(path, 0.0, 0.0, 100.0, 50.0); expect(Ok, status); status = GdipFlattenPath(path, NULL, 1.0); - todo_wine expect(Ok, status); + expect(Ok, status); ok_path(path, flattenellipse_path, sizeof(flattenellipse_path)/sizeof(path_test_t), TRUE); status = GdipResetPath(path); @@ -953,9 +969,18 @@ static void test_flatten(void) status = GdipAddPathArc(path, 0.0, 0.0, 100.0, 50.0, 0.0, 90.0); expect(Ok, status); status = GdipFlattenPath(path, NULL, 1.0); - todo_wine expect(Ok, status); + expect(Ok, status); ok_path(path, flattenarc_path, sizeof(flattenarc_path)/sizeof(path_test_t), TRUE); + /* easy case - quater of a full circle */ + status = GdipResetPath(path); + expect(Ok, status); + status = GdipAddPathArc(path, 0.0, 0.0, 100.0, 100.0, 0.0, 90.0); + expect(Ok, status); + status = GdipFlattenPath(path, NULL, 1.0); + expect(Ok, status); + ok_path(path, flattenquater_path, sizeof(flattenquater_path)/sizeof(path_test_t), FALSE); + GdipDeleteMatrix(m); GdipDeletePath(path); } diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c index 49d1e5eec79..46e63f2e1bf 100644 --- a/dlls/gdiplus/tests/image.c +++ b/dlls/gdiplus/tests/image.c @@ -504,22 +504,19 @@ static void test_GdipCloneImage(void) /* Create an image, clone it, delete the original, make sure the copy works */ stat = GdipCreateBitmapFromScan0(WIDTH, HEIGHT, 0, PixelFormat24bppRGB, NULL, &bm); expect(Ok, stat); -todo_wine -{ + image_src = ((GpImage*)bm); stat = GdipCloneImage(image_src, &image_dest); expect(Ok, stat); -} + stat = GdipDisposeImage((GpImage*)bm); expect(Ok, stat); -todo_wine -{ stat = GdipGetImageBounds(image_dest, &rectF, &unit); expect(Ok, stat); + stat = GdipDisposeImage(image_dest); expect(Ok, stat); } -} START_TEST(image) { diff --git a/dlls/gphoto2.ds/gphoto2_Zh.rc b/dlls/gphoto2.ds/gphoto2_Zh.rc new file mode 100644 index 00000000000..b734368db0a --- /dev/null +++ b/dlls/gphoto2.ds/gphoto2_Zh.rc @@ -0,0 +1,96 @@ +/* + * Twain (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_CAMERAUI DIALOG DISCARDABLE 0, 0, 372, 273 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "照相机中的文件" +MENU 20545 +FONT 9, "MS Song" +BEGIN + CONTROL "List1",IDC_LIST1,"SysListView32", LVS_ICON | WS_BORDER | +WS_TABSTOP,7,7,358,229 + DEFPUSHBUTTON "导入选定文件",IDC_IMPORT,152,252,72,14 + PUSHBUTTON "预览",IDC_FETCH,7,252,64,14 + PUSHBUTTON "导入全部",IDC_IMPORTALL,80,252,64,14 + CONTROL "跳过本对话框",IDC_SKIP,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,230,252,76,14 + PUSHBUTTON "退出",IDC_EXIT,315,252,50,14 +END + +IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 46 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTER | DS_SETFOREGROUND +CAPTION "正在传输" +FONT 9, "MS Song" +BEGIN + LTEXT "正在传输... 请稍候",IDC_STATIC,5,19,176,8, SS_CENTER +END + +IDD_CONNECTING DIALOG DISCARDABLE 0, 0, 280, 116 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU| WS_VISIBLE | DS_CENTER +CAPTION "连接照相机" +FONT 9, "MS Song" +BEGIN + CONTROL "",IDC_BITMAP,"Static",SS_BITMAP|SS_CENTERIMAGE,4,4,110,110 + LTEXT "正在连接照相机... 请稍候",IDC_STATIC,128,58, + 116,8 +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_CAMERAUI DIALOG DISCARDABLE 0, 0, 372, 273 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +CAPTION "照相機中的檔案" +MENU 20545 +FONT 8, "PMingLiu" +BEGIN + CONTROL "List1",IDC_LIST1,"SysListView32", LVS_ICON | WS_BORDER | +WS_TABSTOP,7,7,358,229 + DEFPUSHBUTTON "導入選定檔案",IDC_IMPORT,152,252,72,14 + PUSHBUTTON "預覽",IDC_FETCH,7,252,64,14 + PUSHBUTTON "導入全部",IDC_IMPORTALL,80,252,64,14 + CONTROL "跳過本對話框",IDC_SKIP,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,230,252,76,14 + PUSHBUTTON "結束",IDC_EXIT,315,252,50,14 +END + +IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 46 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTER | DS_SETFOREGROUND +CAPTION "正在傳輸" +FONT 8, "PMingLiu" +BEGIN + LTEXT "正在傳輸... 請稍候",IDC_STATIC,5,19,176,8, SS_CENTER +END + +IDD_CONNECTING DIALOG DISCARDABLE 0, 0, 280, 116 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU| WS_VISIBLE | DS_CENTER +CAPTION "連接照相機" +FONT 8, "PMingLiu" +BEGIN + CONTROL "",IDC_BITMAP,"Static",SS_BITMAP|SS_CENTERIMAGE,4,4,110,110 + LTEXT "正在連接照相機... 請稍候",IDC_STATIC,128,58, + 116,8 +END + +#pragma code_page(default) diff --git a/dlls/gphoto2.ds/rsrc.rc b/dlls/gphoto2.ds/rsrc.rc index 680b401e6c3..2309565f2b2 100644 --- a/dlls/gphoto2.ds/rsrc.rc +++ b/dlls/gphoto2.ds/rsrc.rc @@ -38,3 +38,4 @@ #include "gphoto2_Ru.rc" #include "gphoto2_Si.rc" #include "gphoto2_Sv.rc" +#include "gphoto2_Zh.rc" diff --git a/dlls/hhctrl.ocx/Zh.rc b/dlls/hhctrl.ocx/Zh.rc new file mode 100644 index 00000000000..a7ccab0da74 --- /dev/null +++ b/dlls/hhctrl.ocx/Zh.rc @@ -0,0 +1,100 @@ +/* + * HTML Help (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE +BEGIN + IDS_CONTENTS "内容(&C)" + IDS_INDEX "目录(&N)" + IDS_SEARCH "搜寻(&S)" + IDS_FAVORITES "最爱(&I)" +END + +STRINGTABLE +BEGIN + IDTB_EXPAND "显示" + IDTB_CONTRACT "隐藏" + IDTB_STOP "停止" + IDTB_REFRESH "刷新" + IDTB_BACK "向后" + IDTB_HOME "首页" + IDTB_SYNC "同步" + IDTB_PRINT "打印" + IDTB_OPTIONS "选项" + IDTB_FORWARD "向前" + IDTB_NOTES "说明" + IDTB_BROWSE_FWD "向前" + IDTB_BROWSE_BACK "向后" + IDTB_CONTENTS "内容" + IDTB_INDEX "目录" + IDTB_SEARCH "搜寻" + IDTB_HISTORY "历史" + IDTB_FAVORITES "最爱" + IDTB_JUMP1 "Jump1" + IDTB_JUMP2 "Jump2" + IDTB_CUSTOMIZE "个性化" + IDTB_ZOOM "放大" + IDTB_TOC_NEXT "后一项" + IDTB_TOC_PREV "前一项" +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE +BEGIN + IDS_CONTENTS "內容(&C)" + IDS_INDEX "目錄(&N)" + IDS_SEARCH "搜尋(&S)" + IDS_FAVORITES "最愛(&I)" +END + +STRINGTABLE +BEGIN + IDTB_EXPAND "顯示" + IDTB_CONTRACT "隱藏" + IDTB_STOP "停止" + IDTB_REFRESH "刷新" + IDTB_BACK "向後" + IDTB_HOME "首頁" + IDTB_SYNC "同步" + IDTB_PRINT "列印" + IDTB_OPTIONS "選項" + IDTB_FORWARD "向前" + IDTB_NOTES "說明" + IDTB_BROWSE_FWD "向前" + IDTB_BROWSE_BACK "向後" + IDTB_CONTENTS "內容" + IDTB_INDEX "目錄" + IDTB_SEARCH "搜尋" + IDTB_HISTORY "歷史" + IDTB_FAVORITES "最愛" + IDTB_JUMP1 "Jump1" + IDTB_JUMP2 "Jump2" + IDTB_CUSTOMIZE "個性化" + IDTB_ZOOM "放大" + IDTB_TOC_NEXT "後一項" + IDTB_TOC_PREV "前一項" +END + +#pragma code_page(default) diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h index 6f7c96b63c4..f529a595172 100644 --- a/dlls/hhctrl.ocx/hhctrl.h +++ b/dlls/hhctrl.ocx/hhctrl.h @@ -141,22 +141,22 @@ BOOL NavigateToChm(HHInfo*,LPCWSTR,LPCWSTR); /* memory allocation functions */ -static inline void *heap_alloc(size_t len) +static inline void __WINE_ALLOC_SIZE(1) *heap_alloc(size_t len) { return HeapAlloc(GetProcessHeap(), 0, len); } -static inline void *heap_alloc_zero(size_t len) +static inline void __WINE_ALLOC_SIZE(1) *heap_alloc_zero(size_t len) { return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); } -static inline void *heap_realloc(void *mem, size_t len) +static inline void __WINE_ALLOC_SIZE(2) *heap_realloc(void *mem, size_t len) { return HeapReAlloc(GetProcessHeap(), 0, mem, len); } -static inline void *heap_realloc_zero(void *mem, size_t len) +static inline void __WINE_ALLOC_SIZE(2) *heap_realloc_zero(void *mem, size_t len) { return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len); } diff --git a/dlls/hhctrl.ocx/hhctrl.rc b/dlls/hhctrl.ocx/hhctrl.rc index 08d9648caa0..1a5950cef26 100644 --- a/dlls/hhctrl.ocx/hhctrl.rc +++ b/dlls/hhctrl.ocx/hhctrl.rc @@ -45,3 +45,4 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c index a68ea7b7c8b..8251151f871 100644 --- a/dlls/iphlpapi/tests/iphlpapi.c +++ b/dlls/iphlpapi/tests/iphlpapi.c @@ -432,7 +432,8 @@ static void testGetTcpTable(void) "GetTcpTable(NULL, NULL, FALSE) returned %d, expected ERROR_INVALID_PARAMETER\n", apiReturn); apiReturn = gGetTcpTable(NULL, &dwSize, FALSE); - ok(apiReturn == ERROR_INSUFFICIENT_BUFFER, + ok(apiReturn == ERROR_INSUFFICIENT_BUFFER || + broken(apiReturn == ERROR_NO_DATA), /* win95 */ "GetTcpTable(NULL, &dwSize, FALSE) returned %d, expected ERROR_INSUFFICIENT_BUFFER\n", apiReturn); if (apiReturn == ERROR_INSUFFICIENT_BUFFER) { diff --git a/dlls/jscript/Makefile.in b/dlls/jscript/Makefile.in index ecf6ffedd7d..095659b7176 100644 --- a/dlls/jscript/Makefile.in +++ b/dlls/jscript/Makefile.in @@ -3,16 +3,23 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = jscript.dll -IMPORTS = kernel32 +IMPORTS = oleaut32 kernel32 RC_SRCS = rsrc.rc C_SRCS = \ + dispex.c \ + engine.c \ jscript.c \ - jscript_main.c + jscript_main.c \ + jsutils.c \ + lex.c IDL_TLB_SRCS = jsglobal.idl +BISON_SRCS = \ + parser.y + @MAKE_DLL_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c new file mode 100644 index 00000000000..3ea1ed14536 --- /dev/null +++ b/dlls/jscript/dispex.c @@ -0,0 +1,230 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "jscript.h" + +#include "wine/unicode.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +#define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface) + +static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = _IDispatchEx_(This); + }else if(IsEqualGUID(&IID_IDispatch, riid)) { + TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); + *ppv = _IDispatchEx_(This); + }else if(IsEqualGUID(&IID_IDispatchEx, riid)) { + TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv); + *ppv = _IDispatchEx_(This); + }else { + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + script_release(This->ctx); + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + + TRACE("(%p)->(%p)\n", This, pctinfo); + + *pctinfo = 1; + return S_OK; +} + +static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + UINT i; + HRESULT hres; + + TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, + lcid, rgDispId); + + for(i=0; i < cNames; i++) { + hres = IDispatchEx_GetDispID(_IDispatchEx_(This), rgszNames[i], 0, rgDispId+i); + if(FAILED(hres)) + return hres; + } + + return S_OK; +} + +static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + + TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + + return IDispatchEx_InvokeEx(_IDispatchEx_(This), dispIdMember, lcid, wFlags, + pDispParams, pVarResult, pExcepInfo, NULL); +} + +static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%s %x)\n", This, debugstr_w(bstrName), grfdex); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%x)\n", This, id); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%x %x %p)\n", This, id, grfdexFetch, pgrfdex); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%x %p)\n", This, id, pbstrName); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%x %x %p)\n", This, grfdex, id, pid); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) +{ + DispatchEx *This = DISPATCHEX_THIS(iface); + FIXME("(%p)->(%p)\n", This, ppunk); + return E_NOTIMPL; +} + +#undef DISPATCHEX_THIS + +static IDispatchExVtbl DispatchExVtbl = { + DispatchEx_QueryInterface, + DispatchEx_AddRef, + DispatchEx_Release, + DispatchEx_GetTypeInfoCount, + DispatchEx_GetTypeInfo, + DispatchEx_GetIDsOfNames, + DispatchEx_Invoke, + DispatchEx_GetDispID, + DispatchEx_InvokeEx, + DispatchEx_DeleteMemberByName, + DispatchEx_DeleteMemberByDispID, + DispatchEx_GetMemberProperties, + DispatchEx_GetMemberName, + DispatchEx_GetNextDispID, + DispatchEx_GetNameSpaceParent +}; + +static HRESULT init_dispex(DispatchEx *dispex, script_ctx_t *ctx) +{ + dispex->lpIDispatchExVtbl = &DispatchExVtbl; + dispex->ref = 1; + + script_addref(ctx); + dispex->ctx = ctx; + + return S_OK; +} + +HRESULT create_dispex(script_ctx_t *ctx, DispatchEx **dispex) +{ + DispatchEx *ret; + HRESULT hres; + + ret = heap_alloc_zero(sizeof(DispatchEx)); + if(!ret) + return E_OUTOFMEMORY; + + hres = init_dispex(ret, ctx); + if(FAILED(hres)) + return hres; + + *dispex = ret; + return S_OK; +} diff --git a/dlls/jscript/engine.c b/dlls/jscript/engine.c new file mode 100644 index 00000000000..ef66c9767a1 --- /dev/null +++ b/dlls/jscript/engine.c @@ -0,0 +1,560 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "jscript.h" +#include "engine.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +static inline HRESULT stat_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + return stat->eval(ctx, stat, rt, ret); +} + +HRESULT create_exec_ctx(exec_ctx_t **ret) +{ + exec_ctx_t *ctx; + + ctx = heap_alloc_zero(sizeof(exec_ctx_t)); + if(!ctx) + return E_OUTOFMEMORY; + + *ret = ctx; + return S_OK; +} + +void exec_release(exec_ctx_t *ctx) +{ + if(--ctx->ref) + return; + + heap_free(ctx); +} + +HRESULT exec_source(exec_ctx_t *ctx, parser_ctx_t *parser, source_elements_t *source, jsexcept_t *ei, VARIANT *retv) +{ + script_ctx_t *script = parser->script; + parser_ctx_t *prev_parser; + VARIANT val, tmp; + statement_t *stat; + exec_ctx_t *prev_ctx; + return_type_t rt; + HRESULT hres = S_OK; + + prev_ctx = script->exec_ctx; + script->exec_ctx = ctx; + + prev_parser = ctx->parser; + ctx->parser = parser; + + V_VT(&val) = VT_EMPTY; + memset(&rt, 0, sizeof(rt)); + rt.type = RT_NORMAL; + + for(stat = source->statement; stat; stat = stat->next) { + hres = stat_eval(ctx, stat, &rt, &tmp); + if(FAILED(hres)) + break; + + VariantClear(&val); + val = tmp; + if(rt.type != RT_NORMAL) + break; + } + + script->exec_ctx = prev_ctx; + ctx->parser = prev_parser; + + if(rt.type != RT_NORMAL && rt.type != RT_RETURN) { + FIXME("wrong rt %d\n", rt.type); + hres = E_FAIL; + } + + *ei = rt.ei; + if(FAILED(hres)) { + VariantClear(&val); + return hres; + } + + if(retv) + *retv = val; + else + VariantClear(&val); + return S_OK; +} + +HRESULT block_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT var_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT empty_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + TRACE("\n"); + + V_VT(ret) = VT_EMPTY; + return S_OK; +} + +HRESULT expression_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT if_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT dowhile_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT while_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT for_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT forin_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT continue_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT break_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT return_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT with_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT labelled_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT switch_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT throw_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT try_statement_eval(exec_ctx_t *ctx, statement_t *stat, return_type_t *rt, VARIANT *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT function_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT conditional_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT array_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT member_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT member_new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT call_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT this_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT identifier_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT array_literal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT property_value_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT comma_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT logical_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT logical_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT binary_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT binary_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT binary_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT instanceof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT in_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT mul_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT div_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT delete_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT void_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT typeof_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT minus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT plus_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT post_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT post_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT pre_increment_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT pre_decrement_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT new_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT equal_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT equal2_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT not_equal_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT not_equal2_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT less_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT lesseq_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT greater_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT greatereq_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT binary_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT logical_negation_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT left_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT right_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT right2_shift_expression_eval(exec_ctx_t *ctx, expression_t *_expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_lshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_rshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_rrshift_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_add_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_sub_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_mul_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_div_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_mod_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_and_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_or_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} + +HRESULT assign_xor_expression_eval(exec_ctx_t *ctx, expression_t *expr, DWORD flags, jsexcept_t *ei, exprval_t *ret) +{ + FIXME("\n"); + return E_NOTIMPL; +} diff --git a/dlls/jscript/engine.h b/dlls/jscript/engine.h new file mode 100644 index 00000000000..6e91178b431 --- /dev/null +++ b/dlls/jscript/engine.h @@ -0,0 +1,441 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +typedef struct _source_elements_t source_elements_t; + +typedef struct _parser_ctx_t { + LONG ref; + + const WCHAR *ptr; + const WCHAR *begin; + const WCHAR *end; + + script_ctx_t *script; + source_elements_t *source; + BOOL nl; + HRESULT hres; + + jsheap_t tmp_heap; + jsheap_t heap; + + struct _parser_ctx_t *next; +} parser_ctx_t; + +HRESULT script_parse(script_ctx_t*,const WCHAR*,parser_ctx_t**); +void parser_release(parser_ctx_t*); + +int parser_lex(void*,parser_ctx_t*); + +static inline void parser_addref(parser_ctx_t *ctx) +{ + ctx->ref++; +} + +static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size) +{ + return jsheap_alloc(&ctx->heap, size); +} + +static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size) +{ + return jsheap_alloc(&ctx->tmp_heap, size); +} + +struct _exec_ctx_t { + LONG ref; + + parser_ctx_t *parser; +}; + +static inline void exec_addref(exec_ctx_t *ctx) +{ + ctx->ref++; +} + +void exec_release(exec_ctx_t*); +HRESULT create_exec_ctx(exec_ctx_t**); +HRESULT exec_source(exec_ctx_t*,parser_ctx_t*,source_elements_t*,jsexcept_t*,VARIANT*); + +typedef struct _statement_t statement_t; +typedef struct _expression_t expression_t; +typedef struct _parameter_t parameter_t; + +typedef struct { + VARTYPE vt; + union { + LONG lval; + double dval; + const WCHAR *wstr; + VARIANT_BOOL bval; + IDispatch *disp; + } u; +} literal_t; + +typedef struct _variable_declaration_t { + const WCHAR *identifier; + expression_t *expr; + + struct _variable_declaration_t *next; +} variable_declaration_t; + +typedef struct { + enum{ + RT_NORMAL, + RT_RETURN, + RT_BREAK, + RT_CONTINUE + } type; + jsexcept_t ei; +} return_type_t; + +typedef HRESULT (*statement_eval_t)(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); + +struct _statement_t { + statement_eval_t eval; + statement_t *next; +}; + +typedef struct { + statement_t stat; + statement_t *stat_list; +} block_statement_t; + +typedef struct { + statement_t stat; + variable_declaration_t *variable_list; +} var_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; +} expression_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; + statement_t *if_stat; + statement_t *else_stat; +} if_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; + statement_t *statement; +} while_statement_t; + +typedef struct { + statement_t stat; + variable_declaration_t *variable_list; + expression_t *begin_expr; + expression_t *expr; + expression_t *end_expr; + statement_t *statement; +} for_statement_t; + +typedef struct { + statement_t stat; + variable_declaration_t *variable; + expression_t *expr; + expression_t *in_expr; + statement_t *statement; +} forin_statement_t; + +typedef struct { + statement_t stat; + const WCHAR *identifier; +} branch_statement_t; + +typedef struct { + statement_t stat; + expression_t *expr; + statement_t *statement; +} with_statement_t; + +typedef struct { + statement_t stat; + const WCHAR *identifier; + statement_t *statement; +} labelled_statement_t; + +typedef struct _case_clausule_t { + expression_t *expr; + statement_t *stat; + + struct _case_clausule_t *next; +} case_clausule_t; + +typedef struct { + statement_t stat; + expression_t *expr; + case_clausule_t *case_list; +} switch_statement_t; + +typedef struct { + const WCHAR *identifier; + statement_t *statement; +} catch_block_t; + +typedef struct { + statement_t stat; + statement_t *try_statement; + catch_block_t *catch_block; + statement_t *finally_statement; +} try_statement_t; + +HRESULT block_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT var_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT empty_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT expression_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT if_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT dowhile_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT while_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT for_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT forin_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT continue_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT break_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT return_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT with_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT labelled_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT switch_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT throw_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); +HRESULT try_statement_eval(exec_ctx_t*,statement_t*,return_type_t*,VARIANT*); + +typedef struct exprval_t exprval_t; + +typedef HRESULT (*expression_eval_t)(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); + +struct _expression_t { + expression_eval_t eval; +}; + +struct _parameter_t { + const WCHAR *identifier; + + struct _parameter_t *next; +}; + +typedef struct _function_declaration_t { + const WCHAR *identifier; + parameter_t *parameter_list; + source_elements_t *source_elements; + + struct _function_declaration_t *next; +} function_declaration_t; + +struct _source_elements_t { + statement_t *statement; + statement_t *statement_tail; + function_declaration_t *functions; + function_declaration_t *functions_tail; +}; + +typedef struct { + expression_t expr; + const WCHAR *identifier; + parameter_t *parameter_list; + source_elements_t *source_elements; +} function_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression1; + expression_t *expression2; +} binary_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression; +} unary_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression; + expression_t *true_expression; + expression_t *false_expression; +} conditional_expression_t; + +typedef struct { + expression_t expr; + expression_t *member_expr; + expression_t *expression; +} array_expression_t; + +typedef struct { + expression_t expr; + expression_t *expression; + const WCHAR *identifier; +} member_expression_t; + +typedef struct _argument_t { + expression_t *expr; + + struct _argument_t *next; +} argument_t; + +typedef struct { + expression_t expr; + expression_t *expression; + argument_t *argument_list; +} call_expression_t; + +typedef struct { + expression_t expr; + const WCHAR *identifier; +} identifier_expression_t; + +typedef struct { + expression_t expr; + literal_t *literal; +} literal_expression_t; + +typedef struct _array_element_t { + int elision; + expression_t *expr; + + struct _array_element_t *next; +} array_element_t; + +typedef struct { + expression_t expr; + array_element_t *element_list; + int length; +} array_literal_expression_t; + +typedef struct _prop_val_t { + literal_t *name; + expression_t *value; + + struct _prop_val_t *next; +} prop_val_t; + +typedef struct { + expression_t expr; + prop_val_t *property_list; +} property_value_expression_t; + +typedef enum { + EXPR_COMMA, + EXPR_OR, + EXPR_AND, + EXPR_BOR, + EXPR_BXOR, + EXPR_BAND, + EXPR_INSTANCEOF, + EXPR_IN, + EXPR_ADD, + EXPR_SUB, + EXPR_MUL, + EXPR_DIV, + EXPR_MOD, + EXPR_DELETE, + EXPR_VOID, + EXPR_TYPEOF, + EXPR_MINUS, + EXPR_PLUS, + EXPR_POSTINC, + EXPR_POSTDEC, + EXPR_PREINC, + EXPR_PREDEC, + EXPR_NEW, + EXPR_EQ, + EXPR_EQEQ, + EXPR_NOTEQ, + EXPR_NOTEQEQ, + EXPR_LESS, + EXPR_LESSEQ, + EXPR_GREATER, + EXPR_GREATEREQ, + EXPR_BITNEG, + EXPR_LOGNEG, + EXPR_LSHIFT, + EXPR_RSHIFT, + EXPR_RRSHIFT, + EXPR_ASSIGN, + EXPR_ASSIGNLSHIFT, + EXPR_ASSIGNRSHIFT, + EXPR_ASSIGNRRSHIFT, + EXPR_ASSIGNADD, + EXPR_ASSIGNSUB, + EXPR_ASSIGNMUL, + EXPR_ASSIGNDIV, + EXPR_ASSIGNMOD, + EXPR_ASSIGNAND, + EXPR_ASSIGNOR, + EXPR_ASSIGNXOR +} expression_type_t; + +HRESULT function_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT conditional_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT array_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT member_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT member_new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT call_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT this_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT identifier_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT literal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT array_literal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT property_value_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); + +HRESULT comma_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT logical_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT logical_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT binary_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT binary_xor_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT binary_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT instanceof_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT in_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT add_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT sub_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT mul_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT div_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT mod_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT delete_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT void_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT typeof_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT minus_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT plus_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT post_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT post_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT pre_increment_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT pre_decrement_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT new_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT not_equal_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT not_equal2_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT less_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT lesseq_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT greater_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT greatereq_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT binary_negation_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT logical_negation_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT left_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT right_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT right2_shift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_lshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_rshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_rrshift_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_add_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_sub_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_mul_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_div_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_mod_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_and_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_or_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); +HRESULT assign_xor_expression_eval(exec_ctx_t*,expression_t*,DWORD,jsexcept_t*,exprval_t*); diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index f058e265d40..2bd9f12f40a 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -17,7 +17,7 @@ */ #include "jscript.h" -#include "activscp.h" +#include "engine.h" #include "objsafe.h" #include "wine/debug.h" @@ -34,6 +34,13 @@ typedef struct { LONG ref; DWORD safeopt; + script_ctx_t *ctx; + LONG thread_id; + + IActiveScriptSite *site; + + parser_ctx_t *queue_head; + parser_ctx_t *queue_tail; } JScript; #define ACTSCRIPT(x) ((IActiveScript*) &(x)->lpIActiveScriptVtbl) @@ -42,6 +49,83 @@ typedef struct { #define ACTSCPPROP(x) ((IActiveScriptProperty*) &(x)->lpIActiveScriptPropertyVtbl) #define OBJSAFETY(x) ((IObjectSafety*) &(x)->lpIObjectSafetyVtbl) +void script_release(script_ctx_t *ctx) +{ + if(--ctx->ref) + return; + + heap_free(ctx); +} + +static void change_state(JScript *This, SCRIPTSTATE state) +{ + if(This->ctx->state == state) + return; + + This->ctx->state = state; + IActiveScriptSite_OnStateChange(This->site, state); +} + +static inline BOOL is_started(script_ctx_t *ctx) +{ + return ctx->state == SCRIPTSTATE_STARTED + || ctx->state == SCRIPTSTATE_CONNECTED + || ctx->state == SCRIPTSTATE_DISCONNECTED; +} + +static HRESULT exec_global_code(JScript *This, parser_ctx_t *parser_ctx) +{ + exec_ctx_t *exec_ctx; + jsexcept_t jsexcept; + VARIANT var; + HRESULT hres; + + hres = create_exec_ctx(&exec_ctx); + if(FAILED(hres)) + return hres; + + IActiveScriptSite_OnEnterScript(This->site); + + memset(&jsexcept, 0, sizeof(jsexcept)); + hres = exec_source(exec_ctx, parser_ctx, parser_ctx->source, &jsexcept, &var); + VariantClear(&jsexcept.var); + exec_release(exec_ctx); + if(SUCCEEDED(hres)) + VariantClear(&var); + + IActiveScriptSite_OnLeaveScript(This->site); + + return hres; +} + +static void clear_script_queue(JScript *This) +{ + parser_ctx_t *iter, *iter2; + + if(!This->queue_head) + return; + + iter = This->queue_head; + while(iter) { + iter2 = iter->next; + iter->next = NULL; + parser_release(iter); + iter = iter2; + } + + This->queue_head = This->queue_tail = NULL; +} + +static void exec_queued_code(JScript *This) +{ + parser_ctx_t *iter; + + for(iter = This->queue_head; iter; iter = iter->next) + exec_global_code(This, iter); + + clear_script_queue(This); +} + #define ACTSCRIPT_THIS(iface) DEFINE_THIS(JScript, IActiveScript, iface) static HRESULT WINAPI JScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv) @@ -100,6 +184,10 @@ static ULONG WINAPI JScript_Release(IActiveScript *iface) TRACE("(%p) ref=%d\n", iface, ref); if(!ref) { + if(This->ctx && This->ctx->state != SCRIPTSTATE_CLOSED) + IActiveScript_Close(ACTSCRIPT(This)); + if(This->ctx) + script_release(This->ctx); heap_free(This); unlock_module(); } @@ -111,8 +199,39 @@ static HRESULT WINAPI JScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass) { JScript *This = ACTSCRIPT_THIS(iface); - FIXME("(%p)->(%p)\n", This, pass); - return E_NOTIMPL; + LCID lcid; + HRESULT hres; + + TRACE("(%p)->(%p)\n", This, pass); + + if(!pass) + return E_POINTER; + + if(This->site) + return E_UNEXPECTED; + + if(!This->ctx) { + hres = IActiveScriptParse_InitNew(ASPARSE(This)); + if(FAILED(hres)) + return hres; + } + + hres = create_dispex(This->ctx, &This->ctx->script_disp); + if(FAILED(hres)) + return hres; + + if(InterlockedCompareExchange(&This->thread_id, GetCurrentThreadId(), 0)) + return E_UNEXPECTED; + + This->site = pass; + IActiveScriptSite_AddRef(This->site); + + hres = IActiveScriptSite_GetLCID(This->site, &lcid); + if(hres == S_OK) + This->ctx->lcid = lcid; + + change_state(This, SCRIPTSTATE_INITIALIZED); + return S_OK; } static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid, @@ -126,22 +245,75 @@ static HRESULT WINAPI JScript_GetScriptSite(IActiveScript *iface, REFIID riid, static HRESULT WINAPI JScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss) { JScript *This = ACTSCRIPT_THIS(iface); - FIXME("(%p)->(%d)\n", This, ss); - return E_NOTIMPL; + + TRACE("(%p)->(%d)\n", This, ss); + + if(!This->ctx || GetCurrentThreadId() != This->thread_id) + return E_UNEXPECTED; + + switch(ss) { + case SCRIPTSTATE_STARTED: + if(This->ctx->state == SCRIPTSTATE_CLOSED) + return E_UNEXPECTED; + + exec_queued_code(This); + break; + default: + FIXME("unimplemented state %d\n", ss); + return E_NOTIMPL; + } + + change_state(This, ss); + return S_OK; } static HRESULT WINAPI JScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState) { JScript *This = ACTSCRIPT_THIS(iface); - FIXME("(%p)->(%p)\n", This, pssState); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, pssState); + + if(!pssState) + return E_POINTER; + + if(!This->thread_id) { + *pssState = SCRIPTSTATE_UNINITIALIZED; + return S_OK; + } + + if(This->thread_id != GetCurrentThreadId()) + return E_UNEXPECTED; + + *pssState = This->ctx ? This->ctx->state : SCRIPTSTATE_UNINITIALIZED; + return S_OK; } static HRESULT WINAPI JScript_Close(IActiveScript *iface) { JScript *This = ACTSCRIPT_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->()\n", This); + + if(This->thread_id != GetCurrentThreadId()) + return E_UNEXPECTED; + + clear_script_queue(This); + + if(This->ctx) { + change_state(This, SCRIPTSTATE_CLOSED); + + if(This->ctx->script_disp) { + IDispatchEx_Release(_IDispatchEx_(This->ctx->script_disp)); + This->ctx->script_disp = NULL; + } + } + + if(This->site) { + IActiveScriptSite_Release(This->site); + This->site = NULL; + } + + return S_OK; } static HRESULT WINAPI JScript_AddNamedItem(IActiveScript *iface, @@ -164,8 +336,20 @@ static HRESULT WINAPI JScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR IDispatch **ppdisp) { JScript *This = ACTSCRIPT_THIS(iface); - FIXME("(%p)->()\n", This); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, ppdisp); + + if(!ppdisp) + return E_POINTER; + + if(This->thread_id != GetCurrentThreadId() || !This->ctx->script_disp) { + *ppdisp = NULL; + return E_UNEXPECTED; + } + + *ppdisp = (IDispatch*)_IDispatchEx_(This->ctx->script_disp); + IDispatch_AddRef(*ppdisp); + return S_OK; } static HRESULT WINAPI JScript_GetCurrentScriptThreadID(IActiveScript *iface, @@ -251,8 +435,27 @@ static ULONG WINAPI JScriptParse_Release(IActiveScriptParse *iface) static HRESULT WINAPI JScriptParse_InitNew(IActiveScriptParse *iface) { JScript *This = ASPARSE_THIS(iface); - FIXME("(%p)\n", This); - return E_NOTIMPL; + script_ctx_t *ctx; + + TRACE("(%p)\n", This); + + if(This->ctx) + return E_UNEXPECTED; + + ctx = heap_alloc_zero(sizeof(script_ctx_t)); + if(!ctx) + return E_OUTOFMEMORY; + + ctx->ref = 1; + ctx->state = SCRIPTSTATE_UNINITIALIZED; + + ctx = InterlockedCompareExchangePointer((void**)&This->ctx, ctx, NULL); + if(ctx) { + script_release(ctx); + return E_UNEXPECTED; + } + + return S_OK; } static HRESULT WINAPI JScriptParse_AddScriptlet(IActiveScriptParse *iface, @@ -275,10 +478,32 @@ static HRESULT WINAPI JScriptParse_ParseScriptText(IActiveScriptParse *iface, DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) { JScript *This = ASPARSE_THIS(iface); - FIXME("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode), + parser_ctx_t *parser_ctx; + HRESULT hres; + + TRACE("(%p)->(%s %s %p %s %x %u %x %p %p)\n", This, debugstr_w(pstrCode), debugstr_w(pstrItemName), punkContext, debugstr_w(pstrDelimiter), dwSourceContextCookie, ulStartingLine, dwFlags, pvarResult, pexcepinfo); - return E_NOTIMPL; + + if(This->thread_id != GetCurrentThreadId() || This->ctx->state == SCRIPTSTATE_CLOSED) + return E_UNEXPECTED; + + hres = script_parse(This->ctx, pstrCode, &parser_ctx); + if(FAILED(hres)) + return hres; + + if(!is_started(This->ctx)) { + if(This->queue_tail) + This->queue_tail = This->queue_tail->next = parser_ctx; + else + This->queue_head = This->queue_tail = parser_ctx; + return S_OK; + } + + hres = exec_global_code(This, parser_ctx); + parser_release(parser_ctx); + + return hres; } #undef ASPARSE_THIS @@ -449,7 +674,7 @@ HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUn lock_module(); - ret = heap_alloc(sizeof(*ret)); + ret = heap_alloc_zero(sizeof(*ret)); ret->lpIActiveScriptVtbl = &JScriptVtbl; ret->lpIActiveScriptParseVtbl = &JScriptParseVtbl; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index afdd0c74319..0fff0e89bab 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -25,9 +25,64 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "dispex.h" +#include "activscp.h" + +#include "wine/unicode.h" +#include "wine/list.h" + +typedef struct _script_ctx_t script_ctx_t; +typedef struct _exec_ctx_t exec_ctx_t; + +typedef struct { + EXCEPINFO ei; + VARIANT var; +} jsexcept_t; + +typedef struct DispatchEx { + const IDispatchExVtbl *lpIDispatchExVtbl; + + LONG ref; + + script_ctx_t *ctx; +} DispatchEx; + +#define _IDispatchEx_(x) ((IDispatchEx*) &(x)->lpIDispatchExVtbl) + +HRESULT create_dispex(script_ctx_t*,DispatchEx**); + +struct _script_ctx_t { + LONG ref; + + SCRIPTSTATE state; + exec_ctx_t *exec_ctx; + LCID lcid; + + DispatchEx *script_disp; +}; + +void script_release(script_ctx_t*); + +static inline void script_addref(script_ctx_t *ctx) +{ + ctx->ref++; +} HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**); +typedef struct { + void **blocks; + DWORD block_cnt; + DWORD last_block; + DWORD offset; + struct list custom_blocks; +} jsheap_t; + +void jsheap_init(jsheap_t*); +void *jsheap_alloc(jsheap_t*,DWORD); +void jsheap_clear(jsheap_t*); +void jsheap_free(jsheap_t*); + extern LONG module_ref; static inline void lock_module(void) @@ -50,6 +105,11 @@ static inline void *heap_alloc_zero(size_t len) return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); } +static inline void *heap_realloc(void *mem, size_t len) +{ + return HeapReAlloc(GetProcessHeap(), 0, mem, len); +} + static inline BOOL heap_free(void *mem) { return HeapFree(GetProcessHeap(), 0, mem); diff --git a/dlls/jscript/jscript_main.c b/dlls/jscript/jscript_main.c index 7cb46bfc489..045c96ef0c4 100644 --- a/dlls/jscript/jscript_main.c +++ b/dlls/jscript/jscript_main.c @@ -22,7 +22,6 @@ #include "winreg.h" #include "advpub.h" -#include "activscp.h" #include "activaut.h" #include "objsafe.h" diff --git a/dlls/jscript/jsutils.c b/dlls/jscript/jsutils.c new file mode 100644 index 00000000000..4f84e886b98 --- /dev/null +++ b/dlls/jscript/jsutils.c @@ -0,0 +1,112 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "jscript.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +#define MIN_BLOCK_SIZE 128 + +static inline DWORD block_size(DWORD block) +{ + return MIN_BLOCK_SIZE << block; +} + +void jsheap_init(jsheap_t *heap) +{ + memset(heap, 0, sizeof(*heap)); + list_init(&heap->custom_blocks); +} + +void *jsheap_alloc(jsheap_t *heap, DWORD size) +{ + struct list *list; + void *tmp; + + if(!heap->block_cnt) { + if(!heap->blocks) { + heap->blocks = heap_alloc(sizeof(void*)); + if(!heap->blocks) + return NULL; + } + + tmp = heap_alloc(block_size(0)); + if(!tmp) + return NULL; + + heap->blocks[0] = tmp; + heap->block_cnt = 1; + } + + if(heap->offset + size < block_size(heap->last_block)) { + tmp = ((BYTE*)heap->blocks[heap->last_block])+heap->offset; + heap->offset += size; + return tmp; + } + + if(size < block_size(heap->last_block+1)) { + if(heap->last_block+1 == heap->block_cnt) { + tmp = heap_realloc(heap->blocks, (heap->block_cnt+1)*sizeof(void*)); + if(!tmp) + return NULL; + heap->blocks = tmp; + } + + tmp = heap_alloc(block_size(heap->block_cnt+1)); + if(!tmp) + return NULL; + + heap->blocks[heap->block_cnt++] = tmp; + + heap->last_block++; + heap->offset = size; + return heap->blocks[heap->last_block]; + } + + list = heap_alloc(size + sizeof(struct list)); + if(!list) + return NULL; + + list_add_head(&heap->custom_blocks, list); + return list+1; +} + +void jsheap_clear(jsheap_t *heap) +{ + struct list *tmp; + + while((tmp = list_next(&heap->custom_blocks, &heap->custom_blocks))) { + list_remove(tmp); + heap_free(tmp); + } +} + +void jsheap_free(jsheap_t *heap) +{ + DWORD i; + + jsheap_clear(heap); + + for(i=0; i < heap->block_cnt; i++) + heap_free(heap->blocks[i]); + heap_free(heap->blocks); + + jsheap_init(heap); +} diff --git a/dlls/jscript/lex.c b/dlls/jscript/lex.c new file mode 100644 index 00000000000..d482999bc3a --- /dev/null +++ b/dlls/jscript/lex.c @@ -0,0 +1,687 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#include "jscript.h" +#include "activscp.h" +#include "objsafe.h" +#include "engine.h" + +#define YYSTYPE +#include "parser.tab.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +static const WCHAR breakW[] = {'b','r','e','a','k',0}; +static const WCHAR caseW[] = {'c','a','s','e',0}; +static const WCHAR catchW[] = {'c','a','t','c','h',0}; +static const WCHAR continueW[] = {'c','o','n','t','i','n','u','e',0}; +static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0}; +static const WCHAR deleteW[] = {'d','e','l','e','t','e',0}; +static const WCHAR doW[] = {'d','o',0}; +static const WCHAR elseW[] = {'e','l','s','e',0}; +static const WCHAR falseW[] = {'f','a','l','s','e',0}; +static const WCHAR finallyW[] = {'f','i','n','a','l','l','y',0}; +static const WCHAR forW[] = {'f','o','r',0}; +static const WCHAR functionW[] = {'f','u','n','c','t','i','o','n',0}; +static const WCHAR ifW[] = {'i','f',0}; +static const WCHAR inW[] = {'i','n',0}; +static const WCHAR instanceofW[] = {'i','n','s','t','a','n','c','e','o','f',0}; +static const WCHAR newW[] = {'n','e','w',0}; +static const WCHAR nullW[] = {'n','u','l','l',0}; +static const WCHAR returnW[] = {'r','e','t','u','r','n',0}; +static const WCHAR switchW[] = {'s','w','i','t','c','h',0}; +static const WCHAR thisW[] = {'t','h','i','s',0}; +static const WCHAR throwW[] = {'t','h','r','o','w',0}; +static const WCHAR trueW[] = {'t','r','u','e',0}; +static const WCHAR tryW[] = {'t','r','y',0}; +static const WCHAR typeofW[] = {'t','y','p','e','o','f',0}; +static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0}; +static const WCHAR varW[] = {'v','a','r',0}; +static const WCHAR voidW[] = {'v','o','i','d',0}; +static const WCHAR whileW[] = {'w','h','i','l','e',0}; +static const WCHAR withW[] = {'w','i','t','h',0}; + +static const struct { + const WCHAR *word; + int token; +} keywords[] = { + {breakW, kBREAK}, + {caseW, kCASE}, + {catchW, kCATCH}, + {continueW, kCONTINUE}, + {defaultW, kDEFAULT}, + {deleteW, kDELETE}, + {doW, kDO}, + {elseW, kELSE}, + {falseW, kFALSE}, + {finallyW, kFINALLY}, + {forW, kFOR}, + {functionW, kFUNCTION}, + {ifW, kIF}, + {inW, kIN}, + {instanceofW, kINSTANCEOF}, + {newW, kNEW}, + {nullW, kNULL}, + {returnW, kRETURN}, + {switchW, kSWITCH}, + {thisW, kTHIS}, + {throwW, kTHROW}, + {trueW, kTRUE}, + {tryW, kTRY}, + {typeofW, kTYPEOF}, + {undefinedW, kUNDEFINED}, + {varW, kVAR}, + {voidW, kVOID}, + {whileW, kWHILE}, + {withW, kWITH} +}; + +static int lex_error(parser_ctx_t *ctx, HRESULT hres) +{ + ctx->hres = hres; + return -1; +} + +static int check_keyword(parser_ctx_t *ctx, const WCHAR *word) +{ + const WCHAR *p1 = ctx->ptr; + const WCHAR *p2 = word; + + while(p1 < ctx->end && *p2) { + if(*p1 != *p2) + return *p1 - *p2; + p1++; + p2++; + } + + if(*p2 || (p1 < ctx->end && isalnumW(*p1))) + return 1; + + ctx->ptr = p1; + return 0; +} + +/* ECMA-262 3rd Edition 7.3 */ +static BOOL is_endline(WCHAR c) +{ + return c == '\n' || c == '\r' || c == 0x2028 || c == 0x2029; +} + +static BOOL is_identifier_char(WCHAR c) +{ + return isalnumW(c) || c == '$' || c == '_' || c == '\\'; +} + +static int hex_to_int(WCHAR c) +{ + if('0' <= c && c <= '9') + return c-'0'; + + if('a' <= c && c <= 'f') + return c-'a'+10; + + if('A' <= c && c <= 'F') + return c-'A'+10; + + return -1; +} + +static int check_keywords(parser_ctx_t *ctx) +{ + int min = 0, max = sizeof(keywords)/sizeof(keywords[0])-1, r, i; + + while(min <= max) { + i = (min+max)/2; + + r = check_keyword(ctx, keywords[i].word); + if(!r) + return keywords[i].token; + + if(r > 0) + min = i+1; + else + max = i-1; + } + + return 0; +} + +static void skip_spaces(parser_ctx_t *ctx) +{ + while(ctx->ptr < ctx->end && isspaceW(*ctx->ptr)) { + if(is_endline(*ctx->ptr++)) + ctx->nl = TRUE; + } +} + +static BOOL skip_comment(parser_ctx_t *ctx) +{ + if(ctx->ptr+1 >= ctx->end || *ctx->ptr != '/') + return FALSE; + + switch(ctx->ptr[1]) { + case '*': + ctx->ptr += 2; + while(ctx->ptr+1 < ctx->end && (ctx->ptr[0] != '*' || ctx->ptr[1] != '/')) + ctx->ptr++; + + if(ctx->ptr[0] == '*' && ctx->ptr[1] == '/') { + ctx->ptr += 2; + }else { + WARN("unexpected end of file (missing end of comment)\n"); + ctx->ptr = ctx->end; + } + break; + case '/': + ctx->ptr += 2; + while(ctx->ptr < ctx->end && !is_endline(*ctx->ptr)) + ctx->ptr++; + break; + default: + return FALSE; + } + + return TRUE; +} + +static BOOL unescape(WCHAR *str) +{ + WCHAR *pd, *p, c; + int i; + + pd = p = str; + while(*p) { + if(*p != '\\') { + *pd++ = *p++; + continue; + } + + p++; + c = 0; + + switch(*p) { + case '\'': + case '\"': + case '\\': + c = *p; + break; + case 'b': + c = '\b'; + break; + case 't': + c = '\t'; + break; + case 'n': + c = '\n'; + break; + case 'v': + c = '\v'; + break; + case 'f': + c = '\f'; + break; + case 'r': + c = '\r'; + break; + case '0': + break; + case 'x': + i = hex_to_int(*++p); + if(i == -1) + return FALSE; + c = i << 16; + + i = hex_to_int(*++p); + if(i == -1) + return FALSE; + c += i; + break; + case 'u': + i = hex_to_int(*++p); + if(i == -1) + return FALSE; + c = i << 24; + + i = hex_to_int(*++p); + if(i == -1) + return FALSE; + c += i << 16; + + i = hex_to_int(*++p); + if(i == -1) + return FALSE; + c += 1 << 8; + + i = hex_to_int(*++p); + if(i == -1) + return FALSE; + c += i; + break; + default: + c = *p; + } + + *pd++ = c; + p++; + } + + *pd = 0; + return TRUE; +} + +static int parse_identifier(parser_ctx_t *ctx, const WCHAR **ret) +{ + const WCHAR *ptr = ctx->ptr++; + WCHAR *wstr; + int len; + + while(ctx->ptr < ctx->end && is_identifier_char(*ctx->ptr)) + ctx->ptr++; + + len = ctx->ptr-ptr; + + *ret = wstr = parser_alloc(ctx, (len+1)*sizeof(WCHAR)); + memcpy(wstr, ptr, (len+1)*sizeof(WCHAR)); + wstr[len] = 0; + + /* FIXME: unescape */ + return tIdentifier; +} + +static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret, WCHAR endch) +{ + const WCHAR *ptr = ++ctx->ptr; + WCHAR *wstr; + int len; + + while(ctx->ptr < ctx->end && *ctx->ptr != endch) { + if(*ctx->ptr++ == '\\') + ctx->ptr++; + } + + if(ctx->ptr == ctx->end) { + WARN("unexpected end of file\n"); + return lex_error(ctx, E_FAIL); + } + + len = ctx->ptr-ptr; + + *ret = wstr = parser_alloc(ctx, (len+1)*sizeof(WCHAR)); + memcpy(wstr, ptr, (len+1)*sizeof(WCHAR)); + wstr[len] = 0; + + ctx->ptr++; + + if(!unescape(wstr)) { + WARN("unescape failed\n"); + return lex_error(ctx, E_FAIL); + } + + return tStringLiteral; +} + +static literal_t *alloc_int_literal(parser_ctx_t *ctx, LONG l) +{ + literal_t *ret = parser_alloc(ctx, sizeof(literal_t)); + + ret->vt = VT_I4; + ret->u.lval = l; + + return ret; +} + +static int parse_double_literal(parser_ctx_t *ctx, LONG int_part, literal_t **literal) +{ + double d, tmp = 1.0; + + if(ctx->ptr == ctx->end || !isdigitW(*ctx->ptr)) { + ERR("No digit after point\n"); + return 0; + } + + d = int_part; + while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) + d += (tmp /= 10.0)*(*ctx->ptr++ - '0'); + + if(ctx->ptr < ctx->end && (*ctx->ptr == 'e' || *ctx->ptr == 'E')) { + int sign = 1, e = 0; + + ctx->ptr++; + if(ctx->ptr < ctx->end) { + if(*ctx->ptr == '+') { + ctx->ptr++; + }else if(*ctx->ptr == '-') { + sign = -1; + ctx->ptr++; + }else if(!isdigitW(*ctx->ptr)) { + WARN("Expected exponent part\n"); + return lex_error(ctx, E_FAIL); + } + } + + if(ctx->ptr == ctx->end) { + WARN("unexpected end of file\n"); + return lex_error(ctx, E_FAIL); + } + + while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) + e = e*10 + *ctx->ptr++ - '0'; + e *= sign; + + d = pow(d, e); + } + + *literal = parser_alloc(ctx, sizeof(literal_t)); + (*literal)->vt = VT_R8; + (*literal)->u.dval = d; + + return tNumericLiteral; +} + +static int parse_numeric_literal(parser_ctx_t *ctx, literal_t **literal) +{ + LONG l, d; + + l = *ctx->ptr++ - '0'; + if(ctx->ptr == ctx->end) { + *literal = alloc_int_literal(ctx, l); + return tNumericLiteral; + } + + if(!l) { + if(*ctx->ptr == 'x' || *ctx->ptr == 'X') { + if(++ctx->ptr == ctx->end) { + ERR("unexpexted end of file\n"); + return 0; + } + + while(ctx->ptr < ctx->end && (d = hex_to_int(*ctx->ptr)) != -1) { + l = l*16 + d; + ctx->ptr++; + } + + if(ctx->ptr < ctx->end && is_identifier_char(*ctx->ptr)) { + WARN("unexpected identifier char\n"); + return lex_error(ctx, E_FAIL); + } + + *literal = alloc_int_literal(ctx, l); + return tNumericLiteral; + } + + if(isdigitW(*ctx->ptr) || is_identifier_char(*ctx->ptr)) { + WARN("wrong char after zero\n"); + return lex_error(ctx, E_FAIL); + } + + *literal = alloc_int_literal(ctx, 0); + } + + while(ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) + l = l*10 + *(ctx->ptr++)-'0'; + + if(ctx->ptr < ctx->end) { + if(*ctx->ptr == '.') { + ctx->ptr++; + return parse_double_literal(ctx, l, literal); + } + + if(is_identifier_char(*ctx->ptr)) { + WARN("unexpected identifier char\n"); + return lex_error(ctx, E_FAIL); + } + } + + *literal = alloc_int_literal(ctx, l); + return tNumericLiteral; +} + +int parser_lex(void *lval, parser_ctx_t *ctx) +{ + int ret; + + ctx->nl = FALSE; + + do { + skip_spaces(ctx); + if(ctx->ptr == ctx->end) + return 0; + }while(skip_comment(ctx)); + + if(isalphaW(*ctx->ptr)) { + ret = check_keywords(ctx); + if(ret) + return ret; + + return parse_identifier(ctx, (const WCHAR**)lval); + } + + if(isdigitW(*ctx->ptr)) + return parse_numeric_literal(ctx, lval); + + switch(*ctx->ptr) { + case '{': + case '}': + case '(': + case ')': + case '[': + case ']': + case ';': + case ',': + case '~': + case '?': + case ':': + return *ctx->ptr++; + + case '.': + if(++ctx->ptr < ctx->end && isdigitW(*ctx->ptr)) + return parse_double_literal(ctx, 0, lval); + return '.'; + + case '<': + if(++ctx->ptr == ctx->end) { + *(int*)lval = EXPR_LESS; + return tRelOper; + } + + switch(*ctx->ptr) { + case '=': /* <= */ + ctx->ptr++; + *(int*)lval = EXPR_LESSEQ; + return tRelOper; + case '<': /* << */ + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* <<= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNLSHIFT; + return tAssignOper; + } + *(int*)lval = EXPR_LSHIFT; + return tShiftOper; + default: /* < */ + *(int*)lval = EXPR_LESS; + return tRelOper; + } + + case '>': + if(++ctx->ptr == ctx->end) { /* > */ + *(int*)lval = EXPR_GREATER; + return tRelOper; + } + + switch(*ctx->ptr) { + case '=': /* >= */ + ctx->ptr++; + *(int*)lval = EXPR_GREATEREQ; + return tRelOper; + case '>': /* >> */ + if(++ctx->ptr < ctx->end) { + if(*ctx->ptr == '=') { /* >>= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNRSHIFT; + return tAssignOper; + } + if(*ctx->ptr == '>') { /* >>> */ + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* >>>= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNRRSHIFT; + return tAssignOper; + } + *(int*)lval = EXPR_RRSHIFT; + return tRelOper; + } + } + *(int*)lval = EXPR_RSHIFT; + return tShiftOper; + default: + *(int*)lval = EXPR_GREATER; + return tRelOper; + } + + case '+': + ctx->ptr++; + if(ctx->ptr < ctx->end) { + switch(*ctx->ptr) { + case '+': /* ++ */ + ctx->ptr++; + return tINC; + case '=': /* += */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNADD; + return tAssignOper; + } + } + return '+'; + + case '-': + ctx->ptr++; + if(ctx->ptr < ctx->end) { + switch(*ctx->ptr) { + case '-': /* -- */ + ctx->ptr++; + return tDEC; + case '=': /* -= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNSUB; + return tAssignOper; + } + } + return '-'; + + case '*': + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* *= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNMUL; + return tAssignOper; + } + return '*'; + + case '%': + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* %= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNMOD; + return tAssignOper; + } + return '%'; + + case '&': + if(++ctx->ptr < ctx->end) { + switch(*ctx->ptr) { + case '=': /* &= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNAND; + return tAssignOper; + case '&': /* && */ + ctx->ptr++; + return tANDAND; + } + } + return '&'; + + case '|': + if(++ctx->ptr < ctx->end) { + switch(*ctx->ptr) { + case '=': /* |= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNOR; + return tAssignOper; + case '|': /* || */ + ctx->ptr++; + return tOROR; + } + } + return '|'; + + case '^': + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* ^= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNXOR; + return tAssignOper; + } + return '^'; + + case '!': + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* != */ + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* !== */ + ctx->ptr++; + *(int*)lval = EXPR_NOTEQEQ; + return tEqOper; + } + *(int*)lval = EXPR_NOTEQ; + return tEqOper; + } + return '!'; + + case '=': + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* == */ + if(++ctx->ptr < ctx->end && *ctx->ptr == '=') { /* === */ + ctx->ptr++; + *(int*)lval = EXPR_EQEQ; + return tEqOper; + } + *(int*)lval = EXPR_EQ; + return tEqOper; + } + return '='; + + case '/': + if(++ctx->ptr < ctx->end) { + if(*ctx->ptr == '=') { /* /= */ + ctx->ptr++; + *(int*)lval = EXPR_ASSIGNMUL; + return tAssignOper; + } + } + return '/'; + + case '\"': + case '\'': + return parse_string_literal(ctx, (const WCHAR**)lval, *ctx->ptr); + + case '_': + case '$': + return parse_identifier(ctx, lval); + } + + WARN("unexpected char '%c' %d\n", *ctx->ptr, *ctx->ptr); + return 0; +} diff --git a/dlls/jscript/parser.y b/dlls/jscript/parser.y new file mode 100644 index 00000000000..a9e2063ac80 --- /dev/null +++ b/dlls/jscript/parser.y @@ -0,0 +1,1550 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +%{ + +#include "jscript.h" +#include "engine.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(jscript); + +#define YYLEX_PARAM ctx +#define YYPARSE_PARAM ctx + +static int parser_error(const char*); +static BOOL allow_auto_semicolon(parser_ctx_t*); +static void program_parsed(parser_ctx_t*,source_elements_t*); + +typedef struct { + statement_t *head; + statement_t *tail; +} statement_list_t; + +static literal_t *new_string_literal(parser_ctx_t*,const WCHAR*); +static literal_t *new_null_literal(parser_ctx_t*); +static literal_t *new_undefined_literal(parser_ctx_t*); +static literal_t *new_boolean_literal(parser_ctx_t*,VARIANT_BOOL); + +typedef struct { + prop_val_t *head; + prop_val_t *tail; +} property_list_t; + +static property_list_t *new_property_list(parser_ctx_t*,literal_t*,expression_t*); +static property_list_t *property_list_add(parser_ctx_t*,property_list_t*,literal_t*,expression_t*); + +typedef struct { + array_element_t *head; + array_element_t *tail; +} element_list_t; + +static element_list_t *new_element_list(parser_ctx_t*,int,expression_t*); +static element_list_t *element_list_add(parser_ctx_t*,element_list_t*,int,expression_t*); + +typedef struct { + argument_t *head; + argument_t *tail; +} argument_list_t; + +static argument_list_t *new_argument_list(parser_ctx_t*,expression_t*); +static argument_list_t *argument_list_add(parser_ctx_t*,argument_list_t*,expression_t*); + +typedef struct { + case_clausule_t *head; + case_clausule_t *tail; +} case_list_t; + +static catch_block_t *new_catch_block(parser_ctx_t*,const WCHAR*,statement_t*); +static case_clausule_t *new_case_clausule(parser_ctx_t*,expression_t*,statement_list_t*); +static case_list_t *new_case_list(parser_ctx_t*,case_clausule_t*); +static case_list_t *case_list_add(parser_ctx_t*,case_list_t*,case_clausule_t*); +static case_clausule_t *new_case_block(parser_ctx_t*,case_list_t*,case_clausule_t*,case_list_t*); + +typedef struct { + variable_declaration_t *head; + variable_declaration_t *tail; +} variable_list_t; + +static variable_declaration_t *new_variable_declaration(parser_ctx_t*,const WCHAR*,expression_t*); +static variable_list_t *new_variable_list(parser_ctx_t*,variable_declaration_t*); +static variable_list_t *variable_list_add(parser_ctx_t*,variable_list_t*,variable_declaration_t*); + +static statement_t *new_block_statement(parser_ctx_t*,statement_list_t*); +static statement_t *new_var_statement(parser_ctx_t*,variable_list_t*); +static statement_t *new_empty_statement(parser_ctx_t*); +static statement_t *new_expression_statement(parser_ctx_t*,expression_t*); +static statement_t *new_if_statement(parser_ctx_t*,expression_t*,statement_t*,statement_t*); +static statement_t *new_while_statement(parser_ctx_t*,BOOL,expression_t*,statement_t*); +static statement_t *new_for_statement(parser_ctx_t*,variable_list_t*,expression_t*,expression_t*, + expression_t*,statement_t*); +static statement_t *new_forin_statement(parser_ctx_t*,variable_declaration_t*,expression_t*,expression_t*,statement_t*); +static statement_t *new_continue_statement(parser_ctx_t*,const WCHAR*); +static statement_t *new_break_statement(parser_ctx_t*,const WCHAR*); +static statement_t *new_return_statement(parser_ctx_t*,expression_t*); +static statement_t *new_with_statement(parser_ctx_t*,expression_t*,statement_t*); +static statement_t *new_labelled_statement(parser_ctx_t*,const WCHAR*,statement_t*); +static statement_t *new_switch_statement(parser_ctx_t*,expression_t*,case_clausule_t*); +static statement_t *new_throw_statement(parser_ctx_t*,expression_t*); +static statement_t *new_try_statement(parser_ctx_t*,statement_t*,catch_block_t*,statement_t*); + +struct statement_list_t { + statement_t *head; + statement_t *tail; +}; + +statement_list_t *new_statement_list(parser_ctx_t*,statement_t*); +statement_list_t *statement_list_add(statement_list_t*,statement_t*); + +typedef struct { + parameter_t *head; + parameter_t *tail; +} parameter_list_t; + +static parameter_list_t *new_parameter_list(parser_ctx_t*,const WCHAR*); +static parameter_list_t *parameter_list_add(parser_ctx_t*,parameter_list_t*,const WCHAR*); + +static expression_t *new_function_expression(parser_ctx_t*,const WCHAR*,parameter_list_t*,source_elements_t*); +static expression_t *new_binary_expression(parser_ctx_t*,expression_type_t,expression_t*,expression_t*); +static expression_t *new_unary_expression(parser_ctx_t*,expression_type_t,expression_t*); +static expression_t *new_conditional_expression(parser_ctx_t*,expression_t*,expression_t*,expression_t*); +static expression_t *new_array_expression(parser_ctx_t*,expression_t*,expression_t*); +static expression_t *new_member_expression(parser_ctx_t*,expression_t*,const WCHAR*); +static expression_t *new_member_new_expression(parser_ctx_t*,expression_t*,argument_list_t*); +static expression_t *new_call_expression(parser_ctx_t*,expression_t*,argument_list_t*); +static expression_t *new_this_expression(parser_ctx_t*); +static expression_t *new_identifier_expression(parser_ctx_t*,const WCHAR*); +static expression_t *new_literal_expression(parser_ctx_t*,literal_t*); +static expression_t *new_array_literal_expression(parser_ctx_t*,element_list_t*,int); +static expression_t *new_prop_and_value_expression(parser_ctx_t*,property_list_t*); + +static function_declaration_t *new_function_declaration(parser_ctx_t*,const WCHAR*,parameter_list_t*,source_elements_t*); +static source_elements_t *new_source_elements(parser_ctx_t*); +static source_elements_t *source_elements_add_statement(source_elements_t*,statement_t*); +static source_elements_t *source_elements_add_function(source_elements_t*,function_declaration_t*); + +%} + +%pure_parser +%start Program + +%union { + int ival; + LPCWSTR wstr; + literal_t *literal; + argument_list_t *argument_list; + case_clausule_t *case_clausule; + case_list_t *case_list; + catch_block_t *catch_block; + element_list_t *element_list; + expression_t *expr; + const WCHAR *identifier; + function_declaration_t *function_declaration; + parameter_list_t *parameter_list; + property_list_t *property_list; + source_elements_t *source_elements; + statement_t *statement; + statement_list_t *statement_list; + variable_list_t *variable_list; + variable_declaration_t *variable_declaration; +} + +/* keywords */ +%token kBREAK kCASE kCATCH kCONTINUE kDEFAULT kDELETE kDO kELSE kIF kFINALLY kFOR kFUNCTION kIN +%token kINSTANCEOF kNEW kNULL kUNDEFINED kRETURN kSWITCH kTHIS kTHROW kTRUE kFALSE kTRY kTYPEOF kVAR kVOID kWHILE kWITH +%token tANDAND tOROR tINC tDEC + +/* tokens */ +%token tIdentifier +%token tAssignOper tEqOper tShiftOper tRelOper +%token tNumericLiteral +%token tStringLiteral + +%type SourceElements +%type FunctionBody +%type Statement +%type Block +%type VariableStatement +%type EmptyStatement +%type ExpressionStatement +%type IfStatement +%type IterationStatement +%type ContinueStatement +%type BreakStatement +%type ReturnStatement +%type WithStatement +%type LabelledStatement +%type SwitchStatement +%type ThrowStatement +%type TryStatement +%type Finally +%type StatementList StatementList_opt +%type FunctionDeclaration +%type FormalParameterList FormalParameterList_opt +%type Expression Expression_opt +%type ExpressionNoIn ExpressionNoIn_opt +%type FunctionExpression +%type AssignmentExpression AssignmentExpressionNoIn +%type ConditionalExpression ConditionalExpressionNoIn +%type LeftHandSideExpression +%type LogicalORExpression LogicalORExpressionNoIn +%type LogicalANDExpression LogicalANDExpressionNoIn +%type BitwiseORExpression BitwiseORExpressionNoIn +%type BitwiseXORExpression BitwiseXORExpressionNoIn +%type BitwiseANDExpression BitwiseANDExpressionNoIn +%type EqualityExpression EqualityExpressionNoIn +%type RelationalExpression RelationalExpressionNoIn +%type ShiftExpression +%type AdditiveExpression +%type MultiplicativeExpression +%type Initialiser_opt Initialiser +%type InitialiserNoIn_opt InitialiserNoIn +%type UnaryExpression +%type PostfixExpression +%type NewExpression +%type CallExpression +%type MemberExpression +%type PrimaryExpression +%type Identifier_opt +%type VariableDeclarationList +%type VariableDeclarationListNoIn +%type VariableDeclaration +%type VariableDeclarationNoIn +%type CaseClausules CaseClausules_opt +%type CaseClausule DefaultClausule CaseBlock +%type Catch +%type Arguments +%type ArgumentList +%type Literal +%type ArrayLiteral +%type ObjectLiteral +%type Elision Elision_opt +%type ElementList +%type PropertyNameAndValueList +%type PropertyName +%type BooleanLiteral + +%% + +/* ECMA-262 3rd Edition 14 */ +Program + : SourceElements { program_parsed(ctx, $1); } + +/* ECMA-262 3rd Edition 14 */ +SourceElements + : /* empty */ { $$ = new_source_elements(ctx); } + | SourceElements Statement + { $$ = source_elements_add_statement($1, $2); } + | SourceElements FunctionDeclaration + { $$ = source_elements_add_function($1, $2); } + +/* ECMA-262 3rd Edition 13 */ +FunctionDeclaration + : kFUNCTION tIdentifier '(' FormalParameterList_opt ')' '{' FunctionBody '}' + { $$ = new_function_declaration(ctx, $2, $4, $7); } + +/* ECMA-262 3rd Edition 13 */ +FunctionExpression + : kFUNCTION Identifier_opt '(' FormalParameterList_opt ')' '{' FunctionBody '}' + { $$ = new_function_expression(ctx, $2, $4, $7); } + +/* ECMA-262 3rd Edition 13 */ +FunctionBody + : SourceElements { $$ = $1; } + +/* ECMA-262 3rd Edition 13 */ +FormalParameterList + : tIdentifier { $$ = new_parameter_list(ctx, $1); } + | FormalParameterList ',' tIdentifier + { $$ = parameter_list_add(ctx, $1, $3); } + +/* ECMA-262 3rd Edition 13 */ +FormalParameterList_opt + : /* empty */ { $$ = NULL; } + | FormalParameterList { $$ = $1; } + +/* ECMA-262 3rd Edition 12 */ +Statement + : Block { $$ = $1; } + | VariableStatement { $$ = $1; } + | EmptyStatement { $$ = $1; } + | ExpressionStatement { $$ = $1; } + | IfStatement { $$ = $1; } + | IterationStatement { $$ = $1; } + | ContinueStatement { $$ = $1; } + | BreakStatement { $$ = $1; } + | ReturnStatement { $$ = $1; } + | WithStatement { $$ = $1; } + | LabelledStatement { $$ = $1; } + | SwitchStatement { $$ = $1; } + | ThrowStatement { $$ = $1; } + | TryStatement { $$ = $1; } + +/* ECMA-262 3rd Edition 12.2 */ +StatementList + : Statement { $$ = new_statement_list(ctx, $1); } + | StatementList Statement + { $$ = statement_list_add($1, $2); } + +/* ECMA-262 3rd Edition 12.2 */ +StatementList_opt + : /* empty */ { $$ = NULL; } + | StatementList { $$ = $1; } + +/* ECMA-262 3rd Edition 12.1 */ +Block + : '{' StatementList_opt '}' + { $$ = new_block_statement(ctx, $2); } + +/* ECMA-262 3rd Edition 12.2 */ +VariableStatement + : kVAR VariableDeclarationList semicolon_opt + { $$ = new_var_statement(ctx, $2); } + +/* ECMA-262 3rd Edition 12.2 */ +VariableDeclarationList + : VariableDeclaration { $$ = new_variable_list(ctx, $1); } + | VariableDeclarationList ',' VariableDeclaration + { $$ = variable_list_add(ctx, $1, $3); } + +/* ECMA-262 3rd Edition 12.2 */ +VariableDeclarationListNoIn + : VariableDeclarationNoIn + { $$ = new_variable_list(ctx, $1); } + | VariableDeclarationListNoIn ',' VariableDeclarationNoIn + { $$ = variable_list_add(ctx, $1, $3); } + +/* ECMA-262 3rd Edition 12.2 */ +VariableDeclaration + : tIdentifier Initialiser_opt + { $$ = new_variable_declaration(ctx, $1, $2); } + +/* ECMA-262 3rd Edition 12.2 */ +VariableDeclarationNoIn + : tIdentifier InitialiserNoIn_opt + { $$ = new_variable_declaration(ctx, $1, $2); } + +/* ECMA-262 3rd Edition 12.2 */ +Initialiser_opt + : /* empty */ { $$ = NULL; } + | Initialiser { $$ = $1; } + +/* ECMA-262 3rd Edition 12.2 */ +Initialiser + : '=' AssignmentExpression + { $$ = $2; } + +/* ECMA-262 3rd Edition 12.2 */ +InitialiserNoIn_opt + : /* empty */ { $$ = NULL; } + | InitialiserNoIn { $$ = $1; } + +/* ECMA-262 3rd Edition 12.2 */ +InitialiserNoIn + : '=' AssignmentExpressionNoIn + { $$ = $2; } + +/* ECMA-262 3rd Edition 12.3 */ +EmptyStatement + : ';' { $$ = new_empty_statement(ctx); } + +/* ECMA-262 3rd Edition 12.4 */ +ExpressionStatement + : Expression semicolon_opt + { $$ = new_expression_statement(ctx, $1); } + +/* ECMA-262 3rd Edition 12.5 */ +IfStatement + : kIF '(' Expression ')' Statement kELSE Statement + { $$ = new_if_statement(ctx, $3, $5, $7); } + | kIF '(' Expression ')' Statement + { $$ = new_if_statement(ctx, $3, $5, NULL); } + +/* ECMA-262 3rd Edition 12.6 */ +IterationStatement + : kDO Statement kWHILE '(' Expression ')' ';' + { $$ = new_while_statement(ctx, TRUE, $5, $2); } + | kWHILE '(' Expression ')' Statement + { $$ = new_while_statement(ctx, FALSE, $3, $5); } + | kFOR '(' ExpressionNoIn_opt ';' Expression_opt ';' Expression_opt ')' Statement + { $$ = new_for_statement(ctx, NULL, $3, $5, $7, $9); } + | kFOR '(' kVAR VariableDeclarationListNoIn ';' Expression_opt ';' Expression_opt ')' Statement + { $$ = new_for_statement(ctx, $4, NULL, $6, $8, $10); } + | kFOR '(' LeftHandSideExpression kIN Expression ')' Statement + { $$ = new_forin_statement(ctx, NULL, $3, $5, $7); } + | kFOR '(' kVAR VariableDeclarationNoIn kIN Expression ')' Statement + { $$ = new_forin_statement(ctx, $4, NULL, $6, $8); } + +/* ECMA-262 3rd Edition 12.7 */ +ContinueStatement + : kCONTINUE /* NONL */ Identifier_opt semicolon_opt + { $$ = new_continue_statement(ctx, $2); } + +/* ECMA-262 3rd Edition 12.8 */ +BreakStatement + : kBREAK /* NONL */ Identifier_opt semicolon_opt + { $$ = new_break_statement(ctx, $2); } + +/* ECMA-262 3rd Edition 12.9 */ +ReturnStatement + : kRETURN /* NONL */ Expression_opt semicolon_opt + { $$ = new_return_statement(ctx, $2); } + +/* ECMA-262 3rd Edition 12.10 */ +WithStatement + : kWITH '(' Expression ')' Statement + { $$ = new_with_statement(ctx, $3, $5); } + +/* ECMA-262 3rd Edition 12.12 */ +LabelledStatement + : tIdentifier ':' Statement + { $$ = new_labelled_statement(ctx, $1, $3); } + +/* ECMA-262 3rd Edition 12.11 */ +SwitchStatement + : kSWITCH '(' Expression ')' CaseBlock + { $$ = new_switch_statement(ctx, $3, $5); } + +/* ECMA-262 3rd Edition 12.11 */ +CaseBlock + : '{' CaseClausules_opt '}' + { $$ = new_case_block(ctx, $2, NULL, NULL); } + | '{' CaseClausules_opt DefaultClausule CaseClausules_opt '}' + { $$ = new_case_block(ctx, $2, $3, $4); } + +/* ECMA-262 3rd Edition 12.11 */ +CaseClausules_opt + : /* empty */ { $$ = NULL; } + | CaseClausules { $$ = $1; } + +/* ECMA-262 3rd Edition 12.11 */ +CaseClausules + : CaseClausule { $$ = new_case_list(ctx, $1); } + | CaseClausules CaseClausule + { $$ = case_list_add(ctx, $1, $2); } + +/* ECMA-262 3rd Edition 12.11 */ +CaseClausule + : kCASE Expression ':' StatementList_opt + { $$ = new_case_clausule(ctx, $2, $4); } + +/* ECMA-262 3rd Edition 12.11 */ +DefaultClausule + : kDEFAULT ':' StatementList_opt + { $$ = new_case_clausule(ctx, NULL, $3); } + +/* ECMA-262 3rd Edition 12.13 */ +ThrowStatement + : kTHROW /* NONL */ Expression semicolon_opt + { $$ = new_throw_statement(ctx, $2); } + +/* ECMA-262 3rd Edition 12.14 */ +TryStatement + : kTRY Block Catch { $$ = new_try_statement(ctx, $2, $3, NULL); } + | kTRY Block Finally { $$ = new_try_statement(ctx, $2, NULL, $3); } + | kTRY Block Catch Finally + { $$ = new_try_statement(ctx, $2, $3, $4); } + +/* ECMA-262 3rd Edition 12.14 */ +Catch + : kCATCH '(' tIdentifier ')' Block + { $$ = new_catch_block(ctx, $3, $5); } + +/* ECMA-262 3rd Edition 12.14 */ +Finally + : kFINALLY Block { $$ = $2; } + +/* ECMA-262 3rd Edition 11.14 */ +Expression_opt + : /* empty */ { $$ = NULL; } + | Expression { $$ = $1; } + +/* ECMA-262 3rd Edition 11.14 */ +Expression + : AssignmentExpression { $$ = $1; } + | Expression ',' AssignmentExpression + { $$ = new_binary_expression(ctx, EXPR_COMMA, $1, $3); } + +/* ECMA-262 3rd Edition 11.14 */ +ExpressionNoIn_opt + : /* empty */ { $$ = NULL; } + | ExpressionNoIn { $$ = $1; } + +/* ECMA-262 3rd Edition 11.14 */ +ExpressionNoIn + : AssignmentExpressionNoIn + { $$ = $1; } + | ExpressionNoIn ',' AssignmentExpressionNoIn + { $$ = new_binary_expression(ctx, EXPR_COMMA, $1, $3); } + +/* ECMA-262 3rd Edition 11.13 */ +AssignmentExpression + : ConditionalExpression { $$ = $1; } + | LeftHandSideExpression '=' AssignmentExpression + { $$ = new_binary_expression(ctx, EXPR_ASSIGN, $1, $3); } + | LeftHandSideExpression tAssignOper AssignmentExpression + { $$ = new_binary_expression(ctx, $2, $1, $3); } + +/* ECMA-262 3rd Edition 11.13 */ +AssignmentExpressionNoIn + : ConditionalExpressionNoIn + { $$ = $1; } + | LeftHandSideExpression '=' AssignmentExpressionNoIn + { $$ = new_binary_expression(ctx, EXPR_ASSIGN, $1, $3); } + | LeftHandSideExpression tAssignOper AssignmentExpressionNoIn + { $$ = new_binary_expression(ctx, $2, $1, $3); } + +/* ECMA-262 3rd Edition 11.12 */ +ConditionalExpression + : LogicalORExpression { $$ = $1; } + | LogicalORExpression '?' AssignmentExpression ':' AssignmentExpression + { $$ = new_conditional_expression(ctx, $1, $3, $5); } + +/* ECMA-262 3rd Edition 11.12 */ +ConditionalExpressionNoIn + : LogicalORExpressionNoIn + { $$ = $1; } + | LogicalORExpressionNoIn '?' AssignmentExpressionNoIn ':' AssignmentExpressionNoIn + { $$ = new_conditional_expression(ctx, $1, $3, $5); } + +/* ECMA-262 3rd Edition 11.11 */ +LogicalORExpression + : LogicalANDExpression { $$ = $1; } + | LogicalORExpression tOROR LogicalANDExpression + { $$ = new_binary_expression(ctx, EXPR_OR, $1, $3); } + +/* ECMA-262 3rd Edition 11.11 */ +LogicalORExpressionNoIn + : LogicalANDExpressionNoIn + { $$ = $1; } + | LogicalORExpressionNoIn tOROR LogicalANDExpressionNoIn + { $$ = new_binary_expression(ctx, EXPR_OR, $1, $3); } + +/* ECMA-262 3rd Edition 11.11 */ +LogicalANDExpression + : BitwiseORExpression { $$ = $1; } + | LogicalANDExpression tANDAND BitwiseORExpression + { $$ = new_binary_expression(ctx, EXPR_AND, $1, $3); } + +/* ECMA-262 3rd Edition 11.11 */ +LogicalANDExpressionNoIn + : BitwiseORExpressionNoIn + { $$ = $1; } + | LogicalANDExpressionNoIn tANDAND BitwiseORExpressionNoIn + { $$ = new_binary_expression(ctx, EXPR_AND, $1, $3); } + +/* ECMA-262 3rd Edition 11.10 */ +BitwiseORExpression + : BitwiseXORExpression { $$ = $1; } + | BitwiseORExpression '|' BitwiseXORExpression + { $$ = new_binary_expression(ctx, EXPR_BOR, $1, $3); } + +/* ECMA-262 3rd Edition 11.10 */ +BitwiseORExpressionNoIn + : BitwiseXORExpressionNoIn + { $$ = $1; } + | BitwiseORExpressionNoIn '|' BitwiseXORExpressionNoIn + { $$ = new_binary_expression(ctx, EXPR_BOR, $1, $3); } + +/* ECMA-262 3rd Edition 11.10 */ +BitwiseXORExpression + : BitwiseANDExpression { $$ = $1; } + | BitwiseXORExpression '^' BitwiseANDExpression + { new_binary_expression(ctx, EXPR_BXOR, $1, $3); } + +/* ECMA-262 3rd Edition 11.10 */ +BitwiseXORExpressionNoIn + : BitwiseANDExpressionNoIn + { $$ = $1; } + | BitwiseXORExpressionNoIn '^' BitwiseANDExpressionNoIn + { new_binary_expression(ctx, EXPR_BXOR, $1, $3); } + +/* ECMA-262 3rd Edition 11.10 */ +BitwiseANDExpression + : EqualityExpression { $$ = $1; } + | BitwiseANDExpression '&' EqualityExpression + { new_binary_expression(ctx, EXPR_BAND, $1, $3); } + +/* ECMA-262 3rd Edition 11.10 */ +BitwiseANDExpressionNoIn + : EqualityExpressionNoIn + { $$ = $1; } + | BitwiseANDExpressionNoIn '&' EqualityExpressionNoIn + { new_binary_expression(ctx, EXPR_BAND, $1, $3); } + +/* ECMA-262 3rd Edition 11.9 */ +EqualityExpression + : RelationalExpression { $$ = $1; } + | EqualityExpression tEqOper RelationalExpression + { $$ = new_binary_expression(ctx, $2, $1, $3); } + +/* ECMA-262 3rd Edition 11.9 */ +EqualityExpressionNoIn + : RelationalExpressionNoIn { $$ = $1; } + | EqualityExpressionNoIn tEqOper RelationalExpressionNoIn + { $$ = new_binary_expression(ctx, $2, $1, $3); } + +/* ECMA-262 3rd Edition 11.8 */ +RelationalExpression + : ShiftExpression { $$ = $1; } + | RelationalExpression tRelOper ShiftExpression + { $$ = new_binary_expression(ctx, $2, $1, $3); } + | RelationalExpression kINSTANCEOF ShiftExpression + { $$ = new_binary_expression(ctx, EXPR_INSTANCEOF, $1, $3); } + | RelationalExpression kIN ShiftExpression + { $$ = new_binary_expression(ctx, EXPR_IN, $1, $3); } + +/* ECMA-262 3rd Edition 11.8 */ +RelationalExpressionNoIn + : ShiftExpression { $$ = $1; } + | RelationalExpressionNoIn tRelOper ShiftExpression + { $$ = new_binary_expression(ctx, $2, $1, $3); } + | RelationalExpressionNoIn kINSTANCEOF ShiftExpression + { $$ = new_binary_expression(ctx, EXPR_INSTANCEOF, $1, $3); } + +/* ECMA-262 3rd Edition 11.7 */ +ShiftExpression + : AdditiveExpression { $$ = $1; } + | ShiftExpression tShiftOper AdditiveExpression + { $$ = new_binary_expression(ctx, $2, $1, $3); } + +/* ECMA-262 3rd Edition 11.6 */ +AdditiveExpression + : MultiplicativeExpression + { $$ = $1; } + | AdditiveExpression '+' MultiplicativeExpression + { $$ = new_binary_expression(ctx, EXPR_ADD, $1, $3); } + | AdditiveExpression '-' MultiplicativeExpression + { $$ = new_binary_expression(ctx, EXPR_SUB, $1, $3); } + +/* ECMA-262 3rd Edition 11.5 */ +MultiplicativeExpression + : UnaryExpression { $$ = $1; } + | MultiplicativeExpression '*' UnaryExpression + { $$ = new_binary_expression(ctx, EXPR_MUL, $1, $3); } + | MultiplicativeExpression '/' UnaryExpression + { $$ = new_binary_expression(ctx, EXPR_DIV, $1, $3); } + | MultiplicativeExpression '%' UnaryExpression + { $$ = new_binary_expression(ctx, EXPR_MOD, $1, $3); } + +/* ECMA-262 3rd Edition 11.4 */ +UnaryExpression + : PostfixExpression { $$ = $1; } + | kDELETE UnaryExpression + { $$ = new_unary_expression(ctx, EXPR_DELETE, $2); } + | kVOID UnaryExpression { $$ = new_unary_expression(ctx, EXPR_VOID, $2); } + | kTYPEOF UnaryExpression + { $$ = new_unary_expression(ctx, EXPR_TYPEOF, $2); } + | tINC UnaryExpression { $$ = new_unary_expression(ctx, EXPR_PREINC, $2); } + | tDEC UnaryExpression { $$ = new_unary_expression(ctx, EXPR_PREDEC, $2); } + | '+' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_PLUS, $2); } + | '-' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_MINUS, $2); } + | '~' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_BITNEG, $2); } + | '!' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_LOGNEG, $2); } + +/* ECMA-262 3rd Edition 11.2 */ +PostfixExpression + : LeftHandSideExpression + { $$ = $1; } + | LeftHandSideExpression /* NONL */ tINC + { $$ = new_unary_expression(ctx, EXPR_POSTINC, $1); } + | LeftHandSideExpression /* NONL */ tDEC + { $$ = new_unary_expression(ctx, EXPR_POSTDEC, $1); } + + +/* ECMA-262 3rd Edition 11.2 */ +LeftHandSideExpression + : NewExpression { $$ = $1; } + | CallExpression { $$ = $1; } + +/* ECMA-262 3rd Edition 11.2 */ +NewExpression + : MemberExpression { $$ = $1; } + | kNEW NewExpression { $$ = new_unary_expression(ctx, EXPR_NEW, $2); } + +/* ECMA-262 3rd Edition 11.2 */ +MemberExpression + : PrimaryExpression { $$ = $1; } + | FunctionExpression { $$ = $1; } + | MemberExpression '[' Expression ']' + { $$ = new_array_expression(ctx, $1, $3); } + | MemberExpression '.' tIdentifier + { $$ = new_member_expression(ctx, $1, $3); } + | kNEW MemberExpression Arguments + { $$ = new_member_new_expression(ctx, $2, $3); } + +/* ECMA-262 3rd Edition 11.2 */ +CallExpression + : MemberExpression Arguments + { $$ = new_call_expression(ctx, $1, $2); } + | CallExpression Arguments + { $$ = new_call_expression(ctx, $1, $2); } + | CallExpression '[' Expression ']' + { $$ = new_array_expression(ctx, $1, $3); } + | CallExpression '.' tIdentifier + { $$ = new_member_expression(ctx, $1, $3); } + +/* ECMA-262 3rd Edition 11.2 */ +Arguments + : '(' ')' { $$ = NULL; } + | '(' ArgumentList ')' { $$ = $2; } + +/* ECMA-262 3rd Edition 11.2 */ +ArgumentList + : AssignmentExpression { $$ = new_argument_list(ctx, $1); } + | ArgumentList ',' AssignmentExpression + { $$ = argument_list_add(ctx, $1, $3); } + +/* ECMA-262 3rd Edition 11.1 */ +PrimaryExpression + : kTHIS { $$ = new_this_expression(ctx); } + | tIdentifier { $$ = new_identifier_expression(ctx, $1); } + | Literal { $$ = new_literal_expression(ctx, $1); } + | ArrayLiteral { $$ = $1; } + | ObjectLiteral { $$ = $1; } + | '(' Expression ')' { $$ = $2; } + +/* ECMA-262 3rd Edition 11.1.4 */ +ArrayLiteral + : '[' Elision_opt ']' { $$ = new_array_literal_expression(ctx, NULL, $2); } + | '[' ElementList ']' { $$ = new_array_literal_expression(ctx, $2, 0); } + | '[' ElementList ',' Elision_opt ']' + { $$ = new_array_literal_expression(ctx, $2, $4); } + +/* ECMA-262 3rd Edition 11.1.4 */ +ElementList + : Elision_opt AssignmentExpression + { $$ = new_element_list(ctx, $1, $2); } + | ElementList ',' Elision_opt AssignmentExpression + { $$ = element_list_add(ctx, $1, $3, $4); } + +/* ECMA-262 3rd Edition 11.1.4 */ +Elision + : ',' { $$ = 1; } + | Elision ',' { $$ = $1 + 1; } + +/* ECMA-262 3rd Edition 11.1.4 */ +Elision_opt + : /* empty */ { $$ = 0; } + | Elision { $$ = $1; } + +/* ECMA-262 3rd Edition 11.1.5 */ +ObjectLiteral + : '{' '}' { $$ = new_prop_and_value_expression(ctx, NULL); } + | '{' PropertyNameAndValueList '}' + { $$ = new_prop_and_value_expression(ctx, $2); } + +/* ECMA-262 3rd Edition 11.1.5 */ +PropertyNameAndValueList + : PropertyName ':' AssignmentExpression + { $$ = new_property_list(ctx, $1, $3); } + | PropertyNameAndValueList ',' PropertyName ':' AssignmentExpression + { $$ = property_list_add(ctx, $1, $3, $5); } + +/* ECMA-262 3rd Edition 11.1.5 */ +PropertyName + : tIdentifier { $$ = new_string_literal(ctx, $1); } + | tStringLiteral { $$ = new_string_literal(ctx, $1); } + | tNumericLiteral { $$ = $1; } + +/* ECMA-262 3rd Edition 7.6 */ +Identifier_opt + : /* empty*/ { $$ = NULL; } + | tIdentifier { $$ = $1; } + +/* ECMA-262 3rd Edition 7.8 */ +Literal + : kNULL { $$ = new_null_literal(ctx); } + | kUNDEFINED { $$ = new_undefined_literal(ctx); } + | BooleanLiteral { $$ = $1; } + | tNumericLiteral { $$ = $1; } + | tStringLiteral { $$ = new_string_literal(ctx, $1); } + | '/' { FIXME("RegExp literal\n"); YYABORT; } + +/* ECMA-262 3rd Edition 7.8.2 */ +BooleanLiteral + : kTRUE { $$ = new_boolean_literal(ctx, TRUE); } + | kFALSE { $$ = new_boolean_literal(ctx, FALSE); } + +semicolon_opt + : ';' + | error { if(!allow_auto_semicolon(ctx)) {YYABORT;} } + +%% + +static BOOL allow_auto_semicolon(parser_ctx_t *ctx) +{ + return ctx->nl || ctx->ptr == ctx->end || *(ctx->ptr-1) == '}'; +} + +static literal_t *new_string_literal(parser_ctx_t *ctx, const WCHAR *str) +{ + literal_t *ret = parser_alloc(ctx, sizeof(literal_t)); + + ret->vt = VT_BSTR; + ret->u.wstr = str; + + return ret; +} + +static literal_t *new_null_literal(parser_ctx_t *ctx) +{ + literal_t *ret = parser_alloc(ctx, sizeof(literal_t)); + + ret->vt = VT_NULL; + + return ret; +} + +static literal_t *new_undefined_literal(parser_ctx_t *ctx) +{ + literal_t *ret = parser_alloc(ctx, sizeof(literal_t)); + + ret->vt = VT_EMPTY; + + return ret; +} + +static literal_t *new_boolean_literal(parser_ctx_t *ctx, VARIANT_BOOL bval) +{ + literal_t *ret = parser_alloc(ctx, sizeof(literal_t)); + + ret->vt = VT_BOOL; + ret->u.bval = bval; + + return ret; +} + +static prop_val_t *new_prop_val(parser_ctx_t *ctx, literal_t *name, expression_t *value) +{ + prop_val_t *ret = parser_alloc(ctx, sizeof(prop_val_t)); + + ret->name = name; + ret->value = value; + ret->next = NULL; + + return ret; +} + +static property_list_t *new_property_list(parser_ctx_t *ctx, literal_t *name, expression_t *value) +{ + property_list_t *ret = parser_alloc_tmp(ctx, sizeof(property_list_t)); + + ret->head = ret->tail = new_prop_val(ctx, name, value); + + return ret; +} + +static property_list_t *property_list_add(parser_ctx_t *ctx, property_list_t *list, literal_t *name, expression_t *value) +{ + list->tail = list->tail->next = new_prop_val(ctx, name, value); + + return list; +} + +static array_element_t *new_array_element(parser_ctx_t *ctx, int elision, expression_t *expr) +{ + array_element_t *ret = parser_alloc(ctx, sizeof(array_element_t)); + + ret->elision = elision; + ret->expr = expr; + ret->next = NULL; + + return ret; +} + +static element_list_t *new_element_list(parser_ctx_t *ctx, int elision, expression_t *expr) +{ + element_list_t *ret = parser_alloc_tmp(ctx, sizeof(element_list_t)); + + ret->head = ret->tail = new_array_element(ctx, elision, expr); + + return ret; +} + +static element_list_t *element_list_add(parser_ctx_t *ctx, element_list_t *list, int elision, expression_t *expr) +{ + list->tail = list->tail->next = new_array_element(ctx, elision, expr); + + return list; +} + +static argument_t *new_argument(parser_ctx_t *ctx, expression_t *expr) +{ + argument_t *ret = parser_alloc(ctx, sizeof(argument_t)); + + ret->expr = expr; + ret->next = NULL; + + return ret; +} + +static argument_list_t *new_argument_list(parser_ctx_t *ctx, expression_t *expr) +{ + argument_list_t *ret = parser_alloc_tmp(ctx, sizeof(argument_list_t)); + + ret->head = ret->tail = new_argument(ctx, expr); + + return ret; +} + +static argument_list_t *argument_list_add(parser_ctx_t *ctx, argument_list_t *list, expression_t *expr) +{ + list->tail = list->tail->next = new_argument(ctx, expr); + + return list; +} + +static catch_block_t *new_catch_block(parser_ctx_t *ctx, const WCHAR *identifier, statement_t *statement) +{ + catch_block_t *ret = parser_alloc(ctx, sizeof(catch_block_t)); + + ret->identifier = identifier; + ret->statement = statement; + + return ret; +} + +static case_clausule_t *new_case_clausule(parser_ctx_t *ctx, expression_t *expr, statement_list_t *stat_list) +{ + case_clausule_t *ret = parser_alloc(ctx, sizeof(case_clausule_t)); + + ret->expr = expr; + ret->stat = stat_list ? stat_list->head : NULL; + ret->next = NULL; + + return ret; +} + +static case_list_t *new_case_list(parser_ctx_t *ctx, case_clausule_t *case_clausule) +{ + case_list_t *ret = parser_alloc_tmp(ctx, sizeof(case_list_t)); + + ret->head = ret->tail = case_clausule; + + return ret; +} + +static case_list_t *case_list_add(parser_ctx_t *ctx, case_list_t *list, case_clausule_t *case_clausule) +{ + list->tail = list->tail->next = case_clausule; + + return list; +} + +static case_clausule_t *new_case_block(parser_ctx_t *ctx, case_list_t *case_list1, + case_clausule_t *default_clausule, case_list_t *case_list2) +{ + case_clausule_t *ret = NULL, *iter = NULL, *iter2; + statement_t *stat = NULL; + + if(case_list1) { + ret = case_list1->head; + iter = case_list1->tail; + } + + if(default_clausule) { + if(ret) + iter = iter->next = default_clausule; + else + ret = iter = default_clausule; + } + + if(case_list2) { + if(ret) + iter->next = case_list2->head; + else + ret = case_list2->head; + } + + if(!ret) + return NULL; + + for(iter = ret->next; iter->next; iter = iter->next) { + for(iter2 = iter; iter2 && !iter2->expr; iter2 = iter2->next); + if(!iter2) + break; + + while(iter != iter2) { + iter->stat = iter2->stat; + iter2 = iter2->next; + } + + if(stat) { + while(stat->next) + stat = stat->next; + stat->next = iter->stat; + }else { + stat = iter->stat; + } + } + + return ret; +} + +static statement_t *new_block_statement(parser_ctx_t *ctx, statement_list_t *list) +{ + block_statement_t *ret = parser_alloc(ctx, sizeof(block_statement_t)); + + ret->stat.eval = block_statement_eval; + ret->stat.next = NULL; + ret->stat_list = list ? list->head : NULL; + + return &ret->stat; +} + +static variable_declaration_t *new_variable_declaration(parser_ctx_t *ctx, const WCHAR *identifier, expression_t *expr) +{ + variable_declaration_t *ret = parser_alloc(ctx, sizeof(variable_declaration_t)); + + ret->identifier = identifier; + ret->expr = expr; + ret->next = NULL; + + return ret; +} + +static variable_list_t *new_variable_list(parser_ctx_t *ctx, variable_declaration_t *decl) +{ + variable_list_t *ret = parser_alloc_tmp(ctx, sizeof(variable_list_t)); + + ret->head = ret->tail = decl; + + return ret; +} + +static variable_list_t *variable_list_add(parser_ctx_t *ctx, variable_list_t *list, variable_declaration_t *decl) +{ + list->tail = list->tail->next = decl; + + return list; +} + +static statement_t *new_var_statement(parser_ctx_t *ctx, variable_list_t *variable_list) +{ + var_statement_t *ret = parser_alloc(ctx, sizeof(var_statement_t)); + + ret->stat.eval = var_statement_eval; + ret->stat.next = NULL; + ret->variable_list = variable_list->head; + + return &ret->stat; +} + +static statement_t *new_empty_statement(parser_ctx_t *ctx) +{ + statement_t *ret = parser_alloc(ctx, sizeof(statement_t)); + + ret->eval = empty_statement_eval; + ret->next = NULL; + + return ret; +} + +static statement_t *new_expression_statement(parser_ctx_t *ctx, expression_t *expr) +{ + expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t)); + + ret->stat.eval = expression_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + + return &ret->stat; +} + +static statement_t *new_if_statement(parser_ctx_t *ctx, expression_t *expr, statement_t *if_stat, statement_t *else_stat) +{ + if_statement_t *ret = parser_alloc(ctx, sizeof(if_statement_t)); + + ret->stat.eval = if_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + ret->if_stat = if_stat; + ret->else_stat = else_stat; + + return &ret->stat; +} + +static statement_t *new_while_statement(parser_ctx_t *ctx, BOOL dowhile, expression_t *expr, statement_t *stat) +{ + while_statement_t *ret = parser_alloc(ctx, sizeof(while_statement_t)); + + ret->stat.eval = dowhile ? dowhile_statement_eval : while_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + ret->statement = stat; + + return &ret->stat; +} + +static statement_t *new_for_statement(parser_ctx_t *ctx, variable_list_t *variable_list, expression_t *begin_expr, + expression_t *expr, expression_t *end_expr, statement_t *statement) +{ + for_statement_t *ret = parser_alloc(ctx, sizeof(for_statement_t)); + + ret->stat.eval = for_statement_eval; + ret->stat.next = NULL; + ret->variable_list = variable_list ? variable_list->head : NULL; + ret->begin_expr = begin_expr; + ret->expr = expr; + ret->end_expr = end_expr; + ret->statement = statement; + + return &ret->stat; +} + +static statement_t *new_forin_statement(parser_ctx_t *ctx, variable_declaration_t *variable, expression_t *expr, + expression_t *in_expr, statement_t *statement) +{ + forin_statement_t *ret = parser_alloc(ctx, sizeof(forin_statement_t)); + + ret->stat.eval = forin_statement_eval; + ret->stat.next = NULL; + ret->variable = variable; + ret->expr = expr; + ret->in_expr = in_expr; + ret->statement = statement; + + return &ret->stat; +} + +static statement_t *new_continue_statement(parser_ctx_t *ctx, const WCHAR *identifier) +{ + branch_statement_t *ret = parser_alloc(ctx, sizeof(branch_statement_t)); + + ret->stat.eval = continue_statement_eval; + ret->stat.next = NULL; + ret->identifier = identifier; + + return &ret->stat; +} + +static statement_t *new_break_statement(parser_ctx_t *ctx, const WCHAR *identifier) +{ + branch_statement_t *ret = parser_alloc(ctx, sizeof(branch_statement_t)); + + ret->stat.eval = break_statement_eval; + ret->stat.next = NULL; + ret->identifier = identifier; + + return &ret->stat; +} + +static statement_t *new_return_statement(parser_ctx_t *ctx, expression_t *expr) +{ + expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t)); + + ret->stat.eval = return_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + + return &ret->stat; +} + +static statement_t *new_with_statement(parser_ctx_t *ctx, expression_t *expr, statement_t *statement) +{ + with_statement_t *ret = parser_alloc(ctx, sizeof(with_statement_t)); + + ret->stat.eval = with_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + ret->statement = statement; + + return &ret->stat; +} + +static statement_t *new_labelled_statement(parser_ctx_t *ctx, const WCHAR *identifier, statement_t *statement) +{ + labelled_statement_t *ret = parser_alloc(ctx, sizeof(labelled_statement_t)); + + ret->stat.eval = labelled_statement_eval; + ret->stat.next = NULL; + ret->identifier = identifier; + ret->statement = statement; + + return &ret->stat; +} + +static statement_t *new_switch_statement(parser_ctx_t *ctx, expression_t *expr, case_clausule_t *case_list) +{ + switch_statement_t *ret = parser_alloc(ctx, sizeof(switch_statement_t)); + + ret->stat.eval = switch_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + ret->case_list = case_list; + + return &ret->stat; +} + +static statement_t *new_throw_statement(parser_ctx_t *ctx, expression_t *expr) +{ + expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t)); + + ret->stat.eval = throw_statement_eval; + ret->stat.next = NULL; + ret->expr = expr; + + return &ret->stat; +} + +static statement_t *new_try_statement(parser_ctx_t *ctx, statement_t *try_statement, + catch_block_t *catch_block, statement_t *finally_statement) +{ + try_statement_t *ret = parser_alloc(ctx, sizeof(try_statement_t)); + + ret->stat.eval = try_statement_eval; + ret->stat.next = NULL; + ret->try_statement = try_statement; + ret->catch_block = catch_block; + ret->finally_statement = finally_statement; + + return &ret->stat; +} + +static parameter_t *new_parameter(parser_ctx_t *ctx, const WCHAR *identifier) +{ + parameter_t *ret = parser_alloc(ctx, sizeof(parameter_t)); + + ret->identifier = identifier; + ret->next = NULL; + + return ret; +} + +static parameter_list_t *new_parameter_list(parser_ctx_t *ctx, const WCHAR *identifier) +{ + parameter_list_t *ret = parser_alloc_tmp(ctx, sizeof(parameter_list_t)); + + ret->head = ret->tail = new_parameter(ctx, identifier); + + return ret; +} + +static parameter_list_t *parameter_list_add(parser_ctx_t *ctx, parameter_list_t *list, const WCHAR *identifier) +{ + list->tail = list->tail->next = new_parameter(ctx, identifier); + + return list; +} + +static expression_t *new_function_expression(parser_ctx_t *ctx, const WCHAR *identifier, + parameter_list_t *parameter_list, source_elements_t *source_elements) +{ + function_expression_t *ret = parser_alloc(ctx, sizeof(function_expression_t)); + + ret->expr.eval = function_expression_eval; + ret->identifier = identifier; + ret->parameter_list = parameter_list ? parameter_list->head : NULL; + ret->source_elements = source_elements; + + return &ret->expr; +} + +static const expression_eval_t expression_eval_table[] = { + comma_expression_eval, + logical_or_expression_eval, + logical_and_expression_eval, + binary_or_expression_eval, + binary_xor_expression_eval, + binary_and_expression_eval, + instanceof_expression_eval, + in_expression_eval, + add_expression_eval, + sub_expression_eval, + mul_expression_eval, + div_expression_eval, + mod_expression_eval, + delete_expression_eval, + void_expression_eval, + typeof_expression_eval, + minus_expression_eval, + plus_expression_eval, + post_increment_expression_eval, + post_decrement_expression_eval, + pre_increment_expression_eval, + pre_decrement_expression_eval, + new_expression_eval, + equal_expression_eval, + equal2_expression_eval, + not_equal_expression_eval, + not_equal2_expression_eval, + less_expression_eval, + lesseq_expression_eval, + greater_expression_eval, + greatereq_expression_eval, + binary_negation_expression_eval, + logical_negation_expression_eval, + left_shift_expression_eval, + right_shift_expression_eval, + right2_shift_expression_eval, + assign_expression_eval, + assign_lshift_expression_eval, + assign_rshift_expression_eval, + assign_rrshift_expression_eval, + assign_add_expression_eval, + assign_sub_expression_eval, + assign_mul_expression_eval, + assign_div_expression_eval, + assign_mod_expression_eval, + assign_and_expression_eval, + assign_or_expression_eval, + assign_xor_expression_eval, +}; + +static expression_t *new_binary_expression(parser_ctx_t *ctx, expression_type_t type, + expression_t *expression1, expression_t *expression2) +{ + binary_expression_t *ret = parser_alloc(ctx, sizeof(binary_expression_t)); + + ret->expr.eval = expression_eval_table[type]; + ret->expression1 = expression1; + ret->expression2 = expression2; + + return &ret->expr; +} + +static expression_t *new_unary_expression(parser_ctx_t *ctx, expression_type_t type, expression_t *expression) +{ + unary_expression_t *ret = parser_alloc(ctx, sizeof(unary_expression_t)); + + ret->expr.eval = expression_eval_table[type]; + ret->expression = expression; + + return &ret->expr; +} + +static expression_t *new_conditional_expression(parser_ctx_t *ctx, expression_t *expression, + expression_t *true_expression, expression_t *false_expression) +{ + conditional_expression_t *ret = parser_alloc(ctx, sizeof(conditional_expression_t)); + + ret->expr.eval = conditional_expression_eval; + ret->expression = expression; + ret->true_expression = true_expression; + ret->false_expression = false_expression; + + return &ret->expr; +} + +static expression_t *new_array_expression(parser_ctx_t *ctx, expression_t *member_expr, expression_t *expression) +{ + array_expression_t *ret = parser_alloc(ctx, sizeof(array_expression_t)); + + ret->expr.eval = array_expression_eval; + ret->member_expr = member_expr; + ret->expression = expression; + + return &ret->expr; +} + +static expression_t *new_member_expression(parser_ctx_t *ctx, expression_t *expression, const WCHAR *identifier) +{ + member_expression_t *ret = parser_alloc(ctx, sizeof(member_expression_t)); + + ret->expr.eval = member_expression_eval; + ret->expression = expression; + ret->identifier = identifier; + + return &ret->expr; +} + +static expression_t *new_member_new_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list) +{ + call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t)); + + ret->expr.eval = member_new_expression_eval; + ret->expression = expression; + ret->argument_list = argument_list ? argument_list->head : NULL; + + return &ret->expr; +} + +static expression_t *new_call_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list) +{ + call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t)); + + ret->expr.eval = call_expression_eval; + ret->expression = expression; + ret->argument_list = argument_list ? argument_list->head : NULL; + + return &ret->expr; +} + +static expression_t *new_this_expression(parser_ctx_t *ctx) +{ + expression_t *ret = parser_alloc(ctx, sizeof(expression_t)); + + ret->eval = this_expression_eval; + + return ret; +} + +static int parser_error(const char *str) +{ + return 0; +} + +static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier) +{ + identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t)); + + ret->expr.eval = identifier_expression_eval; + ret->identifier = identifier; + + return &ret->expr; +} + +static expression_t *new_array_literal_expression(parser_ctx_t *ctx, element_list_t *element_list, int length) +{ + array_literal_expression_t *ret = parser_alloc(ctx, sizeof(array_literal_expression_t)); + + ret->expr.eval = array_literal_expression_eval; + ret->element_list = element_list ? element_list->head : NULL; + ret->length = length; + + return &ret->expr; +} + +static expression_t *new_prop_and_value_expression(parser_ctx_t *ctx, property_list_t *property_list) +{ + property_value_expression_t *ret = parser_alloc(ctx, sizeof(property_value_expression_t)); + + ret->expr.eval = property_value_expression_eval; + ret->property_list = property_list ? property_list->head : NULL; + + return &ret->expr; +} + +static expression_t *new_literal_expression(parser_ctx_t *ctx, literal_t *literal) +{ + literal_expression_t *ret = parser_alloc(ctx, sizeof(literal_expression_t)); + + ret->expr.eval = literal_expression_eval; + ret->literal = literal; + + return &ret->expr; +} + +static function_declaration_t *new_function_declaration(parser_ctx_t *ctx, const WCHAR *identifier, + parameter_list_t *parameter_list, source_elements_t *source_elements) +{ + function_declaration_t *ret = parser_alloc(ctx, sizeof(function_declaration_t)); + + ret->identifier = identifier; + ret->parameter_list = parameter_list ? parameter_list->head : NULL; + ret->source_elements = source_elements; + ret->next = NULL; + + return ret; +} + +static source_elements_t *new_source_elements(parser_ctx_t *ctx) +{ + source_elements_t *ret = parser_alloc(ctx, sizeof(source_elements_t)); + + memset(ret, 0, sizeof(*ret)); + + return ret; +} + +static source_elements_t *source_elements_add_statement(source_elements_t *source_elements, statement_t *statement) +{ + if(source_elements->statement_tail) + source_elements->statement_tail = source_elements->statement_tail->next = statement; + else + source_elements->statement = source_elements->statement_tail = statement; + + return source_elements; +} + +static source_elements_t *source_elements_add_function(source_elements_t *source_elements, + function_declaration_t *function_declaration) +{ + if(source_elements->functions_tail) + source_elements->functions_tail = source_elements->functions_tail->next = function_declaration; + else + source_elements->functions = source_elements->functions_tail = function_declaration; + + return source_elements; +} + +statement_list_t *new_statement_list(parser_ctx_t *ctx, statement_t *statement) +{ + statement_list_t *ret = parser_alloc_tmp(ctx, sizeof(statement_list_t)); + + ret->head = ret->tail = statement; + + return ret; +} + +statement_list_t *statement_list_add(statement_list_t *list, statement_t *statement) +{ + list->tail = list->tail->next = statement; + + return list; +} + +static void program_parsed(parser_ctx_t *ctx, source_elements_t *source) +{ + ctx->source = source; + ctx->hres = S_OK; +} + +void parser_release(parser_ctx_t *ctx) +{ + if(--ctx->ref) + return; + + jsheap_free(&ctx->heap); + heap_free(ctx); +} + +HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, parser_ctx_t **ret) +{ + parser_ctx_t *parser_ctx; + HRESULT hres; + + parser_ctx = heap_alloc_zero(sizeof(parser_ctx_t)); + if(!parser_ctx) + return E_OUTOFMEMORY; + + parser_ctx->ref = 1; + parser_ctx->hres = E_FAIL; + + parser_ctx->begin = parser_ctx->ptr = code; + parser_ctx->end = code + strlenW(code); + + script_addref(ctx); + parser_ctx->script = ctx; + + jsheap_init(&parser_ctx->tmp_heap); + jsheap_init(&parser_ctx->heap); + + parser_parse(parser_ctx); + jsheap_free(&parser_ctx->tmp_heap); + if(FAILED(parser_ctx->hres)) { + hres = parser_ctx->hres; + parser_release(parser_ctx); + return hres; + } + + *ret = parser_ctx; + return S_OK; +} diff --git a/dlls/jscript/tests/Makefile.in b/dlls/jscript/tests/Makefile.in index 2201a4a0d49..01cd58e4ab3 100644 --- a/dlls/jscript/tests/Makefile.in +++ b/dlls/jscript/tests/Makefile.in @@ -3,10 +3,11 @@ TOPOBJDIR = ../../.. SRCDIR = @srcdir@ VPATH = @srcdir@ TESTDLL = jscript.dll -IMPORTS = ole32 kernel32 +IMPORTS = oleaut32 ole32 kernel32 CTESTS = \ - jscript.c + jscript.c \ + run.c @MAKE_TEST_RULES@ diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c index 01a90bf9a3b..b0c532f1a8c 100644 --- a/dlls/jscript/tests/jscript.c +++ b/dlls/jscript/tests/jscript.c @@ -17,11 +17,13 @@ */ #define COBJMACROS +#define CONST_VTABLE #include #include #include #include +#include #include "wine/test.h" @@ -30,6 +32,183 @@ DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); static const CLSID CLSID_JScript = {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}}; +#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + expect_ ## func = TRUE + +#define SET_CALLED(func) \ + called_ ## func = TRUE + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +DEFINE_EXPECT(GetLCID); +DEFINE_EXPECT(OnStateChange_STARTED); +DEFINE_EXPECT(OnStateChange_CLOSED); +DEFINE_EXPECT(OnStateChange_INITIALIZED); +DEFINE_EXPECT(OnEnterScript); +DEFINE_EXPECT(OnLeaveScript); + +#define test_state(s,ss) _test_state(__LINE__,s,ss) +static void _test_state(unsigned line, IActiveScript *script, SCRIPTSTATE exstate) +{ + SCRIPTSTATE state = -1; + HRESULT hres; + + hres = IActiveScript_GetScriptState(script, &state); + ok_(__FILE__,line) (hres == S_OK, "GetScriptState failed: %08x\n", hres); + ok_(__FILE__,line) (state == exstate, "state=%d, expected %d\n", state, exstate); +} + +static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) + *ppv = iface; + else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) + *ppv = iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid) +{ + CHECK_EXPECT(GetLCID); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, + DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, + const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState) +{ + switch(ssScriptState) { + case SCRIPTSTATE_STARTED: + CHECK_EXPECT(OnStateChange_STARTED); + return S_OK; + case SCRIPTSTATE_CLOSED: + CHECK_EXPECT(OnStateChange_CLOSED); + return S_OK; + case SCRIPTSTATE_INITIALIZED: + CHECK_EXPECT(OnStateChange_INITIALIZED); + return S_OK; + default: + ok(0, "unexpected call %d\n", ssScriptState); + } + + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface) +{ + CHECK_EXPECT(OnEnterScript); + return S_OK; +} + +static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface) +{ + CHECK_EXPECT(OnLeaveScript); + return S_OK; +} + +#undef ACTSCPSITE_THIS + +static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { + ActiveScriptSite_QueryInterface, + ActiveScriptSite_AddRef, + ActiveScriptSite_Release, + ActiveScriptSite_GetLCID, + ActiveScriptSite_GetItemInfo, + ActiveScriptSite_GetDocVersionString, + ActiveScriptSite_OnScriptTerminate, + ActiveScriptSite_OnStateChange, + ActiveScriptSite_OnScriptError, + ActiveScriptSite_OnEnterScript, + ActiveScriptSite_OnLeaveScript +}; + +static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl }; + +static void test_script_dispatch(IActiveScript *script, BOOL initialized) +{ + IDispatchEx *dispex; + IDispatch *disp; + HRESULT hres; + + disp = (void*)0xdeadbeef; + hres = IActiveScript_GetScriptDispatch(script, NULL, &disp); + if(!initialized) { + ok(hres == E_UNEXPECTED, "hres = %08x, expected E_UNEXPECTED\n", hres); + ok(!disp, "disp != NULL\n"); + return; + } + + ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres); + if(FAILED(hres)) + return; + + ok(disp != NULL, "disp == NULL\n"); + hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex); + IDispatch_Release(disp); + ok(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres); + + IDispatchEx_Release(dispex); +} + static void test_safety(IUnknown *unk) { IObjectSafety *safety; @@ -94,6 +273,7 @@ static void test_jscript(void) IActiveScriptParse *parse; IActiveScript *script; IUnknown *unk; + ULONG ref; HRESULT hres; hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, @@ -108,11 +288,55 @@ static void test_jscript(void) hres = IUnknown_QueryInterface(unk, &IID_IActiveScriptParse, (void**)&parse); ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); + test_state(script, SCRIPTSTATE_UNINITIALIZED); test_safety(unk); + hres = IActiveScriptParse_InitNew(parse); + ok(hres == S_OK, "InitNew failed: %08x\n", hres); + + hres = IActiveScriptParse_InitNew(parse); + ok(hres == E_UNEXPECTED, "InitNew failed: %08x, expected E_UNEXPECTED\n", hres); + + hres = IActiveScript_SetScriptSite(script, NULL); + ok(hres == E_POINTER, "SetScriptSite failed: %08x, expected E_POINTER\n", hres); + + test_state(script, SCRIPTSTATE_UNINITIALIZED); + test_script_dispatch(script, FALSE); + + SET_EXPECT(GetLCID); + SET_EXPECT(OnStateChange_INITIALIZED); + hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); + ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); + CHECK_CALLED(GetLCID); + CHECK_CALLED(OnStateChange_INITIALIZED); + + test_state(script, SCRIPTSTATE_INITIALIZED); + + hres = IActiveScript_SetScriptSite(script, &ActiveScriptSite); + ok(hres == E_UNEXPECTED, "SetScriptSite failed: %08x, expected E_UNEXPECTED\n", hres); + + test_script_dispatch(script, TRUE); + + SET_EXPECT(OnStateChange_STARTED); + hres = IActiveScript_SetScriptState(script, SCRIPTSTATE_STARTED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres); + CHECK_CALLED(OnStateChange_STARTED); + + test_state(script, SCRIPTSTATE_STARTED); + + SET_EXPECT(OnStateChange_CLOSED); + hres = IActiveScript_Close(script); + ok(hres == S_OK, "Close failed: %08x\n", hres); + CHECK_CALLED(OnStateChange_CLOSED); + + test_state(script, SCRIPTSTATE_CLOSED); + test_script_dispatch(script, FALSE); + IActiveScriptParse_Release(parse); IActiveScript_Release(script); - IUnknown_Release(unk); + + ref = IUnknown_Release(unk); + ok(!ref, "ref = %d\n", ref); } START_TEST(jscript) diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c new file mode 100644 index 00000000000..b9daee42a9e --- /dev/null +++ b/dlls/jscript/tests/run.c @@ -0,0 +1,362 @@ +/* + * Copyright 2008 Jacek Caban for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +#define COBJMACROS +#define CONST_VTABLE + +#include +#include +#include + +#include "wine/test.h" + +static const CLSID CLSID_JScript = + {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}}; + +#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + expect_ ## func = TRUE + +#define SET_CALLED(func) \ + called_ ## func = TRUE + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +static const WCHAR testW[] = {'t','e','s','t',0}; + +static const char *debugstr_w(LPCWSTR str) +{ + static char buf[1024]; + + if(!str) + return "(null)"; + + WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); + return buf; +} + +static BSTR a2bstr(const char *str) +{ + BSTR ret; + int len; + + len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + ret = SysAllocStringLen(NULL, len-1); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + + return ret; +} + +static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(riid, &IID_IUnknown) + || IsEqualGUID(riid, &IID_IDispatch) + || IsEqualGUID(riid, &IID_IDispatchEx)) + *ppv = iface; + else + return E_NOINTERFACE; + + return S_OK; +} + +static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) +{ + return 2; +} + +static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface) +{ + return 1; +} + +static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) +{ + ok(0, "unexpected call %s %x\n", debugstr_w(bstrName), grfdex); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) +{ + return DISP_E_UNKNOWNNAME; +} + +static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, + VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) +{ + return DISP_E_MEMBERNOTFOUND; +} + +static IDispatchExVtbl GlobalVtbl = { + DispatchEx_QueryInterface, + DispatchEx_AddRef, + DispatchEx_Release, + DispatchEx_GetTypeInfoCount, + DispatchEx_GetTypeInfo, + DispatchEx_GetIDsOfNames, + DispatchEx_Invoke, + Global_GetDispID, + Global_InvokeEx, + DispatchEx_DeleteMemberByName, + DispatchEx_DeleteMemberByDispID, + DispatchEx_GetMemberProperties, + DispatchEx_GetMemberName, + DispatchEx_GetNextDispID, + DispatchEx_GetNameSpaceParent +}; + +static IDispatchEx Global = { &GlobalVtbl }; + +static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) + *ppv = iface; + else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) + *ppv = iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid) +{ + *plcid = GetUserDefaultLCID(); + return S_OK; +} + +static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, + DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti) +{ + ok(!lstrcmpW(pstrName, testW), "unexpected pstrName %s\n", debugstr_w(pstrName)); + ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask); + ok(!ppti, "ppti != NULL\n"); + + *ppiunkItem = (IUnknown*)&Global; + return S_OK; +} + +static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, + const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface) +{ + return E_NOTIMPL; +} + +#undef ACTSCPSITE_THIS + +static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { + ActiveScriptSite_QueryInterface, + ActiveScriptSite_AddRef, + ActiveScriptSite_Release, + ActiveScriptSite_GetLCID, + ActiveScriptSite_GetItemInfo, + ActiveScriptSite_GetDocVersionString, + ActiveScriptSite_OnScriptTerminate, + ActiveScriptSite_OnStateChange, + ActiveScriptSite_OnScriptError, + ActiveScriptSite_OnEnterScript, + ActiveScriptSite_OnLeaveScript +}; + +static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl }; + +static IActiveScript *create_script(void) +{ + IActiveScript *script; + HRESULT hres; + + hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IActiveScript, (void**)&script); + ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); + + return script; +} + +static void parse_script(BSTR script_str) +{ + IActiveScriptParse *parser; + IActiveScript *engine; + HRESULT hres; + + engine = create_script(); + if(!engine) + return; + + hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser); + ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); + + hres = IActiveScriptParse_InitNew(parser); + ok(hres == S_OK, "InitNew failed: %08x\n", hres); + + hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite); + ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres); + + hres = IActiveScript_AddNamedItem(engine, testW, + SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS); + todo_wine + ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres); + + hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED); + ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_CONNECTED) failed: %08x\n", hres); + + hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL); + ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres); + + IActiveScript_Release(engine); + IActiveScriptParse_Release(parser); +} + +static void parse_script_a(const char *src) +{ + BSTR tmp = a2bstr(src); + parse_script(tmp); + SysFreeString(tmp); +} + +static void run_tests(void) +{ + parse_script_a(""); + parse_script_a("/* empty */ ;"); +} + +START_TEST(run) +{ + CoInitialize(NULL); + + run_tests(); + + CoUninitialize(); +} diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 3f0784545c6..f1fc07a2ec7 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -735,7 +735,7 @@ @ stdcall IsDBCSLeadByteEx(long long) @ stdcall IsDebuggerPresent() @ stub IsLSCallback -# @ stub IsProcessInJob +@ stdcall IsProcessInJob(long long ptr) @ stdcall IsProcessorFeaturePresent(long) @ stub IsSLCallback @ stdcall IsSystemResumeAutomatic() @@ -822,8 +822,8 @@ @ stdcall OpenFile(str ptr long) @ stdcall OpenFileMappingA(long long str) @ stdcall OpenFileMappingW(long long wstr) -@ stub OpenJobObjectA -@ stub OpenJobObjectW +@ stdcall OpenJobObjectA(long long str) +@ stdcall OpenJobObjectW(long long wstr) @ stdcall OpenMutexA(long long str) @ stdcall OpenMutexW(long long wstr) @ stdcall OpenProcess(long long long) @@ -857,7 +857,7 @@ @ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList @ stdcall QueryDosDeviceA(str ptr long) @ stdcall QueryDosDeviceW(wstr ptr long) -@ stub QueryInformationJobObject +@ stdcall QueryInformationJobObject(long long ptr long ptr) # @ stub QueryMemoryResourceNotification @ stub QueryNumberOfEventLogRecords @ stub QueryOldestEventLogRecord @@ -1014,7 +1014,7 @@ @ stdcall SetHandleContext(long long) @ stdcall SetHandleCount(long) @ stdcall SetHandleInformation(long long long) -@ stub SetInformationJobObject +@ stdcall SetInformationJobObject(long long ptr long) @ stub SetLastConsoleEventActive @ stdcall SetLastError(long) # @ stub SetLocalPrimaryComputerNameA @@ -1066,7 +1066,7 @@ @ stdcall SwitchToThread() @ stdcall SystemTimeToFileTime(ptr ptr) @ stdcall SystemTimeToTzSpecificLocalTime (ptr ptr ptr) -@ stub TerminateJobObject +@ stdcall TerminateJobObject(long long) @ stdcall TerminateProcess(long long) @ stdcall TerminateThread(long long) @ stdcall TermsrvAppInstallMode() diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c index 86675b64d66..1b259e57d2a 100644 --- a/dlls/kernel32/module.c +++ b/dlls/kernel32/module.c @@ -922,6 +922,12 @@ HMODULE WINAPI LoadLibraryExW(LPCWSTR libnameW, HANDLE hfile, DWORD flags) UNICODE_STRING wstr; HMODULE res; + if (hfile) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + if (!libnameW) { SetLastError(ERROR_INVALID_PARAMETER); diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c index bd6dd05d84a..1cc88b62ba2 100644 --- a/dlls/kernel32/sync.c +++ b/dlls/kernel32/sync.c @@ -899,6 +899,169 @@ BOOL WINAPI ReleaseSemaphore( HANDLE handle, LONG count, LONG *previous ) /* + * Jobs + */ + +/****************************************************************************** + * CreateJobObjectW (KERNEL32.@) + */ +HANDLE WINAPI CreateJobObjectW( LPSECURITY_ATTRIBUTES sa, LPCWSTR name ) +{ + HANDLE ret = 0; + UNICODE_STRING nameW; + OBJECT_ATTRIBUTES attr; + NTSTATUS status; + + attr.Length = sizeof(attr); + attr.RootDirectory = 0; + attr.ObjectName = NULL; + attr.Attributes = OBJ_OPENIF | ((sa && sa->bInheritHandle) ? OBJ_INHERIT : 0); + attr.SecurityDescriptor = sa ? sa->lpSecurityDescriptor : NULL; + attr.SecurityQualityOfService = NULL; + if (name) + { + RtlInitUnicodeString( &nameW, name ); + attr.ObjectName = &nameW; + attr.RootDirectory = get_BaseNamedObjects_handle(); + } + + status = NtCreateJobObject( &ret, JOB_OBJECT_ALL_ACCESS, &attr ); + if (status == STATUS_OBJECT_NAME_EXISTS) + SetLastError( ERROR_ALREADY_EXISTS ); + else + SetLastError( RtlNtStatusToDosError(status) ); + return ret; +} + +/****************************************************************************** + * CreateJobObjectA (KERNEL32.@) + */ +HANDLE WINAPI CreateJobObjectA( LPSECURITY_ATTRIBUTES attr, LPCSTR name ) +{ + WCHAR buffer[MAX_PATH]; + + if (!name) return CreateJobObjectW( attr, NULL ); + + if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) + { + SetLastError( ERROR_FILENAME_EXCED_RANGE ); + return 0; + } + return CreateJobObjectW( attr, buffer ); +} + +/****************************************************************************** + * OpenJobObjectW (KERNEL32.@) + */ +HANDLE WINAPI OpenJobObjectW( DWORD access, BOOL inherit, LPCWSTR name ) +{ + HANDLE ret; + UNICODE_STRING nameW; + OBJECT_ATTRIBUTES attr; + NTSTATUS status; + + attr.Length = sizeof(attr); + attr.RootDirectory = 0; + attr.ObjectName = NULL; + attr.Attributes = inherit ? OBJ_INHERIT : 0; + attr.SecurityDescriptor = NULL; + attr.SecurityQualityOfService = NULL; + if (name) + { + RtlInitUnicodeString( &nameW, name ); + attr.ObjectName = &nameW; + attr.RootDirectory = get_BaseNamedObjects_handle(); + } + + status = NtOpenJobObject( &ret, access, &attr ); + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError(status) ); + return 0; + } + return ret; +} + +/****************************************************************************** + * OpenJobObjectA (KERNEL32.@) + */ +HANDLE WINAPI OpenJobObjectA( DWORD access, BOOL inherit, LPCSTR name ) +{ + WCHAR buffer[MAX_PATH]; + + if (!name) return OpenJobObjectW( access, inherit, NULL ); + + if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) + { + SetLastError( ERROR_FILENAME_EXCED_RANGE ); + return 0; + } + return OpenJobObjectW( access, inherit, buffer ); +} + +/****************************************************************************** + * TerminateJobObject (KERNEL32.@) + */ +BOOL WINAPI TerminateJobObject( HANDLE job, UINT exit_code ) +{ + NTSTATUS status = NtTerminateJobObject( job, exit_code ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + +/****************************************************************************** + * QueryInformationJobObject (KERNEL32.@) + */ +BOOL WINAPI QueryInformationJobObject( HANDLE job, JOBOBJECTINFOCLASS class, LPVOID info, + DWORD len, DWORD *ret_len ) +{ + NTSTATUS status = NtQueryInformationJobObject( job, class, info, len, ret_len ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + +/****************************************************************************** + * SetInformationJobObject (KERNEL32.@) + */ +BOOL WINAPI SetInformationJobObject( HANDLE job, JOBOBJECTINFOCLASS class, LPVOID info, DWORD len ) +{ + NTSTATUS status = NtSetInformationJobObject( job, class, info, len ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + +/****************************************************************************** + * AssignProcessToJobObject (KERNEL32.@) + */ +BOOL WINAPI AssignProcessToJobObject( HANDLE job, HANDLE process ) +{ + NTSTATUS status = NtAssignProcessToJobObject( job, process ); + if (status) SetLastError( RtlNtStatusToDosError(status) ); + return !status; +} + +/****************************************************************************** + * IsProcessInJob (KERNEL32.@) + */ +BOOL WINAPI IsProcessInJob( HANDLE process, HANDLE job, PBOOL result ) +{ + NTSTATUS status = NtIsProcessInJob( job, process ); + switch(status) + { + case STATUS_PROCESS_IN_JOB: + *result = TRUE; + return TRUE; + case STATUS_PROCESS_NOT_IN_JOB: + *result = FALSE; + return TRUE; + default: + SetLastError( RtlNtStatusToDosError(status) ); + return FALSE; + } +} + + +/* * Timers */ @@ -2007,55 +2170,6 @@ BOOL WINAPI BindIoCompletionCallback( HANDLE FileHandle, LPOVERLAPPED_COMPLETION return FALSE; } -/****************************************************************************** - * CreateJobObjectW (KERNEL32.@) - */ -HANDLE WINAPI CreateJobObjectW( LPSECURITY_ATTRIBUTES attr, LPCWSTR name ) -{ - FIXME("%p %s\n", attr, debugstr_w(name) ); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/****************************************************************************** - * CreateJobObjectA (KERNEL32.@) - */ -HANDLE WINAPI CreateJobObjectA( LPSECURITY_ATTRIBUTES attr, LPCSTR name ) -{ - LPWSTR str = NULL; - UINT len; - HANDLE r; - - TRACE("%p %s\n", attr, debugstr_a(name) ); - - if( name ) - { - len = MultiByteToWideChar( CP_ACP, 0, name, -1, NULL, 0 ); - str = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) ); - if( !str ) - { - SetLastError( ERROR_OUTOFMEMORY ); - return 0; - } - len = MultiByteToWideChar( CP_ACP, 0, name, -1, str, len ); - } - - r = CreateJobObjectW( attr, str ); - - HeapFree( GetProcessHeap(), 0, str ); - - return r; -} - -/****************************************************************************** - * AssignProcessToJobObject (KERNEL32.@) - */ -BOOL WINAPI AssignProcessToJobObject( HANDLE hJob, HANDLE hProcess ) -{ - FIXME("%p %p\n", hJob, hProcess); - return TRUE; -} - #ifdef __i386__ /*********************************************************************** diff --git a/dlls/kernel32/tests/environ.c b/dlls/kernel32/tests/environ.c index ad3734f26ba..70549e30240 100644 --- a/dlls/kernel32/tests/environ.c +++ b/dlls/kernel32/tests/environ.c @@ -163,7 +163,9 @@ static void test_GetSetEnvironmentVariableW(void) lstrcpyW(buf, fooW); ret_size = GetEnvironmentVariableW(name, buf, lstrlenW(value)); - ok_w(lstrcmpW(buf, fooW) == 0, "should not touch the buffer: %s\n", buf); + ok_w(lstrcmpW(buf, fooW) == 0 || + lstrlenW(buf) == 0, /* Vista */ + "Expected untouched or empty buffer, got \"%s\"\n", buf); ok(ret_size == lstrlenW(value) + 1, "should return length with terminating 0 ret_size=%d\n", ret_size); diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 5b8b00d0b64..94bc975265d 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -2,6 +2,7 @@ * Unit tests for file functions in Wine * * Copyright (c) 2002, 2004 Jakob Eriksson + * Copyright (c) 2008 Jeff Zaroyko * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -841,6 +842,10 @@ static void test_DeleteFileA( void ) static void test_DeleteFileW( void ) { BOOL ret; + WCHAR pathW[MAX_PATH]; + WCHAR pathsubW[MAX_PATH]; + static const WCHAR dirW[] = {'d','e','l','e','t','e','f','i','l','e',0}; + static const WCHAR subdirW[] = {'\\','s','u','b',0}; static const WCHAR emptyW[]={'\0'}; ret = DeleteFileW(NULL); @@ -852,6 +857,35 @@ static void test_DeleteFileW( void ) ret = DeleteFileW(emptyW); ok(!ret && GetLastError() == ERROR_PATH_NOT_FOUND, "DeleteFileW(\"\") returned ret=%d error=%d\n",ret,GetLastError()); + + /* test DeleteFile on empty directory */ + ret = GetTempPathW(MAX_PATH, pathW); + if (ret + sizeof(dirW)/sizeof(WCHAR)-1 + sizeof(subdirW)/sizeof(WCHAR)-1 >= MAX_PATH) + { + ok(0, "MAX_PATH exceeded in constructing paths\n"); + return; + } + lstrcatW(pathW, dirW); + lstrcpyW(pathsubW, pathW); + lstrcatW(pathsubW, subdirW); + ret = CreateDirectoryW(pathW, NULL); + ok(ret == TRUE, "couldn't create directory deletefile\n"); + ret = DeleteFileW(pathW); + todo_wine ok(ret == FALSE, "DeleteFile should fail for empty directories\n"); + ret = RemoveDirectoryW(pathW); + todo_wine ok(ret == TRUE, "expected to remove directory deletefile\n"); + + /* test DeleteFile on non-empty directory */ + ret = CreateDirectoryW(pathW, NULL); + ok(ret == TRUE, "couldn't create directory deletefile\n"); + ret = CreateDirectoryW(pathsubW, NULL); + ok(ret == TRUE, "couldn't create directory deletefile\\sub\n"); + ret = DeleteFileW(pathW); + todo_wine ok(ret == FALSE, "DeleteFile should fail for non-empty directories\n"); + ret = RemoveDirectoryW(pathsubW); + ok(ret == TRUE, "expected to remove directory deletefile\\sub\n"); + ret = RemoveDirectoryW(pathW); + ok(ret == TRUE, "expected to remove directory deletefile\n"); } #define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) diff --git a/dlls/kernel32/tests/module.c b/dlls/kernel32/tests/module.c index ca31aaf014b..7b602e7e1e8 100644 --- a/dlls/kernel32/tests/module.c +++ b/dlls/kernel32/tests/module.c @@ -245,13 +245,12 @@ static void testLoadLibraryEx(void) SetLastError(0xdeadbeef); hmodule = LoadLibraryExA("testfile.dll", hfile, 0); ok(hmodule == 0, "Expected 0, got %p\n", hmodule); - todo_wine - { - ok(GetLastError() == ERROR_SHARING_VIOLATION, - "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); - } + ok(GetLastError() == ERROR_SHARING_VIOLATION || + GetLastError() == ERROR_INVALID_PARAMETER, /* win2k3 */ + "Expected ERROR_SHARING_VIOLATION or ERROR_INVALID_PARAMETER, got %d\n", + GetLastError()); - /* has nothing to do with hFile */ + /* try to open a file that is locked */ SetLastError(0xdeadbeef); hmodule = LoadLibraryExA("testfile.dll", NULL, 0); ok(hmodule == 0, "Expected 0, got %p\n", hmodule); @@ -261,12 +260,14 @@ static void testLoadLibraryEx(void) "Expected ERROR_SHARING_VIOLATION, got %d\n", GetLastError()); } - /* one last try with hFile */ + /* lpFileName does not matter */ SetLastError(0xdeadbeef); hmodule = LoadLibraryExA(NULL, hfile, 0); ok(hmodule == 0, "Expected 0, got %p\n", hmodule); - ok(GetLastError() == ERROR_MOD_NOT_FOUND, - "Expected ERROR_MOD_NOT_FOUND, got %d\n", GetLastError()); + ok(GetLastError() == ERROR_MOD_NOT_FOUND || + GetLastError() == ERROR_INVALID_PARAMETER, /* win2k3 */ + "Expected ERROR_MOD_NOT_FOUND or ERROR_INVALID_PARAMETER, got %d\n", + GetLastError()); CloseHandle(hfile); diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index ce0f5b691a7..8de2e97e421 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -953,7 +953,10 @@ static void test_ImpersonateNamedPipeClient(HANDLE hClientToken, DWORD security_ ret = ImpersonateNamedPipeClient(hPipeServer); error = GetLastError(); todo_wine - ok(!ret && (error == ERROR_CANNOT_IMPERSONATE), "ImpersonateNamedPipeClient should have failed with ERROR_CANNOT_IMPERSONATE instead of %d\n", GetLastError()); + ok(!ret && + (error == ERROR_CANNOT_IMPERSONATE || + error == 0xdeadbeef), /* win2k3 */ + "ImpersonateNamedPipeClient should have failed with ERROR_CANNOT_IMPERSONATE instead of %d\n", GetLastError()); ret = ConnectNamedPipe(hPipeServer, NULL); ok(ret || (GetLastError() == ERROR_PIPE_CONNECTED), "ConnectNamedPipe failed with error %d\n", GetLastError()); diff --git a/dlls/kernel32/tests/version.c b/dlls/kernel32/tests/version.c index 5371795ba6b..1a9a40c0c14 100644 --- a/dlls/kernel32/tests/version.c +++ b/dlls/kernel32/tests/version.c @@ -92,7 +92,9 @@ static void test_GetVersionEx(void) SetLastError(0xdeadbeef); infoExA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA); ret = GetVersionExA((OSVERSIONINFOA *)&infoExA); - ok(ret, "Expected GetVersionExA to succeed\n"); + ok(ret || + broken(ret == 0), /* win95 */ + "Expected GetVersionExA to succeed\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); } @@ -162,8 +164,11 @@ static void test_VerifyVersionInfo(void) pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL), VER_MAJORVERSION, VER_GREATER_EQUAL)); if (servicepack == 0) - ok(!ret && (GetLastError() == ERROR_OLD_WIN_VERSION), - "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + { + ok(!ret, "VerifyVersionInfoA should have failed\n"); + ok(GetLastError() == ERROR_OLD_WIN_VERSION, + "Expected ERROR_OLD_WIN_VERSION instead of %d\n", GetLastError()); + } else ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError()); diff --git a/dlls/localspl/localspl.rc b/dlls/localspl/localspl.rc index 0c76e9c948a..edfe4cfb308 100644 --- a/dlls/localspl/localspl.rc +++ b/dlls/localspl/localspl.rc @@ -48,3 +48,4 @@ #include "spl_Ru.rc" #include "spl_Si.rc" #include "spl_Sv.rc" +#include "spl_Zh.rc" diff --git a/dlls/localspl/localspl_private.h b/dlls/localspl/localspl_private.h index 7d76429277c..614e10824eb 100644 --- a/dlls/localspl/localspl_private.h +++ b/dlls/localspl/localspl_private.h @@ -51,7 +51,7 @@ extern HINSTANCE LOCALSPL_hInstance; /* ## Memory allocation functions ## */ -static inline void *heap_alloc( size_t len ) +static inline void __WINE_ALLOC_SIZE(1) *heap_alloc( size_t len ) { return HeapAlloc( GetProcessHeap(), 0, len ); } diff --git a/programs/oleview/rsrc.rc b/dlls/localspl/spl_Zh.rc similarity index 60% copy from programs/oleview/rsrc.rc copy to dlls/localspl/spl_Zh.rc index 5b4c7812fa4..c5db382ffe3 100644 --- a/programs/oleview/rsrc.rc +++ b/dlls/localspl/spl_Zh.rc @@ -1,7 +1,7 @@ /* - * OleView (rsrc.rc) + * localspl (Simplified and Traditional Chinese Resources) * - * Copyright 2006 Piotr Caban + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,27 +18,23 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) -#include "resource.h" +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#include "Da.rc" -#include "De.rc" -#include "En.rc" -#include "Fr.rc" -#include "Ko.rc" -#include "Nl.rc" -#include "No.rc" -#include "Pl.rc" -#include "Ru.rc" +STRINGTABLE DISCARDABLE +{ + IDS_LOCALPORT "本地端口" + IDS_LOCALMONITOR "本地监视器" +} -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -IDA_OLEVIEW ACCELERATORS DISCARDABLE +STRINGTABLE DISCARDABLE { - VK_F5, IDM_REFRESH, VIRTKEY, NOINVERT + IDS_LOCALPORT "本地端口" + IDS_LOCALMONITOR "本地監視器" } -/* @makedep: toolbar.bmp */ -IDB_TOOLBAR BITMAP DISCARDABLE toolbar.bmp +#pragma code_page(default) diff --git a/dlls/localui/localui.rc b/dlls/localui/localui.rc index 7c0cf91fcab..16c40f2f025 100644 --- a/dlls/localui/localui.rc +++ b/dlls/localui/localui.rc @@ -50,3 +50,4 @@ #include "ui_Ru.rc" #include "ui_Si.rc" #include "ui_Sv.rc" +#include "ui_Zh.rc" diff --git a/dlls/localui/ui_Zh.rc b/dlls/localui/ui_Zh.rc new file mode 100644 index 00000000000..c1a3b61e5c6 --- /dev/null +++ b/dlls/localui/ui_Zh.rc @@ -0,0 +1,94 @@ +/* + * localui (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "添加本地端口" +FONT 9, "MS Song" +BEGIN + LTEXT "添加本地端口名称(&E):", -1, 7, 13, 194, 13, WS_VISIBLE + EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL + DEFPUSHBUTTON "确定", IDOK, 199, 10, 40, 14, WS_VISIBLE + PUSHBUTTON "取消", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE +END + + +LPTCONFIG_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "设置打印端口" +FONT 9, "MS Song" +BEGIN + GROUPBOX "超时(秒)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX + LTEXT "重试通讯(&T):", -1, 14, 22, 90, 13, WS_VISIBLE + EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER + DEFPUSHBUTTON "确定", IDOK, 164, 10, 50, 14, WS_VISIBLE + PUSHBUTTON "取消", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE +END + + +STRINGTABLE DISCARDABLE +{ + IDS_LOCALPORT "本地端口" + IDS_INVALIDNAME "'%s' 不是有效的端口名称" + IDS_PORTEXISTS "端口 %s 已经存在" + IDS_NOTHINGTOCONFIG "这个端口没有可设置选项" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +ADDPORT_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "添加本地端口" +FONT 8, "PMingLiu" +BEGIN + LTEXT "添加本地端口名稱(&E):", -1, 7, 13, 194, 13, WS_VISIBLE + EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL + DEFPUSHBUTTON "確定", IDOK, 199, 10, 40, 14, WS_VISIBLE + PUSHBUTTON "取消", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE +END + + +LPTCONFIG_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 220, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "設定列印端口" +FONT 8, "PMingLiu" +BEGIN + GROUPBOX "超時(秒)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX + LTEXT "重試通訊(&T):", -1, 14, 22, 90, 13, WS_VISIBLE + EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER + DEFPUSHBUTTON "確定", IDOK, 164, 10, 50, 14, WS_VISIBLE + PUSHBUTTON "取消", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE +END + + +STRINGTABLE DISCARDABLE +{ + IDS_LOCALPORT "本地端口" + IDS_INVALIDNAME "'%s' 不是有效的端口名稱" + IDS_PORTEXISTS "端口 %s 已經存在" + IDS_NOTHINGTOCONFIG "這個端口沒有可設定選項" +} + +#pragma code_page(default) diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index 7b35d43947d..ed63cc67881 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -1273,15 +1273,6 @@ static void test_JapaneseConversion(void) ok(destsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); ok(srcsz == sjis_jp[i][0],"(%i) Expected %i, got %i\n",i,sjis_jp[i][0],srcsz); ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); - - i = 2; - destsz = 30; - srcsz = euc_jp[i][0]; - hr = pConvertINetMultiByteToUnicode(NULL, 50932, &euc_jp[i][1], &srcsz, outputW, &destsz); - ok(hr == S_OK,"(%i) Expected S_OK, got %08x\n",i,hr); - ok(destsz == unc_jp[i][0],"(%i) Expected %i, got %i\n",i,unc_jp[i][0],destsz); - ok(srcsz == euc_jp[i][0],"(%i) Expected %i, got %i\n",i,euc_jp[i][0],srcsz); - ok(memcmp(outputW,&unc_jp[i][1],destsz)==0,"(%i) Strings do not match\n",i); } START_TEST(mlang) diff --git a/dlls/mpr/mpr.rc b/dlls/mpr/mpr.rc index 3ef3e165ea6..e9f0cfbc4b4 100644 --- a/dlls/mpr/mpr.rc +++ b/dlls/mpr/mpr.rc @@ -45,3 +45,4 @@ #include "mpr_Si.rc" #include "mpr_Sv.rc" #include "mpr_Tr.rc" +#include "mpr_Zh.rc" diff --git a/dlls/mpr/mpr_Zh.rc b/dlls/mpr/mpr_Zh.rc new file mode 100644 index 00000000000..9ff433a3660 --- /dev/null +++ b/dlls/mpr/mpr_Zh.rc @@ -0,0 +1,78 @@ +/* + * MPR dll (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE DISCARDABLE +{ + IDS_ENTIRENETWORK "整个网络" +} + +IDD_PROXYDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "输入网络密码" +FONT 9, "MS Song" +{ + LTEXT "请输入用户名和密码:", IDC_EXPLAIN, 40, 6, 150, 15 + LTEXT "代理", -1, 40, 26, 50, 10 +/* LTEXT "Realm", -1, 40, 46, 50, 10 */ + LTEXT "用户名", -1, 40, 66, 50, 10 + LTEXT "密码", -1, 40, 86, 50, 10 + LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0 + LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 + EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD + CHECKBOX "保存密码(不安全)(&S)", IDC_SAVEPASSWORD, + 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "确定", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE DISCARDABLE +{ + IDS_ENTIRENETWORK "整個網路" +} + +IDD_PROXYDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "輸入網路密碼" +FONT 8, "PMingLiu" +{ + LTEXT "請輸入用戶名和密碼:", IDC_EXPLAIN, 40, 6, 150, 15 + LTEXT "代理", -1, 40, 26, 50, 10 +/* LTEXT "Realm", -1, 40, 46, 50, 10 */ + LTEXT "用戶名", -1, 40, 66, 50, 10 + LTEXT "密碼", -1, 40, 86, 50, 10 + LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0 + LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 + EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD + CHECKBOX "儲存密碼(不安全)(&S)", IDC_SAVEPASSWORD, + 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "確定", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP +} + +#pragma code_page(default) diff --git a/dlls/msacm32/msacm.rc b/dlls/msacm32/msacm.rc index 33767633f0f..a0ea53c06c7 100644 --- a/dlls/msacm32/msacm.rc +++ b/dlls/msacm32/msacm.rc @@ -42,3 +42,4 @@ #include "msacm_Si.rc" #include "msacm_Sv.rc" #include "msacm_Tr.rc" +#include "msacm_Zh.rc" diff --git a/dlls/msacm32/msacm_Zh.rc b/dlls/msacm32/msacm_Zh.rc new file mode 100644 index 00000000000..e5a6f9324b3 --- /dev/null +++ b/dlls/msacm32/msacm_Zh.rc @@ -0,0 +1,98 @@ +/* + * MS ACM (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "声音选择" +FONT 9, "MS Song" +BEGIN + + LTEXT "名称(&N):", -1, 5, 5, 115, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + PUSHBUTTON "保存为(&S)...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "删除(&R)", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "格式(&F):", -1, 5, 41, 44, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + LTEXT "属性(&A):", -1, 5, 59, 44, 8, NOT WS_GROUP + +#if 0 + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | + CBS_OWNERDRAWFIXED | CBS_HASSTRINGS +#else + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#endif + DEFPUSHBUTTON "确定", IDOK, 48, 80, 40, 14 + PUSHBUTTON "取消", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "帮助(&H)", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +DLG_ACMFORMATCHOOSE_ID DIALOG DISCARDABLE 10, 20, 225, 100 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "聲音選擇" +FONT 8, "PMingLiu" +BEGIN + + LTEXT "名稱(&N):", -1, 5, 5, 115, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_CUSTOM, 5, 15, 115, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + PUSHBUTTON "儲存為(&S)...", IDD_ACMFORMATCHOOSE_BTN_SETNAME, 125, 14, 45, 14 + PUSHBUTTON "刪除(&R)", IDD_ACMFORMATCHOOSE_BTN_DELNAME, 175, 14, 45, 14 + + LTEXT "格式(&F):", -1, 5, 41, 44, 8, NOT WS_GROUP + + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMATTAG, 50, 39, 170, 60, + CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + + LTEXT "屬性(&A):", -1, 5, 59, 44, 8, NOT WS_GROUP + +#if 0 + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | + CBS_OWNERDRAWFIXED | CBS_HASSTRINGS +#else + COMBOBOX IDD_ACMFORMATCHOOSE_CMB_FORMAT, 50, 57, 170, 60, + CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +#endif + DEFPUSHBUTTON "確定", IDOK, 48, 80, 40, 14 + PUSHBUTTON "取消", IDCANCEL, 92, 80, 40, 14 + PUSHBUTTON "幫助(&H)", IDD_ACMFORMATCHOOSE_BTN_HELP, 136, 80, 40, 14 + +END + +#pragma code_page(default) diff --git a/dlls/mshtml/Zh.rc b/dlls/mshtml/Zh.rc new file mode 100644 index 00000000000..0a04e9e3315 --- /dev/null +++ b/dlls/mshtml/Zh.rc @@ -0,0 +1,98 @@ +/* + * mshtml (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE DISCARDABLE +{ + IDS_HTMLDISABLED "HTML 功能目前已被停用." + IDS_HTMLDOCUMENT "HTML 文件" + IDS_DOWNLOADING "正在下载..." + IDS_INSTALLING "正在安装..." +} + +ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 85 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Wine Gecko 安装" +FONT 9, "MS Song" +{ + LTEXT "这个运用程序要显示一个HTML 网页. Wine 需要装上 Gecko (Mozilla HTML " \ + "engine)才能显示HTML网页. 如果你想自动下载和安装Gecko," \ + "请按'安装'.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT + CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 + DEFPUSHBUTTON "安装(&I)", ID_DWL_INSTALL, 200, 60, 50, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消(&C)", IDCANCEL, 140, 60, 50, 15, WS_GROUP | WS_TABSTOP +} + +IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65 +STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "超链接" +FONT 9, "MS Song" +{ + GROUPBOX "超链接信息", IDC_STATIC, 5, 5, 190, 55 + LTEXT "类型(&T):", IDC_STATIC, 10, 22, 20, 10 + COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS + LTEXT "网址(&U):", IDC_STATIC, 10, 42, 20, 10 + EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "确定", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE DISCARDABLE +{ + IDS_HTMLDISABLED "HTML 功能目前已被停用." + IDS_HTMLDOCUMENT "HTML 檔案" + IDS_DOWNLOADING "正在下載..." + IDS_INSTALLING "正在安裝..." +} + +ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 260, 85 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Wine Gecko 安裝" +FONT 8, "PMingLiu" +{ + LTEXT "這個運用程式要顯示一個HTML 網頁. Wine 需要裝上 Gecko (Mozilla HTML " \ + "engine)才能顯示HTML網頁. 如果你想自動下載和安裝Gecko," \ + "請按'安裝'.", ID_DWL_STATUS, 10, 10, 240, 30, SS_LEFT + CONTROL "Progress", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 40, 240, 12 + DEFPUSHBUTTON "安裝(&I)", ID_DWL_INSTALL, 200, 60, 50, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消(&C)", IDCANCEL, 140, 60, 50, 15, WS_GROUP | WS_TABSTOP +} + +IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65 +STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "超鏈接" +FONT 8, "PMingLiu" +{ + GROUPBOX "超鏈接資訊", IDC_STATIC, 5, 5, 190, 55 + LTEXT "類型(&T):", IDC_STATIC, 10, 22, 20, 10 + COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS + LTEXT "網址(&U):", IDC_STATIC, 10, 42, 20, 10 + EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "確定", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "取消", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP +} + +#pragma code_page(default) diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 4e44130e0ac..587d9530581 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -66,6 +66,7 @@ static struct list dispex_data_list = LIST_INIT(dispex_data_list); static REFIID tid_ids[] = { &IID_NULL, &DIID_DispDOMChildrenCollection, + &DIID_DispHTMLBody, &DIID_DispHTMLCommentElement, &DIID_DispHTMLDocument, &DIID_DispHTMLDOMTextNode, @@ -78,7 +79,10 @@ static REFIID tid_ids[] = { &DIID_DispHTMLStyle, &DIID_DispHTMLUnknownElement, &DIID_DispHTMLWindow2, + &IID_IHTMLBodyElement, + &IID_IHTMLBodyElement2, &IID_IHTMLCommentElement, + &IID_IHTMLControlElement, &IID_IHTMLDocument2, &IID_IHTMLDocument3, &IID_IHTMLDocument4, @@ -89,6 +93,8 @@ static REFIID tid_ids[] = { &IID_IHTMLDOMTextNode, &IID_IHTMLElement, &IID_IHTMLElement2, + &IID_IHTMLElement3, + &IID_IHTMLElement4, &IID_IHTMLElementCollection, &IID_IHTMLGenericElement, &IID_IHTMLImgElement, @@ -96,6 +102,8 @@ static REFIID tid_ids[] = { &IID_IHTMLOptionElement, &IID_IHTMLSelectElement, &IID_IHTMLStyle, + &IID_IHTMLTextContainer, + &IID_IHTMLUniqueName, &IID_IHTMLWindow2, &IID_IHTMLWindow3, &IID_IOmNavigator diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index 8e1f70c7e47..13c802e377e 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -110,16 +110,14 @@ static ULONG WINAPI HTMLBodyElement_Release(IHTMLBodyElement *iface) static HRESULT WINAPI HTMLBodyElement_GetTypeInfoCount(IHTMLBodyElement *iface, UINT *pctinfo) { HTMLBodyElement *This = HTMLBODY_THIS(iface); - FIXME("(%p)->(%p)\n", This, pctinfo); - return E_NOTIMPL; + return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->textcont.element.node.dispex), pctinfo); } static HRESULT WINAPI HTMLBodyElement_GetTypeInfo(IHTMLBodyElement *iface, UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { HTMLBodyElement *This = HTMLBODY_THIS(iface); - FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); - return E_NOTIMPL; + return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->textcont.element.node.dispex), iTInfo, lcid, ppTInfo); } static HRESULT WINAPI HTMLBodyElement_GetIDsOfNames(IHTMLBodyElement *iface, REFIID riid, @@ -127,9 +125,7 @@ static HRESULT WINAPI HTMLBodyElement_GetIDsOfNames(IHTMLBodyElement *iface, REF LCID lcid, DISPID *rgDispId) { HTMLBodyElement *This = HTMLBODY_THIS(iface); - FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, - lcid, rgDispId); - return E_NOTIMPL; + return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->textcont.element.node.dispex), riid, rgszNames, cNames, lcid, rgDispId); } static HRESULT WINAPI HTMLBodyElement_Invoke(IHTMLBodyElement *iface, DISPID dispIdMember, @@ -137,9 +133,8 @@ static HRESULT WINAPI HTMLBodyElement_Invoke(IHTMLBodyElement *iface, DISPID dis VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { HTMLBodyElement *This = HTMLBODY_THIS(iface); - FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), - lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); - return E_NOTIMPL; + return IDispatchEx_Invoke(DISPATCHEX(&This->textcont.element.node.dispex), dispIdMember, riid, lcid, + wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); } static HRESULT WINAPI HTMLBodyElement_put_background(IHTMLBodyElement *iface, BSTR v) @@ -596,6 +591,28 @@ static const NodeImplVtbl HTMLBodyElementImplVtbl = { HTMLBodyElement_destructor }; +static const tid_t HTMLBodyElement_iface_tids[] = { + IHTMLBodyElement_tid, + IHTMLBodyElement2_tid, + IHTMLControlElement_tid, + IHTMLDOMNode_tid, + IHTMLDOMNode2_tid, + IHTMLElement_tid, + IHTMLElement2_tid, + IHTMLElement3_tid, + IHTMLElement4_tid, + IHTMLTextContainer_tid, + IHTMLUniqueName_tid, + 0 +}; + +static dispex_static_data_t HTMLBodyElement_dispex = { + NULL, + DispHTMLBody_tid, + NULL, + HTMLBodyElement_iface_tids +}; + HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem) { HTMLBodyElement *ret = heap_alloc_zero(sizeof(HTMLBodyElement)); @@ -606,6 +623,8 @@ HTMLElement *HTMLBodyElement_Create(nsIDOMHTMLElement *nselem) HTMLTextContainer_Init(&ret->textcont); ret->lpHTMLBodyElementVtbl = &HTMLBodyElementVtbl; + + init_dispex(&ret->textcont.element.node.dispex, (IUnknown*)HTMLBODY(ret), &HTMLBodyElement_dispex); ret->textcont.element.node.vtbl = &HTMLBodyElementImplVtbl; ConnectionPoint_Init(&ret->cp_propnotif, &ret->textcont.element.cp_container, &IID_IPropertyNotifySink); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 88f444d15a3..4b4675b9854 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -62,6 +62,7 @@ typedef struct event_target_t event_target_t; typedef enum { NULL_tid, DispDOMChildrenCollection_tid, + DispHTMLBody_tid, DispHTMLCommentElement_tid, DispHTMLDocument_tid, DispHTMLDOMTextNode_tid, @@ -74,7 +75,10 @@ typedef enum { DispHTMLStyle_tid, DispHTMLUnknownElement_tid, DispHTMLWindow2_tid, + IHTMLBodyElement_tid, + IHTMLBodyElement2_tid, IHTMLCommentElement_tid, + IHTMLControlElement_tid, IHTMLDocument2_tid, IHTMLDocument3_tid, IHTMLDocument4_tid, @@ -85,6 +89,8 @@ typedef enum { IHTMLDOMTextNode_tid, IHTMLElement_tid, IHTMLElement2_tid, + IHTMLElement3_tid, + IHTMLElement4_tid, IHTMLElementCollection_tid, IHTMLGenericElement_tid, IHTMLImgElement_tid, @@ -92,6 +98,8 @@ typedef enum { IHTMLOptionElement_tid, IHTMLSelectElement_tid, IHTMLStyle_tid, + IHTMLTextContainer_tid, + IHTMLUniqueName_tid, IHTMLWindow2_tid, IHTMLWindow3_tid, IOmNavigator_tid, @@ -482,7 +490,7 @@ void hlink_frame_navigate(HTMLDocument*,IHlinkFrame*,LPCWSTR,nsIInputStream*,DWO void call_property_onchanged(ConnectionPoint*,DISPID); HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*); -void *nsalloc(size_t); +void *nsalloc(size_t) __WINE_ALLOC_SIZE(1); void nsfree(void*); void nsACString_Init(nsACString*,const char*); @@ -646,17 +654,17 @@ extern LONG module_ref; /* memory allocation functions */ -static inline void *heap_alloc(size_t len) +static inline void __WINE_ALLOC_SIZE(1) *heap_alloc(size_t len) { return HeapAlloc(GetProcessHeap(), 0, len); } -static inline void *heap_alloc_zero(size_t len) +static inline void __WINE_ALLOC_SIZE(1) *heap_alloc_zero(size_t len) { return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, len); } -static inline void *heap_realloc(void *mem, size_t len) +static inline void __WINE_ALLOC_SIZE(2) *heap_realloc(void *mem, size_t len) { return HeapReAlloc(GetProcessHeap(), 0, mem, len); } diff --git a/dlls/mshtml/rsrc.rc b/dlls/mshtml/rsrc.rc index fb917d9deb6..4b6a8cbf043 100644 --- a/dlls/mshtml/rsrc.rc +++ b/dlls/mshtml/rsrc.rc @@ -49,6 +49,7 @@ #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index d4428002c94..b658a74eb96 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -2728,7 +2728,9 @@ static void run_domtest(const char *str, domtest_t test) } ref = IHTMLDocument2_Release(doc); - ok(!ref, "ref = %d\n", ref); + ok(!ref || + ref == 1, /* Vista */ + "ref = %d\n", ref); } static void gecko_installer_workaround(BOOL disable) diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index 970da5ded39..157dbc3128b 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -237,6 +237,10 @@ static IHTMLDocument2 *create_and_load_doc(const char *str) ULONG ref; MSG msg; HRESULT hres; + static const WCHAR ucPtr[] = {'b','a','c','k','g','r','o','u','n','d',0}; + DISPID dispID = -1; + OLECHAR *name; + doc = create_doc_with_string(str); do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); @@ -256,6 +260,12 @@ static IHTMLDocument2 *create_and_load_doc(const char *str) return NULL; } + /* Check we can query for function on the IHTMLElementBody interface */ + name = (WCHAR*)ucPtr; + hres = IHTMLElement_GetIDsOfNames(body, &IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispID); + ok(hres == S_OK, "GetIDsOfNames(background) failed %08x\n", hres); + ok(dispID == DISPID_IHTMLBODYELEMENT_BACKGROUND, "Incorrect dispID got (%d)\n", dispID); + IHTMLElement_Release(body); return doc; } diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 8cd5923bdbe..8a8efe75d45 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -1481,7 +1481,8 @@ static UINT load_file(MSIRECORD *row, LPVOID param) /* if the compressed bits are not set in the file attributes, * then read the information from the package word count property */ - if (file->Attributes & msidbFileAttributesCompressed) + if (file->Attributes & + (msidbFileAttributesCompressed | msidbFileAttributesPatchAdded)) { file->IsCompressed = TRUE; } diff --git a/dlls/msi/msi.rc b/dlls/msi/msi.rc index b5aef603aef..4091184c056 100644 --- a/dlls/msi/msi.rc +++ b/dlls/msi/msi.rc @@ -46,6 +46,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "msi_Si.rc" #include "msi_Sv.rc" #include "msi_Tr.rc" +#include "msi_Zh.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/dlls/msi/msi_Zh.rc b/dlls/msi/msi_Zh.rc new file mode 100644 index 00000000000..86620db06fc --- /dev/null +++ b/dlls/msi/msi_Zh.rc @@ -0,0 +1,54 @@ +/* + * MSI (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE DISCARDABLE +{ + 4 "不能打开所指定的安装软件包. 请检查文件路径后再试." + 5 "路径 %s 没找到" + 9 "插入软盘 %s" + 10 "错误参数" + 11 "输入包含 %s 的文件夹" + 12 "本功能的安装源不存在" + 13 "本功能的网络驱动器不存在" + 14 "功能来自:" + 15 "选择包含 %s 的文件夹" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE DISCARDABLE +{ + 4 "不能開啟所指定的安裝軟件包. 請檢查檔案路徑後再試." + 5 "路徑 %s 沒找到" + 9 "插入軟碟 %s" + 10 "錯誤參數" + 11 "輸入包含 %s 的檔案夾" + 12 "本功能的安裝源不存在" + 13 "本功能的網路儲存槽不存在" + 14 "功能來自:" + 15 "選擇包含 %s 的檔案夾" +} + +#pragma code_page(default) diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 2f54ccaf2eb..96656c6445f 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -1040,21 +1040,25 @@ extern const WCHAR cszRootDrive[]; extern const WCHAR cszbs[]; /* memory allocation macro functions */ +static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1); static inline void *msi_alloc( size_t len ) { return HeapAlloc( GetProcessHeap(), 0, len ); } +static void *msi_alloc_zero( size_t len ) __WINE_ALLOC_SIZE(1); static inline void *msi_alloc_zero( size_t len ) { return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len ); } +static void *msi_realloc( void *mem, size_t len ) __WINE_ALLOC_SIZE(2); static inline void *msi_realloc( void *mem, size_t len ) { return HeapReAlloc( GetProcessHeap(), 0, mem, len ); } +static void *msi_realloc_zero( void *mem, size_t len ) __WINE_ALLOC_SIZE(2); static inline void *msi_realloc_zero( void *mem, size_t len ) { return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len ); diff --git a/dlls/msi/tests/automation.c b/dlls/msi/tests/automation.c index 8ea639af562..b76aae1810a 100644 --- a/dlls/msi/tests/automation.c +++ b/dlls/msi/tests/automation.c @@ -373,6 +373,15 @@ static CHAR string1[MAX_PATH], string2[MAX_PATH]; ok(0, format, string1, string2); \ } +#define ok_w2n(format, szString1, szString2, len) \ +\ + if (memcmp(szString1, szString2, len * sizeof(WCHAR)) != 0) \ + { \ + WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ + WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ + ok(0, format, string1, string2); \ + } + #define ok_aw(format, aString, wString) \ \ WideCharToMultiByte(CP_ACP, 0, wString, -1, string1, MAX_PATH, NULL, NULL); \ @@ -1888,10 +1897,12 @@ static void test_Installer_RegistryValue(void) ok(hr == S_OK, "Installer_RegistryValueW failed, hresult 0x%08x\n", hr); ok_w2("Registry value \"%s\" does not match expected \"%s\"\n", szString, szFour); + /* Vista does not NULL-terminate this case */ memset(szString, 0, sizeof(szString)); hr = Installer_RegistryValueW(curr_user, szKey, szFive, szString); ok(hr == S_OK, "Installer_RegistryValueW failed, hresult 0x%08x\n", hr); - ok_w2("Registry value \"%s\" does not match expected \"%s\"\n", szString, szFiveHi); + ok_w2n("Registry value \"%s\" does not match expected \"%s\"\n", + szString, szFiveHi, lstrlenW(szFiveHi)); memset(szString, 0, sizeof(szString)); hr = Installer_RegistryValueW(curr_user, szKey, szSix, szString); diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index 40fabf8e001..3ff34206339 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "wine/test.h" @@ -39,6 +40,10 @@ static UINT (WINAPI *pMsiSourceListEnumSourcesA) static UINT (WINAPI *pMsiSourceListGetInfoA) (LPCSTR, LPCSTR, MSIINSTALLCONTEXT, DWORD, LPCSTR, LPSTR, LPDWORD); +static HMODULE hsrclient = 0; +static BOOL (WINAPI *pSRRemoveRestorePoint)(DWORD); +static BOOL (WINAPI *pSRSetRestorePointA)(RESTOREPOINTINFOA*, STATEMGRSTATUS*); + static const char *msifile = "msitest.msi"; static const char *msifile2 = "winetest2.msi"; static const char *mstfile = "winetest.mst"; @@ -1271,14 +1276,18 @@ static void init_functionpointers(void) { HMODULE hmsi = GetModuleHandleA("msi.dll"); -#define GET_PROC(func) \ - p ## func = (void*)GetProcAddress(hmsi, #func); \ +#define GET_PROC(mod, func) \ + p ## func = (void*)GetProcAddress(mod, #func); \ if(!p ## func) \ trace("GetProcAddress(%s) failed\n", #func); - GET_PROC(MsiQueryComponentStateA); - GET_PROC(MsiSourceListEnumSourcesA); - GET_PROC(MsiSourceListGetInfoA); + GET_PROC(hmsi, MsiQueryComponentStateA); + GET_PROC(hmsi, MsiSourceListEnumSourcesA); + GET_PROC(hmsi, MsiSourceListGetInfoA); + + hsrclient = LoadLibraryA("srclient.dll"); + GET_PROC(hsrclient, SRRemoveRestorePoint); + GET_PROC(hsrclient, SRSetRestorePointA); #undef GET_PROC } @@ -1618,6 +1627,27 @@ static void check_service_is_installed(void) CloseServiceHandle(scm); } +static BOOL notify_system_change(DWORD event_type, STATEMGRSTATUS *status) +{ + RESTOREPOINTINFOA spec; + + spec.dwEventType = event_type; + spec.dwRestorePtType = APPLICATION_INSTALL; + spec.llSequenceNumber = status->llSequenceNumber; + lstrcpyA(spec.szDescription, "msitest restore point"); + + return pSRSetRestorePointA(&spec, status); +} + +static void remove_restore_point(DWORD seq_number) +{ + DWORD res; + + res = pSRRemoveRestorePoint(seq_number); + if (res != ERROR_SUCCESS) + trace("Failed to remove the restore point : %08x\n", res); +} + static void test_MsiInstallProduct(void) { UINT r; @@ -1776,6 +1806,8 @@ static void test_packagecoltypes(void) MsiCloseHandle(rec); MsiCloseHandle(view); MsiCloseHandle(hdb); + CoUninitialize(); + DeleteFile(msifile); } @@ -5400,6 +5432,8 @@ START_TEST(install) { DWORD len; char temp_path[MAX_PATH], prev_path[MAX_PATH]; + STATEMGRSTATUS status; + BOOL ret = FALSE; init_functionpointers(); @@ -5415,6 +5449,15 @@ START_TEST(install) get_program_files_dir(PROG_FILES_DIR, COMMON_FILES_DIR); + /* Create a restore point ourselves so we circumvent the multitude of restore points + * that would have been created by all the installation and removal tests. + */ + if (pSRSetRestorePointA) + { + memset(&status, 0, sizeof(status)); + ret = notify_system_change(BEGIN_NESTED_SYSTEM_CHANGE, &status); + } + test_MsiInstallProduct(); test_MsiSetComponentState(); test_packagecoltypes(); @@ -5451,5 +5494,13 @@ START_TEST(install) test_MsiConfigureProductEx(); test_missingcomponent(); + if (pSRSetRestorePointA && ret) + { + ret = notify_system_change(END_NESTED_SYSTEM_CHANGE, &status); + if (ret) + remove_restore_point(status.llSequenceNumber); + } + FreeLibrary(hsrclient); + SetCurrentDirectoryA(prev_path); } diff --git a/dlls/msimtf/main.c b/dlls/msimtf/main.c index da675aa18a2..45edf533c37 100644 --- a/dlls/msimtf/main.c +++ b/dlls/msimtf/main.c @@ -168,7 +168,7 @@ static HRESULT register_server(BOOL doregister) STRTABLEA strtable; STRENTRYA pse[1]; static CLSID const *clsids[34]; - int i = 0; + unsigned int i = 0; static const WCHAR wszAdvpack[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; diff --git a/dlls/mstask/mstask_main.c b/dlls/mstask/mstask_main.c index c7b3dea5a1b..df1f1d8c5e6 100644 --- a/dlls/mstask/mstask_main.c +++ b/dlls/mstask/mstask_main.c @@ -88,7 +88,7 @@ static HRESULT init_register_strtable(STRTABLEA *strtable) }; #undef CLSID_EXPANSION_ENTRY static STRENTRYA pse[sizeof expns / sizeof expns[0]]; - int i; + unsigned int i; strtable->cEntries = sizeof pse / sizeof pse[0]; strtable->pse = pse; @@ -114,7 +114,7 @@ static HRESULT init_register_strtable(STRTABLEA *strtable) static void cleanup_register_strtable(STRTABLEA *strtable) { - int i; + unsigned int i; for (i = 0; i < strtable->cEntries; i++) { HeapFree(GetProcessHeap(), 0, strtable->pse[i].pszName); diff --git a/dlls/mstask/tests/task.c b/dlls/mstask/tests/task.c index 820b962948f..7cb76737ed8 100644 --- a/dlls/mstask/tests/task.c +++ b/dlls/mstask/tests/task.c @@ -126,7 +126,7 @@ static void test_SetApplicationName_GetApplicationName(void) CoTaskMemFree(stored_name); } - /* Set application name to a non-existent application and then get + /* Set application name to a nonexistent application and then get * the application name that is actually stored */ hres = ITask_SetApplicationName(test_task, non_application_name); ok(hres == S_OK, "Failed setting name %s: %08x\n", @@ -170,8 +170,8 @@ static void test_SetApplicationName_GetApplicationName(void) CoTaskMemFree(stored_name); } - /* After having a valid application name set, set application name - * to a non-existant application and then get the name that is + /* After having a valid application name set, set application the name + * to a nonexistent application and then get the name that is * actually stored */ hres = ITask_SetApplicationName(test_task, non_application_name); ok(hres == S_OK, "Failed setting name %s: %08x\n", diff --git a/dlls/mstask/tests/task_scheduler.c b/dlls/mstask/tests/task_scheduler.c index af3a565cf65..2de0e160496 100644 --- a/dlls/mstask/tests/task_scheduler.c +++ b/dlls/mstask/tests/task_scheduler.c @@ -93,7 +93,7 @@ static void test_Activate(void) return; } - /* Attempt to Activate a non-existant task */ + /* Attempt to activate a nonexistent task */ hres = ITaskScheduler_Activate(test_task_scheduler, not_task_name, &IID_ITask, (IUnknown**)&task); ok(hres == COR_E_FILENOTFOUND, "Expected COR_E_FILENOTFOUND: %08x\n", hres); diff --git a/dlls/msvcrt/tests/printf.c b/dlls/msvcrt/tests/printf.c index d7abacd966d..1603893a811 100644 --- a/dlls/msvcrt/tests/printf.c +++ b/dlls/msvcrt/tests/printf.c @@ -390,9 +390,18 @@ static void test_sprintf( void ) format = "asdf%n"; x = 0; r = sprintf(buffer, format, &x ); - ok(x == 4, "should write to x\n"); - ok(!strcmp(buffer,"asdf"), "failed\n"); - ok( r==4, "return count wrong\n"); + if (r == -1) + { + /* %n format is disabled by default on vista */ + /* FIXME: should test with _set_printf_count_output */ + ok(x == 0, "should not write to x: %d\n", x); + } + else + { + ok(x == 4, "should write to x: %d\n", x); + ok(!strcmp(buffer,"asdf"), "failed\n"); + ok( r==4, "return count wrong: %d\n", r); + } format = "%-1d"; r = sprintf(buffer, format,2); diff --git a/dlls/msvfw32/msvfw32_Zh.rc b/dlls/msvfw32/msvfw32_Zh.rc new file mode 100644 index 00000000000..29dc42fdff7 --- /dev/null +++ b/dlls/msvfw32/msvfw32_Zh.rc @@ -0,0 +1,92 @@ +/* + * msvfw32 (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "视频压缩" +FONT 9, "MS Song" +{ + DEFPUSHBUTTON "确定",IDOK,129,2,49,14 + PUSHBUTTON "取消",IDCANCEL,129,18,49,14 + + LTEXT "压缩器(&C):",-1,9,6,105,8 + COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP + + PUSHBUTTON "配置(&F)...",882,129,36,49,14 + PUSHBUTTON "关于(&A)...",883,129,52,49,14 + + SCROLLBAR 884,9,44,111,9,WS_TABSTOP + + LTEXT "压缩质量(&Q):",886,9,34,80,8 + + CONTROL "关键帧/每(&K)",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12 + EDITTEXT 888,78,60,22,12 + LTEXT "帧",889,103,62,26,10 + + CONTROL "数据速度(&D)",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12 + EDITTEXT 895,78,76,22,12 + LTEXT "KB/sec",896,102,78,26,10 +} + +STRINGTABLE DISCARDABLE +{ + IDS_FULLFRAMES "全帧(未压缩)" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +ICM_CHOOSE_COMPRESSOR DIALOG DISCARDABLE 36, 24, 187, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "視頻壓縮" +FONT 8, "PMingLiu" +{ + DEFPUSHBUTTON "確定",IDOK,129,2,49,14 + PUSHBUTTON "取消",IDCANCEL,129,18,49,14 + + LTEXT "壓縮器(&C):",-1,9,6,105,8 + COMBOBOX 880,9,16,111,67,CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP + + PUSHBUTTON "配置(&F)...",882,129,36,49,14 + PUSHBUTTON "關於(&A)...",883,129,52,49,14 + + SCROLLBAR 884,9,44,111,9,WS_TABSTOP + + LTEXT "壓縮質量(&Q):",886,9,34,80,8 + + CONTROL "關鍵幀/每(&K)",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12 + EDITTEXT 888,78,60,22,12 + LTEXT "幀",889,103,62,26,10 + + CONTROL "數據速度(&D)",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12 + EDITTEXT 895,78,76,22,12 + LTEXT "KB/sec",896,102,78,26,10 +} + +STRINGTABLE DISCARDABLE +{ + IDS_FULLFRAMES "全幀(未壓縮)" +} + +#pragma code_page(default) diff --git a/dlls/msvfw32/msvideo_main.c b/dlls/msvfw32/msvideo_main.c index baea47b9264..a135db2c47b 100644 --- a/dlls/msvfw32/msvideo_main.c +++ b/dlls/msvfw32/msvideo_main.c @@ -102,7 +102,7 @@ static int compare_fourcc(DWORD fcc1, DWORD fcc2) return strncasecmp(fcc_str1, fcc_str2, 4); } -typedef BOOL (*enum_handler_t)(const char*, int, void*); +typedef BOOL (*enum_handler_t)(const char*, unsigned int, void*); static BOOL enum_drivers(DWORD fccType, enum_handler_t handler, void* param) { @@ -173,7 +173,7 @@ DWORD WINAPI VideoForWindowsVersion(void) return 0x040003B6; /* 4.950 */ } -static BOOL ICInfo_enum_handler(const char *drv, int nr, void *param) +static BOOL ICInfo_enum_handler(const char *drv, unsigned int nr, void *param) { ICINFO *lpicinfo = (ICINFO *)param; DWORD fccHandler = mmioStringToFOURCCA(drv + 5, 0); @@ -519,7 +519,7 @@ static HIC try_driver(driver_info_t *info) return 0; } -static BOOL ICLocate_enum_handler(const char *drv, int nr, void *param) +static BOOL ICLocate_enum_handler(const char *drv, unsigned int nr, void *param) { driver_info_t *info = (driver_info_t *)param; info->fccHandler = mmioStringToFOURCCA(drv + 5, 0); diff --git a/dlls/msvfw32/rsrc.rc b/dlls/msvfw32/rsrc.rc index 4246fdf8a6e..62f4241e310 100644 --- a/dlls/msvfw32/rsrc.rc +++ b/dlls/msvfw32/rsrc.rc @@ -34,3 +34,4 @@ #include "msvfw32_Si.rc" #include "msvfw32_Sv.rc" #include "msvfw32_Tr.rc" +#include "msvfw32_Zh.rc" diff --git a/dlls/msxml3/dispex.c b/dlls/msxml3/dispex.c index 438cf48b077..0ccda74bca2 100644 --- a/dlls/msxml3/dispex.c +++ b/dlls/msxml3/dispex.c @@ -79,6 +79,7 @@ static REFIID tid_ids[] = { &IID_IXMLDOMAttribute, &IID_IXMLDOMCDATASection, &IID_IXMLDOMComment, + &IID_IXMLDOMDocument, &IID_IXMLDOMDocument2, &IID_IXMLDOMDocumentFragment, &IID_IXMLDOMElement, diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c index 61f01f1fdb7..3c5aedef483 100644 --- a/dlls/msxml3/domdoc.c +++ b/dlls/msxml3/domdoc.c @@ -36,6 +36,7 @@ #include "shlwapi.h" #include "ocidl.h" #include "objsafe.h" +#include "dispex.h" #include "wine/debug.h" @@ -75,6 +76,9 @@ typedef struct _domdoc /* IObjectSafety */ DWORD safeopt; + + /* IDispatchEx */ + DispatchEx dispex; } domdoc; static xmlDocPtr doparse( char *ptr, int len ) @@ -290,6 +294,10 @@ static HRESULT WINAPI domdoc_QueryInterface( IXMLDOMDocument2 *iface, REFIID rii { *ppvObject = (IObjectWithSite*)&(This->lpvtblIObjectWithSite); } + else if(dispex_query_interface(&This->dispex, riid, ppvObject)) + { + return *ppvObject ? S_OK : E_NOINTERFACE; + } else if(IsEqualGUID(&IID_IRunnableObject, riid)) { TRACE("IID_IRunnableObject not supported returning NULL\n"); @@ -1475,7 +1483,7 @@ static HRESULT WINAPI domdoc_save( IXMLDOMDocument_Release(pDocument); } - TRACE("ret %d", ret); + TRACE("ret %d\n", ret); return ret; } @@ -1967,6 +1975,20 @@ static const IObjectSafetyVtbl domdocObjectSafetyVtbl = { xmldoc_Safety_SetInterfaceSafetyOptions }; + +static const tid_t domdoc_iface_tids[] = { + IXMLDOMNode_tid, + IXMLDOMDocument_tid, + IXMLDOMDocument2_tid, + 0 +}; +static dispex_static_data_t domdoc_dispex = { + NULL, + IXMLDOMDocument2_tid, + NULL, + domdoc_iface_tids +}; + HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **document) { domdoc *doc; @@ -2007,6 +2029,9 @@ HRESULT DOMDocument_create_from_xmldoc(xmlDocPtr xmldoc, IXMLDOMDocument2 **docu HeapFree( GetProcessHeap(), 0, doc ); return E_FAIL; } + + init_dispex(&doc->dispex, (IUnknown*)&doc->lpVtbl, &domdoc_dispex); + /* The ref on doc->node is actually looped back into this object, so release it */ IXMLDOMNode_Release(doc->node); diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index ae3a4e6cbd2..55b84dfa1d8 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -107,6 +107,7 @@ typedef enum tid_t { IXMLDOMAttribute_tid, IXMLDOMCDATASection_tid, IXMLDOMComment_tid, + IXMLDOMDocument_tid, IXMLDOMDocument2_tid, IXMLDOMDocumentFragment_tid, IXMLDOMElement_tid, diff --git a/dlls/msxml3/node.c b/dlls/msxml3/node.c index 68bf8818a45..ee409c46c05 100644 --- a/dlls/msxml3/node.c +++ b/dlls/msxml3/node.c @@ -802,7 +802,7 @@ static HRESULT WINAPI xmlnode_get_nodeTypeString( str = (const xmlChar*) "text"; break; default: - FIXME("nodeName not mapped correctly (%d)\n", This->node->type); + FIXME("Unknown node type (%d)\n", This->node->type); str = This->node->name; break; } diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c index 8af6b02dda1..2bff3725cea 100644 --- a/dlls/msxml3/tests/domdoc.c +++ b/dlls/msxml3/tests/domdoc.c @@ -1877,6 +1877,7 @@ static void test_IXMLDOMDocument2(void) BSTR str; IXMLDOMDocument *doc; IXMLDOMDocument2 *doc2; + IDispatchEx *dispex; VARIANT var; int ref; @@ -1895,6 +1896,13 @@ static void test_IXMLDOMDocument2(void) ok( r == S_OK, "ret %08x\n", r ); ok( doc == (IXMLDOMDocument*)doc2, "interfaces differ\n"); + r = IXMLDOMDocument_QueryInterface( doc, &IID_IDispatchEx, (void**)&dispex ); + ok( r == S_OK, "ret %08x\n", r ); + if(r == S_OK) + { + IDispatchEx_Release(dispex); + } + /* we will check if the variant got cleared */ ref = IXMLDOMDocument2_AddRef(doc2); expect_eq(ref, 3, int, "%d"); /* doc, doc2, AddRef*/ diff --git a/dlls/msxml3/tests/saxreader.c b/dlls/msxml3/tests/saxreader.c index 0ff0fdf7e7f..2865f531e05 100644 --- a/dlls/msxml3/tests/saxreader.c +++ b/dlls/msxml3/tests/saxreader.c @@ -140,7 +140,7 @@ static void test_saxstr(unsigned line, const WCHAR *szStr, int nStr, const char if(len != nStr) return; - MultiByteToWideChar(CP_ACP, 0, szTest, -1, buf, sizeof(buf)); + MultiByteToWideChar(CP_ACP, 0, szTest, -1, buf, sizeof(buf)/sizeof(WCHAR)); ok_(__FILE__,line) (!memcmp(szStr, buf, len*sizeof(WCHAR)), "unexpected szStr %s, expected %s\n", debugstr_wn(szStr, nStr), szTest); } @@ -477,7 +477,7 @@ static void test_saxreader(void) LARGE_INTEGER liPos; ULONG bytesWritten; HANDLE file; - + static const CHAR testXmlA[] = "test.xml"; static const WCHAR testXmlW[] = {'t','e','s','t','.','x','m','l',0}; hr = CoCreateInstance(&CLSID_SAXXMLReader, NULL, CLSCTX_INPROC_SERVER, @@ -564,7 +564,7 @@ static void test_saxreader(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); test_expect_call(CH_ENDTEST); - file = CreateFileW(testXmlW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + file = CreateFileA(testXmlA, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "Could not create file: %u\n", GetLastError()); WriteFile(file, szTestXML, sizeof(szTestXML)-1, &bytesWritten, NULL); CloseHandle(file); @@ -574,7 +574,7 @@ static void test_saxreader(void) ok(hr == S_OK, "Expected S_OK, got %08x\n", hr); test_expect_call(CH_ENDTEST); - DeleteFileW(testXmlW); + DeleteFileA(testXmlA); ISAXXMLReader_Release(reader); } diff --git a/dlls/msxml3/tests/xmldoc.c b/dlls/msxml3/tests/xmldoc.c index 41b17618ddc..2058d7dee0d 100644 --- a/dlls/msxml3/tests/xmldoc.c +++ b/dlls/msxml3/tests/xmldoc.c @@ -350,4 +350,6 @@ START_TEST(xmldoc) test_xmldoc(); test_createElement(); + + CoUninitialize(); } diff --git a/dlls/msxml3/tests/xmlelem.c b/dlls/msxml3/tests/xmlelem.c index 00b9f3d6db3..27c09c7471a 100644 --- a/dlls/msxml3/tests/xmlelem.c +++ b/dlls/msxml3/tests/xmlelem.c @@ -260,13 +260,13 @@ static void test_xmlelem_collection(void) IXMLElement *element = NULL, *child; IXMLElementCollection *collection = NULL; IEnumVARIANT *enumVar = NULL; + CHAR pathA[MAX_PATH]; WCHAR path[MAX_PATH]; long length, type; ULONG num_vars; VARIANT var, vIndex, vName; BSTR url, str; - - static const WCHAR szBankXML[] = {'b','a','n','k','.','x','m','l',0}; + static const CHAR szBankXML[] = "bank.xml"; static const WCHAR szNumber[] = {'N','U','M','B','E','R',0}; static const WCHAR szName[] = {'N','A','M','E',0}; @@ -278,13 +278,13 @@ static void test_xmlelem_collection(void) return; } - create_xml_file("bank.xml"); - GetFullPathNameW(szBankXML, MAX_PATH, path, NULL); + create_xml_file(szBankXML); + GetFullPathNameA(szBankXML, MAX_PATH, pathA, NULL); + MultiByteToWideChar(CP_ACP, 0, pathA, -1, path, MAX_PATH); url = SysAllocString(path); hr = IXMLDocument_put_URL(doc, url); - /* Win98 returns ERROR_URL_NOT_FOUND */ - ok(hr == S_OK || hr == ERROR_URL_NOT_FOUND, "Expected S_OK, got 0x%08x\n", hr); + ok(hr == S_OK, "Expected S_OK, got 0x%08x\n", hr); SysFreeString(url); if(hr != S_OK) @@ -454,4 +454,6 @@ START_TEST(xmlelem) test_xmlelem(); test_xmlelem_collection(); + + CoUninitialize(); } diff --git a/dlls/netapi32/tests/access.c b/dlls/netapi32/tests/access.c index f8536a72fbf..3999bdd33ef 100644 --- a/dlls/netapi32/tests/access.c +++ b/dlls/netapi32/tests/access.c @@ -257,7 +257,9 @@ static void run_userhandling_tests(void) ok(ret == NERR_Success, "Deleting the user failed : %d\n", ret); } else - ok(ret == NERR_BadUsername, "Adding user with too long username returned 0x%08x\n", ret); + ok(ret == NERR_BadUsername || + broken(ret == NERR_PasswordTooShort), /* NT4 */ + "Adding user with too long username returned 0x%08x\n", ret); usri.usri1_name = sTestUserName; usri.usri1_password = sTooLongPassword; @@ -293,7 +295,9 @@ static void run_userhandling_tests(void) return; } - ok(ret == NERR_Success, "Adding user failed with error 0x%08x\n", ret); + ok(ret == NERR_Success || + broken(ret == NERR_PasswordTooShort), /* NT4 */ + "Adding user failed with error 0x%08x\n", ret); if(ret != NERR_Success) return; diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index 18b83091a5d..3ca17555dbf 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -96,21 +96,30 @@ NTSTATUS WINAPI NtOpenProcessToken( DWORD DesiredAccess, HANDLE *TokenHandle) { + return NtOpenProcessTokenEx( ProcessHandle, DesiredAccess, 0, TokenHandle ); +} + +/****************************************************************************** + * NtOpenProcessTokenEx [NTDLL.@] + * ZwOpenProcessTokenEx [NTDLL.@] + */ +NTSTATUS WINAPI NtOpenProcessTokenEx( HANDLE process, DWORD access, DWORD attributes, + HANDLE *handle ) +{ NTSTATUS ret; - TRACE("(%p,0x%08x,%p)\n", ProcessHandle,DesiredAccess, TokenHandle); + TRACE("(%p,0x%08x,0x%08x,%p)\n", process, access, attributes, handle); SERVER_START_REQ( open_token ) { - req->handle = ProcessHandle; - req->access = DesiredAccess; - req->attributes = 0; + req->handle = process; + req->access = access; + req->attributes = attributes; req->flags = 0; ret = wine_server_call( req ); - if (!ret) *TokenHandle = reply->token; + if (!ret) *handle = reply->token; } SERVER_END_REQ; - return ret; } @@ -124,20 +133,29 @@ NTSTATUS WINAPI NtOpenThreadToken( BOOLEAN OpenAsSelf, HANDLE *TokenHandle) { + return NtOpenThreadTokenEx( ThreadHandle, DesiredAccess, OpenAsSelf, 0, TokenHandle ); +} + +/****************************************************************************** + * NtOpenThreadTokenEx [NTDLL.@] + * ZwOpenThreadTokenEx [NTDLL.@] + */ +NTSTATUS WINAPI NtOpenThreadTokenEx( HANDLE thread, DWORD access, BOOLEAN as_self, DWORD attributes, + HANDLE *handle ) +{ NTSTATUS ret; - TRACE("(%p,0x%08x,0x%08x,%p)\n", - ThreadHandle,DesiredAccess, OpenAsSelf, TokenHandle); + TRACE("(%p,0x%08x,%u,0x%08x,%p)\n", thread, access, as_self, attributes, handle ); SERVER_START_REQ( open_token ) { - req->handle = ThreadHandle; - req->access = DesiredAccess; - req->attributes = 0; + req->handle = thread; + req->access = access; + req->attributes = attributes; req->flags = OPEN_TOKEN_THREAD; - if (OpenAsSelf) req->flags |= OPEN_TOKEN_AS_SELF; + if (as_self) req->flags |= OPEN_TOKEN_AS_SELF; ret = wine_server_call( req ); - if (!ret) *TokenHandle = reply->token; + if (!ret) *handle = reply->token; } SERVER_END_REQ; diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index e18f3a37ff5..617d25d0d0d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -105,7 +105,7 @@ @ stdcall NtAllocateUuids(ptr ptr ptr) @ stdcall NtAllocateVirtualMemory(long ptr ptr ptr long long) @ stdcall NtAreMappedFilesTheSame(ptr ptr) -# @ stub NtAssignProcessToJobObject +@ stdcall NtAssignProcessToJobObject(long long) @ stub NtCallbackReturn # @ stub NtCancelDeviceWakeupRequest @ stdcall NtCancelIoFile(long ptr) @@ -125,7 +125,7 @@ @ stub NtCreateEventPair @ stdcall NtCreateFile(ptr long ptr ptr long long long ptr long long ptr) @ stdcall NtCreateIoCompletion(ptr long ptr long) -# @ stub NtCreateJobObject +@ stdcall NtCreateJobObject(ptr long ptr) # @ stub NtCreateJobSet @ stdcall NtCreateKey(ptr long ptr long ptr long long) # @ stub NtCreateKeyedEvent @@ -184,7 +184,7 @@ @ stub NtImpersonateThread @ stub NtInitializeRegistry @ stdcall NtInitiatePowerAction (long long long long) -# @ stub NtIsProcessInJob +@ stdcall NtIsProcessInJob(long long) # @ stub NtIsSystemResumeAutomatic @ stdcall NtListenPort(ptr ptr) @ stdcall NtLoadDriver(ptr) @@ -208,20 +208,20 @@ @ stub NtOpenEventPair @ stdcall NtOpenFile(ptr long ptr ptr long long) @ stdcall NtOpenIoCompletion(ptr long ptr) -# @ stub NtOpenJobObject +@ stdcall NtOpenJobObject(ptr long ptr) @ stdcall NtOpenKey(ptr long ptr) # @ stub NtOpenKeyedEvent @ stdcall NtOpenMutant(ptr long ptr) @ stub NtOpenObjectAuditAlarm @ stdcall NtOpenProcess(ptr long ptr ptr) -@ stdcall NtOpenProcessToken(long long long) -# @ stub NtOpenProcessTokenEx +@ stdcall NtOpenProcessToken(long long ptr) +@ stdcall NtOpenProcessTokenEx(long long long ptr) @ stdcall NtOpenSection(ptr long ptr) @ stdcall NtOpenSemaphore(long long ptr) @ stdcall NtOpenSymbolicLinkObject (ptr long ptr) @ stdcall NtOpenThread(ptr long ptr ptr) -@ stdcall NtOpenThreadToken(long long long long) -# @ stub NtOpenThreadTokenEx +@ stdcall NtOpenThreadToken(long long long ptr) +@ stdcall NtOpenThreadTokenEx(long long long long ptr) @ stdcall NtOpenTimer(ptr long ptr) @ stub NtPlugPlayControl @ stdcall NtPowerInformation(long ptr long ptr long) @@ -243,7 +243,7 @@ @ stdcall NtQueryFullAttributesFile(ptr ptr) @ stdcall NtQueryInformationAtom(long long ptr long ptr) @ stdcall NtQueryInformationFile(long ptr ptr long long) -# @ stub NtQueryInformationJobObject +@ stdcall NtQueryInformationJobObject(long long ptr long ptr) @ stub NtQueryInformationPort @ stdcall NtQueryInformationProcess(long long ptr long ptr) @ stdcall NtQueryInformationThread(long long ptr long ptr) @@ -321,7 +321,7 @@ @ stub NtSetHighWaitLowThread # @ stub NtSetInformationDebugObject @ stdcall NtSetInformationFile(long long long long long) -# @ stub NtSetInformationJobObject +@ stdcall NtSetInformationJobObject(long long ptr long) @ stdcall NtSetInformationKey(long long ptr long) @ stdcall NtSetInformationObject(long long ptr long) @ stdcall NtSetInformationProcess(long long long long) @@ -353,7 +353,7 @@ # @ stub NtSuspendProcess @ stdcall NtSuspendThread(long ptr) @ stub NtSystemDebugControl -# @ stub NtTerminateJobObject +@ stdcall NtTerminateJobObject(long long) @ stdcall NtTerminateProcess(long long) @ stdcall NtTerminateThread(long long) @ stub NtTestAlert @@ -950,7 +950,7 @@ @ stdcall ZwAllocateUuids(ptr ptr ptr) NtAllocateUuids @ stdcall ZwAllocateVirtualMemory(long ptr ptr ptr long long) NtAllocateVirtualMemory @ stdcall ZwAreMappedFilesTheSame(ptr ptr) NtAreMappedFilesTheSame -# @ stub ZwAssignProcessToJobObject +@ stdcall ZwAssignProcessToJobObject(long long) NtAssignProcessToJobObject @ stub ZwCallbackReturn # @ stub ZwCancelDeviceWakeupRequest @ stdcall ZwCancelIoFile(long ptr) NtCancelIoFile @@ -970,7 +970,7 @@ @ stub ZwCreateEventPair @ stdcall ZwCreateFile(ptr long ptr ptr long long long ptr long long ptr) NtCreateFile @ stdcall ZwCreateIoCompletion(ptr long ptr long) NtCreateIoCompletion -# @ stub ZwCreateJobObject +@ stdcall ZwCreateJobObject(ptr long ptr) NtCreateJobObject # @ stub ZwCreateJobSet @ stdcall ZwCreateKey(ptr long ptr long ptr long long) NtCreateKey # @ stub ZwCreateKeyedEvent @@ -1028,7 +1028,7 @@ @ stub ZwImpersonateThread @ stub ZwInitializeRegistry @ stdcall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction -# @ stub ZwIsProcessInJob +@ stdcall ZwIsProcessInJob(long long) NtIsProcessInJob # @ stub ZwIsSystemResumeAutomatic @ stdcall ZwListenPort(ptr ptr) NtListenPort @ stdcall ZwLoadDriver(ptr) NtLoadDriver @@ -1052,20 +1052,20 @@ @ stub ZwOpenEventPair @ stdcall ZwOpenFile(ptr long ptr ptr long long) NtOpenFile @ stdcall ZwOpenIoCompletion(ptr long ptr) NtOpenIoCompletion -# @ stub ZwOpenJobObject +@ stdcall ZwOpenJobObject(ptr long ptr) NtOpenJobObject @ stdcall ZwOpenKey(ptr long ptr) NtOpenKey # @ stub ZwOpenKeyedEvent @ stdcall ZwOpenMutant(ptr long ptr) NtOpenMutant @ stub ZwOpenObjectAuditAlarm @ stdcall ZwOpenProcess(ptr long ptr ptr) NtOpenProcess -@ stdcall ZwOpenProcessToken(long long long) NtOpenProcessToken -# @ stub ZwOpenProcessTokenEx +@ stdcall ZwOpenProcessToken(long long ptr) NtOpenProcessToken +@ stdcall ZwOpenProcessTokenEx(long long long ptr) NtOpenProcessTokenEx @ stdcall ZwOpenSection(ptr long ptr) NtOpenSection @ stdcall ZwOpenSemaphore(long long ptr) NtOpenSemaphore @ stdcall ZwOpenSymbolicLinkObject (ptr long ptr) NtOpenSymbolicLinkObject @ stdcall ZwOpenThread(ptr long ptr ptr) NtOpenThread -@ stdcall ZwOpenThreadToken(long long long long) NtOpenThreadToken -# @ stub ZwOpenThreadTokenEx +@ stdcall ZwOpenThreadToken(long long long ptr) NtOpenThreadToken +@ stdcall ZwOpenThreadTokenEx(long long long long ptr) NtOpenThreadTokenEx @ stdcall ZwOpenTimer(ptr long ptr) NtOpenTimer @ stub ZwPlugPlayControl @ stdcall ZwPowerInformation(long ptr long ptr long) NtPowerInformation @@ -1087,7 +1087,7 @@ @ stdcall ZwQueryFullAttributesFile(ptr ptr) NtQueryFullAttributesFile @ stdcall ZwQueryInformationAtom(long long ptr long ptr) NtQueryInformationAtom @ stdcall ZwQueryInformationFile(long ptr ptr long long) NtQueryInformationFile -# @ stub ZwQueryInformationJobObject +@ stdcall ZwQueryInformationJobObject(long long ptr long ptr) NtQueryInformationJobObject @ stub ZwQueryInformationPort @ stdcall ZwQueryInformationProcess(long long ptr long ptr) NtQueryInformationProcess @ stdcall ZwQueryInformationThread(long long ptr long ptr) NtQueryInformationThread @@ -1165,7 +1165,7 @@ @ stub ZwSetHighWaitLowThread # @ stub ZwSetInformationDebugObject @ stdcall ZwSetInformationFile(long long long long long) NtSetInformationFile -# @ stub ZwSetInformationJobObject +@ stdcall ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject @ stdcall ZwSetInformationKey(long long ptr long) NtSetInformationKey @ stdcall ZwSetInformationObject(long long ptr long) NtSetInformationObject @ stdcall ZwSetInformationProcess(long long long long) NtSetInformationProcess @@ -1197,7 +1197,7 @@ # @ stub ZwSuspendProcess @ stdcall ZwSuspendThread(long ptr) NtSuspendThread @ stub ZwSystemDebugControl -# @ stub ZwTerminateJobObject +@ stdcall ZwTerminateJobObject(long long) NtTerminateJobObject @ stdcall ZwTerminateProcess(long long) NtTerminateProcess @ stdcall ZwTerminateThread(long long) NtTerminateThread @ stub ZwTestAlert diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c index 2a09390d747..3179d9c85c3 100644 --- a/dlls/ntdll/process.c +++ b/dlls/ntdll/process.c @@ -389,6 +389,28 @@ NTSTATUS WINAPI NtSetInformationProcess( SERVER_END_REQ; } break; + + case ProcessExecuteFlags: + if (ProcessInformationLength != sizeof(ULONG)) + return STATUS_INVALID_PARAMETER; + else + { + BOOL enable; + switch (*(ULONG *)ProcessInformation & (MEM_EXECUTE_OPTION_ENABLE|MEM_EXECUTE_OPTION_DISABLE)) + { + case MEM_EXECUTE_OPTION_ENABLE: + enable = FALSE; + break; + case MEM_EXECUTE_OPTION_DISABLE: + enable = TRUE; + break; + default: + return STATUS_INVALID_PARAMETER; + } + VIRTUAL_SetForceExec( enable ); + } + break; + default: FIXME("(%p,0x%08x,%p,0x%08x) stub\n", ProcessHandle,ProcessInformationClass,ProcessInformation, diff --git a/dlls/ntdll/sync.c b/dlls/ntdll/sync.c index fb653daf2a5..0f39a80c44e 100644 --- a/dlls/ntdll/sync.c +++ b/dlls/ntdll/sync.c @@ -512,6 +512,82 @@ NTSTATUS WINAPI NtQueryMutant(IN HANDLE handle, } /* + * Jobs + */ + +/****************************************************************************** + * NtCreateJobObject [NTDLL.@] + * ZwCreateJobObject [NTDLL.@] + */ +NTSTATUS WINAPI NtCreateJobObject( PHANDLE handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr ) +{ + FIXME( "stub: %p %x %s\n", handle, access, attr ? debugstr_us(attr->ObjectName) : "" ); + *handle = (HANDLE)0xdead; + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtOpenJobObject [NTDLL.@] + * ZwOpenJobObject [NTDLL.@] + */ +NTSTATUS WINAPI NtOpenJobObject( PHANDLE handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr ) +{ + FIXME( "stub: %p %x %s\n", handle, access, attr ? debugstr_us(attr->ObjectName) : "" ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtTerminateJobObject [NTDLL.@] + * ZwTerminateJobObject [NTDLL.@] + */ +NTSTATUS WINAPI NtTerminateJobObject( HANDLE handle, NTSTATUS status ) +{ + FIXME( "stub: %p %x\n", handle, status ); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtQueryInformationJobObject [NTDLL.@] + * ZwQueryInformationJobObject [NTDLL.@] + */ +NTSTATUS WINAPI NtQueryInformationJobObject( HANDLE handle, JOBOBJECTINFOCLASS class, PVOID info, + ULONG len, PULONG ret_len ) +{ + FIXME( "stub: %p %u %p %u %p\n", handle, class, info, len, ret_len ); + return STATUS_NOT_IMPLEMENTED; +} + +/****************************************************************************** + * NtSetInformationJobObject [NTDLL.@] + * ZwSetInformationJobObject [NTDLL.@] + */ +NTSTATUS WINAPI NtSetInformationJobObject( HANDLE handle, JOBOBJECTINFOCLASS class, PVOID info, ULONG len ) +{ + FIXME( "stub: %p %u %p %u\n", handle, class, info, len ); + return STATUS_SUCCESS; +} + +/****************************************************************************** + * NtIsProcessInJob [NTDLL.@] + * ZwIsProcessInJob [NTDLL.@] + */ +NTSTATUS WINAPI NtIsProcessInJob( HANDLE process, HANDLE job ) +{ + FIXME( "stub: %p %p\n", process, job ); + return STATUS_PROCESS_NOT_IN_JOB; +} + +/****************************************************************************** + * NtAssignProcessToJobObject [NTDLL.@] + * ZwAssignProcessToJobObject [NTDLL.@] + */ +NTSTATUS WINAPI NtAssignProcessToJobObject( HANDLE job, HANDLE process ) +{ + FIXME( "stub: %p %p\n", job, process ); + return STATUS_SUCCESS; +} + +/* * Timers */ diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c index ae0bcefb9c5..b58b1a787dc 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -2,6 +2,7 @@ * * Copyright 2007 Jeff Latimer * Copyright 2007 Andrey Turkin + * Copyright 2008 Jeff Zaroyko * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -38,9 +39,12 @@ #define IO_COMPLETION_ALL_ACCESS 0x001F0003 #endif +static NTSTATUS (WINAPI *pRtlFreeUnicodeString)( PUNICODE_STRING ); static VOID (WINAPI *pRtlInitUnicodeString)( PUNICODE_STRING, LPCWSTR ); +static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)( LPCWSTR, PUNICODE_STRING, PWSTR*, CURDIR* ); static NTSTATUS (WINAPI *pNtCreateMailslotFile)( PHANDLE, ULONG, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, ULONG, ULONG, ULONG, PLARGE_INTEGER ); +static NTSTATUS (WINAPI *pNtDeleteFile)(POBJECT_ATTRIBUTES ObjectAttributes); static NTSTATUS (WINAPI *pNtReadFile)(HANDLE hFile, HANDLE hEvent, PIO_APC_ROUTINE apc, void* apc_user, PIO_STATUS_BLOCK io_status, void* buffer, ULONG length, @@ -136,6 +140,68 @@ static void WINAPI apc( void *arg, IO_STATUS_BLOCK *iosb, ULONG reserved ) ok( !reserved, "reserved is not 0: %x\n", reserved ); } +static void delete_file_test(void) +{ + NTSTATUS ret; + OBJECT_ATTRIBUTES attr; + UNICODE_STRING nameW; + WCHAR pathW[MAX_PATH]; + WCHAR pathsubW[MAX_PATH]; + static const WCHAR testdirW[] = {'n','t','d','e','l','e','t','e','f','i','l','e',0}; + static const WCHAR subdirW[] = {'\\','s','u','b',0}; + + ret = GetTempPathW(MAX_PATH, pathW); + if (!ret) + { + ok(0, "couldn't get temp dir\n"); + return; + } + if (ret + sizeof(testdirW)/sizeof(WCHAR)-1 + sizeof(subdirW)/sizeof(WCHAR)-1 >= MAX_PATH) + { + ok(0, "MAX_PATH exceeded in constructing paths\n"); + return; + } + + lstrcatW(pathW, testdirW); + lstrcpyW(pathsubW, pathW); + lstrcatW(pathsubW, subdirW); + + ret = CreateDirectoryW(pathW, NULL); + ok(ret == TRUE, "couldn't create directory ntdeletefile\n"); + if (!pRtlDosPathNameToNtPathName_U(pathW, &nameW, NULL, NULL)) + { + ok(0,"RtlDosPathNametoNtPathName_U failed\n"); + return; + } + + attr.Length = sizeof(attr); + attr.RootDirectory = 0; + attr.Attributes = OBJ_CASE_INSENSITIVE; + attr.ObjectName = &nameW; + attr.SecurityDescriptor = NULL; + attr.SecurityQualityOfService = NULL; + + /* test NtDeleteFile on an empty directory */ + ret = pNtDeleteFile(&attr); + ok(ret == STATUS_SUCCESS, "NtDeleteFile should succeed in removing an empty directory\n"); + ret = RemoveDirectoryW(pathW); + ok(ret == FALSE, "expected to fail removing directory, NtDeleteFile should have removed it\n"); + + /* test NtDeleteFile on a non-empty directory */ + ret = CreateDirectoryW(pathW, NULL); + ok(ret == TRUE, "couldn't create directory ntdeletefile ?!\n"); + ret = CreateDirectoryW(pathsubW, NULL); + ok(ret == TRUE, "couldn't create directory subdir\n"); + ret = pNtDeleteFile(&attr); + ok(ret == STATUS_SUCCESS, "expected NtDeleteFile to ret STATUS_SUCCESS\n"); + ret = RemoveDirectoryW(pathsubW); + ok(ret == TRUE, "expected to remove directory ntdeletefile\\sub\n"); + ret = RemoveDirectoryW(pathW); + ok(ret == TRUE, "expected to remove directory ntdeletefile, NtDeleteFile failed.\n"); + + pRtlFreeUnicodeString( &nameW ); +} + static void read_file_test(void) { const char text[] = "foobar"; @@ -623,8 +689,11 @@ START_TEST(file) return; } + pRtlFreeUnicodeString = (void *)GetProcAddress(hntdll, "RtlFreeUnicodeString"); pRtlInitUnicodeString = (void *)GetProcAddress(hntdll, "RtlInitUnicodeString"); + pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(hntdll, "RtlDosPathNameToNtPathName_U"); pNtCreateMailslotFile = (void *)GetProcAddress(hntdll, "NtCreateMailslotFile"); + pNtDeleteFile = (void *)GetProcAddress(hntdll, "NtDeleteFile"); pNtReadFile = (void *)GetProcAddress(hntdll, "NtReadFile"); pNtWriteFile = (void *)GetProcAddress(hntdll, "NtWriteFile"); pNtClose = (void *)GetProcAddress(hntdll, "NtClose"); @@ -635,6 +704,7 @@ START_TEST(file) pNtSetIoCompletion = (void *)GetProcAddress(hntdll, "NtSetIoCompletion"); pNtSetInformationFile = (void *)GetProcAddress(hntdll, "NtSetInformationFile"); + delete_file_test(); read_file_test(); nt_mailslot_test(); test_iocompletion(); diff --git a/dlls/ntdll/tests/path.c b/dlls/ntdll/tests/path.c index 99d94829bcb..bf1271aafc3 100644 --- a/dlls/ntdll/tests/path.c +++ b/dlls/ntdll/tests/path.c @@ -251,7 +251,6 @@ static void test_RtlGetFullPathName_U(void) { "c:/TEST", "c:\\test", "test"}, { "c:/test/file", "c:\\test\\file", "file"}, { "c:/test./file", "c:\\test\\file", "file"}, - { "c:/test../file", "c:\\test.\\file", "file"}, { "c:/test.. /file", "c:\\test.. \\file","file"}, { "c:/test/././file", "c:\\test\\file", "file"}, { "c:/test\\.\\.\\file", "c:\\test\\file", "file"}, @@ -267,6 +266,7 @@ static void test_RtlGetFullPathName_U(void) WCHAR pathbufW[2*MAX_PATH], rbufferW[MAX_PATH]; CHAR rbufferA[MAX_PATH], rfileA[MAX_PATH]; ULONG ret; + NTSTATUS status; WCHAR *file_part; DWORD reslen; UINT len; @@ -292,6 +292,23 @@ static void test_RtlGetFullPathName_U(void) } } + /* "c:/test../file", "c:\\test.\\file", "file"}, */ + pRtlMultiByteToUnicodeN(pathbufW, sizeof(pathbufW), NULL, + "c:/test../file", strlen("c:/test../file") + 1); + ret = pRtlGetFullPathName_U(pathbufW, MAX_PATH, rbufferW, &file_part); + ok(ret == strlen("c:\\test.\\file") * sizeof(WCHAR) || + ret == strlen("c:\\test..\\file") * sizeof(WCHAR), /* Vista */ + "Expected 26 or 28, got %d\n", ret); + status = pRtlUnicodeToMultiByteN(rbufferA, MAX_PATH, &reslen, rbufferW, + (lstrlenW(rbufferW) + 1) * sizeof(WCHAR)); + ok(status == STATUS_SUCCESS, "RtlUnicodeToMultiByteN failed\n"); + ok(!lstrcmpiA(rbufferA, "c:\\test.\\file") || + !lstrcmpiA(rbufferA, "c:\\test..\\file"), + "Expected \"c:\\test.\\file\" or \"c:\\test..\\file\", got \"%s\"\n", rbufferA); + status = pRtlUnicodeToMultiByteN(rfileA, MAX_PATH, &reslen, file_part, + (lstrlenW(file_part) + 1) * sizeof(WCHAR)); + ok(status == STATUS_SUCCESS, "RtlUnicodeToMultiByteN failed\n"); + ok(!lstrcmpiA(rfileA, "file"), "Got \"%s\" expected \"file\"\n", rfileA); } START_TEST(path) diff --git a/dlls/ntdll/tests/rtlstr.c b/dlls/ntdll/tests/rtlstr.c index f4304c8a030..f4442730221 100644 --- a/dlls/ntdll/tests/rtlstr.c +++ b/dlls/ntdll/tests/rtlstr.c @@ -1696,12 +1696,17 @@ static void test_RtlIsTextUnicode(void) WCHAR mixed_controls[] = {'\t',0x9000,0x0d00,'\n',0}; WCHAR *be_unicode; WCHAR *be_unicode_no_controls; + BOOLEAN res; int flags; int i; ok(!pRtlIsTextUnicode(ascii, sizeof(ascii), NULL), "ASCII text detected as Unicode\n"); - ok(pRtlIsTextUnicode(unicode, sizeof(unicode), NULL), "Text should be Unicode\n"); + res = pRtlIsTextUnicode(unicode, sizeof(unicode), NULL); + ok(res || + broken(res == FALSE), /* NT4 */ + "Text should be Unicode\n"); + ok(!pRtlIsTextUnicode(unicode, sizeof(unicode) - 1, NULL), "Text should be Unicode\n"); flags = IS_TEXT_UNICODE_UNICODE_MASK; diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index aff50fd5487..25b3a3241ef 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -31,7 +31,7 @@ #include "windef.h" #include "winternl.h" #include "excpt.h" -#include "ddk/wdm.h" +#include "ddk/ntddk.h" #include "wine/unicode.h" #include "wine/server.h" #include "wine/debug.h" @@ -451,6 +451,45 @@ NTSTATUS WINAPI IoDeleteSymbolicLink( UNICODE_STRING *name ) /*********************************************************************** + * IoGetDeviceObjectPointer (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI IoGetDeviceObjectPointer( UNICODE_STRING *name, ACCESS_MASK access, PFILE_OBJECT *file, PDEVICE_OBJECT *device ) +{ + FIXME( "stub: %s %x %p %p\n", debugstr_us(name), access, file, device ); + return STATUS_NOT_IMPLEMENTED; +} + + +/*********************************************************************** + * IoGetRelatedDeviceObject (NTOSKRNL.EXE.@) + */ +PDEVICE_OBJECT WINAPI IoGetRelatedDeviceObject( PFILE_OBJECT obj ) +{ + FIXME( "stub: %p\n", obj ); + return NULL; +} + + +/*********************************************************************** + * IoRegisterDriverReinitialization (NTOSKRNL.EXE.@) + */ +void WINAPI IoRegisterDriverReinitialization( PDRIVER_OBJECT obj, PDRIVER_REINITIALIZE reinit, PVOID context ) +{ + FIXME( "stub: %p %p %p\n", obj, reinit, context ); +} + + +/*********************************************************************** + * IoRegisterShutdownNotification (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI IoRegisterShutdownNotification( PDEVICE_OBJECT obj ) +{ + FIXME( "stub: %p\n", obj ); + return STATUS_SUCCESS; +} + + +/*********************************************************************** * IofCompleteRequest (NTOSKRNL.EXE.@) */ #ifdef DEFINE_FASTCALL2_ENTRYPOINT @@ -739,6 +778,29 @@ void WINAPI MmResetDriverPaging(PVOID AddrInSection) TRACE("%p\n", AddrInSection); } + + /*********************************************************************** + * ObReferenceObjectByHandle (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI ObReferenceObjectByHandle( HANDLE obj, ACCESS_MASK access, + POBJECT_TYPE type, + KPROCESSOR_MODE mode, PVOID* ptr, + POBJECT_HANDLE_INFORMATION info) +{ + FIXME( "stub: %p %x %p %d %p %p\n", obj, access, type, mode, ptr, info); + return STATUS_NOT_IMPLEMENTED; +} + + +/*********************************************************************** + * ObfDereferenceObject (NTOSKRNL.EXE.@) + */ +void WINAPI ObfDereferenceObject( VOID *obj ) +{ + FIXME( "stub: %p\n", obj ); +} + + /*********************************************************************** * PsCreateSystemThread (NTOSKRNL.EXE.@) */ diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 0bfda7e6685..8f308a2fd61 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -48,7 +48,7 @@ @ stub KefReleaseSpinLockFromDpcLevel @ stub KiAcquireSpinLock @ stub KiReleaseSpinLock -@ stub ObfDereferenceObject +@ stdcall ObfDereferenceObject(ptr) @ stub ObfReferenceObject @ stub RtlPrefetchMemoryNonTemporal @ cdecl -i386 -norelay RtlUlongByteSwap() ntdll.RtlUlongByteSwap @@ -382,7 +382,7 @@ @ stub IoGetDeviceAttachmentBaseRef @ stub IoGetDeviceInterfaceAlias @ stub IoGetDeviceInterfaces -@ stub IoGetDeviceObjectPointer +@ stdcall IoGetDeviceObjectPointer(ptr long ptr ptr) @ stub IoGetDeviceProperty @ stub IoGetDeviceToVerify @ stub IoGetDiskDeviceObject @@ -391,7 +391,7 @@ @ stub IoGetFileObjectGenericMapping @ stub IoGetInitialStack @ stub IoGetLowerDeviceObject -@ stub IoGetRelatedDeviceObject +@ stdcall IoGetRelatedDeviceObject(ptr) @ stub IoGetRequestorProcess @ stub IoGetRequestorProcessId @ stub IoGetRequestorSessionId @@ -426,12 +426,12 @@ @ stub IoReadTransferCount @ stub IoRegisterBootDriverReinitialization @ stub IoRegisterDeviceInterface -@ stub IoRegisterDriverReinitialization +@ stdcall IoRegisterDriverReinitialization(ptr ptr ptr) @ stub IoRegisterFileSystem @ stub IoRegisterFsRegistrationChange @ stub IoRegisterLastChanceShutdownNotification @ stub IoRegisterPlugPlayNotification -@ stub IoRegisterShutdownNotification +@ stdcall IoRegisterShutdownNotification(ptr) @ stub IoReleaseCancelSpinLock @ stub IoReleaseRemoveLockAndWaitEx @ stub IoReleaseRemoveLockEx @@ -809,7 +809,7 @@ @ stub ObOpenObjectByPointer @ stub ObQueryNameString @ stub ObQueryObjectAuditingByHandle -@ stub ObReferenceObjectByHandle +@ stdcall ObReferenceObjectByHandle(long long ptr long ptr ptr) @ stub ObReferenceObjectByName @ stub ObReferenceObjectByPointer @ stub ObReferenceSecurityDescriptor diff --git a/dlls/ole32/Makefile.in b/dlls/ole32/Makefile.in index 49a2c775be0..9d7040eca77 100644 --- a/dlls/ole32/Makefile.in +++ b/dlls/ole32/Makefile.in @@ -64,12 +64,15 @@ RC_SRCS = ole32res.rc RC_SRCS16 = version16.rc -IDL_H_SRCS = \ - dcom.idl - IDL_C_SRCS = \ irot.idl +IDL_P_SRCS = \ + dcom.idl \ + ole32_objidl.idl \ + ole32_oleidl.idl \ + ole32_unknwn.idl + @MAKE_DLL_RULES@ ole2nls.spec.o: ole2nls.spec version16.res diff --git a/programs/winver/winver.c b/dlls/ole32/ole32_objidl.idl similarity index 66% copy from programs/winver/winver.c copy to dlls/ole32/ole32_objidl.idl index bf1d791d2ca..64368bd484f 100644 --- a/programs/winver/winver.c +++ b/dlls/ole32/ole32_objidl.idl @@ -1,7 +1,5 @@ /* - * Windows Version Program - * - * Copyright 1997 by Marcel Baur (mbaur@g26.ethz.ch) + * Copyright 2007 Google (Dan Hipschman) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,14 +16,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "config.h" -#include "windows.h" - -int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) -{ - return ShellAbout(NULL, PACKAGE_NAME, PACKAGE_STRING, 0); -} +/* The header file generated from this includes rpc.h, which ends up + including objidl.h at some point. This will cause all sorts of errors + so the easiest thing to do is just comment out our entire header. */ -/* Local Variables: */ -/* c-files style: "GNU" */ -/* End: */ +cpp_quote("#if 0 /* ole32_objidl.idl hack */") +#include "objidl.idl" +cpp_quote("#endif /* ole32_objidl.idl hack */") diff --git a/programs/explorer/explorer_private.h b/dlls/ole32/ole32_oleidl.idl similarity index 74% copy from programs/explorer/explorer_private.h copy to dlls/ole32/ole32_oleidl.idl index ebff4de3f70..b9315b37a2a 100644 --- a/programs/explorer/explorer_private.h +++ b/dlls/ole32/ole32_oleidl.idl @@ -1,7 +1,5 @@ /* - * Explorer private definitions - * - * Copyright 2006 Alexandre Julliard + * Copyright 2007 Google (Dan Hipschman) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,10 +16,5 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef __WINE_EXPLORER_PRIVATE_H -#define __WINE_EXPLORER_PRIVATE_H - -extern void manage_desktop( WCHAR *arg ); -extern void initialize_systray(void); - -#endif /* __WINE_EXPLORER_PRIVATE_H */ +cpp_quote("#include ") +#include "oleidl.idl" diff --git a/programs/winver/winver.c b/dlls/ole32/ole32_unknwn.idl similarity index 66% copy from programs/winver/winver.c copy to dlls/ole32/ole32_unknwn.idl index bf1d791d2ca..a63f156bb41 100644 --- a/programs/winver/winver.c +++ b/dlls/ole32/ole32_unknwn.idl @@ -1,7 +1,5 @@ /* - * Windows Version Program - * - * Copyright 1997 by Marcel Baur (mbaur@g26.ethz.ch) + * Copyright 2007 Google (Dan Hipschman) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,14 +16,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "config.h" -#include "windows.h" - -int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) -{ - return ShellAbout(NULL, PACKAGE_NAME, PACKAGE_STRING, 0); -} +/* The header file generated from this includes rpc.h, which ends up + including unknwn.h at some point. This will cause all sorts of errors + so the easiest thing to do is just comment out our entire header. */ -/* Local Variables: */ -/* c-files style: "GNU" */ -/* End: */ +cpp_quote("#if 0 /* oleaut32_unknwn.idl hack */") +#include "unknwn.idl" +cpp_quote("#endif /* oleaut32_unknwn.idl hack */") diff --git a/dlls/ole32/oleproxy.c b/dlls/ole32/oleproxy.c dissimilarity index 91% index 1add5e0c142..64f4441a51a 100644 --- a/dlls/ole32/oleproxy.c +++ b/dlls/ole32/oleproxy.c @@ -1,1022 +1,94 @@ -/* - * OLE32 proxy/stub handler - * - * Copyright 2002 Marcus Meissner - * Copyright 2001 Ove Kåven, TransGaming Technologies - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" - -#include -#include -#include -#include - -#define COBJMACROS -#define NONAMELESSUNION -#define NONAMELESSSTRUCT - -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "objbase.h" -#include "ole2.h" -#include "rpc.h" -#include "winerror.h" -#include "wtypes.h" - -#include "compobj_private.h" -#include "moniker.h" - -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(ole); - -static ULONG WINAPI RURpcProxyBufferImpl_Release(LPRPCPROXYBUFFER iface); - -/* From msdn: - * - * The first time a client requests a pointer to an interface on a - * particular object, COM loads an IClassFactory stub in the server - * process and uses it to marshal the first pointer back to the - * client. In the client process, COM loads the generic proxy for the - * class factory object and calls its implementation of IMarshal to - * unmarshal that first pointer. COM then creates the first interface - * proxy and hands it a pointer to the RPC channel. Finally, COM returns - * the IClassFactory pointer to the client, which uses it to call - * IClassFactory::CreateInstance, passing it a reference to the interface. - * - * Back in the server process, COM now creates a new instance of the - * object, along with a stub for the requested interface. This stub marshals - * the interface pointer back to the client process, where another object - * proxy is created, this time for the object itself. Also created is a - * proxy for the requested interface, a pointer to which is returned to - * the client. With subsequent calls to other interfaces on the object, - * COM will load the appropriate interface stubs and proxies as needed. - */ -typedef struct _CFStub { - const IRpcStubBufferVtbl *lpvtbl; - LONG ref; - - LPUNKNOWN pUnkServer; -} CFStub; - -static HRESULT WINAPI -CFStub_QueryInterface(LPRPCSTUBBUFFER iface, REFIID riid, LPVOID *ppv) { - if (IsEqualIID(&IID_IUnknown,riid)||IsEqualIID(&IID_IRpcStubBuffer,riid)) { - *ppv = (LPVOID)iface; - IUnknown_AddRef(iface); - return S_OK; - } - FIXME("(%s), interface not supported.\n",debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI -CFStub_AddRef(LPRPCSTUBBUFFER iface) { - CFStub *This = (CFStub *)iface; - return InterlockedIncrement(&This->ref); -} - -static ULONG WINAPI -CFStub_Release(LPRPCSTUBBUFFER iface) { - CFStub *This = (CFStub *)iface; - ULONG ref; - - ref = InterlockedDecrement(&This->ref); - if (!ref) { - IRpcStubBuffer_Disconnect(iface); - HeapFree(GetProcessHeap(),0,This); - } - return ref; -} - -static HRESULT WINAPI -CFStub_Connect(LPRPCSTUBBUFFER iface, IUnknown *pUnkServer) { - CFStub *This = (CFStub *)iface; - - This->pUnkServer = pUnkServer; - IUnknown_AddRef(pUnkServer); - return S_OK; -} - -static void WINAPI -CFStub_Disconnect(LPRPCSTUBBUFFER iface) { - CFStub *This = (CFStub *)iface; - - if (This->pUnkServer) { - IUnknown_Release(This->pUnkServer); - This->pUnkServer = NULL; - } -} - -static HRESULT WINAPI -CFStub_Invoke( - LPRPCSTUBBUFFER iface,RPCOLEMESSAGE* msg,IRpcChannelBuffer* chanbuf -) { - CFStub *This = (CFStub *)iface; - HRESULT hres; - - if (msg->iMethod == 3) { /* CreateInstance */ - IID iid; - IClassFactory *classfac; - IUnknown *ppv; - IStream *pStm; - STATSTG ststg; - ULARGE_INTEGER newpos; - LARGE_INTEGER seekto; - ULONG res; - - if (msg->cbBuffer < sizeof(IID)) { - FIXME("Not enough bytes in buffer (%d)?\n",msg->cbBuffer); - return E_FAIL; - } - memcpy(&iid,msg->Buffer,sizeof(iid)); - TRACE("->CreateInstance(%s)\n",debugstr_guid(&iid)); - hres = IUnknown_QueryInterface(This->pUnkServer,&IID_IClassFactory,(LPVOID*)&classfac); - if (hres) { - FIXME("Ole server does not provide an IClassFactory?\n"); - return hres; - } - hres = IClassFactory_CreateInstance(classfac,NULL,&iid,(LPVOID*)&ppv); - IClassFactory_Release(classfac); - msg->cbBuffer = 0; - if (hres) { - FIXME("Failed to create an instance of %s\n",debugstr_guid(&iid)); - goto getbuffer; - } - hres = CreateStreamOnHGlobal(0,TRUE,&pStm); - if (hres) { - FIXME("Failed to create stream on hglobal\n"); - goto getbuffer; - } - hres = IStream_Write(pStm, &ppv, sizeof(ppv), NULL); - if (hres) { - ERR("IStream_Write failed, 0x%08x\n", hres); - goto getbuffer; - } - if (ppv) { - hres = CoMarshalInterface(pStm,&iid,ppv,0,NULL,0); - IUnknown_Release(ppv); - if (hres) { - FIXME("CoMarshalInterface failed, %x!\n",hres); - goto getbuffer; - } - } - hres = IStream_Stat(pStm,&ststg,0); - if (hres) { - FIXME("Stat failed.\n"); - goto getbuffer; - } - - msg->cbBuffer = ststg.cbSize.u.LowPart; - -getbuffer: - IRpcChannelBuffer_GetBuffer(chanbuf, msg, &IID_IClassFactory); - if (hres) return hres; - - seekto.u.LowPart = 0;seekto.u.HighPart = 0; - hres = IStream_Seek(pStm,seekto,STREAM_SEEK_SET,&newpos); - if (hres) { - FIXME("IStream_Seek failed, %x\n",hres); - return hres; - } - hres = IStream_Read(pStm,msg->Buffer,msg->cbBuffer,&res); - if (hres) { - FIXME("Stream Read failed, %x\n",hres); - return hres; - } - IStream_Release(pStm); - return S_OK; - } - FIXME("(%p,%p), stub!\n",msg,chanbuf); - FIXME("iMethod is %d\n",msg->iMethod); - FIXME("cbBuffer is %d\n",msg->cbBuffer); - return E_FAIL; -} - -static LPRPCSTUBBUFFER WINAPI -CFStub_IsIIDSupported(LPRPCSTUBBUFFER iface,REFIID riid) { - FIXME("(%s), stub!\n",debugstr_guid(riid)); - return NULL; -} - -static ULONG WINAPI -CFStub_CountRefs(LPRPCSTUBBUFFER iface) { - FIXME("(), stub!\n"); - return 1; -} - -static HRESULT WINAPI -CFStub_DebugServerQueryInterface(LPRPCSTUBBUFFER iface,void** ppv) { - FIXME("(%p), stub!\n",ppv); - return E_FAIL; -} -static void WINAPI -CFStub_DebugServerRelease(LPRPCSTUBBUFFER iface,void *pv) { - FIXME("(%p), stub!\n",pv); -} - -static const IRpcStubBufferVtbl cfstubvt = { - CFStub_QueryInterface, - CFStub_AddRef, - CFStub_Release, - CFStub_Connect, - CFStub_Disconnect, - CFStub_Invoke, - CFStub_IsIIDSupported, - CFStub_CountRefs, - CFStub_DebugServerQueryInterface, - CFStub_DebugServerRelease -}; - -static HRESULT -CFStub_Construct(LPRPCSTUBBUFFER *ppv) { - CFStub *cfstub; - cfstub = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CFStub)); - if (!cfstub) - return E_OUTOFMEMORY; - *ppv = (LPRPCSTUBBUFFER)cfstub; - cfstub->lpvtbl = &cfstubvt; - cfstub->ref = 1; - return S_OK; -} - -/* Since we create proxy buffers and classfactory in a pair, there is - * no need for 2 separate structs. Just put them in one, but remember - * the refcount. - */ -typedef struct _CFProxy { - const IClassFactoryVtbl *lpvtbl_cf; - const IRpcProxyBufferVtbl *lpvtbl_proxy; - LONG ref; - - IRpcChannelBuffer *chanbuf; - IUnknown *outer_unknown; -} CFProxy; - -static HRESULT WINAPI IRpcProxyBufferImpl_QueryInterface(LPRPCPROXYBUFFER iface,REFIID riid,LPVOID *ppv) { - *ppv = NULL; - if (IsEqualIID(riid,&IID_IRpcProxyBuffer)||IsEqualIID(riid,&IID_IUnknown)) { - IRpcProxyBuffer_AddRef(iface); - *ppv = (LPVOID)iface; - return S_OK; - } - FIXME("(%s), no interface.\n",debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI IRpcProxyBufferImpl_AddRef(LPRPCPROXYBUFFER iface) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_proxy,iface); - return InterlockedIncrement(&This->ref); -} - -static ULONG WINAPI IRpcProxyBufferImpl_Release(LPRPCPROXYBUFFER iface) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_proxy,iface); - ULONG ref = InterlockedDecrement(&This->ref); - - if (!ref) { - IRpcProxyBuffer_Disconnect(iface); - HeapFree(GetProcessHeap(),0,This); - } - return ref; -} - -static HRESULT WINAPI IRpcProxyBufferImpl_Connect(LPRPCPROXYBUFFER iface,IRpcChannelBuffer* pRpcChannelBuffer) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_proxy,iface); - - This->chanbuf = pRpcChannelBuffer; - IRpcChannelBuffer_AddRef(This->chanbuf); - return S_OK; -} -static void WINAPI IRpcProxyBufferImpl_Disconnect(LPRPCPROXYBUFFER iface) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_proxy,iface); - if (This->chanbuf) { - IRpcChannelBuffer_Release(This->chanbuf); - This->chanbuf = NULL; - } -} - -static HRESULT WINAPI -CFProxy_QueryInterface(LPCLASSFACTORY iface,REFIID riid, LPVOID *ppv) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_cf,iface); - if (This->outer_unknown) return IUnknown_QueryInterface(This->outer_unknown, riid, ppv); - *ppv = NULL; - if (IsEqualIID(&IID_IClassFactory,riid) || IsEqualIID(&IID_IUnknown,riid)) { - *ppv = (LPVOID)iface; - IClassFactory_AddRef(iface); - return S_OK; - } - if (IsEqualIID(riid,&IID_IMarshal)) /* just to avoid debug output */ - return E_NOINTERFACE; - FIXME("Unhandled interface: %s\n",debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI CFProxy_AddRef(LPCLASSFACTORY iface) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_cf,iface); - if (This->outer_unknown) return IUnknown_AddRef(This->outer_unknown); - return InterlockedIncrement(&This->ref); -} - -static ULONG WINAPI CFProxy_Release(LPCLASSFACTORY iface) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_cf,iface); - if (This->outer_unknown) - return IUnknown_Release(This->outer_unknown); - else - return IRpcProxyBufferImpl_Release((IRpcProxyBuffer *)&This->lpvtbl_proxy); -} - -static HRESULT WINAPI CFProxy_CreateInstance( - LPCLASSFACTORY iface, - LPUNKNOWN pUnkOuter,/* [in] */ - REFIID riid, /* [in] */ - LPVOID *ppv /* [out] */ -) { - ICOM_THIS_MULTI(CFProxy,lpvtbl_cf,iface); - HRESULT hres; - LPSTREAM pStream; - HGLOBAL hGlobal; - ULONG srstatus; - RPCOLEMESSAGE msg; - - TRACE("(%p,%s,%p)\n",pUnkOuter,debugstr_guid(riid),ppv); - - /* Send CreateInstance to the remote classfactory. - * - * Data: Only the 'IID'. - */ - memset(&msg, 0, sizeof(msg)); - msg.iMethod = 3; - msg.cbBuffer = sizeof(*riid); - hres = IRpcChannelBuffer_GetBuffer(This->chanbuf,&msg,&IID_IClassFactory); - if (hres) { - FIXME("IRpcChannelBuffer_GetBuffer failed with %x?\n",hres); - return hres; - } - memcpy(msg.Buffer,riid,sizeof(*riid)); - hres = IRpcChannelBuffer_SendReceive(This->chanbuf,&msg,&srstatus); - if (hres) { - FIXME("IRpcChannelBuffer_SendReceive failed with %x?\n",hres); - IRpcChannelBuffer_FreeBuffer(This->chanbuf,&msg); - return hres; - } - - if (!msg.cbBuffer) { /* interface not found on remote */ - IRpcChannelBuffer_FreeBuffer(This->chanbuf,&msg); - return srstatus; - } - - /* We got back: [Marshalled Interface data] */ - TRACE("got %d bytes data.\n",msg.cbBuffer); - hGlobal = GlobalAlloc(GMEM_MOVEABLE|GMEM_NODISCARD|GMEM_SHARE,msg.cbBuffer); - memcpy(GlobalLock(hGlobal),msg.Buffer,msg.cbBuffer); - hres = CreateStreamOnHGlobal(hGlobal,TRUE,&pStream); - if (hres != S_OK) { - FIXME("CreateStreamOnHGlobal failed with %x\n",hres); - IRpcChannelBuffer_FreeBuffer(This->chanbuf,&msg); - GlobalFree(hGlobal); - return hres; - } - hres = IStream_Read(pStream, ppv, sizeof(*ppv), NULL); - if (hres != S_OK) - hres = E_FAIL; - else if (*ppv) { - hres = CoUnmarshalInterface( - pStream, - riid, - ppv - ); - } - IStream_Release(pStream); /* Does GlobalFree hGlobal too. */ - - IRpcChannelBuffer_FreeBuffer(This->chanbuf,&msg); - - if (hres) { - FIXME("CoMarshalInterface failed, %x\n",hres); - return hres; - } - return S_OK; -} - -static HRESULT WINAPI CFProxy_LockServer(LPCLASSFACTORY iface,BOOL fLock) { - /*ICOM_THIS_MULTI(CFProxy,lpvtbl_cf,iface);*/ - FIXME("(%d), stub!\n",fLock); - /* basically: write BOOL, read empty */ - return S_OK; -} - -static const IRpcProxyBufferVtbl pspbvtbl = { - IRpcProxyBufferImpl_QueryInterface, - IRpcProxyBufferImpl_AddRef, - IRpcProxyBufferImpl_Release, - IRpcProxyBufferImpl_Connect, - IRpcProxyBufferImpl_Disconnect -}; -static const IClassFactoryVtbl cfproxyvt = { - CFProxy_QueryInterface, - CFProxy_AddRef, - CFProxy_Release, - CFProxy_CreateInstance, - CFProxy_LockServer -}; - -static HRESULT -CFProxy_Construct(IUnknown *pUnkOuter, LPVOID *ppv,LPVOID *ppProxy) { - CFProxy *cf; - - cf = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CFProxy)); - if (!cf) - return E_OUTOFMEMORY; - - cf->lpvtbl_cf = &cfproxyvt; - cf->lpvtbl_proxy = &pspbvtbl; - /* one reference for the proxy buffer */ - cf->ref = 1; - cf->outer_unknown = pUnkOuter; - *ppv = &(cf->lpvtbl_cf); - *ppProxy = &(cf->lpvtbl_proxy); - /* and one reference for the object */ - IUnknown_AddRef((IUnknown *)*ppv); - return S_OK; -} - - -/********************* IRemUnknown Proxy/Stub ********************************/ - -typedef struct -{ - const IRpcStubBufferVtbl *lpVtbl; - LONG refs; - IRemUnknown *iface; -} RemUnkStub; - -static HRESULT WINAPI RemUnkStub_QueryInterface(LPRPCSTUBBUFFER iface, - REFIID riid, - LPVOID *obj) -{ - RemUnkStub *This = (RemUnkStub *)iface; - TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(riid),obj); - if (IsEqualGUID(&IID_IUnknown,riid) || - IsEqualGUID(&IID_IRpcStubBuffer,riid)) { - *obj = This; - return S_OK; - } - return E_NOINTERFACE; -} - -static ULONG WINAPI RemUnkStub_AddRef(LPRPCSTUBBUFFER iface) -{ - RemUnkStub *This = (RemUnkStub *)iface; - TRACE("(%p)->AddRef()\n",This); - return InterlockedIncrement(&This->refs); -} - -static ULONG WINAPI RemUnkStub_Release(LPRPCSTUBBUFFER iface) -{ - RemUnkStub *This = (RemUnkStub *)iface; - ULONG refs; - TRACE("(%p)->Release()\n",This); - refs = InterlockedDecrement(&This->refs); - if (!refs) - { - IRpcStubBuffer_Disconnect(iface); - HeapFree(GetProcessHeap(), 0, This); - } - return refs; -} - -static HRESULT WINAPI RemUnkStub_Connect(LPRPCSTUBBUFFER iface, - LPUNKNOWN lpUnkServer) -{ - RemUnkStub *This = (RemUnkStub *)iface; - TRACE("(%p)->Connect(%p)\n",This,lpUnkServer); - This->iface = (IRemUnknown*)lpUnkServer; - IRemUnknown_AddRef(This->iface); - return S_OK; -} - -static void WINAPI RemUnkStub_Disconnect(LPRPCSTUBBUFFER iface) -{ - RemUnkStub *This = (RemUnkStub *)iface; - TRACE("(%p)->Disconnect()\n",This); - IUnknown_Release(This->iface); - This->iface = NULL; -} - -static HRESULT WINAPI RemUnkStub_Invoke(LPRPCSTUBBUFFER iface, - PRPCOLEMESSAGE pMsg, - LPRPCCHANNELBUFFER pChannel) -{ - RemUnkStub *This = (RemUnkStub *)iface; - ULONG iMethod = pMsg->iMethod; - LPBYTE buf = pMsg->Buffer; - HRESULT hr = RPC_E_INVALIDMETHOD; - - TRACE("(%p)->Invoke(%p,%p) method %d\n", This, pMsg, pChannel, iMethod); - switch (iMethod) - { - case 3: /* RemQueryInterface */ - { - IPID ipid; - ULONG cRefs; - USHORT cIids; - IID *iids; - REMQIRESULT *pQIResults = NULL; - - /* in */ - memcpy(&ipid, buf, sizeof(ipid)); - buf += sizeof(ipid); - memcpy(&cRefs, buf, sizeof(cRefs)); - buf += sizeof(cRefs); - memcpy(&cIids, buf, sizeof(cIids)); - buf += sizeof(cIids); - iids = (IID *)buf; - - hr = IRemUnknown_RemQueryInterface(This->iface, &ipid, cRefs, cIids, iids, &pQIResults); - - /* out */ - pMsg->cbBuffer = cIids * sizeof(REMQIRESULT) + sizeof(HRESULT); - - IRpcChannelBuffer_GetBuffer(pChannel, pMsg, &IID_IRemUnknown); - - buf = pMsg->Buffer; - *(HRESULT *)buf = hr; - buf += sizeof(HRESULT); - - if (hr == S_OK) - /* FIXME: pQIResults is a unique pointer so pQIResults can be NULL! */ - memcpy(buf, pQIResults, cIids * sizeof(REMQIRESULT)); - - CoTaskMemFree(pQIResults); - - break; - } - case 4: /* RemAddRef */ - { - USHORT cIids; - REMINTERFACEREF *ir; - HRESULT *pResults; - - /* in */ - memcpy(&cIids, buf, sizeof(USHORT)); - buf += sizeof(USHORT); - ir = (REMINTERFACEREF*)buf; - pResults = CoTaskMemAlloc(cIids * sizeof(HRESULT)); - if (!pResults) return E_OUTOFMEMORY; - - hr = IRemUnknown_RemAddRef(This->iface, cIids, ir, pResults); - - /* out */ - pMsg->cbBuffer = cIids * sizeof(HRESULT); - - IRpcChannelBuffer_GetBuffer(pChannel, pMsg, &IID_IRemUnknown); - if (hr == S_OK) - { - buf = pMsg->Buffer; - memcpy(buf, pResults, cIids * sizeof(HRESULT)); - } - - CoTaskMemFree(pResults); - - break; - } - case 5: /* RemRelease */ - { - USHORT cIids; - REMINTERFACEREF *ir; - - /* in */ - memcpy(&cIids, buf, sizeof(USHORT)); - buf += sizeof(USHORT); - ir = (REMINTERFACEREF*)buf; - - hr = IRemUnknown_RemRelease(This->iface, cIids, ir); - - /* out */ - pMsg->cbBuffer = 0; - IRpcChannelBuffer_GetBuffer(pChannel, pMsg, &IID_IRemUnknown); - break; - } - } - return hr; -} - -static LPRPCSTUBBUFFER WINAPI RemUnkStub_IsIIDSupported(LPRPCSTUBBUFFER iface, - REFIID riid) -{ - RemUnkStub *This = (RemUnkStub *)iface; - TRACE("(%p)->IsIIDSupported(%s)\n", This, debugstr_guid(riid)); - return IsEqualGUID(&IID_IRemUnknown, riid) ? iface : NULL; -} - -static ULONG WINAPI RemUnkStub_CountRefs(LPRPCSTUBBUFFER iface) -{ - RemUnkStub *This = (RemUnkStub *)iface; - FIXME("(%p)->CountRefs()\n", This); - return 1; -} - -static HRESULT WINAPI RemUnkStub_DebugServerQueryInterface(LPRPCSTUBBUFFER iface, - LPVOID *ppv) -{ - RemUnkStub *This = (RemUnkStub *)iface; - FIXME("(%p)->DebugServerQueryInterface(%p)\n",This,ppv); - return E_NOINTERFACE; -} - -static void WINAPI RemUnkStub_DebugServerRelease(LPRPCSTUBBUFFER iface, - LPVOID pv) -{ - RemUnkStub *This = (RemUnkStub *)iface; - FIXME("(%p)->DebugServerRelease(%p)\n", This, pv); -} - -static const IRpcStubBufferVtbl RemUnkStub_VTable = -{ - RemUnkStub_QueryInterface, - RemUnkStub_AddRef, - RemUnkStub_Release, - RemUnkStub_Connect, - RemUnkStub_Disconnect, - RemUnkStub_Invoke, - RemUnkStub_IsIIDSupported, - RemUnkStub_CountRefs, - RemUnkStub_DebugServerQueryInterface, - RemUnkStub_DebugServerRelease -}; - -static HRESULT RemUnkStub_Construct(IRpcStubBuffer **ppStub) -{ - RemUnkStub *This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); - if (!This) return E_OUTOFMEMORY; - This->lpVtbl = &RemUnkStub_VTable; - This->refs = 1; - This->iface = NULL; - *ppStub = (IRpcStubBuffer*)This; - return S_OK; -} - - -typedef struct _RemUnkProxy { - const IRemUnknownVtbl *lpvtbl_remunk; - const IRpcProxyBufferVtbl *lpvtbl_proxy; - LONG refs; - - IRpcChannelBuffer *chan; - IUnknown *outer_unknown; -} RemUnkProxy; - -static HRESULT WINAPI RemUnkProxy_QueryInterface(LPREMUNKNOWN iface, REFIID riid, void **ppv) -{ - RemUnkProxy *This = (RemUnkProxy *)iface; - if (This->outer_unknown) - return IUnknown_QueryInterface(This->outer_unknown, riid, ppv); - if (IsEqualIID(riid, &IID_IUnknown) || - IsEqualIID(riid, &IID_IRemUnknown)) - { - IRemUnknown_AddRef(iface); - *ppv = (LPVOID)iface; - return S_OK; - } - return E_NOINTERFACE; -} - -static ULONG WINAPI RemUnkProxy_AddRef(LPREMUNKNOWN iface) -{ - RemUnkProxy *This = (RemUnkProxy *)iface; - ULONG refs; - - TRACE("(%p)->AddRef()\n",This); - - if (This->outer_unknown) - refs = IUnknown_AddRef(This->outer_unknown); - else - refs = InterlockedIncrement(&This->refs); - return refs; -} - -static ULONG WINAPI RemUnkProxy_Release(LPREMUNKNOWN iface) -{ - RemUnkProxy *This = (RemUnkProxy *)iface; - - TRACE("(%p)->Release()\n",This); - if (This->outer_unknown) - return IUnknown_Release(This->outer_unknown); - else - return IRpcProxyBufferImpl_Release((IRpcProxyBuffer *)&This->lpvtbl_proxy); -} - -static HRESULT WINAPI RemUnkProxy_RemQueryInterface(LPREMUNKNOWN iface, - REFIPID ripid, - ULONG cRefs, - USHORT cIids, - IID* iids, - REMQIRESULT** ppQIResults) -{ - RemUnkProxy *This = (RemUnkProxy *)iface; - RPCOLEMESSAGE msg; - HRESULT hr = S_OK; - ULONG status; - - TRACE("(%p)->(%s,%d,%d,%p,%p)\n",This, - debugstr_guid(ripid),cRefs,cIids,iids,ppQIResults); - - *ppQIResults = NULL; - memset(&msg, 0, sizeof(msg)); - msg.iMethod = 3; - msg.cbBuffer = sizeof(IPID) + sizeof(ULONG) + - sizeof(USHORT) + cIids*sizeof(IID); - hr = IRpcChannelBuffer_GetBuffer(This->chan, &msg, &IID_IRemUnknown); - if (SUCCEEDED(hr)) { - LPBYTE buf = msg.Buffer; - memcpy(buf, ripid, sizeof(IPID)); - buf += sizeof(IPID); - memcpy(buf, &cRefs, sizeof(ULONG)); - buf += sizeof(ULONG); - memcpy(buf, &cIids, sizeof(USHORT)); - buf += sizeof(USHORT); - memcpy(buf, iids, cIids*sizeof(IID)); - - hr = IRpcChannelBuffer_SendReceive(This->chan, &msg, &status); - - buf = msg.Buffer; - - if (SUCCEEDED(hr)) { - hr = *(HRESULT *)buf; - buf += sizeof(HRESULT); - } - - if (SUCCEEDED(hr)) { - *ppQIResults = CoTaskMemAlloc(cIids*sizeof(REMQIRESULT)); - memcpy(*ppQIResults, buf, cIids*sizeof(REMQIRESULT)); - } - - IRpcChannelBuffer_FreeBuffer(This->chan, &msg); - } - - return hr; -} - -static HRESULT WINAPI RemUnkProxy_RemAddRef(LPREMUNKNOWN iface, - USHORT cInterfaceRefs, - REMINTERFACEREF* InterfaceRefs, - HRESULT* pResults) -{ - RemUnkProxy *This = (RemUnkProxy *)iface; - RPCOLEMESSAGE msg; - HRESULT hr = S_OK; - ULONG status; - - TRACE("(%p)->(%d,%p,%p)\n",This, - cInterfaceRefs,InterfaceRefs,pResults); - - memset(&msg, 0, sizeof(msg)); - msg.iMethod = 4; - msg.cbBuffer = sizeof(USHORT) + cInterfaceRefs*sizeof(REMINTERFACEREF); - hr = IRpcChannelBuffer_GetBuffer(This->chan, &msg, &IID_IRemUnknown); - if (SUCCEEDED(hr)) { - LPBYTE buf = msg.Buffer; - memcpy(buf, &cInterfaceRefs, sizeof(USHORT)); - buf += sizeof(USHORT); - memcpy(buf, InterfaceRefs, cInterfaceRefs*sizeof(REMINTERFACEREF)); - - hr = IRpcChannelBuffer_SendReceive(This->chan, &msg, &status); - - if (SUCCEEDED(hr)) { - buf = msg.Buffer; - memcpy(pResults, buf, cInterfaceRefs*sizeof(HRESULT)); - } - - IRpcChannelBuffer_FreeBuffer(This->chan, &msg); - } - - return hr; -} - -static HRESULT WINAPI RemUnkProxy_RemRelease(LPREMUNKNOWN iface, - USHORT cInterfaceRefs, - REMINTERFACEREF* InterfaceRefs) -{ - RemUnkProxy *This = (RemUnkProxy *)iface; - RPCOLEMESSAGE msg; - HRESULT hr = S_OK; - ULONG status; - - TRACE("(%p)->(%d,%p)\n",This, - cInterfaceRefs,InterfaceRefs); - - memset(&msg, 0, sizeof(msg)); - msg.iMethod = 5; - msg.cbBuffer = sizeof(USHORT) + cInterfaceRefs*sizeof(REMINTERFACEREF); - hr = IRpcChannelBuffer_GetBuffer(This->chan, &msg, &IID_IRemUnknown); - if (SUCCEEDED(hr)) { - LPBYTE buf = msg.Buffer; - memcpy(buf, &cInterfaceRefs, sizeof(USHORT)); - buf += sizeof(USHORT); - memcpy(buf, InterfaceRefs, cInterfaceRefs*sizeof(REMINTERFACEREF)); - - hr = IRpcChannelBuffer_SendReceive(This->chan, &msg, &status); - - IRpcChannelBuffer_FreeBuffer(This->chan, &msg); - } - - return hr; -} - -static const IRemUnknownVtbl RemUnkProxy_VTable = -{ - RemUnkProxy_QueryInterface, - RemUnkProxy_AddRef, - RemUnkProxy_Release, - RemUnkProxy_RemQueryInterface, - RemUnkProxy_RemAddRef, - RemUnkProxy_RemRelease -}; - - -static HRESULT WINAPI RURpcProxyBufferImpl_QueryInterface(LPRPCPROXYBUFFER iface,REFIID riid,LPVOID *ppv) { - *ppv = NULL; - if (IsEqualIID(riid,&IID_IRpcProxyBuffer)||IsEqualIID(riid,&IID_IUnknown)) { - IRpcProxyBuffer_AddRef(iface); - *ppv = (LPVOID)iface; - return S_OK; - } - FIXME("(%s), no interface.\n",debugstr_guid(riid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI RURpcProxyBufferImpl_AddRef(LPRPCPROXYBUFFER iface) { - ICOM_THIS_MULTI(RemUnkProxy,lpvtbl_proxy,iface); - TRACE("%p, %d\n", iface, This->refs + 1); - return InterlockedIncrement(&This->refs); -} - -static ULONG WINAPI RURpcProxyBufferImpl_Release(LPRPCPROXYBUFFER iface) { - ICOM_THIS_MULTI(RemUnkProxy,lpvtbl_proxy,iface); - ULONG ref = InterlockedDecrement(&This->refs); - TRACE("%p, %d\n", iface, ref); - if (!ref) { - IRpcProxyBuffer_Disconnect(iface); - HeapFree(GetProcessHeap(),0,This); - } - return ref; -} - -static HRESULT WINAPI RURpcProxyBufferImpl_Connect(LPRPCPROXYBUFFER iface,IRpcChannelBuffer* pRpcChannelBuffer) { - ICOM_THIS_MULTI(RemUnkProxy,lpvtbl_proxy,iface); - - TRACE("%p, %p\n", iface, pRpcChannelBuffer); - This->chan = pRpcChannelBuffer; - IRpcChannelBuffer_AddRef(This->chan); - return S_OK; -} -static void WINAPI RURpcProxyBufferImpl_Disconnect(LPRPCPROXYBUFFER iface) { - ICOM_THIS_MULTI(RemUnkProxy,lpvtbl_proxy,iface); - TRACE("%p, %p\n", iface, This->chan); - if (This->chan) { - IRpcChannelBuffer_Release(This->chan); - This->chan = NULL; - } -} - - -static const IRpcProxyBufferVtbl RURpcProxyBuffer_VTable = { - RURpcProxyBufferImpl_QueryInterface, - RURpcProxyBufferImpl_AddRef, - RURpcProxyBufferImpl_Release, - RURpcProxyBufferImpl_Connect, - RURpcProxyBufferImpl_Disconnect -}; - -static HRESULT -RemUnkProxy_Construct(IUnknown *pUnkOuter, LPVOID *ppv,LPVOID *ppProxy) { - RemUnkProxy *This; - - This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*This)); - if (!This) - return E_OUTOFMEMORY; - - This->lpvtbl_remunk = &RemUnkProxy_VTable; - This->lpvtbl_proxy = &RURpcProxyBuffer_VTable; - /* only one reference for the proxy buffer */ - This->refs = 1; - This->outer_unknown = pUnkOuter; - *ppv = &(This->lpvtbl_remunk); - *ppProxy = &(This->lpvtbl_proxy); - /* and one reference for the object */ - IUnknown_AddRef((IUnknown *)*ppv); - return S_OK; -} - - -/********************* OLE Proxy/Stub Factory ********************************/ -static HRESULT WINAPI -PSFacBuf_QueryInterface(LPPSFACTORYBUFFER iface, REFIID iid, LPVOID *ppv) { - if (IsEqualIID(iid,&IID_IPSFactoryBuffer)||IsEqualIID(iid,&IID_IUnknown)) { - *ppv = (LPVOID)iface; - /* No ref counting, static class */ - return S_OK; - } - FIXME("(%s) unknown IID?\n",debugstr_guid(iid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI PSFacBuf_AddRef(LPPSFACTORYBUFFER iface) { return 2; } -static ULONG WINAPI PSFacBuf_Release(LPPSFACTORYBUFFER iface) { return 1; } - -static HRESULT WINAPI -PSFacBuf_CreateProxy( - LPPSFACTORYBUFFER iface, IUnknown* pUnkOuter, REFIID riid, - IRpcProxyBuffer **ppProxy, LPVOID *ppv -) { - if (IsEqualIID(&IID_IClassFactory,riid)) - return CFProxy_Construct(pUnkOuter, ppv,(LPVOID*)ppProxy); - else if (IsEqualIID(&IID_IRemUnknown,riid)) - return RemUnkProxy_Construct(pUnkOuter, ppv,(LPVOID*)ppProxy); - FIXME("proxying not implemented for (%s) yet!\n",debugstr_guid(riid)); - return E_FAIL; -} - -static HRESULT WINAPI -PSFacBuf_CreateStub( - LPPSFACTORYBUFFER iface, REFIID riid,IUnknown *pUnkServer, - IRpcStubBuffer** ppStub -) { - HRESULT hres; - - TRACE("(%s,%p,%p)\n",debugstr_guid(riid),pUnkServer,ppStub); - - if (IsEqualIID(&IID_IClassFactory, riid) || - IsEqualIID(&IID_IUnknown, riid) /* FIXME: fixup stub manager and remove this*/) { - hres = CFStub_Construct(ppStub); - if (hres == S_OK) - IRpcStubBuffer_Connect((*ppStub),pUnkServer); - return hres; - } else if (IsEqualIID(&IID_IRemUnknown,riid)) { - hres = RemUnkStub_Construct(ppStub); - if (hres == S_OK) - IRpcStubBuffer_Connect((*ppStub),pUnkServer); - return hres; - } - FIXME("stubbing not implemented for (%s) yet!\n",debugstr_guid(riid)); - return E_FAIL; -} - -static const IPSFactoryBufferVtbl psfacbufvtbl = { - PSFacBuf_QueryInterface, - PSFacBuf_AddRef, - PSFacBuf_Release, - PSFacBuf_CreateProxy, - PSFacBuf_CreateStub -}; - -/* This is the whole PSFactoryBuffer object, just the vtableptr */ -static const IPSFactoryBufferVtbl *lppsfac = &psfacbufvtbl; - -/*********************************************************************** - * DllGetClassObject [OLE32.@] - */ -HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) -{ - *ppv = NULL; - if (IsEqualIID(rclsid, &CLSID_PSFactoryBuffer)) - return IPSFactoryBuffer_QueryInterface((IPSFactoryBuffer *)&lppsfac, iid, ppv); - if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&( - IsEqualIID(iid,&IID_IClassFactory) || - IsEqualIID(iid,&IID_IUnknown) - ) - ) - return MARSHAL_GetStandardMarshalCF(ppv); - if (IsEqualIID(rclsid,&CLSID_StdGlobalInterfaceTable) && (IsEqualIID(iid,&IID_IClassFactory) || IsEqualIID(iid,&IID_IUnknown))) - return StdGlobalInterfaceTable_GetFactory(ppv); - if (IsEqualCLSID(rclsid, &CLSID_FileMoniker)) - return FileMonikerCF_Create(iid, ppv); - if (IsEqualCLSID(rclsid, &CLSID_ItemMoniker)) - return ItemMonikerCF_Create(iid, ppv); - if (IsEqualCLSID(rclsid, &CLSID_AntiMoniker)) - return AntiMonikerCF_Create(iid, ppv); - if (IsEqualCLSID(rclsid, &CLSID_CompositeMoniker)) - return CompositeMonikerCF_Create(iid, ppv); - if (IsEqualCLSID(rclsid, &CLSID_ClassMoniker)) - return ClassMonikerCF_Create(iid, ppv); - if (IsEqualCLSID(rclsid, &CLSID_PointerMoniker)) - return PointerMonikerCF_Create(iid, ppv); - - FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); - return CLASS_E_CLASSNOTAVAILABLE; -} +/* + * OLE32 proxy/stub handler + * + * Copyright 2002 Marcus Meissner + * Copyright 2001 Ove Kåven, TransGaming Technologies + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include +#include +#include +#include + +#define COBJMACROS +#define NONAMELESSUNION +#define NONAMELESSSTRUCT + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "objbase.h" +#include "ole2.h" +#include "rpc.h" +#include "rpcproxy.h" + +#include "compobj_private.h" +#include "moniker.h" + +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(ole); + +static CStdPSFactoryBuffer PSFactoryBuffer; + +CSTDSTUBBUFFERRELEASE(&PSFactoryBuffer) + +extern const ExtendedProxyFileInfo dcom_ProxyFileInfo; +extern const ExtendedProxyFileInfo ole32_objidl_ProxyFileInfo; +extern const ExtendedProxyFileInfo ole32_oleidl_ProxyFileInfo; +extern const ExtendedProxyFileInfo ole32_unknwn_ProxyFileInfo; + +static const ProxyFileInfo *OLE32_ProxyFileList[] = { + &dcom_ProxyFileInfo, + &ole32_objidl_ProxyFileInfo, + &ole32_oleidl_ProxyFileInfo, + &ole32_unknwn_ProxyFileInfo, + NULL +}; + +/*********************************************************************** + * DllGetClassObject [OLE32.@] + */ +HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) +{ + *ppv = NULL; + if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&( + IsEqualIID(iid,&IID_IClassFactory) || + IsEqualIID(iid,&IID_IUnknown) + ) + ) + return MARSHAL_GetStandardMarshalCF(ppv); + if (IsEqualIID(rclsid,&CLSID_StdGlobalInterfaceTable) && (IsEqualIID(iid,&IID_IClassFactory) || IsEqualIID(iid,&IID_IUnknown))) + return StdGlobalInterfaceTable_GetFactory(ppv); + if (IsEqualCLSID(rclsid, &CLSID_FileMoniker)) + return FileMonikerCF_Create(iid, ppv); + if (IsEqualCLSID(rclsid, &CLSID_ItemMoniker)) + return ItemMonikerCF_Create(iid, ppv); + if (IsEqualCLSID(rclsid, &CLSID_AntiMoniker)) + return AntiMonikerCF_Create(iid, ppv); + if (IsEqualCLSID(rclsid, &CLSID_CompositeMoniker)) + return CompositeMonikerCF_Create(iid, ppv); + if (IsEqualCLSID(rclsid, &CLSID_ClassMoniker)) + return ClassMonikerCF_Create(iid, ppv); + if (IsEqualCLSID(rclsid, &CLSID_PointerMoniker)) + return PointerMonikerCF_Create(iid, ppv); + + return NdrDllGetClassObject(rclsid, iid, ppv, OLE32_ProxyFileList, + &CLSID_PSFactoryBuffer, &PSFactoryBuffer); +} diff --git a/dlls/ole32/tests/compobj.c b/dlls/ole32/tests/compobj.c index b2aaa226eb5..bdc34d9b69b 100644 --- a/dlls/ole32/tests/compobj.c +++ b/dlls/ole32/tests/compobj.c @@ -244,7 +244,9 @@ static void test_CoGetClassObject(void) ok(pUnk == NULL, "CoGetClassObject should have changed the passed in pointer to NULL, instead of %p\n", pUnk); hr = CoGetClassObject(&CLSID_MyComputer, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, NULL); - ok(hr == E_INVALIDARG, "CoGetClassObject should have returned E_INVALIDARG instead of 0x%08x\n", hr); + ok(hr == E_INVALIDARG || + broken(hr == CO_E_NOTINITIALIZED), /* win9x */ + "CoGetClassObject should have returned E_INVALIDARG instead of 0x%08x\n", hr); } static ATOM register_dummy_class(void) @@ -944,7 +946,9 @@ static void test_CoFreeUnusedLibraries(void) ok(is_module_loaded("urlmon.dll"), "urlmon.dll should be loaded\n"); - ok(pUnk != NULL, "Expected a valid pointer\n"); + ok(pUnk != NULL || + broken(pUnk == NULL), /* win9x */ + "Expected a valid pointer\n"); if (pUnk) IUnknown_Release(pUnk); diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index b15cce43e5e..468eb62de74 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -571,26 +571,18 @@ static void test_ROT(void) /* try with our own moniker that doesn't support IROTData */ hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown*)&Test_ClassFactory, &MonikerNoROTData, &dwCookie); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_ole_success(hr, IRunningObjectTable_Register); - } ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_more_than_one_lock(); - } expected_method_list = methods_isrunning_no_ROTData; hr = IRunningObjectTable_IsRunning(pROT, &MonikerNoROTData); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_ole_success(hr, IRunningObjectTable_IsRunning); - } ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); hr = IRunningObjectTable_Revoke(pROT, dwCookie); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_ole_success(hr, IRunningObjectTable_Revoke); - } ok_no_locks(); @@ -598,26 +590,18 @@ static void test_ROT(void) /* try with our own moniker */ hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown*)&Test_ClassFactory, &Moniker, &dwCookie); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_ole_success(hr, IRunningObjectTable_Register); - } ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_more_than_one_lock(); - } expected_method_list = methods_isrunning; hr = IRunningObjectTable_IsRunning(pROT, &Moniker); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_ole_success(hr, IRunningObjectTable_IsRunning); - } ok(!*expected_method_list, "Method sequence starting from %s not called\n", *expected_method_list); hr = IRunningObjectTable_Revoke(pROT, dwCookie); - todo_wine { /* only fails because of lack of IMoniker marshaling */ ok_ole_success(hr, IRunningObjectTable_Revoke); - } ok_no_locks(); @@ -1765,7 +1749,9 @@ static void test_bind_context(void) bind_opts.cbStruct = -1; hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts); ok_ole_success(hr, "IBindCtx_GetBindOptions"); - ok(bind_opts.cbStruct == sizeof(bind_opts), "bind_opts.cbStruct was %d\n", bind_opts.cbStruct); + ok(bind_opts.cbStruct == sizeof(bind_opts) || + bind_opts.cbStruct == 36, /* Vista */ + "bind_opts.cbStruct was %d\n", bind_opts.cbStruct); bind_opts.cbStruct = sizeof(BIND_OPTS); hr = IBindCtx_GetBindOptions(pBindCtx, (BIND_OPTS *)&bind_opts); diff --git a/dlls/ole32/usrmarshal.c b/dlls/ole32/usrmarshal.c index c25b86a4d91..b8487c30031 100644 --- a/dlls/ole32/usrmarshal.c +++ b/dlls/ole32/usrmarshal.c @@ -1957,3 +1957,802 @@ void __RPC_USER SNB_UserFree(ULONG *pFlags, SNB *pSnb) { FIXME(":stub\n"); } + +/* call_as/local stubs for unknwn.idl */ + +HRESULT CALLBACK IClassFactory_CreateInstance_Proxy( + IClassFactory* This, + IUnknown *pUnkOuter, + REFIID riid, + void **ppvObject) +{ + TRACE("(%p, %s, %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject); + *ppvObject = NULL; + if (pUnkOuter) + { + ERR("aggregation is not allowed on remote objects\n"); + return CLASS_E_NOAGGREGATION; + } + return IClassFactory_RemoteCreateInstance_Proxy(This, riid, + (IUnknown **) ppvObject); +} + +HRESULT __RPC_STUB IClassFactory_CreateInstance_Stub( + IClassFactory* This, + REFIID riid, + IUnknown **ppvObject) +{ + TRACE("(%s, %p)\n", debugstr_guid(riid), ppvObject); + return IClassFactory_CreateInstance(This, NULL, riid, (void **) ppvObject); +} + +HRESULT CALLBACK IClassFactory_LockServer_Proxy( + IClassFactory* This, + BOOL fLock) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IClassFactory_LockServer_Stub( + IClassFactory* This, + BOOL fLock) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +/* call_as/local stubs for objidl.idl */ + +HRESULT CALLBACK IEnumUnknown_Next_Proxy( + IEnumUnknown* This, + ULONG celt, + IUnknown **rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumUnknown_Next_Stub( + IEnumUnknown* This, + ULONG celt, + IUnknown **rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IBindCtx_SetBindOptions_Proxy( + IBindCtx* This, + BIND_OPTS *pbindopts) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IBindCtx_SetBindOptions_Stub( + IBindCtx* This, + BIND_OPTS2 *pbindopts) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IBindCtx_GetBindOptions_Proxy( + IBindCtx* This, + BIND_OPTS *pbindopts) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IBindCtx_GetBindOptions_Stub( + IBindCtx* This, + BIND_OPTS2 *pbindopts) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumMoniker_Next_Proxy( + IEnumMoniker* This, + ULONG celt, + IMoniker **rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumMoniker_Next_Stub( + IEnumMoniker* This, + ULONG celt, + IMoniker **rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +BOOL CALLBACK IRunnableObject_IsRunning_Proxy( + IRunnableObject* This) +{ + BOOL rv; + FIXME(":stub\n"); + memset(&rv, 0, sizeof rv); + return rv; +} + +HRESULT __RPC_STUB IRunnableObject_IsRunning_Stub( + IRunnableObject* This) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IMoniker_BindToObject_Proxy( + IMoniker* This, + IBindCtx *pbc, + IMoniker *pmkToLeft, + REFIID riidResult, + void **ppvResult) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IMoniker_BindToObject_Stub( + IMoniker* This, + IBindCtx *pbc, + IMoniker *pmkToLeft, + REFIID riidResult, + IUnknown **ppvResult) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IMoniker_BindToStorage_Proxy( + IMoniker* This, + IBindCtx *pbc, + IMoniker *pmkToLeft, + REFIID riid, + void **ppvObj) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IMoniker_BindToStorage_Stub( + IMoniker* This, + IBindCtx *pbc, + IMoniker *pmkToLeft, + REFIID riid, + IUnknown **ppvObj) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumString_Next_Proxy( + IEnumString* This, + ULONG celt, + LPOLESTR *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumString_Next_Stub( + IEnumString* This, + ULONG celt, + LPOLESTR *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK ISequentialStream_Read_Proxy( + ISequentialStream* This, + void *pv, + ULONG cb, + ULONG *pcbRead) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB ISequentialStream_Read_Stub( + ISequentialStream* This, + byte *pv, + ULONG cb, + ULONG *pcbRead) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK ISequentialStream_Write_Proxy( + ISequentialStream* This, + const void *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB ISequentialStream_Write_Stub( + ISequentialStream* This, + const byte *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IStream_Seek_Proxy( + IStream* This, + LARGE_INTEGER dlibMove, + DWORD dwOrigin, + ULARGE_INTEGER *plibNewPosition) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IStream_Seek_Stub( + IStream* This, + LARGE_INTEGER dlibMove, + DWORD dwOrigin, + ULARGE_INTEGER *plibNewPosition) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IStream_CopyTo_Proxy( + IStream* This, + IStream *pstm, + ULARGE_INTEGER cb, + ULARGE_INTEGER *pcbRead, + ULARGE_INTEGER *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IStream_CopyTo_Stub( + IStream* This, + IStream *pstm, + ULARGE_INTEGER cb, + ULARGE_INTEGER *pcbRead, + ULARGE_INTEGER *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumSTATSTG_Next_Proxy( + IEnumSTATSTG* This, + ULONG celt, + STATSTG *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumSTATSTG_Next_Stub( + IEnumSTATSTG* This, + ULONG celt, + STATSTG *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IStorage_OpenStream_Proxy( + IStorage* This, + LPCOLESTR pwcsName, + void *reserved1, + DWORD grfMode, + DWORD reserved2, + IStream **ppstm) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IStorage_OpenStream_Stub( + IStorage* This, + LPCOLESTR pwcsName, + unsigned long cbReserved1, + byte *reserved1, + DWORD grfMode, + DWORD reserved2, + IStream **ppstm) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IStorage_EnumElements_Proxy( + IStorage* This, + DWORD reserved1, + void *reserved2, + DWORD reserved3, + IEnumSTATSTG **ppenum) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IStorage_EnumElements_Stub( + IStorage* This, + DWORD reserved1, + unsigned long cbReserved2, + byte *reserved2, + DWORD reserved3, + IEnumSTATSTG **ppenum) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK ILockBytes_ReadAt_Proxy( + ILockBytes* This, + ULARGE_INTEGER ulOffset, + void *pv, + ULONG cb, + ULONG *pcbRead) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB ILockBytes_ReadAt_Stub( + ILockBytes* This, + ULARGE_INTEGER ulOffset, + byte *pv, + ULONG cb, + ULONG *pcbRead) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK ILockBytes_WriteAt_Proxy( + ILockBytes* This, + ULARGE_INTEGER ulOffset, + const void *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB ILockBytes_WriteAt_Stub( + ILockBytes* This, + ULARGE_INTEGER ulOffset, + const byte *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IFillLockBytes_FillAppend_Proxy( + IFillLockBytes* This, + const void *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IFillLockBytes_FillAppend_Stub( + IFillLockBytes* This, + const byte *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IFillLockBytes_FillAt_Proxy( + IFillLockBytes* This, + ULARGE_INTEGER ulOffset, + const void *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IFillLockBytes_FillAt_Stub( + IFillLockBytes* This, + ULARGE_INTEGER ulOffset, + const byte *pv, + ULONG cb, + ULONG *pcbWritten) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumFORMATETC_Next_Proxy( + IEnumFORMATETC* This, + ULONG celt, + FORMATETC *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumFORMATETC_Next_Stub( + IEnumFORMATETC* This, + ULONG celt, + FORMATETC *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumSTATDATA_Next_Proxy( + IEnumSTATDATA* This, + ULONG celt, + STATDATA *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumSTATDATA_Next_Stub( + IEnumSTATDATA* This, + ULONG celt, + STATDATA *rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSink_OnDataChange_Proxy( + IAdviseSink* This, + FORMATETC *pFormatetc, + STGMEDIUM *pStgmed) +{ + FIXME(":stub\n"); +} + +HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub( + IAdviseSink* This, + FORMATETC *pFormatetc, + ASYNC_STGMEDIUM *pStgmed) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSink_OnViewChange_Proxy( + IAdviseSink* This, + DWORD dwAspect, + LONG lindex) +{ + FIXME(":stub\n"); +} + +HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub( + IAdviseSink* This, + DWORD dwAspect, + LONG lindex) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSink_OnRename_Proxy( + IAdviseSink* This, + IMoniker *pmk) +{ + FIXME(":stub\n"); +} + +HRESULT __RPC_STUB IAdviseSink_OnRename_Stub( + IAdviseSink* This, + IMoniker *pmk) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSink_OnSave_Proxy( + IAdviseSink* This) +{ + FIXME(":stub\n"); +} + +HRESULT __RPC_STUB IAdviseSink_OnSave_Stub( + IAdviseSink* This) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSink_OnClose_Proxy( + IAdviseSink* This) +{ + FIXME(":stub\n"); +} + +HRESULT __RPC_STUB IAdviseSink_OnClose_Stub( + IAdviseSink* This) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSink2_OnLinkSrcChange_Proxy( + IAdviseSink2* This, + IMoniker *pmk) +{ + FIXME(":stub\n"); +} + +HRESULT __RPC_STUB IAdviseSink2_OnLinkSrcChange_Stub( + IAdviseSink2* This, + IMoniker *pmk) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IDataObject_GetData_Proxy( + IDataObject* This, + FORMATETC *pformatetcIn, + STGMEDIUM *pmedium) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IDataObject_GetData_Stub( + IDataObject* This, + FORMATETC *pformatetcIn, + STGMEDIUM *pRemoteMedium) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IDataObject_GetDataHere_Proxy( + IDataObject* This, + FORMATETC *pformatetc, + STGMEDIUM *pmedium) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IDataObject_GetDataHere_Stub( + IDataObject* This, + FORMATETC *pformatetc, + STGMEDIUM *pRemoteMedium) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IDataObject_SetData_Proxy( + IDataObject* This, + FORMATETC *pformatetc, + STGMEDIUM *pmedium, + BOOL fRelease) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IDataObject_SetData_Stub( + IDataObject* This, + FORMATETC *pformatetc, + FLAG_STGMEDIUM *pmedium, + BOOL fRelease) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +/* call_as/local stubs for oleidl.idl */ + +HRESULT CALLBACK IOleInPlaceActiveObject_TranslateAccelerator_Proxy( + IOleInPlaceActiveObject* This, + LPMSG lpmsg) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IOleInPlaceActiveObject_TranslateAccelerator_Stub( + IOleInPlaceActiveObject* This) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IOleInPlaceActiveObject_ResizeBorder_Proxy( + IOleInPlaceActiveObject* This, + LPCRECT prcBorder, + IOleInPlaceUIWindow *pUIWindow, + BOOL fFrameWindow) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IOleInPlaceActiveObject_ResizeBorder_Stub( + IOleInPlaceActiveObject* This, + LPCRECT prcBorder, + REFIID riid, + IOleInPlaceUIWindow *pUIWindow, + BOOL fFrameWindow) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IOleCache2_UpdateCache_Proxy( + IOleCache2* This, + LPDATAOBJECT pDataObject, + DWORD grfUpdf, + LPVOID pReserved) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IOleCache2_UpdateCache_Stub( + IOleCache2* This, + LPDATAOBJECT pDataObject, + DWORD grfUpdf, + LONG_PTR pReserved) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumOLEVERB_Next_Proxy( + IEnumOLEVERB* This, + ULONG celt, + LPOLEVERB rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumOLEVERB_Next_Stub( + IEnumOLEVERB* This, + ULONG celt, + LPOLEVERB rgelt, + ULONG *pceltFetched) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IViewObject_Draw_Proxy( + IViewObject* This, + DWORD dwDrawAspect, + LONG lindex, + void *pvAspect, + DVTARGETDEVICE *ptd, + HDC hdcTargetDev, + HDC hdcDraw, + LPCRECTL lprcBounds, + LPCRECTL lprcWBounds, + BOOL (STDMETHODCALLTYPE *pfnContinue)(ULONG_PTR dwContinue), + ULONG_PTR dwContinue) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IViewObject_Draw_Stub( + IViewObject* This, + DWORD dwDrawAspect, + LONG lindex, + ULONG_PTR pvAspect, + DVTARGETDEVICE *ptd, + ULONG_PTR hdcTargetDev, + ULONG_PTR hdcDraw, + LPCRECTL lprcBounds, + LPCRECTL lprcWBounds, + IContinue *pContinue) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IViewObject_GetColorSet_Proxy( + IViewObject* This, + DWORD dwDrawAspect, + LONG lindex, + void *pvAspect, + DVTARGETDEVICE *ptd, + HDC hicTargetDev, + LOGPALETTE **ppColorSet) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IViewObject_GetColorSet_Stub( + IViewObject* This, + DWORD dwDrawAspect, + LONG lindex, + ULONG_PTR pvAspect, + DVTARGETDEVICE *ptd, + ULONG_PTR hicTargetDev, + LOGPALETTE **ppColorSet) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IViewObject_Freeze_Proxy( + IViewObject* This, + DWORD dwDrawAspect, + LONG lindex, + void *pvAspect, + DWORD *pdwFreeze) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IViewObject_Freeze_Stub( + IViewObject* This, + DWORD dwDrawAspect, + LONG lindex, + ULONG_PTR pvAspect, + DWORD *pdwFreeze) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IViewObject_GetAdvise_Proxy( + IViewObject* This, + DWORD *pAspects, + DWORD *pAdvf, + IAdviseSink **ppAdvSink) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IViewObject_GetAdvise_Stub( + IViewObject* This, + DWORD *pAspects, + DWORD *pAdvf, + IAdviseSink **ppAdvSink) +{ + FIXME(":stub\n"); + return E_NOTIMPL; +} diff --git a/dlls/oleaut32/Makefile.in b/dlls/oleaut32/Makefile.in index c6a7dae36c2..93b19d1328c 100644 --- a/dlls/oleaut32/Makefile.in +++ b/dlls/oleaut32/Makefile.in @@ -39,7 +39,8 @@ SPEC_SRCS16 = \ RC_SRCS = oleaut32.rc IDL_P_SRCS = \ - oleaut32_oaidl.idl + oleaut32_oaidl.idl \ + oleaut32_ocidl.idl @MAKE_DLL_RULES@ diff --git a/dlls/oleaut32/hash.c b/dlls/oleaut32/hash.c index b3929f31c04..32c1086b7ef 100644 --- a/dlls/oleaut32/hash.c +++ b/dlls/oleaut32/hash.c @@ -486,6 +486,7 @@ static const unsigned char Lookup_224[128 * 3] = { /*********************************************************************** * LHashValOfNameSysA (OLEAUT32.166) + * LHashValOfNameSys (TYPELIB.4) * * Produce a string hash value. * diff --git a/dlls/oleaut32/oleaut.c b/dlls/oleaut32/oleaut.c index 98844167ca8..aa97b31a550 100644 --- a/dlls/oleaut32/oleaut.c +++ b/dlls/oleaut32/oleaut.c @@ -807,8 +807,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) return S_OK; /*FALLTHROUGH*/ } - FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); - return CLASS_E_CLASSNOTAVAILABLE; + return OLEAUTPS_DllGetClassObject(rclsid, iid, ppv); } /*********************************************************************** diff --git a/dlls/oleaut32/oleaut32.rc b/dlls/oleaut32/oleaut32.rc index fc87d773a5b..206a5396b36 100644 --- a/dlls/oleaut32/oleaut32.rc +++ b/dlls/oleaut32/oleaut32.rc @@ -46,6 +46,7 @@ #include "oleaut32_Sv.rc" #include "oleaut32_Th.rc" #include "oleaut32_Tr.rc" +#include "oleaut32_Zh.rc" /* * FIXME: diff --git a/programs/oleview/rsrc.rc b/dlls/oleaut32/oleaut32_Zh.rc similarity index 57% copy from programs/oleview/rsrc.rc copy to dlls/oleaut32/oleaut32_Zh.rc index 5b4c7812fa4..320c40ff5dd 100644 --- a/programs/oleview/rsrc.rc +++ b/dlls/oleaut32/oleaut32_Zh.rc @@ -1,7 +1,7 @@ /* - * OleView (rsrc.rc) + * oleaut32 (Simplified and Traditional Chinese Resources) * - * Copyright 2006 Piotr Caban + * Copyright 2008 Hongbo Ni * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,27 +18,31 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include -#include +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) -#include "resource.h" +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED -#include "Da.rc" -#include "De.rc" -#include "En.rc" -#include "Fr.rc" -#include "Ko.rc" -#include "Nl.rc" -#include "No.rc" -#include "Pl.rc" -#include "Ru.rc" +STRINGTABLE DISCARDABLE +{ + IDS_TRUE "真" + IDS_FALSE "假" + IDS_YES "是" + IDS_NO "否" + IDS_ON "开" + IDS_OFF "关" +} -LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL -IDA_OLEVIEW ACCELERATORS DISCARDABLE +STRINGTABLE DISCARDABLE { - VK_F5, IDM_REFRESH, VIRTKEY, NOINVERT + IDS_TRUE "真" + IDS_FALSE "假" + IDS_YES "是" + IDS_NO "否" + IDS_ON "開" + IDS_OFF "關" } -/* @makedep: toolbar.bmp */ -IDB_TOOLBAR BITMAP DISCARDABLE toolbar.bmp +#pragma code_page(default) diff --git a/programs/explorer/explorer_private.h b/dlls/oleaut32/oleaut32_ocidl.idl similarity index 74% copy from programs/explorer/explorer_private.h copy to dlls/oleaut32/oleaut32_ocidl.idl index ebff4de3f70..379df5bbfee 100644 --- a/programs/explorer/explorer_private.h +++ b/dlls/oleaut32/oleaut32_ocidl.idl @@ -1,7 +1,5 @@ /* - * Explorer private definitions - * - * Copyright 2006 Alexandre Julliard + * Copyright 2007 Google (Dan Hipschman) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,10 +16,5 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef __WINE_EXPLORER_PRIVATE_H -#define __WINE_EXPLORER_PRIVATE_H - -extern void manage_desktop( WCHAR *arg ); -extern void initialize_systray(void); - -#endif /* __WINE_EXPLORER_PRIVATE_H */ +cpp_quote("#include ") +#include "ocidl.idl" diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index d7139d23aa6..9c7ef98d72c 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -1357,6 +1357,8 @@ static void TLB_abort(void) { DebugBreak(); } + +static void * TLB_Alloc(unsigned size) __WINE_ALLOC_SIZE(1); static void * TLB_Alloc(unsigned size) { void * ret; diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c index a9a738c2df5..ea5f49e0b2f 100644 --- a/dlls/oleaut32/usrmarshal.c +++ b/dlls/oleaut32/usrmarshal.c @@ -36,6 +36,7 @@ #include "oleauto.h" #include "rpcproxy.h" #include "typelib.h" +#include "ocidl.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(ole); @@ -50,9 +51,11 @@ static CStdPSFactoryBuffer PSFactoryBuffer; CSTDSTUBBUFFERRELEASE(&PSFactoryBuffer) extern const ExtendedProxyFileInfo oleaut32_oaidl_ProxyFileInfo; +extern const ExtendedProxyFileInfo oleaut32_ocidl_ProxyFileInfo; static const ProxyFileInfo *OLEAUT32_ProxyFileList[] = { &oleaut32_oaidl_ProxyFileInfo, + &oleaut32_ocidl_ProxyFileInfo, NULL }; @@ -1128,6 +1131,32 @@ void WINAPI LPSAFEARRAY_UserFree(ULONG *pFlags, LPSAFEARRAY *ppsa) SafeArrayDestroy(*ppsa); } + +ULONG WINAPI HFONT_UserSize(ULONG *pFlags, ULONG Start, HFONT *phfont) +{ + FIXME(":stub\n"); + return 0; +} + +unsigned char * WINAPI HFONT_UserMarshal(ULONG *pFlags, unsigned char *Buffer, HFONT *phfont) +{ + FIXME(":stub\n"); + return NULL; +} + +unsigned char * WINAPI HFONT_UserUnmarshal(ULONG *pFlags, unsigned char *Buffer, HFONT *phfont) +{ + FIXME(":stub\n"); + return NULL; +} + +void WINAPI HFONT_UserFree(ULONG *pFlags, HFONT *phfont) +{ + FIXME(":stub\n"); + return; +} + + /* IDispatch */ /* exactly how Invoke is marshalled is not very clear to me yet, * but the way I've done it seems to work for me */ @@ -2029,3 +2058,158 @@ HRESULT __RPC_STUB IPropertyBag_Read_Stub( FIXME("not implemented\n"); return E_FAIL; } + +/* call_as/local stubs for ocidl.idl */ + +HRESULT CALLBACK IClassFactory2_CreateInstanceLic_Proxy( + IClassFactory2* This, + IUnknown *pUnkOuter, + IUnknown *pUnkReserved, + REFIID riid, + BSTR bstrKey, + PVOID *ppvObj) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IClassFactory2_CreateInstanceLic_Stub( + IClassFactory2* This, + REFIID riid, + BSTR bstrKey, + IUnknown **ppvObj) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumConnections_Next_Proxy( + IEnumConnections* This, + ULONG cConnections, + LPCONNECTDATA rgcd, + ULONG *pcFetched) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumConnections_Next_Stub( + IEnumConnections* This, + ULONG cConnections, + LPCONNECTDATA rgcd, + ULONG *pcFetched) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumConnectionPoints_Next_Proxy( + IEnumConnectionPoints* This, + ULONG cConnections, + LPCONNECTIONPOINT *ppCP, + ULONG *pcFetched) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumConnectionPoints_Next_Stub( + IEnumConnectionPoints* This, + ULONG cConnections, + LPCONNECTIONPOINT *ppCP, + ULONG *pcFetched) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IPersistMemory_Load_Proxy( + IPersistMemory* This, + LPVOID pMem, + ULONG cbSize) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IPersistMemory_Load_Stub( + IPersistMemory* This, + BYTE *pMem, + ULONG cbSize) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IPersistMemory_Save_Proxy( + IPersistMemory* This, + LPVOID pMem, + BOOL fClearDirty, + ULONG cbSize) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IPersistMemory_Save_Stub( + IPersistMemory* This, + BYTE *pMem, + BOOL fClearDirty, + ULONG cbSize) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +void CALLBACK IAdviseSinkEx_OnViewStatusChange_Proxy( + IAdviseSinkEx* This, + DWORD dwViewStatus) +{ + FIXME("not implemented\n"); +} + +HRESULT __RPC_STUB IAdviseSinkEx_OnViewStatusChange_Stub( + IAdviseSinkEx* This, + DWORD dwViewStatus) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IEnumOleUndoUnits_Next_Proxy( + IEnumOleUndoUnits* This, + ULONG cElt, + IOleUndoUnit **rgElt, + ULONG *pcEltFetched) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IEnumOleUndoUnits_Next_Stub( + IEnumOleUndoUnits* This, + ULONG cElt, + IOleUndoUnit **rgElt, + ULONG *pcEltFetched) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT CALLBACK IQuickActivate_QuickActivate_Proxy( + IQuickActivate* This, + QACONTAINER *pQaContainer, + QACONTROL *pQaControl) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} + +HRESULT __RPC_STUB IQuickActivate_QuickActivate_Stub( + IQuickActivate* This, + QACONTAINER *pQaContainer, + QACONTROL *pQaControl) +{ + FIXME("not implemented\n"); + return E_NOTIMPL; +} diff --git a/dlls/oledlg/oledlg_Zh.rc b/dlls/oledlg/oledlg_Zh.rc new file mode 100644 index 00000000000..7362256ec5b --- /dev/null +++ b/dlls/oledlg/oledlg_Zh.rc @@ -0,0 +1,180 @@ +/* + * oledlg (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "插入对象" +FONT 9, "MS Song" +BEGIN + LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL | + WS_TABSTOP + LTEXT "对象类型:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE + DEFPUSHBUTTON "确定",IDOK,221,7,66,14 + PUSHBUTTON "取消",IDCANCEL,221,24,66,14 + GROUPBOX "结果",IDC_RESULT,7,103,208,41 + CONTROL "新建",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,7,20,62,10 + CONTROL "建立控件",IDC_CREATECONTROL,"Button", + BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10 + CONTROL "建立于文件",IDC_CREATEFROMFILE,"Button", + BS_AUTORADIOBUTTON,7,37,67,10 + LTEXT "",IDC_RESULTDESC,49,112,159,23 + PUSHBUTTON "添加控件(&A)...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE + CONTROL "显示为图标",IDC_ASICON,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10 + PUSHBUTTON "浏览...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE + LTEXT "文件:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE + EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_RESULTOBJDESC "在你的文件中插入一个新的 %s 对象" + IDS_RESULTFILEOBJDESC "将文件的内容以对象的方式插入到你的文件以便你可以用创建本文件的程序来激活它." + IDS_BROWSE "浏览" + IDS_NOTOLEMOD "本文件不像是一个有效的 OLE 模型. 不能注册 OLE 控件." + IDS_NOTOLEMODCAPTION "添加控件" +} + +IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "特殊粘贴" +FONT 9, "MS Song" +BEGIN + LTEXT "源:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP + CONTROL "粘贴(&P)", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, + 6, 38, 55, 10 + CONTROL "粘贴链接(&L)", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE, + 6, 63, 55, 10 + LTEXT "为(&A):", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP + LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE + LISTBOX IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE + LISTBOX IDC_PS_DISPLAYLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE + CONTROL "确定", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14 + CONTROL "取消", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14 + CONTROL "帮助(&H)", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14 + CONTROL "显示为图标(&D)", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14 + CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44 + CONTROL "改变图标(&I)...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14 + CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34 + CONTROL "<< result text goes here >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35 + CONTROL "结果", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48 + CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8 +END + +STRINGTABLE DISCARDABLE +{ + IDS_PS_PASTE_DATA "将剪贴板的内容以 %s 插入到你的文件." + IDS_PS_PASTE_OBJECT "将剪贴板的内容插入到你的文件以便你可以使用 %s." + IDS_PS_PASTE_OBJECT_AS_ICON "将剪贴板的内容插入到你的文件以便你可以用 %s 激活它, 一般显示为图标." + IDS_PS_PASTE_LINK_DATA "将剪贴板的内容以 %s 插入到你的文件. 数据是链接到源文件的, 对源文件的任何改动都会反应到你的文件." + IDS_PS_PASTE_LINK_OBJECT "将剪贴板的图像插入到你的文件. 图像是链接到源文件的, 对源文件的任何改动都会反应到你的文件." + IDS_PS_PASTE_LINK_OBJECT_AS_ICON "将剪贴板的捷径插入到你的文件. 捷径是链接到源文件的, 对源文件的任何改动都会反应到你的文件." + IDS_PS_NON_OLE "将剪贴板的内容插入到你的文件." + IDS_PS_UNKNOWN_TYPE "不明类型" + IDS_PS_UNKNOWN_SRC "不明来源" + IDS_PS_UNKNOWN_APP "不明应用程序" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +UIINSERTOBJECT DIALOG DISCARDABLE 0, 0, 294, 151 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "插入對象" +FONT 8, "PMingLiu" +BEGIN + LISTBOX IDC_OBJTYPELIST,82,19,131,66,LBS_SORT | + LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL | + WS_TABSTOP + LTEXT "對象類型:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE + DEFPUSHBUTTON "確定",IDOK,221,7,66,14 + PUSHBUTTON "取消",IDCANCEL,221,24,66,14 + GROUPBOX "結果",IDC_RESULT,7,103,208,41 + CONTROL "新建",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,7,20,62,10 + CONTROL "建立控件",IDC_CREATECONTROL,"Button", + BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10 + CONTROL "建立於檔案",IDC_CREATEFROMFILE,"Button", + BS_AUTORADIOBUTTON,7,37,67,10 + LTEXT "",IDC_RESULTDESC,49,112,159,23 + PUSHBUTTON "添加控件(&A)...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE + CONTROL "顯示為圖標",IDC_ASICON,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10 + PUSHBUTTON "瀏覽...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE + LTEXT "檔案:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE + EDITTEXT IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_RESULTOBJDESC "在你的檔案中插入一個新的 %s 對象" + IDS_RESULTFILEOBJDESC "將檔案的內容以對象的方式插入到你的檔案以便你可以用創建本檔案的程式來激活它." + IDS_BROWSE "瀏覽" + IDS_NOTOLEMOD "本檔案不像是一個有效的 OLE 模型. 不能註冊 OLE 控件." + IDS_NOTOLEMODCAPTION "添加控件" +} + +IDD_PASTESPECIAL4 DIALOG DISCARDABLE 3, 15, 293, 140 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "特殊貼上" +FONT 8, "PMingLiu" +BEGIN + LTEXT "源:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP + CONTROL "貼上(&P)", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, + 6, 38, 55, 10 + CONTROL "貼上鏈接(&L)", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE, + 6, 63, 55, 10 + LTEXT "為(&A):", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP + LISTBOX IDC_PS_PASTELIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE + LISTBOX IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE + LISTBOX IDC_PS_DISPLAYLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE + CONTROL "確定", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14 + CONTROL "取消", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14 + CONTROL "幫助(&H)", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14 + CONTROL "顯示為圖標(&D)", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14 + CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44 + CONTROL "改變圖標(&I)...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14 + CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34 + CONTROL "<< result text goes here >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35 + CONTROL "結果", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48 + CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8 +END + +STRINGTABLE DISCARDABLE +{ + IDS_PS_PASTE_DATA "將剪貼板的內容以 %s 插入到你的檔案." + IDS_PS_PASTE_OBJECT "將剪貼板的內容插入到你的檔案以便你可以使用 %s." + IDS_PS_PASTE_OBJECT_AS_ICON "將剪貼板的內容插入到你的檔案以便你可以用 %s 激活它, 一般顯示為圖標." + IDS_PS_PASTE_LINK_DATA "將剪貼板的內容以 %s 插入到你的檔案. 數據是鏈接到源檔案的, 對源檔案的任何改動都會反應到你的檔案." + IDS_PS_PASTE_LINK_OBJECT "將剪貼板的圖像插入到你的檔案. 圖像是鏈接到源檔案的, 對源檔案的任何改動都會反應到你的檔案." + IDS_PS_PASTE_LINK_OBJECT_AS_ICON "將剪貼板的捷徑插入到你的檔案. 捷徑是鏈接到源檔案的, 對源檔案的任何改動都會反應到你的檔案." + IDS_PS_NON_OLE "將剪貼板的內容插入到你的檔案." + IDS_PS_UNKNOWN_TYPE "不明類型" + IDS_PS_UNKNOWN_SRC "不明來源" + IDS_PS_UNKNOWN_APP "不明應用程式" +} + +#pragma code_page(default) diff --git a/dlls/oledlg/rsrc.rc b/dlls/oledlg/rsrc.rc index bfe46523edf..6379efcb4f8 100644 --- a/dlls/oledlg/rsrc.rc +++ b/dlls/oledlg/rsrc.rc @@ -51,3 +51,4 @@ #include "oledlg_Si.rc" #include "oledlg_Sv.rc" #include "oledlg_Tr.rc" +#include "oledlg_Zh.rc" diff --git a/dlls/quartz/pin.c b/dlls/quartz/pin.c index e2b868e397c..bcf09a5d98d 100644 --- a/dlls/quartz/pin.c +++ b/dlls/quartz/pin.c @@ -1611,6 +1611,7 @@ static DWORD WINAPI PullPin_Thread_Main(LPVOID pv) default: ERR("Unknown state request: %d\n", This->state); break; } } + return 0; } static HRESULT PullPin_InitProcessing(PullPin * This) diff --git a/dlls/quartz/tests/avisplitter.c b/dlls/quartz/tests/avisplitter.c index cdebe26f018..82fd4cfa77d 100644 --- a/dlls/quartz/tests/avisplitter.c +++ b/dlls/quartz/tests/avisplitter.c @@ -477,4 +477,6 @@ START_TEST(avisplitter) test_threads(); release_avisplitter(); + + CoUninitialize(); } diff --git a/dlls/rasapi32/tests/rasapi.c b/dlls/rasapi32/tests/rasapi.c index a997e02d87f..64d1f6658bd 100644 --- a/dlls/rasapi32/tests/rasapi.c +++ b/dlls/rasapi32/tests/rasapi.c @@ -77,28 +77,32 @@ static void test_rasenum(void) /* test first parameter */ cb = bufsize; result = pRasEnumDevicesA(NULL, &cb, &cDevices); - ok(result == ERROR_BUFFER_TOO_SMALL, + ok(result == ERROR_BUFFER_TOO_SMALL || + result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_BUFFER_TOO_SMALL, got %08d\n", result); rasDevInfo[0].dwSize = 0; cb = bufsize; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); todo_wine - ok(result == ERROR_INVALID_SIZE, + ok(result == ERROR_INVALID_SIZE || + result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); rasDevInfo[0].dwSize = sizeof(RASDEVINFOA) -1; cb = bufsize; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); todo_wine - ok(result == ERROR_INVALID_SIZE, + ok(result == ERROR_INVALID_SIZE || + result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); rasDevInfo[0].dwSize = sizeof(RASDEVINFOA) +1; cb = bufsize; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); todo_wine - ok(result == ERROR_INVALID_SIZE, + ok(result == ERROR_INVALID_SIZE || + result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); /* test second parameter */ @@ -139,14 +143,16 @@ static void test_rasenum(void) "Expected ERROR_INVALID_PARAMETER, got %08d\n", result); result = pRasEnumDevicesA(NULL, &cb, NULL); - ok(result == ERROR_INVALID_PARAMETER, + ok(result == ERROR_INVALID_PARAMETER || + result == ERROR_INVALID_USER_BUFFER, /* win98 */ "Expected ERROR_INVALID_PARAMETER, got %08d\n", result); cb = 0; rasDevInfo[0].dwSize = 0; result = pRasEnumDevicesA(rasDevInfo, &cb, &cDevices); todo_wine - ok(result == ERROR_INVALID_SIZE, + ok(result == ERROR_INVALID_SIZE || + broken(result == ERROR_BUFFER_TOO_SMALL), /* win98 */ "Expected ERROR_INVALID_SIZE, got %08d\n", result); HeapFree(GetProcessHeap(), 0, rasDevInfo); diff --git a/dlls/riched20/editor.h b/dlls/riched20/editor.h index 5e73c97cb45..b9c01b790d5 100644 --- a/dlls/riched20/editor.h +++ b/dlls/riched20/editor.h @@ -23,7 +23,7 @@ extern HANDLE me_heap; -static inline void *heap_alloc( size_t len ) +static inline void __WINE_ALLOC_SIZE(1) *heap_alloc( size_t len ) { return HeapAlloc( me_heap, 0, len ); } @@ -33,7 +33,7 @@ static inline BOOL heap_free( void *ptr ) return HeapFree( me_heap, 0, ptr ); } -static inline void *heap_realloc( void *ptr, size_t len ) +static inline void __WINE_ALLOC_SIZE(2) *heap_realloc( void *ptr, size_t len ) { return HeapReAlloc( me_heap, 0, ptr, len ); } diff --git a/dlls/riched20/table.c b/dlls/riched20/table.c index 6289e345853..9cb4bbffd65 100644 --- a/dlls/riched20/table.c +++ b/dlls/riched20/table.c @@ -29,7 +29,7 @@ * Richedit version 1.0 - 3.0: * Tables are implemented in these versions using tabs at the end of cells, * and tab stops to position the cells. The paragraph format flag PFE_TABLE - * will indicate the the paragraph is a table row. Note that in this + * will indicate that the paragraph is a table row. Note that in this * implementation there is one paragraph per table row. * * Richedit version 4.1: @@ -37,7 +37,7 @@ * each with it's own paragraph format, and cells may even contain tables * nested within the cell. * - * There are is also a paragraph at the start of each table row that contains + * There is also a paragraph at the start of each table row that contains * the rows paragraph format (e.g. to change the row alignment to row), and a * paragraph at the end of the table row with the PFE_TABLEROWDELIMITER flag * set. The paragraphs at the start and end of the table row should always be diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c index 765e8e27d3f..6603e5c625e 100644 --- a/dlls/riched20/tests/editor.c +++ b/dlls/riched20/tests/editor.c @@ -32,6 +32,17 @@ #include #include +static CHAR string1[MAX_PATH], string2[MAX_PATH]; + +#define ok_w2(format, szString1, szString2) \ +\ + if (lstrcmpW(szString1, szString2) != 0) \ + { \ + WideCharToMultiByte(CP_ACP, 0, szString1, -1, string1, MAX_PATH, NULL, NULL); \ + WideCharToMultiByte(CP_ACP, 0, szString2, -1, string2, MAX_PATH, NULL, NULL); \ + ok(0, format, string1, string2); \ + } + static HMODULE hmoduleRichEdit; static HWND new_window(LPCTSTR lpClassName, DWORD dwStyle, HWND parent) { @@ -3439,9 +3450,7 @@ static void test_EM_SETTEXTEX(void) setText.flags = ST_SELECTION; SendMessage(hwndRichEdit, EM_SETTEXTEX, (WPARAM)&setText, (LPARAM) buf); SendMessage(hwndRichEdit, EM_GETTEXTEX, (WPARAM)&getText, (LPARAM) buf); - ok(lstrcmpW(buf, TestItem1alt) == 0, - "EM_GETTEXTEX results not what was set by EM_SETTEXTEX when" - " using ST_SELECTION on an RTF string and non-Unicode\n"); + ok_w2("Expected \"%s\", got \"%s\"\n", TestItem1alt, buf); /* The following test demonstrates that EM_SETTEXTEX replacing a selection */ setText.codepage = 1200; /* no constant for unicode */ diff --git a/dlls/riched20/wrap.c b/dlls/riched20/wrap.c index a3c5d544ff6..6f6e32ce1e8 100644 --- a/dlls/riched20/wrap.c +++ b/dlls/riched20/wrap.c @@ -377,7 +377,7 @@ static ME_DisplayItem *ME_WrapHandleRun(ME_WrapContext *wc, ME_DisplayItem *p) } /* will current run fit? */ - if (wc->pt.x + run->nWidth > wc->context->pt.x + wc->nAvailWidth) + if (wc->pt.x + run->nWidth - wc->context->pt.x > wc->nAvailWidth) { int loc = wc->context->pt.x + wc->nAvailWidth - wc->pt.x; /* total white run ? */ diff --git a/dlls/rpcrt4/tests/ndr_marshall.c b/dlls/rpcrt4/tests/ndr_marshall.c index 67dfae5d784..3cd13373acc 100644 --- a/dlls/rpcrt4/tests/ndr_marshall.c +++ b/dlls/rpcrt4/tests/ndr_marshall.c @@ -1184,7 +1184,6 @@ static void test_client_init(void) TEST_ZERO(PointerLength, "%d"); TEST_ZERO(fInDontFree, "%d"); TEST_ZERO(fDontCallFreeInst, "%d"); - TEST_ZERO(fInOnlyParam, "%d"); ok(stubMsg.fInOnlyParam == 0 || stubMsg.fInOnlyParam == -1, /* Vista */ "fInOnlyParam should have been set to 0 or -1 instead of %d\n", stubMsg.fInOnlyParam); diff --git a/dlls/rpcrt4/tests/rpc.c b/dlls/rpcrt4/tests/rpc.c index bcd6a65107c..9f2684e86ba 100644 --- a/dlls/rpcrt4/tests/rpc.c +++ b/dlls/rpcrt4/tests/rpc.c @@ -328,7 +328,9 @@ static void test_towers(void) BOOL same; ret = TowerConstruct(&mapi_if_id, &ndr_syntax, "ncacn_ip_tcp", "135", "10.0.0.1", &tower); - ok(ret == RPC_S_OK, "TowerConstruct failed with error %ld\n", ret); + ok(ret == RPC_S_OK || + broken(ret == RPC_S_INVALID_RPC_PROTSEQ), /* Vista */ + "TowerConstruct failed with error %ld\n", ret); if (ret == RPC_S_INVALID_RPC_PROTSEQ) { /* Windows Vista fails with this error and crashes if we continue */ diff --git a/dlls/sane.ds/rsrc.rc b/dlls/sane.ds/rsrc.rc index 299ee9629db..8b8483d3a0d 100644 --- a/dlls/sane.ds/rsrc.rc +++ b/dlls/sane.ds/rsrc.rc @@ -39,3 +39,4 @@ #include "sane_Ru.rc" #include "sane_Si.rc" #include "sane_Sv.rc" +#include "sane_Zh.rc" diff --git a/dlls/sane.ds/sane_Zh.rc b/dlls/sane.ds/sane_Zh.rc new file mode 100644 index 00000000000..6c9f7d221b7 --- /dev/null +++ b/dlls/sane.ds/sane_Zh.rc @@ -0,0 +1,66 @@ +/* + * Twain (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 46 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTER | DS_SETFOREGROUND +CAPTION "正在扫描" +FONT 9, "MS Song" +BEGIN + LTEXT "正在扫描... 请稍候",IDC_STATIC,5,19,176,8, SS_CENTER +END + +STRINGTABLE DISCARDABLE +{ + 0 "" + 1 "px" + 2 "b" + 3 "mm" + 4 "dpi" + 5 "%" + 6 "ns" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 186, 46 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | DS_CENTER | DS_SETFOREGROUND +CAPTION "正在掃描" +FONT 8, "PMingLiu" +BEGIN + LTEXT "正在掃描... 請稍候",IDC_STATIC,5,19,176,8, SS_CENTER +END + +STRINGTABLE DISCARDABLE +{ + 0 "" + 1 "px" + 2 "b" + 3 "mm" + 4 "dpi" + 5 "%" + 6 "ns" +} + +#pragma code_page(default) diff --git a/dlls/schannel/tests/main.c b/dlls/schannel/tests/main.c index 814b60a696c..5575cc15b1d 100644 --- a/dlls/schannel/tests/main.c +++ b/dlls/schannel/tests/main.c @@ -148,7 +148,9 @@ static void testGetInfo(void) PackageInfo.fCapabilities); ok(PackageInfo.wVersion == 1, "wVersion: %d\n", PackageInfo.wVersion); ok(PackageInfo.wRPCID == 14, "wRPCID: %d\n", PackageInfo.wRPCID); - ok(PackageInfo.cbMaxToken == 0x4000, "cbMaxToken: 0x%lx\n", + ok(PackageInfo.cbMaxToken == 0x4000 || + PackageInfo.cbMaxToken == 0x6000, /* Vista */ + "cbMaxToken: 0x%lx\n", PackageInfo.cbMaxToken); /* Second package: SChannel */ diff --git a/dlls/serialui/Zh.rc b/dlls/serialui/Zh.rc new file mode 100644 index 00000000000..37736831141 --- /dev/null +++ b/dlls/serialui/Zh.rc @@ -0,0 +1,72 @@ +/* + * serialui (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_SERIALUICONFIG DIALOG DISCARDABLE 0, 0, 160, 159 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "属性 - " +FONT 9, "MS Song" +BEGIN + LTEXT "速度", 0,5,20,55,10 + COMBOBOX IDC_BAUD, 60, 20, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Parity", 0,5,40,55,10 + COMBOBOX IDC_PARITY, 60, 40, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "流程控制", 0,5,60,55,10 + COMBOBOX IDC_FLOW, 60, 60, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "数据位", 0,5,80,55,10 + COMBOBOX IDC_DATA, 60, 80, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "停止位", 0,5,100,55,10 + COMBOBOX IDC_STOP, 60, 100, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "确定", IDOK,30,138,50,14 + PUSHBUTTON "取消", IDCANCEL,85,138,50,14 + /* these two buttons are for testing Get/SetDefaultCommConfig */ + /* PUSHBUTTON "GetDefault", ID_GETDEFAULT,30,115,50,14 */ + /* PUSHBUTTON "SetDefault", ID_SETDEFAULT,85,115,50,14 */ +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_SERIALUICONFIG DIALOG DISCARDABLE 0, 0, 160, 159 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE +CAPTION "屬性 - " +FONT 8, "PMingLiu" +BEGIN + LTEXT "速度", 0,5,20,55,10 + COMBOBOX IDC_BAUD, 60, 20, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "Parity", 0,5,40,55,10 + COMBOBOX IDC_PARITY, 60, 40, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "流程控制", 0,5,60,55,10 + COMBOBOX IDC_FLOW, 60, 60, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "數據位", 0,5,80,55,10 + COMBOBOX IDC_DATA, 60, 80, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "停止位", 0,5,100,55,10 + COMBOBOX IDC_STOP, 60, 100, 90, 36, CBS_DROPDOWNLIST|CBS_AUTOHSCROLL|WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "確定", IDOK,30,138,50,14 + PUSHBUTTON "取消", IDCANCEL,85,138,50,14 + /* these two buttons are for testing Get/SetDefaultCommConfig */ + /* PUSHBUTTON "GetDefault", ID_GETDEFAULT,30,115,50,14 */ + /* PUSHBUTTON "SetDefault", ID_SETDEFAULT,85,115,50,14 */ +END + +#pragma code_page(default) diff --git a/dlls/serialui/serialui_rc.rc b/dlls/serialui/serialui_rc.rc index 72c8466a2d4..6cae0f79bfe 100644 --- a/dlls/serialui/serialui_rc.rc +++ b/dlls/serialui/serialui_rc.rc @@ -40,3 +40,4 @@ #include "Ru.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/dlls/setupapi/Zh.rc b/dlls/setupapi/Zh.rc new file mode 100644 index 00000000000..a2f6a8db9d0 --- /dev/null +++ b/dlls/setupapi/Zh.rc @@ -0,0 +1,54 @@ +/* + * SETUPAPI (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "复制文件..." +FONT 9, "MS Song" +BEGIN + PUSHBUTTON "取消", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "源文件:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "目标文件:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 +STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION +CAPTION "複製檔案..." +FONT 8, "PMingLiu" +BEGIN + PUSHBUTTON "取消", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + LTEXT "源檔案:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "目標檔案:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +#pragma code_page(default) diff --git a/dlls/setupapi/setupapi.rc b/dlls/setupapi/setupapi.rc index a7519dd827c..affbe5c5df7 100644 --- a/dlls/setupapi/setupapi.rc +++ b/dlls/setupapi/setupapi.rc @@ -44,3 +44,4 @@ #include "Ru.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/dlls/shdoclc/Zh.rc b/dlls/shdoclc/Zh.rc new file mode 100644 index 00000000000..f3570e840ce --- /dev/null +++ b/dlls/shdoclc/Zh.rc @@ -0,0 +1,483 @@ +/* + * shdoclc (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE DISCARDABLE +{ + IDS_MESSAGE_BOX_TITLE, "Wine Internet Explorer" +} + +STRINGTABLE DISCARDABLE +{ + IDS_PRINT_HEADER_TEMPLATE "&w&bPage &p" /* FIXME: should be "&w&bPage &p of &P" */ + IDS_PRINT_FOOTER_TEMPLATE "&u&b&d" +} + +IDR_BROWSE_CONTEXT_MENU MENU +{ + POPUP "默认" + { + MENUITEM "向后(&B)", IDM_GOBACKWARD + MENUITEM "向前(&O)", IDM_GOFORWARD + MENUITEM SEPARATOR + MENUITEM "将背景存为(&S)...", IDM_SAVEBACKGROUND + MENUITEM "设为背景(&G)", IDM_SETWALLPAPER + MENUITEM "复制背景(&C)", IDM_COPYBACKGROUND + MENUITEM "设置到桌面(&D)", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "全选(&A)", IDM_SELECTALL + MENUITEM "粘贴(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "创建捷径(&T)", IDM_CREATESHORTCUT + MENUITEM "添加到我的最爱(&F)", IDM_ADDFAVORITES + MENUITEM "查看源代码(&V)", IDM_VIEWSOURCE + MENUITEM SEPARATOR + MENUITEM "语言编码(&E)", IDM_LANGUAGE + MENUITEM SEPARATOR + MENUITEM "打印(&I)", IDM_PRINT + MENUITEM "刷新(&R)", _IDM_REFRESH + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "属性(&P)", IDM_PROPERTIES + } + + POPUP "图片" + { + MENUITEM "打开链接(&O)", IDM_FOLLOWLINKC + MENUITEM "在新视窗打开链接(&N)", IDM_FOLLOWLINKN + MENUITEM "将目标存为(&A)", IDM_SAVETARGET + MENUITEM "打印目标(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "显示图片(&S)", IDM_SHOWPICTURE + MENUITEM "将图片存为(&A)", IDM_SAVEPICTURE + MENUITEM "电邮图片(&E)", IDM_MP_EMAILPICTURE + MENUITEM "打印图片(&I)...", IDM_MP_PRINTPICTURE + MENUITEM "到我的图片(&G)", IDM_MP_MYPICS + MENUITEM "设为背景(&G)", IDM_SETWALLPAPER + MENUITEM "设为桌面项目(&D)...", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "剪切(&T)", IDM_CUT + MENUITEM "复制(&C)", IDM_COPY + MENUITEM "复制捷径(&T)", IDM_COPYSHORTCUT + MENUITEM "粘贴(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最爱(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "属性(&R)", IDM_PROPERTIES + } + + POPUP "控制" + { + MENUITEM "撤销(&U)", IDM_UNDO + MENUITEM SEPARATOR + MENUITEM "剪切(&T)", IDM_CUT + MENUITEM "复制(&C)", IDM_COPY + MENUITEM "粘贴(&P)", IDM_PASTE + MENUITEM "删除(&D", IDM_DELETE + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "全选(&A)", IDM_SELECTALL + } + + POPUP "表格" + { + POPUP "选择(&S)" + { + MENUITEM "格(&C)", IDM_CELLSELECT + MENUITEM "行(&R)", IDM_ROWSELECT + MENUITEM "列(&O)", IDM_COLUMNSELECT + MENUITEM "表格(&T)", IDM_TABLESELECT + } + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "格属性(&C)", IDM_CELLPROPERTIES + MENUITEM "表格属性(&T)", IDM_TABLEPROPERTIES + } + + POPUP "1DSite Select" + { + MENUITEM "剪切(&T)", IDM_CUT + MENUITEM "复制(&C)", IDM_COPY + MENUITEM "粘贴", IDM_PASTE + MENUITEM "全选(&A)", IDM_SELECTALL + MENUITEM "打印(&P)", IDM_PRINT + MENUITEM SEPARATOR + } + + POPUP "Anchor" + { + MENUITEM "打开(&O)", IDM_FOLLOWLINKC + MENUITEM "打开新窗口(&N)", IDM_FOLLOWLINKN + MENUITEM "将目标存为(&A)...", IDM_SAVETARGET + MENUITEM "打印目标(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "剪下", IDM_CUT + MENUITEM "复制(&C)", IDM_COPY + MENUITEM "复制捷径(&T)", IDM_COPYSHORTCUT + MENUITEM "粘贴(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最爱(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "属性(&R)", IDM_PROPERTIES + } + + POPUP "Context Unknown" + { + MENUITEM SEPARATOR + } + + POPUP "DYNSRC 图片" + { + MENUITEM "打开链接(&O)", IDM_FOLLOWLINKC + MENUITEM "在新窗口打开链接(&N)", IDM_FOLLOWLINKN + MENUITEM "将目标存为(&A)...", IDM_SAVETARGET + MENUITEM "打印目标(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "显示图片(&S)", IDM_SHOWPICTURE + MENUITEM "将视频存为(&V)...", IDM_SAVEPICTURE + MENUITEM "设为背景(&G)", IDM_SETWALLPAPER + MENUITEM "设为桌面项目(&D)...", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "剪切(&T)", IDM_CUT + MENUITEM "复制(&C)", IDM_COPY + MENUITEM "复制捷径(&T)", IDM_COPYSHORTCUT + MENUITEM "粘贴(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最爱(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "播放", IDM_DYNSRCPLAY + MENUITEM "停止", IDM_DYNSRCSTOP + MENUITEM "属性(&R)", IDM_PROPERTIES + } + + POPUP "ART 图片" + { + MENUITEM "打开链接(&O)", IDM_FOLLOWLINKC + MENUITEM "在新窗口打开链接(&N)", IDM_FOLLOWLINKN + MENUITEM "将目标存为(&A)", IDM_SAVETARGET + MENUITEM "打印目标(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "显示图片(&S)", IDM_SHOWPICTURE + MENUITEM "将图片存为(&A)", IDM_SAVEPICTURE + MENUITEM "设为背景(&G)", IDM_SETWALLPAPER + MENUITEM "设为桌面项目(&D)...", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "剪切(&T)", IDM_CUT + MENUITEM "复制(&C)", IDM_COPY + MENUITEM "复制捷径(&T)", IDM_COPYSHORTCUT + MENUITEM "粘贴(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最爱(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM "播放", IDM_IMGARTPLAY + MENUITEM "停止", IDM_IMGARTSTOP + MENUITEM "倒回", IDM_IMGARTREWIND + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "属性(&R)", IDM_PROPERTIES + } + + POPUP "调试" + { + MENUITEM "跟踪标记", IDM_TRACETAGS + MENUITEM "资源失败", IDM_RESOURCEFAILURES + MENUITEM "输出跟踪信息", IDM_DUMPTRACKINGINFO + MENUITEM "调试停点", IDM_DEBUGBREAK + MENUITEM "调试视图", IDM_DEBUGVIEW + MENUITEM "输出 Tree", IDM_DUMPTREE + MENUITEM "输出 Lines", IDM_DUMPLINES + MENUITEM "输出 DisplayTree", IDM_DUMPDISPLAYTREE + MENUITEM "输出 FormatCaches", IDM_DUMPFORMATCACHES + MENUITEM "输出 LayoutRects", IDM_DUMPLAYOUTRECTS + MENUITEM "内存监视器", IDM_MEMORYMONITOR + MENUITEM "性能表", IDM_PERFORMANCEMETERS + MENUITEM "保存 HTML", IDM_SAVEHTML + MENUITEM SEPARATOR + MENUITEM "浏览(&B)", IDM_BROWSEMODE + MENUITEM "编辑(&E)", IDM_EDITMODE + } + + POPUP "垂直滚动条" + { + MENUITEM "滚动这里", IDM_SCROLL_HERE + MENUITEM SEPARATOR + MENUITEM "顶", IDM_SCROLL_TOP + MENUITEM "低", IDM_SCROLL_BOTTOM + MENUITEM SEPARATOR + MENUITEM "向上翻页", IDM_SCROLL_PAGEUP + MENUITEM "向下翻页", IDM_SCROLL_PAGEDOWN + MENUITEM SEPARATOR + MENUITEM "向上滚动", IDM_SCROLL_UP + MENUITEM "向下滚动", IDM_SCROLL_DOWN + } + + POPUP "水平滚动条" + { + MENUITEM "滚动这里", IDM_SCROLL_HERE + MENUITEM SEPARATOR + MENUITEM "左边缘", IDM_SCROLL_LEFTEDGE + MENUITEM "右边缘", IDM_SCROLL_RIGHTEDGE + MENUITEM SEPARATOR + MENUITEM "向左翻页", IDM_SCROLL_PAGELEFT + MENUITEM "向右翻页", IDM_SCROLL_PAGERIGHT + MENUITEM SEPARATOR + MENUITEM "向左滚动", IDM_SCROLL_LEFT + MENUITEM "向右滚动", IDM_SCROLL_RIGHT + } +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE DISCARDABLE +{ + IDS_MESSAGE_BOX_TITLE, "Wine Internet Explorer" +} + +STRINGTABLE DISCARDABLE +{ + IDS_PRINT_HEADER_TEMPLATE "&w&bPage &p" /* FIXME: should be "&w&bPage &p of &P" */ + IDS_PRINT_FOOTER_TEMPLATE "&u&b&d" +} + +IDR_BROWSE_CONTEXT_MENU MENU +{ + POPUP "默認" + { + MENUITEM "向後(&B)", IDM_GOBACKWARD + MENUITEM "向前(&O)", IDM_GOFORWARD + MENUITEM SEPARATOR + MENUITEM "將背景存為(&S)...", IDM_SAVEBACKGROUND + MENUITEM "設為背景(&G)", IDM_SETWALLPAPER + MENUITEM "複製背景(&C)", IDM_COPYBACKGROUND + MENUITEM "設定到桌面(&D)", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "全選(&A)", IDM_SELECTALL + MENUITEM "貼上(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "創建捷徑(&T)", IDM_CREATESHORTCUT + MENUITEM "添加到我的最愛(&F)", IDM_ADDFAVORITES + MENUITEM "查看源代碼(&V)", IDM_VIEWSOURCE + MENUITEM SEPARATOR + MENUITEM "語言編碼(&E)", IDM_LANGUAGE + MENUITEM SEPARATOR + MENUITEM "列印(&I)", IDM_PRINT + MENUITEM "刷新(&R)", _IDM_REFRESH + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "屬性(&P)", IDM_PROPERTIES + } + + POPUP "圖片" + { + MENUITEM "開啟鏈接(&O)", IDM_FOLLOWLINKC + MENUITEM "在新視窗開啟鏈接(&N)", IDM_FOLLOWLINKN + MENUITEM "將目標存為(&A)", IDM_SAVETARGET + MENUITEM "列印目標(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "顯示圖片(&S)", IDM_SHOWPICTURE + MENUITEM "將圖片存為(&A)", IDM_SAVEPICTURE + MENUITEM "電郵圖片(&E)", IDM_MP_EMAILPICTURE + MENUITEM "列印圖片(&I)...", IDM_MP_PRINTPICTURE + MENUITEM "到我的圖片(&G)", IDM_MP_MYPICS + MENUITEM "設為背景(&G)", IDM_SETWALLPAPER + MENUITEM "設為桌面項目(&D)...", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "剪下(&T)", IDM_CUT + MENUITEM "複製(&C)", IDM_COPY + MENUITEM "複製捷徑(&T)", IDM_COPYSHORTCUT + MENUITEM "貼上(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最愛(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "屬性(&R)", IDM_PROPERTIES + } + + POPUP "控制" + { + MENUITEM "復原(&U)", IDM_UNDO + MENUITEM SEPARATOR + MENUITEM "剪下(&T)", IDM_CUT + MENUITEM "複製(&C)", IDM_COPY + MENUITEM "貼上(&P)", IDM_PASTE + MENUITEM "刪除(&D", IDM_DELETE + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "全選(&A)", IDM_SELECTALL + } + + POPUP "表格" + { + POPUP "選擇(&S)" + { + MENUITEM "格(&C)", IDM_CELLSELECT + MENUITEM "行(&R)", IDM_ROWSELECT + MENUITEM "列(&O)", IDM_COLUMNSELECT + MENUITEM "表格(&T)", IDM_TABLESELECT + } + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "格屬性(&C)", IDM_CELLPROPERTIES + MENUITEM "表格屬性(&T)", IDM_TABLEPROPERTIES + } + + POPUP "1DSite Select" + { + MENUITEM "剪下(&T)", IDM_CUT + MENUITEM "複製(&C)", IDM_COPY + MENUITEM "貼上", IDM_PASTE + MENUITEM "全選(&A)", IDM_SELECTALL + MENUITEM "列印(&P)", IDM_PRINT + MENUITEM SEPARATOR + } + + POPUP "Anchor" + { + MENUITEM "開啟(&O)", IDM_FOLLOWLINKC + MENUITEM "開啟新窗口(&N)", IDM_FOLLOWLINKN + MENUITEM "將目標存為(&A)...", IDM_SAVETARGET + MENUITEM "列印目標(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "剪下", IDM_CUT + MENUITEM "複製(&C)", IDM_COPY + MENUITEM "複製捷徑(&T)", IDM_COPYSHORTCUT + MENUITEM "貼上(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最愛(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "屬性(&R)", IDM_PROPERTIES + } + + POPUP "Context Unknown" + { + MENUITEM SEPARATOR + } + + POPUP "DYNSRC 圖片" + { + MENUITEM "開啟鏈接(&O)", IDM_FOLLOWLINKC + MENUITEM "在新窗口開啟鏈接(&N)", IDM_FOLLOWLINKN + MENUITEM "將目標存為(&A)...", IDM_SAVETARGET + MENUITEM "列印目標(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "顯示圖片(&S)", IDM_SHOWPICTURE + MENUITEM "將視頻存為(&V)...", IDM_SAVEPICTURE + MENUITEM "設為背景(&G)", IDM_SETWALLPAPER + MENUITEM "設為桌面項目(&D)...", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "剪下(&T)", IDM_CUT + MENUITEM "複製(&C)", IDM_COPY + MENUITEM "複製捷徑(&T)", IDM_COPYSHORTCUT + MENUITEM "貼上(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最愛(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "播放", IDM_DYNSRCPLAY + MENUITEM "停止", IDM_DYNSRCSTOP + MENUITEM "屬性(&R)", IDM_PROPERTIES + } + + POPUP "ART 圖片" + { + MENUITEM "開啟鏈接(&O)", IDM_FOLLOWLINKC + MENUITEM "在新窗口開啟鏈接(&N)", IDM_FOLLOWLINKN + MENUITEM "將目標存為(&A)", IDM_SAVETARGET + MENUITEM "列印目標(&P)", IDM_PRINTTARGET + MENUITEM SEPARATOR + MENUITEM "顯示圖片(&S)", IDM_SHOWPICTURE + MENUITEM "將圖片存為(&A)", IDM_SAVEPICTURE + MENUITEM "設為背景(&G)", IDM_SETWALLPAPER + MENUITEM "設為桌面項目(&D)...", IDM_SETDESKTOPITEM + MENUITEM SEPARATOR + MENUITEM "剪下(&T)", IDM_CUT + MENUITEM "複製(&C)", IDM_COPY + MENUITEM "複製捷徑(&T)", IDM_COPYSHORTCUT + MENUITEM "貼上(&P)", IDM_PASTE + MENUITEM SEPARATOR + MENUITEM "添加到我的最愛(&F)", IDM_ADDFAVORITES + MENUITEM SEPARATOR + MENUITEM "播放", IDM_IMGARTPLAY + MENUITEM "停止", IDM_IMGARTSTOP + MENUITEM "倒回", IDM_IMGARTREWIND + MENUITEM SEPARATOR + MENUITEM SEPARATOR + MENUITEM "屬性(&R)", IDM_PROPERTIES + } + + POPUP "調試" + { + MENUITEM "跟蹤標記", IDM_TRACETAGS + MENUITEM "資源失敗", IDM_RESOURCEFAILURES + MENUITEM "輸出跟蹤資訊", IDM_DUMPTRACKINGINFO + MENUITEM "調試停點", IDM_DEBUGBREAK + MENUITEM "調試檢視", IDM_DEBUGVIEW + MENUITEM "輸出 Tree", IDM_DUMPTREE + MENUITEM "輸出 Lines", IDM_DUMPLINES + MENUITEM "輸出 DisplayTree", IDM_DUMPDISPLAYTREE + MENUITEM "輸出 FormatCaches", IDM_DUMPFORMATCACHES + MENUITEM "輸出 LayoutRects", IDM_DUMPLAYOUTRECTS + MENUITEM "內存監視器", IDM_MEMORYMONITOR + MENUITEM "性能表", IDM_PERFORMANCEMETERS + MENUITEM "儲存 HTML", IDM_SAVEHTML + MENUITEM SEPARATOR + MENUITEM "瀏覽(&B)", IDM_BROWSEMODE + MENUITEM "編輯(&E)", IDM_EDITMODE + } + + POPUP "垂直滾動條" + { + MENUITEM "滾動這裡", IDM_SCROLL_HERE + MENUITEM SEPARATOR + MENUITEM "頂", IDM_SCROLL_TOP + MENUITEM "低", IDM_SCROLL_BOTTOM + MENUITEM SEPARATOR + MENUITEM "向上翻頁", IDM_SCROLL_PAGEUP + MENUITEM "向下翻頁", IDM_SCROLL_PAGEDOWN + MENUITEM SEPARATOR + MENUITEM "向上滾動", IDM_SCROLL_UP + MENUITEM "向下滾動", IDM_SCROLL_DOWN + } + + POPUP "水平滾動條" + { + MENUITEM "滾動這裡", IDM_SCROLL_HERE + MENUITEM SEPARATOR + MENUITEM "左邊緣", IDM_SCROLL_LEFTEDGE + MENUITEM "右邊緣", IDM_SCROLL_RIGHTEDGE + MENUITEM SEPARATOR + MENUITEM "向左翻頁", IDM_SCROLL_PAGELEFT + MENUITEM "向右翻頁", IDM_SCROLL_PAGERIGHT + MENUITEM SEPARATOR + MENUITEM "向左滾動", IDM_SCROLL_LEFT + MENUITEM "向右滾動", IDM_SCROLL_RIGHT + } +} + +#pragma code_page(default) diff --git a/dlls/shdoclc/rsrc.rc b/dlls/shdoclc/rsrc.rc index 47bbbcd4804..3573cb00b99 100644 --- a/dlls/shdoclc/rsrc.rc +++ b/dlls/shdoclc/rsrc.rc @@ -37,3 +37,4 @@ #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/dlls/shdocvw/tests/intshcut.c b/dlls/shdocvw/tests/intshcut.c index bdd6d2be7d8..0b0798ac1f7 100644 --- a/dlls/shdocvw/tests/intshcut.c +++ b/dlls/shdocvw/tests/intshcut.c @@ -171,7 +171,7 @@ static void test_NullURLs(void) hr = urlA->lpVtbl->GetURL(urlA, &url); ok(SUCCEEDED(hr), "getting uninitialized URL unexpectedly failed, hr=0x%x\n", hr); - ok(url == NULL, "unitialized URL is not NULL but %s\n", url); + ok(url == NULL, "uninitialized URL is not NULL but %s\n", url); hr = urlA->lpVtbl->SetURL(urlA, NULL, 0); ok(SUCCEEDED(hr), "setting NULL URL unexpectedly failed, hr=0x%x\n", hr); diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in index d98bdb33ac1..e3dd3122ca9 100644 --- a/dlls/shell32/Makefile.in +++ b/dlls/shell32/Makefile.in @@ -9,6 +9,7 @@ IMPORTS = uuid shlwapi comctl32 user32 gdi32 advapi32 kernel32 ntdll DELAYIMPORTS = ole32 oleaut32 C_SRCS = \ + appbar.c \ autocomplete.c \ brsfolder.c \ changenotify.c \ diff --git a/dlls/shell32/appbar.c b/dlls/shell32/appbar.c new file mode 100644 index 00000000000..a6834c1d83a --- /dev/null +++ b/dlls/shell32/appbar.c @@ -0,0 +1,122 @@ +/* + * SHAppBarMessage implementation + * + * Copyright 2008 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "winerror.h" +#include "shellapi.h" +#include "winuser.h" + +#include "wine/debug.h" +#include "wine/unicode.h" + +WINE_DEFAULT_DEBUG_CHANNEL(appbar); + +struct appbar_cmd +{ + HANDLE return_map; + DWORD return_process; + APPBARDATA abd; +}; + +struct appbar_response +{ + UINT_PTR result; + RECT rc; +}; + +/************************************************************************* + * SHAppBarMessage [SHELL32.@] + */ +UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data) +{ + struct appbar_cmd command; + struct appbar_response* response; + HANDLE return_map; + LPVOID return_view; + HWND appbarmsg_window; + COPYDATASTRUCT cds; + DWORD_PTR msg_result; + static const WCHAR classname[] = {'W','i','n','e','A','p','p','B','a','r',0}; + + UINT_PTR ret = 0; + + TRACE("msg=%d, data={cb=%d, hwnd=%p, callback=%x, edge=%d, rc=%s, lparam=%lx}\n", + msg, data->cbSize, data->hWnd, data->uCallbackMessage, data->uEdge, + wine_dbgstr_rect(&data->rc), data->lParam); + + if (data->cbSize < sizeof(APPBARDATA)) + { + WARN("data at %p is too small\n", data); + return FALSE; + } + + command.abd = *data; + + return_map = CreateFileMappingW(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof(struct appbar_response), NULL); + if (return_map == NULL) + { + ERR("couldn't create file mapping\n"); + return 0; + } + command.return_map = return_map; + + command.return_process = GetCurrentProcessId(); + + appbarmsg_window = FindWindowW(classname, NULL); + if (appbarmsg_window == NULL) + { + ERR("couldn't find appbar window\n"); + CloseHandle(return_map); + return 0; + } + + cds.dwData = msg; + cds.cbData = sizeof(command); + cds.lpData = &command; + + SendMessageTimeoutW(appbarmsg_window, WM_COPYDATA, (WPARAM)data->hWnd, (LPARAM)&cds, SMTO_BLOCK, INFINITE, &msg_result); + + return_view = MapViewOfFile(return_map, FILE_MAP_READ, 0, 0, sizeof(struct appbar_response)); + if (return_view == NULL) + { + ERR("MapViewOfFile failed\n"); + CloseHandle(return_map); + return 0; + } + + response = (struct appbar_response*)return_view; + + ret = response->result; + data->rc = response->rc; + + UnmapViewOfFile(return_view); + + CloseHandle(return_map); + + return ret; +} diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index 30265824b7b..9c400e451dd 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -867,61 +867,6 @@ static void paint_dropline( HDC hdc, HWND hWnd ) } /************************************************************************* - * SHAppBarMessage [SHELL32.@] - */ -UINT_PTR WINAPI SHAppBarMessage(DWORD msg, PAPPBARDATA data) -{ - int width=data->rc.right - data->rc.left; - int height=data->rc.bottom - data->rc.top; - RECT rec=data->rc; - - FIXME("msg=%d, data={cb=%d, hwnd=%p, callback=%x, edge=%d, rc=%s, lparam=%lx}: stub\n", - msg, data->cbSize, data->hWnd, data->uCallbackMessage, data->uEdge, - wine_dbgstr_rect(&data->rc), data->lParam); - - switch (msg) - { - case ABM_GETSTATE: - return ABS_ALWAYSONTOP | ABS_AUTOHIDE; - case ABM_GETTASKBARPOS: - /* FIXME: This is wrong. It should return the taskbar co-ords and edge from the monitor - which contains data->hWnd */ - GetWindowRect(data->hWnd, &rec); - data->rc=rec; - return TRUE; - case ABM_ACTIVATE: - SetActiveWindow(data->hWnd); - return TRUE; - case ABM_GETAUTOHIDEBAR: - return 0; /* pretend there is no autohide bar */ - case ABM_NEW: - /* cbSize, hWnd, and uCallbackMessage are used. All other ignored */ - SetWindowPos(data->hWnd,HWND_TOP,0,0,0,0,SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE); - return TRUE; - case ABM_QUERYPOS: - GetWindowRect(data->hWnd, &(data->rc)); - return TRUE; - case ABM_REMOVE: - FIXME("ABM_REMOVE broken\n"); - /* FIXME: this is wrong; should it be DestroyWindow instead? */ - /*CloseHandle(data->hWnd);*/ - return TRUE; - case ABM_SETAUTOHIDEBAR: - SetWindowPos(data->hWnd,HWND_TOP,rec.left+1000,rec.top, - width,height,SWP_SHOWWINDOW); - return TRUE; - case ABM_SETPOS: - data->uEdge=(ABE_RIGHT | ABE_LEFT); - SetWindowPos(data->hWnd,HWND_TOP,data->rc.left,data->rc.top, - width,height,SWP_SHOWWINDOW); - return TRUE; - case ABM_WINDOWPOSCHANGED: - return TRUE; - } - return FALSE; -} - -/************************************************************************* * SHHelpShortcuts_RunDLLA [SHELL32.@] * */ diff --git a/dlls/shell32/tests/Makefile.in b/dlls/shell32/tests/Makefile.in index 36e075418c0..4b1a1403589 100644 --- a/dlls/shell32/tests/Makefile.in +++ b/dlls/shell32/tests/Makefile.in @@ -6,6 +6,7 @@ TESTDLL = shell32.dll IMPORTS = shell32 ole32 oleaut32 user32 advapi32 kernel32 CTESTS = \ + appbar.c \ generated.c \ shelllink.c \ shellpath.c \ diff --git a/dlls/shell32/tests/appbar.c b/dlls/shell32/tests/appbar.c new file mode 100644 index 00000000000..8c2315ffc49 --- /dev/null +++ b/dlls/shell32/tests/appbar.c @@ -0,0 +1,405 @@ +/* Unit tests for appbars + * + * Copyright 2008 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#include + +#include "wine/test.h" + +#define MSG_APPBAR WM_APP + +static const WCHAR testwindow_class[] = {'t','e','s','t','w','i','n','d','o','w',0}; + +static HMONITOR (WINAPI *pMonitorFromWindow)(HWND, DWORD); + +struct testwindow_info +{ + RECT desired_rect; + UINT edge; + RECT allocated_rect; +}; + +static void testwindow_setpos(HWND hwnd) +{ + struct testwindow_info* info = (struct testwindow_info*)GetWindowLongPtr(hwnd, GWLP_USERDATA); + APPBARDATA abd; + BOOL ret; + + ok(info != NULL, "got unexpected ABN_POSCHANGED notification\n"); + + if (!info) + { + return; + } + + abd.cbSize = sizeof(abd); + abd.hWnd = hwnd; + abd.uEdge = info->edge; + abd.rc = info->desired_rect; + ret = SHAppBarMessage(ABM_QUERYPOS, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + switch (info->edge) + { + case ABE_BOTTOM: + ok(info->desired_rect.top == abd.rc.top, "ABM_QUERYPOS changed top of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + abd.rc.top = abd.rc.bottom - (info->desired_rect.bottom - info->desired_rect.top); + break; + case ABE_LEFT: + ok(info->desired_rect.right == abd.rc.right, "ABM_QUERYPOS changed right of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + abd.rc.right = abd.rc.left + (info->desired_rect.right - info->desired_rect.left); + break; + case ABE_RIGHT: + ok(info->desired_rect.left == abd.rc.left, "ABM_QUERYPOS changed left of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + abd.rc.left = abd.rc.right - (info->desired_rect.right - info->desired_rect.left); + break; + case ABE_TOP: + ok(info->desired_rect.bottom == abd.rc.bottom, "ABM_QUERYPOS changed bottom of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + abd.rc.bottom = abd.rc.top + (info->desired_rect.bottom - info->desired_rect.top); + break; + } + + ret = SHAppBarMessage(ABM_SETPOS, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + + info->allocated_rect = abd.rc; + MoveWindow(hwnd, abd.rc.left, abd.rc.top, abd.rc.right-abd.rc.left, abd.rc.bottom-abd.rc.top, TRUE); +} + +static LRESULT CALLBACK testwindow_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch(msg) + { + case MSG_APPBAR: + { + switch(wparam) + { + case ABN_POSCHANGED: + testwindow_setpos(hwnd); + break; + } + return 0; + } + } + + return DefWindowProc(hwnd, msg, wparam, lparam); +} + +/* process any pending messages */ +static void do_events(void) +{ + MSG msg; + + while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } +} + +static void register_testwindow_class(void) +{ + WNDCLASSEXW cls; + + ZeroMemory(&cls, sizeof(cls)); + cls.cbSize = sizeof(cls); + cls.style = 0; + cls.lpfnWndProc = testwindow_wndproc; + cls.hInstance = NULL; + cls.hCursor = LoadCursor(0, IDC_ARROW); + cls.hbrBackground = (HBRUSH) COLOR_WINDOW; + cls.lpszClassName = testwindow_class; + + RegisterClassExW(&cls); +} + +static void test_setpos(void) +{ + APPBARDATA abd; + RECT rc; + int screen_width, screen_height, expected; + HWND window1, window2, window3; + struct testwindow_info window1_info, window2_info, window3_info; + BOOL ret; + + screen_width = GetSystemMetrics(SM_CXSCREEN); + screen_height = GetSystemMetrics(SM_CYSCREEN); + + /* create and register window1 */ + window1 = CreateWindowExW(WS_EX_TOOLWINDOW|WS_EX_TOPMOST, + testwindow_class, testwindow_class, WS_POPUP|WS_VISIBLE, 0, 0, 0, 0, + NULL, NULL, NULL, NULL); + ok(window1 != NULL, "couldn't create window\n"); + do_events(); + abd.cbSize = sizeof(abd); + abd.hWnd = window1; + abd.uCallbackMessage = MSG_APPBAR; + ret = SHAppBarMessage(ABM_NEW, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + + /* ABM_NEW should return FALSE if the window is already registered */ + ret = SHAppBarMessage(ABM_NEW, &abd); + ok(ret == FALSE, "SHAppBarMessage returned %i\n", ret); + do_events(); + + /* dock window1 to the bottom of the screen */ + window1_info.edge = ABE_BOTTOM; + window1_info.desired_rect.left = 0; + window1_info.desired_rect.right = screen_width; + window1_info.desired_rect.top = screen_height - 15; + window1_info.desired_rect.bottom = screen_height; + SetWindowLongPtr(window1, GWLP_USERDATA, (LONG_PTR)&window1_info); + testwindow_setpos(window1); + do_events(); + + /* create and register window2 */ + window2 = CreateWindowExW(WS_EX_TOOLWINDOW|WS_EX_TOPMOST, + testwindow_class, testwindow_class, WS_POPUP|WS_VISIBLE, 0, 0, 0, 0, + NULL, NULL, NULL, NULL); + ok(window2 != NULL, "couldn't create window\n"); + abd.hWnd = window2; + ret = SHAppBarMessage(ABM_NEW, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + + /* dock window2 to the bottom of the screen */ + window2_info.edge = ABE_BOTTOM; + window2_info.desired_rect.left = 0; + window2_info.desired_rect.right = screen_width; + window2_info.desired_rect.top = screen_height - 10; + window2_info.desired_rect.bottom = screen_height; + SetWindowLongPtr(window2, GWLP_USERDATA, (LONG_PTR)&window2_info); + testwindow_setpos(window2); + do_events(); + + /* the windows are adjusted to they don't overlap */ + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* make window1 larger, forcing window2 to move out of its way */ + window1_info.desired_rect.top = screen_height - 20; + testwindow_setpos(window1); + do_events(); + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* create and register window3 */ + window3 = CreateWindowExW(WS_EX_TOOLWINDOW|WS_EX_TOPMOST, + testwindow_class, testwindow_class, WS_POPUP|WS_VISIBLE, 0, 0, 0, 0, + NULL, NULL, NULL, NULL); + ok(window3 != NULL, "couldn't create window\n"); + do_events(); + + abd.hWnd = window3; + ret = SHAppBarMessage(ABM_NEW, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + + /* dock window3 to the bottom of the screen */ + window3_info.edge = ABE_BOTTOM; + window3_info.desired_rect.left = 0; + window3_info.desired_rect.right = screen_width; + window3_info.desired_rect.top = screen_height - 10; + window3_info.desired_rect.bottom = screen_height; + SetWindowLongPtr(window3, GWLP_USERDATA, (LONG_PTR)&window3_info); + testwindow_setpos(window3); + do_events(); + + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window3_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window3_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* move window3 to the right side of the screen */ + window3_info.edge = ABE_RIGHT; + window3_info.desired_rect.left = screen_width - 15; + window3_info.desired_rect.right = screen_width; + window3_info.desired_rect.top = 0; + window3_info.desired_rect.bottom = screen_height; + testwindow_setpos(window3); + do_events(); + + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window3_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window3_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* move window2 to the top of the screen */ + window2_info.edge = ABE_TOP; + window2_info.desired_rect.left = 0; + window2_info.desired_rect.right = screen_width; + window2_info.desired_rect.top = 0; + window2_info.desired_rect.bottom = 15; + testwindow_setpos(window2); + do_events(); + + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window3_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window3_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* move window2 back to the bottom of the screen */ + window2_info.edge = ABE_BOTTOM; + window2_info.desired_rect.left = 0; + window2_info.desired_rect.right = screen_width; + window2_info.desired_rect.top = screen_height - 10; + window2_info.desired_rect.bottom = screen_height; + testwindow_setpos(window2); + do_events(); + + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window1_info.allocated_rect, &window3_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window1_info.allocated_rect.left, window1_info.allocated_rect.top, window1_info.allocated_rect.right, window1_info.allocated_rect.bottom, + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom); + ok(!IntersectRect(&rc, &window3_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* removing window1 will cause window2 to move down into its space */ + expected = max(window1_info.allocated_rect.bottom, window2_info.allocated_rect.bottom); + + SetWindowLongPtr(window1, GWLP_USERDATA, 0); /* don't expect further ABN_POSCHANGED notifications */ + abd.hWnd = window1; + ret = SHAppBarMessage(ABM_REMOVE, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + do_events(); + DestroyWindow(window1); + + ok(window2_info.allocated_rect.bottom = expected, "window2's bottom is %i, expected %i\n", window2_info.allocated_rect.bottom, expected); + + ok(!IntersectRect(&rc, &window3_info.allocated_rect, &window2_info.allocated_rect), + "rectangles intersect (%i,%i,%i,%i)/(%i,%i,%i,%i)\n", + window3_info.allocated_rect.left, window3_info.allocated_rect.top, window3_info.allocated_rect.right, window3_info.allocated_rect.bottom, + window2_info.allocated_rect.left, window2_info.allocated_rect.top, window2_info.allocated_rect.right, window2_info.allocated_rect.bottom); + + /* remove the other windows */ + SetWindowLongPtr(window2, GWLP_USERDATA, 0); + abd.hWnd = window2; + ret = SHAppBarMessage(ABM_REMOVE, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + do_events(); + DestroyWindow(window2); + + SetWindowLongPtr(window3, GWLP_USERDATA, 0); + abd.hWnd = window3; + ret = SHAppBarMessage(ABM_REMOVE, &abd); + ok(ret == TRUE, "SHAppBarMessage returned %i\n", ret); + do_events(); + DestroyWindow(window3); +} + +static void test_appbarget(void) +{ + APPBARDATA abd; + HWND hwnd, foregnd; + UINT_PTR ret; + + memset(&abd, 0xcc, sizeof(abd)); + abd.cbSize = sizeof(abd); + abd.uEdge = ABE_BOTTOM; + + hwnd = (HWND)SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd); + ok(hwnd == NULL || IsWindow(hwnd), "ret %p which is not a window\n", hwnd); + ok(abd.hWnd == (HWND)0xcccccccc, "hWnd overwritten\n"); + + if (!pMonitorFromWindow) + { + skip("MonitorFromWindow is not available\n"); + } + else + { + /* Presumably one can pass a hwnd with ABM_GETAUTOHIDEBAR to specify a monitor. + Pass the foreground window and check */ + foregnd = GetForegroundWindow(); + if(foregnd) + { + abd.hWnd = foregnd; + hwnd = (HWND)SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd); + ok(hwnd == NULL || IsWindow(hwnd), "ret %p which is not a window\n", hwnd); + ok(abd.hWnd == foregnd, "hWnd overwritten\n"); + if(hwnd) + { + HMONITOR appbar_mon, foregnd_mon; + appbar_mon = pMonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + foregnd_mon = pMonitorFromWindow(foregnd, MONITOR_DEFAULTTONEAREST); + ok(appbar_mon == foregnd_mon, "Windows on different monitors\n"); + } + } + } + + memset(&abd, 0xcc, sizeof(abd)); + abd.cbSize = sizeof(abd); + ret = SHAppBarMessage(ABM_GETTASKBARPOS, &abd); + if(ret) + { + ok(abd.hWnd == (HWND)0xcccccccc, "hWnd overwritten\n"); +todo_wine +{ + ok(abd.uEdge <= ABE_BOTTOM, "uEdge not returned\n"); + ok(abd.rc.left != 0xcccccccc, "rc not updated\n"); +} + } + + return; +} + +START_TEST(appbar) +{ + HMODULE huser32; + + huser32 = GetModuleHandleA("user32.dll"); + pMonitorFromWindow = (void*)GetProcAddress(huser32, "MonitorFromWindow"); + + register_testwindow_class(); + + test_setpos(); + test_appbarget(); +} diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index 9bb7208d626..a5fff49bbbf 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -1271,7 +1271,12 @@ static void test_ITEMIDLIST_format(void) { ok(bResult, "SHGetSpecialFolderPathW failed! Last error: %u\n", GetLastError()); if (!bResult) return; + SetLastError(0xdeadbeef); bResult = SetCurrentDirectoryW(wszPersonal); + if (!bResult && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("Most W-calls are not implemented\n"); + return; + } ok(bResult, "SetCurrentDirectory failed! Last error: %u\n", GetLastError()); if (!bResult) return; diff --git a/dlls/shell32/tests/systray.c b/dlls/shell32/tests/systray.c index 42d2d4af5cd..56758068453 100644 --- a/dlls/shell32/tests/systray.c +++ b/dlls/shell32/tests/systray.c @@ -27,7 +27,6 @@ static HWND hMainWnd; static BOOL (WINAPI *pShell_NotifyIconW)(DWORD,PNOTIFYICONDATAW); -static HMONITOR (WINAPI *pMonitorFromWindow)(HWND, DWORD); void test_cbsize(void) { @@ -76,74 +75,16 @@ void test_cbsize(void) ok(!Shell_NotifyIconA(NIM_DELETE, &nidA), "The icon was not deleted\n"); } -static void test_SHAppBarMessage(void) -{ - APPBARDATA abd; - HWND hwnd, foregnd; - UINT_PTR ret; - - memset(&abd, 0xcc, sizeof(abd)); - abd.cbSize = sizeof(abd); - abd.uEdge = ABE_BOTTOM; - - hwnd = (HWND)SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd); - ok(hwnd == NULL || IsWindow(hwnd), "ret %p which is not a window\n", hwnd); - ok(abd.hWnd == (HWND)0xcccccccc, "hWnd overwritten\n"); - - if (!pMonitorFromWindow) - { - skip("MonitorFromWindow is not available\n"); - } - else - { - /* Presumably one can pass a hwnd with ABM_GETAUTOHIDEBAR to specify a monitor. - Pass the foreground window and check */ - foregnd = GetForegroundWindow(); - if(foregnd) - { - abd.hWnd = foregnd; - hwnd = (HWND)SHAppBarMessage(ABM_GETAUTOHIDEBAR, &abd); - ok(hwnd == NULL || IsWindow(hwnd), "ret %p which is not a window\n", hwnd); - ok(abd.hWnd == foregnd, "hWnd overwritten\n"); - if(hwnd) - { - HMONITOR appbar_mon, foregnd_mon; - appbar_mon = pMonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); - foregnd_mon = pMonitorFromWindow(foregnd, MONITOR_DEFAULTTONEAREST); - ok(appbar_mon == foregnd_mon, "Windows on different monitors\n"); - } - } - } - - memset(&abd, 0xcc, sizeof(abd)); - abd.cbSize = sizeof(abd); - ret = SHAppBarMessage(ABM_GETTASKBARPOS, &abd); - if(ret) - { - ok(abd.hWnd == (HWND)0xcccccccc, "hWnd overwritten\n"); -todo_wine -{ - ok(abd.uEdge <= ABE_BOTTOM, "uEdge not returned\n"); - ok(abd.rc.left != 0xcccccccc, "rc not updated\n"); -} - } - - return; -} - START_TEST(systray) { WNDCLASSA wc; MSG msg; RECT rc; - HMODULE huser32, hshell32; + HMODULE hshell32; hshell32 = GetModuleHandleA("shell32.dll"); pShell_NotifyIconW = (void*)GetProcAddress(hshell32, "Shell_NotifyIconW"); - huser32 = GetModuleHandleA("user32.dll"); - pMonitorFromWindow = (void*)GetProcAddress(huser32, "MonitorFromWindow"); - wc.style = CS_HREDRAW | CS_VREDRAW; wc.cbClsExtra = 0; wc.cbWndExtra = 0; @@ -169,6 +110,4 @@ START_TEST(systray) DispatchMessageA(&msg); } DestroyWindow(hMainWnd); - - test_SHAppBarMessage(); } diff --git a/dlls/shlwapi/shlwapi.rc b/dlls/shlwapi/shlwapi.rc index 2b502143e44..24166493c6c 100644 --- a/dlls/shlwapi/shlwapi.rc +++ b/dlls/shlwapi/shlwapi.rc @@ -45,3 +45,4 @@ #include "shlwapi_Si.rc" #include "shlwapi_Sv.rc" #include "shlwapi_Tr.rc" +#include "shlwapi_Zh.rc" diff --git a/dlls/shlwapi/shlwapi_Zh.rc b/dlls/shlwapi/shlwapi_Zh.rc new file mode 100644 index 00000000000..b5f03a14324 --- /dev/null +++ b/dlls/shlwapi/shlwapi_Zh.rc @@ -0,0 +1,72 @@ +/* + * shlwapi (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "错误!" +FONT 9, "MS Song" +{ + LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20 + LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8 + CHECKBOX "不要再显示这个讯息", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON L"确定(&O)" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"取消(&C)" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"是(&Y)" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"否(&N)" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + IDS_BYTES_FORMAT "%ld 字节" + IDS_TIME_INTERVAL_HOURS " 小时" + IDS_TIME_INTERVAL_MINUTES " 分" + IDS_TIME_INTERVAL_SECONDS " 秒" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "錯誤!" +FONT 8, "PMingLiu" +{ + LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20 + LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8 + CHECKBOX "不要再顯示這個訊息", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON L"確定(&O)" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"取消(&C)" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"是(&Y)" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"否(&N)" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + IDS_BYTES_FORMAT "%ld 字節" + IDS_TIME_INTERVAL_HOURS " 小時" + IDS_TIME_INTERVAL_MINUTES " 分" + IDS_TIME_INTERVAL_SECONDS " 秒" +} + +#pragma code_page(default) diff --git a/dlls/shlwapi/tests/ordinal.c b/dlls/shlwapi/tests/ordinal.c index df90bf72139..484db0aebdd 100644 --- a/dlls/shlwapi/tests/ordinal.c +++ b/dlls/shlwapi/tests/ordinal.c @@ -42,13 +42,19 @@ static void test_GetAcceptLanguagesA(void) DWORD buffersize, buffersize2, exactsize; char buffer[100]; - if (!pGetAcceptLanguagesA) + if (!pGetAcceptLanguagesA) { + win_skip("GetAcceptLanguagesA is not available\n"); return; + } buffersize = sizeof(buffer); memset(buffer, 0, sizeof(buffer)); SetLastError(ERROR_SUCCESS); retval = pGetAcceptLanguagesA( buffer, &buffersize); + if (!retval && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { + win_skip("GetAcceptLanguagesA is not implemented\n"); + return; + } trace("GetAcceptLanguagesA: retval %08x, size %08x, buffer (%s)," " last error %u\n", retval, buffersize, buffer, GetLastError()); if(retval != S_OK) { @@ -58,7 +64,6 @@ static void test_GetAcceptLanguagesA(void) ok( (ERROR_NO_IMPERSONATION_TOKEN == GetLastError()) || (ERROR_CLASS_DOES_NOT_EXIST == GetLastError()) || (ERROR_PROC_NOT_FOUND == GetLastError()) || - (ERROR_CALL_NOT_IMPLEMENTED == GetLastError()) || (ERROR_SUCCESS == GetLastError()), "last error set to %u\n", GetLastError()); exactsize = strlen(buffer); @@ -105,9 +110,9 @@ static void test_GetAcceptLanguagesA(void) switch(retval) { case 0L: if(buffersize == exactsize) { - ok( (ERROR_SUCCESS == GetLastError()) || (ERROR_CALL_NOT_IMPLEMENTED == GetLastError()) || + ok( (ERROR_SUCCESS == GetLastError()) || (ERROR_PROC_NOT_FOUND == GetLastError()) || (ERROR_NO_IMPERSONATION_TOKEN == GetLastError()), - "last error wrong: got %u; expected ERROR_SUCCESS(NT4)/ERROR_CALL_NOT_IMPLEMENTED(98/ME)/" + "last error wrong: got %u; expected ERROR_SUCCESS(NT4)/" "ERROR_PROC_NOT_FOUND(NT4)/ERROR_NO_IMPERSONATION_TOKEN(XP)\n", GetLastError()); ok(exactsize == strlen(buffer), "buffer content (length) wrong: got %08x, expected %08x\n", lstrlenA(buffer), exactsize); @@ -370,7 +375,7 @@ static void test_GetShellSecurityDescriptor(void) if(!pGetShellSecurityDescriptor) { - skip("GetShellSecurityDescriptor not available\n"); + win_skip("GetShellSecurityDescriptor not available\n"); return; } @@ -379,7 +384,14 @@ static void test_GetShellSecurityDescriptor(void) psd = pGetShellSecurityDescriptor(rgsup, 0); ok(psd==NULL, "GetShellSecurityDescriptor should fail\n"); + SetLastError(0xdeadbeef); psd = pGetShellSecurityDescriptor(rgsup, 2); + if (psd == NULL && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + /* The previous calls to GetShellSecurityDescriptor don't set the last error */ + win_skip("GetShellSecurityDescriptor is not implemented\n"); + return; + } ok(psd!=NULL, "GetShellSecurityDescriptor failed\n"); if (psd!=NULL) { diff --git a/dlls/shlwapi/tests/path.c b/dlls/shlwapi/tests/path.c index d84ca7a8bd7..0fc092d486b 100644 --- a/dlls/shlwapi/tests/path.c +++ b/dlls/shlwapi/tests/path.c @@ -891,7 +891,9 @@ static void test_PathCanonicalizeA(void) res = PathCanonicalizeA(dest, "C:\\one/.\\two\\.."); ok(res, "Expected success\n"); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); - ok(!lstrcmp(dest, "C:\\one/."), "Expected C:\\one/., got %s\n", dest); + ok(!lstrcmp(dest, "C:\\one/.") || + !lstrcmp(dest, "C:\\one/"), /* Vista */ + "Expected \"C:\\one/.\" or \"C:\\one/\", got \"%s\"\n", dest); /* try forward slashes with change dirs * NOTE: if there is a forward slash in between two backslashes, @@ -1013,7 +1015,9 @@ static void test_PathBuildRootA(void) lstrcpy(path, "aaaaaaaaa"); root = PathBuildRootA(path, -1); ok(root == path, "Expected root == path, got %p\n", root); - ok(!lstrcmp(path, "aaaaaaaaa"), "Expected aaaaaaaaa, got %s\n", path); + ok(!lstrcmp(path, "aaaaaaaaa") || + lstrlenA(path) == 0, /* Vista */ + "Expected aaaaaaaaa or empty string, got %s\n", path); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); /* test a drive number greater than 25 */ @@ -1021,7 +1025,9 @@ static void test_PathBuildRootA(void) lstrcpy(path, "aaaaaaaaa"); root = PathBuildRootA(path, 26); ok(root == path, "Expected root == path, got %p\n", root); - ok(!lstrcmp(path, "aaaaaaaaa"), "Expected aaaaaaaaa, got %s\n", path); + ok(!lstrcmp(path, "aaaaaaaaa") || + lstrlenA(path) == 0, /* Vista */ + "Expected aaaaaaaaa or empty string, got %s\n", path); ok(GetLastError() == 0xdeadbeef, "Expected 0xdeadbeef, got %d\n", GetLastError()); /* length of path is less than 4 */ diff --git a/dlls/shlwapi/tests/url.c b/dlls/shlwapi/tests/url.c index c7c6f8f74a3..e2f7f1a84f0 100644 --- a/dlls/shlwapi/tests/url.c +++ b/dlls/shlwapi/tests/url.c @@ -424,13 +424,13 @@ static void test_UrlApplyScheme(void) len = TEST_APPLY_MAX_LENGTH; res = UrlApplySchemeA(NULL, newurl, &len, TEST_APPLY[0].flags); ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); - ok(len == TEST_APPLY_MAX_LENGTH, "got len %d (expected %d)\n", len, TEST_APPLY_MAX_LENGTH); + ok(len == TEST_APPLY_MAX_LENGTH, "got len %d\n", len); ok(!lstrcmpA(newurl, untouchedA), "got '%s' (expected '%s')\n", newurl, untouchedA); len = TEST_APPLY_MAX_LENGTH; res = UrlApplySchemeA(TEST_APPLY[0].url, NULL, &len, TEST_APPLY[0].flags); ok(res == E_INVALIDARG, "got HRESULT 0x%x (expected E_INVALIDARG)\n", res); - ok(len == TEST_APPLY_MAX_LENGTH, "got len %d (expected %d)\n", len, TEST_APPLY_MAX_LENGTH); + ok(len == TEST_APPLY_MAX_LENGTH, "got len %d\n", len); lstrcpyA(newurl, untouchedA); res = UrlApplySchemeA(TEST_APPLY[0].url, newurl, NULL, TEST_APPLY[0].flags); diff --git a/dlls/urlmon/tests/stream.c b/dlls/urlmon/tests/stream.c index 4fc96ef6ed5..6b25e2d2d0c 100644 --- a/dlls/urlmon/tests/stream.c +++ b/dlls/urlmon/tests/stream.c @@ -76,6 +76,7 @@ DEFINE_EXPECT(OnStopBinding); DEFINE_EXPECT(OnDataAvailable); DEFINE_EXPECT(GetBindInfo); +static const CHAR wszIndexHtmlA[] = "index.html"; static const WCHAR wszIndexHtml[] = {'i','n','d','e','x','.','h','t','m','l',0}; static WCHAR INDEX_HTML[MAX_PATH]; static const char szHtmlDoc[] = ""; @@ -260,26 +261,22 @@ static const IBindStatusCallbackVtbl BindStatusCallbackVtbl = { static IBindStatusCallback BindStatusCallback = { &BindStatusCallbackVtbl }; -static void set_file_url(void) +static void set_file_url(char *path) { - int len; + char INDEX_HTML_A[MAX_PATH]; - static const WCHAR wszFile[] = {'f','i','l','e',':','/','/'}; - - memcpy(INDEX_HTML, wszFile, sizeof(wszFile)); - len = sizeof(wszFile)/sizeof(WCHAR); - INDEX_HTML[len++] = '/'; - len += GetCurrentDirectoryW(sizeof(INDEX_HTML)/sizeof(WCHAR)-len, INDEX_HTML+len); - INDEX_HTML[len++] = '\\'; - memcpy(INDEX_HTML+len, wszIndexHtml, sizeof(wszIndexHtml)); + lstrcpyA(INDEX_HTML_A, "file:///"); + lstrcatA(INDEX_HTML_A, path); + MultiByteToWideChar(CP_ACP, 0, INDEX_HTML_A, -1, INDEX_HTML, MAX_PATH); } static void create_file(void) { HANDLE file; DWORD size; + CHAR path[MAX_PATH]; - file = CreateFileW(wszIndexHtml, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + file = CreateFileA(wszIndexHtmlA, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); ok(file != INVALID_HANDLE_VALUE, "CreateFile failed\n"); if(file == INVALID_HANDLE_VALUE) @@ -288,7 +285,10 @@ static void create_file(void) WriteFile(file, szHtmlDoc, sizeof(szHtmlDoc)-1, &size, NULL); CloseHandle(file); - set_file_url(); + GetCurrentDirectoryA(MAX_PATH, path); + lstrcatA(path, "\\"); + lstrcatA(path, wszIndexHtmlA); + set_file_url(path); } static void test_URLOpenBlockingStreamW(void) @@ -370,5 +370,5 @@ START_TEST(stream) create_file(); test_URLOpenBlockingStreamW(); test_URLOpenStreamW(); - DeleteFileW(wszIndexHtml); + DeleteFileA(wszIndexHtmlA); } diff --git a/dlls/user32/dde_client.c b/dlls/user32/dde_client.c index 00b41c41d45..99e2d1ce279 100644 --- a/dlls/user32/dde_client.c +++ b/dlls/user32/dde_client.c @@ -1331,8 +1331,6 @@ static LRESULT CALLBACK WDML_ClientProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPA pConv->wStatus |= ST_ISLOCAL; } - WDML_BroadcastDDEWindows(WDML_szEventClass, WM_WDML_CONNECT_CONFIRM, (WPARAM)hwnd, wParam); - GlobalDeleteAtom(uiLo); GlobalDeleteAtom(uiHi); diff --git a/dlls/user32/dde_misc.c b/dlls/user32/dde_misc.c index 227f874b152..79f3540114e 100644 --- a/dlls/user32/dde_misc.c +++ b/dlls/user32/dde_misc.c @@ -1760,7 +1760,7 @@ WDML_CONV* WDML_AddConv(WDML_INSTANCE* pInstance, WDML_SIDE side, pConv->next = pInstance->convs[side]; pInstance->convs[side] = pConv; - TRACE("pConv->wStatus %04x\n", pConv->wStatus); + TRACE("pConv->wStatus %04x pInstance(%p)\n", pConv->wStatus, pInstance); return pConv; } diff --git a/dlls/user32/dde_server.c b/dlls/user32/dde_server.c index 1c75bff5907..ba20cf25649 100644 --- a/dlls/user32/dde_server.c +++ b/dlls/user32/dde_server.c @@ -340,8 +340,8 @@ static WDML_CONV* WDML_CreateServerConv(WDML_INSTANCE* pInstance, HWND hwndClien hwndServerName, 0, 0, 0); } - TRACE("Created convServer=%p (nameServer=%p) for instance=%08x\n", - hwndServerConv, hwndServerName, pInstance->instanceID); + TRACE("Created convServer=%p (nameServer=%p) for instance=%08x unicode=%d\n", + hwndServerConv, hwndServerName, pInstance->instanceID, pInstance->unicode); pConv = WDML_AddConv(pInstance, WDML_SERVER_SIDE, hszApp, hszTopic, hwndClient, hwndServerConv); diff --git a/dlls/user32/tests/dde.c b/dlls/user32/tests/dde.c index d41ccddddb4..cc5e47c9fa3 100644 --- a/dlls/user32/tests/dde.c +++ b/dlls/user32/tests/dde.c @@ -73,6 +73,12 @@ static void create_dde_window(HWND *hwnd, LPCSTR name, WNDPROC wndproc) assert(*hwnd); } +static void destroy_dde_window(HWND *hwnd, LPCSTR name) +{ + DestroyWindow(*hwnd); + UnregisterClass(name, GetModuleHandleA(0)); +} + static LRESULT WINAPI dde_server_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { UINT_PTR lo, hi; @@ -243,7 +249,7 @@ static void test_msg_server(HANDLE hproc, HANDLE hthread) while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); } - DestroyWindow(hwnd); + destroy_dde_window(&hwnd, "dde_server"); GetExitCodeProcess( hproc, &res ); ok( !res, "client failed with %u error(s)\n", res ); } @@ -1107,7 +1113,7 @@ static void test_msg_client() flush_events(); - DestroyWindow(client_hwnd); + destroy_dde_window(&client_hwnd, "dde_client"); } static LRESULT WINAPI hook_dde_client_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) @@ -1170,7 +1176,6 @@ static LRESULT WINAPI dde_server_wndprocW(HWND hwnd, UINT msg, WPARAM wparam, LP ack.fBusy = 0; cmd = GlobalLock((HGLOBAL)hi); - if (!cmd || (lstrcmpA(cmd, exec_cmdA) && lstrcmpW((LPCWSTR)cmd, exec_cmdW))) { trace("ignoring unknown WM_DDE_EXECUTE command\n"); @@ -2116,6 +2121,278 @@ static void test_UnpackDDElParam(void) ok(hi == 0xcafebabe, "Expected 0xcafebabe, got %08lx\n", hi); } +static HDDEDATA CALLBACK server_end_to_end_callback(UINT uType, UINT uFmt, HCONV hconv, + HSZ hsz1, HSZ hsz2, HDDEDATA hdata, + ULONG_PTR dwData1, ULONG_PTR dwData2) +{ + DWORD size, rsize; + char str[MAX_PATH]; + static int msg_index = 0; + static HCONV conversation = 0; + static char test_cmd[] = "test dde command"; + static WCHAR test_cmd_w[] = {'t','e','s','t',' ','d','d','e',' ','c','o','m','m','a','n','d',0}; + static char test_service [] = "TestDDEService"; + static char test_topic [] = "TestDDETopic"; + + msg_index++; + + switch (uType) + { + case XTYP_REGISTER: + { + ok(msg_index == 1 || msg_index == 7 || msg_index == 13 || msg_index == 19, + "Expected 1, 7, 13 or 19, got %d\n", msg_index); + return (HDDEDATA)TRUE; + break; + } + + case XTYP_CONNECT: + { + ok(msg_index == 2 || msg_index == 8 || msg_index == 14 || msg_index == 20, + "Expected 2, 8, 14 or 20, got %d\n", msg_index); + ok(uFmt == 0, "Expected 0, got %d, msg_index=%d\n", uFmt, msg_index); + ok(hconv == 0, "Expected 0, got %p, msg_index=%d\n", hconv, msg_index); + ok(hdata == 0, "Expected 0, got %p, msg_index=%d\n", hdata, msg_index); + ok(dwData1 != 0, "Expected not 0, got %08lx, msg_index=%d\n", dwData1, msg_index); + ok(dwData2 == FALSE, "Expected FALSE, got %08lx, msg_index=%d\n", dwData2, msg_index); + + size = DdeQueryStringA(server_pid, hsz1, str, MAX_PATH, CP_WINANSI); + ok(!lstrcmpA(str, test_topic), "Expected %s, got %s, msg_index=%d\n", + test_topic, str, msg_index); + ok(size == 12, "Expected 12, got %d, msg_index=%d\n", size, msg_index); + + size = DdeQueryStringA(server_pid, hsz2, str, MAX_PATH, CP_WINANSI); + ok(!lstrcmpA(str, test_service), "Expected %s, got %s, msg_index=%d\n", + test_service, str, msg_index); + ok(size == 14, "Expected 14, got %d, msg_index=%d\n", size, msg_index); + + return (HDDEDATA) TRUE; + break; + } + case XTYP_CONNECT_CONFIRM: + { + ok(msg_index == 3 || msg_index == 9 || msg_index == 15 || msg_index == 21, + "Expected 3, 9, 15 or 21 got %d\n", msg_index); + conversation = hconv; + return (HDDEDATA) TRUE; + } + case XTYP_EXECUTE: + { + BYTE *buffer = NULL; + + ok(msg_index == 4 || msg_index == 5 || msg_index == 10 || msg_index == 11 || + msg_index == 16 || msg_index == 17 || msg_index == 22 || msg_index == 23, + "Expected 4, 5, 10, 11, 16, 17, 22 or 23, got %d\n", msg_index); + ok(uFmt == 0, "Expected 0, got %d\n", uFmt); + ok(hconv == conversation, "Expected conversation handle, got %p, msg_index=%d\n", + hconv, msg_index); + ok(dwData1 == 0, "Expected 0, got %08lx, msg_index=%d\n", dwData1, msg_index); + ok(dwData2 == 0, "Expected 0, got %08lx, msg_index=%d\n", dwData2, msg_index); + ok(hsz2 == 0, "Expected 0, got %p, msg_index=%d\n", hsz2, msg_index); + size = DdeQueryStringA(server_pid, hsz1, str, MAX_PATH, CP_WINANSI); + ok(!lstrcmpA(str, test_topic), "Expected %s, got %s, msg_index=%d\n", + test_topic, str, msg_index); + ok(size == 12, "Expected 12, got %d, msg_index=%d\n", size, msg_index); + ok(size == 12, "Expected 12, got %d, msg_index=%d\n", size, msg_index); + + size = DdeGetData(hdata, NULL, 0, 0); + if (msg_index == 10 || msg_index ==11 || msg_index == 16 || msg_index ==17) + if (msg_index == 10 || msg_index == 16) + todo_wine + ok(size == 34, "Expected that size should be 34 not %d, msg_index=%d\n", + size, msg_index); + else + ok(size == 34, "Expected that size should be 34 not %d, msg_index=%d\n", + size, msg_index); + else + if (msg_index ==22) + todo_wine + ok(size == 9, "Expected that size should be 9 not %d, msg_index=%d\n", + size, msg_index); + else + if (msg_index == 5) + todo_wine + ok(size == 17, "Expected that size should be 17 not %d, msg_index=%d\n", + size, msg_index); + else + ok(size == 17, "Expected that size should be 17 not %d, msg_index=%d\n", + size, msg_index); + ok((buffer = HeapAlloc(GetProcessHeap(), 0, size)) != NULL, "should not be null\n"); + rsize = DdeGetData(hdata, buffer, size, 0); + if (msg_index == 10 || msg_index == 11 || msg_index == 16 || msg_index ==17) + { + ok(rsize == size, "Incorrect size returned, expected %d got %d, msg_index=%d\n", + size, rsize, msg_index); + if (msg_index == 10 || msg_index == 16) + todo_wine { + ok(!lstrcmpW((WCHAR*)buffer, test_cmd_w), + "Expected \"Test dde command\", msg_index=%d\n", + msg_index); + ok(size == 34, "Expected 34, got %d, msg_index=%d\n", size, msg_index); + } else + { + ok(!lstrcmpW((WCHAR*)buffer, test_cmd_w), + "Expected \"Test dde command\", msg_index=%d\n", + msg_index); + ok(size == 34, "Expected 34, got %d, msg_index=%d\n", size, msg_index); + } + }else if (msg_index == 22) + { + ok(rsize == size, "Incorrect size returned, expected %d got %d, msg_index=%d\n", + size, rsize, msg_index); + } else + { + ok(rsize == size, "Incorrect size returned, expected %d got %d, msg_index=%d\n", + size, rsize, msg_index); + if (msg_index == 5) + todo_wine { + ok(!lstrcmpA((CHAR*)buffer, test_cmd), "Expected %s, got %s, msg_index=%d\n", + test_cmd, buffer, msg_index); + ok(size == 17, "Expected size should be 17, got %d, msg_index=%d\n", size, msg_index); + } + else + { + ok(!lstrcmpA((CHAR*)buffer, test_cmd), "Expected %s, got %s, msg_index=%d\n", + test_cmd, buffer, msg_index); + ok(size == 17, "Expected size should be 17, got %d, msg_index=%d\n", size, msg_index); + } + + } + + return (HDDEDATA) DDE_FACK; + } + case XTYP_DISCONNECT: + { + return (HDDEDATA) TRUE; + break; + } + + default: + ok(FALSE, "Unhandled msg: %08x, msg_index=%d\n", uType, msg_index); + } + + return NULL; +} + +static HDDEDATA CALLBACK client_end_to_end_callback(UINT uType, UINT uFmt, HCONV hconv, + HSZ hsz1, HSZ hsz2, HDDEDATA hdata, + ULONG_PTR dwData1, ULONG_PTR dwData2) +{ + switch (uType) + { + case XTYP_DISCONNECT: + { + return (HDDEDATA) TRUE; + break; + } + + default: + ok(FALSE, "Unhandled msg: %08x\n", uType); + } + + return NULL; +} + +static void test_end_to_end_client(BOOL type_a) +{ + DWORD ret, err; + DWORD client_pid = 0; + HSZ server, topic; + HCONV hconv; + HDDEDATA hdata; + static char test_cmd[] = "test dde command"; + static WCHAR test_cmd_w[] = {'t','e','s','t',' ','d','d','e',' ','c','o','m','m','a','n','d',0}; + static char test_service[] = "TestDDEService"; + static WCHAR test_service_w[] = {'T','e','s','t','D','D','E','S','e','r','v','i','c','e',0}; + static char test_topic[] = "TestDDETopic"; + static WCHAR test_topic_w[] = {'T','e','s','t','D','D','E','T','o','p','i','c',0}; + + trace("Start end to end client %d\n", type_a); + + if (type_a) + ret = DdeInitializeA(&client_pid, client_end_to_end_callback, APPCMD_CLIENTONLY, 0); + else + ret = DdeInitializeW(&client_pid, client_end_to_end_callback, APPCMD_CLIENTONLY, 0); + ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %x\n", ret); + + if (type_a) + { + server = DdeCreateStringHandleA(client_pid, test_service, CP_WINANSI); + topic = DdeCreateStringHandleA(client_pid, test_topic, CP_WINANSI); + } + else { + server = DdeCreateStringHandleW(client_pid, test_service_w, CP_WINUNICODE); + topic = DdeCreateStringHandleW(client_pid, test_topic_w, CP_WINUNICODE); + } + + DdeGetLastError(client_pid); + hconv = DdeConnect(client_pid, server, topic, NULL); + ok(hconv != NULL, "Expected non-NULL conversation\n"); + ret = DdeGetLastError(client_pid); + ok(ret == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %x\n", ret); + DdeFreeStringHandle(client_pid, server); + + /* Test both A and W data being passed to DdeClientTransaction */ + hdata = DdeClientTransaction((LPBYTE)test_cmd, strlen(test_cmd) + 1, + hconv, (HSZ)0xdead, 0xbeef, XTYP_EXECUTE, 1000, &ret); + ok(hdata != NULL, "DdeClientTransaction failed\n"); + ok(ret == DDE_FACK, "wrong status code %x\n", ret); + err = DdeGetLastError(client_pid); + ok(err == DMLERR_NO_ERROR, "wrong dde error %x\n", err); + + hdata = DdeClientTransaction((LPBYTE)test_cmd_w, lstrlenW(test_cmd_w) * sizeof(WCHAR) + 2, + hconv, (HSZ)0xdead, 0xbeef, XTYP_EXECUTE, 1000, &ret); + ok(hdata != NULL, "DdeClientTransaction failed\n"); + ok(ret == DDE_FACK, "wrong status code %x\n", ret); + err = DdeGetLastError(client_pid); + ok(err == DMLERR_NO_ERROR, "wrong dde error %x\n", err); + + DdeFreeStringHandle(client_pid, topic); + ret = DdeDisconnect(hconv); + ok(ret == TRUE, "Expected TRUE, got %x\n", ret); + + ret = DdeUninitialize(client_pid); + ok(ret == TRUE, "Expected TRUE, got %x\n", ret); + +} + +static void test_end_to_end_server(HANDLE hproc, HANDLE hthread, BOOL type_a) +{ + MSG msg; + HSZ server; + BOOL ret; + DWORD res; + HDDEDATA hdata; + static CHAR test_service[] = "TestDDEService"; + + trace("start end to end server %d\n", type_a); + server_pid = 0; + + if (type_a) + res = DdeInitializeA(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0); + else + res = DdeInitializeW(&server_pid, server_end_to_end_callback, APPCLASS_STANDARD, 0); + ok(res == DMLERR_NO_ERROR, "Expected DMLERR_NO_ERROR, got %d\n", res); + + server = DdeCreateStringHandleA(server_pid, test_service, CP_WINANSI); + ok(server != NULL, "Expected non-NULL string handle\n"); + + hdata = DdeNameService(server_pid, server, 0, DNS_REGISTER); + ok(hdata == (HDDEDATA)TRUE, "Expected TRUE, got %p\n", hdata); + ResumeThread( hthread ); + + + while (MsgWaitForMultipleObjects( 1, &hproc, FALSE, INFINITE, QS_ALLINPUT ) != 0) + { + while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); + } + + ret = DdeUninitialize(server_pid); + ok(ret == TRUE, "Expected TRUE, got %d\n", ret); + GetExitCodeProcess( hproc, &res ); + ok( !res, "client failed with %u error(s)\n", res ); +} + START_TEST(dde) { int argc; @@ -2131,6 +2408,10 @@ START_TEST(dde) test_ddeml_client(); else if (!lstrcmpA(argv[2], "msg")) test_msg_client(); + else if (!lstrcmpA(argv[2], "enda")) + test_end_to_end_client(TRUE); + else if (!lstrcmpA(argv[2], "endw")) + test_end_to_end_client(FALSE); return; } @@ -2154,6 +2435,32 @@ START_TEST(dde) test_ddeml_server(proc.hProcess); + /* Test the combinations of A and W interfaces with A and W data + end to end to ensure that data conversions are accurate */ + sprintf(buffer, "%s dde enda", argv[0]); + CreateProcessA(NULL, buffer, NULL, NULL, FALSE, + CREATE_SUSPENDED, NULL, NULL, &startup, &proc); + + test_end_to_end_server(proc.hProcess, proc.hThread, TRUE); + + sprintf(buffer, "%s dde endw", argv[0]); + CreateProcessA(NULL, buffer, NULL, NULL, FALSE, + CREATE_SUSPENDED, NULL, NULL, &startup, &proc); + + test_end_to_end_server(proc.hProcess, proc.hThread, FALSE); + + sprintf(buffer, "%s dde enda", argv[0]); + CreateProcessA(NULL, buffer, NULL, NULL, FALSE, + CREATE_SUSPENDED, NULL, NULL, &startup, &proc); + + test_end_to_end_server(proc.hProcess, proc.hThread, FALSE); + + sprintf(buffer, "%s dde endw", argv[0]); + CreateProcessA(NULL, buffer, NULL, NULL, FALSE, + CREATE_SUSPENDED, NULL, NULL, &startup, &proc); + + test_end_to_end_server(proc.hProcess, proc.hThread, TRUE); + test_dde_aw_transaction(); test_DdeCreateDataHandle(); diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c index 8d60d21255a..2a2644706b7 100644 --- a/dlls/user32/tests/input.c +++ b/dlls/user32/tests/input.c @@ -1194,7 +1194,7 @@ static void test_ToUnicode(void) todo_wine ok(ret == 0, "ToUnicode for CTRL + Tab didn't return 0 (was %i)\n", ret); ret = ToUnicode(VK_RETURN, SC_RETURN, state, wStr, 2, 0); - ok(ret == 1, "ToUnicode for CTRL + Return didn't return 1 (was %i)", ret); + ok(ret == 1, "ToUnicode for CTRL + Return didn't return 1 (was %i)\n", ret); if(ret == 1) ok(wStr[0]=='\n', "ToUnicode for CTRL + Return was %i (expected 10)\n", wStr[0]); diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c index 4e879c6e0ab..74cb2a08a40 100644 --- a/dlls/user32/tests/menu.c +++ b/dlls/user32/tests/menu.c @@ -357,7 +357,8 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, MOD_GotDrawItemMsg = FALSE; mii.fMask = MIIM_FTYPE | MIIM_DATA | MIIM_STATE; mii.fType = 0; - mii.fState = MF_CHECKED; + /* check the menu item unless MNS_CHECKORBMP is set */ + mii.fState = (mnuopt != 2 ? MFS_CHECKED : MFS_UNCHECKED); mii.dwItemData =0; MODsizes[0] = bmpsize; hastab = 0; @@ -447,10 +448,20 @@ static void test_mbs_help( int ispop, int hassub, int mnuopt, if( hbmp == HBMMENU_CALLBACK && MOD_GotDrawItemMsg) { /* check the position of the bitmap */ /* horizontal */ - expect = ispop ? (4 + ( mnuopt ? 0 : GetSystemMetrics(SM_CXMENUCHECK))) - : 3; - ok( expect == MOD_rc[0].left, - "bitmap left is %d expected %d\n", MOD_rc[0].left, expect); + if (!ispop) + expect = 3; + else if (mnuopt == 0) + expect = 4 + GetSystemMetrics(SM_CXMENUCHECK); + else if (mnuopt == 1) + expect = 4; + else /* mnuopt == 2 */ + expect = 2; + if (ispop && mnuopt == 2) + todo_wine ok( expect == MOD_rc[0].left, + "bitmap left is %d expected %d\n", MOD_rc[0].left, expect); + else + ok( expect == MOD_rc[0].left, + "bitmap left is %d expected %d\n", MOD_rc[0].left, expect); failed = failed || !(expect == MOD_rc[0].left); /* vertical */ expect = (rc.bottom - rc.top - MOD_rc[0].bottom + MOD_rc[0].top) / 2; diff --git a/dlls/winealsa.drv/dsoutput.c b/dlls/winealsa.drv/dsoutput.c index 4043ccf036a..15cff5f1fbf 100644 --- a/dlls/winealsa.drv/dsoutput.c +++ b/dlls/winealsa.drv/dsoutput.c @@ -329,6 +329,8 @@ static HRESULT WINAPI IDsDriverBufferImpl_Lock(PIDSDRIVERBUFFER iface, TRACE("Hit mmap_pos, locking data!\n"); snd_pcm_mmap_begin(This->pcm, &areas, &This->mmap_pos, &putin); } + else + WARN("mmap_pos (%lu) != writepos (%lu) not locking data!\n", This->mmap_pos, writepos); LeaveCriticalSection(&This->pcm_crst); /* **** */ @@ -551,7 +553,9 @@ static HRESULT WINAPI IDsDriverBufferImpl_GetPosition(PIDSDRIVERBUFFER iface, if (used < 0) { + This->mmap_pos += -used; snd_pcm_forward(This->pcm, -used); + This->mmap_pos %= This->mmap_buflen_frames; used = 0; } diff --git a/dlls/winealsa.drv/waveout.c b/dlls/winealsa.drv/waveout.c index 9dae6f405ac..8149a4afb1d 100644 --- a/dlls/winealsa.drv/waveout.c +++ b/dlls/winealsa.drv/waveout.c @@ -575,7 +575,6 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) unsigned int period_time = 20000; snd_pcm_uframes_t buffer_size; snd_pcm_uframes_t period_size; - snd_pcm_uframes_t boundary; int flags; int err=0; int dir=0; @@ -758,13 +757,11 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) err = snd_pcm_hw_params_get_buffer_size(hw_params, &buffer_size); snd_pcm_sw_params_current(pcm, sw_params); - snd_pcm_sw_params_get_boundary(sw_params, &boundary); EXIT_ON_ERROR( snd_pcm_sw_params_set_start_threshold(pcm, sw_params, 1), MMSYSERR_ERROR, "unable to set start threshold"); EXIT_ON_ERROR( snd_pcm_sw_params_set_silence_size(pcm, sw_params, 0), MMSYSERR_ERROR, "unable to set silence size"); EXIT_ON_ERROR( snd_pcm_sw_params_set_avail_min(pcm, sw_params, period_size), MMSYSERR_ERROR, "unable to set avail min"); EXIT_ON_ERROR( snd_pcm_sw_params_set_silence_threshold(pcm, sw_params, 0), MMSYSERR_ERROR, "unable to set silence threshold"); - EXIT_ON_ERROR( snd_pcm_sw_params_set_stop_threshold(pcm, sw_params, boundary), MMSYSERR_ERROR, "unable to set stop threshold"); EXIT_ON_ERROR( snd_pcm_sw_params(pcm, sw_params), MMSYSERR_ERROR, "unable to set sw params for playback"); #undef EXIT_ON_ERROR diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 2f18ddce71f..7fa88c0c0ab 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -2221,10 +2221,11 @@ const shader_backend_t arb_program_shader_backend = { }; /* ARB_fragment_program fixed function pipeline replacement definitions */ -#define ARB_FFP_CONST_TFACTOR 0 -#define ARB_FFP_CONST_CONSTANT(i) ((ARB_FFP_CONST_TFACTOR) + 1 + i) -#define ARB_FFP_CONST_BUMPMAT(i) ((ARB_FFP_CONST_CONSTANT(7)) + 1 + i) -#define ARB_FFP_CONST_LUMINANCE(i) ((ARB_FFP_CONST_BUMPMAT(7)) + 1 + i) +#define ARB_FFP_CONST_TFACTOR 0 +#define ARB_FFP_CONST_SPECULAR_ENABLE ((ARB_FFP_CONST_TFACTOR) + 1) +#define ARB_FFP_CONST_CONSTANT(i) ((ARB_FFP_CONST_SPECULAR_ENABLE) + 1 + i) +#define ARB_FFP_CONST_BUMPMAT(i) ((ARB_FFP_CONST_CONSTANT(7)) + 1 + i) +#define ARB_FFP_CONST_LUMINANCE(i) ((ARB_FFP_CONST_BUMPMAT(7)) + 1 + i) struct arbfp_ffp_desc { @@ -2340,6 +2341,31 @@ static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *statebloc } } +static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + float col[4]; + IWineD3DDeviceImpl *device = stateblock->wineD3DDevice; + + /* Do not overwrite pixel shader constants if a pshader is in use */ + if(use_ps(device)) return; + + if(stateblock->renderState[WINED3DRS_SPECULARENABLE]) { + /* The specular color has no alpha */ + col[0] = 1.0; col[1] = 1.0; + col[2] = 1.0; col[3] = 0.0; + } else { + col[0] = 0.0; col[1] = 0.0; + col[2] = 0.0; col[3] = 0.0; + } + GL_EXTCALL(glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_SPECULAR_ENABLE, col)); + checkGLcall("glProgramEnvParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, ARB_FFP_CONST_SPECULAR_ENABLE, col)"); + + if(device->shader_backend == &arb_program_shader_backend) { + device = stateblock->wineD3DDevice; + device->activeContext->pshader_const_dirty[ARB_FFP_CONST_SPECULAR_ENABLE] = 1; + device->highest_dirty_ps_const = max(device->highest_dirty_ps_const, ARB_FFP_CONST_SPECULAR_ENABLE + 1); + } +} + static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE; IWineD3DDeviceImpl *device = stateblock->wineD3DDevice; @@ -2474,7 +2500,7 @@ static const char *get_argreg(SHADER_BUFFER *buffer, DWORD argnum, unsigned int return ret; } -static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, BOOL color, BOOL alpha, BOOL last, +static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, BOOL color, BOOL alpha, DWORD dst, DWORD op, DWORD dw_arg0, DWORD dw_arg1, DWORD dw_arg2) { const char *dstmask, *dstreg, *arg0, *arg1, *arg2; unsigned int mul = 1; @@ -2484,9 +2510,7 @@ static void gen_ffp_instr(SHADER_BUFFER *buffer, unsigned int stage, BOOL color, else if(color) dstmask = ".rgb"; else dstmask = ".a"; - if(dst == tempreg && last) FIXME("Last texture stage writes to D3DTA_TEMP\n"); if(dst == tempreg) dstreg = "tempreg"; - else if(last) dstreg = "result.color"; else dstreg = "ret"; arg0 = get_argreg(buffer, 0, stage, dw_arg0); @@ -2627,8 +2651,8 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB GLuint ret; DWORD arg0, arg1, arg2; BOOL tempreg_used = FALSE, tfactor_used = FALSE; - BOOL last = FALSE; BOOL op_equal; + const char *final_combiner_src = "ret"; /* Find out which textures are read */ for(stage = 0; stage < MAX_TEXTURES; stage++) { @@ -2641,6 +2665,7 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB if(arg2 == WINED3DTA_TEXTURE) tex_read[stage] = TRUE; if(settings->op[stage].cop == WINED3DTOP_BLENDTEXTUREALPHA) tex_read[stage] = TRUE; + if(settings->op[stage].cop == WINED3DTOP_BLENDTEXTUREALPHAPM) tex_read[stage] = TRUE; if(settings->op[stage].cop == WINED3DTOP_BUMPENVMAP) { bump_used[stage] = TRUE; tex_read[stage] = TRUE; @@ -2711,6 +2736,7 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB if(tfactor_used) { shader_addline(&buffer, "PARAM tfactor = program.env[%u];\n", ARB_FFP_CONST_TFACTOR); } + shader_addline(&buffer, "PARAM specular_enable = program.env[%u];\n", ARB_FFP_CONST_SPECULAR_ENABLE); if(settings->sRGB_write) { shader_addline(&buffer, "PARAM srgb_mul_low = {%f, %f, %f, 1.0};\n", @@ -2764,25 +2790,22 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB shader_addline(&buffer, "DP3 ret.g, arg1, tex%u;\n", stage - 1); /* with projective textures, texbem only divides the static texture coord, not the displacement, - * so we can't let the GL handle this. + * so multiply the displacement with the dividing parameter before passing it to TXP */ if (settings->op[stage].projected != proj_none) { - /* Note: Currently always divide by .a because the vertex pipeline moves the correct value - * into the 4th component - */ if(settings->op[stage].projected == proj_count4) { - shader_addline(&buffer, "RCP arg1.a, fragment.texcoord[%u].a;\n", stage); + shader_addline(&buffer, "MOV ret.a, fragment.texcoord[%u].a;\n", stage); + shader_addline(&buffer, "MUL ret.rgb, ret, fragment.texcoord[%u].a, fragment.texcoord[%u];\n", stage, stage); } else { - shader_addline(&buffer, "RCP arg1.a, fragment.texcoord[%u].b;\n", stage); + shader_addline(&buffer, "MOV ret.a, fragment.texcoord[%u].b;\n", stage); + shader_addline(&buffer, "MAD ret.rgb, ret, fragment.texcoord[%u].b, fragment.texcoord[%u];\n", stage, stage); } - shader_addline(&buffer, "MUL arg1.rg, fragment.texcoord[%u], arg1.a;\n", stage); - shader_addline(&buffer, "ADD ret, ret, arg1;\n"); } else { shader_addline(&buffer, "ADD ret, ret, fragment.texcoord[%u];\n", stage); } - shader_addline(&buffer, "TEX%s tex%u, ret, texture[%u], %s;\n", - sat, stage, stage, textype); + shader_addline(&buffer, "%s%s tex%u, ret, texture[%u], %s;\n", + instr, sat, stage, stage, textype); if(settings->op[stage - 1].cop == WINED3DTOP_BUMPENVMAPLUMINANCE) { shader_addline(&buffer, "MAD_SAT ret.r, tex%u.b, luminance%u.r, luminance%u.g;\n", stage - 1, stage - 1, stage - 1); @@ -2807,15 +2830,9 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB for(stage = 0; stage < MAX_TEXTURES; stage++) { if(settings->op[stage].cop == WINED3DTOP_DISABLE) { if(stage == 0) { - shader_addline(&buffer, "MOV result.color, fragment.color.primary;\n"); + final_combiner_src = "fragment.color.primary"; } break; - } else if(settings->sRGB_write) { - last = FALSE; - } else if(stage == (MAX_TEXTURES - 1)) { - last = TRUE; - } else if(settings->op[stage + 1].cop == WINED3DTOP_DISABLE) { - last = TRUE; } if(settings->op[stage].cop == WINED3DTOP_SELECTARG1 && @@ -2838,33 +2855,32 @@ static GLuint gen_arbfp_ffp_shader(struct ffp_settings *settings, IWineD3DStateB } if(settings->op[stage].aop == WINED3DTOP_DISABLE) { - gen_ffp_instr(&buffer, stage, TRUE, FALSE, last, settings->op[stage].dst, + gen_ffp_instr(&buffer, stage, TRUE, FALSE, settings->op[stage].dst, settings->op[stage].cop, settings->op[stage].carg0, settings->op[stage].carg1, settings->op[stage].carg2); - if(last && stage == 0) { - shader_addline(&buffer, "MOV result.color.a, fragment.color.primary.a;\n"); - } else if(last) { - shader_addline(&buffer, "MOV result.color.a, ret.a;\n"); - } else if(stage == 0) { + if(stage == 0) { shader_addline(&buffer, "MOV ret.a, fragment.color.primary.a;\n"); } } else if(op_equal) { - gen_ffp_instr(&buffer, stage, TRUE, TRUE, last, settings->op[stage].dst, + gen_ffp_instr(&buffer, stage, TRUE, TRUE, settings->op[stage].dst, settings->op[stage].cop, settings->op[stage].carg0, settings->op[stage].carg1, settings->op[stage].carg2); } else { - gen_ffp_instr(&buffer, stage, TRUE, FALSE, last, settings->op[stage].dst, + gen_ffp_instr(&buffer, stage, TRUE, FALSE, settings->op[stage].dst, settings->op[stage].cop, settings->op[stage].carg0, settings->op[stage].carg1, settings->op[stage].carg2); - gen_ffp_instr(&buffer, stage, FALSE, TRUE, last, settings->op[stage].dst, + gen_ffp_instr(&buffer, stage, FALSE, TRUE, settings->op[stage].dst, settings->op[stage].aop, settings->op[stage].aarg0, settings->op[stage].aarg1, settings->op[stage].aarg2); } } if(settings->sRGB_write) { + shader_addline(&buffer, "MAD ret, fragment.color.secondary, specular_enable, %s;\n", final_combiner_src); arbfp_add_sRGB_correction(&buffer, "ret", "arg0", "arg1", "arg2", "tempreg"); shader_addline(&buffer, "MOV result.color.a, ret.a;\n"); + } else { + shader_addline(&buffer, "MAD result.color, fragment.color.secondary, specular_enable, %s;\n", final_combiner_src); } /* Footer */ @@ -2896,6 +2912,13 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, if(isStateDirty(context, STATE_RENDER(WINED3DRS_FOGENABLE))) { if(use_pshader) { IWineD3DPixelShader_CompileShader(stateblock->pixelShader); + } else if(device->shader_backend == &arb_program_shader_backend && context->last_was_pshader) { + /* Reload fixed function constants since they collide with the pixel shader constants */ + for(i = 0; i < MAX_TEXTURES; i++) { + set_bumpmat_arbfp(STATE_TEXTURESTAGE(i, WINED3DTSS_BUMPENVMAT00), stateblock, context); + } + state_texfactor_arbfp(STATE_RENDER(WINED3DRS_TEXTUREFACTOR), stateblock, context); + state_arb_specularenable(STATE_RENDER(WINED3DRS_SPECULARENABLE), stateblock, context); } return; } @@ -2937,6 +2960,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, set_bumpmat_arbfp(STATE_TEXTURESTAGE(i, WINED3DTSS_BUMPENVMAT00), stateblock, context); } state_texfactor_arbfp(STATE_RENDER(WINED3DRS_TEXTUREFACTOR), stateblock, context); + state_arb_specularenable(STATE_RENDER(WINED3DRS_SPECULARENABLE), stateblock, context); } } @@ -3124,6 +3148,7 @@ static const struct StateEntryTemplate arbfp_fragmentstate_template[] = { {STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(5, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, {STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(6, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, {STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(7, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, 0 }, + { STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_arb_specularenable}, 0 }, {0 /* Terminate */, { 0, 0 }, 0 }, }; @@ -3142,6 +3167,7 @@ const struct fragment_pipeline arbfp_fragment_pipeline = { struct arbfp_blit_priv { GLenum yuy2_rect_shader, yuy2_2d_shader; GLenum uyvy_rect_shader, uyvy_2d_shader; + GLenum yv12_rect_shader, yv12_2d_shader; }; static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) { @@ -3162,23 +3188,23 @@ static void arbfp_blit_free(IWineD3DDevice *iface) { GL_EXTCALL(glDeleteProgramsARB(1, &priv->yuy2_2d_shader)); GL_EXTCALL(glDeleteProgramsARB(1, &priv->uyvy_rect_shader)); GL_EXTCALL(glDeleteProgramsARB(1, &priv->uyvy_2d_shader)); + GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_rect_shader)); + GL_EXTCALL(glDeleteProgramsARB(1, &priv->yv12_2d_shader)); checkGLcall("Delete yuv programs\n"); LEAVE_GL(); } -GLenum gen_yuv_shader(IWineD3DDeviceImpl *device, WINED3DFORMAT fmt, GLenum textype) { - GLenum shader; - SHADER_BUFFER buffer; +BOOL gen_planar_yuv_read(SHADER_BUFFER *buffer, WINED3DFORMAT fmt, GLenum textype, char *luminance) { + char chroma; const char *tex, *texinstr; - char chroma, luminance; - struct arbfp_blit_priv *priv = (struct arbfp_blit_priv *) device->blit_priv; - - /* Shader header */ - buffer.bsize = 0; - buffer.lineNo = 0; - buffer.newline = TRUE; - buffer.buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, SHADER_PGMSIZE); + if(fmt == WINED3DFMT_UYVY) { + chroma = 'r'; + *luminance = 'a'; + } else { + chroma = 'a'; + *luminance = 'r'; + } switch(textype) { case GL_TEXTURE_2D: tex = "2D"; texinstr = "TXP"; break; case GL_TEXTURE_RECTANGLE_ARB: tex = "RECT"; texinstr = "TEX"; break; @@ -3187,17 +3213,230 @@ GLenum gen_yuv_shader(IWineD3DDeviceImpl *device, WINED3DFORMAT fmt, GLenum text * properly in the texture to find the correct chroma values */ FIXME("Implement yuv correction for non-2d, non-rect textures\n"); - return 0; + return FALSE; } - if(fmt == WINED3DFMT_UYVY) { - chroma = 'r'; - luminance = 'a'; + /* First we have to read the chroma values. This means we need at least two pixels(no filtering), + * or 4 pixels(with filtering). To get the unmodified chromas, we have to rid ourselves of the + * filtering when we sample the texture. + * + * These are the rules for reading the chroma: + * + * Even pixel: Cr + * Even pixel: U + * Odd pixel: V + * + * So we have to get the sampling x position in non-normalized coordinates in integers + */ + if(textype != GL_TEXTURE_RECTANGLE_ARB) { + shader_addline(buffer, "MUL texcrd.rg, fragment.texcoord[0], size.x;\n"); + shader_addline(buffer, "MOV texcrd.a, size.x;\n"); } else { - chroma = 'a'; - luminance = 'r'; + shader_addline(buffer, "MOV texcrd, fragment.texcoord[0];\n"); + } + /* We must not allow filtering between pixel x and x+1, this would mix U and V + * Vertical filtering is ok. However, bear in mind that the pixel center is at + * 0.5, so add 0.5. + */ + shader_addline(buffer, "FLR texcrd.x, texcrd.x;\n"); + shader_addline(buffer, "ADD texcrd.x, texcrd.x, coef.y;\n"); + + /* Divide the x coordinate by 0.5 and get the fraction. This gives 0.25 and 0.75 for the + * even and odd pixels respectively + */ + shader_addline(buffer, "MUL texcrd2, texcrd, coef.y;\n"); + shader_addline(buffer, "FRC texcrd2, texcrd2;\n"); + + /* Sample Pixel 1 */ + shader_addline(buffer, "%s luminance, texcrd, texture[0], %s;\n", texinstr, tex); + + /* Put the value into either of the chroma values */ + shader_addline(buffer, "SGE temp.x, texcrd2.x, coef.y;\n"); + shader_addline(buffer, "MUL chroma.r, luminance.%c, temp.x;\n", chroma); + shader_addline(buffer, "SLT temp.x, texcrd2.x, coef.y;\n"); + shader_addline(buffer, "MUL chroma.g, luminance.%c, temp.x;\n", chroma); + + /* Sample pixel 2. If we read an even pixel(SLT above returned 1), sample + * the pixel right to the current one. Otherwise, sample the left pixel. + * Bias and scale the SLT result to -1;1 and add it to the texcrd.x. + */ + shader_addline(buffer, "MAD temp.x, temp.x, coef.z, -coef.x;\n"); + shader_addline(buffer, "ADD texcrd.x, texcrd, temp.x;\n"); + shader_addline(buffer, "%s luminance, texcrd, texture[0], %s;\n", texinstr, tex); + + /* Put the value into the other chroma */ + shader_addline(buffer, "SGE temp.x, texcrd2.x, coef.y;\n"); + shader_addline(buffer, "MAD chroma.g, luminance.%c, temp.x, chroma.g;\n", chroma); + shader_addline(buffer, "SLT temp.x, texcrd2.x, coef.y;\n"); + shader_addline(buffer, "MAD chroma.r, luminance.%c, temp.x, chroma.r;\n", chroma); + + /* TODO: If filtering is enabled, sample a 2nd pair of pixels left or right of + * the current one and lerp the two U and V values + */ + + /* This gives the correctly filtered luminance value */ + shader_addline(buffer, "TEX luminance, fragment.texcoord[0], texture[0], %s;\n", tex); + + return TRUE; +} + +BOOL gen_yv12_read(SHADER_BUFFER *buffer, WINED3DFORMAT fmt, GLenum textype, char *luminance) { + const char *tex; + + switch(textype) { + case GL_TEXTURE_2D: tex = "2D"; break; + case GL_TEXTURE_RECTANGLE_ARB: tex = "RECT"; break; + default: + FIXME("Implement yv12 correction for non-2d, non-rect textures\n"); + return FALSE; } + /* YV12 surfaces contain a WxH sized luminance plane, followed by a (W/2)x(H/2) + * V and a (W/2)x(H/2) U plane, each with 8 bit per pixel. So the effective + * bitdepth is 12 bits per pixel. Since the U and V planes have only half the + * pitch of the luminance plane, the packing into the gl texture is a bit + * unfortunate. If the whole texture is interpreted as luminance data it looks + * approximately like this: + * + * +----------------------------------+---- + * | | + * | | + * | | + * | | + * | | 2 + * | LUMINANCE | - + * | | 3 + * | | + * | | + * | | + * | | + * +----------------+-----------------+---- + * | | | + * | U even rows | U odd rows | + * | | | 1 + * +----------------+------------------ - + * | | | 3 + * | V even rows | V odd rows | + * | | | + * +----------------+-----------------+---- + * | | | + * | 0.5 | 0.5 | + * + * So it appears as if there are 4 chroma images, but in fact the odd rows + * in the chroma images are in the same row as the even ones. So its is + * kinda tricky to read + * + * When reading from rectangle textures, keep in mind that the input y coordinates + * go from 0 to d3d_height, whereas the opengl texture height is 1.5 * d3d_height + */ + shader_addline(buffer, "PARAM yv12_coef = {%f, %f, %f, %f};\n", + 2.0 / 3.0, 1.0 / 6.0, (2.0 / 3.0) + (1.0 / 6.0), 1.0 / 3.0); + + shader_addline(buffer, "MOV texcrd, fragment.texcoord[0];\n"); + /* the chroma planes have only half the width */ + shader_addline(buffer, "MUL texcrd.x, texcrd.x, coef.y;\n"); + + /* The first value is between 2/3 and 5/6th of the texture's height, so scale+bias + * the coordinate. Also read the right side of the image when reading odd lines + * + * Don't forget to clamp the y values in into the range, otherwise we'll get filtering + * bleeding + */ + if(textype == GL_TEXTURE_2D) { + + shader_addline(buffer, "RCP chroma.w, size.y;\n"); + + shader_addline(buffer, "MUL texcrd2.y, texcrd.y, size.y;\n"); + + shader_addline(buffer, "FLR texcrd2.y, texcrd2.y;\n"); + shader_addline(buffer, "MAD texcrd.y, texcrd.y, yv12_coef.y, yv12_coef.x;\n"); + + /* Read odd lines from the right side(add size * 0.5 to the x coordinate */ + shader_addline(buffer, "ADD texcrd2.x, texcrd2.y, yv12_coef.y;\n"); /* To avoid 0.5 == 0.5 comparisons */ + shader_addline(buffer, "FRC texcrd2.x, texcrd2.x;\n"); + shader_addline(buffer, "SGE texcrd2.x, texcrd2.x, coef.y;\n"); + shader_addline(buffer, "MAD texcrd.x, texcrd2.x, coef.y, texcrd.x;\n"); + + /* clamp, keep the half pixel origin in mind */ + shader_addline(buffer, "MAD temp.y, coef.y, chroma.w, yv12_coef.x;\n"); + shader_addline(buffer, "MAX texcrd.y, temp.y, texcrd.y;\n"); + shader_addline(buffer, "MAD temp.y, -coef.y, chroma.w, yv12_coef.z;\n"); + shader_addline(buffer, "MIN texcrd.y, temp.y, texcrd.y;\n"); + } else { + /* Read from [size - size+size/4] */ + shader_addline(buffer, "FLR texcrd.y, texcrd.y;\n"); + shader_addline(buffer, "MAD texcrd.y, texcrd.y, coef.w, size.y;\n"); + + /* Read odd lines from the right side(add size * 0.5 to the x coordinate */ + shader_addline(buffer, "ADD texcrd2.x, texcrd.y, yv12_coef.y;\n"); /* To avoid 0.5 == 0.5 comparisons */ + shader_addline(buffer, "FRC texcrd2.x, texcrd2.x;\n"); + shader_addline(buffer, "SGE texcrd2.x, texcrd2.x, coef.y;\n"); + shader_addline(buffer, "MUL texcrd2.x, texcrd2.x, size.x;\n"); + shader_addline(buffer, "MAD texcrd.x, texcrd2.x, coef.y, texcrd.x;\n"); + + /* Make sure to read exactly from the pixel center */ + shader_addline(buffer, "FLR texcrd.y, texcrd.y;\n"); + shader_addline(buffer, "ADD texcrd.y, texcrd.y, coef.y;\n"); + + /* Clamp */ + shader_addline(buffer, "MAD temp.y, size.y, coef.w, size.y;\n"); + shader_addline(buffer, "ADD temp.y, temp.y, -coef.y;\n"); + shader_addline(buffer, "MIN texcrd.y, temp.y, texcrd.y;\n"); + shader_addline(buffer, "ADD temp.y, size.y, -coef.y;\n"); + shader_addline(buffer, "MAX texcrd.y, temp.y, texcrd.y;\n"); + } + /* Read the texture, put the result into the output register */ + shader_addline(buffer, "TEX temp, texcrd, texture[0], %s;\n", tex); + shader_addline(buffer, "MOV chroma.r, temp.a;\n"); + + /* The other chroma value is 1/6th of the texture lower, from 5/6th to 6/6th + * No need to clamp because we're just reusing the already clamped value from above + */ + if(textype == GL_TEXTURE_2D) { + shader_addline(buffer, "ADD texcrd.y, texcrd.y, yv12_coef.y;\n"); + } else { + shader_addline(buffer, "MAD texcrd.y, size.y, coef.w, texcrd.y;\n"); + } + shader_addline(buffer, "TEX temp, texcrd, texture[0], %s;\n", tex); + shader_addline(buffer, "MOV chroma.g, temp.a;\n"); + + /* Sample the luminance value. It is in the top 2/3rd of the texture, so scale the y coordinate. + * Clamp the y coordinate to prevent the chroma values from bleeding into the sampled luminance + * values due to filtering + */ + shader_addline(buffer, "MOV texcrd, fragment.texcoord[0];\n"); + if(textype == GL_TEXTURE_2D) { + /* Multiply the y coordinate by 2/3 and clamp it */ + shader_addline(buffer, "MUL texcrd.y, texcrd.y, yv12_coef.x;\n"); + shader_addline(buffer, "MAD temp.y, -coef.y, chroma.w, yv12_coef.x;\n"); + shader_addline(buffer, "MIN texcrd.y, temp.y, texcrd.y;\n"); + shader_addline(buffer, "TEX luminance, texcrd, texture[0], %s;\n", tex); + } else { + /* Reading from texture_rectangles is pretty streightforward, just use the unmodified + * texture coordinate. It is still a good idea to clamp it though, since the opengl texture + * is bigger + */ + shader_addline(buffer, "ADD temp.x, size.y, -coef.y;\n"); + shader_addline(buffer, "MIN texcrd.y, texcrd.y, size.x;\n"); + shader_addline(buffer, "TEX luminance, texcrd, texture[0], %s;\n", tex); + } + *luminance = 'a'; + + return TRUE; +} + +GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, WINED3DFORMAT fmt, GLenum textype) { + GLenum shader; + SHADER_BUFFER buffer; + char luminance_component; + struct arbfp_blit_priv *priv = (struct arbfp_blit_priv *) device->blit_priv; + + /* Shader header */ + buffer.bsize = 0; + buffer.lineNo = 0; + buffer.newline = TRUE; + buffer.buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, SHADER_PGMSIZE); + GL_EXTCALL(glGenProgramsARB(1, &shader)); checkGLcall("GL_EXTCALL(glGenProgramsARB(1, &shader))"); GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, shader)); @@ -3245,70 +3484,19 @@ GLenum gen_yuv_shader(IWineD3DDeviceImpl *device, WINED3DFORMAT fmt, GLenum text shader_addline(&buffer, "TEMP chroma;\n"); shader_addline(&buffer, "TEMP texcrd;\n"); shader_addline(&buffer, "TEMP texcrd2;\n"); - shader_addline(&buffer, "PARAM coef = {1.0, 0.5, 2.0, 0.0};\n"); + shader_addline(&buffer, "PARAM coef = {1.0, 0.5, 2.0, 0.25};\n"); shader_addline(&buffer, "PARAM yuv_coef = {1.403, 0.344, 0.714, 1.770};\n"); shader_addline(&buffer, "PARAM size = program.local[0];\n"); - /* First we have to read the chroma values. This means we need at least two pixels(no filtering), - * or 4 pixels(with filtering). To get the unmodified chromas, we have to rid ourselves of the - * filtering when we sample the texture. - * - * These are the rules for reading the chroma: - * - * Even pixel: Cr - * Even pixel: U - * Odd pixel: V - * - * So we have to get the sampling x position in non-normalized coordinates in integers - */ - if(textype != GL_TEXTURE_RECTANGLE_ARB) { - shader_addline(&buffer, "MUL texcrd.rg, fragment.texcoord[0], size.x;\n"); - shader_addline(&buffer, "MOV texcrd.a, size.x;\n"); + if(fmt == WINED3DFMT_UYVY || fmt ==WINED3DFMT_YUY2) { + if(gen_planar_yuv_read(&buffer, fmt, textype, &luminance_component) == FALSE) { + return 0; + } } else { - shader_addline(&buffer, "MOV texcrd, fragment.texcoord[0];\n"); + if(gen_yv12_read(&buffer, fmt, textype, &luminance_component) == FALSE) { + return 0; + } } - /* We must not allow filtering between pixel x and x+1, this would mix U and V - * Vertical filtering is ok. However, bear in mind that the pixel center is at - * 0.5, so add 0.5. - */ - shader_addline(&buffer, "FLR texcrd.x, texcrd.x;\n"); - shader_addline(&buffer, "ADD texcrd.x, texcrd.x, coef.y;\n"); - - /* Divide the x coordinate by 0.5 and get the fraction. This gives 0.25 and 0.75 for the - * even and odd pixels respectively - */ - shader_addline(&buffer, "MUL texcrd2, texcrd, coef.y;\n"); - shader_addline(&buffer, "FRC texcrd2, texcrd2;\n"); - - /* Sample Pixel 1 */ - shader_addline(&buffer, "%s luminance, texcrd, texture[0], %s;\n", texinstr, tex); - - /* Put the value into either of the chroma values */ - shader_addline(&buffer, "SGE temp.x, texcrd2.x, coef.y;\n"); - shader_addline(&buffer, "MUL chroma.r, luminance.%c, temp.x;\n", chroma); - shader_addline(&buffer, "SLT temp.x, texcrd2.x, coef.y;\n"); - shader_addline(&buffer, "MUL chroma.g, luminance.%c, temp.x;\n", chroma); - - /* Sample pixel 2. If we read an even pixel(SLT above returned 1), sample - * the pixel right to the current one. Otherwise, sample the left pixel. - * Bias and scale the SLT result to -1;1 and add it to the texcrd.x. - */ - shader_addline(&buffer, "MAD temp.x, temp.x, coef.z, -coef.x;\n"); - shader_addline(&buffer, "ADD texcrd.x, texcrd, temp.x;\n"); - shader_addline(&buffer, "%s luminance, texcrd, texture[0], %s;\n", texinstr, tex); - - /* Put the value into the other chroma */ - shader_addline(&buffer, "SGE temp.x, texcrd2.x, coef.y;\n"); - shader_addline(&buffer, "MAD chroma.g, luminance.%c, temp.x, chroma.g;\n", chroma); - shader_addline(&buffer, "SLT temp.x, texcrd2.x, coef.y;\n"); - shader_addline(&buffer, "MAD chroma.r, luminance.%c, temp.x, chroma.r;\n", chroma); - - /* TODO: If filtering is enabled, sample a 2nd pair of pixels left or right of - * the current one and lerp the two U and V values - */ - - /* This gives the correctly filtered luminance value */ - shader_addline(&buffer, "TEX luminance, fragment.texcoord[0], texture[0], %s;\n", tex); /* Calculate the final result. Formula is taken from * http://www.fourcc.org/fccyvrgb.php. Note that the chroma @@ -3316,10 +3504,10 @@ GLenum gen_yuv_shader(IWineD3DDeviceImpl *device, WINED3DFORMAT fmt, GLenum text */ shader_addline(&buffer, "SUB chroma.rg, chroma, coef.y;\n"); - shader_addline(&buffer, "MAD result.color.r, chroma.r, yuv_coef.x, luminance.%c;\n", luminance); - shader_addline(&buffer, "MAD temp.r, -chroma.g, yuv_coef.y, luminance.%c;\n", luminance); + shader_addline(&buffer, "MAD result.color.r, chroma.r, yuv_coef.x, luminance.%c;\n", luminance_component); + shader_addline(&buffer, "MAD temp.r, -chroma.g, yuv_coef.y, luminance.%c;\n", luminance_component); shader_addline(&buffer, "MAD result.color.g, -chroma.r, yuv_coef.z, temp.r;\n"); - shader_addline(&buffer, "MAD result.color.b, chroma.g, yuv_coef.w, luminance.%c;\n", luminance); + shader_addline(&buffer, "MAD result.color.b, chroma.g, yuv_coef.w, luminance.%c;\n", luminance_component); shader_addline(&buffer, "END\n"); GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer)); @@ -3337,12 +3525,18 @@ GLenum gen_yuv_shader(IWineD3DDeviceImpl *device, WINED3DFORMAT fmt, GLenum text } else { priv->yuy2_2d_shader = shader; } - } else { + } else if(fmt == WINED3DFMT_UYVY) { if(textype == GL_TEXTURE_RECTANGLE_ARB) { priv->uyvy_rect_shader = shader; } else { priv->uyvy_2d_shader = shader; } + } else { + if(textype == GL_TEXTURE_RECTANGLE_ARB) { + priv->yv12_rect_shader = shader; + } else { + priv->yv12_2d_shader = shader; + } } return shader; } @@ -3356,7 +3550,9 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, WINED3DFORMAT fmt, GLenum t getFormatDescEntry(fmt, &GLINFO_LOCATION, &glDesc); - if(glDesc->conversion_group != WINED3DFMT_YUY2 && glDesc->conversion_group != WINED3DFMT_UYVY) { + if(glDesc->conversion_group != WINED3DFMT_YUY2 && glDesc->conversion_group != WINED3DFMT_UYVY && + glDesc->conversion_group != WINED3DFMT_YV12) { + ERR("Format: %s\n", debug_d3dformat(glDesc->conversion_group)); /* Don't bother setting up a shader for unconverted formats */ glEnable(textype); checkGLcall("glEnable(textype)"); @@ -3369,12 +3565,18 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, WINED3DFORMAT fmt, GLenum t } else { shader = priv->yuy2_2d_shader; } - } else { + } else if(glDesc->conversion_group == WINED3DFMT_UYVY) { if(textype == GL_TEXTURE_RECTANGLE_ARB) { shader = priv->uyvy_rect_shader; } else { shader = priv->uyvy_2d_shader; } + } else { + if(textype == GL_TEXTURE_RECTANGLE_ARB) { + shader = priv->yv12_rect_shader; + } else { + shader = priv->yv12_2d_shader; + } } if(!shader) { @@ -3412,6 +3614,7 @@ static BOOL arbfp_blit_conv_supported(WINED3DFORMAT fmt) { switch(fmt) { case WINED3DFMT_YUY2: case WINED3DFMT_UYVY: + case WINED3DFMT_YV12: TRACE("[OK]\n"); return TRUE; default: diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 66206bd3e99..088142ede4e 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -136,12 +136,12 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc, WINED3DF * only offer 32 bit ARB pixel formats. First try without an exact alpha * match, then try without an exact alpha and color match. */ - { FALSE, TRUE, TRUE }, { TRUE, TRUE, TRUE }, - { FALSE, FALSE, TRUE }, - { FALSE, FALSE, FALSE }, { TRUE, FALSE, TRUE }, + { FALSE, TRUE, TRUE }, + { FALSE, FALSE, TRUE }, { TRUE, FALSE, FALSE }, + { FALSE, FALSE, FALSE }, }; int i = 0; @@ -632,6 +632,25 @@ static void RemoveContextFromArray(IWineD3DDeviceImpl *This, WineD3DContext *con HeapFree(GetProcessHeap(), 0, oldArray); } +static void destroy_fbo(IWineD3DDeviceImpl *This, const GLuint *fbo) +{ + int i = 0; + + GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, *fbo)); + checkGLcall("glBindFramebuffer()"); + for (i = 0; i < GL_LIMITS(buffers); ++i) + { + GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + i, GL_TEXTURE_2D, 0, 0)); + checkGLcall("glFramebufferTexture2D()"); + } + GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); + checkGLcall("glFramebufferTexture2D()"); + GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); + checkGLcall("glBindFramebuffer()"); + GL_EXTCALL(glDeleteFramebuffersEXT(1, fbo)); + checkGLcall("glDeleteFramebuffers()"); +} + /***************************************************************************** * DestroyContext * @@ -655,13 +674,16 @@ void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) { ENTER_GL(); if (context->fbo) { - GL_EXTCALL(glDeleteFramebuffersEXT(1, &context->fbo)); + TRACE("Destroy FBO %d\n", context->fbo); + destroy_fbo(This, &context->fbo); } if (context->src_fbo) { - GL_EXTCALL(glDeleteFramebuffersEXT(1, &context->src_fbo)); + TRACE("Destroy src FBO %d\n", context->src_fbo); + destroy_fbo(This, &context->src_fbo); } if (context->dst_fbo) { - GL_EXTCALL(glDeleteFramebuffersEXT(1, &context->dst_fbo)); + TRACE("Destroy dst FBO %d\n", context->dst_fbo); + destroy_fbo(This, &context->dst_fbo); } LEAVE_GL(); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e199ad11aaf..3cfc6061b50 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -586,7 +586,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSurfaceImpl *object; /*NOTE: impl ref allowed since this is a create function */ unsigned int Size = 1; - const StaticPixelFormatDesc *tableEntry = getFormatDescEntry(Format, NULL, NULL); + const GlPixelFormatDesc *glDesc; + const StaticPixelFormatDesc *tableEntry = getFormatDescEntry(Format, &GLINFO_LOCATION, &glDesc); + UINT mul_4w, mul_4h; TRACE("(%p) Create surface\n",This); /** FIXME: Check ranges on the inputs are valid @@ -624,22 +626,26 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U * it is based around 4x4 pixel blocks it requires padding, so allocate enough * space! *********************************/ + mul_4w = (Width + 3) & ~3; + mul_4h = (Height + 3) & ~3; if (WINED3DFMT_UNKNOWN == Format) { Size = 0; } else if (Format == WINED3DFMT_DXT1) { /* DXT1 is half byte per pixel */ - Size = ((max(Width,4) * tableEntry->bpp) * max(Height,4)) >> 1; + Size = (mul_4w * tableEntry->bpp * mul_4h) >> 1; } else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 || Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5 || Format == WINED3DFMT_ATI2N) { - Size = ((max(Width,4) * tableEntry->bpp) * max(Height,4)); + Size = (mul_4w * tableEntry->bpp * mul_4h); } else { /* The pitch is a multiple of 4 bytes */ Size = ((Width * tableEntry->bpp) + This->surface_alignment - 1) & ~(This->surface_alignment - 1); - Size *= Height; + Size *= Height; } + if(glDesc->heightscale != 0.0) Size *= glDesc->heightscale; + /** Create and initialise the surface resource **/ D3DCREATERESOURCEOBJECTINSTANCE(object,Surface,WINED3DRTYPE_SURFACE, Size) /* "Standalone" surface */ @@ -650,6 +656,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U object->currentDesc.MultiSampleType = MultiSample; object->currentDesc.MultiSampleQuality = MultisampleQuality; object->glDescription.level = Level; + object->heightscale = glDesc->heightscale != 0.0 ? glDesc->heightscale : 1.0; list_init(&object->overlays); /* Flags */ @@ -4991,6 +4998,7 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa WINED3DVIEWPORT *vp = &This->stateBlock->viewport; UINT drawable_width, drawable_height; IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget; + IWineD3DSwapChainImpl *swapchain = NULL; /* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the * drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true @@ -5147,10 +5155,6 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa * it is most likely more efficient to perform a clear on the sysmem copy too instead of downloading it */ IWineD3DSurface_ModifyLocation(This->lastActiveRenderTarget, SFLAG_INDRAWABLE, TRUE); - /* TODO: Move the fbo logic into ModifyLocation() */ - if(This->render_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO) { - target->Flags |= SFLAG_INTEXTURE; - } } if (Flags & WINED3DCLEAR_ZBUFFER) { /* Note that WINED3DCLEAR_ZBUFFER implies a depth stencil exists on the device */ @@ -5160,6 +5164,14 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa LEAVE_GL(); + IWineD3DSurface_GetContainer( (IWineD3DSurface *) target, &IID_IWineD3DSwapChain, (void **)&swapchain); + if (swapchain) { + if (target == (IWineD3DSurfaceImpl*) swapchain->frontBuffer) { + glFlush(); + } + IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); + } + return WINED3D_OK; } @@ -5572,10 +5584,46 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetFrontBufferData(IWineD3DDevice *if static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface, DWORD* pNumPasses) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; + IWineD3DBaseTextureImpl *texture; + const GlPixelFormatDesc *gl_info; + DWORD i; + + TRACE("(%p) : %p\n", This, pNumPasses); + + for(i = 0; i < MAX_COMBINED_SAMPLERS; i++) { + if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE) { + WARN("Sampler state %u has minfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i); + return WINED3DERR_UNSUPPORTEDTEXTUREFILTER; + } + if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] == WINED3DTEXF_NONE) { + WARN("Sampler state %u has magfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i); + return WINED3DERR_UNSUPPORTEDTEXTUREFILTER; + } + + texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i]; + if(!texture) continue; + getFormatDescEntry(texture->resource.format, &GLINFO_LOCATION, &gl_info); + if(gl_info->Flags & WINED3DFMT_FLAG_FILTERING) continue; + + if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT) { + WARN("Non-filterable texture and mag filter enabled on samper %u, returning E_FAIL\n", i); + return E_FAIL; + } + if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] != WINED3DTEXF_POINT) { + WARN("Non-filterable texture and min filter enabled on samper %u, returning E_FAIL\n", i); + return E_FAIL; + } + if(This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE && + This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT /* sic! */) { + WARN("Non-filterable texture and mip filter enabled on samper %u, returning E_FAIL\n", i); + return E_FAIL; + } + } + /* return a sensible default */ *pNumPasses = 1; - /* TODO: If the window is minimized then validate device should return something other than WINED3D_OK */ - FIXME("(%p) : stub\n", This); + + TRACE("returning D3D_OK\n"); return WINED3D_OK; } @@ -6079,6 +6127,7 @@ void bind_fbo(IWineD3DDevice *iface, GLenum target, GLuint *fbo) { if (!*fbo) { GL_EXTCALL(glGenFramebuffersEXT(1, fbo)); checkGLcall("glGenFramebuffersEXT()"); + TRACE("Created FBO %d\n", *fbo); } GL_EXTCALL(glBindFramebufferEXT(target, *fbo)); checkGLcall("glBindFramebuffer()"); @@ -6110,6 +6159,7 @@ void attach_depth_stencil_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, IWine IWineD3DSurface_PreLoad(depth_stencil); + glBindTexture(target, depth_stencil_impl->glDescription.textureName); glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(target, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE); @@ -6152,6 +6202,7 @@ void attach_surface_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, DWORD idx, IWineD3DSurface_PreLoad(surface); + glBindTexture(target, surface_impl->glDescription.textureName); glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glBindTexture(target, old_binding); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index d26940600f0..9f48da93b12 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -148,7 +148,7 @@ static const struct { static int numAdapters = 0; static struct WineD3DAdapter Adapters[1]; -static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat); +static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat, WINED3DSURFTYPE SurfaceType); static const struct fragment_pipeline *select_fragment_implementation(UINT Adapter, WINED3DDEVTYPE DeviceType); static const shader_backend_t *select_shader_backend(UINT Adapter, WINED3DDEVTYPE DeviceType); static const struct blit_shader *select_blit_implementation(UINT Adapter, WINED3DDEVTYPE DeviceType); @@ -1954,7 +1954,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter } /* Use CheckDeviceFormat to see if the BackBufferFormat is usable with the given DisplayFormat */ - hr = IWineD3DImpl_CheckDeviceFormat(iface, Adapter, DeviceType, DisplayFormat, WINED3DUSAGE_RENDERTARGET, WINED3DRTYPE_SURFACE, BackBufferFormat); + hr = IWineD3DImpl_CheckDeviceFormat(iface, Adapter, DeviceType, DisplayFormat, WINED3DUSAGE_RENDERTARGET, WINED3DRTYPE_SURFACE, BackBufferFormat, SURFACE_OPENGL); if(FAILED(hr)) TRACE_(d3d_caps)("Unsupported display/backbuffer format combination %s/%s\n", debug_d3dformat(DisplayFormat), debug_d3dformat(BackBufferFormat)); @@ -2421,9 +2421,37 @@ static BOOL CheckTextureCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WINE return FALSE; } -static BOOL CheckSurfaceCapability(UINT Adapter, WINED3DFORMAT AdapterFormat, WINED3DDEVTYPE DeviceType, WINED3DFORMAT CheckFormat) { +static BOOL CheckSurfaceCapability(UINT Adapter, WINED3DFORMAT AdapterFormat, WINED3DDEVTYPE DeviceType, WINED3DFORMAT CheckFormat, WINED3DSURFTYPE SurfaceType) { const struct blit_shader *blitter; + if(SurfaceType == SURFACE_GDI) { + switch(CheckFormat) { + case WINED3DFMT_R8G8B8: + case WINED3DFMT_A8R8G8B8: + case WINED3DFMT_X8R8G8B8: + case WINED3DFMT_R5G6B5: + case WINED3DFMT_X1R5G5B5: + case WINED3DFMT_A1R5G5B5: + case WINED3DFMT_A4R4G4B4: + case WINED3DFMT_R3G3B2: + case WINED3DFMT_A8: + case WINED3DFMT_A8R3G3B2: + case WINED3DFMT_X4R4G4B4: + case WINED3DFMT_A2B10G10R10: + case WINED3DFMT_A8B8G8R8: + case WINED3DFMT_X8B8G8R8: + case WINED3DFMT_G16R16: + case WINED3DFMT_A2R10G10B10: + case WINED3DFMT_A16B16G16R16: + case WINED3DFMT_P8: + TRACE_(d3d_caps)("[OK]\n"); + return TRUE; + default: + TRACE_(d3d_caps)("[FAILED] - not available on GDI surfaces\n"); + return FALSE; + } + } + /* All format that are supported for textures are supported for surfaces as well */ if(CheckTextureCapability(Adapter, DeviceType, CheckFormat)) return TRUE; /* All depth stencil formats are supported on surfaces */ @@ -2465,7 +2493,8 @@ static BOOL CheckVertexTextureCapability(UINT Adapter, WINED3DFORMAT CheckFormat } static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, - WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat) { + WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat, + WINED3DSURFTYPE SurfaceType) { IWineD3DImpl *This = (IWineD3DImpl *)iface; DWORD UsageCaps = 0; @@ -2483,6 +2512,12 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt } if(RType == WINED3DRTYPE_CUBETEXTURE) { + + if(SurfaceType != SURFACE_OPENGL) { + TRACE("[FAILED]\n"); + return WINED3DERR_NOTAVAILABLE; + } + /* Cubetexture allows: * - D3DUSAGE_AUTOGENMIPMAP * - D3DUSAGE_DEPTHSTENCIL @@ -2596,7 +2631,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt * - D3DUSAGE_RENDERTARGET */ - if(CheckSurfaceCapability(Adapter, AdapterFormat, DeviceType, CheckFormat)) { + if(CheckSurfaceCapability(Adapter, AdapterFormat, DeviceType, CheckFormat, SurfaceType)) { if(Usage & WINED3DUSAGE_DEPTHSTENCIL) { if(CheckDepthStencilCapability(Adapter, AdapterFormat, CheckFormat)) { UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL; @@ -2642,6 +2677,11 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt * - D3DUSAGE_QUERY_WRAPANDMIP */ + if(SurfaceType != SURFACE_OPENGL) { + TRACE("[FAILED]\n"); + return WINED3DERR_NOTAVAILABLE; + } + /* Check if the texture format is around */ if(CheckTextureCapability(Adapter, DeviceType, CheckFormat)) { if(Usage & WINED3DUSAGE_AUTOGENMIPMAP) { @@ -2764,6 +2804,11 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt * - D3DUSAGE_QUERY_WRAPANDMIP */ + if(SurfaceType != SURFACE_OPENGL) { + TRACE("[FAILED]\n"); + return WINED3DERR_NOTAVAILABLE; + } + /* Check volume texture and volume usage caps */ if(GL_SUPPORT(EXT_TEXTURE3D)) { if(CheckTextureCapability(Adapter, DeviceType, CheckFormat) == FALSE) { @@ -2896,7 +2941,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt /* For instance vertexbuffer/indexbuffer aren't supported yet because no Windows drivers seem to offer it */ TRACE_(d3d_caps)("Unhandled resource type D3DRTYPE_INDEXBUFFER / D3DRTYPE_VERTEXBUFFER\n"); return WINED3DERR_NOTAVAILABLE; - } + } /* This format is nothing special and it is supported perfectly. * However, ati and nvidia driver on windows do not mark this format as @@ -3882,7 +3927,7 @@ static void fixup_extensions(WineD3D_GL_Info *gl_info) { * This usually means that ARB_tex_npot is supported in hardware as long as the application is staying * within the limits enforced by the ARB_texture_rectangle extension. This however is not true for the * FX series, which instantly falls back to a slower software path as soon as ARB_tex_npot is used. - * We therefore completly remove ARB_tex_npot from the list of supported extensions. + * We therefore completely remove ARB_tex_npot from the list of supported extensions. * * Note that wine_normalized_texrect can't be used in this case because internally it uses ARB_tex_npot, * triggering the software fallback. There is not much we can do here apart from disabling the diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index 3be34d3e43b..068e0820f7f 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -268,12 +268,9 @@ static void drawStridedFast(IWineD3DDevice *iface,UINT numberOfVertices, GLenum #endif } else { - - /* Note first is now zero as we shuffled along earlier */ - TRACE("(%p) : glDrawArrays(%x, 0, %d)\n", This, glPrimitiveType, numberOfVertices); + TRACE("(%p) : glDrawArrays(%#x, %d, %d)\n", This, glPrimitiveType, startVertex, numberOfVertices); glDrawArrays(glPrimitiveType, startVertex, numberOfVertices); checkGLcall("glDrawArrays"); - } return; @@ -680,7 +677,7 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, WineDirect3DVertexStridedDa } /* Start drawing in GL */ - VTRACE(("glBegin(%x)\n", glPrimType)); + VTRACE(("glBegin(%x)\n", glPrimitiveType)); glBegin(glPrimitiveType); for (vx_index = 0; vx_index < numberOfVertices; ++vx_index) { @@ -711,11 +708,11 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, WineDirect3DVertexStridedDa glEnd(); } -void depth_blt(IWineD3DDevice *iface, GLuint texture) { +void depth_blt(IWineD3DDevice *iface, GLuint texture, GLsizei w, GLsizei h) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; GLint old_binding = 0; - glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); + glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_VIEWPORT_BIT); glDisable(GL_CULL_FACE); glEnable(GL_BLEND); @@ -726,6 +723,7 @@ void depth_blt(IWineD3DDevice *iface, GLuint texture) { glDepthFunc(GL_ALWAYS); glDepthMask(GL_TRUE); glBlendFunc(GL_ZERO, GL_ONE); + glViewport(0, 0, w, h); GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB)); glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding); @@ -928,20 +926,21 @@ void drawPrimitive(IWineD3DDevice *iface, } } + /* Signals other modules that a drawing is in progress and the stateblock finalized */ + This->isInDraw = TRUE; + + ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM); + if (This->stencilBufferTarget) { + /* Note that this depends on the ActivateContext call above to set + * This->render_offscreen properly */ DWORD location = This->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN; surface_load_ds_location(This->stencilBufferTarget, location); surface_modify_ds_location(This->stencilBufferTarget, location); } - /* Signals other modules that a drawing is in progress and the stateblock finalized */ - This->isInDraw = TRUE; - /* Ok, we will be updating the screen from here onwards so grab the lock */ - - ActivateContext(This, This->render_targets[0], CTXUSAGE_DRAWPRIM); ENTER_GL(); - { GLenum glPrimType; BOOL emulation = FALSE; diff --git a/dlls/wined3d/nvidia_texture_shader.c b/dlls/wined3d/nvidia_texture_shader.c index ca21ba0659d..9ebb17b1d05 100644 --- a/dlls/wined3d/nvidia_texture_shader.c +++ b/dlls/wined3d/nvidia_texture_shader.c @@ -673,7 +673,7 @@ static void nvrc_fragment_free(IWineD3DDevice *iface) {} */ static BOOL nvts_conv_supported(WINED3DFORMAT fmt) { - TRACE("Checking shader format support for format %s: [FAILED]", debug_d3dformat(fmt)); + TRACE("Checking shader format support for format %s: [FAILED]\n", debug_d3dformat(fmt)); return FALSE; } diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index d97df5af0d3..61119954c77 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -5034,269 +5034,269 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = { { STATE_TRANSFORM(WINED3DTS_VIEW), { STATE_TRANSFORM(WINED3DTS_VIEW), transform_view }, 0 }, { STATE_TRANSFORM(WINED3DTS_PROJECTION), { STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection}, 0 }, { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, - { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, + { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, 0 }, { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), transform_world }, 0 }, - { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), transform_world }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 3)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 4)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 5)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 6)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 7)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 8)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 9)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 10)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 11)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 12)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 13)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 14)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 15)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 16)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 17)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 18)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 19)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 20)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 21)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 22)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 23)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 24)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 25)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 26)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 27)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 28)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 29)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 30)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 31)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 32)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 33)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 34)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 35)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 36)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 37)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 38)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 39)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 40)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 41)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 42)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 43)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 44)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 45)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 46)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 47)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 48)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 49)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 50)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 51)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 52)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 53)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 54)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 55)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 56)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 57)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 58)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 59)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 60)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 61)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 62)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 63)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 64)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 65)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 66)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 67)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 68)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 69)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 70)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 71)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 72)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 73)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 74)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 75)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 76)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 77)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 78)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 79)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 80)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 81)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 82)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 83)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 84)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 85)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 86)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 87)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 88)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 89)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 90)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 91)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 92)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 93)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 94)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 95)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 96)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 97)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 98)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 99)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(100)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(101)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(102)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(103)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(104)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(105)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(106)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(107)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(108)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(109)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(110)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(111)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(112)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(113)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(114)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(115)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(116)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(117)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(118)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(119)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(120)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(121)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(122)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(123)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(124)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(125)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(126)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(127)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(128)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(129)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(130)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(131)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(132)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(133)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(134)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(135)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(136)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(137)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(138)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(139)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(140)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(141)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(142)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(143)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(144)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(145)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(146)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(147)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(148)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(149)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(150)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(151)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(152)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(153)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(154)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(155)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(156)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(157)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(158)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(159)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(160)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(161)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(162)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(163)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(164)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(165)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(166)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(167)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(168)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(169)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(170)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(171)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(172)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(173)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(174)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(175)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(176)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(177)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(178)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(179)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(180)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(181)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(182)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(183)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(184)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(185)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(186)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(187)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(188)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(189)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(190)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(191)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(192)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(193)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(194)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(195)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(196)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(197)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(198)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(199)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(200)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(201)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(202)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(203)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(204)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(205)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(206)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(207)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(208)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(209)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(210)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(211)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(212)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(213)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(214)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(215)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(216)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(217)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(218)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(219)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(220)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(221)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(222)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(223)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(224)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(225)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(226)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(227)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(228)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(229)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(230)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(231)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(232)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(233)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(234)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(235)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(236)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(237)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(238)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(239)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(240)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(241)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(242)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(243)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(244)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(245)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(246)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(247)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(248)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(249)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(250)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(251)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(252)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(253)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(254)), transform_worldex }, 0 }, + { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255)), transform_worldex }, 0 }, { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS),transform_texture }, 0 }, @@ -5557,7 +5557,7 @@ static void ffp_fragment_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_in static HRESULT ffp_fragment_alloc(IWineD3DDevice *iface) { return WINED3D_OK; } static void ffp_fragment_free(IWineD3DDevice *iface) {} static BOOL ffp_conv_supported(WINED3DFORMAT fmt) { - TRACE("Checking shader format support for format %s: [FAILED]", debug_d3dformat(fmt)); + TRACE("Checking shader format support for format %s: [FAILED]\n", debug_d3dformat(fmt)); return FALSE; } diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index e8ff6c1fb59..78268d8616b 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1037,6 +1037,12 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat DWORD d; } tmpfloat; unsigned int i; + IWineD3DSwapChain *swapchain; + IWineD3DSurface *backbuffer; + WINED3DSURFACE_DESC desc = {0}; + UINT width, height; + RECT scissorrect; + HRESULT hr; /* Note this may have a large overhead but it should only be executed once, in order to initialize the complete state of the device and @@ -1239,6 +1245,30 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat This->textures[i] = NULL; } + /* Set the default scissor rect values */ + desc.Width = &width; + desc.Height = &height; + + /* check the return values, because the GetBackBuffer call isn't valid for ddraw */ + hr = IWineD3DDevice_GetSwapChain(device, 0, &swapchain); + if( hr == WINED3D_OK && swapchain != NULL) { + hr = IWineD3DSwapChain_GetBackBuffer(swapchain, 0, WINED3DBACKBUFFER_TYPE_MONO, &backbuffer); + if( hr == WINED3D_OK && backbuffer != NULL) { + IWineD3DSurface_GetDesc(backbuffer, &desc); + IWineD3DSurface_Release(backbuffer); + + scissorrect.left = 0; + scissorrect.right = width; + scissorrect.top = 0; + scissorrect.bottom = height; + hr = IWineD3DDevice_SetScissorRect(device, &scissorrect); + if( hr != WINED3D_OK ) { + ERR("This should never happen, expect rendering issues!\n"); + } + } + IWineD3DSwapChain_Release(swapchain); + } + TRACE("-----------------------> Device defaults now set up...\n"); return WINED3D_OK; } diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index a988121d6ad..4e7626c9ea3 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -231,6 +231,9 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { /* This call just uploads data, the caller is responsible for activating the * right context and binding the correct texture. */ static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data) { + + if(This->heightscale != 1.0 && This->heightscale != 0.0) height *= This->heightscale; + if (This->resource.format == WINED3DFMT_DXT1 || This->resource.format == WINED3DFMT_DXT2 || This->resource.format == WINED3DFMT_DXT3 || This->resource.format == WINED3DFMT_DXT4 || This->resource.format == WINED3DFMT_DXT5 || @@ -293,6 +296,8 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, BOOL enable_client_storage = FALSE; BYTE *mem = NULL; + if(This->heightscale != 1.0 && This->heightscale != 0.0) height *= This->heightscale; + TRACE("(%p) : Creating surface (target %#x) level %d, d3d format %s, internal format %#x, width %d, height %d, gl format %#x, gl type=%#x\n", This, This->glDescription.target, This->glDescription.level, debug_d3dformat(This->resource.format), internal, width, height, format, type); @@ -1528,7 +1533,11 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ * in which the main render target uses p8. Some games like GTA Vice City use P8 for texturing which * conflicts with this. */ - if( !(GL_SUPPORT(EXT_PALETTED_TEXTURE) || (GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && primary_render_target_is_p8(device))) || colorkey_active || !use_texturing ) { + if( !(GL_SUPPORT(EXT_PALETTED_TEXTURE) || + (GL_SUPPORT(ARB_FRAGMENT_PROGRAM) && + device->render_targets && + This == (IWineD3DSurfaceImpl*)device->render_targets[0])) || + colorkey_active || !use_texturing ) { *format = GL_RGBA; *internal = GL_RGBA; *type = GL_UNSIGNED_BYTE; @@ -3359,7 +3368,6 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * WINEDDCOLORKEY oldBltCKey = Src->SrcBltCKey; RECT SourceRectangle; BOOL paletteOverride = FALSE; - GLenum buffer; TRACE("Blt from surface %p to rendertarget %p\n", Src, This); @@ -3429,39 +3437,22 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * /* Now load the surface */ IWineD3DSurface_PreLoad((IWineD3DSurface *) Src); - /* Activate the destination context, set it up for blitting */ ActivateContext(myDevice, (IWineD3DSurface *) This, CTXUSAGE_BLIT); - if(!dstSwapchain) { - TRACE("Drawing to offscreen buffer\n"); - buffer = myDevice->offscreenBuffer; - } else { - buffer = surface_get_gl_buffer((IWineD3DSurface *)This, (IWineD3DSwapChain *)dstSwapchain); - - /* Front buffer coordinates are screen coordinates, while OpenGL coordinates are - * window relative. Also beware of the origin difference(top left vs bottom left). - * Also beware that the front buffer's surface size is screen width x screen height, - * whereas the real gl drawable size is the size of the window. - */ - if(buffer == GL_FRONT) { - RECT windowsize; - POINT offset = {0,0}; - UINT h; - ClientToScreen(dstSwapchain->win_handle, &offset); - GetClientRect(dstSwapchain->win_handle, &windowsize); - h = windowsize.bottom - windowsize.top; - rect.x1 -= offset.x; rect.x2 -=offset.x; - rect.y1 -= offset.y; rect.y2 -=offset.y; - rect.y1 += This->currentDesc.Height - h; rect.y2 += This->currentDesc.Height - h; - } - TRACE("Drawing to %#x buffer\n", buffer); + if (dstSwapchain && (IWineD3DSurface *)This == dstSwapchain->frontBuffer) { + RECT windowsize; + POINT offset = {0,0}; + UINT h; + ClientToScreen(dstSwapchain->win_handle, &offset); + GetClientRect(dstSwapchain->win_handle, &windowsize); + h = windowsize.bottom - windowsize.top; + rect.x1 -= offset.x; rect.x2 -=offset.x; + rect.y1 -= offset.y; rect.y2 -=offset.y; + rect.y1 += This->currentDesc.Height - h; rect.y2 += This->currentDesc.Height - h; } ENTER_GL(); - glDrawBuffer(buffer); - checkGLcall("glDrawBuffer"); - myDevice->blitter->set_shader((IWineD3DDevice *) myDevice, Src->resource.format, Src->glDescription.target, Src->pow2Width, Src->pow2Height); @@ -3534,13 +3525,6 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * /* Leave the opengl state valid for blitting */ myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice); - /* The draw buffer should only need to be restored if we were drawing to the front buffer, and there is a back buffer. - * otherwise the context manager should choose between GL_BACK / offscreenDrawBuffer - */ - if(dstSwapchain && This == (IWineD3DSurfaceImpl *) dstSwapchain->frontBuffer && dstSwapchain->backBuffer) { - glDrawBuffer(GL_BACK); - checkGLcall("glDrawBuffer"); - } /* Restore the color key parameters */ Src->CKeyFlags = oldCKeyFlags; Src->SrcBltCKey = oldBltCKey; @@ -3560,10 +3544,6 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, RECT * * is outdated now */ IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INDRAWABLE, TRUE); - /* TODO: This should be moved to ModifyLocation() */ - if(!(dstSwapchain || wined3d_settings.offscreen_rendering_mode != ORM_FBO)) { - This->Flags |= SFLAG_INTEXTURE; - } return WINED3D_OK; } else { @@ -3807,10 +3787,6 @@ HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) { /* Re-upload the palette */ d3dfmt_p8_upload_palette(iface, convert); - - /* Without this some palette updates are missed. This at least happens on Nvidia drivers but - * it works fine using Mesa. */ - glFlush(); } else { if(!(This->Flags & SFLAG_INSYSMEM)) { TRACE("Palette changed with surface that does not have an up to date system memory copy\n"); @@ -4019,7 +3995,7 @@ void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) { attach_depth_stencil_fbo(device, GL_FRAMEBUFFER_EXT, iface, FALSE); /* Do the actual blit */ - depth_blt((IWineD3DDevice *)device, device->depth_blt_texture); + depth_blt((IWineD3DDevice *)device, device->depth_blt_texture, This->currentDesc.Width, This->currentDesc.Height); checkGLcall("depth_blt"); if (device->render_offscreen) { @@ -4041,7 +4017,7 @@ void surface_load_ds_location(IWineD3DSurface *iface, DWORD location) { GL_EXTCALL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)); checkGLcall("glBindFramebuffer()"); - depth_blt((IWineD3DDevice *)device, This->glDescription.textureName); + depth_blt((IWineD3DDevice *)device, This->glDescription.textureName, This->currentDesc.Width, This->currentDesc.Height); checkGLcall("depth_blt"); if (device->render_offscreen) { diff --git a/dlls/wined3d/swapchain_base.c b/dlls/wined3d/swapchain_base.c index 6b912340d04..75adf7720e1 100644 --- a/dlls/wined3d/swapchain_base.c +++ b/dlls/wined3d/swapchain_base.c @@ -102,6 +102,15 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface, return WINED3DERR_INVALIDCALL; } + /* Return invalid if there is no backbufferarray, otherwise it will crash when ddraw is + * used (there This->backBuffer is allways NULL). We need this because this function have + * to be called from IWineD3DStateBlockImpl_InitStartupStateBlock to get the default + * scissorrect dimensions. */ + if( !This->backBuffer ) { + *ppBackBuffer = NULL; + return WINED3DERR_INVALIDCALL; + } + *ppBackBuffer = This->backBuffer[iBackBuffer]; TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, iBackBuffer, Type, *ppBackBuffer); diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 31a1944cc32..57e2b37778a 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -44,7 +44,7 @@ static const StaticPixelFormatDesc formats[] = { /* FourCC formats, kept here to have WINED3DFMT_R8G8B8(=20) at position 20 */ {WINED3DFMT_UYVY ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, {WINED3DFMT_YUY2 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, - {WINED3DFMT_YV12 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,0 ,0 ,TRUE }, + {WINED3DFMT_YV12 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, {WINED3DFMT_DXT1 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, {WINED3DFMT_DXT2 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, {WINED3DFMT_DXT3 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,0 ,0 ,TRUE }, @@ -146,6 +146,8 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { ,WINED3DFMT_FLAG_FILTERING }, {WINED3DFMT_YUY2 ,GL_RGB ,GL_RGB , 0, GL_YCBCR_422_APPLE ,UNSIGNED_SHORT_8_8_REV_APPLE ,WINED3DFMT_FLAG_FILTERING }, + {WINED3DFMT_YV12 ,GL_ALPHA ,GL_ALPHA , 0, GL_ALPHA ,GL_UNSIGNED_BYTE + ,WINED3DFMT_FLAG_FILTERING }, {WINED3DFMT_DXT1 ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE ,WINED3DFMT_FLAG_FILTERING }, {WINED3DFMT_DXT2 ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE @@ -273,6 +275,10 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { ,0 }, /* Vendor-specific formats */ {WINED3DFMT_ATI2N ,0 ,0 , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE + ,0 }, + {WINED3DFMT_NVHU ,0 ,0 , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE + ,0 }, + {WINED3DFMT_NVHS ,0 ,0 , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE ,0 } }; @@ -314,6 +320,7 @@ BOOL initPixelFormats(WineD3D_GL_Info *gl_info) gl_info->gl_formats[dst].glType = gl_formats_template[src].glType; gl_info->gl_formats[dst].conversion_group= WINED3DFMT_UNKNOWN; gl_info->gl_formats[dst].Flags = gl_formats_template[src].Flags; + gl_info->gl_formats[dst].heightscale = 1.0; if(wined3d_settings.offscreen_rendering_mode == ORM_FBO && gl_formats_template[src].rtInternal != 0) { @@ -430,6 +437,11 @@ BOOL initPixelFormats(WineD3D_GL_Info *gl_info) gl_info->gl_formats[dst].glType = GL_UNSIGNED_BYTE; gl_info->gl_formats[dst].conversion_group = WINED3DFMT_UYVY; } + + dst = getFmtIdx(WINED3DFMT_YV12); + gl_info->gl_formats[dst].heightscale = 1.5; + gl_info->gl_formats[dst].conversion_group = WINED3DFMT_YV12; + return TRUE; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index f4b81f7b27e..f009bcd0d68 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -703,7 +703,6 @@ typedef struct WineD3D_PixelFormat } WineD3D_PixelFormat; /* The adapter structure */ -typedef struct GLPixelFormatDesc GLPixelFormatDesc; struct WineD3DAdapter { UINT num; @@ -786,7 +785,8 @@ struct ffp_settings { FOG_EXP, FOG_EXP2 } fog; - unsigned char sRGB_write; + /* Use an int instead of a char to get dword alignment */ + unsigned int sRGB_write; }; struct ffp_desc @@ -1312,6 +1312,7 @@ struct IWineD3DSurfaceImpl UINT pow2Width; UINT pow2Height; + float heightscale; /* A method to retrieve the drawable size. Not in the Vtable to make it changeable */ void (*get_drawable_size)(IWineD3DSurfaceImpl *This, UINT *width, UINT *height); @@ -2516,6 +2517,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED void bind_fbo(IWineD3DDevice *iface, GLenum target, GLuint *fbo); void attach_depth_stencil_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer); void attach_surface_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, DWORD idx, IWineD3DSurface *surface); -void depth_blt(IWineD3DDevice *iface, GLuint texture); +void depth_blt(IWineD3DDevice *iface, GLuint texture, GLsizei w, GLsizei h); #endif diff --git a/dlls/winenas.drv/audio.c b/dlls/winenas.drv/audio.c index 3efe3b4c3f5..51092a83726 100644 --- a/dlls/winenas.drv/audio.c +++ b/dlls/winenas.drv/audio.c @@ -867,7 +867,7 @@ static DWORD CALLBACK wodPlayer(LPVOID pmt) nas_add_buffer(wwo); wodPlayer_PlayPtrNext(wwo); } - + return 0; } } diff --git a/dlls/wineps.drv/rsrc.rc b/dlls/wineps.drv/rsrc.rc index d12b185f566..47df0469146 100644 --- a/dlls/wineps.drv/rsrc.rc +++ b/dlls/wineps.drv/rsrc.rc @@ -51,3 +51,4 @@ #include "wps_Sk.rc" #include "wps_Sv.rc" #include "wps_Tr.rc" +#include "wps_Zh.rc" diff --git a/dlls/wineps.drv/wps_Zh.rc b/dlls/wineps.drv/wps_Zh.rc new file mode 100644 index 00000000000..d711bc0d8d6 --- /dev/null +++ b/dlls/wineps.drv/wps_Zh.rc @@ -0,0 +1,64 @@ +/* + * wineps (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +PAPER DIALOG LOADONCALL MOVEABLE DISCARDABLE 5, 43, 227, 215 +STYLE WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE +CAPTION "纸张" +FONT 9, "MS Song" +{ + LTEXT "纸张大小(&Z):", -1, 10, 6, 100, 8 + LISTBOX IDD_PAPERS, 10, 15, 200, 45, LBS_STANDARD | LBS_HASSTRINGS | + WS_TABSTOP + GROUPBOX "方向", -1, 10, 80, 200, 50 + CONTROL "纵向(&P)", IDD_ORIENT_PORTRAIT, "Button", BS_AUTORADIOBUTTON | + WS_TABSTOP, 20, 90, 60, 10 + CONTROL "横向(&L)", IDD_ORIENT_LANDSCAPE, "Button", BS_AUTORADIOBUTTON, + 20, 110, 60, 10 + LTEXT "双面:", IDD_DUPLEX_NAME, 10, 140, 100, 8 + COMBOBOX IDD_DUPLEX, 10, 151, 200, 20, CBS_DROPDOWNLIST | CBS_HASSTRINGS | + WS_TABSTOP +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +PAPER DIALOG LOADONCALL MOVEABLE DISCARDABLE 5, 43, 227, 215 +STYLE WS_POPUP | WS_CAPTION | WS_CLIPSIBLINGS | WS_VISIBLE +CAPTION "紙張" +FONT 8, "PMingLiu" +{ + LTEXT "紙張大小(&Z):", -1, 10, 6, 100, 8 + LISTBOX IDD_PAPERS, 10, 15, 200, 45, LBS_STANDARD | LBS_HASSTRINGS | + WS_TABSTOP + GROUPBOX "方向", -1, 10, 80, 200, 50 + CONTROL "縱向(&P)", IDD_ORIENT_PORTRAIT, "Button", BS_AUTORADIOBUTTON | + WS_TABSTOP, 20, 90, 60, 10 + CONTROL "橫向(&L)", IDD_ORIENT_LANDSCAPE, "Button", BS_AUTORADIOBUTTON, + 20, 110, 60, 10 + LTEXT "雙面:", IDD_DUPLEX_NAME, 10, 140, 100, 8 + COMBOBOX IDD_DUPLEX, 10, 151, 200, 20, CBS_DROPDOWNLIST | CBS_HASSTRINGS | + WS_TABSTOP +} + +#pragma code_page(default) diff --git a/dlls/winhttp/main.c b/dlls/winhttp/main.c index 2d3ec2f8753..4a4aea8f65a 100644 --- a/dlls/winhttp/main.c +++ b/dlls/winhttp/main.c @@ -27,6 +27,8 @@ #include "wine/debug.h" +#include "winhttp_private.h" + WINE_DEFAULT_DEBUG_CHANNEL(winhttp); /****************************************************************** @@ -83,27 +85,8 @@ HRESULT WINAPI DllUnregisterServer(void) return S_OK; } -/*********************************************************************** - * WinHttpQueryOption (winhttp.@) - */ -BOOL WINAPI WinHttpQueryOption (HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufferLength) -{ - FIXME("(%d): stub\n", dwOption); - - SetLastError(ERROR_NOT_SUPPORTED); - return FALSE; -} - -/*********************************************************************** - * WinHttpSetOption (winhttp.@) - */ -BOOL WINAPI WinHttpSetOption (HINTERNET hInternet, DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength) -{ - FIXME("stub\n"); - - SetLastError(ERROR_NOT_SUPPORTED); - return FALSE; -} +#define SCHEME_HTTP 3 +#define SCHEME_HTTPS 4 BOOL WINAPI InternetCrackUrlW( LPCWSTR, DWORD, DWORD, LPURL_COMPONENTSW ); BOOL WINAPI InternetCreateUrlW( LPURL_COMPONENTS, DWORD, LPWSTR, LPDWORD ); @@ -113,8 +96,22 @@ BOOL WINAPI InternetCreateUrlW( LPURL_COMPONENTS, DWORD, LPWSTR, LPDWORD ); */ BOOL WINAPI WinHttpCrackUrl( LPCWSTR url, DWORD len, DWORD flags, LPURL_COMPONENTSW components ) { + BOOL ret; + TRACE("%s, %d, %x, %p\n", debugstr_w(url), len, flags, components); - return InternetCrackUrlW( url, len, flags, components ); + + if ((ret = InternetCrackUrlW( url, len, flags, components ))) + { + /* fix up an incompatibility between wininet and winhttp */ + if (components->nScheme == SCHEME_HTTP) components->nScheme = INTERNET_SCHEME_HTTP; + else if (components->nScheme == SCHEME_HTTPS) components->nScheme = INTERNET_SCHEME_HTTPS; + else + { + set_last_error( ERROR_WINHTTP_UNRECOGNIZED_SCHEME ); + return FALSE; + } + } + return ret; } /*********************************************************************** diff --git a/dlls/winhttp/net.c b/dlls/winhttp/net.c index d367723355b..498e5ace095 100644 --- a/dlls/winhttp/net.c +++ b/dlls/winhttp/net.c @@ -277,10 +277,8 @@ BOOL netconn_close( netconn_t *conn ) pSSL_shutdown( conn->ssl_conn ); pSSL_free( conn->ssl_conn ); - pSSL_CTX_free( conn->ssl_ctx ); conn->ssl_conn = NULL; - conn->ssl_ctx = NULL; conn->secure = FALSE; } #endif @@ -524,9 +522,10 @@ BOOL netconn_get_next_line( netconn_t *conn, char *buffer, DWORD *buflen ) { if (poll( &pfd, 1, DEFAULT_RECEIVE_TIMEOUT * 1000 ) > 0) { - if (recv( conn->socket, &buffer[recvd], 1, 0 ) <= 0) + int res; + if ((res = recv( conn->socket, &buffer[recvd], 1, 0 )) <= 0) { - set_last_error( sock_get_error( errno ) ); + if (res == -1) set_last_error( sock_get_error( errno ) ); break; } if (buffer[recvd] == '\n') diff --git a/dlls/winhttp/request.c b/dlls/winhttp/request.c index b0b81f0dc9d..72f9eb5bf20 100644 --- a/dlls/winhttp/request.c +++ b/dlls/winhttp/request.c @@ -458,17 +458,25 @@ BOOL WINAPI WinHttpAddRequestHeaders( HINTERNET hrequest, LPCWSTR headers, DWORD return ret; } -static WCHAR *build_request_string( request_t *request, LPCWSTR verb, LPCWSTR path, LPCWSTR version ) +static WCHAR *build_request_string( request_t *request ) { static const WCHAR space[] = {' ',0}; static const WCHAR crlf[] = {'\r','\n',0}; static const WCHAR colon[] = {':',' ',0}; static const WCHAR twocrlf[] = {'\r','\n','\r','\n',0}; + static const WCHAR get[] = {'G','E','T',0}; + static const WCHAR slash[] = {'/',0}; + static const WCHAR http1_1[] = {'H','T','T','P','/','1','.','1',0}; WCHAR *ret; const WCHAR **headers, **p; + const WCHAR *verb = get, *path = slash, *version = http1_1; unsigned int len, i = 0, j; + if (request->verb && request->verb[0]) verb = request->verb; + if (request->path && request->path[0]) path = request->path; + if (request->version && request->version[0]) version = request->version; + /* allocate space for an array of all the string pointers to be added */ len = request->num_headers * 4 + 7; if (!(headers = heap_alloc( len * sizeof(LPCWSTR) ))) return NULL; @@ -518,7 +526,7 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID header_t *header = NULL; BOOL request_only, ret = FALSE; int requested_index, header_index = -1; - DWORD attr; + DWORD attr, len; request_only = level & WINHTTP_QUERY_FLAG_REQUEST_HEADERS; requested_index = index ? *index : 0; @@ -531,19 +539,54 @@ static BOOL query_headers( request_t *request, DWORD level, LPCWSTR name, LPVOID header_index = get_header_index( request, name, requested_index, request_only ); break; } + case WINHTTP_QUERY_RAW_HEADERS: + { + WCHAR *headers, *p, *q; + + if (request_only) + headers = build_request_string( request ); + else + headers = request->raw_headers; + + if (!(p = headers)) return FALSE; + for (len = 0; *p; p++) if (*p != '\r') len++; + + if ((len + 1) * sizeof(WCHAR) > *buflen || !buffer) + { + len++; + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + } + else if (buffer) + { + for (p = headers, q = (WCHAR *)buffer; *p; p++, q++) + { + if (*p != '\r') *q = *p; + else + { + *q = 0; + p++; /* skip '\n' */ + } + } + *q = 0; + TRACE("returning data: %s\n", debugstr_wn((WCHAR *)buffer, len)); + ret = TRUE; + } + *buflen = len * sizeof(WCHAR); + if (request_only) heap_free( headers ); + return ret; + } case WINHTTP_QUERY_RAW_HEADERS_CRLF: { WCHAR *headers; - DWORD len; if (request_only) - headers = build_request_string( request, request->verb, request->path, request->version ); + headers = build_request_string( request ); else headers = request->raw_headers; if (!headers) return FALSE; len = strlenW( headers ) * sizeof(WCHAR); - if (len + sizeof(WCHAR) > *buflen) + if (len + sizeof(WCHAR) > *buflen || !buffer) { len += sizeof(WCHAR); set_last_error( ERROR_INSUFFICIENT_BUFFER ); @@ -666,14 +709,18 @@ static BOOL open_connection( request_t *request ) WCHAR *addressW; if (netconn_connected( &request->netconn )) return TRUE; - connect = request->connect; - if (!netconn_resolve( connect->servername, connect->serverport, &connect->sockaddr )) return FALSE; + send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, connect->servername, strlenW(connect->servername) + 1 ); + + if (!netconn_resolve( connect->servername, connect->serverport, &connect->sockaddr )) return FALSE; inet_ntop( connect->sockaddr.sin_family, &connect->sockaddr.sin_addr, address, sizeof(address) ); - TRACE("connecting to %s:%u\n", address, ntohs(connect->sockaddr.sin_port)); addressW = strdupAW( address ); + send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, addressW, strlenW(addressW) + 1 ); + + TRACE("connecting to %s:%u\n", address, ntohs(connect->sockaddr.sin_port)); + send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, addressW, 0 ); if (!netconn_create( &request->netconn, connect->sockaddr.sin_family, SOCK_STREAM, 0 )) @@ -694,7 +741,7 @@ static BOOL open_connection( request_t *request ) return FALSE; } - send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, addressW, 0 ); + send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, addressW, strlenW(addressW) + 1 ); heap_free( addressW ); return TRUE; @@ -709,12 +756,32 @@ void close_connection( request_t *request ) send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0, 0 ); } +static BOOL add_host_header( request_t *request, WCHAR *hostname, INTERNET_PORT port, DWORD modifier ) +{ + BOOL ret; + DWORD len; + WCHAR *host; + static const WCHAR fmt[] = {'%','s',':','%','u',0}; + + if (port == INTERNET_DEFAULT_HTTP_PORT || port == INTERNET_DEFAULT_HTTPS_PORT) + { + return process_header( request, attr_host, hostname, modifier, TRUE ); + } + len = strlenW( hostname ) + 7; /* sizeof(":65335") */ + if (!(host = heap_alloc( len * sizeof(WCHAR) ))) return FALSE; + sprintfW( host, fmt, hostname, port ); + ret = process_header( request, attr_host, host, modifier, TRUE ); + heap_free( host ); + return ret; +} + static BOOL send_request( request_t *request, LPCWSTR headers, DWORD headers_len, LPVOID optional, DWORD optional_len, DWORD total_len, DWORD_PTR context ) { static const WCHAR keep_alive[] = {'K','e','e','p','-','A','l','i','v','e',0}; static const WCHAR no_cache[] = {'n','o','-','c','a','c','h','e',0}; static const WCHAR length_fmt[] = {'%','l','d',0}; + static const WCHAR post[] = {'P','O','S','T',0}; BOOL ret = FALSE; connect_t *connect = request->connect; @@ -728,15 +795,15 @@ static BOOL send_request( request_t *request, LPCWSTR headers, DWORD headers_len process_header( request, attr_user_agent, session->agent, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE ); if (connect->hostname) - process_header( request, attr_host, connect->hostname, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE ); + add_host_header( request, connect->hostname, connect->hostport, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW ); - if (optional_len) + if (total_len || (request->verb && !strcmpW( request->verb, post ))) { WCHAR length[21]; /* decimal long int + null */ - sprintfW( length, length_fmt, optional_len ); + sprintfW( length, length_fmt, total_len ); process_header( request, attr_content_length, length, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE ); } - if (!(request->hdr.flags & WINHTTP_DISABLE_KEEP_ALIVE)) + if (!(request->hdr.disable_flags & WINHTTP_DISABLE_KEEP_ALIVE)) { process_header( request, attr_connection, keep_alive, WINHTTP_ADDREQ_FLAG_ADD_IF_NEW, TRUE ); } @@ -752,7 +819,7 @@ static BOOL send_request( request_t *request, LPCWSTR headers, DWORD headers_len } if (!(ret = open_connection( request ))) goto end; - if (!(req = build_request_string( request, request->verb, request->path, request->version ))) goto end; + if (!(req = build_request_string( request ))) goto end; if (!(req_ascii = strdupWA( req ))) goto end; TRACE("full request: %s\n", debugstr_a(req_ascii)); @@ -924,6 +991,108 @@ end: return TRUE; } +static BOOL handle_redirect( request_t *request ) +{ + BOOL ret = FALSE; + DWORD size, len; + URL_COMPONENTS uc; + connect_t *connect = request->connect; + INTERNET_PORT port; + WCHAR *hostname = NULL, *location = NULL; + + size = 0; + query_headers( request, WINHTTP_QUERY_LOCATION, NULL, NULL, &size, NULL ); + if (!(location = heap_alloc( size ))) return FALSE; + if (!query_headers( request, WINHTTP_QUERY_LOCATION, NULL, location, &size, NULL )) goto end; + + send_callback( &request->hdr, WINHTTP_CALLBACK_STATUS_REDIRECT, location, size / sizeof(WCHAR) + 1 ); + + memset( &uc, 0, sizeof(uc) ); + uc.dwStructSize = sizeof(uc); + uc.dwSchemeLength = uc.dwHostNameLength = uc.dwUrlPathLength = uc.dwExtraInfoLength = ~0UL; + + if (!(ret = WinHttpCrackUrl( location, size / sizeof(WCHAR), 0, &uc ))) goto end; + + if (uc.nScheme == INTERNET_SCHEME_HTTP && request->hdr.flags & WINHTTP_FLAG_SECURE) + { + TRACE("redirect from secure page to non-secure page\n"); + request->hdr.flags &= ~WINHTTP_FLAG_SECURE; + } + else if (uc.nScheme == INTERNET_SCHEME_HTTPS && !(request->hdr.flags & WINHTTP_FLAG_SECURE)) + { + TRACE("redirect from non-secure page to secure page\n"); + request->hdr.flags |= WINHTTP_FLAG_SECURE; + } + + len = uc.dwHostNameLength; + if (!(hostname = heap_alloc( (len + 1) * sizeof(WCHAR) ))) goto end; + memcpy( hostname, uc.lpszHostName, len * sizeof(WCHAR) ); + hostname[len] = 0; + + port = uc.nPort ? uc.nPort : (uc.nScheme == INTERNET_SCHEME_HTTPS ? 443 : 80); + if (strcmpiW( connect->servername, hostname ) || connect->serverport != port) + { + heap_free( connect->servername ); + connect->servername = hostname; + connect->serverport = connect->hostport = port; + + netconn_close( &request->netconn ); + if (!(ret = netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE ))) goto end; + } + if (!(ret = add_host_header( request, hostname, port, WINHTTP_ADDREQ_FLAG_REPLACE ))) goto end; + if (!(ret = open_connection( request ))) goto end; + + heap_free( request->path ); + request->path = NULL; + if (uc.lpszUrlPath) + { + len = uc.dwUrlPathLength + uc.dwExtraInfoLength; + if (!(request->path = heap_alloc( (len + 1) * sizeof(WCHAR) ))) goto end; + strcpyW( request->path, uc.lpszUrlPath ); + } + + ret = TRUE; + +end: + if (!ret) heap_free( hostname ); + heap_free( location ); + return ret; +} + +static BOOL read_data( request_t *request, void *buffer, DWORD size, DWORD *read, BOOL async ) +{ + DWORD to_read; + int bytes_read; + + to_read = min( size, request->content_length - request->content_read ); + if (!netconn_recv( &request->netconn, buffer, to_read, async ? 0 : MSG_WAITALL, &bytes_read )) + { + if (bytes_read != to_read) + { + ERR("not all data received %d/%d\n", bytes_read, to_read); + } + /* always return success, even if the network layer returns an error */ + *read = 0; + return TRUE; + } + request->content_read += bytes_read; + *read = bytes_read; + return TRUE; +} + +/* read any content returned by the server so that the connection can be reused */ +static void drain_content( request_t *request ) +{ + DWORD bytes_read; + char buffer[2048]; + + if (request->content_length == ~0UL) return; + for (;;) + { + if (!read_data( request, buffer, sizeof(buffer), &bytes_read, FALSE ) || !bytes_read) return; + } +} + /*********************************************************************** * WinHttpReceiveResponse (winhttp.@) */ @@ -931,7 +1100,7 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved ) { BOOL ret = TRUE; request_t *request; - DWORD size, query; + DWORD size, query, status; TRACE("%p, %p\n", hrequest, reserved); @@ -947,12 +1116,28 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved ) return FALSE; } - ret = receive_response( request, TRUE ); + for (;;) + { + if (!(ret = receive_response( request, TRUE ))) break; + + size = sizeof(DWORD); + query = WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER; + if (!(ret = query_headers( request, query, NULL, &status, &size, NULL ))) break; - size = sizeof(DWORD); - query = WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER; - if (!query_headers( request, query, NULL, &request->content_length, &size, NULL )) - request->content_length = ~0UL; + size = sizeof(DWORD); + query = WINHTTP_QUERY_CONTENT_LENGTH | WINHTTP_QUERY_FLAG_NUMBER; + if (!query_headers( request, query, NULL, &request->content_length, &size, NULL )) + request->content_length = ~0UL; + + if (status == 200) break; + if (status == 301 || status == 302) + { + if (request->hdr.disable_flags & WINHTTP_DISABLE_REDIRECTS) break; + drain_content( request ); + if (!(ret = handle_redirect( request ))) break; + } + ret = send_request( request, NULL, 0, NULL, 0, 0, 0 ); + } release_object( &request->hdr ); return ret; @@ -964,6 +1149,7 @@ BOOL WINAPI WinHttpReceiveResponse( HINTERNET hrequest, LPVOID reserved ) BOOL WINAPI WinHttpQueryDataAvailable( HINTERNET hrequest, LPDWORD available ) { BOOL ret; + DWORD num_bytes; request_t *request; TRACE("%p, %p\n", hrequest, available); @@ -980,33 +1166,13 @@ BOOL WINAPI WinHttpQueryDataAvailable( HINTERNET hrequest, LPDWORD available ) return FALSE; } - ret = netconn_query_data_available( &request->netconn, available ); + ret = netconn_query_data_available( &request->netconn, &num_bytes ); + if (ret && available) *available = num_bytes; release_object( &request->hdr ); return ret; } -static BOOL read_data( request_t *request, void *buffer, DWORD size, DWORD *read, BOOL async ) -{ - DWORD to_read; - int bytes_read; - - to_read = min( size, request->content_length - request->content_read ); - if (!netconn_recv( &request->netconn, buffer, to_read, async ? 0 : MSG_WAITALL, &bytes_read )) - { - if (bytes_read != to_read) - { - ERR("not all data received %d/%d\n", bytes_read, to_read); - } - /* always return success, even if the network layer returns an error */ - *read = 0; - return TRUE; - } - request->content_read += bytes_read; - *read = bytes_read; - return TRUE; -} - static DWORD get_chunk_size( const char *buffer ) { const char *p; @@ -1091,7 +1257,7 @@ BOOL WINAPI WinHttpReadData( HINTERNET hrequest, LPVOID buffer, DWORD to_read, L BOOL ret; request_t *request; WCHAR encoding[20]; - DWORD buflen = sizeof(encoding); + DWORD num_bytes, buflen = sizeof(encoding); TRACE("%p, %p, %d, %p\n", hrequest, buffer, to_read, read); @@ -1110,11 +1276,12 @@ BOOL WINAPI WinHttpReadData( HINTERNET hrequest, LPVOID buffer, DWORD to_read, L if (query_headers( request, WINHTTP_QUERY_TRANSFER_ENCODING, NULL, encoding, &buflen, NULL ) && !strcmpiW( encoding, chunked )) { - ret = read_data_chunked( request, buffer, to_read, read, request->hdr.flags & WINHTTP_FLAG_ASYNC ); + ret = read_data_chunked( request, buffer, to_read, &num_bytes, request->hdr.flags & WINHTTP_FLAG_ASYNC ); } else - ret = read_data( request, buffer, to_read, read, request->hdr.flags & WINHTTP_FLAG_ASYNC ); + ret = read_data( request, buffer, to_read, &num_bytes, request->hdr.flags & WINHTTP_FLAG_ASYNC ); + if (ret && read) *read = num_bytes; release_object( &request->hdr ); return ret; } diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 9b66dccaef3..8725f7e7688 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -38,7 +38,7 @@ void set_last_error( DWORD error ) void send_callback( object_header_t *hdr, DWORD status, LPVOID info, DWORD buflen ) { - TRACE("%p, %u, %p, %u\n", hdr, status, info, buflen); + TRACE("%p, 0x%08x, %p, %u\n", hdr, status, info, buflen); if (hdr->notify_mask & status) hdr->callback( hdr->handle, hdr->context, status, info, buflen ); } @@ -69,11 +69,36 @@ static void session_destroy( object_header_t *hdr ) heap_free( session ); } +static BOOL session_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) +{ + switch (option) + { + case WINHTTP_OPTION_PROXY: + { + WINHTTP_PROXY_INFO *pi = buffer; + + FIXME("%u %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass)); + return TRUE; + } + case WINHTTP_OPTION_REDIRECT_POLICY: + { + DWORD policy = *(DWORD *)buffer; + + TRACE("0x%x\n", policy); + hdr->redirect_policy = policy; + return TRUE; + } + default: + FIXME("unimplemented option %u\n", option); + return TRUE; + } +} + static const object_vtbl_t session_vtbl = { session_destroy, NULL, - NULL + session_set_option }; /*********************************************************************** @@ -170,6 +195,7 @@ HINTERNET WINAPI WinHttpConnect( HINTERNET hsession, LPCWSTR server, INTERNET_PO connect->hdr.flags = session->hdr.flags; connect->hdr.callback = session->hdr.callback; connect->hdr.notify_mask = session->hdr.notify_mask; + connect->hdr.context = session->hdr.context; addref_object( &session->hdr ); connect->session = session; @@ -219,11 +245,71 @@ static void request_destroy( object_header_t *hdr ) heap_free( request ); } +static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) +{ + switch (option) + { + case WINHTTP_OPTION_SECURITY_FLAGS: + { + DWORD flags = 0; + + if (hdr->flags & WINHTTP_FLAG_SECURE) flags |= SECURITY_FLAG_SECURE; + *(DWORD *)buffer = flags; + *buflen = sizeof(DWORD); + return TRUE; + } + default: + FIXME("unimplemented option %u\n", option); + return FALSE; + } +} + +static BOOL request_set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) +{ + switch (option) + { + case WINHTTP_OPTION_PROXY: + { + WINHTTP_PROXY_INFO *pi = buffer; + + FIXME("%u %s %s\n", pi->dwAccessType, debugstr_w(pi->lpszProxy), debugstr_w(pi->lpszProxyBypass)); + return TRUE; + } + case WINHTTP_OPTION_DISABLE_FEATURE: + { + DWORD disable = *(DWORD *)buffer; + + TRACE("0x%x\n", disable); + hdr->disable_flags &= disable; + return TRUE; + } + case WINHTTP_OPTION_AUTOLOGON_POLICY: + { + DWORD policy = *(DWORD *)buffer; + + TRACE("0x%x\n", policy); + hdr->logon_policy = policy; + return TRUE; + } + case WINHTTP_OPTION_REDIRECT_POLICY: + { + DWORD policy = *(DWORD *)buffer; + + TRACE("0x%x\n", policy); + hdr->redirect_policy = policy; + return TRUE; + } + default: + FIXME("unimplemented option %u\n", option); + return TRUE; + } +} + static const object_vtbl_t request_vtbl = { request_destroy, - NULL, - NULL + request_query_option, + request_set_option }; /*********************************************************************** @@ -232,10 +318,6 @@ static const object_vtbl_t request_vtbl = HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR object, LPCWSTR version, LPCWSTR referrer, LPCWSTR *types, DWORD flags ) { - static const WCHAR get[] = {'G','E','T',0}; - static const WCHAR slash[] = {'/',0}; - static const WCHAR http1_1[] = {'H','T','T','P','/','1','.','1',0}; - request_t *request; connect_t *connect; HINTERNET hrequest = NULL; @@ -265,6 +347,7 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o request->hdr.flags = flags; request->hdr.callback = connect->hdr.callback; request->hdr.notify_mask = connect->hdr.notify_mask; + request->hdr.context = connect->hdr.context; addref_object( &connect->hdr ); request->connect = connect; @@ -272,13 +355,9 @@ HINTERNET WINAPI WinHttpOpenRequest( HINTERNET hconnect, LPCWSTR verb, LPCWSTR o if (!netconn_init( &request->netconn, request->hdr.flags & WINHTTP_FLAG_SECURE )) goto end; - if (!verb || !*verb) verb = get; - if (!object || !*object) object = slash; - if (!version || !*version) version = http1_1; - - if (!(request->verb = strdupW( verb ))) goto end; - if (!(request->path = strdupW( object ))) goto end; - if (!(request->version = strdupW( version ))) goto end; + if (verb && !(request->verb = strdupW( verb ))) goto end; + if (object && !(request->path = strdupW( object ))) goto end; + if (version && !(request->version = strdupW( version ))) goto end; if (!(hrequest = alloc_handle( &request->hdr ))) goto end; request->hdr.handle = hrequest; @@ -311,6 +390,91 @@ BOOL WINAPI WinHttpCloseHandle( HINTERNET handle ) return TRUE; } +static BOOL query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) +{ + BOOL ret = FALSE; + + switch (option) + { + case WINHTTP_OPTION_CONTEXT_VALUE: + { + *(DWORD_PTR *)buffer = hdr->context; + *buflen = sizeof(DWORD_PTR); + return TRUE; + } + default: + { + if (hdr->vtbl->query_option) ret = hdr->vtbl->query_option( hdr, option, buffer, buflen ); + else FIXME("unimplemented option %u\n", option); + } + } + return ret; +} + +/*********************************************************************** + * WinHttpQueryOption (winhttp.@) + */ +BOOL WINAPI WinHttpQueryOption( HINTERNET handle, DWORD option, LPVOID buffer, LPDWORD buflen ) +{ + BOOL ret = FALSE; + object_header_t *hdr; + + TRACE("%p, %u, %p, %p\n", handle, option, buffer, buflen); + + if (!(hdr = grab_object( handle ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + + ret = query_option( hdr, option, buffer, buflen ); + + release_object( hdr ); + return ret; +} + +static BOOL set_option( object_header_t *hdr, DWORD option, LPVOID buffer, DWORD buflen ) +{ + BOOL ret = TRUE; + + switch (option) + { + case WINHTTP_OPTION_CONTEXT_VALUE: + { + hdr->context = *(DWORD_PTR *)buffer; + return TRUE; + } + default: + { + if (hdr->vtbl->set_option) ret = hdr->vtbl->set_option( hdr, option, buffer, buflen ); + else FIXME("unimplemented option %u\n", option); + } + } + return ret; +} + +/*********************************************************************** + * WinHttpSetOption (winhttp.@) + */ +BOOL WINAPI WinHttpSetOption( HINTERNET handle, DWORD option, LPVOID buffer, DWORD buflen ) +{ + BOOL ret = FALSE; + object_header_t *hdr; + + TRACE("%p, %u, %p, %u\n", handle, option, buffer, buflen); + + if (!(hdr = grab_object( handle ))) + { + set_last_error( ERROR_INVALID_HANDLE ); + return FALSE; + } + + ret = set_option( hdr, option, buffer, buflen ); + + release_object( hdr ); + return ret; +} + /*********************************************************************** * WinHttpDetectAutoProxyConfigUrl (winhttp.@) */ diff --git a/dlls/winhttp/tests/Makefile.in b/dlls/winhttp/tests/Makefile.in index d4efd426cca..06890c4d5f3 100644 --- a/dlls/winhttp/tests/Makefile.in +++ b/dlls/winhttp/tests/Makefile.in @@ -6,6 +6,7 @@ TESTDLL = winhttp.dll IMPORTS = winhttp kernel32 CTESTS = \ + notification.c \ winhttp.c @MAKE_TEST_RULES@ diff --git a/dlls/winhttp/tests/notification.c b/dlls/winhttp/tests/notification.c new file mode 100644 index 00000000000..da605b024ad --- /dev/null +++ b/dlls/winhttp/tests/notification.c @@ -0,0 +1,267 @@ +/* + * test status notifications + * + * Copyright 2008 Hans Leidekker for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include +#include + +#include "wine/test.h" + +static const WCHAR user_agent[] = {'w','i','n','e','t','e','s','t',0}; + +enum api +{ + winhttp_connect = 1, + winhttp_open_request, + winhttp_send_request, + winhttp_receive_response, + winhttp_close_handle +}; + +struct notification +{ + enum api function; /* api responsible for notification */ + unsigned int status; /* status received */ + int todo; +}; + +struct info +{ + enum api function; + const struct notification *test; + unsigned int count; + unsigned int index; +}; + +static void CALLBACK check_notification( HINTERNET handle, DWORD_PTR context, DWORD status, LPVOID buffer, DWORD buflen ) +{ + struct info *info = (struct info *)context; + unsigned int i = info->index; + + if (status == WINHTTP_CALLBACK_STATUS_HANDLE_CREATED) + { + DWORD size = sizeof(struct info *); + WinHttpQueryOption( handle, WINHTTP_OPTION_CONTEXT_VALUE, &info, &size ); + } + ok(i < info->count, "unexpected notification 0x%08x\n", status); + if (i >= info->count) return; + if (!info->test[i].todo) + { + ok(info->test[i].status == status, "expected status 0x%08x got 0x%08x\n", info->test[i].status, status); + ok(info->test[i].function == info->function, "expected function %u got %u\n", info->test[i].function, info->function); + } + else todo_wine + { + ok(info->test[i].status == status, "expected status 0x%08x got 0x%08x\n", info->test[i].status, status); + ok(info->test[i].function == info->function, "expected function %u got %u\n", info->test[i].function, info->function); + } + info->index++; +} + +static const struct notification cache_test[] = +{ + { winhttp_connect, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, 0 }, + { winhttp_open_request, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 } +}; + +static void test_connection_cache( void ) +{ + static const WCHAR codeweavers[] = {'w','w','w','.','c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; + + HANDLE ses, con, req; + DWORD size, status; + BOOL ret; + struct info info, *context = &info; + + info.test = cache_test; + info.count = sizeof(cache_test) / sizeof(cache_test[0]); + info.index = 0; + + ses = WinHttpOpen( user_agent, 0, NULL, NULL, 0 ); + ok(ses != NULL, "failed to open session %u\n", GetLastError()); + + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + + ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); + ok(ret, "failed to set context value %u\n", GetLastError()); + + info.function = winhttp_connect; + con = WinHttpConnect( ses, codeweavers, 0, 0 ); + ok(con != NULL, "failed to open a connection %u\n", GetLastError()); + + info.function = winhttp_open_request; + req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + info.function = winhttp_send_request; + ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + ok(ret, "failed to send request %u\n", GetLastError()); + + info.function = winhttp_receive_response; + ret = WinHttpReceiveResponse( req, NULL ); + ok(ret, "failed to receive response %u\n", GetLastError()); + + size = sizeof(status); + ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL ); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + + info.function = winhttp_close_handle; + WinHttpCloseHandle( req ); + WinHttpCloseHandle( con ); + WinHttpCloseHandle( ses ); + + Sleep(2000); /* make sure connection is evicted from cache */ + + info.index = 0; + + ses = WinHttpOpen( user_agent, 0, NULL, NULL, 0 ); + ok(ses != NULL, "failed to open session %u\n", GetLastError()); + + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + + ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); + ok(ret, "failed to set context value %u\n", GetLastError()); + + info.function = winhttp_connect; + con = WinHttpConnect( ses, codeweavers, 0, 0 ); + ok(con != NULL, "failed to open a connection %u\n", GetLastError()); + + info.function = winhttp_open_request; + req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + ret = WinHttpSetOption( req, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); + ok(ret, "failed to set context value %u\n", GetLastError()); + + info.function = winhttp_send_request; + ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + ok(ret, "failed to send request %u\n", GetLastError()); + + info.function = winhttp_receive_response; + ret = WinHttpReceiveResponse( req, NULL ); + ok(ret, "failed to receive response %u\n", GetLastError()); + + size = sizeof(status); + ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL ); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + + info.function = winhttp_close_handle; + WinHttpCloseHandle( req ); + WinHttpCloseHandle( con ); + WinHttpCloseHandle( ses ); +} + +static const struct notification redirect_test[] = +{ + { winhttp_connect, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, 0 }, + { winhttp_open_request, WINHTTP_CALLBACK_STATUS_HANDLE_CREATED, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, 0 }, + { winhttp_send_request, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_REDIRECT, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESOLVING_NAME, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_NAME_RESOLVED, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_CONNECTING_TO_SERVER, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_CONNECTED_TO_SERVER, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_SENDING_REQUEST, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_REQUEST_SENT, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE, 0 }, + { winhttp_receive_response, WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CLOSING_CONNECTION, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 0 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 }, + { winhttp_close_handle, WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING, 1 } +}; + +static void test_redirect( void ) +{ + static const WCHAR codeweavers[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; + + HANDLE ses, con, req; + DWORD size, status; + BOOL ret; + struct info info, *context = &info; + + info.test = redirect_test; + info.count = sizeof(redirect_test) / sizeof(redirect_test[0]); + info.index = 0; + + ses = WinHttpOpen( user_agent, 0, NULL, NULL, 0 ); + ok(ses != NULL, "failed to open session %u\n", GetLastError()); + + WinHttpSetStatusCallback( ses, check_notification, WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0 ); + + ret = WinHttpSetOption( ses, WINHTTP_OPTION_CONTEXT_VALUE, &context, sizeof(struct info *) ); + ok(ret, "failed to set context value %u\n", GetLastError()); + + info.function = winhttp_connect; + con = WinHttpConnect( ses, codeweavers, 0, 0 ); + ok(con != NULL, "failed to open a connection %u\n", GetLastError()); + + info.function = winhttp_open_request; + req = WinHttpOpenRequest( con, NULL, NULL, NULL, NULL, NULL, 0 ); + ok(req != NULL, "failed to open a request %u\n", GetLastError()); + + info.function = winhttp_send_request; + ret = WinHttpSendRequest( req, NULL, 0, NULL, 0, 0, 0 ); + + info.function = winhttp_receive_response; + ret = WinHttpReceiveResponse( req, NULL ); + ok(ret, "failed to receive response %u\n", GetLastError()); + + size = sizeof(status); + ret = WinHttpQueryHeaders( req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL ); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + + info.function = winhttp_close_handle; + WinHttpCloseHandle( req ); + WinHttpCloseHandle( con ); + WinHttpCloseHandle( ses ); +} + +START_TEST (notification) +{ + test_connection_cache(); + test_redirect(); +} diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 6ba3a32a7fd..71e4efa788c 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -250,7 +250,7 @@ static void test_WinHttpAddHeaders(void) len = sizeof(buffer); ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, test_header_name, buffer, &len, &index); - ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header."); + ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, found 'Warning' header.\n"); ret = WinHttpAddRequestHeaders(request, test_headers[0], -1L, WINHTTP_ADDREQ_FLAG_ADD); ok(ret == TRUE, "WinHttpAddRequestHeader failed to add new header, got %d with error %u.\n", ret, GetLastError()); @@ -267,13 +267,15 @@ static void test_WinHttpAddHeaders(void) test_header_name, buffer, &len, &index); ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded, second index should not exist.\n"); - /* Try to fetch the header info with a buffer thats big enough to fit string but not NULL terminator. */ + /* Try to fetch the header info with a buffer that's big enough to fit the + * string but not the NULL terminator. + */ index = 0; len = 5*sizeof(WCHAR); memcpy(buffer, check_buffer, sizeof(buffer)); ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_CUSTOM | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, test_header_name, buffer, &len, &index); - ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded with a buffer thats too small.\n"); + ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded with a buffer that's too small.\n"); ok(memcmp(buffer, check_buffer, sizeof(buffer)) == 0, "WinHttpQueryHeaders failed, modified the buffer when it should not have.\n"); ok(len == 6*sizeof(WCHAR), "WinHttpQueryHeaders returned invalid length, expected 12, got %d\n", len); @@ -285,11 +287,11 @@ static void test_WinHttpAddHeaders(void) ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS_CRLF | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, test_header_name, NULL, &len, &index); ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n"); - todo_wine ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len); ok(index == 0, "WinHttpQueryHeaders incorrectly incremented header index.\n"); - /* Try with a NULL buffer and a length thats too small */ + /* Try with a NULL buffer and a length that's too small */ index = 0; len = 10; SetLastError(0xdeadbeef); @@ -329,6 +331,30 @@ static void test_WinHttpAddHeaders(void) "WinHttpQueryHeaders returned invalid end of header string.\n"); ok(index == 0, "WinHttpQueryHeaders incremented header index.\n"); + index = 0; + len = 0; + SetLastError(0xdeadbeef); + ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, + test_header_name, NULL, &len, &index); + ok(ret == FALSE, "WinHttpQueryHeaders unexpectedly succeeded.\n"); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, + "WinHttpQueryHeaders set incorrect error: expected ERROR_INSUFFICIENT_BUFFER, got %u\n", GetLastError()); + ok(len > 40, "WinHttpQueryHeaders returned invalid length: expected greater than 40, got %d\n", len); + ok(index == 0, "WinHttpQueryHeaders failed: index was incremented.\n"); + + oldlen = len; + index = 0; + len = sizeof(buffer); + memset(buffer, 0xff, sizeof(buffer)); + ret = WinHttpQueryHeaders(request, WINHTTP_QUERY_RAW_HEADERS | WINHTTP_QUERY_FLAG_REQUEST_HEADERS, + test_header_name, buffer, &len, &index); + ok(ret == TRUE, "WinHttpQueryHeaders failed %u\n", GetLastError()); + ok(len + sizeof(WCHAR) <= oldlen, "resulting length longer than advertized\n"); + ok((len < sizeof(buffer) - sizeof(WCHAR)) && !buffer[len / sizeof(WCHAR)] && !buffer[len / sizeof(WCHAR) - 1], + "no double NULL terminator\n"); + ok(!memcmp(buffer, test_header_begin, sizeof(test_header_begin)), "invalid beginning of header string\n"); + ok(index == 0, "header index was incremented\n"); + /* tests for more indices */ ret = WinHttpAddRequestHeaders(request, test_headers[1], -1L, WINHTTP_ADDREQ_FLAG_ADD); ok(ret == TRUE, "WinHttpAddRequestHeaders failed to add duplicate header: %d\n", ret); @@ -530,12 +556,16 @@ static void test_secure_connection(void) static const WCHAR google[] = {'w','w','w','.','g','o','o','g','l','e','.','c','o','m',0}; HANDLE ses, con, req; - DWORD size; + DWORD size, status, policy; BOOL ret; ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); + policy = WINHTTP_OPTION_REDIRECT_POLICY_ALWAYS; + ret = WinHttpSetOption(ses, WINHTTP_OPTION_REDIRECT_POLICY, &policy, sizeof(policy)); + ok(ret, "failed to set redirect policy %u\n", GetLastError()); + con = WinHttpConnect(ses, google, 443, 0); ok(con != NULL, "failed to open a connection %u\n", GetLastError()); @@ -564,6 +594,11 @@ static void test_secure_connection(void) ret = WinHttpReceiveResponse(req, NULL); ok(ret, "failed to receive response %u\n", GetLastError()); + size = sizeof(status); + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + size = 0; ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_RAW_HEADERS_CRLF, NULL, NULL, &size, NULL); ok(!ret, "succeeded unexpectedly\n"); @@ -579,6 +614,7 @@ static void test_request_parameter_defaults(void) static const WCHAR codeweavers[] = {'c','o','d','e','w','e','a','v','e','r','s','.','c','o','m',0}; HANDLE ses, con, req; + DWORD size, status; BOOL ret; ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); @@ -596,6 +632,11 @@ static void test_request_parameter_defaults(void) ret = WinHttpReceiveResponse(req, NULL); ok(ret, "failed to receive response %u\n", GetLastError()); + size = sizeof(status); + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + WinHttpCloseHandle(req); req = WinHttpOpenRequest(con, empty, empty, empty, NULL, NULL, 0); @@ -607,6 +648,11 @@ static void test_request_parameter_defaults(void) ret = WinHttpReceiveResponse(req, NULL); ok(ret, "failed to receive response %u\n", GetLastError()); + size = sizeof(status); + ret = WinHttpQueryHeaders(req, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &status, &size, NULL); + ok(ret, "failed unexpectedly %u\n", GetLastError()); + ok(status == 200, "request failed unexpectedly %u\n", status); + WinHttpCloseHandle(req); WinHttpCloseHandle(con); WinHttpCloseHandle(ses); diff --git a/dlls/winhttp/winhttp_private.h b/dlls/winhttp/winhttp_private.h index 6bd6949da47..9bf48d4c5c4 100644 --- a/dlls/winhttp/winhttp_private.h +++ b/dlls/winhttp/winhttp_private.h @@ -41,7 +41,7 @@ typedef struct _object_header_t object_header_t; typedef struct { void (*destroy)( object_header_t * ); - BOOL (*query_option)( object_header_t *, DWORD, void *, DWORD *, BOOL ); + BOOL (*query_option)( object_header_t *, DWORD, void *, DWORD * ); BOOL (*set_option)( object_header_t *, DWORD, void *, DWORD ); } object_vtbl_t; @@ -51,6 +51,9 @@ struct _object_header_t HINTERNET handle; const object_vtbl_t *vtbl; DWORD flags; + DWORD disable_flags; + DWORD logon_policy; + DWORD redirect_policy; DWORD error; DWORD_PTR context; LONG refs; diff --git a/dlls/wininet/rsrc.rc b/dlls/wininet/rsrc.rc index d8869a55e43..29e72d62d08 100644 --- a/dlls/wininet/rsrc.rc +++ b/dlls/wininet/rsrc.rc @@ -62,3 +62,4 @@ #include "wininet_Si.rc" #include "wininet_Sv.rc" #include "wininet_Tr.rc" +#include "wininet_Zh.rc" diff --git a/dlls/wininet/wininet_Zh.rc b/dlls/wininet/wininet_Zh.rc new file mode 100644 index 00000000000..e909b8ea9bd --- /dev/null +++ b/dlls/wininet/wininet_Zh.rc @@ -0,0 +1,78 @@ +/* + * wininet (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_PROXYDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "输入网络密码" +FONT 9, "MS Song" +{ + LTEXT "请输入你的用户名和密码:", -1, 40, 6, 150, 15 + LTEXT "代理", -1, 40, 26, 50, 10 + LTEXT "Realm", -1, 40, 46, 50, 10 + LTEXT "用户", -1, 40, 66, 50, 10 + LTEXT "密码", -1, 40, 86, 50, 10 + LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0 + LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 + EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD + CHECKBOX "保存密码(不安全)(&S)", IDC_SAVEPASSWORD, + 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "确定", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + IDS_LANCONNECTION "局域网连接" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_PROXYDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "輸入網路密碼" +FONT 8, "PMingLiu" +{ + LTEXT "請輸入你的用戶名和密碼:", -1, 40, 6, 150, 15 + LTEXT "代理", -1, 40, 26, 50, 10 + LTEXT "Realm", -1, 40, 46, 50, 10 + LTEXT "用戶", -1, 40, 66, 50, 10 + LTEXT "密碼", -1, 40, 86, 50, 10 + LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0 + LTEXT "" IDC_REALM, 80, 46, 150, 14, 0 + EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP + EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD + CHECKBOX "儲存密碼(不安全)(&S)", IDC_SAVEPASSWORD, + 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON "確定", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "取消", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + IDS_LANCONNECTION "局域網連接" +} + +#pragma code_page(default) diff --git a/dlls/winspool.drv/Zh.rc b/dlls/winspool.drv/Zh.rc new file mode 100644 index 00000000000..5394448e808 --- /dev/null +++ b/dlls/winspool.drv/Zh.rc @@ -0,0 +1,64 @@ +/* + * winspool (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +FILENAME_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "打印到文件" +FONT 9, "MS Song" +BEGIN + LTEXT "输出文件名(&O):", -1, 7, 13, 194, 13, WS_VISIBLE + EDITTEXT EDITBOX, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL + DEFPUSHBUTTON "确定", IDOK, 199, 10, 40, 14, WS_VISIBLE + PUSHBUTTON "取消", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_CAPTION "本地端口" + IDS_FILE_EXISTS "输出文件已存在, 按'确定'覆盖。" + IDS_CANNOT_OPEN "不能打开输出文件." +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +FILENAME_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE 6, 18, 245, 47 +STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION +CAPTION "列印到檔案" +FONT 8, "PMingLiu" +BEGIN + LTEXT "輸出檔案名(&O):", -1, 7, 13, 194, 13, WS_VISIBLE + EDITTEXT EDITBOX, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL + DEFPUSHBUTTON "確定", IDOK, 199, 10, 40, 14, WS_VISIBLE + PUSHBUTTON "取消", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE +END + +STRINGTABLE DISCARDABLE +{ + IDS_CAPTION "本地端口" + IDS_FILE_EXISTS "輸出檔案已存在, 按'確定'覆蓋。" + IDS_CANNOT_OPEN "不能開啟輸出檔案." +} + +#pragma code_page(default) diff --git a/dlls/winspool.drv/tests/info.c b/dlls/winspool.drv/tests/info.c index f0f47548b5a..e2fd9413e7b 100644 --- a/dlls/winspool.drv/tests/info.c +++ b/dlls/winspool.drv/tests/info.c @@ -693,7 +693,9 @@ static void test_DeleteMonitor(void) AddMonitorA(NULL, 2, (LPBYTE) &mi2a); SetLastError(MAGIC_DEAD); res = DeleteMonitorA(NULL, invalid_env, winetest); - ok(res, "returned %d with %d (expected '!=0')\n", res, GetLastError()); + ok( res || + (!res && GetLastError() == ERROR_INVALID_ENVIRONMENT) /* Vista/W2K8 */, + "returned %d with %d\n", res, GetLastError()); /* the monitor-name */ AddMonitorA(NULL, 2, (LPBYTE) &mi2a); diff --git a/dlls/winspool.drv/winspool.rc b/dlls/winspool.drv/winspool.rc index e9b168ee827..8fd7cb5dcd3 100644 --- a/dlls/winspool.drv/winspool.rc +++ b/dlls/winspool.drv/winspool.rc @@ -56,3 +56,4 @@ #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/dlls/wintrust/tests/asn.c b/dlls/wintrust/tests/asn.c index dff0adf2c95..eb9ca0f1a45 100644 --- a/dlls/wintrust/tests/asn.c +++ b/dlls/wintrust/tests/asn.c @@ -465,4 +465,6 @@ START_TEST(asn) test_decodeSPCLink(); test_encodeSPCPEImage(); test_decodeSPCPEImage(); + + FreeLibrary(hCrypt32); } diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index e2d21621303..3a8d42a6ffb 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -887,9 +887,9 @@ static void do_test( test_setup *test ) DWORD i, n = min (test->general.n_clients, MAX_CLIENTS); DWORD wait; - server_ready = CreateEventW ( NULL, TRUE, FALSE, NULL ); + server_ready = CreateEventA ( NULL, TRUE, FALSE, NULL ); for (i = 0; i <= n; i++) - client_ready[i] = CreateEventW ( NULL, TRUE, FALSE, NULL ); + client_ready[i] = CreateEventA ( NULL, TRUE, FALSE, NULL ); StartServer ( test->srv, &test->general, &test->srv_params ); StartClients ( test->clt, &test->general, &test->clt_params ); @@ -1675,7 +1675,7 @@ static void test_select(void) thread_params.s = fdRead; thread_params.ReadKilled = FALSE; - server_ready = CreateEventW(NULL, TRUE, FALSE, NULL); + server_ready = CreateEventA(NULL, TRUE, FALSE, NULL); thread_handle = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) &SelectReadThread, &thread_params, 0, &id ); ok ( (thread_handle != NULL), "CreateThread failed unexpectedly: %d\n", GetLastError()); @@ -1735,7 +1735,7 @@ static void test_accept(void) goto done; } - server_ready = CreateEventW(NULL, TRUE, FALSE, NULL); + server_ready = CreateEventA(NULL, TRUE, FALSE, NULL); if (server_ready == INVALID_HANDLE_VALUE) { trace("error creating event: %d\n", GetLastError()); @@ -2069,10 +2069,10 @@ static void test_write_events(void) goto end; } - hEvent = CreateEventW(NULL, FALSE, TRUE, NULL); + hEvent = CreateEventA(NULL, FALSE, TRUE, NULL); if (hEvent == INVALID_HANDLE_VALUE) { - ok(0, "CreateEventW failed, error %d\n", GetLastError()); + ok(0, "CreateEventA failed, error %d\n", GetLastError()); goto end; } diff --git a/include/Makefile.in b/include/Makefile.in index 808a6fc9c3a..415ac1b3597 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -385,6 +385,7 @@ SRCDIR_INCLUDES = \ sql.h \ sqlext.h \ sqltypes.h \ + srrestoreptapi.h \ sspi.h \ storage.h \ svrapi.h \ diff --git a/include/commctrl.h b/include/commctrl.h index 2a49e00a66c..046e13f252d 100644 --- a/include/commctrl.h +++ b/include/commctrl.h @@ -2859,6 +2859,10 @@ typedef struct tagTVKEYDOWN #define TreeView_MapHTREEITEMToAccID(hwnd, htreeitem) \ (UINT)SNDMSG((hwnd), TVM_MAPHTREEITEMTOACCID, (WPARAM)htreeitem, 0) +#define TreeView_SetUnicodeFormat(hwnd, fUnicode) \ + (BOOL)SNDMSG((hwnd), TVM_SETUNICODEFORMAT, (WPARAM)(fUnicode), 0) +#define TreeView_GetUnicodeFormat(hwnd) \ + (BOOL)SNDMSG((hwnd), TVM_GETUNICODEFORMAT, 0, 0) /* Listview control */ @@ -3921,6 +3925,10 @@ typedef struct NMLVSCROLL (UINT)SNDMSG((hwnd), LVM_MAPINDEXTOID, (WPARAM)index, (LPARAM)0) #define ListView_MapIDToIndex(hwnd, id) \ (UINT)SNDMSG((hwnd), LVM_MAPIDTOINDEX, (WPARAM)id, (LPARAM)0) +#define ListView_SetUnicodeFormat(hwnd, fUnicode) \ + (BOOL)SNDMSG((hwnd), LVM_SETUNICODEFORMAT, (WPARAM)(fUnicode), 0) +#define ListView_GetUnicodeFormat(hwnd) \ + (BOOL)SNDMSG((hwnd), LVM_GETUNICODEFORMAT, 0, 0) /* Tab Control */ diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index 47b6b1e32a5..cbc9cfad7f2 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -46,4 +46,9 @@ typedef enum _BUS_DATA_TYPE MaximumBusDataType } BUS_DATA_TYPE, *PBUS_DATA_TYPE; +typedef VOID (WINAPI *PDRIVER_REINITIALIZE)(PDRIVER_OBJECT,PVOID,ULONG); + +void WINAPI IoRegisterDriverReinitialization(PDRIVER_OBJECT,PDRIVER_REINITIALIZE,PVOID); +NTSTATUS WINAPI IoRegisterShutdownNotification(PDEVICE_OBJECT); + #endif diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index e2340dde583..19d799be73d 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -89,6 +89,8 @@ typedef struct _ETHREAD *PETHREAD; typedef struct _KTHREAD *PKTHREAD; typedef struct _EPROCESS *PEPROCESS; typedef struct _IO_WORKITEM *PIO_WORKITEM; +typedef struct _OBJECT_TYPE *POBJECT_TYPE; +typedef struct _OBJECT_HANDLE_INFORMATION *POBJECT_HANDLE_INFORMATION; #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR)) @@ -941,6 +943,8 @@ void WINAPI IoDeleteDriver(DRIVER_OBJECT*); NTSTATUS WINAPI IoDeleteSymbolicLink(UNICODE_STRING*); void WINAPI IoFreeIrp(IRP*); PEPROCESS WINAPI IoGetCurrentProcess(void); +NTSTATUS WINAPI IoGetDeviceObjectPointer(UNICODE_STRING*,ACCESS_MASK,PFILE_OBJECT*,PDEVICE_OBJECT*); +PDEVICE_OBJECT WINAPI IoGetRelatedDeviceObject(PFILE_OBJECT); void WINAPI IoInitializeIrp(IRP*,USHORT,CCHAR); PKTHREAD WINAPI KeGetCurrentThread(void); @@ -951,6 +955,8 @@ ULONG WINAPI KeQueryTimeIncrement(void); PVOID WINAPI MmAllocateNonCachedMemory(SIZE_T); void WINAPI MmFreeNonCachedMemory(PVOID,SIZE_T); +NTSTATUS WINAPI ObReferenceObjectByHandle(HANDLE,ACCESS_MASK,POBJECT_TYPE,KPROCESSOR_MODE,PVOID*,POBJECT_HANDLE_INFORMATION); + NTSTATUS WINAPI PsCreateSystemThread(PHANDLE,ULONG,POBJECT_ATTRIBUTES,HANDLE,PCLIENT_ID,PKSTART_ROUTINE,PVOID); #define PsGetCurrentProcess() IoGetCurrentProcess() #define PsGetCurrentThread() ((PETHREAD)KeGetCurrentThread()) diff --git a/include/dxfile.h b/include/dxfile.h index cf635410052..b0adcebcc06 100644 --- a/include/dxfile.h +++ b/include/dxfile.h @@ -207,14 +207,14 @@ DECLARE_INTERFACE_(IDirectXFileDataReference,IDirectXFileObject) #if !defined(__cplusplus) || defined(CINTERFACE) /*** IUnknown methods ***/ -#define IDirectXFileData_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IDirectXFileData_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IDirectXFileData_Release(p) (p)->lpVtbl->Release(p) +#define IDirectXFileDataReference_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IDirectXFileDataReference_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IDirectXFileDataReference_Release(p) (p)->lpVtbl->Release(p) /*** IDirectXFileObject methods ***/ -#define IDirectXFileData_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b) -#define IDirectXFileData_GetId(p,a) (p)->lpVtbl->GetId(p,a) +#define IDirectXFileDataReference_GetName(p,a,b) (p)->lpVtbl->GetName(p,a,b) +#define IDirectXFileDataReference_GetId(p,a) (p)->lpVtbl->GetId(p,a) /*** IDirectXFileDataReference methods ***/ -#define IDirectXFileData_Resolve(p,a) (p)->lpVtbl->GetData(p,a) +#define IDirectXFileDataReference_Resolve(p,a) (p)->lpVtbl->GetData(p,a) #endif #define INTERFACE IDirectXFileBinary diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h index 12e8d943284..cbb59e5a9ba 100644 --- a/include/gdiplusflat.h +++ b/include/gdiplusflat.h @@ -169,6 +169,7 @@ GpStatus WINGDIPAPI GdipGetPixelOffsetMode(GpGraphics*,PixelOffsetMode*); GpStatus WINGDIPAPI GdipGetSmoothingMode(GpGraphics*,SmoothingMode*); GpStatus WINGDIPAPI GdipGetTextRenderingHint(GpGraphics*,TextRenderingHint*); GpStatus WINGDIPAPI GdipGetWorldTransform(GpGraphics*,GpMatrix*); +GpStatus WINGDIPAPI GdipGraphicsClear(GpGraphics*,ARGB); GpStatus WINGDIPAPI GdipMeasureString(GpGraphics*,GDIPCONST WCHAR*,INT, GDIPCONST GpFont*,GDIPCONST RectF*,GDIPCONST GpStringFormat*,RectF*,INT*,INT*); GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics*, GDIPCONST WCHAR*, @@ -526,6 +527,15 @@ GpStatus WINGDIPAPI GdipSetMetafileDownLevelRasterizationLimit(GpMetafile*,UINT) GpStatus WINGDIPAPI GdipSetClipRectI(GpGraphics*,INT,INT,INT,INT,CombineMode); GpStatus WINGDIPAPI GdipFillRegion(GpGraphics*,GpBrush*,GpRegion*); +GpStatus WINGDIPAPI GdipCreateAdjustableArrowCap(REAL,REAL,BOOL,GpAdjustableArrowCap**); +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapFillState(GpAdjustableArrowCap*,BOOL*); +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapHeight(GpAdjustableArrowCap*,REAL*); +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap*,REAL*); +GpStatus WINGDIPAPI GdipGetAdjustableArrowCapWidth(GpAdjustableArrowCap*,REAL*); +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapFillState(GpAdjustableArrowCap*,BOOL); +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapHeight(GpAdjustableArrowCap*,REAL); +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapMiddleInset(GpAdjustableArrowCap*,REAL); +GpStatus WINGDIPAPI GdipSetAdjustableArrowCapWidth(GpAdjustableArrowCap*,REAL); #ifdef __cplusplus } diff --git a/include/gdiplusgpstubs.h b/include/gdiplusgpstubs.h index bb7c47f3a5a..917097ef8d6 100644 --- a/include/gdiplusgpstubs.h +++ b/include/gdiplusgpstubs.h @@ -28,6 +28,7 @@ class GpPath {}; class GpMatrix {}; class GpPathIterator {}; class GpCustomLineCap {}; +class GpAdjustableArrowCap : public GpCustomLineCap {}; class GpImage {}; class GpMetafile : public GpImage {}; class GpImageAttributes {}; @@ -52,6 +53,7 @@ typedef struct GpPath GpPath; typedef struct GpMatrix GpMatrix; typedef struct GpPathIterator GpPathIterator; typedef struct GpCustomLineCap GpCustomLineCap; +typedef struct GpAdjustableArrowCap GpAdjustableArrowCap; typedef struct GpImage GpImage; typedef struct GpMetafile GpMetafile; typedef struct GpImageAttributes GpImageAttributes; diff --git a/include/mimeole.idl b/include/mimeole.idl index 9d4f45bc0cd..508ca26e767 100644 --- a/include/mimeole.idl +++ b/include/mimeole.idl @@ -43,6 +43,9 @@ cpp_quote("#define MIME_E_BUFFER_TOO_SMALL 0x800cce06") cpp_quote("#define MIME_E_INVALID_TEXT_TYPE 0x800cce38") +cpp_quote("#define MIME_E_SECURITY_NOOP 0x800cceb1") +cpp_quote("#define MIME_S_SECURITY_NOOP 0x000cceb1") + cpp_quote("typedef enum tagMIMEPROPID {") cpp_quote(" PID_HDR_NEWSGROUP = 2,") cpp_quote(" PID_HDR_NEWSGROUPS = 3,") @@ -78,7 +81,14 @@ cpp_quote(" PID_HDR_SENDER = 61,") cpp_quote(" PID_HDR_INREPLYTO = 77,") cpp_quote("} MIMEPROPID;") +cpp_quote("#define TYPEDID_MASK ((ULONG)0xffff)") +cpp_quote("#define TYPEDID_TYPE(t) ((VARTYPE)((t) & TYPEDID_MASK))") + +cpp_quote("#define OID_HIDE_TNEF_ATTACHMENTS (0x000e0000 | VT_BOOL)") +cpp_quote("#define OID_SECURITY_TYPE (0x00180000 | VT_UI4)") +cpp_quote("#define OID_SECURITY_HWND_OWNER (0x00320000 | VT_UI4)") cpp_quote("#define OID_HEADER_RELOAD_TYPE (0x00370000 | VT_UI4)") +cpp_quote("#define OID_SHOW_MACBINARY (0x00390000 | VT_BOOL)") [ @@ -293,6 +303,19 @@ library MIMEOLE typedef BLOB THUMBBLOB; typedef void *HCAPICERTSTORE; + cpp_quote("#define MST_NONE 0x00000000") + cpp_quote("#define MST_THIS_SIGN 0x00000001") + cpp_quote("#define MST_THIS_ENCRYPT 0x00000002") + cpp_quote("#define MST_BLOB_FLAG 0x00000004") + cpp_quote("#define MST_THIS_BLOBSIGN (MST_BLOB_FLAG | MST_THIS_SIGN)") + cpp_quote("#define MST_CHILD_SIGN 0x00000100") + cpp_quote("#define MST_CHILD_ENCRYPT 0x00000200") + cpp_quote("#define MST_SUBMSG_SIGN 0x00001000") + cpp_quote("#define MST_SUBMSG_ENCRYPT 0x00002000") + cpp_quote("#define MST_RECEIPT_REQUEST 0x00010000") + cpp_quote("#define MST_CLASS_SMIME_V1 0x00000000") + cpp_quote("#define MST_CLASS_PGP 0x01000000") + typedef enum tagCERTSTATE { CERTIFICATE_OK, @@ -1164,6 +1187,31 @@ cpp_quote("#endif") { /* FIXME: fill this in */ } + + [ + uuid(ba715ae0-a740-11d2-8b22-0080c76b34c6), + local + ] + interface IMimeSecurityCallback : IUnknown + { + /* FIXME: fill this in */ + + cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_UNKNOWN 0") + cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_KEYTRANS 1") + cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_KEYAGREE 2") + cpp_quote("#define CMS_RECIPIENT_INFO_TYPE_MAIL_LIST 3") + + cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_CERTIFICATE 0") + cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_KEYTRANS 1") + cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_PROVIDER 2") + cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_EPHEMERAL_KEYAGREE 3") + cpp_quote("#define CMS_RECIPIENT_INFO_PUBKEY_STATIC_KEYAGREE 4") + + cpp_quote("#define CMS_RECIPIENT_INFO_KEYID_CERTIFICATE 0") + cpp_quote("#define CMS_RECIPIENT_INFO_KEYID_ISSUERSERIAL 1") + cpp_quote("#define CMS_RECIPIENT_INFO_KEYID_KEY_ID 2") + + } } cpp_quote("#ifdef __cplusplus") diff --git a/include/mshtmdid.h b/include/mshtmdid.h index e0a1bf2b81f..a830cf86498 100644 --- a/include/mshtmdid.h +++ b/include/mshtmdid.h @@ -1063,6 +1063,71 @@ #define DISPID_HTMLELEMENTEVENTS_ONFOCUSIN DISPID_EVMETH_ONFOCUSIN #define DISPID_HTMLELEMENTEVENTS_ONFOCUSOUT DISPID_EVMETH_ONFOCUSOUT +/* HTMLElementEvents2 */ + +#define DISPID_HTMLELEMENTEVENTS2_ONHELP DISPID_EVMETH_ONHELP +#define DISPID_HTMLELEMENTEVENTS2_ONCLICK DISPID_EVMETH_ONCLICK +#define DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK DISPID_EVMETH_ONDBLCLICK +#define DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS DISPID_EVMETH_ONKEYPRESS +#define DISPID_HTMLELEMENTEVENTS2_ONKEYDOWN DISPID_EVMETH_ONKEYDOWN +#define DISPID_HTMLELEMENTEVENTS2_ONKEYUP DISPID_EVMETH_ONKEYUP +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT DISPID_EVMETH_ONMOUSEOUT +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER DISPID_EVMETH_ONMOUSEOVER +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE DISPID_EVMETH_ONMOUSEMOVE +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN DISPID_EVMETH_ONMOUSEDOWN +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP DISPID_EVMETH_ONMOUSEUP +#define DISPID_HTMLELEMENTEVENTS2_ONSELECTSTART DISPID_EVMETH_ONSELECTSTART +#define DISPID_HTMLELEMENTEVENTS2_ONFILTERCHANGE DISPID_EVMETH_ONFILTER +#define DISPID_HTMLELEMENTEVENTS2_ONDRAGSTART DISPID_EVMETH_ONDRAGSTART +#define DISPID_HTMLELEMENTEVENTS2_ONBEFOREUPDATE DISPID_EVMETH_ONBEFOREUPDATE +#define DISPID_HTMLELEMENTEVENTS2_ONAFTERUPDATE DISPID_EVMETH_ONAFTERUPDATE +#define DISPID_HTMLELEMENTEVENTS2_ONERRORUPDATE DISPID_EVMETH_ONERRORUPDATE +#define DISPID_HTMLELEMENTEVENTS2_ONROWEXIT DISPID_EVMETH_ONROWEXIT +#define DISPID_HTMLELEMENTEVENTS2_ONROWENTER DISPID_EVMETH_ONROWENTER +#define DISPID_HTMLELEMENTEVENTS2_ONDATASETCHANGED DISPID_EVMETH_ONDATASETCHANGED +#define DISPID_HTMLELEMENTEVENTS2_ONDATAAVAILABLE DISPID_EVMETH_ONDATAAVAILABLE +#define DISPID_HTMLELEMENTEVENTS2_ONDATASETCOMPLETE DISPID_EVMETH_ONDATASETCOMPLETE +#define DISPID_HTMLELEMENTEVENTS2_ONLOSECAPTURE DISPID_EVMETH_ONLOSECAPTURE +#define DISPID_HTMLELEMENTEVENTS2_ONPROPERTYCHANGE DISPID_EVMETH_ONPROPERTYCHANGE +#define DISPID_HTMLELEMENTEVENTS2_ONSCROLL DISPID_EVMETH_ONSCROLL +#define DISPID_HTMLELEMENTEVENTS2_ONFOCUS DISPID_EVMETH_ONFOCUS +#define DISPID_HTMLELEMENTEVENTS2_ONBLUR DISPID_EVMETH_ONBLUR +#define DISPID_HTMLELEMENTEVENTS2_ONRESIZE DISPID_EVMETH_ONRESIZE +#define DISPID_HTMLELEMENTEVENTS2_ONDRAG DISPID_EVMETH_ONDRAG +#define DISPID_HTMLELEMENTEVENTS2_ONDRAGEND DISPID_EVMETH_ONDRAGEND +#define DISPID_HTMLELEMENTEVENTS2_ONDRAGENTER DISPID_EVMETH_ONDRAGENTER +#define DISPID_HTMLELEMENTEVENTS2_ONDRAGOVER DISPID_EVMETH_ONDRAGOVER +#define DISPID_HTMLELEMENTEVENTS2_ONDRAGLEAVE DISPID_EVMETH_ONDRAGLEAVE +#define DISPID_HTMLELEMENTEVENTS2_ONDROP DISPID_EVMETH_ONDROP +#define DISPID_HTMLELEMENTEVENTS2_ONBEFORECUT DISPID_EVMETH_ONBEFORECUT +#define DISPID_HTMLELEMENTEVENTS2_ONCUT DISPID_EVMETH_ONCUT +#define DISPID_HTMLELEMENTEVENTS2_ONBEFORECOPY DISPID_EVMETH_ONBEFORECOPY +#define DISPID_HTMLELEMENTEVENTS2_ONCOPY DISPID_EVMETH_ONCOPY +#define DISPID_HTMLELEMENTEVENTS2_ONBEFOREPASTE DISPID_EVMETH_ONBEFOREPASTE +#define DISPID_HTMLELEMENTEVENTS2_ONPASTE DISPID_EVMETH_ONPASTE +#define DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU DISPID_EVMETH_ONCONTEXTMENU +#define DISPID_HTMLELEMENTEVENTS2_ONROWSDELETE DISPID_EVMETH_ONROWSDELETE +#define DISPID_HTMLELEMENTEVENTS2_ONROWSINSERTED DISPID_EVMETH_ONROWSINSERTED +#define DISPID_HTMLELEMENTEVENTS2_ONCELLCHANGE DISPID_EVMETH_ONCELLCHANGE +#define DISPID_HTMLELEMENTEVENTS2_ONREADYSTATECHANGE DISPID_EVMETH_ONREADYSTATECHANGE +#define DISPID_HTMLELEMENTEVENTS2_ONLAYOUTCOMPLETE DISPID_EVMETH_ONLAYOUTCOMPLETE +#define DISPID_HTMLELEMENTEVENTS2_ONPAGE DISPID_EVMETH_ONPAGE +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEENTER DISPID_EVMETH_ONMOUSEENTER +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSELEAVE DISPID_EVMETH_ONMOUSELEAVE +#define DISPID_HTMLELEMENTEVENTS2_ONACTIVATE DISPID_EVMETH_ONACTIVATE +#define DISPID_HTMLELEMENTEVENTS2_ONDEACTIVATE DISPID_EVMETH_ONDEACTIVATE +#define DISPID_HTMLELEMENTEVENTS2_ONBEFOREDEACTIVATE DISPID_EVMETH_ONBEFOREDEACTIVATE +#define DISPID_HTMLELEMENTEVENTS2_ONBEFOREACTIVATE DISPID_EVMETH_ONBEFOREACTIVATE +#define DISPID_HTMLELEMENTEVENTS2_ONFOCUSIN DISPID_EVMETH_ONFOCUSIN +#define DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT DISPID_EVMETH_ONFOCUSOUT +#define DISPID_HTMLELEMENTEVENTS2_ONMOVE DISPID_EVMETH_ONMOVE +#define DISPID_HTMLELEMENTEVENTS2_ONCONTROLSELECT DISPID_EVMETH_ONCONTROLSELECT +#define DISPID_HTMLELEMENTEVENTS2_ONMOVESTART DISPID_EVMETH_ONMOVESTART +#define DISPID_HTMLELEMENTEVENTS2_ONMOVEEND DISPID_EVMETH_ONMOVEEND +#define DISPID_HTMLELEMENTEVENTS2_ONRESIZESTART DISPID_EVMETH_ONRESIZESTART +#define DISPID_HTMLELEMENTEVENTS2_ONRESIZEEND DISPID_EVMETH_ONRESIZEEND +#define DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL DISPID_EVMETH_ONMOUSEWHEEL + /* IHTMLElement */ #define DISPID_IHTMLELEMENT_SETATTRIBUTE (DISPID_HTMLOBJECT+1) #define DISPID_IHTMLELEMENT_GETATTRIBUTE (DISPID_HTMLOBJECT+2) @@ -2211,4 +2276,19 @@ #define DISPID_IHTMLFRAMEBASE2_READYSTATE DISPID_A_READYSTATE #define DISPID_IHTMLFRAMEBASE2_ALLOWTRANSPARENCY DISPID_A_ALLOWTRANSPARENCY +/* IHTMLControlElement */ +#define DISPID_IHTMLCONTROLELEMENT_TABINDEX STDPROPID_XOBJ_TABINDEX +#define DISPID_IHTMLCONTROLELEMENT_FOCUS (DISPID_SITE+0) +#define DISPID_IHTMLCONTROLELEMENT_ACCESSKEY (DISPID_SITE+5) +#define DISPID_IHTMLCONTROLELEMENT_ONBLUR DISPID_EVPROP_ONBLUR +#define DISPID_IHTMLCONTROLELEMENT_ONFOCUS DISPID_EVPROP_ONFOCUS +#define DISPID_IHTMLCONTROLELEMENT_ONRESIZE DISPID_EVPROP_ONRESIZE +#define DISPID_IHTMLCONTROLELEMENT_BLUR (DISPID_SITE+2) +#define DISPID_IHTMLCONTROLELEMENT_ADDFILTER (DISPID_SITE+17) +#define DISPID_IHTMLCONTROLELEMENT_REMOVEFILTER (DISPID_SITE+18) +#define DISPID_IHTMLCONTROLELEMENT_CLIENTHEIGHT (DISPID_SITE+19) +#define DISPID_IHTMLCONTROLELEMENT_CLIENTWIDTH (DISPID_SITE+20) +#define DISPID_IHTMLCONTROLELEMENT_CLIENTTOP (DISPID_SITE+21) +#define DISPID_IHTMLCONTROLELEMENT_CLIENTLEFT (DISPID_SITE+22) + #endif /* __MSHTMDID_H__ */ diff --git a/include/mshtml.idl b/include/mshtml.idl index 594c9964810..653ebf4a82b 100644 --- a/include/mshtml.idl +++ b/include/mshtml.idl @@ -3357,6 +3357,202 @@ interface IHTMLElement2 : IDispatch [retval, out] IHTMLElementCollection **pelColl); } + +/***************************************************************************** + * IHTMLElement3 interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f673-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLElement3 : IDispatch +{ + [id(DISPID_IHTMLELEMENT3_MERGEATTRIBUTES)] HRESULT mergeAttributes([in] + IHTMLElement* mergeThis,[optional, in] VARIANT* pvarFlags); + + [propget, id(DISPID_IHTMLELEMENT3_ISMULTILINE)] + HRESULT isMultiLine([retval, out] VARIANT_BOOL * p); + + [propget, id(DISPID_IHTMLELEMENT3_CANHAVEHTML)] + HRESULT canHaveHTML([retval, out] VARIANT_BOOL * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONLAYOUTCOMPLETE), displaybind, bindable] + HRESULT onlayoutcomplete([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONLAYOUTCOMPLETE), displaybind, bindable] + HRESULT onlayoutcomplete([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONPAGE), displaybind, bindable] + HRESULT onpage([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONPAGE), displaybind, bindable] + HRESULT onpage([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_INFLATEBLOCK), hidden, restricted, nonbrowsable] + HRESULT inflateBlock([in] VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLELEMENT3_INFLATEBLOCK), hidden, restricted, nonbrowsable] + HRESULT inflateBlock([retval, out] VARIANT_BOOL * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONBEFOREDEACTIVATE), displaybind, bindable] + HRESULT onbeforedeactivate([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONBEFOREDEACTIVATE), displaybind, bindable] + HRESULT onbeforedeactivate([retval, out] VARIANT * p); + + [id(DISPID_IHTMLELEMENT3_SETACTIVE)] HRESULT setActive(); + + [propput, id(DISPID_IHTMLELEMENT3_CONTENTEDITABLE), displaybind, bindable] + HRESULT contentEditable([in] BSTR v); + + [propget, id(DISPID_IHTMLELEMENT3_CONTENTEDITABLE), displaybind, bindable] + HRESULT contentEditable([retval, out] BSTR * p); + + [propget, id(DISPID_IHTMLELEMENT3_ISCONTENTEDITABLE)] + HRESULT isContentEditable([retval, out] VARIANT_BOOL * p); + + [propput, id(DISPID_IHTMLELEMENT3_HIDEFOCUS), displaybind, bindable] + HRESULT hideFocus([in] VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLELEMENT3_HIDEFOCUS), displaybind, bindable] + HRESULT hideFocus([retval, out] VARIANT_BOOL * p); + + [propput, id(DISPID_IHTMLELEMENT3_DISABLED), displaybind, bindable] + HRESULT disabled([in] VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLELEMENT3_DISABLED), displaybind, bindable] + HRESULT disabled([retval, out] VARIANT_BOOL * p); + + [propget, id(DISPID_IHTMLELEMENT3_ISDISABLED)] + HRESULT isDisabled([retval, out] VARIANT_BOOL * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOVE), displaybind, bindable] + HRESULT onmove([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOVE), displaybind, bindable] + HRESULT onmove([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONCONTROLSELECT), displaybind, bindable] + HRESULT oncontrolselect([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONCONTROLSELECT), displaybind, bindable] + HRESULT oncontrolselect([retval, out] VARIANT * p); + + [id(DISPID_IHTMLELEMENT3_FIREEVENT)] + HRESULT fireEvent( + [in] BSTR bstrEventName, + [optional, in] VARIANT* pvarEventObject, + [retval, out] VARIANT_BOOL* pfCancelled); + + [propput, id(DISPID_IHTMLELEMENT3_ONRESIZESTART), displaybind, bindable] + HRESULT onresizestart([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONRESIZESTART), displaybind, bindable] + HRESULT onresizestart([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONRESIZEEND), displaybind, bindable] + HRESULT onresizeend([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONRESIZEEND), displaybind, bindable] + HRESULT onresizeend([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOVESTART), displaybind, bindable] + HRESULT onmovestart([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOVESTART), displaybind, bindable] + HRESULT onmovestart([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOVEEND), displaybind, bindable] + HRESULT onmoveend([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOVEEND), displaybind, bindable] + HRESULT onmoveend([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOUSEENTER), displaybind, bindable] + HRESULT onmouseenter([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOUSEENTER), displaybind, bindable] + HRESULT onmouseenter([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOUSELEAVE), displaybind, bindable] + HRESULT onmouseleave([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOUSELEAVE), displaybind, bindable] + HRESULT onmouseleave([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONACTIVATE), displaybind, bindable] + HRESULT onactivate([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONACTIVATE), displaybind, bindable] + HRESULT onactivate([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT3_ONDEACTIVATE), displaybind, bindable] + HRESULT ondeactivate([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONDEACTIVATE), displaybind, bindable] + HRESULT ondeactivate([retval, out] VARIANT * p); + + [id(DISPID_IHTMLELEMENT3_DRAGDROP)] HRESULT dragDrop([retval, out] + VARIANT_BOOL* pfRet); + + [propget, id(DISPID_IHTMLELEMENT3_GLYPHMODE), hidden, restricted, nonbrowsable] + HRESULT glyphMode([retval, out] LONG * p); +}; +/***************************************************************************** + * IHTMLElement4 interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f80f-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLElement4 : IDispatch +{ + [propput, id(DISPID_IHTMLELEMENT4_ONMOUSEWHEEL), displaybind, bindable] + HRESULT onmousewheel([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT4_ONMOUSEWHEEL), displaybind, bindable] + HRESULT onmousewheel([retval, out] VARIANT * p); + + [id(DISPID_IHTMLELEMENT4_NORMALIZE)] + HRESULT normalize(); + + [id(DISPID_IHTMLELEMENT4_GETATTRIBUTENODE)] + HRESULT getAttributeNode([in] BSTR bstrname, + [retval, out] IHTMLDOMAttribute** ppAttribute); + + [id(DISPID_IHTMLELEMENT4_SETATTRIBUTENODE)] + HRESULT setAttributeNode( + [in] IHTMLDOMAttribute* pattr, + [retval, out] IHTMLDOMAttribute** ppretAttribute); + + [id(DISPID_IHTMLELEMENT4_REMOVEATTRIBUTENODE)] + HRESULT removeAttributeNode( + [in] IHTMLDOMAttribute* pattr, + [retval, out] IHTMLDOMAttribute** ppretAttribute); + + [propput, id(DISPID_IHTMLELEMENT4_ONBEFOREACTIVATE), displaybind, bindable] + HRESULT onbeforeactivate([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT4_ONBEFOREACTIVATE), displaybind, bindable] + HRESULT onbeforeactivate([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT4_ONFOCUSIN), displaybind, bindable] + HRESULT onfocusin([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT4_ONFOCUSIN), displaybind, bindable] + HRESULT onfocusin([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLELEMENT4_ONFOCUSOUT), displaybind, bindable] + HRESULT onfocusout([in] VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT4_ONFOCUSOUT), displaybind, bindable] + HRESULT onfocusout([retval, out] VARIANT * p); +}; + /***************************************************************************** * IHTMLGenericElement interface */ @@ -5736,228 +5932,1268 @@ methods: [propget, id(DISPID_IHTMLIMGELEMENT_SRC), displaybind, bindable] BSTR src(); - [propput, id(DISPID_IHTMLIMGELEMENT_LOWSRC), displaybind, bindable] - void lowsrc(BSTR v); + [propput, id(DISPID_IHTMLIMGELEMENT_LOWSRC), displaybind, bindable] + void lowsrc(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT_LOWSRC), displaybind, bindable] + BSTR lowsrc(); + + [propput, id(DISPID_IHTMLIMGELEMENT_VRML), displaybind, bindable] + void vrml(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT_VRML), displaybind, bindable] + BSTR vrml(); + + [propput, id(DISPID_IHTMLIMGELEMENT_DYNSRC), displaybind, bindable] + void dynsrc(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT_DYNSRC), displaybind, bindable] + BSTR dynsrc(); + + [propget, id(DISPID_IHTMLIMGELEMENT_COMPLETE)] + VARIANT_BOOL complete(); + + [propput, id(DISPID_IHTMLIMGELEMENT_LOOP), displaybind, bindable] + void loop(VARIANT v); + + [propget, id(DISPID_IHTMLIMGELEMENT_LOOP), displaybind, bindable] + VARIANT loop(); + + [propput, id(DISPID_IHTMLIMGELEMENT_ALIGN), displaybind, bindable] + void align(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT_ALIGN), displaybind, bindable] + BSTR align(); + + [propput, id(DISPID_IHTMLIMGELEMENT_ONLOAD), displaybind, bindable] + void onload(VARIANT v); + + [propget, id(DISPID_IHTMLIMGELEMENT_ONLOAD), displaybind, bindable] + VARIANT onload(); + + [propput, id(DISPID_IHTMLIMGELEMENT_ONERROR), displaybind, bindable] + void onerror(VARIANT v); + + [propget, id(DISPID_IHTMLIMGELEMENT_ONERROR), displaybind, bindable] + VARIANT onerror(); + + [propput, id(DISPID_IHTMLIMGELEMENT_ONABORT), displaybind, bindable] + void onabort(VARIANT v); + + [propget, id(DISPID_IHTMLIMGELEMENT_ONABORT), displaybind, bindable] + VARIANT onabort(); + + [propput, id(DISPID_IHTMLIMGELEMENT_NAME), displaybind, bindable] + void name(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT_NAME), displaybind, bindable] + BSTR name(); + + [propput, id(DISPID_IHTMLIMGELEMENT_WIDTH)] + void width(long v); + + [propget, id(DISPID_IHTMLIMGELEMENT_WIDTH)] + long width(); + + [propput, id(DISPID_IHTMLIMGELEMENT_HEIGHT)] + void height(long v); + + [propget, id(DISPID_IHTMLIMGELEMENT_HEIGHT)] + long height(); + + [propput, id(DISPID_IHTMLIMGELEMENT_START), displaybind, bindable] + void start(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT_START), displaybind, bindable] + BSTR start(); + + [propput, id(DISPID_IHTMLIMGELEMENT2_LONGDESC), displaybind, bindable] + void longDesc(BSTR v); + + [propget, id(DISPID_IHTMLIMGELEMENT2_LONGDESC), displaybind, bindable] + BSTR longDesc(); +}; + +/***************************************************************************** + * IHTMLUniqueName interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f4d0-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLUniqueName : IDispatch +{ + [propget, id(DISPID_IHTMLUNIQUENAME_UNIQUENUMBER), hidden] + HRESULT uniqueNumber([retval, out] long * p); + + [propget, id(DISPID_IHTMLUNIQUENAME_UNIQUEID), hidden] + HRESULT uniqueID([retval, out] BSTR * p); +}; + +/***************************************************************************** + * IHTMLControlElement interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f4e9-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLControlElement : IDispatch +{ + [propput, id(DISPID_IHTMLCONTROLELEMENT_TABINDEX), displaybind, bindable] + HRESULT tabIndex([in] short v); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_TABINDEX), displaybind, bindable] + HRESULT tabIndex([retval, out] short * p); + + [id(DISPID_IHTMLCONTROLELEMENT_FOCUS)] + HRESULT focus(); + + [propput, id(DISPID_IHTMLCONTROLELEMENT_ACCESSKEY), displaybind, bindable] + HRESULT accessKey([in] BSTR v); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_ACCESSKEY), displaybind, bindable] + HRESULT accessKey([retval, out] BSTR * p); + + [propput, id(DISPID_IHTMLCONTROLELEMENT_ONBLUR), displaybind, bindable] + HRESULT onblur([in] VARIANT v); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_ONBLUR), displaybind, bindable] + HRESULT onblur([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLCONTROLELEMENT_ONFOCUS), displaybind, bindable] + HRESULT onfocus([in] VARIANT v); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_ONFOCUS), displaybind, bindable] + HRESULT onfocus([retval, out] VARIANT * p); + + [propput, id(DISPID_IHTMLCONTROLELEMENT_ONRESIZE), displaybind, bindable] + HRESULT onresize([in] VARIANT v); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_ONRESIZE), displaybind, bindable] + HRESULT onresize([retval, out] VARIANT * p); + + [id(DISPID_IHTMLCONTROLELEMENT_BLUR)] + HRESULT blur(); + + [id(DISPID_IHTMLCONTROLELEMENT_ADDFILTER)] + HRESULT addFilter([in] IUnknown* pUnk); + + [id(DISPID_IHTMLCONTROLELEMENT_REMOVEFILTER)] + HRESULT removeFilter([in] IUnknown* pUnk); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_CLIENTHEIGHT), displaybind, bindable] + HRESULT clientHeight([retval, out] long * p); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_CLIENTWIDTH), displaybind, bindable] + HRESULT clientWidth([retval, out] long * p); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_CLIENTTOP), displaybind, bindable] + HRESULT clientTop([retval, out] long * p); + + [propget, id(DISPID_IHTMLCONTROLELEMENT_CLIENTLEFT), displaybind, bindable] + HRESULT clientLeft([retval, out] long * p); +}; + +/***************************************************************************** + * IHTMLBodyElement interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f1d8-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLBodyElement : IDispatch +{ + [propput, id(DISPID_IHTMLBODYELEMENT_BACKGROUND), displaybind, bindable] + HRESULT background([in] BSTR v); + + [propget, id(DISPID_IHTMLBODYELEMENT_BACKGROUND), displaybind, bindable] + HRESULT background([retval, out] BSTR *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_BGPROPERTIES), displaybind, bindable] + HRESULT bgProperties([in] BSTR v); + + [propget, id(DISPID_IHTMLBODYELEMENT_BGPROPERTIES), displaybind, bindable] + HRESULT bgProperties([retval, out] BSTR *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_LEFTMARGIN), displaybind, bindable] + HRESULT leftMargin([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_LEFTMARGIN), displaybind, bindable] + HRESULT leftMargin([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_TOPMARGIN), displaybind, bindable] + HRESULT topMargin([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_TOPMARGIN), displaybind, bindable] + HRESULT topMargin([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_RIGHTMARGIN), displaybind, bindable] + HRESULT rightMargin([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_RIGHTMARGIN), displaybind, bindable] + HRESULT rightMargin([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_BOTTOMMARGIN), displaybind, bindable] + HRESULT bottomMargin([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_BOTTOMMARGIN), displaybind, bindable] + HRESULT bottomMargin([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_NOWRAP), displaybind, bindable] + HRESULT noWrap([in] VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLBODYELEMENT_NOWRAP), displaybind, bindable] + HRESULT noWrap([retval, out] VARIANT_BOOL *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_BGCOLOR), displaybind, bindable] + HRESULT bgColor([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_BGCOLOR), displaybind, bindable] + HRESULT bgColor([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_TEXT), displaybind, bindable] + HRESULT text([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_TEXT), displaybind, bindable] + HRESULT text([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_LINK), displaybind, bindable] + HRESULT link([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_LINK), displaybind, bindable] + HRESULT link([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_VLINK), displaybind, bindable] + HRESULT vLink([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_VLINK), displaybind, bindable] + HRESULT vLink([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_ALINK), displaybind, bindable] + HRESULT aLink([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_ALINK), displaybind, bindable] + HRESULT aLink([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_ONLOAD), displaybind, bindable] + HRESULT onload([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_ONLOAD), displaybind, bindable] + HRESULT onload([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_ONUNLOAD), displaybind, bindable] + HRESULT onunload([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_ONUNLOAD), displaybind, bindable] + HRESULT onunload([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_SCROLL), displaybind, bindable] + HRESULT scroll([in] BSTR v); + + [propget, id(DISPID_IHTMLBODYELEMENT_SCROLL), displaybind, bindable] + HRESULT scroll([retval, out] BSTR *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_ONSELECT), displaybind, bindable] + HRESULT onselect([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_ONSELECT), displaybind, bindable] + HRESULT onselect([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT_ONBEFOREUNLOAD), displaybind, bindable] + HRESULT onbeforeunload([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT_ONBEFOREUNLOAD), displaybind, bindable] + HRESULT onbeforeunload([retval, out] VARIANT *p); + + [id(DISPID_IHTMLBODYELEMENT_CREATETEXTRANGE)] + HRESULT createTextRange([retval, out] IHTMLTxtRange **range); +} + +/***************************************************************************** + * IHTMLBodyElement2 interface + */ +[ + odl, + oleautomation, + dual, + uuid(3050f5c5-98b5-11cf-bb82-00aa00bdce0b) +] +interface IHTMLBodyElement2 : IDispatch +{ + [propput, id(DISPID_IHTMLBODYELEMENT2_ONBEFOREPRINT), displaybind, bindable] + HRESULT onbeforeprint([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT2_ONBEFOREPRINT), displaybind, bindable] + HRESULT onbeforeprint([retval, out] VARIANT *p); + + [propput, id(DISPID_IHTMLBODYELEMENT2_ONAFTERPRINT), displaybind, bindable] + HRESULT onafterprint([in] VARIANT v); + + [propget, id(DISPID_IHTMLBODYELEMENT2_ONAFTERPRINT), displaybind, bindable] + HRESULT onafterprint([retval, out] VARIANT *p); +} + +[ + hidden, + uuid(3050f507-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface DispHTMLBody +{ +properties: +methods: + [id(DISPID_IHTMLELEMENT_SETATTRIBUTE)] + void setAttribute( + [in] BSTR strAttributeName, + [in] VARIANT AttValue, + [defaultvalue(1), in] LONG lFlags); + + [id(DISPID_IHTMLELEMENT_GETATTRIBUTE)] + VARIANT getAttribute( + [in] BSTR strAttributeName, + [defaultvalue(0), in] LONG lFlags); + + [id(DISPID_IHTMLELEMENT_REMOVEATTRIBUTE)] + VARIANT_BOOL removeAttribute( + [in] BSTR strAttributeName, + [defaultvalue(1), in] LONG lFlags); + + [propput, id(DISPID_IHTMLELEMENT_CLASSNAME), bindable] + void className(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_CLASSNAME), bindable] + BSTR className(); + + [propput, id(DISPID_IHTMLELEMENT_ID), bindable] + void id(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_ID), bindable] + BSTR id(); + + [propget, id(DISPID_IHTMLELEMENT_TAGNAME)] + BSTR tagName(); + + [propget, id(DISPID_IHTMLELEMENT_PARENTELEMENT)] + IHTMLElement* parentElement(); + + [propget, id(DISPID_IHTMLELEMENT_STYLE), nonbrowsable] + IHTMLStyle* style(); + + [propput, id(DISPID_IHTMLELEMENT_ONHELP), displaybind, bindable] + void onhelp(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONHELP), displaybind, bindable] + VARIANT onhelp(); + + [propput, id(DISPID_IHTMLELEMENT_ONCLICK), displaybind, bindable] + void onclick(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONCLICK), displaybind, bindable] + VARIANT onclick(); + + [propput, id(DISPID_IHTMLELEMENT_ONDBLCLICK), displaybind, bindable] + void ondblclick(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONDBLCLICK), displaybind, bindable] + VARIANT ondblclick(); + + [propput, id(DISPID_IHTMLELEMENT_ONKEYDOWN), displaybind, bindable] + void onkeydown(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONKEYDOWN), displaybind, bindable] + VARIANT onkeydown(); + + [propput, id(DISPID_IHTMLELEMENT_ONKEYUP), displaybind, bindable] + void onkeyup(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONKEYUP), displaybind, bindable] + VARIANT onkeyup(); + + [propput, id(DISPID_IHTMLELEMENT_ONKEYPRESS), displaybind, bindable] + void onkeypress(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONKEYPRESS), displaybind, bindable] + VARIANT onkeypress(); + + [propput, id(DISPID_IHTMLELEMENT_ONMOUSEOUT), displaybind, bindable] + void onmouseout(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONMOUSEOUT), displaybind, bindable] + VARIANT onmouseout(); + + [propput, id(DISPID_IHTMLELEMENT_ONMOUSEOVER), displaybind, bindable] + void onmouseover(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONMOUSEOVER), displaybind, bindable] + VARIANT onmouseover(); + + [propput, id(DISPID_IHTMLELEMENT_ONMOUSEMOVE), displaybind, bindable] + void onmousemove(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONMOUSEMOVE), displaybind, bindable] + VARIANT onmousemove(); + + [propput, id(DISPID_IHTMLELEMENT_ONMOUSEDOWN), displaybind, bindable] + void onmousedown(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONMOUSEDOWN), displaybind, bindable] + VARIANT onmousedown(); + + [propput, id(DISPID_IHTMLELEMENT_ONMOUSEUP), displaybind, bindable] + void onmouseup(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONMOUSEUP), displaybind, bindable] + VARIANT onmouseup(); + + [propget, id(DISPID_IHTMLELEMENT_DOCUMENT)] IDispatch* document(); + + [propput, id(DISPID_IHTMLELEMENT_TITLE), displaybind, bindable] + void title(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_TITLE), displaybind, bindable] + BSTR title(); + + [propput, id(DISPID_IHTMLELEMENT_LANGUAGE), displaybind, bindable] + void language(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_LANGUAGE), displaybind, bindable] + BSTR language(); + + [propput, id(DISPID_IHTMLELEMENT_ONSELECTSTART), displaybind, bindable] + void onselectstart(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONSELECTSTART), displaybind, bindable] + VARIANT onselectstart(); + + [id(DISPID_IHTMLELEMENT_SCROLLINTOVIEW)] + void scrollIntoView([optional, in] VARIANT varargStart); + + [id(DISPID_IHTMLELEMENT_CONTAINS)] + VARIANT_BOOL contains([in] IHTMLElement* pChild); + + [propget, id(DISPID_IHTMLELEMENT_SOURCEINDEX), bindable] + long sourceIndex(); + + [propget, id(DISPID_IHTMLELEMENT_RECORDNUMBER)] + VARIANT recordNumber(); + + [propput, id(DISPID_IHTMLELEMENT_LANG)] + void lang(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_LANG)] + BSTR lang(); + + [propget, id(DISPID_IHTMLELEMENT_OFFSETLEFT)] + long offsetLeft(); + + [propget, id(DISPID_IHTMLELEMENT_OFFSETTOP)] + long offsetTop(); + + [propget, id(DISPID_IHTMLELEMENT_OFFSETWIDTH)] + long offsetWidth(); + + [propget, id(DISPID_IHTMLELEMENT_OFFSETHEIGHT)] + long offsetHeight(); + + [propget, id(DISPID_IHTMLELEMENT_OFFSETPARENT)] + IHTMLElement* offsetParent(); + + [propput, id(DISPID_IHTMLELEMENT_INNERHTML)] + void innerHTML(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_INNERHTML)] + BSTR innerHTML(); + + [propput, id(DISPID_IHTMLELEMENT_INNERTEXT)] + void innerText(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_INNERTEXT)] + BSTR innerText(); + + [propput, id(DISPID_IHTMLELEMENT_OUTERHTML)] + void outerHTML(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_OUTERHTML)] + BSTR outerHTML(); + + [propput, id(DISPID_IHTMLELEMENT_OUTERTEXT)] + void outerText(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT_OUTERTEXT)] + BSTR outerText(); + + [id(DISPID_IHTMLELEMENT_INSERTADJACENTHTML)] + void insertAdjacentHTML( + [in] BSTR where, + [in] BSTR html); + + [id(DISPID_IHTMLELEMENT_INSERTADJACENTTEXT)] + void insertAdjacentText( + [in] BSTR where, + [in] BSTR text); + + [propget, id(DISPID_IHTMLELEMENT_PARENTTEXTEDIT)] + IHTMLElement* parentTextEdit(); + + [propget, id(DISPID_IHTMLELEMENT_ISTEXTEDIT)] + VARIANT_BOOL isTextEdit(); + + [id(DISPID_IHTMLELEMENT_CLICK)] void click(); + + [propget, id(DISPID_IHTMLELEMENT_FILTERS)] + IHTMLFiltersCollection* filters(); + + [propput, id(DISPID_IHTMLELEMENT_ONDRAGSTART), displaybind, bindable] + void ondragstart(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONDRAGSTART), displaybind, bindable] + VARIANT ondragstart(); + + [id(DISPID_IHTMLELEMENT_TOSTRING)] + BSTR toString(); + + [propput, id(DISPID_IHTMLELEMENT_ONBEFOREUPDATE), displaybind, bindable] + void onbeforeupdate(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONBEFOREUPDATE), displaybind, bindable] + VARIANT onbeforeupdate(); + + [propput, id(DISPID_IHTMLELEMENT_ONAFTERUPDATE), displaybind, bindable] + void onafterupdate(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONAFTERUPDATE), displaybind, bindable] + VARIANT onafterupdate(); + + [propput, id(DISPID_IHTMLELEMENT_ONERRORUPDATE), displaybind, bindable] + void onerrorupdate(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONERRORUPDATE), displaybind, bindable] + VARIANT onerrorupdate(); + + [propput, id(DISPID_IHTMLELEMENT_ONROWEXIT), displaybind, bindable] + void onrowexit(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONROWEXIT), displaybind, bindable] + VARIANT onrowexit(); + + [propput, id(DISPID_IHTMLELEMENT_ONROWENTER), displaybind, bindable] + void onrowenter(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONROWENTER), displaybind, bindable] + VARIANT onrowenter(); + + [propput, id(DISPID_IHTMLELEMENT_ONDATASETCHANGED), displaybind, bindable] + void ondatasetchanged(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONDATASETCHANGED), displaybind, bindable] + VARIANT ondatasetchanged(); + + [propput, id(DISPID_IHTMLELEMENT_ONDATAAVAILABLE), displaybind, bindable] + void ondataavailable(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONDATAAVAILABLE), displaybind, bindable] + VARIANT ondataavailable(); + + [propput, id(DISPID_IHTMLELEMENT_ONDATASETCOMPLETE), displaybind, bindable] + void ondatasetcomplete(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONDATASETCOMPLETE), displaybind, bindable] + VARIANT ondatasetcomplete(); + + [propput, id(DISPID_IHTMLELEMENT_ONFILTERCHANGE), displaybind, bindable] + void onfilterchange(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT_ONFILTERCHANGE), displaybind, bindable] + VARIANT onfilterchange(); + + [propget, id(DISPID_IHTMLELEMENT_CHILDREN)] + IDispatch* children(); + + [propget, id(DISPID_IHTMLELEMENT_ALL)] + IDispatch* all(); + + [propget, id(DISPID_IHTMLELEMENT2_SCOPENAME)] + BSTR scopeName(); + + [id(DISPID_IHTMLELEMENT2_SETCAPTURE)] + void setCapture([defaultvalue(-1), in] VARIANT_BOOL containerCapture); + + [id(DISPID_IHTMLELEMENT2_RELEASECAPTURE)] + void releaseCapture(); + + [propput, id(DISPID_IHTMLELEMENT2_ONLOSECAPTURE), displaybind, bindable] + void onlosecapture(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONLOSECAPTURE), displaybind, bindable] + VARIANT onlosecapture(); + + [id(DISPID_IHTMLELEMENT2_COMPONENTFROMPOINT)] + BSTR componentFromPoint([in] long x,[in] long y); + + [id(DISPID_IHTMLELEMENT2_DOSCROLL)] + void doScroll([optional, in] VARIANT component); + + [propput, id(DISPID_IHTMLELEMENT2_ONSCROLL), displaybind, bindable] + void onscroll(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONSCROLL), displaybind, bindable] + VARIANT onscroll(); + + [propput, id(DISPID_IHTMLELEMENT2_ONDRAG), displaybind, bindable] + void ondrag(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONDRAG), displaybind, bindable] + VARIANT ondrag(); + + [propput, id(DISPID_IHTMLELEMENT2_ONDRAGEND), displaybind, bindable] + void ondragend(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONDRAGEND), displaybind, bindable] + VARIANT ondragend(); + + [propput, id(DISPID_IHTMLELEMENT2_ONDRAGENTER), displaybind, bindable] + void ondragenter(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONDRAGENTER), displaybind, bindable] + VARIANT ondragenter(); + + [propput, id(DISPID_IHTMLELEMENT2_ONDRAGOVER), displaybind, bindable] + void ondragover(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONDRAGOVER), displaybind, bindable] + VARIANT ondragover(); + + [propput, id(DISPID_IHTMLELEMENT2_ONDRAGLEAVE), displaybind, bindable] + void ondragleave(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONDRAGLEAVE), displaybind, bindable] + VARIANT ondragleave(); + + [propput, id(DISPID_IHTMLELEMENT2_ONDROP), displaybind, bindable] + void ondrop(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONDROP), displaybind, bindable] + VARIANT ondrop(); + + [propput, id(DISPID_IHTMLELEMENT2_ONBEFORECUT), displaybind, bindable] + void onbeforecut(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONBEFORECUT), displaybind, bindable] + VARIANT onbeforecut(); + + [propput, id(DISPID_IHTMLELEMENT2_ONCUT), displaybind, bindable] + void oncut(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONCUT), displaybind, bindable] + VARIANT oncut(); + + [propput, id(DISPID_IHTMLELEMENT2_ONBEFORECOPY), displaybind, bindable] + void onbeforecopy(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONBEFORECOPY), displaybind, bindable] + VARIANT onbeforecopy(); + + [propput, id(DISPID_IHTMLELEMENT2_ONCOPY), displaybind, bindable] + void oncopy(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONCOPY), displaybind, bindable] + VARIANT oncopy(); + + [propput, id(DISPID_IHTMLELEMENT2_ONBEFOREPASTE), displaybind, bindable] + void onbeforepaste(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONBEFOREPASTE), displaybind, bindable] + VARIANT onbeforepaste(); + + [propput, id(DISPID_IHTMLELEMENT2_ONPASTE), displaybind, bindable] + void onpaste(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONPASTE), displaybind, bindable] + VARIANT onpaste(); + + [propget, id(DISPID_IHTMLELEMENT2_CURRENTSTYLE), nonbrowsable] + IHTMLCurrentStyle* currentStyle(); + + [propput, id(DISPID_IHTMLELEMENT2_ONPROPERTYCHANGE), displaybind, bindable] + void onpropertychange(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONPROPERTYCHANGE), displaybind, bindable] + VARIANT onpropertychange(); + + [id(DISPID_IHTMLELEMENT2_GETCLIENTRECTS)] + IHTMLRectCollection* getClientRects(); + + [id(DISPID_IHTMLELEMENT2_GETBOUNDINGCLIENTRECT)] + IHTMLRect* getBoundingClientRect(); + + [id(DISPID_IHTMLELEMENT2_SETEXPRESSION)] + void setExpression( + [in] BSTR propname, + [in] BSTR expr, + [defaultvalue(""), in] BSTR lang); + + [id(DISPID_IHTMLELEMENT2_GETEXPRESSION)] + VARIANT getExpression([in] BSTR propname); + + [id(DISPID_IHTMLELEMENT2_REMOVEEXPRESSION)] + VARIANT_BOOL removeExpression([in] BSTR propname); + + [propput, id(DISPID_IHTMLELEMENT2_TABINDEX), displaybind, bindable] + void tabIndex(short v); + + [propget, id(DISPID_IHTMLELEMENT2_TABINDEX), displaybind, bindable] + short tabIndex(); + + [id(DISPID_IHTMLELEMENT2_FOCUS)] + void focus(); + + [propput, id(DISPID_IHTMLELEMENT2_ACCESSKEY), displaybind, bindable] + void accessKey(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT2_ACCESSKEY), displaybind, bindable] + BSTR accessKey(); + + [propput, id(DISPID_IHTMLELEMENT2_ONBLUR), displaybind, bindable] + void onblur(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONBLUR), displaybind, bindable] + VARIANT onblur(); + + [propput, id(DISPID_IHTMLELEMENT2_ONFOCUS), displaybind, bindable] + void onfocus(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONFOCUS), displaybind, bindable] + VARIANT onfocus(); + + [propput, id(DISPID_IHTMLELEMENT2_ONRESIZE), displaybind, bindable] + void onresize(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONRESIZE), displaybind, bindable] + VARIANT onresize(); + + [id(DISPID_IHTMLELEMENT2_BLUR)] + void blur(); + + [id(DISPID_IHTMLELEMENT2_ADDFILTER)] + void addFilter([in] IUnknown* pUnk); + + [id(DISPID_IHTMLELEMENT2_REMOVEFILTER)] + void removeFilter([in] IUnknown* pUnk); + + [propget, id(DISPID_IHTMLELEMENT2_CLIENTHEIGHT), displaybind, bindable] + long clientHeight(); + + [propget, id(DISPID_IHTMLELEMENT2_CLIENTWIDTH), displaybind, bindable] + long clientWidth(); + + [propget, id(DISPID_IHTMLELEMENT2_CLIENTTOP), displaybind, bindable] + long clientTop(); + + [propget, id(DISPID_IHTMLELEMENT2_CLIENTLEFT), displaybind, bindable] + long clientLeft(); + + [id(DISPID_IHTMLELEMENT2_ATTACHEVENT)] + VARIANT_BOOL attachEvent( + [in] BSTR event, + [in] IDispatch* pDisp); + + [id(DISPID_IHTMLELEMENT2_DETACHEVENT)] + void detachEvent( + [in] BSTR event, + [in] IDispatch* pDisp); + + [propget, id(DISPID_IHTMLELEMENT2_READYSTATE)] VARIANT readyState(); + + [propput, id(DISPID_IHTMLELEMENT2_ONREADYSTATECHANGE), displaybind, bindable] + void onreadystatechange(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONREADYSTATECHANGE), displaybind, bindable] + VARIANT onreadystatechange(); + + [propput, id(DISPID_IHTMLELEMENT2_ONROWSDELETE), displaybind, bindable] + void onrowsdelete(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONROWSDELETE), displaybind, bindable] + VARIANT onrowsdelete(); + + [propput, id(DISPID_IHTMLELEMENT2_ONROWSINSERTED), displaybind, bindable] + void onrowsinserted(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONROWSINSERTED), displaybind, bindable] + VARIANT onrowsinserted(); + + [propput, id(DISPID_IHTMLELEMENT2_ONCELLCHANGE), displaybind, bindable] + void oncellchange(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONCELLCHANGE), displaybind, bindable] + VARIANT oncellchange(); + + [propput, id(DISPID_IHTMLELEMENT2_DIR), displaybind, bindable] + void dir(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT2_DIR), displaybind, bindable] + BSTR dir(); + + [id(DISPID_IHTMLELEMENT2_CREATECONTROLRANGE)] + IDispatch* createControlRange(); + + [propget, id(DISPID_IHTMLELEMENT2_SCROLLHEIGHT), displaybind, bindable] + long scrollHeight(); + + [propget, id(DISPID_IHTMLELEMENT2_SCROLLWIDTH), displaybind, bindable] + long scrollWidth(); + + [propput, id(DISPID_IHTMLELEMENT2_SCROLLTOP), displaybind, bindable] + void scrollTop(long v); + + [propget, id(DISPID_IHTMLELEMENT2_SCROLLTOP), displaybind, bindable] + long scrollTop(); + + [propput, id(DISPID_IHTMLELEMENT2_SCROLLLEFT), displaybind, bindable] + void scrollLeft(long v); + + [propget, id(DISPID_IHTMLELEMENT2_SCROLLLEFT), displaybind, bindable] + long scrollLeft(); + + [id(DISPID_IHTMLELEMENT2_CLEARATTRIBUTES)] + void clearAttributes(); + + [propput, id(DISPID_IHTMLELEMENT2_ONCONTEXTMENU), displaybind, bindable] + void oncontextmenu(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONCONTEXTMENU), displaybind, bindable] + VARIANT oncontextmenu(); + + [id(DISPID_IHTMLELEMENT2_INSERTADJACENTELEMENT)] + IHTMLElement* insertAdjacentElement( + [in] BSTR where, + [in] IHTMLElement* insertedElement); + + [id(DISPID_IHTMLELEMENT2_APPLYELEMENT)] + IHTMLElement* applyElement([in] IHTMLElement* apply,[in] BSTR where); + + [id(DISPID_IHTMLELEMENT2_GETADJACENTTEXT)] + BSTR getAdjacentText([in] BSTR where); + + [id(DISPID_IHTMLELEMENT2_REPLACEADJACENTTEXT)] + BSTR replaceAdjacentText([in] BSTR where,[in] BSTR newText); + + [propget, id(DISPID_IHTMLELEMENT2_CANHAVECHILDREN)] + VARIANT_BOOL canHaveChildren(); + + [id(DISPID_IHTMLELEMENT2_ADDBEHAVIOR)] + long addBehavior([in] BSTR bstrUrl,[optional, in] VARIANT* pvarFactory); + + [id(DISPID_IHTMLELEMENT2_REMOVEBEHAVIOR)] + VARIANT_BOOL removeBehavior([in] long cookie); + + [propget, id(DISPID_IHTMLELEMENT2_RUNTIMESTYLE), nonbrowsable] + IHTMLStyle* runtimeStyle(); + + [propget, id(DISPID_IHTMLELEMENT2_BEHAVIORURNS)] + IDispatch* behaviorUrns(); + + [propput, id(DISPID_IHTMLELEMENT2_TAGURN)] + void tagUrn(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT2_TAGURN)] + BSTR tagUrn(); + + [propput, id(DISPID_IHTMLELEMENT2_ONBEFOREEDITFOCUS), displaybind, bindable] + void onbeforeeditfocus(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT2_ONBEFOREEDITFOCUS), displaybind, bindable] + VARIANT onbeforeeditfocus(); + + [propget, id(DISPID_IHTMLELEMENT2_READYSTATEVALUE), hidden, restricted] + long readyStateValue(); + + [id(DISPID_IHTMLELEMENT2_GETELEMENTSBYTAGNAME)] + IHTMLElementCollection* getElementsByTagName([in] BSTR v); + + [id(DISPID_IHTMLELEMENT3_MERGEATTRIBUTES)] + void mergeAttributes( + [in] IHTMLElement* mergeThis, + [optional, in] VARIANT* pvarFlags); + + [propget, id(DISPID_IHTMLELEMENT3_ISMULTILINE)] + VARIANT_BOOL isMultiLine(); + + [propget, id(DISPID_IHTMLELEMENT3_CANHAVEHTML)] + VARIANT_BOOL canHaveHTML(); + + [propput, id(DISPID_IHTMLELEMENT3_ONLAYOUTCOMPLETE), displaybind, bindable] + void onlayoutcomplete(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONLAYOUTCOMPLETE), displaybind, bindable] + VARIANT onlayoutcomplete(); + + [propput, id(DISPID_IHTMLELEMENT3_ONPAGE), displaybind, bindable] + void onpage(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONPAGE), displaybind, bindable] + VARIANT onpage(); + + [propput, id(DISPID_IHTMLELEMENT3_INFLATEBLOCK), hidden, restricted, nonbrowsable] + void inflateBlock(VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLELEMENT3_INFLATEBLOCK), hidden, restricted, nonbrowsable] + VARIANT_BOOL inflateBlock(); + + [propput, id(DISPID_IHTMLELEMENT3_ONBEFOREDEACTIVATE), displaybind, bindable] + void onbeforedeactivate(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONBEFOREDEACTIVATE), displaybind, bindable] + VARIANT onbeforedeactivate(); + + [id(DISPID_IHTMLELEMENT3_SETACTIVE)] + void setActive(); + + [propput, id(DISPID_IHTMLELEMENT3_CONTENTEDITABLE), displaybind, bindable] + void contentEditable(BSTR v); + + [propget, id(DISPID_IHTMLELEMENT3_CONTENTEDITABLE), displaybind, bindable] + BSTR contentEditable(); + + [propget, id(DISPID_IHTMLELEMENT3_ISCONTENTEDITABLE)] + VARIANT_BOOL isContentEditable(); + + [propput, id(DISPID_IHTMLELEMENT3_HIDEFOCUS), displaybind, bindable] + void hideFocus(VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLELEMENT3_HIDEFOCUS), displaybind, bindable] + VARIANT_BOOL hideFocus(); + + [propput, id(DISPID_IHTMLELEMENT3_DISABLED), displaybind, bindable] + void disabled(VARIANT_BOOL v); + + [propget, id(DISPID_IHTMLELEMENT3_DISABLED), displaybind, bindable] + VARIANT_BOOL disabled(); + + [propget, id(DISPID_IHTMLELEMENT3_ISDISABLED)] + VARIANT_BOOL isDisabled(); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOVE), displaybind, bindable] + void onmove(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOVE), displaybind, bindable] + VARIANT onmove(); + + [propput, id(DISPID_IHTMLELEMENT3_ONCONTROLSELECT), displaybind, bindable] + void oncontrolselect(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONCONTROLSELECT), displaybind, bindable] + VARIANT oncontrolselect(); + + [id(DISPID_IHTMLELEMENT3_FIREEVENT)] + VARIANT_BOOL fireEvent( + [in] BSTR bstrEventName, + [optional, in] VARIANT* pvarEventObject); + + [propput, id(DISPID_IHTMLELEMENT3_ONRESIZESTART), displaybind, bindable] + void onresizestart(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONRESIZESTART), displaybind, bindable] + VARIANT onresizestart(); + + [propput, id(DISPID_IHTMLELEMENT3_ONRESIZEEND), displaybind, bindable] + void onresizeend(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONRESIZEEND), displaybind, bindable] + VARIANT onresizeend(); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOVESTART), displaybind, bindable] + void onmovestart(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOVESTART), displaybind, bindable] + VARIANT onmovestart(); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOVEEND), displaybind, bindable] + void onmoveend(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOVEEND), displaybind, bindable] + VARIANT onmoveend(); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOUSEENTER), displaybind, bindable] + void onmouseenter(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOUSEENTER), displaybind, bindable] + VARIANT onmouseenter(); + + [propput, id(DISPID_IHTMLELEMENT3_ONMOUSELEAVE), displaybind, bindable] + void onmouseleave(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONMOUSELEAVE), displaybind, bindable] + VARIANT onmouseleave(); + + [propput, id(DISPID_IHTMLELEMENT3_ONACTIVATE), displaybind, bindable] + void onactivate(VARIANT v); + [propget, id(DISPID_IHTMLELEMENT3_ONACTIVATE), displaybind, bindable] VARIANT onactivate(); + + [propput, id(DISPID_IHTMLELEMENT3_ONDEACTIVATE), displaybind, bindable] + void ondeactivate(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT3_ONDEACTIVATE), displaybind, bindable] + VARIANT ondeactivate(); + + [id(DISPID_IHTMLELEMENT3_DRAGDROP)] + VARIANT_BOOL dragDrop(); + + [propget, id(DISPID_IHTMLELEMENT3_GLYPHMODE), hidden, restricted, nonbrowsable] + LONG glyphMode(); + + [propput, id(DISPID_IHTMLELEMENT4_ONMOUSEWHEEL), displaybind, bindable] + void onmousewheel(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT4_ONMOUSEWHEEL), displaybind, bindable] + VARIANT onmousewheel(); + + [id(DISPID_IHTMLELEMENT4_NORMALIZE)] + void normalize(); + + [id(DISPID_IHTMLELEMENT4_GETATTRIBUTENODE)] + IHTMLDOMAttribute* getAttributeNode([in] BSTR bstrname); + + [id(DISPID_IHTMLELEMENT4_SETATTRIBUTENODE)] + IHTMLDOMAttribute* setAttributeNode([in] IHTMLDOMAttribute* pattr); + + [id(DISPID_IHTMLELEMENT4_REMOVEATTRIBUTENODE)] + IHTMLDOMAttribute* removeAttributeNode([in] IHTMLDOMAttribute* pattr); + + [propput, id(DISPID_IHTMLELEMENT4_ONBEFOREACTIVATE), displaybind, bindable] + void onbeforeactivate(VARIANT v); + + [propget, id(DISPID_IHTMLELEMENT4_ONBEFOREACTIVATE), displaybind, bindable] + VARIANT onbeforeactivate(); + + [propput, id(DISPID_IHTMLELEMENT4_ONFOCUSIN), displaybind, bindable] + void onfocusin(VARIANT v); - [propget, id(DISPID_IHTMLIMGELEMENT_LOWSRC), displaybind, bindable] - BSTR lowsrc(); + [propget, id(DISPID_IHTMLELEMENT4_ONFOCUSIN), displaybind, bindable] + VARIANT onfocusin(); - [propput, id(DISPID_IHTMLIMGELEMENT_VRML), displaybind, bindable] - void vrml(BSTR v); + [propput, id(DISPID_IHTMLELEMENT4_ONFOCUSOUT), displaybind, bindable] + void onfocusout(VARIANT v); - [propget, id(DISPID_IHTMLIMGELEMENT_VRML), displaybind, bindable] - BSTR vrml(); + [propget, id(DISPID_IHTMLELEMENT4_ONFOCUSOUT), displaybind, bindable] + VARIANT onfocusout(); - [propput, id(DISPID_IHTMLIMGELEMENT_DYNSRC), displaybind, bindable] - void dynsrc(BSTR v); + [propget, id(DISPID_IHTMLUNIQUENAME_UNIQUENUMBER), hidden] + long uniqueNumber(); - [propget, id(DISPID_IHTMLIMGELEMENT_DYNSRC), displaybind, bindable] - BSTR dynsrc(); + [propget, id(DISPID_IHTMLUNIQUENAME_UNIQUEID), hidden] + BSTR uniqueID(); - [propget, id(DISPID_IHTMLIMGELEMENT_COMPLETE)] - VARIANT_BOOL complete(); + [propget, id(DISPID_IHTMLDOMNODE_NODETYPE)] + long nodeType(); - [propput, id(DISPID_IHTMLIMGELEMENT_LOOP), displaybind, bindable] - void loop(VARIANT v); + [propget, id(DISPID_IHTMLDOMNODE_PARENTNODE)] + IHTMLDOMNode* parentNode(); - [propget, id(DISPID_IHTMLIMGELEMENT_LOOP), displaybind, bindable] - VARIANT loop(); + [id(DISPID_IHTMLDOMNODE_HASCHILDNODES)] + VARIANT_BOOL hasChildNodes(); - [propput, id(DISPID_IHTMLIMGELEMENT_ALIGN), displaybind, bindable] - void align(BSTR v); + [propget, id(DISPID_IHTMLDOMNODE_CHILDNODES)] + IDispatch* childNodes(); - [propget, id(DISPID_IHTMLIMGELEMENT_ALIGN), displaybind, bindable] - BSTR align(); + [propget, id(DISPID_IHTMLDOMNODE_ATTRIBUTES)] + IDispatch* attributes(); - [propput, id(DISPID_IHTMLIMGELEMENT_ONLOAD), displaybind, bindable] - void onload(VARIANT v); + [id(DISPID_IHTMLDOMNODE_INSERTBEFORE)] + IHTMLDOMNode* insertBefore( + [in] IHTMLDOMNode* newChild, + [optional, in] VARIANT refChild); - [propget, id(DISPID_IHTMLIMGELEMENT_ONLOAD), displaybind, bindable] - VARIANT onload(); + [id(DISPID_IHTMLDOMNODE_REMOVECHILD)] + IHTMLDOMNode* removeChild([in] IHTMLDOMNode* oldChild); - [propput, id(DISPID_IHTMLIMGELEMENT_ONERROR), displaybind, bindable] - void onerror(VARIANT v); + [id(DISPID_IHTMLDOMNODE_REPLACECHILD)] + IHTMLDOMNode* replaceChild( + [in] IHTMLDOMNode* newChild, + [in] IHTMLDOMNode* oldChild); - [propget, id(DISPID_IHTMLIMGELEMENT_ONERROR), displaybind, bindable] - VARIANT onerror(); + [id(DISPID_IHTMLDOMNODE_CLONENODE)] + IHTMLDOMNode* cloneNode([in] VARIANT_BOOL fDeep); - [propput, id(DISPID_IHTMLIMGELEMENT_ONABORT), displaybind, bindable] - void onabort(VARIANT v); + [id(DISPID_IHTMLDOMNODE_REMOVENODE)] + IHTMLDOMNode* removeNode([defaultvalue(0), in] VARIANT_BOOL fDeep); - [propget, id(DISPID_IHTMLIMGELEMENT_ONABORT), displaybind, bindable] - VARIANT onabort(); + [id(DISPID_IHTMLDOMNODE_SWAPNODE)] + IHTMLDOMNode* swapNode([in] IHTMLDOMNode* otherNode); - [propput, id(DISPID_IHTMLIMGELEMENT_NAME), displaybind, bindable] - void name(BSTR v); + [id(DISPID_IHTMLDOMNODE_REPLACENODE)] + IHTMLDOMNode* replaceNode([in] IHTMLDOMNode* replacement); - [propget, id(DISPID_IHTMLIMGELEMENT_NAME), displaybind, bindable] - BSTR name(); + [id(DISPID_IHTMLDOMNODE_APPENDCHILD)] + IHTMLDOMNode* appendChild([in] IHTMLDOMNode* newChild); - [propput, id(DISPID_IHTMLIMGELEMENT_WIDTH)] - void width(long v); + [propget, id(DISPID_IHTMLDOMNODE_NODENAME)] + BSTR nodeName(); - [propget, id(DISPID_IHTMLIMGELEMENT_WIDTH)] - long width(); + [propput, id(DISPID_IHTMLDOMNODE_NODEVALUE)] + void nodeValue(VARIANT v); - [propput, id(DISPID_IHTMLIMGELEMENT_HEIGHT)] - void height(long v); + [propget, id(DISPID_IHTMLDOMNODE_NODEVALUE)] + VARIANT nodeValue(); - [propget, id(DISPID_IHTMLIMGELEMENT_HEIGHT)] - long height(); + [propget, id(DISPID_IHTMLDOMNODE_FIRSTCHILD)] + IHTMLDOMNode* firstChild(); - [propput, id(DISPID_IHTMLIMGELEMENT_START), displaybind, bindable] - void start(BSTR v); + [propget, id(DISPID_IHTMLDOMNODE_LASTCHILD)] + IHTMLDOMNode* lastChild(); - [propget, id(DISPID_IHTMLIMGELEMENT_START), displaybind, bindable] - BSTR start(); + [propget, id(DISPID_IHTMLDOMNODE_PREVIOUSSIBLING)] + IHTMLDOMNode* previousSibling(); - [propput, id(DISPID_IHTMLIMGELEMENT2_LONGDESC), displaybind, bindable] - void longDesc(BSTR v); + [propget, id(DISPID_IHTMLDOMNODE_NEXTSIBLING)] + IHTMLDOMNode* nextSibling(); - [propget, id(DISPID_IHTMLIMGELEMENT2_LONGDESC), displaybind, bindable] - BSTR longDesc(); -} + [propget, id(DISPID_IHTMLDOMNODE2_OWNERDOCUMENT)] + IDispatch* ownerDocument(); -/***************************************************************************** - * IHTMLBodyElement interface - */ -[ - odl, - oleautomation, - dual, - uuid(3050f1d8-98b5-11cf-bb82-00aa00bdce0b) -] -interface IHTMLBodyElement : IDispatch -{ [propput, id(DISPID_IHTMLBODYELEMENT_BACKGROUND), displaybind, bindable] - HRESULT background([in] BSTR v); + void background(BSTR v); [propget, id(DISPID_IHTMLBODYELEMENT_BACKGROUND), displaybind, bindable] - HRESULT background([retval, out] BSTR *p); + BSTR background(); [propput, id(DISPID_IHTMLBODYELEMENT_BGPROPERTIES), displaybind, bindable] - HRESULT bgProperties([in] BSTR v); + void bgProperties(BSTR v); [propget, id(DISPID_IHTMLBODYELEMENT_BGPROPERTIES), displaybind, bindable] - HRESULT bgProperties([retval, out] BSTR *p); + BSTR bgProperties(); [propput, id(DISPID_IHTMLBODYELEMENT_LEFTMARGIN), displaybind, bindable] - HRESULT leftMargin([in] VARIANT v); + void leftMargin(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_LEFTMARGIN), displaybind, bindable] - HRESULT leftMargin([retval, out] VARIANT *p); + VARIANT leftMargin(); [propput, id(DISPID_IHTMLBODYELEMENT_TOPMARGIN), displaybind, bindable] - HRESULT topMargin([in] VARIANT v); + void topMargin(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_TOPMARGIN), displaybind, bindable] - HRESULT topMargin([retval, out] VARIANT *p); + VARIANT topMargin(); [propput, id(DISPID_IHTMLBODYELEMENT_RIGHTMARGIN), displaybind, bindable] - HRESULT rightMargin([in] VARIANT v); + void rightMargin(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_RIGHTMARGIN), displaybind, bindable] - HRESULT rightMargin([retval, out] VARIANT *p); + VARIANT rightMargin(); [propput, id(DISPID_IHTMLBODYELEMENT_BOTTOMMARGIN), displaybind, bindable] - HRESULT bottomMargin([in] VARIANT v); + void bottomMargin(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_BOTTOMMARGIN), displaybind, bindable] - HRESULT bottomMargin([retval, out] VARIANT *p); + VARIANT bottomMargin(); [propput, id(DISPID_IHTMLBODYELEMENT_NOWRAP), displaybind, bindable] - HRESULT noWrap([in] VARIANT_BOOL v); + void noWrap(VARIANT_BOOL v); [propget, id(DISPID_IHTMLBODYELEMENT_NOWRAP), displaybind, bindable] - HRESULT noWrap([retval, out] VARIANT_BOOL *p); + VARIANT_BOOL noWrap(); [propput, id(DISPID_IHTMLBODYELEMENT_BGCOLOR), displaybind, bindable] - HRESULT bgColor([in] VARIANT v); + void bgColor(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_BGCOLOR), displaybind, bindable] - HRESULT bgColor([retval, out] VARIANT *p); + VARIANT bgColor(); [propput, id(DISPID_IHTMLBODYELEMENT_TEXT), displaybind, bindable] - HRESULT text([in] VARIANT v); + void text(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_TEXT), displaybind, bindable] - HRESULT text([retval, out] VARIANT *p); + VARIANT text(); [propput, id(DISPID_IHTMLBODYELEMENT_LINK), displaybind, bindable] - HRESULT link([in] VARIANT v); + void link(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_LINK), displaybind, bindable] - HRESULT link([retval, out] VARIANT *p); + VARIANT link(); [propput, id(DISPID_IHTMLBODYELEMENT_VLINK), displaybind, bindable] - HRESULT vLink([in] VARIANT v); + void vLink(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_VLINK), displaybind, bindable] - HRESULT vLink([retval, out] VARIANT *p); + VARIANT vLink(); [propput, id(DISPID_IHTMLBODYELEMENT_ALINK), displaybind, bindable] - HRESULT aLink([in] VARIANT v); + void aLink(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_ALINK), displaybind, bindable] - HRESULT aLink([retval, out] VARIANT *p); + VARIANT aLink(); [propput, id(DISPID_IHTMLBODYELEMENT_ONLOAD), displaybind, bindable] - HRESULT onload([in] VARIANT v); + void onload(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_ONLOAD), displaybind, bindable] - HRESULT onload([retval, out] VARIANT *p); + VARIANT onload(); [propput, id(DISPID_IHTMLBODYELEMENT_ONUNLOAD), displaybind, bindable] - HRESULT onunload([in] VARIANT v); + void onunload(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_ONUNLOAD), displaybind, bindable] - HRESULT onunload([retval, out] VARIANT *p); + VARIANT onunload(); [propput, id(DISPID_IHTMLBODYELEMENT_SCROLL), displaybind, bindable] - HRESULT scroll([in] BSTR v); + void scroll(BSTR v); [propget, id(DISPID_IHTMLBODYELEMENT_SCROLL), displaybind, bindable] - HRESULT scroll([retval, out] BSTR *p); + BSTR scroll(); [propput, id(DISPID_IHTMLBODYELEMENT_ONSELECT), displaybind, bindable] - HRESULT onselect([in] VARIANT v); + void onselect(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_ONSELECT), displaybind, bindable] - HRESULT onselect([retval, out] VARIANT *p); + VARIANT onselect(); [propput, id(DISPID_IHTMLBODYELEMENT_ONBEFOREUNLOAD), displaybind, bindable] - HRESULT onbeforeunload([in] VARIANT v); + void onbeforeunload(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT_ONBEFOREUNLOAD), displaybind, bindable] - HRESULT onbeforeunload([retval, out] VARIANT *p); + VARIANT onbeforeunload(); [id(DISPID_IHTMLBODYELEMENT_CREATETEXTRANGE)] - HRESULT createTextRange([retval, out] IHTMLTxtRange **range); -} + IHTMLTxtRange* createTextRange(); -/***************************************************************************** - * IHTMLBodyElement2 interface - */ -[ - odl, - oleautomation, - dual, - uuid(3050f5c5-98b5-11cf-bb82-00aa00bdce0b) -] -interface IHTMLBodyElement2 : IDispatch -{ [propput, id(DISPID_IHTMLBODYELEMENT2_ONBEFOREPRINT), displaybind, bindable] - HRESULT onbeforeprint([in] VARIANT v); + void onbeforeprint(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT2_ONBEFOREPRINT), displaybind, bindable] - HRESULT onbeforeprint([retval, out] VARIANT *p); + VARIANT onbeforeprint(); [propput, id(DISPID_IHTMLBODYELEMENT2_ONAFTERPRINT), displaybind, bindable] - HRESULT onafterprint([in] VARIANT v); + void onafterprint(VARIANT v); [propget, id(DISPID_IHTMLBODYELEMENT2_ONAFTERPRINT), displaybind, bindable] - HRESULT onafterprint([retval, out] VARIANT *p); -} + VARIANT onafterprint(); +}; + +[ + uuid(3050f24a-98b5-11cf-bb82-00aa00bdce0b) +] +coclass HTMLBody +{ + [default] dispinterface DispHTMLBody; + [source, default] dispinterface HTMLTextContainerEvents; + [source] dispinterface HTMLTextContainerEvents2; + interface IHTMLElement; + interface IHTMLElement2; + interface IHTMLElement3; + interface IHTMLElement4; + interface IHTMLUniqueName; + interface IHTMLDOMNode; + interface IHTMLDOMNode2; + interface IHTMLControlElement; + interface IHTMLTextContainer; + interface IHTMLBodyElement; + interface IHTMLBodyElement2; +}; /***************************************************************************** * IHTMLAnchorElement interface @@ -11940,6 +13176,210 @@ methods: }; /***************************************************************************** + * HTMLTextContainerEvents2 interface + */ +[ + hidden, + uuid(3050f624-98b5-11cf-bb82-00aa00bdce0b) +] +dispinterface HTMLTextContainerEvents2 +{ +properties: +methods: + [id(DISPID_HTMLELEMENTEVENTS2_ONHELP)] + VARIANT_BOOL onhelp([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCLICK)] + VARIANT_BOOL onclick([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDBLCLICK)] + VARIANT_BOOL ondblclick([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONKEYPRESS)] + VARIANT_BOOL onkeypress([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONKEYDOWN)] + void onkeydown([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONKEYUP)] + void onkeyup([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEOUT)] + void onmouseout([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEOVER)] + void onmouseover([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEMOVE)] + void onmousemove([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEDOWN)] + void onmousedown([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEUP)] + void onmouseup([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONSELECTSTART)] + VARIANT_BOOL onselectstart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFILTERCHANGE)] + void onfilterchange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGSTART)] + VARIANT_BOOL ondragstart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREUPDATE)] + VARIANT_BOOL onbeforeupdate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONAFTERUPDATE)] + void onafterupdate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONERRORUPDATE)] + VARIANT_BOOL onerrorupdate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWEXIT)] + VARIANT_BOOL onrowexit([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWENTER)] + void onrowenter([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDATASETCHANGED)] + void ondatasetchanged([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDATAAVAILABLE)] + void ondataavailable([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDATASETCOMPLETE)] + void ondatasetcomplete([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONLOSECAPTURE)] + void onlosecapture([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONPROPERTYCHANGE)] + void onpropertychange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONSCROLL)] + void onscroll([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFOCUS)] + void onfocus([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBLUR)] + void onblur([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONRESIZE)] + void onresize([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAG)] + VARIANT_BOOL ondrag([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGEND)] + void ondragend([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGENTER)] + VARIANT_BOOL ondragenter([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGOVER)] + VARIANT_BOOL ondragover([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDRAGLEAVE)] + void ondragleave([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDROP)] + VARIANT_BOOL ondrop([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFORECUT)] + VARIANT_BOOL onbeforecut([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCUT)] + VARIANT_BOOL oncut([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFORECOPY)] + VARIANT_BOOL onbeforecopy([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCOPY)] + VARIANT_BOOL oncopy([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREPASTE)] + VARIANT_BOOL onbeforepaste([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONPASTE)] + VARIANT_BOOL onpaste([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCONTEXTMENU)] + VARIANT_BOOL oncontextmenu([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWSDELETE)] + void onrowsdelete([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONROWSINSERTED)] + void onrowsinserted([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCELLCHANGE)] + void oncellchange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONREADYSTATECHANGE)] + void onreadystatechange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONLAYOUTCOMPLETE)] + void onlayoutcomplete([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONPAGE)] + void onpage([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEENTER)] + void onmouseenter([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSELEAVE)] + void onmouseleave([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONACTIVATE)] + void onactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONDEACTIVATE)] + void ondeactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREDEACTIVATE)] + VARIANT_BOOL onbeforedeactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONBEFOREACTIVATE)] + VARIANT_BOOL onbeforeactivate([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFOCUSIN)] + void onfocusin([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONFOCUSOUT)] + void onfocusout([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOVE)] + void onmove([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONCONTROLSELECT)] + VARIANT_BOOL oncontrolselect([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOVESTART)] + VARIANT_BOOL onmovestart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOVEEND)] + void onmoveend([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONRESIZESTART)] + VARIANT_BOOL onresizestart([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONRESIZEEND)] + void onresizeend([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLELEMENTEVENTS2_ONMOUSEWHEEL)] + VARIANT_BOOL onmousewheel([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLTEXTCONTAINEREVENTS2_ONCHANGE)] + void onchange([in] IHTMLEventObj* pEvtObj); + + [id(DISPID_HTMLTEXTCONTAINEREVENTS2_ONSELECT)] + void onselect([in] IHTMLEventObj* pEvtObj); +}; + +/***************************************************************************** * IHTMLDocument interface */ [ diff --git a/include/objbase.h b/include/objbase.h index 6a07a255859..9f606c01312 100644 --- a/include/objbase.h +++ b/include/objbase.h @@ -343,7 +343,7 @@ HRESULT WINAPI CoGetInstanceFromFile(COSERVERINFO* pServerInfo, CLSID* pClsid, I HRESULT WINAPI CoGetInstanceFromIStorage(COSERVERINFO* pServerInfo, CLSID* pClsid, IUnknown* punkOuter, DWORD dwClsCtx, IStorage* pstg, DWORD dwCount, MULTI_QI* pResults); HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, LPMALLOC* lpMalloc); -LPVOID WINAPI CoTaskMemAlloc(ULONG size); +LPVOID WINAPI CoTaskMemAlloc(ULONG size) __WINE_ALLOC_SIZE(1); void WINAPI CoTaskMemFree(LPVOID ptr); LPVOID WINAPI CoTaskMemRealloc(LPVOID ptr, ULONG size); diff --git a/include/rpcndr.h b/include/rpcndr.h index 9bf28407951..7c0efafec20 100644 --- a/include/rpcndr.h +++ b/include/rpcndr.h @@ -652,7 +652,7 @@ RPCRTAPI LONG RPC_ENTRY NdrDcomAsyncStubCall( struct IRpcStubBuffer* pThis, struct IRpcChannelBuffer* pChannel, PRPC_MESSAGE pRpcMsg, DWORD * pdwStubPhase ); RPCRTAPI void* RPC_ENTRY - NdrAllocate( PMIDL_STUB_MESSAGE pStubMsg, size_t Len ); + NdrAllocate( PMIDL_STUB_MESSAGE pStubMsg, size_t Len ) __WINE_ALLOC_SIZE(2); RPCRTAPI void RPC_ENTRY NdrClearOutParameters( PMIDL_STUB_MESSAGE pStubMsg, PFORMAT_STRING pFormat, void *ArgAddr ); diff --git a/include/shlobj.h b/include/shlobj.h index 3e6e7a5bf8b..284a0205d85 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -40,7 +40,7 @@ DECLARE_HANDLE(HPSXA); #endif UINT WINAPI SHAddFromPropSheetExtArray(HPSXA,LPFNADDPROPSHEETPAGE,LPARAM); -LPVOID WINAPI SHAlloc(ULONG); +LPVOID WINAPI SHAlloc(ULONG) __WINE_ALLOC_SIZE(1); HRESULT WINAPI SHCoCreateInstance(LPCWSTR,const CLSID*,IUnknown*,REFIID,LPVOID*); HPSXA WINAPI SHCreatePropSheetExtArray(HKEY,LPCWSTR,UINT); HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY,LPCWSTR,UINT,IDataObject*); diff --git a/include/srrestoreptapi.h b/include/srrestoreptapi.h new file mode 100644 index 00000000000..6e62934901b --- /dev/null +++ b/include/srrestoreptapi.h @@ -0,0 +1,58 @@ +/* + * System Restore definitions + * + * Copyright 2008 Paul Vriens + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_SRRESTOREPTAPI_H +#define __WINE_SRRESTOREPTAPI_H + +/* Event types */ +#define BEGIN_NESTED_SYSTEM_CHANGE 102 +#define END_NESTED_SYSTEM_CHANGE 103 + +/* Restore point types */ +#define APPLICATION_INSTALL 0 + +#define MAX_DESC 64 + +#pragma pack(1) + +typedef struct _RESTOREPTINFOA { + DWORD dwEventType; + DWORD dwRestorePtType; + INT64 llSequenceNumber; + CHAR szDescription[MAX_DESC]; +} RESTOREPOINTINFOA, *PRESTOREPOINTINFOA; + +typedef struct _SMGRSTATUS { + DWORD nStatus; + INT64 llSequenceNumber; +} STATEMGRSTATUS, *PSTATEMGRSTATUS; + +#ifdef __cplusplus +extern "C" { +#endif + +BOOL WINAPI SRSetRestorePointA(PRESTOREPOINTINFOA, PSTATEMGRSTATUS); +DWORD WINAPI SRRemoveRestorePoint(DWORD); + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(__WINE_SRRESTOREPTAPI_H) */ diff --git a/include/winbase.h b/include/winbase.h index f7ccb8c7639..0b637f56492 100644 --- a/include/winbase.h +++ b/include/winbase.h @@ -1744,7 +1744,7 @@ WINBASEAPI UINT WINAPI GetWindowsDirectoryW(LPWSTR,UINT); WINBASEAPI ATOM WINAPI GlobalAddAtomA(LPCSTR); WINBASEAPI ATOM WINAPI GlobalAddAtomW(LPCWSTR); #define GlobalAddAtom WINELIB_NAME_AW(GlobalAddAtom) -WINBASEAPI HGLOBAL WINAPI GlobalAlloc(UINT,SIZE_T); +WINBASEAPI HGLOBAL WINAPI GlobalAlloc(UINT,SIZE_T) __WINE_ALLOC_SIZE(2); WINBASEAPI SIZE_T WINAPI GlobalCompact(DWORD); WINBASEAPI ATOM WINAPI GlobalDeleteAtom(ATOM); WINBASEAPI ATOM WINAPI GlobalFindAtomA(LPCSTR); @@ -1760,20 +1760,20 @@ WINBASEAPI HGLOBAL WINAPI GlobalHandle(LPCVOID); WINBASEAPI LPVOID WINAPI GlobalLock(HGLOBAL); WINBASEAPI VOID WINAPI GlobalMemoryStatus(LPMEMORYSTATUS); WINBASEAPI BOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX); -WINBASEAPI HGLOBAL WINAPI GlobalReAlloc(HGLOBAL,SIZE_T,UINT); +WINBASEAPI HGLOBAL WINAPI GlobalReAlloc(HGLOBAL,SIZE_T,UINT) __WINE_ALLOC_SIZE(3); WINBASEAPI SIZE_T WINAPI GlobalSize(HGLOBAL); WINBASEAPI VOID WINAPI GlobalUnfix(HGLOBAL); WINBASEAPI BOOL WINAPI GlobalUnlock(HGLOBAL); WINBASEAPI BOOL WINAPI GlobalUnWire(HGLOBAL); WINBASEAPI LPVOID WINAPI GlobalWire(HGLOBAL); #define HasOverlappedCompleted(lpOverlapped) ((lpOverlapped)->Internal != STATUS_PENDING) -WINBASEAPI LPVOID WINAPI HeapAlloc(HANDLE,DWORD,SIZE_T); +WINBASEAPI LPVOID WINAPI HeapAlloc(HANDLE,DWORD,SIZE_T) __WINE_ALLOC_SIZE(3); WINBASEAPI SIZE_T WINAPI HeapCompact(HANDLE,DWORD); WINBASEAPI HANDLE WINAPI HeapCreate(DWORD,SIZE_T,SIZE_T); WINBASEAPI BOOL WINAPI HeapDestroy(HANDLE); WINBASEAPI BOOL WINAPI HeapFree(HANDLE,DWORD,LPVOID); WINBASEAPI BOOL WINAPI HeapLock(HANDLE); -WINBASEAPI LPVOID WINAPI HeapReAlloc(HANDLE,DWORD,LPVOID,SIZE_T); +WINBASEAPI LPVOID WINAPI HeapReAlloc(HANDLE,DWORD,LPVOID,SIZE_T) __WINE_ALLOC_SIZE(4); WINBASEAPI BOOL WINAPI HeapQueryInformation(HANDLE,HEAP_INFORMATION_CLASS,PVOID,SIZE_T,PSIZE_T); WINBASEAPI BOOL WINAPI HeapSetInformation(HANDLE,HEAP_INFORMATION_CLASS,PVOID,SIZE_T); WINBASEAPI SIZE_T WINAPI HeapSize(HANDLE,DWORD,LPCVOID); @@ -1811,6 +1811,7 @@ WINBASEAPI BOOL WINAPI IsWow64Process(HANDLE,PBOOL); WINADVAPI BOOL WINAPI ImpersonateLoggedOnUser(HANDLE); WINADVAPI BOOL WINAPI ImpersonateNamedPipeClient(HANDLE); WINADVAPI BOOL WINAPI ImpersonateSelf(SECURITY_IMPERSONATION_LEVEL); +WINBASEAPI BOOL WINAPI IsProcessInJob(HANDLE,HANDLE,PBOOL); WINBASEAPI BOOL WINAPI IsProcessorFeaturePresent(DWORD); WINBASEAPI void WINAPI LeaveCriticalSection(CRITICAL_SECTION *lpCrit); WINBASEAPI HMODULE WINAPI LoadLibraryA(LPCSTR); @@ -1821,13 +1822,13 @@ WINBASEAPI HMODULE WINAPI LoadLibraryExW(LPCWSTR,HANDLE,DWORD); #define LoadLibraryEx WINELIB_NAME_AW(LoadLibraryEx) WINBASEAPI HINSTANCE WINAPI LoadModule(LPCSTR,LPVOID); WINBASEAPI HGLOBAL WINAPI LoadResource(HMODULE,HRSRC); -WINBASEAPI HLOCAL WINAPI LocalAlloc(UINT,SIZE_T); +WINBASEAPI HLOCAL WINAPI LocalAlloc(UINT,SIZE_T) __WINE_ALLOC_SIZE(2); WINBASEAPI SIZE_T WINAPI LocalCompact(UINT); WINBASEAPI UINT WINAPI LocalFlags(HLOCAL); WINBASEAPI HLOCAL WINAPI LocalFree(HLOCAL); WINBASEAPI HLOCAL WINAPI LocalHandle(LPCVOID); WINBASEAPI LPVOID WINAPI LocalLock(HLOCAL); -WINBASEAPI HLOCAL WINAPI LocalReAlloc(HLOCAL,SIZE_T,UINT); +WINBASEAPI HLOCAL WINAPI LocalReAlloc(HLOCAL,SIZE_T,UINT) __WINE_ALLOC_SIZE(3); WINBASEAPI SIZE_T WINAPI LocalShrink(HGLOBAL,UINT); WINBASEAPI SIZE_T WINAPI LocalSize(HLOCAL); WINBASEAPI BOOL WINAPI LocalUnlock(HLOCAL); @@ -1902,6 +1903,9 @@ WINBASEAPI HFILE WINAPI OpenFile(LPCSTR,OFSTRUCT*,UINT); WINBASEAPI HANDLE WINAPI OpenFileMappingA(DWORD,BOOL,LPCSTR); WINBASEAPI HANDLE WINAPI OpenFileMappingW(DWORD,BOOL,LPCWSTR); #define OpenFileMapping WINELIB_NAME_AW(OpenFileMapping) +WINBASEAPI HANDLE WINAPI OpenJobObjectA(DWORD,BOOL,LPCSTR); +WINBASEAPI HANDLE WINAPI OpenJobObjectW(DWORD,BOOL,LPCWSTR); +#define OpenJobObject WINELIB_NAME_AW(OpenJobObject) WINBASEAPI HANDLE WINAPI OpenMutexA(DWORD,BOOL,LPCSTR); WINBASEAPI HANDLE WINAPI OpenMutexW(DWORD,BOOL,LPCWSTR); #define OpenMutex WINELIB_NAME_AW(OpenMutex) @@ -1933,6 +1937,7 @@ WINBASEAPI USHORT WINAPI QueryDepthSList(PSLIST_HEADER); WINBASEAPI DWORD WINAPI QueryDosDeviceA(LPCSTR,LPSTR,DWORD); WINBASEAPI DWORD WINAPI QueryDosDeviceW(LPCWSTR,LPWSTR,DWORD); #define QueryDosDevice WINELIB_NAME_AW(QueryDosDevice) +WINBASEAPI BOOL WINAPI QueryInformationJobObject(HANDLE,JOBOBJECTINFOCLASS,LPVOID,DWORD,DWORD*); WINBASEAPI BOOL WINAPI QueryPerformanceCounter(LARGE_INTEGER*); WINBASEAPI BOOL WINAPI QueryPerformanceFrequency(LARGE_INTEGER*); WINBASEAPI DWORD WINAPI QueueUserAPC(PAPCFUNC,HANDLE,ULONG_PTR); @@ -2013,6 +2018,7 @@ WINADVAPI BOOL WINAPI SetFileSecurityW(LPCWSTR,SECURITY_INFORMATION,PSEC WINBASEAPI BOOL WINAPI SetFileTime(HANDLE,const FILETIME*,const FILETIME*,const FILETIME*); WINBASEAPI UINT WINAPI SetHandleCount(UINT); WINBASEAPI BOOL WINAPI SetHandleInformation(HANDLE,DWORD,DWORD); +WINBASEAPI BOOL WINAPI SetInformationJobObject(HANDLE,JOBOBJECTINFOCLASS,LPVOID,DWORD); WINADVAPI BOOL WINAPI SetKernelObjectSecurity(HANDLE,SECURITY_INFORMATION,PSECURITY_DESCRIPTOR); WINBASEAPI BOOL WINAPI SetLocalTime(const SYSTEMTIME*); WINBASEAPI BOOL WINAPI SetMailslotInfo(HANDLE,DWORD); @@ -2062,6 +2068,7 @@ WINBASEAPI void WINAPI SwitchToFiber(LPVOID); WINBASEAPI BOOL WINAPI SwitchToThread(void); WINBASEAPI BOOL WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME); WINBASEAPI BOOL WINAPI SystemTimeToTzSpecificLocalTime(LPTIME_ZONE_INFORMATION,LPSYSTEMTIME,LPSYSTEMTIME); +WINBASEAPI BOOL WINAPI TerminateJobObject(HANDLE,UINT); WINBASEAPI BOOL WINAPI TerminateProcess(HANDLE,DWORD); WINBASEAPI BOOL WINAPI TerminateThread(HANDLE,DWORD); WINBASEAPI DWORD WINAPI TlsAlloc(void); diff --git a/include/wincrypt.h b/include/wincrypt.h index ba16cd5dab5..e6006ee7c5c 100644 --- a/include/wincrypt.h +++ b/include/wincrypt.h @@ -3806,8 +3806,8 @@ WINADVAPI BOOL WINAPI CryptVerifySignatureW (HCRYPTHASH, CONST BYTE *, DWORD, HC #define CryptVerifySignature WINELIB_NAME_AW(CryptVerifySignature) /* crypt32.dll functions */ -LPVOID WINAPI CryptMemAlloc(ULONG cbSize); -LPVOID WINAPI CryptMemRealloc(LPVOID pv, ULONG cbSize); +LPVOID WINAPI CryptMemAlloc(ULONG cbSize) __WINE_ALLOC_SIZE(1); +LPVOID WINAPI CryptMemRealloc(LPVOID pv, ULONG cbSize) __WINE_ALLOC_SIZE(2); VOID WINAPI CryptMemFree(LPVOID pv); BOOL WINAPI CryptBinaryToStringA(const BYTE *pbBinary, diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h index 306d8934ca2..8cfd501015f 100644 --- a/include/wine/mscvpdb.h +++ b/include/wine/mscvpdb.h @@ -1879,7 +1879,7 @@ typedef struct OMFSignatureRSDS { char Signature[4]; GUID guid; - DWORD unknown; + DWORD age; CHAR name[1]; } OMFSignatureRSDS; @@ -1888,7 +1888,7 @@ typedef struct _CODEVIEW_PDB_DATA char Signature[4]; long filepos; DWORD timestamp; - DWORD unknown; + DWORD age; CHAR name[1]; } CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA; diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h index 4c26c9b5e1d..3101c17ba4a 100644 --- a/include/wine/wined3d_gl.h +++ b/include/wine/wined3d_gl.h @@ -3813,6 +3813,7 @@ typedef struct { GLint glInternal, glGammaInternal, rtInternal, glFormat, glType; WINED3DFORMAT conversion_group; unsigned int Flags; + float heightscale; } GlPixelFormatDesc; typedef struct _WINED3DGLTYPE { diff --git a/include/wine/wined3d_interface.h b/include/wine/wined3d_interface.h index 4b960d55221..6ecab39e933 100644 --- a/include/wine/wined3d_interface.h +++ b/include/wine/wined3d_interface.h @@ -310,7 +310,7 @@ DECLARE_INTERFACE_(IWineD3D, IWineD3DBase) STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT SurfaceFormat, BOOL Windowed, WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQuality) PURE; STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT AdapterFormat, WINED3DFORMAT RenderTargetFormat, WINED3DFORMAT DepthStencilFormat) PURE; STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter, WINED3DDEVTYPE CheckType, WINED3DFORMAT DisplayFormat, WINED3DFORMAT BackBufferFormat, BOOL Windowed) PURE; - STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat) PURE; + STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT AdapterFormat, DWORD Usage, WINED3DRESOURCETYPE RType, WINED3DFORMAT CheckFormat, WINED3DSURFTYPE SurfaceType) PURE; STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DFORMAT SourceFormat, WINED3DFORMAT TargetFormat) PURE; STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType, WINED3DCAPS *pCaps) PURE; STDMETHOD(CreateDevice)(THIS_ UINT Adapter, WINED3DDEVTYPE DeviceType,HWND hFocusWindow, DWORD BehaviorFlags, struct IWineD3DDevice **ppReturnedDeviceInterface, IUnknown *parent) PURE; @@ -336,7 +336,7 @@ DECLARE_INTERFACE_(IWineD3D, IWineD3DBase) #define IWineD3D_CheckDeviceMultiSampleType(p,a,b,c,d,e,f) (p)->lpVtbl->CheckDeviceMultiSampleType(p,a,b,c,d,e,f) #define IWineD3D_CheckDepthStencilMatch(p,a,b,c,d,e) (p)->lpVtbl->CheckDepthStencilMatch(p,a,b,c,d,e) #define IWineD3D_CheckDeviceType(p,a,b,c,d,e) (p)->lpVtbl->CheckDeviceType(p,a,b,c,d,e) -#define IWineD3D_CheckDeviceFormat(p,a,b,c,d,e,f) (p)->lpVtbl->CheckDeviceFormat(p,a,b,c,d,e,f) +#define IWineD3D_CheckDeviceFormat(p,a,b,c,d,e,f,g) (p)->lpVtbl->CheckDeviceFormat(p,a,b,c,d,e,f,g) #define IWineD3D_CheckDeviceFormatConversion(p,a,b,c,d) (p)->lpVtbl->CheckDeviceFormatConversion(p,a,b,c,d) #define IWineD3D_GetDeviceCaps(p,a,b,c) (p)->lpVtbl->GetDeviceCaps(p,a,b,c) #define IWineD3D_CreateDevice(p,a,b,c,d,e,f) (p)->lpVtbl->CreateDevice(p,a,b,c,d,e,f) diff --git a/include/winnt.h b/include/winnt.h index 7ca80a700f4..6fa89ddb884 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -162,6 +162,12 @@ extern "C" { # define DECLSPEC_HIDDEN #endif +#if defined(__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) +#define __WINE_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) +#else +#define __WINE_ALLOC_SIZE(x) +#endif + /* Anonymous union/struct handling */ #ifndef NONAMELESSSTRUCT @@ -4008,6 +4014,13 @@ typedef enum tagSID_NAME_USE { #define MUTEX_MODIFY_STATE 0x0001 #define MUTEX_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1) +#define JOB_OBJECT_ASSIGN_PROCESS 0x0001 +#define JOB_OBJECT_SET_ATTRIBUTES 0x0002 +#define JOB_OBJECT_QUERY 0x0004 +#define JOB_OBJECT_TERMINATE 0x0008 +#define JOB_OBJECT_SET_SECURITY_ATTRIBUTES 0x0010 +#define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x1f) + #define TIMER_QUERY_STATE 0x0001 #define TIMER_MODIFY_STATE 0x0002 #define TIMER_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0x3) @@ -4023,6 +4036,7 @@ typedef enum tagSID_NAME_USE { #define PROCESS_SET_INFORMATION 0x0200 #define PROCESS_QUERY_INFORMATION 0x0400 #define PROCESS_SUSPEND_RESUME 0x0800 +#define PROCESS_QUERY_LIMITED_INFORMATION 0x1000 #define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|0xfff) #define THREAD_TERMINATE 0x0001 @@ -4900,6 +4914,21 @@ typedef enum _ACTIVATION_CONTEXT_INFO_CLASS { #define ACTIVATION_CONTEXT_SECTION_GLOBAL_OBJECT_RENAME_TABLE 8 #define ACTIVATION_CONTEXT_SECTION_CLR_SURROGATES 9 +typedef enum _JOBOBJECTINFOCLASS +{ + JobObjectBasicAccountingInformation = 1, + JobObjectBasicLimitInformation, + JobObjectBasicProcessIdList, + JobObjectBasicUIRestrictions, + JobObjectSecurityLimitInformation, + JobObjectEndOfJobTimeInformation, + JobObjectAssociateCompletionPortInformation, + JobObjectBasicAndIoAccountingInformation, + JobObjectExtendedLimitInformation, + JobObjectJobSetInformation, + MaxJobObjectInfoClass +} JOBOBJECTINFOCLASS; + #ifdef __cplusplus } #endif diff --git a/include/winternl.h b/include/winternl.h index 2dc1fc2ba95..04bc3e4e3d5 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -665,9 +665,14 @@ typedef enum _PROCESSINFOCLASS { ProcessDebugObjectHandle = 30, ProcessDebugFlags = 31, ProcessHandleTracing = 32, + ProcessExecuteFlags = 34, MaxProcessInfoClass } PROCESSINFOCLASS, PROCESS_INFORMATION_CLASS; +#define MEM_EXECUTE_OPTION_DISABLE 0x01 +#define MEM_EXECUTE_OPTION_ENABLE 0x02 +#define MEM_EXECUTE_OPTION_PERMANENT 0x08 + typedef enum _SECTION_INHERIT { ViewShare = 1, ViewUnmap = 2 @@ -1862,6 +1867,7 @@ NTSYSAPI NTSTATUS WINAPI NtAllocateLocallyUniqueId(PLUID lpLuid); NTSYSAPI NTSTATUS WINAPI NtAllocateUuids(PULARGE_INTEGER,PULONG,PULONG); NTSYSAPI NTSTATUS WINAPI NtAllocateVirtualMemory(HANDLE,PVOID*,ULONG,SIZE_T*,ULONG,ULONG); NTSYSAPI NTSTATUS WINAPI NtAreMappedFilesTheSame(PVOID,PVOID); +NTSYSAPI NTSTATUS WINAPI NtAssignProcessToJobObject(HANDLE,HANDLE); NTSYSAPI NTSTATUS WINAPI NtCallbackReturn(PVOID,ULONG,NTSTATUS); NTSYSAPI NTSTATUS WINAPI NtCancelIoFile(HANDLE,PIO_STATUS_BLOCK); NTSYSAPI NTSTATUS WINAPI NtCancelTimer(HANDLE, BOOLEAN*); @@ -1876,6 +1882,7 @@ NTSYSAPI NTSTATUS WINAPI NtCreateEvent(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBU NTSYSAPI NTSTATUS WINAPI NtCreateEventPair(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES); NTSYSAPI NTSTATUS WINAPI NtCreateFile(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,PLARGE_INTEGER,ULONG,ULONG,ULONG,ULONG,PVOID,ULONG); NTSYSAPI NTSTATUS WINAPI NtCreateIoCompletion(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,ULONG); +NTSYSAPI NTSTATUS WINAPI NtCreateJobObject(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*); NTSYSAPI NTSTATUS WINAPI NtCreateKey(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*,ULONG,const UNICODE_STRING*,ULONG,PULONG); NTSYSAPI NTSTATUS WINAPI NtCreateMailslotFile(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG,ULONG,PLARGE_INTEGER); NTSYSAPI NTSTATUS WINAPI NtCreateMutant(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*,BOOLEAN); @@ -1918,6 +1925,7 @@ NTSYSAPI NTSTATUS WINAPI NtImpersonateClientOfPort(HANDLE,PPORT_MESSAGE); NTSYSAPI NTSTATUS WINAPI NtImpersonateThread(HANDLE,HANDLE,PSECURITY_QUALITY_OF_SERVICE); NTSYSAPI NTSTATUS WINAPI NtInitializeRegistry(BOOLEAN); NTSYSAPI NTSTATUS WINAPI NtInitiatePowerAction(POWER_ACTION,SYSTEM_POWER_STATE,ULONG,BOOLEAN); +NTSYSAPI NTSTATUS WINAPI NtIsProcessInJob(HANDLE,HANDLE); NTSYSAPI NTSTATUS WINAPI NtListenPort(HANDLE,PLPC_MESSAGE); NTSYSAPI NTSTATUS WINAPI NtLoadDriver(const UNICODE_STRING *); NTSYSAPI NTSTATUS WINAPI NtLoadKey(const OBJECT_ATTRIBUTES *,OBJECT_ATTRIBUTES *); @@ -1932,16 +1940,19 @@ NTSYSAPI NTSTATUS WINAPI NtOpenEvent(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTE NTSYSAPI NTSTATUS WINAPI NtOpenEventPair(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES); NTSYSAPI NTSTATUS WINAPI NtOpenFile(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES,PIO_STATUS_BLOCK,ULONG,ULONG); NTSYSAPI NTSTATUS WINAPI NtOpenIoCompletion(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES); +NTSYSAPI NTSTATUS WINAPI NtOpenJobObject(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*); NTSYSAPI NTSTATUS WINAPI NtOpenKey(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES *); NTSYSAPI NTSTATUS WINAPI NtOpenMutant(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*); NTSYSAPI NTSTATUS WINAPI NtOpenObjectAuditAlarm(PUNICODE_STRING,PHANDLE,PUNICODE_STRING,PUNICODE_STRING,PSECURITY_DESCRIPTOR,HANDLE,ACCESS_MASK,ACCESS_MASK,PPRIVILEGE_SET,BOOLEAN,BOOLEAN,PBOOLEAN); NTSYSAPI NTSTATUS WINAPI NtOpenProcess(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*,const CLIENT_ID*); NTSYSAPI NTSTATUS WINAPI NtOpenProcessToken(HANDLE,DWORD,HANDLE *); +NTSYSAPI NTSTATUS WINAPI NtOpenProcessTokenEx(HANDLE,DWORD,DWORD,HANDLE *); NTSYSAPI NTSTATUS WINAPI NtOpenSection(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*); NTSYSAPI NTSTATUS WINAPI NtOpenSemaphore(PHANDLE,ACCESS_MASK,const OBJECT_ATTRIBUTES*); NTSYSAPI NTSTATUS WINAPI NtOpenSymbolicLinkObject(PHANDLE,ACCESS_MASK,POBJECT_ATTRIBUTES); NTSYSAPI NTSTATUS WINAPI NtOpenThread(HANDLE*,ACCESS_MASK,const OBJECT_ATTRIBUTES*,const CLIENT_ID*); NTSYSAPI NTSTATUS WINAPI NtOpenThreadToken(HANDLE,DWORD,BOOLEAN,HANDLE *); +NTSYSAPI NTSTATUS WINAPI NtOpenThreadTokenEx(HANDLE,DWORD,BOOLEAN,DWORD,HANDLE *); NTSYSAPI NTSTATUS WINAPI NtOpenTimer(HANDLE*, ACCESS_MASK, const OBJECT_ATTRIBUTES*); NTSYSAPI NTSTATUS WINAPI NtPowerInformation(POWER_INFORMATION_LEVEL,PVOID,ULONG,PVOID,ULONG); NTSYSAPI NTSTATUS WINAPI NtPrivilegeCheck(HANDLE,PPRIVILEGE_SET,PBOOLEAN); @@ -1960,6 +1971,7 @@ NTSYSAPI NTSTATUS WINAPI NtQueryEvent(HANDLE,EVENT_INFORMATION_CLASS,PVOID,ULON NTSYSAPI NTSTATUS WINAPI NtQueryFullAttributesFile(const OBJECT_ATTRIBUTES*,FILE_NETWORK_OPEN_INFORMATION*); NTSYSAPI NTSTATUS WINAPI NtQueryInformationAtom(RTL_ATOM,ATOM_INFORMATION_CLASS,PVOID,ULONG,ULONG*); NTSYSAPI NTSTATUS WINAPI NtQueryInformationFile(HANDLE,PIO_STATUS_BLOCK,PVOID,LONG,FILE_INFORMATION_CLASS); +NTSYSAPI NTSTATUS WINAPI NtQueryInformationJobObject(HANDLE,JOBOBJECTINFOCLASS,PVOID,ULONG,PULONG); NTSYSAPI NTSTATUS WINAPI NtQueryInformationPort(HANDLE,PORT_INFORMATION_CLASS,PVOID,ULONG,PULONG); NTSYSAPI NTSTATUS WINAPI NtQueryInformationProcess(HANDLE,PROCESSINFOCLASS,PVOID,ULONG,PULONG); NTSYSAPI NTSTATUS WINAPI NtQueryInformationThread(HANDLE,THREADINFOCLASS,PVOID,ULONG,PULONG); @@ -2017,6 +2029,7 @@ NTSYSAPI NTSTATUS WINAPI NtSetHighEventPair(HANDLE); NTSYSAPI NTSTATUS WINAPI NtSetHighWaitLowEventPair(HANDLE); NTSYSAPI NTSTATUS WINAPI NtSetHighWaitLowThread(VOID); NTSYSAPI NTSTATUS WINAPI NtSetInformationFile(HANDLE,PIO_STATUS_BLOCK,PVOID,ULONG,FILE_INFORMATION_CLASS); +NTSYSAPI NTSTATUS WINAPI NtSetInformationJobObject(HANDLE,JOBOBJECTINFOCLASS,PVOID,ULONG); NTSYSAPI NTSTATUS WINAPI NtSetInformationKey(HANDLE,const int,PVOID,ULONG); NTSYSAPI NTSTATUS WINAPI NtSetInformationObject(HANDLE, OBJECT_INFORMATION_CLASS, PVOID, ULONG); NTSYSAPI NTSTATUS WINAPI NtSetInformationProcess(HANDLE,PROCESS_INFORMATION_CLASS,PVOID,ULONG); @@ -2043,6 +2056,7 @@ NTSYSAPI NTSTATUS WINAPI NtStartProfile(HANDLE); NTSYSAPI NTSTATUS WINAPI NtStopProfile(HANDLE); NTSYSAPI NTSTATUS WINAPI NtSuspendThread(HANDLE,PULONG); NTSYSAPI NTSTATUS WINAPI NtSystemDebugControl(SYSDBG_COMMAND,PVOID,ULONG,PVOID,ULONG,PULONG); +NTSYSAPI NTSTATUS WINAPI NtTerminateJobObject(HANDLE,NTSTATUS); NTSYSAPI NTSTATUS WINAPI NtTerminateProcess(HANDLE,LONG); NTSYSAPI NTSTATUS WINAPI NtTerminateThread(HANDLE,LONG); NTSYSAPI NTSTATUS WINAPI NtTestAlert(VOID); @@ -2080,7 +2094,7 @@ NTSYSAPI PVOID WINAPI RtlAddVectoredExceptionHandler(ULONG,PVECTORED_EXCEPTI NTSYSAPI NTSTATUS WINAPI RtlAdjustPrivilege(ULONG,BOOLEAN,BOOLEAN,PBOOLEAN); NTSYSAPI NTSTATUS WINAPI RtlAllocateAndInitializeSid(PSID_IDENTIFIER_AUTHORITY,BYTE,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,DWORD,PSID *); NTSYSAPI RTL_HANDLE * WINAPI RtlAllocateHandle(RTL_HANDLE_TABLE *,ULONG *); -NTSYSAPI PVOID WINAPI RtlAllocateHeap(HANDLE,ULONG,SIZE_T); +NTSYSAPI PVOID WINAPI RtlAllocateHeap(HANDLE,ULONG,SIZE_T) __WINE_ALLOC_SIZE(3); NTSYSAPI WCHAR WINAPI RtlAnsiCharToUnicodeChar(LPSTR *); NTSYSAPI DWORD WINAPI RtlAnsiStringToUnicodeSize(const STRING *); NTSYSAPI NTSTATUS WINAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING,PCANSI_STRING,BOOLEAN); diff --git a/libs/wine/loader.c b/libs/wine/loader.c index 0f05f0c4b5c..dde5a70d04e 100644 --- a/libs/wine/loader.c +++ b/libs/wine/loader.c @@ -277,7 +277,7 @@ static void fixup_imports( IMAGE_IMPORT_DESCRIPTOR *dir, BYTE *base, int delta ) fixup_rva_dwords( &dir->u.OriginalFirstThunk, delta, 1 ); fixup_rva_dwords( &dir->Name, delta, 1 ); fixup_rva_dwords( &dir->FirstThunk, delta, 1 ); - ptr = (UINT_PTR *)(base + dir->FirstThunk); + ptr = (UINT_PTR *)(base + (dir->u.OriginalFirstThunk ? dir->u.OriginalFirstThunk : dir->FirstThunk)); while (*ptr) { if (!(*ptr & IMAGE_ORDINAL_FLAG)) *ptr += delta; diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index 8b79580d5a8..ff117cccdfb 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c @@ -286,7 +286,30 @@ static void reserve_area( void *addr, void *end ) } #endif } + + +/*********************************************************************** + * reserve_malloc_space + * + * Solaris malloc is not smart enough to obtain space through mmap(), so try to make + * sure that there is some available sbrk() space before we reserve other things. + */ +static void reserve_malloc_space( size_t size ) +{ +#ifdef __sun + size_t i, count = size / 1024; + void **ptrs = malloc( count * sizeof(ptrs[0]) ); + + if (!ptrs) return; + + for (i = 0; i < count; i++) if (!(ptrs[i] = malloc( 1024 ))) break; + if (i--) /* free everything except the last one */ + while (i) free( ptrs[--i] ); + free( ptrs ); #endif +} + +#endif /* __i386__ */ /*********************************************************************** @@ -325,6 +348,8 @@ void mmap_init(void) char * const stack_ptr = &stack; char *user_space_limit = (char *)0x7ffe0000; + reserve_malloc_space( 8 * 1024 * 1024 ); + /* check for a reserved area starting at the user space limit */ /* to avoid wasting time trying to allocate it again */ LIST_FOR_EACH( ptr, &reserved_areas ) diff --git a/programs/clock/Ja.rc b/programs/clock/Ja.rc index 9591f3a7f01..ba3cc0b86d9 100644 --- a/programs/clock/Ja.rc +++ b/programs/clock/Ja.rc @@ -34,7 +34,7 @@ MAIN_MENU MENU MENUITEM "•b(&S)", IDM_SECONDS MENUITEM "“ú•t(&D)", IDM_DATE MENUITEM SEPARATOR - MENUITEM "�í‚ÉŽè‘O‚É•\Ž¦(&A)", IDM_ONTOP + MENUITEM "�í‚ÉŽè‘O‚É•\\Ž¦(&A)", IDM_ONTOP } POPUP "�î•ñ(&O)" { MENUITEM "ƒ‰ƒCƒZƒ“ƒX(&L)...", IDM_LICENSE diff --git a/programs/control/Makefile.in b/programs/control/Makefile.in index c734f5958c9..dff63bb1110 100644 --- a/programs/control/Makefile.in +++ b/programs/control/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/control/control.c b/programs/control/control.c index 89754360479..095d221c25f 100644 --- a/programs/control/control.c +++ b/programs/control/control.c @@ -35,8 +35,8 @@ static void launch(const char *what) int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszCmdLine, INT nCmdShow) { char szParams[255]; - lstrcpy(szParams, lpszCmdLine); - CharUpper(szParams); + strcpy(szParams, lpszCmdLine); + CharUpperA(szParams); /* no parameters - pop up whole "Control Panel" by default */ if (!*szParams) { diff --git a/programs/eject/Makefile.in b/programs/eject/Makefile.in index d4f1b0089e4..505e23b5280 100644 --- a/programs/eject/Makefile.in +++ b/programs/eject/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/expand/Makefile.in b/programs/expand/Makefile.in index 7e4f98250c6..f3b817ffa5f 100644 --- a/programs/expand/Makefile.in +++ b/programs/expand/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/expand/expand.c b/programs/expand/expand.c index a8736b125bc..bbdb546e0e7 100644 --- a/programs/expand/expand.c +++ b/programs/expand/expand.c @@ -155,12 +155,12 @@ int main(int argc, char *argv[]) OFSTRUCT ofin, ofout; LONG error; - if ((hin = LZOpenFile( infile, &ofin, OF_READ )) < 0) + if ((hin = LZOpenFileA( infile, &ofin, OF_READ )) < 0) { fprintf( stderr, "%s: can't open input file %s\n", argv[0], infile ); return 1; } - if ((hout = LZOpenFile( outfile, &ofout, OF_CREATE | OF_WRITE )) < 0) + if ((hout = LZOpenFileA( outfile, &ofout, OF_CREATE | OF_WRITE )) < 0) { LZClose( hin ); fprintf( stderr, "%s: can't open output file %s\n", argv[0], outfile ); diff --git a/programs/explorer/Makefile.in b/programs/explorer/Makefile.in index 97b2c743180..ceb80a9ad58 100644 --- a/programs/explorer/Makefile.in +++ b/programs/explorer/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ @@ -8,6 +9,7 @@ IMPORTS = rpcrt4 user32 gdi32 advapi32 kernel32 ntdll DELAYIMPORTS = comctl32 C_SRCS = \ + appbar.c \ desktop.c \ explorer.c \ systray.c diff --git a/programs/explorer/appbar.c b/programs/explorer/appbar.c new file mode 100644 index 00000000000..810231819c2 --- /dev/null +++ b/programs/explorer/appbar.c @@ -0,0 +1,300 @@ +/* + * SHAppBarMessage implementation + * + * Copyright 2008 Vincent Povirk for CodeWeavers + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * TODO: freedesktop _NET_WM_STRUT integration + * + * TODO: find when a fullscreen app is in the foreground and send FULLSCREENAPP + * notifications + * + * TODO: detect changes in the screen size and send ABN_POSCHANGED ? + * + * TODO: multiple monitor support + */ + +#include "wine/unicode.h" + +#include +#include +#include "explorer_private.h" + +#include "wine/list.h" + +WINE_DEFAULT_DEBUG_CHANNEL(appbar); + +struct appbar_cmd +{ + HANDLE return_map; + DWORD return_process; + APPBARDATA abd; +}; + +struct appbar_response +{ + UINT_PTR result; + RECT rc; +}; + +static HWND appbarmsg_window = NULL; + +struct appbar_data +{ + struct list entry; + HWND hwnd; + UINT callback_msg; + UINT edge; + RECT rc; + BOOL space_reserved; + /* BOOL autohide; */ +}; + +static struct list appbars = LIST_INIT(appbars); + +static struct appbar_data* get_appbar(HWND hwnd) +{ + struct appbar_data* data; + + LIST_FOR_EACH_ENTRY(data, &appbars, struct appbar_data, entry) + { + if (data->hwnd == hwnd) + return data; + } + + return NULL; +} + +/* send_poschanged: send ABN_POSCHANGED to every appbar except one */ +static void send_poschanged(HWND hwnd) +{ + struct appbar_data* data; + LIST_FOR_EACH_ENTRY(data, &appbars, struct appbar_data, entry) + { + if (data->hwnd != hwnd) + { + PostMessageW(data->hwnd, data->callback_msg, ABN_POSCHANGED, 0); + } + } +} + +/* appbar_cliprect: cut out parts of the rectangle that interfere with existing appbars */ +static void appbar_cliprect(PAPPBARDATA abd) +{ + struct appbar_data* data; + LIST_FOR_EACH_ENTRY(data, &appbars, struct appbar_data, entry) + { + if (data->hwnd == abd->hWnd) + { + /* we only care about appbars that were added before this one */ + return; + } + if (data->space_reserved) + { + /* move in the side that corresponds to the other appbar's edge */ + switch (data->edge) + { + case ABE_BOTTOM: + abd->rc.bottom = min(abd->rc.bottom, data->rc.top); + break; + case ABE_LEFT: + abd->rc.left = max(abd->rc.left, data->rc.right); + break; + case ABE_RIGHT: + abd->rc.right = min(abd->rc.right, data->rc.left); + break; + case ABE_TOP: + abd->rc.top = max(abd->rc.top, data->rc.bottom); + break; + } + } + } +} + +static UINT_PTR handle_appbarmessage(DWORD msg, PAPPBARDATA abd) +{ + struct appbar_data* data; + + switch (msg) + { + case ABM_NEW: + if (get_appbar(abd->hWnd)) + { + /* fail when adding an hwnd the second time */ + return FALSE; + } + + data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct appbar_data)); + if (!data) + { + WINE_ERR("out of memory\n"); + return FALSE; + } + data->hwnd = abd->hWnd; + data->callback_msg = abd->uCallbackMessage; + + list_add_tail(&appbars, &data->entry); + + return TRUE; + case ABM_REMOVE: + if ((data = get_appbar(abd->hWnd))) + { + list_remove(&data->entry); + + send_poschanged(abd->hWnd); + + HeapFree(GetProcessHeap(), 0, data); + } + else + WINE_WARN("removing hwnd %p not on the list\n", abd->hWnd); + return TRUE; + case ABM_QUERYPOS: + if (abd->uEdge > ABE_BOTTOM) + WINE_WARN("invalid edge %i for %p\n", abd->uEdge, abd->hWnd); + appbar_cliprect(abd); + return TRUE; + case ABM_SETPOS: + if (abd->uEdge > ABE_BOTTOM) + { + WINE_WARN("invalid edge %i for %p\n", abd->uEdge, abd->hWnd); + return TRUE; + } + if ((data = get_appbar(abd->hWnd))) + { + /* calculate acceptable space */ + appbar_cliprect(abd); + + if (!EqualRect(&abd->rc, &data->rc)) + send_poschanged(abd->hWnd); + + /* reserve that space for this appbar */ + data->edge = abd->uEdge; + data->rc = abd->rc; + data->space_reserved = TRUE; + } + else + { + WINE_WARN("app sent ABM_SETPOS message for %p without ABM_ADD\n", abd->hWnd); + } + return TRUE; + case ABM_GETSTATE: + WINE_FIXME("SHAppBarMessage(ABM_GETSTATE): stub\n"); + return ABS_ALWAYSONTOP | ABS_AUTOHIDE; + case ABM_GETTASKBARPOS: + WINE_FIXME("SHAppBarMessage(ABM_GETTASKBARPOS, hwnd=%p): stub\n", abd->hWnd); + return FALSE; + case ABM_ACTIVATE: + WINE_FIXME("SHAppBarMessage(ABM_ACTIVATE, hwnd=%p, lparam=%lx): stub\n", abd->hWnd, abd->lParam); + return TRUE; + case ABM_GETAUTOHIDEBAR: + WINE_FIXME("SHAppBarMessage(ABM_GETAUTOHIDEBAR, hwnd=%p, edge=%x): stub\n", abd->hWnd, abd->uEdge); + return 0; + case ABM_SETAUTOHIDEBAR: + WINE_FIXME("SHAppBarMessage(ABM_SETAUTOHIDEBAR, hwnd=%p, edge=%x, lparam=%lx): stub\n", abd->hWnd, abd->uEdge, abd->lParam); + return TRUE; + case ABM_WINDOWPOSCHANGED: + WINE_FIXME("SHAppBarMessage(ABM_WINDOWPOSCHANGED, hwnd=%p): stub\n", abd->hWnd); + return TRUE; + default: + WINE_FIXME("SHAppBarMessage(%x) unimplemented\n", msg); + return FALSE; + } +} + +LRESULT CALLBACK appbar_wndproc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_COPYDATA: + { + COPYDATASTRUCT* cds; + struct appbar_cmd cmd; + UINT_PTR result; + HANDLE return_hproc; + HANDLE return_map; + LPVOID return_view; + struct appbar_response* response; + + cds = (COPYDATASTRUCT*)lparam; + if (cds->cbData != sizeof(struct appbar_cmd)) + return TRUE; + CopyMemory(&cmd, cds->lpData, cds->cbData); + + result = handle_appbarmessage(cds->dwData, &cmd.abd); + + return_hproc = OpenProcess(PROCESS_DUP_HANDLE, FALSE, cmd.return_process); + if (return_hproc == NULL) + { + WINE_ERR("couldn't open calling process\n"); + return TRUE; + } + + if (!DuplicateHandle(return_hproc, cmd.return_map, GetCurrentProcess(), &return_map, 0, FALSE, DUPLICATE_SAME_ACCESS)) + { + WINE_ERR("couldn't duplicate handle\n"); + CloseHandle(return_hproc); + return TRUE; + } + CloseHandle(return_hproc); + + return_view = MapViewOfFile(return_map, FILE_MAP_WRITE, 0, 0, sizeof(struct appbar_response)); + + if (return_view) + { + response = (struct appbar_response*)return_view; + response->result = result; + response->rc = cmd.abd.rc; + + UnmapViewOfFile(return_view); + } + else + WINE_ERR("couldn't map view of file\n"); + + CloseHandle(return_map); + return TRUE; + } + default: + break; + } + + return DefWindowProcW(hwnd, msg, wparam, lparam); +} + +void initialize_appbar(void) +{ + WNDCLASSEXW class; + static const WCHAR classname[] = {'W','i','n','e','A','p','p','B','a','r',0}; + + /* register the appbar window class */ + ZeroMemory(&class, sizeof(class)); + class.cbSize = sizeof(class); + class.lpfnWndProc = appbar_wndproc; + class.hInstance = NULL; + class.lpszClassName = classname; + + if (!RegisterClassExW(&class)) + { + WINE_ERR("Could not register appbar message window class\n"); + return; + } + + appbarmsg_window = CreateWindowW(classname, classname, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); + if (!appbarmsg_window) + { + WINE_ERR("Could not create appbar message window\n"); + return; + } +} diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c index 552d11bab6c..8c6259d9fdd 100644 --- a/programs/explorer/desktop.c +++ b/programs/explorer/desktop.c @@ -307,6 +307,7 @@ void manage_desktop( WCHAR *arg ) SystemParametersInfoA( SPI_SETDESKPATTERN, -1, NULL, FALSE ); SetDeskWallPaper( (LPSTR)-1 ); initialize_display_settings( hwnd ); + initialize_appbar(); initialize_systray(); } else diff --git a/programs/explorer/explorer_private.h b/programs/explorer/explorer_private.h index ebff4de3f70..650552b1c5c 100644 --- a/programs/explorer/explorer_private.h +++ b/programs/explorer/explorer_private.h @@ -23,5 +23,6 @@ extern void manage_desktop( WCHAR *arg ); extern void initialize_systray(void); +extern void initialize_appbar(void); #endif /* __WINE_EXPLORER_PRIVATE_H */ diff --git a/programs/explorer/systray.c b/programs/explorer/systray.c index 07e683a8aa2..37f3551937e 100644 --- a/programs/explorer/systray.c +++ b/programs/explorer/systray.c @@ -109,7 +109,7 @@ static void create_tooltip(struct icon *icon) tooltips_initialized = TRUE; } - icon->tooltip = CreateWindowEx(WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, + icon->tooltip = CreateWindowExW(WS_EX_TOPMOST, TOOLTIPS_CLASSW, NULL, WS_POPUP | TTS_ALWAYSTIP, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, @@ -351,7 +351,7 @@ static BOOL handle_incoming(HWND hwndSource, COPYDATASTRUCT *cds) int ret = FALSE; if (cds->cbData < NOTIFYICONDATAW_V1_SIZE) return FALSE; - cbSize = ((PNOTIFYICONDATA)cds->lpData)->cbSize; + cbSize = ((PNOTIFYICONDATAW)cds->lpData)->cbSize; if (cbSize < NOTIFYICONDATAW_V1_SIZE) return FALSE; ZeroMemory(&nid, sizeof(nid)); @@ -544,7 +544,7 @@ void initialize_systray(void) { HMODULE x11drv; SIZE size; - WNDCLASSEX class; + WNDCLASSEXW class; static const WCHAR classname[] = {'S','h','e','l','l','_','T','r','a','y','W','n','d',0}; static const WCHAR winname[] = {'W','i','n','e',' ','S','y','s','t','e','m',' ','T','r','a','y',0}; @@ -561,12 +561,12 @@ void initialize_systray(void) class.style = CS_DBLCLKS; class.lpfnWndProc = tray_wndproc; class.hInstance = NULL; - class.hIcon = LoadIcon(0, IDI_WINLOGO); - class.hCursor = LoadCursor(0, IDC_ARROW); + class.hIcon = LoadIconW(0, (LPCWSTR)IDI_WINLOGO); + class.hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW); class.hbrBackground = (HBRUSH) COLOR_WINDOW; class.lpszClassName = (WCHAR *) &classname; - if (!RegisterClassEx(&class)) + if (!RegisterClassExW(&class)) { WINE_ERR("Could not register SysTray window class\n"); return; diff --git a/programs/hh/Makefile.in b/programs/hh/Makefile.in index ed6bf92f9df..0f230e34cfd 100644 --- a/programs/hh/Makefile.in +++ b/programs/hh/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/hh/main.c b/programs/hh/main.c index 91506927fd2..8a00e608c55 100644 --- a/programs/hh/main.c +++ b/programs/hh/main.c @@ -28,7 +28,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdline, int cmds HMODULE hModule; DOWINMAIN *doWinMain; - hModule = LoadLibrary("hhctrl.ocx"); + hModule = LoadLibraryA("hhctrl.ocx"); doWinMain = (DOWINMAIN*) GetProcAddress(hModule, "doWinMain"); return doWinMain(hInst, cmdline); diff --git a/programs/icinfo/Makefile.in b/programs/icinfo/Makefile.in index 01c77014c22..a1da6e492ea 100644 --- a/programs/icinfo/Makefile.in +++ b/programs/icinfo/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/iexplore/Makefile.in b/programs/iexplore/Makefile.in index 219369c8f16..522af7d5d60 100644 --- a/programs/iexplore/Makefile.in +++ b/programs/iexplore/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/msiexec/Makefile.in b/programs/msiexec/Makefile.in index 1ab23c50eec..ef0af91d5c9 100644 --- a/programs/msiexec/Makefile.in +++ b/programs/msiexec/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/msiexec/msiexec.c b/programs/msiexec/msiexec.c index 6577c789a6a..9f20b5b1634 100644 --- a/programs/msiexec/msiexec.c +++ b/programs/msiexec/msiexec.c @@ -344,14 +344,14 @@ static DWORD DoRegServer(void) CHAR path[MAX_PATH+12]; DWORD ret = 0; - scm = OpenSCManager(NULL, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CREATE_SERVICE); + scm = OpenSCManagerA(NULL, SERVICES_ACTIVE_DATABASEA, SC_MANAGER_CREATE_SERVICE); if (!scm) { fprintf(stderr, "Failed to open the service control manager.\n"); return 1; } - GetSystemDirectory(path, MAX_PATH); + GetSystemDirectoryA(path, MAX_PATH); lstrcatA(path, "\\msiexec.exe /V"); service = CreateServiceA(scm, "MSIServer", "MSIServer", GENERIC_ALL, diff --git a/programs/msiexec/service.c b/programs/msiexec/service.c index 64618b852f4..da552a712e6 100644 --- a/programs/msiexec/service.c +++ b/programs/msiexec/service.c @@ -132,7 +132,7 @@ static void WINAPI ServiceMain(DWORD argc, LPSTR *argv) UpdateSCMStatus(SERVICE_START_PENDING, NO_ERROR, 0); - kill_event = CreateEvent(0, TRUE, FALSE, 0); + kill_event = CreateEventW(0, TRUE, FALSE, 0); if (!kill_event) { fprintf(stderr, "Failed to create event\n"); @@ -156,7 +156,7 @@ DWORD DoService(void) { char service_name[] = "MSIServer"; - const SERVICE_TABLE_ENTRY service[] = + const SERVICE_TABLE_ENTRYA service[] = { {service_name, ServiceMain}, {NULL, NULL}, @@ -164,7 +164,7 @@ DWORD DoService(void) WINE_TRACE("Starting MSIServer service\n"); - if (!StartServiceCtrlDispatcher(service)) + if (!StartServiceCtrlDispatcherA(service)) { fprintf(stderr, "Failed to start MSIServer service\n"); return 1; diff --git a/programs/notepad/Zh.rc b/programs/notepad/Zh.rc index 771bb92f65b..89de2685ca5 100644 --- a/programs/notepad/Zh.rc +++ b/programs/notepad/Zh.rc @@ -68,7 +68,7 @@ POPUP "帮助(&H)" { DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 10, "MS Shell Dlg" +FONT 10, "MS Song" CAPTION "页面设置" { LTEXT "页眉(&H):", 0x140, 10, 07, 40, 15 @@ -167,7 +167,7 @@ POPUP "幫助(&H)" { DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -FONT 10, "MS Song" +FONT 10, "PMingLiu" CAPTION "版面設定" { LTEXT "頁首(&H):", 0x140, 10, 07, 40, 15 @@ -205,12 +205,12 @@ STRING_UNTITLED, "(未命名)" STRING_ALL_FILES, "所有檔案 (*.*)" STRING_TEXT_FILES_TXT, "文本檔案 (*.txt)" -STRING_TOOLARGE, "記事本不能開啟 '%s' 這麼大的檔案, \n請使用別的編輯器。" +STRING_TOOLARGE, "記事本不能開啟 '%s' 這麼大的檔案,\n請使用別的編輯器。" STRING_NOTEXT, "您沒有輸入任何文本。\n請輸入一些再試" STRING_DOESNOTEXIST, "檔案 '%s'\n不存在\n\n您想新建一個檔案嗎?" STRING_NOTSAVED, "檔案 '%s'\n正文已更改\n\n是否儲存更改?" STRING_NOTFOUND, "找不到: '%s'" -STRING_OUT_OF_MEMORY, "沒有足夠的內存來完成此項任務, \n請關閉一些程式後再試。" +STRING_OUT_OF_MEMORY, "沒有足夠的內存來完成此項任務,\n請關閉一些程式後再試。" } #pragma code_page(default) diff --git a/programs/oleview/Zh.rc b/programs/oleview/Zh.rc new file mode 100644 index 00000000000..b63bc1a6a68 --- /dev/null +++ b/programs/oleview/Zh.rc @@ -0,0 +1,410 @@ +/* + * OleView (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDM_MENU MENU +{ + POPUP "文件(&F)" + { + MENUITEM "文件绑定(&B)...", IDM_BIND + MENUITEM "查看 &TypeLib...", IDM_TYPELIB + MENUITEM SEPARATOR + MENUITEM "系统设置(&S)...", IDM_SYSCONF + MENUITEM "运行注册表编辑器(&R)", IDM_REGEDIT + MENUITEM SEPARATOR + MENUITEM "退出(&X)", IDM_EXIT + } + POPUP "对象(&O)" + { + POPUP "&CoCreateInstance 参数" + { + MENUITEM "CLSCTX_&INPROC_SERVER", IDM_FLAG_INSERV,CHECKED + MENUITEM "CLSCTX_INPROC_&HANDLER", IDM_FLAG_INHANDL + MENUITEM "CLSCTX_&LOCAL_SERVER", IDM_FLAG_LOCSERV,CHECKED + MENUITEM "CLSCTX_&REMOTE_SERVER", IDM_FLAG_REMSERV + } + MENUITEM SEPARATOR + MENUITEM "查看类型信息(&T)", IDM_TYPEINFO, GRAYED + MENUITEM SEPARATOR + MENUITEM "创建实例(&I)", IDM_CREATEINST, GRAYED + MENUITEM "创建实例在(&O)...", IDM_CREATEINSTON, GRAYED + MENUITEM "释放实例(&R)", IDM_RELEASEINST, GRAYED + MENUITEM SEPARATOR + MENUITEM "复制 C&LSID 到剪贴板", IDM_COPYCLSID, GRAYED + MENUITEM "复制 &HTML 对象标记到剪贴板", IDM_HTMLTAG, GRAYED + MENUITEM SEPARATOR + MENUITEM "视图(&V)...", IDM_VIEW, GRAYED + } + POPUP "视图(&V)" + { + MENUITEM "专家状态(&E)", IDM_EXPERT,CHECKED + MENUITEM SEPARATOR + MENUITEM "隐藏部件分类(&H)", IDM_HIDDEN, GRAYED + MENUITEM SEPARATOR + MENUITEM "工具栏(&T)", IDM_TOOLBAR,CHECKED + MENUITEM "状态栏(&S)", IDM_STATUSBAR,CHECKED + MENUITEM SEPARATOR + MENUITEM "刷新(&R)\tF5", IDM_REFRESH + } + POPUP "帮助(&H)" + { + MENUITEM "关于 &OleView", IDM_ABOUT + } +} + +IDM_TYPELIB MENU +{ + POPUP "文件(&F)" + { + MENUITEM "另存为(&S)...", IDM_SAVEAS + MENUITEM "关闭(&C)", IDM_CLOSE + } + POPUP "视图(&V)" + { + MENUITEM "按类型分组(&G)", IDM_GROUP + MENUITEM SEPARATOR + MENUITEM "工具栏(&T)", IDM_TOOLBAR + MENUITEM "状态栏(&S)", IDM_STATUSBAR,CHECKED + } +} + +STRINGTABLE +{ + IDS_APPNAME "OleView" + IDS_APPTITLE "OleView" + IDS_READY "待命" + IDS_ABOUT "OleView - OLE/COM 对象查看器" + IDS_ABOUTVER "版本 1.0 " + IDS_TYPELIBTITLE "ITypeLib 查看器" + IDS_OPEN "打开" + IDS_OPEN_TYPELIB_FILTER "TypeLib 文件 (*.tlb;*.olb;*.dll;*.ocx;*.exe)\0*.tlb;*.olb;*.dll;*.ocx;*.exe\0All Files (*.*)\0*.*\0\0" + + IDM_BIND, "通过文件绰号绑定到文件" + IDM_TYPELIB, "打开 TypeLib 文件并查看内容" + IDM_SYSCONF, "修改本机分布式 COM 设置" + IDM_REGEDIT, "运行 Wine 注册表编辑器" + IDM_EXIT, "退出程序. 提示保存" + IDM_CREATEINST, "创建当前选定对象实例" + IDM_CREATEINSTON, "创建当前选定对象在指定计算机的实例" + IDM_RELEASEINST, "释放当前选定对象实例" + IDM_COPYCLSID, "把当前选定项目的 GUID 复制到剪贴板" + IDM_VIEW, "显示选定项目的查看器" + IDM_FLAG_INSERV, "呼叫 CoGetClassObject 时使用 CLSCTX_INPROC_SERVER" + IDM_FLAG_INHANDL, "呼叫 CoGetClassObject 时使用 CLSCTX_INPROC_HANDLER" + IDM_FLAG_LOCSERV, "呼叫 CoGetClassObject 时使用 CLSCTX_LOCAL_SERVER" + IDM_FLAG_REMSERV, "呼叫 CoGetClassObject 时使用 CLSCTX_REMOTE_SERVER" + IDM_EXPERT, "切换专家和新手显示模式" + IDM_HIDDEN, "切换隐藏组件类显示" + IDM_TOOLBAR, "显示或隐藏工具栏" + IDM_STATUSBAR, "显示或隐藏状态栏" + IDM_REFRESH, "刷新所有名单" + IDM_ABOUT, "显示程序信息、版本号及版权" + + IDM_SAVEAS, "存为 .IDL 或 .H 文件" + IDM_CLOSE, "关闭窗口" + IDM_GROUP, "按类别分组" + + IDS_TREE_OC, "对象类型" + IDS_TREE_GBCC, "按部件类型分组" + IDS_TREE_O1O, "OLE 1.0 对象" + IDS_TREE_CLO, "COM 函数库对象" + IDS_TREE_AO, "所有对象" + IDS_TREE_AID, "应用程序 IDs" + IDS_TREE_TL, "类型函数库" + IDS_TL_VER, "版本" + IDS_TREE_I, "界面" + + IDS_TAB_REG, "注册表" + IDS_TAB_IMPL, "实行" + IDS_TAB_ACTIV, "激活" + + IDS_CGCOFAIL, "CoGetClassObject 失败." + IDS_ERROR_UNKN, "未知错误" + IDS_TRUE, "真" + IDS_FALSE, "假" + IDS_BYTES, "字节" + + IDS_ERROR_LOADTYPELIB, "LoadTypeLib( %s ) 失败 ($%x)" + IDS_INHERITINTERFACES, "遗传界面" +} + +DLG_CREATEINSTON DIALOG DISCARDABLE 0, 0, 250, 41 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "连接到另外一台计算机" +FONT 9, "MS Song" +{ + LTEXT "计算机名称(&M):", IDIGNORE, 5, 6, 190, 8 + EDITTEXT IDC_MACHINE, 5, 16, 190, 12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "确定(&O)", IDOK, 200, 5, 45, 14 + PUSHBUTTON "取消(&C)", IDCANCEL, 200, 22, 45, 14 +} + +DLG_SYSCONF DIALOG DISCARDABLE 0, 0, 170, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "系统设置" +FONT 9, "MS Song" +{ + LTEXT "系统设置", IDIGNORE, 5, 6, 160, 8 + CHECKBOX "启用分布式CO&M", IDC_ENABLEDCOM, 5, 20, 160, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "启用远程连接(限&Win95)", IDC_ENABLEREMOTE, 5, 35, 160, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + LTEXT "这些设置只改变注册表值.\n它对Wine的性能没有影响.", IDIGNORE, 5, 50, 160, 40 + DEFPUSHBUTTON "确定(&O)", IDOK, 70, 80, 45, 14 + PUSHBUTTON "取消(&C)", IDCANCEL, 120, 80, 45, 14 +} + +DLG_DEFAULT_IV DIALOG DISCARDABLE 0, 0, 280, 50 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "默认界面查看器" +FONT 9, "MS Song" +{ + LTEXT "界面", IDIGNORE, 5, 6, 50, 8 + LTEXT "", IDC_LABEL, 60, 6, 145, 8 + LTEXT "IID:", IDIGNORE, 5, 16, 50, 8 + LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8 + DEFPUSHBUTTON "关闭(&C)", IDCANCEL, 230, 6, 45, 14 + PUSHBUTTON "查看类型信息(&V)", IDC_VIEWTYPEINFO, 6, 31, 70, 14, WS_DISABLED +} + +DLG_IPERSIST_IV DIALOG DISCARDABLE 0, 0, 280, 29 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "IPersist 界面查看器" +FONT 9, "MS Song" +{ + LTEXT "类别名称:", IDIGNORE, 5, 6, 50, 8 + LTEXT "", IDC_LABEL, 60, 6, 145, 8 + LTEXT "CLSID:", IDIGNORE, 5, 16, 50, 8 + LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8 + DEFPUSHBUTTON "关闭(&C)", IDCANCEL, 230, 6, 45, 14 +} + +DLG_IPERSISTSTREAM_IV DIALOG DISCARDABLE 0, 0, 280, 68 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "IPersistStream 界面查看器" +FONT 9, "MS Song" +{ + LTEXT "类别名称:", IDIGNORE, 5, 6, 50, 8 + LTEXT "", IDC_LABEL, 60, 6, 145, 8 + LTEXT "CLSID:", IDIGNORE, 5, 16, 50, 8 + LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8 + DEFPUSHBUTTON "关闭(&C)", IDCANCEL, 230, 6, 45, 14 + PUSHBUTTON "已修改(&I)", IDC_ISDIRTY_BUTTON, 6, 31, 50, 14 + LTEXT "???", IDC_ISDIRTY, 60, 34, 145, 8 + PUSHBUTTON "获取最大(&G)", IDC_GETSIZEMAX_BUTTON, 6, 49, 50, 14 + LTEXT "???", IDC_GETSIZEMAX, 60, 52, 145, 8 +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDM_MENU MENU +{ + POPUP "檔案(&F)" + { + MENUITEM "檔案綁定(&B)...", IDM_BIND + MENUITEM "查看 &TypeLib...", IDM_TYPELIB + MENUITEM SEPARATOR + MENUITEM "系統設定(&S)...", IDM_SYSCONF + MENUITEM "執行註冊表編輯器(&R)", IDM_REGEDIT + MENUITEM SEPARATOR + MENUITEM "結束(&X)", IDM_EXIT + } + POPUP "對象(&O)" + { + POPUP "&CoCreateInstance 參數" + { + MENUITEM "CLSCTX_&INPROC_SERVER", IDM_FLAG_INSERV,CHECKED + MENUITEM "CLSCTX_INPROC_&HANDLER", IDM_FLAG_INHANDL + MENUITEM "CLSCTX_&LOCAL_SERVER", IDM_FLAG_LOCSERV,CHECKED + MENUITEM "CLSCTX_&REMOTE_SERVER", IDM_FLAG_REMSERV + } + MENUITEM SEPARATOR + MENUITEM "查看類型資訊(&T)", IDM_TYPEINFO, GRAYED + MENUITEM SEPARATOR + MENUITEM "創建實例(&I)", IDM_CREATEINST, GRAYED + MENUITEM "創建實例在(&O)...", IDM_CREATEINSTON, GRAYED + MENUITEM "釋放實例(&R)", IDM_RELEASEINST, GRAYED + MENUITEM SEPARATOR + MENUITEM "複製 C&LSID 到剪貼板", IDM_COPYCLSID, GRAYED + MENUITEM "複製 &HTML 對象標記到剪貼板", IDM_HTMLTAG, GRAYED + MENUITEM SEPARATOR + MENUITEM "檢視(&V)...", IDM_VIEW, GRAYED + } + POPUP "檢視(&V)" + { + MENUITEM "專家狀態(&E)", IDM_EXPERT,CHECKED + MENUITEM SEPARATOR + MENUITEM "隱藏部件分類(&H)", IDM_HIDDEN, GRAYED + MENUITEM SEPARATOR + MENUITEM "工具欄(&T)", IDM_TOOLBAR,CHECKED + MENUITEM "狀態欄(&S)", IDM_STATUSBAR,CHECKED + MENUITEM SEPARATOR + MENUITEM "刷新(&R)\tF5", IDM_REFRESH + } + POPUP "幫助(&H)" + { + MENUITEM "關於 &OleView", IDM_ABOUT + } +} + +IDM_TYPELIB MENU +{ + POPUP "檔案(&F)" + { + MENUITEM "另存為(&S)...", IDM_SAVEAS + MENUITEM "關閉(&C)", IDM_CLOSE + } + POPUP "檢視(&V)" + { + MENUITEM "按類型分組(&G)", IDM_GROUP + MENUITEM SEPARATOR + MENUITEM "工具欄(&T)", IDM_TOOLBAR + MENUITEM "狀態欄(&S)", IDM_STATUSBAR,CHECKED + } +} + +STRINGTABLE +{ + IDS_APPNAME "OleView" + IDS_APPTITLE "OleView" + IDS_READY "待命" + IDS_ABOUT "OleView - OLE/COM 對象查看器" + IDS_ABOUTVER "版本 1.0 " + IDS_TYPELIBTITLE "ITypeLib 查看器" + IDS_OPEN "開啟" + IDS_OPEN_TYPELIB_FILTER "TypeLib 檔案 (*.tlb;*.olb;*.dll;*.ocx;*.exe)\0*.tlb;*.olb;*.dll;*.ocx;*.exe\0All Files (*.*)\0*.*\0\0" + + IDM_BIND, "通過檔案綽號綁定到檔案" + IDM_TYPELIB, "開啟 TypeLib 檔案並查看內容" + IDM_SYSCONF, "修改本機分佈式 COM 設定" + IDM_REGEDIT, "執行 Wine 註冊表編輯器" + IDM_EXIT, "結束程式. 提示儲存" + IDM_CREATEINST, "創建當前選定對象實例" + IDM_CREATEINSTON, "創建當前選定對象在指定電腦的實例" + IDM_RELEASEINST, "釋放當前選定對象實例" + IDM_COPYCLSID, "把當前選定項目的 GUID 複製到剪貼板" + IDM_VIEW, "顯示選定項目的查看器" + IDM_FLAG_INSERV, "呼叫 CoGetClassObject 時使用 CLSCTX_INPROC_SERVER" + IDM_FLAG_INHANDL, "呼叫 CoGetClassObject 時使用 CLSCTX_INPROC_HANDLER" + IDM_FLAG_LOCSERV, "呼叫 CoGetClassObject 時使用 CLSCTX_LOCAL_SERVER" + IDM_FLAG_REMSERV, "呼叫 CoGetClassObject 時使用 CLSCTX_REMOTE_SERVER" + IDM_EXPERT, "切換專家和新手顯示模式" + IDM_HIDDEN, "切換隱藏組件類顯示" + IDM_TOOLBAR, "顯示或隱藏工具欄" + IDM_STATUSBAR, "顯示或隱藏狀態欄" + IDM_REFRESH, "刷新所有名單" + IDM_ABOUT, "顯示程式資訊、版本號及版權" + + IDM_SAVEAS, "存為 .IDL 或 .H 檔案" + IDM_CLOSE, "關閉窗口" + IDM_GROUP, "按類別分組" + + IDS_TREE_OC, "對象類型" + IDS_TREE_GBCC, "按部件類型分組" + IDS_TREE_O1O, "OLE 1.0 對象" + IDS_TREE_CLO, "COM 函式庫對象" + IDS_TREE_AO, "所有對象" + IDS_TREE_AID, "應用程式 IDs" + IDS_TREE_TL, "類型函式庫" + IDS_TL_VER, "版本" + IDS_TREE_I, "界面" + + IDS_TAB_REG, "註冊表" + IDS_TAB_IMPL, "實行" + IDS_TAB_ACTIV, "激活" + + IDS_CGCOFAIL, "CoGetClassObject 失敗." + IDS_ERROR_UNKN, "未知錯誤" + IDS_TRUE, "真" + IDS_FALSE, "假" + IDS_BYTES, "字節" + + IDS_ERROR_LOADTYPELIB, "LoadTypeLib( %s ) 失敗 ($%x)" + IDS_INHERITINTERFACES, "遺傳界面" +} + +DLG_CREATEINSTON DIALOG DISCARDABLE 0, 0, 250, 41 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "連接到另外一台電腦" +FONT 8, "PMingLiu" +{ + LTEXT "電腦名稱(&M):", IDIGNORE, 5, 6, 190, 8 + EDITTEXT IDC_MACHINE, 5, 16, 190, 12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "確定(&O)", IDOK, 200, 5, 45, 14 + PUSHBUTTON "取消(&C)", IDCANCEL, 200, 22, 45, 14 +} + +DLG_SYSCONF DIALOG DISCARDABLE 0, 0, 170, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "系統設定" +FONT 8, "PMingLiu" +{ + LTEXT "系統設定", IDIGNORE, 5, 6, 160, 8 + CHECKBOX "啟用分佈式CO&M", IDC_ENABLEDCOM, 5, 20, 160, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "啟用遠程連接(限&Win95)", IDC_ENABLEREMOTE, 5, 35, 160, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + LTEXT "這些設定只改變註冊表值.\n它對Wine的性能沒有影響.", IDIGNORE, 5, 50, 160, 40 + DEFPUSHBUTTON "確定(&O)", IDOK, 70, 80, 45, 14 + PUSHBUTTON "取消(&C)", IDCANCEL, 120, 80, 45, 14 +} + +DLG_DEFAULT_IV DIALOG DISCARDABLE 0, 0, 280, 50 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "默認界面查看器" +FONT 8, "PMingLiu" +{ + LTEXT "界面", IDIGNORE, 5, 6, 50, 8 + LTEXT "", IDC_LABEL, 60, 6, 145, 8 + LTEXT "IID:", IDIGNORE, 5, 16, 50, 8 + LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8 + DEFPUSHBUTTON "關閉(&C)", IDCANCEL, 230, 6, 45, 14 + PUSHBUTTON "查看類型資訊(&V)", IDC_VIEWTYPEINFO, 6, 31, 70, 14, WS_DISABLED +} + +DLG_IPERSIST_IV DIALOG DISCARDABLE 0, 0, 280, 29 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "IPersist 界面查看器" +FONT 8, "PMingLiu" +{ + LTEXT "類別名稱:", IDIGNORE, 5, 6, 50, 8 + LTEXT "", IDC_LABEL, 60, 6, 145, 8 + LTEXT "CLSID:", IDIGNORE, 5, 16, 50, 8 + LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8 + DEFPUSHBUTTON "關閉(&C)", IDCANCEL, 230, 6, 45, 14 +} + +DLG_IPERSISTSTREAM_IV DIALOG DISCARDABLE 0, 0, 280, 68 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "IPersistStream 界面查看器" +FONT 8, "PMingLiu" +{ + LTEXT "類別名稱:", IDIGNORE, 5, 6, 50, 8 + LTEXT "", IDC_LABEL, 60, 6, 145, 8 + LTEXT "CLSID:", IDIGNORE, 5, 16, 50, 8 + LTEXT "", IDC_IDENTIFIER, 60, 16, 165, 8 + DEFPUSHBUTTON "關閉(&C)", IDCANCEL, 230, 6, 45, 14 + PUSHBUTTON "已修改(&I)", IDC_ISDIRTY_BUTTON, 6, 31, 50, 14 + LTEXT "???", IDC_ISDIRTY, 60, 34, 145, 8 + PUSHBUTTON "獲取最大(&G)", IDC_GETSIZEMAX_BUTTON, 6, 49, 50, 14 + LTEXT "???", IDC_GETSIZEMAX, 60, 52, 145, 8 +} + +#pragma code_page(default) diff --git a/programs/oleview/rsrc.rc b/programs/oleview/rsrc.rc index 5b4c7812fa4..4edf2fd8c59 100644 --- a/programs/oleview/rsrc.rc +++ b/programs/oleview/rsrc.rc @@ -32,6 +32,7 @@ #include "No.rc" #include "Pl.rc" #include "Ru.rc" +#include "Zh.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/programs/reg/Makefile.in b/programs/reg/Makefile.in index 8b3534480eb..17e8f81d164 100644 --- a/programs/reg/Makefile.in +++ b/programs/reg/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ @@ -5,7 +6,6 @@ VPATH = @srcdir@ MODULE = reg.exe APPMODE = -mconsole -municode IMPORTS = advapi32 user32 kernel32 -EXTRADEFS = -DUNICODE C_SRCS = reg.c diff --git a/programs/reg/reg.c b/programs/reg/reg.c index 32b533f874b..043872c8d42 100644 --- a/programs/reg/reg.c +++ b/programs/reg/reg.c @@ -27,7 +27,7 @@ static int reg_printfW(const WCHAR *msg, ...) WCHAR msg_buffer[8192]; va_start(va_args, msg); - wvsprintf(msg_buffer, msg, va_args); + wvsprintfW(msg_buffer, msg, va_args); va_end(va_args); wlen = lstrlenW(msg_buffer); @@ -57,7 +57,7 @@ static int reg_message(int msg, ...) va_list va_args; WCHAR msg_buffer[8192]; - LoadString(GetModuleHandle(NULL), msg, msg_buffer, + LoadStringW(GetModuleHandleW(NULL), msg, msg_buffer, sizeof(msg_buffer)/sizeof(WCHAR)); va_start(va_args, msg); reg_printfW(msg_buffer, va_args); diff --git a/programs/regedit/Ja.rc b/programs/regedit/Ja.rc index c895ed46f52..437f02a2ca1 100644 --- a/programs/regedit/Ja.rc +++ b/programs/regedit/Ja.rc @@ -46,8 +46,8 @@ BEGIN BEGIN MENUITEM "ƒL�[(&K)", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "•¶Žš—ñ(&S)", ID_EDIT_NEW_STRINGVALUE - MENUITEM "ƒoƒCƒiƒŠ(&B)", ID_EDIT_NEW_BINARYVALUE + MENUITEM "•¶Žš—ñ’l(&S)", ID_EDIT_NEW_STRINGVALUE + MENUITEM "ƒoƒCƒiƒŠ’l(&B)", ID_EDIT_NEW_BINARYVALUE MENUITEM "DWORD’l(&D)", ID_EDIT_NEW_DWORDVALUE MENUITEM "•¡�”�s•¶Žš—ñ’l(&M)", ID_EDIT_NEW_MULTI_STRINGVALUE END @@ -97,8 +97,8 @@ BEGIN BEGIN MENUITEM "ƒL�[(&K)", ID_EDIT_NEW_KEY MENUITEM SEPARATOR - MENUITEM "•¶Žš—ñ(&S)", ID_EDIT_NEW_STRINGVALUE - MENUITEM "ƒoƒCƒiƒŠ(&B)", ID_EDIT_NEW_BINARYVALUE + MENUITEM "•¶Žš—ñ’l(&S)", ID_EDIT_NEW_STRINGVALUE + MENUITEM "ƒoƒCƒiƒŠ’l(&B)", ID_EDIT_NEW_BINARYVALUE MENUITEM "DWORD’l(&D)", ID_EDIT_NEW_DWORDVALUE MENUITEM "•¡�”�s•¶Žš—ñ’l(&M)", ID_EDIT_NEW_MULTI_STRINGVALUE END @@ -118,6 +118,55 @@ END * Dialog */ +IDD_EXPORT_TEMPLATE DIALOG DISCARDABLE 50, 50, 278, 54 +STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "ƒŒƒWƒXƒgƒŠ‚̃GƒNƒXƒ|�[ƒg", IDC_EXPORT_BASE, 6, 6, 266, 42, WS_GROUP + AUTORADIOBUTTON "‚·‚ׂÄ(&A)", IDC_EXPORT_ALL, 12, 15, 244, 12 + AUTORADIOBUTTON "‘I‘ð‚³‚ê‚½•”•ª(&E):", IDC_EXPORT_SELECTED, 12, 30, 70, 12 + EDITTEXT IDC_EXPORT_PATH, 82, 30, 184, 12 +END + +IDD_FIND DIALOG DISCARDABLE 22, 17, 220, 85 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "ŒŸ�õ" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "ŒŸ�õ:",IDC_STATIC,5,7,119,8 + EDITTEXT IDC_VALUE_NAME,40,5,125,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "ŒŸ�õ‘Î�Û:",IDC_STATIC,5, 22, 119, 8 + CHECKBOX "ƒL�[", IDC_FIND_KEYS, 5, 34, 90, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "’l‚Ì–¼‘O", IDC_FIND_VALUES, 5, 46, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "’l‚Ì’†�g", IDC_FIND_CONTENT, 5, 58, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "Š®‘S‚Ɉê’v‚·‚é‚à‚Ì‚¾‚¯", IDC_FIND_WHOLE, 5, 70, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + DEFPUSHBUTTON "ŒŸ�õ",IDOK,175,5,40,15,WS_GROUP + PUSHBUTTON "•Â‚¶‚é",IDCANCEL,175,24,40,15, WS_GROUP +END + +IDD_ADDFAVORITE DIALOG DISCARDABLE 22, 17, 210, 55 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "‚¨‹C‚É“ü‚è‚ɒljÁ" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "–¼‘O:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,120,36,40,15,WS_GROUP + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹",IDCANCEL,165,36,40,15,WS_GROUP +END + +IDD_DELFAVORITE DIALOG DISCARDABLE 22, 17, 210, 90 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "‚¨‹C‚É“ü‚è‚Ì�í�œ" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "–¼‘O:",IDC_STATIC,5,5,119,8 + LISTBOX IDC_NAME_LIST,5,15,200,52, WS_BORDER | WS_TABSTOP | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL + DEFPUSHBUTTON "OK",IDOK,120,72,40,15,WS_GROUP + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹",IDCANCEL,165,72,40,15,WS_GROUP +END + IDD_EDIT_STRING DIALOG DISCARDABLE 22, 17, 210, 75 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "•¶Žš—ñ‚Ì•Ò�W" @@ -147,6 +196,32 @@ BEGIN PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹",IDCANCEL,175,80,30,11,WS_GROUP END +IDD_EDIT_BINARY DIALOG DISCARDABLE 22, 17, 170, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "ƒoƒCƒiƒŠ’l‚Ì•Ò�W" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "’l‚Ì–¼‘O:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,160,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "’l‚̃f�[ƒ^:",IDC_STATIC,5,30,90,8 + CONTROL "",IDC_VALUE_DATA,"HexEdit",WS_TABSTOP,5,40,160,40 + DEFPUSHBUTTON "OK",IDOK,80,83,40,15,WS_GROUP + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹",IDCANCEL,125,83,40,15,WS_GROUP +END + +IDD_EDIT_MULTI_STRING DIALOG DISCARDABLE 22, 17, 210, 175 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "•¡�”�s•¶Žš—ñ‚Ì•Ò�W" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "’l‚Ì–¼‘O:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "’l‚̃f�[ƒ^:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,112, WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN + DEFPUSHBUTTON "OK",IDOK,120,156,40,15,WS_GROUP + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹",IDCANCEL,165,156,40,15,WS_GROUP +END + /* * String Table */ @@ -177,9 +252,10 @@ STRINGTABLE DISCARDABLE BEGIN ID_EDIT_MODIFY "’l‚̃f�[ƒ^‚ð•Ï�X" ID_EDIT_NEW_KEY "�V‚µ‚¢ƒL�[‚ð’ljÁ" - ID_EDIT_NEW_STRINGVALUE "�V‚µ‚¢•¶Žš—ñ‚ð’ljÁ" + ID_EDIT_NEW_STRINGVALUE "�V‚µ‚¢•¶Žš—ñ’l‚ð’ljÁ" ID_EDIT_NEW_BINARYVALUE "�V‚µ‚¢ƒoƒCƒiƒŠ‚ð’ljÁ" ID_EDIT_NEW_DWORDVALUE "�V‚µ‚¢DWORD’l‚ð’ljÁ" + ID_EDIT_NEW_MULTI_STRINGVALUE "�V‚µ‚¢•¡�”�s•¶Žš—ñ’l‚ð’ljÁ" ID_REGISTRY_IMPORTREGISTRYFILE "ƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ðƒŒƒWƒXƒgƒŠ‚ɃCƒ“ƒ|�[ƒg" ID_REGISTRY_EXPORTREGISTRYFILE "ƒŒƒWƒXƒgƒŠ‚̈ꕔ‚Ü‚½‚Í‘S•”‚ðƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ɃGƒNƒXƒ|�[ƒg" @@ -216,9 +292,26 @@ BEGIN IDS_TOO_BIG_VALUE "’l‚ª‘å‚«‚·‚¬‚Ü‚· (%ld)" IDS_DELETE_BOX_TITLE "’l‚Ì�í�œŠm”F" IDS_DELETE_BOX_TEXT "–{“–‚É '%s'‚ð�í�œ‚µ‚Ü‚·‚©?" + IDS_DELETE_BOX_TEXT_MULTIPLE "‚±‚ê‚ç‚Ì’l‚ð�í�œ‚µ‚Ü‚·‚©?" IDS_NEWKEY "�V‚µ‚¢ƒL�[ #%d" IDS_NEWVALUE "�V‚µ‚¢’l #%d" - IDS_NOTFOUND "ŒŸ�õ•¶Žš—ñ '%s'‚ªŒ©•t‚©‚è‚Ü‚¹‚ñ" + IDS_NOTFOUND "ŒŸ�õ•¶Žš—ñ '%s'‚ªŒ©‚‚©‚è‚Ü‚¹‚ñ" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FILEDIALOG_IMPORT_TITLE "ƒŒƒWƒXƒgƒŠ ƒtƒ@ƒCƒ‹‚̃Cƒ“ƒ|�[ƒg" + IDS_FILEDIALOG_EXPORT_TITLE "ƒŒƒWƒXƒgƒŠ ƒtƒ@ƒCƒ‹‚̃GƒNƒXƒ|�[ƒg" + IDS_FILEDIALOG_FILTER "“o˜^ƒtƒ@ƒCƒ‹\0*.reg\0Win9x/NT4 “o˜^ƒtƒ@ƒCƒ‹ (REGEDIT4)\0*.reg\0‚·‚ׂẴtƒ@ƒCƒ‹ (*.*)\0*.*\0\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_REGISTRY_ROOT_NAME "ƒ}ƒC ƒRƒ“ƒsƒ…�[ƒ^" + IDS_REGISTRY_DEFAULT_VALUE "(Šù’è)" + IDS_REGISTRY_VALUE_NOT_SET "(’l‚Ì�Ý’è‚È‚µ)" + IDS_REGISTRY_VALUE_CANT_DISPLAY "(cannot display value)" + IDS_REGISTRY_UNKNOWN_TYPE "(unknown %d)" END /*****************************************************************/ diff --git a/programs/regedit/Zh.rc b/programs/regedit/Zh.rc new file mode 100644 index 00000000000..e4f3a00ea4f --- /dev/null +++ b/programs/regedit/Zh.rc @@ -0,0 +1,656 @@ +/* + * Regedit (Simplified and Traditional Chinese Resources) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "注册表(&R)" + BEGIN + MENUITEM "导入注册表文件(&I)...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "导出注册表文件(&E)...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "连接网络注册表(&C)...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "断开网络注册表(&D)...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "打印(&P)\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "退出(&X)", ID_REGISTRY_EXIT + END + POPUP "编辑(&E)" + BEGIN + MENUITEM "修改(&M)", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "新建(&N)" + BEGIN + MENUITEM "关键词(&K)", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "字符串值(&S)", ID_EDIT_NEW_STRINGVALUE + MENUITEM "二进制值(&B)", ID_EDIT_NEW_BINARYVALUE + MENUITEM "整数值(&D)", ID_EDIT_NEW_DWORDVALUE + MENUITEM "多字符串值(&M)", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "删除(&D)\tDEL", ID_EDIT_DELETE + MENUITEM "改名(&R)\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "复制关键词名称(&C)", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "查找(&F)\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "找下一个(&X)\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "视图(&V)" + BEGIN + MENUITEM "状态栏(&B)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "切开(&L)", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "刷新(&R)\tF5", ID_VIEW_REFRESH + END + POPUP "我的最爱(&F)" + BEGIN + MENUITEM "添加到我的最爱(&A)...", ID_FAVORITES_ADDTOFAVORITES + MENUITEM "删除我的最爱(&R)...", ID_FAVORITES_REMOVEFAVORITE + END + POPUP "帮助(&H)" + BEGIN + MENUITEM "帮助内容(&H)\tF1", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "关于注册表编辑器(&A)", ID_HELP_ABOUT + END +END + +IDR_POPUP_MENUS MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "修改(&M)", ID_EDIT_MODIFY + MENUITEM "修改二进制数据", ID_EDIT_MODIFY_BIN + MENUITEM SEPARATOR + MENUITEM "删除(&D)\tDEL", ID_EDIT_DELETE + MENUITEM "改名(&R)", ID_EDIT_RENAME + END + POPUP "" + BEGIN + POPUP "新建(&N)" + BEGIN + MENUITEM "关键词(&K)", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "字符串值(&S)", ID_EDIT_NEW_STRINGVALUE + MENUITEM "二进制值(&B)", ID_EDIT_NEW_BINARYVALUE + MENUITEM "整数值(&D)", ID_EDIT_NEW_DWORDVALUE + MENUITEM "多字符串值(&M)", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "删除(&D)\tDEL", ID_EDIT_DELETE + MENUITEM "改名(&R)\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "导出(&E)...", ID_EDIT_EXPORT + MENUITEM "复制关键词名称(&C)", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "查找(&F)\tCtrl+F", ID_EDIT_FIND, GRAYED + END +END + + +/* + * Dialog + */ + +IDD_EXPORT_TEMPLATE DIALOG DISCARDABLE 50, 50, 278, 54 +STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_BORDER +FONT 9, "MS Song" +BEGIN + GROUPBOX "导出注册表", IDC_EXPORT_BASE, 6, 6, 266, 42, WS_GROUP + AUTORADIOBUTTON "全部(&A)", IDC_EXPORT_ALL, 12, 15, 244, 12 + AUTORADIOBUTTON "指定分支(&E):", IDC_EXPORT_SELECTED, 12, 30, 70, 12 + EDITTEXT IDC_EXPORT_PATH, 82, 30, 184, 12 +END + +IDD_FIND DIALOG DISCARDABLE 22, 17, 220, 85 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "查找" +FONT 9, "MS Song" +BEGIN + LTEXT "查找:",IDC_STATIC,5,7,119,8 + EDITTEXT IDC_VALUE_NAME,40,5,125,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "在这找:",IDC_STATIC,5, 22, 119, 8 + CHECKBOX "关键词", IDC_FIND_KEYS, 5, 34, 90, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "值名称", IDC_FIND_VALUES, 5, 46, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "值内容", IDC_FIND_CONTENT, 5, 58, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "整词匹配", IDC_FIND_WHOLE, 5, 70, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + DEFPUSHBUTTON "查找",IDOK,175,5,40,15,WS_GROUP + PUSHBUTTON "关闭",IDCANCEL,175,24,40,15, WS_GROUP +END + +IDD_ADDFAVORITE DIALOG DISCARDABLE 22, 17, 210, 55 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "添加我的最爱" +FONT 9, "MS Song" +BEGIN + LTEXT "名称:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "确定",IDOK,120,36,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,36,40,15,WS_GROUP +END + +IDD_DELFAVORITE DIALOG DISCARDABLE 22, 17, 210, 90 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "删除我的最爱" +FONT 9, "MS Song" +BEGIN + LTEXT "名称:",IDC_STATIC,5,5,119,8 + LISTBOX IDC_NAME_LIST,5,15,200,52, WS_BORDER | WS_TABSTOP | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL + DEFPUSHBUTTON "确定",IDOK,120,72,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,72,40,15,WS_GROUP +END + +IDD_EDIT_STRING DIALOG DISCARDABLE 22, 17, 210, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "编辑字符串" +FONT 9, "MS Song" +BEGIN + LTEXT "值名称:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值数据:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "确定",IDOK,120,56,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,56,40,15,WS_GROUP +END + +IDD_EDIT_DWORD DIALOG DISCARDABLE 22, 17, 210, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "编辑整数" +FONT 9, "MS Song" +BEGIN + LTEXT "值名称:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值数据:",IDC_STATIC,5,30,90,8 + EDITTEXT IDC_VALUE_DATA,5,40,90,12, WS_BORDER | WS_TABSTOP + GROUPBOX "进位制", IDC_DWORD_BASE, 120, 30, 85, 37, BS_GROUPBOX + AUTORADIOBUTTON "十六进制", IDC_DWORD_HEX, 130, 40, 60, 10, WS_TABSTOP + AUTORADIOBUTTON "十进制", IDC_DWORD_DEC, 130, 52, 60, 10, WS_TABSTOP + DEFPUSHBUTTON "确定",IDOK,120,78,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,78,40,15,WS_GROUP +END + +IDD_EDIT_BINARY DIALOG DISCARDABLE 22, 17, 170, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "编辑二进制" +FONT 9, "MS Song" +BEGIN + LTEXT "值名称:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,160,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值数据:",IDC_STATIC,5,30,90,8 + CONTROL "",IDC_VALUE_DATA,"HexEdit",WS_TABSTOP,5,40,160,40 + DEFPUSHBUTTON "确定",IDOK,80,83,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,125,83,40,15,WS_GROUP +END + +IDD_EDIT_MULTI_STRING DIALOG DISCARDABLE 22, 17, 210, 175 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "编辑多个字符串" +FONT 9, "MS Song" +BEGIN + LTEXT "值名称:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值数据:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,112, WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN + DEFPUSHBUTTON "确定",IDOK,120,156,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,156,40,15,WS_GROUP +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "名称" + IDS_LIST_COLUMN_TYPE "类型" + IDS_LIST_COLUMN_DATA "数据" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "注册表编辑器" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "含有与注册表有关的全部命令" + ID_EDIT_MENU "含有与编辑数值有关的全部命令" + ID_VIEW_MENU "含有与注册表个性化有关的全部命令" + ID_FAVORITES_MENU "含有与使用常用关键词有关的全部命令" + ID_HELP_MENU "含有与帮助信息有关的全部命令" + ID_EDIT_NEW_MENU "含有与创建新值有关的全部命令" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "修改值的数据" + ID_EDIT_NEW_KEY "添加一个新的关键词" + ID_EDIT_NEW_STRINGVALUE "添加一个新的字符串值" + ID_EDIT_NEW_BINARYVALUE "添加一个新的二进制值" + ID_EDIT_NEW_DWORDVALUE "添加一个新的整数值" + ID_EDIT_NEW_MULTI_STRINGVALUE "添加一个新的多字符串值" + ID_REGISTRY_IMPORTREGISTRYFILE "将文本文件导入注册表" + ID_REGISTRY_EXPORTREGISTRYFILE "将注册表导出到文本文件" + ID_REGISTRY_CONNECTNETWORKREGISTRY "连接到远程计算机的注册表" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY "断开远程计算机的注册表" + ID_REGISTRY_PRINT "打印注册表的全部或部分" +/* ID_HELP_HELPTOPICS "打开注册表编辑器帮助" */ + ID_HELP_ABOUT "显示程序信息、版本号及版权" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "退出注册表编辑器" + ID_FAVORITES_ADDTOFAVORITES "把关键词添加到我的最爱" + ID_FAVORITES_REMOVEFAVORITE "从我的最爱中删除关键词" + ID_VIEW_STATUSBAR "显示或隐藏状态栏" + ID_VIEW_SPLIT "改变两个窗格之间的分隔线位置" + ID_VIEW_REFRESH "刷新视窗" + ID_EDIT_DELETE "删除选定项" + ID_EDIT_RENAME "选定项更名" + ID_EDIT_COPYKEYNAME "把关键词的名称复制到剪贴板" + ID_EDIT_FIND "在关键词、值或数据中找字符串" + ID_EDIT_FINDNEXT "查找下一个刚找过的字符串" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ERROR "错误" + IDS_BAD_KEY "不能查询关键词'%s'" + IDS_BAD_VALUE "不能查询值'%s'" + IDS_UNSUPPORTED_TYPE "不能编辑这类型的关键词 (%ld)" + IDS_TOO_BIG_VALUE "值太大 (%ld)" + IDS_DELETE_BOX_TITLE "值删除确认" + IDS_DELETE_BOX_TEXT "你确认要删除这个值吗 '%s'?" + IDS_DELETE_BOX_TEXT_MULTIPLE "你确认要删除这些值吗?" + IDS_NEWKEY "关键词 #%d" + IDS_NEWVALUE "新值 #%d" + IDS_NOTFOUND "查找字符串 '%s' 没找到" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FILEDIALOG_IMPORT_TITLE "导入注册表文件" + IDS_FILEDIALOG_EXPORT_TITLE "导出注册表文件" + IDS_FILEDIALOG_FILTER "注册表文件\0*.reg\0Win9x/NT4 注册表文件 (REGEDIT4)\0*.reg\0所有文件 (*.*)\0*.*\0\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_REGISTRY_ROOT_NAME "我的电脑" + IDS_REGISTRY_DEFAULT_VALUE "(默认)" + IDS_REGISTRY_VALUE_NOT_SET "(没有设值)" + IDS_REGISTRY_VALUE_CANT_DISPLAY "(不能显示值)" + IDS_REGISTRY_UNKNOWN_TYPE "(未知 %d)" +END + +/*****************************************************************/ + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Opens Registry Editor Help." + * ID_HELP_ABOUT "Displays program information, version number, and copyright." + *END + */ + +/*****************************************************************/ + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDR_REGEDIT_MENU MENU DISCARDABLE +BEGIN + POPUP "註冊表(&R)" + BEGIN + MENUITEM "導入註冊表檔案(&I)...", ID_REGISTRY_IMPORTREGISTRYFILE + MENUITEM "導出註冊表檔案(&E)...", ID_REGISTRY_EXPORTREGISTRYFILE + MENUITEM SEPARATOR + MENUITEM "连接網路註冊表(&C)...", ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED + MENUITEM "斷開網路註冊表(&D)...", ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED + MENUITEM SEPARATOR + MENUITEM "列印(&P)\tCtrl+P", ID_REGISTRY_PRINT, GRAYED + MENUITEM SEPARATOR + MENUITEM "結束(&X)", ID_REGISTRY_EXIT + END + POPUP "編輯(&E)" + BEGIN + MENUITEM "修改(&M)", ID_EDIT_MODIFY + MENUITEM SEPARATOR + POPUP "新建(&N)" + BEGIN + MENUITEM "關鍵詞(&K)", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "字符串值(&S)", ID_EDIT_NEW_STRINGVALUE + MENUITEM "二進制值(&B)", ID_EDIT_NEW_BINARYVALUE + MENUITEM "整數值(&D)", ID_EDIT_NEW_DWORDVALUE + MENUITEM "多字符串值(&M)", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "刪除(&D)\tDEL", ID_EDIT_DELETE + MENUITEM "改名(&R)\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "複製關鍵詞名稱(&C)", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "查找(&F)\tCtrl+F", ID_EDIT_FIND, GRAYED + MENUITEM "找下一個(&X)\tF3", ID_EDIT_FINDNEXT, GRAYED + END + POPUP "檢視(&V)" + BEGIN + MENUITEM "狀態欄(&B)", ID_VIEW_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "切開(&L)", ID_VIEW_SPLIT + MENUITEM SEPARATOR + MENUITEM "刷新(&R)\tF5", ID_VIEW_REFRESH + END + POPUP "我的最愛(&F)" + BEGIN + MENUITEM "添加到我的最愛(&A)...", ID_FAVORITES_ADDTOFAVORITES + MENUITEM "刪除我的最愛(&R)...", ID_FAVORITES_REMOVEFAVORITE + END + POPUP "幫助(&H)" + BEGIN + MENUITEM "幫助內容(&H)\tF1", ID_HELP_HELPTOPICS + MENUITEM SEPARATOR + MENUITEM "關於註冊表編輯器(&A)", ID_HELP_ABOUT + END +END + +IDR_POPUP_MENUS MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "修改(&M)", ID_EDIT_MODIFY + MENUITEM "修改二進制數據", ID_EDIT_MODIFY_BIN + MENUITEM SEPARATOR + MENUITEM "刪除(&D)\tDEL", ID_EDIT_DELETE + MENUITEM "改名(&R)", ID_EDIT_RENAME + END + POPUP "" + BEGIN + POPUP "新建(&N)" + BEGIN + MENUITEM "關鍵詞(&K)", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "字符串值(&S)", ID_EDIT_NEW_STRINGVALUE + MENUITEM "二進制值(&B)", ID_EDIT_NEW_BINARYVALUE + MENUITEM "整數值(&D)", ID_EDIT_NEW_DWORDVALUE + MENUITEM "多字符串值(&M)", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "刪除(&D)\tDEL", ID_EDIT_DELETE + MENUITEM "改名(&R)\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "導出(&E)...", ID_EDIT_EXPORT + MENUITEM "複製關鍵詞名稱(&C)", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "查找(&F)\tCtrl+F", ID_EDIT_FIND, GRAYED + END +END + + +/* + * Dialog + */ + +IDD_EXPORT_TEMPLATE DIALOG DISCARDABLE 50, 50, 278, 54 +STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_BORDER +FONT 8, "PMingLiu" +BEGIN + GROUPBOX "導出註冊表", IDC_EXPORT_BASE, 6, 6, 266, 42, WS_GROUP + AUTORADIOBUTTON "全部(&A)", IDC_EXPORT_ALL, 12, 15, 244, 12 + AUTORADIOBUTTON "指定分支(&E):", IDC_EXPORT_SELECTED, 12, 30, 70, 12 + EDITTEXT IDC_EXPORT_PATH, 82, 30, 184, 12 +END + +IDD_FIND DIALOG DISCARDABLE 22, 17, 220, 85 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "查找" +FONT 8, "PMingLiu" +BEGIN + LTEXT "查找:",IDC_STATIC,5,7,119,8 + EDITTEXT IDC_VALUE_NAME,40,5,125,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "在這找:",IDC_STATIC,5, 22, 119, 8 + CHECKBOX "關鍵詞", IDC_FIND_KEYS, 5, 34, 90, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "值名稱", IDC_FIND_VALUES, 5, 46, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "值內容", IDC_FIND_CONTENT, 5, 58, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "整詞匹配", IDC_FIND_WHOLE, 5, 70, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + DEFPUSHBUTTON "查找",IDOK,175,5,40,15,WS_GROUP + PUSHBUTTON "關閉",IDCANCEL,175,24,40,15, WS_GROUP +END + +IDD_ADDFAVORITE DIALOG DISCARDABLE 22, 17, 210, 55 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "添加我的最愛" +FONT 8, "PMingLiu" +BEGIN + LTEXT "名稱:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "確定",IDOK,120,36,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,36,40,15,WS_GROUP +END + +IDD_DELFAVORITE DIALOG DISCARDABLE 22, 17, 210, 90 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "刪除我的最愛" +FONT 8, "PMingLiu" +BEGIN + LTEXT "名稱:",IDC_STATIC,5,5,119,8 + LISTBOX IDC_NAME_LIST,5,15,200,52, WS_BORDER | WS_TABSTOP | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL + DEFPUSHBUTTON "確定",IDOK,120,72,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,72,40,15,WS_GROUP +END + +IDD_EDIT_STRING DIALOG DISCARDABLE 22, 17, 210, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "編輯字符串" +FONT 8, "PMingLiu" +BEGIN + LTEXT "值名稱:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值數據:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "確定",IDOK,120,56,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,56,40,15,WS_GROUP +END + +IDD_EDIT_DWORD DIALOG DISCARDABLE 22, 17, 210, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "編輯整數" +FONT 8, "PMingLiu" +BEGIN + LTEXT "值名稱:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值數據:",IDC_STATIC,5,30,90,8 + EDITTEXT IDC_VALUE_DATA,5,40,90,12, WS_BORDER | WS_TABSTOP + GROUPBOX "進位制", IDC_DWORD_BASE, 120, 30, 85, 37, BS_GROUPBOX + AUTORADIOBUTTON "十六進制", IDC_DWORD_HEX, 130, 40, 60, 10, WS_TABSTOP + AUTORADIOBUTTON "十進制", IDC_DWORD_DEC, 130, 52, 60, 10, WS_TABSTOP + DEFPUSHBUTTON "確定",IDOK,120,78,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,78,40,15,WS_GROUP +END + +IDD_EDIT_BINARY DIALOG DISCARDABLE 22, 17, 170, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "編輯二進制" +FONT 8, "PMingLiu" +BEGIN + LTEXT "值名稱:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,160,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值數據:",IDC_STATIC,5,30,90,8 + CONTROL "",IDC_VALUE_DATA,"HexEdit",WS_TABSTOP,5,40,160,40 + DEFPUSHBUTTON "確定",IDOK,80,83,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,125,83,40,15,WS_GROUP +END + +IDD_EDIT_MULTI_STRING DIALOG DISCARDABLE 22, 17, 210, 175 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "編輯多個字符串" +FONT 8, "PMingLiu" +BEGIN + LTEXT "值名稱:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "值數據:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,112, WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN + DEFPUSHBUTTON "確定",IDOK,120,156,40,15,WS_GROUP + PUSHBUTTON "取消",IDCANCEL,165,156,40,15,WS_GROUP +END + +/* + * String Table + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_LIST_COLUMN_NAME "名稱" + IDS_LIST_COLUMN_TYPE "類型" + IDS_LIST_COLUMN_DATA "數據" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "註冊表編輯器" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_MENU "含有與註冊表有關的全部指令" + ID_EDIT_MENU "含有與編輯數值有關的全部指令" + ID_VIEW_MENU "含有與註冊表個性化有關的全部指令" + ID_FAVORITES_MENU "含有與使用常用關鍵詞有關的全部指令" + ID_HELP_MENU "含有與幫助資訊有關的全部指令" + ID_EDIT_NEW_MENU "含有與創建新值有關的全部指令" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_EDIT_MODIFY "修改值的數據" + ID_EDIT_NEW_KEY "添加一個新的關鍵詞" + ID_EDIT_NEW_STRINGVALUE "添加一個新的字符串值" + ID_EDIT_NEW_BINARYVALUE "添加一個新的二進制值" + ID_EDIT_NEW_DWORDVALUE "添加一個新的整數值" + ID_EDIT_NEW_MULTI_STRINGVALUE "添加一個新的多字符串值" + ID_REGISTRY_IMPORTREGISTRYFILE "將文本檔案導入註冊表" + ID_REGISTRY_EXPORTREGISTRYFILE "將註冊表導出到文本檔案" + ID_REGISTRY_CONNECTNETWORKREGISTRY "连接到遠程電腦的註冊表" + ID_REGISTRY_DISCONNECTNETWORKREGISTRY "斷開遠程電腦的註冊表" + ID_REGISTRY_PRINT "列印註冊表的全部或部分" +/* ID_HELP_HELPTOPICS "開啟註冊表編輯器幫助" */ + ID_HELP_ABOUT "顯示程式資訊、版本號及版權" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_REGISTRY_EXIT "結束註冊表編輯器" + ID_FAVORITES_ADDTOFAVORITES "把關鍵詞添加到我的最愛" + ID_FAVORITES_REMOVEFAVORITE "從我的最愛中刪除關鍵詞" + ID_VIEW_STATUSBAR "顯示或隱藏狀態欄" + ID_VIEW_SPLIT "改變兩個窗格之間的分隔線位置" + ID_VIEW_REFRESH "刷新視窗" + ID_EDIT_DELETE "刪除選定項" + ID_EDIT_RENAME "選定項更名" + ID_EDIT_COPYKEYNAME "把關鍵詞的名稱複製到剪貼板" + ID_EDIT_FIND "在關鍵詞、值或數據中找字符串" + ID_EDIT_FINDNEXT "查找下一個剛找過的字符串" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_ERROR "錯誤" + IDS_BAD_KEY "不能查詢關鍵詞'%s'" + IDS_BAD_VALUE "不能查詢值'%s'" + IDS_UNSUPPORTED_TYPE "不能編輯這類型的關鍵詞 (%ld)" + IDS_TOO_BIG_VALUE "值太大 (%ld)" + IDS_DELETE_BOX_TITLE "值刪除確認" + IDS_DELETE_BOX_TEXT "你確認要刪除這個值嗎 '%s'?" + IDS_DELETE_BOX_TEXT_MULTIPLE "你確認要刪除這些值嗎?" + IDS_NEWKEY "關鍵詞 #%d" + IDS_NEWVALUE "新值 #%d" + IDS_NOTFOUND "查找字符串 '%s' 沒找到" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FILEDIALOG_IMPORT_TITLE "導入註冊表檔案" + IDS_FILEDIALOG_EXPORT_TITLE "導出註冊表檔案" + IDS_FILEDIALOG_FILTER "註冊表檔案\0*.reg\0Win9x/NT4 註冊表檔案 (REGEDIT4)\0*.reg\0所有檔案 (*.*)\0*.*\0\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_REGISTRY_ROOT_NAME "我的電腦" + IDS_REGISTRY_DEFAULT_VALUE "(默認)" + IDS_REGISTRY_VALUE_NOT_SET "(沒有設值)" + IDS_REGISTRY_VALUE_CANT_DISPLAY "(不能顯示值)" + IDS_REGISTRY_UNKNOWN_TYPE "(未知 %d)" +END + +/*****************************************************************/ + +/* + * TEXTINCLUDE + */ + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + + + +/* + * String Table + */ + +/* + *STRINGTABLE DISCARDABLE + *BEGIN + * ID_HELP_HELPTOPICS "Opens Registry Editor Help." + * ID_HELP_ABOUT "Displays program information, version number, and copyright." + *END + */ + +/*****************************************************************/ + +#pragma code_page(default) diff --git a/programs/regedit/childwnd.c b/programs/regedit/childwnd.c index 565c90d4bef..6f9d4876200 100644 --- a/programs/regedit/childwnd.c +++ b/programs/regedit/childwnd.c @@ -21,7 +21,6 @@ #define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */ #include #include -#include #include #include "main.h" @@ -38,18 +37,7 @@ static int last_split; * Local module support methods */ -LPCTSTR GetRootKeyName(HKEY hRootKey) -{ - if (hRootKey == HKEY_CLASSES_ROOT) return _T("HKEY_CLASSES_ROOT"); - if (hRootKey == HKEY_CURRENT_USER) return _T("HKEY_CURRENT_USER"); - if (hRootKey == HKEY_LOCAL_MACHINE) return _T("HKEY_LOCAL_MACHINE"); - if (hRootKey == HKEY_USERS) return _T("HKEY_USERS"); - if (hRootKey == HKEY_CURRENT_CONFIG) return _T("HKEY_CURRENT_CONFIG"); - if (hRootKey == HKEY_DYN_DATA) return _T("HKEY_DYN_DATA"); - return _T("UNKNOWN HKEY, PLEASE REPORT"); -} - -LPCWSTR GetRootKeyNameW(HKEY hRootKey) +LPCWSTR GetRootKeyName(HKEY hRootKey) { if(hRootKey == HKEY_CLASSES_ROOT) return reg_class_namesW[INDEX_HKEY_CLASSES_ROOT]; @@ -106,32 +94,7 @@ static void OnPaint(HWND hWnd) EndPaint(hWnd, &ps); } -static LPTSTR CombinePaths(LPCTSTR pPaths[], int nPaths) { - int i, len, pos; - LPTSTR combined; - for (i=0, len=0; icode) { - case TVN_ITEMEXPANDING: + case TVN_ITEMEXPANDINGW: return !OnTreeExpanding(g_pChildWnd->hTreeWnd, (NMTREEVIEW*)lParam); - case TVN_SELCHANGED: + case TVN_SELCHANGEDW: OnTreeSelectionChanged(g_pChildWnd->hTreeWnd, g_pChildWnd->hListWnd, - ((NMTREEVIEW *)lParam)->itemNew.hItem, TRUE); + ((NMTREEVIEWW *)lParam)->itemNew.hItem, TRUE); break; case NM_SETFOCUS: g_pChildWnd->nFocusPanel = 0; @@ -421,22 +353,23 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa TPM_RIGHTBUTTON, pt.x, pt.y, 0, hFrameWnd, NULL); break; } - case TVN_ENDLABELEDIT: { + case TVN_ENDLABELEDITW: { HKEY hRootKey; - LPNMTVDISPINFO dispInfo = (LPNMTVDISPINFO)lParam; - LPCTSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); + LPNMTVDISPINFOW dispInfo = (LPNMTVDISPINFOW)lParam; + LPWSTR path = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hRootKey); BOOL res = RenameKey(hWnd, hRootKey, path, dispInfo->item.pszText); if (res) { - TVITEMEX item; - LPTSTR fullPath = GetPathFullPath(g_pChildWnd->hTreeWnd, + TVITEMEXW item; + LPWSTR fullPath = GetPathFullPath(g_pChildWnd->hTreeWnd, dispInfo->item.pszText); item.mask = TVIF_HANDLE | TVIF_TEXT; item.hItem = TreeView_GetSelection(g_pChildWnd->hTreeWnd); item.pszText = dispInfo->item.pszText; - SendMessage( g_pChildWnd->hTreeWnd, TVM_SETITEMW, 0, (LPARAM)&item ); - SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)fullPath); + SendMessageW( g_pChildWnd->hTreeWnd, TVM_SETITEMW, 0, (LPARAM)&item ); + SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); } + HeapFree(GetProcessHeap(), 0, path); return res; } default: @@ -446,7 +379,7 @@ LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPa if (((int)wParam == LIST_WINDOW) && (g_pChildWnd != NULL)) { if (((LPNMHDR)lParam)->code == NM_SETFOCUS) { g_pChildWnd->nFocusPanel = 1; - } else if (!SendMessage(g_pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam)) { + } else if (!SendMessageW(g_pChildWnd->hListWnd, WM_NOTIFY_REFLECT, wParam, lParam)) { goto def; } } diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index 4e4c1ed751b..5856b641b2f 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -30,18 +30,19 @@ #include #include +#include "wine/unicode.h" #include "main.h" #include "regproc.h" #include "resource.h" -static const TCHAR* editValueName; -static TCHAR* stringValueData; +static const WCHAR* editValueName; +static WCHAR* stringValueData; static BOOL isDecimal; struct edit_params { HKEY hKey; - LPCTSTR lpszValueName; + LPCWSTR lpszValueName; void *pData; LONG cbData; }; @@ -86,17 +87,19 @@ void error(HWND hwnd, INT resId, ...) static void error_code_messagebox(HWND hwnd, DWORD error_code) { - LPTSTR lpMsgBuf; + LPWSTR lpMsgBuf; DWORD status; - TCHAR title[256]; - static TCHAR fallback[] = TEXT("Error displaying error message.\n"); - if (!LoadString(hInst, IDS_ERROR, title, COUNT_OF(title))) - lstrcpy(title, TEXT("Error")); - status = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, error_code, 0, (LPTSTR)&lpMsgBuf, 0, NULL); + WCHAR title[256]; + static WCHAR fallback[] = {'E','r','r','o','r',' ','d','i','s','p','l','a','y','i','n','g',' ','e','r','r','o','r',' ','m','e','s','s','a','g','e','.','\n',0}; + static const WCHAR title_error[] = {'E','r','r','o','r',0}; + + if (!LoadStringW(hInst, IDS_ERROR, title, COUNT_OF(title))) + lstrcpyW(title, title_error); + status = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error_code, 0, (LPWSTR)&lpMsgBuf, 0, NULL); if (!status) lpMsgBuf = fallback; - MessageBox(hwnd, lpMsgBuf, title, MB_OK | MB_ICONERROR); + MessageBoxW(hwnd, lpMsgBuf, title, MB_OK | MB_ICONERROR); if (lpMsgBuf != fallback) LocalFree(lpMsgBuf); } @@ -114,14 +117,14 @@ static BOOL change_dword_base(HWND hwndDlg, BOOL toHex) static INT_PTR CALLBACK modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { - TCHAR* valueData; + WCHAR* valueData; HWND hwndValue; int len; switch(uMsg) { case WM_INITDIALOG: - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, editValueName); - SetDlgItemText(hwndDlg, IDC_VALUE_DATA, stringValueData); + SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, editValueName); + SetDlgItemTextW(hwndDlg, IDC_VALUE_DATA, stringValueData); CheckRadioButton(hwndDlg, IDC_DWORD_HEX, IDC_DWORD_DEC, isDecimal ? IDC_DWORD_DEC : IDC_DWORD_HEX); return TRUE; case WM_COMMAND: @@ -134,10 +137,10 @@ static INT_PTR CALLBACK modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L break; case IDOK: if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA))) { - len = GetWindowTextLength(hwndValue); - if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(TCHAR)))) { + len = GetWindowTextLengthW(hwndValue); + if ((valueData = HeapReAlloc(GetProcessHeap(), 0, stringValueData, (len + 1) * sizeof(WCHAR)))) { stringValueData = valueData; - if (!GetWindowText(hwndValue, stringValueData, len + 1)) + if (!GetWindowTextW(hwndValue, stringValueData, len + 1)) *stringValueData = 0; } } @@ -162,9 +165,9 @@ static INT_PTR CALLBACK bin_modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPara params = (struct edit_params *)lParam; SetWindowLongPtr(hwndDlg, DWLP_USER, (ULONG_PTR)params); if (params->lpszValueName) - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, params->lpszValueName); + SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, params->lpszValueName); else - SetDlgItemText(hwndDlg, IDC_VALUE_NAME, g_pszDefaultValueName); + SetDlgItemTextW(hwndDlg, IDC_VALUE_NAME, g_pszDefaultValueName); SendDlgItemMessage(hwndDlg, IDC_VALUE_DATA, HEM_SETDATA, (WPARAM)params->cbData, (LPARAM)params->pData); return TRUE; case WM_COMMAND: @@ -176,8 +179,8 @@ static INT_PTR CALLBACK bin_modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPara if (pData) { - SendDlgItemMessage(hwndDlg, IDC_VALUE_DATA, HEM_GETDATA, (WPARAM)cbData, (LPARAM)pData); - lRet = RegSetValueEx(params->hKey, params->lpszValueName, 0, REG_BINARY, pData, cbData); + SendDlgItemMessageW(hwndDlg, IDC_VALUE_DATA, HEM_GETDATA, (WPARAM)cbData, (LPARAM)pData); + lRet = RegSetValueExW(params->hKey, params->lpszValueName, 0, REG_BINARY, pData, cbData); } else lRet = ERROR_OUTOFMEMORY; @@ -198,25 +201,27 @@ static INT_PTR CALLBACK bin_modify_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wPara return FALSE; } -static BOOL check_value(HWND hwnd, HKEY hKey, LPCTSTR valueName) +static BOOL check_value(HWND hwnd, HKEY hKey, LPCWSTR valueName) { - LONG lRet = RegQueryValueEx(hKey, valueName ? valueName : _T(""), 0, NULL, 0, NULL); + WCHAR empty = 0; + LONG lRet = RegQueryValueExW(hKey, valueName ? valueName : &empty, 0, NULL, 0, NULL); if(lRet != ERROR_SUCCESS) return FALSE; return TRUE; } -static LPTSTR read_value(HWND hwnd, HKEY hKey, LPCTSTR valueName, DWORD *lpType, LONG *len) +static LPWSTR read_value(HWND hwnd, HKEY hKey, LPCWSTR valueName, DWORD *lpType, LONG *len) { DWORD valueDataLen; - LPTSTR buffer = NULL; + LPWSTR buffer = NULL; LONG lRet; + WCHAR empty = 0; - lRet = RegQueryValueEx(hKey, valueName ? valueName : _T(""), 0, lpType, 0, &valueDataLen); + lRet = RegQueryValueExW(hKey, valueName ? valueName : &empty, 0, lpType, 0, &valueDataLen); if (lRet != ERROR_SUCCESS) { if (lRet == ERROR_FILE_NOT_FOUND && !valueName) { /* no default value here, make it up */ if (len) *len = 1; if (lpType) *lpType = REG_SZ; - buffer = HeapAlloc(GetProcessHeap(), 0, 1); + buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)); *buffer = '\0'; return buffer; } @@ -224,16 +229,17 @@ static LPTSTR read_value(HWND hwnd, HKEY hKey, LPCTSTR valueName, DWORD *lpType, goto done; } if ( *lpType == REG_DWORD ) valueDataLen = sizeof(DWORD); - if (!(buffer = HeapAlloc(GetProcessHeap(), 0, valueDataLen+1))) { + if (!(buffer = HeapAlloc(GetProcessHeap(), 0, valueDataLen+sizeof(WCHAR)))) { error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen); goto done; } - lRet = RegQueryValueEx(hKey, valueName, 0, 0, (LPBYTE)buffer, &valueDataLen); + lRet = RegQueryValueExW(hKey, valueName, 0, 0, (LPBYTE)buffer, &valueDataLen); if (lRet != ERROR_SUCCESS) { error(hwnd, IDS_BAD_VALUE, valueName); goto done; } - buffer[valueDataLen] = 0; + if((valueDataLen % sizeof(WCHAR)) == 0) + buffer[valueDataLen / sizeof(WCHAR)] = 0; if(len) *len = valueDataLen; return buffer; @@ -281,7 +287,7 @@ done: return result; } -BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) +BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName) { BOOL result = FALSE; DWORD type; @@ -289,7 +295,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) HKEY hKey; LONG len; - lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); + lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); return FALSE; @@ -299,20 +305,24 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) if(!(stringValueData = read_value(hwnd, hKey, valueName, &type, &len))) goto done; if ( (type == REG_SZ) || (type == REG_EXPAND_SZ) ) { - if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_STRING), hwnd, modify_dlgproc) == IDOK) { - lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)stringValueData, lstrlen(stringValueData) + 1); + if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_STRING), hwnd, modify_dlgproc) == IDOK) { + lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)stringValueData, (lstrlenW(stringValueData) + 1) * sizeof(WCHAR)); if (lRet == ERROR_SUCCESS) result = TRUE; else error_code_messagebox(hwnd, lRet); } } else if ( type == REG_DWORD ) { - wsprintf(stringValueData, isDecimal ? "%u" : "%x", *((DWORD*)stringValueData)); - if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_DWORD), hwnd, modify_dlgproc) == IDOK) { + const WCHAR u[] = {'%','u',0}; + const WCHAR x[] = {'%','x',0}; + wsprintfW(stringValueData, isDecimal ? u : x, *((DWORD*)stringValueData)); + if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_DWORD), hwnd, modify_dlgproc) == IDOK) { DWORD val; - if (_stscanf(stringValueData, isDecimal ? "%u" : "%x", &val)) { - lRet = RegSetValueEx(hKey, valueName, 0, type, (BYTE*)&val, sizeof(val)); + CHAR* valueA = GetMultiByteString(stringValueData); + if (_stscanf(valueA, isDecimal ? "%u" : "%x", &val)) { + lRet = RegSetValueExW(hKey, valueName, 0, type, (BYTE*)&val, sizeof(val)); if (lRet == ERROR_SUCCESS) result = TRUE; else error_code_messagebox(hwnd, lRet); } + HeapFree(GetProcessHeap(), 0, valueA); } } else if ( type == REG_BINARY ) { struct edit_params params; @@ -323,14 +333,14 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) result = DialogBoxParam(NULL, MAKEINTRESOURCE(IDD_EDIT_BINARY), hwnd, bin_modify_dlgproc, (LPARAM)¶ms); } else if ( type == REG_MULTI_SZ ) { - TCHAR char1 = (TCHAR)'\r', char2 = (TCHAR)'\n'; - TCHAR *tmpValueData = NULL; + WCHAR char1 = '\r', char2 = '\n'; + WCHAR *tmpValueData = NULL; INT i, j, count; for ( i = 0, count = 0; i < len - 1; i++) if ( !stringValueData[i] && stringValueData[i + 1] ) count++; - tmpValueData = HeapAlloc( GetProcessHeap(), 0, ( len + count ) * sizeof(TCHAR)); + tmpValueData = HeapAlloc( GetProcessHeap(), 0, ( len + count ) * sizeof(WCHAR)); if ( !tmpValueData ) goto done; for ( i = 0, j = 0; i < len - 1; i++) @@ -348,10 +358,10 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) stringValueData = tmpValueData; tmpValueData = NULL; - if (DialogBox(0, MAKEINTRESOURCE(IDD_EDIT_MULTI_STRING), hwnd, modify_dlgproc) == IDOK) + if (DialogBoxW(0, MAKEINTRESOURCEW(IDD_EDIT_MULTI_STRING), hwnd, modify_dlgproc) == IDOK) { - len = lstrlen( stringValueData ); - tmpValueData = HeapAlloc( GetProcessHeap(), 0, (len + 2) * sizeof(TCHAR)); + len = lstrlenW( stringValueData ); + tmpValueData = HeapAlloc( GetProcessHeap(), 0, (len + 2) * sizeof(WCHAR)); if ( !tmpValueData ) goto done; for ( i = 0, j = 0; i < len - 1; i++) @@ -371,7 +381,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName) HeapFree( GetProcessHeap(), 0, stringValueData); stringValueData = tmpValueData; - lRet = RegSetValueEx(hKey, valueName, 0, type, (LPBYTE)stringValueData, j * sizeof(TCHAR)); + lRet = RegSetValueExW(hKey, valueName, 0, type, (LPBYTE)stringValueData, j * sizeof(WCHAR)); if (lRet == ERROR_SUCCESS) result = TRUE; else error_code_messagebox(hwnd, lRet); } @@ -420,7 +430,7 @@ BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName, B BOOL result = FALSE; LONG lRet; HKEY hKey; - LPCWSTR visibleValueName = valueName ? valueName : g_pszDefaultValueNameW; + LPCWSTR visibleValueName = valueName ? valueName : g_pszDefaultValueName; WCHAR empty = 0; lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); @@ -489,9 +499,9 @@ done: return result; } -BOOL RenameValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName) +BOOL RenameValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR oldName, LPCWSTR newName) { - LPTSTR value = NULL; + LPWSTR value = NULL; DWORD type; LONG len, lRet; BOOL result = FALSE; @@ -500,7 +510,7 @@ BOOL RenameValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR oldName, LPC if (!oldName) return FALSE; if (!newName) return FALSE; - lRet = RegOpenKeyEx(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); + lRet = RegOpenKeyExW(hKeyRoot, keyPath, 0, KEY_READ | KEY_SET_VALUE, &hKey); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); return FALSE; @@ -509,14 +519,14 @@ BOOL RenameValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR oldName, LPC if (check_value(hwnd, hKey, newName)) goto done; value = read_value(hwnd, hKey, oldName, &type, &len); if(!value) goto done; - lRet = RegSetValueEx(hKey, newName, 0, type, (BYTE*)value, len); + lRet = RegSetValueExW(hKey, newName, 0, type, (BYTE*)value, len); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; } - lRet = RegDeleteValue(hKey, oldName); + lRet = RegDeleteValueW(hKey, oldName); if (lRet != ERROR_SUCCESS) { - RegDeleteValue(hKey, newName); + RegDeleteValueW(hKey, newName); error_code_messagebox(hwnd, lRet); goto done; } @@ -529,10 +539,10 @@ done: } -BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName) +BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCWSTR keyPath, LPCWSTR newName) { - LPTSTR parentPath = 0; - LPCTSTR srcSubKey = 0; + LPWSTR parentPath = 0; + LPCWSTR srcSubKey = 0; HKEY parentKey = 0; HKEY destKey = 0; BOOL result = FALSE; @@ -541,17 +551,18 @@ BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName) if (!keyPath || !newName) return FALSE; - if (!strrchr(keyPath, '\\')) { + if (!strrchrW(keyPath, '\\')) { parentKey = hRootKey; srcSubKey = keyPath; } else { - LPTSTR srcSubKey_copy; + LPWSTR srcSubKey_copy; - parentPath = strdup(keyPath); - srcSubKey_copy = strrchr(parentPath, '\\'); + parentPath = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(keyPath)+1)*sizeof(WCHAR)); + lstrcpyW(parentPath, keyPath); + srcSubKey_copy = strrchrW(parentPath, '\\'); *srcSubKey_copy = 0; srcSubKey = srcSubKey_copy + 1; - lRet = RegOpenKeyEx(hRootKey, parentPath, 0, KEY_READ | KEY_CREATE_SUB_KEY, &parentKey); + lRet = RegOpenKeyExW(hRootKey, parentPath, 0, KEY_READ | KEY_CREATE_SUB_KEY, &parentKey); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; @@ -559,9 +570,9 @@ BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName) } /* The following fails if the old name is the same as the new name. */ - if (!strcmp(srcSubKey, newName)) goto done; + if (!lstrcmpW(srcSubKey, newName)) goto done; - lRet = RegCreateKeyEx(parentKey, newName, 0, NULL, REG_OPTION_NON_VOLATILE, + lRet = RegCreateKeyExW(parentKey, newName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL /* FIXME */, &destKey, &disposition); if (disposition == REG_OPENED_EXISTING_KEY) lRet = ERROR_FILE_EXISTS; /* FIXME: we might want a better error message than this */ @@ -571,15 +582,15 @@ BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName) } /* FIXME: SHCopyKey does not copy the security attributes */ - lRet = SHCopyKey(parentKey, srcSubKey, destKey, 0); + lRet = SHCopyKeyW(parentKey, srcSubKey, destKey, 0); if (lRet != ERROR_SUCCESS) { RegCloseKey(destKey); - RegDeleteKey(parentKey, newName); + RegDeleteKeyW(parentKey, newName); error_code_messagebox(hwnd, lRet); goto done; } - lRet = SHDeleteKey(hRootKey, keyPath); + lRet = SHDeleteKeyW(hRootKey, keyPath); if (lRet != ERROR_SUCCESS) { error_code_messagebox(hwnd, lRet); goto done; @@ -591,7 +602,7 @@ done: RegCloseKey(destKey); if (parentKey) { RegCloseKey(parentKey); - free(parentPath); + HeapFree(GetProcessHeap(), 0, parentPath); } return result; } diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c index 2053f70278f..ea0d39b35e5 100644 --- a/programs/regedit/framewnd.c +++ b/programs/regedit/framewnd.c @@ -43,9 +43,9 @@ static WCHAR favoriteName[128]; static WCHAR searchString[128]; static int searchMask = SEARCH_KEYS | SEARCH_VALUES | SEARCH_CONTENT; -static TCHAR FileNameBuffer[_MAX_PATH]; -static TCHAR FileTitleBuffer[_MAX_PATH]; -static TCHAR FilterBuffer[_MAX_PATH]; +static WCHAR FileNameBuffer[_MAX_PATH]; +static WCHAR FileTitleBuffer[_MAX_PATH]; +static WCHAR FilterBuffer[_MAX_PATH]; /******************************************************************************* * Local module support methods @@ -56,7 +56,7 @@ static void resize_frame_rect(HWND hWnd, PRECT prect) RECT rt; /* if (IsWindowVisible(hToolBar)) { - SendMessage(hToolBar, WM_SIZE, 0, 0); + SendMessageW(hToolBar, WM_SIZE, 0, 0); GetClientRect(hToolBar, &rt); prect->top = rt.bottom+3; prect->bottom -= rt.bottom+3; @@ -105,7 +105,7 @@ static void UpdateMenuItems(HMENU hMenu) { BOOL bAllowEdit = FALSE; HKEY hRootKey = NULL; LPWSTR keyName; - keyName = GetItemPathW(hwndTV, TreeView_GetSelection(hwndTV), &hRootKey); + keyName = GetItemPath(hwndTV, TreeView_GetSelection(hwndTV), &hRootKey); if (GetFocus() != hwndTV || (keyName && *keyName)) { /* can't modify root keys, but allow for their values */ bAllowEdit = TRUE; } @@ -192,7 +192,7 @@ void SetupStatusBar(HWND hWnd, BOOL bResize) void UpdateStatusBar(void) { - LPWSTR fullPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, TRUE); + LPWSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, TRUE); SendMessageW(hStatusBar, SB_SETTEXTW, 0, (LPARAM)fullPath); HeapFree(GetProcessHeap(), 0, fullPath); } @@ -247,42 +247,43 @@ static BOOL CheckCommDlgError(HWND hWnd) return TRUE; } -static void ExportRegistryFile_StoreSelection(HWND hdlg, OPENFILENAME *pOpenFileName) +static void ExportRegistryFile_StoreSelection(HWND hdlg, OPENFILENAMEW *pOpenFileName) { if (IsDlgButtonChecked(hdlg, IDC_EXPORT_SELECTED)) { - INT len = SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_GETTEXTLENGTH, 0, 0); - pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(TCHAR)); - SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_GETTEXT, len+1, pOpenFileName->lCustData); + INT len = SendDlgItemMessageW(hdlg, IDC_EXPORT_PATH, WM_GETTEXTLENGTH, 0, 0); + pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), 0, (len+1)*sizeof(WCHAR)); + SendDlgItemMessageW(hdlg, IDC_EXPORT_PATH, WM_GETTEXT, len+1, pOpenFileName->lCustData); } else - pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TCHAR)); + pOpenFileName->lCustData = (LPARAM)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR)); } static UINT CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) { - static OPENFILENAME* pOpenFileName; - OFNOTIFY *pOfNotify; - LPTSTR path; + static OPENFILENAMEW* pOpenFileName; + OFNOTIFYW *pOfNotify; switch (uiMsg) { case WM_INITDIALOG: - pOpenFileName = (OPENFILENAME*)lParam; + pOpenFileName = (OPENFILENAMEW*)lParam; break; case WM_COMMAND: if (LOWORD(wParam) == IDC_EXPORT_PATH && HIWORD(wParam) == EN_UPDATE) CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, IDC_EXPORT_SELECTED); break; case WM_NOTIFY: - pOfNotify = (OFNOTIFY*)lParam; + pOfNotify = (OFNOTIFYW*)lParam; switch (pOfNotify->hdr.code) { case CDN_INITDONE: - path = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE); - SendDlgItemMessage(hdlg, IDC_EXPORT_PATH, WM_SETTEXT, 0, (LPARAM)path); + { + WCHAR* path = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE); + SendDlgItemMessageW(hdlg, IDC_EXPORT_PATH, WM_SETTEXT, 0, (LPARAM)path); HeapFree(GetProcessHeap(), 0, path); CheckRadioButton(hdlg, IDC_EXPORT_ALL, IDC_EXPORT_SELECTED, pOpenFileName->lCustData ? IDC_EXPORT_SELECTED : IDC_EXPORT_ALL); break; + } case CDN_FILEOK: ExportRegistryFile_StoreSelection(hdlg, pOpenFileName); break; @@ -295,15 +296,15 @@ static UINT CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, WPARA } -static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME *pofn) +static BOOL InitOpenFileName(HWND hWnd, OPENFILENAMEW *pofn) { - memset(pofn, 0, sizeof(OPENFILENAME)); - pofn->lStructSize = sizeof(OPENFILENAME); + memset(pofn, 0, sizeof(OPENFILENAMEW)); + pofn->lStructSize = sizeof(OPENFILENAMEW); pofn->hwndOwner = hWnd; pofn->hInstance = hInst; if (FilterBuffer[0] == 0) - LoadString(hInst, IDS_FILEDIALOG_FILTER, FilterBuffer, _MAX_PATH); + LoadStringW(hInst, IDS_FILEDIALOG_FILTER, FilterBuffer, _MAX_PATH); pofn->lpstrFilter = FilterBuffer; pofn->nFilterIndex = 1; pofn->lpstrFile = FileNameBuffer; @@ -333,17 +334,20 @@ static BOOL import_registry_filename(LPTSTR filename) static BOOL ImportRegistryFile(HWND hWnd) { - OPENFILENAME ofn; - TCHAR title[128]; + OPENFILENAMEW ofn; + WCHAR title[128]; InitOpenFileName(hWnd, &ofn); - LoadString(hInst, IDS_FILEDIALOG_IMPORT_TITLE, title, COUNT_OF(title)); + LoadStringW(hInst, IDS_FILEDIALOG_IMPORT_TITLE, title, COUNT_OF(title)); ofn.lpstrTitle = title; - if (GetOpenFileName(&ofn)) { - if (!import_registry_filename(ofn.lpstrFile)) { + if (GetOpenFileNameW(&ofn)) { + CHAR* fileA = GetMultiByteString(ofn.lpstrFile); + if (!import_registry_filename(fileA)) { /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/ + HeapFree(GetProcessHeap(), 0, fileA); return FALSE; } + HeapFree(GetProcessHeap(), 0, fileA); } else { CheckCommDlgError(hWnd); } @@ -354,21 +358,25 @@ static BOOL ImportRegistryFile(HWND hWnd) static BOOL ExportRegistryFile(HWND hWnd, BOOL export_branch) { - OPENFILENAME ofn; - TCHAR ExportKeyPath[_MAX_PATH]; - TCHAR title[128]; + OPENFILENAMEW ofn; + WCHAR ExportKeyPath[_MAX_PATH]; + WCHAR title[128]; - ExportKeyPath[0] = _T('\0'); + ExportKeyPath[0] = 0; InitOpenFileName(hWnd, &ofn); - LoadString(hInst, IDS_FILEDIALOG_EXPORT_TITLE, title, COUNT_OF(title)); + LoadStringW(hInst, IDS_FILEDIALOG_EXPORT_TITLE, title, COUNT_OF(title)); ofn.lpstrTitle = title; ofn.lCustData = export_branch; ofn.Flags = OFN_ENABLETEMPLATE | OFN_ENABLEHOOK | OFN_EXPLORER | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; - ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORT_TEMPLATE); - if (GetSaveFileName(&ofn)) { + ofn.lpTemplateName = MAKEINTRESOURCEW(IDD_EXPORT_TEMPLATE); + if (GetSaveFileNameW(&ofn)) { BOOL result; - result = export_registry_key(ofn.lpstrFile, (LPTSTR)ofn.lCustData); + CHAR* fileA = GetMultiByteString(ofn.lpstrFile); + CHAR* sectionA = GetMultiByteString((LPWSTR)ofn.lCustData); + result = export_registry_key(fileA, sectionA); + HeapFree(GetProcessHeap(), 0, fileA); + HeapFree(GetProcessHeap(), 0, sectionA); if (!result) { /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/ return FALSE; @@ -528,10 +536,10 @@ static INT_PTR CALLBACK addtofavorites_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM w case WM_INITDIALOG: { HKEY hKeyRoot = NULL; - LPWSTR ItemPath = GetItemPathW(g_pChildWnd->hTreeWnd, NULL, &hKeyRoot); + LPWSTR ItemPath = GetItemPath(g_pChildWnd->hTreeWnd, NULL, &hKeyRoot); if(!ItemPath || !*ItemPath) - ItemPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE); + ItemPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE); EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE); SetWindowTextW(hwndValue, ItemPath); SendMessageW(hwndValue, EM_SETLIMITTEXT, 127, 0); @@ -604,8 +612,8 @@ static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM w } break; case IDOK: { - int pos = SendMessage(hwndList, LB_GETCURSEL, 0, 0); - int len = SendMessage(hwndList, LB_GETTEXTLEN, pos, 0); + int pos = SendMessageW(hwndList, LB_GETCURSEL, 0, 0); + int len = SendMessageW(hwndList, LB_GETTEXTLEN, pos, 0); if (len>0) { LPWSTR lpName = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(len+1)); SendMessageW(hwndList, LB_GETTEXT, pos, (LPARAM)lpName); @@ -636,7 +644,6 @@ static INT_PTR CALLBACK removefavorite_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM w static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HKEY hKeyRoot = 0; - LPCTSTR valueName; DWORD valueType; int curIndex; BOOL firstItem = TRUE; @@ -679,7 +686,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } case ID_EDIT_DELETE: if (GetFocus() == g_pChildWnd->hTreeWnd) { - WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); if (keyPath == 0 || *keyPath == 0) { MessageBeep(MB_ICONHAND); } else if (DeleteKey(hWnd, hKeyRoot, keyPath)) { @@ -687,12 +694,11 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } HeapFree(GetProcessHeap(), 0, keyPath); } else if (GetFocus() == g_pChildWnd->hListWnd) { - WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, -1, LVNI_SELECTED); while(curIndex != -1) { - WCHAR* valueNameW; + WCHAR* valueName = GetItemText(g_pChildWnd->hListWnd, curIndex); - valueName = GetItemText(g_pChildWnd->hListWnd, curIndex); curIndex = ListView_GetNextItem(g_pChildWnd->hListWnd, curIndex, LVNI_SELECTED); if(curIndex != -1 && firstItem) { if (MessageBoxW(hWnd, MAKEINTRESOURCEW(IDS_DELETE_BOX_TEXT_MULTIPLE), @@ -700,14 +706,14 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) MB_YESNO | MB_ICONEXCLAMATION) != IDYES) break; } - valueNameW = GetWideString(valueName); - if (!DeleteValue(hWnd, hKeyRoot, keyPath, valueNameW, curIndex==-1 && firstItem)) + + if (!DeleteValue(hWnd, hKeyRoot, keyPath, valueName, curIndex==-1 && firstItem)) { - HeapFree(GetProcessHeap(), 0, valueNameW); + HeapFree(GetProcessHeap(), 0, valueName); break; } firstItem = FALSE; - HeapFree(GetProcessHeap(), 0, valueNameW); + HeapFree(GetProcessHeap(), 0, valueName); } RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); HeapFree(GetProcessHeap(), 0, keyPath); @@ -715,15 +721,11 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; case ID_EDIT_MODIFY: { - LPCWSTR valueNameW = GetValueName(g_pChildWnd->hListWnd); - CHAR* valueNameA = GetMultiByteString(valueNameW); - WCHAR* keyPathW = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); - CHAR* keyPathA = GetMultiByteString(keyPathW); - if (ModifyValue(hWnd, hKeyRoot, keyPathA, valueNameA)) - RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPathW, valueNameW); - HeapFree(GetProcessHeap(), 0, valueNameA); - HeapFree(GetProcessHeap(), 0, keyPathW); - HeapFree(GetProcessHeap(), 0, keyPathA); + LPCWSTR valueName = GetValueName(g_pChildWnd->hListWnd); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + if (ModifyValue(hWnd, hKeyRoot, keyPath, valueName)) + RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, valueName); + HeapFree(GetProcessHeap(), 0, keyPath); break; } case ID_EDIT_FIND: @@ -742,7 +744,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) hItem = FindNext(g_pChildWnd->hTreeWnd, hItem, searchString, searchMask, &row); SetCursor(hcursorOld); if (hItem) { - SendMessage( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem ); + SendMessageW( g_pChildWnd->hTreeWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem ); InvalidateRect(g_pChildWnd->hTreeWnd, NULL, TRUE); UpdateWindow(g_pChildWnd->hTreeWnd); if (row != -1) { @@ -762,7 +764,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } case ID_EDIT_COPYKEYNAME: { - LPWSTR fullPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE); + LPWSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE); if (fullPath) { CopyKeyName(hWnd, fullPath); HeapFree(GetProcessHeap(), 0, fullPath); @@ -772,7 +774,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_EDIT_NEW_KEY: { WCHAR newKeyW[MAX_NEW_KEY_LEN]; - WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); if (CreateKey(hWnd, hKeyRoot, keyPath, newKeyW)) { if (InsertNode(g_pChildWnd->hTreeWnd, 0, newKeyW)) StartKeyRename(g_pChildWnd->hTreeWnd); @@ -794,19 +796,18 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) /* fall through */ create_value: { - WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); WCHAR newKey[MAX_NEW_KEY_LEN]; if (CreateValue(hWnd, hKeyRoot, keyPath, valueType, newKey)) { RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, newKey); StartValueRename(g_pChildWnd->hListWnd); - /* FIXME: start rename */ } HeapFree(GetProcessHeap(), 0, keyPath); } break; case ID_EDIT_RENAME: { - WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); if (keyPath == 0 || *keyPath == 0) { MessageBeep(MB_ICONHAND); } else if (GetFocus() == g_pChildWnd->hTreeWnd) { @@ -831,7 +832,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_FAVORITES_ADDTOFAVORITES: { HKEY hKey; - LPWSTR lpKeyPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE); + LPWSTR lpKeyPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE); if (lpKeyPath) { if (DialogBox(0, MAKEINTRESOURCE(IDD_ADDFAVORITE), hWnd, addtofavorites_dlgproc) == IDOK) { if (RegCreateKeyExW(HKEY_CURRENT_USER, favoritesKey, @@ -859,7 +860,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } case ID_VIEW_REFRESH: { - WCHAR* keyPath = GetItemPathW(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); + WCHAR* keyPath = GetItemPath(g_pChildWnd->hTreeWnd, 0, &hKeyRoot); RefreshTreeView(g_pChildWnd->hTreeWnd); RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); HeapFree(GetProcessHeap(), 0, keyPath); @@ -890,7 +891,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) if(ClientToScreen(g_pChildWnd->hWnd, &pts)) { SetCursorPos(pts.x, pts.y); SetCursor(LoadCursor(0, IDC_SIZEWE)); - SendMessage(g_pChildWnd->hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y)); + SendMessageW(g_pChildWnd->hWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(pt.x, pt.y)); } return TRUE; } diff --git a/programs/regedit/listview.c b/programs/regedit/listview.c index 0a919a0fd80..65efecb5405 100644 --- a/programs/regedit/listview.c +++ b/programs/regedit/listview.c @@ -2,6 +2,7 @@ * Regedit listviews * * Copyright (C) 2002 Robert Dickenson + * Copyright (C) 2008 Alexander N. Sørnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,11 +22,9 @@ #include #include #include -#include #include #include "main.h" -#include "regproc.h" #include "wine/unicode.h" static INT Image_String; @@ -49,37 +48,13 @@ static BOOL g_invertSort = FALSE; static LPWSTR g_valueName; static LPWSTR g_currentPath; static HKEY g_currentRootKey; -static WCHAR g_szValueNotSetW[64]; -static TCHAR g_szValueNotSet[64]; +static WCHAR g_szValueNotSet[64]; #define MAX_LIST_COLUMNS (IDS_LIST_COLUMN_LAST - IDS_LIST_COLUMN_FIRST + 1) static int default_column_widths[MAX_LIST_COLUMNS] = { 200, 175, 400 }; static int column_alignment[MAX_LIST_COLUMNS] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT }; -LPTSTR GetItemText(HWND hwndLV, UINT item) -{ - LPTSTR newStr, curStr; - unsigned int maxLen = 128; - - curStr = HeapAlloc(GetProcessHeap(), 0, maxLen); - if (!curStr) return NULL; - if (item == 0) { /* first item is ALWAYS a default */ - HeapFree(GetProcessHeap(), 0, curStr); - return NULL; - } - do { - ListView_GetItemText(hwndLV, item, 0, curStr, maxLen); - if (_tcslen(curStr) < maxLen - 1) return curStr; - newStr = HeapReAlloc(GetProcessHeap(), 0, curStr, maxLen * 2); - if (!newStr) break; - curStr = newStr; - maxLen *= 2; - } while (TRUE); - HeapFree(GetProcessHeap(), 0, curStr); - return NULL; -} - -LPWSTR GetItemTextW(HWND hwndLV, UINT item) +LPWSTR GetItemText(HWND hwndLV, UINT item) { LPWSTR newStr, curStr; unsigned int maxLen = 128; @@ -113,7 +88,7 @@ LPCWSTR GetValueName(HWND hwndLV) item = ListView_GetNextItem(hwndLV, -1, LVNI_FOCUSED); if (item == -1) return NULL; - g_valueName = GetItemTextW(hwndLV, item); + g_valueName = GetItemText(hwndLV, item); return g_valueName; } @@ -192,7 +167,7 @@ static void AddEntryToList(HWND hwndLV, LPWSTR Name, DWORD dwValType, if (ValBuf) { ListView_SetItemTextW(hwndLV, index, 2, ValBuf); } else { - ListView_SetItemTextW(hwndLV, index, 2, g_szValueNotSetW); + ListView_SetItemTextW(hwndLV, index, 2, g_szValueNotSet); } break; case REG_DWORD: { @@ -240,15 +215,15 @@ static BOOL InitListViewImageList(HWND hWndListView) if (!himl) return FALSE; - hicon = LoadImage(hInst, MAKEINTRESOURCE(IDI_STRING), + hicon = LoadImageW(hInst, MAKEINTRESOURCEW(IDI_STRING), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); Image_String = ImageList_AddIcon(himl, hicon); - hicon = LoadImage(hInst, MAKEINTRESOURCE(IDI_BIN), + hicon = LoadImageW(hInst, MAKEINTRESOURCEW(IDI_BIN), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); Image_Binary = ImageList_AddIcon(himl, hicon); - SendMessage( hWndListView, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM) himl ); + SendMessageW( hWndListView, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM) himl ); /* fail if some of the icons failed to load */ if (ImageList_GetImageCount(himl) < 2) @@ -259,9 +234,9 @@ static BOOL InitListViewImageList(HWND hWndListView) static BOOL CreateListColumns(HWND hWndListView) { - TCHAR szText[50]; + WCHAR szText[50]; int index; - LV_COLUMN lvC; + LVCOLUMNW lvC; /* Create columns. */ lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; @@ -272,18 +247,18 @@ static BOOL CreateListColumns(HWND hWndListView) lvC.iSubItem = index; lvC.cx = default_column_widths[index]; lvC.fmt = column_alignment[index]; - LoadString(hInst, IDS_LIST_COLUMN_FIRST + index, szText, sizeof(szText)/sizeof(TCHAR)); - if (ListView_InsertColumn(hWndListView, index, &lvC) == -1) return FALSE; + LoadStringW(hInst, IDS_LIST_COLUMN_FIRST + index, szText, sizeof(szText)/sizeof(WCHAR)); + if (ListView_InsertColumnW(hWndListView, index, &lvC) == -1) return FALSE; } return TRUE; } /* OnGetDispInfo - processes the LVN_GETDISPINFO notification message. */ -static void OnGetDispInfo(NMLVDISPINFO* plvdi) +static void OnGetDispInfo(NMLVDISPINFOW* plvdi) { - static TCHAR buffer[200]; - static TCHAR reg_szT[] = {'R','E','G','_','S','Z',0}, + static WCHAR buffer[200]; + static WCHAR reg_szT[] = {'R','E','G','_','S','Z',0}, reg_expand_szT[] = {'R','E','G','_','E','X','P','A','N','D','_','S','Z',0}, reg_binaryT[] = {'R','E','G','_','B','I','N','A','R','Y',0}, reg_dwordT[] = {'R','E','G','_','D','W','O','R','D',0}, @@ -300,7 +275,7 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi) switch (plvdi->item.iSubItem) { case 0: - plvdi->item.pszText = (LPSTR)g_pszDefaultValueName; + plvdi->item.pszText = g_pszDefaultValueName; break; case 1: switch (((LINE_INFO*)plvdi->item.lParam)->dwValType) { @@ -333,9 +308,9 @@ static void OnGetDispInfo(NMLVDISPINFO* plvdi) break; default: { - TCHAR szUnknownFmt[64]; - LoadString(hInst, IDS_REGISTRY_UNKNOWN_TYPE, szUnknownFmt, COUNT_OF(szUnknownFmt)); - wsprintf(buffer, szUnknownFmt, plvdi->item.lParam); + WCHAR szUnknownFmt[64]; + LoadStringW(hInst, IDS_REGISTRY_UNKNOWN_TYPE, szUnknownFmt, COUNT_OF(szUnknownFmt)); + wsprintfW(buffer, szUnknownFmt, plvdi->item.lParam); plvdi->item.pszText = buffer; break; } @@ -403,12 +378,12 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR case WM_NOTIFY_REFLECT: switch (((LPNMHDR)lParam)->code) { - case LVN_BEGINLABELEDIT: - if (!((NMLVDISPINFO *)lParam)->item.iItem) + case LVN_BEGINLABELEDITW: + if (!((NMLVDISPINFOW *)lParam)->item.iItem) return 1; return 0; - case LVN_GETDISPINFO: - OnGetDispInfo((NMLVDISPINFO*)lParam); + case LVN_GETDISPINFOW: + OnGetDispInfo((NMLVDISPINFOW*)lParam); break; case LVN_COLUMNCLICK: if (g_columnToSort == ((LPNMLISTVIEW)lParam)->iSubItem) @@ -418,30 +393,25 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR g_invertSort = FALSE; } - SendMessage(hWnd, LVM_SORTITEMS, (WPARAM)hWnd, (LPARAM)CompareFunc); + SendMessageW(hWnd, LVM_SORTITEMS, (WPARAM)hWnd, (LPARAM)CompareFunc); break; - case LVN_ENDLABELEDIT: { - LPNMLVDISPINFO dispInfo = (LPNMLVDISPINFO)lParam; - LPTSTR valueName = GetItemText(hWnd, dispInfo->item.iItem); - LPSTR pathA; + case LVN_ENDLABELEDITW: { + LPNMLVDISPINFOW dispInfo = (LPNMLVDISPINFOW)lParam; + LPWSTR oldName = GetItemText(hWnd, dispInfo->item.iItem); LONG ret; - if (!valueName) return -1; /* cannot rename a default value */ - pathA = GetMultiByteString(g_currentPath); - ret = RenameValue(hWnd, g_currentRootKey, pathA, valueName, dispInfo->item.pszText); - HeapFree(GetProcessHeap(), 0, pathA); + if (!oldName) return -1; /* cannot rename a default value */ + ret = RenameValue(hWnd, g_currentRootKey, g_currentPath, oldName, dispInfo->item.pszText); if (ret) { - WCHAR* itemTextW = GetWideString(dispInfo->item.pszText); - RefreshListView(hWnd, g_currentRootKey, g_currentPath, itemTextW); - HeapFree(GetProcessHeap(), 0, itemTextW); + RefreshListView(hWnd, g_currentRootKey, g_currentPath, dispInfo->item.pszText); } - HeapFree(GetProcessHeap(), 0, valueName); + HeapFree(GetProcessHeap(), 0, oldName); return 0; } case NM_RETURN: { int cnt = ListView_GetNextItem(hWnd, -1, LVNI_FOCUSED | LVNI_SELECTED); if (cnt != -1) - SendMessage(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0); + SendMessageW(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0); } break; case NM_DBLCLK: { @@ -469,7 +439,7 @@ static LRESULT CALLBACK ListWndProc(HWND hWnd, UINT message, WPARAM wParam, LPAR ListView_SetItemState(hWnd, -1, 0, LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hWnd, info.iItem, LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED); - SendMessage(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0); + SendMessageW(hFrameWnd, WM_COMMAND, ID_EDIT_MODIFY, 0); } } break; @@ -496,24 +466,25 @@ HWND CreateListView(HWND hwndParent, UINT id) { RECT rcClient; HWND hwndLV; + WCHAR ListView[] = {'L','i','s','t',' ','V','i','e','w',0}; /* prepare strings */ - LoadString(hInst, IDS_REGISTRY_VALUE_NOT_SET, g_szValueNotSet, COUNT_OF(g_szValueNotSet)); - LoadStringW(hInst, IDS_REGISTRY_VALUE_NOT_SET, g_szValueNotSetW, COUNT_OF(g_szValueNotSetW)); + LoadStringW(hInst, IDS_REGISTRY_VALUE_NOT_SET, g_szValueNotSet, COUNT_OF(g_szValueNotSet)); /* Get the dimensions of the parent window's client area, and create the list view control. */ GetClientRect(hwndParent, &rcClient); - hwndLV = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTVIEW, _T("List View"), + hwndLV = CreateWindowExW(WS_EX_CLIENTEDGE, WC_LISTVIEWW, ListView, WS_VISIBLE | WS_CHILD | WS_TABSTOP | LVS_REPORT | LVS_EDITLABELS, 0, 0, rcClient.right, rcClient.bottom, hwndParent, (HMENU)ULongToHandle(id), hInst, NULL); if (!hwndLV) return NULL; - SendMessage(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); + SendMessageW(hwndLV, LVM_SETUNICODEFORMAT, TRUE, 0); + SendMessageW(hwndLV, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT); /* Initialize the image list */ if (!InitListViewImageList(hwndLV)) goto fail; if (!CreateListColumns(hwndLV)) goto fail; - g_orgListWndProc = (WNDPROC) SetWindowLongPtr(hwndLV, GWLP_WNDPROC, (LPARAM)ListWndProc); + g_orgListWndProc = (WNDPROC) SetWindowLongPtrW(hwndLV, GWLP_WNDPROC, (LPARAM)ListWndProc); return hwndLV; fail: DestroyWindow(hwndLV); diff --git a/programs/regedit/main.c b/programs/regedit/main.c index 3033d7dcffd..6fe129ac6f1 100644 --- a/programs/regedit/main.c +++ b/programs/regedit/main.c @@ -29,8 +29,7 @@ #define REGEDIT_DECLARE_FUNCTIONS #include "main.h" -TCHAR g_pszDefaultValueName[64]; -WCHAR g_pszDefaultValueNameW[64]; +WCHAR g_pszDefaultValueName[64]; BOOL ProcessCmdLine(LPSTR lpCmdLine); @@ -183,8 +182,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, /* Initialize global strings */ LoadString(hInstance, IDS_APP_TITLE, szTitle, COUNT_OF(szTitle)); - LoadString(hInstance, IDS_REGISTRY_DEFAULT_VALUE, g_pszDefaultValueName, COUNT_OF(g_pszDefaultValueName)); - LoadStringW(hInstance, IDS_REGISTRY_DEFAULT_VALUE, g_pszDefaultValueNameW, COUNT_OF(g_pszDefaultValueNameW)); + LoadStringW(hInstance, IDS_REGISTRY_DEFAULT_VALUE, g_pszDefaultValueName, COUNT_OF(g_pszDefaultValueName)); /* Store instance handle in our global variable */ hInst = hInstance; diff --git a/programs/regedit/main.h b/programs/regedit/main.h index aacacc68531..ab512568b40 100644 --- a/programs/regedit/main.h +++ b/programs/regedit/main.h @@ -90,8 +90,7 @@ extern enum OPTION_FLAGS Options; extern TCHAR szTitle[]; extern const TCHAR szFrameClass[]; extern const TCHAR szChildClass[]; -extern TCHAR g_pszDefaultValueName[]; -extern WCHAR g_pszDefaultValueNameW[]; +extern WCHAR g_pszDefaultValueName[]; /* Registry class names and their indexes */ extern const WCHAR* reg_class_namesW[]; @@ -108,9 +107,7 @@ extern const WCHAR* reg_class_namesW[]; extern void ShowAboutBox(HWND hWnd); /* childwnd.c */ -extern LPCTSTR GetRootKeyName(HKEY hRootKey); -extern LPTSTR GetItemFullPath(HWND hwndTV, HTREEITEM hItem, BOOL bFull); -extern LPWSTR GetItemFullPathW(HWND hwndTV, HTREEITEM hItem, BOOL bFull); +extern LPWSTR GetItemFullPath(HWND hwndTV, HTREEITEM hItem, BOOL bFull); extern LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM); /* framewnd.c */ @@ -122,7 +119,7 @@ extern void UpdateStatusBar(void); extern HWND CreateListView(HWND hwndParent, UINT id); extern BOOL RefreshListView(HWND hwndLV, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR highlightValue); extern HWND StartValueRename(HWND hwndLV); -extern LPTSTR GetItemText(HWND hwndLV, UINT item); +extern LPWSTR GetItemText(HWND hwndLV, UINT item); extern LPCWSTR GetValueName(HWND hwndLV); extern BOOL ListWndNotifyProc(HWND hWnd, WPARAM wParam, LPARAM lParam, BOOL *Result); extern BOOL IsDefaultValue(HWND hwndLV, int i); @@ -131,8 +128,7 @@ extern BOOL IsDefaultValue(HWND hwndLV, int i); extern HWND CreateTreeView(HWND hwndParent, LPWSTR pHostName, UINT id); extern BOOL RefreshTreeView(HWND hWndTV); extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv); -extern LPTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); -extern LPWSTR GetItemPathW(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); +extern LPWSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); extern BOOL DeleteNode(HWND hwndTV, HTREEITEM hItem); extern HTREEITEM InsertNode(HWND hwndTV, HTREEITEM hItem, LPWSTR name); extern HWND StartKeyRename(HWND hwndTV); @@ -142,11 +138,11 @@ extern HTREEITEM FindNext(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mod /* edit.c */ extern BOOL CreateKey(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPWSTR newKeyName); extern BOOL CreateValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, DWORD valueType, LPWSTR valueName); -extern BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCTSTR keyPath, LPCTSTR valueName); +extern BOOL ModifyValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName); extern BOOL DeleteKey(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath); extern BOOL DeleteValue(HWND hwnd, HKEY hKeyRoot, LPCWSTR keyPath, LPCWSTR valueName, BOOL showMessageBox); -extern BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR oldName, LPCTSTR newName); -extern BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCTSTR keyPath, LPCTSTR newName); +extern BOOL RenameValue(HWND hwnd, HKEY hRootKey, LPCWSTR keyPath, LPCWSTR oldName, LPCWSTR newName); +extern BOOL RenameKey(HWND hwnd, HKEY hRootKey, LPCWSTR keyPath, LPCWSTR newName); extern void error(HWND hwnd, INT resId, ...); /* hexedit.c */ diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c index eb724bea31d..b9825d4a8e0 100644 --- a/programs/regedit/regproc.c +++ b/programs/regedit/regproc.c @@ -70,13 +70,17 @@ if (!(p)) \ */ WCHAR* GetWideString(const char* strA) { - WCHAR* strW = NULL; - int len = MultiByteToWideChar(CP_ACP, 0, strA, -1, NULL, 0); + if(strA) + { + WCHAR* strW = NULL; + int len = MultiByteToWideChar(CP_ACP, 0, strA, -1, NULL, 0); - strW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); - CHECK_ENOUGH_MEMORY(strW); - MultiByteToWideChar(CP_ACP, 0, strA, -1, strW, len); - return strW; + strW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + CHECK_ENOUGH_MEMORY(strW); + MultiByteToWideChar(CP_ACP, 0, strA, -1, strW, len); + return strW; + } + return NULL; } /****************************************************************************** @@ -85,13 +89,17 @@ WCHAR* GetWideString(const char* strA) */ char* GetMultiByteString(const WCHAR* strW) { - char* strA = NULL; - int len = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL); + if(strW) + { + char* strA = NULL; + int len = WideCharToMultiByte(CP_ACP, 0, strW, -1, NULL, 0, NULL, NULL); - strA = HeapAlloc(GetProcessHeap(), 0, len); - CHECK_ENOUGH_MEMORY(strA); - WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, len, NULL, NULL); - return strA; + strA = HeapAlloc(GetProcessHeap(), 0, len); + CHECK_ENOUGH_MEMORY(strA); + WideCharToMultiByte(CP_ACP, 0, strW, -1, strA, len, NULL, NULL); + return strA; + } + return NULL; } /****************************************************************************** @@ -1157,6 +1165,7 @@ BOOL export_registry_key(CHAR *file_name, CHAR *reg_key_name) fclose(file); } HeapFree(GetProcessHeap(), 0, reg_key_name); + HeapFree(GetProcessHeap(), 0, val_name_buf); HeapFree(GetProcessHeap(), 0, val_buf); return TRUE; } diff --git a/programs/regedit/rsrc.rc b/programs/regedit/rsrc.rc index 6b62c8ae939..00886d23761 100644 --- a/programs/regedit/rsrc.rc +++ b/programs/regedit/rsrc.rc @@ -88,3 +88,4 @@ IDI_REGEDIT ICON DISCARDABLE regedit.ico #include "Ru.rc" #include "Si.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/programs/regedit/treeview.c b/programs/regedit/treeview.c index 12dd87a91e5..d028b4a877a 100644 --- a/programs/regedit/treeview.c +++ b/programs/regedit/treeview.c @@ -2,6 +2,7 @@ * Regedit treeview * * Copyright (C) 2002 Robert Dickenson + * Copyright (C) 2008 Alexander N. Sørnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -49,49 +49,7 @@ int Image_Root; static BOOL UpdateExpandingTree(HWND hwndTV, HTREEITEM hItem, int state); -static BOOL get_item_path(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPTSTR* pKeyPath, int* pPathLen, int* pMaxLen) -{ - TVITEM item; - int maxLen, len; - LPTSTR newStr; - - item.mask = TVIF_PARAM; - item.hItem = hItem; - if (!TreeView_GetItem(hwndTV, &item)) return FALSE; - - if (item.lParam) { - /* found root key with valid key value */ - *phKey = (HKEY)item.lParam; - return TRUE; - } - - if(!get_item_path(hwndTV, TreeView_GetParent(hwndTV, hItem), phKey, pKeyPath, pPathLen, pMaxLen)) return FALSE; - if (*pPathLen) { - (*pKeyPath)[*pPathLen] = _T('\\'); - ++(*pPathLen); - } - - do { - item.mask = TVIF_TEXT; - item.hItem = hItem; - item.pszText = *pKeyPath + *pPathLen; - item.cchTextMax = maxLen = *pMaxLen - *pPathLen; - if (!TreeView_GetItem(hwndTV, &item)) return FALSE; - len = _tcslen(item.pszText); - if (len < maxLen - 1) { - *pPathLen += len; - break; - } - newStr = HeapReAlloc(GetProcessHeap(), 0, *pKeyPath, *pMaxLen * 2); - if (!newStr) return FALSE; - *pKeyPath = newStr; - *pMaxLen *= 2; - } while(TRUE); - - return TRUE; -} - -static BOOL get_item_pathW(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPWSTR* pKeyPath, int* pPathLen, int* pMaxChars) +static BOOL get_item_path(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPWSTR* pKeyPath, int* pPathLen, int* pMaxChars) { TVITEMW item; int maxChars, chars; @@ -107,7 +65,7 @@ static BOOL get_item_pathW(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPWSTR* pK return TRUE; } - if(!get_item_pathW(hwndTV, TreeView_GetParent(hwndTV, hItem), phKey, pKeyPath, pPathLen, pMaxChars)) return FALSE; + if(!get_item_path(hwndTV, TreeView_GetParent(hwndTV, hItem), phKey, pKeyPath, pPathLen, pMaxChars)) return FALSE; if (*pPathLen) { (*pKeyPath)[*pPathLen] = '\\'; ++(*pPathLen); @@ -133,23 +91,7 @@ static BOOL get_item_pathW(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPWSTR* pK return TRUE; } -LPTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey) -{ - int pathLen = 0, maxLen; - TCHAR *pathBuffer; - - pathBuffer = HeapAlloc(GetProcessHeap(), 0, 1024); - if (!pathBuffer) return NULL; - *pathBuffer = 0; - maxLen = HeapSize(GetProcessHeap(), 0, pathBuffer); - if (maxLen == (SIZE_T) - 1) return NULL; - if (!hItem) hItem = TreeView_GetSelection(hwndTV); - if (!hItem) return NULL; - if (!get_item_path(hwndTV, hItem, phRootKey, &pathBuffer, &pathLen, &maxLen)) return NULL; - return pathBuffer; -} - -LPWSTR GetItemPathW(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey) +LPWSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey) { int pathLen = 0, maxLen; WCHAR *pathBuffer; @@ -162,7 +104,7 @@ LPWSTR GetItemPathW(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey) maxLen = maxLen / sizeof(WCHAR); if (!hItem) hItem = TreeView_GetSelection(hwndTV); if (!hItem) return NULL; - if (!get_item_pathW(hwndTV, hItem, phRootKey, &pathBuffer, &pathLen, &maxLen)) return NULL; + if (!get_item_path(hwndTV, hItem, phRootKey, &pathBuffer, &pathLen, &maxLen)) return NULL; return pathBuffer; } @@ -286,7 +228,7 @@ static BOOL match_item(HWND hwndTV, HTREEITEM hItem, LPCWSTR sstring, int mode, HKEY hKey, hRoot; DWORD lenName; - KeyPath = GetItemPathW(hwndTV, hItem, &hRoot); + KeyPath = GetItemPath(hwndTV, hItem, &hRoot); if (!KeyPath || !hRoot) return FALSE; @@ -398,7 +340,7 @@ static BOOL RefreshTreeItem(HWND hwndTV, HTREEITEM hItem) TVITEMW tvItem; hRoot = NULL; - KeyPath = GetItemPathW(hwndTV, hItem, &hRoot); + KeyPath = GetItemPath(hwndTV, hItem, &hRoot); if (!KeyPath || !hRoot) return FALSE; @@ -663,7 +605,7 @@ BOOL UpdateExpandingTree(HWND hwndTV, HTREEITEM hItem, int state) hcursorOld = SetCursor(LoadCursor(NULL, IDC_WAIT)); SendMessageW(hwndTV, WM_SETREDRAW, FALSE, 0); - keyPath = GetItemPathW(hwndTV, hItem, &hRoot); + keyPath = GetItemPath(hwndTV, hItem, &hRoot); if (!keyPath) goto done; if (*keyPath) { @@ -728,6 +670,7 @@ HWND CreateTreeView(HWND hwndParent, LPWSTR pHostName, UINT id) WS_VISIBLE | WS_CHILD | WS_TABSTOP | TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT, 0, 0, rcClient.right, rcClient.bottom, hwndParent, (HMENU)ULongToHandle(id), hInst, NULL); + SendMessageW(hwndTV, TVM_SETUNICODEFORMAT, TRUE, 0); /* Initialize the image list, and add items to the control. */ if (!InitTreeViewImageLists(hwndTV) || !InitTreeViewItems(hwndTV, pHostName)) { DestroyWindow(hwndTV); diff --git a/programs/regsvr32/Makefile.in b/programs/regsvr32/Makefile.in index 9b26b186146..8b8dce415d7 100644 --- a/programs/regsvr32/Makefile.in +++ b/programs/regsvr32/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/regsvr32/regsvr32.c b/programs/regsvr32/regsvr32.c index 690529f842c..75cc9c99450 100644 --- a/programs/regsvr32/regsvr32.c +++ b/programs/regsvr32/regsvr32.c @@ -86,7 +86,7 @@ static VOID *LoadProc(const char* strDll, const char* procName, HMODULE* DllHand { VOID* (*proc)(void); - *DllHandle = LoadLibraryEx(strDll, 0, LOAD_WITH_ALTERED_SEARCH_PATH); + *DllHandle = LoadLibraryExA(strDll, 0, LOAD_WITH_ALTERED_SEARCH_PATH); if(!*DllHandle) { if(!Silent) diff --git a/programs/rpcss/Makefile.in b/programs/rpcss/Makefile.in index 2afb6f70c20..48c63b76b6a 100644 --- a/programs/rpcss/Makefile.in +++ b/programs/rpcss/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/secedit/Makefile.in b/programs/secedit/Makefile.in index ddebe868919..58fa913bc61 100644 --- a/programs/secedit/Makefile.in +++ b/programs/secedit/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/services/Makefile.in b/programs/services/Makefile.in index 8bbd0ad438c..257489bd55f 100644 --- a/programs/services/Makefile.in +++ b/programs/services/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/spoolsv/Makefile.in b/programs/spoolsv/Makefile.in index 4ebf189ba46..4e4b169e743 100644 --- a/programs/spoolsv/Makefile.in +++ b/programs/spoolsv/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/start/Makefile.in b/programs/start/Makefile.in index d7deed00edc..976766f3524 100644 --- a/programs/start/Makefile.in +++ b/programs/start/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/start/start.c b/programs/start/start.c index 2b4a70e02a8..2009e78db7d 100644 --- a/programs/start/start.c +++ b/programs/start/start.c @@ -96,7 +96,7 @@ static void fatal_string_error(int which, DWORD error_code) { WCHAR msg[2048]; - if (!LoadStringW(GetModuleHandle(NULL), which, + if (!LoadStringW(GetModuleHandleW(NULL), which, msg, sizeof(msg)/sizeof(WCHAR))) WINE_ERR("LoadString failed, error %d\n", GetLastError()); @@ -107,7 +107,7 @@ static void fatal_string(int which) { WCHAR msg[2048]; - if (!LoadStringW(GetModuleHandle(NULL), which, + if (!LoadStringW(GetModuleHandleW(NULL), which, msg, sizeof(msg)/sizeof(WCHAR))) WINE_ERR("LoadString failed, error %d\n", GetLastError()); @@ -262,7 +262,7 @@ int wmain (int argc, WCHAR *argv[]) char* multibyte_unixpath; int multibyte_unixpath_len; - wine_get_dos_file_name_ptr = (void*)GetProcAddress(GetModuleHandle("KERNEL32"), "wine_get_dos_file_name"); + wine_get_dos_file_name_ptr = (void*)GetProcAddress(GetModuleHandleA("KERNEL32"), "wine_get_dos_file_name"); if (!wine_get_dos_file_name_ptr) fatal_string(STRING_UNIXFAIL); diff --git a/programs/svchost/Makefile.in b/programs/svchost/Makefile.in index df1685fad54..5cf61742a2f 100644 --- a/programs/svchost/Makefile.in +++ b/programs/svchost/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/taskmgr/Ja.rc b/programs/taskmgr/Ja.rc index 2754be56962..d904f3b02a6 100644 --- a/programs/taskmgr/Ja.rc +++ b/programs/taskmgr/Ja.rc @@ -36,16 +36,16 @@ BEGIN END POPUP "ƒIƒvƒVƒ‡ƒ“(&O)" BEGIN - MENUITEM "�í‚ÉŽè‘O‚É•\Ž¦(&A)", ID_OPTIONS_ALWAYSONTOP + MENUITEM "�í‚ÉŽè‘O‚É•\\Ž¦(&A)", ID_OPTIONS_ALWAYSONTOP , CHECKED MENUITEM "–¢Žg—pŽž‚É�Å�¬‰»(&M)", ID_OPTIONS_MINIMIZEONUSE , CHECKED MENUITEM "�Å�¬‰»Žž‚ɉB‚·(&H)", ID_OPTIONS_HIDEWHENMINIMIZED , CHECKED - MENUITEM "16bit ƒ^ƒXƒN‚Ì•\Ž¦(&S)", ID_OPTIONS_SHOW16BITTASKS + MENUITEM "16bit ƒ^ƒXƒN‚Ì•\\Ž¦(&S)", ID_OPTIONS_SHOW16BITTASKS , CHECKED END - POPUP "•\Ž¦(&V)" + POPUP "•\\Ž¦(&V)" BEGIN MENUITEM "�Å�V‚Ì�î•ñ‚É�X�V(&R)", ID_VIEW_REFRESH POPUP "�X�V‚Ì•p“x(&U)" @@ -69,16 +69,16 @@ BEGIN MENUITEM "CPU ‚²‚Æ‚É 1 ƒOƒ‰ƒt(&P)", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU , CHECKED END - MENUITEM "ƒJ�[ƒlƒ‹ŽžŠÔ‚ð•\Ž¦‚·‚é(&S)", ID_VIEW_SHOWKERNELTIMES + MENUITEM "ƒJ�[ƒlƒ‹ŽžŠÔ‚ð•\\Ž¦‚·‚é(&S)", ID_VIEW_SHOWKERNELTIMES END POPUP "ƒEƒBƒ“ƒhƒE(&W)" BEGIN - MENUITEM "�㉺‚É•À‚ׂĕ\Ž¦(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "�¶‰E‚É•À‚ׂĕ\Ž¦(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "�㉺‚É•À‚ׂĕ\\Ž¦(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "�¶‰E‚É•À‚ׂĕ\\Ž¦(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "�Å�¬‰»(&M)", ID_WINDOWS_MINIMIZE MENUITEM "�ő剻(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "�d‚Ë‚Ä•\Ž¦(&C)", ID_WINDOWS_CASCADE - MENUITEM "Žè‘O‚É•\Ž¦(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "�d‚Ë‚Ä•\\Ž¦(&C)", ID_WINDOWS_CASCADE + MENUITEM "Žè‘O‚É•\\Ž¦(&B)", ID_WINDOWS_BRINGTOFRONT END POPUP "ƒwƒ‹ƒv(&H)" BEGIN @@ -90,12 +90,12 @@ END IDR_WINDOWSMENU MENU DISCARDABLE BEGIN - MENUITEM "�㉺‚É•À‚ׂĕ\Ž¦(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "�¶‰E‚É•À‚ׂĕ\Ž¦(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "�㉺‚É•À‚ׂĕ\\Ž¦(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "�¶‰E‚É•À‚ׂĕ\\Ž¦(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "�Å�¬‰»(&M)", ID_WINDOWS_MINIMIZE MENUITEM "�ő剻(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "�d‚Ë‚Ä•\Ž¦(&C)", ID_WINDOWS_CASCADE - MENUITEM "Žè‘O‚É•\Ž¦(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "�d‚Ë‚Ä•\\Ž¦(&C)", ID_WINDOWS_CASCADE + MENUITEM "Žè‘O‚É•\\Ž¦(&B)", ID_WINDOWS_BRINGTOFRONT END IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE @@ -115,16 +115,16 @@ BEGIN POPUP "DUMMY" BEGIN MENUITEM "�Ø‚è‘Ö‚¦(&S)", ID_APPLICATION_PAGE_SWITCHTO - MENUITEM "Žè‘O‚É•\Ž¦(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM "Žè‘O‚É•\\Ž¦(&B)", ID_WINDOWS_BRINGTOFRONT MENUITEM SEPARATOR - MENUITEM "�㉺‚É•À‚ׂĕ\Ž¦(&H)", ID_WINDOWS_TILEHORIZONTALLY - MENUITEM "�¶‰E‚É•À‚ׂĕ\Ž¦(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "�㉺‚É•À‚ׂĕ\\Ž¦(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "�¶‰E‚É•À‚ׂĕ\\Ž¦(&V)", ID_WINDOWS_TILEVERTICALLY MENUITEM "�Å�¬‰»(&M)", ID_WINDOWS_MINIMIZE MENUITEM "�ő剻(&X)", ID_WINDOWS_MAXIMIZE - MENUITEM "�d‚Ë‚Ä•\Ž¦(&C)", ID_WINDOWS_CASCADE + MENUITEM "�d‚Ë‚Ä•\\Ž¦(&C)", ID_WINDOWS_CASCADE MENUITEM SEPARATOR MENUITEM "ƒ^ƒXƒN‚Ì�I—¹(&E)", ID_APPLICATION_PAGE_ENDTASK - MENUITEM "ƒvƒ�ƒZƒX‚Ì•\Ž¦(&G)", ID_APPLICATION_PAGE_GOTOPROCESS + MENUITEM "ƒvƒ�ƒZƒX‚Ì•\\Ž¦(&G)", ID_APPLICATION_PAGE_GOTOPROCESS END END @@ -135,7 +135,7 @@ BEGIN MENUITEM "Œ³‚̃TƒCƒY‚É–ß‚·(&R)", ID_RESTORE MENUITEM "•Â‚¶‚é(&C)", ID_FILE_EXIT MENUITEM SEPARATOR - MENUITEM "�í‚ÉŽè‘O‚É•\Ž¦(&A)", ID_OPTIONS_ALWAYSONTOP + MENUITEM "�í‚ÉŽè‘O‚É•\\Ž¦(&A)", ID_OPTIONS_ALWAYSONTOP END END @@ -202,7 +202,7 @@ BEGIN LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | WS_BORDER | WS_TABSTOP,7,7,233,177 PUSHBUTTON "ƒvƒ�ƒZƒX‚Ì�I—¹(&E)",IDC_ENDPROCESS,171,189,69,14 - CONTROL "‚·‚ׂẴ†�[ƒU�[‚̃vƒ�ƒZƒX‚ð•\Ž¦(&S)",IDC_SHOWALLPROCESSES, + CONTROL "‚·‚ׂẴ†�[ƒU�[‚̃vƒ�ƒZƒX‚ð•\\Ž¦(&S)",IDC_SHOWALLPROCESSES, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10 END @@ -358,7 +358,7 @@ FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "OK",IDOK,84,178,50,14 PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹",IDCANCEL,138,178,50,14 - LTEXT "ƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚Ì [ƒvƒ�ƒZƒX] ƒy�[ƒW‚É•\Ž¦‚·‚é—ñ‚ð‘I‘ð‚µ‚Ü‚·�B", + LTEXT "ƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚Ì [ƒvƒ�ƒZƒX] ƒy�[ƒW‚É•\\Ž¦‚·‚é—ñ‚ð‘I‘ð‚µ‚Ü‚·�B", IDC_STATIC,7,7,181,17 CONTROL "ƒCƒ��[ƒW ƒpƒX–¼(&I)",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,7,28,56,10 @@ -426,41 +426,41 @@ END STRINGTABLE DISCARDABLE BEGIN ID_FILE_NEW "�V‚µ‚¢ƒvƒ�ƒOƒ‰ƒ€‚ðŽÀ�s‚µ‚Ü‚·�B" - ID_OPTIONS_ALWAYSONTOP "�Å�¬‰»‚³‚ê‚È‚¢ŒÀ‚è�A�í‚Ƀ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚ª‚Ù‚©‚Ì‚·‚ׂẴEƒBƒ“ƒhƒE‚æ‚è‚àŽè‘O‚É•\Ž¦‚³‚ê‚Ü‚·�B" + ID_OPTIONS_ALWAYSONTOP "�Å�¬‰»‚³‚ê‚È‚¢ŒÀ‚è�A�í‚Ƀ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚ª‚Ù‚©‚Ì‚·‚ׂẴEƒBƒ“ƒhƒE‚æ‚è‚àŽè‘O‚É•\\Ž¦‚³‚ê‚Ü‚·�B" ID_OPTIONS_MINIMIZEONUSE "[�Ø‚è‘Ö‚¦] ‘€�ì‚ðŽÀ�s‚·‚é‚Æ�Aƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚ª�Å�¬‰»‚³‚ê‚Ü‚·�B" ID_OPTIONS_HIDEWHENMINIMIZED "�Å�¬‰»‚³‚ꂽ‚Æ‚«‚É�Aƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚ð‰B‚µ‚Ü‚·�B" ID_VIEW_REFRESH "[�X�V‚Ì•p“x] ‚Ì�Ý’è‚É‚©‚©‚í‚炸�A�¡‚·‚®ƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚ð�X�V‚µ‚Ü‚·�B" - ID_VIEW_LARGE "ƒ^ƒXƒN‚Ì•\Ž¦‚É ‘åƒAƒCƒRƒ“ ‚ðŽg—p‚µ‚Ü‚·�B" - ID_VIEW_SMALL "ƒ^ƒXƒN‚Ì•\Ž¦‚É �¬ƒAƒCƒRƒ“ ‚ðŽg—p‚µ‚Ü‚·�B" - ID_VIEW_DETAILS "Šeƒ^ƒXƒN‚Ì�î•ñ‚ð•\Ž¦‚µ‚Ü‚·�B" - ID_VIEW_UPDATESPEED_HIGH "–ˆ•b 2‰ñ•\Ž¦‚ð�X�V‚µ‚Ü‚·�B" - ID_VIEW_UPDATESPEED_NORMAL "2•b‚É 1‰ñ•\Ž¦‚ð�X�V‚µ‚Ü‚·�B" - ID_VIEW_UPDATESPEED_LOW "4•b‚É 1‰ñ•\Ž¦‚ð�X�V‚µ‚Ü‚·�B" + ID_VIEW_LARGE "ƒ^ƒXƒN‚Ì•\\Ž¦‚É ‘åƒAƒCƒRƒ“ ‚ðŽg—p‚µ‚Ü‚·�B" + ID_VIEW_SMALL "ƒ^ƒXƒN‚Ì•\\Ž¦‚É �¬ƒAƒCƒRƒ“ ‚ðŽg—p‚µ‚Ü‚·�B" + ID_VIEW_DETAILS "Šeƒ^ƒXƒN‚Ì�î•ñ‚ð•\\Ž¦‚µ‚Ü‚·�B" + ID_VIEW_UPDATESPEED_HIGH "–ˆ•b 2‰ñ•\\Ž¦‚ð�X�V‚µ‚Ü‚·�B" + ID_VIEW_UPDATESPEED_NORMAL "2•b‚É 1‰ñ•\\Ž¦‚ð�X�V‚µ‚Ü‚·�B" + ID_VIEW_UPDATESPEED_LOW "4•b‚É 1‰ñ•\\Ž¦‚ð�X�V‚µ‚Ü‚·�B" END STRINGTABLE DISCARDABLE BEGIN - ID_VIEW_UPDATESPEED_PAUSED "•\Ž¦‚ðŽ©“®“I‚É�X�V‚µ‚Ü‚¹‚ñ�B" + ID_VIEW_UPDATESPEED_PAUSED "•\\Ž¦‚ðŽ©“®“I‚É�X�V‚µ‚Ü‚¹‚ñ�B" ID_WINDOWS_TILEHORIZONTALLY - "ƒfƒXƒNƒgƒbƒv�ã‚ŃEƒBƒ“ƒhƒE‚ª�d‚È‚ç‚È‚¢‚悤‚É�㉺‚É•À‚ׂĕ\Ž¦‚µ‚Ü‚·�B" - ID_WINDOWS_TILEVERTICALLY "ƒfƒXƒNƒgƒbƒv�ã‚ŃEƒBƒ“ƒhƒE‚ª�d‚È‚ç‚È‚¢‚悤‚É�¶‰E‚É•À‚ׂĕ\Ž¦‚µ‚Ü‚·�B" + "ƒfƒXƒNƒgƒbƒv�ã‚ŃEƒBƒ“ƒhƒE‚ª�d‚È‚ç‚È‚¢‚悤‚É�㉺‚É•À‚ׂĕ\\Ž¦‚µ‚Ü‚·�B" + ID_WINDOWS_TILEVERTICALLY "ƒfƒXƒNƒgƒbƒv�ã‚ŃEƒBƒ“ƒhƒE‚ª�d‚È‚ç‚È‚¢‚悤‚É�¶‰E‚É•À‚ׂĕ\\Ž¦‚µ‚Ü‚·�B" ID_WINDOWS_MINIMIZE "ƒEƒBƒ“ƒhƒE‚ð�Å�¬‰»‚µ‚Ü‚·�B" ID_WINDOWS_MAXIMIZE "ƒEƒBƒ“ƒhƒE‚ð‰æ–Ê‚¢‚Á‚Ï‚¢‚ÉŠg‘債‚Ü‚·�B" - ID_WINDOWS_CASCADE "ƒfƒXƒNƒgƒbƒv�ã‚ŃEƒBƒ“ƒhƒE‚ð�d‚Ë‚Ä•\Ž¦‚µ‚Ü‚·�B" - ID_WINDOWS_BRINGTOFRONT "ƒEƒBƒ“ƒhƒE‚ðŽè‘O‚É•\Ž¦‚µ‚Ü‚·‚ª�A�Ø‚è‘Ö‚¦‚Ü‚¹‚ñ�B" - ID_HELP_TOPICS "ƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚̃wƒ‹ƒv ƒgƒsƒbƒN‚ð•\Ž¦‚µ‚Ü‚·�B" - ID_HELP_ABOUT "ƒvƒ�ƒOƒ‰ƒ€�î•ñ�Aƒo�[ƒWƒ‡ƒ“”Ô�†�A’˜�쌠‚ð•\Ž¦‚µ‚Ü‚·�B" + ID_WINDOWS_CASCADE "ƒfƒXƒNƒgƒbƒv�ã‚ŃEƒBƒ“ƒhƒE‚ð�d‚Ë‚Ä•\\Ž¦‚µ‚Ü‚·�B" + ID_WINDOWS_BRINGTOFRONT "ƒEƒBƒ“ƒhƒE‚ðŽè‘O‚É•\\Ž¦‚µ‚Ü‚·‚ª�A�Ø‚è‘Ö‚¦‚Ü‚¹‚ñ�B" + ID_HELP_TOPICS "ƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ‚̃wƒ‹ƒv ƒgƒsƒbƒN‚ð•\\Ž¦‚µ‚Ü‚·�B" + ID_HELP_ABOUT "ƒvƒ�ƒOƒ‰ƒ€�î•ñ�Aƒo�[ƒWƒ‡ƒ“”Ô�†�A’˜�쌠‚ð•\\Ž¦‚µ‚Ü‚·�B" ID_FILE_EXIT "ƒ^ƒXƒN ƒ}ƒl�[ƒWƒƒ ƒAƒvƒŠƒP�[ƒVƒ‡ƒ“‚ð�I—¹‚µ‚Ü‚·�B" ID_OPTIONS_SHOW16BITTASKS - "16 ƒrƒbƒg Windows ƒ^ƒXƒN‚ð�AŠÖ˜A•t‚¯‚ç‚ꂽ ntvdm.exe ‚̉º‚É•\Ž¦‚µ‚Ü‚·�B" - ID_VIEW_SELECTCOLUMNS "[ƒvƒ�ƒZƒX] ƒy�[ƒW‚É•\Ž¦‚·‚é—ñ‚ð‘I‘ð‚µ‚Ü‚·�B" - ID_VIEW_SHOWKERNELTIMES "ƒJ�[ƒlƒ‹ŽžŠÔ‚ðƒpƒtƒH�[ƒ}ƒ“ƒXƒOƒ‰ƒt�ã‚É•\Ž¦‚µ‚Ü‚·�B" + "16 ƒrƒbƒg Windows ƒ^ƒXƒN‚ð�AŠÖ˜A•t‚¯‚ç‚ꂽ ntvdm.exe ‚̉º‚É•\\Ž¦‚µ‚Ü‚·�B" + ID_VIEW_SELECTCOLUMNS "[ƒvƒ�ƒZƒX] ƒy�[ƒW‚É•\\Ž¦‚·‚é—ñ‚ð‘I‘ð‚µ‚Ü‚·�B" + ID_VIEW_SHOWKERNELTIMES "ƒJ�[ƒlƒ‹ŽžŠÔ‚ðƒpƒtƒH�[ƒ}ƒ“ƒXƒOƒ‰ƒt�ã‚É•\\Ž¦‚µ‚Ü‚·�B" ID_VIEW_CPUHISTORY_ONEGRAPHALL - "1 ‚‚̗š—ðƒOƒ‰ƒt‚Å CPU Žg—p—¦‚Ì�‡Œv‚ð•\Ž¦‚µ‚Ü‚·�B" - ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "CPU Žg—p—¦‚Ì—š—ð‚ð CPU ‚²‚ƂɃOƒ‰ƒt‚Å•\Ž¦‚µ‚Ü‚·�B" + "1 ‚‚̗š—ðƒOƒ‰ƒt‚Å CPU Žg—p—¦‚Ì�‡Œv‚ð•\\Ž¦‚µ‚Ü‚·�B" + ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "CPU Žg—p—¦‚Ì—š—ð‚ð CPU ‚²‚ƂɃOƒ‰ƒt‚Å•\\Ž¦‚µ‚Ü‚·�B" ID_APPLICATION_PAGE_SWITCHTO - "‘I‘ð‚µ‚½ƒ^ƒXƒN‚ðŽè‘O‚É•\Ž¦‚µ‚Ä�Ø‚è‘Ö‚¦‚Ü‚·�B" + "‘I‘ð‚µ‚½ƒ^ƒXƒN‚ðŽè‘O‚É•\\Ž¦‚µ‚Ä�Ø‚è‘Ö‚¦‚Ü‚·�B" END STRINGTABLE DISCARDABLE diff --git a/programs/taskmgr/Zh.rc b/programs/taskmgr/Zh.rc new file mode 100644 index 00000000000..5c6b708b507 --- /dev/null +++ b/programs/taskmgr/Zh.rc @@ -0,0 +1,935 @@ +/* + * Task Manager (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +/* + Menu +*/ + +IDR_TASKMANAGER MENU DISCARDABLE +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM "新任务(&N)...", ID_FILE_NEW + MENUITEM SEPARATOR + MENUITEM "退出任务管理器(&X)", ID_FILE_EXIT + END + POPUP "选项(&O)" + BEGIN + MENUITEM "总是在最上面(&A)", ID_OPTIONS_ALWAYSONTOP + , CHECKED + MENUITEM "启动后最小化(&M)", ID_OPTIONS_MINIMIZEONUSE + , CHECKED + MENUITEM "最小化时隐藏(&H)", ID_OPTIONS_HIDEWHENMINIMIZED + , CHECKED + MENUITEM "显示16位任务(&S)", ID_OPTIONS_SHOW16BITTASKS + , CHECKED + END + POPUP "视图(&V)" + BEGIN + MENUITEM "刷新(&R)", ID_VIEW_REFRESH + POPUP "更新速度(&U)" + BEGIN + MENUITEM "快(&H)", ID_VIEW_UPDATESPEED_HIGH + MENUITEM "正常(&N)", ID_VIEW_UPDATESPEED_NORMAL + , CHECKED + MENUITEM "慢(&L)", ID_VIEW_UPDATESPEED_LOW + MENUITEM "暂停(&P)", ID_VIEW_UPDATESPEED_PAUSED + + END + MENUITEM SEPARATOR + MENUITEM "大图标(&G)", ID_VIEW_LARGE + MENUITEM "小图标(&M)", ID_VIEW_SMALL + MENUITEM "详情列表(&D)", ID_VIEW_DETAILS, CHECKED + MENUITEM "选择内容(&S)...", ID_VIEW_SELECTCOLUMNS + POPUP "&CPU 历史" + BEGIN + MENUITEM "一张图显示所有的 &CPU", ID_VIEW_CPUHISTORY_ONEGRAPHALL + + MENUITEM "每一个 C&PU 各一张图", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU + , CHECKED + END + MENUITEM "显示内核时间(&S)", ID_VIEW_SHOWKERNELTIMES + END + POPUP "视窗(&W)" + BEGIN + MENUITEM "横向平铺(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "纵向平铺(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE + MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE + MENUITEM "层叠(&C)", ID_WINDOWS_CASCADE + MENUITEM "移到最前面(&B)", ID_WINDOWS_BRINGTOFRONT + END + POPUP "帮助(&H)" + BEGIN + MENUITEM "帮助内容(&H)", ID_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "关于任务管理器(&A)", ID_HELP_ABOUT + END +END + +IDR_WINDOWSMENU MENU DISCARDABLE +BEGIN + MENUITEM "横向平铺(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "纵向平铺(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE + MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE + MENUITEM "层叠(&C)", ID_WINDOWS_CASCADE + MENUITEM "移到最前面(&B)", ID_WINDOWS_BRINGTOFRONT +END + +IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "新任务(&N)...", ID_FILE_NEW + MENUITEM SEPARATOR + MENUITEM "大图标(&G)", ID_VIEW_LARGE + MENUITEM "小图标(&M)", ID_VIEW_SMALL + MENUITEM "详情列表(&D)", ID_VIEW_DETAILS, CHECKED + END +END + +IDR_APPLICATION_PAGE_CONTEXT2 MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "转到(&S)", ID_APPLICATION_PAGE_SWITCHTO + MENUITEM "移到最前面(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM SEPARATOR + MENUITEM "横向平铺(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "纵向平铺(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE + MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE + MENUITEM "层叠(&C)", ID_WINDOWS_CASCADE + MENUITEM SEPARATOR + MENUITEM "结束任务(&E)", ID_APPLICATION_PAGE_ENDTASK + MENUITEM "转此进程(&G)", ID_APPLICATION_PAGE_GOTOPROCESS + END +END + +IDR_TRAY_POPUP MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "恢复(&R)", ID_RESTORE + MENUITEM "关闭(&C)", ID_FILE_EXIT + MENUITEM SEPARATOR + MENUITEM "总是在最上面(&A)", ID_OPTIONS_ALWAYSONTOP + END +END + +IDR_PROCESS_PAGE_CONTEXT MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "结束进程(&E)", ID_PROCESS_PAGE_ENDPROCESS + MENUITEM "结束进程树(&T)", ID_PROCESS_PAGE_ENDPROCESSTREE + + MENUITEM "调试(&D)", ID_PROCESS_PAGE_DEBUG + MENUITEM SEPARATOR + POPUP "优先权指定(&P)" + BEGIN + MENUITEM "实时(&R)", ID_PROCESS_PAGE_SETPRIORITY_REALTIME + + MENUITEM "高(&H)", ID_PROCESS_PAGE_SETPRIORITY_HIGH + + MENUITEM "正常以上(&A)", ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL + + MENUITEM "正常(&N)", ID_PROCESS_PAGE_SETPRIORITY_NORMAL + + MENUITEM "正常以下(&B)", ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL + + MENUITEM "低(&L)", ID_PROCESS_PAGE_SETPRIORITY_LOW + + END + MENUITEM "亲和度指定(&A)...", ID_PROCESS_PAGE_SETAFFINITY + MENUITEM "编辑调试频道(&C)...", ID_PROCESS_PAGE_DEBUGCHANNELS + END +END + +/* + Dialog +*/ + +IDD_TASKMGR_DIALOG DIALOG DISCARDABLE 0, 0, 264, 246 +STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "任务管理器" +MENU IDR_TASKMANAGER +FONT 9, "MS Song" +BEGIN + CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,3,3,257,228 +END + +IDD_APPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 247, 210 +STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 9, "MS Song" +BEGIN + CONTROL "List2",IDC_APPLIST,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 + PUSHBUTTON "新任务(&N)...",IDC_NEWTASK,187,189,53,14 + PUSHBUTTON "转到(&S)",IDC_SWITCHTO,131,189,53,14,WS_DISABLED + PUSHBUTTON "结束任务(&E)",IDC_ENDTASK,75,189,53,14,WS_DISABLED +END + +IDD_PROCESS_PAGE DIALOG DISCARDABLE 0, 0, 247, 210 +STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 9, "MS Song" +BEGIN + CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + WS_BORDER | WS_TABSTOP,7,7,233,177 + PUSHBUTTON "结束进程(&E)",IDC_ENDPROCESS,171,189,69,14 + CONTROL "显示所有用户进程(&S)",IDC_SHOWALLPROCESSES, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10 +END + +/*IDD_PERFORMANCE_PAGE DIALOGEX 0, 0, 247, 210*/ +IDD_PERFORMANCE_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210 +STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 9, "MS Song" +BEGIN + GROUPBOX "CPU 用量",IDC_CPU_USAGE_FRAME,5,5,60,54,WS_TABSTOP, WS_EX_TRANSPARENT + GROUPBOX "内存用量",IDC_MEM_USAGE_FRAME,5,63,60,54,BS_LEFTTEXT, WS_EX_TRANSPARENT + GROUPBOX "总共",IDC_TOTALS_FRAME,5,122,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "正在使用(K)",IDC_COMMIT_CHARGE_FRAME,5,166,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "实际内存(K)",IDC_PHYSICAL_MEMORY_FRAME,131,122,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "内核内存(K)",IDC_KERNEL_MEMORY_FRAME,131,166,111,39,0,WS_EX_TRANSPARENT + LTEXT "指针数",IDS_TOTALS_HANDLE_COUNT,12,131,27,8 + LTEXT "线数",IDS_TOTALS_THREAD_COUNT,12,140,27,8 + LTEXT "进程数",IDS_TOTALS_PROCESS_COUNT,12,149,34,8 + EDITTEXT IDC_TOTALS_HANDLE_COUNT,65,131,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_TOTALS_THREAD_COUNT,65,140,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_TOTALS_PROCESS_COUNT,65,149,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + LTEXT "总共",IDS_COMMIT_CHARGE_TOTAL,12,175,27,8 + LTEXT "限制",IDS_COMMIT_CHARGE_LIMIT,12,184,15,8 + LTEXT "最高",IDS_COMMIT_CHARGE_PEAK,12,193,34,8 + EDITTEXT IDC_COMMIT_CHARGE_TOTAL,65,174,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_COMMIT_CHARGE_LIMIT,65,184,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_COMMIT_CHARGE_PEAK,65,193,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + LTEXT "总共",IDS_PHYSICAL_MEMORY_TOTAL,137,131,27,8 + LTEXT "可用",IDS_PHYSICAL_MEMORY_AVAILABLE,137,140,30,8 + LTEXT "系统缓存",IDS_PHYSICAL_MEMORY_SYSTEM_CACHE,137,149,46,8 + EDITTEXT IDC_PHYSICAL_MEMORY_TOTAL,185,131,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_PHYSICAL_MEMORY_AVAILABLE,185,140,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_PHYSICAL_MEMORY_SYSTEM_CACHE,185,149,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + LTEXT "总共",IDS_KERNEL_MEMORY_TOTAL,137,174,27,8 + LTEXT "分页",IDS_KERNEL_MEMORY_PAGED,137,184,21,8 + LTEXT "未分页",IDS_KERNEL_MEMORY_NONPAGED,137,193,34,8 + EDITTEXT IDC_KERNEL_MEMORY_TOTAL,185,174,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_KERNEL_MEMORY_PAGED,185,184,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_KERNEL_MEMORY_NONPAGED,185,193,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + GROUPBOX "CPU 用量历史",IDC_CPU_USAGE_HISTORY_FRAME,74,5,168,54,0,WS_EX_TRANSPARENT + GROUPBOX "内存用量历史",IDC_MEMORY_USAGE_HISTORY_FRAME,74,63,168,54,0,WS_EX_TRANSPARENT + PUSHBUTTON "CPU 用量显示",IDC_CPU_USAGE_GRAPH,12,17,47,37,0, + WS_EX_CLIENTEDGE + PUSHBUTTON "内存用量显Ê",IDC_MEM_USAGE_GRAPH,12,75,47,37,0, + WS_EX_CLIENTEDGE + PUSHBUTTON "CPU 用量历史",IDC_CPU_USAGE_HISTORY_GRAPH,81,17, + 153,37,0,WS_EX_CLIENTEDGE + PUSHBUTTON "内存用量历史",IDC_MEM_USAGE_HISTORY_GRAPH,81,75, + 153,37,0,WS_EX_CLIENTEDGE +END + +IDD_DEBUG_CHANNELS_DIALOG DIALOG DISCARDABLE 0, 0, 247, 210 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "调试频道" +FONT 9, "MS Song" +BEGIN + CONTROL "List2",IDC_DEBUG_CHANNELS_LIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP | + LVS_SORTASCENDING,7,7,233,177 + PUSHBUTTON "关闭",IDOK,171,189,69,14 +END + +IDD_AFFINITY_DIALOG DIALOG DISCARDABLE 0, 0, 231, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "处理器亲和度" +FONT 9, "MS Song" +BEGIN + DEFPUSHBUTTON "确定",IDOK,120,133,50,14 + PUSHBUTTON "取消",IDCANCEL,174,133,50,14 + LTEXT "处理器亲和度设置控制各进程使用CPU分配情况.", + IDC_STATIC,5,5,220,16 + CONTROL "CPU 0",IDC_CPU0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 11,28,37,10 + CONTROL "CPU 1",IDC_CPU1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,41,37,10 + CONTROL "CPU 2",IDC_CPU2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,54,37,10 + CONTROL "CPU 3",IDC_CPU3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,67,37,10 + CONTROL "CPU 4",IDC_CPU4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,80,37,10 + CONTROL "CPU 5",IDC_CPU5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,93,37,10 + CONTROL "CPU 6",IDC_CPU6,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,106,37,10 + CONTROL "CPU 7",IDC_CPU7,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,119,37,10 + CONTROL "CPU 8",IDC_CPU8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,61,28,37,10 + CONTROL "CPU 9",IDC_CPU9,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,61,41,37,10 + CONTROL "CPU 10",IDC_CPU10,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,54,41,10 + CONTROL "CPU 11",IDC_CPU11,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,67,41,10 + CONTROL "CPU 12",IDC_CPU12,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,80,41,10 + CONTROL "CPU 13",IDC_CPU13,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,93,41,10 + CONTROL "CPU 14",IDC_CPU14,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,106,41,10 + CONTROL "CPU 15",IDC_CPU15,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,119,41,10 + CONTROL "CPU 16",IDC_CPU16,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,28,41,10 + CONTROL "CPU 17",IDC_CPU17,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,41,41,10 + CONTROL "CPU 18",IDC_CPU18,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,54,41,10 + CONTROL "CPU 19",IDC_CPU19,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,67,41,10 + CONTROL "CPU 20",IDC_CPU20,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,80,41,10 + CONTROL "CPU 21",IDC_CPU21,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,93,41,10 + CONTROL "CPU 22",IDC_CPU22,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,106,41,10 + CONTROL "CPU 23",IDC_CPU23,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,119,41,10 + CONTROL "CPU 24",IDC_CPU24,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,28,41,10 + CONTROL "CPU 25",IDC_CPU25,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,41,41,10 + CONTROL "CPU 26",IDC_CPU26,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,54,41,10 + CONTROL "CPU 27",IDC_CPU27,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,67,41,10 + CONTROL "CPU 28",IDC_CPU28,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,80,41,10 + CONTROL "CPU 29",IDC_CPU29,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,93,41,10 + CONTROL "CPU 30",IDC_CPU30,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,106,41,10 + CONTROL "CPU 31",IDC_CPU31,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,119,41,10 +END + +IDD_COLUMNS_DIALOG DIALOG DISCARDABLE 0, 0, 195, 199 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "选择显示内容" +FONT 9, "MS Song" +BEGIN + DEFPUSHBUTTON "确定",IDOK,84,178,50,14 + PUSHBUTTON "取消",IDCANCEL,138,178,50,14 + LTEXT "请选择任务管理器中进程分页的显示内容.", + IDC_STATIC,7,7,181,17 + CONTROL "程序名称(&I)",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,7,28,56,10 + CONTROL "&PID (进程编号)",IDC_PID,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,39,88,10 + CONTROL "&CPU 用量",IDC_CPUUSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,50,53,10 + CONTROL "CPU 时间(&T)",IDC_CPUTIME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,61,48,10 + CONTROL "内存用量(&M)",IDC_MEMORYUSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,72,63,10 + CONTROL "内存用量差(&D)",IDC_MEMORYUSAGEDELTA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,83,82,10 + CONTROL "最高内存用(&K)",IDC_PEAKMEMORYUSAGE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,94,82,10 + CONTROL "页故障数(&F)",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,105,53,10 + CONTROL "用户对象(&U)",IDC_USEROBJECTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,116,62,10 + CONTROL "I/O 读取数",IDC_IOREADS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,127,49,10 + CONTROL "I/O 读取量",IDC_IOREADBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,65,10 + CONTROL "&Session ID",IDC_SESSIONID,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,149,50,10 + CONTROL "用户名(&N)",IDC_USERNAME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,160,51,10 + CONTROL "页故障差(&A)",IDC_PAGEFAULTSDELTA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,28,72,10 + CONTROL "虚拟内存大小(&V)",IDC_VIRTUALMEMORYSIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,39,77,10 + CONTROL "Pa&ged Pool",IDC_PAGEDPOOL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,50,53,10 + CONTROL "N&on-paged Pool",IDC_NONPAGEDPOOL,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,61,67,10 + CONTROL "基本优先权(&R)",IDC_BASEPRIORITY,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,72,55,10 + CONTROL "指针数(&H)",IDC_HANDLECOUNT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,83,59,10 + CONTROL "线数(&T)",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,94,59,10 + CONTROL "GDI 对象",IDC_GDIOBJECTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,105,55,10 + CONTROL "I/O 写盘数",IDC_IOWRITES,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,116,49,10 + CONTROL "I/O 写盘量",IDC_IOWRITEBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,127,65,10 + CONTROL "I/O 其他数",IDC_IOOTHER,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,138,46,10 + CONTROL "I/O 其他量",IDC_IOOTHERBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,149,65,10 +END + +/* + String Table +*/ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "任务管理器" + IDC_TASKMGR "任务管理器" + IDS_RUNDLG_CAPTION "产生新任务" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_FILE_NEW "运行新任务" + ID_OPTIONS_ALWAYSONTOP "任务管理器总是在其他视窗的最上面,除非是最小化" + ID_OPTIONS_MINIMIZEONUSE "任务管理器使用时最小化" + ID_OPTIONS_HIDEWHENMINIMIZED "最小化时隐藏任务管理器" + ID_VIEW_REFRESH "强制任务管理器更新显示,不管设置的是什么速度" + ID_VIEW_LARGE "用大图标显示任务" + ID_VIEW_SMALL "用小图标显示任务" + ID_VIEW_DETAILS "显示每个任务的详细内容" + ID_VIEW_UPDATESPEED_HIGH "每秒更新显示两次" + ID_VIEW_UPDATESPEED_NORMAL "每两秒更新显示一次" + ID_VIEW_UPDATESPEED_LOW "每四秒更新显示一次" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_VIEW_UPDATESPEED_PAUSED "不会自动更新" + ID_WINDOWS_TILEHORIZONTALLY "在桌面上将所有视窗横向平铺" + ID_WINDOWS_TILEVERTICALLY "在桌面上将所有视窗纵向平铺" + ID_WINDOWS_MINIMIZE "视窗最小化" + ID_WINDOWS_MAXIMIZE "视窗最大化" + ID_WINDOWS_CASCADE "在桌面上按对角线将视窗叠放" + ID_WINDOWS_BRINGTOFRONT "将视窗调到最前面,但不激活" + ID_HELP_TOPICS "显示任务管理器帮助内容" + ID_HELP_ABOUT "显示本程序信息,版本及版权" + ID_FILE_EXIT "退出任务管理器" + ID_OPTIONS_SHOW16BITTASKS "显示 16-位任务及有关的ntvdm.exe" + ID_VIEW_SELECTCOLUMNS "选择在进程分页的显示内容" + ID_VIEW_SHOWKERNELTIMES "在性能图上显示内核使用时间" + ID_VIEW_CPUHISTORY_ONEGRAPHALL "一张历史图显示所有CPU用量" + ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "每一个CPU有自己的历史图" + ID_APPLICATION_PAGE_SWITCHTO "将任务设为当前任务,并激活" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_ENDTASK "通知当前选中的任务关闭" + ID_GOTOPROCESS "将焦点转到当前选中的任务" + ID_RESTORE "取消任务管理器隐藏状态" + ID_PROCESS_PAGE_ENDPROCESS "将进程从系统中删除" + ID_PROCESS_PAGE_ENDPROCESSTREE "将进程及其附属进程从系统中删除" + ID_PROCESS_PAGE_DEBUG "将调试器接到本进程" + ID_PROCESS_PAGE_SETAFFINITY "控制各进程使用那个处理器" + ID_PROCESS_PAGE_SETPRIORITY_REALTIME "将进程设为实时优先级" + ID_PROCESS_PAGE_SETPRIORITY_HIGH "将进程设为高优先级" + ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL "将进程设为中等以上优先级" + ID_PROCESS_PAGE_SETPRIORITY_NORMAL "将进程设为中等优先级" + ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL "将进程设为中等以下优先级" + ID_PROCESS_PAGE_SETPRIORITY_LOW "将进程设为低优先级" +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +/* + Menu +*/ + +IDR_TASKMANAGER MENU DISCARDABLE +BEGIN + POPUP "檔案(&F)" + BEGIN + MENUITEM "新任務(&N)...", ID_FILE_NEW + MENUITEM SEPARATOR + MENUITEM "結束任務管理器(&X)", ID_FILE_EXIT + END + POPUP "選項(&O)" + BEGIN + MENUITEM "總是在最上面(&A)", ID_OPTIONS_ALWAYSONTOP + , CHECKED + MENUITEM "啟動後最小化(&M)", ID_OPTIONS_MINIMIZEONUSE + , CHECKED + MENUITEM "最小化時隱藏(&H)", ID_OPTIONS_HIDEWHENMINIMIZED + , CHECKED + MENUITEM "顯示16位任務(&S)", ID_OPTIONS_SHOW16BITTASKS + , CHECKED + END + POPUP "檢視(&V)" + BEGIN + MENUITEM "刷新(&R)", ID_VIEW_REFRESH + POPUP "更新速度(&U)" + BEGIN + MENUITEM "快(&H)", ID_VIEW_UPDATESPEED_HIGH + MENUITEM "正常(&N)", ID_VIEW_UPDATESPEED_NORMAL + , CHECKED + MENUITEM "慢(&L)", ID_VIEW_UPDATESPEED_LOW + MENUITEM "暫停(&P)", ID_VIEW_UPDATESPEED_PAUSED + + END + MENUITEM SEPARATOR + MENUITEM "大圖標(&G)", ID_VIEW_LARGE + MENUITEM "小圖標(&M)", ID_VIEW_SMALL + MENUITEM "詳情列表(&D)", ID_VIEW_DETAILS, CHECKED + MENUITEM "選擇內容(&S)...", ID_VIEW_SELECTCOLUMNS + POPUP "&CPU 歷史" + BEGIN + MENUITEM "一張圖顯示所有的 &CPU", ID_VIEW_CPUHISTORY_ONEGRAPHALL + + MENUITEM "每一個 C&PU 各一張圖", ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU + , CHECKED + END + MENUITEM "顯示內核時間(&S)", ID_VIEW_SHOWKERNELTIMES + END + POPUP "視窗(&W)" + BEGIN + MENUITEM "橫向平鋪(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "縱向平鋪(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE + MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE + MENUITEM "層疊(&C)", ID_WINDOWS_CASCADE + MENUITEM "移到最前面(&B)", ID_WINDOWS_BRINGTOFRONT + END + POPUP "幫助(&H)" + BEGIN + MENUITEM "幫助內容(&H)", ID_HELP_TOPICS + MENUITEM SEPARATOR + MENUITEM "關於任務管理器(&A)", ID_HELP_ABOUT + END +END + +IDR_WINDOWSMENU MENU DISCARDABLE +BEGIN + MENUITEM "橫向平鋪(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "縱向平鋪(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE + MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE + MENUITEM "層疊(&C)", ID_WINDOWS_CASCADE + MENUITEM "移到最前面(&B)", ID_WINDOWS_BRINGTOFRONT +END + +IDR_APPLICATION_PAGE_CONTEXT1 MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "新任務(&N)...", ID_FILE_NEW + MENUITEM SEPARATOR + MENUITEM "大圖標(&G)", ID_VIEW_LARGE + MENUITEM "小圖標(&M)", ID_VIEW_SMALL + MENUITEM "詳情列表(&D)", ID_VIEW_DETAILS, CHECKED + END +END + +IDR_APPLICATION_PAGE_CONTEXT2 MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "轉到(&S)", ID_APPLICATION_PAGE_SWITCHTO + MENUITEM "移到最前面(&B)", ID_WINDOWS_BRINGTOFRONT + MENUITEM SEPARATOR + MENUITEM "橫向平鋪(&H)", ID_WINDOWS_TILEHORIZONTALLY + MENUITEM "縱向平鋪(&V)", ID_WINDOWS_TILEVERTICALLY + MENUITEM "最小化(&M)", ID_WINDOWS_MINIMIZE + MENUITEM "最大化(&X)", ID_WINDOWS_MAXIMIZE + MENUITEM "層疊(&C)", ID_WINDOWS_CASCADE + MENUITEM SEPARATOR + MENUITEM "結束任務(&E)", ID_APPLICATION_PAGE_ENDTASK + MENUITEM "轉此進程(&G)", ID_APPLICATION_PAGE_GOTOPROCESS + END +END + +IDR_TRAY_POPUP MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "復原(&R)", ID_RESTORE + MENUITEM "關閉(&C)", ID_FILE_EXIT + MENUITEM SEPARATOR + MENUITEM "總是在最上面(&A)", ID_OPTIONS_ALWAYSONTOP + END +END + +IDR_PROCESS_PAGE_CONTEXT MENU DISCARDABLE +BEGIN + POPUP "DUMMY" + BEGIN + MENUITEM "結束進程(&E)", ID_PROCESS_PAGE_ENDPROCESS + MENUITEM "結束進程樹(&T)", ID_PROCESS_PAGE_ENDPROCESSTREE + + MENUITEM "調試(&D)", ID_PROCESS_PAGE_DEBUG + MENUITEM SEPARATOR + POPUP "優先權指定(&P)" + BEGIN + MENUITEM "實時(&R)", ID_PROCESS_PAGE_SETPRIORITY_REALTIME + + MENUITEM "高(&H)", ID_PROCESS_PAGE_SETPRIORITY_HIGH + + MENUITEM "正常以上(&A)", ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL + + MENUITEM "正常(&N)", ID_PROCESS_PAGE_SETPRIORITY_NORMAL + + MENUITEM "正常以下(&B)", ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL + + MENUITEM "低(&L)", ID_PROCESS_PAGE_SETPRIORITY_LOW + + END + MENUITEM "親和度指定(&A)...", ID_PROCESS_PAGE_SETAFFINITY + MENUITEM "編輯調試頻道(&C)...", ID_PROCESS_PAGE_DEBUGCHANNELS + END +END + +/* + Dialog +*/ + +IDD_TASKMGR_DIALOG DIALOG DISCARDABLE 0, 0, 264, 246 +STYLE DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | + WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +CAPTION "任務管理器" +MENU IDR_TASKMANAGER +FONT 8, "PMingLiu" +BEGIN + CONTROL "Tab1",IDC_TAB,"SysTabControl32",WS_TABSTOP,3,3,257,228 +END + +IDD_APPLICATION_PAGE DIALOG DISCARDABLE 0, 0, 247, 210 +STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "PMingLiu" +BEGIN + CONTROL "List2",IDC_APPLIST,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,7,7,233,177 + PUSHBUTTON "新任務(&N)...",IDC_NEWTASK,187,189,53,14 + PUSHBUTTON "轉到(&S)",IDC_SWITCHTO,131,189,53,14,WS_DISABLED + PUSHBUTTON "結束任務(&E)",IDC_ENDTASK,75,189,53,14,WS_DISABLED +END + +IDD_PROCESS_PAGE DIALOG DISCARDABLE 0, 0, 247, 210 +STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "PMingLiu" +BEGIN + CONTROL "List2",IDC_PROCESSLIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_OWNERDATA | + WS_BORDER | WS_TABSTOP,7,7,233,177 + PUSHBUTTON "結束進程(&E)",IDC_ENDPROCESS,171,189,69,14 + CONTROL "顯示所有用戶進程(&S)",IDC_SHOWALLPROCESSES, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,191,111,10 +END + +/*IDD_PERFORMANCE_PAGE DIALOGEX 0, 0, 247, 210*/ +IDD_PERFORMANCE_PAGE DIALOGEX DISCARDABLE 0, 0, 247, 210 +STYLE DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN +FONT 8, "PMingLiu" +BEGIN + GROUPBOX "CPU 用量",IDC_CPU_USAGE_FRAME,5,5,60,54,WS_TABSTOP, WS_EX_TRANSPARENT + GROUPBOX "內存用量",IDC_MEM_USAGE_FRAME,5,63,60,54,BS_LEFTTEXT, WS_EX_TRANSPARENT + GROUPBOX "總共",IDC_TOTALS_FRAME,5,122,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "正在使用(K)",IDC_COMMIT_CHARGE_FRAME,5,166,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "實際內存(K)",IDC_PHYSICAL_MEMORY_FRAME,131,122,111,39,0,WS_EX_TRANSPARENT + GROUPBOX "內核內存(K)",IDC_KERNEL_MEMORY_FRAME,131,166,111,39,0,WS_EX_TRANSPARENT + LTEXT "指針數",IDS_TOTALS_HANDLE_COUNT,12,131,27,8 + LTEXT "線數",IDS_TOTALS_THREAD_COUNT,12,140,27,8 + LTEXT "進程數",IDS_TOTALS_PROCESS_COUNT,12,149,34,8 + EDITTEXT IDC_TOTALS_HANDLE_COUNT,65,131,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_TOTALS_THREAD_COUNT,65,140,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_TOTALS_PROCESS_COUNT,65,149,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + LTEXT "總共",IDS_COMMIT_CHARGE_TOTAL,12,175,27,8 + LTEXT "限制",IDS_COMMIT_CHARGE_LIMIT,12,184,15,8 + LTEXT "最高",IDS_COMMIT_CHARGE_PEAK,12,193,34,8 + EDITTEXT IDC_COMMIT_CHARGE_TOTAL,65,174,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_COMMIT_CHARGE_LIMIT,65,184,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_COMMIT_CHARGE_PEAK,65,193,45,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + LTEXT "總共",IDS_PHYSICAL_MEMORY_TOTAL,137,131,27,8 + LTEXT "可用",IDS_PHYSICAL_MEMORY_AVAILABLE,137,140,30,8 + LTEXT "系統緩存",IDS_PHYSICAL_MEMORY_SYSTEM_CACHE,137,149,46,8 + EDITTEXT IDC_PHYSICAL_MEMORY_TOTAL,185,131,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_PHYSICAL_MEMORY_AVAILABLE,185,140,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_PHYSICAL_MEMORY_SYSTEM_CACHE,185,149,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + LTEXT "總共",IDS_KERNEL_MEMORY_TOTAL,137,174,27,8 + LTEXT "分頁",IDS_KERNEL_MEMORY_PAGED,137,184,21,8 + LTEXT "未分頁",IDS_KERNEL_MEMORY_NONPAGED,137,193,34,8 + EDITTEXT IDC_KERNEL_MEMORY_TOTAL,185,174,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_KERNEL_MEMORY_PAGED,185,184,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + EDITTEXT IDC_KERNEL_MEMORY_NONPAGED,185,193,48,8,ES_RIGHT | + ES_READONLY | ES_NUMBER | NOT WS_BORDER + GROUPBOX "CPU 用量歷史",IDC_CPU_USAGE_HISTORY_FRAME,74,5,168,54,0,WS_EX_TRANSPARENT + GROUPBOX "內存用量歷史",IDC_MEMORY_USAGE_HISTORY_FRAME,74,63,168,54,0,WS_EX_TRANSPARENT + PUSHBUTTON "CPU 用量顯示",IDC_CPU_USAGE_GRAPH,12,17,47,37,0, + WS_EX_CLIENTEDGE + PUSHBUTTON "內存用量顯□",IDC_MEM_USAGE_GRAPH,12,75,47,37,0, + WS_EX_CLIENTEDGE + PUSHBUTTON "CPU 用量歷史",IDC_CPU_USAGE_HISTORY_GRAPH,81,17, + 153,37,0,WS_EX_CLIENTEDGE + PUSHBUTTON "內存用量歷史",IDC_MEM_USAGE_HISTORY_GRAPH,81,75, + 153,37,0,WS_EX_CLIENTEDGE +END + +IDD_DEBUG_CHANNELS_DIALOG DIALOG DISCARDABLE 0, 0, 247, 210 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "調試頻道" +FONT 8, "PMingLiu" +BEGIN + CONTROL "List2",IDC_DEBUG_CHANNELS_LIST,"SysListView32",LVS_REPORT | + LVS_SINGLESEL | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP | + LVS_SORTASCENDING,7,7,233,177 + PUSHBUTTON "關閉",IDOK,171,189,69,14 +END + +IDD_AFFINITY_DIALOG DIALOG DISCARDABLE 0, 0, 231, 154 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "處理器親和度" +FONT 8, "PMingLiu" +BEGIN + DEFPUSHBUTTON "確定",IDOK,120,133,50,14 + PUSHBUTTON "取消",IDCANCEL,174,133,50,14 + LTEXT "處理器親和度設定控制各進程使用CPU分配情況.", + IDC_STATIC,5,5,220,16 + CONTROL "CPU 0",IDC_CPU0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 11,28,37,10 + CONTROL "CPU 1",IDC_CPU1,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,41,37,10 + CONTROL "CPU 2",IDC_CPU2,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,54,37,10 + CONTROL "CPU 3",IDC_CPU3,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,67,37,10 + CONTROL "CPU 4",IDC_CPU4,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,80,37,10 + CONTROL "CPU 5",IDC_CPU5,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,93,37,10 + CONTROL "CPU 6",IDC_CPU6,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,106,37,10 + CONTROL "CPU 7",IDC_CPU7,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,11,119,37,10 + CONTROL "CPU 8",IDC_CPU8,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,61,28,37,10 + CONTROL "CPU 9",IDC_CPU9,"Button",BS_AUTOCHECKBOX | WS_DISABLED | + WS_TABSTOP,61,41,37,10 + CONTROL "CPU 10",IDC_CPU10,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,54,41,10 + CONTROL "CPU 11",IDC_CPU11,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,67,41,10 + CONTROL "CPU 12",IDC_CPU12,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,80,41,10 + CONTROL "CPU 13",IDC_CPU13,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,93,41,10 + CONTROL "CPU 14",IDC_CPU14,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,106,41,10 + CONTROL "CPU 15",IDC_CPU15,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,61,119,41,10 + CONTROL "CPU 16",IDC_CPU16,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,28,41,10 + CONTROL "CPU 17",IDC_CPU17,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,41,41,10 + CONTROL "CPU 18",IDC_CPU18,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,54,41,10 + CONTROL "CPU 19",IDC_CPU19,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,67,41,10 + CONTROL "CPU 20",IDC_CPU20,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,80,41,10 + CONTROL "CPU 21",IDC_CPU21,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,93,41,10 + CONTROL "CPU 22",IDC_CPU22,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,106,41,10 + CONTROL "CPU 23",IDC_CPU23,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,116,119,41,10 + CONTROL "CPU 24",IDC_CPU24,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,28,41,10 + CONTROL "CPU 25",IDC_CPU25,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,41,41,10 + CONTROL "CPU 26",IDC_CPU26,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,54,41,10 + CONTROL "CPU 27",IDC_CPU27,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,67,41,10 + CONTROL "CPU 28",IDC_CPU28,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,80,41,10 + CONTROL "CPU 29",IDC_CPU29,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,93,41,10 + CONTROL "CPU 30",IDC_CPU30,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,106,41,10 + CONTROL "CPU 31",IDC_CPU31,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,175,119,41,10 +END + +IDD_COLUMNS_DIALOG DIALOG DISCARDABLE 0, 0, 195, 199 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "選擇顯示內容" +FONT 8, "PMingLiu" +BEGIN + DEFPUSHBUTTON "確定",IDOK,84,178,50,14 + PUSHBUTTON "取消",IDCANCEL,138,178,50,14 + LTEXT "請選擇任務管理器中進程分頁的顯示內容.", + IDC_STATIC,7,7,181,17 + CONTROL "程式名稱(&I)",IDC_IMAGENAME,"Button",BS_AUTOCHECKBOX | + WS_DISABLED | WS_TABSTOP,7,28,56,10 + CONTROL "&PID (進程編號)",IDC_PID,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,39,88,10 + CONTROL "&CPU 用量",IDC_CPUUSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,50,53,10 + CONTROL "CPU 時間(&T)",IDC_CPUTIME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,61,48,10 + CONTROL "內存用量(&M)",IDC_MEMORYUSAGE,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,72,63,10 + CONTROL "內存用量差(&D)",IDC_MEMORYUSAGEDELTA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,83,82,10 + CONTROL "最高內存用(&K)",IDC_PEAKMEMORYUSAGE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,94,82,10 + CONTROL "頁故障數(&F)",IDC_PAGEFAULTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,105,53,10 + CONTROL "用戶對象(&U)",IDC_USEROBJECTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,116,62,10 + CONTROL "I/O 讀取數",IDC_IOREADS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,127,49,10 + CONTROL "I/O 讀取量",IDC_IOREADBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,7,138,65,10 + CONTROL "&Session ID",IDC_SESSIONID,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,149,50,10 + CONTROL "用戶名(&N)",IDC_USERNAME,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,7,160,51,10 + CONTROL "頁故障差(&A)",IDC_PAGEFAULTSDELTA,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,28,72,10 + CONTROL "虛擬內存大小(&V)",IDC_VIRTUALMEMORYSIZE,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,39,77,10 + CONTROL "Pa&ged Pool",IDC_PAGEDPOOL,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,50,53,10 + CONTROL "N&on-paged Pool",IDC_NONPAGEDPOOL,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,61,67,10 + CONTROL "基本優先權(&R)",IDC_BASEPRIORITY,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,72,55,10 + CONTROL "指針數(&H)",IDC_HANDLECOUNT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,83,59,10 + CONTROL "線數(&T)",IDC_THREADCOUNT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,94,59,10 + CONTROL "GDI 對象",IDC_GDIOBJECTS,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,105,55,10 + CONTROL "I/O 寫盤數",IDC_IOWRITES,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,116,49,10 + CONTROL "I/O 寫盤量",IDC_IOWRITEBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,127,65,10 + CONTROL "I/O 其他數",IDC_IOOTHER,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,107,138,46,10 + CONTROL "I/O 其他量",IDC_IOOTHERBYTES,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,107,149,65,10 +END + +/* + String Table +*/ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APP_TITLE "任務管理器" + IDC_TASKMGR "任務管理器" + IDS_RUNDLG_CAPTION "產生新任務" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_FILE_NEW "執行新任務" + ID_OPTIONS_ALWAYSONTOP "任務管理器總是在其他視窗的最上面,除非是最小化" + ID_OPTIONS_MINIMIZEONUSE "任務管理器使用時最小化" + ID_OPTIONS_HIDEWHENMINIMIZED "最小化時隱藏任務管理器" + ID_VIEW_REFRESH "強制任務管理器更新顯示,不管設定的是什麼速度" + ID_VIEW_LARGE "用大圖標顯示任務" + ID_VIEW_SMALL "用小圖標顯示任務" + ID_VIEW_DETAILS "顯示每個任務的詳細內容" + ID_VIEW_UPDATESPEED_HIGH "每秒更新顯示兩次" + ID_VIEW_UPDATESPEED_NORMAL "每兩秒更新顯示一次" + ID_VIEW_UPDATESPEED_LOW "每四秒更新顯示一次" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_VIEW_UPDATESPEED_PAUSED "不會自動更新" + ID_WINDOWS_TILEHORIZONTALLY "在桌面上將所有視窗橫向平鋪" + ID_WINDOWS_TILEVERTICALLY "在桌面上將所有視窗縱向平鋪" + ID_WINDOWS_MINIMIZE "視窗最小化" + ID_WINDOWS_MAXIMIZE "視窗最大化" + ID_WINDOWS_CASCADE "在桌面上按對角線將視窗疊放" + ID_WINDOWS_BRINGTOFRONT "將視窗調到最前面,但不激活" + ID_HELP_TOPICS "顯示任務管理器幫助內容" + ID_HELP_ABOUT "顯示本程式資訊,版本及版權" + ID_FILE_EXIT "結束任務管理器" + ID_OPTIONS_SHOW16BITTASKS "顯示 16-位任務及有關的ntvdm.exe" + ID_VIEW_SELECTCOLUMNS "選擇在進程分頁的顯示內容" + ID_VIEW_SHOWKERNELTIMES "在性能圖上顯示內核使用時間" + ID_VIEW_CPUHISTORY_ONEGRAPHALL "一張歷史圖顯示所有CPU用量" + ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU "每一個CPU有自己的歷史圖" + ID_APPLICATION_PAGE_SWITCHTO "將任務設為當前任務,並激活" +END + +STRINGTABLE DISCARDABLE +BEGIN + ID_ENDTASK "通知當前選中的任務關閉" + ID_GOTOPROCESS "將焦點轉到當前選中的任務" + ID_RESTORE "取消任務管理器隱藏狀態" + ID_PROCESS_PAGE_ENDPROCESS "將進程從系統中刪除" + ID_PROCESS_PAGE_ENDPROCESSTREE "將進程及其附屬進程從系統中刪除" + ID_PROCESS_PAGE_DEBUG "將調試器接到本進程" + ID_PROCESS_PAGE_SETAFFINITY "控制各進程使用那個處理器" + ID_PROCESS_PAGE_SETPRIORITY_REALTIME "將進程設為實時優先級" + ID_PROCESS_PAGE_SETPRIORITY_HIGH "將進程設為高優先級" + ID_PROCESS_PAGE_SETPRIORITY_ABOVENORMAL "將進程設為中等以上優先級" + ID_PROCESS_PAGE_SETPRIORITY_NORMAL "將進程設為中等優先級" + ID_PROCESS_PAGE_SETPRIORITY_BELOWNORMAL "將進程設為中等以下優先級" + ID_PROCESS_PAGE_SETPRIORITY_LOW "將進程設為低優先級" +END + +#pragma code_page(default) diff --git a/programs/taskmgr/taskmgr.rc b/programs/taskmgr/taskmgr.rc index 5cd228efbab..213755952e3 100644 --- a/programs/taskmgr/taskmgr.rc +++ b/programs/taskmgr/taskmgr.rc @@ -39,6 +39,7 @@ #include "Ru.rc" #include "Si.rc" #include "Tr.rc" +#include "Zh.rc" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/programs/uninstaller/Makefile.in b/programs/uninstaller/Makefile.in index 7783efaa9ce..3b151a7de16 100644 --- a/programs/uninstaller/Makefile.in +++ b/programs/uninstaller/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/uninstaller/Zh.rc b/programs/uninstaller/Zh.rc new file mode 100644 index 00000000000..6e0e2beb992 --- /dev/null +++ b/programs/uninstaller/Zh.rc @@ -0,0 +1,38 @@ +/* + * Uninstaller (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE DISCARDABLE { + IDS_APPNAME, "Wine 应有程序卸载管理器" + IDS_UNINSTALLFAILED, "卸载命令运行失败 '%s', 可能是找不到可运行程序.\r\n你想把这项卸载命令从注册表中删除吗?" +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE DISCARDABLE { + IDS_APPNAME, "Wine 應有程式卸載管理器" + IDS_UNINSTALLFAILED, "卸載指令執行失敗 '%s', 可能是找不到可執行程式.\r\n你想把這項卸載指令從註冊表中刪除嗎?" +} + +#pragma code_page(default) diff --git a/programs/uninstaller/rsrc.rc b/programs/uninstaller/rsrc.rc index 72bcc9a6538..3311dd3dbbe 100644 --- a/programs/uninstaller/rsrc.rc +++ b/programs/uninstaller/rsrc.rc @@ -46,3 +46,4 @@ #include "Si.rc" #include "Sv.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/programs/view/Zh.rc b/programs/view/Zh.rc new file mode 100644 index 00000000000..84bd638481a --- /dev/null +++ b/programs/view/Zh.rc @@ -0,0 +1,124 @@ +/* + * View (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +/* + * + * Menu + * + */ + +VIEW MENU +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM "打开(&O)", IDM_OPEN + MENUITEM "退出(&x)", IDM_EXIT + END + POPUP "平移(&P)" + BEGIN + MENUITEM "放大至视窗(&S)", IDM_SET_EXT_TO_WIN + MENUITEM SEPARATOR + MENUITEM "左(&L)", IDM_LEFT + MENUITEM "右(&R)", IDM_RIGHT + MENUITEM "上(&U)", IDM_UP + MENUITEM "下(&D)", IDM_DOWN + END +END + + +/* + * + * Accelerator + * + */ + +VIEW ACCELERATORS +BEGIN + "Q", IDM_EXIT, VIRTKEY, CONTROL +END + + +/* + * + * String Table + * + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DESCRIPTION "普通 Metafile 阅读器" +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +/* + * + * Menu + * + */ + +VIEW MENU +BEGIN + POPUP "檔案(&F)" + BEGIN + MENUITEM "開啟(&O)", IDM_OPEN + MENUITEM "結束(&x)", IDM_EXIT + END + POPUP "平移(&P)" + BEGIN + MENUITEM "放大至視窗(&S)", IDM_SET_EXT_TO_WIN + MENUITEM SEPARATOR + MENUITEM "左(&L)", IDM_LEFT + MENUITEM "右(&R)", IDM_RIGHT + MENUITEM "上(&U)", IDM_UP + MENUITEM "下(&D)", IDM_DOWN + END +END + + +/* + * + * Accelerator + * + */ + +VIEW ACCELERATORS +BEGIN + "Q", IDM_EXIT, VIRTKEY, CONTROL +END + + +/* + * + * String Table + * + */ + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DESCRIPTION "普通 Metafile 閱讀器" +END + +#pragma code_page(default) diff --git a/programs/view/viewrc.rc b/programs/view/viewrc.rc index 1558b23b4d7..67a0dea327a 100644 --- a/programs/view/viewrc.rc +++ b/programs/view/viewrc.rc @@ -37,6 +37,7 @@ #include "Ru.rc" #include "Si.rc" #include "Tr.rc" +#include "Zh.rc" /* * Icon diff --git a/programs/wineboot/Makefile.in b/programs/wineboot/Makefile.in index cdbab2e81e0..63c6fd86fef 100644 --- a/programs/wineboot/Makefile.in +++ b/programs/wineboot/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/wineboot/shutdown.c b/programs/wineboot/shutdown.c index b9705d80123..49c03c24137 100644 --- a/programs/wineboot/shutdown.c +++ b/programs/wineboot/shutdown.c @@ -227,7 +227,7 @@ static LRESULT send_messages_with_timeout_dialog( } else if ((ret == WAIT_TIMEOUT) && !hwnd_endtask) { - hwnd_endtask = CreateDialogParamW( GetModuleHandle(NULL), + hwnd_endtask = CreateDialogParamW( GetModuleHandleW(NULL), MAKEINTRESOURCEW(IDD_ENDTASK), NULL, endtask_dlg_proc, (LPARAM)&dlg_data ); diff --git a/programs/wineboot/wineboot.rc b/programs/wineboot/wineboot.rc index f087d2fa432..e52e6c40cd8 100644 --- a/programs/wineboot/wineboot.rc +++ b/programs/wineboot/wineboot.rc @@ -41,3 +41,4 @@ #include "wineboot_Ru.rc" #include "wineboot_Si.rc" #include "wineboot_Sv.rc" +#include "wineboot_Zh.rc" diff --git a/programs/wineboot/wineboot_Zh.rc b/programs/wineboot/wineboot_Zh.rc new file mode 100644 index 00000000000..5248b382dc9 --- /dev/null +++ b/programs/wineboot/wineboot_Zh.rc @@ -0,0 +1,55 @@ +/* + * wineboot (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDD_ENDTASK DIALOG DISCARDABLE 0, 0, 186, 71 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "正在等待程序" +FONT 9, "MS Song" +BEGIN + DEFPUSHBUTTON "取消",IDCANCEL,129,49,50,15 + PUSHBUTTON "中断进程",IDOK,51,49,71,15 + LTEXT "正在模拟关机, 但是这个程序没有反应.", + IDC_STATIC,7,7,172,19 + LTEXT "如果你中断进程,有可能丢失没有保存的数据.", + IDC_STATIC,7,28,172,15 +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDD_ENDTASK DIALOG DISCARDABLE 0, 0, 186, 71 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "正在等待程式" +FONT 8, "PMingLiu" +BEGIN + DEFPUSHBUTTON "取消",IDCANCEL,129,49,50,15 + PUSHBUTTON "中斷進程",IDOK,51,49,71,15 + LTEXT "正在模擬關機, 但是這個程式沒有反應.", + IDC_STATIC,7,7,172,19 + LTEXT "如果你中斷進程,有可能丟失沒有儲存的數據.", + IDC_STATIC,7,28,172,15 +END + +#pragma code_page(default) diff --git a/programs/winebrowser/Makefile.in b/programs/winebrowser/Makefile.in index 3fc720292c2..4b2b69e5c75 100644 --- a/programs/winebrowser/Makefile.in +++ b/programs/winebrowser/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/winebrowser/main.c b/programs/winebrowser/main.c index 3ad24ae9402..9e56cf5fb65 100644 --- a/programs/winebrowser/main.c +++ b/programs/winebrowser/main.c @@ -284,9 +284,9 @@ static WCHAR *get_url_from_dde(void) while (!ddeString) { MSG msg; - if (!GetMessage(&msg, NULL, 0, 0)) break; + if (!GetMessageW(&msg, NULL, 0, 0)) break; if (msg.message == WM_TIMER) break; - DispatchMessage(&msg); + DispatchMessageW(&msg); } if (ddeString) @@ -381,7 +381,7 @@ int wmain(int argc, WCHAR *argv[]) /* check if the argument is a local file */ wine_get_unix_file_name_ptr = (wine_get_unix_file_name_t) - GetProcAddress( GetModuleHandle( "KERNEL32" ), "wine_get_unix_file_name" ); + GetProcAddress( GetModuleHandleA( "KERNEL32" ), "wine_get_unix_file_name" ); if (wine_get_unix_file_name_ptr == NULL) { diff --git a/programs/winecfg/Ja.rc b/programs/winecfg/Ja.rc index 77ecf4f3fd9..fcf2433e68d 100644 --- a/programs/winecfg/Ja.rc +++ b/programs/winecfg/Ja.rc @@ -69,8 +69,8 @@ FONT 9, "MS UI Gothic" BEGIN GROUPBOX " ƒEƒBƒ“ƒhƒE�Ý’è ",IDC_STATIC,8,4,244,84 CONTROL "DirectX ƒAƒvƒŠƒP�[ƒVƒ‡ƒ“‚ªƒ}ƒEƒX‚ðŠm•Û‚·‚é‚Ì‚ð‹–‰Â‚·‚é(&M)",IDC_DX_MOUSE_GRAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,20,230,8 - CONTROL "ƒEƒBƒ“ƒhƒEƒ}ƒl�[ƒWƒƒ‚ªƒEƒBƒ“ƒhƒE‚ð‘•�ü‚·‚é‚Ì‚ð‹–‰Â‚·‚é(&D)",IDC_ENABLE_DECORATED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,230,8 - CONTROL "ƒEƒBƒ“ƒhƒEƒ}ƒl�[ƒWƒƒ‚ªƒEƒBƒ“ƒhƒE‚ð�§Œä‚·‚é‚Ì‚ð‹–‰Â‚·‚é(&W)",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 + CONTROL "ƒEƒBƒ“ƒhƒE ƒ}ƒl�[ƒWƒƒ‚ªƒEƒBƒ“ƒhƒE‚ð‘•�ü‚·‚é‚Ì‚ð‹–‰Â‚·‚é(&D)",IDC_ENABLE_DECORATED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,32,230,8 + CONTROL "ƒEƒBƒ“ƒhƒE ƒ}ƒl�[ƒWƒƒ‚ªƒEƒBƒ“ƒhƒE‚ð�§Œä‚·‚é‚Ì‚ð‹–‰Â‚·‚é(&W)",IDC_ENABLE_MANAGED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,44,230,8 CONTROL "‰¼‘zƒfƒXƒNƒgƒbƒv‚ðƒGƒ~ƒ…ƒŒ�[ƒg‚·‚é(&D)",IDC_ENABLE_DESKTOP,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,15,56,230,8 LTEXT "ƒfƒXƒNƒgƒbƒv‚Ì‘å‚«‚³(&Z):",IDC_DESKTOP_SIZE,15,70,44,8,WS_DISABLED @@ -95,7 +95,7 @@ STYLE WS_CHILD | WS_DISABLED FONT 9, "MS UI Gothic" BEGIN GROUPBOX " DLL ƒI�[ƒo�[ƒ‰ƒCƒh ",IDC_STATIC,8,4,244,240 - LTEXT "ƒ_ƒCƒiƒ~ƒbƒN�EƒŠƒ“ƒN�Eƒ‰ƒCƒuƒ‰ƒŠ(DLL)‚ÍŒÂ•Ê‚É builtin (Wine”Å) ‚Ü‚½‚Í native (Windows ‚à‚µ‚­‚̓AƒvƒŠƒP�[ƒVƒ‡ƒ“’ñ‹Ÿ‚Ì•¨)‚ð‘I‚Ô‚±‚Æ‚ª‚Å‚«‚Ü‚·�B" + LTEXT "ƒ_ƒCƒiƒ~ƒbƒN ƒŠƒ“ƒN ƒ‰ƒCƒuƒ‰ƒŠ(DLL)‚ÍŒÂ•Ê‚É builtin (Wine”Å) ‚Ü‚½‚Í native (Windows ‚à‚µ‚­‚̓AƒvƒŠƒP�[ƒVƒ‡ƒ“’ñ‹Ÿ‚Ì•¨)‚ð‘I‚Ô‚±‚Æ‚ª‚Å‚«‚Ü‚·�B" ,IDC_STATIC,16,16,220,32 LTEXT "ƒ‰ƒCƒuƒ‰ƒŠ‚Ì�V‹KƒI�[ƒo�[ƒ‰ƒCƒh(&N):",IDC_STATIC,16,58,100,8 COMBOBOX IDC_DLLCOMBO,16,68,140,14,CBS_DROPDOWN | WS_VSCROLL | WS_TABSTOP | CBS_SORT | CBS_LOWERCASE @@ -166,15 +166,15 @@ BEGIN LTEXT "ƒI�[ƒfƒBƒIƒhƒ‰ƒCƒo: ",IDC_STATIC,15,20,227,30 CONTROL "Devices",IDC_AUDIO_TREE,"SysTreeView32",WS_BORDER | WS_TABSTOP,15,50,140,140 PUSHBUTTON "‰¹‚ðƒeƒXƒg(&T)",IDC_AUDIO_TEST,170,50,59,14 - PUSHBUTTON "ƒRƒ“ƒgƒ��[ƒ‹ƒpƒlƒ‹(&C)",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 + PUSHBUTTON "ƒRƒ“ƒgƒ��[ƒ‹ ƒpƒlƒ‹(&C)",IDC_AUDIO_CONTROL_PANEL,170,70,59,14 GROUPBOX " DirectSound ",IDC_STATIC,8,205,244,60 - LTEXT "ƒn�[ƒhƒEƒFƒA�EƒAƒNƒZƒ‰ƒŒ�[ƒVƒ‡ƒ“(&H): ",IDC_STATIC,15,215,90,10 + LTEXT "ƒn�[ƒhƒEƒFƒA ƒAƒNƒZƒ‰ƒŒ�[ƒVƒ‡ƒ“(&H): ",IDC_STATIC,15,215,90,10 COMBOBOX IDC_DSOUND_HW_ACCEL,100,213,150,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Šù’è‚̃Tƒ“ƒvƒ‹ƒŒ�[ƒg(&S):",IDC_STATIC,15,232,70,8 COMBOBOX IDC_DSOUND_RATES,90,230,42,76,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Default &Bits Per Sample:",IDC_STATIC,137,232,80,8 COMBOBOX IDC_DSOUND_BITS,220,230,30,56,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "ƒhƒ‰ƒCƒo�EƒGƒ~ƒ…ƒŒ�[ƒVƒ‡ƒ“(&E)",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,250,230,10 + CONTROL "ƒhƒ‰ƒCƒo ƒGƒ~ƒ…ƒŒ�[ƒVƒ‡ƒ“(&E)",IDC_DSOUND_DRV_EMUL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,250,230,10 END IDD_DESKTOP_INTEGRATION DIALOG DISCARDABLE 0, 0, 260, 250 @@ -184,7 +184,7 @@ BEGIN GROUPBOX " ŠOŠÏ ",IDC_STATIC,8,4,244,106 LTEXT "ƒe�[ƒ}(&T):",IDC_STATIC,15,16,130,8 COMBOBOX IDC_THEME_THEMECOMBO,15,24,130,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "ƒe�[ƒ}‚ðƒCƒ“ƒXƒg�[ƒ‹(&I)...",IDC_THEME_INSTALL,152,23,93,14 + PUSHBUTTON "ƒe�[ƒ}‚̃Cƒ“ƒXƒg�[ƒ‹(&I)...",IDC_THEME_INSTALL,152,23,93,14 LTEXT "”z�F(&C):",IDC_THEME_COLORTEXT,15,40,112,8 COMBOBOX IDC_THEME_COLORCOMBO,15,48,112,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "ƒTƒCƒY(&S):",IDC_THEME_SIZETEXT,135,40,110,8 @@ -222,6 +222,7 @@ BEGIN IDS_WINECFG_TITLE_APP "Wine configuration for %s" IDS_THEMEFILE "ƒe�[ƒ}ƒtƒ@ƒCƒ‹" IDS_THEMEFILE_SELECT "ƒe�[ƒ}ƒtƒ@ƒCƒ‹‚ð‘I‚ñ‚Å‚­‚¾‚³‚¢" + IDS_AUDIO_MISSING "There is no audio driver currently specified in the registry.\n\nA recommended driver has been selected for you.\nYou can use this driver or select another driver if available.\n\nYou must click Apply for the selection to take effect." IDS_SHELL_FOLDER "ƒVƒFƒ‹ƒtƒHƒ‹ƒ_" IDS_LINKS_TO "Links to" END @@ -259,7 +260,7 @@ BEGIN IDS_CONFIRM_DELETE_C "Are you sure you want to delete drive C?\n\nMost Windows applications expect drive C to exist, and will die messily if it doesn't. If you proceed remember to recreate it!" IDS_COL_DRIVELETTER "ƒŒƒ^�[" IDS_COL_DRIVEMAPPING "ƒhƒ‰ƒCƒu‚ÌŠ„‚è“–‚Ä" - IDS_NO_DRIVE_C "ƒhƒ‰ƒCƒu C ‚ª‚ ‚è‚Ü‚¹‚ñ�B‚±‚ê‚Í‚ ‚Ü‚è—Ç‚­‚ ‚è‚Ü‚¹‚ñ�B\n\nƒhƒ‰ƒCƒu C ‚ð�ì�¬‚·‚邽‚߂Ƀhƒ‰ƒCƒuƒ^ƒu“à‚Ì�u’ljÁ�v‚ð–Y‚ꂸ‚ɃNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢!\n" + IDS_NO_DRIVE_C "ƒhƒ‰ƒCƒu C ‚ª‚ ‚è‚Ü‚¹‚ñ�B‚±‚ê‚Í‚ ‚Ü‚è—Ç‚­‚ ‚è‚Ü‚¹‚ñ�B\n\nƒhƒ‰ƒCƒu C ‚ð�ì�¬‚·‚邽‚߂Ƀhƒ‰ƒCƒuƒ^ƒu“à‚Ì [’ljÁ] ‚ð–Y‚ꂸ‚ɃNƒŠƒbƒN‚µ‚Ä‚­‚¾‚³‚¢!\n" END STRINGTABLE DISCARDABLE @@ -286,3 +287,39 @@ BEGIN IDS_UNAVAILABLE_DRIVER "—˜—p‚Å‚«‚È‚¢ƒhƒ‰ƒCƒo‚ðƒŒƒWƒXƒgƒŠ“à‚ÉŒ©‚‚¯‚Ü‚µ‚½!\n\nƒŒƒWƒXƒgƒŠ‚©‚ç \"%s\" ‚ð�í�œ‚µ‚Ü‚·‚©?" IDS_WARNING "Œx��" END + +STRINGTABLE DISCARDABLE +BEGIN + IDC_SYSPARAMS_BUTTON "ƒRƒ“ƒgƒ��[ƒ‹‚Ì”wŒi" + IDC_SYSPARAMS_BUTTON_TEXT "ƒRƒ“ƒgƒ��[ƒ‹‚̃eƒLƒXƒg" + IDC_SYSPARAMS_DESKTOP "ƒfƒXƒNƒgƒbƒv" + IDC_SYSPARAMS_MENU "ƒ�ƒjƒ…�[‚Ì”wŒi" + IDC_SYSPARAMS_MENU_TEXT "ƒ�ƒjƒ…�[‚̃eƒLƒXƒg" + IDC_SYSPARAMS_SCROLLBAR "ƒXƒNƒ��[ƒ‹ƒo�[" + IDC_SYSPARAMS_SELECTION "‘I‘ð�€–Ú‚Ì”wŒi" + IDC_SYSPARAMS_SELECTION_TEXT "‘I‘ð�€–ڂ̃eƒLƒXƒg" + IDC_SYSPARAMS_TOOLTIP "ƒqƒ“ƒg‚Ì”wŒi" + IDC_SYSPARAMS_TOOLTIP_TEXT "ƒqƒ“ƒg‚̃eƒLƒXƒg" + IDC_SYSPARAMS_WINDOW "ƒEƒBƒ“ƒhƒE‚Ì”wŒi" + IDC_SYSPARAMS_WINDOW_TEXT "ƒEƒBƒ“ƒhƒE‚̃eƒLƒXƒg" + IDC_SYSPARAMS_ACTIVE_TITLE "ƒAƒNƒeƒBƒu ƒ^ƒCƒgƒ‹ ƒo�[" + IDC_SYSPARAMS_ACTIVE_TITLE_TEXT "ƒAƒNƒeƒBƒu ƒ^ƒCƒgƒ‹‚̃eƒLƒXƒg" + IDC_SYSPARAMS_INACTIVE_TITLE "”ñƒAƒNƒeƒBƒu ƒ^ƒCƒgƒ‹ ƒo�[" + IDC_SYSPARAMS_INACTIVE_TITLE_TEXT "”ñƒAƒNƒeƒBƒu ƒ^ƒCƒgƒ‹‚̃eƒLƒXƒg" + IDC_SYSPARAMS_MSGBOX_TEXT "ƒ�ƒbƒZ�[ƒW ƒ{ƒbƒNƒX‚̃eƒLƒXƒg" + IDC_SYSPARAMS_APPWORKSPACE "ƒAƒvƒŠƒP�[ƒVƒ‡ƒ“�ì‹Æˆæ" + IDC_SYSPARAMS_WINDOW_FRAME "ƒEƒBƒ“ƒhƒE‚Ì‹«ŠE" + IDC_SYSPARAMS_ACTIVE_BORDER "ƒAƒNƒeƒBƒu‹«ŠE" + IDC_SYSPARAMS_INACTIVE_BORDER "”ñƒAƒNƒeƒBƒu‹«ŠE" + IDC_SYSPARAMS_BUTTON_SHADOW "Controls Shadow" + IDC_SYSPARAMS_GRAY_TEXT "Gray Text" + IDC_SYSPARAMS_BUTTON_HILIGHT "Controls Highlight" + IDC_SYSPARAMS_BUTTON_DARK_SHADOW "Controls Dark Shadow" + IDC_SYSPARAMS_BUTTON_LIGHT "Controls Light" + IDC_SYSPARAMS_BUTTON_ALTERNATE "Controls Alternate Background" + IDC_SYSPARAMS_HOT_TRACKING "Hot Tracked Item" + IDC_SYSPARAMS_ACTIVE_TITLE_GRADIENT "Active Title Bar Gradient" + IDC_SYSPARAMS_INACTIVE_TITLE_GRADIENT "Inactive Title Bar Gradient" + IDC_SYSPARAMS_MENU_HILIGHT "Menu Highlight" + IDC_SYSPARAMS_MENUBAR "ƒ�ƒjƒ…�[ ƒo�[" +END diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h index 3fb650d4040..a8a3fc3288d 100644 --- a/programs/winedbg/debugger.h +++ b/programs/winedbg/debugger.h @@ -446,6 +446,7 @@ extern void dbg_del_process(struct dbg_process* p); struct dbg_thread* dbg_add_thread(struct dbg_process* p, DWORD tid, HANDLE h, void* teb); extern struct dbg_thread* dbg_get_thread(struct dbg_process* p, DWORD tid); extern void dbg_del_thread(struct dbg_thread* t); +extern BOOL dbg_init(HANDLE hProc, const char* in, BOOL invade); extern BOOL dbg_get_debuggee_info(HANDLE hProcess, IMAGEHLP_MODULE* imh_mod); /* gdbproxy.c */ diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c index 2fbec046147..dc80a842036 100644 --- a/programs/winedbg/gdbproxy.c +++ b/programs/winedbg/gdbproxy.c @@ -505,7 +505,7 @@ static void handle_debug_event(struct gdb_context* gdbctx, DEBUG_EVENT* de) de->u.CreateProcessInfo.nDebugInfoSize); /* de->u.CreateProcessInfo.lpStartAddress; */ - if (!SymInitialize(gdbctx->process->handle, NULL, TRUE)) + if (!dbg_init(gdbctx->process->handle, buffer, TRUE)) fprintf(stderr, "Couldn't initiate DbgHelp\n"); if (gdbctx->trace & GDBPXY_TRC_WIN32_EVENT) diff --git a/programs/winedbg/tgt_active.c b/programs/winedbg/tgt_active.c index 5fba6faab2f..75f22ade897 100644 --- a/programs/winedbg/tgt_active.c +++ b/programs/winedbg/tgt_active.c @@ -509,7 +509,7 @@ static unsigned dbg_handle_debug_event(DEBUG_EVENT* de) de->u.CreateProcessInfo.nDebugInfoSize); dbg_set_process_name(dbg_curr_process, buffer); - if (!SymInitialize(dbg_curr_process->handle, NULL, FALSE)) + if (!dbg_init(dbg_curr_process->handle, buffer, FALSE)) dbg_printf("Couldn't initiate DbgHelp\n"); if (!SymLoadModule(dbg_curr_process->handle, de->u.CreateProcessInfo.hFile, buffer, NULL, (unsigned long)de->u.CreateProcessInfo.lpBaseOfImage, 0)) diff --git a/programs/winedbg/tgt_minidump.c b/programs/winedbg/tgt_minidump.c index 87f34a2e3f4..8d623dcb9e0 100644 --- a/programs/winedbg/tgt_minidump.c +++ b/programs/winedbg/tgt_minidump.c @@ -304,7 +304,7 @@ static enum dbg_start minidump_do_reload(struct tgt_process_minidump_data* data) dbg_curr_process->pio_data = data; dbg_set_process_name(dbg_curr_process, exec_name); - SymInitialize(hProc, NULL, FALSE); + dbg_init(hProc, NULL, FALSE); if (MiniDumpReadDumpStream(data->mapping, ThreadListStream, &dir, &stream, &size)) { diff --git a/programs/winedbg/tgt_module.c b/programs/winedbg/tgt_module.c index ced9d852155..044e312097d 100644 --- a/programs/winedbg/tgt_module.c +++ b/programs/winedbg/tgt_module.c @@ -55,7 +55,7 @@ enum dbg_start tgt_module_load(const char* name, BOOL keep) SymSetOptions((opts & ~(SYMOPT_UNDNAME|SYMOPT_DEFERRED_LOADS)) | SYMOPT_LOAD_LINES | SYMOPT_AUTO_PUBLICS | 0x40000000); - if (!SymInitialize(hDummy, NULL, FALSE)) + if (!dbg_init(hDummy, NULL, FALSE)) return start_error_init; if (!SymLoadModule(hDummy, NULL, name, NULL, 0, 0)) { diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c index 26f422f5200..5cbc68faf8f 100644 --- a/programs/winedbg/winedbg.c +++ b/programs/winedbg/winedbg.c @@ -346,6 +346,45 @@ void dbg_del_process(struct dbg_process* p) HeapFree(GetProcessHeap(), 0, p); } +/****************************************************************** + * dbg_init + * + * Initializes the dbghelp library, and also sets the application directory + * as a place holder for symbol searches. + */ +BOOL dbg_init(HANDLE hProc, const char* in, BOOL invade) +{ + BOOL ret; + + ret = SymInitialize(hProc, NULL, invade); + if (ret && in) + { + const char* last; + + for (last = in + strlen(in) - 1; last >= in; last--) + { + if (*last == '/' || *last == '\\') + { + char* tmp; + tmp = HeapAlloc(GetProcessHeap(), 0, 1024 + 1 + (last - in) + 1); + if (tmp && SymGetSearchPath(hProc, tmp, 1024)) + { + char* x = tmp + strlen(tmp); + + *x++ = ';'; + memcpy(x, in, last - in); + x[last - in] = '\0'; + ret = SymSetSearchPath(hProc, tmp); + } + else ret = FALSE; + HeapFree(GetProcessHeap(), 0, tmp); + break; + } + } + } + return ret; +} + struct mod_loader_info { HANDLE handle; diff --git a/programs/winedevice/Makefile.in b/programs/winedevice/Makefile.in index 7effe56c639..c644b7a8609 100644 --- a/programs/winedevice/Makefile.in +++ b/programs/winedevice/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/winemenubuilder/Makefile.in b/programs/winemenubuilder/Makefile.in index 4894b6e92fa..e4c6ca174c0 100644 --- a/programs/winemenubuilder/Makefile.in +++ b/programs/winemenubuilder/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/winemine/Ja.rc b/programs/winemine/Ja.rc new file mode 100644 index 00000000000..c6bd52b43c3 --- /dev/null +++ b/programs/winemine/Ja.rc @@ -0,0 +1,92 @@ +/* + * WineMine + * Japanese Language Support + * + * Copyright 2000 Joshua Thielen + * Copyright 2003 Marcelo Duarte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +STRINGTABLE { + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Nobody" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +} + +MENU_WINEMINE MENU DISCARDABLE +{ + POPUP "ƒIƒvƒVƒ‡ƒ“(&O)" { + MENUITEM "ƒXƒ^�[ƒg(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "?ƒ}�[ƒN‚ðŽg—p(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "�‰‹‰(&B)", IDM_BEGINNER + MENUITEM "’†‹‰(&A)", IDM_ADVANCED + MENUITEM "�㋉(&E)", IDM_EXPERT + MENUITEM "”Õ–Ê‚Ì•Ï�X(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "�I—¹(&X)\tAlt+X", IDM_EXIT + } + POPUP "�î•ñ(&I)" { + MENUITEM "ƒnƒCƒXƒRƒA(&F)", IDM_TIMES + MENUITEM "WineMine ‚ɂ‚¢‚Ä(&A)", IDM_ABOUT + } +} + +DLG_TIMES DIALOG DISCARDABLE 0, 0, 160, 80 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "Fastest Times" +{ + GROUPBOX "ƒnƒCƒXƒRƒA", IDIGNORE, 10, 10, 140, 45 + LTEXT "�‰‹‰", IDIGNORE, 20, 20, 40, 8 + LTEXT "’†‹‰", IDIGNORE, 20, 30, 40, 8 + LTEXT "�㋉", IDIGNORE, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "OK", IDOK, 55, 60, 50, 15 +} + +DLG_CONGRATS DIALOG DISCARDABLE 0, 0, 160, 60 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "‚¨‚ß‚Å‚Æ‚¤!" +{ + LTEXT "–¼‘O‚ð“ü—Í‚µ‚Ü‚µ‚傤", IDIGNORE, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "OK", IDOK, 60, 40, 40, 15 +} + +DLG_CUSTOM DIALOG DISCARDABLE 0, 0, 100, 100 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "”Õ–Ê‚Ì•Ï�X" +{ + LTEXT "Rows", IDIGNORE, 5, 5, 30, 10 + LTEXT "Cols", IDIGNORE, 5, 35, 30, 10 + LTEXT "Mines", IDIGNORE, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Cancel", IDCANCEL, 40, 50, 50, 15 +} diff --git a/programs/winemine/Zh.rc b/programs/winemine/Zh.rc new file mode 100644 index 00000000000..5ee6cb66010 --- /dev/null +++ b/programs/winemine/Zh.rc @@ -0,0 +1,166 @@ +/* + * WineMine (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +STRINGTABLE { + IDS_APPNAME, "Wine地雷" + IDS_NOBODY, "无人" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +} + +MENU_WINEMINE MENU DISCARDABLE +{ + POPUP "选项(&O)" { + MENUITEM "新游戏(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "标出问题(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "初学者(&B)", IDM_BEGINNER + MENUITEM "高级(&A)", IDM_ADVANCED + MENUITEM "专家(&E)", IDM_EXPERT + MENUITEM "自定义(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "退出(&X)\tAlt+X", IDM_EXIT + } + POPUP "信息(&I)" { + MENUITEM "最快时间(&F)", IDM_TIMES + MENUITEM "关于(&A)", IDM_ABOUT + } +} + +DLG_TIMES DIALOG DISCARDABLE 0, 0, 160, 80 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "最快时间" +{ + GROUPBOX "最快时间", IDIGNORE, 10, 10, 140, 45 + LTEXT "初学者", IDIGNORE, 20, 20, 40, 8 + LTEXT "高级", IDIGNORE, 20, 30, 40, 8 + LTEXT "专家", IDIGNORE, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "确定", IDOK, 55, 60, 50, 15 +} + +DLG_CONGRATS DIALOG DISCARDABLE 0, 0, 160, 60 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "祝贺!" +{ + LTEXT "请输入你的名字", IDIGNORE, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "确定", IDOK, 60, 40, 40, 15 +} + +DLG_CUSTOM DIALOG DISCARDABLE 0, 0, 100, 100 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "自定义游戏" +{ + LTEXT "行", IDIGNORE, 5, 5, 30, 10 + LTEXT "列", IDIGNORE, 5, 35, 30, 10 + LTEXT "地雷", IDIGNORE, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "确定", IDOK, 40, 30, 50, 15 + PUSHBUTTON "取消", IDCANCEL, 40, 50, 50, 15 +} + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +STRINGTABLE { + IDS_APPNAME, "Wine地雷" + IDS_NOBODY, "無人" + IDS_ABOUT, "Copyright 2000 Joshua Thielen" +} + +MENU_WINEMINE MENU DISCARDABLE +{ + POPUP "選項(&O)" { + MENUITEM "新遊戲(&N)\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "標出問題(&M)", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "初學者(&B)", IDM_BEGINNER + MENUITEM "高級(&A)", IDM_ADVANCED + MENUITEM "專家(&E)", IDM_EXPERT + MENUITEM "自定義(&C)", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "結束(&X)\tAlt+X", IDM_EXIT + } + POPUP "資訊(&I)" { + MENUITEM "最快時間(&F)", IDM_TIMES + MENUITEM "關於(&A)", IDM_ABOUT + } +} + +DLG_TIMES DIALOG DISCARDABLE 0, 0, 160, 80 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "最快時間" +{ + GROUPBOX "最快時間", IDIGNORE, 10, 10, 140, 45 + LTEXT "初學者", IDIGNORE, 20, 20, 40, 8 + LTEXT "高級", IDIGNORE, 20, 30, 40, 8 + LTEXT "專家", IDIGNORE, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "確定", IDOK, 55, 60, 50, 15 +} + +DLG_CONGRATS DIALOG DISCARDABLE 0, 0, 160, 60 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "祝賀!" +{ + LTEXT "請輸入你的名字", IDIGNORE, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "確定", IDOK, 60, 40, 40, 15 +} + +DLG_CUSTOM DIALOG DISCARDABLE 0, 0, 100, 100 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "自定義遊戲" +{ + LTEXT "行", IDIGNORE, 5, 5, 30, 10 + LTEXT "列", IDIGNORE, 5, 35, 30, 10 + LTEXT "地雷", IDIGNORE, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "確定", IDOK, 40, 30, 50, 15 + PUSHBUTTON "取消", IDCANCEL, 40, 50, 50, 15 +} + +#pragma code_page(default) diff --git a/programs/winemine/rsrc.rc b/programs/winemine/rsrc.rc index cb4202a51cb..8387ad8a1bf 100644 --- a/programs/winemine/rsrc.rc +++ b/programs/winemine/rsrc.rc @@ -32,6 +32,7 @@ #include "Fi.rc" #include "Fr.rc" #include "It.rc" +#include "Ja.rc" #include "Ko.rc" #include "Nl.rc" #include "No.rc" @@ -41,6 +42,7 @@ #include "Ru.rc" #include "Si.rc" #include "Tr.rc" +#include "Zh.rc" LANGUAGE LANG_NEUTRAL,SUBLANG_NEUTRAL diff --git a/programs/winepath/Makefile.in b/programs/winepath/Makefile.in index 947e338385f..1ced54e9e86 100644 --- a/programs/winepath/Makefile.in +++ b/programs/winepath/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/winepath/winepath.c b/programs/winepath/winepath.c index 7179214bafe..f4430d31eb6 100644 --- a/programs/winepath/winepath.c +++ b/programs/winepath/winepath.c @@ -155,7 +155,7 @@ int wmain(int argc, const WCHAR *argv[]) if (outputformats & UNIXFORMAT) { wine_get_unix_file_name_ptr = (void*) - GetProcAddress(GetModuleHandle("KERNEL32"), + GetProcAddress(GetModuleHandleA("KERNEL32"), "wine_get_unix_file_name"); if (wine_get_unix_file_name_ptr == NULL) { fprintf(stderr, "%s: cannot get the address of " @@ -166,7 +166,7 @@ int wmain(int argc, const WCHAR *argv[]) if (outputformats & WINDOWSFORMAT) { wine_get_dos_file_name_ptr = (void*) - GetProcAddress(GetModuleHandle("KERNEL32"), + GetProcAddress(GetModuleHandleA("KERNEL32"), "wine_get_dos_file_name"); if (wine_get_dos_file_name_ptr == NULL) { fprintf(stderr, "%s: cannot get the address of " diff --git a/programs/winetest/gui.c b/programs/winetest/gui.c index b7386791f49..2957dbfd1d5 100644 --- a/programs/winetest/gui.c +++ b/programs/winetest/gui.c @@ -337,6 +337,10 @@ AskTagProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) switch (LOWORD (wParam)) { case IDOK: len = GetWindowTextLengthA (GetDlgItem (hwnd, IDC_TAG)); + if(!len) { + report (R_WARNING, "You must enter a tag to continue"); + return FALSE; + } tag = xmalloc (len+1); GetDlgItemTextA (hwnd, IDC_TAG, tag, len+1); EndDialog (hwnd, IDOK); diff --git a/programs/winetest/main.c b/programs/winetest/main.c index 045845a3552..86035f04379 100644 --- a/programs/winetest/main.c +++ b/programs/winetest/main.c @@ -672,7 +672,7 @@ int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, SetEnvironmentVariableA( "WINETEST_REPORT_SUCCESS", "0" ); } - if (!tag) { + while (!tag) { if (!interactive) report (R_FATAL, "Please specify a tag (-t option) if " "running noninteractive!"); diff --git a/programs/winevdm/Makefile.in b/programs/winevdm/Makefile.in index 0da674ae12d..b2bc317ac8e 100644 --- a/programs/winevdm/Makefile.in +++ b/programs/winevdm/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/winevdm/winevdm.c b/programs/winevdm/winevdm.c index 5491384a958..ea6a4946d11 100644 --- a/programs/winevdm/winevdm.c +++ b/programs/winevdm/winevdm.c @@ -218,7 +218,7 @@ static VOID pif_cmd( char *filename, char *cmdline) if( (p = strrchr( progname, '.')) && !strcasecmp( p, ".bat")) WINE_FIXME(".bat programs in pif files are not supported.\n"); /* first change dir, so the search below can start from there */ - if( startdir[0] && !SetCurrentDirectory( startdir)) { + if( startdir[0] && !SetCurrentDirectoryA( startdir)) { WINE_ERR("Cannot change directory %s\n", wine_dbgstr_a( startdir)); sprintf( buf, "%s\nInvalid startup directory. Check your pif file.", filename); diff --git a/programs/winhlp32/Zh.rc b/programs/winhlp32/Zh.rc index d510450e862..c0ed0176d77 100644 --- a/programs/winhlp32/Zh.rc +++ b/programs/winhlp32/Zh.rc @@ -87,7 +87,7 @@ STID_BACK, "返回(&B)" STID_ALL_FILES, "所有文件 (*.*)" STID_HELP_FILES_HLP, "帮助文件 (*.hlp)" STID_FILE_NOT_FOUND_s "不能打开文件 '%s'. 你想要自己找这个文件吗?" -STID_NO_RICHEDIT "找不到 richedit ... 终止" +STID_NO_RICHEDIT "找不到 richedit... 终止" STID_PSH_INDEX, "帮助内容: " } @@ -155,7 +155,7 @@ STID_BACK, "返回(&B)" STID_ALL_FILES, "所有檔案 (*.*)" STID_HELP_FILES_HLP, "幫助檔案 (*.hlp)" STID_FILE_NOT_FOUND_s "不能開啟檔案 '%s'. 你想要自己找這個檔案嗎?" -STID_NO_RICHEDIT "找不到 richedit ... 終止" +STID_NO_RICHEDIT "找不到 richedit... 終止" STID_PSH_INDEX, "幫助內容: " } diff --git a/programs/winver/Makefile.in b/programs/winver/Makefile.in index 8d6942dbd37..62571d3e05a 100644 --- a/programs/winver/Makefile.in +++ b/programs/winver/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/winver/winver.c b/programs/winver/winver.c index bf1d791d2ca..acb5d61d867 100644 --- a/programs/winver/winver.c +++ b/programs/winver/winver.c @@ -23,9 +23,5 @@ int PASCAL WinMain (HINSTANCE inst, HINSTANCE prev, LPSTR cmdline, int show) { - return ShellAbout(NULL, PACKAGE_NAME, PACKAGE_STRING, 0); + return ShellAboutA(NULL, PACKAGE_NAME, PACKAGE_STRING, 0); } - -/* Local Variables: */ -/* c-files style: "GNU" */ -/* End: */ diff --git a/programs/wordpad/Ja.rc b/programs/wordpad/Ja.rc new file mode 100644 index 00000000000..acb3ddf868e --- /dev/null +++ b/programs/wordpad/Ja.rc @@ -0,0 +1,241 @@ +/* + * Copyright 2008 by Katayama Hirofumi MZ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "ƒtƒ@ƒCƒ‹(&F)" + BEGIN + MENUITEM "�V‹K�ì�¬(&N)...\tCtrl+N", ID_FILE_NEW + MENUITEM "ŠJ‚­(&O)...\tCtrl+O", ID_FILE_OPEN + MENUITEM "�ã�‘‚«•Û‘¶(&S)\tCtrl+S", ID_FILE_SAVE + MENUITEM "–¼‘O‚ð•t‚¯‚Ä•Û‘¶(&A)...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "ˆó�ü(&P)...\tCtrl+P", ID_PRINT + MENUITEM "ˆó�üƒvƒŒƒrƒ…�[(&W)...", ID_PREVIEW + MENUITEM "ƒy�[ƒW�Ý’è(&E)...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "�I—¹(&X)", ID_FILE_EXIT + END + POPUP "•Ò�W(&E)" + BEGIN + MENUITEM "Œ³‚É–ß‚·(&U)\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "‚â‚è’¼‚µ(&E)\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "�Ø‚èŽæ‚è(&T)\tCtrl+X", ID_EDIT_CUT + MENUITEM "ƒRƒs�[(&C)\tCtrl+C", ID_EDIT_COPY + MENUITEM "“\\‚è•t‚¯(&P)\tCtrl+V", ID_EDIT_PASTE + MENUITEM "ƒNƒŠƒA(&C)\tDEL", ID_EDIT_CLEAR + MENUITEM "‚·‚ׂđI‘ð(&S)\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "ŒŸ�õ(&F)...\tCrtl+F", ID_FIND + MENUITEM "ŽŸ‚ðŒŸ�õ(&N)\tF3", ID_FIND_NEXT + MENUITEM "’uŠ·(&R)...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "“Ç‚ÝŽæ‚è�ê—p(&O)", ID_EDIT_READONLY + MENUITEM "•Ï�X‚ ‚è(&M)", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "E&xtras" + BEGIN + MENUITEM "Selection &info", ID_EDIT_SELECTIONINFO + MENUITEM "Character &format", ID_EDIT_CHARFORMAT + MENUITEM "&Def. char format", ID_EDIT_DEFCHARFORMAT + MENUITEM "Paragrap&h format", ID_EDIT_PARAFORMAT + MENUITEM "&Get text", ID_EDIT_GETTEXT + END + END + POPUP "•\\Ž¦(&V)" + BEGIN + MENUITEM "ƒc�[ƒ‹ƒo�[(&T)", ID_TOGGLE_TOOLBAR + MENUITEM "�‘Ž®ƒo�[(&F)", ID_TOGGLE_FORMATBAR + MENUITEM "ƒ‹�[ƒ‰�[(&R)", ID_TOGGLE_RULER + MENUITEM "ƒXƒe�[ƒ^ƒX ƒo�[(&S)", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "ƒIƒvƒVƒ‡ƒ“(&O)...", ID_VIEWPROPERTIES + END + POPUP "‘}“ü(&I)" + BEGIN + MENUITEM "“ú•t‚ÆŽž��(&D)...", ID_DATETIME + END + POPUP "�‘Ž®(&O)" + BEGIN + MENUITEM "ƒtƒHƒ“ƒg(&F)...", ID_FONTSETTINGS + MENUITEM "‰Ó�ð�‘‚«(&B)" ID_BULLET + MENUITEM "’i—Ž(&P)..." ID_PARAFORMAT + MENUITEM "ƒ^ƒu(&T)..." ID_TABSTOPS + POPUP "”wŒi(&D)" + BEGIN + MENUITEM "ƒVƒXƒeƒ€(&S)\tCtrl+1", ID_BACK_1 + MENUITEM "&PostThat yellowish\tCtrl+2", ID_BACK_2 + END + END + POPUP "ƒwƒ‹ƒv(&H)" + BEGIN + MENUITEM "Wine Wordpad‚ɂ‚¢‚Ä(&A)" ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "�Ø‚èŽæ‚è(&T)", ID_EDIT_CUT + MENUITEM "ƒRƒs�[(&C)", ID_EDIT_COPY + MENUITEM "“\\‚è•t‚¯(&P)", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "‰Ó�ð�‘‚«(&B)" ID_BULLET + MENUITEM "’i—Ž(&P)..." ID_PARAFORMAT + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "“ú•t‚ÆŽž��" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "—˜—p‚Å‚«‚éŒ`Ž®",0,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT|LBS_NOTIFY + PUSHBUTTON "&OK",IDOK,87,12,40,12 + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "�V‹K�ì�¬" +FONT 9, "MS UI Gothic" +BEGIN + LTEXT "�V‚µ‚¢•¶�‘Œ`Ž®",0,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "&OK",IDOK,97,12,40,12 + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "’i—Ž‚Ì�Ý’è" +FONT 9, "MS UI Gothic" +BEGIN + GROUPBOX "ƒCƒ“ƒfƒ“ƒg", 0, 10, 10, 120, 68 + LTEXT "�¶(&L)", 0, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "‰E(&R)", 0, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "�Å�‰‚Ì�s(&F)", 0, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "�®—ñ(&A)", 0, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "ƒ^ƒu‚Ì�Ý’è" +FONT 9, "MS UI Gothic" +BEGIN + GROUPBOX "ƒ^ƒu‚Ì’âŽ~ˆÊ’u(&T)", 0, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "’ljÁ(&A)", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "�í�œ(&R)", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15 + PUSHBUTTON "ƒLƒƒƒ“ƒZƒ‹(&C)", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "‚·‚ׂÄ�í�œ(&L)", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +STYLE DS_SYSMODAL +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "�s‚Ì�Ü‚è•Ô‚µ", 0, 10, 10, 130, 85 + RADIOBUTTON "ƒEƒBƒ“ƒhƒE‚Ì‹«ŠE‚Å�Ü‚è•Ô‚·(&W)", IDC_PAGEFMT_WW, 18, 25, 117, 15 + RADIOBUTTON "ƒ}�[ƒWƒ“‚Å�Ü‚è•Ô‚·(&M)", IDC_PAGEFMT_WM, 18, 45, 117, 15 + GROUPBOX "ƒc�[ƒ‹ƒo�[", 0, 150, 10, 120, 85 + CHECKBOX "ƒc�[ƒ‹ƒo�[(&T)", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "�‘Ž®ƒo�[(&F)", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "ƒ‹�[ƒ‰�[(&R)", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "ƒXƒe�[ƒ^ƒXƒo�[(&S)", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_RICHTEXT_FILES_RTF, "ƒŠƒbƒ`ƒeƒLƒXƒgŒ`Ž® (*.rtf)" + STRING_TEXT_FILES_TXT, "ƒeƒLƒXƒg•¶�‘ (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "UnicodeƒeƒLƒXƒg•¶�‘(*.txt)" + STRING_ALL_FILES, "‚·‚ׂẴtƒ@ƒCƒ‹ (*.*)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "�¶" + STRING_ALIGN_RIGHT, "‰E" + STRING_ALIGN_CENTER, "’†‰›" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_NEWFILE_RICHTEXT, "ƒŠƒbƒ`ƒeƒLƒXƒg•¶�‘" + STRING_NEWFILE_TXT, "ƒeƒLƒXƒg•¶�‘" + STRING_NEWFILE_TXT_UNICODE, "UnicodeƒeƒLƒXƒg•¶�‘" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PRINTER_FILES_PRN, "ƒvƒŠƒ“ƒ^ƒtƒ@ƒCƒ‹ (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "ƒIƒvƒVƒ‡ƒ“" + STRING_VIEWPROPS_TEXT, "ƒeƒLƒXƒg" + STRING_VIEWPROPS_RICHTEXT, "ƒŠƒbƒ`ƒeƒLƒXƒg" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "ˆó�ü" + STRING_PREVIEW_NEXTPAGE, "ŽŸ‚̃y�[ƒW" + STRING_PREVIEW_PREVPAGE, "‘O‚̃y�[ƒW" + STRING_PREVIEW_TWOPAGES, "2ƒy�[ƒW" + STRING_PREVIEW_ONEPAGE, "1ƒy�[ƒW" + STRING_PREVIEW_CLOSE, "•Â‚¶‚é" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "•¶�‘" + STRING_PROMPT_SAVE_CHANGES, "'%s'‚Ö‚Ì•Ï�X‚ð•Û‘¶‚µ‚Ü‚·‚©?" + STRING_SEARCH_FINISHED, "•¶�‘‚ÌŒŸ�õ‚ðŠ®—¹�B" + STRING_LOAD_RICHED_FAILED, "RichEditƒ‰ƒCƒuƒ‰ƒŠ‚Ì“Ç‚Ý�ž‚Ý‚ÉŽ¸”s�B" + STRING_SAVE_LOSEFORMATTING, "ƒvƒŒ�[ƒ“ƒeƒLƒXƒgŒ`Ž®‚Å•Û‘¶‚·‚é‚Æ�A" \ + "‚·‚ׂĂÌ�‘Ž®‚ªŽ¸‚í‚ê‚Ü‚·�B" \ + "‚»‚ê‚Å‚à‚æ‚¢‚Å‚·‚©�H" + STRING_INVALID_NUMBER, "�”‚Ì�‘Ž®‚ª•s�³" + STRING_OLE_STORAGE_NOT_SUPPORTED, "OLEƒXƒgƒŒ�[ƒW•¶�‘‚̓Tƒ|�[ƒg‚³‚ê‚Ä‚¢‚Ü‚¹‚ñ�B" + STRING_WRITE_FAILED, "ƒtƒ@ƒCƒ‹‚ð•Û‘¶‚Å‚«‚Ü‚¹‚ñ�B" + STRING_WRITE_ACCESS_DENIED, "ƒtƒ@ƒCƒ‹‚É•Û‘¶‚·‚錠ŒÀ‚ª‚ ‚è‚Ü‚¹‚ñ�B" + STRING_OPEN_FAILED, "ƒtƒ@ƒCƒ‹‚ðŠJ‚¯‚Ü‚¹‚ñ�B" + STRING_OPEN_ACCESS_DENIED, "ƒtƒ@ƒCƒ‹‚ðŠJ‚­Œ ŒÀ‚ª‚ ‚è‚Ü‚¹‚ñ�B" +END diff --git a/programs/wordpad/Zh.rc b/programs/wordpad/Zh.rc new file mode 100644 index 00000000000..6b19a3d7358 --- /dev/null +++ b/programs/wordpad/Zh.rc @@ -0,0 +1,472 @@ +/* + * wordpad (Simplified and Traditional Chinese Resource) + * + * Copyright 2008 Hongbo Ni + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* Chinese text is encoded in UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "文件(&F)" + BEGIN + MENUITEM "新建(&N)...\tCtrl+N", ID_FILE_NEW + MENUITEM "打开(&O)...\tCtrl+O", ID_FILE_OPEN + MENUITEM "保存(&S)\tCtrl+S", ID_FILE_SAVE + MENUITEM "另存为(&A)...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "打印(&P)...\tCtrl+P", ID_PRINT + MENUITEM "打印预览(&W)...", ID_PREVIEW + MENUITEM "页面设置(&E)...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "退出(&X)", ID_FILE_EXIT + END + POPUP "编辑(&E)" + BEGIN + MENUITEM "撤销(&U)\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "重做(&E)\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "剪切(&T)\tCtrl+X", ID_EDIT_CUT + MENUITEM "复制(&C)\tCtrl+C", ID_EDIT_COPY + MENUITEM "粘贴(&P)\tCtrl+V", ID_EDIT_PASTE + MENUITEM "删除(&D)\tDEL", ID_EDIT_CLEAR + MENUITEM "全选(&S)\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "查找(&F)...\tCrtl+F", ID_FIND + MENUITEM "找下一个(&N)\tF3", ID_FIND_NEXT + MENUITEM "替换(&R)...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "只读(&0))", ID_EDIT_READONLY + MENUITEM "已改动(M)", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "其他(&X)" + BEGIN + MENUITEM "选择信息(&I)", ID_EDIT_SELECTIONINFO + MENUITEM "文字格式(&F)", ID_EDIT_CHARFORMAT + MENUITEM "默认格式(&D)", ID_EDIT_DEFCHARFORMAT + MENUITEM "段落格式(&H)", ID_EDIT_PARAFORMAT + MENUITEM "获取文字(&G)", ID_EDIT_GETTEXT + END + END + POPUP "视图(&V)" + BEGIN + MENUITEM "工具栏(&T)", ID_TOGGLE_TOOLBAR + MENUITEM "格式工具栏(&F)", ID_TOGGLE_FORMATBAR + MENUITEM "标尺(&R)", ID_TOGGLE_RULER + MENUITEM "状态栏(&S)", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "选项(&O)...", ID_VIEWPROPERTIES + END + POPUP "插入(&I)" + BEGIN + MENUITEM "日期时间(&D)...", ID_DATETIME + END + POPUP "格式(&O)" + BEGIN + MENUITEM "字体(&F)..", ID_FONTSETTINGS + MENUITEM "子弹点(&B)", ID_BULLET + MENUITEM "段落(&P)...", ID_PARAFORMAT + MENUITEM "标签(&T)...", ID_TABSTOPS + POPUP "背景(&D)" + BEGIN + MENUITEM "系统(&S)\tCtrl+1", ID_BACK_1 + MENUITEM "淡黄色(&P)\tCtrl+2", ID_BACK_2 + END + END + POPUP "帮助(&H)" + BEGIN + MENUITEM "关于 &Wine 写字板", ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "剪切(&T)", ID_EDIT_CUT + MENUITEM "复制(&C)", ID_EDIT_COPY + MENUITEM "粘贴(&P)", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "子弹点(&B)" ID_BULLET + MENUITEM "段落(&P)..." ID_PARAFORMAT + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "日期和时间" +FONT 9, "MS Song" +BEGIN + LTEXT "可用格式",0,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "确定(&O)",IDOK,87,12,40,12 + PUSHBUTTON "取消(&C)",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "新建" +FONT 9, "MS Song" +BEGIN + LTEXT "新文件类型",0,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "确定(&O)",IDOK,97,12,40,12 + PUSHBUTTON "取消(&C)",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "段落格式" +FONT 9, "MS Song" +BEGIN + GROUPBOX "缩进", 0, 10, 10, 120, 68 + LTEXT "左", 0, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "右", 0, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "第一行", 0, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "对齐", 0, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "确定(&O)", IDOK, 137, 15, 50, 15 + PUSHBUTTON "取消(&C)", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "标签" +FONT 9, "MS Song" +BEGIN + GROUPBOX "标签停点", 0, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "添加(&A)", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "删除(&R)", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "确定(&O)", IDOK, 137, 15, 50, 15 + PUSHBUTTON "取消(&C)", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "全部删除(&R)", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 9, "MS Song" +BEGIN + GROUPBOX "自动换行", 0, 10, 10, 130, 85 + RADIOBUTTON "按视窗宽度(&W)", IDC_PAGEFMT_WW, 18, 25, 117, 15 + RADIOBUTTON "按纸张宽度(&M)", IDC_PAGEFMT_WM, 18, 45, 117, 15 + GROUPBOX "工具栏", 0, 150, 10, 120, 85 + CHECKBOX "工具栏(&T)", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "格式工具栏(&F)", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "标尺(&R)", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "状态栏(&S)", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_RICHTEXT_FILES_RTF, "RTF丰富格式 (*.rtf)" + STRING_TEXT_FILES_TXT, "文本文件 (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "统一码文本文件 (*.txt)" + STRING_ALL_FILES, "所有文件 (*.*)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "左" + STRING_ALIGN_RIGHT, "右" + STRING_ALIGN_CENTER, "中" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_NEWFILE_RICHTEXT, "RTF丰富格式文件" + STRING_NEWFILE_TXT, "文本文件 " + STRING_NEWFILE_TXT_UNICODE, "统一码文本文件" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PRINTER_FILES_PRN, "打印文件 (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "选项" + STRING_VIEWPROPS_TEXT, "文本文字" + STRING_VIEWPROPS_RICHTEXT, "丰富格式文字" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "打印" + STRING_PREVIEW_NEXTPAGE, "下一页" + STRING_PREVIEW_PREVPAGE, "上一页" + STRING_PREVIEW_TWOPAGES, "双页" + STRING_PREVIEW_ONEPAGE, "单页" + STRING_PREVIEW_CLOSE, "关闭" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Document" + STRING_PROMPT_SAVE_CHANGES, "保存改动到 '%s'?" + STRING_SEARCH_FINISHED, "文件查找结束." + STRING_LOAD_RICHED_FAILED, "RichEdit 装载失败." + STRING_SAVE_LOSEFORMATTING, "你已经选择保存为文本文件, " \ + "这可能导致格式丢失. " \ + "你确定要这么做吗?" + STRING_INVALID_NUMBER, "数字格式无效" + STRING_OLE_STORAGE_NOT_SUPPORTED, "不支持OLE 储存文件" + STRING_WRITE_FAILED, "不能保存文件." + STRING_WRITE_ACCESS_DENIED, "你没有保存文件的权力." + STRING_OPEN_FAILED, "不能打开文件." + STRING_OPEN_ACCESS_DENIED, "你没有打开文件的权力." +END + +LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL + +IDM_MAINMENU MENU DISCARDABLE +BEGIN + POPUP "檔案(&F)" + BEGIN + MENUITEM "新建(&N)...\tCtrl+N", ID_FILE_NEW + MENUITEM "開啟(&O)...\tCtrl+O", ID_FILE_OPEN + MENUITEM "儲存(&S)\tCtrl+S", ID_FILE_SAVE + MENUITEM "另存為(&A)...", ID_FILE_SAVEAS + MENUITEM SEPARATOR + MENUITEM "列印(&P)...\tCtrl+P", ID_PRINT + MENUITEM "列印預覽(&W)...", ID_PREVIEW + MENUITEM "頁面設定(&E)...", ID_PRINTSETUP + MENUITEM SEPARATOR + MENUITEM "結束(&X)", ID_FILE_EXIT + END + POPUP "編輯(&E)" + BEGIN + MENUITEM "復原(&U)\tCtrl+Z", ID_EDIT_UNDO + MENUITEM "重做(&E)\tCtrl+Y", ID_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "剪下(&T)\tCtrl+X", ID_EDIT_CUT + MENUITEM "複製(&C)\tCtrl+C", ID_EDIT_COPY + MENUITEM "貼上(&P)\tCtrl+V", ID_EDIT_PASTE + MENUITEM "刪除(&D)\tDEL", ID_EDIT_CLEAR + MENUITEM "全選(&S)\tCtrl+A", ID_EDIT_SELECTALL + MENUITEM SEPARATOR + MENUITEM "查找(&F)...\tCrtl+F", ID_FIND + MENUITEM "找下一個(&N)\tF3", ID_FIND_NEXT + MENUITEM "替換(&R)...\tCtrl+H", ID_REPLACE + MENUITEM SEPARATOR + MENUITEM "唯讀(&0))", ID_EDIT_READONLY + MENUITEM "已改動(M)", ID_EDIT_MODIFIED + MENUITEM SEPARATOR + POPUP "其他(&X)" + BEGIN + MENUITEM "選擇資訊(&I)", ID_EDIT_SELECTIONINFO + MENUITEM "文字格式(&F)", ID_EDIT_CHARFORMAT + MENUITEM "默認格式(&D)", ID_EDIT_DEFCHARFORMAT + MENUITEM "段落格式(&H)", ID_EDIT_PARAFORMAT + MENUITEM "獲取文字(&G)", ID_EDIT_GETTEXT + END + END + POPUP "檢視(&V)" + BEGIN + MENUITEM "工具欄(&T)", ID_TOGGLE_TOOLBAR + MENUITEM "格式工具欄(&F)", ID_TOGGLE_FORMATBAR + MENUITEM "標尺(&R)", ID_TOGGLE_RULER + MENUITEM "狀態欄(&S)", ID_TOGGLE_STATUSBAR + MENUITEM SEPARATOR + MENUITEM "選項(&O)...", ID_VIEWPROPERTIES + END + POPUP "插入(&I)" + BEGIN + MENUITEM "日期時間(&D)...", ID_DATETIME + END + POPUP "格式(&O)" + BEGIN + MENUITEM "字型(&F)..", ID_FONTSETTINGS + MENUITEM "子彈點(&B)", ID_BULLET + MENUITEM "段落(&P)...", ID_PARAFORMAT + MENUITEM "標籤(&T)...", ID_TABSTOPS + POPUP "背景(&D)" + BEGIN + MENUITEM "系統(&S)\tCtrl+1", ID_BACK_1 + MENUITEM "淡黃色(&P)\tCtrl+2", ID_BACK_2 + END + END + POPUP "幫助(&H)" + BEGIN + MENUITEM "關於 &Wine 寫字板", ID_ABOUT + END +END + +IDM_POPUP MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "剪下(&T)", ID_EDIT_CUT + MENUITEM "複製(&C)", ID_EDIT_COPY + MENUITEM "貼上(&P)", ID_EDIT_PASTE + MENUITEM SEPARATOR + MENUITEM "子彈點(&B)" ID_BULLET + MENUITEM "段落(&P)..." ID_PARAFORMAT + END +END + +IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "日期和時間" +FONT 8, "PMingLiu" +BEGIN + LTEXT "可用格式",0,3,2,100,15 + LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "確定(&O)",IDOK,87,12,40,12 + PUSHBUTTON "取消(&C)",IDCANCEL,87,26,40,12 +END + +IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "新建" +FONT 8, "PMingLiu" +BEGIN + LTEXT "新檔案類型",0,3,2,100,15 + LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT + PUSHBUTTON "確定(&O)",IDOK,97,12,40,12 + PUSHBUTTON "取消(&C)",IDCANCEL,97,26,40,12 +END + +IDD_PARAFORMAT DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "段落格式" +FONT 8, "PMingLiu" +BEGIN + GROUPBOX "縮進", 0, 10, 10, 120, 68 + LTEXT "左", 0, 15, 22, 40, 13 + EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13 + LTEXT "右", 0, 15, 40, 40, 13 + EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13 + LTEXT "第一行", 0, 15, 58, 40, 13 + EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13 + LTEXT "對齊", 0, 15, 87, 40, 13 + COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST + PUSHBUTTON "確定(&O)", IDOK, 137, 15, 50, 15 + PUSHBUTTON "取消(&C)", IDCANCEL, 137, 33, 50, 15 +END + +IDD_TABSTOPS DIALOG DISCARDABLE 30, 20, 200, 110 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +Caption "標籤" +FONT 8, "PMingLiu" +BEGIN + GROUPBOX "標籤停點", 0, 10, 10, 120, 90 + COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "添加(&A)", ID_TAB_ADD, 20, 80, 45, 15 + PUSHBUTTON "刪除(&R)", ID_TAB_DEL, 72, 80, 45, 15 + PUSHBUTTON "確定(&O)", IDOK, 137, 15, 50, 15 + PUSHBUTTON "取消(&C)", IDCANCEL, 137, 33, 50, 15 + PUSHBUTTON "全部刪除(&R)", ID_TAB_EMPTY, 137, 51, 50, 15 +END + +IDD_FORMATOPTS DIALOG DISCARDABLE 0, 0, 280, 110 +STYLE DS_SYSMODAL +Caption "" +FONT 8, "PMingLiu" +BEGIN + GROUPBOX "自動換行", 0, 10, 10, 130, 85 + RADIOBUTTON "按視窗寬度(&W)", IDC_PAGEFMT_WW, 18, 25, 117, 15 + RADIOBUTTON "按紙張寬度(&M)", IDC_PAGEFMT_WM, 18, 45, 117, 15 + GROUPBOX "工具欄", 0, 150, 10, 120, 85 + CHECKBOX "工具欄(&T)", IDC_PAGEFMT_TB, 160, 20, 80, 15 + CHECKBOX "格式工具欄(&F)", IDC_PAGEFMT_FB, 160, 38, 80, 15 + CHECKBOX "標尺(&R)", IDC_PAGEFMT_RU, 160, 56, 80, 15 + CHECKBOX "狀態欄(&S)", IDC_PAGEFMT_SB, 160, 74, 80, 15 + LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0 +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_RICHTEXT_FILES_RTF, "RTF豐富格式 (*.rtf)" + STRING_TEXT_FILES_TXT, "文本檔案 (*.txt)" + STRING_TEXT_FILES_UNICODE_TXT, "統一碼文本檔案 (*.txt)" + STRING_ALL_FILES, "所有檔案 (*.*)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_ALIGN_LEFT, "左" + STRING_ALIGN_RIGHT, "右" + STRING_ALIGN_CENTER, "中" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_NEWFILE_RICHTEXT, "RTF豐富格式檔案" + STRING_NEWFILE_TXT, "文本檔案 " + STRING_NEWFILE_TXT_UNICODE, "統一碼文本檔案" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PRINTER_FILES_PRN, "列印檔案 (*.PRN)" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_VIEWPROPS_TITLE, "選項" + STRING_VIEWPROPS_TEXT, "文本文字" + STRING_VIEWPROPS_RICHTEXT, "豐富格式文字" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_PREVIEW_PRINT, "列印" + STRING_PREVIEW_NEXTPAGE, "下一頁" + STRING_PREVIEW_PREVPAGE, "上一頁" + STRING_PREVIEW_TWOPAGES, "雙頁" + STRING_PREVIEW_ONEPAGE, "單頁" + STRING_PREVIEW_CLOSE, "關閉" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_UNITS_CM, "cm" +END + +STRINGTABLE DISCARDABLE +BEGIN + STRING_DEFAULT_FILENAME, "Document" + STRING_PROMPT_SAVE_CHANGES, "儲存改動到 '%s'?" + STRING_SEARCH_FINISHED, "檔案查找結束." + STRING_LOAD_RICHED_FAILED, "RichEdit 裝載失敗." + STRING_SAVE_LOSEFORMATTING, "你已經選擇儲存為文本檔案, " \ + "這可能導致格式丟失. " \ + "你確定要這麼做嗎?" + STRING_INVALID_NUMBER, "數字格式無效" + STRING_OLE_STORAGE_NOT_SUPPORTED, "不支援OLE 儲存檔案" + STRING_WRITE_FAILED, "不能儲存檔案." + STRING_WRITE_ACCESS_DENIED, "你沒有儲存檔案的權力." + STRING_OPEN_FAILED, "不能開啟檔案." + STRING_OPEN_ACCESS_DENIED, "你沒有開啟檔案的權力." +END + +#pragma code_page(default) diff --git a/programs/wordpad/rsrc.rc b/programs/wordpad/rsrc.rc index 452f920ed66..49482adf13d 100644 --- a/programs/wordpad/rsrc.rc +++ b/programs/wordpad/rsrc.rc @@ -69,6 +69,7 @@ IDI_TXT ICON "txt.ico" #include "En.rc" #include "Fr.rc" #include "Hu.rc" +#include "Ja.rc" #include "Ko.rc" #include "Nl.rc" #include "No.rc" @@ -76,3 +77,4 @@ IDI_TXT ICON "txt.ico" #include "Ru.rc" #include "Si.rc" #include "Tr.rc" +#include "Zh.rc" diff --git a/programs/write/Makefile.in b/programs/write/Makefile.in index 1e877ef75b6..eb9e0cafb35 100644 --- a/programs/write/Makefile.in +++ b/programs/write/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ diff --git a/programs/write/write.c b/programs/write/write.c index 0f2aca07d7b..f60d40c2f09 100644 --- a/programs/write/write.c +++ b/programs/write/write.c @@ -40,7 +40,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar lstrcatW(path, SZ_BACKSLASH); lstrcatW(path, SZ_WORDPAD); - stinf.cb = sizeof(STARTUPINFO); + stinf.cb = sizeof(STARTUPINFOW); GetStartupInfoW(&stinf); if (!CreateProcessW(path, GetCommandLineW(), NULL, NULL, FALSE, 0, NULL, NULL, &stinf, &info)) @@ -48,7 +48,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar return 0; failed: - LoadStringW(GetModuleHandle(NULL), IDS_FAILED, path, MAX_PATH); + LoadStringW(GetModuleHandleW(NULL), IDS_FAILED, path, MAX_PATH); MessageBoxW(NULL, path, NULL, MB_OK|MB_ICONERROR); return 1; } diff --git a/programs/xcopy/Makefile.in b/programs/xcopy/Makefile.in index 18dd3ab4a94..7e9b26e8dd8 100644 --- a/programs/xcopy/Makefile.in +++ b/programs/xcopy/Makefile.in @@ -1,3 +1,4 @@ +EXTRADEFS = -DWINE_NO_UNICODE_MACROS TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ @@ -5,7 +6,6 @@ VPATH = @srcdir@ MODULE = xcopy.exe APPMODE = -mconsole -municode -mno-cygwin IMPORTS = shell32 user32 kernel32 -EXTRADEFS = -DUNICODE EXTRAINCL = -I$(TOPSRCDIR)/include/msvcrt MODCFLAGS = @BUILTINFLAG@ diff --git a/programs/xcopy/xcopy.c b/programs/xcopy/xcopy.c index aeb839708ac..273047c29ff 100644 --- a/programs/xcopy/xcopy.c +++ b/programs/xcopy/xcopy.c @@ -120,7 +120,7 @@ int wmain (int argc, WCHAR *argvW[]) } /* Preinitialize flags based on COPYCMD */ - if (GetEnvironmentVariable(COPYCMD, copyCmd, MAXSTRING)) { + if (GetEnvironmentVariableW(COPYCMD, copyCmd, MAXSTRING)) { if (wcsstr(copyCmd, PROMPTSTR1) != NULL || wcsstr(copyCmd, PROMPTSTR2) != NULL) { flags |= OPT_NOPROMPT; @@ -177,7 +177,7 @@ int wmain (int argc, WCHAR *argvW[]) OPT_REMOVEARCH; break; /* E can be /E or /EXCLUDE */ - case 'E': if (CompareString (LOCALE_USER_DEFAULT, + case 'E': if (CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE | SORT_STRINGSORT, &argvW[0][1], 8, EXCLUDE, -1) == 2) { @@ -221,10 +221,10 @@ int wmain (int argc, WCHAR *argvW[]) /* Debug info: */ FileTimeToSystemTime (&dateRange, &st); - GetDateFormat (0, DATE_SHORTDATE, &st, NULL, datestring, - sizeof(datestring)); - GetTimeFormat (0, TIME_NOSECONDS, &st, - NULL, timestring, sizeof(timestring)); + GetDateFormatW(0, DATE_SHORTDATE, &st, NULL, datestring, + sizeof(datestring)/sizeof(WCHAR)); + GetTimeFormatW(0, TIME_NOSECONDS, &st, + NULL, timestring, sizeof(timestring)/sizeof(WCHAR)); WINE_TRACE("Date being used is: %s %s\n", wine_dbgstr_w(datestring), wine_dbgstr_w(timestring)); @@ -323,7 +323,7 @@ static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, /* * Validate the source, expanding to full path ensuring it exists */ - if (GetFullPathName(suppliedsource, MAX_PATH, actualsource, NULL) == 0) { + if (GetFullPathNameW(suppliedsource, MAX_PATH, actualsource, NULL) == 0) { WINE_FIXME("Unexpected failure expanding source path (%d)\n", GetLastError()); return RC_INITERROR; } @@ -351,7 +351,7 @@ static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, if (starPos || questPos) { attribs = 0x00; /* Ensures skips invalid or directory check below */ } else { - attribs = GetFileAttributes(actualsource); + attribs = GetFileAttributesW(actualsource); } if (attribs == INVALID_FILE_ATTRIBUTES) { @@ -393,7 +393,7 @@ static int XCOPY_ProcessSourceParm(WCHAR *suppliedsource, WCHAR *stem, lstrcpyW(spec, suppliedsource+2); } else { WCHAR curdir[MAXSTRING]; - GetCurrentDirectory (sizeof(curdir), curdir); + GetCurrentDirectoryW(sizeof(curdir)/sizeof(WCHAR), curdir); stem[0] = curdir[0]; stem[1] = curdir[1]; stem[2] = 0x00; @@ -418,13 +418,13 @@ static int XCOPY_ProcessDestParm(WCHAR *supplieddestination, WCHAR *stem, WCHAR /* * Validate the source, expanding to full path ensuring it exists */ - if (GetFullPathName(supplieddestination, MAX_PATH, actualdestination, NULL) == 0) { + if (GetFullPathNameW(supplieddestination, MAX_PATH, actualdestination, NULL) == 0) { WINE_FIXME("Unexpected failure expanding source path (%d)\n", GetLastError()); return RC_INITERROR; } /* Destination is either a directory or a file */ - attribs = GetFileAttributes(actualdestination); + attribs = GetFileAttributesW(actualdestination); if (attribs == INVALID_FILE_ATTRIBUTES) { @@ -500,7 +500,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, WCHAR *deststem, WCHAR *destspec, DWORD flags) { - WIN32_FIND_DATA *finddata; + WIN32_FIND_DATAW *finddata; HANDLE h; BOOL findres = TRUE; WCHAR *inputpath, *outputpath; @@ -510,7 +510,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, int ret = 0; /* Allocate some working memory on heap to minimize footprint */ - finddata = HeapAlloc(GetProcessHeap(), 0, sizeof(WIN32_FIND_DATA)); + finddata = HeapAlloc(GetProcessHeap(), 0, sizeof(WIN32_FIND_DATAW)); inputpath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); outputpath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR)); @@ -519,7 +519,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, lstrcatW(inputpath, srcspec); /* Search 1 - Look for matching files */ - h = FindFirstFile(inputpath, finddata); + h = FindFirstFileW(inputpath, finddata); while (h != INVALID_HANDLE_VALUE && findres) { skipFile = FALSE; @@ -587,7 +587,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, /* If just /D supplied, only overwrite if src newer than dest */ if (!skipFile && (flags & OPT_DATENEWER) && (destAttribs != INVALID_FILE_ATTRIBUTES)) { - HANDLE h = CreateFile(copyTo, GENERIC_READ, FILE_SHARE_READ, + HANDLE h = CreateFileW(copyTo, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (h != INVALID_HANDLE_VALUE) { @@ -611,7 +611,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, /* Uppercase source filename */ lstrcpyW(copyFromUpper, copyFrom); - CharUpperBuff(copyFromUpper, lstrlenW(copyFromUpper)); + CharUpperBuffW(copyFromUpper, lstrlenW(copyFromUpper)); /* Loop through testing each exclude line */ while (pos) { @@ -703,13 +703,13 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, write protection */ if ((destAttribs & FILE_ATTRIBUTE_READONLY) && (flags & OPT_REPLACEREAD)) { - SetFileAttributes(copyTo, destAttribs & ~FILE_ATTRIBUTE_READONLY); + SetFileAttributesW(copyTo, destAttribs & ~FILE_ATTRIBUTE_READONLY); } copiedFile = TRUE; if (flags & OPT_SIMULATE || flags & OPT_NOCOPY) { /* Skip copy */ - } else if (CopyFile(copyFrom, copyTo, FALSE) == 0) { + } else if (CopyFileW(copyFrom, copyTo, FALSE) == 0) { DWORD error = GetLastError(); XCOPY_wprintf(XCOPY_LoadMessage(STRING_COPYFAIL), @@ -728,7 +728,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, if (!skipFile) { if ((srcAttribs & FILE_ATTRIBUTE_ARCHIVE) && (flags & OPT_REMOVEARCH)) { - SetFileAttributes(copyFrom, (srcAttribs & ~FILE_ATTRIBUTE_ARCHIVE)); + SetFileAttributesW(copyFrom, (srcAttribs & ~FILE_ATTRIBUTE_ARCHIVE)); } filesCopied++; } @@ -736,7 +736,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, } /* Find next file */ - findres = FindNextFile(h, finddata); + findres = FindNextFileW(h, finddata); } FindClose(h); @@ -747,7 +747,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, findres = TRUE; WINE_TRACE("Processing subdirs with spec: %s\n", wine_dbgstr_w(inputpath)); - h = FindFirstFile(inputpath, finddata); + h = FindFirstFileW(inputpath, finddata); while (h != INVALID_HANDLE_VALUE && findres) { /* Only looking for dirs */ @@ -778,7 +778,7 @@ static int XCOPY_DoCopy(WCHAR *srcstem, WCHAR *srcspec, } /* Find next one */ - findres = FindNextFile(h, finddata); + findres = FindNextFileW(h, finddata); } } @@ -809,7 +809,7 @@ static BOOL XCOPY_CreateDirectory(const WCHAR* path) while ((len = lstrlenW(new_path)) && new_path[len - 1] == '\\') new_path[len - 1] = 0; - while (!CreateDirectory(new_path,NULL)) + while (!CreateDirectoryW(new_path,NULL)) { WCHAR *slash; DWORD last_error = GetLastError(); @@ -899,7 +899,7 @@ static BOOL XCOPY_ProcessExcludeFile(WCHAR* filename, WCHAR* endOfName) { } /* Process line by line */ - while (fgetws(buffer, sizeof(buffer), inFile) != NULL) { + while (fgetws(buffer, sizeof(buffer)/sizeof(WCHAR), inFile) != NULL) { EXCLUDELIST *thisEntry; int length = lstrlenW(buffer); @@ -914,7 +914,7 @@ static BOOL XCOPY_ProcessExcludeFile(WCHAR* filename, WCHAR* endOfName) { thisEntry->name = HeapAlloc(GetProcessHeap(), 0, (length * sizeof(WCHAR))+1); lstrcpyW(thisEntry->name, buffer); - CharUpperBuff(thisEntry->name, length); + CharUpperBuffW(thisEntry->name, length); WINE_TRACE("Read line : '%s'\n", wine_dbgstr_w(thisEntry->name)); } } @@ -940,7 +940,7 @@ static WCHAR *XCOPY_LoadMessage(UINT id) { static WCHAR msg[MAXSTRING]; const WCHAR failedMsg[] = {'F', 'a', 'i', 'l', 'e', 'd', '!', 0}; - if (!LoadString(GetModuleHandle(NULL), id, msg, sizeof(msg))) { + if (!LoadStringW(GetModuleHandleW(NULL), id, msg, sizeof(msg)/sizeof(WCHAR))) { WINE_FIXME("LoadString failed with %d\n", GetLastError()); lstrcpyW(msg, failedMsg); } @@ -955,10 +955,10 @@ static void XCOPY_FailMessage(DWORD err) { LPWSTR lpMsgBuf; int status; - status = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | + status = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, - (LPTSTR) &lpMsgBuf, 0, NULL); + (LPWSTR) &lpMsgBuf, 0, NULL); if (!status) { WINE_FIXME("FIXME: Cannot display message for error %d, status %d\n", err, GetLastError()); diff --git a/tools/widl/client.c b/tools/widl/client.c index 6f148c1c396..b2f971c6271 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -103,8 +103,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) if (needs_space_after(get_func_return_type(func))) fprintf(client, " "); if (callconv) fprintf(client, "%s ", callconv); - write_prefix_name(client, prefix_client, def); - fprintf(client, "(\n"); + fprintf(client, "%s%s(\n", prefix_client, get_name(def)); indent++; if (func->args) write_args(client, func->args, iface->name, 0, TRUE); diff --git a/tools/widl/header.c b/tools/widl/header.c index a3f7b01b8b2..0a2a98a8a27 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -130,21 +130,20 @@ void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID * uuid->Data4[6], uuid->Data4[7]); } -void write_name(FILE *h, const var_t *v) +const char *get_name(const var_t *v) { - if (is_attr( v->attrs, ATTR_PROPGET )) - fprintf(h, "get_" ); - else if (is_attr( v->attrs, ATTR_PROPPUT )) - fprintf(h, "put_" ); - else if (is_attr( v->attrs, ATTR_PROPPUTREF )) - fprintf(h, "putref_" ); - fprintf(h, "%s", v->name); -} - -void write_prefix_name(FILE *h, const char *prefix, const var_t *v) -{ - fprintf(h, "%s", prefix); - write_name(h, v); + static char buffer[256]; + + if (is_attr( v->attrs, ATTR_PROPGET )) + strcpy( buffer, "get_" ); + else if (is_attr( v->attrs, ATTR_PROPPUT )) + strcpy( buffer, "put_" ); + else if (is_attr( v->attrs, ATTR_PROPPUTREF )) + strcpy( buffer, "putref_" ); + else + buffer[0] = 0; + strcat( buffer, v->name ); + return buffer; } static void write_field(FILE *h, var_t *v) @@ -192,7 +191,7 @@ static void write_enums(FILE *h, var_list_t *enums) { if (v->name) { indent(h, 0); - write_name(h, v); + fprintf(h, "%s", get_name(v)); if (v->eval) { fprintf(h, " = "); write_expr(h, v->eval, 0, 1, NULL, NULL); @@ -635,17 +634,13 @@ static void write_method_macro(FILE *header, const type_t *iface, const char *na if (!is_callas(def->attrs)) { const var_t *arg; - fprintf(header, "#define %s_", name); - write_name(header,def); - fprintf(header, "(This"); + fprintf(header, "#define %s_%s(This", name, get_name(def)); if (cur->args) LIST_FOR_EACH_ENTRY( arg, cur->args, const var_t, entry ) fprintf(header, ",%s", arg->name); fprintf(header, ") "); - fprintf(header, "(This)->lpVtbl->"); - write_name(header, def); - fprintf(header, "(This"); + fprintf(header, "(This)->lpVtbl->%s(This", get_name(def)); if (cur->args) LIST_FOR_EACH_ENTRY( arg, cur->args, const var_t, entry ) fprintf(header, ",%s", arg->name); @@ -698,9 +693,7 @@ static void write_cpp_method_def(FILE *header, const type_t *iface) indent(header, 0); fprintf(header, "virtual "); write_type_decl_left(header, get_func_return_type(cur)); - fprintf(header, " %s ", callconv); - write_name(header, def); - fprintf(header, "(\n"); + fprintf(header, " %s %s(\n", callconv, get_name(def)); write_args(header, cur->args, iface->name, 2, TRUE); fprintf(header, ") = 0;\n"); fprintf(header, "\n"); @@ -725,9 +718,7 @@ static void do_write_c_method_def(FILE *header, const type_t *iface, const char if (!callconv) callconv = ""; indent(header, 0); write_type_decl_left(header, get_func_return_type(cur)); - fprintf(header, " (%s *", callconv); - write_name(header, def); - fprintf(header, ")(\n"); + fprintf(header, " (%s *%s)(\n", callconv, get_name(def)); write_args(header, cur->args, name, 1, TRUE); fprintf(header, ");\n"); fprintf(header, "\n"); @@ -759,15 +750,11 @@ static void write_method_proto(FILE *header, const type_t *iface) if (!callconv) callconv = ""; /* proxy prototype */ write_type_decl_left(header, get_func_return_type(cur)); - fprintf(header, " %s %s_", callconv, iface->name); - write_name(header, def); - fprintf(header, "_Proxy(\n"); + fprintf(header, " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(def)); write_args(header, cur->args, iface->name, 1, TRUE); fprintf(header, ");\n"); /* stub prototype */ - fprintf(header, "void __RPC_STUB %s_", iface->name); - write_name(header,def); - fprintf(header, "_Stub(\n"); + fprintf(header, "void __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(def)); fprintf(header, " IRpcStubBuffer* This,\n"); fprintf(header, " IRpcChannelBuffer* pRpcChannelBuffer,\n"); fprintf(header, " PRPC_MESSAGE pRpcMessage,\n"); @@ -799,9 +786,7 @@ void write_locals(FILE *fp, const type_t *iface, int body) const var_t *mdef = m->def; /* proxy prototype - use local prototype */ write_type_decl_left(fp, get_func_return_type(m)); - fprintf(fp, " CALLBACK %s_", iface->name); - write_name(fp, mdef); - fprintf(fp, "_Proxy(\n"); + fprintf(fp, " CALLBACK %s_%s_Proxy(\n", iface->name, get_name(mdef)); write_args(fp, m->args, iface->name, 1, TRUE); fprintf(fp, ")"); if (body) { @@ -823,9 +808,7 @@ void write_locals(FILE *fp, const type_t *iface, int body) fprintf(fp, ";\n"); /* stub prototype - use remotable prototype */ write_type_decl_left(fp, get_func_return_type(cur)); - fprintf(fp, " __RPC_STUB %s_", iface->name); - write_name(fp, mdef); - fprintf(fp, "_Stub(\n"); + fprintf(fp, " __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(mdef)); write_args(fp, cur->args, iface->name, 1, TRUE); fprintf(fp, ")"); if (body) @@ -849,8 +832,7 @@ static void write_function_proto(FILE *header, const type_t *iface, const func_t write_type_decl_left(header, get_func_return_type(fun)); fprintf(header, " "); if (callconv) fprintf(header, "%s ", callconv); - write_prefix_name(header, prefix, def); - fprintf(header, "(\n"); + fprintf(header, "%s%s(\n", prefix, get_name(def)); if (fun->args) write_args(header, fun->args, iface->name, 0, TRUE); else diff --git a/tools/widl/header.h b/tools/widl/header.h index 3fd3b43e3a5..d87ae165d71 100644 --- a/tools/widl/header.h +++ b/tools/widl/header.h @@ -31,8 +31,6 @@ extern unsigned long get_attrv(const attr_list_t *list, enum attr_type t); extern int is_void(const type_t *t); extern int is_conformant_array(const type_t *t); extern int is_declptr(const type_t *t); -extern void write_name(FILE *h, const var_t *v); -extern void write_prefix_name(FILE *h, const char *prefix, const var_t *v); extern const char* get_name(const var_t *v); extern void write_type_left(FILE *h, type_t *t, int declonly); extern void write_type_right(FILE *h, type_t *t, int is_field); diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c index c5c79c32ec8..a7d267af6de 100644 --- a/tools/widl/proxy.c +++ b/tools/widl/proxy.c @@ -115,6 +115,9 @@ static void init_proxy(const statement_list_t *stmts) print_proxy( "#undef RpcTryExcept\n"); print_proxy( "#undef RpcExcept\n"); print_proxy( "#undef RpcEndExcept\n"); + print_proxy( "#undef RpcTryFinally\n"); + print_proxy( "#undef RpcFinally\n"); + print_proxy( "#undef RpcEndFinally\n"); print_proxy( "#undef RpcExceptionCode\n"); print_proxy( "\n"); print_proxy( "struct __proxy_frame\n"); @@ -123,8 +126,15 @@ static void init_proxy(const statement_list_t *stmts) print_proxy( " sigjmp_buf jmp;\n"); print_proxy( " DWORD code;\n"); print_proxy( " MIDL_STUB_MESSAGE *stub;\n"); + print_proxy( " void *this;\n"); + print_proxy( " int fullptr;\n"); print_proxy( "};\n"); print_proxy( "\n"); + print_proxy("static void __proxy_finally_handler( struct __proxy_frame *frame )\n"); + print_proxy( "{\n"); + print_proxy( " if (frame->fullptr) NdrFullPointerXlatFree( frame->stub->FullPtrXlatTables );\n"); + print_proxy( " if (frame->this) NdrProxyFreeBuffer( frame->this, frame->stub );\n" ); + print_proxy( "}\n\n"); print_proxy( "static DWORD __proxy_exception_handler( EXCEPTION_RECORD *record,\n"); print_proxy( " EXCEPTION_REGISTRATION_RECORD *frame,\n"); print_proxy( " CONTEXT *context,\n"); @@ -133,12 +143,17 @@ static void init_proxy(const statement_list_t *stmts) print_proxy( " struct __proxy_frame *proxy_frame = (struct __proxy_frame *)frame;\n"); print_proxy( "\n"); print_proxy( " if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND | EH_NESTED_CALL))\n"); + print_proxy( " {\n" ); + print_proxy( " if (record->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND))\n"); + print_proxy( " __proxy_finally_handler( proxy_frame );\n"); print_proxy( " return ExceptionContinueSearch;\n"); + print_proxy( " }\n" ); print_proxy( " if (proxy_frame->stub->dwStubPhase == PROXY_SENDRECEIVE)\n"); print_proxy( " return ExceptionContinueSearch;\n"); print_proxy( "\n"); print_proxy( " proxy_frame->code = record->ExceptionCode;\n"); print_proxy( " __wine_rtl_unwind( frame, record );\n"); + print_proxy( " __proxy_finally_handler( proxy_frame );\n"); print_proxy( " __wine_pop_frame( frame );\n"); print_proxy( " siglongjmp( proxy_frame->jmp, 1 );\n"); print_proxy( "}\n"); @@ -166,6 +181,27 @@ static void init_proxy(const statement_list_t *stmts) print_proxy( "\n"); print_proxy( "#define RpcExceptionCode() (__proxy_frame.code)\n"); print_proxy( "\n"); + print_proxy( "#define RpcTryFinallyProxy(ptr) \\\n"); + print_proxy(" __proxy_frame.this = This; \\\n"); + print_proxy(" __proxy_frame.fullptr = ptr;\n"); + print_proxy( "\n"); + print_proxy( "#define RpcFinallyProxy \\\n"); + print_proxy(" __proxy_frame.this = 0; \\\n"); + print_proxy(" __proxy_frame.fullptr = 0;\n"); + print_proxy( "\n"); + print_proxy( "#define RpcTryFinallyStub\n"); + print_proxy( "\n"); + print_proxy( "#define RpcFinallyStub\n"); + print_proxy( "\n"); + print_proxy( "#define RpcEndFinally\n"); + print_proxy( "\n"); + print_proxy( "#else /* USE_COMPILER_EXCEPTIONS */\n"); + print_proxy( "\n"); + print_proxy( "#define RpcTryFinallyProxy(ptr) RpcTryFinally\n"); + print_proxy( "#define RpcTryFinallyStub RpcTryFinally\n"); + print_proxy( "#define RpcFinallyProxy RpcFinally\n"); + print_proxy( "#define RpcFinallyStub RpcFinally\n"); + print_proxy( "\n"); print_proxy( "#endif /* USE_COMPILER_EXCEPTIONS */\n"); print_proxy( "\n"); write_formatstringsdecl(proxy, indent, stmts, need_proxy); @@ -323,9 +359,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, indent = 0; write_type_decl_left(proxy, get_func_return_type(cur)); - print_proxy( " %s %s_", callconv, iface->name); - write_name(proxy, def); - print_proxy( "_Proxy(\n"); + print_proxy( " %s %s_%s_Proxy(\n", callconv, iface->name, get_name(def)); write_args(proxy, cur->args, iface->name, 1, TRUE); print_proxy( ")\n"); print_proxy( "{\n"); @@ -357,7 +391,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, print_proxy( "NdrProxyInitialize(This, &_RpcMessage, &_StubMsg, &Object_StubDesc, %d);\n", idx); proxy_check_pointers( cur->args ); - print_proxy( "RpcTryFinally\n" ); + print_proxy( "RpcTryFinallyProxy(%d)\n", has_full_pointer ); print_proxy( "{\n" ); indent++; @@ -391,7 +425,7 @@ static void gen_proxy(type_t *iface, const func_t *cur, int idx, indent--; print_proxy( "}\n"); - print_proxy( "RpcFinally\n" ); + print_proxy( "RpcFinallyProxy\n" ); print_proxy( "{\n" ); indent++; if (has_full_pointer) @@ -430,9 +464,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas, int has_full_pointer = is_full_pointer_function(cur); indent = 0; - print_proxy( "void __RPC_STUB %s_", iface->name); - write_name(proxy, def); - print_proxy( "_Stub(\n"); + print_proxy( "void __RPC_STUB %s_%s_Stub(\n", iface->name, get_name(def)); indent++; print_proxy( "IRpcStubBuffer* This,\n"); print_proxy( "IRpcChannelBuffer *_pRpcChannelBuffer,\n"); @@ -453,7 +485,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas, write_parameters_init(proxy, indent, cur); - print_proxy("RpcTryFinally\n"); + print_proxy("RpcTryFinallyStub\n"); print_proxy("{\n"); indent++; if (has_full_pointer) @@ -474,22 +506,13 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas, print_proxy(""); if (has_ret) fprintf(proxy, "_RetVal = "); if (cas) fprintf(proxy, "%s_%s_Stub", iface->name, cas); - else - { - fprintf(proxy, "_This->lpVtbl->"); - write_name(proxy, def); - } + else fprintf(proxy, "_This->lpVtbl->%s", get_name(def)); fprintf(proxy, "(_This"); if (cur->args) { LIST_FOR_EACH_ENTRY( arg, cur->args, const var_t, entry ) - { - fprintf(proxy, ", "); - if (arg->type->declarray) - fprintf(proxy, "*"); - write_name(proxy, arg); - } + fprintf(proxy, ", %s%s", arg->type->declarray ? "*" : "", get_name(arg)); } fprintf(proxy, ");\n"); fprintf(proxy, "\n"); @@ -512,7 +535,7 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas, indent--; print_proxy("}\n"); - print_proxy("RpcFinally\n"); + print_proxy("RpcFinallyStub\n"); print_proxy("{\n"); write_remoting_arguments(proxy, indent+1, cur, PASS_OUT, PHASE_FREE); @@ -530,40 +553,38 @@ static void gen_stub(type_t *iface, const func_t *cur, const char *cas, print_proxy("\n"); } -static int write_proxy_methods(type_t *iface) +static int write_proxy_methods(type_t *iface, int skip) { const func_t *cur; int i = 0; - if (iface->ref) i = write_proxy_methods(iface->ref); + if (iface->ref) i = write_proxy_methods(iface->ref, iface->ref->ref != NULL); if (iface->funcs) LIST_FOR_EACH_ENTRY( cur, iface->funcs, const func_t, entry ) { var_t *def = cur->def; if (!is_callas(def->attrs)) { if (i) fprintf(proxy, ",\n"); - print_proxy( "%s_", iface->name); - write_name(proxy, def); - fprintf(proxy, "_Proxy"); + if (skip) print_proxy( "0 /* %s_%s_Proxy */", iface->name, get_name(def)); + else print_proxy( "%s_%s_Proxy", iface->name, get_name(def)); i++; } } return i; } -static int write_stub_methods(type_t *iface) +static int write_stub_methods(type_t *iface, int skip) { const func_t *cur; int i = 0; - if (iface->ref) i = write_stub_methods(iface->ref); + if (iface->ref) i = write_stub_methods(iface->ref, TRUE); else return i; /* skip IUnknown */ if (iface->funcs) LIST_FOR_EACH_ENTRY( cur, iface->funcs, const func_t, entry ) { var_t *def = cur->def; if (!is_local(def->attrs)) { if (i) fprintf(proxy,",\n"); - print_proxy( "%s_", iface->name); - write_name(proxy, def); - fprintf(proxy, "_Stub"); + if (skip) print_proxy("STUB_FORWARDING_FUNCTION"); + else print_proxy( "%s_%s_Stub", iface->name, get_name(def)); i++; } } @@ -618,7 +639,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset) print_proxy( "},\n"); print_proxy( "{\n"); indent++; - write_proxy_methods(iface); + write_proxy_methods(iface, FALSE); fprintf(proxy, "\n"); indent--; print_proxy( "}\n"); @@ -630,7 +651,7 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset) print_proxy( "static const PRPC_STUB_FUNCTION %s_table[] =\n", iface->name); print_proxy( "{\n"); indent++; - stubs = write_stub_methods(iface); + stubs = write_stub_methods(iface, FALSE); fprintf(proxy, "\n"); indent--; fprintf(proxy, "};\n"); diff --git a/tools/widl/server.c b/tools/widl/server.c index 94fe099fbf8..c2271998719 100644 --- a/tools/widl/server.c +++ b/tools/widl/server.c @@ -63,13 +63,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) /* check for a defined binding handle */ explicit_handle_var = get_explicit_handle_var(func); - fprintf(server, "void __RPC_STUB\n"); - fprintf(server, "%s_", iface->name); - write_name(server, def); - fprintf(server, "(\n"); - indent++; - print_server("PRPC_MESSAGE _pRpcMessage)\n"); - indent--; + print_server("void __RPC_STUB %s_%s( PRPC_MESSAGE _pRpcMessage )\n", iface->name, get_name(def)); /* write the functions body */ fprintf(server, "{\n"); @@ -150,7 +144,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) print_server("_RetVal = "); else print_server(""); - write_prefix_name(server, prefix_server, def); + fprintf(server, "%s%s", prefix_server, get_name(def)); if (func->args) { @@ -176,10 +170,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) } else { - print_server(""); - if (var->type->declarray) - fprintf(server, "*"); - write_name(server, var); + print_server("%s%s", var->type->declarray ? "*" : "", get_name(var)); } } fprintf(server, ");\n"); @@ -260,11 +251,7 @@ static void write_dispatchtable(type_t *iface) if (iface->funcs) LIST_FOR_EACH_ENTRY( func, iface->funcs, const func_t, entry ) { var_t *def = func->def; - - print_server("%s_", iface->name); - write_name(server, def); - fprintf(server, ",\n"); - + print_server("%s_%s,\n", iface->name, get_name(def)); method_count++; } print_server("0\n"); diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 4540468ddb5..3cc2fb998bc 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -3196,11 +3196,9 @@ void declare_stub_args( FILE *file, int indent, const func_t *func ) write_type_decl_left(file, var->type); fprintf(file, " "); if (var->type->declarray) { - fprintf(file, "( *"); - write_name(file, var); - fprintf(file, " )"); + fprintf(file, "(*%s)", get_name(var)); } else - write_name(file, var); + fprintf(file, "%s", get_name(var)); write_type_right(file, var->type, FALSE); fprintf(file, ";\n"); @@ -3231,8 +3229,7 @@ void assign_stub_out_args( FILE *file, int indent, const func_t *func ) if (!in_attr) { - print_file(file, indent, ""); - write_name(file, var); + print_file(file, indent, "%s", get_name(var)); if (is_context_handle(var->type)) { diff --git a/tools/wine.inf.in b/tools/wine.inf.in index 4d10778ddd5..cc5916d70a4 100644 --- a/tools/wine.inf.in +++ b/tools/wine.inf.in @@ -241,6 +241,7 @@ HKCU,%Metrics%,"Shell Icon Size",2,"32" [DirectX] HKLM,Software\Microsoft\DirectX,"Version",,"4.09.00.0904" +HKLM,Software\Microsoft\DirectX,"InstalledVersion",1,00,00,00,09,00,00,00,00 HKLM,Software\Microsoft\DirectMusic,GMFilePath,,"%12%\gm.dls" HKLM,Software\Microsoft\DirectMusic\Defaults,DefaultOutputPort,,"{58C2B4D0-46E7-11D1-89AC-00A0C9054129}" HKLM,Software\Microsoft\DirectMusic\SoftwareSynths\{58C2B4D0-46E7-11D1-89AC-00A0C9054129},Description,,"Microsoft Software Synthesizer" diff --git a/tools/winebuild/import.c b/tools/winebuild/import.c index 5e0c172de29..4f6b5ba2949 100644 --- a/tools/winebuild/import.c +++ b/tools/winebuild/import.c @@ -746,7 +746,8 @@ static void output_immediate_imports(void) { if (dll_imports[i]->delay) continue; dll_name = make_c_identifier( dll_imports[i]->spec->file_name ); - output( "\t.long 0\n" ); /* OriginalFirstThunk */ + output( "\t.long .L__wine_spec_import_data_names+%d-.L__wine_spec_rva_base\n", /* OriginalFirstThunk */ + j * get_ptr_size() ); output( "\t.long 0\n" ); /* TimeDateStamp */ output( "\t.long 0\n" ); /* ForwarderChain */ output( "\t.long .L__wine_spec_import_name_%s-.L__wine_spec_rva_base\n", /* Name */ @@ -762,7 +763,7 @@ static void output_immediate_imports(void) output( "\t.long 0\n" ); /* FirstThunk */ output( "\n\t.align %d\n", get_alignment(get_ptr_size()) ); - output( ".L__wine_spec_import_data_ptrs:\n" ); + output( ".L__wine_spec_import_data_names:\n" ); for (i = 0; i < nb_imports; i++) { if (dll_imports[i]->delay) continue; @@ -783,6 +784,13 @@ static void output_immediate_imports(void) } output( "\t%s 0\n", get_asm_ptr_keyword() ); } + output( ".L__wine_spec_import_data_ptrs:\n" ); + for (i = 0; i < nb_imports; i++) + { + if (dll_imports[i]->delay) continue; + for (j = 0; j < dll_imports[i]->nb_imports; j++) output( "\t%s 0\n", get_asm_ptr_keyword() ); + output( "\t%s 0\n", get_asm_ptr_keyword() ); + } output( ".L__wine_spec_imports_end:\n" ); for (i = 0; i < nb_imports; i++) diff --git a/tools/winedump/debug.c b/tools/winedump/debug.c index b492be7a2c9..86ffd14444b 100644 --- a/tools/winedump/debug.c +++ b/tools/winedump/debug.c @@ -418,7 +418,7 @@ static void dump_codeview_headers(unsigned long base, unsigned long len) printf(" Filepos: 0x%08lX\n", pdb_data->filepos); printf(" TimeStamp: %08X (%s)\n", pdb_data->timestamp, get_time_str(pdb_data->timestamp)); - printf(" Dunno: %08X\n", pdb_data->unknown); + printf(" Age: %08X\n", pdb_data->age); printf(" Filename: %s\n", pdb_data->name); return; } @@ -428,7 +428,7 @@ static void dump_codeview_headers(unsigned long base, unsigned long len) rsds_data = (const void *)cv_base; printf(" Guid: %s\n", get_guid_str(&rsds_data->guid)); - printf(" Dunno: %08X\n", rsds_data->unknown); + printf(" Age: %08X\n", rsds_data->age); printf(" Filename: %s\n", rsds_data->name); return; } -- 2.11.4.GIT