From cd5c660bf9f83899a890666c30d7767f0e7659d7 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Mon, 3 May 2010 16:42:07 +0000 Subject: [PATCH] Revert the sync. We only can safely sync up to r46941. svn path=/branches/header-work/; revision=47096 --- ReactOS-arm.rbuild | 1 - base/applications/cmdutils/reg/reg.rbuild | 2 - .../applications/downloader/downloader.rbuild | 43 +- base/applications/fontview/fontview.rbuild | 2 - base/applications/kbswitch/kbswitch.rbuild | 1 - base/applications/magnify/magnify.rbuild | 2 +- base/applications/mplay32/mplay32.rbuild | 2 - .../mscutils/eventvwr/eventvwr.rbuild | 3 +- base/applications/network/ping/ping.c | 3 +- base/applications/notepad/settings.c | 16 +- base/applications/notepad/text.c | 8 +- base/applications/paint/lang/it-IT.rc | 6 +- base/applications/paint/main.c | 9 +- base/applications/paint/mouse.c | 72 - base/applications/rapps/rapps.rbuild | 2 - base/applications/rapps/rapps/firefox3.txt | 16 +- base/applications/rapps/rapps/mirandaim.txt | 4 +- base/applications/rapps/rapps/openttd.txt | 6 +- base/applications/rapps/rapps/opera.txt | 6 +- base/applications/rapps/rapps/scite.txt | 4 +- base/applications/rapps/rapps/scummvm.txt | 6 +- base/applications/rapps/rapps/seamonkey.txt | 16 +- base/applications/rapps/rapps/thunderbird.txt | 14 +- base/applications/rapps/rapps/utorrent.txt | 6 +- base/applications/regedit/framewnd.c | 27 +- base/applications/taskmgr/applpage.c | 120 +- base/applications/taskmgr/perfdata.c | 118 +- base/applications/taskmgr/perfdata.h | 1 - base/applications/taskmgr/procpage.c | 146 +- base/applications/taskmgr/taskmgr.c | 32 +- base/applications/winhlp32/hlpfile.c | 4 +- base/applications/winver/winver.rbuild | 2 - base/services/rpcss/rpcss.rbuild | 2 +- base/services/telnetd/telnetd.rbuild | 2 - base/services/tftpd/tftpd.rbuild | 4 +- base/setup/usetup/bootsup.c | 2 +- base/setup/usetup/inffile.c | 4 - base/setup/usetup/inffile.h | 2 - base/setup/usetup/interface/usetup.c | 11 +- base/setup/usetup/registry.c | 2 - base/setup/usetup/registry.h | 1 - base/setup/usetup/usetup.rbuild | 4 +- base/shell/cmd/console.c | 2 +- base/shell/cmd/filecomp.c | 15 +- base/shell/explorer/res/startmenu.ico | Bin 36710 -> 25214 bytes base/system/format/format.c | 6 - base/system/runonce/runonce.rbuild | 2 - base/system/userinit/userinit.c | 6 +- boot/bootdata/bootcd/bootcd.rbuild | 6 +- boot/bootdata/hivecls_arm.inf | 2 +- boot/bootdata/hivecls_i386.inf | 2 +- boot/bootdata/hivedef_arm.inf | 3 +- boot/bootdata/hivedef_i386.inf | Bin 314636 -> 153150 bytes boot/bootdata/livecd/livecd.rbuild | 6 +- boot/bootdata/packages/reactos.dff | 3 +- boot/bootdata/txtsetup.sif | 8 +- boot/freeldr/freeldr/arch/amd64/arch.S | 76 +- boot/freeldr/freeldr/arch/amd64/boot.S | 6 +- boot/freeldr/freeldr/arch/amd64/drvmap.S | 8 +- boot/freeldr/freeldr/arch/amd64/i386cpu.S | 6 +- boot/freeldr/freeldr/arch/amd64/i386pnp.S | 6 +- boot/freeldr/freeldr/arch/amd64/i386trap.S | 4 +- boot/freeldr/freeldr/arch/amd64/int386.S | 2 +- boot/freeldr/freeldr/arch/amd64/loader.c | 246 ++- boot/freeldr/freeldr/arch/amd64/mb.S | 24 +- boot/freeldr/freeldr/arch/i386/hardware.c | 28 +- boot/freeldr/freeldr/arch/i386/machpc.c | 1 + boot/freeldr/freeldr/arch/i386/machxbox.c | 1 + boot/freeldr/freeldr/arch/i386/miscboot.c | 6 + boot/freeldr/freeldr/arch/i386/xboxhw.c | 15 +- boot/freeldr/freeldr/arch/powerpc/mach.c | 1 + boot/freeldr/freeldr/disk/disk.c | 112 +- boot/freeldr/freeldr/disk/partition.c | 4 + boot/freeldr/freeldr/freeldr_arch.rbuild | 2 +- boot/freeldr/freeldr/freeldr_base.rbuild | 4 +- .../freeldr/include/arch/amd64/amd64.h | 2 +- boot/freeldr/freeldr/include/disk.h | 1 + boot/freeldr/freeldr/include/machine.h | 1 + boot/freeldr/freeldr/linuxboot.c | 7 + boot/freeldr/freeldr/machine.c | 7 + boot/freeldr/freeldr/reactos/arcname.c | 4 +- boot/freeldr/freeldr/reactos/reactos.c | 6 + boot/freeldr/freeldr/windows/amd64/wlmemory.c | 39 +- dll/cpl/desk/appearance.c | 15 +- dll/cpl/desk/background.c | 20 +- dll/cpl/desk/effappdlg.c | 3 +- dll/cpl/sysdm/lang/uk-UA.rc | 1 + dll/directx/bdaplgin/pincontrol.cpp | 2 +- dll/directx/ksproxy/allocator.cpp | 1 - dll/directx/ksproxy/enumpins.cpp | 1 + dll/directx/ksproxy/input_pin.cpp | 10 + dll/directx/ksproxy/mediasample.cpp | 2 + dll/directx/ksproxy/output_pin.cpp | 203 +- dll/directx/ksproxy/precomp.h | 2 +- dll/directx/ksproxy/proxy.cpp | 62 +- dll/directx/msdvbnp/enumpins.cpp | 8 + dll/directx/msdvbnp/msdvbnp.cpp | 89 +- dll/directx/msdvbnp/precomp.h | 1 - dll/directx/qedit/samplegrabber.c | 4 +- dll/directx/quartz/avidec.c | 2 +- dll/directx/quartz/avisplit.c | 4 +- dll/ntdll/ldr/utils.c | 2 +- dll/win32/activeds/activeds.spec | 2 +- dll/win32/activeds/activeds_main.c | 9 - dll/win32/actxprxy/actxprxy.rbuild | 3 +- dll/win32/atl/atl_ax.c | 2 +- dll/win32/avifil32/rsrc.rc | 6 +- dll/win32/cabinet/fdi.c | 4 +- dll/win32/comdlg32/filedlg.c | 16 +- dll/win32/comdlg32/fontdlg.c | 12 +- dll/win32/comdlg32/printdlg.c | 8 +- dll/win32/crypt32/base64.c | 54 +- dll/win32/crypt32/decode.c | 4 +- dll/win32/devmgr/lang/cs-CZ.rc | 8 +- dll/win32/gdi32/include/gdi32p.h | 87 - dll/win32/gdi32/objects/dc.c | 31 +- dll/win32/gdi32/objects/region.c | 133 +- dll/win32/gdiplus/brush.c | 12 +- dll/win32/gdiplus/font.c | 24 +- dll/win32/gdiplus/gdiplus.spec | 2 +- dll/win32/gdiplus/gdiplus_private.h | 24 - dll/win32/gdiplus/graphics.c | 1102 ++++------ dll/win32/gdiplus/image.c | 209 +- dll/win32/hhctrl.ocx/hhctrl.c | 2 +- dll/win32/inetcomm/mimeintl.c | 2 +- dll/win32/inetcomm/mimeole.c | 70 +- dll/win32/inseng/inseng_main.c | 1 + dll/win32/jscript/jscript.h | 1 - dll/win32/jscript/regexp.c | 111 +- dll/win32/jscript/string.c | 59 +- dll/win32/kernel32/file/dir.c | 4 +- dll/win32/kernel32/kernel32.pspec | 2 + dll/win32/kernel32/misc/stubs.c | 4 +- dll/win32/localspl/provider.c | 12 +- dll/win32/lpk/dllmain.c | 2 +- dll/win32/mciavi32/mciavi.c | 17 +- dll/win32/mcicda/mcicda.c | 5 +- dll/win32/mciqtz32/mciqtz.c | 9 +- dll/win32/mciqtz32/mciqtz_private.h | 1 - dll/win32/mciseq/mcimidi.c | 30 +- dll/win32/mciwave/mciwave.c | 104 +- dll/win32/msacm32/msacm32.rbuild | 2 +- dll/win32/mscoree/mscoree.rbuild | 1 - dll/win32/mscoree/mscoree.spec | 2 +- dll/win32/mscoree/mscoree_main.c | 237 +-- dll/win32/mscoree/mscoree_private.h | 13 - dll/win32/msctf/displayattributemgr.c | 139 -- dll/win32/msctf/inputprocessor.c | 4 +- dll/win32/msctf/msctf.c | 1 - dll/win32/msctf/msctf.rbuild | 1 - dll/win32/msctf/msctf_internal.h | 1 - dll/win32/msctf/regsvr.c | 7 - dll/win32/msgsm32.acm/msgsm32.c | 4 +- dll/win32/mshtml/dispex.c | 224 +- dll/win32/mshtml/editor.c | 1 + dll/win32/mshtml/htmlelem.c | 6 +- dll/win32/mshtml/htmlwindow.c | 20 - dll/win32/mshtml/install.c | 20 +- dll/win32/mshtml/mshtml_private.h | 12 +- dll/win32/mshtml/navigate.c | 70 +- dll/win32/mshtml/nsembed.c | 64 +- dll/win32/mshtml/nsevents.c | 8 +- dll/win32/mshtml/nsio.c | 61 +- dll/win32/mshtml/olecmd.c | 3 + dll/win32/mshtml/view.c | 9 +- dll/win32/msimtf/activeimmapp.c | 2 +- dll/win32/msvfw32/mciwnd.c | 29 +- dll/win32/msvfw32/msvfw32_ros.diff | 14 + dll/win32/msvfw32/msvideo16.c | 916 ++++++++ dll/win32/msvfw32/vfw16.h | 130 ++ dll/win32/msvidc32/msvideo1.c | 59 +- dll/win32/msxml3/dispex.c | 4 +- dll/win32/msxml3/element.c | 2 +- dll/win32/msxml3/main.c | 2 +- dll/win32/msxml3/node.c | 36 +- dll/win32/netcfgx/lang/cs-CZ.rc | 209 +- dll/win32/netcfgx/netcfgx.c | 26 + dll/win32/netcfgx/tcpipconf_notify.c | 38 +- dll/win32/netid/lang/cs-CZ.rc | 23 +- dll/win32/netid/lang/it-IT.rc | 10 +- dll/win32/netshell/lang/bg-BG.rc | 2 +- dll/win32/netshell/lang/cs-CZ.rc | 80 +- dll/win32/netshell/lang/da-DK.rc | 2 +- dll/win32/netshell/lang/de-DE.rc | 12 +- dll/win32/netshell/lang/el-GR.rc | 2 +- dll/win32/netshell/lang/en-US.rc | 2 +- dll/win32/netshell/lang/es-ES.rc | 2 +- dll/win32/netshell/lang/fr-FR.rc | 2 +- dll/win32/netshell/lang/hu-HU.rc | 2 +- dll/win32/netshell/lang/id-ID.rc | 2 +- dll/win32/netshell/lang/it-IT.rc | 2 +- dll/win32/netshell/lang/ja-JP.rc | 2 +- dll/win32/netshell/lang/nl-NL.rc | 2 +- dll/win32/netshell/lang/no-NO.rc | 2 +- dll/win32/netshell/lang/pl-PL.rc | 2 +- dll/win32/netshell/lang/ro-RO.rc | 2 +- dll/win32/netshell/lang/ru-RU.rc | 2 +- dll/win32/netshell/lang/sv-SE.rc | 2 +- dll/win32/netshell/lang/uk-UA.rc | 2 +- dll/win32/netshell/lang/zh-CN.rc | 2 +- dll/win32/netshell/lanstatusui.c | 4 +- dll/win32/ntmarta/ntmarta.c | 10 +- dll/win32/ole32/compobj.c | 6 +- dll/win32/ole32/ftmarshal.c | 29 +- dll/win32/ole32/ifs.c | 175 ++ dll/win32/ole32/moniker.c | 3 - dll/win32/ole32/ole32.rbuild | 1 - dll/win32/ole32/rpc.c | 56 +- dll/win32/ole32/storage32.c | 125 +- dll/win32/ole32/storage32.h | 9 - dll/win32/oleaut32/olepicture.c | 2 +- dll/win32/oleaut32/regsvr.c | 6 - dll/win32/oleaut32/typelib.c | 115 +- dll/win32/oleaut32/typelib2.c | 4 +- dll/win32/oleaut32/vartype.c | 2 +- dll/win32/rsaenh/rsaenh.c | 39 +- dll/win32/rsaenh/sha2.c | 44 +- dll/win32/schannel/lsamode.c | 14 +- dll/win32/setupapi/interface.c | 8 +- dll/win32/setupapi/lang/cs-CZ.rc | 30 +- dll/win32/shell32/dialogs.c | 12 +- dll/win32/shell32/folder_options.c | 261 +-- dll/win32/shell32/folders.c | 1 - dll/win32/shell32/fprop.c | 2 +- dll/win32/shell32/lang/bg-BG.rc | 6 +- dll/win32/shell32/lang/ca-ES.rc | 6 +- dll/win32/shell32/lang/cs-CZ.rc | 112 +- dll/win32/shell32/lang/da-DK.rc | 6 +- dll/win32/shell32/lang/de-DE.rc | 14 +- dll/win32/shell32/lang/el-GR.rc | 6 +- dll/win32/shell32/lang/en-GB.rc | 6 +- dll/win32/shell32/lang/en-US.rc | 17 +- dll/win32/shell32/lang/es-ES.rc | 6 +- dll/win32/shell32/lang/fi-FI.rc | 6 +- dll/win32/shell32/lang/fr-FR.rc | 6 +- dll/win32/shell32/lang/hu-HU.rc | 6 +- dll/win32/shell32/lang/it-IT.rc | 24 +- dll/win32/shell32/lang/ja-JP.rc | 5 +- dll/win32/shell32/lang/ko-KR.rc | 6 +- dll/win32/shell32/lang/nl-NL.rc | 6 +- dll/win32/shell32/lang/no-NO.rc | 8 +- dll/win32/shell32/lang/pl-PL.rc | 8 +- dll/win32/shell32/lang/pt-BR.rc | 6 +- dll/win32/shell32/lang/pt-PT.rc | 583 +++-- dll/win32/shell32/lang/ro-RO.rc | 6 +- dll/win32/shell32/lang/ru-RU.rc | 6 +- dll/win32/shell32/lang/sk-SK.rc | 6 +- dll/win32/shell32/lang/sl-SI.rc | 6 +- dll/win32/shell32/lang/sv-SE.rc | 6 +- dll/win32/shell32/lang/tr-TR.rc | 6 +- dll/win32/shell32/lang/uk-UA.rc | 6 +- dll/win32/shell32/lang/zh-CN.rc | 6 +- dll/win32/shell32/lang/zh-TW.rc | 6 +- dll/win32/shell32/she_ocmenu.c | 10 +- dll/win32/shell32/shfldr_cpanel.c | 8 +- dll/win32/shell32/shfldr_fonts.c | 3 +- dll/win32/shell32/shlfileop.c | 214 +- dll/win32/shell32/shresdef.h | 6 - dll/win32/shell32/shv_def_cmenu.c | 21 +- dll/win32/shlwapi/ordinal.c | 376 ++-- dll/win32/shlwapi/shlwapi.spec | 2 +- dll/win32/shlwapi/url.c | 13 +- dll/win32/sti/regsvr.c | 15 +- dll/win32/sti/sti.c | 352 ---- dll/win32/sti/sti.rbuild | 20 +- dll/win32/sti/sti.spec | 6 +- dll/win32/sti/sti_main.c | 140 +- dll/win32/sti/sti_private.h | 32 - dll/win32/sti/sti_wia.idl | 19 - dll/win32/syssetup/lang/it-IT.rc | 10 +- dll/win32/syssetup/wizard.c | 19 +- dll/win32/urlmon/bindprot.c | 4 +- dll/win32/urlmon/regsvr.c | 2 +- dll/win32/urlmon/urlmon_main.c | 4 +- dll/win32/urlmon/urlmon_main.h | 3 +- dll/win32/urlmon/urlmon_urlmon.idl | 2 +- dll/win32/urlmon/usrmarshal.c | 2 +- dll/win32/user32/controls/button.c | 13 +- dll/win32/user32/misc/stubs.c | 8 +- dll/win32/user32/windows/menu.c | 10 +- dll/win32/userenv/lang/cs-CZ.rc | 22 +- dll/win32/userenv/setup.c | 4 + dll/win32/usp10/bidi.c | 893 -------- dll/win32/usp10/usp10.c | 136 +- dll/win32/usp10/usp10.rbuild | 1 - dll/win32/usp10/usp10.spec | 2 +- dll/win32/usp10/usp10_internal.h | 28 - dll/win32/version/resource.c | 33 +- dll/win32/windowscodecs/bmpdecode.c | 137 +- dll/win32/windowscodecs/clsfactory.c | 1 - dll/win32/windowscodecs/converter.c | 39 +- dll/win32/windowscodecs/gifformat.c | 22 +- dll/win32/windowscodecs/icoformat.c | 60 +- dll/win32/windowscodecs/jpegformat.c | 28 +- dll/win32/windowscodecs/palette.c | 21 - dll/win32/windowscodecs/pngformat.c | 186 +- dll/win32/windowscodecs/regsvr.c | 53 +- dll/win32/windowscodecs/stream.c | 54 +- dll/win32/windowscodecs/tiffformat.c | 866 -------- dll/win32/windowscodecs/wincodecs_private.h | 1 - dll/win32/windowscodecs/windowscodecs.rbuild | 1 - dll/win32/wininet/internet.c | 18 +- dll/win32/wininet/urlcache.c | 44 +- dll/win32/wintrust/asn.c | 2 +- dll/win32/ws2_32/misc/ns.c | 203 +- drivers/bus/acpi/acpi.rbuild | 3 +- drivers/bus/directory.rbuild | 3 - drivers/bus/isapnp/fdo.c | 141 -- drivers/bus/isapnp/hardware.c | 579 ----- drivers/bus/isapnp/isapnp.c | 1780 +++++++++++++++- drivers/bus/isapnp/isapnp.h | 377 +++- drivers/bus/isapnp/isapnp.rbuild | 4 - drivers/bus/isapnp/isapnphw.h | 106 - drivers/bus/isapnp/pdo.c | 83 - drivers/bus/pci/fdo.c | 88 +- drivers/bus/pci/pdo.c | 87 +- drivers/bus/pcmcia/fdo.c | 25 - drivers/bus/pcmcia/pcmcia.c | 242 --- drivers/bus/pcmcia/pcmcia.h | 51 - drivers/bus/pcmcia/pcmcia.rbuild | 12 - drivers/bus/pcmcia/pcmcia.rc | 5 - drivers/bus/pcmcia/pdo.c | 34 - drivers/ksfilter/ks/allocators.c | 2 +- drivers/ksfilter/ks/api.c | 99 +- drivers/ksfilter/ks/bag.c | 6 +- drivers/ksfilter/ks/clocks.c | 276 +-- drivers/ksfilter/ks/connectivity.c | 261 +-- drivers/ksfilter/ks/device.c | 113 +- drivers/ksfilter/ks/deviceinterface.c | 4 - drivers/ksfilter/ks/driver.c | 15 +- drivers/ksfilter/ks/filter.c | 645 ++---- drivers/ksfilter/ks/filterfactory.c | 302 +-- drivers/ksfilter/ks/irp.c | 30 +- drivers/ksfilter/ks/ksfunc.h | 60 +- drivers/ksfilter/ks/ksiface.h | 10 +- drivers/ksfilter/ks/kstypes.h | 58 +- drivers/ksfilter/ks/methods.c | 279 +-- drivers/ksfilter/ks/misc.c | 11 +- drivers/ksfilter/ks/pin.c | 1586 ++------------ drivers/ksfilter/ks/priv.h | 26 - drivers/ksfilter/ks/property.c | 2 +- drivers/ksfilter/ks/topology.c | 10 + drivers/multimedia/bdasup/precomp.h | 3 - drivers/network/afd/afd/lock.c | 4 - drivers/network/ndis/ndis.def | 298 +++ drivers/network/ndis/ndis.rbuild | 2 +- drivers/network/ndis/ndis.spec | 292 --- drivers/network/ndis/ndis/miniport.c | 22 - drivers/network/tdi/misc/tdi.def | 47 + drivers/network/tdi/misc/tdi.spec | 39 - drivers/network/tdi/tdi.rbuild | 2 +- drivers/storage/class/cdrom/cdrom.c | 6 +- drivers/storage/class/ramdisk/ramdisk.c | 13 +- drivers/storage/ide/uniata/id_ata.cpp | 12 +- drivers/usb/usbehci/common.c | 2 + drivers/usb/usbehci/fdo.c | 47 +- drivers/usb/usbehci/irp.c | 111 +- drivers/usb/usbehci/pdo.c | 264 +-- drivers/usb/usbehci/urbreq.c | 177 +- drivers/usb/usbehci/usbehci.c | 5 + drivers/usb/usbehci/usbehci.h | 53 +- drivers/usb/usbehci/usbiffn.c | 332 +-- drivers/usb/usbehci/usbiffn.h | 75 +- drivers/video/displays/vga/objects/pointer.c | 2 +- hal/halx86/directory.rbuild | 9 +- hal/halx86/generic/acpi/halpnpdd.c | 3 + hal/halx86/generic/halinit.c | 36 +- hal/halx86/hal_generic.rbuild | 52 +- hal/halx86/hal_mini.rbuild | 44 - hal/halx86/halamd64.rbuild | 18 +- include/ddk/hubbusif.h | 6 - include/ddk/ntddk.h | 5 +- include/ddk/usbbusif.h | 4 - include/dxsdk/bdamedia.h | 14 - include/host/typedefs.h | 6 - include/host/wcsfuncs.h | 19 +- include/ndk/amd64/ketypes.h | 14 +- include/psdk/gdiplusflat.h | 3 +- include/psdk/ks.h | 163 -- include/psdk/ksmedia.h | 2 - include/psdk/ntdef.h | 3 - include/psdk/ntsecpkg.h | 36 - include/psdk/objbase.h | 10 +- include/psdk/psdk.rbuild | 3 - include/psdk/shdeprecated.idl | 31 - include/psdk/shlwapi.h | 27 +- include/psdk/sti.h | 141 -- include/psdk/strsafe.h | 626 ------ include/psdk/wia.h | 28 - include/psdk/wia_lh.idl | 127 -- include/psdk/wia_xp.idl | 127 -- include/psdk/winbase.h | 3 - include/psdk/wingdi.h | 2 - include/psdk/winnt.h | 8 - include/psdk/winuser.h | 2 +- include/reactos/arm/armddk.h | 30 +- include/reactos/asm.h | 2 +- include/reactos/win32k/ntgdityp.h | 5 +- include/xdk/exfuncs.h | 4 +- lib/cmlib/cminit.c | 2 +- lib/cmlib/cmlib.h | 38 - lib/cmlib/cmlib.rbuild | 2 - lib/cmlib/hivecell.c | 55 +- lib/cmlib/hivewrt.c | 8 - lib/drivers/ip/transport/tcp/tcp.c | 24 +- lib/drivers/oskittcp/oskittcp/osenv.c | 5 - lib/drivers/sound/mmixer/wave.c | 13 - lib/host/wcsfuncs/wcsfuncs.c | 40 - lib/lib.rbuild | 3 - lib/newinflib/README.txt | 16 - lib/newinflib/builddep.h | 87 - lib/newinflib/infcommon.h | 16 - lib/newinflib/infcore.c | 832 -------- lib/newinflib/infget.c | 668 ------ lib/newinflib/infhost.h | 80 - lib/newinflib/infhostgen.c | 302 --- lib/newinflib/infhostget.c | 249 --- lib/newinflib/infhostput.c | 115 - lib/newinflib/infhostrtl.c | 151 -- lib/newinflib/inflib.h | 15 - lib/newinflib/inflib.mak | 76 - lib/newinflib/inflib.rbuild | 32 - lib/newinflib/infpriv.h | 145 -- lib/newinflib/infput.c | 264 --- lib/newinflib/infros.h | 81 - lib/newinflib/infrosgen.c | 365 ---- lib/newinflib/infrosget.c | 140 -- lib/newinflib/infrosput.c | 132 -- lib/rtl/message.c | 230 +- lib/rtl/sprintf.c | 60 +- lib/rtl/swprintf.c | 58 +- media/doc/README.WINE | 12 +- media/drivers/etc/etc.rbuild | 2 - media/drivers/etc/hosts | 3 - media/inf/cpu.inf | Bin 18186 -> 18186 bytes media/inf/display.inf | Bin 6534 -> 6476 bytes media/inf/fdc.inf | Bin 6336 -> 6338 bytes media/inf/hdc.inf | Bin 83156 -> 83820 bytes media/inf/machine.inf | Bin 45686 -> 45620 bytes ntoskrnl/config/cmapi.c | 1332 +++++------- ntoskrnl/config/cmboot.c | 569 +---- ntoskrnl/config/cmdata.c | 53 +- ntoskrnl/config/cmhvlist.c | 7 - ntoskrnl/config/cminit.c | 8 +- ntoskrnl/config/cmkcbncb.c | 59 - ntoskrnl/config/cmparse.c | 19 + ntoskrnl/config/cmsysini.c | 167 +- ntoskrnl/include/internal/cm.h | 34 - ntoskrnl/include/internal/i386/intrin_i.h | 22 +- ntoskrnl/include/internal/io.h | 155 +- ntoskrnl/io/iomgr/device.c | 18 - ntoskrnl/io/iomgr/deviface.c | 506 ++--- ntoskrnl/io/iomgr/driver.c | 177 +- ntoskrnl/io/iomgr/drvrlist.c | 561 +++++ ntoskrnl/io/iomgr/iomgr.c | 8 +- ntoskrnl/io/pnpmgr/pnpinit.c | 502 ----- ntoskrnl/io/pnpmgr/pnpmgr.c | 1876 +++++++++++------ ntoskrnl/io/pnpmgr/pnpnotify.c | 20 +- ntoskrnl/io/pnpmgr/pnpreport.c | 43 +- ntoskrnl/io/pnpmgr/pnpres.c | 1159 ---------- ntoskrnl/io/pnpmgr/pnproot.c | 223 +- ntoskrnl/io/pnpmgr/pnputil.c | 185 -- ntoskrnl/kdbg/kdb_cli.c | 3 +- ntoskrnl/ke/i386/exp.c | 2 +- ntoskrnl/ke/i386/traphdlr.c | 104 +- ntoskrnl/mm/ARM3/drvmgmt.c | 117 +- ntoskrnl/mm/ARM3/largepag.c | 102 - ntoskrnl/mm/ARM3/mdlsup.c | 3 - ntoskrnl/mm/ARM3/miarm.h | 119 +- ntoskrnl/mm/ARM3/mminit.c | 132 +- ntoskrnl/mm/ARM3/pfnlist.c | 3 - ntoskrnl/mm/ARM3/pool.c | 2 - ntoskrnl/mm/freelist.c | 5 +- ntoskrnl/mm/mminit.c | 9 +- ntoskrnl/mm/pagefile.c | 2 - ntoskrnl/mm/section.c | 2 - ntoskrnl/mm/sysldr.c | 1320 ++---------- ntoskrnl/ntoskrnl-generic.rbuild | 5 +- ntoskrnl/ntoskrnl.pspec | 175 +- ntoskrnl/rtl/libsupp.c | 5 +- ntoskrnl/se/semgr.c | 394 +--- rosbuild.bat | 2 +- subsystems/ntvdm/ntvdm.c | 4 +- subsystems/win32/csrss/win32csr/dllmain.c | 396 ++++ subsystems/win32/csrss/win32csr/harderror.c | 552 ----- subsystems/win32/csrss/win32csr/w32csr.h | 7 - .../win32/csrss/win32csr/win32csr.rbuild | 2 - subsystems/win32/win32k/dib/dib.c | 2 +- subsystems/win32/win32k/dib/dib16bpp.c | 2 +- subsystems/win32/win32k/dib/dib1bpp.c | 2 +- subsystems/win32/win32k/dib/dib24bpp.c | 2 +- subsystems/win32/win32k/dib/dib24bppc.c | 2 +- subsystems/win32/win32k/dib/dib32bpp.c | 2 +- subsystems/win32/win32k/dib/dib32bppc.c | 2 +- subsystems/win32/win32k/dib/dib4bpp.c | 2 +- subsystems/win32/win32k/dib/dib8bpp.c | 2 +- subsystems/win32/win32k/dib/floodfill.c | 2 +- subsystems/win32/win32k/dib/stretchblt.c | 2 +- subsystems/win32/win32k/eng/alphablend.c | 2 +- subsystems/win32/win32k/eng/bitblt.c | 2 +- subsystems/win32/win32k/eng/clip.c | 2 +- subsystems/win32/win32k/eng/copybits.c | 2 +- subsystems/win32/win32k/eng/debug.c | 2 +- subsystems/win32/win32k/eng/device.c | 2 +- subsystems/win32/win32k/eng/driverobj.c | 2 +- subsystems/win32/win32k/eng/engbrush.c | 2 +- subsystems/win32/win32k/eng/engevent.c | 2 +- subsystems/win32/win32k/eng/engmisc.c | 2 +- subsystems/win32/win32k/eng/engwindow.c | 2 +- subsystems/win32/win32k/eng/error.c | 2 +- subsystems/win32/win32k/eng/float.c | 2 +- subsystems/win32/win32k/eng/gradient.c | 2 +- subsystems/win32/win32k/eng/lineto.c | 2 +- subsystems/win32/win32k/eng/mapping.c | 2 +- subsystems/win32/win32k/eng/mem.c | 2 +- subsystems/win32/win32k/eng/mouse.c | 2 +- subsystems/win32/win32k/eng/paint.c | 2 +- subsystems/win32/win32k/eng/perfcnt.c | 2 +- subsystems/win32/win32k/eng/semaphor.c | 2 +- subsystems/win32/win32k/eng/sort.c | 2 +- subsystems/win32/win32k/eng/stretchblt.c | 2 +- subsystems/win32/win32k/eng/string.c | 2 +- subsystems/win32/win32k/eng/surface.c | 2 +- subsystems/win32/win32k/eng/transblt.c | 2 +- subsystems/win32/win32k/eng/xlate.c | 2 +- subsystems/win32/win32k/include/coord.h | 4 +- subsystems/win32/win32k/include/dc.h | 5 +- subsystems/win32/win32k/include/gdiobj.h | 3 - subsystems/win32/win32k/include/msgqueue.h | 10 - subsystems/win32/win32k/include/pdevobj.h | 8 +- subsystems/win32/win32k/include/surface.h | 2 - .../win32k/include/{win32kp.h => win32k.h} | 0 subsystems/win32/win32k/ldr/loader.c | 2 +- subsystems/win32/win32k/main/dllmain.c | 2 +- subsystems/win32/win32k/misc/copy.c | 2 +- subsystems/win32/win32k/misc/driver.c | 2 +- subsystems/win32/win32k/misc/err.c | 2 +- subsystems/win32/win32k/misc/file.c | 2 +- subsystems/win32/win32k/misc/math.c | 2 +- subsystems/win32/win32k/misc/registry.c | 2 +- subsystems/win32/win32k/misc/rtlstr.c | 2 +- subsystems/win32/win32k/misc/usrheap.c | 2 +- subsystems/win32/win32k/ntddraw/d3d.c | 2 +- subsystems/win32/win32k/ntddraw/dd.c | 2 +- subsystems/win32/win32k/ntddraw/ddraw.c | 2 +- subsystems/win32/win32k/ntddraw/ddsurf.c | 2 +- subsystems/win32/win32k/ntddraw/dvp.c | 2 +- subsystems/win32/win32k/ntddraw/dxeng.c | 2 +- subsystems/win32/win32k/ntddraw/eng.c | 2 +- subsystems/win32/win32k/ntddraw/mocomp.c | 2 +- subsystems/win32/win32k/ntuser/accelerator.c | 2 +- subsystems/win32/win32k/ntuser/callback.c | 2 +- subsystems/win32/win32k/ntuser/callproc.c | 2 +- subsystems/win32/win32k/ntuser/caret.c | 2 +- subsystems/win32/win32k/ntuser/class.c | 2 +- subsystems/win32/win32k/ntuser/clipboard.c | 2 +- subsystems/win32/win32k/ntuser/csr.c | 2 +- subsystems/win32/win32k/ntuser/cursoricon.c | 2 +- subsystems/win32/win32k/ntuser/defwnd.c | 2 +- subsystems/win32/win32k/ntuser/desktop.c | 2 +- subsystems/win32/win32k/ntuser/display.c | 2 +- subsystems/win32/win32k/ntuser/event.c | 2 +- subsystems/win32/win32k/ntuser/focus.c | 2 +- subsystems/win32/win32k/ntuser/guicheck.c | 2 +- subsystems/win32/win32k/ntuser/hook.c | 8 +- subsystems/win32/win32k/ntuser/hotkey.c | 2 +- subsystems/win32/win32k/ntuser/input.c | 65 +- subsystems/win32/win32k/ntuser/kbdlayout.c | 2 +- subsystems/win32/win32k/ntuser/keyboard.c | 14 +- subsystems/win32/win32k/ntuser/menu.c | 2 +- subsystems/win32/win32k/ntuser/message.c | 127 +- subsystems/win32/win32k/ntuser/metric.c | 2 +- subsystems/win32/win32k/ntuser/misc.c | 2 +- subsystems/win32/win32k/ntuser/monitor.c | 2 +- subsystems/win32/win32k/ntuser/msgqueue.c | 111 +- subsystems/win32/win32k/ntuser/ntstubs.c | 2 +- subsystems/win32/win32k/ntuser/ntuser.c | 2 +- subsystems/win32/win32k/ntuser/object.c | 2 +- subsystems/win32/win32k/ntuser/painting.c | 2 +- subsystems/win32/win32k/ntuser/prop.c | 2 +- subsystems/win32/win32k/ntuser/scrollbar.c | 2 +- subsystems/win32/win32k/ntuser/session.c | 2 +- subsystems/win32/win32k/ntuser/simplecall.c | 2 +- subsystems/win32/win32k/ntuser/sysparams.c | 2 +- subsystems/win32/win32k/ntuser/timer.c | 7 +- subsystems/win32/win32k/ntuser/useratom.c | 2 +- subsystems/win32/win32k/ntuser/vis.c | 2 +- subsystems/win32/win32k/ntuser/windc.c | 4 +- subsystems/win32/win32k/ntuser/window.c | 31 +- subsystems/win32/win32k/ntuser/winpos.c | 2 +- subsystems/win32/win32k/ntuser/winsta.c | 2 +- subsystems/win32/win32k/objects/arc.c | 2 +- subsystems/win32/win32k/objects/bezier.c | 2 +- subsystems/win32/win32k/objects/bitblt.c | 2 +- subsystems/win32/win32k/objects/bitmaps.c | 2 +- subsystems/win32/win32k/objects/brush.c | 3 +- subsystems/win32/win32k/objects/cliprgn.c | 2 +- subsystems/win32/win32k/objects/coord.c | 12 +- subsystems/win32/win32k/objects/dcattr.c | 2 +- subsystems/win32/win32k/objects/dclife.c | 94 +- subsystems/win32/win32k/objects/dcobjs.c | 8 +- subsystems/win32/win32k/objects/dcstate.c | 2 +- subsystems/win32/win32k/objects/dcutil.c | 67 +- subsystems/win32/win32k/objects/device.c | 18 +- subsystems/win32/win32k/objects/dibobj.c | 2 +- subsystems/win32/win32k/objects/drawing.c | 2 +- subsystems/win32/win32k/objects/fillshap.c | 2 +- subsystems/win32/win32k/objects/font.c | 70 +- subsystems/win32/win32k/objects/freetype.c | 2 +- subsystems/win32/win32k/objects/gdibatch.c | 35 +- subsystems/win32/win32k/objects/gdidbg.c | 136 +- subsystems/win32/win32k/objects/gdiobj.c | 2 +- subsystems/win32/win32k/objects/icm.c | 2 +- subsystems/win32/win32k/objects/line.c | 2 +- subsystems/win32/win32k/objects/metafile.c | 2 +- subsystems/win32/win32k/objects/palette.c | 2 +- subsystems/win32/win32k/objects/path.c | 2 +- subsystems/win32/win32k/objects/pen.c | 2 +- subsystems/win32/win32k/objects/polyfill.c | 2 +- subsystems/win32/win32k/objects/print.c | 2 +- subsystems/win32/win32k/objects/rect.c | 2 +- subsystems/win32/win32k/objects/region.c | 2 +- subsystems/win32/win32k/objects/stockobj.c | 2 +- subsystems/win32/win32k/objects/text.c | 2 +- subsystems/win32/win32k/objects/wingl.c | 2 +- subsystems/win32/win32k/objects/xformobj.c | 2 +- subsystems/win32/win32k/pch.h | 2 +- subsystems/win32/win32k/stubs/stubs.c | 2 +- subsystems/win32/win32k/stubs/umpdstubs.c | 2 +- subsystems/win32/win32k/{win32k.h => w32k.h} | 0 630 files changed, 12084 insertions(+), 27917 deletions(-) delete mode 100644 dll/win32/msctf/displayattributemgr.c create mode 100644 dll/win32/msvfw32/msvfw32_ros.diff create mode 100644 dll/win32/msvfw32/msvideo16.c create mode 100644 dll/win32/msvfw32/vfw16.h delete mode 100644 dll/win32/sti/sti.c delete mode 100644 dll/win32/sti/sti_private.h delete mode 100644 dll/win32/sti/sti_wia.idl delete mode 100644 dll/win32/usp10/bidi.c delete mode 100644 dll/win32/usp10/usp10_internal.h delete mode 100644 dll/win32/windowscodecs/tiffformat.c delete mode 100644 drivers/bus/isapnp/fdo.c delete mode 100644 drivers/bus/isapnp/hardware.c delete mode 100644 drivers/bus/isapnp/isapnphw.h delete mode 100644 drivers/bus/isapnp/pdo.c delete mode 100644 drivers/bus/pcmcia/fdo.c delete mode 100644 drivers/bus/pcmcia/pcmcia.c delete mode 100644 drivers/bus/pcmcia/pcmcia.h delete mode 100644 drivers/bus/pcmcia/pcmcia.rbuild delete mode 100644 drivers/bus/pcmcia/pcmcia.rc delete mode 100644 drivers/bus/pcmcia/pdo.c create mode 100644 drivers/network/ndis/ndis.def delete mode 100644 drivers/network/ndis/ndis.spec create mode 100644 drivers/network/tdi/misc/tdi.def delete mode 100644 drivers/network/tdi/misc/tdi.spec delete mode 100644 hal/halx86/hal_mini.rbuild delete mode 100644 include/psdk/shdeprecated.idl delete mode 100644 include/psdk/strsafe.h delete mode 100644 include/psdk/wia.h delete mode 100644 include/psdk/wia_lh.idl delete mode 100644 include/psdk/wia_xp.idl delete mode 100644 lib/newinflib/README.txt delete mode 100644 lib/newinflib/builddep.h delete mode 100644 lib/newinflib/infcommon.h delete mode 100644 lib/newinflib/infcore.c delete mode 100644 lib/newinflib/infget.c delete mode 100644 lib/newinflib/infhost.h delete mode 100644 lib/newinflib/infhostgen.c delete mode 100644 lib/newinflib/infhostget.c delete mode 100644 lib/newinflib/infhostput.c delete mode 100644 lib/newinflib/infhostrtl.c delete mode 100644 lib/newinflib/inflib.h delete mode 100644 lib/newinflib/inflib.mak delete mode 100644 lib/newinflib/inflib.rbuild delete mode 100644 lib/newinflib/infpriv.h delete mode 100644 lib/newinflib/infput.c delete mode 100644 lib/newinflib/infros.h delete mode 100644 lib/newinflib/infrosgen.c delete mode 100644 lib/newinflib/infrosget.c delete mode 100644 lib/newinflib/infrosput.c delete mode 100644 media/drivers/etc/hosts create mode 100644 ntoskrnl/io/iomgr/drvrlist.c delete mode 100644 ntoskrnl/io/pnpmgr/pnpinit.c delete mode 100644 ntoskrnl/io/pnpmgr/pnpres.c delete mode 100644 ntoskrnl/io/pnpmgr/pnputil.c delete mode 100644 ntoskrnl/mm/ARM3/largepag.c delete mode 100644 subsystems/win32/csrss/win32csr/harderror.c rename subsystems/win32/win32k/include/{win32kp.h => win32k.h} (100%) rename subsystems/win32/win32k/{win32k.h => w32k.h} (100%) diff --git a/ReactOS-arm.rbuild b/ReactOS-arm.rbuild index 6d7abe77d6e..777a1aa2cc3 100644 --- a/ReactOS-arm.rbuild +++ b/ReactOS-arm.rbuild @@ -28,7 +28,6 @@ -ftracer - -fms-extensions -Wno-attributes -U_UNICODE -UUNICODE diff --git a/base/applications/cmdutils/reg/reg.rbuild b/base/applications/cmdutils/reg/reg.rbuild index ac33ef4fd0b..ce9a744808d 100644 --- a/base/applications/cmdutils/reg/reg.rbuild +++ b/base/applications/cmdutils/reg/reg.rbuild @@ -1,5 +1,3 @@ - - . 0x600 diff --git a/base/applications/downloader/downloader.rbuild b/base/applications/downloader/downloader.rbuild index b45df064ce0..9ea43dc81f4 100644 --- a/base/applications/downloader/downloader.rbuild +++ b/base/applications/downloader/downloader.rbuild @@ -1,26 +1,25 @@ - - -downloader.xml - - . - . + + downloader.xml + + . + . - advapi32 - ntdll - user32 - gdi32 - shell32 - comctl32 - msimg32 - shlwapi - urlmon - uuid - expat + advapi32 + ntdll + user32 + gdi32 + shell32 + comctl32 + msimg32 + shlwapi + urlmon + uuid + expat - main.c - xml.c - download.c - downloader.rc - + main.c + xml.c + download.c + downloader.rc + diff --git a/base/applications/fontview/fontview.rbuild b/base/applications/fontview/fontview.rbuild index f5cad36f1a9..8ceda786c4b 100644 --- a/base/applications/fontview/fontview.rbuild +++ b/base/applications/fontview/fontview.rbuild @@ -1,5 +1,3 @@ - - . gdi32 diff --git a/base/applications/kbswitch/kbswitch.rbuild b/base/applications/kbswitch/kbswitch.rbuild index 11ea960adae..2eed0b22bb0 100644 --- a/base/applications/kbswitch/kbswitch.rbuild +++ b/base/applications/kbswitch/kbswitch.rbuild @@ -1,5 +1,4 @@ - . diff --git a/base/applications/magnify/magnify.rbuild b/base/applications/magnify/magnify.rbuild index 8c06ce8e5bf..995437d3826 100644 --- a/base/applications/magnify/magnify.rbuild +++ b/base/applications/magnify/magnify.rbuild @@ -1,5 +1,5 @@ - + . user32 diff --git a/base/applications/mplay32/mplay32.rbuild b/base/applications/mplay32/mplay32.rbuild index 77003d90898..c472e6f0207 100644 --- a/base/applications/mplay32/mplay32.rbuild +++ b/base/applications/mplay32/mplay32.rbuild @@ -1,5 +1,3 @@ - - . advapi32 diff --git a/base/applications/mscutils/eventvwr/eventvwr.rbuild b/base/applications/mscutils/eventvwr/eventvwr.rbuild index cb23e1f3eef..367c19e5bb4 100644 --- a/base/applications/mscutils/eventvwr/eventvwr.rbuild +++ b/base/applications/mscutils/eventvwr/eventvwr.rbuild @@ -1,5 +1,5 @@ - + . user32 @@ -8,3 +8,4 @@ eventvwr.c eventvwr.rc + diff --git a/base/applications/network/ping/ping.c b/base/applications/network/ping/ping.c index b2d48ca5ba3..b9635e24865 100644 --- a/base/applications/network/ping/ping.c +++ b/base/applications/network/ping/ping.c @@ -630,9 +630,8 @@ int main(int argc, char* argv[]) while ((NeverStop) || (Count < PingCount)) { Ping(); + Sleep(Timeout); Count++; - if((NeverStop) || (Count < PingCount)) - Sleep(Timeout); }; Cleanup(); diff --git a/base/applications/notepad/settings.c b/base/applications/notepad/settings.c index 9a68c8b43db..862e4fb755e 100644 --- a/base/applications/notepad/settings.c +++ b/base/applications/notepad/settings.c @@ -147,15 +147,15 @@ void LoadSettings(void) if (dwPointSize != 0) Globals.lfFont.lfHeight = HeightFromPointSize(dwPointSize); - RegCloseKey(hKey); - } + hFont = CreateFontIndirect(&Globals.lfFont); + if (hFont) + { + if (Globals.hFont) + DeleteObject(Globals.hFont); + Globals.hFont = hFont; + } - hFont = CreateFontIndirect(&Globals.lfFont); - if (hFont) - { - if (Globals.hFont) - DeleteObject(Globals.hFont); - Globals.hFont = hFont; + RegCloseKey(hKey); } } diff --git a/base/applications/notepad/text.c b/base/applications/notepad/text.c index ed1015d04e9..6ca1907dbd6 100644 --- a/base/applications/notepad/text.c +++ b/base/applications/notepad/text.c @@ -51,7 +51,7 @@ BOOL ReadText(HANDLE hFile, LPWSTR *ppszText, DWORD *pdwTextLen, int *piEncoding { DWORD dwSize; LPBYTE pBytes = NULL; - LPWSTR pszText; + LPCWSTR pszText; LPWSTR pszAllocText = NULL; DWORD dwPos, i; DWORD dwCharCount; @@ -110,7 +110,7 @@ BOOL ReadText(HANDLE hFile, LPWSTR *ppszText, DWORD *pdwTextLen, int *piEncoding /* fall through */ case ENCODING_UNICODE: - pszText = (LPWSTR) &pBytes[dwPos]; + pszText = (LPCWSTR) &pBytes[dwPos]; dwCharCount = (dwSize - dwPos) / sizeof(WCHAR); break; @@ -174,10 +174,6 @@ BOOL ReadText(HANDLE hFile, LPWSTR *ppszText, DWORD *pdwTextLen, int *piEncoding else adwEolnCount[EOLN_LF]++; break; - - case '\0': - pszText[i] = ' '; - break; } } diff --git a/base/applications/paint/lang/it-IT.rc b/base/applications/paint/lang/it-IT.rc index 2c381068586..d7b7c9ee218 100644 --- a/base/applications/paint/lang/it-IT.rc +++ b/base/applications/paint/lang/it-IT.rc @@ -60,8 +60,8 @@ BEGIN MENUITEM "800%", IDM_VIEWZOOM800 END MENUITEM SEPARATOR - MENUITEM "Mostra griglia", IDM_VIEWSHOWGRID - MENUITEM "Mostra miniature", IDM_VIEWSHOWMINIATURE + MENUITEM "Show grid", IDM_VIEWSHOWGRID + MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE END MENUITEM "Visualizza a schermo intero\tCtrl+F", IDM_VIEWFULLSCREEN END @@ -201,5 +201,5 @@ BEGIN IDS_OPENFILTER, "Bitmap files (*.bmp;*.dib)\1*.bmp;*.dib\1All files (*.*)\1*.*\1" IDS_SAVEFILTER, "24 bit bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1" IDS_FILESIZE, "%d bytes" - IDS_PRINTRES, "%d x %d pixels per metro" + IDS_PRINTRES, "%d x %d pixels per meter" END diff --git a/base/applications/paint/main.c b/base/applications/paint/main.c index 904220567d1..98565f4b36c 100644 --- a/base/applications/paint/main.c +++ b/base/applications/paint/main.c @@ -143,7 +143,6 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument HBITMAP tempBm; int i; TCHAR tooltips[16][30]; - HDC hDC; TCHAR *c; TCHAR sfnFilename[1000]; @@ -153,7 +152,7 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument TCHAR ofnFiletitle[256]; TCHAR ofnFilter[1000]; TCHAR miniaturetitle[100]; - static int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, + int custColors[16] = { 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff }; @@ -372,10 +371,8 @@ _tWinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPTSTR lpszArgument CreateWindowEx(0, _T("Scrollbox"), _T(""), WS_CHILD | WS_VISIBLE, 3, 3, imgXRes, imgYRes, hScrlClient, NULL, hThisInstance, NULL); - hDC = GetDC(hImageArea); - hDrawingDC = CreateCompatibleDC(hDC); - hSelDC = CreateCompatibleDC(hDC); - ReleaseDC(hImageArea, hDC); + hDrawingDC = CreateCompatibleDC(GetDC(hImageArea)); + hSelDC = CreateCompatibleDC(GetDC(hImageArea)); SelectObject(hDrawingDC, CreatePen(PS_SOLID, 0, fgColor)); SelectObject(hDrawingDC, CreateSolidBrush(bgColor)); diff --git a/base/applications/paint/mouse.c b/base/applications/paint/mouse.c index 9165291594e..4f5c13031fd 100644 --- a/base/applications/paint/mouse.c +++ b/base/applications/paint/mouse.c @@ -25,34 +25,6 @@ placeSelWin() //SendMessage(hSelection, WM_PAINT, 0, 0); } -void -regularize(short x0, short y0, short *x1, short *y1) -{ - if (abs(*x1 - x0) >= abs(*y1 - y0)) - *y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0)); - else - *x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0)); -} - -void -roundTo8Directions(short x0, short y0, short *x1, short *y1) -{ - if (abs(*x1 - x0) >= abs(*y1 - y0)) - { - if (abs(*y1 - y0) * 5 < abs(*x1 - x0) * 2) - *y1 = y0; - else - *y1 = y0 + (*y1 > y0 ? abs(*x1 - x0) : -abs(*x1 - x0)); - } - else - { - if (abs(*x1 - x0) * 5 < abs(*y1 - y0) * 2) - *x1 = x0; - else - *x1 = x0 + (*x1 > x0 ? abs(*y1 - y0) : -abs(*y1 - y0)); - } -} - POINT pointStack[256]; short pointSP; POINT *ptStack = NULL; @@ -175,8 +147,6 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, fg, lineWidth); break; case 12: @@ -199,30 +169,21 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); if (pointSP + 1 >= 2) Poly(hdc, pointStack, pointSP + 1, fg, bg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -315,8 +276,6 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, fg, lineWidth); break; case 12: @@ -326,17 +285,12 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); pointSP++; if (pointSP >= 2) { @@ -356,14 +310,10 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg) break; case 15: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; case 16: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle); break; } @@ -448,8 +398,6 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, bg, lineWidth); break; case 12: @@ -472,30 +420,21 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); if (pointSP + 1 >= 2) Poly(hdc, pointStack, pointSP + 1, bg, fg, lineWidth, shapeStyle, FALSE); break; case 15: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 16: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; } @@ -518,8 +457,6 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 11: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - roundTo8Directions(startX, startY, &x, &y); Line(hdc, startX, startY, x, y, bg, lineWidth); break; case 12: @@ -529,17 +466,12 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 13: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 14: resetToU1(); pointStack[pointSP].x = x; pointStack[pointSP].y = y; - if ((pointSP > 0) && (GetAsyncKeyState(VK_SHIFT) < 0)) - roundTo8Directions(pointStack[pointSP - 1].x, pointStack[pointSP - 1].y, - (short *)&pointStack[pointSP].x, (short *)&pointStack[pointSP].y); pointSP++; if (pointSP >= 2) { @@ -559,14 +491,10 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg) break; case 15: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; case 16: resetToU1(); - if (GetAsyncKeyState(VK_SHIFT) < 0) - regularize(startX, startY, &x, &y); RRect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle); break; } diff --git a/base/applications/rapps/rapps.rbuild b/base/applications/rapps/rapps.rbuild index bc83f3aade9..066b3ba7a9b 100644 --- a/base/applications/rapps/rapps.rbuild +++ b/base/applications/rapps/rapps.rbuild @@ -1,5 +1,3 @@ - - include/reactos diff --git a/base/applications/rapps/rapps/firefox3.txt b/base/applications/rapps/rapps/firefox3.txt index e9313b7677a..e6051802e00 100644 --- a/base/applications/rapps/rapps/firefox3.txt +++ b/base/applications/rapps/rapps/firefox3.txt @@ -2,41 +2,41 @@ [Section] Name = Mozilla Firefox 3.0 -Version = 3.0.19 +Version = 3.0.18 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Web Browsers out there. Size = 7.2M Category = 5 URLSite = http://www.mozilla.com/en-US/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/en-US/Firefox%20Setup%203.0.19.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/en-US/Firefox%20Setup%203.0.18.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Webbrowser. Size = 7.0M URLSite = http://www.mozilla-europe.org/de/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/de/Firefox%20Setup%203.0.19.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/de/Firefox%20Setup%203.0.18.exe [Section.040a] Description = El más popular y uno de los mejores navegadores web gratuitos que hay. Size = 7.0M URLSite = http://www.mozilla-europe.org/es/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/es-ES/Firefox%20Setup%203.0.19.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/es-ES/Firefox%20Setup%203.0.18.exe [Section.0414] Description = Mest populære og best ogsÃ¥ gratis nettleserene der ute. -Size = 7.0M +Size = 6.9M URLSite = http://www.mozilla-europe.org/no/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/nb-NO/Firefox%20Setup%203.0.19.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/nb-NO/Firefox%20Setup%203.0.18.exe [Section.0415] Description = Najpopularniejsza i jedna z najlepszych darmowych przeglądarek internetowych. Size = 7.8M URLSite = http://www.mozilla-europe.org/pl/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/pl/Firefox%20Setup%203.0.19.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/pl/Firefox%20Setup%203.0.18.exe [Section.0419] Description = Один из самых популярных и лучших бесплатных браузеров. Size = 7.4M URLSite = http://www.mozilla-europe.org/ru/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.19-real/win32/ru/Firefox%20Setup%203.0.19.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/firefox/releases/latest-3.0/win32/ru/Firefox%20Setup%203.0.18.exe diff --git a/base/applications/rapps/rapps/mirandaim.txt b/base/applications/rapps/rapps/mirandaim.txt index e1f66280ecc..0fff6a4ea04 100644 --- a/base/applications/rapps/rapps/mirandaim.txt +++ b/base/applications/rapps/rapps/mirandaim.txt @@ -2,13 +2,13 @@ [Section] Name = Miranda IM -Version = 0.8.21 +Version = 0.8.18 Licence = GPL Description = Open source multiprotocol instant messaging application - May not work completely. Size = 1.6MB Category = 5 URLSite = http://www.miranda-im.org/ -URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.21-unicode.exe +URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.18-unicode.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/openttd.txt b/base/applications/rapps/rapps/openttd.txt index 2e70160c846..dfc94a95e43 100644 --- a/base/applications/rapps/rapps/openttd.txt +++ b/base/applications/rapps/rapps/openttd.txt @@ -2,13 +2,13 @@ [Section] Name = OpenTTD -Version = 1.0.0 +Version = 0.7.5 Licence = GPL v2 Description = Open Source clone of the "Transport Tycoon Deluxe" game engine. You need a copy of Transport Tycoon. -Size = 3.5MB +Size = 2.9MB Category = 4 URLSite = http://www.openttd.org/ -URLDownload = http://binaries.openttd.org/releases/1.0.0/openttd-1.0.0-windows-win32.exe +URLDownload = http://binaries.openttd.org/releases/0.7.5/openttd-0.7.5-windows-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/opera.txt b/base/applications/rapps/rapps/opera.txt index aee4c21a933..44e49cc61ac 100644 --- a/base/applications/rapps/rapps/opera.txt +++ b/base/applications/rapps/rapps/opera.txt @@ -2,13 +2,13 @@ [Section] Name = Opera -Version = 10.52 +Version = 10.51 Licence = Freeware Description = The popular Opera Browser with many advanced features and including a Mail and BitTorrent client. -Size = 12.0M +Size = 11.0M Category = 5 URLSite = http://www.opera.com/ -URLDownload = http://get4.opera.com/pub/opera/win/1052/int/Opera_1052_int_Setup.exe +URLDownload = http://get4.opera.com/pub/opera/win/1051/int/Opera_1051_int_Setup.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/scite.txt b/base/applications/rapps/rapps/scite.txt index c32df9cd195..fc3d9d50cca 100644 --- a/base/applications/rapps/rapps/scite.txt +++ b/base/applications/rapps/rapps/scite.txt @@ -2,13 +2,13 @@ [Section] Name = SciTE -Version = 2.11 +Version = 2.03 Licence = Freeware Description = SciTE is a SCIntilla based Text Editor. Originally built to demonstrate Scintilla, it has grown to be a generally useful editor with facilities for building and running programs. Size = 0.6M Category = 7 URLSite = http://www.scintilla.org/ -URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc211.exe +URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc203.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/scummvm.txt b/base/applications/rapps/rapps/scummvm.txt index ebe7b348a50..6365b1c1b63 100644 --- a/base/applications/rapps/rapps/scummvm.txt +++ b/base/applications/rapps/rapps/scummvm.txt @@ -2,13 +2,13 @@ [Section] Name = ScummVM -Version = 1.1.0 +Version = 1.0.0 Licence = GPL Description = Sam and Max, Day of the Tentacle, etc on ReactOS. -Size = 3.4MB +Size = 3.1MB Category = 4 URLSite = http://scummvm.org/ -URLDownload = http://dfn.dl.sourceforge.net/project/scummvm/scummvm/1.1.0/scummvm-1.1.0-win32.exe +URLDownload = http://dfn.dl.sourceforge.net/project/scummvm/scummvm/1.0.0/scummvm-1.0.0-win32.exe CDPath = none [Section.0407] diff --git a/base/applications/rapps/rapps/seamonkey.txt b/base/applications/rapps/rapps/seamonkey.txt index 55d3be87f2f..9c980d30b65 100644 --- a/base/applications/rapps/rapps/seamonkey.txt +++ b/base/applications/rapps/rapps/seamonkey.txt @@ -2,31 +2,31 @@ [Section] Name = Mozilla SeaMonkey -Version = 2.0.4 +Version = 2.0.3 Licence = MPL/GPL/LGPL Description = Mozilla Suite is alive. This is the one and only Browser, Mail, Chat, and Composer bundle you will ever need. -Size = 10.1MB +Size = 10.0MB Category = 5 URLSite = http://www.seamonkey-project.org/ -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/en-US/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/en-US/SeaMonkey%20Setup%202.0.3.exe CDPath = none [Section.0407] Description = Mozilla Suite lebt. Dies ist das einzige Browser-, Mail-, Chat- and Composerwerkzeug-Bundle welches Sie benötigen. -Size = 10.0MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/de/SeaMonkey%20Setup%202.0.4.exe +Size = 10.1MB +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/de/SeaMonkey%20Setup%202.0.3.exe [Section.040a] Description = La suite de Mozilla está viva. Es el primero y único navegador web, gestor de correo, lector de noticias, Chat y editor HTML que necesitarás. Size = 10.0MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/es-ES/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/es-ES/SeaMonkey%20Setup%202.0.3.exe [Section.0415] Description = Pakiet Mozilla żyje. W zestawie: przeglądarka, klient poczty, IRC oraz Edytor HTML - wszystko, czego potrzebujesz. Size = 10.8MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/pl/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/pl/SeaMonkey%20Setup%202.0.3.exe [Section.0419] Description = Продолжение Mozilla Suite. Включает браузер, почтовый клиент, IRC-клиент и HTML-редактор. Size = 10.4MB -URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.4/win32/ru/SeaMonkey%20Setup%202.0.4.exe +URLDownload = http://ftp.df.lth.se/mozilla/seamonkey/releases/2.0.3/win32/ru/SeaMonkey%20Setup%202.0.3.exe diff --git a/base/applications/rapps/rapps/thunderbird.txt b/base/applications/rapps/rapps/thunderbird.txt index a9e837cd7e0..9f0cd328d89 100644 --- a/base/applications/rapps/rapps/thunderbird.txt +++ b/base/applications/rapps/rapps/thunderbird.txt @@ -2,35 +2,35 @@ [Section] Name = Mozilla Thunderbird -Version = 3.0.4 +Version = 3.0.3 Licence = MPL/GPL/LGPL Description = The most popular and one of the best free Mail Clients out there. Size = 8.6M Category = 5 URLSite = http://www.mozilla-europe.org/en/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/en-US/Thunderbird%20Setup%203.0.4.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/en-US/Thunderbird%20Setup%203.0.3.exe CDPath = none [Section.0407] Description = Der populärste und einer der besten freien Mail-Clients. -Size = 8.5M +Size = 8.4M URLSite = http://www.mozilla-europe.org/de/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/de/Thunderbird%20Setup%203.0.4.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/de/Thunderbird%20Setup%203.0.3.exe [Section.040a] Description = El más popular y uno de los mejores clientes mail que hay. Size = 8.4M URLSite = http://www.mozilla-europe.org/es/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/es-ES/Thunderbird%20Setup%203.0.4.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/es-ES/Thunderbird%20Setup%203.0.3.exe [Section.0415] Description = Najpopularniejszy i jeden z najlepszych darmowych klientów poczty. Size = 9.3M URLSite = http://www.mozilla-europe.org/pl/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/pl/Thunderbird%20Setup%203.0.4.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/pl/Thunderbird%20Setup%203.0.3.exe [Section.0419] Description = Один из самых популярных и лучших бесплатных почтовых клиентов. Size = 8.8M URLSite = http://www.mozilla-europe.org/ru/products/thunderbird/ -URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.4/win32/ru/Thunderbird%20Setup%203.0.4.exe +URLDownload = http://releases.mozilla.org/pub/mozilla.org/thunderbird/releases/3.0.3/win32/ru/Thunderbird%20Setup%203.0.3.exe diff --git a/base/applications/rapps/rapps/utorrent.txt b/base/applications/rapps/rapps/utorrent.txt index ffcded74c34..988263777c5 100644 --- a/base/applications/rapps/rapps/utorrent.txt +++ b/base/applications/rapps/rapps/utorrent.txt @@ -2,13 +2,13 @@ [Section] Name = µTorrent -Version = 2.0.1 +Version = 2.0 Licence = Freeware for non-commercial uses Description = Small and fast BitTorrent Client. -Size = 314K +Size = 312K Category = 5 URLSite = http://www.utorrent.com/ -URLDownload = http://download.utorrent.com/2.0.1/utorrent.exe +URLDownload = http://download.utorrent.com/2.0/utorrent.exe CDPath = none diff --git a/base/applications/regedit/framewnd.c b/base/applications/regedit/framewnd.c index a6b4144bcef..6a90cc3edd2 100644 --- a/base/applications/regedit/framewnd.c +++ b/base/applications/regedit/framewnd.c @@ -228,6 +228,8 @@ static BOOL CheckCommDlgError(HWND hWnd) return TRUE; } +#define MAX_CUSTOM_FILTER_SIZE 50 +TCHAR CustomFilterBuffer[MAX_CUSTOM_FILTER_SIZE]; TCHAR FileNameBuffer[_MAX_PATH]; TCHAR FileTitleBuffer[_MAX_PATH]; @@ -273,11 +275,25 @@ static BOOL InitOpenFileName(HWND hWnd, OPENFILENAME* pofn) BuildFilterStrings(Filter, FilterPairs, sizeof(FilterPairs) / sizeof(FILTERPAIR)); pofn->lpstrFilter = Filter; + pofn->lpstrCustomFilter = CustomFilterBuffer; + pofn->nMaxCustFilter = MAX_CUSTOM_FILTER_SIZE; + pofn->nFilterIndex = 0; pofn->lpstrFile = FileNameBuffer; pofn->nMaxFile = _MAX_PATH; pofn->lpstrFileTitle = FileTitleBuffer; pofn->nMaxFileTitle = _MAX_PATH; + /* pofn->lpstrInitialDir = _T("");*/ + /* pofn->lpstrTitle = _T("Import Registry File");*/ + /* pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING;*/ pofn->Flags = OFN_HIDEREADONLY; + /* pofn->nFileOffset = ;*/ + /* pofn->nFileExtension = ;*/ + /* pofn->lpstrDefExt = _T("");*/ + /* pofn->lCustData = ;*/ + /* pofn->lpfnHook = ImportRegistryFile_OFNHookProc;*/ + /* pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE");*/ + /* pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);*/ + /* pofn->FlagsEx = ;*/ return TRUE; } @@ -340,11 +356,11 @@ static UINT_PTR CALLBACK ExportRegistryFile_OFNHookProc(HWND hdlg, UINT uiMsg, W hwndExportAll = GetDlgItem(hdlg, IDC_EXPORT_ALL); if (hwndExportAll) - SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey ? BST_UNCHECKED : BST_CHECKED, 0); + SendMessage(hwndExportAll, BM_SETCHECK, pszSelectedKey[0] ? BST_UNCHECKED : BST_CHECKED, 0); hwndExportBranch = GetDlgItem(hdlg, IDC_EXPORT_BRANCH); if (hwndExportBranch) - SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey ? BST_CHECKED : BST_UNCHECKED, 0); + SendMessage(hwndExportBranch, BM_SETCHECK, pszSelectedKey[0] ? BST_CHECKED : BST_UNCHECKED, 0); hwndExportBranchText = GetDlgItem(hdlg, IDC_EXPORT_BRANCH_TEXT); if (hwndExportBranchText) @@ -390,12 +406,7 @@ BOOL ExportRegistryFile(HWND hWnd) InitOpenFileName(hWnd, &ofn); LoadString(hInst, IDS_EXPORT_REG_FILE, Caption, sizeof(Caption)/sizeof(TCHAR)); ofn.lpstrTitle = Caption; - - /* Only set the path if a key (not the root node) is selected */ - if (hKeyRoot != 0) - { - ofn.lCustData = (LPARAM) ExportKeyPath; - } + ofn.lCustData = (LPARAM) ExportKeyPath; ofn.Flags = OFN_ENABLETEMPLATE | OFN_EXPLORER | OFN_ENABLEHOOK; ofn.lpfnHook = ExportRegistryFile_OFNHookProc; ofn.lpTemplateName = MAKEINTRESOURCE(IDD_EXPORTRANGE); diff --git a/base/applications/taskmgr/applpage.c b/base/applications/taskmgr/applpage.c index 0c20e810817..3ef6ee9394d 100644 --- a/base/applications/taskmgr/applpage.c +++ b/base/applications/taskmgr/applpage.c @@ -49,7 +49,7 @@ void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam); void ApplicationPageShowContextMenu1(void); void ApplicationPageShowContextMenu2(void); int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); -int ProcGetIndexByProcessId(DWORD dwProcessId); +int PerfGetIndexByProcessId(DWORD dwProcessId); #if 0 void SwitchToThisWindow ( @@ -236,13 +236,6 @@ void UpdateApplicationListControlViewSetting(void) DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter) { - INT i; - BOOL bItemRemoved = FALSE; - LV_ITEM item; - LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL; - HIMAGELIST hImageListLarge; - HIMAGELIST hImageListSmall; - /* Create the event */ hApplicationPageEvent = CreateEventW(NULL, TRUE, TRUE, NULL); @@ -276,55 +269,6 @@ DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter) EnumWindows(EnumWindowsProc, 0); if (noApps) (void)ListView_DeleteAllItems(hApplicationPageListCtrl); - - /* Get the image lists */ - hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL); - hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL); - - /* Check to see if we need to remove any items from the list */ - for (i=ListView_GetItemCount(hApplicationPageListCtrl)-1; i>=0; i--) - { - memset(&item, 0, sizeof(LV_ITEM)); - item.mask = LVIF_IMAGE|LVIF_PARAM; - item.iItem = i; - (void)ListView_GetItem(hApplicationPageListCtrl, &item); - - pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; - if (!IsWindow(pAPLI->hWnd)|| - (wcslen(pAPLI->szTitle) <= 0) || - !IsWindowVisible(pAPLI->hWnd) || - (GetParent(pAPLI->hWnd) != NULL) || - (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) || - (GetWindowLongPtr(pAPLI->hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) - { - ImageList_Remove(hImageListLarge, item.iItem); - ImageList_Remove(hImageListSmall, item.iItem); - - (void)ListView_DeleteItem(hApplicationPageListCtrl, item.iItem); - HeapFree(GetProcessHeap(), 0, pAPLI); - bItemRemoved = TRUE; - } - } - - /* - * If an item was removed from the list then - * we need to resync all the items with the - * image list - */ - if (bItemRemoved) - { - for (i=0; i=0; i--) + { + memset(&item, 0, sizeof(LV_ITEM)); + item.mask = LVIF_IMAGE|LVIF_PARAM; + item.iItem = i; + (void)ListView_GetItem(hApplicationPageListCtrl, &item); + + pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam; + if (!IsWindow(pAPLI->hWnd)|| + (wcslen(pAPLI->szTitle) <= 0) || + !IsWindowVisible(pAPLI->hWnd) || + (GetParent(pAPLI->hWnd) != NULL) || + (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) || + (GetWindowLongPtrW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW)) + { + ImageList_Remove(hImageListLarge, item.iItem); + ImageList_Remove(hImageListSmall, item.iItem); + + (void)ListView_DeleteItem(hApplicationPageListCtrl, item.iItem); + HeapFree(GetProcessHeap(), 0, pAPLI); + bItemRemoved = TRUE; + } + } + + /* + * If an item was removed from the list then + * we need to resync all the items with the + * image list + */ + if (bItemRemoved) + { + for (i=0; iFlink; - HeapFree(GetProcessHeap(), 0, pEntry); - } } static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize) @@ -106,56 +86,6 @@ static void SidToUserName(PSID Sid, LPWSTR szBuffer, DWORD BufferSize) LookupAccountSidW(NULL, Sid, szBuffer, &BufferSize, szDomainNameUnused, &DomainNameLen, &Use); } -VOID -WINAPI -CachedGetUserFromSid( - PSID pSid, - LPWSTR pUserName, - PULONG pcwcUserName) -{ - PLIST_ENTRY pCur; - PSIDTOUSERNAME pEntry; - ULONG cbSid, cwcUserName; - - cwcUserName = *pcwcUserName; - - /* Walk through the list */ - for(pCur = SidToUserNameHead.Flink; - pCur != &SidToUserNameHead; - pCur = pCur->Flink) - { - pEntry = CONTAINING_RECORD(pCur, SIDTOUSERNAME, List); - if (EqualSid((PSID)&pEntry->Data, pSid)) - { - wcsncpy(pUserName, pEntry->pszName, cwcUserName); - *pcwcUserName = cwcUserName; - return; - } - } - - /* We didn't find the SID in the list, get the name conventional */ - SidToUserName(pSid, pUserName, cwcUserName); - - /* Allocate a new entry */ - *pcwcUserName = wcslen(pUserName); - cwcUserName = *pcwcUserName + 1; - cbSid = GetLengthSid(pSid); - pEntry = HeapAlloc(GetProcessHeap(), 0, sizeof(SIDTOUSERNAME) + cbSid + cwcUserName * sizeof(WCHAR)); - - /* Copy the Sid and name to our entry */ - CopySid(cbSid, (PSID)&pEntry->Data, pSid); - pEntry->pszName = (LPWSTR)(pEntry->Data + cbSid); - wcsncpy(pEntry->pszName, pUserName, cwcUserName); - - /* Insert the new entry */ - pEntry->List.Flink = &SidToUserNameHead; - pEntry->List.Blink = SidToUserNameHead.Blink; - SidToUserNameHead.Blink->Flink = &pEntry->List; - SidToUserNameHead.Blink = &pEntry->List; - - return; -} - void PerfDataRefresh(void) { ULONG ulSize; @@ -176,7 +106,6 @@ void PerfDataRefresh(void) PSECURITY_DESCRIPTOR ProcessSD; PSID ProcessUser; ULONG Buffer[64]; /* must be 4 bytes aligned! */ - ULONG cwcUserName; /* Get new system time */ status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), 0); @@ -412,8 +341,7 @@ ClearInfo: ZeroMemory(&pPerfData[Idx].IOCounters, sizeof(IO_COUNTERS)); } - cwcUserName = sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0]); - CachedGetUserFromSid(ProcessUser, pPerfData[Idx].UserName, &cwcUserName); + SidToUserName(ProcessUser, pPerfData[Idx].UserName, sizeof(pPerfData[0].UserName) / sizeof(pPerfData[0].UserName[0])); if (ProcessSD != NULL) { @@ -428,29 +356,6 @@ ClearInfo: LeaveCriticalSection(&PerfDataCriticalSection); } -ULONG PerfDataGetProcessIndex(ULONG pid) -{ - ULONG idx; - - EnterCriticalSection(&PerfDataCriticalSection); - - for (idx = 0; idx < ProcessCount; idx++) - { - if (PtrToUlong(pPerfData[idx].ProcessId) == pid) - { - break; - } - } - - LeaveCriticalSection(&PerfDataCriticalSection); - - if (idx == ProcessCount) - { - return -1; - } - return idx; -} - ULONG PerfDataGetProcessCount(void) { return ProcessCount; @@ -482,6 +387,27 @@ BOOL PerfDataGetImageName(ULONG Index, LPWSTR lpImageName, int nMaxCount) return bSuccessful; } +int PerfGetIndexByProcessId(DWORD dwProcessId) +{ + int FoundIndex = -1; + ULONG Index; + + EnterCriticalSection(&PerfDataCriticalSection); + + for (Index = 0; Index < ProcessCount; Index++) + { + if (PtrToUlong(pPerfData[Index].ProcessId) == dwProcessId) + { + FoundIndex = Index; + break; + } + } + + LeaveCriticalSection(&PerfDataCriticalSection); + + return FoundIndex; +} + ULONG PerfDataGetProcessId(ULONG Index) { ULONG ProcessId; diff --git a/base/applications/taskmgr/perfdata.h b/base/applications/taskmgr/perfdata.h index 6bb7005ceaa..00c2d6dc21a 100644 --- a/base/applications/taskmgr/perfdata.h +++ b/base/applications/taskmgr/perfdata.h @@ -60,7 +60,6 @@ void PerfDataUninitialize(void); void PerfDataRefresh(void); BOOL PerfDataGet(ULONG Index, PPERFDATA *lppData); -ULONG PerfDataGetProcessIndex(ULONG pid); ULONG PerfDataGetProcessCount(void); ULONG PerfDataGetProcessorUsage(void); ULONG PerfDataGetProcessorSystemUsage(void); diff --git a/base/applications/taskmgr/procpage.c b/base/applications/taskmgr/procpage.c index 42bf5949ea7..4c3b636b91a 100644 --- a/base/applications/taskmgr/procpage.c +++ b/base/applications/taskmgr/procpage.c @@ -28,6 +28,7 @@ typedef struct { + ULONG Index; ULONG ProcessId; } PROCESS_PAGE_LIST_ITEM, *LPPROCESS_PAGE_LIST_ITEM; @@ -53,27 +54,6 @@ BOOL PerfDataGetText(ULONG Index, ULONG ColumnIndex, LPTSTR lpText, int nMaxCoun DWORD WINAPI ProcessPageRefreshThread(void *lpParameter); int ProcessRunning(ULONG ProcessId); -int ProcGetIndexByProcessId(DWORD dwProcessId) -{ - int i; - LVITEM item; - LPPROCESS_PAGE_LIST_ITEM pData; - - for (i=0; iProcessId == dwProcessId) - { - return i; - } - } - return 0; -} - DWORD GetSelectedProcessId(void) { int Index; @@ -91,7 +71,7 @@ DWORD GetSelectedProcessId(void) (void)ListView_GetItem(hProcessPageListCtrl, &lvitem); if (lvitem.lParam) - return ((LPPROCESS_PAGE_LIST_ITEM)lvitem.lParam)->ProcessId; + return PerfDataGetProcessId(((LPPROCESS_PAGE_LIST_ITEM)lvitem.lParam)->Index); } return 0; @@ -239,7 +219,7 @@ void ProcessPageOnNotify(WPARAM wParam, LPARAM lParam) break; pData = (LPPROCESS_PAGE_LIST_ITEM)pnmdi->item.lParam; - Index = PerfDataGetProcessIndex(pData->ProcessId); + Index = pData->Index; ColumnIndex = pnmdi->item.iSubItem; PerfDataGetText(Index, ColumnIndex, pnmdi->item.pszText, pnmdi->item.cchTextMax); @@ -434,7 +414,7 @@ void UpdateProcesses() { int i; ULONG l; - LV_ITEM item; + LV_ITEM item; LPPROCESS_PAGE_LIST_ITEM pData; /* Remove old processes */ @@ -451,17 +431,10 @@ void UpdateProcesses() HeapFree(GetProcessHeap(), 0, pData); } } - - /* Check for difference in listview process and performance process counts */ - if (ListView_GetItemCount(hProcessPageListCtrl) != PerfDataGetProcessCount()) + for (l = 0; l < PerfDataGetProcessCount(); l++) { - /* Add new processes by checking against the current items */ - for (l = 0; l < PerfDataGetProcessCount(); l++) - { - AddProcess(l); - } + AddProcess(l); } - if (TaskManagerSettings.SortColumn != -1) { (void)ListView_SortItems(hProcessPageListCtrl, ProcessPageCompareFunc, NULL); @@ -509,7 +482,7 @@ void AddProcess(ULONG Index) item.iItem = i; (void)ListView_GetItem(hProcessPageListCtrl, &item); pData = (LPPROCESS_PAGE_LIST_ITEM)item.lParam; - if (pData->ProcessId == pid) + if (PerfDataGetProcessId(pData->Index) == pid) { bAlreadyInList = TRUE; break; @@ -518,6 +491,7 @@ void AddProcess(ULONG Index) if (!bAlreadyInList) /* Add */ { pData = (LPPROCESS_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(PROCESS_PAGE_LIST_ITEM)); + pData->Index = Index; pData->ProcessId = pid; /* Add the item to the list */ @@ -712,8 +686,6 @@ int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lPara int ret = 0; LPPROCESS_PAGE_LIST_ITEM Param1; LPPROCESS_PAGE_LIST_ITEM Param2; - ULONG IndexParam1; - ULONG IndexParam2; WCHAR text1[260]; WCHAR text2[260]; ULONG l1; @@ -732,167 +704,165 @@ int CALLBACK ProcessPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lPara Param1 = (LPPROCESS_PAGE_LIST_ITEM)lParam2; Param2 = (LPPROCESS_PAGE_LIST_ITEM)lParam1; } - IndexParam1 = PerfDataGetProcessIndex(Param1->ProcessId); - IndexParam2 = PerfDataGetProcessIndex(Param2->ProcessId); if (TaskManagerSettings.SortColumn == COLUMN_IMAGENAME) { - PerfDataGetImageName(IndexParam1, text1, sizeof (text1) / sizeof (*text1)); - PerfDataGetImageName(IndexParam2, text2, sizeof (text2) / sizeof (*text2)); + PerfDataGetImageName(Param1->Index, text1, sizeof (text1) / sizeof (*text1)); + PerfDataGetImageName(Param2->Index, text2, sizeof (text2) / sizeof (*text2)); ret = _wcsicmp(text1, text2); } else if (TaskManagerSettings.SortColumn == COLUMN_PID) { - l1 = Param1->ProcessId; - l2 = Param2->ProcessId; + l1 = PerfDataGetProcessId(Param1->Index); + l2 = PerfDataGetProcessId(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_USERNAME) { - PerfDataGetUserName(IndexParam1, text1, sizeof (text1) / sizeof (*text1)); - PerfDataGetUserName(IndexParam2, text2, sizeof (text2) / sizeof (*text2)); + PerfDataGetUserName(Param1->Index, text1, sizeof (text1) / sizeof (*text1)); + PerfDataGetUserName(Param2->Index, text2, sizeof (text2) / sizeof (*text2)); ret = _wcsicmp(text1, text2); } else if (TaskManagerSettings.SortColumn == COLUMN_SESSIONID) { - l1 = PerfDataGetSessionId(IndexParam1); - l2 = PerfDataGetSessionId(IndexParam2); + l1 = PerfDataGetSessionId(Param1->Index); + l2 = PerfDataGetSessionId(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_CPUUSAGE) { - l1 = PerfDataGetCPUUsage(IndexParam1); - l2 = PerfDataGetCPUUsage(IndexParam2); + l1 = PerfDataGetCPUUsage(Param1->Index); + l2 = PerfDataGetCPUUsage(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_CPUTIME) { - time1 = PerfDataGetCPUTime(IndexParam1); - time2 = PerfDataGetCPUTime(IndexParam2); + time1 = PerfDataGetCPUTime(Param1->Index); + time2 = PerfDataGetCPUTime(Param2->Index); ret = largeintcmp(time1, time2); } else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGE) { - l1 = PerfDataGetWorkingSetSizeBytes(IndexParam1); - l2 = PerfDataGetWorkingSetSizeBytes(IndexParam2); + l1 = PerfDataGetWorkingSetSizeBytes(Param1->Index); + l2 = PerfDataGetWorkingSetSizeBytes(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PEAKMEMORYUSAGE) { - l1 = PerfDataGetPeakWorkingSetSizeBytes(IndexParam1); - l2 = PerfDataGetPeakWorkingSetSizeBytes(IndexParam2); + l1 = PerfDataGetPeakWorkingSetSizeBytes(Param1->Index); + l2 = PerfDataGetPeakWorkingSetSizeBytes(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_MEMORYUSAGEDELTA) { - l1 = PerfDataGetWorkingSetSizeDelta(IndexParam1); - l2 = PerfDataGetWorkingSetSizeDelta(IndexParam2); + l1 = PerfDataGetWorkingSetSizeDelta(Param1->Index); + l2 = PerfDataGetWorkingSetSizeDelta(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTS) { - l1 = PerfDataGetPageFaultCount(IndexParam1); - l2 = PerfDataGetPageFaultCount(IndexParam2); + l1 = PerfDataGetPageFaultCount(Param1->Index); + l2 = PerfDataGetPageFaultCount(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PAGEFAULTSDELTA) { - l1 = PerfDataGetPageFaultCountDelta(IndexParam1); - l2 = PerfDataGetPageFaultCountDelta(IndexParam2); + l1 = PerfDataGetPageFaultCountDelta(Param1->Index); + l2 = PerfDataGetPageFaultCountDelta(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_VIRTUALMEMORYSIZE) { - l1 = PerfDataGetVirtualMemorySizeBytes(IndexParam1); - l2 = PerfDataGetVirtualMemorySizeBytes(IndexParam2); + l1 = PerfDataGetVirtualMemorySizeBytes(Param1->Index); + l2 = PerfDataGetVirtualMemorySizeBytes(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_PAGEDPOOL) { - l1 = PerfDataGetPagedPoolUsagePages(IndexParam1); - l2 = PerfDataGetPagedPoolUsagePages(IndexParam2); + l1 = PerfDataGetPagedPoolUsagePages(Param1->Index); + l2 = PerfDataGetPagedPoolUsagePages(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_NONPAGEDPOOL) { - l1 = PerfDataGetNonPagedPoolUsagePages(IndexParam1); - l2 = PerfDataGetNonPagedPoolUsagePages(IndexParam2); + l1 = PerfDataGetNonPagedPoolUsagePages(Param1->Index); + l2 = PerfDataGetNonPagedPoolUsagePages(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_BASEPRIORITY) { - l1 = PerfDataGetBasePriority(IndexParam1); - l2 = PerfDataGetBasePriority(IndexParam2); + l1 = PerfDataGetBasePriority(Param1->Index); + l2 = PerfDataGetBasePriority(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_HANDLECOUNT) { - l1 = PerfDataGetHandleCount(IndexParam1); - l2 = PerfDataGetHandleCount(IndexParam2); + l1 = PerfDataGetHandleCount(Param1->Index); + l2 = PerfDataGetHandleCount(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_THREADCOUNT) { - l1 = PerfDataGetThreadCount(IndexParam1); - l2 = PerfDataGetThreadCount(IndexParam2); + l1 = PerfDataGetThreadCount(Param1->Index); + l2 = PerfDataGetThreadCount(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_USEROBJECTS) { - l1 = PerfDataGetUSERObjectCount(IndexParam1); - l2 = PerfDataGetUSERObjectCount(IndexParam2); + l1 = PerfDataGetUSERObjectCount(Param1->Index); + l2 = PerfDataGetUSERObjectCount(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_GDIOBJECTS) { - l1 = PerfDataGetGDIObjectCount(IndexParam1); - l2 = PerfDataGetGDIObjectCount(IndexParam2); + l1 = PerfDataGetGDIObjectCount(Param1->Index); + l2 = PerfDataGetGDIObjectCount(Param2->Index); ret = CMP(l1, l2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOREADS) { - PerfDataGetIOCounters(IndexParam1, &iocounters1); - PerfDataGetIOCounters(IndexParam2, &iocounters2); + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); ull1 = iocounters1.ReadOperationCount; ull2 = iocounters2.ReadOperationCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITES) { - PerfDataGetIOCounters(IndexParam1, &iocounters1); - PerfDataGetIOCounters(IndexParam2, &iocounters2); + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); ull1 = iocounters1.WriteOperationCount; ull2 = iocounters2.WriteOperationCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHER) { - PerfDataGetIOCounters(IndexParam1, &iocounters1); - PerfDataGetIOCounters(IndexParam2, &iocounters2); + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); ull1 = iocounters1.OtherOperationCount; ull2 = iocounters2.OtherOperationCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOREADBYTES) { - PerfDataGetIOCounters(IndexParam1, &iocounters1); - PerfDataGetIOCounters(IndexParam2, &iocounters2); + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); ull1 = iocounters1.ReadTransferCount; ull2 = iocounters2.ReadTransferCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOWRITEBYTES) { - PerfDataGetIOCounters(IndexParam1, &iocounters1); - PerfDataGetIOCounters(IndexParam2, &iocounters2); + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); ull1 = iocounters1.WriteTransferCount; ull2 = iocounters2.WriteTransferCount; ret = CMP(ull1, ull2); } else if (TaskManagerSettings.SortColumn == COLUMN_IOOTHERBYTES) { - PerfDataGetIOCounters(IndexParam1, &iocounters1); - PerfDataGetIOCounters(IndexParam2, &iocounters2); + PerfDataGetIOCounters(Param1->Index, &iocounters1); + PerfDataGetIOCounters(Param2->Index, &iocounters2); ull1 = iocounters1.OtherTransferCount; ull2 = iocounters2.OtherTransferCount; ret = CMP(ull1, ull2); diff --git a/base/applications/taskmgr/taskmgr.c b/base/applications/taskmgr/taskmgr.c index c409f808b1f..3f8bcbd9a4a 100644 --- a/base/applications/taskmgr/taskmgr.c +++ b/base/applications/taskmgr/taskmgr.c @@ -869,7 +869,6 @@ void TaskManager_OnTabWndSelChange(void) HMENU hViewMenu; HMENU hSubMenu; WCHAR szTemp[256]; - SYSTEM_INFO sysInfo; hMenu = GetMenu(hMainWnd); hViewMenu = GetSubMenu(hMenu, 2); @@ -948,28 +947,16 @@ void TaskManager_OnTabWndSelChange(void) DeleteMenu(hMenu, 3, MF_BYPOSITION); DrawMenuBar(hMainWnd); } + hSubMenu = CreatePopupMenu(); - GetSystemInfo(&sysInfo); + LoadStringW(hInst, IDS_MENU_ONEGRAPHALLCPUS, szTemp, 256); + AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, szTemp); - /* Hide CPU graph options on single CPU systems */ - if (sysInfo.dwNumberOfProcessors > 1) - { - hSubMenu = CreatePopupMenu(); - - LoadStringW(hInst, IDS_MENU_ONEGRAPHALLCPUS, szTemp, 256); - AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHALL, szTemp); - - LoadStringW(hInst, IDS_MENU_ONEGRAPHPERCPU, szTemp, 256); - AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, szTemp); - - LoadStringW(hInst, IDS_MENU_CPUHISTORY, szTemp, 256); - AppendMenuW(hViewMenu, MF_STRING|MF_POPUP, (UINT_PTR) hSubMenu, szTemp); + LoadStringW(hInst, IDS_MENU_ONEGRAPHPERCPU, szTemp, 256); + AppendMenuW(hSubMenu, MF_STRING, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, szTemp); - if (TaskManagerSettings.CPUHistory_OneGraphPerCPU) - CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND); - else - CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND); - } + LoadStringW(hInst, IDS_MENU_CPUHISTORY, szTemp, 256); + AppendMenuW(hViewMenu, MF_STRING|MF_POPUP, (UINT_PTR) hSubMenu, szTemp); LoadStringW(hInst, IDS_MENU_SHOWKERNELTIMES, szTemp, 256); AppendMenuW(hViewMenu, MF_STRING, ID_VIEW_SHOWKERNELTIMES, szTemp); @@ -978,7 +965,10 @@ void TaskManager_OnTabWndSelChange(void) CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_CHECKED); else CheckMenuItem(hViewMenu, ID_VIEW_SHOWKERNELTIMES, MF_BYCOMMAND|MF_UNCHECKED); - + if (TaskManagerSettings.CPUHistory_OneGraphPerCPU) + CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, MF_BYCOMMAND); + else + CheckMenuRadioItem(hSubMenu, ID_VIEW_CPUHISTORY_ONEGRAPHALL, ID_VIEW_CPUHISTORY_ONEGRAPHPERCPU, ID_VIEW_CPUHISTORY_ONEGRAPHALL, MF_BYCOMMAND); /* * Give the tab control focus */ diff --git a/base/applications/winhlp32/hlpfile.c b/base/applications/winhlp32/hlpfile.c index 7031c760670..2d685ae493a 100644 --- a/base/applications/winhlp32/hlpfile.c +++ b/base/applications/winhlp32/hlpfile.c @@ -492,7 +492,7 @@ static int comp_FindSubFile(void *p, const void *key, int leaf, void** next) { *next = (char *)p+strlen(p)+(leaf?5:3); - WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (const char *)key); + WINE_TRACE("Comparing '%s' with '%s'\n", (char *)p, (char *)key); return strcmp(p, key); } @@ -1601,7 +1601,7 @@ static BOOL HLPFILE_BrowseParagraph(HLPFILE_PAGE* page, struct RtfData* rd, case 0xEE: case 0xEF: { - const char* ptr = (const char*) format + 8; + char* ptr = (char*) format + 8; BYTE type = format[3]; int wnd = -1; diff --git a/base/applications/winver/winver.rbuild b/base/applications/winver/winver.rbuild index 4f24a7166bd..89ff51c8ce4 100644 --- a/base/applications/winver/winver.rbuild +++ b/base/applications/winver/winver.rbuild @@ -1,5 +1,3 @@ - - . shell32 diff --git a/base/services/rpcss/rpcss.rbuild b/base/services/rpcss/rpcss.rbuild index 95b29e83210..04e42f81de9 100644 --- a/base/services/rpcss/rpcss.rbuild +++ b/base/services/rpcss/rpcss.rbuild @@ -1,5 +1,5 @@ - + . diff --git a/base/services/telnetd/telnetd.rbuild b/base/services/telnetd/telnetd.rbuild index 1b17bfcb83f..8ccb81d2004 100644 --- a/base/services/telnetd/telnetd.rbuild +++ b/base/services/telnetd/telnetd.rbuild @@ -1,5 +1,3 @@ - - .. diff --git a/base/services/tftpd/tftpd.rbuild b/base/services/tftpd/tftpd.rbuild index 0008cfb287e..be34bb7f3ab 100644 --- a/base/services/tftpd/tftpd.rbuild +++ b/base/services/tftpd/tftpd.rbuild @@ -1,11 +1,11 @@ - - .. + ntdll advapi32 ws2_32 wine + tftpd.cpp diff --git a/base/setup/usetup/bootsup.c b/base/setup/usetup/bootsup.c index 7abbcb1f4a0..fe835ff5a1e 100644 --- a/base/setup/usetup/bootsup.c +++ b/base/setup/usetup/bootsup.c @@ -428,7 +428,7 @@ CreateFreeLoaderIniForReactos(PWCHAR IniPath, /* ReactOS_KdSerial */ CreateFreeLoaderEntry(IniCache, IniSection, L"ReactOS_KdSerial", L"\"ReactOS (RosDbg)\"", - L"Windows2003", ArcPath, + L"ReactOS", ArcPath, L"/DEBUG /DEBUGPORT=COM1 /BAUDRATE=115200 /SOS /KDSERIAL"); /* ReactOS_LogFile */ diff --git a/base/setup/usetup/inffile.c b/base/setup/usetup/inffile.c index 0bbde01d9da..51fe2e7489d 100644 --- a/base/setup/usetup/inffile.c +++ b/base/setup/usetup/inffile.c @@ -132,7 +132,6 @@ InfpOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, IN DWORD InfStyle, - IN LCID LocaleId, OUT PUINT ErrorLine) { HINF hInf = NULL; @@ -144,7 +143,6 @@ InfpOpenInfFileW( Status = InfOpenFile( &hInf, &FileNameU, - LocaleId, &ErrorLineUL); *ErrorLine = (UINT)ErrorLineUL; if (!NT_SUCCESS(Status)) @@ -254,7 +252,6 @@ INF_OpenBufferedFileA( IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, - IN LCID LocaleId, OUT PUINT ErrorLine) { #ifdef __REACTOS__ @@ -266,7 +263,6 @@ INF_OpenBufferedFileA( &hInf, FileBuffer, FileSize, - LocaleId, &ErrorLineUL); *ErrorLine = (UINT)ErrorLineUL; if (!NT_SUCCESS(Status)) diff --git a/base/setup/usetup/inffile.h b/base/setup/usetup/inffile.h index 864d2017020..52b002db3a9 100644 --- a/base/setup/usetup/inffile.h +++ b/base/setup/usetup/inffile.h @@ -110,7 +110,6 @@ InfpOpenInfFileW( IN PCWSTR FileName, IN PCWSTR InfClass, IN DWORD InfStyle, - IN LCID LocaleId, OUT PUINT ErrorLine); #endif /* __REACTOS__ */ @@ -133,7 +132,6 @@ INF_OpenBufferedFileA( IN ULONG FileSize, IN PCSTR InfClass, IN DWORD InfStyle, - IN LCID LocaleId, OUT PUINT ErrorLine); VOID INF_SetHeap( diff --git a/base/setup/usetup/interface/usetup.c b/base/setup/usetup/interface/usetup.c index 7a97b492c27..87df41628f9 100644 --- a/base/setup/usetup/interface/usetup.c +++ b/base/setup/usetup/interface/usetup.c @@ -79,8 +79,6 @@ static PGENERIC_LIST KeyboardList = NULL; static PGENERIC_LIST LayoutList = NULL; static PGENERIC_LIST LanguageList = NULL; -static LANGID LanguageId = 0; - /* FUNCTIONS ****************************************************************/ static VOID @@ -424,7 +422,6 @@ CheckUnattendedSetup(VOID) UnattendInf = SetupOpenInfFileW(UnattendInfPath, NULL, INF_STYLE_WIN4, - LanguageId, &ErrorLine); if (UnattendInf == INVALID_HANDLE_VALUE) @@ -681,8 +678,6 @@ LanguagePage(PINPUT_RECORD Ir) { SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList)); - LanguageId = (LANGID)(wcstol(SelectedLanguageId, NULL, 16) & 0xFFFF); - if (wcscmp(SelectedLanguageId, DefaultLanguage)) { UpdateKBLayout(); @@ -770,7 +765,6 @@ SetupStartPage(PINPUT_RECORD Ir) SetupInf = SetupOpenInfFileW(FileNameBuffer, NULL, INF_STYLE_WIN4, - LanguageId, &ErrorLine); if (SetupInf == INVALID_HANDLE_VALUE) @@ -3051,7 +3045,6 @@ PrepareCopyPage(PINPUT_RECORD Ir) InfFileSize, (const CHAR*) NULL, INF_STYLE_WIN4, - LanguageId, &ErrorLine); if (InfHandle == INVALID_HANDLE_VALUE) @@ -3266,8 +3259,6 @@ RegistryPage(PINPUT_RECORD Ir) DPRINT("Action: %S File: %S Section %S\n", Action, File, Section); - if (Action == NULL) break; // Hackfix - if (!_wcsicmp (Action, L"AddReg")) { Delete = FALSE; @@ -3283,7 +3274,7 @@ RegistryPage(PINPUT_RECORD Ir) CONSOLE_SetStatusText(MUIGetString(STRING_IMPORTFILE), File); - if (!ImportRegistryFile(File, Section, LanguageId, Delete)) + if (!ImportRegistryFile(File, Section, Delete)) { DPRINT("Importing %S failed\n", File); diff --git a/base/setup/usetup/registry.c b/base/setup/usetup/registry.c index a8081292e67..d313b4d28bd 100644 --- a/base/setup/usetup/registry.c +++ b/base/setup/usetup/registry.c @@ -617,7 +617,6 @@ registry_callback (HINF hInf, PCWSTR Section, BOOLEAN Delete) BOOLEAN ImportRegistryFile(PWSTR Filename, PWSTR Section, - LCID LocaleId, BOOLEAN Delete) { WCHAR FileNameBuffer[MAX_PATH]; @@ -633,7 +632,6 @@ ImportRegistryFile(PWSTR Filename, FileNameBuffer, NULL, INF_STYLE_WIN4, - LocaleId, &ErrorLine); if (hInf == INVALID_HANDLE_VALUE) { diff --git a/base/setup/usetup/registry.h b/base/setup/usetup/registry.h index 63d2b67ef8b..d76470402d7 100644 --- a/base/setup/usetup/registry.h +++ b/base/setup/usetup/registry.h @@ -29,7 +29,6 @@ BOOLEAN ImportRegistryFile(PWSTR Filename, PWSTR Section, - LCID LocaleId, BOOLEAN Delete); BOOLEAN diff --git a/base/setup/usetup/usetup.rbuild b/base/setup/usetup/usetup.rbuild index 51f3c0386a0..fa96c8cd59e 100644 --- a/base/setup/usetup/usetup.rbuild +++ b/base/setup/usetup/usetup.rbuild @@ -4,10 +4,10 @@ . . - . + . include/reactos/drivers zlib - newinflib + inflib ext2lib vfatlib ntdll diff --git a/base/shell/cmd/console.c b/base/shell/cmd/console.c index 8184af747ea..18541bf389f 100644 --- a/base/shell/cmd/console.c +++ b/base/shell/cmd/console.c @@ -166,7 +166,7 @@ VOID ConOutChar (TCHAR c) VOID ConPuts(LPTSTR szText, DWORD nStdHandle) { ConWrite(szText, _tcslen(szText), nStdHandle); - ConWrite(_T("\r\n"), 2, nStdHandle); + ConWrite(_T("\n"), 1, nStdHandle); } VOID ConOutResPaging(BOOL NewPage, UINT resID) diff --git a/base/shell/cmd/filecomp.c b/base/shell/cmd/filecomp.c index 7cb99a72f12..4ca8b837311 100644 --- a/base/shell/cmd/filecomp.c +++ b/base/shell/cmd/filecomp.c @@ -703,7 +703,7 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) LastSpace = i; } - /* insert the quotation and move things around */ + /* insert the quoation and move things around */ if(szPrefix[LastSpace + 1] != _T('\"') && LastSpace != -1) { memmove ( &szPrefix[LastSpace+1], &szPrefix[LastSpace], (_tcslen(szPrefix)-LastSpace+1) * sizeof(TCHAR) ); @@ -712,17 +712,14 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor) { _tcscat(szPrefix,_T("\"")); } - szPrefix[LastSpace + 1] = _T('\"'); + szPrefix[LastSpace + 1] = _T('\"'); } else if(LastSpace == -1) { - /* Add quotation only if none exists already */ - if (szPrefix[0] != _T('\"')) - { - _tcscpy(szBaseWord,_T("\"")); - _tcscat(szBaseWord,szPrefix); - _tcscpy(szPrefix,szBaseWord); - } + _tcscpy(szBaseWord,_T("\"")); + _tcscat(szBaseWord,szPrefix); + _tcscpy(szPrefix,szBaseWord); + } } diff --git a/base/shell/explorer/res/startmenu.ico b/base/shell/explorer/res/startmenu.ico index b0c5059f3d82ab5a34978dbb7ec8989290606d5a..492e388a939f05b77da8a5a5681b2843e38b3a55 100644 GIT binary patch delta 2372 zcmdT^U1%It6h515oM{6|w$rqmU`pDw8bL~?OW3K=R-}STX_0~kjnb-tB1*QI+B?g& zoe5K&8wX0t7%fKnB1l?LsMC5U3QZogpx}cb;)6)-gSFy=g3IDx*YD2kmf~xldSK?x zJ>PfF|DB&sw_X1%=Mv>;74`I}Ri}d;L~jw%;9$02)QPS`H!{-PcM-jhC*$X7I7hT+ zpvBMA&uv6UHnjM8I(P@svm0CdK{}Wxx^#DoKS+z~;dtx4tpiYOA^P@yqUgk?jnQ(o zGyY`LRIZm*tQu=T7I*#0Do1PVzBg(t+Oc_k9~(cb(N|%OIYtMS=V}bW(+-7xoga@b zZSH=??MFKe+eM8~>@9-p!&oyz3&VS8eF^1$R&xv_Rv)fAbHIX zuen)SS%J=@hQje`G(Q^ICOWAN?A1issVLm@$Hs&;LYka?&C)%rRw=|(YTFs#2ZqfU zyWo*tcI%Q`L|KlTU;{ohDheRD_o}E0D&kCBeCEgn^=y#!BO;37@gj`k_!3<9~A|3mNWP zD2>Y`_lq9r`Y3Z<7ko#W%AYR)*BST=q6pX`-f$bt<=mlC@EGXa7BX^FNQ~EIg|wM01eF6rONOJ%`JGYMrsF5Syrr(d%%Qxn zguwrDt!s^%mQbnvPlOO=NeCa!NekVAeY9xC@MR299U+mO7T5^W6iGPC7d+(U`zfG9 zA2J0bah#xYhLKj1gr_G<%r%WCmv}H^nx-#GX%BQ;Pq<7>lUXNm4!nI{>Rq7OoY_Xv zH%Ac$Wi3I~WsoEx^NpeilZ5niQgA}&9EFdH%J~xXR%V7mbWi%G85l<3j)iDqY97;u zLeCaP1MV0_eyZG36ZjWQE0B`Um=;&pB$I$Sg%UzS`wb(UYpIEIs4-O%Z7meD!BQZ~ zkg9FQ#UKrAsojMS)eHpj$ r8*X9`-i-Ie2fF)n@$3B6?lmI-_TLO{jtj#-v_~fnb;cizpV{~y)r9y7 delta 8744 zcmdT}d0bTG-hUu<$b8i-%WP50HZxzdZjq*_A-JH3g2=wj!p^YFoMD?8aF{v3FawSV zilVrJ;S!j+hl&d+D(+hdD9mUmm|&8(?gb-A=re>kxpglXO-kP; zWQTkA0z8B8lBDkWqe*B#LjK4i#NMs7cm_fbFv>JVHi`I?TadjNGM^Xc>9-)VHly9VdP4QSPTXa#12#Vi!El4`8Oyd}JRjMAVmuv#Z)xljZ#h@2-x1QvzatYqa*&WzG*CIUGp z7YG>)tbsk@OqsW0Tw+yIY0z0La-mS+Kw%o$-r8ioRn4E7(E#b7-m`4VqndV&g!0Vn1LI{8-+y3 zkp~_j=v`+8+sU$>25iu;n=#|WfC|5vEm|k5p9De)%NmVFmTj|G6v|K`Z#Tk#3W!ib zEC}i4jvOI@kimGD5icO9fw4$=2)f$gZqZF8`o zN+1U;)Zk1h3EH|frUN{PFpLK}-Ucb@M&Z`I2`q+AmNC^0YpOi^s>a5Y^u~Mtd1x$A z*(r40l)38wx$~bQKp@o#nP|iX-m*9ZhzK!bZc$1ZxrokG5WpqHa7yCj$U#fMhFZ){ zfWCwkaFl>!rQBK0mu}k1Z zpgOQ>)0lx`Q~hX-Y0>Ndu}i*w{q==*Oek*&sXRKGkpzNzicA8-+gT)HC33J`Bx_g# zV`yQPWsx0$?17h^MxeD*CHVw(2sTW%y? zq#&ZW1mYVfA|VMe#5Z0>;uGV!Llosp6w*i%CyK)nk0XdA#Ke=~pizp$b;>2u0NNkp zDm>mn${v}CX>LDCJG$Rn!^!TE`Q+Kz_sHI%_mIlFNDX~Ic;Eq3!?4DUi(Y)zWILc+ zp|J!0TNSDtJaA3Fywz4kzCI|kaU@dv4o=}x$6tvwwS!E~>L4p&FnTHp3=D z<3JoXWCYIGUadUh{d~U>D^{$K%MpRSTU=b6QmKSxWn=Yfi9znI6Fcgo7Od4qtu`c? z*jNm@ySw}Q`(p_|F>;>L&wg3Z7ls(ObpOv|X1oyX@O-Mr1e4sm*qFRBDwUOxYHXJwpbJIjp?n_ad#Gj~~pAw6tWwrq8Jc&g{b@X60cO&yGzRVon(n=&GE z)WK^rJ+|jL9xnRi#JchPj{9=sw6!`{yan6f;9x2xvcnKu!2^7IIE_%{D1!@9gA1}^ zFcpS?VZgOeD}@A5B+OnA@BA9{swj#)yM6xU@{cZmH39pjZR4#HhdiZxm~Q| z%X#tc2RB7su9$c2>#0|FPUa=)5#z#^u~-Fn0Y3l|Gk( z;d9pJrCM!g%0LqfX-j~&jL7itaEycd$uifQ-@0JGwRgd-1D;?C%tcIj4y5Gs#uTLq zk8O*Bcs*jA{>lSxD@^eRWZ+A{2b1|dZq_Sm@4w~7c>vz4wb1}8MqqOQ!)kC7OJ!hV zHy3DO7-08c$UaCQpoSwM4M#-Xdr0j!2>=E>0>eU6iXXiU1YuaP=A*GFc_AE8y4(wR;DOFF0^T4} z#FRmRM7~Z6|Bnq@t`S}N){EmKYB(xstd3}`j%qp{-Lqq)?qC{ll<4{nI6%e3h411K zn1UdC*N4zx`Dy~3kI;bY5CS|mz%V~G1Xckz6UXgc@t!ro(4_HLI3<4~_Rh(KyQi4D zHHrLw{b>63)iUH2CkUyW* zQkPe=#|ZahDTl~Ga+fy&L=3i^H-bL|fjHn(e=Gq|;A0PpA&{UvQVDE`behk`0T$r! zu{WTFMObR7%eh=#RKiA3v`-!g@}P}J4Bo$5eE-U-`9%IGaJ4oRR}H2!vGk z519XT^`JWAfQ4|9taK)`qJ@DZS^}I+$zJ~dSla% z*C>-eaX6U(99}sPVYS%gfe2!x8Nd%dLE4}SgaAKRt8)vIy!lXsQ*lpeH|%L|;`YYM zwuTC@YQ4F&^?FG!6WFRI5k5o&05m8lpa56^egH3W6PO?`AY#F1Tp02*uLCrNzDQ^_ z`wJg59{lOi+$#Oxe`>_}m-d^Ghe~3uhMax1rx=BEPceWG zGAR-(DhetGk}Mh-xER79^59}uSJ$3;PEZm!84$h*88{eTL9|mb8my-1`0*TMfB;WB zTAn_+hyB-|??4jB23PO~p>PJwcqi}}J01-&P);BQVh~6|0p@EPz=leUv;s+Jar#TY zfZ~98z~xG{7}nv9wXc+IZ>$6}u%t$5zX@r6>ume`)5qAUOg}YRP1ACO2P5yHUQ|$l zL{y-CZYUaj3qZ@1pUNKb3D_YGBB%0zw7Ll2yy;;m@pub)p+VnqppzE}jNu#z0a5<= z`%|2M`=yl{sqLE8S9kW)SnP&OFHAXsRH#d+C$x3qHokVElRyxle#3OVB^(0Dz0tm* z`GA}BdVP;TxB-3;ng4GKsrbM_Ug$OvK*J}3q$K>NM>oiX38(E!R}TP(zeSVO`9SpOx4RR0D<=*?h!G@7tK${>D%0}pg@XmjBgG(s@ap9J!n z1bm_K0G81l;tXqH4%!|NK@qrex(r65@y*4S3eNkt!PS$?P$_9S)JajYXckKkM>CHd zBgiMHm+;P()ofpvp+duJn2b~aQz6M=K41>>P}>6k(2NR2lg>E`Z!YgZz<-f+_?m~l z4AM|4gg~==6uGDc=nqf@kx*b8L_S~y)ioLoKdt8sU}0^R%0`52I6ROh`%?Ddog>sX zeKYOdL)L)0xwSXb)~2JlqZP%f9)kQ0v_<0pB@s7}0Tw~hf#JdA(+_dwO9=8Cg6Gkl z{XA`J0^y6{ITj59`ZcV0V-Phq8;f=HCe7Ai46Xn=sGv$CPocs!ohv{&M8AQi3d`^j z=+fVG_EmdTrvRVGU4*pLPi5{(FhZY+%^yQ>olZyp& z8UN$70KcwusRL3x`^aY1JuuyAYH&Qz_pV;kKzO(1cV#t zGZ-CF6VeX?EW>pGy;eaUT=B>W)^mlxfzOy)UlR`-jW^SA^n45ts(gNAiOnE<4C6Oa zB$rjIR^bD9!3g~_S**x2O6V0G>K`ulK~I5jLa@TPvsGD9^Rr{!)d7=JJSL?3eV!v* zYD^9G@^JI@b{7YEg$kF3i#)O8Mk4eMlLXVRE0YOq|FVG}w!aMGu^>$%mj=g1hb~Kr z&5T)?>^`2E|CUxftC$TrQsR7CwQ171E#uE^8CO#>?nu%2m>_#UPiG$=AB92zJs>2) zDk>~ET;wed_6+o25*8MglatezO-`z0bymD8S%x2VF>ca`wq`EQ@O>}N@#QSZ^ol&! z^W~10cYJoaeBz~TA6(e-=Gl#7Bt8!Ai{=?s!W@OlHz&@670*)pe3}t7ZMni{g*K}1 zhXv1Rl{Oki#7}rKY3RX{#aAllo!!2;T<T0;m+-+Pn>#u^UQMmyQL%0-vXU}VBa&hk-rDc+ z!$Gef4*Ap{_B+2@v`#rY!Fgo-?AO*U^ZvFtB2zqrHoVh@C|pMA0zdR|oe?GR%TUrU zzSvM7gx~Vi5IA&!pJko#mTB=~ai)VomdDB}(hfpoqsxtcwPiEH17<{seL!Q(%uTD5E$7$^hcfeGoa3EdNpgF4t3LF` z$)bDLHq*>^xzJpvZ?4rq+#83ZwrJ+WJB@(8>(boQ;^upJcxbg+ka=SktCE!J1LgBZ zrMi#Xnk~6|c~^VWzVS4pZidnw)DgcH%BdM=vh z>%GMK>yAnu9h4K}66f^Fa_OA&hYMP7@29<~?_&HS z)k~PWOOyttcuv#^XXb0eELTfuOKUmt z)?~)S#>Vn?GR7`Wj1$XZBa@iejPw+ZO15=%>Vw839jzBQ3*Ds_QvI`ufWDInw+@T9 zvwuh4gFDsm z0v!D0;gyco^Dxh!U9A4$XlzBXWW%}wV}?q;JS7;}S>-=DT{IIBvr;YLsq^RctFqUu zq-nPAR#uXG^-TH0rlY+et>5wE^$h^&ozuEAdzf6Etnd7i)j1}uOe1kJGTzzC;`_cb z<=DPDV(U8n_lJsZp4oi=`ZmjzlItgypQuPLHYHXzelD@ae{F`kcB;C%8b;wD0&@c@ zU?Yxp9H_2uq0)YdLxB4sI2>?{qW5?&z+6EU>M0r{8+xd5q@iX^9rO0{Lka%5jiaZW zn!a{<-!yUH!Vw$R=I7>UGcqz%Divx#R#q0;a1=X){&3a$d@Y+C78fu_Bbq7nT^Jtd z7!y1_B4}oi??QwK{#l)-PEJXTTb7pE1GT~&CHPbpdaRM#XNG+I-CF0%+drw@GAYn~ zdRnjpB2*JJO&{mp<5)~CWP?x*@Kt?!dyvL&(sHR|y5DEZ!^Y>SWDY({7bQga%Y^u6 zeeZUwD(dd{$(Qyg7R1j?^ZMTswM(k|`}+%B&Tg5o)MG)M#QNJ3zhL*SEsZr9o3)}us@lPAw2N`+gKfWZO_8AKzpg* z99dk9R4Of7zd{+cbi?{J>kHEm8NYQtM0BG$eOSNUQfFv79;0OzWa`qx+^5D17bDvI zN>*xD<)jqkWfbM>ny&4qAIv=r&ShTQ7nz+FqgO_0qQ}*hKc=5(`OH_ KeDv - . advapi32 diff --git a/base/system/userinit/userinit.c b/base/system/userinit/userinit.c index 81027d4b964..9eb96029318 100644 --- a/base/system/userinit/userinit.c +++ b/base/system/userinit/userinit.c @@ -212,6 +212,7 @@ StartAutoApplications( WARN("FindFirstFile(%s) failed with error %lu\n", debugstr_w(szPath), GetLastError()); return; } + szPath[len] = L'\0'; do { @@ -219,10 +220,9 @@ StartAutoApplications( { memset(&ExecInfo, 0x0, sizeof(SHELLEXECUTEINFOW)); ExecInfo.cbSize = sizeof(ExecInfo); - wcscpy(&szPath[len+1], findData.cFileName); ExecInfo.lpVerb = L"open"; - ExecInfo.lpFile = szPath; - ExecInfo.lpDirectory = NULL; + ExecInfo.lpFile = findData.cFileName; + ExecInfo.lpDirectory = szPath; TRACE("Executing %s in directory %s\n", debugstr_w(findData.cFileName), debugstr_w(szPath)); ShellExecuteExW(&ExecInfo); diff --git a/boot/bootdata/bootcd/bootcd.rbuild b/boot/bootdata/bootcd/bootcd.rbuild index f84fa71372b..471a7f4863e 100644 --- a/boot/bootdata/bootcd/bootcd.rbuild +++ b/boot/bootdata/bootcd/bootcd.rbuild @@ -1,14 +1,12 @@ - - + isoboot - + isoboot - diff --git a/boot/bootdata/hivecls_arm.inf b/boot/bootdata/hivecls_arm.inf index 4651412d315..a39f33f76f5 100644 --- a/boot/bootdata/hivecls_arm.inf +++ b/boot/bootdata/hivecls_arm.inf @@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e HKCR,".386","",0x00000000,"vxdfile" HKCR,".vxd","",0x00000000,"vxdfile" HKCR,"vxdfile","",0x00000000,"Virtual Device Driver" -HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157" +HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156" ; Animated Cursors HKCR,".ani","",0x00000000,"anifile" diff --git a/boot/bootdata/hivecls_i386.inf b/boot/bootdata/hivecls_i386.inf index 147f80d81de..350fe18e010 100644 --- a/boot/bootdata/hivecls_i386.inf +++ b/boot/bootdata/hivecls_i386.inf @@ -41,7 +41,7 @@ HKCR,"rtffile\shell\open\command","",0x00020000,"%SystemRoot%\system32\wordpad.e HKCR,".386","",0x00000000,"vxdfile" HKCR,".vxd","",0x00000000,"vxdfile" HKCR,"vxdfile","",0x00000000,"Virtual Device Driver" -HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-157" +HKCR,"vxdfile","FriendlyTypeName",0x00020000,"@%SystemRoot%\system32\shell32.dll,-156" ; Animated Cursors HKCR,".ani","",0x00000000,"anifile" diff --git a/boot/bootdata/hivedef_arm.inf b/boot/bootdata/hivedef_arm.inf index 086ee67f4fa..8d8c48935d1 100644 --- a/boot/bootdata/hivedef_arm.inf +++ b/boot/bootdata/hivedef_arm.inf @@ -1530,8 +1530,7 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0" ; Internet Explorer HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php" -;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" -HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\" +HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\" ; Sound Schemes HKCU,"AppEvents",,0x00000012 diff --git a/boot/bootdata/hivedef_i386.inf b/boot/bootdata/hivedef_i386.inf index 905f5ef3daff1b1d91a02000819e52a8f03b898b..9650563ee474d1ccd2863c1580c394f8915c38cd 100644 GIT binary patch literal 153150 zcmeHwe{uQfPed&h_*qv{`WW2;BoE8yGZ<>lRtbG z{yhFP{ll9#|8~Aud=`)Y{^rexzg~PfJ-GbYl9juOfJSijU##R;%ee5@LPi zzz@MT4x`t1yX8{gt`D&ZAJ~q^$^3&XCbxgY_c( zj>fq+>W>Ema)Np9&sM^9OLSl(v_pHPL&yE`80PIgPwN~eONkJT7T9*h(0Pc=zHVI!Nbo=hxfcu-}8nCTZ~IBWPgV)_D7A+NvT0^ zbk^&Q4vucGJi4Qyclhw~2*U}^Mw8JYpXil`*c;*)DeUi+2RN~R(m&XuJi?>l@bKZ~ zF_!k90jXL(j-znp-1%#T-P&gXNn-3GH@6~wQF*A*=uN=KC2=Lx^+ z@Q1&O*IDRC3+FBpkPyXs4rxv|p&`V{CrHFFMY!4=QE9{nNbrz3uj zq|sDBtbng+B-G+yukrL={D`k$9W;ligR!hdLK!2S;I|q`ug+jhV_2ZPqLCcJ#Be;t zJxK09?aG;=R{x8J>F|B^cE{CmNl--AqkE^CW_-+O3p)8}9#+~eR;%;zQ^8fE6 zKUjgYB+GPZZ1s4lcGI=LxeqVJ(%-G(ce^+a)!MjT`vfP85&g6kBdkuFn)?)q?Nhi~ zsHrV5W;dB#KAY1 zsLKO&%<`o5hwz(-q+gcX4yyc8*Q8V*qpTqBIoBq)@iHIRn z>vOSW>Q@YVVc})uKfVXiAe+GsO@QS_$X(sjlZr?wH`M7*JhMi-J3m;%$};hwOy<#C zrdK&<7ia#kTR)y}Ho3pS=s_wxO3(D-^X>HfZ&z=xe!qe>VJb3qIC0m zep0lGK5nOC4%(GzL)o)rH2_AAj(1GX`S;;pgVkz}6|Xv36l{L=SF4S`5s{W=YmoCE ziks<67{*V*`mvs?m708t0$B3-F{pgn@b`<=z_Iu(q20f3)Ffk=2Hryf@EFN;E3DnO zP_ymU6)CKLBo`J)*WtW68}{AB;8-^NEeaODMgDpRm0U9QRxgc;flNmO+%H@~%?(Vt z`M)EUe*rnLD3-T3kc1^bPXXvs1{o>W;rF}nyNI+nIU0_tP44V<`k0*M({gEYBGty| zL^oo+lNC)dgI2CuiV^twB!rY~VF0d!wWyixwN@8Tem2=3og?mpmC!=B7I}UgizpQ_ z{&X9zr9^PZGak~3vvG&avsc5fen+5_bBK@;D4YIXIXKB660=c|vw${n^-h<=)8#VzmuJ9-H~B~WVKzU7(sTd&Ug?|RK>p__ z`EoQ)J};C1U7RM^=`Z^jDt|Wq{-E84sA;6vrB{wlJ#N8_YBMK5L77Qub@`hE+$Pv9 zaeL5iX{EtGGj3({b==ma*Oc4s)_)ZB=&kl!7<^0D{r@v9yp$(L9*FHB6PsMl2m7NU>ilS3}C-XwhWQNI}~5u={(DD&7kk)HN4pQ zcq6q6xsfHqEz)K)+`k1;yz^I*ffBH10}PV5)Euk07+7#2q1)g>;(K)1m~TQPEWBu4tp^F;#P1{Vio z1S-ge$sQ!y!}+3rdSM04&qZo-Rg4VIEVwulBhCH7b0u^eTpWs#!OVh-)?&nSC3G8H z9Ey>F79+`;O-hl8{11zfXIPF^%r4qtbrx);!%skn_vN|b-Q`K%@ZrJs|iYPQ< z;70h{BNx3;Pj1B{?A(qHT}MJ~q@Hiqpy*3Y!nVEMaFU$k{HEUcZ@qrj;;wEB-OIkf z4gj%mWEBXP59)-($yO4VyUrhKHp*S+*SZbFJb3Zp!V<*7+mkncq3flxS8uQV_2UlY zn55O!?U$P8x`qwyNt4sM4Z`(f-lGNlIdyK}k0U?4!k?NjaKR^vbDW!B7rz=bzJG$P zeEvG!eOK4;+=u^M!^DT*1VrM=t$xuoDMpj*1W7f$`C*&w52Z6|b`0dw)06Cm3Mbo8 zMVpW}fXhE}+o=QFGWf&ZLL14K-F7oc1t0msOxiE<%&{oG1QLIzdzT$*I-Jhy&P4ZNpG#UF#oKNmU(Nv z*ZJq(NVAo`@|inX;a=cX4|0v3-YW#z??d<^euZn$!CXM(z@_qoe*S=wpwT=Ek}H`> zmb-rnw$3&UF8OJf%mH!eyoB4>d4kh9VdN~*Ei=wMd;z%&^d={M@?!^fK{+e2jGfJD z_xK2NN3eEaM+f{UoET(+sLBTU9!Lev{~H8VKTZoQUcz75kk zB8Z*2zjkKA@snGxWa5azm&94tBK{sm&u<;r1O{JdGtts{4R_!@&KfS5Ji#tVCp*^p z?mvs&2EL0H-(mhS^CsD!HoVDr+>0q@&x2}slb)W+KB{|@t0fireKN(Q^Gl;CW}ti1 zO|X^)nUl=q&W*o@I_m{8i;;6lL__C-tO8Yz6Tx>9IZ1w8+ zkB=~$Y+*}uGV)vhTQbAQ9iV2TF3;M=sOtrd#=IW2XUQ%uH3t-s>ih;@k9^@X-M?g}P$EH=es(h0z-$i8)LehExX`1#0*e))7 z*k&xNc~y;P6?Ai)Tk$fv0 zs)*u_oUCc|q)@yJwi~!_HeK;0azuvyPp~+95xd~+VzoN`WjwCfHd+P!AiJK{qBTze zS3N4E?i%NS?eKC_#d@b)YftK-_psLihAo@UKR`*Ht44ggHnm`fI6SqtI6uy!Ovd1OU0y;G}f_20cGL)FlcT=oenW7&B!EW$gI z+a_5(IYnMBX)^J3=|V18^)=mtt4)0AqBvh(6pNPmcma3bH4TsqR!yh{tUnxyzHbSu zrjP=59LNg8mRHMp*qx zRgAE(i6QAZGq-XR^d2sYEA()j@!;Y>V~L2;^S07qV+r6M4mFmT=;2u7;TH!R55G9t zcyL<^Hz>PXi3<;af@-IAdg*%SbBLVlO z&BS{f({L>w{W+mH?n{}lZ_jxLH}gN6@C~`)q^96F9#(9Vt#FZ^ws5a`3S&)EKL@L( zSpx1f&H4(ek@IOD(rKE_}GgwoFT%NKr|<9m#4D(~(R`nM|InR&*W7Et0I3 zw;jo?kX)r{dJ9juf__k1jTKj=rYVPUK;IHyA688vh2$h*&BRB2iIrKal4b!r>WwGk zMblKA!KyS-!1}}4a&Ak43XB5Qyj~|rKxJRD!@#WkC17#YCx^@$78iXiu(;;q2?t#B zvA6=EY4YIWK;z+|rATAZGzsS=G)*3Uaj>yuoF0lcj|aDdmd1{fxdkG#~l)X6K&fM8} zuDv4XxK>Kx;`vQp^RS+c2~E@1f7vumorWq+Gtn=lka_j^2>UG8vB}C0=E}CTOixp) z+R`%hbFgZeCE!lW%(aK3AB>z&^N>!wM-^l z6lk9LK0m@4i2a!?0nDOhQug9l;~6&`Y&<-mX!Ce*QMfhG@F;$9ys_9zX_@1Np%z5g z%c5mcxH#Te{EW~trE+Da;ZgSDsf{I168kgFwM@$1mg3Dr@#c>EgW0&>w1~@=PacXl zcj3(z^O-GfOYuf&nU>2)HZ4oNtja3{4Ek%|kjxvr<~aRNIlPW^Gw|bc$vr?RF%q;=Ci7 zO$Wj`S*_u_&4Z57h2VjyNV1O_nrC?9OD#lProR#cxaTMktyBbn}VP zC05E_6mRa#ozH!1TpVvK`GHb2E&Z2G(bVa!QZzLcQ;M1&@h#~VwEB!o@#Eq{c)gs{otXN0iHgNtW2mNZESn>^!&;w^cAq}d}R zsd2-ToB5Vi3YVJQBomg?5V2KL`hz_#6>kjrmk>5>{eex`)Q7D~*xXYxvAAh;F&dn> zEpc=B6U0sZ9IWDI3AhtCtE5c)y-7B~BzNLwS%|GDr|n2q3uc-2nkdMfxQWC~?8$01 z(~(@^!)fZU^JG;@btJb)vRdbMB)38`qqwPOAx3eNfK^jSuIn|>atK(JG<8_%c1^Pc zqqs>}s{$jpwt?_Oz~cJPyuK!2artL1w-B&MZGqu3t^NpDs`z8@1XA2&FqafJIqana z%}kOe=q1EW$%1vHvFzHU>}@I5Sj0`rUKDMR8#w%|rEnvjsmYRbSj0_&Ulwtb!bS1c zKs=^!@ysTp%{tylaZ`?*<&4R)Ym?#uPj2SoCWVXQjb}kZiklqchUYhy{L3P4mic89 zH+9&0;--hi&37x`?4?2AaBT^kqn{vf>gQk;I7`5tz=?&-s&7m(D<-)UIN1eGOtPB9 zWuoo`&Pu}VJXx)1I+EFBA?(SWz**_NdVaR^WK~;sp4^HjGYXt~fG`T21gx4ua&0f! z`epXqFalO3%>veZPZEN}v@>24g#UKD6NK1K+f=0XEyFAg;pcfcP$*quFDRP=uL3)5xikvL4Y6{8qJ?R|qr)kd2tW`;~fMu~(r3q$O6&N{e z1Hpk9GF%6;aEr@87FeXZq^P!@fQvvDPas52b5V;JGeYDvzZI9lMS<4fZ9)_-jx-i; zVA;h<+1paAvFzfc>_ySmK;)!wQMfe_dnsHTZ!G@6B61S;5+Wy$y*S=j;+POQdF*Xz zYGV;Osc~y*awDF-$-^&-w`6yy*+nsmhnC`v5IJqbaxRW&xOPTtwM$V^sNcT#iN_|bIH~nl!vYNVO;_qb5O4{v6 zR&_&1GMgBLbFy00btJb)vZ^RMl3O9UQr28d{IPFzjam4o_ocX&o`B0f z^YV_{G7-!vl&org1~z)z4j$}1i%Zj5DGAjwUBe@eYD~aXvWVMXzJef^n!#P>i zkR8dbkX$Wfo{9O==#lCA*f9#31gx4uat%*92i*77G-p-{nS+r(nj4iPgtaP76xRA; zF&4J4Dll@`20|ubEw1$va&5Uq(n^YI3yYK$9#~xHnG0eBw}g<%;tGV2$%Bgm&0~oO zLdfL7#i7RHyu?lDJpAHdHmaK{sOV9kR{76tBXJck0M z@v0@`SA|E8>w#LzFmAZ`lL2VYFA`f)Sfe718aG`0rNFlQVzI@%Xs7HY)J-0TAmmLZ zU?SuOhUD4PPQojB zmXJHi^RUdR|Jv9|x?9m}2}CK^mMp8uTh1m;gyl~1#F8h@7^-gXSmu+7Fw1IL*Rk9t z%c{EUSZ;^qD#;UMvxRGR<6cjXk!s1)^~M7;iHpEh6G<-hxg&RADoql&Ds>jP!|}*9 ztRo0ql`IO}i8~qlX7veytHPteM;_0Df{;9C zz4JNeiB~IvxMAfp1P`e__LVv%vMCJ~6CN2p&|jC~zl>#ZZ`ScO`IDc;vVZ?q8?)MI~U9-CKmc zESe{Qiwi)RFbwN70+&VeByh3j>G3!O);zg@QOI$n2pn^=!Zv#l1?9s$+dQek!%@dH zcsT5M(i+x0Jtkljcua|c&^&o&B&>Nd`7zc!nW(^;CsRlhnkP@>5t?U%OGQNF@o1hD za9fc_Xr6HQ`P}U8b1J(L+dL;O=*nhdDn$jJ^LV_1(mZV!L42C0&P1i=nQEO<_WbMz z>sRN}e>GZh!c^Cq@Y&Zit=5E3{Up4?X9>9zJ`anX`mbgVs5wa|d{zo@I=|^>OP1B* zS=J<-@L9>bCCjRk=vd|xi*R06T1Llmn=Gpuvtzj(mMewN1w3AWZbvKRpF82HW5AvesLWr1JF=NByd@T zPXZU|FR8iKz!j1dIZYDZvxMC(n#T2%k*A>Je#0fTT&tHpdgfCy%=k!Y7l(c)H_Bn>@lN5z=_G zCsTkB!l!(Hko}5+5IzBTKC_zD}a`eI{_3+a8=(JO*5EfHG9b!pouisJ>V1H zhmBcQi|D2-cXzwjVOdr29m{;85%y)Z$m>{clVw$Fb}YBUa+Ltu{ZF4z-{ojIs#XPM}ga*(j;(^5|glN z&o2^Um~fE}!-UHsfD-&-0hBA?)IzrK2p&)CQ6a|>8iWAK6U#gTC^dLE>X?c?3|(Vk+|F z_*q+wBX8l32R(aW9C@>${A+D7p7VI}F(H6jhcur6syjuc09w{O6B#tzn!Vfz=8oFh zr|Dhq!=Isj>L=mVK1;}*_F1KL;_r<@9}5GiCIYB5-jfC%ay= z31KhRKDh!;Eo2Li;PEu9eR@10M`)i+z&Plb1`kIa6UR90n5aN;$2E8;@R$+>p?#h$ zKwAwv7KPMdt%r_MyB_6b6#6g;Q?+AI%&ceN&Xj(&#V zsh@;b@GK#Bf+rR>tG+Rs2rhAKZ}yl^0#{8WxvZ1ilWr)S5x6RK z7Pvh2s$@~%&Su8%dLZmo;gRDu5j+W8T>r@cwC5KIFDb0q))&HFT>YiMjaP-4|Kj4W zfo4Y7O9`GV4nf`R&I61>&f^IULhzIqMeKczXR{|YcsS~KqPd5|j)`LwcU*&q0sMEEBeEM zJ+4Zf1@2-w8J(Glz=XXjSroVpszCx*g$Fk-ss&~I!Jo#ftjr&f2$RBE59a%rFJqR?rdeb%*VO6T>%_ zQ5NH{n@s$%Z}uEH3K+*76L4FBN9^`oj>W)mmmEO_7C)QZ=}rOT$Qunt%QI^~#^R?d zJh5Eb1LN6_Cu{QD=}vKs=eq{CcT>PP@*3RUO#$P`TP`QVzS(X;3K&P8n9U{=dtf~0 z@#JGd{IpJ+eB!50ai#eA{F-Q=D?c{7y&cA?HNkVNX<4m3+EYIXui#li?gURPxmA5* zw6w)6tJz9s{3cRd_h?Tn#bK7!qPZ!{o#0uAWwnm!SmqOnurI4}s$;oLmemTkW4Rrc zs{~I^^cV2%(Z;iCrQkW}$-lO^Y9c9QoypnQ9hyDYN{{KxUX?lv+y<%+fvb{5fjb`? zS0@Cn3XdGO$!<>q7uA1FHgOTSxcrlWZ78G?xVZY`!NtX21HqH97Ym*qk3$ftP(i!_ht^L zIZ3z2v#mXz*q7DhE$fjc!g42hV#yP;tm^iTWj>h*v#geN9m{R9tg6e7<#t%Elsp?0 zn0kyH+#6hRp)5vm$2E8;@R$-jkK{>EK}eoFAJH-<#n^oVKIiThwo#NS& z;z{_jn!9B=(kY&myj%LRDj_fT{JSkjU0LlQg=NH$1 zJh-_0~By|1w-o}|S%>XGSyshm$8tL?S1O+HJbd`mI1^PVo?dTZta$3N zm*J|3q*y%5y(xyuB!R0^XMsED&E_+s2kChPu1XdKuJ10y!kS+d9yx9k#gniX7l1MV z4eK-l7b!0(teH|x;NtQx1-A8HT>UjD-3faM#goS&h&`T6z$oNAp3op}Yv+k&9>tRy zJREgQ9OJNK;uysp*WjVRYod5k9JdvDgyP9F)v@gHq~;Dn@#Jwg9>tRwJeED4Bo#RF z8i>D?#W?bKk`SSI4#qRM1KoCJ@=)Z#@@EEj%v%HF$m5}c*yCyK$9#&X?i5vuXQFhT zydfE$hC6t}(do%MAvPzc-s#D!*q$6b^6Ez{*02anT5gLrS);4A9oHFX!In*)MX3m-nvk z_T9^w*AAU_!i8MOfz+y z@K(g%!|2)Cp1UYm$0E9eg^FR`!{j{NMd4%Qzc@Gk+JD@iL+T9A{zzwjq?SaVHrbR5 zD_GARjMXZ!dU_*_EHD?zSR`v(OQg$izLRTVpb$*62HPg1l3=YvOSDz!!^+>@DsZ?P zvE9PB^4N8|TdkzmC1|(d8q%71II2tq4wCs^Is)_X#eq!e%>3Bd1WRZB0`GT)+^;R% z95`kJOSoCE3gXv%Z3b(#2o{RTGR&E%C(#-?7@XuH!G_HjP|jTYudoV#`1#qI88CNlx@roG;o6PuQyk`mV!F+^Zg(>=}|v8P<5%Oz$>C^KaeLq;s@jN7T9gU4{q$lNYIB$)CHJ%n_fx?;)C196^_1;FojtV8oVsN*%(1H8_kp7f~eACPbxtOt^l9&!A0PhBPASpX;J{JCzQoU)G7 zx4>>amxpEW<<+|{zx_F{b+Y1a>rC(d1!|-9GI-oYiNw9{>z{=`k3UU8%1EwKoJ=>b zAJ_BMZUL2HvgXbNtdF-B*IzEL&abawBmQ0jB`~gj5Ev#cFTd_xWlBoEk5b-Pi`Y@h zcBY<9m1+fU4ARx~!~MB(+9`AMM_t@Y>`X4SIn()*coEx-a+pG{zNNB)E@Gx!=084U zjUb6+CrQf4)04NCsnn?|Yt%ws$RJf8`pAbIaQ{r%a2`I9-dx`NAm#R3|3!ICX7oS3 zylh{$Z|9rU=`X|aa8wgh1Fu0<(($~B_945JQc#)svZ)n0WMd>4g5U1mOQo99_>K&a z>|fUU;jL|-bS&jjxdRyTbFm7yFyQ7xlr*&OO9o@zjVOrW0^sVMA47I|Jzx3oc%>%2 zB5)WwNut{JIaRJN!u1+1ayRL03BbOWdvHA6gS-TDpIr|N46aV@OQvf` zy!pnBV|gVdUAE@xTZ(1dtLyN)Z7l9V*!K?s+II2=XisZlB?zL(#L`8FkUg=;Q9lHxRyG_$>C5?GHl|fl|DOfl6 zy{s)mhjJv_{>TkZO-4tyv+qZWV%vx0s;9hkwi57yo(2(A0Glm^1p&k`h8SA#}ni|S(#^L0*Q@$~9L!^KA0E7_W>S1A@xuWrLQSY|tH zoBO4X!qv+%CQonwc?UBC>?LmAQ-#3Q%L0$5hsoa5=G{x0bM-9)v+Y=R_2U|Lf-aX$ zx>f?P@7x|7WA_^QrDo27^<_y0e-Vqof5@cd{|m%^TEG47f2%9Kmd{w#e}*%v3kij^ zE2V4LVV9YnUuigExrS3)4jvs&(jGIz-)Ifg3#!LKfFG%8?9q zsg2Acio(bMrM79q!=Tw^lD+GB$+ylX-DF)4pteE8bvAtjFNjMDh&6SPlS#2odR^q; zAgDHF^)`6`Tb=8Ja0lx__|ioJWN`YcqpoQfA=PF!-=$tuj5@Qa4S<$kci0>C%t-Bs z8g^<&r%$u1MdqXqndzki+DQ4ESU7QL!f6Irmr%G<_aFgi=G!wh`Q6E;Mn}$#hH$kF z?HxwmyFP%t6Mi>|Bn(&EQ17szN^3_J=06-{Fh8okC-(bCEGpD(Y!v(^H}@wp{9(gN zD7D!-GOfs4@G`M{&-3Ij&L+{(kJ_aWYFl+=MuCl>nclr`l=|VYN$MzrF+4J*sOv~* z0B^;2xPvHIIeM*q#2@l2W3^|F{*jrZSkWN^lM2#N2SD9^kUDjoT%^{w?#Qf>%Kdvo zDZi|@Jjj~YcCI56LrEw{bS1ySgpld_2g%w;s%zok$fTg@-N?S|HzyJ14_a47scqYl zc_3H7D=hIiSEyYjN@P|HNtgZ%9y)wb|R9@KC_MLS^Nk!8RhPHpob5yEEet55IW{4ZmFoQnVe literal 314636 zcmeHw{cqejwxxbvVE+fhZyJ~fq|_%Fpi{(6nS4vLS(C;a!M__t!c_(Smwza11uc=u;~<`3m(`T4&WcZy>?`2W|J z$Kd-v6@Mx26)%b#`1ZZ>_!szjhEJ_uzQ?2Uz4P*%|GfOqM)7;GQ9d>=U$^l2MX^(! zvG1rqlo(HnCwP6=IHEc3298El>%t?_HXjQf`5kO?R(vU2(2jFs&@pN2?sgA5-Y;k| zd+!bK(#qp7enMN%&^JdV3r=8#vB&%g=q`Ybeg37m3x2)AgBn2&Ir102cl_+bmPh9C0@TK}#%ERp^UD}-%x(P8&(5&oyZ{{iRw zP`2Q#w13x87sa-4y!|_ldJ2ZTEgrx=rxAEp<=ZfZY!-XPEj%`gT|8uLsh*9!+i#oO zB8&e5TfB!wel0!=xV;I~Tfn?6#_g~^2Qv?W`vfiC=wOP>9_`27>^SajiG26c?vfGO zevU=QIkw=jZ{rNRBHOngf2-s8wEUvjL`!&Sm3cUsujB(XR$raXd?5S?QGiXI0r}bZLo>2Qa{vo7RHot z#JvS8u}7{xu8A;weA5b!2YS^pXXzT*>}y$O*KVP%QSJI+54;+4macKle%Kj#{I0QW z`{6cvd-Jjt?IZ9b@+d~Iwc;sa!h1x7v$B7yd7#a#7p0fualXgr?;wI7;qw=GoFbYq z%VjM867Yp>XL{Lj6tXOgqM6eVJ^o9~HBNx`5bZyJ6^=_AaPDHVOXjX@pC%mZm`9n6 z+RR2c*5&=$W$l+`F3DK{#|-B#=dcR%Znl3NGnq5|{TlD^Z*z9zedj{JT$lLP8VJ|Q z`NkXcm7TpAd|ltTTegQe=vwi|^7nHb{iOKUh!$<~i}T$JWYn}U=NrbhcaRTre#8HM zz>~A+`*@|r&Aidt+l<6`79WG~S&7rM!Qf+jjLAqTy1TI5r_0g$94x7`AO#}Vdw0=~ zuYiw!#d^#S=wJF;>s?a!?i^#Av+7SJ=S{B~Kho}3Zo$9A<9O)IkI@Iemu%sjdcPcb zCx`;hzcEjm9*1S@b6BV!(^fggV&d9|Pc<`6Gm4Hcef*TMX1`l5_SyyTt-3@72CX0OdhnI)4s>C_zV1lU7Io<+K#=rQI6+&jR#j_=Jt)ug3Ovz zJ)bu{(4K1!VVv{5=7{d^=VgA$IfLPuTXi-$j$Lmb$})EbbH;smmjn2ATA5M#75?HH z^~Z80`6FJLi}ABlA#jN5F(!1rp`+RzziHz)W!`a7diXPVTYv6ew>4LCV)d?nW`90k zKl5;J;7Qaf~>YslfYqsQ>d!OsjmS59y+?~_J5zfcy&3`Lj z{mN5p%e%Axgg*EUW9%HG&1K;so^O|#Of1H^b2D-tqy29>M>SVx;&9!a`6sl!y^>b9 z`Pg%}bA6t6x1W1x%ZFIrp9LB($BLa{`2j||{~7+5m8Bz$NqTtJjQKqi$H_?M_SMHQ zHu&c=nEZF$EYO{MsCV~|*?y+FpR?JDJ=YLx6Y~W;C$09OwAp$&Z#Dkp1X&R+%jo^~ z>nNw^H94{y>($z(d)HZfJSMYd^57B=*Q(xny*#W>+gg4P{Nc>~Bih~WRl3_5suZ`c zRkkDe6+OX<`sb4GN0)xht{KE=WAhAV-JJ7cu2VVovKBM8=Xh+tMbGfg=h~UJqMXU8 zMQo<~7OQOZ3H5a=X7=M-b{|~f8tD&ZhIv+U#@2JIR*ZSBe$Ts6uHO!gIc;3D?F)?s zH@dlE9OI0vNpOB*)Loh}HB7`lR*qZp_;#BCWWzF{kZp z=fy*ecxJ3eurIyr^yjpF=hhj_=wPifM$g$b1I{-80-jI{)y1;Ni?ZUtxXP9i1MOWs`;88@h}_ET>CZsGpTyE0X=2#eKa=H_ z^Z0fSI6mKV?V%R))r76`&opJL9;1gi4s2bB@!YROUuEs4Eid>59_ge!esw%NDx(PJ zp>F)em=Cm{?H(|2#K%4x`-p4$%n6!NIVKAk`8cCFN546X{Sg@?i;Ccb8`z8-*w*!@iQ}#q1L&y?S zqhPG7BWbtBxN$9Eg^wd-5$frt>=)}-+wCxQf7r8!T0iyqsnMavj$W$W0@GTb(Ts77 zO2>!rRrHM1jk#-SjE|s}*hjL4cbGRbYi_C~UzT-6w>Htw$@;jk^9Oovm-o8)$qi%{ zJNO?njQUSMQ@l~UEE(K~S@V?txF_lw(}jx?P{S8h@+Emy5qu{Spt`%+{V_U4%7YyMpiVS-rlgt#MuB2*;@UhiBqT znClO&%8qot!{S~Zc38wi*}+|n()f3yK_wumA zT6&q-Vf~%CQe$XV%G@+X-oc$=46B!i9TxFWcG${hJvW^`lQ!DkF}{QBxaZ~6^Wt6( zc2q4rlpWjHcPmBSLCn_QEtBu4;$9whSW6FQ$6+#dSbw){?6A0(haDF2aCR8YOf$03 zOWQR%tIc#*C{Pi)2Guq99~-_}*M2<48Tv81mSk7WhOf?rkH20R%|7w_*EQI6I@)3# zIH(ckj)z0zRoB^1E7vb@H(<8e=(ae%W1opvC7nav#cR5GJwR0zIlQ(y#~(>`&^si z_mI7cVA^xE^-t`!Tp*L;K9}@2)+5}(`g+_kdI4XFS+XGyY@gjQLc(sh(r_;nj#^1PnVAN-untjE)IPh@;jC_3gSo`|U z7sN3>V&gH_Cb2TrMD)1$4(I>w^33ti{TxbiUa3gs6|b#y{TtuzO%MI2XtsQbYaUN7 zqvm>f?+bg~3R~pok<9McJ{wudFXp!p>Rrc*U&gbX1_DWQv9j<5DRL#>O)++9Ly?dxmzaBIi z{qNEetl*n`z+CI>KEvO*hugS}(H+m=B{$A+I#t8a@Xw*gp)YMa8jll3>*KUX=sKGHOz6AS_e00&QnZKBUgcfbI7-$_HPk!!xbLtBJFmr} z&pkoJv)8E(i$o5?5LD(|ywdixa-As=8;s0Nm<_Js>EiI(*Y|ke9Xo&E4qt2K&K=Ai z*UGGh?OVh9=lIEM_1sl$YdGGo__WcR8MW0KzQ=2)`E9dL)>^qP^s0R41AhO6*vA~0 z^OaL%OZ=R<29Mw5xtMeCtTq#$wpacBrsal4E9W!YM$^zy?~c|zBCht|1@Z>Au-#Mf zT1W2sP{m+;ox6gse%{dg?W4HR}EyaZSJxYGc~`KwF+ zVRq4GzRJ(=Kg=fWP6c1^H}gjBu*{E0<~(gaz{FxdzT4x6-gjrTpB(#66K&|o5+7jlhjdv4_e$YRr0E0hAeM6faaNPp zF7FXF-RQSCVvc@)cCm&r&VB0W5zMIP8e?_F!I=#61Fpg{w_qN@bwbX{cwMZ`MwlPG zyZk0U!#w39tVJ*L79L{_Yx4ZGId=Q(=@tI_1>g9DS9&5I#atW1`49Kb^pCq%_6PkO z@1V-r6=z7t<-7D=(`GBShnB}vjUDODaorsIbx&12W5^?g-miYQ|MyUC)$LcCEwb;l zXEFA_ZoXr3mg-OY8MANVbRL3x|F(Oo$K`mol{nsY(C!Jy`Vq&nxt^VC0%n)W=}}JW z$4nk$YDHXIG5dq@uHd|jH~qEoWH!^`3XZwYo!P_HywA#|xntP0p2POss(FrT{O|J| z`sX?AKB?+&oG0Ks$9!Ic=P-9QZOd`Yz0uZi-=69!!j!A77Ry!rgUKb#ItXJvecBoF z2<9nV7d5jO-mS%C5Y_{*viuv~wX+@TA*UVrwzbPM@cJ_y&@a@a>Lw-v(^5>Y{ zgvRRD<%(`QT04?`3*2q2wc1abRU$X?O^(!^Gnl$R>&|ATUad7;rRL9ZU}C+gbh{&S zS5aG=_iM{W^KaVGR0$Y$6xSY2-aX7um_6I6_%pjgTQz`Rhp*QU(jcN<@Uy26NQ>(w zW~jtezb~)pKk6;$1W zlE)6g?`oD*DqkSKG`lrdR|!IP{qyDO8zU2IgE!G1tk2yjzJ*uZ#ro>_aTBsTalic9 z`xp4#)?VYbgFUu6ScyKg2ijX=_TA??#ba2QyK4JhtXowyY=8S$m^ou1=6|{D5yu{S zTRs>s^zBOOM?Di8%+E2qI-32Lnz=#s_{;Kp`c_Qo2ScOKG1}DeGNU z4tCXfNgH0qaQjG&mv?JlCcL}{*)riZ`#`uHsErSnyL?T}2jc6uuqF?|T|Jf!u_Vgb zh{4zNtdPVxO>ub>`9VJ`bd5YotkX5}B+*V6k0tR=7vg1$c&3it7o#=tnAQK~@)ZkF z%;OBnK2t}K1!iphHrB-oNzAi(JYUn>SQ7J2z#SX+(j%6{yhE%{*k^jg(wJwNksh%m z=Dh-cd7ab&R)W$amc+cH5;0M07oz`dYhtUH44dj=416_z~7n zUjr-m*^($L`_!ODS4rLIUD$wo$-JF#Y}(xm;wme5;k$X{>3quOwNZ$MTB2DY8piDO zbiSvtqjWy4hP}H(bN`oNm8q;gV&7>{15j_*p<1y1-iD2A-Ptah{kd!tuN{@FCJwt(*s!aOL-Uk6UVo<2g?C!*j0~@z zhqmG6)x*2E{+znu`BygT_Vu%jHoQ~}AEJtQq<{~83~9q_>z&go>|}iCuOGVoBRKL> z^FdNQbRHr-UPP*=R@k8o7x>+ujWg{UsXk|?K(70VXqG$}-7k%M!ai{M-8!w=d(UY$cNgv{Byh|UUWeQPE-c6zq)itY=C`5JTnG%KQLRDVD zJH5(Bo`$(7ubS*ftZU>+V%|JjKv|S#bm+6O8+kfd(I4}SlKeLKbEsfWx)8;@+dz7V zPf}H$dKSI7yd!kCe$ifeqG8@IQ;4R|HZ>|lL!M%&Le%L#ofh;#xi7TY!IN#Dj@f1o zx{kXS#@#b?YDMVc+9*OpEzzt94P$otIe!Jo&QG!;beJBMcH@3?45x}Sv6eibb< zS_3P`U|4lV`zz4%Gde3m$MCoL-Bo9_zgm+S-Q>t}y|e0!_E+;VqnC@nO|+}dXn(ag zGrGx<<$7lo8C_S@`KujGg&ONxyXDF{bKWUe^xE%!QOE1gWt(_SHGn+i{xYfY`ZJX_ zyu5=OSJ!tYtp$Wu3hMUt^UyZDn)u*n8QSssF{Fui@pT8BX%(R|J`AZBa?GV3Z<1;u zaoR^}yn6I8GCoKYq4Ox3Wq3Kh`YYa=Jeouisx2n>M>$r-=h$gl$_h!G(-fCADMF<- zmc%+;BTo|Tbg`m8-YuXS)stUJ6roOmq#>h_DMB^bSgHu+6lOj}#SQ7Iz zc{iCNlu?=wzNXHNWr|Qu+2%rY6~sJ>P$`d>E#@(v^=0(r?^dY?% z>@L1K^mgfcro`R81|C=C%KUKZJIZebbgr7!p<&Ef9eM*-jvRm0bLKnBGe?f4Zk^ws z5DPvb>B_P zXun!PTzq6k$BV*M|26&ZtIlX&w~-l53rx?u>CUq1jP|RYnbFg6ZJr~qBBSeSK#6wd z7%S|&KRfR#KYx}~$172XvevkTc>rHiR`I>sXNh*h$@Ji~2n(#`h zhV#_xW&Gv%>Z>JFYpKUWNY$a55cfwp?oX#Fi;%=QO>tS1I#fFHB(YA{$dg1nU99Mj zcia(9PkyOM9V+FqB<5-IZc=rq9)GM!9V%mmbiYtNQCg-B)s$;$Qin=e(I4~7J;SX+ zH1&K*wqK~G2qII5o?PnQc~_J4HkQotxU=aI9#oX4M=XhXnph!Kho<(&8r7j8-!@bo z+O7e08quGi3VmI?fkKpPcvVZRO}bKR)(GQkMW^0LbUUE1Tt2O6s3n@UqG8NgE1H#c z)79~(i~SNt`}H+DADB;vbch^?)?JL$O6*|O!}gLsmXBlE(6!uk+{qb-eyuwoPlN39mm>Y2w`|caF4}Q`^_iLqm9}2h+d@Kg(#t zYi+9muOCC2c<0(jD>N&qk2i^WW*%*z3~#@7#*83J-Pbh<{~vcrz@kE-CLgawaiFuW0_Xe zGJ>yZ5LXqFeYs{8Z3?_YwW8fxP?=_QF=4+L-@JU9(Vc6f84a~Wvt~4mIcr98s=ZK3#m0FxsDw*;te{qp|xrE^ER^yUw+438Vcr>iHR+HKTF8Z%;>oMn*V64$mqHztY1+xm)awg_t)|IbJ=v7I~iVo zrqaYaSG7Qf*Uv*kc&+c7e`TZ22S3Yb!)vkfH8oy8hBWc&8gCL6jjb{BHMM;u^+fW3 zST*oLQccu^SC4*1=Fd33`fGER!5SDL*NhUa4#Y#EoCYr;(~Mdlp~J?KNN0Jh!^X=N z>ojRbrQWSS-kE&DayfN;mh3NTyqX@wl9;DyUsRWk`(xf*+GnYaC38D7 z_RP=JzCyOYD6v{*q(|Hz^XAfwN?9S9;aO$iw3<;V;{KTD7(sTVXN6>zXXBj?#L}2& zJVkmNYtoE%@mQl~G=w*%W|YyAMw-b(9l5oEVAUDzuj^z+$K}`jM_YA9`?apj==nJq_l&E~Xn$QeGdeE6=0DmhGPsQvy zrDY4{{dK(lTsEEdPKMW?sWkDrJsYO2%*gQid1xD6j#FDrntx@Z&Idos2;sH9IyGKD zhBWc&8gG)yqOIKWHMM<*)D<=0l~xt4jZ@oKT2s`5m*cBXJL=R`8WrX98R)ex68-J4!&<7JC=nzW-*8~4XM=iQhCrH&sG?dV*ZJE@JAE#|Su`(xfb z`;E$MtVug6MchBL)5T-iz3FY6`<5`;pTEz~=&T`) z=^t+(E258#d(2@+OY5Wk+I?p9u-=pT%{h;`>Wuc)9huQ{vTurWtvaLq_2JCuDOfh= zF;|h%bq$`R+Bi>LDU|ou@%nSwHVvL8y#7q3iPw4&^E!VPTDPyChqmF>WM4na(2m!S zAx*qnMY>Iao<>)!)1)Dl^0+_V&7~ogBJPiP2C*G| z=|`R<=2^5Fe1#?rsf-me4XG|0OJbg;C@s^F>ay{&#XLDgEHfVjuqYpHSsrz_*xH(e>ho!ZF&ft=SwZ>qN6o^r{v}%V>X& zK0l+gPLwu}=P|FdVndR3_;riS=(zlv|7feuXn&0_GkSgw#y#VzGuqeqWJbs3*ZfCY zMMl?kff5zXaj}Pc2kqiH<(1!|EUAvypUbxC?CiMY>-_VSI$nRK(!{$_92VS3>;$@s zgXDPqJhTn3RaEgcwSE08qYbYn{`xVbiFYpTjBLE=sUpho_UmS<-XT4IB^AUf;?(0! zQa_xh8Ykle$5+2jRFj90=|puQ?vHW{RZ&j1*QlnrtZA=N>By7BI$b=LL_1xq=#O{W zMqYo!n@cAu6AGrQDTg(jV-j1`MQ67w{9H%&TGsf{JGJ5AZ9 zCY`9%#>*D-WIE9!aeb-GWd1$~S)%@0t6PPuYyxVn5=(7kJ;1r4=CvlcXr*(vAzwIjO{mz8rdwLi3K zJS9>0(XMmFPr_)wewG>C%@_UuU3EtL^YHl@owcBGN6D%)+ONT9M#tsX{6|}LM*Hh{ znbGreFzy*wozZ@6Gc!6azve&MDl)pRRrFUo+O%oM#cizR9bsjCG2yy;XeL|7>(6D| z@Y-?7*XdT(WqAFWN)xX`JFT`-hS$$S+wg9qzH)%)(WG@28D2ljXv0elGb`RF3h??d zq=|PfEvU@Cl1iataQgAquZ^jqO^;VnC9EP&?aw4N!g;FmGX8RW^=m;jc?g*nR2Sm@ zD93xq>WLaMEvPQUl1Qh?Q^@uV)x~2;wA00k{&=Tt3qxwN3t2qKAjn&wC{EvPQU z%Qvr+#5_&jO_LT>Hu7Zmo!69YO0=L0%$wc4=TqnN3uI;e`LU*$C)0v%VZOfyOVifr zZQLL8c+Y}epyeus2E>w>r->CZEogdwtWgUZ^2S58picK$*Mgp7ue$f(^>pLV&hnQ} z4@%_iyZPOR)hUoC8jpAFZ z+;3pV0gmcvd!fB8nl+)}9;oi8=&vH#nRZr%&Zpy~&EsiCuXF8B#%X`fl{p=kVe=m? zbK0Mk&(GFd(D=N2he;nkVzM5tyn)IY{J4Y!jRH607L0$Q?OkJwMKWo&NhQ0Gu6sA^9 z>NKWLp>g~K)#H>t#H=aD*O%U!T$8yOSn*g!eQBsIy7i@D)Opv@d*pes0{D$(;6U`I*yk88-jX zGN=7@zRcnbUqfG;=yG!{$HQYI3@+wdq&dm`V)ql{M{s3#p)KpVih8`}10^ zZ}Q<3vD7?L7rR@&rkID<5&N^2HpI7pn5d^#Yszfw=cH|jcVJ(lp1Q6fL+oc9ZHPH{ z+XL!@i7PQO#C|+!L(H1Ko{`sIRWu{f{!Bme`n5F{t9eb2SW;1}Vor}(lfG0o@;K7^ z>$bYQg+yOU@21JaZ6XHu+j*zl&3dc6A|ySV<@!=vBiDdg68&_=63PCg`uHq~fV%P` ziN16L_axVp%Te9a?>BTsL7Bc(mw%S%OSR4ZB>K`SGp4;}NS1F%?p&|U*U9vy^c%D` z6wW1-@mr_H>RigtXe3ryPuD|G6)sX8; z_2kboeW`}nty5nbih@J+rB+E=)s|9O`k{DR?qNEm=QA_a_zKeV3>*pe{YQBsL z(@$0wR0!F8|u^&&Gi08W7J(XbX>q&JU_tzEY+gD76Sd+q3hFDTlw3!EA)ALx9 z!c=BsjBkDp#0t_NpU)mMTos&j)oXOhaB{xWcrm zCv`g0XIL3ME#Bi!?`y?<{QhOqIhUFLEu+?SE3k^Uj9SxBTXbtp!>F^?H0$!F)2>Xp z1|{LNUz4*d)br``4v_=VzKgGlIbs-Y@vO@;cDvrSaS5mWwd?sgowcS{8^fV*WlsCG zjm+r~SC-}d%xPcwkvY9A+zsK(oc3#@nbRSzEX(_=$?3X&Orp9uhVF)|*+;m-D#fg} zj@X~qwrTY2*yL+^#QvN0bkZDb|VeXH7 ztfy;=BeLC0bwz7kT2tv5l*B)6e3nE&ZQSUOfz;t>%06{zO{IL6#6ev%DVf$(8|G!4 z|4HJYE?+0pn(E5-b!kmyenXemREl}|;-E}x$~%V~Vhv_$4W!i0lG&iad<5J&*19Bd zP*=Vo)0%4V&pNfHAvO=ynl?41RlO;9J2)yn7C#sJ(45{Y&hYmI9;bMB%JoOHvKU`` zN*^=rKBwE)NP8M;i*D^{7yr{gkg{-b41`$~|^>G@e0_l%j-eyucfIxfTJ zKiXWKSmj~iH(+`%mH1b6s5n0Q^XeI8y%?9W=7Dnp~b zu^uJGEUS*#&q+gwt!^kiVn5?(LrnhKXL`hbJZVEb*PcAGk=I{wv22JvyU~VN zQf;haPH$sLtx*?`Inw&Hr_NJoiF%T_XT6&i%+koGCyvOpr^IU?=|`Y0?Wru5Y$8Kj zzA-3?fR@XA)xZr&4Ah2s`J$k7pHmlC(sM(iJ>9^yaPFZ2vm_2$-^^DHm?d#gSM1iM zJ(a~2nfCMqS0GwOYv9K6#lZ#ER{CSNt{h3OJ>7-&lrsbk+>peF_3 zG^_Kfdb+s3PZ|9soc3pCb{00DIxp{bN}I=H)%C8BOE~S%+~?9`D=|7h7y`}&W}>G@e0_l%j- z{>pIXbXA=brXKb|xZ&$rvDjK}?T#`*4P zDnl$$+t@hH*YrG=)EIRkmQ)yRg`cnKZOoC@S25QY^(1jmmxtpWMEmWmEAq({r`j+} zqMx=gD2adC_$-Nl+PKjl1F6Q*lzr;j?NpX&$P}mC<;_0R$3cnWbOFRic` z7u?4VuouOLazEHFP$wLeiiG-1+^y8zz#RS0*hSVV7e3+JH{ngr@VHTYi`<1d7Dx4z z-X+u)-P+PH>Z~oz+R}K+Kh9^WM@usj9jE=ZNIT!k+R}PIRr^f$@7KE)F7ea;TJ`*# z&e~Gn&y5>1nbUq9KXW=R!{$F)=Cohy%AB5`g>lcAIqla%GpFM+Z2qIICa3F~Jc-KY z7%NRDN?bAROH&RCjawM<)TcYoC3<#g?4DjkE8_@|A}k_f1c z&;2n_-x%zVg042MWehG~9F%HHHO>BXX-j3kPO2@{G&|9yEtT3?G7Hp|i|W#rO6@F( zgSv7gnYQ!*D@KP{H{y<_>1S5FM!IjFVpfi*D?P!dHDH#+L0#OCYD?4mXPw&8kk=Th zEwxJ0sTXPyl z?euy68kAkt%lf>m&%3Gxri}j*PW!dF%xPL+oI)<`5w3TQT*7I84SRl0XU%EcF_1a! z*Y`80<1%diqh(I}Yk!&3^RqDS88fH-8foTqT!zhmwAJKvT@UH6d^FWJyyqkJn`YO9 z6tmhoVt-!ShIp^68k_+0v^uiToTZM~pS83hJ}I`a`~9{O#C}fNhWHqJ6YfDV#Jz6Q zv%=3f+7QoGZIrRXk0<&O_g5NiOf;|QS<$bz(S}%3WvpUOZ(~V~QP;@hNb9fVYKwZ3 zxTg)XB=Xt%GhfrQS*AHXLae@pxVHr*um;S_7yWpzpZ+mu_EFqJefda*oh1=)4_VOx z^3MY$m?be#8|LMUg0lTgUx61V<=%7C>Vsq%s6=zRfh^xW()&7z=9GK$ZsYk1a}y2z zS)w_mW^92cZLI^dWDck+6P4{}dII}eMr+`+Bo5j;r1Mn+W=R}mK4%{qFiYYfd9eo@ zZ(+Sl17=AaJb_B~5UBT*V3y1Wb>+`8&8dc5RHx=Nlx+;xoKj(0Rh*t7i~fkHIOSM0 zV{93V{Y&l#-pM`PHm^tmQ0cTFfW!U^jTTM>ab&vfj z8&rF+*%Um9wQZhdJOb=H?=eQ7+U z6z99uqfP4%+beNDz!x(Htrh=*3R^wS+xd9bm)85K+Go0dzuxt5iJ$h@tLNu*)|dKz zZrqs3oc8M(nbUC@HviEwr+u|Y=Jfn5jC;n+XT9EIV^5d2km^fy zMe6>@$9saBsHY?H$@VTKRz9>~mP9{oV^9+Rw2eVY1k}do{urol4E9IC`80&mm?DXT zy7(;9m+JBxy7Z+oZbe81=xzQg79WQjuTo>3ExIcf^#*O|sxB+b` zbGjp3Pd%-^RLYJ1IJoh3pLFh*o_;nc)0gVvhE!kb#$hTu>(rNq*gRZcYPFam5=_)M>?HNcm_~M?9XePh&Qksnt75_DdypI#Qv>WR7#OH?)U zC{(08=18koTH3~*E^nbpT`IS8f8?7>*(S$4B=+g>8Jc!4mD^bo|Fn%kNd&Z+oQ}L` z6Z?|(`#Noy`=cOv<{s(ewruy(SHS!V8YafW^q6VGes1WB-I~;;QeUS@T`I>ciGywg zYRH{6sY~T{?vH~`)i$lVRE~K_9Mq8`$#*a1U3#=&?vI01#8MBt3-#BO>QXs3B=bR= zZ|JbICUt4Ioi(aU!-$8fORbXBX-j`86^{o{K2Dh}nHA+_RF`gEBXw!0ExOgEVbo5E z=V#eAYs%`&>e4Y5m^Q|@Ux!iMkJn$Vo}bfMT^e^3Wk2n& z;$%+8W!U^j%bfPL9+}hgvoP)%GpGGk;LPc`44eOGtI6rQ^3h-UXw%soW8QRf`A9JX zs3Z30wQYzuapg4?rhKGF?9W=7hz(M^=AIt0pOdyB-p2LpyeAu<=@I)GM;l_^J?w^($+tcs2M6NjOtH{>Vo~h^9Cq+q;w_P*1ehr7o3@K}r16#%Dhg86y-VE))Q~&tQkP1(A&G-?U1cG~EQy1< zawM6$bQ@V6_b;VdQ-go*kAo%;rNWd?4VWeKL0#OCsY^BZXPxTOkk=ThE_GT`qc0u8 z=6&3?`4jHjd|YNU>&4x2z4}A>*8-}ab?o7Jg8e*)?Z4?C^+EAFl&&Y`dAN?~{?8-d zz%HNunfx|9z;}Pc-k|5@U8cEHDEpM(r7q|9N>0oDLKlq@9sd4$@w|9YJT9J=M{~z= znKH3`^Yv5zDDD>zi)VPJX_M}=T>TurHTH|2iywgKm*NhPJQ!dH|C=w-?q9Lj>M4Bp z>19t#ZQ4B6_y9W_ONekGn%~sV z>Mi`_&iCwN{z7jA3KJA#-7Xcifix+r(n$+{C0tNKH_nT_g~|$K0opjHsQX_ z7v(pNZ+0AV3~Tz=W_Ys*Yz5FM24hyVTW(ndBH;=I5_uxf^6V;W!k zqhow8N~=6V?>+?HmzQn74=mfr?;qf`tL?kJZ4XBa8&^4IUV&MkFuEC6FTQ%w7}i+B z{U4sAU0qSlM%Xiq)Ys)`oi?&u9n*Rx#?*6ff3CQXSu-N z>htgzcwPVl^L01#>mCm=SYyUS_j!IQ{(^D*qMVgnCAXD~yYvXS7I0FoG#%k}>byZ> zlb7(JoX30yJI|5XXt2>!AR$NT;m*qyBxWW$tVL{$BU1ijlO;Tj-TbRK9ol| z#gVv9!1c#3_>RB+XjbUBHdpt5YnajPM9F_;5!JMXDs7A0?8U(~(wCTz@y>OOZ2apN z%*~#Z_}IhiWjy&G_~v=%YJB%xb9-sp$|yCit#_8Bt#>h=$=zf0He<+P$pH4bWCdXh zYY(@Uq@_>MN{)A~mY<`g4=+8xq@7$RF;$p3e8O(=9md-O<#sh{lhyDHuC3!eL!1@2 z={&w|>p0J_TdrNsmkC@Yw%L|0i)Y}f;u>Z`YgmzEoVIh3HDqH4$VlGeKU(t%V&4Yt zr$Bi9Gm5s>USH4AZ0$JTv4fmqd3Ze5dq`9T{p-E)<3Y1mIeNLSGUe{RA#^hMh zV43=N+2X<95V1AK0^(bhI8bft_!w|iO|ZWL%`C64YBzjt?bvy3>2CVV|P1PtCN` zl=u7jXIM4jI?+d5N3)MnPtC_6j$*F$pw8<9DnJi${3EQDf5Q5>sdKv(a+~cKl|Cy( z)bYK*k*HIAgomk~eP48Er!pi|-O7+mch>u;gmqsdRj(J)dPX0@S}3cFY{duIlT`<< z+OePNeZ}j-c-4^8cNs5jlwSL=<#WutAC+~uA8`z>^!*B}pW~>Eo~+Nk!S_GnJbyy% z;5$_CczxSBK6!#GCq9EMMDwQjpZJS7UgIr9zxn5lC?x-(YP!fAryXyTj zu2rG)lb;u0z18|Z0c+XIUAX>?PrSpo$l9CeD~|6Q&?WC6TjA<;n<7YimOmB}S&J?JOt$#$s_yH_3>T=?kr>EM^uA{d?$e4jty;jp7 zOwA)+ugB|l&3K=upWHch^iCa*hCZQQkV;TqGkJzQnOUyMs=grBQpZ6B$9yB}9?mC0 zq@_RQXw&yL5!gyL*O}j!xhiKV^Yw2SgN`2U#;2&Z4G`ua13Qdh4s zpP^1L&6u=j*VlVhWa)eC5&Y+81@W>QhmKzC$C$o9skY##tL{%UPmb!JSx29>q0-Sy zzoVbt;rY*5XA-nW^~`#D$w#H3m&^_VM$7OHmb3eR%{8Lh&ab7%LfG{58?WL1fHf7a zPtUcY!a59hop9&Y)n9d78v2TrhBThAer7HG)I^oOm+YQd^Nk~WMjgFUMU%ca+|{ur zGO?Dx%HfUQC| zHTIXqmAZ0Y;0ew_?!h1{i;_hXx{ z@4^^#^j|kVt$jG>x=g!;-d`yv4Xfm-Rz61jKWHf0|ADIp$lRZ?8pZ1X4xqG(uf^?Z zPfhVaz`ZF~Pe!0euT zdwwaexH!Tquj@I1u7UNDsXVH0F(T{2k;1E91>?{$6~8}ujRZBDukp&+2k)~oUoWL$_R5vmSMa#w(#rj9vDYTG`$hlzSMfDGQymT^5>KU4iY)w9rR#kWen}yrKQ>8m?BXUsWSCl- zedT?>9h=`6!^P&&rikKO*nMxDkF*MEqiv+d!>aDPV~+ivz0-pG<~Xah>D*1<#pjrG zB`uV7S{pc(w}fS;h0M^MUOtA+d=&BRHFhq;U2=W(c^}LCZ;Z2)f3#`F()95&^Rh5iw`t)wgHNP>&YW-N^+i&blp^BMRQC5hXs_08+kmU;`8ri z9A_<^D=HVof0pk)hnDa$_67L|=7tY()_+4p`v!Y*@8kVvc>ftRw?E)NkMQ?5(B-nq zVRo}5PF~+{b#uJi?sL4udAiB5?3sDLs7KHPus#1k1?vU=`VoJ#jeM6!dV%-dXP)3} zFG?$LH+ExJAOB5w06rF%E%_dwAJ&$eP=Vd-#Cosz4;=Fzb}pA-3?bY}X6yT5oc9hmUDDks3RM7E0 z0~}YZT1Z>-4DESP{ACokc1N^j+&Jc)9M}`%*>&fNZ7}+R>OCZm&?o-~JzyfTX`ie& z=;NM5Y0cd$wubjUJ;fdX94#Ch=I-m%QJLR9;eX~gX^Y4&-q~W@*uQth_Kc4dKOqJ% zW(1Pkf3Na?Fg&T{dwai>vj~i_6jS8Aut` zd0mdQPaTk;G(fOkofkD2cq8N11NH*sGM)1oOd-e*9$kH>gU?OoCC - - + isoboot - + isoboot - diff --git a/boot/bootdata/packages/reactos.dff b/boot/bootdata/packages/reactos.dff index d87de7d4bf7..895b3fc2fb5 100644 --- a/boot/bootdata/packages/reactos.dff +++ b/boot/bootdata/packages/reactos.dff @@ -489,6 +489,8 @@ drivers\base\nmidebug\nmidebug.sys 2 drivers\battery\battc\battc.sys 2 +drivers\bus\isapnp\isapnp.sys 2 + drivers\bus\acpi\cmbatt\cmbatt.sys 2 drivers\bus\acpi\compbatt\compbatt.sys 2 @@ -634,7 +636,6 @@ media\nls\c_28603.nls 1 media\nls\c_28604.nls 1 media\nls\c_28605.nls 1 media\nls\c_28606.nls 1 -media\drivers\etc\hosts 5 media\drivers\etc\services 5 media\inf\audio.inf 6 media\inf\acpi.inf 6 diff --git a/boot/bootdata/txtsetup.sif b/boot/bootdata/txtsetup.sif index 35f1c761937..7977e447752 100644 --- a/boot/bootdata/txtsetup.sif +++ b/boot/bootdata/txtsetup.sif @@ -22,7 +22,6 @@ c_1252.nls=,,,,,,,,,,,,2 cdfs.sys=,,,,,,x,,,,,,4 cdrom.sys=,,,,,,x,,,,,,4 class2.sys=,,,,,,x,,,,,,4 -isapnp.sys=,,,,,,,,,,,,4 kdcom.dll=,,,,,,,,,,,,2 disk.sys=,,,,,,x,,,,,,4 floppy.sys=,,,,,,x,,,,,,4 @@ -37,16 +36,13 @@ ramdisk.sys=,,,,,,x,,,,,,4 ext2.sys=,,,,,,x,,,,,,4 [HardwareIdsDatabase] -;*PNP0A00 = isapnp -*PNP0A03 = pci *PNP0C08 = acpi -;PCI\CC_0601 = isapnp +*PNP0A03 = pci PCI\CC_0604 = pci [BootBusExtenders.Load] acpi = acpi.sys pci = pci.sys -isapnp = isapnp.sys [Cabinets] Cabinet=reactos.cab @@ -80,7 +76,7 @@ hal.dll=,,,,,,,,,,,,2 [Files.pci_mp] ntkrnlmp.exe=,,,,,,,,,,ntoskrnl.exe,,2 -halmps.dll=,,,,,,,,,,hal.dll,,2 +halmp.dll=,,,,,,,,,,hal.dll,,2 [Display] ; = ,,,,, diff --git a/boot/freeldr/freeldr/arch/amd64/arch.S b/boot/freeldr/freeldr/arch/amd64/arch.S index 9def109221c..0f6c257e34a 100644 --- a/boot/freeldr/freeldr/arch/amd64/arch.S +++ b/boot/freeldr/freeldr/arch/amd64/arch.S @@ -21,22 +21,22 @@ RealEntryPoint: mov ss, ax /* checkPoint Charlie - where it all began... */ - mov si, offset CheckPoint0 + mov si, offset _CheckPoint0 call writestr - + /* Setup a real mode stack */ mov sp, stack16 /* Zero BootDrive and BootPartition */ xor eax, eax - mov BootDrive, eax - mov BootPartition, eax + mov _BootDrive, eax + mov _BootPartition, eax /* Store the boot drive */ - mov BootDrive, dl + mov _BootDrive, dl /* Store the boot partition */ - mov BootPartition, dh + mov _BootPartition, dh /* Load the GDT */ lgdt gdtptr @@ -46,13 +46,13 @@ RealEntryPoint: call x86_16_EnableA20 /* checkPoint Charlie - where it all began... */ - mov si, offset CheckPoint1 + mov si, offset _CheckPoint1 call writestr call x86_16_BuildPageTables /* checkPoint Charlie - where it all began... */ - mov si, offset CheckPoint2 + mov si, offset _CheckPoint2 call writestr /* Check if CPU supports CPUID */ @@ -89,26 +89,26 @@ RealEntryPoint: /* X64 Processor */ /* checkPoint Charlie - where it all began... */ - mov si, offset CheckPoint3 + mov si, offset _CheckPoint3 call writestr - jmp switch64 + jmp _switch64 NO_X64_SUPPORT_DETECTED: - mov si, offset NotAnX64Processor // Loading message + mov si, offset _NotAnX64Processor // Loading message call writestr - jmp fail + jmp _fail NO_CPUID_SUPPORT_DETECTED: - mov si, offset NoCPUIDSupport // Loading message - call writestr + mov si, offset _NoCPUIDSupport // Loading message + call writestr -fail: - jmp fail +_fail: + jmp _fail nop nop -switch64: +_switch64: call x86_16_SwitchToLong .code64 @@ -119,7 +119,7 @@ switch64: /* GO! */ xor rcx, rcx - call BootMain + call _BootMain /* Checkpoint */ // mov ax, LMODE_DS @@ -174,14 +174,14 @@ x86_16_BuildPageTables: push es /* Get segment of pml4 */ - mov eax, offset pml4_startup + mov eax, offset _pml4_startup shr eax, 4 mov es, ax cld xor di, di /* One entry in the PML4 pointing to PDP */ - mov eax, offset pdp_startup + mov eax, offset _pdp_startup or eax, 0x00f stosd /* clear rest */ @@ -190,7 +190,7 @@ x86_16_BuildPageTables: rep stosd /* One entry in the PDP pointing to PD */ - mov eax, offset pd_startup + mov eax, offset _pd_startup or eax, 0x00f stosd /* clear rest */ @@ -268,7 +268,7 @@ x86_16_SwitchToLong: mov eax, 0x00a0 // Set PAE and PGE: 10100000b mov cr4, eax - mov edx, offset pml4_startup // Point cr3 at PML4 + mov edx, offset _pml4_startup // Point cr3 at PML4 mov cr3, edx mov ecx, 0xC0000080 // Specify EFER MSR @@ -405,42 +405,42 @@ gdtptr: .long gdt /* Base Address */ -.global BootDrive -BootDrive: +.global _BootDrive +_BootDrive: .long 0 -.global BootPartition -BootPartition: +.global _BootPartition +_BootPartition: .long 0 -.global NotAnX64Processor -NotAnX64Processor: +.global _NotAnX64Processor +_NotAnX64Processor: .ascii "FreeLoader: No x64-compatible CPU detected! Exiting..." .byte 0x0d, 0x0a, 0 -.global NoCPUIDSupport -NoCPUIDSupport: +.global _NoCPUIDSupport +_NoCPUIDSupport: .ascii "FreeLoader: No CPUID instruction support detected! Exiting..." .byte 0x0d, 0x0a, 0 /////////////////////////// Checkpoint messages /////////////////////////////// -.global CheckPoint0 -CheckPoint0: +.global _CheckPoint0 +_CheckPoint0: .ascii "Starting FreeLoader..." .byte 0x0d, 0x0a, 0 -.global CheckPoint1 -CheckPoint1: +.global _CheckPoint1 +_CheckPoint1: .ascii "FreeLoader[16-bit]: building page tables..." .byte 0x0d, 0x0a, 0 -.global CheckPoint2 -CheckPoint2: +.global _CheckPoint2 +_CheckPoint2: .ascii "FreeLoader[16-bit]: checking CPU for x64 long mode..." .byte 0x0d, 0x0a, 0 -.global CheckPoint3 -CheckPoint3: +.global _CheckPoint3 +_CheckPoint3: .ascii "FreeLoader: Switching to x64 long mode..." .byte 0x0d, 0x0a, 0 diff --git a/boot/freeldr/freeldr/arch/amd64/boot.S b/boot/freeldr/freeldr/arch/amd64/boot.S index eb3ba3c3c64..ce7bb355c90 100644 --- a/boot/freeldr/freeldr/arch/amd64/boot.S +++ b/boot/freeldr/freeldr/arch/amd64/boot.S @@ -24,14 +24,14 @@ #include -EXTERN(ChainLoadBiosBootSectorCode) +EXTERN(_ChainLoadBiosBootSectorCode) .code64 call x86_64_SwitchToReal .code16 /* Set the boot drive */ - mov dl, BootDrive + mov dl, _BootDrive /* Load segment registers */ cli @@ -46,7 +46,7 @@ EXTERN(ChainLoadBiosBootSectorCode) // ljmpl $0x0000,$0x7C00 jmp 0x7c00:0x0000 -EXTERN(SoftReboot) +EXTERN(_SoftReboot) .code64 call x86_64_SwitchToReal diff --git a/boot/freeldr/freeldr/arch/amd64/drvmap.S b/boot/freeldr/freeldr/arch/amd64/drvmap.S index 6871fe0f62d..d6b081ca60b 100644 --- a/boot/freeldr/freeldr/arch/amd64/drvmap.S +++ b/boot/freeldr/freeldr/arch/amd64/drvmap.S @@ -24,7 +24,7 @@ #include -EXTERN(DriveMapInt13HandlerStart) +EXTERN(_DriveMapInt13HandlerStart) Int13Handler: pushw %bp @@ -82,7 +82,7 @@ CallOldInt13Handler: /* Call old int 13h handler with new drive number */ .byte 0x9a /* lcall */ -EXTERN(DriveMapOldInt13HandlerAddress) +EXTERN(_DriveMapOldInt13HandlerAddress) .word 0 .word 0 @@ -105,7 +105,7 @@ CallersFlags: PassedInDriveNumber: .byte 0 -EXTERN(DriveMapInt13HandlerMapList) +EXTERN(_DriveMapInt13HandlerMapList) Int13HandlerMapCount: .byte 0 @@ -129,4 +129,4 @@ Int13HandlerDrive4: Int13HandlerDriveNew4: .byte 0 -EXTERN(DriveMapInt13HandlerEnd) +EXTERN(_DriveMapInt13HandlerEnd) diff --git a/boot/freeldr/freeldr/arch/amd64/i386cpu.S b/boot/freeldr/freeldr/arch/amd64/i386cpu.S index ee3ee6fe256..6dfb91dbf4a 100644 --- a/boot/freeldr/freeldr/arch/amd64/i386cpu.S +++ b/boot/freeldr/freeldr/arch/amd64/i386cpu.S @@ -33,7 +33,7 @@ * 0x00000400: Found 80486 CPU without CPUID support */ -EXTERN(CpuidSupported) +EXTERN(_CpuidSupported) .code32 pushl %ecx /* save ECX */ @@ -80,7 +80,7 @@ NoCpuid: * VOID GetCpuid(U32 Level, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx); */ -EXTERN(GetCpuid) +EXTERN(_GetCpuid) .code32 pushl %ebp @@ -123,7 +123,7 @@ EXTERN(GetCpuid) * U64 RDTSC(VOID); */ -EXTERN(RDTSC) +EXTERN(_RDTSC) .code32 rdtsc ret diff --git a/boot/freeldr/freeldr/arch/amd64/i386pnp.S b/boot/freeldr/freeldr/arch/amd64/i386pnp.S index 19589275bac..ff0ae71eb1a 100644 --- a/boot/freeldr/freeldr/arch/amd64/i386pnp.S +++ b/boot/freeldr/freeldr/arch/amd64/i386pnp.S @@ -35,7 +35,7 @@ _pnp_bios_entry_point: _pnp_bios_data_segment: .word 0 -EXTERN(PnpBiosSupported) +EXTERN(_PnpBiosSupported) .code64 push rdi @@ -113,7 +113,7 @@ _pnp_node_size: _pnp_node_count: .word 0 -EXTERN(PnpBiosGetDeviceNodeCount) +EXTERN(_PnpBiosGetDeviceNodeCount) .code64 push rbp @@ -182,7 +182,7 @@ _pnp_buffer_offset: _pnp_node_number: .byte 0 -EXTERN(PnpBiosGetDeviceNode) +EXTERN(_PnpBiosGetDeviceNode) .code64 push rbp diff --git a/boot/freeldr/freeldr/arch/amd64/i386trap.S b/boot/freeldr/freeldr/arch/amd64/i386trap.S index 195bf097cd0..833fcc37104 100644 --- a/boot/freeldr/freeldr/arch/amd64/i386trap.S +++ b/boot/freeldr/freeldr/arch/amd64/i386trap.S @@ -273,7 +273,7 @@ i386CommonExceptionHandler: SAVE_CPU_REGS pushl $SCREEN_ATTR - call MachVideoClearScreen + call _MachVideoClearScreen add $4,%esp movl $i386ExceptionHandlerText,%esi @@ -485,7 +485,7 @@ i386PrintChar: pushl $SCREEN_ATTR andl $0xff,%eax pushl %eax - call MachVideoPutChar + call _MachVideoPutChar addl $16,%esp ret diff --git a/boot/freeldr/freeldr/arch/amd64/int386.S b/boot/freeldr/freeldr/arch/amd64/int386.S index a22e409c61c..1c1f2dbdf0a 100644 --- a/boot/freeldr/freeldr/arch/amd64/int386.S +++ b/boot/freeldr/freeldr/arch/amd64/int386.S @@ -63,7 +63,7 @@ Int386_regsout: /* * int Int386(int ivec, REGS* in, REGS* out); */ -EXTERN(Int386) +EXTERN(_Int386) .code64 /* Get the function parameters */ diff --git a/boot/freeldr/freeldr/arch/amd64/loader.c b/boot/freeldr/freeldr/arch/amd64/loader.c index cad77bf48d6..9ca6f858644 100644 --- a/boot/freeldr/freeldr/arch/amd64/loader.c +++ b/boot/freeldr/freeldr/arch/amd64/loader.c @@ -39,6 +39,33 @@ EnableA20() /* Already done */ } +void +DumpLoaderBlock() +{ + DbgPrint("LoaderBlock @ %p.\n", &LoaderBlock); + DbgPrint("Flags = 0x%x.\n", LoaderBlock.Flags); + DbgPrint("MemLower = 0x%p.\n", (PVOID)LoaderBlock.MemLower); + DbgPrint("MemHigher = 0x%p.\n", (PVOID)LoaderBlock.MemHigher); + DbgPrint("BootDevice = 0x%x.\n", LoaderBlock.BootDevice); + DbgPrint("CommandLine = %s.\n", LoaderBlock.CommandLine); + DbgPrint("ModsCount = 0x%x.\n", LoaderBlock.ModsCount); + DbgPrint("ModsAddr = 0x%p.\n", LoaderBlock.ModsAddr); + DbgPrint("Syms = 0x%s.\n", LoaderBlock.Syms); + DbgPrint("MmapLength = 0x%x.\n", LoaderBlock.MmapLength); + DbgPrint("MmapAddr = 0x%p.\n", (PVOID)LoaderBlock.MmapAddr); + DbgPrint("RdLength = 0x%x.\n", LoaderBlock.RdLength); + DbgPrint("RdAddr = 0x%p.\n", (PVOID)LoaderBlock.RdAddr); + DbgPrint("DrivesCount = 0x%x.\n", LoaderBlock.DrivesCount); + DbgPrint("DrivesAddr = 0x%p.\n", (PVOID)LoaderBlock.DrivesAddr); + DbgPrint("ConfigTable = 0x%x.\n", LoaderBlock.ConfigTable); + DbgPrint("BootLoaderName = 0x%x.\n", LoaderBlock.BootLoaderName); + DbgPrint("PageDirectoryStart = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryStart); + DbgPrint("PageDirectoryEnd = 0x%p.\n", (PVOID)LoaderBlock.PageDirectoryEnd); + DbgPrint("KernelBase = 0x%p.\n", (PVOID)LoaderBlock.KernelBase); + DbgPrint("ArchExtra = 0x%p.\n", (PVOID)LoaderBlock.ArchExtra); + +} + /*++ * FrLdrStartup * INTERNAL @@ -59,7 +86,222 @@ VOID NTAPI FrLdrStartup(ULONG Magic) { - DbgPrint("ReactOS loader is unsupported! Halting.\n", KernelEntryPoint); - for(;;); + /* Disable Interrupts */ + _disable(); + + /* Re-initalize EFLAGS */ + __writeeflags(0); + + /* Initialize the page directory */ + FrLdrSetupPageDirectory(); + + /* Set the new PML4 */ + __writecr3((ULONGLONG)pPML4); + + FrLdrSetupGdtIdt(); + + LoaderBlock.FrLdrDbgPrint = DbgPrint; + +// DumpLoaderBlock(); + + DbgPrint("Jumping to kernel @ %p.\n", KernelEntryPoint); + + /* Jump to Kernel */ + (*KernelEntryPoint)(Magic, &LoaderBlock); + +} + +PPAGE_DIRECTORY_AMD64 +FrLdrGetOrCreatePageDir(PPAGE_DIRECTORY_AMD64 pDir, ULONG Index) +{ + PPAGE_DIRECTORY_AMD64 pSubDir; + + if (!pDir) + return NULL; + + if (!pDir->Pde[Index].Valid) + { + pSubDir = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); + if (!pSubDir) + return NULL; + RtlZeroMemory(pSubDir, PAGE_SIZE); + pDir->Pde[Index].PageFrameNumber = PtrToPfn(pSubDir); + pDir->Pde[Index].Valid = 1; + pDir->Pde[Index].Write = 1; + } + else + { + pSubDir = (PPAGE_DIRECTORY_AMD64)((ULONGLONG)(pDir->Pde[Index].PageFrameNumber) * PAGE_SIZE); + } + return pSubDir; +} + +BOOLEAN +FrLdrMapSinglePage(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress) +{ + PPAGE_DIRECTORY_AMD64 pDir3, pDir2, pDir1; + ULONG Index; + + pDir3 = FrLdrGetOrCreatePageDir(pPML4, VAtoPXI(VirtualAddress)); + pDir2 = FrLdrGetOrCreatePageDir(pDir3, VAtoPPI(VirtualAddress)); + pDir1 = FrLdrGetOrCreatePageDir(pDir2, VAtoPDI(VirtualAddress)); + + if (!pDir1) + return FALSE; + + Index = VAtoPTI(VirtualAddress); + if (pDir1->Pde[Index].Valid) + { + return FALSE; + } + + pDir1->Pde[Index].Valid = 1; + pDir1->Pde[Index].Write = 1; + pDir1->Pde[Index].PageFrameNumber = PhysicalAddress / PAGE_SIZE; + + return TRUE; +} + +ULONG +FrLdrMapRangeOfPages(ULONGLONG VirtualAddress, ULONGLONG PhysicalAddress, ULONG cPages) +{ + ULONG i; + + for (i = 0; i < cPages; i++) + { + if (!FrLdrMapSinglePage(VirtualAddress, PhysicalAddress)) + { + return i; + } + VirtualAddress += PAGE_SIZE; + PhysicalAddress += PAGE_SIZE; + } + return i; } + +/*++ + * FrLdrSetupPageDirectory + * INTERNAL + * + * Sets up the ReactOS Startup Page Directory. + * + * Params: + * None. + * + * Returns: + * None. + *--*/ +VOID +FASTCALL +FrLdrSetupPageDirectory(VOID) +{ + ULONG KernelPages; + PVOID UserSharedData; + + /* Allocate a Page for the PML4 */ + pPML4 = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); + + ASSERT(pPML4); + + /* The page tables are located at 0xfffff68000000000 + * We create a recursive self mapping through all 4 levels at + * virtual address 0xfffff6fb7dbedf68 */ + pPML4->Pde[VAtoPXI(PXE_BASE)].Valid = 1; + pPML4->Pde[VAtoPXI(PXE_BASE)].Write = 1; + pPML4->Pde[VAtoPXI(PXE_BASE)].PageFrameNumber = PtrToPfn(pPML4); + + /* Setup low memory pages */ + if (FrLdrMapRangeOfPages(0, 0, 1024) < 1024) + { + DbgPrint("Could not map low memory pages.\n"); + } + + /* Setup kernel pages */ + KernelPages = (ROUND_TO_PAGES(NextModuleBase - KERNEL_BASE_PHYS) / PAGE_SIZE); + if (FrLdrMapRangeOfPages(KernelBase, KERNEL_BASE_PHYS, KernelPages) != KernelPages) + { + DbgPrint("Could not map %d kernel pages.\n", KernelPages); + } + + /* Setup a page for the idt */ + pIdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); + IdtBase = KernelBase + KernelPages * PAGE_SIZE; + if (!FrLdrMapSinglePage(IdtBase, (ULONGLONG)pIdt)) + { + DbgPrint("Could not map idt page.\n", KernelPages); + } + + /* Setup a page for the gdt & tss */ + pGdt = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); + GdtBase = IdtBase + PAGE_SIZE; + TssBase = GdtBase + 20 * sizeof(ULONG64); // FIXME: don't hardcode + if (!FrLdrMapSinglePage(GdtBase, (ULONGLONG)pGdt)) + { + DbgPrint("Could not map gdt page.\n", KernelPages); + } + + /* Setup KUSER_SHARED_DATA page */ + UserSharedData = MmAllocateMemoryWithType(PAGE_SIZE, LoaderSpecialMemory); + if (!FrLdrMapSinglePage(KI_USER_SHARED_DATA, (ULONG64)UserSharedData)) + { + DbgPrint("Could not map KUSER_SHARED_DATA page.\n", KernelPages); + } + + /* Map APIC page */ + if (!FrLdrMapSinglePage(APIC_BASE, APIC_PHYS_BASE)) + { + DbgPrint("Could not map APIC page.\n"); + } + +} + +VOID +FrLdrSetupGdtIdt() +{ + PKGDTENTRY64 Entry; + KDESCRIPTOR Desc; + + RtlZeroMemory(pGdt, PAGE_SIZE); + + /* Setup KGDT_64_R0_CODE */ + Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_CODE); + *(PULONG64)Entry = 0x00209b0000000000ULL; + + /* Setup KGDT_64_R0_SS */ + Entry = KiGetGdtEntry(pGdt, KGDT_64_R0_SS); + *(PULONG64)Entry = 0x00cf93000000ffffULL; + + /* Setup KGDT_64_DATA */ + Entry = KiGetGdtEntry(pGdt, KGDT_64_DATA); + *(PULONG64)Entry = 0x00cff3000000ffffULL; + + /* Setup KGDT_64_R3_CODE */ + Entry = KiGetGdtEntry(pGdt, KGDT_64_R3_CODE); + *(PULONG64)Entry = 0x0020fb0000000000ULL; + + /* Setup KGDT_32_R3_TEB */ + Entry = KiGetGdtEntry(pGdt, KGDT_32_R3_TEB); + *(PULONG64)Entry = 0xff40f3fd50003c00ULL; + + /* Setup TSS entry */ + Entry = KiGetGdtEntry(pGdt, KGDT_TSS); + KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0); + + /* Setup the gdt descriptor */ + Desc.Limit = 12 * sizeof(ULONG64) - 1; + Desc.Base = (PVOID)GdtBase; + + /* Set the new Gdt */ + __lgdt(&Desc.Limit); + DbgPrint("Gdtr.Base = %p\n", Desc.Base); + + /* Setup the idt descriptor */ + Desc.Limit = 12 * sizeof(ULONG64) - 1; + Desc.Base = (PVOID)IdtBase; + + /* Set the new Idt */ + __lidt(&Desc.Limit); + DbgPrint("Idtr.Base = %p\n", Desc.Base); + +} diff --git a/boot/freeldr/freeldr/arch/amd64/mb.S b/boot/freeldr/freeldr/arch/amd64/mb.S index 2d515e90053..368338ed33b 100644 --- a/boot/freeldr/freeldr/arch/amd64/mb.S +++ b/boot/freeldr/freeldr/arch/amd64/mb.S @@ -29,35 +29,35 @@ * This boots the kernel */ .code64 - .globl PageDirectoryStart + .globl _PageDirectoryStart - .globl pml4_startup - .globl pdp_startup - .globl pd_startup + .globl _pml4_startup + .globl _pdp_startup + .globl _pd_startup - .globl PageDirectoryEnd + .globl _PageDirectoryEnd // // Boot information structure // -EXTERN(reactos_memory_map_descriptor_size) +EXTERN(_reactos_memory_map_descriptor_size) .long 0 -EXTERN(reactos_memory_map) +EXTERN(_reactos_memory_map) .rept (32 * /*sizeof(memory_map_t)*/24) .byte 0 .endr .bss -PageDirectoryStart: -pml4_startup: +_PageDirectoryStart: +_pml4_startup: .fill 4096, 1, 0 -pdp_startup: +_pdp_startup: .fill 4096, 1, 0 -pd_startup: +_pd_startup: .fill 4096, 1, 0 -PageDirectoryEnd: +_PageDirectoryEnd: diff --git a/boot/freeldr/freeldr/arch/i386/hardware.c b/boot/freeldr/freeldr/arch/i386/hardware.c index 97577aa020c..d4654ccd138 100644 --- a/boot/freeldr/freeldr/arch/i386/hardware.c +++ b/boot/freeldr/freeldr/arch/i386/hardware.c @@ -452,23 +452,7 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) SectorCount = Geometry.Sectors; } else - { - DPRINTM(DPRINT_HWDETECT, "Using legacy sector size detection\n"); - - /* Fall back to legacy detection */ - if (DrivePartition == 0xff) - { - /* This is a CD-ROM device */ - SectorSize = 2048; - } - else - { - /* This is either a floppy disk device (DrivePartition == 0) or - * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but - * it doesn't matter which one because they both have 512 bytes per sector */ - SectorSize = 512; - } - } + return EINVAL; if (DrivePartition != 0xff && DrivePartition != 0) { @@ -1435,10 +1419,10 @@ DetectSerialPorts(PCONFIGURATION_COMPONENT_DATA BusKey) /* Set Interrupt */ PartialDescriptor = &PartialResourceList->PartialDescriptors[1]; PartialDescriptor->Type = CmResourceTypeInterrupt; - PartialDescriptor->ShareDisposition = CmResourceShareShared; + PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialDescriptor->u.Interrupt.Level = Irq[i]; - PartialDescriptor->u.Interrupt.Vector = Irq[i]; + PartialDescriptor->u.Interrupt.Vector = 0; PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; /* Set serial data (device specific) */ @@ -1545,7 +1529,7 @@ DetectParallelPorts(PCONFIGURATION_COMPONENT_DATA BusKey) PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialDescriptor->u.Interrupt.Level = Irq[i]; - PartialDescriptor->u.Interrupt.Vector = Irq[i]; + PartialDescriptor->u.Interrupt.Vector = 0; PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; } @@ -1731,7 +1715,7 @@ DetectKeyboardController(PCONFIGURATION_COMPONENT_DATA BusKey) PartialDescriptor->ShareDisposition = CmResourceShareUndetermined; PartialDescriptor->Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialDescriptor->u.Interrupt.Level = 1; - PartialDescriptor->u.Interrupt.Vector = 1; + PartialDescriptor->u.Interrupt.Vector = 0; PartialDescriptor->u.Interrupt.Affinity = 0xFFFFFFFF; /* Set IO Port 0x60 */ @@ -1903,7 +1887,7 @@ DetectPS2Mouse(PCONFIGURATION_COMPONENT_DATA BusKey) PartialResourceList.PartialDescriptors[0].ShareDisposition = CmResourceShareUndetermined; PartialResourceList.PartialDescriptors[0].Flags = CM_RESOURCE_INTERRUPT_LATCHED; PartialResourceList.PartialDescriptors[0].u.Interrupt.Level = 12; - PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 12; + PartialResourceList.PartialDescriptors[0].u.Interrupt.Vector = 0; PartialResourceList.PartialDescriptors[0].u.Interrupt.Affinity = 0xFFFFFFFF; /* Create controller key */ diff --git a/boot/freeldr/freeldr/arch/i386/machpc.c b/boot/freeldr/freeldr/arch/i386/machpc.c index 1b985f28c4d..74f3e22ee4c 100644 --- a/boot/freeldr/freeldr/arch/i386/machpc.c +++ b/boot/freeldr/freeldr/arch/i386/machpc.c @@ -45,6 +45,7 @@ PcMachInit(const char *CmdLine) MachVtbl.PrepareForReactOS = PcPrepareForReactOS; MachVtbl.GetMemoryMap = PcMemGetMemoryMap; MachVtbl.DiskGetBootPath = DiskGetBootPath; + MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskReadLogicalSectors = PcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PcDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = PcDiskGetCacheableBlockCount; diff --git a/boot/freeldr/freeldr/arch/i386/machxbox.c b/boot/freeldr/freeldr/arch/i386/machxbox.c index 704a7ae91cc..442c7be2f1d 100644 --- a/boot/freeldr/freeldr/arch/i386/machxbox.c +++ b/boot/freeldr/freeldr/arch/i386/machxbox.c @@ -48,6 +48,7 @@ XboxMachInit(const char *CmdLine) MachVtbl.PrepareForReactOS = XboxPrepareForReactOS; MachVtbl.GetMemoryMap = XboxMemGetMemoryMap; MachVtbl.DiskGetBootPath = DiskGetBootPath; + MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskReadLogicalSectors = XboxDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = XboxDiskGetDriveGeometry; MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount; diff --git a/boot/freeldr/freeldr/arch/i386/miscboot.c b/boot/freeldr/freeldr/arch/i386/miscboot.c index 1f30141ce7f..e0aa98cfd50 100644 --- a/boot/freeldr/freeldr/arch/i386/miscboot.c +++ b/boot/freeldr/freeldr/arch/i386/miscboot.c @@ -44,6 +44,12 @@ VOID LoadAndBootBootSector(PCSTR OperatingSystemName) return; } + if (!MachDiskNormalizeSystemPath(FileName, sizeof(FileName))) + { + UiMessageBox("Invalid path to boot sector file"); + return; + } + FilePointer = FsOpenFile(FileName); if (!FilePointer) { diff --git a/boot/freeldr/freeldr/arch/i386/xboxhw.c b/boot/freeldr/freeldr/arch/i386/xboxhw.c index ff325b3dd49..5c7680b17ae 100644 --- a/boot/freeldr/freeldr/arch/i386/xboxhw.c +++ b/boot/freeldr/freeldr/arch/i386/xboxhw.c @@ -138,20 +138,7 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId) if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition)) return EINVAL; - - if (DrivePartition == 0xff) - { - /* This is a CD-ROM device */ - SectorSize = 2048; - } - else - { - /* This is either a floppy disk device (DrivePartition == 0) or - * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but - * it doesn't matter which one because they both have 512 bytes per sector */ - SectorSize = 512; - } - + SectorSize = (DrivePartition == 0xff ? 2048 : 512); if (DrivePartition != 0xff && DrivePartition != 0) { if (!XboxDiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry)) diff --git a/boot/freeldr/freeldr/arch/powerpc/mach.c b/boot/freeldr/freeldr/arch/powerpc/mach.c index 9abd56bca53..57cacd27675 100644 --- a/boot/freeldr/freeldr/arch/powerpc/mach.c +++ b/boot/freeldr/freeldr/arch/powerpc/mach.c @@ -440,6 +440,7 @@ void PpcDefaultMachVtbl() MachVtbl.GetMemoryMap = PpcGetMemoryMap; + MachVtbl.DiskNormalizeSystemPath = DiskNormalizeSystemPath; MachVtbl.DiskGetBootPath = PpcDiskGetBootPath; MachVtbl.DiskReadLogicalSectors = PpcDiskReadLogicalSectors; MachVtbl.DiskGetDriveGeometry = PpcDiskGetDriveGeometry; diff --git a/boot/freeldr/freeldr/disk/disk.c b/boot/freeldr/freeldr/disk/disk.c index b7ce3295497..16ee1be7ad9 100644 --- a/boot/freeldr/freeldr/disk/disk.c +++ b/boot/freeldr/freeldr/disk/disk.c @@ -107,80 +107,62 @@ DiskGetBootPath(char *BootPath, unsigned Size) { static char Path[] = "multi(0)disk(0)"; char Device[4]; - char Partition[4]; - PARTITION_TABLE_ENTRY PartitionEntry; - MASTER_BOOT_RECORD MasterBootRecord; - - if (BootDrive < 0x80) + + _itoa(BootDrive, Device, 10); + if (Size <= sizeof(Path) + 6 + strlen(Device)) { - /* This is a floppy */ - - if (Size <= sizeof(Path) + 7 + strlen(Device)) - { - return FALSE; - } - - strcpy(BootPath, Path); - - strcat(BootPath, "fdisk"); + return FALSE; + } + strcpy(BootPath, Path); + strcat(BootPath, BootDrive < 0x80 ? "fdisk" : "cdrom"); + strcat(strcat(strcat(BootPath, "("), Device), ")"); + + if (strcmp(BootPath, "multi(0)disk(0)cdrom(128)") == 0) + strcpy(BootPath, "multi(0)disk(0)rdisk(0)partition(1)"); + return TRUE; +} - _itoa(BootDrive, Device, 10); - strcat(BootPath, "("); - strcat(BootPath, Device); - strcat(BootPath, ")"); +BOOLEAN +DiskNormalizeSystemPath(char *SystemPath, unsigned Size) +{ + CHAR BootPath[256]; + ULONG PartitionNumber; + ULONG DriveNumber; + PARTITION_TABLE_ENTRY PartEntry; + char *p; + + if (!DissectArcPath(SystemPath, BootPath, &DriveNumber, &PartitionNumber)) + { + return FALSE; } - /* FIXME */ - else if (DiskReadBootRecord(BootDrive, 0, &MasterBootRecord)) + + if (0 != PartitionNumber) { - /* This is a hard disk */ - - if (!DiskGetActivePartitionEntry(BootDrive, &PartitionEntry, &BootPartition)) - { - DbgPrint("Invalid active partition information\n"); - return FALSE; - } - - if (Size <= sizeof(Path) + 18 + strlen(Device) + strlen(Partition)) - { - return FALSE; - } - - strcpy(BootPath, Path); - - strcat(BootPath, "rdisk"); - - _itoa(BootDrive - 0x80, Device, 10); - strcat(BootPath, "("); - strcat(BootPath, Device); - strcat(BootPath, ")"); - - _itoa(BootPartition, Partition, 10); - strcat(BootPath, "partition("); - strcat(BootPath, Partition); - strcat(BootPath, ")"); - } - else + return TRUE; + } + + if (! DiskGetActivePartitionEntry(DriveNumber, + &PartEntry, + &PartitionNumber) || + PartitionNumber < 1 || 9 < PartitionNumber) { - /* This is a CD-ROM drive */ - - if (Size <= sizeof(Path) + 7 + strlen(Device)) - { - return FALSE; - } - - strcpy(BootPath, Path); - - strcat(BootPath, "cdrom"); - - _itoa(BootDrive - 0x80, Device, 10); - strcat(BootPath, "("); - strcat(BootPath, Device); - strcat(BootPath, ")"); + return FALSE; } - + + p = SystemPath; + while ('\0' != *p && 0 != _strnicmp(p, "partition(", 10)) { + p++; + } + p = strchr(p, ')'); + if (NULL == p || '0' != *(p - 1)) { + return FALSE; + } + *(p - 1) = '0' + PartitionNumber; + return TRUE; } + // This function is in arch/i386/i386disk.c //VOID DiskStopFloppyMotor(VOID) diff --git a/boot/freeldr/freeldr/disk/partition.c b/boot/freeldr/freeldr/disk/partition.c index b93b2e17b2a..8966e67187a 100644 --- a/boot/freeldr/freeldr/disk/partition.c +++ b/boot/freeldr/freeldr/disk/partition.c @@ -197,6 +197,7 @@ BOOLEAN DiskGetFirstExtendedPartitionEntry(PMASTER_BOOT_RECORD MasterBootRecord, BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMASTER_BOOT_RECORD BootRecord) { + char ErrMsg[64]; ULONG Index; // Read master boot record @@ -230,6 +231,9 @@ BOOLEAN DiskReadBootRecord(ULONG DriveNumber, ULONGLONG LogicalSectorNumber, PMA // Check the partition table magic value if (BootRecord->MasterBootRecordMagic != 0xaa55) { + sprintf(ErrMsg, "Invalid partition table magic 0x%x found on drive 0x%lx", + BootRecord->MasterBootRecordMagic, DriveNumber); + DiskError(ErrMsg, 0); return FALSE; } diff --git a/boot/freeldr/freeldr/freeldr_arch.rbuild b/boot/freeldr/freeldr/freeldr_arch.rbuild index 6aa231c258a..2b8a8b288ab 100644 --- a/boot/freeldr/freeldr/freeldr_arch.rbuild +++ b/boot/freeldr/freeldr/freeldr_arch.rbuild @@ -1,5 +1,5 @@ - + include cache diff --git a/boot/freeldr/freeldr/freeldr_base.rbuild b/boot/freeldr/freeldr/freeldr_base.rbuild index a8b784baf9b..c8c2ab113c1 100644 --- a/boot/freeldr/freeldr/freeldr_base.rbuild +++ b/boot/freeldr/freeldr/freeldr_base.rbuild @@ -23,9 +23,7 @@ disk.c partition.c ramdisk.c - - scsiport.c - + scsiport.c ext2.c diff --git a/boot/freeldr/freeldr/include/arch/amd64/amd64.h b/boot/freeldr/freeldr/include/arch/amd64/amd64.h index 9068e00f90a..af46178d9db 100644 --- a/boot/freeldr/freeldr/include/arch/amd64/amd64.h +++ b/boot/freeldr/freeldr/include/arch/amd64/amd64.h @@ -45,7 +45,7 @@ #define HYPERSPACE_BASE 0xfffff70000000000ULL #define HAL_BASE 0xffffffff80000000ULL -#define APIC_BASE 0xFFFFFFFFFFFE0000ULL +#define APIC_BASE 0xfffffffffee00000ULL // FIXME #define APIC_PHYS_BASE 0xfee00000 diff --git a/boot/freeldr/freeldr/include/disk.h b/boot/freeldr/freeldr/include/disk.h index 191ee1215d6..daaaa495e55 100644 --- a/boot/freeldr/freeldr/include/disk.h +++ b/boot/freeldr/freeldr/include/disk.h @@ -127,6 +127,7 @@ extern ULONG BootDrive; extern ULONG BootPartition; BOOLEAN DiskGetBootPath(char *BootPath, unsigned Size); +BOOLEAN DiskNormalizeSystemPath(char *SystemPath, unsigned Size); /////////////////////////////////////////////////////////////////////////////////////// diff --git a/boot/freeldr/freeldr/include/machine.h b/boot/freeldr/freeldr/include/machine.h index 65952056faa..0c0076f4760 100644 --- a/boot/freeldr/freeldr/include/machine.h +++ b/boot/freeldr/freeldr/include/machine.h @@ -62,6 +62,7 @@ typedef struct tagMACHVTBL ULONG (*GetMemoryMap)(PBIOS_MEMORY_MAP BiosMemoryMap, ULONG MaxMemoryMapSize); BOOLEAN (*DiskGetBootPath)(char *BootPath, unsigned Size); + BOOLEAN (*DiskNormalizeSystemPath)(char *SystemPath, unsigned Size); BOOLEAN (*DiskReadLogicalSectors)(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer); BOOLEAN (*DiskGetDriveGeometry)(ULONG DriveNumber, PGEOMETRY DriveGeometry); ULONG (*DiskGetCacheableBlockCount)(ULONG DriveNumber); diff --git a/boot/freeldr/freeldr/linuxboot.c b/boot/freeldr/freeldr/linuxboot.c index 5aea40c2427..10c2017eb0c 100644 --- a/boot/freeldr/freeldr/linuxboot.c +++ b/boot/freeldr/freeldr/linuxboot.c @@ -97,6 +97,13 @@ VOID LoadAndBootLinux(PCSTR OperatingSystemName, PCSTR Description) goto LinuxBootFailed; } + // Open the boot volume + if (!MachDiskNormalizeSystemPath(LinuxBootPath, sizeof(LinuxBootPath))) + { + UiMessageBox("Invalid boot path"); + goto LinuxBootFailed; + } + // Open the kernel LinuxKernel = FsOpenFile(LinuxKernelName); if (!LinuxKernel) diff --git a/boot/freeldr/freeldr/machine.c b/boot/freeldr/freeldr/machine.c index c898bf49430..9021a7c57a7 100644 --- a/boot/freeldr/freeldr/machine.c +++ b/boot/freeldr/freeldr/machine.c @@ -37,6 +37,7 @@ #undef MachBeep #undef MachPrepareForReactOS #undef MachDiskGetBootPath +#undef MachDiskNormalizeSystemPath #undef MachDiskReadLogicalSectors #undef MachDiskGetDriveGeometry #undef MachDiskGetCacheableBlockCount @@ -151,6 +152,12 @@ MachDiskGetBootPath(char *BootPath, unsigned Size) return MachVtbl.DiskGetBootPath(BootPath, Size); } +BOOLEAN +MachDiskNormalizeSystemPath(char *SystemPath, unsigned Size) +{ + return MachVtbl.DiskNormalizeSystemPath(SystemPath, Size); +} + BOOLEAN MachDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) { diff --git a/boot/freeldr/freeldr/reactos/arcname.c b/boot/freeldr/freeldr/reactos/arcname.c index 4b7f97addb6..3ca69fadb51 100644 --- a/boot/freeldr/freeldr/reactos/arcname.c +++ b/boot/freeldr/freeldr/reactos/arcname.c @@ -60,7 +60,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B if (p == NULL) return FALSE; p++; - *BootPartition = 0; + *BootPartition = 0xff; } else if (_strnicmp(p, "cdrom(", 6) == 0) { @@ -69,7 +69,7 @@ BOOLEAN DissectArcPath(CHAR *ArcPath, CHAR *BootPath, ULONG* BootDrive, ULONG* B * multi(0)disk(0)cdrom(x)\path */ p = p + 6; - *BootDrive = atoi(p) + 0x80; + *BootDrive = atoi(p); p = strchr(p, ')'); if (p == NULL) return FALSE; diff --git a/boot/freeldr/freeldr/reactos/reactos.c b/boot/freeldr/freeldr/reactos/reactos.c index 81b654b84b9..12c8c6647e4 100644 --- a/boot/freeldr/freeldr/reactos/reactos.c +++ b/boot/freeldr/freeldr/reactos/reactos.c @@ -718,6 +718,12 @@ LoadAndBootReactOS(PCSTR OperatingSystemName) } else { + if (! MachDiskNormalizeSystemPath(SystemPath, + sizeof(SystemPath))) + { + UiMessageBox("Invalid system path"); + return; + } /* copy system path into kernel command line */ strcpy(reactos_kernel_cmdline, SystemPath); } diff --git a/boot/freeldr/freeldr/windows/amd64/wlmemory.c b/boot/freeldr/freeldr/windows/amd64/wlmemory.c index 5f979c4ca7b..3e3288a682a 100644 --- a/boot/freeldr/freeldr/windows/amd64/wlmemory.c +++ b/boot/freeldr/freeldr/windows/amd64/wlmemory.c @@ -252,36 +252,28 @@ WinLdrSetupGdt(PVOID GdtBase, ULONG64 TssBase) PKGDTENTRY64 Entry; KDESCRIPTOR GdtDesc; - /* Setup KGDT64_NULL */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_NULL); - *(PULONG64)Entry = 0x0000000000000000ULL; - - /* Setup KGDT64_R0_CODE */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_CODE); + /* Setup KGDT_64_R0_CODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_CODE); *(PULONG64)Entry = 0x00209b0000000000ULL; - /* Setup KGDT64_R0_DATA */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_R0_DATA); + /* Setup KGDT_64_R0_SS */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_R0_SS); *(PULONG64)Entry = 0x00cf93000000ffffULL; - /* Setup KGDT64_R3_CMCODE */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMCODE); - *(PULONG64)Entry = 0x00cffb000000ffffULL; - - /* Setup KGDT64_R3_DATA */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_DATA); + /* Setup KGDT_64_DATA */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_DATA); *(PULONG64)Entry = 0x00cff3000000ffffULL; - /* Setup KGDT64_R3_CODE */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CODE); + /* Setup KGDT_64_R3_CODE */ + Entry = KiGetGdtEntry(GdtBase, KGDT_64_R3_CODE); *(PULONG64)Entry = 0x0020fb0000000000ULL; - /* Setup KGDT64_R3_CMTEB */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_R3_CMTEB); + /* Setup KGDT_32_R3_TEB */ + Entry = KiGetGdtEntry(GdtBase, KGDT_32_R3_TEB); *(PULONG64)Entry = 0xff40f3fd50003c00ULL; /* Setup TSS entry */ - Entry = KiGetGdtEntry(GdtBase, KGDT64_SYS_TSS); + Entry = KiGetGdtEntry(GdtBase, KGDT_TSS); KiInitGdtEntry(Entry, TssBase, sizeof(KTSS), I386_TSS, 0); /* Setup GDT descriptor */ @@ -341,8 +333,15 @@ WinLdrSetProcessorContext(PVOID GdtIdt, IN ULONG64 Pcr, IN ULONG64 Tss) /* LDT is unused */ // __lldt(0); + /* Load selectors for DS/ES/FS/GS/SS */ + Ke386SetDs(KGDT_64_DATA | RPL_MASK); // 0x2b + Ke386SetEs(KGDT_64_DATA | RPL_MASK); // 0x2b + Ke386SetFs(KGDT_32_R3_TEB | RPL_MASK); // 0x53 + Ke386SetGs(KGDT_64_DATA | RPL_MASK); // 0x2b + Ke386SetSs(KGDT_64_R0_SS); // 0x18 + /* Load TSR */ - __ltr(KGDT64_SYS_TSS); + __ltr(KGDT_TSS); DPRINTM(DPRINT_WINDOWS, "leave WinLdrSetProcessorContext\n"); } diff --git a/dll/cpl/desk/appearance.c b/dll/cpl/desk/appearance.c index c3c21d4cd13..9a09169283b 100644 --- a/dll/cpl/desk/appearance.c +++ b/dll/cpl/desk/appearance.c @@ -1,4 +1,5 @@ -/* +/* $Id$ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Display Control Panel * FILE: lib/cpl/desk/appearance.c @@ -485,17 +486,11 @@ AppearancePage_OnDestroy(HWND hwndDlg, GLOBALS *g) return TRUE; } -static void -UpdateSelectedThemeId(HWND hwndDlg, GLOBALS *g) -{ - int sel; - sel = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETCURSEL, 0, 0); - g->Theme.Id = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)sel, 0); -} INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { + INT i; GLOBALS *g; LPNMHDR lpnm; @@ -543,7 +538,8 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PropSheet_Changed(GetParent(hwndDlg), hwndDlg); g->Theme.bHasChanged = TRUE; - UpdateSelectedThemeId(hwndDlg, g); + i = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETCURSEL, 0, 0); + g->Theme.Id = SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_COLORSCHEME, CB_GETITEMDATA, (WPARAM)i, 0); LoadThemeFromReg(g); //SendDlgItemMessage(hwndDlg, IDC_APPEARANCE_PREVIEW, WM_PAINT, 0, 0); } @@ -561,7 +557,6 @@ AppearancePageProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case PSN_APPLY: if (g->Theme.bHasChanged) { - UpdateSelectedThemeId(hwndDlg, g); ApplyTheme(g); } return TRUE; diff --git a/dll/cpl/desk/background.c b/dll/cpl/desk/background.c index c03c66dc4a4..fe4362a30a2 100644 --- a/dll/cpl/desk/background.c +++ b/dll/cpl/desk/background.c @@ -94,17 +94,14 @@ AddListViewItems(HWND hwndDlg, PGLOBAL_DATA pGlobalData) ZeroMemory(&listItem, sizeof(LV_ITEM)); listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - listItem.state = 0; + listItem.state = LVIS_SELECTED; listItem.pszText = backgroundItem->szDisplayName; listItem.iImage = -1; listItem.iItem = pGlobalData->listViewItemCount; listItem.lParam = pGlobalData->listViewItemCount; (void)ListView_InsertItem(hwndBackgroundList, &listItem); - ListView_SetItemState(hwndBackgroundList, - pGlobalData->listViewItemCount, - LVIS_SELECTED, - LVIS_SELECTED); + ListView_SetItemState(hwndBackgroundList, pGlobalData->listViewItemCount, LVIS_SELECTED, LVIS_SELECTED); pGlobalData->listViewItemCount++; @@ -146,17 +143,14 @@ AddListViewItems(HWND hwndDlg, PGLOBAL_DATA pGlobalData) ZeroMemory(&listItem, sizeof(LV_ITEM)); listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - listItem.state = 0; + listItem.state = LVIS_SELECTED; listItem.pszText = backgroundItem->szDisplayName; listItem.iImage = sfi.iIcon; listItem.iItem = pGlobalData->listViewItemCount; listItem.lParam = pGlobalData->listViewItemCount; (void)ListView_InsertItem(hwndBackgroundList, &listItem); - ListView_SetItemState(hwndBackgroundList, - pGlobalData->listViewItemCount, - LVIS_SELECTED, - LVIS_SELECTED); + ListView_SetItemState(hwndBackgroundList, pGlobalData->listViewItemCount, LVIS_SELECTED, LVIS_SELECTED); pGlobalData->listViewItemCount++; } @@ -460,17 +454,13 @@ OnBrowseButton(HWND hwndDlg, PGLOBAL_DATA pGlobalData) ZeroMemory(&listItem, sizeof(LV_ITEM)); listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE | LVIF_IMAGE; - listItem.state = 0; + listItem.state = LVIS_SELECTED; listItem.pszText = backgroundItem->szDisplayName; listItem.iImage = sfi.iIcon; listItem.iItem = pGlobalData->listViewItemCount; listItem.lParam = pGlobalData->listViewItemCount; (void)ListView_InsertItem(hwndBackgroundList, &listItem); - ListView_SetItemState(hwndBackgroundList, - pGlobalData->listViewItemCount, - LVIS_SELECTED, - LVIS_SELECTED); SendMessage(hwndBackgroundList, WM_VSCROLL, SB_BOTTOM, 0); pGlobalData->listViewItemCount++; diff --git a/dll/cpl/desk/effappdlg.c b/dll/cpl/desk/effappdlg.c index 3a7c8b4e0e3..6fd0ac7ba8d 100644 --- a/dll/cpl/desk/effappdlg.c +++ b/dll/cpl/desk/effappdlg.c @@ -1,4 +1,5 @@ -/* +/* $Id: effappdlg.c 24836 2007-02-12 03:12:56Z tkreuzer $ + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Display Control Panel * FILE: dll/cpl/desk/effappdlg.c diff --git a/dll/cpl/sysdm/lang/uk-UA.rc b/dll/cpl/sysdm/lang/uk-UA.rc index 651a167d1ea..408f6511dc6 100644 --- a/dll/cpl/sysdm/lang/uk-UA.rc +++ b/dll/cpl/sysdm/lang/uk-UA.rc @@ -58,6 +58,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1 BEGIN GROUPBOX "²íôîðìàö³ÿ ïðî âåðñ³þ",IDC_STATIC,6,3,210,73 CONTROL "Ïîçíà÷èòè ÿê ðîáî÷ó ñòàíö³þ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 + CONTROL "Ïîçíà÷èòè ÿê ðîáî÷ó ñòàíö³þ",IDC_REPORTASWORKSTATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,57,88,10 LTEXT "ReactOS áóäóºòüñÿ ÿê ñåðâåðíà ÎÑ. Îáðàòè ïðàïîðåöü, ùîá çì³íèòè ëèøå öåé äîäàòîê.",IDC_STATIC,15,15,183,41 PUSHBUTTON "OK",IDOK,166,83,50,14 END diff --git a/dll/directx/bdaplgin/pincontrol.cpp b/dll/directx/bdaplgin/pincontrol.cpp index 2571abbf866..4420b76e16b 100644 --- a/dll/directx/bdaplgin/pincontrol.cpp +++ b/dll/directx/bdaplgin/pincontrol.cpp @@ -336,7 +336,6 @@ CBDAPinControl_fnConstructor( if (SUCCEEDED(hr)) { // register device filter - OutputDebugStringW(L"CBDAPinControl_fnConstructor registering device filter with network provider\n"); hr = pNetworkProvider->RegisterDeviceFilter(pUnknown, &RegistrationCtx); if (SUCCEEDED(hr)) { @@ -362,6 +361,7 @@ CBDAPinControl_fnConstructor( WCHAR Buffer[100]; swprintf(Buffer, L"CBDAPinControl_fnConstructor failed to register filter with %lx\n", hr); OutputDebugStringW(Buffer); + DebugBreak(); } } } diff --git a/dll/directx/ksproxy/allocator.cpp b/dll/directx/ksproxy/allocator.cpp index 8229bd2f56e..e7c4b1f2436 100644 --- a/dll/directx/ksproxy/allocator.cpp +++ b/dll/directx/ksproxy/allocator.cpp @@ -357,7 +357,6 @@ CKsAllocator::GetBuffer( if (!m_FreeList.empty()) { - OutputDebugStringW(L"CKsAllocator::GetBuffer HACK\n"); Sample = m_FreeList.top(); m_FreeList.pop(); } diff --git a/dll/directx/ksproxy/enumpins.cpp b/dll/directx/ksproxy/enumpins.cpp index da07796d066..a6c3bdfbd16 100644 --- a/dll/directx/ksproxy/enumpins.cpp +++ b/dll/directx/ksproxy/enumpins.cpp @@ -71,6 +71,7 @@ CEnumPins::QueryInterface( OutputDebugStringW(Buffer); CoTaskMemFree(lpstr); +DebugBreak(); return E_NOINTERFACE; } diff --git a/dll/directx/ksproxy/input_pin.cpp b/dll/directx/ksproxy/input_pin.cpp index e56eacb938c..51b78726ccb 100644 --- a/dll/directx/ksproxy/input_pin.cpp +++ b/dll/directx/ksproxy/input_pin.cpp @@ -700,6 +700,7 @@ CInputPin::Receive(IMediaSample *pSample) { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Receive NotImplemented\n"); + DebugBreak(); #endif return E_NOTIMPL; @@ -711,6 +712,7 @@ CInputPin::ReceiveMultiple(IMediaSample **pSamples, long nSamples, long *nSample { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ReceiveMultiple NotImplemented\n"); + DebugBreak(); #endif return E_NOTIMPL; @@ -722,6 +724,7 @@ CInputPin::ReceiveCanBlock( void) { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ReceiveCanBlock NotImplemented\n"); + DebugBreak(); #endif return S_FALSE; @@ -920,6 +923,7 @@ CInputPin::KsQualityNotify( OutputDebugStringW(L"CInputPin::KsQualityNotify NotImplemented\n"); #endif + DebugBreak(); return E_NOTIMPL; } @@ -1110,6 +1114,7 @@ CInputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::Connect NotImplemented\n"); + DebugBreak(); #endif return NOERROR; } @@ -1194,6 +1199,7 @@ CInputPin::ConnectionMediaType(AM_MEDIA_TYPE *pmt) #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::ConnectionMediaType NotImplemented\n"); + DebugBreak(); #endif return E_NOTIMPL; @@ -1490,6 +1496,7 @@ CInputPin::CreatePin( WCHAR Buffer[100]; swprintf(Buffer, L"CInputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); OutputDebugStringW(Buffer); + DebugBreak(); #endif hr = E_FAIL; } @@ -1622,6 +1629,7 @@ CInputPin::CreatePinHandle( { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n"); + DebugBreak(); #endif return hr; } @@ -1632,6 +1640,7 @@ CInputPin::CreatePinHandle( { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n"); + DebugBreak(); #endif return hr; } @@ -1774,6 +1783,7 @@ CInputPin::LoadProxyPlugins( { // store plugin m_Plugins.push_back(pUnknown); +DebugBreak(); } // close key RegCloseKey(hSubKey); diff --git a/dll/directx/ksproxy/mediasample.cpp b/dll/directx/ksproxy/mediasample.cpp index 28270cdc3bd..e0411938444 100644 --- a/dll/directx/ksproxy/mediasample.cpp +++ b/dll/directx/ksproxy/mediasample.cpp @@ -21,6 +21,7 @@ public: STDMETHODIMP_(ULONG) Release() { InterlockedDecrement(&m_Ref); + DebugBreak(); if (!m_Ref) { if (m_Allocator) @@ -279,6 +280,7 @@ STDMETHODCALLTYPE CMediaSample::SetMediaType(AM_MEDIA_TYPE *pMediaType) { OutputDebugStringW(L"CMediaSample::SetMediaType NotImplemented\n"); + DebugBreak(); return E_NOTIMPL; } diff --git a/dll/directx/ksproxy/output_pin.cpp b/dll/directx/ksproxy/output_pin.cpp index 2bf85c8a06b..17f07804a20 100644 --- a/dll/directx/ksproxy/output_pin.cpp +++ b/dll/directx/ksproxy/output_pin.cpp @@ -246,16 +246,8 @@ COutputPin::COutputPin( ZeroMemory(m_FramingProp, sizeof(m_FramingProp)); ZeroMemory(m_FramingEx, sizeof(m_FramingEx)); - ZeroMemory(&m_MediaFormat, sizeof(AM_MEDIA_TYPE)); hr = KsGetMediaType(0, &m_MediaFormat, KsObjectParent->KsGetObjectHandle(), m_PinId); - -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::COutputPin Format %p pbFormat %lu\n", &m_MediaFormat, m_MediaFormat.cbFormat); - OutputDebugStringW(Buffer); -#endif - assert(hr == S_OK); InitializeCriticalSection(&m_Lock); @@ -1526,8 +1518,6 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) HRESULT hr; ALLOCATOR_PROPERTIES Properties; IMemAllocatorCallbackTemp *pMemCallback; - LPGUID pGuid; - ULONG NumGuids = 0; #ifdef KSPROXY_TRACE WCHAR Buffer[200]; @@ -1550,20 +1540,6 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) pmt = &m_MediaFormat; } - if (m_hPin == INVALID_HANDLE_VALUE) - { - hr = CreatePin(pmt); - if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - swprintf(Buffer, L"COutputPin::Connect CreatePin handle failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif - return hr; - } - } - - // query for IMemInput interface hr = pReceivePin->QueryInterface(IID_IMemInputPin, (void**)&m_MemInputPin); if (FAILED(hr)) @@ -1572,6 +1548,7 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) OutputDebugStringW(L"COutputPin::Connect no IMemInputPin interface\n"); #endif + DebugBreak(); return hr; } @@ -1672,24 +1649,10 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) return hr; } - - assert(m_hPin != INVALID_HANDLE_VALUE); - - // get all supported sets - if (m_Plugins.size() == 0) + if (!m_hPin) { - if (GetSupportedSets(&pGuid, &NumGuids)) - { - // load all proxy plugins - if (FAILED(LoadProxyPlugins(pGuid, NumGuids))); - { -#ifdef KSPROXY_TRACE - OutputDebugStringW(L"COutputPin::Connect LoadProxyPlugins failed\n"); -#endif - } - // free sets - CoTaskMemFree(pGuid); - } + //FIXME create pin handle + assert(0); } // receive connection; @@ -1983,26 +1946,13 @@ COutputPin::CreatePin( // query for pin medium hr = KsQueryMediums(&MediumList); if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::CreatePin KsQueryMediums failed %lx\n", hr); - OutputDebugStringW(Buffer); -#endif return hr; - } // query for pin interface hr = KsQueryInterfaces(&InterfaceList); if (FAILED(hr)) { // failed -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::CreatePin KsQueryInterfaces failed %lx\n", hr); - OutputDebugStringW(Buffer); -#endif - CoTaskMemFree(MediumList); return hr; } @@ -2053,12 +2003,6 @@ COutputPin::CreatePin( CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::CreatePin failed to create interface handler %lx\n", hr); - OutputDebugStringW(Buffer); -#endif - return hr; } @@ -2066,12 +2010,7 @@ COutputPin::CreatePin( hr = InterfaceHandler->KsSetPin((IKsPin*)this); if (FAILED(hr)) { - // failed to initialize interface handler plugin -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::CreatePin failed to initialize interface handler %lx\n", hr); - OutputDebugStringW(Buffer); -#endif + // failed to load interface handler plugin InterfaceHandler->Release(); CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); @@ -2088,6 +2027,7 @@ COutputPin::CreatePin( WCHAR Buffer[100]; swprintf(Buffer, L"COutputPin::CreatePin unexpected communication %u %s\n", m_Communication, m_PinName); OutputDebugStringW(Buffer); + DebugBreak(); #endif hr = E_FAIL; @@ -2097,12 +2037,6 @@ COutputPin::CreatePin( CoTaskMemFree(MediumList); CoTaskMemFree(InterfaceList); -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::CreatePin Result %lx\n", hr); - OutputDebugStringW(Buffer); -#endif - return hr; } @@ -2124,14 +2058,11 @@ COutputPin::CreatePinHandle( //KSPROPERTY Property; //ULONG BytesReturned; - OutputDebugStringW(L"COutputPin::CreatePinHandle\n"); - if (m_hPin != INVALID_HANDLE_VALUE) { // pin already exists //CloseHandle(m_hPin); //m_hPin = INVALID_HANDLE_VALUE; - OutputDebugStringW(L"COutputPin::CreatePinHandle pin already exists\n"); return S_OK; } @@ -2144,10 +2075,9 @@ COutputPin::CreatePinHandle( if (!PinConnect) { // failed - OutputDebugStringW(L"COutputPin::CreatePinHandle out of memory\n"); return E_OUTOFMEMORY; } - OutputDebugStringW(L"COutputPin::CreatePinHandle copy pinconnect\n"); + // setup request CopyMemory(&PinConnect->Interface, Interface, sizeof(KSPIN_INTERFACE)); CopyMemory(&PinConnect->Medium, Medium, sizeof(KSPIN_MEDIUM)); @@ -2158,7 +2088,7 @@ COutputPin::CreatePinHandle( // get dataformat offset DataFormat = (PKSDATAFORMAT)(PinConnect + 1); - OutputDebugStringW(L"COutputPin::CreatePinHandle copy format\n"); + // copy data format DataFormat->FormatSize = sizeof(KSDATAFORMAT) + pmt->cbFormat; DataFormat->Flags = 0; @@ -2171,19 +2101,13 @@ COutputPin::CreatePinHandle( if (pmt->cbFormat) { // copy extended format - WCHAR Buffer[100]; - swprintf(Buffer, L"COutputPin::CreatePinHandle copy format %p pbFormat %lu\n", pmt, pmt->cbFormat); - OutputDebugStringW(Buffer); CopyMemory((DataFormat + 1), pmt->pbFormat, pmt->cbFormat); } // get IKsObject interface hr = m_ParentFilter->QueryInterface(IID_IKsObject, (LPVOID*)&KsObjectParent); if (FAILED(hr)) - { - OutputDebugStringW(L"COutputPin::CreatePinHandle no IID_IKsObject interface\n"); return hr; - } // get parent filter handle hFilter = KsObjectParent->KsGetObjectHandle(); @@ -2192,19 +2116,13 @@ COutputPin::CreatePinHandle( KsObjectParent->Release(); if (!hFilter) - { - OutputDebugStringW(L"COutputPin::CreatePinHandle no filter handle\n"); return E_HANDLE; - } - OutputDebugStringW(L"COutputPin::CreatePinHandle before creating pin\n"); // create pin - DWORD dwError = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); + hr = KsCreatePin(hFilter, PinConnect, GENERIC_READ, &m_hPin); - if (dwError == ERROR_SUCCESS) + if (SUCCEEDED(hr)) { - OutputDebugStringW(L"COutputPin::CreatePinHandle created pin\n"); - // store current interface / medium CopyMemory(&m_Medium, Medium, sizeof(KSPIN_MEDIUM)); CopyMemory(&m_Interface, Interface, sizeof(KSPIN_INTERFACE)); @@ -2255,14 +2173,42 @@ COutputPin::CreatePinHandle( if (FAILED(InitializeIOThread())) { OutputDebugStringW(L"COutputPin::CreatePinHandle failed to initialize i/o thread\n"); + DebugBreak(); + } + + LPGUID pGuid; + ULONG NumGuids = 0; + + // get all supported sets + hr = GetSupportedSets(&pGuid, &NumGuids); + if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + OutputDebugStringW(L"CInputPin::CreatePinHandle GetSupportedSets failed\n"); + DebugBreak(); +#endif + return hr; } + // load all proxy plugins + hr = LoadProxyPlugins(pGuid, NumGuids); + if (FAILED(hr)) + { +#ifdef KSPROXY_TRACE + OutputDebugStringW(L"CInputPin::CreatePinHandle LoadProxyPlugins failed\n"); + DebugBreak(); +#endif + return hr; + } + + // free sets + CoTaskMemFree(pGuid); + + //TODO // connect pin pipes } - else - OutputDebugStringW(L"COutputPin::CreatePinHandle failed to create pin\n"); // free pin connect CoTaskMemFree(PinConnect); @@ -2392,6 +2338,7 @@ COutputPin::LoadProxyPlugins( { // store plugin m_Plugins.push_back(pUnknown); +DebugBreak(); } // close key RegCloseKey(hSubKey); @@ -2410,48 +2357,17 @@ COutputPin::IoProcessRoutine() IMediaSample *Sample; LONG SampleCount; HRESULT hr; - PKSSTREAM_SEGMENT * StreamSegment; + PKSSTREAM_SEGMENT StreamSegment; HANDLE hEvent; - IMediaSample ** Samples; - LONG NumHandles; - DWORD dwStatus; + IMediaSample * Samples[1]; #ifdef KSPROXY_TRACE WCHAR Buffer[200]; #endif - NumHandles = m_Properties.cBuffers / 2; - - if (!NumHandles) - NumHandles = 8; - - assert(NumHandles); - - //allocate stream segment array - StreamSegment = (PKSSTREAM_SEGMENT*)CoTaskMemAlloc(sizeof(PKSSTREAM_SEGMENT) * NumHandles); - if (!StreamSegment) - { - OutputDebugStringW(L"COutputPin::IoProcessRoutine out of memory\n"); - return E_FAIL; - } - - // allocate handle array - Samples = (IMediaSample**)CoTaskMemAlloc(sizeof(IMediaSample*) * NumHandles); - if (!Samples) - { - OutputDebugStringW(L"COutputPin::IoProcessRoutine out of memory\n"); - return E_FAIL; - } - - // zero handles array - ZeroMemory(StreamSegment, sizeof(PKSSTREAM_SEGMENT) * NumHandles); - ZeroMemory(Samples, sizeof(IMediaSample*) * NumHandles); - // first wait for the start event to signal WaitForSingleObject(m_hStartEvent, INFINITE); - m_IoCount = 0; - assert(m_InterfaceHandler); do { @@ -2476,14 +2392,14 @@ COutputPin::IoProcessRoutine() // fill buffer SampleCount = 1; - Samples[m_IoCount] = Sample; + Samples[0] = Sample; Sample->SetTime(NULL, NULL); hr = m_InterfaceHandler->KsProcessMediaSamples(NULL, /* FIXME */ - &Samples[m_IoCount], + Samples, &SampleCount, KsIoOperation_Read, - &StreamSegment[m_IoCount]); + &StreamSegment); if (FAILED(hr) || !StreamSegment) { #ifdef KSPROXY_TRACE @@ -2493,26 +2409,14 @@ COutputPin::IoProcessRoutine() break; } - // interface handle should increment pending i/o count - assert(m_IoCount >= 1); - - swprintf(Buffer, L"COutputPin::IoProcessRoutine m_IoCount %lu NumHandles %lu\n", m_IoCount, NumHandles); - OutputDebugStringW(Buffer); - - if (m_IoCount != NumHandles) - continue; - - // get completion handle - hEvent = StreamSegment[0]->CompletionEvent; + // get completion event + hEvent = StreamSegment->CompletionEvent; // wait for i/o completion - dwStatus = WaitForSingleObject(hEvent, INFINITE); - - swprintf(Buffer, L"COutputPin::IoProcessRoutine dwStatus %lx Error %lx NumHandles %lu\n", dwStatus, GetLastError(), NumHandles); - OutputDebugStringW(Buffer); + WaitForSingleObject(hEvent, INFINITE); // perform completion - m_InterfaceHandler->KsCompleteIo(StreamSegment[0]); + m_InterfaceHandler->KsCompleteIo(StreamSegment); // close completion event CloseHandle(hEvent); @@ -2522,7 +2426,7 @@ COutputPin::IoProcessRoutine() assert(m_MemInputPin); // now deliver the sample - hr = m_MemInputPin->Receive(Samples[0]); + hr = m_MemInputPin->Receive(Sample); #ifdef KSPROXY_TRACE swprintf(Buffer, L"COutputPin::IoProcessRoutine PinName %s IMemInputPin::Receive hr %lx Sample %p m_MemAllocator %p\n", m_PinName, hr, Sample, m_MemAllocator); @@ -2534,11 +2438,6 @@ COutputPin::IoProcessRoutine() Sample = NULL; } - - //circular stream segment array - RtlMoveMemory(StreamSegment, &StreamSegment[1], sizeof(PKSSTREAM_SEGMENT) * (NumHandles - 1)); - RtlMoveMemory(Samples, &Samples[1], sizeof(IMediaSample*) * (NumHandles - 1)); - }while(TRUE); // signal end of i/o thread diff --git a/dll/directx/ksproxy/precomp.h b/dll/directx/ksproxy/precomp.h index f7268b1e026..eae5de0f1aa 100644 --- a/dll/directx/ksproxy/precomp.h +++ b/dll/directx/ksproxy/precomp.h @@ -3,7 +3,7 @@ #define _FORCENAMELESSUNION #define BUILDING_KS #define _KSDDK_ -#define KSPROXY_TRACE +//#define KSPROXY_TRACE #include //#include #include diff --git a/dll/directx/ksproxy/proxy.cpp b/dll/directx/ksproxy/proxy.cpp index 175eff205ca..bd34ec8184b 100644 --- a/dll/directx/ksproxy/proxy.cpp +++ b/dll/directx/ksproxy/proxy.cpp @@ -1954,6 +1954,7 @@ CKsProxy::IsDirty() { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::IsDirty Notimplemented\n"); + DebugBreak(); #endif return E_NOTIMPL; } @@ -2034,6 +2035,7 @@ CKsProxy::Load( }while(Length > 0); + DebugBreak(); return S_OK; } @@ -2057,6 +2059,7 @@ CKsProxy::GetSizeMax( { #ifdef KSPROXY_TRACE OutputDebugStringW(L"CKsProxy::GetSizeMax Notimplemented\n"); + DebugBreak(); #endif return E_NOTIMPL; @@ -2477,50 +2480,23 @@ CKsProxy::CreatePins() // query current instance count hr = GetPinInstanceCount(Index, &Instances); if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins GetPinInstanceCount failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif continue; - } - // query pin communication; hr = GetPinCommunication(Index, &Communication); if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins GetPinCommunication failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif continue; - } if (Instances.CurrentCount == Instances.PossibleCount) { // already maximum reached for this pin -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins Instances.CurrentCount == Instances.PossibleCount\n"); - OutputDebugStringW(Buffer); -#endif continue; } // get direction of pin hr = GetPinDataflow(Index, &DataFlow); if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins GetPinDataflow failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif continue; - } if (DataFlow == KSPIN_DATAFLOW_IN) hr = GetPinName(Index, DataFlow, InputPin, &PinName); @@ -2528,14 +2504,7 @@ CKsProxy::CreatePins() hr = GetPinName(Index, DataFlow, OutputPin, &PinName); if (FAILED(hr)) - { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins GetPinName failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif continue; - } // construct the pins if (DataFlow == KSPIN_DATAFLOW_IN) @@ -2543,11 +2512,6 @@ CKsProxy::CreatePins() hr = CInputPin_Constructor((IBaseFilter*)this, PinName, m_hDevice, Index, Communication, IID_IPin, (void**)&pPin); if (FAILED(hr)) { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins CInputPin_Constructor failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif CoTaskMemFree(PinName); continue; } @@ -2558,11 +2522,6 @@ CKsProxy::CreatePins() hr = COutputPin_Constructor((IBaseFilter*)this, PinName, Index, Communication, IID_IPin, (void**)&pPin); if (FAILED(hr)) { -#ifdef KSPROXY_TRACE - WCHAR Buffer[100]; - swprintf(Buffer, L"CKsProxy::CreatePins COutputPin_Constructor failed with %lx\n", hr); - OutputDebugStringW(Buffer); -#endif CoTaskMemFree(PinName); continue; } @@ -2668,12 +2627,9 @@ CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog) hr = LoadProxyPlugins(pGuid, NumGuids); if (FAILED(hr)) { -#if 0 //HACK CloseHandle(m_hDevice); m_hDevice = NULL; return hr; -#endif - OutputDebugStringW(L"CKsProxy::LoadProxyPlugins failed!\n"); } // free sets @@ -2682,14 +2638,6 @@ CKsProxy::Load(IPropertyBag *pPropBag, IErrorLog *pErrorLog) // now create the input / output pins hr = CreatePins(); -#ifdef KSPROXY_TRACE - swprintf(Buffer, L"CKsProxy::Load CreatePins %lx\n", hr); - OutputDebugStringW(Buffer); -#endif - - //HACK - hr = S_OK; - return hr; } @@ -3038,6 +2986,10 @@ STDMETHODCALLTYPE CKsProxy::EnumPins( IEnumPins **ppEnum) { +#ifdef KSPROXY_TRACE + OutputDebugStringW(L"CKsProxy::EnumPins\n"); +#endif + return CEnumPins_fnConstructor(m_Pins, IID_IEnumPins, (void**)ppEnum); } diff --git a/dll/directx/msdvbnp/enumpins.cpp b/dll/directx/msdvbnp/enumpins.cpp index 9466aaae8f3..567705907b7 100644 --- a/dll/directx/msdvbnp/enumpins.cpp +++ b/dll/directx/msdvbnp/enumpins.cpp @@ -155,6 +155,14 @@ CEnumPins_fnConstructor( { CEnumPins * handler = new CEnumPins(NumPins, pins); +#ifdef MSDVBNP_TRACE + WCHAR Buffer[MAX_PATH]; + LPOLESTR lpstr; + StringFromCLSID(riid, &lpstr); + swprintf(Buffer, L"CEnumPins_fnConstructor riid %s pUnknown %p\n", lpstr, pUnknown); + OutputDebugStringW(Buffer); +#endif + if (!handler) return E_OUTOFMEMORY; diff --git a/dll/directx/msdvbnp/msdvbnp.cpp b/dll/directx/msdvbnp/msdvbnp.cpp index 9c1d309a500..b67f232e13f 100644 --- a/dll/directx/msdvbnp/msdvbnp.cpp +++ b/dll/directx/msdvbnp/msdvbnp.cpp @@ -9,14 +9,10 @@ #include "precomp.h" -#ifndef _MSC_VER -const GUID KSCATEGORY_BDA_NETWORK_PROVIDER = {0x71985f4b, 0x1ca1, 0x11d3, {0x9c, 0xc8, 0x0, 0xc0, 0x4f, 0x79, 0x71, 0xe0}}; -#endif - static INTERFACE_TABLE InterfaceTable[] = { - {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor, L"ReactOS DVBT Network Provider"}, - {NULL, NULL, NULL} + {&CLSID_DVBTNetworkProvider, CNetworkProvider_fnConstructor}, + {NULL, NULL} }; extern "C" @@ -57,19 +53,8 @@ DllUnregisterServer(void) HRESULT hr = S_OK; HKEY hClass; - - hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr); - if (FAILED(hr)) - return hr; - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_SET_VALUE, &hClass) != ERROR_SUCCESS) - { - CoTaskMemFree(pStr); return E_FAIL; - } - - RegDeleteKeyW(hClass, pStr); - CoTaskMemFree(pStr); do { @@ -86,24 +71,6 @@ DllUnregisterServer(void) return hr; } -VOID -RegisterBDAComponent( - HKEY hFilter, - LPCWSTR ComponentClsid, - LPCWSTR ComponentName) -{ - HKEY hComp; - - // create network provider filter key - if (RegCreateKeyExW(hFilter, ComponentClsid, 0, NULL, 0, KEY_WRITE, NULL, &hComp, NULL) == ERROR_SUCCESS) - { - // store class id - RegSetValueExW(hComp, L"CLSID", 0, REG_SZ, (const BYTE*)ComponentClsid, (wcslen(ComponentClsid)+1) * sizeof(WCHAR)); - RegSetValueExW(hComp, L"FriendlyName", 0, REG_SZ, (const BYTE*)ComponentName, (wcslen(ComponentName)+1) * sizeof(WCHAR)); - RegCloseKey(hComp); - } -} - extern "C" KSDDKAPI HRESULT @@ -113,50 +80,12 @@ DllRegisterServer(void) ULONG Index = 0; LPOLESTR pStr; HRESULT hr = S_OK; - HKEY hClass, hKey, hSubKey, hProvider, hInstance, hFilter; + HKEY hClass, hKey, hSubKey; static LPCWSTR ModuleName = L"msdvbnp.ax"; static LPCWSTR ThreadingModel = L"Both"; - hr = StringFromCLSID(KSCATEGORY_BDA_NETWORK_PROVIDER, &pStr); - if (FAILED(hr)) - return hr; - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"CLSID", 0, KEY_WRITE, &hClass) != ERROR_SUCCESS) - { - CoTaskMemFree(pStr); - return E_FAIL; - } - - if (RegCreateKeyExW(hClass, pStr, 0, NULL, 0, KEY_WRITE, NULL, &hProvider, NULL) != ERROR_SUCCESS) - { - RegCloseKey(hClass); - CoTaskMemFree(pStr); - return E_FAIL; - } - - CoTaskMemFree(pStr); - - if (RegCreateKeyExW(hProvider, L"Instance", 0, NULL, 0, KEY_WRITE, NULL, &hInstance, NULL) != ERROR_SUCCESS) - { - RegCloseKey(hClass); - return E_FAIL; - } - RegCloseKey(hProvider); - - /* open active movie filter category key */ - if (RegCreateKeyExW(hClass, L"{da4e3da0-d07d-11d0-bd50-00a0c911ce86}\\Instance", 0, NULL, 0, KEY_WRITE, NULL, &hFilter, NULL) != ERROR_SUCCESS) - { - RegCloseKey(hClass); - RegCloseKey(hInstance); return E_FAIL; - } - - RegisterBDAComponent(hFilter, L"{71985F4A-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Playback Filter"); - RegisterBDAComponent(hFilter, L"{71985F4B-1CA1-11D3-9CC8-00C04F7971E0}", L"BDA Network Providers"); - RegisterBDAComponent(hFilter, L"{71985F48-1CA1-11d3-9CC8-00C04F7971E0}", L"BDA Source Filter"); - RegisterBDAComponent(hFilter, L"{A2E3074F-6C3D-11D3-B653-00C04F79498E}", L"BDA Transport Information Renderers"); - RegisterBDAComponent(hFilter, L"{FD0A5AF4-B41D-11d2-9C95-00C04F7971E0}", L"BDA Receiver Component"); - RegCloseKey(hKey); do { @@ -175,23 +104,11 @@ DllRegisterServer(void) RegCloseKey(hKey); } - if (RegCreateKeyExW(hInstance, InterfaceTable[Index].ProviderName, 0, 0, 0, KEY_WRITE, NULL, &hKey, 0) == ERROR_SUCCESS) - { - //FIXME filterdata - RegSetValueExW(hKey, L"FriendlyName", 0, REG_SZ, (const BYTE*)InterfaceTable[Index].ProviderName, (wcslen(InterfaceTable[Index].ProviderName) + 1) * sizeof(WCHAR)); - RegSetValueExW(hKey, L"CLSID", 0, REG_SZ, (const BYTE*)pStr, (wcslen(pStr)+1) * sizeof(WCHAR)); - RegCloseKey(hKey); - } - - - - CoTaskMemFree(pStr); Index++; }while(InterfaceTable[Index].lpfnCI != 0); RegCloseKey(hClass); - RegCloseKey(hInstance); return hr; } diff --git a/dll/directx/msdvbnp/precomp.h b/dll/directx/msdvbnp/precomp.h index 828cfb47202..c9abe7ac000 100644 --- a/dll/directx/msdvbnp/precomp.h +++ b/dll/directx/msdvbnp/precomp.h @@ -28,7 +28,6 @@ typedef struct { const GUID* riid; LPFNCREATEINSTANCE lpfnCI; - LPCWSTR ProviderName; } INTERFACE_TABLE; /* classfactory.cpp */ diff --git a/dll/directx/qedit/samplegrabber.c b/dll/directx/qedit/samplegrabber.c index 78a7306e10e..1875c51c49e 100644 --- a/dll/directx/qedit/samplegrabber.c +++ b/dll/directx/qedit/samplegrabber.c @@ -854,7 +854,7 @@ SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSi static HRESULT WINAPI SampleGrabber_ISampleGrabber_GetCurrentSample(ISampleGrabber *iface, IMediaSample **sample) { - /* MS doesn't implement it either, no one should call it */ + /* MS doesn't implement it either, noone should call it */ WARN("(%p): not implemented\n", sample); return E_NOTIMPL; } @@ -1264,7 +1264,7 @@ SampleGrabber_IPin_EnumMediaTypes(IPin *iface, IEnumMediaTypes **mtypes) TRACE("(%p)->(%p)\n", This, mtypes); if (!mtypes) return E_POINTER; - *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : NULL); + *mtypes = mediaenum_create(This->sg->pin_in.pair ? &This->sg->mtype : (const AM_MEDIA_TYPE *)NULL); return *mtypes ? S_OK : E_OUTOFMEMORY; } diff --git a/dll/directx/quartz/avidec.c b/dll/directx/quartz/avidec.c index 8469bbc9f29..68b1908d6e6 100644 --- a/dll/directx/quartz/avidec.c +++ b/dll/directx/quartz/avidec.c @@ -203,7 +203,7 @@ static HRESULT AVIDec_ConnectInput(InputPin *pin, const AM_MEDIA_TYPE * pmt) bmi = &format2->bmiHeader; else goto failed; - TRACE("Fourcc: %s\n", debugstr_an((const char *)&pmt->subtype.Data1, 4)); + TRACE("Fourcc: %s\n", debugstr_an((char *)&pmt->subtype.Data1, 4)); This->hvid = ICLocate(pmt->majortype.Data1, pmt->subtype.Data1, bmi, NULL, ICMODE_DECOMPRESS); if (This->hvid) diff --git a/dll/directx/quartz/avisplit.c b/dll/directx/quartz/avisplit.c index 42ec2ae2b34..faa844b4848 100644 --- a/dll/directx/quartz/avisplit.c +++ b/dll/directx/quartz/avisplit.c @@ -692,7 +692,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE amt.formattype = FORMAT_WaveFormatEx; break; default: - FIXME("fccType %.4s not handled yet\n", (const char *)&pStrHdr->fccType); + FIXME("fccType %.4s not handled yet\n", (char *)&pStrHdr->fccType); amt.formattype = FORMAT_None; } amt.majortype = MEDIATYPE_Video; @@ -793,7 +793,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE TRACE("bIndexSubType: %hd\n", pIndex->bIndexSubType); TRACE("bIndexType: %hd\n", pIndex->bIndexType); TRACE("nEntriesInUse: %u\n", pIndex->nEntriesInUse); - TRACE("dwChunkId: %.4s\n", (const char *)&pIndex->dwChunkId); + TRACE("dwChunkId: %.4s\n", (char *)&pIndex->dwChunkId); if (pIndex->dwReserved[0]) TRACE("dwReserved[0]: %u\n", pIndex->dwReserved[0]); if (pIndex->dwReserved[2]) diff --git a/dll/ntdll/ldr/utils.c b/dll/ntdll/ldr/utils.c index 14512194832..9dcb99960ef 100644 --- a/dll/ntdll/ldr/utils.c +++ b/dll/ntdll/ldr/utils.c @@ -1518,7 +1518,7 @@ LdrpGetOrLoadModule(PWCHAR SearchPath, if (!NT_SUCCESS(Status)) { ULONG ErrorResponse; - ULONG_PTR ErrorParameter = (ULONG_PTR)&AnsiDllName; + ULONG_PTR ErrorParameter = (ULONG_PTR)&DllName; DPRINT1("failed to load %wZ\n", &DllName); diff --git a/dll/win32/activeds/activeds.spec b/dll/win32/activeds/activeds.spec index 2b458342493..63625d5d022 100644 --- a/dll/win32/activeds/activeds.spec +++ b/dll/win32/activeds/activeds.spec @@ -6,7 +6,7 @@ 8 stub ADsBuildVarArrayInt 9 stdcall ADsOpenObject(wstr wstr wstr long ptr ptr) 12 stub ADsSetLastError -13 stdcall ADsGetLastError(ptr ptr long ptr long) +13 stub ADsGetLastError 14 stub AllocADsMem 15 stdcall FreeADsMem(ptr) 16 stub ReallocADsMem diff --git a/dll/win32/activeds/activeds_main.c b/dll/win32/activeds/activeds_main.c index 2fa4ec73d80..9c03ac16d68 100644 --- a/dll/win32/activeds/activeds_main.c +++ b/dll/win32/activeds/activeds_main.c @@ -94,15 +94,6 @@ HRESULT WINAPI ADsOpenObject(LPCWSTR lpszPathName, LPCWSTR lpszUserName, LPCWSTR return E_NOTIMPL; } -/***************************************************** - * ADsGetLastError [ACTIVEDS.13] - */ -HRESULT WINAPI ADsGetLastError(LPDWORD perror, LPWSTR errorbuf, DWORD errorbuflen, LPWSTR namebuf, DWORD namebuflen) -{ - FIXME("(%p,%p,%d,%p,%d)!stub\n", perror, errorbuf, errorbuflen, namebuf, namebuflen); - return E_NOTIMPL; -} - /***************************************************** * FreeADsMem [ACTIVEDS.15] */ diff --git a/dll/win32/actxprxy/actxprxy.rbuild b/dll/win32/actxprxy/actxprxy.rbuild index c8b28ca5891..f5272b585cf 100644 --- a/dll/win32/actxprxy/actxprxy.rbuild +++ b/dll/win32/actxprxy/actxprxy.rbuild @@ -31,6 +31,7 @@ actxprxy_ocmm.idl actxprxy_servprov.idl - actxprxy_urlhist.idl + actxprxy_urlhist.idl + diff --git a/dll/win32/atl/atl_ax.c b/dll/win32/atl/atl_ax.c index 616713ce62b..2afc7460328 100644 --- a/dll/win32/atl/atl_ax.c +++ b/dll/win32/atl/atl_ax.c @@ -950,7 +950,7 @@ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink); - hRes = CLSIDFromString( lpszName, &controlId ); + hRes = CLSIDFromString( (LPOLESTR) lpszName, &controlId ); if ( FAILED(hRes) ) hRes = CLSIDFromProgID( lpszName, &controlId ); if ( SUCCEEDED( hRes ) ) diff --git a/dll/win32/avifil32/rsrc.rc b/dll/win32/avifil32/rsrc.rc index b13fcb93e42..d86578c5a6b 100644 --- a/dll/win32/avifil32/rsrc.rc +++ b/dll/win32/avifil32/rsrc.rc @@ -1,7 +1,7 @@ /* * Top level resource file for avifil32.dll * - * Copyright 2002 Michael Günnewig + * Copyright 2002 Michael Günnewig * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,6 +18,10 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winver.h" #include "avifile_private.h" LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/dll/win32/cabinet/fdi.c b/dll/win32/cabinet/fdi.c index b68ab15acd8..de64f025bd3 100644 --- a/dll/win32/cabinet/fdi.c +++ b/dll/win32/cabinet/fdi.c @@ -77,7 +77,7 @@ THOSE_ZIP_CONSTS; struct fdi_file { struct fdi_file *next; /* next file in sequence */ - LPSTR filename; /* output name of file */ + LPCSTR filename; /* output name of file */ int fh; /* open file handle or NULL */ cab_ULONG length; /* uncompressed length of file */ cab_ULONG offset; /* uncompressed offset in folder */ @@ -2301,7 +2301,7 @@ static void free_decompression_mem(HFDI hfdi, } while (CAB(firstfile)) { file = CAB(firstfile); - if (file->filename) PFDI_FREE(hfdi, file->filename); + if (file->filename) PFDI_FREE(hfdi, (void *)file->filename); CAB(firstfile) = CAB(firstfile)->next; PFDI_FREE(hfdi, file); } diff --git a/dll/win32/comdlg32/filedlg.c b/dll/win32/comdlg32/filedlg.c index 64cb3935ab2..58b57ccbbac 100644 --- a/dll/win32/comdlg32/filedlg.c +++ b/dll/win32/comdlg32/filedlg.c @@ -176,7 +176,7 @@ static SIZE MemDialogSize = { 0, 0}; /* keep size of the (resizable) dialog */ /* Internal functions used by the dialog */ static LRESULT FILEDLG95_ResizeControls(HWND hwnd, WPARAM wParam, LPARAM lParam); static LRESULT FILEDLG95_FillControls(HWND hwnd, WPARAM wParam, LPARAM lParam); -static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam); +static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam); static LRESULT FILEDLG95_OnWMGetIShellBrowser(HWND hwnd); static BOOL FILEDLG95_OnOpen(HWND hwnd); static LRESULT FILEDLG95_InitControls(HWND hwnd); @@ -240,7 +240,7 @@ static BOOL GetFileName95(FileOpenDlgInfos *fodInfos) { LRESULT lRes; - LPVOID template; + LPCVOID template; HRSRC hRes; HANDLE hDlgTmpl = 0; HRESULT hr; @@ -991,7 +991,7 @@ static LRESULT FILEDLG95_OnWMGetMMI( HWND hwnd, LPMINMAXINFO mmiptr) * vertically or horizontally to get out of the way. Only the "grip" * is moved in both directions to stay in the corner. */ -static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam) +static LRESULT FILEDLG95_OnWMSize(HWND hwnd, WPARAM wParam, LPARAM lParam) { RECT rc, rcview; int chgx, chgy; @@ -1223,11 +1223,11 @@ INT_PTR CALLBACK FileOpenDlgProc95(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM l return 0; } case WM_SIZE: - return FILEDLG95_OnWMSize(hwnd, wParam); + return FILEDLG95_OnWMSize(hwnd, wParam, lParam); case WM_GETMINMAXINFO: return FILEDLG95_OnWMGetMMI( hwnd, (LPMINMAXINFO)lParam); case WM_COMMAND: - return FILEDLG95_OnWMCommand(hwnd, wParam); + return FILEDLG95_OnWMCommand(hwnd, wParam, lParam); case WM_DRAWITEM: { switch(((LPDRAWITEMSTRUCT)lParam)->CtlID) @@ -1733,7 +1733,7 @@ void FILEDLG95_Clean(HWND hwnd) * * WM_COMMAND message handler */ -static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam) +static LRESULT FILEDLG95_OnWMCommand(HWND hwnd, WPARAM wParam, LPARAM lParam) { WORD wNotifyCode = HIWORD(wParam); /* notification code */ WORD wID = LOWORD(wParam); /* item, control, or accelerator identifier */ @@ -3799,7 +3799,7 @@ BOOL FD32_GetTemplate(PFD31_DATA lfs) /*********************************************************************** * FD32_WMMeasureItem [internal] */ -static LONG FD32_WMMeasureItem(LPARAM lParam) +static LONG FD32_WMMeasureItem(HWND hWnd, WPARAM wParam, LPARAM lParam) { LPMEASUREITEMSTRUCT lpmeasure; @@ -3832,7 +3832,7 @@ static INT_PTR CALLBACK FD32_FileOpenDlgProc(HWND hWnd, UINT wMsg, return FD31_WMInitDialog(hWnd, wParam, lParam); case WM_MEASUREITEM: - return FD32_WMMeasureItem(lParam); + return FD32_WMMeasureItem(hWnd, wParam, lParam); case WM_DRAWITEM: return FD31_WMDrawItem(hWnd, wParam, lParam, !lfs->open, (DRAWITEMSTRUCT *)lParam); diff --git a/dll/win32/comdlg32/fontdlg.c b/dll/win32/comdlg32/fontdlg.c index 80f1ad9345b..1ad881c72d2 100644 --- a/dll/win32/comdlg32/fontdlg.c +++ b/dll/win32/comdlg32/fontdlg.c @@ -766,7 +766,7 @@ static LRESULT CFn_WMInitDialog(HWND hDlg, LPARAM lParam, LPCHOOSEFONTW lpcf) /*********************************************************************** * CFn_WMMeasureItem [internal] */ -static LRESULT CFn_WMMeasureItem(HWND hDlg, LPARAM lParam) +static LRESULT CFn_WMMeasureItem(HWND hDlg, WPARAM wParam, LPARAM lParam) { HDC hdc; HFONT hfontprev; @@ -794,7 +794,7 @@ static LRESULT CFn_WMMeasureItem(HWND hDlg, LPARAM lParam) /*********************************************************************** * CFn_WMDrawItem [internal] */ -static LRESULT CFn_WMDrawItem(LPARAM lParam) +static LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam) { HBRUSH hBrush; WCHAR buffer[40]; @@ -1190,9 +1190,9 @@ static INT_PTR CALLBACK FormatCharDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg,lParam); + return CFn_WMMeasureItem(hDlg, wParam, lParam); case WM_DRAWITEM: - return CFn_WMDrawItem(lParam); + return CFn_WMDrawItem(hDlg, wParam, lParam); case WM_COMMAND: return CFn_WMCommand(hDlg, wParam, lParam, lpcfw); case WM_DESTROY: @@ -1239,9 +1239,9 @@ static INT_PTR CALLBACK FormatCharDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_MEASUREITEM: - return CFn_WMMeasureItem(hDlg, lParam); + return CFn_WMMeasureItem(hDlg, wParam, lParam); case WM_DRAWITEM: - return CFn_WMDrawItem(lParam); + return CFn_WMDrawItem(hDlg, wParam, lParam); case WM_COMMAND: return CFn_WMCommand(hDlg, wParam, lParam, lpcf); case WM_DESTROY: diff --git a/dll/win32/comdlg32/printdlg.c b/dll/win32/comdlg32/printdlg.c index 74a06ffa3d5..f653251ed16 100644 --- a/dll/win32/comdlg32/printdlg.c +++ b/dll/win32/comdlg32/printdlg.c @@ -1504,7 +1504,7 @@ static LRESULT PRINTDLG_WMInitDialogW(HWND hDlg, * PRINTDLG_WMCommand [internal] */ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, - PRINT_PTRA* PrintStructures) + LPARAM lParam, PRINT_PTRA* PrintStructures) { LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; @@ -1658,7 +1658,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, } static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, - PRINT_PTRW* PrintStructures) + LPARAM lParam, PRINT_PTRW* PrintStructures) { LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; @@ -1846,7 +1846,7 @@ static INT_PTR CALLBACK PrintDlgProcA(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_COMMAND: - return PRINTDLG_WMCommandA(hDlg, wParam, PrintStructures); + return PRINTDLG_WMCommandA(hDlg, wParam, lParam, PrintStructures); case WM_DESTROY: DestroyIcon(PrintStructures->hCollateIcon); @@ -1892,7 +1892,7 @@ static INT_PTR CALLBACK PrintDlgProcW(HWND hDlg, UINT uMsg, WPARAM wParam, switch (uMsg) { case WM_COMMAND: - return PRINTDLG_WMCommandW(hDlg, wParam, PrintStructures); + return PRINTDLG_WMCommandW(hDlg, wParam, lParam, PrintStructures); case WM_DESTROY: DestroyIcon(PrintStructures->hCollateIcon); diff --git a/dll/win32/crypt32/base64.c b/dll/win32/crypt32/base64.c index 7a23dd9a111..4a6504a488e 100644 --- a/dll/win32/crypt32/base64.c +++ b/dll/win32/crypt32/base64.c @@ -99,7 +99,8 @@ static LONG encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep, TRACE("bytes is %d, pad bytes is %d\n", bytes, pad_bytes); needed = bytes + pad_bytes + 1; - needed += (needed / 64 + 1) * strlen(sep); + if (sep) + needed += (needed / 64 + 1) * strlen(sep); if (needed > *out_len) { @@ -116,7 +117,7 @@ static LONG encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep, i = 0; while (div > 0) { - if (i && i % 64 == 0) + if (sep && i && i % 64 == 0) { strcpy(ptr, sep); ptr += strlen(sep); @@ -162,7 +163,8 @@ static LONG encodeBase64A(const BYTE *in_buf, int in_len, LPCSTR sep, *ptr++ = '='; break; } - strcpy(ptr, sep); + if (sep) + strcpy(ptr, sep); return ERROR_SUCCESS; } @@ -178,7 +180,7 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, if (dwFlags & CRYPT_STRING_NOCR) sep = lf; else if (dwFlags & CRYPT_STRING_NOCRLF) - sep = ""; + sep = NULL; else sep = crlf; switch (dwFlags & 0x0fffffff) @@ -202,6 +204,8 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, charsNeeded = 0; encodeBase64A(pbBinary, cbBinary, sep, NULL, &charsNeeded); + if (sep) + charsNeeded += strlen(sep); if (header) charsNeeded += strlen(header) + strlen(sep); if (trailer) @@ -215,8 +219,11 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, { strcpy(ptr, header); ptr += strlen(ptr); - strcpy(ptr, sep); - ptr += strlen(sep); + if (sep) + { + strcpy(ptr, sep); + ptr += strlen(sep); + } } encodeBase64A(pbBinary, cbBinary, sep, ptr, &size); ptr += size - 1; @@ -224,8 +231,11 @@ static BOOL BinaryToBase64A(const BYTE *pbBinary, { strcpy(ptr, trailer); ptr += strlen(ptr); - strcpy(ptr, sep); - ptr += strlen(sep); + if (sep) + { + strcpy(ptr, sep); + ptr += strlen(sep); + } } *pcchString = charsNeeded - 1; } @@ -294,7 +304,8 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, TRACE("bytes is %d, pad bytes is %d\n", bytes, pad_bytes); needed = bytes + pad_bytes + 1; - needed += (needed / 64 + 1) * strlenW(sep); + if (sep) + needed += (needed / 64 + 1) * strlenW(sep); if (needed > *out_len) { @@ -311,7 +322,7 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, i = 0; while (div > 0) { - if (i && i % 64 == 0) + if (sep && i && i % 64 == 0) { strcpyW(ptr, sep); ptr += strlenW(sep); @@ -357,7 +368,8 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, *ptr++ = '='; break; } - strcpyW(ptr, sep); + if (sep) + strcpyW(ptr, sep); return ERROR_SUCCESS; } @@ -365,7 +377,7 @@ static LONG encodeBase64W(const BYTE *in_buf, int in_len, LPCWSTR sep, static BOOL BinaryToBase64W(const BYTE *pbBinary, DWORD cbBinary, DWORD dwFlags, LPWSTR pszString, DWORD *pcchString) { - static const WCHAR crlf[] = { '\r','\n',0 }, lf[] = { '\n',0 }, empty[] = {0}; + static const WCHAR crlf[] = { '\r','\n',0 }, lf[] = { '\n',0 }; BOOL ret = TRUE; LPCWSTR header = NULL, trailer = NULL, sep; DWORD charsNeeded; @@ -373,7 +385,7 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, if (dwFlags & CRYPT_STRING_NOCR) sep = lf; else if (dwFlags & CRYPT_STRING_NOCRLF) - sep = empty; + sep = NULL; else sep = crlf; switch (dwFlags & 0x0fffffff) @@ -397,6 +409,8 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, charsNeeded = 0; encodeBase64W(pbBinary, cbBinary, sep, NULL, &charsNeeded); + if (sep) + charsNeeded += strlenW(sep); if (header) charsNeeded += strlenW(header) + strlenW(sep); if (trailer) @@ -410,8 +424,11 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, { strcpyW(ptr, header); ptr += strlenW(ptr); - strcpyW(ptr, sep); - ptr += strlenW(sep); + if (sep) + { + strcpyW(ptr, sep); + ptr += strlenW(sep); + } } encodeBase64W(pbBinary, cbBinary, sep, ptr, &size); ptr += size - 1; @@ -419,8 +436,11 @@ static BOOL BinaryToBase64W(const BYTE *pbBinary, { strcpyW(ptr, trailer); ptr += strlenW(ptr); - strcpyW(ptr, sep); - ptr += strlenW(sep); + if (sep) + { + strcpyW(ptr, sep); + ptr += strlenW(sep); + } } *pcchString = charsNeeded - 1; } diff --git a/dll/win32/crypt32/decode.c b/dll/win32/crypt32/decode.c index 655a5b2c5d6..fb3d36e8124 100644 --- a/dll/win32/crypt32/decode.c +++ b/dll/win32/crypt32/decode.c @@ -523,11 +523,9 @@ static BOOL CRYPT_AsnDecodeSequence(struct AsnDecodeSequenceItem items[], for (i = 0; i < cItem; i++) { - if (items[i].size > items[i].minSize) - bytesNeeded += items[i].size - items[i].minSize; + bytesNeeded += items[i].size; structSize = max( structSize, items[i].offset + items[i].minSize ); } - bytesNeeded += structSize; if (pcbDecoded) *pcbDecoded = 1 + lenBytes + cbDecoded; if (!pvStructInfo) diff --git a/dll/win32/devmgr/lang/cs-CZ.rc b/dll/win32/devmgr/lang/cs-CZ.rc index aa7a56e21c5..2c29b447a76 100644 --- a/dll/win32/devmgr/lang/cs-CZ.rc +++ b/dll/win32/devmgr/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/win32/devmgr/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2010-01-07 + * UPDATED: 2008-06-24 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -202,7 +202,7 @@ END IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Detaily" +CAPTION "Details" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 @@ -215,7 +215,7 @@ END IDD_DEVICERESOURCES DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Prostøedky" +CAPTION "Resources" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 @@ -224,7 +224,7 @@ END IDD_DEVICEPOWER DIALOGEX DISCARDABLE 0, 0, 252, 218 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Napájení" +CAPTION "Power" FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_DEVICON, 7, 7, 20, 20 diff --git a/dll/win32/gdi32/include/gdi32p.h b/dll/win32/gdi32/include/gdi32p.h index 5cc09870a94..f45a0ddd171 100644 --- a/dll/win32/gdi32/include/gdi32p.h +++ b/dll/win32/gdi32/include/gdi32p.h @@ -292,91 +292,4 @@ int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID); BOOL FASTCALL EndPagePrinterEx(PVOID,HANDLE); BOOL FASTCALL LoadTheSpoolerDrv(VOID); - -FORCEINLINE -PVOID -GdiAllocBatchCommand( - HDC hdc, - USHORT Cmd) -{ - PTEB pTeb; - ULONG ulSize; - PGDIBATCHHDR pHdr; - - /* Get a pointer to the TEB */ - pTeb = NtCurrentTeb(); - - /* Check if we have a valid environment */ - if (!pTeb || !pTeb->Win32ThreadInfo) return NULL; - - /* Do we use a DC? */ - if (hdc) - { - /* If the batch DC is NULL, we set this one as the new one */ - if (!pTeb->GdiTebBatch.HDC) pTeb->GdiTebBatch.HDC = hdc; - - /* If not, check if the batch DC equal to our DC */ - else if (pTeb->GdiTebBatch.HDC != hdc) return NULL; - } - - /* Get the size of the entry */ - switch(Cmd) - { - case GdiBCPatBlt: - ulSize = 0; - break; - case GdiBCPolyPatBlt: - ulSize = 0; - break; - case GdiBCTextOut: - ulSize = 0; - break; - case GdiBCExtTextOut: - ulSize = 0; - break; - case GdiBCSetBrushOrg: - ulSize = 0; - break; - case GdiBCExtSelClipRgn: - ulSize = 0; - break; - case GdiBCSelObj: - ulSize = sizeof(GDIBSOBJECT); - break; - case GdiBCDelRgn: - ulSize = sizeof(GDIBSOBJECT); - break; - case GdiBCDelObj: - ulSize = sizeof(GDIBSOBJECT); - break; - default: - return NULL; - } - - /* Unsupported operation */ - if (ulSize == 0) return NULL; - - /* Check if the buffer is full */ - if ((pTeb->GdiBatchCount >= GDI_BatchLimit) || - ((pTeb->GdiTebBatch.Offset + ulSize) > GDIBATCHBUFSIZE)) - { - /* Call win32k, the kernel will call NtGdiFlushUserBatch to flush - the current batch */ - NtGdiFlush(); - } - - /* Get the head of the entry */ - pHdr = (PVOID)((PUCHAR)pTeb->GdiTebBatch.Buffer + pTeb->GdiTebBatch.Offset); - - /* Update Offset and batch count */ - pTeb->GdiTebBatch.Offset += ulSize; - pTeb->GdiBatchCount++; - - /* Fill in the core fields */ - pHdr->Cmd = Cmd; - pHdr->Size = ulSize; - - return pHdr; -} - /* EOF */ diff --git a/dll/win32/gdi32/objects/dc.c b/dll/win32/gdi32/objects/dc.c index ddc33e501f1..2d90f60cdac 100644 --- a/dll/win32/gdi32/objects/dc.c +++ b/dll/win32/gdi32/objects/dc.c @@ -1540,6 +1540,7 @@ SelectObject(HDC hDC, PDC_ATTR pDc_Attr; HGDIOBJ hOldObj = NULL; UINT uType; +// PTEB pTeb; if(!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) { @@ -1581,23 +1582,29 @@ SelectObject(HDC hDC, case GDI_OBJECT_TYPE_FONT: hOldObj = pDc_Attr->hlfntNew; if (hOldObj == hGdiObj) return hOldObj; - +#if 0 pDc_Attr->ulDirty_ &= ~SLOW_WIDTHS; pDc_Attr->ulDirty_ |= DIRTY_CHARSET; pDc_Attr->hlfntNew = hGdiObj; - - if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)) + pTeb = NtCurrentTeb(); + if (((pTeb->GdiTebBatch.HDC == 0) || + (pTeb->GdiTebBatch.HDC == hDC)) && + ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) && + (!(pDc_Attr->ulDirty_ & DC_DIBSECTION))) { - PGDIBSOBJECT pgO; - - pgO = GdiAllocBatchCommand(hDC, GdiBCSelObj); - if (pgO) - { - pgO->hgdiobj = hGdiObj; - return hOldObj; - } + PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] + + pTeb->GdiTebBatch.Offset); + pgO->gbHdr.Cmd = GdiBCSelObj; + pgO->gbHdr.Size = sizeof(GDIBSOBJECT); + pgO->hgdiobj = hGdiObj; + + pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); + pTeb->GdiTebBatch.HDC = hDC; + pTeb->GdiBatchCount++; + if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); + return hOldObj; } - +#endif // default for select object font return NtGdiSelectFont(hDC, hGdiObj); diff --git a/dll/win32/gdi32/objects/region.c b/dll/win32/gdi32/objects/region.c index b8d70772dcf..e1f187ad3d2 100644 --- a/dll/win32/gdi32/objects/region.c +++ b/dll/win32/gdi32/objects/region.c @@ -104,20 +104,31 @@ BOOL FASTCALL DeleteRegion( HRGN hRgn ) { +//#if 0 PRGN_ATTR Rgn_Attr; if ((GdiGetHandleUserData((HGDIOBJ) hRgn, GDI_OBJECT_TYPE_REGION, (PVOID) &Rgn_Attr)) && ( Rgn_Attr != NULL )) { - PGDIBSOBJECT pgO; - - pgO = GdiAllocBatchCommand(NULL, GdiBCDelRgn); - if (pgO) - { - pgO->hgdiobj = (HGDIOBJ)hRgn; - return TRUE; - } + PTEB pTeb = NtCurrentTeb(); + if (pTeb->Win32ThreadInfo != NULL) + { + if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSOBJECT)) <= GDIBATCHBUFSIZE) + { + PGDIBSOBJECT pgO = (PGDIBSOBJECT)(&pTeb->GdiTebBatch.Buffer[0] + + pTeb->GdiTebBatch.Offset); + pgO->gbHdr.Cmd = GdiBCDelRgn; + pgO->gbHdr.Size = sizeof(GDIBSOBJECT); + pgO->hgdiobj = (HGDIOBJ)hRgn; + + pTeb->GdiTebBatch.Offset += sizeof(GDIBSOBJECT); + pTeb->GdiBatchCount++; + if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); + return TRUE; + } + } } +//#endif return NtGdiDeleteObjectApp((HGDIOBJ) hRgn); } @@ -570,110 +581,8 @@ INT WINAPI ExtSelectClipRgn( IN HDC hdc, IN HRGN hrgn, IN INT iMode) { - INT Ret; - HRGN NewRgn = NULL; - -#if 0 -// Handle something other than a normal dc object. - if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) - { - if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) - return MFDRV_ExtSelectClipRgn( hdc, ); - else - { - PLDC pLDC = GdiGetLDC(hdc); - if ( pLDC ) - { - if (pLDC->iType != LDC_EMFLDC || EMFDRV_ExtSelectClipRgn( hdc, )) - return NtGdiExtSelectClipRgn(hdc, ); - } - else - SetLastError(ERROR_INVALID_HANDLE); - return ERROR; - } - } -#endif -#if 0 - if ( hrgn ) - { - if ( GetLayout(hdc) & LAYOUT_RTL ) - { - if ( MirrorRgnDC(hdc, hrgn, &NewRgn) ) - { - if ( NewRgn ) hrgn = NewRgn; - } - } - } -#endif - /* Batch handles RGN_COPY only! */ - if (iMode == RGN_COPY) - { -#if 0 - PDC_ATTR pDc_Attr; - PRGN_ATTR pRgn_Attr = NULL; - - /* hrgn can be NULL unless the RGN_COPY mode is specified. */ - if (hrgn) - GdiGetHandleUserData((HGDIOBJ) hrgn, GDI_OBJECT_TYPE_REGION, (PVOID) &pRgn_Attr); - - if ( GdiGetHandleUserData((HGDIOBJ) hdc, GDI_OBJECT_TYPE_DC, (PVOID) &pDc_Attr) && - pDc_Attr ) - { - PGDI_TABLE_ENTRY pEntry = GdiHandleTable + GDI_HANDLE_GET_INDEX(hdc); - PTEB pTeb = NtCurrentTeb(); - - if ( pTeb->Win32ThreadInfo != NULL && - pTeb->GdiTebBatch.HDC == hdc && - !(pDc_Attr->ulDirty_ & DC_DIBSECTION) && - !(pEntry->Flags & GDI_ENTRY_VALIDATE_VIS) ) - { - if (!hrgn || - (hrgn && pRgn_Attr && pRgn_Attr->Flags <= SIMPLEREGION) ) - { - if ((pTeb->GdiTebBatch.Offset + sizeof(GDIBSEXTSELCLPRGN)) <= GDIBATCHBUFSIZE) - { - PGDIBSEXTSELCLPRGN pgO = (PGDIBSEXTSELCLPRGN)(&pTeb->GdiTebBatch.Buffer[0] + - pTeb->GdiTebBatch.Offset); - pgO->gbHdr.Cmd = GdiBCExtSelClipRgn; - pgO->gbHdr.Size = sizeof(GDIBSEXTSELCLPRGN); - pgO->fnMode = iMode; - - if ( hrgn && pRgn_Attr ) - { - Ret = pRgn_Attr->Flags; - - if ( pDc_Attr->VisRectRegion.Rect.left >= pRgn_Attr->Rect.right || - pDc_Attr->VisRectRegion.Rect.top >= pRgn_Attr->Rect.bottom || - pDc_Attr->VisRectRegion.Rect.right <= pRgn_Attr->Rect.left || - pDc_Attr->VisRectRegion.Rect.bottom <= pRgn_Attr->Rect.top ) - Ret = NULLREGION; - - pgO->left = pRgn_Attr->Rect.left; - pgO->top = pRgn_Attr->Rect.top; - pgO->right = pRgn_Attr->Rect.right; - pgO->bottom = pRgn_Attr->Rect.bottom; - } - else - { - Ret = pDc_Attr->VisRectRegion.Flags; - pgO->fnMode |= 0x80000000; // Set no hrgn mode. - } - pTeb->GdiTebBatch.Offset += sizeof(GDIBSEXTSELCLPRGN); - pTeb->GdiBatchCount++; - if (pTeb->GdiBatchCount >= GDI_BatchLimit) NtGdiFlush(); - if ( NewRgn ) DeleteObject(NewRgn); - return Ret; - } - } - } - } -#endif - } - Ret = NtGdiExtSelectClipRgn(hdc, hrgn, iMode); - - if ( NewRgn ) DeleteObject(NewRgn); - - return Ret; + /* FIXME some part need be done on user mode size */ + return NtGdiExtSelectClipRgn(hdc,hrgn, iMode); } /* diff --git a/dll/win32/gdiplus/brush.c b/dll/win32/gdiplus/brush.c index 67be6b49836..2d28004c95d 100644 --- a/dll/win32/gdiplus/brush.c +++ b/dll/win32/gdiplus/brush.c @@ -1194,16 +1194,6 @@ GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorsWithCount(GpPathGradient return NotImplemented; } -GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorCount(GpPathGradient *brush, INT *count) -{ - TRACE("(%p, %p)\n", brush, count); - - if (!brush || !count) - return InvalidParameter; - - return NotImplemented; -} - GpStatus WINGDIPAPI GdipGetPathGradientWrapMode(GpPathGradient *brush, GpWrapMode *wrapmode) { @@ -1569,7 +1559,7 @@ GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient *grad, } GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient - *grad, GDIPCONST ARGB *argb, INT *count) + *grad, ARGB *argb, INT *count) { static int calls; diff --git a/dll/win32/gdiplus/font.c b/dll/win32/gdiplus/font.c index 3a29771c710..fda5428a7dd 100644 --- a/dll/win32/gdiplus/font.c +++ b/dll/win32/gdiplus/font.c @@ -489,7 +489,6 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, switch (font->unit) { case UnitPixel: - case UnitWorld: *height = font_height; break; case UnitPoint: @@ -521,7 +520,7 @@ GpStatus WINGDIPAPI GdipGetFontHeightGivenDPI(GDIPCONST GpFont *font, REAL dpi, static INT CALLBACK is_font_installed_proc(const LOGFONTW *elf, const TEXTMETRICW *ntm, DWORD type, LPARAM lParam) { - if (!ntm || type == RASTER_FONTTYPE) + if (!ntm) { return 1; } @@ -643,14 +642,12 @@ GpStatus WINGDIPAPI GdipCloneFontFamily(GpFontFamily* FontFamily, GpFontFamily** GpStatus WINGDIPAPI GdipGetFamilyName (GDIPCONST GpFontFamily *family, WCHAR *name, LANGID language) { - static int lang_fixme; - if (family == NULL) return InvalidParameter; TRACE("%p, %p, %d\n", family, name, language); - if (language != LANG_NEUTRAL && !lang_fixme++) + if (language != LANG_NEUTRAL) FIXME("No support for handling of multiple languages!\n"); lstrcpynW (name, family->FamilyName, LF_FACESIZE); @@ -829,21 +826,15 @@ GpStatus WINGDIPAPI GdipGetGenericFontFamilySerif(GpFontFamily **nativeFamily) */ GpStatus WINGDIPAPI GdipGetGenericFontFamilySansSerif(GpFontFamily **nativeFamily) { - GpStatus stat; - static const WCHAR MicrosoftSansSerif[] = {'M','i','c','r','o','s','o','f','t',' ','S','a','n','s',' ','S','e','r','i','f','\0'}; - static const WCHAR Tahoma[] = {'T','a','h','o','m','a','\0'}; + /* FIXME: On Windows this is called Microsoft Sans Serif, this shouldn't + * 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; - stat = GdipCreateFontFamilyFromName(MicrosoftSansSerif, NULL, nativeFamily); - - if (stat == FontFamilyNotFound) - /* FIXME: Microsoft Sans Serif is not installed on Wine. */ - stat = GdipCreateFontFamilyFromName(Tahoma, NULL, nativeFamily); - - return stat; + return GdipCreateFontFamilyFromName(MSSansSerif, NULL, nativeFamily); } /***************************************************************************** @@ -966,9 +957,6 @@ static INT CALLBACK add_font_proc(const LOGFONTW *lfw, const TEXTMETRICW *ntm, GpFontCollection* fonts = (GpFontCollection*)lParam; int i; - if (type == RASTER_FONTTYPE) - return 1; - /* skip duplicates */ for (i=0; icount; i++) if (strcmpiW(lfw->lfFaceName, fonts->FontFamilies[i]->FamilyName) == 0) diff --git a/dll/win32/gdiplus/gdiplus.spec b/dll/win32/gdiplus/gdiplus.spec index 14e7fbff4a8..e6cea5ad443 100644 --- a/dll/win32/gdiplus/gdiplus.spec +++ b/dll/win32/gdiplus/gdiplus.spec @@ -338,7 +338,7 @@ @ stub GdipGetPathGradientPresetBlendCount @ stdcall GdipGetPathGradientRect(ptr ptr) @ stdcall GdipGetPathGradientRectI(ptr ptr) -@ stdcall GdipGetPathGradientSurroundColorCount(ptr ptr) +@ stub GdipGetPathGradientSurroundColorCount @ stdcall GdipGetPathGradientSurroundColorsWithCount(ptr ptr ptr) @ stub GdipGetPathGradientTransform @ stdcall GdipGetPathGradientWrapMode(ptr ptr) diff --git a/dll/win32/gdiplus/gdiplus_private.h b/dll/win32/gdiplus/gdiplus_private.h index 5ff71255b9d..ca1cba6175c 100644 --- a/dll/win32/gdiplus/gdiplus_private.h +++ b/dll/win32/gdiplus/gdiplus_private.h @@ -78,29 +78,6 @@ static inline REAL deg2rad(REAL degrees) return M_PI * degrees / 180.0; } -static inline ARGB color_over(ARGB bg, ARGB fg) -{ - BYTE b, g, r, a; - BYTE bg_alpha, fg_alpha; - - fg_alpha = (fg>>24)&0xff; - - if (fg_alpha == 0xff) return fg; - - if (fg_alpha == 0) return bg; - - bg_alpha = (((bg>>24)&0xff) * (0xff-fg_alpha)) / 0xff; - - if (bg_alpha == 0) return fg; - - a = bg_alpha + fg_alpha; - b = ((bg&0xff)*bg_alpha + (fg&0xff)*fg_alpha)*0xff/a; - g = (((bg>>8)&0xff)*bg_alpha + ((fg>>8)&0xff)*fg_alpha)*0xff/a; - r = (((bg>>16)&0xff)*bg_alpha + ((fg>>16)&0xff)*fg_alpha)*0xff/a; - - return (a<<24)|(r<<16)|(g<<8)|b; -} - extern const char *debugstr_rectf(CONST RectF* rc); extern const char *debugstr_pointf(CONST PointF* pt); @@ -135,7 +112,6 @@ struct GpGraphics{ HDC hdc; HWND hwnd; BOOL owndc; - GpImage *image; SmoothingMode smoothing; CompositingQuality compqual; InterpolationMode interpolation; diff --git a/dll/win32/gdiplus/graphics.c b/dll/win32/gdiplus/graphics.c index 7a6fad301c9..1fd870e3d42 100644 --- a/dll/win32/gdiplus/graphics.c +++ b/dll/win32/gdiplus/graphics.c @@ -173,74 +173,6 @@ static void transform_and_round_points(GpGraphics *graphics, POINT *pti, } } -/* Draw non-premultiplied ARGB data to the given graphics object */ -static GpStatus alpha_blend_pixels(GpGraphics *graphics, INT dst_x, INT dst_y, - const BYTE *src, INT src_width, INT src_height, INT src_stride) -{ - if (graphics->image && graphics->image->type == ImageTypeBitmap) - { - GpBitmap *dst_bitmap = (GpBitmap*)graphics->image; - INT x, y; - - for (x=0; xhdc, dst_x, dst_y, src_width, src_height, - hdc, 0, 0, src_width, src_height, bf); - - SelectObject(hdc, old_hbm); - DeleteDC(hdc); - DeleteObject(hbitmap); - - return Ok; - } -} - static ARGB blend_colors(ARGB start, ARGB end, REAL position) { ARGB result=0; @@ -1341,10 +1273,10 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, (*metafile)->bounds.X = ((REAL) placeable->BoundingBox.Left) / ((REAL) placeable->Inch); (*metafile)->bounds.Y = ((REAL) placeable->BoundingBox.Top) / ((REAL) placeable->Inch); (*metafile)->bounds.Width = ((REAL) (placeable->BoundingBox.Right - - placeable->BoundingBox.Left)); + - placeable->BoundingBox.Left)) / ((REAL) placeable->Inch); (*metafile)->bounds.Height = ((REAL) (placeable->BoundingBox.Bottom - - placeable->BoundingBox.Top)); - (*metafile)->unit = UnitPixel; + - placeable->BoundingBox.Top)) / ((REAL) placeable->Inch); + (*metafile)->unit = UnitInch; if(delete) DeleteMetaFile(hwmf); @@ -1934,15 +1866,15 @@ GpStatus WINGDIPAPI GdipDrawImagePointsI(GpGraphics *graphics, GpImage *image, return NotImplemented; } +/* FIXME: partially implemented (only works for rectangular parallelograms) */ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *points, INT count, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes* imageAttributes, DrawImageAbort callback, VOID * callbackData) { - GpPointF ptf[4]; - POINT pti[4]; + GpPointF ptf[3]; + POINT pti[3]; REAL dx, dy; - GpStatus stat; 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, @@ -1955,13 +1887,10 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image debugstr_pointf(&points[2])); memcpy(ptf, points, 3 * sizeof(GpPointF)); - ptf[3].X = ptf[2].X + ptf[1].X - ptf[0].X; - ptf[3].Y = ptf[2].Y + ptf[1].Y - ptf[0].Y; - transform_and_round_points(graphics, pti, ptf, 4); + transform_and_round_points(graphics, pti, ptf, 3); if (image->picture) { - /* FIXME: partially implemented (only works for rectangular parallelograms) */ if(srcUnit == UnitInch) dx = dy = (REAL) INCH_HIMETRIC; else if(srcUnit == UnitPixel){ @@ -1985,8 +1914,10 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image } else if (image->type == ImageTypeBitmap && ((GpBitmap*)image)->hbitmap) { + HDC hdc; GpBitmap* bitmap = (GpBitmap*)image; - int use_software=0; + int temp_hdc=0, temp_bitmap=0; + HBITMAP hbitmap, old_hbm=NULL; if (srcUnit == UnitInch) dx = dy = 96.0; /* FIXME: use the image resolution */ @@ -1995,233 +1926,83 @@ GpStatus WINGDIPAPI GdipDrawImagePointsRect(GpGraphics *graphics, GpImage *image else return NotImplemented; - if (imageAttributes || - (graphics->image && graphics->image->type == ImageTypeBitmap) || - ptf[1].Y != ptf[0].Y || ptf[2].X != ptf[0].X) - use_software = 1; - - if (use_software) + if (!(bitmap->format == PixelFormat16bppRGB555 || + bitmap->format == PixelFormat24bppRGB || + bitmap->format == PixelFormat32bppRGB || + bitmap->format == PixelFormat32bppPARGB)) { - RECT src_area, dst_area; - int i, x, y, stride; - GpMatrix *dst_to_src; - REAL m11, m12, m21, m22, mdx, mdy; - LPBYTE data; - - src_area.left = srcx*dx; - src_area.top = srcy*dy; - src_area.right = (srcx+srcwidth)*dx; - src_area.bottom = (srcy+srcheight)*dy; - - dst_area.left = dst_area.right = pti[0].x; - dst_area.top = dst_area.bottom = pti[0].y; - for (i=1; i<4; i++) - { - if (dst_area.left > pti[i].x) dst_area.left = pti[i].x; - if (dst_area.right < pti[i].x) dst_area.right = pti[i].x; - if (dst_area.top > pti[i].y) dst_area.top = pti[i].y; - if (dst_area.bottom < pti[i].y) dst_area.bottom = pti[i].y; - } - - m11 = (ptf[1].X - ptf[0].X) / srcwidth; - m21 = (ptf[2].X - ptf[0].X) / srcheight; - mdx = ptf[0].X - m11 * srcx - m21 * srcy; - m12 = (ptf[1].Y - ptf[0].Y) / srcwidth; - m22 = (ptf[2].Y - ptf[0].Y) / srcheight; - mdy = ptf[0].Y - m12 * srcx - m22 * srcy; - - stat = GdipCreateMatrix2(m11, m12, m21, m22, mdx, mdy, &dst_to_src); - if (stat != Ok) return stat; - - stat = GdipInvertMatrix(dst_to_src); - if (stat != Ok) - { - GdipDeleteMatrix(dst_to_src); - return stat; - } - - data = GdipAlloc(sizeof(ARGB) * (dst_area.right - dst_area.left) * (dst_area.bottom - dst_area.top)); - if (!data) - { - GdipDeleteMatrix(dst_to_src); - return OutOfMemory; - } - - stride = sizeof(ARGB) * (dst_area.right - dst_area.left); - - for (x=dst_area.left; x= src_area.right || - src_y < src_area.top || src_y >= src_area.bottom) - /* FIXME: Use wrapmode */ - *src_color = 0; - else - GdipBitmapGetPixel(bitmap, src_x, src_y, src_color); - } - } - - GdipDeleteMatrix(dst_to_src); - - if (imageAttributes) - { - if (imageAttributes->colorkeys[ColorAdjustTypeBitmap].enabled || - imageAttributes->colorkeys[ColorAdjustTypeDefault].enabled) - { - static int fixme; - if (!fixme++) - FIXME("Color keying not implemented\n"); - } - - if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled || - imageAttributes->colorremaptables[ColorAdjustTypeDefault].enabled) - { - const struct color_remap_table *table; - - if (imageAttributes->colorremaptables[ColorAdjustTypeBitmap].enabled) - table = &imageAttributes->colorremaptables[ColorAdjustTypeBitmap]; - else - table = &imageAttributes->colorremaptables[ColorAdjustTypeDefault]; - - for (x=dst_area.left; xmapsize; i++) - { - if (*src_color == table->colormap[i].oldColor.Argb) - { - *src_color = table->colormap[i].newColor.Argb; - break; - } - } - } - } - - if (imageAttributes->colormatrices[ColorAdjustTypeBitmap].enabled || - imageAttributes->colormatrices[ColorAdjustTypeDefault].enabled) - { - static int fixme; - if (!fixme++) - FIXME("Color transforms not implemented\n"); - } - - if (imageAttributes->gamma_enabled[ColorAdjustTypeBitmap] || - imageAttributes->gamma_enabled[ColorAdjustTypeDefault]) - { - static int fixme; - if (!fixme++) - FIXME("Gamma adjustment not implemented\n"); - } - } + BITMAPINFOHEADER bih; + BYTE *temp_bits; + PixelFormat dst_format; + + /* we can't draw a bitmap of this format directly */ + hdc = CreateCompatibleDC(0); + temp_hdc = 1; + temp_bitmap = 1; + + bih.biSize = sizeof(BITMAPINFOHEADER); + bih.biWidth = bitmap->width; + bih.biHeight = -bitmap->height; + bih.biPlanes = 1; + bih.biBitCount = 32; + bih.biCompression = BI_RGB; + bih.biSizeImage = 0; + bih.biXPelsPerMeter = 0; + bih.biYPelsPerMeter = 0; + bih.biClrUsed = 0; + bih.biClrImportant = 0; + + hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, + (void**)&temp_bits, NULL, 0); - stat = alpha_blend_pixels(graphics, dst_area.left, dst_area.top, - data, dst_area.right - dst_area.left, dst_area.bottom - dst_area.top, stride); - - GdipFree(data); + if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) + dst_format = PixelFormat32bppPARGB; + else + dst_format = PixelFormat32bppRGB; - return stat; + convert_pixels(bitmap->width, bitmap->height, + bitmap->width*4, temp_bits, dst_format, + bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries); } else { - HDC hdc; - int temp_hdc=0, temp_bitmap=0; - HBITMAP hbitmap, old_hbm=NULL; - - if (!(bitmap->format == PixelFormat16bppRGB555 || - bitmap->format == PixelFormat24bppRGB || - bitmap->format == PixelFormat32bppRGB || - bitmap->format == PixelFormat32bppPARGB)) - { - BITMAPINFOHEADER bih; - BYTE *temp_bits; - PixelFormat dst_format; - - /* we can't draw a bitmap of this format directly */ - hdc = CreateCompatibleDC(0); - temp_hdc = 1; - temp_bitmap = 1; - - bih.biSize = sizeof(BITMAPINFOHEADER); - bih.biWidth = bitmap->width; - bih.biHeight = -bitmap->height; - bih.biPlanes = 1; - bih.biBitCount = 32; - bih.biCompression = BI_RGB; - bih.biSizeImage = 0; - bih.biXPelsPerMeter = 0; - bih.biYPelsPerMeter = 0; - bih.biClrUsed = 0; - bih.biClrImportant = 0; - - hbitmap = CreateDIBSection(hdc, (BITMAPINFO*)&bih, DIB_RGB_COLORS, - (void**)&temp_bits, NULL, 0); - - if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) - dst_format = PixelFormat32bppPARGB; - else - dst_format = PixelFormat32bppRGB; - - convert_pixels(bitmap->width, bitmap->height, - bitmap->width*4, temp_bits, dst_format, - bitmap->stride, bitmap->bits, bitmap->format, bitmap->image.palette_entries); - } - else - { - hbitmap = bitmap->hbitmap; - hdc = bitmap->hdc; - temp_hdc = (hdc == 0); - } - - if (temp_hdc) - { - if (!hdc) hdc = CreateCompatibleDC(0); - old_hbm = SelectObject(hdc, hbitmap); - } + hbitmap = bitmap->hbitmap; + hdc = bitmap->hdc; + temp_hdc = (hdc == 0); + } - if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) - { - BLENDFUNCTION bf; + if (temp_hdc) + { + if (!hdc) hdc = CreateCompatibleDC(0); + old_hbm = SelectObject(hdc, hbitmap); + } - bf.BlendOp = AC_SRC_OVER; - bf.BlendFlags = 0; - bf.SourceConstantAlpha = 255; - bf.AlphaFormat = AC_SRC_ALPHA; + if (bitmap->format & (PixelFormatAlpha|PixelFormatPAlpha)) + { + BLENDFUNCTION bf; - GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, - hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); - } - else - { - StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, - hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); - } + bf.BlendOp = AC_SRC_OVER; + bf.BlendFlags = 0; + bf.SourceConstantAlpha = 255; + bf.AlphaFormat = AC_SRC_ALPHA; - if (temp_hdc) - { - SelectObject(hdc, old_hbm); - DeleteDC(hdc); - } + GdiAlphaBlend(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, + hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, bf); + } + else + { + StretchBlt(graphics->hdc, pti[0].x, pti[0].y, pti[1].x-pti[0].x, pti[2].y-pti[0].y, + hdc, srcx*dx, srcy*dy, srcwidth*dx, srcheight*dy, SRCCOPY); + } - if (temp_bitmap) - DeleteObject(hbitmap); + if (temp_hdc) + { + SelectObject(hdc, old_hbm); + DeleteDC(hdc); } + + if (temp_bitmap) + DeleteObject(hbitmap); } else { @@ -2622,93 +2403,295 @@ GpStatus WINGDIPAPI GdipDrawRectanglesI(GpGraphics *graphics, GpPen *pen, return ret; } -GpStatus WINGDIPAPI GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush, - GDIPCONST GpPointF *points, INT count, REAL tension, GpFillMode fill) +GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, + INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, + GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush) { - GpPath *path; - GpStatus stat; + HRGN rgn = NULL; + HFONT gdifont; + LOGFONTW lfw; + TEXTMETRICW textmet; + GpPointF pt[3], rectcpy[4]; + POINT corners[4]; + WCHAR* stringdup; + REAL angle, ang_cos, ang_sin, rel_width, rel_height; + INT sum = 0, height = 0, offsety = 0, fit, fitcpy, save_state, i, j, lret, nwidth, + nheight, lineend; + SIZE size; + POINT drawbase; + UINT drawflags; + RECT drawcoord; - TRACE("(%p, %p, %p, %d, %.2f, %d)\n", graphics, brush, points, - count, tension, fill); + TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length), + length, font, debugstr_rectf(rect), format, brush); - if(!graphics || !brush || !points) + if(!graphics || !string || !font || !brush || !rect) return InvalidParameter; - if(graphics->busy) - return ObjectBusy; + if((brush->bt != BrushTypeSolidColor)){ + FIXME("not implemented for given parameters\n"); + return NotImplemented; + } - stat = GdipCreatePath(fill, &path); - if(stat != Ok) - return stat; + if(format){ + TRACE("may be ignoring some format flags: attr %x\n", format->attr); - stat = GdipAddPathClosedCurve2(path, points, count, tension); - if(stat != Ok){ - GdipDeletePath(path); - return stat; - } + /* Should be no need to explicitly test for StringAlignmentNear as + * that is default behavior if no alignment is passed. */ + if(format->vertalign != StringAlignmentNear){ + RectF bounds; + GdipMeasureString(graphics, string, length, font, rect, format, &bounds, 0, 0); - stat = GdipFillPath(graphics, brush, path); - if(stat != Ok){ - GdipDeletePath(path); - return stat; + if(format->vertalign == StringAlignmentCenter) + offsety = (rect->Height - bounds.Height) / 2; + else if(format->vertalign == StringAlignmentFar) + offsety = (rect->Height - bounds.Height); + } } - GdipDeletePath(path); + if(length == -1) length = lstrlenW(string); - return Ok; -} + stringdup = GdipAlloc(length * sizeof(WCHAR)); + if(!stringdup) return OutOfMemory; -GpStatus WINGDIPAPI GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush, - GDIPCONST GpPoint *points, INT count, REAL tension, GpFillMode fill) -{ - GpPointF *ptf; - GpStatus stat; - INT i; + save_state = SaveDC(graphics->hdc); + SetBkMode(graphics->hdc, TRANSPARENT); + SetTextColor(graphics->hdc, brush->lb.lbColor); - TRACE("(%p, %p, %p, %d, %.2f, %d)\n", graphics, brush, points, - count, tension, fill); + pt[0].X = 0.0; + pt[0].Y = 0.0; + pt[1].X = 1.0; + pt[1].Y = 0.0; + pt[2].X = 0.0; + pt[2].Y = 1.0; + GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3); + angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X)); + ang_cos = cos(angle); + ang_sin = sin(angle); + rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+ + (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X)); + rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+ + (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X)); - if(!points || count <= 0) - return InvalidParameter; + rectcpy[3].X = rectcpy[0].X = rect->X; + rectcpy[1].Y = rectcpy[0].Y = rect->Y + offsety; + rectcpy[2].X = rectcpy[1].X = rect->X + rect->Width; + rectcpy[3].Y = rectcpy[2].Y = rect->Y + offsety + rect->Height; + transform_and_round_points(graphics, corners, rectcpy, 4); - ptf = GdipAlloc(sizeof(GpPointF)*count); - if(!ptf) - return OutOfMemory; + if (roundr(rect->Width) == 0) + nwidth = INT_MAX; + else + nwidth = roundr(rel_width * rect->Width); - for(i = 0;i < count;i++){ - ptf[i].X = (REAL)points[i].X; - ptf[i].Y = (REAL)points[i].Y; + if (roundr(rect->Height) == 0) + nheight = INT_MAX; + else + nheight = roundr(rel_height * rect->Height); + + if (roundr(rect->Width) != 0 && roundr(rect->Height) != 0) + { + /* FIXME: If only the width or only the height is 0, we should probably still clip */ + rgn = CreatePolygonRgn(corners, 4, ALTERNATE); + SelectClipRgn(graphics->hdc, rgn); } - stat = GdipFillClosedCurve2(graphics, brush, ptf, count, tension, fill); + /* Use gdi to find the font, then perform transformations on it (height, + * width, angle). */ + SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); + GetTextMetricsW(graphics->hdc, &textmet); + lfw = font->lfw; - GdipFree(ptf); + lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height); + lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width); - return stat; -} + lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0); -GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, - REAL y, REAL width, REAL height) -{ - INT save_state; - GpPointF ptf[2]; - POINT pti[2]; + gdifont = CreateFontIndirectW(&lfw); + DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw))); - TRACE("(%p, %p, %.2f, %.2f, %.2f, %.2f)\n", graphics, brush, x, y, width, height); + for(i = 0, j = 0; i < length; i++){ + if(!isprintW(string[i]) && (string[i] != '\n')) + continue; - if(!graphics || !brush) - return InvalidParameter; + stringdup[j] = string[i]; + j++; + } - if(graphics->busy) - return ObjectBusy; + length = j; - ptf[0].X = x; - ptf[0].Y = y; - ptf[1].X = x + width; - ptf[1].Y = y + height; + if (!format || format->align == StringAlignmentNear) + { + drawbase.x = corners[0].x; + drawbase.y = corners[0].y; + drawflags = DT_NOCLIP | DT_EXPANDTABS; + } + else if (format->align == StringAlignmentCenter) + { + drawbase.x = (corners[0].x + corners[1].x)/2; + drawbase.y = (corners[0].y + corners[1].y)/2; + drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER; + } + else /* (format->align == StringAlignmentFar) */ + { + drawbase.x = corners[1].x; + drawbase.y = corners[1].y; + drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; + } - save_state = SaveDC(graphics->hdc); - EndPath(graphics->hdc); + while(sum < length){ + drawcoord.left = drawcoord.right = drawbase.x + roundr(ang_sin * (REAL) height); + drawcoord.top = drawcoord.bottom = drawbase.y + roundr(ang_cos * (REAL) height); + + GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, + nwidth, &fit, NULL, &size); + fitcpy = fit; + + if(fit == 0){ + DrawTextW(graphics->hdc, stringdup + sum, 1, &drawcoord, drawflags); + break; + } + + for(lret = 0; lret < fit; lret++) + if(*(stringdup + sum + lret) == '\n') + break; + + /* Line break code (may look strange, but it imitates windows). */ + if(lret < fit) + lineend = fit = lret; /* this is not an off-by-one error */ + else if(fit < (length - sum)){ + if(*(stringdup + sum + fit) == ' ') + while(*(stringdup + sum + fit) == ' ') + fit++; + else + while(*(stringdup + sum + fit - 1) != ' '){ + fit--; + + if(*(stringdup + sum + fit) == '\t') + break; + + if(fit == 0){ + fit = fitcpy; + break; + } + } + lineend = fit; + while(*(stringdup + sum + lineend - 1) == ' ' || + *(stringdup + sum + lineend - 1) == '\t') + lineend--; + } + else + lineend = fit; + DrawTextW(graphics->hdc, stringdup + sum, min(length - sum, lineend), + &drawcoord, drawflags); + + sum += fit + (lret < fitcpy ? 1 : 0); + height += size.cy; + + if(height > nheight) + break; + + /* Stop if this was a linewrap (but not if it was a linebreak). */ + if((lret == fitcpy) && format && (format->attr & StringFormatFlagsNoWrap)) + break; + } + + GdipFree(stringdup); + DeleteObject(rgn); + DeleteObject(gdifont); + + RestoreDC(graphics->hdc, save_state); + + return Ok; +} + +GpStatus WINGDIPAPI GdipFillClosedCurve2(GpGraphics *graphics, GpBrush *brush, + GDIPCONST GpPointF *points, INT count, REAL tension, GpFillMode fill) +{ + GpPath *path; + GpStatus stat; + + TRACE("(%p, %p, %p, %d, %.2f, %d)\n", graphics, brush, points, + count, tension, fill); + + if(!graphics || !brush || !points) + return InvalidParameter; + + if(graphics->busy) + return ObjectBusy; + + stat = GdipCreatePath(fill, &path); + if(stat != Ok) + return stat; + + stat = GdipAddPathClosedCurve2(path, points, count, tension); + if(stat != Ok){ + GdipDeletePath(path); + return stat; + } + + stat = GdipFillPath(graphics, brush, path); + if(stat != Ok){ + GdipDeletePath(path); + return stat; + } + + GdipDeletePath(path); + + return Ok; +} + +GpStatus WINGDIPAPI GdipFillClosedCurve2I(GpGraphics *graphics, GpBrush *brush, + GDIPCONST GpPoint *points, INT count, REAL tension, GpFillMode fill) +{ + GpPointF *ptf; + GpStatus stat; + INT i; + + TRACE("(%p, %p, %p, %d, %.2f, %d)\n", graphics, brush, points, + count, tension, fill); + + if(!points || count <= 0) + return InvalidParameter; + + ptf = GdipAlloc(sizeof(GpPointF)*count); + if(!ptf) + return OutOfMemory; + + for(i = 0;i < count;i++){ + ptf[i].X = (REAL)points[i].X; + ptf[i].Y = (REAL)points[i].Y; + } + + stat = GdipFillClosedCurve2(graphics, brush, ptf, count, tension, fill); + + GdipFree(ptf); + + return stat; +} + +GpStatus WINGDIPAPI GdipFillEllipse(GpGraphics *graphics, GpBrush *brush, REAL x, + REAL y, REAL width, REAL height) +{ + INT save_state; + 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; + + if(graphics->busy) + return ObjectBusy; + + ptf[0].X = x; + ptf[0].Y = y; + ptf[1].X = x + width; + ptf[1].Y = y + height; + + save_state = SaveDC(graphics->hdc); + EndPath(graphics->hdc); transform_and_round_points(graphics, pti, ptf, 2); @@ -3091,6 +3074,8 @@ GpStatus WINGDIPAPI GdipFillRegion(GpGraphics* graphics, GpBrush* brush, GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) { + static int calls; + TRACE("(%p,%u)\n", graphics, intention); if(!graphics) @@ -3099,12 +3084,10 @@ GpStatus WINGDIPAPI GdipFlush(GpGraphics *graphics, GpFlushIntention intention) if(graphics->busy) return ObjectBusy; - /* We have no internal operation queue, so there's no need to clear it. */ - - if (graphics->hdc) - GdiFlush(); + if(!(calls++)) + FIXME("not implemented\n"); - return Ok; + return NotImplemented; } /***************************************************************************** @@ -3482,37 +3465,61 @@ GpStatus WINGDIPAPI GdipIsVisibleRectI(GpGraphics *graphics, INT x, INT y, INT w return GdipIsVisibleRect(graphics, (REAL)x, (REAL)y, (REAL)width, (REAL)height, result); } -typedef GpStatus (*gdip_format_string_callback)(GpGraphics *graphics, - GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data); +GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, + GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, + GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, + INT regionCount, GpRegion** regions) +{ + FIXME("stub: %p %s %d %p %p %p %d %p\n", graphics, debugstr_w(string), + length, font, layoutRect, stringFormat, regionCount, regions); -static GpStatus gdip_format_string(GpGraphics *graphics, + if (!(graphics && string && font && layoutRect && stringFormat && regions)) + return InvalidParameter; + + return NotImplemented; +} + +/* Find the smallest rectangle that bounds the text when it is printed in rect + * according to the format options listed in format. If rect has 0 width and + * height, then just find the smallest rectangle that bounds the text when it's + * printed at location (rect->X, rect-Y). */ +GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - gdip_format_string_callback callback, void *user_data) + GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, + INT *codepointsfitted, INT *linesfilled) { + HFONT oldfont; WCHAR* stringdup; - INT sum = 0, height = 0, fit, fitcpy, i, j, lret, nwidth, - nheight, lineend, lineno = 0; - RectF bounds; - StringAlignment halign; - GpStatus stat = Ok; + INT sum = 0, height = 0, fit, fitcpy, max_width = 0, i, j, lret, nwidth, + nheight, lineend; SIZE size; + TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, + debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, + bounds, codepointsfitted, linesfilled); + + if(!graphics || !string || !font || !rect) + return InvalidParameter; + + if(linesfilled) *linesfilled = 0; + if(codepointsfitted) *codepointsfitted = 0; + + if(format) + TRACE("may be ignoring some format flags: attr %x\n", format->attr); + if(length == -1) length = lstrlenW(string); stringdup = GdipAlloc((length + 1) * sizeof(WCHAR)); if(!stringdup) return OutOfMemory; + oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); nwidth = roundr(rect->Width); nheight = roundr(rect->Height); - if (nwidth == 0) nwidth = INT_MAX; - if (nheight == 0) nheight = INT_MAX; + if((nwidth == 0) && (nheight == 0)) + nwidth = nheight = INT_MAX; for(i = 0, j = 0; i < length; i++){ - /* FIXME: This makes the indexes passed to callback inaccurate. */ if(!isprintW(string[i]) && (string[i] != '\n')) continue; @@ -3520,11 +3527,9 @@ static GpStatus gdip_format_string(GpGraphics *graphics, j++; } + stringdup[j] = 0; length = j; - if (format) halign = format->align; - else halign = StringAlignmentNear; - while(sum < length){ GetTextExtentExPointW(graphics->hdc, stringdup + sum, length - sum, nwidth, &fit, NULL, &size); @@ -3567,38 +3572,12 @@ static GpStatus gdip_format_string(GpGraphics *graphics, GetTextExtentExPointW(graphics->hdc, stringdup + sum, lineend, nwidth, &j, NULL, &size); - bounds.Width = size.cx; - - if(height + size.cy > nheight) - bounds.Height = nheight - (height + size.cy); - else - bounds.Height = size.cy; - - bounds.Y = rect->Y + height; - - switch (halign) - { - case StringAlignmentNear: - default: - bounds.X = rect->X; - break; - case StringAlignmentCenter: - bounds.X = rect->X + (rect->Width/2) - (bounds.Width/2); - break; - case StringAlignmentFar: - bounds.X = rect->X + rect->Width - bounds.Width; - break; - } - - stat = callback(graphics, stringdup, sum, lineend, - font, rect, format, lineno, &bounds, user_data); - - if (stat != Ok) - break; - sum += fit + (lret < fitcpy ? 1 : 0); + if(codepointsfitted) *codepointsfitted = sum; + height += size.cy; - lineno++; + if(linesfilled) *linesfilled += size.cy; + max_width = max(max_width, size.cx); if(height > nheight) break; @@ -3608,311 +3587,17 @@ static GpStatus gdip_format_string(GpGraphics *graphics, break; } - GdipFree(stringdup); - - return stat; -} - -struct measure_ranges_args { - GpRegion **regions; -}; - -GpStatus measure_ranges_callback(GpGraphics *graphics, - GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data) -{ - int i; - GpStatus stat = Ok; - struct measure_ranges_args *args = user_data; - - for (i=0; irange_count; i++) - { - INT range_start = max(index, format->character_ranges[i].First); - INT range_end = min(index+length, format->character_ranges[i].First+format->character_ranges[i].Length); - if (range_start < range_end) - { - GpRectF range_rect; - SIZE range_size; - - range_rect.Y = bounds->Y; - range_rect.Height = bounds->Height; - - GetTextExtentExPointW(graphics->hdc, string + index, range_start - index, - INT_MAX, NULL, NULL, &range_size); - range_rect.X = bounds->X + range_size.cx; - - GetTextExtentExPointW(graphics->hdc, string + index, range_end - index, - INT_MAX, NULL, NULL, &range_size); - range_rect.Width = (bounds->X + range_size.cx) - range_rect.X; - - stat = GdipCombineRegionRect(args->regions[i], &range_rect, CombineModeUnion); - if (stat != Ok) - break; - } - } - - return stat; -} - -GpStatus WINGDIPAPI GdipMeasureCharacterRanges(GpGraphics* graphics, - GDIPCONST WCHAR* string, INT length, GDIPCONST GpFont* font, - GDIPCONST RectF* layoutRect, GDIPCONST GpStringFormat *stringFormat, - INT regionCount, GpRegion** regions) -{ - GpStatus stat; - int i; - HFONT oldfont; - struct measure_ranges_args args; - - TRACE("(%p %s %d %p %s %p %d %p)\n", graphics, debugstr_w(string), - length, font, debugstr_rectf(layoutRect), stringFormat, regionCount, regions); - - if (!(graphics && string && font && layoutRect && stringFormat && regions)) - return InvalidParameter; - - if (regionCount < stringFormat->range_count) - return InvalidParameter; - - if (stringFormat->attr) - TRACE("may be ignoring some format flags: attr %x\n", stringFormat->attr); - - oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); - - for (i=0; irange_count; i++) - { - stat = GdipSetEmpty(regions[i]); - if (stat != Ok) - return stat; - } - - args.regions = regions; - - stat = gdip_format_string(graphics, string, length, font, layoutRect, stringFormat, - measure_ranges_callback, &args); - - DeleteObject(SelectObject(graphics->hdc, oldfont)); - - return stat; -} - -struct measure_string_args { - RectF *bounds; - INT *codepointsfitted; - INT *linesfilled; -}; - -static GpStatus measure_string_callback(GpGraphics *graphics, - GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data) -{ - struct measure_string_args *args = user_data; - - if (bounds->Width > args->bounds->Width) - args->bounds->Width = bounds->Width; - - if (bounds->Height + bounds->Y > args->bounds->Height + args->bounds->Y) - args->bounds->Height = bounds->Height + bounds->Y - args->bounds->Y; - - if (args->codepointsfitted) - *args->codepointsfitted = index + length; - - if (args->linesfilled) - (*args->linesfilled)++; - - return Ok; -} - -/* Find the smallest rectangle that bounds the text when it is printed in rect - * according to the format options listed in format. If rect has 0 width and - * height, then just find the smallest rectangle that bounds the text when it's - * printed at location (rect->X, rect-Y). */ -GpStatus WINGDIPAPI GdipMeasureString(GpGraphics *graphics, - GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, RectF *bounds, - INT *codepointsfitted, INT *linesfilled) -{ - HFONT oldfont; - struct measure_string_args args; - - TRACE("(%p, %s, %i, %p, %s, %p, %p, %p, %p)\n", graphics, - debugstr_wn(string, length), length, font, debugstr_rectf(rect), format, - bounds, codepointsfitted, linesfilled); - - if(!graphics || !string || !font || !rect || !bounds) - return InvalidParameter; - - if(linesfilled) *linesfilled = 0; - if(codepointsfitted) *codepointsfitted = 0; - - if(format) - TRACE("may be ignoring some format flags: attr %x\n", format->attr); - - oldfont = SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); - bounds->X = rect->X; bounds->Y = rect->Y; - bounds->Width = 0.0; - bounds->Height = 0.0; - - args.bounds = bounds; - args.codepointsfitted = codepointsfitted; - args.linesfilled = linesfilled; - - gdip_format_string(graphics, string, length, font, rect, format, - measure_string_callback, &args); + bounds->Width = (REAL)max_width; + bounds->Height = (REAL) min(height, nheight); + GdipFree(stringdup); DeleteObject(SelectObject(graphics->hdc, oldfont)); return Ok; } -struct draw_string_args { - POINT drawbase; - UINT drawflags; - REAL ang_cos, ang_sin; -}; - -static GpStatus draw_string_callback(GpGraphics *graphics, - GDIPCONST WCHAR *string, INT index, INT length, GDIPCONST GpFont *font, - GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, - INT lineno, const RectF *bounds, void *user_data) -{ - struct draw_string_args *args = user_data; - RECT drawcoord; - - drawcoord.left = drawcoord.right = args->drawbase.x + roundr(args->ang_sin * bounds->Y); - drawcoord.top = drawcoord.bottom = args->drawbase.y + roundr(args->ang_cos * bounds->Y); - - DrawTextW(graphics->hdc, string + index, length, &drawcoord, args->drawflags); - - return Ok; -} - -GpStatus WINGDIPAPI GdipDrawString(GpGraphics *graphics, GDIPCONST WCHAR *string, - INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, - GDIPCONST GpStringFormat *format, GDIPCONST GpBrush *brush) -{ - HRGN rgn = NULL; - HFONT gdifont; - LOGFONTW lfw; - TEXTMETRICW textmet; - GpPointF pt[3], rectcpy[4]; - POINT corners[4]; - REAL angle, rel_width, rel_height; - INT offsety = 0, save_state; - struct draw_string_args args; - RectF scaled_rect; - - TRACE("(%p, %s, %i, %p, %s, %p, %p)\n", graphics, debugstr_wn(string, length), - length, font, debugstr_rectf(rect), format, brush); - - if(!graphics || !string || !font || !brush || !rect) - return InvalidParameter; - - if((brush->bt != BrushTypeSolidColor)){ - FIXME("not implemented for given parameters\n"); - return NotImplemented; - } - - if(format){ - TRACE("may be ignoring some format flags: attr %x\n", format->attr); - - /* Should be no need to explicitly test for StringAlignmentNear as - * that is default behavior if no alignment is passed. */ - if(format->vertalign != StringAlignmentNear){ - RectF bounds; - GdipMeasureString(graphics, string, length, font, rect, format, &bounds, 0, 0); - - if(format->vertalign == StringAlignmentCenter) - offsety = (rect->Height - bounds.Height) / 2; - else if(format->vertalign == StringAlignmentFar) - offsety = (rect->Height - bounds.Height); - } - } - - save_state = SaveDC(graphics->hdc); - SetBkMode(graphics->hdc, TRANSPARENT); - SetTextColor(graphics->hdc, brush->lb.lbColor); - - pt[0].X = 0.0; - pt[0].Y = 0.0; - pt[1].X = 1.0; - pt[1].Y = 0.0; - pt[2].X = 0.0; - pt[2].Y = 1.0; - GdipTransformPoints(graphics, CoordinateSpaceDevice, CoordinateSpaceWorld, pt, 3); - angle = -gdiplus_atan2((pt[1].Y - pt[0].Y), (pt[1].X - pt[0].X)); - args.ang_cos = cos(angle); - args.ang_sin = sin(angle); - rel_width = sqrt((pt[1].Y-pt[0].Y)*(pt[1].Y-pt[0].Y)+ - (pt[1].X-pt[0].X)*(pt[1].X-pt[0].X)); - rel_height = sqrt((pt[2].Y-pt[0].Y)*(pt[2].Y-pt[0].Y)+ - (pt[2].X-pt[0].X)*(pt[2].X-pt[0].X)); - - rectcpy[3].X = rectcpy[0].X = rect->X; - rectcpy[1].Y = rectcpy[0].Y = rect->Y + offsety; - rectcpy[2].X = rectcpy[1].X = rect->X + rect->Width; - rectcpy[3].Y = rectcpy[2].Y = rect->Y + offsety + rect->Height; - transform_and_round_points(graphics, corners, rectcpy, 4); - - scaled_rect.X = 0.0; - scaled_rect.Y = 0.0; - scaled_rect.Width = rel_width * rect->Width; - scaled_rect.Height = rel_height * rect->Height; - - if (roundr(scaled_rect.Width) != 0 && roundr(scaled_rect.Height) != 0) - { - /* FIXME: If only the width or only the height is 0, we should probably still clip */ - rgn = CreatePolygonRgn(corners, 4, ALTERNATE); - SelectClipRgn(graphics->hdc, rgn); - } - - /* Use gdi to find the font, then perform transformations on it (height, - * width, angle). */ - SelectObject(graphics->hdc, CreateFontIndirectW(&font->lfw)); - GetTextMetricsW(graphics->hdc, &textmet); - lfw = font->lfw; - - lfw.lfHeight = roundr(((REAL)lfw.lfHeight) * rel_height); - lfw.lfWidth = roundr(textmet.tmAveCharWidth * rel_width); - - lfw.lfEscapement = lfw.lfOrientation = roundr((angle / M_PI) * 1800.0); - - gdifont = CreateFontIndirectW(&lfw); - DeleteObject(SelectObject(graphics->hdc, CreateFontIndirectW(&lfw))); - - if (!format || format->align == StringAlignmentNear) - { - args.drawbase.x = corners[0].x; - args.drawbase.y = corners[0].y; - args.drawflags = DT_NOCLIP | DT_EXPANDTABS; - } - else if (format->align == StringAlignmentCenter) - { - args.drawbase.x = (corners[0].x + corners[1].x)/2; - args.drawbase.y = (corners[0].y + corners[1].y)/2; - args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_CENTER; - } - else /* (format->align == StringAlignmentFar) */ - { - args.drawbase.x = corners[1].x; - args.drawbase.y = corners[1].y; - args.drawflags = DT_NOCLIP | DT_EXPANDTABS | DT_RIGHT; - } - - gdip_format_string(graphics, string, length, font, &scaled_rect, format, - draw_string_callback, &args); - - DeleteObject(rgn); - DeleteObject(gdifont); - - RestoreDC(graphics->hdc, save_state); - - return Ok; -} - GpStatus WINGDIPAPI GdipResetClip(GpGraphics *graphics) { TRACE("(%p)\n", graphics); @@ -4615,12 +4300,7 @@ GpStatus WINGDIPAPI GdipTransformPointsI(GpGraphics *graphics, GpCoordinateSpace HPALETTE WINGDIPAPI GdipCreateHalftonePalette(void) { - static int calls; - - TRACE("\n"); - - if (!calls++) - FIXME("stub\n"); + FIXME("\n"); return NULL; } diff --git a/dll/win32/gdiplus/image.c b/dll/win32/gdiplus/image.c index 0a73dcf6ca4..58f3c6570be 100644 --- a/dll/win32/gdiplus/image.c +++ b/dll/win32/gdiplus/image.c @@ -122,7 +122,7 @@ static inline void getpixel_16bppGrayScale(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((const WORD*)(row)+x); + WORD pixel = *((WORD*)(row)+x); *r = (pixel>>7&0xf8)|(pixel>>12&0x7); *g = (pixel>>2&0xf8)|(pixel>>6&0x7); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -132,7 +132,7 @@ static inline void getpixel_16bppRGB555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((const WORD*)(row)+x); + WORD pixel = *((WORD*)(row)+x); *r = (pixel>>8&0xf8)|(pixel>>13&0x7); *g = (pixel>>3&0xfc)|(pixel>>9&0x3); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -142,7 +142,7 @@ static inline void getpixel_16bppRGB565(BYTE *r, BYTE *g, BYTE *b, BYTE *a, static inline void getpixel_16bppARGB1555(BYTE *r, BYTE *g, BYTE *b, BYTE *a, const BYTE *row, UINT x) { - WORD pixel = *((const WORD*)(row)+x); + WORD pixel = *((WORD*)(row)+x); *r = (pixel>>7&0xf8)|(pixel>>12&0x7); *g = (pixel>>2&0xf8)|(pixel>>6&0x7); *b = (pixel<<3&0xf8)|(pixel>>2&0x7); @@ -1831,37 +1831,6 @@ GpStatus WINGDIPAPI GdipEmfToWmfBits(HENHMETAFILE hemf, UINT cbData16, return NotImplemented; } -/* Internal utility function: Replace the image data of dst with that of src, - * and free src. */ -static void move_bitmap(GpBitmap *dst, GpBitmap *src, BOOL clobber_palette) -{ - GdipFree(dst->bitmapbits); - DeleteDC(dst->hdc); - DeleteObject(dst->hbitmap); - - if (clobber_palette) - { - GdipFree(dst->image.palette_entries); - dst->image.palette_flags = src->image.palette_flags; - dst->image.palette_count = src->image.palette_count; - dst->image.palette_entries = src->image.palette_entries; - } - else - GdipFree(src->image.palette_entries); - - dst->image.xres = src->image.xres; - dst->image.yres = src->image.yres; - dst->width = src->width; - dst->height = src->height; - dst->format = src->format; - dst->hbitmap = src->hbitmap; - dst->hdc = src->hdc; - dst->bits = src->bits; - dst->stride = src->stride; - - GdipFree(src); -} - GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image) { TRACE("%p\n", image); @@ -1977,7 +1946,6 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image, GpGraphics **graphics) { HDC hdc; - GpStatus stat; TRACE("%p %p\n", image, graphics); @@ -1997,12 +1965,7 @@ GpStatus WINGDIPAPI GdipGetImageGraphicsContext(GpImage *image, ((GpBitmap*)image)->hdc = hdc; } - stat = GdipCreateFromHDC(hdc, graphics); - - if (stat == Ok) - (*graphics)->image = image; - - return stat; + return GdipCreateFromHDC(hdc, graphics); } GpStatus WINGDIPAPI GdipGetImageHeight(GpImage *image, UINT *height) @@ -2496,11 +2459,6 @@ static GpStatus decode_image_gif(IStream* stream, REFCLSID clsid, GpImage **imag return decode_image_wic(stream, &CLSID_WICGifDecoder, image); } -static GpStatus decode_image_tiff(IStream* stream, REFCLSID clsid, GpImage **image) -{ - return decode_image_wic(stream, &CLSID_WICTiffDecoder, image); -} - static GpStatus decode_image_olepicture_metafile(IStream* stream, REFCLSID clsid, GpImage **image) { IPicture *pic; @@ -2547,7 +2505,6 @@ typedef enum { BMP, JPEG, GIF, - TIFF, EMF, WMF, PNG, @@ -2560,11 +2517,10 @@ static const struct image_codec codecs[NUM_CODECS]; static GpStatus get_decoder_info(IStream* stream, const struct image_codec **result) { BYTE signature[8]; - const BYTE *pattern, *mask; LARGE_INTEGER seek; HRESULT hr; UINT bytesread; - int i, j, sig; + int i, j; /* seek to the start of the stream */ seek.QuadPart = 0; @@ -2572,7 +2528,7 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if (FAILED(hr)) return hresult_to_status(hr); /* read the first 8 bytes */ - /* FIXME: This assumes all codecs have signatures <= 8 bytes in length */ + /* FIXME: This assumes all codecs have one signature <= 8 bytes in length */ hr = IStream_Read(stream, signature, 8, &bytesread); if (FAILED(hr)) return hresult_to_status(hr); if (hr == S_FALSE || bytesread == 0) return GenericError; @@ -2581,18 +2537,13 @@ static GpStatus get_decoder_info(IStream* stream, const struct image_codec **res if ((codecs[i].info.Flags & ImageCodecFlagsDecoder) && bytesread >= codecs[i].info.SigSize) { - for (sig=0; sigtype != ImageTypeBitmap) - { - FIXME("Not implemented for type %i\n", image->type); - return NotImplemented; - } - - bitmap = (GpBitmap*)image; - bpp = PIXELFORMATBPP(bitmap->format); - - if (bpp < 8) - { - FIXME("Not implemented for %i bit images\n", bpp); - return NotImplemented; - } - - if (rotate_90) - { - width = bitmap->height; - height = bitmap->width; - } - else - { - width = bitmap->width; - height = bitmap->height; - } - - bytesperpixel = bpp/8; - - stat = GdipCreateBitmapFromScan0(width, height, 0, bitmap->format, NULL, &new_bitmap); - - if (stat != Ok) - return stat; - - stat = GdipBitmapLockBits(bitmap, NULL, ImageLockModeRead, bitmap->format, &src_lock); - - if (stat == Ok) - { - stat = GdipBitmapLockBits(new_bitmap, NULL, ImageLockModeWrite, bitmap->format, &dst_lock); - - if (stat == Ok) - { - LPBYTE src_row, src_pixel; - LPBYTE dst_row, dst_pixel; - - src_origin = src_lock.Scan0; - if (flip_x) src_origin += bytesperpixel * (bitmap->width - 1); - if (flip_y) src_origin += src_lock.Stride * (bitmap->height - 1); - - if (rotate_90) - { - if (flip_y) src_x_offset = -src_lock.Stride; - else src_x_offset = src_lock.Stride; - if (flip_x) src_y_offset = -bytesperpixel; - else src_y_offset = bytesperpixel; - } - else - { - if (flip_x) src_x_offset = -bytesperpixel; - else src_x_offset = bytesperpixel; - if (flip_y) src_y_offset = -src_lock.Stride; - else src_y_offset = src_lock.Stride; - } - - src_row = src_origin; - dst_row = dst_lock.Scan0; - for (y=0; ycharsets, &mlang_info, - UlongToHandle(InterlockedIncrement(&This->next_charset_handle))); + (HCHARSET)InterlockedIncrement(&This->next_charset_handle)); } LeaveCriticalSection(&This->cs); diff --git a/dll/win32/inetcomm/mimeole.c b/dll/win32/inetcomm/mimeole.c index f297c2973b4..992949a44ef 100644 --- a/dll/win32/inetcomm/mimeole.c +++ b/dll/win32/inetcomm/mimeole.c @@ -1419,7 +1419,7 @@ static HRESULT create_sub_stream(IStream *stream, ULARGE_INTEGER start, ULARGE_I typedef struct body_t { struct list entry; - DWORD index; + HBODY hbody; IMimeBody *mime_body; struct body_t *parent; @@ -1434,7 +1434,7 @@ typedef struct MimeMessage IStream *stream; struct list body_tree; - DWORD next_index; + HBODY next_hbody; } MimeMessage; static HRESULT WINAPI MimeMessage_QueryInterface(IMimeMessage *iface, REFIID riid, void **ppv) @@ -1512,13 +1512,13 @@ static HRESULT WINAPI MimeMessage_IsDirty( return E_NOTIMPL; } -static body_t *new_body_entry(IMimeBody *mime_body, DWORD index, body_t *parent) +static body_t *new_body_entry(IMimeBody *mime_body, HBODY hbody, body_t *parent) { body_t *body = HeapAlloc(GetProcessHeap(), 0, sizeof(*body)); if(body) { body->mime_body = mime_body; - body->index = index; + body->hbody = hbody; list_init(&body->children); body->parent = parent; } @@ -1630,7 +1630,8 @@ static body_t *create_sub_body(MimeMessage *msg, IStream *pStm, BODYOFFSETS *off offset->cbBodyStart = cur.u.LowPart + offset->cbHeaderStart; if(parent) MimeBody_set_offsets(impl_from_IMimeBody(mime_body), offset); IMimeBody_SetData(mime_body, IET_BINARY, NULL, NULL, &IID_IStream, pStm); - body = new_body_entry(mime_body, msg->next_index++, parent); + body = new_body_entry(mime_body, msg->next_hbody, parent); + msg->next_hbody = (HBODY)((DWORD)msg->next_hbody + 1); if(IMimeBody_IsContentType(mime_body, "multipart", NULL) == S_OK) { @@ -1811,7 +1812,7 @@ static HRESULT find_body(struct list *list, HBODY hbody, body_t **body) LIST_FOR_EACH_ENTRY(cur, list, body_t, entry) { - if(cur->index == HandleToUlong(hbody)) + if(cur->hbody == hbody) { *body = cur; return S_OK; @@ -1947,7 +1948,7 @@ static HRESULT WINAPI MimeMessage_GetBody( hr = get_body(This, location, hPivot, &body); - if(hr == S_OK) *phBody = UlongToHandle(body->index); + if(hr == S_OK) *phBody = body->hbody; return hr; } @@ -2002,35 +2003,38 @@ static HRESULT WINAPI MimeMessage_CountBodies( return S_OK; } -static HRESULT find_next(IMimeMessage *msg, body_t *body, LPFINDBODY find, HBODY *out) +static HRESULT find_next(IMimeMessage *msg, LPFINDBODY find_body, HBODY *out) { - MimeMessage *This = (MimeMessage *)msg; - struct list *ptr; + HRESULT hr; + IMimeBody *mime_body; HBODY next; - for (;;) + if(find_body->dwReserved == 0) + find_body->dwReserved = (DWORD)HBODY_ROOT; + else { - if (!body) ptr = list_head( &This->body_tree ); + hr = IMimeMessage_GetBody(msg, IBL_FIRST, (HBODY)find_body->dwReserved, &next); + if(hr == S_OK) + find_body->dwReserved = (DWORD)next; else { - ptr = list_head( &body->children ); - while (!ptr) - { - if (!body->parent) return MIME_E_NOT_FOUND; - if (!(ptr = list_next( &body->parent->children, &body->entry ))) body = body->parent; - } + hr = IMimeMessage_GetBody(msg, IBL_NEXT, (HBODY)find_body->dwReserved, &next); + if(hr == S_OK) + find_body->dwReserved = (DWORD)next; + else + return MIME_E_NOT_FOUND; } + } - body = LIST_ENTRY( ptr, body_t, entry ); - next = UlongToHandle( body->index ); - find->dwReserved = body->index; - if (IMimeBody_IsContentType(body->mime_body, find->pszPriType, find->pszSubType) == S_OK) - { - *out = next; - return S_OK; - } + hr = IMimeMessage_BindToObject(msg, (HBODY)find_body->dwReserved, &IID_IMimeBody, (void**)&mime_body); + if(IMimeBody_IsContentType(mime_body, find_body->pszPriType, find_body->pszSubType) == S_OK) + { + IMimeBody_Release(mime_body); + *out = (HBODY)find_body->dwReserved; + return S_OK; } - return MIME_E_NOT_FOUND; + IMimeBody_Release(mime_body); + return find_next(msg, find_body, out); } static HRESULT WINAPI MimeMessage_FindFirst( @@ -2041,7 +2045,7 @@ static HRESULT WINAPI MimeMessage_FindFirst( TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); pFindBody->dwReserved = 0; - return find_next( iface, NULL, pFindBody, phBody ); + return find_next(iface, pFindBody, phBody); } static HRESULT WINAPI MimeMessage_FindNext( @@ -2049,15 +2053,9 @@ static HRESULT WINAPI MimeMessage_FindNext( LPFINDBODY pFindBody, LPHBODY phBody) { - MimeMessage *This = (MimeMessage *)iface; - body_t *body; - HRESULT hr; - TRACE("(%p)->(%p, %p)\n", iface, pFindBody, phBody); - hr = find_body( &This->body_tree, UlongToHandle( pFindBody->dwReserved ), &body ); - if (hr != S_OK) return MIME_E_NOT_FOUND; - return find_next( iface, body, pFindBody, phBody ); + return find_next(iface, pFindBody, phBody); } static HRESULT WINAPI MimeMessage_ResolveURL( @@ -2564,7 +2562,7 @@ HRESULT MimeMessage_create(IUnknown *outer, void **obj) This->refs = 1; This->stream = NULL; list_init(&This->body_tree); - This->next_index = 1; + This->next_hbody = (HBODY)1; *obj = &This->lpVtbl; return S_OK; diff --git a/dll/win32/inseng/inseng_main.c b/dll/win32/inseng/inseng_main.c index f1f148b4398..8ceb252b511 100644 --- a/dll/win32/inseng/inseng_main.c +++ b/dll/win32/inseng/inseng_main.c @@ -61,6 +61,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) HRESULT WINAPI DllCanUnloadNow(void) { + FIXME("\n"); return S_FALSE; } diff --git a/dll/win32/jscript/jscript.h b/dll/win32/jscript/jscript.h index c1c8e60f35b..00688273de8 100644 --- a/dll/win32/jscript/jscript.h +++ b/dll/win32/jscript/jscript.h @@ -324,7 +324,6 @@ HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,con DWORD*,DWORD*,match_result_t*); HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*); HRESULT parse_regexp_flags(const WCHAR*,DWORD,DWORD*); -HRESULT regexp_string_match(script_ctx_t*,DispatchEx*,BSTR,VARIANT*,jsexcept_t*); static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i) { diff --git a/dll/win32/jscript/regexp.c b/dll/win32/jscript/regexp.c index 7861d229826..04575458105 100644 --- a/dll/win32/jscript/regexp.c +++ b/dll/win32/jscript/regexp.c @@ -2384,7 +2384,7 @@ SimpleMatch(REGlobalData *gData, REMatchState *x, REOp op, RECharSet *charSet; const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), + TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, (int)gData->stateStackTop * 2, "", opname); switch (op) { @@ -2623,7 +2623,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x) for (;;) { const char *opname = reop_names[op]; - TRACE("\n%06d: %*s%s\n", (int)(pc - gData->regexp->program), + TRACE("\n%06d: %*s%s\n", pc - gData->regexp->program, (int)gData->stateStackTop * 2, "", opname); if (REOP_IS_SIMPLE(op)) { @@ -3637,25 +3637,25 @@ static HRESULT run_exec(script_ctx_t *ctx, vdisp_t *jsthis, VARIANT *arg, jsexce hres = to_string(ctx, arg, ei, &string); if(FAILED(hres)) return hres; - length = SysStringLen(string); }else { - string = NULL; - length = 0; + string = SysAllocStringLen(NULL, 0); + if(!string) + return E_OUTOFMEMORY; } - if(regexp->jsregexp->flags & JSREG_GLOB) { - if(regexp->last_index < 0) { - SysFreeString(string); - set_last_index(regexp, 0); - *ret = VARIANT_FALSE; - if(input) { - *input = NULL; - } - return S_OK; + if(regexp->last_index < 0) { + SysFreeString(string); + set_last_index(regexp, 0); + *ret = VARIANT_FALSE; + if(input) { + *input = NULL; } + return S_OK; + } + length = SysStringLen(string); + if(regexp->jsregexp->flags & JSREG_GLOB) last_index = regexp->last_index; - } cp = string + last_index; hres = regexp_match_next(ctx, ®exp->dispex, REM_RESET_INDEX, string, length, &cp, parens, @@ -3878,87 +3878,6 @@ HRESULT create_regexp_var(script_ctx_t *ctx, VARIANT *src_arg, VARIANT *flags_ar return create_regexp(ctx, src, -1, flags, ret); } -HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str, - VARIANT *retv, jsexcept_t *ei) -{ - RegExpInstance *regexp = (RegExpInstance*)re; - match_result_t *match_result; - DWORD match_cnt, i, length; - DispatchEx *array; - VARIANT var; - HRESULT hres; - - length = SysStringLen(str); - - if(!(regexp->jsregexp->flags & JSREG_GLOB)) { - match_result_t match, *parens = NULL; - DWORD parens_cnt, parens_size = 0; - const WCHAR *cp = str; - - hres = regexp_match_next(ctx, ®exp->dispex, 0, str, length, &cp, &parens, &parens_size, &parens_cnt, &match); - if(FAILED(hres)) - return hres; - - if(retv) { - if(hres == S_OK) { - IDispatch *ret; - - hres = create_match_array(ctx, str, &match, parens, parens_cnt, ei, &ret); - if(SUCCEEDED(hres)) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = ret; - } - }else { - V_VT(retv) = VT_NULL; - } - } - - heap_free(parens); - return S_OK; - } - - hres = regexp_match(ctx, ®exp->dispex, str, length, FALSE, &match_result, &match_cnt); - if(FAILED(hres)) - return hres; - - if(!match_cnt) { - TRACE("no match\n"); - - if(retv) - V_VT(retv) = VT_NULL; - return S_OK; - } - - hres = create_array(ctx, match_cnt, &array); - if(FAILED(hres)) - return hres; - - V_VT(&var) = VT_BSTR; - - for(i=0; i < match_cnt; i++) { - V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); - if(!V_BSTR(&var)) { - hres = E_OUTOFMEMORY; - break; - } - - hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); - SysFreeString(V_BSTR(&var)); - if(FAILED(hres)) - break; - } - - heap_free(match_result); - - if(SUCCEEDED(hres) && retv) { - V_VT(retv) = VT_DISPATCH; - V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); - }else { - jsdisp_release(array); - } - return hres; -} - static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { diff --git a/dll/win32/jscript/string.c b/dll/win32/jscript/string.c index 510dcc272c6..df43fee27ed 100644 --- a/dll/win32/jscript/string.c +++ b/dll/win32/jscript/string.c @@ -622,9 +622,11 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp) { const WCHAR *str; + match_result_t *match_result; DispatchEx *regexp; - VARIANT *arg_var; - DWORD length; + DispatchEx *array; + VARIANT var, *arg_var; + DWORD length, match_cnt, i; BSTR val_str = NULL; HRESULT hres = S_OK; @@ -643,7 +645,7 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP case VT_DISPATCH: regexp = iface_to_jsdisp((IUnknown*)V_DISPATCH(arg_var)); if(regexp) { - if(is_class(regexp, JSCLASS_REGEXP)) + if(regexp->builtin_info->class == JSCLASS_REGEXP) break; jsdisp_release(regexp); } @@ -662,17 +664,54 @@ static HRESULT String_match(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISP } hres = get_string_val(ctx, jsthis, ei, &str, &length, &val_str); - if(SUCCEEDED(hres)) { - if(!val_str) - val_str = SysAllocStringLen(str, length); - if(val_str) - hres = regexp_string_match(ctx, regexp, val_str, retv, ei); - else + if(SUCCEEDED(hres)) + hres = regexp_match(ctx, regexp, str, length, FALSE, &match_result, &match_cnt); + jsdisp_release(regexp); + if(FAILED(hres)) { + SysFreeString(val_str); + return hres; + } + + if(!match_cnt) { + TRACE("no match\n"); + + if(retv) + V_VT(retv) = VT_NULL; + + SysFreeString(val_str); + return S_OK; + } + + hres = create_array(ctx, match_cnt, &array); + if(FAILED(hres)) { + SysFreeString(val_str); + return hres; + } + + V_VT(&var) = VT_BSTR; + + for(i=0; i < match_cnt; i++) { + V_BSTR(&var) = SysAllocStringLen(match_result[i].str, match_result[i].len); + if(!V_BSTR(&var)) { hres = E_OUTOFMEMORY; + break; + } + + hres = jsdisp_propput_idx(array, i, &var, ei, NULL/*FIXME*/); + SysFreeString(V_BSTR(&var)); + if(FAILED(hres)) + break; } - jsdisp_release(regexp); + heap_free(match_result); SysFreeString(val_str); + + if(SUCCEEDED(hres) && retv) { + V_VT(retv) = VT_DISPATCH; + V_DISPATCH(retv) = (IDispatch*)_IDispatchEx_(array); + }else { + jsdisp_release(array); + } return hres; } diff --git a/dll/win32/kernel32/file/dir.c b/dll/win32/kernel32/file/dir.c index 848d4f8f543..97c04470e75 100644 --- a/dll/win32/kernel32/file/dir.c +++ b/dll/win32/kernel32/file/dir.c @@ -741,7 +741,7 @@ GetShortPathNameW ( } /* check for drive letter */ - if (longpath[0] != '/' && longpath[1] == ':' ) + if (longpath[1] == ':' ) { tmpshortpath[0] = longpath[0]; tmpshortpath[1] = ':'; @@ -772,7 +772,7 @@ GetShortPathNameW ( tmplen = p - (longpath + lp); lstrcpynW(tmpshortpath + sp, longpath + lp, tmplen + 1); /* Check, if the current element is a valid dos name */ - if (tmplen <= 8+1+3) + if (tmplen <= 8+1+3+1) { BOOLEAN spaces; memcpy(ustr_buf, longpath + lp, tmplen * sizeof(WCHAR)); diff --git a/dll/win32/kernel32/kernel32.pspec b/dll/win32/kernel32/kernel32.pspec index cba32d9f29d..b952a287b5d 100644 --- a/dll/win32/kernel32/kernel32.pspec +++ b/dll/win32/kernel32/kernel32.pspec @@ -966,9 +966,11 @@ @ stdcall WaitNamedPipeW (wstr long) @ stdcall WideCharToMultiByte(long long wstr long ptr long ptr ptr) @ stdcall WinExec(str long) +#ifdef _M_AMD64 @ stdcall Wow64EnableWow64FsRedirection(long) @ stdcall Wow64DisableWow64FsRedirection(long) @ stdcall Wow64RevertWow64FsRedirection(long) +#endif @ stdcall WriteConsoleA(long ptr long ptr ptr) @ stdcall WriteConsoleInputA(long ptr long ptr) @ stdcall WriteConsoleInputVDMA(long long long long) diff --git a/dll/win32/kernel32/misc/stubs.c b/dll/win32/kernel32/misc/stubs.c index c852f34d1f9..d22e9baed17 100644 --- a/dll/win32/kernel32/misc/stubs.c +++ b/dll/win32/kernel32/misc/stubs.c @@ -885,9 +885,9 @@ NlsGetCacheUpdateCount(VOID) return 0; } -BOOLEAN +BOOL WINAPI -Wow64EnableWow64FsRedirection (BOOLEAN Wow64EnableWow64FsRedirection) +Wow64EnableWow64FsRedirection (BOOL Wow64EnableWow64FsRedirection) { STUB; return FALSE; diff --git a/dll/win32/localspl/provider.c b/dll/win32/localspl/provider.c index 322418804c3..b17e074b845 100644 --- a/dll/win32/localspl/provider.c +++ b/dll/win32/localspl/provider.c @@ -1375,7 +1375,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo } /* Verified with the Adobe PS Driver, that w2k does not use di.Version */ - RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (const BYTE*) &env->driverversion, + RegSetValueExW(hdrv, versionW, 0, REG_DWORD, (LPBYTE) &env->driverversion, sizeof(DWORD)); RegSetValueExW(hdrv, driverW, 0, REG_SZ, (LPBYTE) di.pDriverPath, @@ -1395,7 +1395,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE) di.pHelpFile, (lstrlenW(di.pHelpFile)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, help_fileW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); apd_copyfile(di.pHelpFile, &apd); @@ -1404,7 +1404,7 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE) di.pDependentFiles, multi_sz_lenW(di.pDependentFiles)); else - RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, dependent_filesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW)); while ((ptr != NULL) && (ptr[0])) { if (apd_copyfile(ptr, &apd)) { ptr += lstrlenW(ptr) + 1; @@ -1420,20 +1420,20 @@ static BOOL myAddPrinterDriverEx(DWORD level, LPBYTE pDriverInfo, DWORD dwFileCo RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE) di.pMonitorName, (lstrlenW(di.pMonitorName)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, monitorW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); if (di.pDefaultDataType) RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE) di.pDefaultDataType, (lstrlenW(di.pDefaultDataType)+1)* sizeof(WCHAR)); else - RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (const BYTE*)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, datatypeW, 0, REG_SZ, (LPBYTE)emptyW, sizeof(emptyW)); /* settings for level 4 */ if (di.pszzPreviousNames) RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE) di.pszzPreviousNames, multi_sz_lenW(di.pszzPreviousNames)); else - RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (const BYTE*)emptyW, sizeof(emptyW)); + RegSetValueExW(hdrv, previous_namesW, 0, REG_MULTI_SZ, (LPBYTE)emptyW, sizeof(emptyW)); if (level > 5) TRACE("level %u for Driver %s is incomplete\n", level, debugstr_w(di.pName)); diff --git a/dll/win32/lpk/dllmain.c b/dll/win32/lpk/dllmain.c index 1d5bdc0e781..9b7c8e11d0d 100644 --- a/dll/win32/lpk/dllmain.c +++ b/dll/win32/lpk/dllmain.c @@ -36,7 +36,7 @@ LpkDllInitialize ( case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hDll); /* Tell usp10 it is activated usp10 */ - //LpkPresent(); + LpkPresent(); break; default: diff --git a/dll/win32/mciavi32/mciavi.c b/dll/win32/mciavi32/mciavi.c index 1c15dc55dbc..d77525ca4ff 100644 --- a/dll/win32/mciavi32/mciavi.c +++ b/dll/win32/mciavi32/mciavi.c @@ -89,7 +89,6 @@ static DWORD MCIAVI_drvOpen(LPCWSTR str, LPMCI_OPEN_DRIVER_PARMSW modp) wma->hStopEvent = CreateEventW(NULL, FALSE, FALSE, NULL); wma->wDevID = modp->wDeviceID; wma->wCommandTable = mciLoadCommandResource(MCIAVI_hInstance, mciAviWStr, 0); - wma->dwStatus = MCI_MODE_NOT_READY; modp->wCustomCommandTable = wma->wCommandTable; modp->wType = MCI_DEVTYPE_DIGITAL_VIDEO; mciSetDriverData(wma->wDevID, (DWORD_PTR)wma); @@ -302,11 +301,11 @@ DWORD MCIAVI_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpParms) wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - MCIAVI_mciStop(wDevID, MCI_WAIT, NULL); - EnterCriticalSection(&wma->cs); if (wma->nUseCount == 1) { + if (wma->dwStatus != MCI_MODE_STOP) + dwRet = MCIAVI_mciStop(wDevID, MCI_WAIT, NULL); MCIAVI_CleanUp(wma); if ((dwFlags & MCI_NOTIFY) && lpParms) { @@ -837,14 +836,14 @@ static DWORD MCIAVI_mciSetAudio(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETAUDIO_P { WINE_MCIAVI *wma; - if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms); - FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETAUDIO_ITEM ? lpParms->dwItem : 0); + if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - return 0; + return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */ } /****************************************************************************** @@ -871,14 +870,14 @@ static DWORD MCIAVI_mciSetVideo(UINT wDevID, DWORD dwFlags, LPMCI_DGV_SETVIDEO_P { WINE_MCIAVI *wma; - if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; + FIXME("(%04x, %08x, %p) : stub\n", wDevID, dwFlags, lpParms); - FIXME("(%04x, %08x, %p) Item %04x: stub\n", wDevID, dwFlags, lpParms, dwFlags & MCI_DGV_SETVIDEO_ITEM ? lpParms->dwItem : 0); + if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK; wma = MCIAVI_mciGetOpenDev(wDevID); if (wma == NULL) return MCIERR_INVALID_DEVICE_ID; - return 0; + return MCIERR_UNSUPPORTED_FUNCTION; /* like w2k */ } /****************************************************************************** diff --git a/dll/win32/mcicda/mcicda.c b/dll/win32/mcicda/mcicda.c index 6ea996a21b9..cf9132cdcff 100644 --- a/dll/win32/mcicda/mcicda.c +++ b/dll/win32/mcicda/mcicda.c @@ -420,8 +420,7 @@ static DWORD MCICDA_Open(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpOpenPar if (dwFlags & MCI_OPEN_ELEMENT) { if (dwFlags & MCI_OPEN_ELEMENT_ID) { WARN("MCI_OPEN_ELEMENT_ID %p! Abort\n", lpOpenParms->lpstrElementName); - ret = MCIERR_NO_ELEMENT_ALLOWED; - goto the_error; + return MCIERR_NO_ELEMENT_ALLOWED; } TRACE("MCI_OPEN_ELEMENT element name: %s\n", debugstr_w(lpOpenParms->lpstrElementName)); if (!isalpha(lpOpenParms->lpstrElementName[0]) || lpOpenParms->lpstrElementName[1] != ':' || @@ -484,8 +483,6 @@ static DWORD MCICDA_Close(UINT wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParm if (wmcda == NULL) return MCIERR_INVALID_DEVICE_ID; - MCICDA_Stop(wDevID, MCI_WAIT, NULL); - if (--wmcda->nUseCount == 0) { CloseHandle(wmcda->handle); } diff --git a/dll/win32/mciqtz32/mciqtz.c b/dll/win32/mciqtz32/mciqtz.c index c826de17633..b98e163ebbc 100644 --- a/dll/win32/mciqtz32/mciqtz.c +++ b/dll/win32/mciqtz32/mciqtz.c @@ -153,8 +153,7 @@ static DWORD MCIQTZ_mciOpen(UINT wDevID, DWORD dwFlags, MCIQTZ_mciStop(wDevID, MCI_WAIT, NULL); - hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - wma->uninit = SUCCEEDED(hr); + CoInitializeEx(NULL, COINIT_MULTITHREADED); hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (LPVOID*)&wma->pgraph); if (FAILED(hr)) { @@ -198,8 +197,7 @@ err: IMediaControl_Release(wma->pmctrl); wma->pmctrl = NULL; - if (wma->uninit) - CoUninitialize(); + CoUninitialize(); return MCIERR_INTERNAL; } @@ -222,8 +220,7 @@ static DWORD MCIQTZ_mciClose(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpP if (wma->opened) { IGraphBuilder_Release(wma->pgraph); IMediaControl_Release(wma->pmctrl); - if (wma->uninit) - CoUninitialize(); + CoUninitialize(); wma->opened = FALSE; } diff --git a/dll/win32/mciqtz32/mciqtz_private.h b/dll/win32/mciqtz32/mciqtz_private.h index caf80de4dc9..dcfcad0eb4a 100644 --- a/dll/win32/mciqtz32/mciqtz_private.h +++ b/dll/win32/mciqtz32/mciqtz_private.h @@ -28,7 +28,6 @@ typedef struct { MCIDEVICEID wDevID; BOOL opened; - BOOL uninit; IGraphBuilder* pgraph; IMediaControl* pmctrl; BOOL started; diff --git a/dll/win32/mciseq/mcimidi.c b/dll/win32/mciseq/mcimidi.c index 87753c33dde..301428d517d 100644 --- a/dll/win32/mciseq/mcimidi.c +++ b/dll/win32/mciseq/mcimidi.c @@ -62,7 +62,6 @@ typedef struct tagWINE_MCIMIDI { UINT wDevID; /* the MCI one */ HMIDI hMidi; int nUseCount; /* Incremented for each shared open */ - WORD wPort; /* the WINMM device unit */ WORD wNotifyDeviceID; /* MCI device ID with a pending notification */ HANDLE hCallback; /* Callback handle for pending notification */ HMMIO hFile; /* mmio file handle open as Element */ @@ -727,7 +726,6 @@ static DWORD MIDI_mciOpen(UINT wDevID, DWORD dwFlags, LPMCI_OPEN_PARMSW lpParms) wmm->hFile = 0; wmm->hMidi = 0; - wmm->wPort = MIDI_MAPPER; wmm->lpstrElementName = NULL; dwDeviceID = lpParms->wDeviceID; @@ -964,8 +962,8 @@ static DWORD MIDI_mciPlay(UINT wDevID, DWORD dwFlags, LPMCI_PLAY_PARMS lpParms) MIDI_mciReadNextEvent(wmm, mmt); /* FIXME == 0 */ } - dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL); - /* dwRet = midiInOpen(&wmm->hMidi, wmm->wPort, 0L, 0L, CALLBACK_NULL);*/ + dwRet = midiOutOpen((LPHMIDIOUT)&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL); + /* dwRet = midiInOpen(&wmm->hMidi, MIDIMAPPER, 0L, 0L, CALLBACK_NULL);*/ if (dwRet != MMSYSERR_NOERROR) { return dwRet; } @@ -1292,7 +1290,7 @@ static DWORD MIDI_mciResume(UINT wDevID, DWORD dwFlags, LPMCI_GENERIC_PARMS lpPa /************************************************************************** * MIDI_mciSet [internal] */ -static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms) +static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) { WINE_MCIMIDI* wmm = MIDI_mciGetOpenDev(wDevID); @@ -1361,15 +1359,8 @@ static DWORD MIDI_mciSet(UINT wDevID, DWORD dwFlags, LPMCI_SEQ_SET_PARMS lpParms TRACE("MCI_SEQ_SET_SLAVE !\n"); if (dwFlags & MCI_SEQ_SET_OFFSET) TRACE("MCI_SEQ_SET_OFFSET !\n"); - if (dwFlags & MCI_SEQ_SET_PORT) { - TRACE("MCI_SEQ_SET_PORT = %d\n", lpParms->dwPort); - if ((UINT16)lpParms->dwPort != (UINT16)MIDI_MAPPER && - (UINT16)lpParms->dwPort >= midiOutGetNumDevs()) - /* FIXME: input/output port distinction? */ - return MCIERR_SEQ_PORT_NONEXISTENT; - /* FIXME: Native manages to swap the device while playing! */ - wmm->wPort = lpParms->dwPort; - } + if (dwFlags & MCI_SEQ_SET_PORT) + TRACE("MCI_SEQ_SET_PORT !\n"); if (dwFlags & MCI_SEQ_SET_TEMPO) TRACE("MCI_SEQ_SET_TEMPO !\n"); return 0; @@ -1468,13 +1459,8 @@ static DWORD MIDI_mciStatus(UINT wDevID, DWORD dwFlags, LPMCI_STATUS_PARMS lpPar lpParms->dwReturn = 0; break; case MCI_SEQ_STATUS_PORT: - if (wmm->wPort != (UINT16)MIDI_MAPPER) - lpParms->dwReturn = wmm->wPort; - else { - lpParms->dwReturn = MAKEMCIRESOURCE(MIDI_MAPPER, MCI_SEQ_MAPPER_S); - ret = MCI_RESOURCE_RETURNED; - } - TRACE("MCI_SEQ_STATUS_PORT (%u) => %d\n", wmm->wDevID, wmm->wPort); + TRACE("MCI_SEQ_STATUS_PORT (%u)!\n", wmm->wDevID); + lpParms->dwReturn = MIDI_MAPPER; break; case MCI_SEQ_STATUS_TEMPO: TRACE("MCI_SEQ_STATUS_TEMPO !\n"); @@ -1678,7 +1664,7 @@ LRESULT CALLBACK MCIMIDI_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_PLAY: return MIDI_mciPlay (dwDevID, dwParam1, (LPMCI_PLAY_PARMS) dwParam2); case MCI_RECORD: return MIDI_mciRecord (dwDevID, dwParam1, (LPMCI_RECORD_PARMS) dwParam2); case MCI_STOP: return MIDI_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SEQ_SET_PARMS) dwParam2); + case MCI_SET: return MIDI_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); case MCI_PAUSE: return MIDI_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return MIDI_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return MIDI_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); diff --git a/dll/win32/mciwave/mciwave.c b/dll/win32/mciwave/mciwave.c index 87dc260207c..24e75ee9dac 100644 --- a/dll/win32/mciwave/mciwave.c +++ b/dll/win32/mciwave/mciwave.c @@ -47,8 +47,6 @@ typedef struct { WAVEFORMATEX wfxRef; LPWAVEFORMATEX lpWaveFormat; /* Points to wfxRef until set by OPEN or RECORD */ BOOL fInput; /* FALSE = Output, TRUE = Input */ - WORD wInput; /* wave input device */ - WORD wOutput; /* wave output device */ volatile WORD dwStatus; /* one from MCI_MODE_xxxx */ DWORD dwMciTimeFormat;/* One of the supported MCI_FORMAT_xxxx */ DWORD dwPosition; /* position in bytes in chunk */ @@ -531,7 +529,6 @@ static LRESULT WAVE_mciOpen(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_OPEN_P wmw->nUseCount++; - wmw->wInput = wmw->wOutput = WAVE_MAPPER; wmw->fInput = FALSE; wmw->hWave = 0; wmw->dwStatus = MCI_MODE_NOT_READY; @@ -834,7 +831,8 @@ static DWORD WAVE_mciPlay(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt, */ mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */ - dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, wmw->wOutput, wmw->lpWaveFormat, + /* FIXME: how to choose between several output channels ? here mapper is forced */ + dwRet = waveOutOpen((HWAVEOUT *)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat, (DWORD_PTR)WAVE_mciPlayCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION); if (dwRet != 0) { @@ -1066,7 +1064,11 @@ static DWORD WAVE_mciRecord(MCIDEVICEID wDevID, DWORD_PTR dwFlags, DWORD_PTR pmt */ mmioSeek(wmw->hFile, wmw->ckWaveData.dwDataOffset + wmw->dwPosition, SEEK_SET); /* >= 0 */ - dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, wmw->wInput, wmw->lpWaveFormat, + /* By default the device will be opened for output, the MCI_CUE function is there to + * change from output to input and back + */ + /* FIXME: how to choose between several output channels ? here mapper is forced */ + dwRet = waveInOpen((HWAVEIN*)&wmw->hWave, WAVE_MAPPER, wmw->lpWaveFormat, (DWORD_PTR)WAVE_mciRecordCallback, (DWORD_PTR)wmw, CALLBACK_FUNCTION); if (dwRet != MMSYSERR_NOERROR) { @@ -1277,7 +1279,7 @@ static DWORD WAVE_mciSeek(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SEEK_PARMS lp /************************************************************************** * WAVE_mciSet [internal] */ -static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_SET_PARMS lpParms) +static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_SET_PARMS lpParms) { WINE_MCIWAVE* wmw = WAVE_mciGetOpenDev(wDevID); @@ -1335,64 +1337,44 @@ static DWORD WAVE_mciSet(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_WAVE_SET_PARMS default: WARN("Unknown audio channel %u\n", lpParms->dwAudio); break; } } - if (dwFlags & MCI_WAVE_INPUT) { - TRACE("MCI_WAVE_INPUT = %d\n", lpParms->wInput); - if (lpParms->wInput >= waveInGetNumDevs()) - return MCIERR_OUTOFRANGE; - if (wmw->wInput != (WORD)lpParms->wInput) - WAVE_mciStop(wDevID, MCI_WAIT, NULL); - wmw->wInput = lpParms->wInput; - } - if (dwFlags & MCI_WAVE_OUTPUT) { - TRACE("MCI_WAVE_OUTPUT = %d\n", lpParms->wOutput); - if (lpParms->wOutput >= waveOutGetNumDevs()) - return MCIERR_OUTOFRANGE; - if (wmw->wOutput != (WORD)lpParms->wOutput) - WAVE_mciStop(wDevID, MCI_WAIT, NULL); - wmw->wOutput = lpParms->wOutput; - } - if (dwFlags & MCI_WAVE_SET_ANYINPUT) { - TRACE("MCI_WAVE_SET_ANYINPUT\n"); - if (wmw->wInput != (WORD)lpParms->wInput) - WAVE_mciStop(wDevID, MCI_WAIT, NULL); - wmw->wInput = WAVE_MAPPER; - } - if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) { - TRACE("MCI_WAVE_SET_ANYOUTPUT\n"); - if (wmw->wOutput != (WORD)lpParms->wOutput) - WAVE_mciStop(wDevID, MCI_WAIT, NULL); - wmw->wOutput = WAVE_MAPPER; - } + if (dwFlags & MCI_WAVE_INPUT) + TRACE("MCI_WAVE_INPUT !\n"); + if (dwFlags & MCI_WAVE_OUTPUT) + TRACE("MCI_WAVE_OUTPUT !\n"); + if (dwFlags & MCI_WAVE_SET_ANYINPUT) + TRACE("MCI_WAVE_SET_ANYINPUT !\n"); + if (dwFlags & MCI_WAVE_SET_ANYOUTPUT) + TRACE("MCI_WAVE_SET_ANYOUTPUT !\n"); /* Set wave format parameters is refused after Open or Record.*/ if (dwFlags & MCI_WAVE_SET_FORMATTAG) { - TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", lpParms->wFormatTag); + TRACE("MCI_WAVE_SET_FORMATTAG = %d\n", ((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag); if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - if (lpParms->wFormatTag != WAVE_FORMAT_PCM) + if (((LPMCI_WAVE_SET_PARMS)lpParms)->wFormatTag != WAVE_FORMAT_PCM) return MCIERR_OUTOFRANGE; } if (dwFlags & MCI_WAVE_SET_AVGBYTESPERSEC) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nAvgBytesPerSec = lpParms->nAvgBytesPerSec; + wmw->wfxRef.nAvgBytesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nAvgBytesPerSec; TRACE("MCI_WAVE_SET_AVGBYTESPERSEC = %d\n", wmw->wfxRef.nAvgBytesPerSec); } if (dwFlags & MCI_WAVE_SET_BITSPERSAMPLE) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.wBitsPerSample = lpParms->wBitsPerSample; + wmw->wfxRef.wBitsPerSample = ((LPMCI_WAVE_SET_PARMS)lpParms)->wBitsPerSample; TRACE("MCI_WAVE_SET_BITSPERSAMPLE = %d\n", wmw->wfxRef.wBitsPerSample); } if (dwFlags & MCI_WAVE_SET_BLOCKALIGN) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nBlockAlign = lpParms->nBlockAlign; + wmw->wfxRef.nBlockAlign = ((LPMCI_WAVE_SET_PARMS)lpParms)->nBlockAlign; TRACE("MCI_WAVE_SET_BLOCKALIGN = %d\n", wmw->wfxRef.nBlockAlign); } if (dwFlags & MCI_WAVE_SET_CHANNELS) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nChannels = lpParms->nChannels; + wmw->wfxRef.nChannels = ((LPMCI_WAVE_SET_PARMS)lpParms)->nChannels; TRACE("MCI_WAVE_SET_CHANNELS = %d\n", wmw->wfxRef.nChannels); } if (dwFlags & MCI_WAVE_SET_SAMPLESPERSEC) { if (wmw->lpWaveFormat != &wmw->wfxRef) return MCIERR_NONAPPLICABLE_FUNCTION; - wmw->wfxRef.nSamplesPerSec = lpParms->nSamplesPerSec; + wmw->wfxRef.nSamplesPerSec = ((LPMCI_WAVE_SET_PARMS)lpParms)->nSamplesPerSec; TRACE("MCI_WAVE_SET_SAMPLESPERSEC = %d\n", wmw->wfxRef.nSamplesPerSec); } if (dwFlags & MCI_NOTIFY) @@ -1518,34 +1500,24 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM ret = MCI_RESOURCE_RETURNED; break; case MCI_WAVE_INPUT: - if (wmw->wInput != (WORD)WAVE_MAPPER) - lpParms->dwReturn = wmw->wInput; - else { - lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S); - ret = MCI_RESOURCE_RETURNED; - } - TRACE("MCI_WAVE_INPUT => %d\n", (signed)wmw->wInput); + TRACE("MCI_WAVE_INPUT !\n"); + lpParms->dwReturn = 0; + ret = MCIERR_WAVE_INPUTUNSPECIFIED; break; case MCI_WAVE_OUTPUT: - if (wmw->wOutput != (WORD)WAVE_MAPPER) - lpParms->dwReturn = wmw->wOutput; - else { - lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_MAPPER, WAVE_MAPPER_S); - ret = MCI_RESOURCE_RETURNED; + TRACE("MCI_WAVE_OUTPUT !\n"); + { + UINT id; + if (waveOutGetID(wmw->hWave, &id) == MMSYSERR_NOERROR) { + lpParms->dwReturn = id; + } else { + lpParms->dwReturn = 0; + ret = MCIERR_WAVE_OUTPUTUNSPECIFIED; + } } - TRACE("MCI_WAVE_OUTPUT => %d\n", (signed)wmw->wOutput); break; /* It is always ok to query wave format parameters, * except on auto-open yield MCIERR_UNSUPPORTED_FUNCTION. */ - case MCI_WAVE_STATUS_FORMATTAG: - if (wmw->lpWaveFormat->wFormatTag != WAVE_FORMAT_PCM) - lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; - else { - lpParms->dwReturn = MAKEMCIRESOURCE(WAVE_FORMAT_PCM, WAVE_FORMAT_PCM_S); - ret = MCI_RESOURCE_RETURNED; - } - TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn); - break; case MCI_WAVE_STATUS_AVGBYTESPERSEC: lpParms->dwReturn = wmw->lpWaveFormat->nAvgBytesPerSec; TRACE("MCI_WAVE_STATUS_AVGBYTESPERSEC => %lu\n", lpParms->dwReturn); @@ -1562,6 +1534,10 @@ static DWORD WAVE_mciStatus(MCIDEVICEID wDevID, DWORD dwFlags, LPMCI_STATUS_PARM lpParms->dwReturn = wmw->lpWaveFormat->nChannels; TRACE("MCI_WAVE_STATUS_CHANNELS => %lu\n", lpParms->dwReturn); break; + case MCI_WAVE_STATUS_FORMATTAG: + lpParms->dwReturn = wmw->lpWaveFormat->wFormatTag; + TRACE("MCI_WAVE_FORMATTAG => %lu\n", lpParms->dwReturn); + break; case MCI_WAVE_STATUS_SAMPLESPERSEC: lpParms->dwReturn = wmw->lpWaveFormat->nSamplesPerSec; TRACE("MCI_WAVE_STATUS_SAMPLESPERSEC => %lu\n", lpParms->dwReturn); @@ -1729,7 +1705,7 @@ LRESULT CALLBACK MCIWAVE_DriverProc(DWORD_PTR dwDevID, HDRVR hDriv, UINT wMsg, case MCI_PLAY: return WAVE_mciPlay (dwDevID, dwParam1, dwParam2, NULL); case MCI_RECORD: return WAVE_mciRecord (dwDevID, dwParam1, dwParam2, NULL); case MCI_STOP: return WAVE_mciStop (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); - case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_WAVE_SET_PARMS) dwParam2); + case MCI_SET: return WAVE_mciSet (dwDevID, dwParam1, (LPMCI_SET_PARMS) dwParam2); case MCI_PAUSE: return WAVE_mciPause (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_RESUME: return WAVE_mciResume (dwDevID, dwParam1, (LPMCI_GENERIC_PARMS) dwParam2); case MCI_STATUS: return WAVE_mciStatus (dwDevID, dwParam1, (LPMCI_STATUS_PARMS) dwParam2); diff --git a/dll/win32/msacm32/msacm32.rbuild b/dll/win32/msacm32/msacm32.rbuild index b6f802ee5bb..df9cb0340ef 100644 --- a/dll/win32/msacm32/msacm32.rbuild +++ b/dll/win32/msacm32/msacm32.rbuild @@ -1,6 +1,6 @@ - + . diff --git a/dll/win32/mscoree/mscoree.rbuild b/dll/win32/mscoree/mscoree.rbuild index a014334a962..2fa0743f07a 100644 --- a/dll/win32/mscoree/mscoree.rbuild +++ b/dll/win32/mscoree/mscoree.rbuild @@ -5,7 +5,6 @@ wine advapi32 - shell32 uuid corruntimehost.c mscoree_main.c diff --git a/dll/win32/mscoree/mscoree.spec b/dll/win32/mscoree/mscoree.spec index 8e25cec2b7d..9365f189b51 100644 --- a/dll/win32/mscoree/mscoree.spec +++ b/dll/win32/mscoree/mscoree.spec @@ -7,7 +7,7 @@ @ stub CallFunctionShim @ stub CloseCtrs -@ stdcall ClrCreateManagedInstance(wstr ptr ptr) +@ stub ClrCreateManagedInstance @ stub CoEEShutDownCOM @ stdcall CoInitializeCor(long) @ stub CoInitializeEE diff --git a/dll/win32/mscoree/mscoree_main.c b/dll/win32/mscoree/mscoree_main.c index 0e6f25204cc..dcdc91a5cc1 100644 --- a/dll/win32/mscoree/mscoree_main.c +++ b/dll/win32/mscoree/mscoree_main.c @@ -21,14 +21,11 @@ #include -#include "wine/unicode.h" #include "windef.h" #include "winbase.h" #include "winuser.h" -#include "winnls.h" #include "winreg.h" #include "ole2.h" -#include "shellapi.h" #include "initguid.h" #include "cor.h" @@ -39,25 +36,26 @@ WINE_DEFAULT_DEBUG_CHANNEL( mscoree ); -static BOOL get_mono_path(LPWSTR path) +static LPWSTR get_mono_exe(void) { + static const WCHAR mono_exe[] = {'b','i','n','\\','m','o','n','o','.','e','x','e',' ',0}; static const WCHAR mono_key[] = {'S','o','f','t','w','a','r','e','\\','N','o','v','e','l','l','\\','M','o','n','o',0}; static const WCHAR defaul_clr[] = {'D','e','f','a','u','l','t','C','L','R',0}; static const WCHAR install_root[] = {'S','d','k','I','n','s','t','a','l','l','R','o','o','t',0}; static const WCHAR slash[] = {'\\',0}; - WCHAR version[64], version_key[MAX_PATH]; - DWORD len; + WCHAR version[64], version_key[MAX_PATH], root[MAX_PATH], *ret; + DWORD len, size; HKEY key; if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, mono_key, 0, KEY_READ, &key)) - return FALSE; + return NULL; len = sizeof(version); if (RegQueryValueExW(key, defaul_clr, 0, NULL, (LPBYTE)version, &len)) { RegCloseKey(key); - return FALSE; + return NULL; } RegCloseKey(key); @@ -66,129 +64,24 @@ static BOOL get_mono_path(LPWSTR path) lstrcatW(version_key, version); if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, version_key, 0, KEY_READ, &key)) - return FALSE; + return NULL; - len = sizeof(WCHAR) * MAX_PATH; - if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)path, &len)) + len = sizeof(root); + if (RegQueryValueExW(key, install_root, 0, NULL, (LPBYTE)root, &len)) { RegCloseKey(key); - return FALSE; + return NULL; } RegCloseKey(key); - return TRUE; -} - -static CRITICAL_SECTION mono_lib_cs; -static CRITICAL_SECTION_DEBUG mono_lib_cs_debug = -{ - 0, 0, &mono_lib_cs, - { &mono_lib_cs_debug.ProcessLocksList, - &mono_lib_cs_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": mono_lib_cs") } -}; -static CRITICAL_SECTION mono_lib_cs = { &mono_lib_cs_debug, -1, 0, 0, 0, 0 }; - -HMODULE mono_handle; - -void (*mono_config_parse)(const char *filename); -MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); -void (*mono_jit_cleanup)(MonoDomain *domain); -int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); -MonoDomain* (*mono_jit_init)(const char *file); -int (*mono_jit_set_trace_options)(const char* options); -void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir); - -static void set_environment(LPCWSTR bin_path) -{ - WCHAR path_env[MAX_PATH]; - int len; - - static const WCHAR pathW[] = {'P','A','T','H',0}; - - /* We have to modify PATH as Mono loads other DLLs from this directory. */ - GetEnvironmentVariableW(pathW, path_env, sizeof(path_env)/sizeof(WCHAR)); - len = strlenW(path_env); - path_env[len++] = ';'; - strcpyW(path_env+len, bin_path); - SetEnvironmentVariableW(pathW, path_env); -} + size = len + sizeof(slash) + sizeof(mono_exe); + if (!(ret = HeapAlloc(GetProcessHeap(), 0, size))) return NULL; -static HMODULE load_mono(void) -{ - static const WCHAR mono_dll[] = {'\\','b','i','n','\\','m','o','n','o','.','d','l','l',0}; - static const WCHAR libmono_dll[] = {'\\','b','i','n','\\','l','i','b','m','o','n','o','.','d','l','l',0}; - static const WCHAR bin[] = {'\\','b','i','n',0}; - static const WCHAR lib[] = {'\\','l','i','b',0}; - static const WCHAR etc[] = {'\\','e','t','c',0}; - HMODULE result; - WCHAR mono_path[MAX_PATH], mono_dll_path[MAX_PATH+16], mono_bin_path[MAX_PATH+4]; - WCHAR mono_lib_path[MAX_PATH+4], mono_etc_path[MAX_PATH+4]; - char mono_lib_path_a[MAX_PATH], mono_etc_path_a[MAX_PATH]; - - EnterCriticalSection(&mono_lib_cs); - - if (!mono_handle) - { - if (!get_mono_path(mono_path)) goto end; - - strcpyW(mono_bin_path, mono_path); - strcatW(mono_bin_path, bin); - set_environment(mono_bin_path); - - strcpyW(mono_lib_path, mono_path); - strcatW(mono_lib_path, lib); - WideCharToMultiByte(CP_UTF8, 0, mono_lib_path, -1, mono_lib_path_a, MAX_PATH, NULL, NULL); - - strcpyW(mono_etc_path, mono_path); - strcatW(mono_etc_path, etc); - WideCharToMultiByte(CP_UTF8, 0, mono_etc_path, -1, mono_etc_path_a, MAX_PATH, NULL, NULL); - - strcpyW(mono_dll_path, mono_path); - strcatW(mono_dll_path, mono_dll); - mono_handle = LoadLibraryW(mono_dll_path); - - if (!mono_handle) - { - strcpyW(mono_dll_path, mono_path); - strcatW(mono_dll_path, libmono_dll); - mono_handle = LoadLibraryW(mono_dll_path); - } - - if (!mono_handle) goto end; - -#define LOAD_MONO_FUNCTION(x) do { \ - x = (void*)GetProcAddress(mono_handle, #x); \ - if (!x) { \ - mono_handle = NULL; \ - goto end; \ - } \ -} while (0); - - LOAD_MONO_FUNCTION(mono_config_parse); - LOAD_MONO_FUNCTION(mono_domain_assembly_open); - LOAD_MONO_FUNCTION(mono_jit_cleanup); - LOAD_MONO_FUNCTION(mono_jit_exec); - LOAD_MONO_FUNCTION(mono_jit_init); - LOAD_MONO_FUNCTION(mono_jit_set_trace_options); - LOAD_MONO_FUNCTION(mono_set_dirs); - -#undef LOAD_MONO_FUNCTION - - mono_set_dirs(mono_lib_path_a, mono_etc_path_a); - - mono_config_parse(NULL); - } - -end: - result = mono_handle; + lstrcpyW(ret, root); + lstrcatW(ret, slash); + lstrcatW(ret, mono_exe); - LeaveCriticalSection(&mono_lib_cs); - - if (!result) - MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); - - return result; + return ret; } HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, @@ -196,16 +89,20 @@ HRESULT WINAPI CorBindToRuntimeHost(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID *ppv) { - FIXME("(%s, %s, %s, %p, %d, %s, %s, %p): semi-stub!\n", debugstr_w(pwszVersion), + WCHAR *mono_exe; + + FIXME("(%s, %s, %s, %p, %d, %p, %p, %p): semi-stub!\n", debugstr_w(pwszVersion), debugstr_w(pwszBuildFlavor), debugstr_w(pwszHostConfigFile), pReserved, - startupFlags, debugstr_guid(rclsid), debugstr_guid(riid), ppv); + startupFlags, rclsid, riid, ppv); - if (!get_mono_path(NULL)) + if (!(mono_exe = get_mono_exe())) { MESSAGE("wine: Install the Windows version of Mono to run .NET executables\n"); return E_FAIL; } + HeapFree(GetProcessHeap(), 0, mono_exe); + return S_OK; } @@ -241,73 +138,49 @@ BOOL WINAPI _CorDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) return TRUE; } -static void get_utf8_args(int *argc, char ***argv) +__int32 WINAPI _CorExeMain(void) { - WCHAR **argvw; - int size=0, i; - char *current_arg; - - argvw = CommandLineToArgvW(GetCommandLineW(), argc); - - for (i=0; i<*argc; i++) - { - size += sizeof(char*); - size += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, NULL, 0, NULL, NULL); - } - size += sizeof(char*); - - *argv = HeapAlloc(GetProcessHeap(), 0, size); - current_arg = (char*)(*argv + *argc + 1); + STARTUPINFOW si; + PROCESS_INFORMATION pi; + WCHAR *mono_exe, *cmd_line; + DWORD size, exit_code; - for (i=0; i<*argc; i++) + if (!(mono_exe = get_mono_exe())) { - (*argv)[i] = current_arg; - current_arg += WideCharToMultiByte(CP_UTF8, 0, argvw[i], -1, current_arg, size, NULL, NULL); + MESSAGE("install the Windows version of Mono to run .NET executables\n"); + return -1; } - (*argv)[*argc] = NULL; - - HeapFree(GetProcessHeap(), 0, argvw); -} - -__int32 WINAPI _CorExeMain(void) -{ - int exit_code; - int trace_size; - char trace_setting[256]; - int argc; - char **argv; - MonoDomain *domain; - MonoAssembly *assembly; - char filename[MAX_PATH]; - - if (!load_mono()) + size = (lstrlenW(mono_exe) + lstrlenW(GetCommandLineW()) + 1) * sizeof(WCHAR); + if (!(cmd_line = HeapAlloc(GetProcessHeap(), 0, size))) { + HeapFree(GetProcessHeap(), 0, mono_exe); return -1; } - get_utf8_args(&argc, &argv); + lstrcpyW(cmd_line, mono_exe); + HeapFree(GetProcessHeap(), 0, mono_exe); + lstrcatW(cmd_line, GetCommandLineW()); - trace_size = GetEnvironmentVariableA("WINE_MONO_TRACE", trace_setting, sizeof(trace_setting)); + TRACE("new command line: %s\n", debugstr_w(cmd_line)); - if (trace_size) + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + if (!CreateProcessW(NULL, cmd_line, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { - mono_jit_set_trace_options(trace_setting); + HeapFree(GetProcessHeap(), 0, cmd_line); + return -1; } + HeapFree(GetProcessHeap(), 0, cmd_line); - GetModuleFileNameA(NULL, filename, MAX_PATH); - - domain = mono_jit_init(filename); - - assembly = mono_domain_assembly_open(domain, filename); - - exit_code = mono_jit_exec(domain, assembly, argc, argv); + /* wait for the process to exit */ + WaitForSingleObject(pi.hProcess, INFINITE); + GetExitCodeProcess(pi.hProcess, &exit_code); - mono_jit_cleanup(domain); + CloseHandle(pi.hThread); + CloseHandle(pi.hProcess); - HeapFree(GetProcessHeap(), 0, argv); - - return exit_code; + return (int)exit_code; } __int32 WINAPI _CorExeMain2(PBYTE ptrMemory, DWORD cntMemory, LPWSTR imageName, LPWSTR loaderName, LPWSTR cmdLine) @@ -398,7 +271,7 @@ HRESULT WINAPI CoInitializeCor(DWORD fFlags) HRESULT WINAPI GetAssemblyMDImport(LPCWSTR szFileName, REFIID riid, IUnknown **ppIUnk) { - FIXME("(%p %s, %s, %p): stub\n", szFileName, debugstr_w(szFileName), debugstr_guid(riid), *ppIUnk); + FIXME("(%p %s, %p, %p): stub\n", szFileName, debugstr_w(szFileName), riid, *ppIUnk); return ERROR_CALL_NOT_IMPLEMENTED; } @@ -451,12 +324,6 @@ HRESULT WINAPI CorBindToCurrentRuntime(LPCWSTR filename, REFCLSID rclsid, REFIID return E_NOTIMPL; } -STDAPI ClrCreateManagedInstance(LPCWSTR pTypeName, REFIID riid, void **ppObject) -{ - FIXME("(%s,%s,%p)\n", debugstr_w(pTypeName), debugstr_guid(riid), ppObject); - return E_NOTIMPL; -} - BOOL WINAPI StrongNameSignatureVerification(LPCWSTR filename, DWORD inFlags, DWORD* pOutFlags) { FIXME("(%s, 0x%X, %p): stub\n", debugstr_w(filename), inFlags, pOutFlags); @@ -471,7 +338,7 @@ BOOL WINAPI StrongNameSignatureVerificationEx(LPCWSTR filename, BOOL forceVerifi HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) { - FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv); + FIXME("(%p, %p, %p): stub\n", rclsid, riid, ppv); if(!ppv) return E_INVALIDARG; diff --git a/dll/win32/mscoree/mscoree_private.h b/dll/win32/mscoree/mscoree_private.h index f14da1d15cd..f329455fff1 100644 --- a/dll/win32/mscoree/mscoree_private.h +++ b/dll/win32/mscoree/mscoree_private.h @@ -22,18 +22,5 @@ extern IUnknown* create_corruntimehost(void); -/* Mono 2.6 embedding */ -typedef struct _MonoDomain MonoDomain; -typedef struct _MonoAssembly MonoAssembly; - -extern HMODULE mono_handle; - -extern void (*mono_config_parse)(const char *filename); -extern MonoAssembly* (*mono_domain_assembly_open) (MonoDomain *domain, const char *name); -extern void (*mono_jit_cleanup)(MonoDomain *domain); -extern int (*mono_jit_exec)(MonoDomain *domain, MonoAssembly *assembly, int argc, char *argv[]); -extern MonoDomain* (*mono_jit_init)(const char *file); -extern int (*mono_jit_set_trace_options)(const char* options); -extern void (*mono_set_dirs)(const char *assembly_dir, const char *config_dir); #endif /* __MSCOREE_PRIVATE__ */ diff --git a/dll/win32/msctf/displayattributemgr.c b/dll/win32/msctf/displayattributemgr.c deleted file mode 100644 index 75248cd4393..00000000000 --- a/dll/win32/msctf/displayattributemgr.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * ITfDisplayAttributeMgr implementation - * - * Copyright 2010 CodeWeavers, Aric Stewart - * - * 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 "wine/debug.h" -#include "winbase.h" -#include "winreg.h" -#include "shlwapi.h" - -#include "msctf.h" -#include "msctf_internal.h" - -WINE_DEFAULT_DEBUG_CHANNEL(msctf); - -typedef struct tagDisplayAttributeMgr { - const ITfDisplayAttributeMgrVtbl *DisplayAttributeMgrVtbl; - - LONG refCount; - -} DisplayAttributeMgr; - -static void DisplayAttributeMgr_Destructor(DisplayAttributeMgr *This) -{ - TRACE("destroying %p\n", This); - - HeapFree(GetProcessHeap(),0,This); -} - -static HRESULT WINAPI DisplayAttributeMgr_QueryInterface(ITfDisplayAttributeMgr *iface, REFIID iid, LPVOID *ppvOut) -{ - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; - *ppvOut = NULL; - - if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfDisplayAttributeMgr)) - { - *ppvOut = This; - } - - if (*ppvOut) - { - IUnknown_AddRef(iface); - return S_OK; - } - - WARN("unsupported interface: %s\n", debugstr_guid(iid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI DisplayAttributeMgr_AddRef(ITfDisplayAttributeMgr *iface) -{ - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; - return InterlockedIncrement(&This->refCount); -} - -static ULONG WINAPI DisplayAttributeMgr_Release(ITfDisplayAttributeMgr *iface) -{ - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; - ULONG ret; - - ret = InterlockedDecrement(&This->refCount); - if (ret == 0) - DisplayAttributeMgr_Destructor(This); - return ret; -} - -/***************************************************** - * ITfDisplayAttributeMgr functions - *****************************************************/ - -static HRESULT WINAPI DisplayAttributeMgr_OnUpdateInfo(ITfDisplayAttributeMgr *iface) -{ - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; - - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; -} - -static HRESULT WINAPI DisplayAttributeMgr_EnumDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, IEnumTfDisplayAttributeInfo **ppEnum) -{ - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; - - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; -} - -static HRESULT WINAPI DisplayAttributeMgr_GetDisplayAttributeInfo(ITfDisplayAttributeMgr *iface, REFGUID guid, ITfDisplayAttributeInfo **ppInfo, CLSID *pclsidOwner) -{ - DisplayAttributeMgr *This = (DisplayAttributeMgr *)iface; - - FIXME("STUB:(%p)\n",This); - return E_NOTIMPL; -} - -static const ITfDisplayAttributeMgrVtbl DisplayAttributeMgr_DisplayAttributeMgrVtbl = -{ - DisplayAttributeMgr_QueryInterface, - DisplayAttributeMgr_AddRef, - DisplayAttributeMgr_Release, - - DisplayAttributeMgr_OnUpdateInfo, - DisplayAttributeMgr_EnumDisplayAttributeInfo, - DisplayAttributeMgr_GetDisplayAttributeInfo -}; - -HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) -{ - DisplayAttributeMgr *This; - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - This = HeapAlloc(GetProcessHeap(),0,sizeof(DisplayAttributeMgr)); - if (This == NULL) - return E_OUTOFMEMORY; - - This->DisplayAttributeMgrVtbl= &DisplayAttributeMgr_DisplayAttributeMgrVtbl; - This->refCount = 1; - - TRACE("returning %p\n", This); - *ppOut = (IUnknown *)This; - return S_OK; -} diff --git a/dll/win32/msctf/inputprocessor.c b/dll/win32/msctf/inputprocessor.c index 34e35c41cb1..ba4a76d83b5 100644 --- a/dll/win32/msctf/inputprocessor.c +++ b/dll/win32/msctf/inputprocessor.c @@ -279,8 +279,8 @@ static HRESULT WINAPI InputProcessorProfiles_AddLanguageProfile( if (!res) { DWORD zero = 0x0; - RegSetValueExW(fmtkey, desc, 0, REG_SZ, (const BYTE*)pchDesc, cchDesc * sizeof(WCHAR)); - RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (const BYTE*)pchIconFile, cchFile * sizeof(WCHAR)); + RegSetValueExW(fmtkey, desc, 0, REG_SZ, (LPBYTE)pchDesc, cchDesc * sizeof(WCHAR)); + RegSetValueExW(fmtkey, icnf, 0, REG_SZ, (LPBYTE)pchIconFile, cchFile * sizeof(WCHAR)); RegSetValueExW(fmtkey, icni, 0, REG_DWORD, (LPBYTE)&uIconIndex, sizeof(DWORD)); if (disposition == REG_CREATED_NEW_KEY) RegSetValueExW(fmtkey, szwEnable, 0, REG_DWORD, (LPBYTE)&zero, sizeof(DWORD)); diff --git a/dll/win32/msctf/msctf.c b/dll/win32/msctf/msctf.c index 759fe7ec579..62d1ff2abd8 100644 --- a/dll/win32/msctf/msctf.c +++ b/dll/win32/msctf/msctf.c @@ -88,7 +88,6 @@ static const struct { {&CLSID_TF_InputProcessorProfiles, InputProcessorProfiles_Constructor}, {&CLSID_TF_CategoryMgr, CategoryMgr_Constructor}, {&CLSID_TF_LangBarMgr, LangBarMgr_Constructor}, - {&CLSID_TF_DisplayAttributeMgr, DisplayAttributeMgr_Constructor}, {NULL, NULL} }; diff --git a/dll/win32/msctf/msctf.rbuild b/dll/win32/msctf/msctf.rbuild index cb072f676e7..de8f52bf64d 100644 --- a/dll/win32/msctf/msctf.rbuild +++ b/dll/win32/msctf/msctf.rbuild @@ -11,7 +11,6 @@ categorymgr.c compartmentmgr.c context.c - displayattributemgr.c documentmgr.c inputprocessor.c langbarmgr.c diff --git a/dll/win32/msctf/msctf_internal.h b/dll/win32/msctf/msctf_internal.h index 9aaaad0fb1b..57423e996fc 100644 --- a/dll/win32/msctf/msctf_internal.h +++ b/dll/win32/msctf/msctf_internal.h @@ -41,7 +41,6 @@ extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, extern HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut); extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This); extern HRESULT LangBarMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); -extern HRESULT DisplayAttributeMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT Context_Initialize(ITfContext *cxt, ITfDocumentMgr *manager); extern HRESULT Context_Uninitialize(ITfContext *cxt); diff --git a/dll/win32/msctf/regsvr.c b/dll/win32/msctf/regsvr.c index 65ebb1da122..2af1f241154 100644 --- a/dll/win32/msctf/regsvr.c +++ b/dll/win32/msctf/regsvr.c @@ -469,13 +469,6 @@ static struct regsvr_coclass const coclass_list[] = { "msctf.dll", "Apartment" }, - { - &CLSID_TF_DisplayAttributeMgr, - "TF_DisplayAttributeMgr", - NULL, - "msctf.dll", - "Apartment" - }, { NULL } /* list terminator */ }; diff --git a/dll/win32/msgsm32.acm/msgsm32.c b/dll/win32/msgsm32.acm/msgsm32.c index 12dfef91d3b..e760ac3a0ed 100644 --- a/dll/win32/msgsm32.acm/msgsm32.c +++ b/dll/win32/msgsm32.acm/msgsm32.c @@ -179,10 +179,10 @@ static DWORD GSM_FormatValidate(const WAVEFORMATEX *wfx) WARN("GSM nBlockAlign %u\n", wfx->nBlockAlign); return 0; } - if (((const GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320) + if (((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock != 320) { WARN("GSM wSamplesPerBlock %u\n", - ((const GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock); + ((GSM610WAVEFORMAT*)wfx)->wSamplesPerBlock); return 0; } if (wfx->nAvgBytesPerSec != wfx->nSamplesPerSec * 65 / 320) diff --git a/dll/win32/mshtml/dispex.c b/dll/win32/mshtml/dispex.c index de0c94871f6..4b1bd882e5e 100644 --- a/dll/win32/mshtml/dispex.c +++ b/dll/win32/mshtml/dispex.c @@ -52,11 +52,8 @@ struct dispex_data_t { typedef struct { VARIANT var; LPWSTR name; - DWORD flags; } dynamic_prop_t; -#define DYNPROP_DELETED 0x01 - typedef struct { DispatchEx dispex; const IUnknownVtbl *lpIUnknownVtbl; @@ -248,12 +245,12 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, const FUN static int dispid_cmp(const void *p1, const void *p2) { - return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; + return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id; } static int func_name_cmp(const void *p1, const void *p2) { - return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); + return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name); } static dispex_data_t *preprocess_dispex_data(DispatchEx *This) @@ -322,7 +319,7 @@ static dispex_data_t *preprocess_dispex_data(DispatchEx *This) static int id_cmp(const void *p1, const void *p2) { - return *(const DISPID*)p1 - *(const DISPID*)p2; + return *(DISPID*)p1 - *(DISPID*)p2; } HRESULT get_dispids(tid_t tid, DWORD *ret_size, DISPID **ret) @@ -445,7 +442,7 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags { const BOOL alloc = flags & fdexNameEnsure; dispex_dynamic_data_t *data; - dynamic_prop_t *prop; + unsigned i; data = get_dynamic_data(This, alloc); if(!data) { @@ -456,14 +453,9 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags return DISP_E_UNKNOWNNAME; } - for(prop = data->props; prop < data->props+data->prop_cnt; prop++) { - if(flags & fdexNameCaseInsensitive ? !strcmpiW(prop->name, name) : !strcmpW(prop->name, name)) { - if(prop->flags & DYNPROP_DELETED) { - if(!alloc) - return DISP_E_UNKNOWNNAME; - prop->flags &= ~DYNPROP_DELETED; - } - *ret = prop; + for(i=0; i < data->prop_cnt; i++) { + if(flags & fdexNameCaseInsensitive ? !strcmpiW(data->props[i].name, name) : !strcmpW(data->props[i].name, name)) { + *ret = data->props+i; return S_OK; } } @@ -489,16 +481,10 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags data->buf_size <<= 1; } - prop = data->props + data->prop_cnt; + data->props[data->prop_cnt].name = heap_strdupW(name); + VariantInit(&data->props[data->prop_cnt].var); + *ret = data->props + data->prop_cnt++; - prop->name = heap_strdupW(name); - if(!prop->name) - return E_OUTOFMEMORY; - - VariantInit(&prop->var); - prop->flags = 0; - data->prop_cnt++; - *ret = prop; return S_OK; } @@ -743,109 +729,6 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re return DISP_E_UNKNOWNNAME; } -static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret) -{ - dispex_data_t *data; - int min, max, n, c; - - data = get_dispex_data(This); - if(!data) - return E_FAIL; - - min = 0; - max = data->func_cnt-1; - - while(min <= max) { - n = (min+max)/2; - - c = strcmpiW(data->name_table[n]->name, name); - if(!c) { - if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, name)) - break; - - *ret = data->name_table[n]->id; - return S_OK; - } - - if(c > 0) - max = n-1; - else - min = n+1; - } - - if(This->data->vtbl && This->data->vtbl->get_dispid) { - HRESULT hres; - - hres = This->data->vtbl->get_dispid(This->outer, name, grfdex, ret); - if(hres != DISP_E_UNKNOWNNAME) - return hres; - } - - return DISP_E_UNKNOWNNAME; -} - -static HRESULT invoke_builtin_prop(DispatchEx *This, DISPID id, LCID lcid, WORD flags, DISPPARAMS *dp, - VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) -{ - dispex_data_t *data; - func_info_t *func; - HRESULT hres; - - data = get_dispex_data(This); - if(!data) - return E_FAIL; - - hres = get_builtin_func(data, id, &func); - if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) - return dispex_value(This, lcid, flags, dp, res, ei, caller); - if(FAILED(hres)) - return hres; - - if(func->func_disp_idx == -1) - hres = typeinfo_invoke(This, func, flags, dp, res, ei); - else - hres = function_invoke(This, func, flags, dp, res, ei); - - return hres; -} - -HRESULT remove_prop(DispatchEx *This, BSTR name, VARIANT_BOOL *success) -{ - dynamic_prop_t *prop; - DISPID id; - HRESULT hres; - - hres = get_builtin_id(This, name, 0, &id); - if(hres == S_OK) { - DISPID named_id = DISPID_PROPERTYPUT; - VARIANT var; - DISPPARAMS dp = {&var,&named_id,1,1}; - EXCEPINFO ei; - - V_VT(&var) = VT_EMPTY; - memset(&ei, 0, sizeof(ei)); - hres = invoke_builtin_prop(This, id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL); - if(FAILED(hres)) - return hres; - - *success = VARIANT_TRUE; - return S_OK; - } - - hres = get_dynamic_prop(This, name, 0, &prop); - if(FAILED(hres)) { - if(hres != DISP_E_UNKNOWNNAME) - return hres; - *success = VARIANT_FALSE; - return S_OK; - } - - VariantClear(&prop->var); - prop->flags |= DYNPROP_DELETED; - *success = VARIANT_TRUE; - return S_OK; -} - #define DISPATCHEX_THIS(iface) DEFINE_THIS(DispatchEx, IDispatchEx, iface) static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) @@ -932,6 +815,8 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW { DispatchEx *This = DISPATCHEX_THIS(iface); dynamic_prop_t *dprop; + dispex_data_t *data; + int min, max, n, c; HRESULT hres; TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid); @@ -939,9 +824,38 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW if(grfdex & ~(fdexNameCaseSensitive|fdexNameCaseInsensitive|fdexNameEnsure|fdexNameImplicit|FDEX_VERSION_MASK)) FIXME("Unsupported grfdex %x\n", grfdex); - hres = get_builtin_id(This, bstrName, grfdex, pid); - if(hres != DISP_E_UNKNOWNNAME) - return hres; + data = get_dispex_data(This); + if(!data) + return E_FAIL; + + min = 0; + max = data->func_cnt-1; + + while(min <= max) { + n = (min+max)/2; + + c = strcmpiW(data->name_table[n]->name, bstrName); + if(!c) { + if((grfdex & fdexNameCaseSensitive) && strcmpW(data->name_table[n]->name, bstrName)) + break; + + *pid = data->name_table[n]->id; + return S_OK; + } + + if(c > 0) + max = n-1; + else + min = n+1; + } + + if(This->data->vtbl && This->data->vtbl->get_dispid) { + HRESULT hres; + + hres = This->data->vtbl->get_dispid(This->outer, bstrName, grfdex, pid); + if(hres != DISP_E_UNKNOWNNAME) + return hres; + } hres = get_dynamic_prop(This, bstrName, grfdex, &dprop); if(FAILED(hres)) @@ -955,6 +869,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { DispatchEx *This = DISPATCHEX_THIS(iface); + dispex_data_t *data; + func_info_t *func; HRESULT hres; TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); @@ -977,12 +893,12 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc if(is_dynamic_dispid(id)) { DWORD idx = id - DISPID_DYNPROP_0; - dynamic_prop_t *prop; + VARIANT *var; if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; - prop = This->dynamic_data->props+idx; + var = &This->dynamic_data->props[idx].var; switch(wFlags) { case DISPATCH_METHOD|DISPATCH_PROPERTYGET: @@ -993,8 +909,8 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc DISPPARAMS dp = {NULL, &named_arg, 0, 1}; IDispatchEx *dispex; - if(V_VT(&prop->var) != VT_DISPATCH) { - FIXME("invoke %s\n", debugstr_variant(&prop->var)); + if(V_VT(var) != VT_DISPATCH) { + FIXME("invoke vt %d\n", V_VT(var)); return E_NOTIMPL; } @@ -1013,14 +929,14 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc V_VT(dp.rgvarg) = VT_DISPATCH; V_DISPATCH(dp.rgvarg) = (IDispatch*)DISPATCHEX(This); - hres = IDispatch_QueryInterface(V_DISPATCH(&prop->var), &IID_IDispatchEx, (void**)&dispex); + hres = IDispatch_QueryInterface(V_DISPATCH(var), &IID_IDispatchEx, (void**)&dispex); TRACE("%s call\n", debugstr_w(This->dynamic_data->props[idx].name)); if(SUCCEEDED(hres)) { hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, lcid, wFlags, &dp, pvarRes, pei, pspCaller); IDispatchEx_Release(dispex); }else { ULONG err = 0; - hres = IDispatch_Invoke(V_DISPATCH(&prop->var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); + hres = IDispatch_Invoke(V_DISPATCH(var), DISPID_VALUE, &IID_NULL, lcid, wFlags, pdp, pvarRes, pei, &err); } TRACE("%s ret %08x\n", debugstr_w(This->dynamic_data->props[idx].name), hres); @@ -1028,9 +944,7 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc return hres; } case DISPATCH_PROPERTYGET: - if(prop->flags & DYNPROP_DELETED) - return DISP_E_UNKNOWNNAME; - return VariantCopy(pvarRes, &prop->var); + return VariantCopy(pvarRes, var); case DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF: case DISPATCH_PROPERTYPUT: if(pdp->cArgs != 1 || (pdp->cNamedArgs == 1 && *pdp->rgdispidNamedArgs != DISPID_PROPERTYPUT) @@ -1040,20 +954,30 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc } TRACE("put %s\n", debugstr_variant(pdp->rgvarg)); - VariantClear(&prop->var); - hres = VariantCopy(&prop->var, pdp->rgvarg); - if(FAILED(hres)) - return hres; - - prop->flags &= ~DYNPROP_DELETED; - return S_OK; + VariantClear(var); + return VariantCopy(var, pdp->rgvarg); default: FIXME("unhandled wFlags %x\n", wFlags); return E_NOTIMPL; } } - return invoke_builtin_prop(This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + data = get_dispex_data(This); + if(!data) + return E_FAIL; + + hres = get_builtin_func(data, id, &func); + if(id == DISPID_VALUE && hres == DISP_E_UNKNOWNNAME) + return dispex_value(This, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + if(FAILED(hres)) + return hres; + + if(func->func_disp_idx == -1) + hres = typeinfo_invoke(This, func, wFlags, pdp, pvarRes, pei); + else + hres = function_invoke(This, func, wFlags, pdp, pvarRes, pei); + + return hres; } static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) @@ -1131,14 +1055,12 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, if(!This->dynamic_data || This->dynamic_data->prop_cnt <= idx) return DISP_E_UNKNOWNNAME; - while(++idx < This->dynamic_data->prop_cnt && This->dynamic_data->props[idx].flags & DYNPROP_DELETED); - - if(idx == This->dynamic_data->prop_cnt) { + if(idx+1 == This->dynamic_data->prop_cnt) { *pid = DISPID_STARTENUM; return S_FALSE; } - *pid = DISPID_DYNPROP_0+idx; + *pid = id+1; return S_OK; } diff --git a/dll/win32/mshtml/editor.c b/dll/win32/mshtml/editor.c index 14e7ebb6f64..961bb916370 100644 --- a/dll/win32/mshtml/editor.c +++ b/dll/win32/mshtml/editor.c @@ -508,6 +508,7 @@ void handle_edit_event(HTMLDocument *This, nsIDOMEvent *event) void handle_edit_load(HTMLDocument *This) { + This->doc_obj->nscontainer->reset_focus = GetFocus(); get_editor_controller(This->doc_obj->nscontainer); } diff --git a/dll/win32/mshtml/htmlelem.c b/dll/win32/mshtml/htmlelem.c index b0cb791a1e8..e77c1dc4c42 100644 --- a/dll/win32/mshtml/htmlelem.c +++ b/dll/win32/mshtml/htmlelem.c @@ -198,10 +198,8 @@ static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strA LONG lFlags, VARIANT_BOOL *pfSuccess) { HTMLElement *This = HTMLELEM_THIS(iface); - - TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess); - - return remove_prop(&This->node.dispex, strAttributeName, pfSuccess); + FIXME("(%p)->()\n", This); + return E_NOTIMPL; } static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v) diff --git a/dll/win32/mshtml/htmlwindow.c b/dll/win32/mshtml/htmlwindow.c index 5dbea55905c..2aafaa3e4b4 100644 --- a/dll/win32/mshtml/htmlwindow.c +++ b/dll/win32/mshtml/htmlwindow.c @@ -57,26 +57,6 @@ static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node) if(doc_node) htmldoc_addref(&doc_node->basedoc); } - - if(doc_node && window->doc_obj->usermode == EDITMODE) { - nsIDOMNSHTMLDocument *nshtmldoc; - nsAString mode_str; - nsresult nsres; - - static const PRUnichar onW[] = {'o','n',0}; - - nsres = nsIDOMHTMLDocument_QueryInterface(doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, (void**)&nshtmldoc); - if(NS_SUCCEEDED(nsres)) { - nsAString_Init(&mode_str, onW); - nsres = nsIDOMNSHTMLDocument_SetDesignMode(nshtmldoc, &mode_str); - nsAString_Finish(&mode_str); - nsIDOMNSHTMLDocument_Release(nshtmldoc); - if(NS_FAILED(nsres)) - ERR("SetDesignMode failed: %08x\n", nsres); - }else { - ERR("Could not get nsIDOMNSHTMLDocument interface: %08x\n", nsres); - } - } } nsIDOMWindow *get_nsdoc_window(nsIDOMDocument *nsdoc) diff --git a/dll/win32/mshtml/install.c b/dll/win32/mshtml/install.c index 4122194a7cc..e47c28423d0 100644 --- a/dll/win32/mshtml/install.c +++ b/dll/win32/mshtml/install.c @@ -60,6 +60,11 @@ static const WCHAR mshtml_keyW[] = '\\','W','i','n','e', '\\','M','S','H','T','M','L',0}; +static const CHAR mshtml_keyA[] = + {'S','o','f','t','w','a','r','e', + '\\','W','i','n','e', + '\\','M','S','H','T','M','L',0}; + static HWND install_dialog = NULL; static LPWSTR tmp_file_name = NULL; static HANDLE tmp_file = INVALID_HANDLE_VALUE; @@ -225,23 +230,18 @@ static BOOL install_from_unix_file(const char *file_name) static BOOL install_from_registered_dir(void) { char *file_name; - HKEY hkey; DWORD res, type, size = MAX_PATH; BOOL ret; - /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */ - res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey); - if(res != ERROR_SUCCESS) - return FALSE; - file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME)); - res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size); + /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */ + res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size); if(res == ERROR_MORE_DATA) { file_name = heap_realloc(file_name, size+sizeof(GECKO_FILE_NAME)); - res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size); + res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size); } - RegCloseKey(hkey); - if(res != ERROR_SUCCESS || type != REG_SZ) { + + if(res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) { heap_free(file_name); return FALSE; } diff --git a/dll/win32/mshtml/mshtml_private.h b/dll/win32/mshtml/mshtml_private.h index 3db8d791e48..228be35864e 100644 --- a/dll/win32/mshtml/mshtml_private.h +++ b/dll/win32/mshtml/mshtml_private.h @@ -38,7 +38,6 @@ #define NS_ERROR_FAILURE ((nsresult)0x80004005L) #define NS_NOINTERFACE ((nsresult)0x80004002L) #define NS_ERROR_NOT_IMPLEMENTED ((nsresult)0x80004001L) -#define NS_ERROR_NOT_AVAILABLE ((nsresult)0x80040111L) #define NS_ERROR_INVALID_ARG ((nsresult)0x80070057L) #define NS_ERROR_UNEXPECTED ((nsresult)0x8000ffffL) #define NS_ERROR_UNKNOWN_PROTOCOL ((nsresult)0x804b0012L) @@ -172,7 +171,6 @@ void release_dispex(DispatchEx*); BOOL dispex_query_interface(DispatchEx*,REFIID,void**); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); HRESULT get_dispids(tid_t,DWORD*,DISPID**); -HRESULT remove_prop(DispatchEx*,BSTR,VARIANT_BOOL*); typedef struct HTMLWindow HTMLWindow; typedef struct HTMLDocumentNode HTMLDocumentNode; @@ -437,6 +435,8 @@ struct NSContainer { nsIURIContentListener *content_listener; HWND hwnd; + + HWND reset_focus; /* hack */ }; typedef struct nsWineURI nsWineURI; @@ -461,16 +461,9 @@ typedef struct { char *content_type; char *charset; PRUint32 response_status; - struct list response_headers; UINT url_scheme; } nsChannel; -struct ResponseHeader { - struct list entry; - WCHAR *header; - WCHAR *data; -}; - typedef struct { HRESULT (*qi)(HTMLDOMNode*,REFIID,void**); void (*destructor)(HTMLDOMNode*); @@ -843,6 +836,7 @@ void update_title(HTMLDocumentObj*); /* editor */ void init_editor(HTMLDocument*); +void set_ns_editmode(NSContainer*); void handle_edit_event(HTMLDocument*,nsIDOMEvent*); HRESULT editor_exec_copy(HTMLDocument*,DWORD,VARIANT*,VARIANT*); HRESULT editor_exec_cut(HTMLDocument*,DWORD,VARIANT*,VARIANT*); diff --git a/dll/win32/mshtml/navigate.c b/dll/win32/mshtml/navigate.c index 7a777957ce1..cc2aeb3f6c2 100644 --- a/dll/win32/mshtml/navigate.c +++ b/dll/win32/mshtml/navigate.c @@ -62,7 +62,7 @@ typedef struct { HRESULT (*stop_binding)(BSCallback*,HRESULT); HRESULT (*read_data)(BSCallback*,IStream*); HRESULT (*on_progress)(BSCallback*,ULONG,LPCWSTR); - HRESULT (*on_response)(BSCallback*,DWORD,LPCWSTR); + HRESULT (*on_response)(BSCallback*,DWORD); } BSCallbackVtbl; struct BSCallback { @@ -493,7 +493,7 @@ static HRESULT WINAPI HttpNegotiate_OnResponse(IHttpNegotiate2 *iface, DWORD dwR TRACE("(%p)->(%d %s %s %p)\n", This, dwResponseCode, debugstr_w(szResponseHeaders), debugstr_w(szRequestHeaders), pszAdditionalRequestHeaders); - return This->vtbl->on_response(This, dwResponseCode, szResponseHeaders); + return This->vtbl->on_response(This, dwResponseCode); } static HRESULT WINAPI HttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface, @@ -825,8 +825,7 @@ static HRESULT BufferBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCWSTR return S_OK; } -static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code, - LPCWSTR response_headers) +static HRESULT BufferBSC_on_response(BSCallback *bsc, DWORD response_code) { return S_OK; } @@ -1100,72 +1099,11 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW return S_OK; } -static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code, - LPCWSTR response_headers) +static HRESULT nsChannelBSC_on_response(BSCallback *bsc, DWORD response_code) { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); This->nschannel->response_status = response_code; - - if(response_headers) { - const WCHAR *hdr_start, *hdr_end; - - hdr_start = strchrW(response_headers, '\r'); - while(hdr_start) { - const WCHAR *colon; - struct ResponseHeader *new_header; - int len; - - hdr_start += 2; - hdr_end = strchrW(hdr_start, '\r'); - if(!hdr_end) { - WARN("Header doesn't end with CRLF: %s\n", wine_dbgstr_w(hdr_start)); - break; - } - if(hdr_end == hdr_start) - break; - - for(colon = hdr_start; *colon != ':' && colon != hdr_end; ++colon); - if(*colon != ':') { - WARN("Header missing colon: %s\n", wine_dbgstr_w(hdr_start)); - hdr_start = strchrW(hdr_start, '\r'); - continue; - } - - new_header = heap_alloc(sizeof(struct ResponseHeader)); - if(!new_header) - return E_OUTOFMEMORY; - - len = colon - hdr_start; - new_header->header = heap_alloc((len + 1) * sizeof(WCHAR)); - if(!new_header->header) { - heap_free(new_header); - return E_OUTOFMEMORY; - } - memcpy(new_header->header, hdr_start, len * sizeof(WCHAR)); - new_header->header[len] = 0; - - colon++; - while(*colon == ' ') - colon++; - - len = hdr_end - colon; - new_header->data = heap_alloc((len + 1) * sizeof(WCHAR)); - if(!new_header->data) { - heap_free(new_header->header); - heap_free(new_header); - return E_OUTOFMEMORY; - } - memcpy(new_header->data, colon, len * sizeof(WCHAR)); - new_header->data[len] = 0; - - list_add_head(&This->nschannel->response_headers, &new_header->entry); - TRACE("Adding header to list: (%s):(%s)\n", wine_dbgstr_w(new_header->header), wine_dbgstr_w(new_header->data)); - - hdr_start = strchrW(hdr_start, '\r'); - } - } - return S_OK; } diff --git a/dll/win32/mshtml/nsembed.c b/dll/win32/mshtml/nsembed.c index 8a590079278..fa8aa41fedf 100644 --- a/dll/win32/mshtml/nsembed.c +++ b/dll/win32/mshtml/nsembed.c @@ -80,6 +80,8 @@ static const WCHAR wszNsContainer[] = {'N','s','C','o','n','t','a','i','n','e',' static ATOM nscontainer_class; +#define WM_RESETFOCUS_HACK WM_USER+600 + static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { NSContainer *This; @@ -104,13 +106,20 @@ static LRESULT WINAPI nsembed_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lP WARN("SetSize failed: %08x\n", nsres); break; - case WM_PARENTNOTIFY: - TRACE("WM_PARENTNOTIFY %x\n", (unsigned)wParam); + case WM_RESETFOCUS_HACK: + /* + * FIXME + * Gecko grabs focus in edit mode and some apps don't like it. + * We should somehow prevent grabbing focus. + */ + + TRACE("WM_RESETFOCUS_HACK\n"); - switch(wParam) { - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - nsIWebBrowserFocus_Activate(This->focus); + if(This->reset_focus) { + SetFocus(This->reset_focus); + This->reset_focus = NULL; + if(This->doc) + This->doc->focus = FALSE; } } @@ -767,6 +776,46 @@ void get_editor_controller(NSContainer *This) } } +void set_ns_editmode(NSContainer *This) +{ + nsIEditingSession *editing_session = NULL; + nsIURIContentListener *listener = NULL; + nsIDOMWindow *dom_window = NULL; + nsresult nsres; + + nsres = get_nsinterface((nsISupports*)This->webbrowser, &IID_nsIEditingSession, + (void**)&editing_session); + if(NS_FAILED(nsres)) { + ERR("Could not get nsIEditingSession: %08x\n", nsres); + return; + } + + nsres = nsIWebBrowser_GetContentDOMWindow(This->webbrowser, &dom_window); + if(NS_FAILED(nsres)) { + ERR("Could not get content DOM window: %08x\n", nsres); + nsIEditingSession_Release(editing_session); + return; + } + + nsres = nsIEditingSession_MakeWindowEditable(editing_session, dom_window, + NULL, FALSE, TRUE, TRUE); + nsIEditingSession_Release(editing_session); + nsIDOMWindow_Release(dom_window); + if(NS_FAILED(nsres)) { + ERR("MakeWindowEditable failed: %08x\n", nsres); + return; + } + + /* MakeWindowEditable changes WebBrowser's parent URI content listener. + * It seams to be a bug in Gecko. To workaround it we set our content + * listener again and Gecko's one as its parent. + */ + nsIWebBrowser_GetParentURIContentListener(This->webbrowser, &listener); + nsIURIContentListener_SetParentContentListener(NSURICL(This), listener); + nsIURIContentListener_Release(listener); + nsIWebBrowser_SetParentURIContentListener(This->webbrowser, NSURICL(This)); +} + void close_gecko(void) { TRACE("()\n"); @@ -1267,6 +1316,9 @@ static nsresult NSAPI nsEmbeddingSiteWindow_SetFocus(nsIEmbeddingSiteWindow *ifa TRACE("(%p)\n", This); + if(This->reset_focus) + PostMessageW(This->hwnd, WM_RESETFOCUS_HACK, 0, 0); + return nsIBaseWindow_SetFocus(This->window); } diff --git a/dll/win32/mshtml/nsevents.c b/dll/win32/mshtml/nsevents.c index 3e0314966db..c491424fdd4 100644 --- a/dll/win32/mshtml/nsevents.c +++ b/dll/win32/mshtml/nsevents.c @@ -109,11 +109,11 @@ static nsrefcnt NSAPI nsDOMEventListener_Release(nsIDOMEventListener *iface) return release_listener(This); } -static BOOL is_doc_child_focus(NSContainer *nscontainer) +static BOOL is_doc_child_focus(HTMLDocumentObj *doc) { HWND hwnd; - for(hwnd = GetFocus(); hwnd && hwnd != nscontainer->hwnd; hwnd = GetParent(hwnd)); + for(hwnd = GetFocus(); hwnd && hwnd != doc->hwnd; hwnd = GetParent(hwnd)); return hwnd != NULL; } @@ -129,7 +129,7 @@ static nsresult NSAPI handle_blur(nsIDOMEventListener *iface, nsIDOMEvent *event return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; - if(doc_obj->focus && !is_doc_child_focus(doc_obj->nscontainer)) { + if(!doc_obj->nscontainer->reset_focus && doc_obj->focus && !is_doc_child_focus(doc_obj)) { doc_obj->focus = FALSE; notif_focus(doc_obj); } @@ -148,7 +148,7 @@ static nsresult NSAPI handle_focus(nsIDOMEventListener *iface, nsIDOMEvent *even return NS_ERROR_FAILURE; doc_obj = doc->basedoc.doc_obj; - if(!doc_obj->focus) { + if(!doc_obj->nscontainer->reset_focus && !doc_obj->focus) { doc_obj->focus = TRUE; notif_focus(doc_obj); } diff --git a/dll/win32/mshtml/nsio.c b/dll/win32/mshtml/nsio.c index 0c8e45704d7..88a4e55254b 100644 --- a/dll/win32/mshtml/nsio.c +++ b/dll/win32/mshtml/nsio.c @@ -307,7 +307,7 @@ static void set_uri_window(nsWineURI *This, HTMLWindow *window) static inline BOOL is_http_channel(nsChannel *This) { - return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTPS; + return This->url_scheme == URL_SCHEME_HTTP || This->url_scheme == URL_SCHEME_HTTP; } #define NSCHANNEL_THIS(iface) DEFINE_THIS(nsChannel, HttpChannel, iface) @@ -363,8 +363,6 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) LONG ref = InterlockedDecrement(&This->ref); if(!ref) { - struct ResponseHeader *header, *next_hdr; - nsIURI_Release(NSURI(This->uri)); if(This->owner) nsISupports_Release(This->owner); @@ -378,14 +376,6 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) nsIURI_Release(This->original_uri); heap_free(This->content_type); heap_free(This->charset); - - LIST_FOR_EACH_ENTRY_SAFE(header, next_hdr, &This->response_headers, struct ResponseHeader, entry) { - list_remove(&header->entry); - heap_free(header->header); - heap_free(header->data); - heap_free(header); - } - heap_free(This); } @@ -943,9 +933,9 @@ static nsresult NSAPI nsChannel_SetRequestMethod(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p): Returning NS_OK\n", This, aRequestMethod); + FIXME("(%p)->(%p)\n", This, aRequestMethod); - return NS_OK; + return NS_ERROR_NOT_IMPLEMENTED; } static nsresult NSAPI nsChannel_GetReferrer(nsIHttpChannel *iface, nsIURI **aReferrer) @@ -1062,48 +1052,19 @@ static nsresult NSAPI nsChannel_GetRequestSucceeded(nsIHttpChannel *iface, { nsChannel *This = NSCHANNEL_THIS(iface); - TRACE("(%p)->(%p)\n", This, aRequestSucceeded); - - if(!This->response_status) - return NS_ERROR_NOT_AVAILABLE; - - *aRequestSucceeded = This->response_status/100 == 2; + FIXME("(%p)->(%p)\n", This, aRequestSucceeded); - return NS_OK; + return NS_ERROR_NOT_IMPLEMENTED; } static nsresult NSAPI nsChannel_GetResponseHeader(nsIHttpChannel *iface, const nsACString *header, nsACString *_retval) { nsChannel *This = NSCHANNEL_THIS(iface); - const char *header_str; - WCHAR *header_wstr; - struct ResponseHeader *this_header; - nsACString_GetData(header, &header_str); - TRACE("(%p)->(%p(%s) %p)\n", This, header, header_str, _retval); + FIXME("(%p)->(%p %p)\n", This, header, _retval); - header_wstr = heap_strdupAtoW(header_str); - if(!header_wstr) - return NS_ERROR_UNEXPECTED; - - LIST_FOR_EACH_ENTRY(this_header, &This->response_headers, struct ResponseHeader, entry) { - if(!strcmpW(this_header->header, header_wstr)) { - char *data = heap_strdupWtoA(this_header->data); - if(!data) { - heap_free(header_wstr); - return NS_ERROR_UNEXPECTED; - } - nsACString_SetData(_retval, data); - heap_free(data); - heap_free(header_wstr); - return NS_OK; - } - } - - heap_free(header_wstr); - - return NS_ERROR_NOT_AVAILABLE; + return NS_ERROR_NOT_IMPLEMENTED; } static nsresult NSAPI nsChannel_SetResponseHeader(nsIHttpChannel *iface, @@ -2453,6 +2414,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * HTMLWindow *window = NULL; nsIURI *uri = NULL; LPCWSTR base_wine_url = NULL; + BOOL is_wine_uri = FALSE; nsresult nsres; nsACString_GetData(aSpec, &spec); @@ -2463,8 +2425,10 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * if(is_gecko_special_uri(spec)) return nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, _retval); - if(!strncmp(spec, "wine:", 5)) + if(!strncmp(spec, "wine:", 5)) { spec += 5; + is_wine_uri = TRUE; + } if(aBaseURI) { PARSEDURLA parsed_url = {sizeof(PARSEDURLA)}; @@ -2509,7 +2473,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString * set_wine_url(wine_uri, url); else WARN("CoCombineUrl failed: %08x\n", hres); - }else { + }else if(is_wine_uri) { WCHAR url[INTERNET_MAX_URL_LENGTH]; MultiByteToWideChar(CP_ACP, 0, spec, -1, url, sizeof(url)/sizeof(WCHAR)); @@ -2552,7 +2516,6 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI ret->lpIHttpChannelInternalVtbl = &nsHttpChannelInternalVtbl; ret->ref = 1; ret->uri = wine_uri; - list_init(&ret->response_headers); nsIURI_AddRef(aURI); ret->original_uri = aURI; diff --git a/dll/win32/mshtml/olecmd.c b/dll/win32/mshtml/olecmd.c index 4d5967a923f..b54f06420fb 100644 --- a/dll/win32/mshtml/olecmd.c +++ b/dll/win32/mshtml/olecmd.c @@ -616,6 +616,9 @@ static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, IDocHostUIHandler_HideUI(This->doc_obj->hostui); } + if(This->doc_obj->nscontainer) + set_ns_editmode(This->doc_obj->nscontainer); + if(This->doc_obj->ui_active) { RECT rcBorderWidths; diff --git a/dll/win32/mshtml/view.c b/dll/win32/mshtml/view.c index 5c096ed9928..261e959b0ad 100644 --- a/dll/win32/mshtml/view.c +++ b/dll/win32/mshtml/view.c @@ -92,6 +92,7 @@ static void activate_gecko(NSContainer *This) nsIBaseWindow_SetVisibility(This->window, TRUE); nsIBaseWindow_SetEnabled(This->window, TRUE); + nsIWebBrowserFocus_Activate(This->focus); } void update_doc(HTMLDocument *This, DWORD flags) @@ -215,10 +216,6 @@ static LRESULT WINAPI serverwnd_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM break; case WM_TIMER: return on_timer(This); - case WM_SETFOCUS: - TRACE("(%p) WM_SETFOCUS\n", This); - nsIWebBrowserFocus_Activate(This->nscontainer->focus); - break; case WM_MOUSEACTIVATE: return MA_ACTIVATE; } @@ -667,8 +664,6 @@ static HRESULT WINAPI OleDocumentView_UIActivate(IOleDocumentView *iface, BOOL f This->doc_obj->ui_active = TRUE; }else { - This->doc_obj->focus = FALSE; - nsIWebBrowserFocus_Deactivate(This->doc_obj->nscontainer->focus); if(This->doc_obj->ui_active) { This->doc_obj->ui_active = FALSE; if(This->doc_obj->ip_window) @@ -816,7 +811,7 @@ static HRESULT WINAPI ViewObject_SetAdvise(IViewObjectEx *iface, DWORD aspects, TRACE("(%p)->(%d %d %p)\n", This, aspects, advf, pAdvSink); if(aspects != DVASPECT_CONTENT || advf != ADVF_PRIMEFIRST) - FIXME("unsupported arguments\n"); + FIXME("unsuported arguments\n"); if(This->doc_obj->view_sink) IAdviseSink_Release(This->doc_obj->view_sink); diff --git a/dll/win32/msimtf/activeimmapp.c b/dll/win32/msimtf/activeimmapp.c index d8446267893..73ce0758c70 100644 --- a/dll/win32/msimtf/activeimmapp.c +++ b/dll/win32/msimtf/activeimmapp.c @@ -655,7 +655,7 @@ static HRESULT WINAPI ActiveIMMApp_Deactivate(IActiveIMMApp* This) static HRESULT WINAPI ActiveIMMApp_OnDefWindowProc(IActiveIMMApp* This, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) { - //FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); + FIXME("Stub (%p %x %lx %lx)\n",hWnd,Msg,wParam,lParam); return E_FAIL; } diff --git a/dll/win32/msvfw32/mciwnd.c b/dll/win32/msvfw32/mciwnd.c index 96b64207825..ff8a0369df0 100644 --- a/dll/win32/msvfw32/mciwnd.c +++ b/dll/win32/msvfw32/mciwnd.c @@ -1298,23 +1298,30 @@ end_of_mci_open: } case MCI_SEEK: - case MCI_STEP: { - MCI_SEEK_PARMS mci_seek; /* Layout is usable as MCI_XYZ_STEP_PARMS */ - DWORD flags = MCI_STEP == wMsg ? 0 : - MCIWND_START == lParam ? MCI_SEEK_TO_START : - MCIWND_END == lParam ? MCI_SEEK_TO_END : MCI_TO; + MCI_SEEK_PARMS mci_seek; + + switch (lParam) + { + case MCIWND_START: + lParam = SendMessageW(hWnd, MCIWNDM_GETSTART, 0, 0); + break; + + case MCIWND_END: + lParam = SendMessageW(hWnd, MCIWNDM_GETEND, 0, 0); + break; + } mci_seek.dwTo = lParam; - mwi->lasterror = mciSendCommandW(mwi->mci, wMsg, - flags, (DWORD_PTR)&mci_seek); + mwi->lasterror = mciSendCommandW(mwi->mci, MCI_SEEK, + MCI_TO, (DWORD_PTR)&mci_seek); if (mwi->lasterror) { MCIWND_notify_error(mwi); return mwi->lasterror; } /* update window to reflect the state */ - else InvalidateRect(hWnd, NULL, TRUE); + InvalidateRect(hWnd, NULL, TRUE); return 0; } @@ -1357,9 +1364,15 @@ end_of_mci_open: } case MCI_PAUSE: + case MCI_STEP: case MCI_STOP: case MCI_RESUME: mci_generic_command(mwi, wMsg); + if (wMsg == MCI_STEP && !mwi->lasterror) + { + /* update window to reflect the state */ + InvalidateRect(hWnd, NULL, TRUE); + } return mwi->lasterror; case MCI_CONFIGURE: diff --git a/dll/win32/msvfw32/msvfw32_ros.diff b/dll/win32/msvfw32/msvfw32_ros.diff new file mode 100644 index 00000000000..331b478ad6d --- /dev/null +++ b/dll/win32/msvfw32/msvfw32_ros.diff @@ -0,0 +1,14 @@ +Index: msvideo_private.h +=================================================================== +--- msvideo_private.h (revision 25690) ++++ msvideo_private.h (working copy) +@@ -19,6 +19,9 @@ + #ifndef __WINE_MSVIDEO_PRIVATE_H + #define __WINE_MSVIDEO_PRIVATE_H + ++/* Installable Compressor Manager */ ++#define ICVERSION 0x0104 ++ + #define ICM_CHOOSE_COMPRESSOR 1 + #define IDC_COMP_LIST 880 + #define IDS_FULLFRAMES 901 diff --git a/dll/win32/msvfw32/msvideo16.c b/dll/win32/msvfw32/msvideo16.c new file mode 100644 index 00000000000..c873da57f45 --- /dev/null +++ b/dll/win32/msvfw32/msvideo16.c @@ -0,0 +1,916 @@ +/* + * msvideo 16-bit functions + * + * Copyright 1998 Marcus Meissner + * Copyright 2000 Bradley Baetz + * + * 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 "windef.h" +#include "winbase.h" +#include "winver.h" +#include "winnls.h" +#include "winreg.h" +#include "winuser.h" +#include "vfw16.h" +#include "msvideo_private.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msvideo); + +/* Drivers32 settings */ +#define HKLM_DRIVERS32 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32" + +/*********************************************************************** + * DrawDibOpen [MSVIDEO.102] + */ +HDRAWDIB16 VFWAPI DrawDibOpen16(void) +{ + return HDRAWDIB_16(DrawDibOpen()); +} + +/*********************************************************************** + * DrawDibClose [MSVIDEO.103] + */ +BOOL16 VFWAPI DrawDibClose16(HDRAWDIB16 hdd) +{ + return DrawDibClose(HDRAWDIB_32(hdd)); +} + +/************************************************************************ + * DrawDibBegin [MSVIDEO.104] + */ +BOOL16 VFWAPI DrawDibBegin16(HDRAWDIB16 hdd, HDC16 hdc, INT16 dxDst, + INT16 dyDst, LPBITMAPINFOHEADER lpbi, INT16 dxSrc, + INT16 dySrc, UINT16 wFlags) +{ + return DrawDibBegin(HDRAWDIB_32(hdd), HDC_32(hdc), dxDst, dyDst, lpbi, + dxSrc, dySrc, wFlags); +} + +/*********************************************************************** + * DrawDibEnd [MSVIDEO.105] + */ +BOOL16 VFWAPI DrawDibEnd16(HDRAWDIB16 hdd) +{ + return DrawDibEnd(HDRAWDIB_32(hdd)); +} + +/********************************************************************** + * DrawDibDraw [MSVIDEO.106] + */ +BOOL16 VFWAPI DrawDibDraw16(HDRAWDIB16 hdd, HDC16 hdc, INT16 xDst, INT16 yDst, + INT16 dxDst, INT16 dyDst, LPBITMAPINFOHEADER lpbi, + LPVOID lpBits, INT16 xSrc, INT16 ySrc, INT16 dxSrc, + INT16 dySrc, UINT16 wFlags) +{ + return DrawDibDraw(HDRAWDIB_32(hdd), HDC_32(hdc), xDst, yDst, dxDst, + dyDst, lpbi, lpBits, xSrc, ySrc, dxSrc, dySrc, wFlags); +} + +/*********************************************************************** + * DrawDibGetPalette [MSVIDEO.108] + */ +HPALETTE16 VFWAPI DrawDibGetPalette16(HDRAWDIB16 hdd) +{ + return HPALETTE_16(DrawDibGetPalette(HDRAWDIB_32(hdd))); +} + +/*********************************************************************** + * DrawDibSetPalette [MSVIDEO.110] + */ +BOOL16 VFWAPI DrawDibSetPalette16(HDRAWDIB16 hdd, HPALETTE16 hpal) +{ + return DrawDibSetPalette(HDRAWDIB_32(hdd), HPALETTE_32(hpal)); +} + +/*********************************************************************** + * DrawDibRealize [MSVIDEO.112] + */ +UINT16 VFWAPI DrawDibRealize16(HDRAWDIB16 hdd, HDC16 hdc, + BOOL16 fBackground) +{ + return (UINT16)DrawDibRealize(HDRAWDIB_32(hdd), HDC_32(hdc), fBackground); +} + +/************************************************************************* + * DrawDibStart [MSVIDEO.118] + */ +BOOL16 VFWAPI DrawDibStart16(HDRAWDIB16 hdd, DWORD rate) +{ + return DrawDibStart(HDRAWDIB_32(hdd), rate); +} + +/************************************************************************* + * DrawDibStop [MSVIDEO.119] + */ +BOOL16 VFWAPI DrawDibStop16(HDRAWDIB16 hdd) +{ + return DrawDibStop(HDRAWDIB_32(hdd)); +} + +/*********************************************************************** + * ICOpen [MSVIDEO.203] + */ +HIC16 VFWAPI ICOpen16(DWORD fccType, DWORD fccHandler, UINT16 wMode) +{ + return HIC_16(ICOpen(fccType, fccHandler, wMode)); +} + +/*********************************************************************** + * ICClose [MSVIDEO.204] + */ +LRESULT WINAPI ICClose16(HIC16 hic) +{ + return ICClose(HIC_32(hic)); +} + +/*********************************************************************** + * _ICMessage [MSVIDEO.207] + */ +LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ) +{ + LPWORD lpData; + SEGPTR segData; + LRESULT ret; + UINT16 i; + + lpData = HeapAlloc(GetProcessHeap(), 0, cb); + + TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb); + + for (i = 0; i < cb / sizeof(WORD); i++) + { + lpData[i] = VA_ARG16(valist, WORD); + } + + segData = MapLS(lpData); + ret = ICSendMessage16(hic, msg, segData, (DWORD) cb); + UnMapLS(segData); + HeapFree(GetProcessHeap(), 0, lpData); + return ret; +} + +/*********************************************************************** + * ICGetInfo [MSVIDEO.212] + */ +LRESULT VFWAPI ICGetInfo16(HIC16 hic, ICINFO16 * picinfo, DWORD cb) +{ + LRESULT ret; + + TRACE("(0x%08x,%p,%d)\n", (DWORD) hic, picinfo, cb); + ret = ICSendMessage16(hic, ICM_GETINFO, (DWORD) picinfo, cb); + TRACE(" -> 0x%08lx\n", ret); + return ret; +} + +/*********************************************************************** + * ICLocate [MSVIDEO.213] + */ +HIC16 VFWAPI ICLocate16(DWORD fccType, DWORD fccHandler, + LPBITMAPINFOHEADER lpbiIn, LPBITMAPINFOHEADER lpbiOut, + WORD wFlags) +{ + return HIC_16(ICLocate(fccType, fccHandler, lpbiIn, lpbiOut, wFlags)); +} + +/*********************************************************************** + * _ICCompress [MSVIDEO.224] + */ +DWORD VFWAPIV ICCompress16(HIC16 hic, DWORD dwFlags, + LPBITMAPINFOHEADER lpbiOutput, LPVOID lpData, + LPBITMAPINFOHEADER lpbiInput, LPVOID lpBits, + LPDWORD lpckid, LPDWORD lpdwFlags, + LONG lFrameNum, DWORD dwFrameSize, + DWORD dwQuality, LPBITMAPINFOHEADER lpbiPrev, + LPVOID lpPrev) +{ + DWORD ret; + ICCOMPRESS iccmp; + SEGPTR seg_iccmp; + + TRACE("(0x%08x,%d,%p,%p,%p,%p,...)\n", (DWORD) hic, dwFlags, + lpbiOutput, lpData, lpbiInput, lpBits); + + iccmp.dwFlags = dwFlags; + + iccmp.lpbiOutput = lpbiOutput; + iccmp.lpOutput = lpData; + iccmp.lpbiInput = lpbiInput; + iccmp.lpInput = lpBits; + + iccmp.lpckid = lpckid; + iccmp.lpdwFlags = lpdwFlags; + iccmp.lFrameNum = lFrameNum; + iccmp.dwFrameSize = dwFrameSize; + iccmp.dwQuality = dwQuality; + iccmp.lpbiPrev = lpbiPrev; + iccmp.lpPrev = lpPrev; + seg_iccmp = MapLS(&iccmp); + ret = ICSendMessage16(hic, ICM_COMPRESS, seg_iccmp, sizeof(ICCOMPRESS)); + UnMapLS(seg_iccmp); + return ret; +} + +/*********************************************************************** + * _ICDecompress [MSVIDEO.230] + */ +DWORD VFWAPIV ICDecompress16(HIC16 hic, DWORD dwFlags, + LPBITMAPINFOHEADER lpbiFormat, LPVOID lpData, + LPBITMAPINFOHEADER lpbi, LPVOID lpBits) +{ + ICDECOMPRESS icd; + SEGPTR segptr; + DWORD ret; + + TRACE("(0x%08x,%d,%p,%p,%p,%p)\n", (DWORD) hic, dwFlags, lpbiFormat, + lpData, lpbi, lpBits); + + icd.dwFlags = dwFlags; + icd.lpbiInput = lpbiFormat; + icd.lpInput = lpData; + icd.lpbiOutput = lpbi; + icd.lpOutput = lpBits; + icd.ckid = 0; + segptr = MapLS(&icd); + ret = ICSendMessage16(hic, ICM_DECOMPRESS, segptr, sizeof(ICDECOMPRESS)); + UnMapLS(segptr); + return ret; +} + +/*********************************************************************** + * _ICDrawBegin [MSVIDEO.232] + */ +DWORD VFWAPIV ICDrawBegin16(HIC16 hic, /* [in] */ + DWORD dwFlags, /* [in] flags */ + HPALETTE16 hpal, /* [in] palette to draw with */ + HWND16 hwnd, /* [in] window to draw to */ + HDC16 hdc, /* [in] HDC to draw to */ + INT16 xDst, /* [in] destination rectangle */ + INT16 yDst, /* [in] */ + INT16 dxDst, /* [in] */ + INT16 dyDst, /* [in] */ + LPBITMAPINFOHEADER lpbi, /* [in] format of frame to draw NOTE: SEGPTR */ + INT16 xSrc, /* [in] source rectangle */ + INT16 ySrc, /* [in] */ + INT16 dxSrc, /* [in] */ + INT16 dySrc, /* [in] */ + DWORD dwRate, /* [in] frames/second = (dwRate/dwScale) */ + DWORD dwScale) /* [in] */ +{ + DWORD ret; + ICDRAWBEGIN16 icdb; + SEGPTR seg_icdb; + + TRACE ("(0x%08x,%d,0x%08x,0x%08x,0x%08x,%u,%u,%u,%u,%p,%u,%u,%u,%u,%d,%d)\n", + (DWORD) hic, dwFlags, (DWORD) hpal, (DWORD) hwnd, (DWORD) hdc, + xDst, yDst, dxDst, dyDst, lpbi, xSrc, ySrc, dxSrc, dySrc, dwRate, + dwScale); + + icdb.dwFlags = dwFlags; + icdb.hpal = hpal; + icdb.hwnd = hwnd; + icdb.hdc = hdc; + icdb.xDst = xDst; + icdb.yDst = yDst; + icdb.dxDst = dxDst; + icdb.dyDst = dyDst; + icdb.lpbi = lpbi; /* Keep this as SEGPTR for the mapping code to deal with */ + icdb.xSrc = xSrc; + icdb.ySrc = ySrc; + icdb.dxSrc = dxSrc; + icdb.dySrc = dySrc; + icdb.dwRate = dwRate; + icdb.dwScale = dwScale; + seg_icdb = MapLS(&icdb); + ret = (DWORD) ICSendMessage16(hic, ICM_DRAW_BEGIN, seg_icdb, + sizeof(ICDRAWBEGIN16)); + UnMapLS(seg_icdb); + return ret; +} + +/*********************************************************************** + * _ICDraw [MSVIDEO.234] + */ +DWORD VFWAPIV ICDraw16(HIC16 hic, DWORD dwFlags, + LPVOID lpFormat, /* [???] NOTE: SEGPTR */ + LPVOID lpData, /* [???] NOTE: SEGPTR */ + DWORD cbData, LONG lTime) +{ + DWORD ret; + ICDRAW icd; + SEGPTR seg_icd; + + TRACE("(0x%08x,0x%08x,%p,%p,%d,%d)\n", (DWORD) hic, dwFlags, + lpFormat, lpData, cbData, lTime); + icd.dwFlags = dwFlags; + icd.lpFormat = lpFormat; + icd.lpData = lpData; + icd.cbData = cbData; + icd.lTime = lTime; + seg_icd = MapLS(&icd); + ret = ICSendMessage16(hic, ICM_DRAW, seg_icd, sizeof(ICDRAW)); + UnMapLS(seg_icd); + return ret; +} + +/*********************************************************************** + * ICGetDisplayFormat [MSVIDEO.239] + */ +HIC16 VFWAPI ICGetDisplayFormat16(HIC16 hic, LPBITMAPINFOHEADER lpbiIn, + LPBITMAPINFOHEADER lpbiOut, INT16 depth, + INT16 dx, INT16 dy) +{ + return HIC_16(ICGetDisplayFormat(HIC_32(hic), lpbiIn, lpbiOut, depth, + dx, dy)); +} + +#define COPY(x,y) (x->y = x##16->y); +#define COPYPTR(x,y) (x->y = MapSL((SEGPTR)x##16->y)); + +/****************************************************************** + * MSVIDEO_MapICDEX16To32 + * + * + */ +static LPVOID MSVIDEO_MapICDEX16To32(LPDWORD lParam) +{ + LPVOID ret; + + ICDECOMPRESSEX *icdx = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESSEX)); + ICDECOMPRESSEX16 *icdx16 = MapSL(*lParam); + ret = icdx16; + + COPY(icdx, dwFlags); + COPYPTR(icdx, lpbiSrc); + COPYPTR(icdx, lpSrc); + COPYPTR(icdx, lpbiDst); + COPYPTR(icdx, lpDst); + COPY(icdx, xDst); + COPY(icdx, yDst); + COPY(icdx, dxDst); + COPY(icdx, dyDst); + COPY(icdx, xSrc); + COPY(icdx, ySrc); + COPY(icdx, dxSrc); + COPY(icdx, dySrc); + + *lParam = (DWORD)(icdx); + return ret; +} + +/****************************************************************** + * MSVIDEO_MapMsg16To32 + * + * + */ +static LPVOID MSVIDEO_MapMsg16To32(UINT msg, LPDWORD lParam1, LPDWORD lParam2) +{ + LPVOID ret = 0; + + TRACE("Mapping %d\n", msg); + + switch (msg) + { + case DRV_LOAD: + case DRV_ENABLE: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + case ICM_ABOUT: + case ICM_CONFIGURE: + case ICM_COMPRESS_END: + case ICM_DECOMPRESS_END: + case ICM_DECOMPRESSEX_END: + case ICM_SETQUALITY: + case ICM_DRAW_START_PLAY: + case ICM_DRAW_STOP_PLAY: + case ICM_DRAW_REALIZE: + case ICM_DRAW_RENDERBUFFER: + case ICM_DRAW_END: + break; + case DRV_OPEN: + case ICM_GETDEFAULTQUALITY: + case ICM_GETQUALITY: + case ICM_SETSTATE: + case ICM_DRAW_WINDOW: + case ICM_GETBUFFERSWANTED: + *lParam1 = (DWORD)MapSL(*lParam1); + break; + case ICM_GETINFO: + { + ICINFO *ici = HeapAlloc(GetProcessHeap(), 0, sizeof(ICINFO)); + ICINFO16 *ici16; + + ici16 = MapSL(*lParam1); + ret = ici16; + + ici->dwSize = sizeof(ICINFO); + COPY(ici, fccType); + COPY(ici, fccHandler); + COPY(ici, dwFlags); + COPY(ici, dwVersion); + COPY(ici, dwVersionICM); + MultiByteToWideChar( CP_ACP, 0, ici16->szName, -1, ici->szName, 16 ); + MultiByteToWideChar( CP_ACP, 0, ici16->szDescription, -1, ici->szDescription, 128 ); + MultiByteToWideChar( CP_ACP, 0, ici16->szDriver, -1, ici->szDriver, 128 ); + *lParam1 = (DWORD)(ici); + *lParam2 = sizeof(ICINFO); + } + break; + case ICM_COMPRESS: + { + ICCOMPRESS *icc = HeapAlloc(GetProcessHeap(), 0, sizeof(ICCOMPRESS)); + ICCOMPRESS *icc16; + + icc16 = MapSL(*lParam1); + ret = icc16; + + COPY(icc, dwFlags); + COPYPTR(icc, lpbiOutput); + COPYPTR(icc, lpOutput); + COPYPTR(icc, lpbiInput); + COPYPTR(icc, lpInput); + COPYPTR(icc, lpckid); + COPYPTR(icc, lpdwFlags); + COPY(icc, lFrameNum); + COPY(icc, dwFrameSize); + COPY(icc, dwQuality); + COPYPTR(icc, lpbiPrev); + COPYPTR(icc, lpPrev); + + *lParam1 = (DWORD)(icc); + *lParam2 = sizeof(ICCOMPRESS); + } + break; + case ICM_DECOMPRESS: + { + ICDECOMPRESS *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDECOMPRESS)); + ICDECOMPRESS *icd16; /* Same structure except for the pointers */ + + icd16 = MapSL(*lParam1); + ret = icd16; + + COPY(icd, dwFlags); + COPYPTR(icd, lpbiInput); + COPYPTR(icd, lpInput); + COPYPTR(icd, lpbiOutput); + COPYPTR(icd, lpOutput); + COPY(icd, ckid); + + *lParam1 = (DWORD)(icd); + *lParam2 = sizeof(ICDECOMPRESS); + } + break; + case ICM_COMPRESS_BEGIN: + case ICM_COMPRESS_GET_FORMAT: + case ICM_COMPRESS_GET_SIZE: + case ICM_COMPRESS_QUERY: + case ICM_DECOMPRESS_GET_FORMAT: + case ICM_DECOMPRESS_QUERY: + case ICM_DECOMPRESS_BEGIN: + case ICM_DECOMPRESS_SET_PALETTE: + case ICM_DECOMPRESS_GET_PALETTE: + *lParam1 = (DWORD)MapSL(*lParam1); + *lParam2 = (DWORD)MapSL(*lParam2); + break; + case ICM_DECOMPRESSEX_QUERY: + if ((*lParam2 != sizeof(ICDECOMPRESSEX16)) && (*lParam2 != 0)) + WARN("*lParam2 has unknown value %p\n", (ICDECOMPRESSEX16*)*lParam2); + /* FIXME: *lParm2 is meant to be 0 or an ICDECOMPRESSEX16*, but is sizeof(ICDECOMRPESSEX16) + * This is because of ICMessage(). Special case it? + { + LPVOID* addr = HeapAlloc(GetProcessHeap(), 0, 2*sizeof(LPVOID)); + addr[0] = MSVIDEO_MapICDEX16To32(lParam1); + if (*lParam2) + addr[1] = MSVIDEO_MapICDEX16To32(lParam2); + else + addr[1] = 0; + + ret = addr; + } + break;*/ + case ICM_DECOMPRESSEX_BEGIN: + case ICM_DECOMPRESSEX: + ret = MSVIDEO_MapICDEX16To32(lParam1); + *lParam2 = sizeof(ICDECOMPRESSEX); + break; + case ICM_DRAW_BEGIN: + { + ICDRAWBEGIN *icdb = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWBEGIN)); + ICDRAWBEGIN16 *icdb16 = MapSL(*lParam1); + ret = icdb16; + + COPY(icdb, dwFlags); + icdb->hpal = HPALETTE_32(icdb16->hpal); + icdb->hwnd = HWND_32(icdb16->hwnd); + icdb->hdc = HDC_32(icdb16->hdc); + COPY(icdb, xDst); + COPY(icdb, yDst); + COPY(icdb, dxDst); + COPY(icdb, dyDst); + COPYPTR(icdb, lpbi); + COPY(icdb, xSrc); + COPY(icdb, ySrc); + COPY(icdb, dxSrc); + COPY(icdb, dySrc); + COPY(icdb, dwRate); + COPY(icdb, dwScale); + + *lParam1 = (DWORD)(icdb); + *lParam2 = sizeof(ICDRAWBEGIN); + } + break; + case ICM_DRAW_SUGGESTFORMAT: + { + ICDRAWSUGGEST *icds = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAWSUGGEST)); + ICDRAWSUGGEST16 *icds16 = MapSL(*lParam1); + + ret = icds16; + + COPY(icds, dwFlags); + COPYPTR(icds, lpbiIn); + COPYPTR(icds, lpbiSuggest); + COPY(icds, dxSrc); + COPY(icds, dySrc); + COPY(icds, dxDst); + COPY(icds, dyDst); + icds->hicDecompressor = HIC_32(icds16->hicDecompressor); + + *lParam1 = (DWORD)(icds); + *lParam2 = sizeof(ICDRAWSUGGEST); + } + break; + case ICM_DRAW: + { + ICDRAW *icd = HeapAlloc(GetProcessHeap(), 0, sizeof(ICDRAW)); + ICDRAW *icd16 = MapSL(*lParam1); + ret = icd16; + + COPY(icd, dwFlags); + COPYPTR(icd, lpFormat); + COPYPTR(icd, lpData); + COPY(icd, cbData); + COPY(icd, lTime); + + *lParam1 = (DWORD)(icd); + *lParam2 = sizeof(ICDRAW); + } + break; + case ICM_DRAW_START: + case ICM_DRAW_STOP: + break; + default: + FIXME("%d is not yet handled. Expect a crash.\n", msg); + } + return ret; +} + +#undef COPY +#undef COPYPTR + +/****************************************************************** + * MSVIDEO_UnmapMsg16To32 + * + * + */ +static void MSVIDEO_UnmapMsg16To32(UINT msg, LPVOID data16, LPDWORD lParam1, LPDWORD lParam2) +{ + TRACE("Unmapping %d\n", msg); + +#define UNCOPY(x, y) (x##16->y = x->y); + + switch (msg) + { + case ICM_GETINFO: + { + ICINFO *ici = (ICINFO*)(*lParam1); + ICINFO16 *ici16 = data16; + + UNCOPY(ici, fccType); + UNCOPY(ici, fccHandler); + UNCOPY(ici, dwFlags); + UNCOPY(ici, dwVersion); + UNCOPY(ici, dwVersionICM); + WideCharToMultiByte( CP_ACP, 0, ici->szName, -1, ici16->szName, + sizeof(ici16->szName), NULL, NULL ); + ici16->szName[sizeof(ici16->szName)-1] = 0; + WideCharToMultiByte( CP_ACP, 0, ici->szDescription, -1, ici16->szDescription, + sizeof(ici16->szDescription), NULL, NULL ); + ici16->szDescription[sizeof(ici16->szDescription)-1] = 0; + /* This just gives garbage for some reason - BB + lstrcpynWtoA(ici16->szDriver, ici->szDriver, 128);*/ + + HeapFree(GetProcessHeap(), 0, ici); + } + break; + case ICM_DECOMPRESS_QUERY: + /*{ + LPVOID* x = data16; + HeapFree(GetProcessHeap(), 0, x[0]); + if (x[1]) + HeapFree(GetProcessHeap(), 0, x[1]); + } + break;*/ + case ICM_COMPRESS: + case ICM_DECOMPRESS: + case ICM_DECOMPRESSEX_QUERY: + case ICM_DECOMPRESSEX_BEGIN: + case ICM_DECOMPRESSEX: + case ICM_DRAW_BEGIN: + case ICM_DRAW_SUGGESTFORMAT: + case ICM_DRAW: + HeapFree(GetProcessHeap(), 0, data16); + break; + default: + ERR("Unmapping unmapped msg %d\n", msg); + } +#undef UNCOPY +} + +/*********************************************************************** + * ICInfo [MSVIDEO.200] + */ +BOOL16 VFWAPI ICInfo16(DWORD fccType, DWORD fccHandler, ICINFO16 *lpicinfo) +{ + BOOL16 ret; + LPVOID lpv; + DWORD lParam = (DWORD)lpicinfo; + DWORD size = ((ICINFO*)(MapSL((SEGPTR)lpicinfo)))->dwSize; + + /* Use the mapping functions to map the ICINFO structure */ + lpv = MSVIDEO_MapMsg16To32(ICM_GETINFO, &lParam, &size); + + ret = ICInfo(fccType, fccHandler, (ICINFO*)lParam); + + MSVIDEO_UnmapMsg16To32(ICM_GETINFO, lpv, &lParam, &size); + + return ret; +} + +/****************************************************************** + * IC_Callback3216 + * + * + */ +static LRESULT CALLBACK IC_Callback3216(HIC hic, HDRVR hdrv, UINT msg, DWORD lp1, DWORD lp2) +{ + WINE_HIC* whic; + WORD args[8]; + + whic = MSVIDEO_GetHicPtr(hic); + if (whic) + { + DWORD ret = 0; + switch (msg) + { + case DRV_OPEN: + lp2 = (DWORD)MapLS((void*)lp2); + break; + } + args[7] = HIWORD(hic); + args[6] = LOWORD(hic); + args[5] = HDRVR_16(whic->hdrv); + args[4] = msg; + args[3] = HIWORD(lp1); + args[2] = LOWORD(lp1); + args[1] = HIWORD(lp2); + args[0] = LOWORD(lp2); + WOWCallback16Ex( whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &ret ); + + switch (msg) + { + case DRV_OPEN: + UnMapLS(lp2); + break; + } + return ret; + } + else return ICERR_BADHANDLE; +} + +/*********************************************************************** + * ICOpenFunction [MSVIDEO.206] + */ +HIC16 VFWAPI ICOpenFunction16(DWORD fccType, DWORD fccHandler, UINT16 wMode, FARPROC16 lpfnHandler) +{ + HIC hic32; + + hic32 = MSVIDEO_OpenFunction(fccType, fccHandler, wMode, + (DRIVERPROC)IC_Callback3216, (DWORD)lpfnHandler); + return HIC_16(hic32); +} + +/*********************************************************************** + * ICSendMessage [MSVIDEO.205] + */ +LRESULT VFWAPI ICSendMessage16(HIC16 hic, UINT16 msg, DWORD lParam1, DWORD lParam2) +{ + LRESULT ret = ICERR_BADHANDLE; + WINE_HIC* whic; + + whic = MSVIDEO_GetHicPtr(HIC_32(hic)); + if (whic) + { + /* we've got a 16 bit driver proc... call it directly */ + if (whic->driverproc16) + { + WORD args[8]; + DWORD result; + + /* FIXME: original code was passing hdrv first and hic second */ + /* but this doesn't match what IC_Callback3216 does */ + args[7] = HIWORD(hic); + args[6] = LOWORD(hic); + args[5] = HDRVR_16(whic->hdrv); + args[4] = msg; + args[3] = HIWORD(lParam1); + args[2] = LOWORD(lParam1); + args[1] = HIWORD(lParam2); + args[0] = LOWORD(lParam2); + WOWCallback16Ex( whic->driverproc16, WCB16_PASCAL, sizeof(args), args, &result ); + ret = result; + } + else + { + /* map the message for a 32 bit infrastructure, and pass it along */ + void* data16 = MSVIDEO_MapMsg16To32(msg, &lParam1, &lParam2); + + ret = MSVIDEO_SendMessage(whic, msg, lParam1, lParam2); + if (data16) + MSVIDEO_UnmapMsg16To32(msg, data16, &lParam1, &lParam2); + } + } + return ret; +} + +/*********************************************************************** + * VideoCapDriverDescAndVer [MSVIDEO.22] + */ +DWORD WINAPI VideoCapDriverDescAndVer16(WORD nr, LPSTR buf1, WORD buf1len, + LPSTR buf2, WORD buf2len) +{ + static const char version_info_spec[] = "\\StringFileInfo\\040904E4\\FileDescription"; + DWORD verhandle; + DWORD infosize; + UINT subblocklen; + char *s, buf[2048], fn[260]; + LPBYTE infobuf; + LPVOID subblock; + DWORD i, cnt = 0, lRet; + DWORD bufLen, fnLen; + FILETIME lastWrite; + HKEY hKey; + BOOL found = FALSE; + + TRACE("(%d,%p,%d,%p,%d)\n", nr, buf1, buf1len, buf2, buf2len); + lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); + if (lRet == ERROR_SUCCESS) + { + RegQueryInfoKeyA( hKey, 0, 0, 0, &cnt, 0, 0, 0, 0, 0, 0, 0); + for (i = 0; i < cnt; i++) + { + bufLen = sizeof(buf) / sizeof(buf[0]); + lRet = RegEnumKeyExA(hKey, i, buf, &bufLen, 0, 0, 0, &lastWrite); + if (lRet != ERROR_SUCCESS) continue; + if (strncasecmp(buf, "vid", 3)) continue; + if (nr--) continue; + fnLen = sizeof(fn); + lRet = RegQueryValueExA(hKey, buf, 0, 0, (LPBYTE)fn, &fnLen); + if (lRet == ERROR_SUCCESS) found = TRUE; + break; + } + RegCloseKey( hKey ); + } + + /* search system.ini if not found in the registry */ + if (!found && GetPrivateProfileStringA("drivers32", NULL, NULL, buf, sizeof(buf), "system.ini")) + { + for (s = buf; *s; s += strlen(s) + 1) + { + if (strncasecmp(s, "vid", 3)) continue; + if (nr--) continue; + if (GetPrivateProfileStringA("drivers32", s, NULL, fn, sizeof(fn), "system.ini")) + found = TRUE; + break; + } + } + + if (!found) + { + TRACE("No more VID* entries found nr=%d\n", nr); + return 20; + } + infosize = GetFileVersionInfoSizeA(fn, &verhandle); + if (!infosize) + { + TRACE("%s has no fileversioninfo.\n", fn); + return 18; + } + infobuf = HeapAlloc(GetProcessHeap(), 0, infosize); + if (GetFileVersionInfoA(fn, verhandle, infosize, infobuf)) + { + /* Yes, two space behind : */ + /* FIXME: test for buflen */ + snprintf(buf2, buf2len, "Version: %d.%d.%d.%d\n", + ((WORD*)infobuf)[0x0f], + ((WORD*)infobuf)[0x0e], + ((WORD*)infobuf)[0x11], + ((WORD*)infobuf)[0x10] + ); + TRACE("version of %s is %s\n", fn, buf2); + } + else + { + TRACE("GetFileVersionInfoA failed for %s.\n", fn); + lstrcpynA(buf2, fn, buf2len); /* msvideo.dll appears to copy fn*/ + } + /* FIXME: language problem? */ + if (VerQueryValueA( infobuf, + version_info_spec, + &subblock, + &subblocklen + )) + { + UINT copylen = min(subblocklen,buf1len-1); + memcpy(buf1, subblock, copylen); + buf1[copylen] = '\0'; + TRACE("VQA returned %s\n", (LPCSTR)subblock); + } + else + { + TRACE("VQA did not return on query \\StringFileInfo\\040904E4\\FileDescription?\n"); + lstrcpynA(buf1, fn, buf1len); /* msvideo.dll appears to copy fn*/ + } + HeapFree(GetProcessHeap(), 0, infobuf); + return 0; +} + +/****************************************************************** + * IC_CallTo16 + * + * + */ +static LRESULT CALLBACK IC_CallTo16(HDRVR hdrv, HIC hic, UINT msg, LPARAM lp1, LPARAM lp2) +{ +#if 0 + WINE_HIC* whic = IC_GetPtr(hic); + LRESULT ret = 0; + + + if (whic->driverproc) + { + ret = whic->driverproc(hic, whic->hdrv, msg, lParam1, lParam2); + } + else + { + ret = SendDriverMessage(whic->hdrv, msg, lParam1, lParam2); + } +#else + FIXME("No 32=>16 conversion yet\n"); +#endif + return 0; +} + +/************************************************************************** + * DllEntryPoint (MSVIDEO.3) + * + * MSVIDEO DLL entry point + * + */ +BOOL WINAPI VIDEO_LibMain(DWORD fdwReason, HINSTANCE hinstDLL, WORD ds, + WORD wHeapSize, DWORD dwReserved1, WORD wReserved2) +{ + switch (fdwReason) + { + case DLL_PROCESS_ATTACH: + /* hook in our 16 bit management functions */ + pFnCallTo16 = IC_CallTo16; + break; + case DLL_PROCESS_DETACH: + /* remove our 16 bit management functions */ + pFnCallTo16 = NULL; + break; + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + break; + } + return TRUE; +} diff --git a/dll/win32/msvfw32/vfw16.h b/dll/win32/msvfw32/vfw16.h new file mode 100644 index 00000000000..5cf97915dbc --- /dev/null +++ b/dll/win32/msvfw32/vfw16.h @@ -0,0 +1,130 @@ +/* + * Copyright 1999 Marcus Meissner + * + * 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_VFW16_H +#define __WINE_VFW16_H + +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "vfw.h" +#include "wownt32.h" +#include "wine/windef16.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +typedef HANDLE16 HDRAWDIB16; + +#include "pshpack1.h" + +typedef struct { + DWORD dwSize; + DWORD fccType; + DWORD fccHandler; + DWORD dwFlags; + DWORD dwVersion; + DWORD dwVersionICM; + /* + * under Win16, normal chars are used + */ + CHAR szName[16]; + CHAR szDescription[128]; + CHAR szDriver[128]; +} ICINFO16; + +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiSrc; + LPVOID lpSrc; + LPBITMAPINFOHEADER lpbiDst; + LPVOID lpDst; + + INT16 xDst; /* destination rectangle */ + INT16 yDst; + INT16 dxDst; + INT16 dyDst; + + INT16 xSrc; /* source rectangle */ + INT16 ySrc; + INT16 dxSrc; + INT16 dySrc; +} ICDECOMPRESSEX16; + +typedef struct { + DWORD dwFlags; + HPALETTE16 hpal; + HWND16 hwnd; + HDC16 hdc; + INT16 xDst; + INT16 yDst; + INT16 dxDst; + INT16 dyDst; + LPBITMAPINFOHEADER lpbi; + INT16 xSrc; + INT16 ySrc; + INT16 dxSrc; + INT16 dySrc; + DWORD dwRate; + DWORD dwScale; +} ICDRAWBEGIN16; + +#include "poppack.h" + +typedef struct { + DWORD dwFlags; + LPBITMAPINFOHEADER lpbiIn; + LPBITMAPINFOHEADER lpbiSuggest; + INT16 dxSrc; + INT16 dySrc; + INT16 dxDst; + INT16 dyDst; + HIC16 hicDecompressor; +} ICDRAWSUGGEST16; + +DWORD VFWAPIV ICDraw16(HIC16,DWORD,LPVOID,LPVOID,DWORD,LONG); +DWORD VFWAPIV ICDrawBegin16(HIC16,DWORD,HPALETTE16,HWND16,HDC16,INT16, + INT16,INT16,INT16,LPBITMAPINFOHEADER, + INT16,INT16,INT16,INT16,DWORD,DWORD); +LRESULT WINAPI ICClose16(HIC16); +DWORD VFWAPIV ICCompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, + LPBITMAPINFOHEADER,LPVOID,LPDWORD, + LPDWORD,LONG,DWORD,DWORD, + LPBITMAPINFOHEADER,LPVOID); +DWORD VFWAPIV ICDecompress16(HIC16,DWORD,LPBITMAPINFOHEADER,LPVOID, + LPBITMAPINFOHEADER,LPVOID); +HIC16 VFWAPI ICGetDisplayFormat16(HIC16,LPBITMAPINFOHEADER, + LPBITMAPINFOHEADER,INT16,INT16, + INT16); +LRESULT VFWAPI ICGetInfo16(HIC16,ICINFO16 *,DWORD); +BOOL16 VFWAPI ICInfo16(DWORD,DWORD,ICINFO16 *); +HIC16 VFWAPI ICLocate16(DWORD,DWORD,LPBITMAPINFOHEADER, + LPBITMAPINFOHEADER,WORD); +LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ); +HIC16 VFWAPI ICOpen16(DWORD,DWORD,UINT16); +HIC16 VFWAPI ICOpenFunction16(DWORD,DWORD,UINT16,FARPROC16); +LRESULT VFWAPI ICSendMessage16(HIC16,UINT16,DWORD,DWORD); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __WINE_VFW16_H */ diff --git a/dll/win32/msvidc32/msvideo1.c b/dll/win32/msvidc32/msvideo1.c index 68a52c651dd..19784eb888e 100644 --- a/dll/win32/msvidc32/msvideo1.c +++ b/dll/win32/msvidc32/msvideo1.c @@ -95,18 +95,10 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s blocks_high = height / 4; total_blocks = blocks_wide * blocks_high; block_inc = 4; -#ifdef ORIGINAL row_dec = stride + 4; -#else - row_dec = - (stride - 4); /* such that -row_dec > 0 */ -#endif for (block_y = blocks_high; block_y > 0; block_y--) { -#ifdef ORIGINAL block_ptr = ((block_y * 4) - 1) * stride; -#else - block_ptr = ((blocks_high - block_y) * 4) * stride; -#endif for (block_x = blocks_wide; block_x > 0; block_x--) { /* check if this block should be skipped */ if (skip_blocks) { @@ -139,7 +131,16 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) + { +#ifdef ORIGINAL pixels[pixel_ptr++] = colors[(flags & 0x1) ^ 1]; +#else + pixels[width*(height-(pixel_ptr/width)-1) + + pixel_ptr%width] = + colors[(flags & 0x1) ^ 1]; + pixel_ptr++; +#endif + } pixel_ptr -= row_dec; } } else if (byte_b >= 0x90) { @@ -152,9 +153,19 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - pixels[pixel_ptr++] = - colors[((pixel_y & 0x2) << 1) + + { +#ifdef ORIGINAL + pixels[pixel_ptr++] = + colors[((pixel_y & 0x2) << 1) + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; +#else + pixels[width*(height-(pixel_ptr/width)-1) + + pixel_ptr%width] = + colors[((pixel_y & 0x2) << 1) + + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; + pixel_ptr++; +#endif + } pixel_ptr -= row_dec; } } else { @@ -163,7 +174,15 @@ msvideo1_decode_8bit( int width, int height, const unsigned char *buf, int buf_s for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++) + { +#ifdef ORIGINAL pixels[pixel_ptr++] = colors[0]; +#else + pixels[width*(height-(pixel_ptr/width)-1) + + pixel_ptr%width] = colors[0]; + pixel_ptr++; +#endif + } pixel_ptr -= row_dec; } } @@ -199,18 +218,10 @@ msvideo1_decode_16bit( int width, int height, const unsigned char *buf, int buf_ blocks_high = height / 4; total_blocks = blocks_wide * blocks_high; block_inc = 4; -#ifdef ORIGINAL row_dec = stride + 4; -#else - row_dec = - (stride - 4); /* such that -row_dec > 0 */ -#endif for (block_y = blocks_high; block_y > 0; block_y--) { -#ifdef ORIGINAL block_ptr = ((block_y * 4) - 1) * stride; -#else - block_ptr = ((blocks_high - block_y) * 4) * stride; -#endif for (block_x = blocks_wide; block_x > 0; block_x--) { /* check if this block should be skipped */ if (skip_blocks) { @@ -261,8 +272,8 @@ msvideo1_decode_16bit( int width, int height, const unsigned char *buf, int buf_ for (pixel_y = 0; pixel_y < 4; pixel_y++) { for (pixel_x = 0; pixel_x < 4; pixel_x++, flags >>= 1) - pixels[pixel_ptr++] = - colors[((pixel_y & 0x2) << 1) + + pixels[pixel_ptr++] = + colors[((pixel_y & 0x2) << 1) + (pixel_x & 0x2) + ((flags & 0x1) ^ 1)]; pixel_ptr -= row_dec; } @@ -397,7 +408,7 @@ static LRESULT CRAM_Decompress( Msvideo1Context *info, ICDECOMPRESS *icd, DWORD width = icd->lpbiInput->biWidth; height = icd->lpbiInput->biHeight; bit_per_pixel = icd->lpbiInput->biBitCount; - stride = width; /* in bytes or 16bit words */ + stride = width*bit_per_pixel/8; sz = icd->lpbiInput->biSizeImage; if (info->mode_8bit) @@ -429,7 +440,7 @@ static LRESULT CRAM_DecompressEx( Msvideo1Context *info, ICDECOMPRESSEX *icd, DW width = icd->lpbiSrc->biWidth; height = icd->lpbiSrc->biHeight; bit_per_pixel = icd->lpbiSrc->biBitCount; - stride = width; + stride = width*bit_per_pixel/8; sz = icd->lpbiSrc->biSizeImage; if (info->mode_8bit) @@ -551,10 +562,6 @@ LRESULT WINAPI CRAM_DriverProc( DWORD_PTR dwDriverId, HDRVR hdrvr, UINT msg, (DWORD) lParam2 ); break; - case ICM_DECOMPRESS_END: - r = ICERR_OK; - break; - case ICM_COMPRESS_QUERY: FIXME("compression not implemented\n"); r = ICERR_BADFORMAT; diff --git a/dll/win32/msxml3/dispex.c b/dll/win32/msxml3/dispex.c index 09b71fed39d..529f9a452ee 100644 --- a/dll/win32/msxml3/dispex.c +++ b/dll/win32/msxml3/dispex.c @@ -196,12 +196,12 @@ static void add_func_info(dispex_data_t *data, DWORD *size, tid_t tid, DISPID id static int dispid_cmp(const void *p1, const void *p2) { - return ((const func_info_t*)p1)->id - ((const func_info_t*)p2)->id; + return ((func_info_t*)p1)->id - ((func_info_t*)p2)->id; } static int func_name_cmp(const void *p1, const void *p2) { - return strcmpiW((*(func_info_t* const*)p1)->name, (*(func_info_t* const*)p2)->name); + return strcmpiW((*(func_info_t**)p1)->name, (*(func_info_t**)p2)->name); } static dispex_data_t *preprocess_dispex_data(DispatchEx *This) diff --git a/dll/win32/msxml3/element.c b/dll/win32/msxml3/element.c index 617c008e288..b6caf73df15 100644 --- a/dll/win32/msxml3/element.c +++ b/dll/win32/msxml3/element.c @@ -594,7 +594,7 @@ static HRESULT WINAPI domelem_removeAttribute( IXMLDOMNamedNodeMap *attr; HRESULT hr; - TRACE("(%p)->(%s)\n", This, debugstr_w(p)); + TRACE("(%p)->(%s)", This, debugstr_w(p)); hr = IXMLDOMElement_get_attributes(iface, &attr); if (hr != S_OK) return hr; diff --git a/dll/win32/msxml3/main.c b/dll/win32/msxml3/main.c index 60b0cbd7b53..9b1eb823fbe 100644 --- a/dll/win32/msxml3/main.c +++ b/dll/win32/msxml3/main.c @@ -62,7 +62,7 @@ static int wineXmlMatchCallback (char const * filename) static void *wineXmlOpenCallback (char const * filename) { - BSTR sFilename = bstr_from_xmlChar( (const xmlChar*)filename); + BSTR sFilename = bstr_from_xmlChar( (xmlChar*)filename); HANDLE hFile; TRACE("%s\n", debugstr_w(sFilename)); diff --git a/dll/win32/msxml3/node.c b/dll/win32/msxml3/node.c index e263a2a143d..ac97681aac9 100644 --- a/dll/win32/msxml3/node.c +++ b/dll/win32/msxml3/node.c @@ -934,9 +934,8 @@ static HRESULT WINAPI xmlnode_get_specified( VARIANT_BOOL* isSpecified) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - FIXME("(%p)->(%p) stub!\n", This, isSpecified); - *isSpecified = VARIANT_TRUE; - return S_OK; + FIXME("(%p)->(%p)\n", This, isSpecified); + return E_NOTIMPL; } static HRESULT WINAPI xmlnode_get_definition( @@ -1191,8 +1190,8 @@ static HRESULT WINAPI xmlnode_get_dataType( switch ( This->node->type ) { case XML_ELEMENT_NODE: - pVal = xmlGetNsProp(This->node, (const xmlChar*)"dt", - (const xmlChar*)"urn:schemas-microsoft-com:datatypes"); + pVal = xmlGetNsProp(This->node, (xmlChar*)"dt", + (xmlChar*)"urn:schemas-microsoft-com:datatypes"); if (pVal) { V_VT(dataTypeName) = VT_BSTR; @@ -1261,20 +1260,20 @@ static HRESULT WINAPI xmlnode_put_dataType( xmlAttrPtr pAttr = NULL; xmlChar* str = xmlChar_from_wchar(dataTypeName); - pAttr = xmlHasNsProp(This->node, (const xmlChar*)"dt", - (const xmlChar*)"urn:schemas-microsoft-com:datatypes"); + pAttr = xmlHasNsProp(This->node, (xmlChar*)"dt", + (xmlChar*)"urn:schemas-microsoft-com:datatypes"); if (pAttr) { - pAttr = xmlSetNsProp(This->node, pAttr->ns, (const xmlChar*)"dt", str); + pAttr = xmlSetNsProp(This->node, pAttr->ns, (xmlChar*)"dt", str); hr = S_OK; } else { - pNS = xmlNewNs(This->node, (const xmlChar*)"urn:schemas-microsoft-com:datatypes", (const xmlChar*)"dt"); + pNS = xmlNewNs(This->node, (xmlChar*)"urn:schemas-microsoft-com:datatypes", (xmlChar*)"dt"); if(pNS) { - pAttr = xmlNewNsProp(This->node, pNS, (const xmlChar*)"dt", str); + pAttr = xmlNewNsProp(This->node, pNS, (xmlChar*)"dt", str); if(pAttr) { xmlAddChild(This->node, (xmlNodePtr)pAttr); @@ -1295,6 +1294,8 @@ static HRESULT WINAPI xmlnode_put_dataType( static BSTR EnsureCorrectEOL(BSTR sInput) { + static const WCHAR SZ_RETURN[] = {'\n',0}; + static const WCHAR SZ_LINEFEED[] = {'\r',0}; int nNum = 0; BSTR sNew; int nLen; @@ -1304,7 +1305,7 @@ static BSTR EnsureCorrectEOL(BSTR sInput) /* Count line endings */ for(i=0; i < nLen; i++) { - if(sInput[i] == '\n') + if(sInput[i] == SZ_RETURN[0]) nNum++; } @@ -1317,9 +1318,9 @@ static BSTR EnsureCorrectEOL(BSTR sInput) sNew = SysAllocStringLen(NULL, nLen + nNum+1); for(i=0; i < nLen; i++) { - if(sInput[i] == '\n') + if(sInput[i] == SZ_RETURN[0]) { - sNew[i+nPlace] = '\r'; + sNew[i+nPlace] = SZ_LINEFEED[0]; nPlace++; } sNew[i+nPlace] = sInput[i]; @@ -1370,7 +1371,7 @@ static BSTR EnsureNoEncoding(BSTR sInput) /* * We are trying to replicate the same behaviour as msxml by converting - * line endings to \r\n and using indents as \t. The problem is that msxml + * line endings to \r\n and using idents as \t. The problem is that msxml * only formats nodes that have a line ending. Using libxml we cannot * reproduce behaviour exactly. * @@ -1401,7 +1402,7 @@ static HRESULT WINAPI xmlnode_get_xml( /* Attribute Nodes return a space in front of their name */ pContent = xmlBufferContent(pXmlBuf); - if( ((const char*)pContent)[0] == ' ') + if( ((char*)pContent)[0] == ' ') bstrContent = bstr_from_xmlChar(pContent+1); else bstrContent = bstr_from_xmlChar(pContent); @@ -1549,9 +1550,8 @@ static HRESULT WINAPI xmlnode_get_parsed( VARIANT_BOOL* isParsed) { xmlnode *This = impl_from_IXMLDOMNode( iface ); - FIXME("(%p)->(%p) stub!\n", This, isParsed); - *isParsed = VARIANT_TRUE; - return S_OK; + FIXME("(%p)->(%p)\n", This, isParsed); + return E_NOTIMPL; } static HRESULT WINAPI xmlnode_get_namespaceURI( diff --git a/dll/win32/netcfgx/lang/cs-CZ.rc b/dll/win32/netcfgx/lang/cs-CZ.rc index 5aff39c2e5b..887cb443c8d 100644 --- a/dll/win32/netcfgx/lang/cs-CZ.rc +++ b/dll/win32/netcfgx/lang/cs-CZ.rc @@ -1,17 +1,12 @@ -/* FILE: dll/win32/netcfgx/lang/cs-CZ.rc - * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2010-03-14 - * THANKS TO: potapnik, who translated part of this file - */ - LANGUAGE LANG_CZECH, SUBLANG_DEFAULT + IDD_TCPIP_BASIC_DLG DIALOGEX DISCARDABLE 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Obecné nastavení" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Konfigurace IP adres mùže probìhnout automaticky, pokud to sí dovoluje. V opaèném pøípadì kontaktujte správce sítì pro správné nastavení.", -1, 9, 9, 228, 27 + LTEXT "Konfigurace IP adres mùže probìhnout automaticky, pokud to Vaše sí dovoluje. V opaèném pøípadì kontaktujte správce sítì pro správné nastavení.", -1, 9, 9, 228, 27 CONTROL "Získat IP adresu automaticky", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP, 14, 43, 210, 12 GROUPBOX "", -1, 9, 61, 228, 70, BS_GROUPBOX CONTROL "&Použít následující IP adresu:", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON, 14, 59, 105, 12 @@ -33,43 +28,43 @@ END IDD_TCPIP_ALTCF_DLG DIALOGEX DISCARDABLE 0, 0, 246, 228 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "Alternativní konfigurace" +CAPTION "Alternate Configuration" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Pokud je tento poèítaè používán ve více než jedné síti, lze zadat alternativní nastavení níže", -1, 9, 9, 220, 20 - CONTROL "Au&tomatická privátní IP adresa", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 40, 210, 12 + LTEXT "If this computer is used on more than one network, enter the alternate IP settings below", -1, 9, 9, 220, 20 + CONTROL "Au&tomatic private IP address", IDC_USEDHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 40, 210, 12 GROUPBOX "", -1, 9, 55, 228, 80, BS_GROUPBOX - CONTROL "&Uživatelské nastavení", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 55, 70, 12 - LTEXT "&IP adresa:", -1, 14, 75, 135, 8 + CONTROL "U&ser configured", IDC_NODHCP, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 14, 55, 70, 12 + LTEXT "&IP address:", -1, 14, 75, 135, 8 CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 150, 75, 80, 12 - LTEXT "&Maska podsítì:", -1, 14, 95, 135, 8 + LTEXT "S&ubnet mask:", -1, 14, 95, 135, 8 CONTROL "",IDC_SUBNETMASK,"SysIPAddress32",WS_TABSTOP, 150, 95, 80, 12 - LTEXT "&Výchozí brána:", -1, 14, 115, 135, 8 + LTEXT "&Default gateway:", -1, 14, 115, 135, 8 CONTROL "",IDC_DEFGATEWAY,"SysIPAddress32",WS_TABSTOP, 150, 115, 80, 12 - LTEXT "&Preferovaný DNS server:", -1, 14, 150, 135, 8 + LTEXT "&Preferred DNS server:", -1, 14, 150, 135, 8 CONTROL "",IDC_DNS1,"SysIPAddress32",WS_TABSTOP, 150, 150, 80, 12 - LTEXT "&Alternativní DNS server:", -1, 14, 165, 180, 8 + LTEXT "&Alternate DNS server:", -1, 14, 165, 180, 8 CONTROL "",IDC_DNS2,"SysIPAddress32",WS_TABSTOP, 150, 165, 80, 12 END IDD_TCPIP_ADVIP_DLG DIALOGEX DISCARDABLE 0, 0, 247, 247 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "IP nastavení" +CAPTION "IP Settings" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "IP adresy", -1, 5, 5, 240, 90 + GROUPBOX "IP addresses", -1, 5, 5, 240, 90 CONTROL "", IDC_IPLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 15, 210, 55 - PUSHBUTTON "Pøidat...", IDC_IPADD, 60, 75, 50, 14, WS_TABSTOP - PUSHBUTTON "Upravit...", IDC_IPMOD, 120, 75, 50, 14, WS_TABSTOP - PUSHBUTTON "Odebrat", IDC_IPDEL, 180, 75, 50, 14, WS_TABSTOP - GROUPBOX "Výchozí brány:", -1, 5, 100, 240, 90 + PUSHBUTTON "Add...", IDC_IPADD, 60, 75, 50, 14, WS_TABSTOP + PUSHBUTTON "Edit...", IDC_IPMOD, 120, 75, 50, 14, WS_TABSTOP + PUSHBUTTON "Remove", IDC_IPDEL, 180, 75, 50, 14, WS_TABSTOP + GROUPBOX "Default gateways:", -1, 5, 100, 240, 90 CONTROL "", IDC_GWLIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 110, 210, 55 - PUSHBUTTON "Pøidat...", IDC_GWADD, 60, 170, 50, 14, WS_TABSTOP - PUSHBUTTON "Upravit...", IDC_GWMOD, 120, 170, 50, 14, WS_TABSTOP - PUSHBUTTON "Odebrat", IDC_GWDEL, 180, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Add...", IDC_GWADD, 60, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Edit...", IDC_GWMOD, 120, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Remove", IDC_GWDEL, 180, 170, 50, 14, WS_TABSTOP GROUPBOX "", -1, 5, 200, 240, 30 - CHECKBOX "Automatická metrika", IDC_AUTOMETRIC, 9, 200, 90, 12, BS_AUTOCHECKBOX | WS_TABSTOP - LTEXT "Metrika rozhraní:", -1, 15, 215, 90, 12 + CHECKBOX "Automatic metric", IDC_AUTOMETRIC, 9, 200, 90, 12, BS_AUTOCHECKBOX | WS_TABSTOP + LTEXT "Interface metric:", -1, 15, 215, 90, 12 EDITTEXT IDC_METRIC, 110, 212, 50, 12, WS_TABSTOP | ES_NUMBER END @@ -79,158 +74,158 @@ CAPTION "DNS" FONT 8, "MS Shell Dlg" BEGIN LISTBOX IDC_DNSADDRLIST, 5, 15, 180, 60, LBS_NOTIFY - LTEXT "&Adresy DNS serverù v poøadí využití:", -1, 5, 5, 180, 12 - PUSHBUTTON "Nahoru", IDC_DNSADDRUP, 190, 30, 50, 14, WS_TABSTOP - PUSHBUTTON "Dolù", IDC_DNSADDRDOWN, 190, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "&Pøidat...", IDC_DNSADDRADD, 30, 70, 50, 14, WS_TABSTOP - PUSHBUTTON "&Upravit...", IDC_DNSADDRMOD, 100, 70, 50, 14, WS_TABSTOP - PUSHBUTTON "&Odebrat", IDC_DNSADDRDEL, 170, 70, 50, 14, WS_TABSTOP - LTEXT "Následující tøi nastavení jsou aplikována na všechna pøipojení s povoleným TCP/IP. Pøi rezoluci nekvalifikovaných jmen:", -1, 5, 90, 220, 24 - CONTROL "Pøipojit p&rimární a pøipojením dané DNS pøípony", IDC_PRIMSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 110, 160, 12 - CHECKBOX "Pøipojit rodièovské pøípony primární DNS pøípony", IDC_TOPPRIMSUFFIX, 15, 125, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CONTROL "Pøipojit &tyto DNS pøípony (v tomto poøadí):", IDC_SELSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 140, 190, 12 + LTEXT "D&NS server addresses, in order of use:", -1, 5, 5, 180, 12 + PUSHBUTTON "Up", IDC_DNSADDRUP, 190, 30, 50, 14, WS_TABSTOP + PUSHBUTTON "Down", IDC_DNSADDRDOWN, 190, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "&Add...", IDC_DNSADDRADD, 30, 70, 50, 14, WS_TABSTOP + PUSHBUTTON "&Edit...", IDC_DNSADDRMOD, 100, 70, 50, 14, WS_TABSTOP + PUSHBUTTON "Remo&ve", IDC_DNSADDRDEL, 170, 70, 50, 14, WS_TABSTOP + LTEXT "The following three settings are applied to all connections with TCP/IP enabled. For resolution of unqualified names:", -1, 5, 90, 220, 24 + CONTROL "Append &primary and connection specific DNS suffixes", IDC_PRIMSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 110, 160, 12 + CHECKBOX "Append parent suffi&xes of the primary DNS suffix", IDC_TOPPRIMSUFFIX, 15, 125, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CONTROL "Append t&hese DNS suffixes(in order):", IDC_SELSUFFIX, "BUTTON", BS_AUTORADIOBUTTON, 5, 140, 190, 12 LISTBOX IDC_DNSSUFFIXLIST, 5, 155, 180, 60, LBS_NOTIFY - PUSHBUTTON "Nahoru", IDC_DNSSUFFIXUP, 190, 170, 50, 14, WS_TABSTOP - PUSHBUTTON "Dolù", IDC_DNSSUFFIXDOWN, 190, 190, 50, 14, WS_TABSTOP - PUSHBUTTON "&Pøidat...", IDC_DNSSUFFIXADD, 30, 210, 50, 14, WS_TABSTOP - PUSHBUTTON "&Upravit...", IDC_DNSSUFFIXMOD, 100, 210, 50, 14, WS_TABSTOP - PUSHBUTTON "&Odebrat", IDC_DNSSUFFIXDEL, 170, 210, 50, 14, WS_TABSTOP - LTEXT "DNS pøípo&na tohoto pøipojení:", -1, 5, 225, 110, 14 + PUSHBUTTON "Up", IDC_DNSSUFFIXUP, 190, 170, 50, 14, WS_TABSTOP + PUSHBUTTON "Down", IDC_DNSSUFFIXDOWN, 190, 190, 50, 14, WS_TABSTOP + PUSHBUTTON "&Add...", IDC_DNSSUFFIXADD, 30, 210, 50, 14, WS_TABSTOP + PUSHBUTTON "&Edit...", IDC_DNSSUFFIXMOD, 100, 210, 50, 14, WS_TABSTOP + PUSHBUTTON "Remo&ve", IDC_DNSSUFFIXDEL, 170, 210, 50, 14, WS_TABSTOP + LTEXT "DNS &suffix for this connection:", -1, 5, 225, 110, 14 EDITTEXT IDC_SUFFIX, 120, 225, 100, 12, WS_TABSTOP - CHECKBOX "Registrovat &adresy tohoto pøipojení v DNS", IDC_REGSUFFIX, 15, 240, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "P&oužít DNS pøíponu tohoto pøipojení pøi DNS registraci", IDC_USESUFFIX, 15, 255, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Register this connection's addresses in DNS", IDC_REGSUFFIX, 15, 240, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Use this connection's DNS suffix in DNS registration", IDC_USESUFFIX, 15, 255, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP END IDD_TCPIP_ADVOPT_DLG DIALOGEX DISCARDABLE 0, 0, 247, 247 STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION -CAPTION "Volby" +CAPTION "Options" FONT 8, "MS Shell Dlg" BEGIN LISTBOX IDC_OPTLIST, 5, 30, 230, 70 - LTEXT "&Volitelná nastavení", -1, 5, 15, 130, 12 - PUSHBUTTON "&Podrobnosti", IDC_OPTPROP, 160, 100, 70, 14, WS_TABSTOP - GROUPBOX "Popis:", -1, 5, 120, 240, 70 + LTEXT "&Optional settings", -1, 5, 15, 130, 12 + PUSHBUTTON "&Properties", IDC_OPTPROP, 160, 100, 70, 14, WS_TABSTOP + GROUPBOX "Description:", -1, 5, 120, 240, 70 LTEXT "", IDC_OPTDESC, 15, 130, 220, 33 END IDD_TCPIPADDIP_DLG DIALOGEX DISCARDABLE 0, 0, 200, 70 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP adresa" +CAPTION "TCP/IP Address" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 100, 15, 80, 12 - LTEXT "IP adresa:", -1, 5, 15, 70, 12 - LTEXT "Maska podsítì:", -1, 5, 30, 70, 12 + LTEXT "IP address:", -1, 5, 15, 70, 12 + LTEXT "Subnet mask:", -1, 5, 30, 70, 12 CONTROL "",IDC_SUBNETMASK,"SysIPAddress32", WS_TABSTOP, 100, 30, 80, 12 - PUSHBUTTON "OK", IDC_OK, 50, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "Storno", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "", IDC_OK, 50, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP END IDD_TCPIPGW_DLG DIALOGEX DISCARDABLE 0, 0, 200, 80 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP adresa brány" +CAPTION "TCP/IP Gateway Address" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 100, 15, 80, 12 - LTEXT "Brána:", -1, 5, 15, 70, 12 - CHECKBOX "Automatická metrika", IDC_USEMETRIC, 15, 30, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP - LTEXT "&Metrika:", IDC_METRICTXT, 5, 45, 45, 12, WS_DISABLED + LTEXT "Gateway:", -1, 5, 15, 70, 12 + CHECKBOX "Automatic metric", IDC_USEMETRIC, 15, 30, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + LTEXT "&Metric:", IDC_METRICTXT, 5, 45, 45, 12, WS_DISABLED EDITTEXT IDC_METRIC, 100, 45, 50, 12, WS_TABSTOP | ES_NUMBER | WS_DISABLED PUSHBUTTON "", IDC_OK, 50, 60, 50, 14, WS_TABSTOP - PUSHBUTTON "Storno", IDCANCEL, 110, 60, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 110, 60, 50, 14, WS_TABSTOP END IDD_TCPIPDNS_DLG DIALOGEX DISCARDABLE 0, 0, 200, 80 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP DNS server" +CAPTION "TCP/IP DNS Server" FONT 8, "MS Shell Dlg" BEGIN CONTROL "",IDC_IPADDR,"SysIPAddress32",WS_TABSTOP, 5, 25, 80, 12 LTEXT "DNS server:", -1, 5, 10, 120, 12 PUSHBUTTON "", IDC_OK, 50, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "Storno", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP END IDD_TCPIPSUFFIX_DLG DIALOGEX DISCARDABLE 0, 0, 200, 80 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP doménová pøípona" +CAPTION "TCP/IP Domain Suffix" FONT 8, "MS Shell Dlg" BEGIN EDITTEXT IDC_SUFFIX, 5, 25, 190, 12, WS_TABSTOP - LTEXT "Doménová pøípona:", -1, 5, 10, 120, 12 + LTEXT "Domain suffix:", -1, 5, 10, 120, 12 PUSHBUTTON "", IDC_OK, 50, 50, 50, 14, WS_TABSTOP - PUSHBUTTON "Storno", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 110, 50, 50, 14, WS_TABSTOP END IDD_TCPIP_FILTER_DLG DIALOGEX DISCARDABLE 0, 0, 305, 220 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "TCP/IP filtrování" +CAPTION "TCP/IP Filtering" FONT 8, "MS Shell Dlg" BEGIN - CHECKBOX "Zapnout filtrování TCP/IP (všechny adaptéry)", IDC_USE_FILTER, 15, 5, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Enable TCP/IP-Filtering (All adapters)", IDC_USE_FILTER, 15, 5, 190, 12, BS_AUTOCHECKBOX | WS_TABSTOP GROUPBOX "", -1, 5, 30, 90, 150 - CONTROL "Povolit vše", IDC_TCP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 30, 70, 12 - CONTROL "Povolit pouze", IDC_TCP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 44, 70, 12 + CONTROL "Permit All", IDC_TCP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 30, 70, 12 + CONTROL "Permit Only", IDC_TCP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 15, 44, 70, 12 CONTROL "", IDC_TCP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 11, 62, 72, 75 - PUSHBUTTON "Pøidat", IDC_TCP_ADD, 15, 141, 50, 14, WS_TABSTOP - PUSHBUTTON "Odebrat", IDC_TCP_DEL, 15, 161, 50, 14, WS_TABSTOP + PUSHBUTTON "Add", IDC_TCP_ADD, 15, 141, 50, 14, WS_TABSTOP + PUSHBUTTON "Remove", IDC_TCP_DEL, 15, 161, 50, 14, WS_TABSTOP GROUPBOX "", -1, 105, 30, 90, 150 - CONTROL "Povolit vše", IDC_UDP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 30, 70, 12 - CONTROL "Povolit pouze", IDC_UDP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 44, 70, 12 + CONTROL "Permit All", IDC_UDP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 30, 70, 12 + CONTROL "Permit Only", IDC_UDP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 115, 44, 70, 12 CONTROL "", IDC_UDP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 111, 62, 72, 75 - PUSHBUTTON "Pøidat", IDC_UDP_ADD, 115, 141, 50, 14, WS_TABSTOP - PUSHBUTTON "Odebrat", IDC_UDP_DEL, 115, 161, 50, 14, WS_TABSTOP + PUSHBUTTON "Add", IDC_UDP_ADD, 115, 141, 50, 14, WS_TABSTOP + PUSHBUTTON "Remove", IDC_UDP_DEL, 115, 161, 50, 14, WS_TABSTOP GROUPBOX "", -1, 205, 30, 90, 150 - CONTROL "Povolit vše", IDC_IP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 30, 70, 12 - CONTROL "Povolit pouze", IDC_IP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 44, 70, 12 + CONTROL "Permit All", IDC_IP_ALLOW_ALL, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 30, 70, 12 + CONTROL "Permit Only", IDC_IP_RESTRICT, "BUTTON", BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP, 215, 44, 70, 12 CONTROL "", IDC_IP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 211, 62, 72, 75 - PUSHBUTTON "Pøidat", IDC_IP_ADD, 215, 141, 50, 14, WS_TABSTOP - PUSHBUTTON "Odebrat", IDC_IP_DEL, 215, 161, 50, 14, WS_TABSTOP + PUSHBUTTON "Add", IDC_IP_ADD, 215, 141, 50, 14, WS_TABSTOP + PUSHBUTTON "Remove", IDC_IP_DEL, 215, 161, 50, 14, WS_TABSTOP PUSHBUTTON "OK", IDC_OK, 150, 190, 50, 14, WS_TABSTOP - PUSHBUTTON "Storno", IDCANCEL, 210, 190, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 210, 190, 50, 14, WS_TABSTOP END IDD_TCPIP_PORT_DLG DIALOGEX DISCARDABLE 0, 0, 200, 60 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Pøidat filtr" +CAPTION "Add Filter" FONT 8, "MS Shell Dlg" BEGIN EDITTEXT IDC_PORT_VAL, 5, 30, 70, 12, WS_TABSTOP | ES_NUMBER LTEXT "", IDC_PORT_DESC, 5, 15, 40, 12 PUSHBUTTON "OK", IDC_OK, 120, 15, 50, 14, WS_TABSTOP - PUSHBUTTON "Storno", IDCANCEL, 120, 30, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 120, 30, 50, 14, WS_TABSTOP END STRINGTABLE BEGIN - IDS_NET_CONNECT "Síové pøipojení" - IDS_NO_IPADDR_SET "Adaptér vyžaduje zadání alespoò jedné IP adresy." - IDS_NO_SUBMASK_SET "K zadané adrese je nutné doplnit masku podsítì." - IDS_TCPFILTERDESC "TCP/IP filtrování dovoluje kontrolovat typ TCP/IP síového provozu, který se dostane k tomuto poèítaèi." - IDS_TCPFILTER "TCP/IP filtrování" - IDS_IPADDR "IP adresa" - IDS_SUBMASK "Maska podsítì" - IDS_GATEWAY "Brána" - IDS_METRIC "Metrika" - IDS_DHCPACTIVE "DHCP zapnuto" - IDS_AUTOMATIC "Automaticky" - IDS_NOITEMSEL "Nebyla vybrána žádná položka." + IDS_NET_CONNECT "Network connection" + IDS_NO_IPADDR_SET "The adapter requires at least one IP address. Please enter one." + IDS_NO_SUBMASK_SET "You have entered an address that is missing its subnet mask. Please add a subnet mask." + IDS_TCPFILTERDESC "TCP/IP filtering allows you to control the type of TCP/IP network traffic that reaches your computer." + IDS_TCPFILTER "TCP/IP Filtering" + IDS_IPADDR "IP address" + IDS_SUBMASK "Subnet mask" + IDS_GATEWAY "Gateway" + IDS_METRIC "Metric" + IDS_DHCPACTIVE "DHCP Enabled" + IDS_AUTOMATIC "Automatic" + IDS_NOITEMSEL "You have not selected an item. Select one first." IDS_TCPIP "ReactOS-TCP/IP" - IDS_ADD "Pøidat" + IDS_ADD "Add" IDS_MOD "OK" - IDS_TCP_PORTS "TCP porty" - IDS_UDP_PORTS "UDP porty" - IDS_IP_PROTO "IP protokoly" - IDS_PORT_RANGE "Èísla portù musí být zadána vyšší než 0 a nižší než 65536." - IDS_PROT_RANGE "Èísla protokolù musí být zadána vyšší než 0 a nižší než 256." - IDS_DUP_NUMBER "Pøidávané èíslo se už nachází v seznamu. Je nutné zadat jiné èíslo." - IDS_DISABLE_FILTER "Vypnutí tohoto globálního nastavení TCP/IP ovlivní všechny adaptéry." - IDS_NO_SUFFIX "Souèasné nastavení metod vyhledávání vyžaduje alespoò jednu DNS pøíponu. Je nutné ji zadat nebo zmìnit nastavení." - IDS_DOMAIN_SUFFIX "Zadaná doménová pøípona není platná." - IDS_DNS_SUFFIX "DNS doménové jméno ""%s"" není platné." - IDS_DUP_SUFFIX "DNS pøípona se už nachází v seznamu." - IDS_DUP_IPADDR "IP adresa se už nachází v seznamu." - IDS_DUP_GW "Výchozí brána se už nachází v seznamu." + IDS_TCP_PORTS "TCP Ports" + IDS_UDP_PORTS "UDP Ports" + IDS_IP_PROTO "IP protocols" + IDS_PORT_RANGE "Port numbers must be greater than 0 and less than 65536. Please enter a number within this range." + IDS_PROT_RANGE "Protocol numbers must be greater than 0 and less than 256. Please enter a number within this range." + IDS_DUP_NUMBER "The number you are trying to add is already in the list. Please enter a different number." + IDS_DISABLE_FILTER "Disabling this global TCP/IP setting will affect all adapters." + IDS_NO_SUFFIX "The current setting of search method requires at least one DNS suffix. Please enter one or change the setting." + IDS_DOMAIN_SUFFIX "Domain suffix is not a valid suffix." + IDS_DNS_SUFFIX "The DNS domain name ""%s"" is not a valid DNS name." + IDS_DUP_SUFFIX "The DNS suffix is already on the list." + IDS_DUP_IPADDR "The IP address is already on the list." + IDS_DUP_GW "The default gateway is already on the list." END diff --git a/dll/win32/netcfgx/netcfgx.c b/dll/win32/netcfgx/netcfgx.c index ba89dff123a..c9d8a4520d8 100644 --- a/dll/win32/netcfgx/netcfgx.c +++ b/dll/win32/netcfgx/netcfgx.c @@ -325,6 +325,7 @@ InstallNetDevice( HKEY hLinkageKey = NULL; HKEY hConnectionKey = NULL; DWORD dwShowIcon, dwLength; + SP_DEVINSTALL_PARAMS_W installParams; /* Get Instance ID */ if (SetupDiGetDeviceInstanceIdW(DeviceInfoSet, DeviceInfoData, NULL, 0, &dwLength)) @@ -549,6 +550,31 @@ InstallNetDevice( goto cleanup; } + /* HACK: hpoussin, Dec 2005. TCP/IP driver is not able to manage devices + * which are installed after its startup. So, we have to reboot to take + * this new netcard into account. + */ + /* Should we reboot? */ + installParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS_W); + if (!SetupDiGetDeviceInstallParamsW( + DeviceInfoSet, + DeviceInfoData, + &installParams)) + { + rc = GetLastError(); + DPRINT("SetupDiGetDeviceInstallParams() failed with error 0x%lx\n", rc); + goto cleanup; + } + installParams.Flags |= DI_NEEDRESTART; + if (!SetupDiSetDeviceInstallParamsW( + DeviceInfoSet, + DeviceInfoData, + &installParams)) + { + rc = GetLastError(); + DPRINT("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", rc); + goto cleanup; + } rc = ERROR_SUCCESS; cleanup: diff --git a/dll/win32/netcfgx/tcpipconf_notify.c b/dll/win32/netcfgx/tcpipconf_notify.c index 14b9a4ab2f4..91c57ec1a2e 100644 --- a/dll/win32/netcfgx/tcpipconf_notify.c +++ b/dll/win32/netcfgx/tcpipconf_notify.c @@ -1762,7 +1762,6 @@ StoreDNSSettings( pLast = pCur; pCur = pCur->Next; } - This->pCurrentConfig->AutoconfigActive = FALSE; } INT_PTR @@ -2047,6 +2046,7 @@ TcpipAdvancedDnsDlg( VOID LaunchAdvancedTcpipSettings( + HWND hDlg, HWND hwndDlg, TcpipConfNotifyImpl * This) { @@ -2069,14 +2069,14 @@ LaunchAdvancedTcpipSettings( pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE | PSH_NOAPPLYNOW; pinfo.u3.phpage = hppages; pinfo.nPages = 3; - pinfo.hwndParent = hwndDlg; + pinfo.hwndParent = hDlg; pinfo.pszCaption = szBuffer; StoreTcpipBasicSettings(hwndDlg, This, FALSE); PropertySheetW(&pinfo); InitializeTcpipBasicDlgCtrls(hwndDlg, This->pCurrentConfig); - PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + PropSheet_Changed(hDlg, hwndDlg); } INT_PTR @@ -2328,8 +2328,6 @@ InitializeTcpipBasicDlgCtrls( else { SendDlgItemMessageW(hwndDlg, IDC_FIXEDDNS, BM_SETCHECK, BST_CHECKED, 0); - EnableWindow(GetDlgItem(hwndDlg, IDC_DNS1), TRUE); - EnableWindow(GetDlgItem(hwndDlg, IDC_DNS2), TRUE); if (pCurSettings->Ns) { SendDlgItemMessageW(hwndDlg, IDC_DNS1, IPM_SETADDRESS, 0, (LPARAM)pCurSettings->Ns->IpAddress); @@ -2523,7 +2521,7 @@ TcpipBasicDlg( } break; case IDC_ADVANCED: - LaunchAdvancedTcpipSettings(hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); + LaunchAdvancedTcpipSettings(GetParent(hwndDlg), hwndDlg, (TcpipConfNotifyImpl*)GetWindowLongPtr(hwndDlg, DWLP_USER)); break; } break; @@ -3280,25 +3278,23 @@ INetCfgComponentControl_fnApplyRegistryChanges( RegSetValueExW(hKey, L"DefaultGateway", 0, REG_MULTI_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); RegSetValueExW(hKey, L"DefaultGatewayMetric", 0, REG_MULTI_SZ, (LPBYTE)L"\0", sizeof(WCHAR) * 2); } - } - if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) - { - RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); - } - else - { - pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); - if(pStr) + if (!pCurrentConfig->Ns || pCurrentConfig->AutoconfigActive) { - - RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); - RegDeleteValueW(hKey, L"DhcpNameServer"); - CoTaskMemFree(pStr); + RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)L"", 1 * sizeof(WCHAR)); + } + else + { + pStr = CreateMultiSzString(pCurrentConfig->Ns, IPADDR, &dwSize, TRUE); + if(pStr) + { + RegSetValueExW(hKey, L"NameServer", 0, REG_SZ, (LPBYTE)pStr, dwSize); + RegDeleteValueW(hKey, L"DhcpNameServer"); + CoTaskMemFree(pStr); + } } + RegCloseKey(hKey); } - - RegCloseKey(hKey); } return S_OK; } diff --git a/dll/win32/netid/lang/cs-CZ.rc b/dll/win32/netid/lang/cs-CZ.rc index 41a04f6c041..886ad7ac864 100644 --- a/dll/win32/netid/lang/cs-CZ.rc +++ b/dll/win32/netid/lang/cs-CZ.rc @@ -1,6 +1,6 @@ /* FILE: dll/win32/netid/lang/cs-CZ.rc * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2010-03-14 + * UPDATED: 2008-06-26 */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -18,9 +18,10 @@ BEGIN LTEXT "(Implicitní)", IDC_COMPUTERNAME, 98, 68, 144, 11 LTEXT "Pracovní skupina:", IDC_WORKGROUPDOMAIN, 6, 84, 64, 9 LTEXT "(prázdné)", IDC_WORKGROUPDOMAIN_NAME, 98, 84, 144, 9 - LTEXT "Kliknutím na ""Síová ID"" lze použít Prùvodce síovou identifikací k pøipojení se k doménì a vytvoøení místního uživatele.", IDC_STATIC, 6, 113, 172, 24 - PUSHBUTTON "&Síová ID...", IDC_NETWORK_ID, 190, 114, 58, 15 //FIXME nic vic nez "sitova ID" se nevejde na tlacitko! - LTEXT "Kliknutím na ""Zmìnit"" lze pøejmenovat tento poèítaè nebo se pøipojit k doménì.", IDC_STATIC, 6, 149, 170, 17 + LTEXT "Pokud chcete použít Prùvodce síovou identifikací k pøipojení se k doménì a vytvoøení místního uživatele, kliknìte na ""Síová ID"".", IDC_STATIC, 6, 113, 172, 24 + //musi zustat jako sitova ID, jinak se nevejde na tlacitko! + PUSHBUTTON "&Síová ID...", IDC_NETWORK_ID, 190, 114, 58, 15 + LTEXT "Pokud chcete pøejmenovat tento poèítaè nebo se pøipojit k doménì, kliknìte na ""Zmìnit"".", IDC_STATIC, 6, 149, 170, 17 PUSHBUTTON "&Zmìnit...",IDC_NETWORK_PROPERTY, 190, 149, 58, 15 LTEXT "Poznámka: Identifikaci tohoto poèítaèe mohou zmìnit pouze administrátoøi.", IDC_STATIC, 6, 179, 300, 9 END @@ -30,7 +31,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_CAPTIO CAPTION "Zmìna názvu poèítaèe" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "(sem patøí zpráva)", 1017, 7, 5, 218, 30 + LTEXT "(message goes here)", 1017, 7, 5, 218, 30 LTEXT "&Název poèítaèe:", -1, 7, 41, 219, 8 EDITTEXT 1002, 7, 53, 218, 14, ES_AUTOHSCROLL | ES_OEMCONVERT LTEXT "Úplný název poèítaèe:", 1016, 7, 72, 218, 10 @@ -40,7 +41,7 @@ BEGIN AUTORADIOBUTTON "&Domény:", 1008, 17, 132, 192, 10, WS_GROUP AUTORADIOBUTTON "&Pracovní skupiny:", 1004, 17, 161, 191, 10 EDITTEXT 116, 28, 144, 181, 14, ES_AUTOHSCROLL | WS_GROUP - PUSHBUTTON "Najít &moji doménu", 1010, 7, 203, 109, 14, NOT WS_VISIBLE | WS_DISABLED + PUSHBUTTON "Najít moj&i doménu", 1010, 7, 203, 109, 14, NOT WS_VISIBLE | WS_DISABLED EDITTEXT 1007, 28, 172, 181, 14, ES_UPPERCASE | ES_AUTOHSCROLL | ES_OEMCONVERT DEFPUSHBUTTON "OK", 1, 121, 203, 50, 14, WS_GROUP PUSHBUTTON "Storno", 2, 176, 203, 50, 14 @@ -64,7 +65,7 @@ END STRINGTABLE BEGIN 1 "* Neznámé *" - 2 "SKUPINA" + 2 "WORKGROUP" 3 "Pøi pokusu o naètení informací o èlenství v doménì nastala následující chyba:" 4 "Zmìna názvu poèítaèe" 5 "Pracovní skupina:" @@ -72,12 +73,12 @@ BEGIN 22 "Vítejte v pracovní skupinì %1." 23 "Vítejte v doménì %1." 24 "Aby se zmìny mohly projevit, musí být poèítaè restartován." - 25 "Lze zmìnit název a èlenství tohoto poèítaèe. Zmìny mohou mít vliv na pøístup k síovým prostøedkùm." + 25 "You can change the name and the membership of this computer. Changes may affect access to network resources." 1021 "Poznámka: Identifikaci tohoto poèítaèe mohou zmìnit pouze administrátoøi." 1022 "Poznámka: Identifikace poèítaèe nemùže být zmìnìna z následujících dùvodù:" - 1030 "Nový název poèítaèe ""%s"" obsahuje nepovolené znaky. Mezi nepovolené znaky patøí ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / ?" + 1030 "The new computer name ""%s"" contains characters which are not allowed. Characters which are not allowed include ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / and ?" 3210 "&Detaily >>" 3220 "<< &Detaily" - 4000 "Informace" - 4001 "Nelze nastavit nový název poèítaèe!" + 4000 "Information" + 4001 "Can't set new a computer name!" END diff --git a/dll/win32/netid/lang/it-IT.rc b/dll/win32/netid/lang/it-IT.rc index a85b3795367..26af2b20588 100644 --- a/dll/win32/netid/lang/it-IT.rc +++ b/dll/win32/netid/lang/it-IT.rc @@ -67,13 +67,13 @@ BEGIN 6 "Dominio:" 22 "Benvenuto al gruppo di lavoro %1." 23 "Benvenuto al dominio %1." - 24 "Il computer deve essere riavviato per rendere operative queste modifiche." - 25 "Potete modificare il nome e il dominio di questo computer. Le modifiche potrebbero influenzare l'accesso alle risorse di rete." + 24 "Il computer deve essre riavviato per rendere operative queste modifiche." + 25 "You can change the name and the membership of this computer. Changes may affect access to network resources." 1021 "Nota: Solo gli Amministratori possono cambiare l'identificazione di questo computer." 1022 "Nota: L'identificazione di questo computer non può essere cambiata perchè:" - 1030 "Il nuovo nome del computer ""%s"" contiene dei caratteri non permessi. I caratteri vietati sono `? ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / " + 1030 "The new computer name ""%s"" contains characters which are not allowed. Characters which are not allowed include ` ~ ! @ # $ %% ^ & * ( ) = + _ [ ] { } \\ | ; : ' \" , . < > / and ?" 3210 "&Dettagli >>" 3220 "<< &Dettagli" - 4000 "Informazioni" - 4001 "Impossibile assegnare il nuovo nome del computer!" + 4000 "Information" + 4001 "Can't set new a computer name!" END diff --git a/dll/win32/netshell/lang/bg-BG.rc b/dll/win32/netshell/lang/bg-BG.rc index c47a1813b80..a42b9b510fc 100644 --- a/dll/win32/netshell/lang/bg-BG.rc +++ b/dll/win32/netshell/lang/bg-BG.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Ñêîðîñò:", -1, 19, 48, 60, 8 GROUPBOX "Äåéíîñò", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Ïðàòåíè", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 18, 20 + ICON IDI_NETSTAT, -1, 110, 85, 18, 20 LTEXT "Ïîëó÷åíè", -1, 149, 90, 37, 8 LTEXT "Áàéòà:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/cs-CZ.rc b/dll/win32/netshell/lang/cs-CZ.rc index c0818ab9754..db5e3ea00b6 100644 --- a/dll/win32/netshell/lang/cs-CZ.rc +++ b/dll/win32/netshell/lang/cs-CZ.rc @@ -16,12 +16,12 @@ BEGIN GROUPBOX "Popis", -1, 9, 153, 230, 46, BS_GROUPBOX LTEXT "Tak tady bude popis komponenty...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP CHECKBOX "Po pøipojení zobrazit ikonu na hlavním panelu", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Upozornit, když toto pøipojení bude mít omezenou nebo žádnou konektivitu", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Notify me when this connection has limited or no connectivity", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP END IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Obecné nastavení" +CAPTION "General" FONT 8, "MS Shell Dlg" BEGIN END @@ -37,7 +37,7 @@ BEGIN LTEXT "Rychlost:", -1, 19, 48, 60, 8 GROUPBOX "Aktivita", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Odesláno", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Pøijato", -1, 149, 90, 37, 8 LTEXT "Bytù:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 @@ -65,62 +65,62 @@ BEGIN RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 - PUSHBUTTON "&Podrobnosti...", IDC_DETAILS, 22, 76, 62, 14 + PUSHBUTTON "&Detaily...", IDC_DETAILS, 22, 76, 62, 14 END IDD_LAN_NETSTATUSDETAILS DIALOGEX DISCARDABLE 0, 0, 200,200 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Podrobnosti síového pøipojení" +CAPTION "Network Connection Details" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Podrobnosti síového pøipojení:", -1, 15, 9, 170, 12 + LTEXT "Network Connection &Details:", -1, 15, 9, 170, 12 CONTROL "", IDC_DETAILS, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 15, 25, 170, 130 - PUSHBUTTON "&zavøít", IDC_CLOSE, 125, 165, 62, 14 + PUSHBUTTON "&Close", IDC_CLOSE, 125, 165, 62, 14 END STRINGTABLE DISCARDABLE BEGIN - IDS_PHYSICAL_ADDRESS "Fyzická adresa" - IDS_IP_ADDRESS "IP Adresa" - IDS_SUBNET_MASK "Maska podsítì" - IDS_DEF_GATEWAY "Výchozí brána" - IDS_DHCP_SERVER "DHCP server" - IDS_LEASE_OBTAINED "Zapùjèeno" - IDS_LEASE_EXPIRES "Zapùjèení vyprší" - IDS_DNS_SERVERS "DNS servery" - IDS_WINS_SERVERS "WINS servery" - IDS_PROPERTY "Vlastnost" - IDS_VALUE "Hodnota" - IDS_NETWORKCONNECTION "Síová pøipojení" - IDS_SHV_COLUMN_NAME "Název" - IDS_SHV_COLUMN_TYPE "Typ" + IDS_PHYSICAL_ADDRESS "Physical Address" + IDS_IP_ADDRESS "IP Address" + IDS_SUBNET_MASK "Subnet Mask" + IDS_DEF_GATEWAY "Default Gateway" + IDS_DHCP_SERVER "DHCP Server" + IDS_LEASE_OBTAINED "Lease Obtained" + IDS_LEASE_EXPIRES "Lease Expires" + IDS_DNS_SERVERS "DNS Servers" + IDS_WINS_SERVERS "WINS Servers" + IDS_PROPERTY "Property" + IDS_VALUE "Value" + IDS_NETWORKCONNECTION "Network Connection" + IDS_SHV_COLUMN_NAME "Name" + IDS_SHV_COLUMN_TYPE "Type" IDS_SHV_COLUMN_STATE "Status" - IDS_SHV_COLUMN_DEVNAME "Název zaøízení" - IDS_SHV_COLUMN_PHONE "Telefonní èíslo nebo adresa hostitele" - IDS_SHV_COLUMN_OWNER "Vlastník" - IDS_TYPE_ETHERNET "LAN nebo vysokorychlostní internet" - IDS_STATUS_NON_OPERATIONAL "Vypnuto" - IDS_STATUS_UNREACHABLE "Nepøipojeno" - IDS_STATUS_DISCONNECTED "Síový kabel byl odpojen" - IDS_STATUS_CONNECTING "Získávám síovou adresu" - IDS_STATUS_CONNECTED "Pøipojeno" - IDS_STATUS_OPERATIONAL "Pøipojeno" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" + IDS_TYPE_ETHERNET "LAN or High-Speed Internet" + IDS_STATUS_NON_OPERATIONAL "Disabled" + IDS_STATUS_UNREACHABLE "Not Connected" + IDS_STATUS_DISCONNECTED "Network cable unplugged" + IDS_STATUS_CONNECTING "Acquiring network address" + IDS_STATUS_CONNECTED "Connected" + IDS_STATUS_OPERATIONAL "Connected" - IDS_NET_ACTIVATE "Zapnout" - IDS_NET_DEACTIVATE "Vypnout" + IDS_NET_ACTIVATE "Enable" + IDS_NET_DEACTIVATE "Disable" IDS_NET_STATUS "Status" - IDS_NET_REPAIR "Opravit" - IDS_NET_CREATELINK "Vytvoøit zástupce" - IDS_NET_DELETE "Smazat" - IDS_NET_RENAME "Pøejmenovat" - IDS_NET_PROPERTIES "Vlasnosti" + IDS_NET_REPAIR "Repair" + IDS_NET_CREATELINK "Create Shortcut" + IDS_NET_DELETE "Delete" + IDS_NET_RENAME "Rename" + IDS_NET_PROPERTIES "Properties" IDS_FORMAT_BIT "%u Bit/s" IDS_FORMAT_KBIT "%u KBit/s" IDS_FORMAT_MBIT "%u MBit/s" IDS_FORMAT_GBIT "%u GBit/s" - IDS_DURATION_DAY "%d Den %s" - IDS_DURATION_DAYS "%d Dnù %s" + IDS_DURATION_DAY "%d Day %s" + IDS_DURATION_DAYS "%d Days %s" IDS_ASSIGNED_DHCP "Pøiøazeno DHCP" IDS_ASSIGNED_MANUAL "Ruènì nastaveno" END diff --git a/dll/win32/netshell/lang/da-DK.rc b/dll/win32/netshell/lang/da-DK.rc index d23e9c59471..682914a6d5a 100644 --- a/dll/win32/netshell/lang/da-DK.rc +++ b/dll/win32/netshell/lang/da-DK.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Hastighed:", -1, 19, 48, 60, 8 GROUPBOX "Netværks Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT " Modtaget", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 73, 115, 44, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/de-DE.rc b/dll/win32/netshell/lang/de-DE.rc index de2c06bb65b..3192b29f977 100644 --- a/dll/win32/netshell/lang/de-DE.rc +++ b/dll/win32/netshell/lang/de-DE.rc @@ -16,7 +16,7 @@ BEGIN GROUPBOX "Beschreibung", -1, 9, 153, 230, 46, BS_GROUPBOX LTEXT "Hier wird die Beschreibung des Elementes stehen....", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP CHECKBOX "&Symbol bei Verbindung im Infobereich anzeigen", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP - CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschränkte oder keine Konnektivität besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP + CHECKBOX "&Benachrichtigen, wenn diese Verbindung eingeschränkte oder\nkeine Konnektivität besitzt", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 24, BS_AUTOCHECKBOX | WS_TABSTOP END IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280 @@ -54,16 +54,16 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Netzwerkunterstützung" FONT 8, "MS Shell Dlg" BEGIN - GROUPBOX "Verbindungsstatus", -1, 9, 8, 182, 88, BS_GROUPBOX + GROUPBOX "Verbindungsstatus", -1, 9, 8, 200, 88, BS_GROUPBOX LTEXT "Adresstyp:", -1, 22, 20, 80, 8 LTEXT "IP-Adresse:", -1, 22, 34, 80, 8 LTEXT "Subnetzmaske:", -1, 22, 48, 80, 8 LTEXT "Standardgateway:", -1, 22, 62, 80, 8 - RTEXT "Nicht verfügbar", IDC_DETAILSTYPE, 100, 20, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSIP, 100, 34, 80, 8 - RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 100, 48, 80, 8 - RTEXT "", IDC_DETAILSGATEWAY, 100, 62, 80, 8 + RTEXT "Nicht verfügbar", IDC_DETAILSTYPE, 122, 20, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSIP, 122, 34, 80, 8 + RTEXT "000.000.000.000", IDC_DETAILSSUBNET, 122, 48, 80, 8 + RTEXT "", IDC_DETAILSGATEWAY, 122, 62, 80, 8 PUSHBUTTON "&Details...", IDC_DETAILS, 22, 76, 62, 14 END diff --git a/dll/win32/netshell/lang/el-GR.rc b/dll/win32/netshell/lang/el-GR.rc index c0eacd68648..9df47c3fc46 100644 --- a/dll/win32/netshell/lang/el-GR.rc +++ b/dll/win32/netshell/lang/el-GR.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Ôá÷ýôçôá:", -1, 19, 48, 60, 8 GROUPBOX "Åíåñãçôéêüôçôá", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "ÁðåóôÜëëçóáí", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "ÅëÞöèçóáí", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/en-US.rc b/dll/win32/netshell/lang/en-US.rc index a9d17bca423..350e73cd20f 100644 --- a/dll/win32/netshell/lang/en-US.rc +++ b/dll/win32/netshell/lang/en-US.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Speed:", -1, 19, 48, 60, 8 GROUPBOX "Activity", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sent", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Received", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/es-ES.rc b/dll/win32/netshell/lang/es-ES.rc index bc6cedc6539..284425b4607 100644 --- a/dll/win32/netshell/lang/es-ES.rc +++ b/dll/win32/netshell/lang/es-ES.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Velocidad:", -1, 19, 48, 60, 8 GROUPBOX "Actividad ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Enviados", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Recibidos", -1, 149, 90, 37, 8 LTEXT "Paquetes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/fr-FR.rc b/dll/win32/netshell/lang/fr-FR.rc index ed4926ca34e..6ca04cc5996 100644 --- a/dll/win32/netshell/lang/fr-FR.rc +++ b/dll/win32/netshell/lang/fr-FR.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Vitesse :", -1, 19, 48, 60, 8 GROUPBOX "Activité", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Envoyés", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Reçus", -1, 149, 90, 37, 8 LTEXT "Octets :", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/hu-HU.rc b/dll/win32/netshell/lang/hu-HU.rc index 1365ac40837..dc6b75047a4 100644 --- a/dll/win32/netshell/lang/hu-HU.rc +++ b/dll/win32/netshell/lang/hu-HU.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Sebesség:", -1, 19, 48, 60, 8 GROUPBOX "Tevékenység", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Elküldött", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Beérkezett", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/id-ID.rc b/dll/win32/netshell/lang/id-ID.rc index 25675a79643..b6936192f0c 100644 --- a/dll/win32/netshell/lang/id-ID.rc +++ b/dll/win32/netshell/lang/id-ID.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "Kecepatan:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitas", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Dikirim", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Diterima", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/it-IT.rc b/dll/win32/netshell/lang/it-IT.rc index 5084bd727d3..b7168eae222 100644 --- a/dll/win32/netshell/lang/it-IT.rc +++ b/dll/win32/netshell/lang/it-IT.rc @@ -39,7 +39,7 @@ BEGIN GROUPBOX "Attività", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Inviati", -1, 26, 90, 60, 8 ICON IDI_HORIZONTAL, -1, 90, 85, 18, 20 - ICON "", IDC_NETSTAT, 110, 85, 18, 20 + ICON IDI_NETSTAT, -1, 110, 85, 18, 20 ICON IDI_HORIZONTAL, -1, 130, 85, 18, 20 LTEXT "Ricevuti", -1, 149, 90, 37, 8 LTEXT "Byte:", -1, 17, 115, 32, 8 diff --git a/dll/win32/netshell/lang/ja-JP.rc b/dll/win32/netshell/lang/ja-JP.rc index dfe0ff7c58e..c9bdf75b1d5 100644 --- a/dll/win32/netshell/lang/ja-JP.rc +++ b/dll/win32/netshell/lang/ja-JP.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "‘¬“x:", -1, 19, 48, 60, 8 GROUPBOX "“®ìó‹µ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "‘—M", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "ŽóM", -1, 149, 90, 37, 8 LTEXT "ƒoƒCƒg:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/nl-NL.rc b/dll/win32/netshell/lang/nl-NL.rc index bae6286dc86..914abced291 100644 --- a/dll/win32/netshell/lang/nl-NL.rc +++ b/dll/win32/netshell/lang/nl-NL.rc @@ -39,7 +39,7 @@ BEGIN LTEXT "Snelheid:", -1, 19, 48, 60, 8 GROUPBOX "Activiteit", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Verzonden", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Ontvangen", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/no-NO.rc b/dll/win32/netshell/lang/no-NO.rc index b93f14261b8..31fafa28464 100644 --- a/dll/win32/netshell/lang/no-NO.rc +++ b/dll/win32/netshell/lang/no-NO.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Hastighet:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Sendt", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Mottatt", -1, 149, 90, 37, 8 LTEXT "Byte:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/pl-PL.rc b/dll/win32/netshell/lang/pl-PL.rc index 38ff75b21b2..f8c9cc8dcd1 100644 --- a/dll/win32/netshell/lang/pl-PL.rc +++ b/dll/win32/netshell/lang/pl-PL.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Szybkoœæ:", -1, 19, 48, 60, 8 GROUPBOX "Aktywnoœæ", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Wys³ano", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Odebrano", -1, 149, 90, 37, 8 LTEXT "bajtów:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/ro-RO.rc b/dll/win32/netshell/lang/ro-RO.rc index 06ca39c1bf8..3a52b7df5b2 100644 --- a/dll/win32/netshell/lang/ro-RO.rc +++ b/dll/win32/netshell/lang/ro-RO.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Vitezã:", -1, 19, 48, 60, 8 GROUPBOX "Activitate", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Trimis", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Primit", -1, 149, 90, 37, 8 LTEXT "Octeþi:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/ru-RU.rc b/dll/win32/netshell/lang/ru-RU.rc index 91daab64e12..74c2b698959 100644 --- a/dll/win32/netshell/lang/ru-RU.rc +++ b/dll/win32/netshell/lang/ru-RU.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Ñêîðîñòü:", -1, 19, 48, 60, 8 GROUPBOX "Àêòèâíîñòü", -1, 9, 74, 198, 70, BS_GROUPBOX RTEXT "Îòïðàâëåíî", -1, 20, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Ïðèíÿòî", -1, 158, 90, 37, 8 LTEXT "Áàéò:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 54, 115, 44, 8 diff --git a/dll/win32/netshell/lang/sv-SE.rc b/dll/win32/netshell/lang/sv-SE.rc index 78651fccbfa..d7243c4e8be 100644 --- a/dll/win32/netshell/lang/sv-SE.rc +++ b/dll/win32/netshell/lang/sv-SE.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Hastighet:", -1, 19, 48, 60, 8 GROUPBOX "Aktivitet", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Skickat", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Mottaget", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/uk-UA.rc b/dll/win32/netshell/lang/uk-UA.rc index f109166df5a..a8abd4067c4 100644 --- a/dll/win32/netshell/lang/uk-UA.rc +++ b/dll/win32/netshell/lang/uk-UA.rc @@ -45,7 +45,7 @@ BEGIN LTEXT "Øâèäê³ñòü:", -1, 19, 48, 60, 8 GROUPBOX "Àêòèâí³ñòü", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "Íàä³ñëàíî", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "Îòðèìàíî", -1, 149, 90, 37, 8 LTEXT "Áàéò³â:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lang/zh-CN.rc b/dll/win32/netshell/lang/zh-CN.rc index 45acd1f3aa6..184a73c0f7a 100644 --- a/dll/win32/netshell/lang/zh-CN.rc +++ b/dll/win32/netshell/lang/zh-CN.rc @@ -36,7 +36,7 @@ BEGIN LTEXT "ËÙ¶È:", -1, 19, 48, 60, 8 GROUPBOX "Activity", -1, 9, 74, 182, 70, BS_GROUPBOX RTEXT "·¢ËÍ", -1, 26, 90, 60, 8 - ICON "", IDC_NETSTAT, 110, 85, 32, 32 + ICON IDI_NETSTAT, -1, 110, 85, 32, 32 LTEXT "½ÓÊÕ", -1, 149, 90, 37, 8 LTEXT "Bytes:", -1, 17, 115, 32, 8 RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8 diff --git a/dll/win32/netshell/lanstatusui.c b/dll/win32/netshell/lanstatusui.c index 1292ef1a843..3691289caac 100644 --- a/dll/win32/netshell/lanstatusui.c +++ b/dll/win32/netshell/lanstatusui.c @@ -165,8 +165,8 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->dwOutOctets != IfEntry.dwOutOctets && pContext->Status != 1) { - hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); pContext->Status = 1; + hIcon = LoadImage(netshell_hInstance, MAKEINTRESOURCE(IDI_NET_TRANSREC), IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR); } else if (pContext->dwInOctets != IfEntry.dwInOctets && pContext->Status != 2) { @@ -196,7 +196,7 @@ UpdateLanStatus(HWND hwndDlg, LANSTATUSUI_CONTEXT * pContext) } } - if (hwndDlg && hIcon) + if (hwndDlg) { hOldIcon = (HICON)SendDlgItemMessageW(hwndDlg, IDC_NETSTAT, STM_SETICON, (WPARAM)hIcon, 0); if (hOldIcon) diff --git a/dll/win32/ntmarta/ntmarta.c b/dll/win32/ntmarta/ntmarta.c index f6e77d4cbef..e077b0570be 100644 --- a/dll/win32/ntmarta/ntmarta.c +++ b/dll/win32/ntmarta/ntmarta.c @@ -1236,7 +1236,7 @@ AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries, DWORD ObjectsPresent; BOOL needToClean; PSID pSid1, pSid2; - ULONG i, j; + ULONG i; LSA_HANDLE PolicyHandle = NULL; BOOL bRet; DWORD LastErr; @@ -1295,11 +1295,11 @@ AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries, case REVOKE_ACCESS: case SET_ACCESS: /* Discard all accesses for the trustee... */ - for (j = 0; j < SizeInformation.AceCount; j++) + for (i = 0; i < SizeInformation.AceCount; i++) { - if (!pKeepAce[j]) + if (!pKeepAce[i]) continue; - if (!GetAce(OldAcl, j, (PVOID*)&pAce)) + if (!GetAce(OldAcl, i, (PVOID*)&pAce)) { Ret = GetLastError(); goto Cleanup; @@ -1308,7 +1308,7 @@ AccRewriteSetEntriesInAcl(ULONG cCountOfExplicitEntries, pSid2 = AccpGetAceSid(pAce); if (RtlEqualSid(pSid1, pSid2)) { - pKeepAce[j] = FALSE; + pKeepAce[i] = FALSE; SizeInformation.AclBytesInUse -= pAce->AceSize; } } diff --git a/dll/win32/ole32/compobj.c b/dll/win32/ole32/compobj.c index 0fb074dc50c..12f83146113 100644 --- a/dll/win32/ole32/compobj.c +++ b/dll/win32/ole32/compobj.c @@ -1506,7 +1506,7 @@ HRESULT WINAPI CoCreateGuid(GUID *pguid) * SEE ALSO * StringFromCLSID */ -static HRESULT __CLSIDFromString(LPCWSTR s, LPCLSID id) +static HRESULT __CLSIDFromString(LPCWSTR s, CLSID *id) { int i; BYTE table[256]; @@ -1566,7 +1566,7 @@ static HRESULT __CLSIDFromString(LPCWSTR s, LPCLSID id) /*****************************************************************************/ -HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id ) +HRESULT WINAPI CLSIDFromString(LPOLESTR idstr, CLSID *id ) { HRESULT ret; @@ -4153,9 +4153,11 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) case DLL_PROCESS_ATTACH: hProxyDll = hinstDLL; COMPOBJ_InitProcess(); + if (TRACE_ON(ole)) CoRegisterMallocSpy((LPVOID)-1); break; case DLL_PROCESS_DETACH: + if (TRACE_ON(ole)) CoRevokeMallocSpy(); OLEDD_UnInitialize(); COMPOBJ_UninitProcess(); RPC_UnregisterAllChannelHooks(); diff --git a/dll/win32/ole32/ftmarshal.c b/dll/win32/ole32/ftmarshal.c index d8f4bf649b8..13802854fa6 100644 --- a/dll/win32/ole32/ftmarshal.c +++ b/dll/win32/ole32/ftmarshal.c @@ -204,11 +204,8 @@ FTMarshalImpl_MarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, vo hres = IStream_Write (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; - if (sizeof(object) == sizeof(DWORD)) - { - hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_MEDIUMFULL; - } + hres = IStream_Write (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_MEDIUMFULL; hres = IStream_Write (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_MEDIUMFULL; @@ -240,13 +237,10 @@ FTMarshalImpl_UnmarshalInterface (LPMARSHAL iface, IStream * pStm, REFIID riid, hres = IStream_Read (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_READFAULT; - if (sizeof(object) == sizeof(DWORD)) - { - hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_READFAULT; - if (constant != 0) - FIXME("constant is 0x%x instead of 0\n", constant); - } + hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_READFAULT; + if (constant != 0) + FIXME("constant is 0x%x instead of 0\n", constant); hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_READFAULT; @@ -273,13 +267,10 @@ static HRESULT WINAPI FTMarshalImpl_ReleaseMarshalData (LPMARSHAL iface, IStream hres = IStream_Read (pStm, &object, sizeof (object), NULL); if (hres != S_OK) return STG_E_READFAULT; - if (sizeof(object) == sizeof(DWORD)) - { - hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); - if (hres != S_OK) return STG_E_READFAULT; - if (constant != 0) - FIXME("constant is 0x%x instead of 0\n", constant); - } + hres = IStream_Read (pStm, &constant, sizeof (constant), NULL); + if (hres != S_OK) return STG_E_READFAULT; + if (constant != 0) + FIXME("constant is 0x%x instead of 0\n", constant); hres = IStream_Read (pStm, &unknown_guid, sizeof (unknown_guid), NULL); if (hres != S_OK) return STG_E_READFAULT; diff --git a/dll/win32/ole32/ifs.c b/dll/win32/ole32/ifs.c index c6a6962cd72..dc625bcc99e 100644 --- a/dll/win32/ole32/ifs.c +++ b/dll/win32/ole32/ifs.c @@ -359,6 +359,173 @@ static const IMallocVtbl VT_IMalloc32 = IMalloc_fnHeapMinimize }; +/****************************************************************************** + * IMallocSpy implementation + *****************************************************************************/ + +/* set the vtable later */ +static const IMallocSpyVtbl VT_IMallocSpy; + +typedef struct { + const IMallocSpyVtbl *lpVtbl; + LONG ref; +} _MallocSpy; + +/* this is the static object instance */ +static _MallocSpy MallocSpy = {&VT_IMallocSpy, 0}; + +/****************************************************************************** + * IMalloc32_QueryInterface [VTABLE] + */ +static HRESULT WINAPI IMallocSpy_fnQueryInterface(LPMALLOCSPY iface,REFIID refiid,LPVOID *obj) +{ + + TRACE("(%s,%p)\n",debugstr_guid(refiid),obj); + + if (IsEqualIID(&IID_IUnknown,refiid) || IsEqualIID(&IID_IMallocSpy,refiid)) { + *obj = &MallocSpy; + return S_OK; + } + return E_NOINTERFACE; +} + +/****************************************************************************** + * IMalloc32_AddRef [VTABLE] + */ +static ULONG WINAPI IMallocSpy_fnAddRef (LPMALLOCSPY iface) +{ + + _MallocSpy *This = (_MallocSpy *)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE ("(%p)->(count=%u)\n", This, ref - 1); + + return ref; +} + +/****************************************************************************** + * IMalloc32_AddRelease [VTABLE] + * + * NOTES + * Our MallocSpy is static. If the count reaches 0 we dump the leaks + */ +static ULONG WINAPI IMallocSpy_fnRelease (LPMALLOCSPY iface) +{ + + _MallocSpy *This = (_MallocSpy *)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE ("(%p)->(count=%u)\n", This, ref + 1); + + if (!ref) { + /* our allocation list MUST be empty here */ + } + return ref; +} + +static ULONG WINAPI IMallocSpy_fnPreAlloc(LPMALLOCSPY iface, ULONG cbRequest) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%u)\n", This, cbRequest); + return cbRequest; +} +static PVOID WINAPI IMallocSpy_fnPostAlloc(LPMALLOCSPY iface, void* pActual) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p)\n", This, pActual); + return pActual; +} + +static PVOID WINAPI IMallocSpy_fnPreFree(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); + return pRequest; +} +static void WINAPI IMallocSpy_fnPostFree(LPMALLOCSPY iface, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%u)\n", This, fSpyed); +} + +static ULONG WINAPI IMallocSpy_fnPreRealloc(LPMALLOCSPY iface, void* pRequest, ULONG cbRequest, void** ppNewRequest, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p %u %u)\n", This, pRequest, cbRequest, fSpyed); + *ppNewRequest = pRequest; + return cbRequest; +} + +static PVOID WINAPI IMallocSpy_fnPostRealloc(LPMALLOCSPY iface, void* pActual, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p %u)\n", This, pActual, fSpyed); + return pActual; +} + +static PVOID WINAPI IMallocSpy_fnPreGetSize(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); + return pRequest; +} + +static ULONG WINAPI IMallocSpy_fnPostGetSize(LPMALLOCSPY iface, ULONG cbActual, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%u %u)\n", This, cbActual, fSpyed); + return cbActual; +} + +static PVOID WINAPI IMallocSpy_fnPreDidAlloc(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p %u)\n", This, pRequest, fSpyed); + return pRequest; +} + +static int WINAPI IMallocSpy_fnPostDidAlloc(LPMALLOCSPY iface, void* pRequest, BOOL fSpyed, int fActual) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->(%p %u %u)\n", This, pRequest, fSpyed, fActual); + return fActual; +} + +static void WINAPI IMallocSpy_fnPreHeapMinimize(LPMALLOCSPY iface) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->()\n", This); +} + +static void WINAPI IMallocSpy_fnPostHeapMinimize(LPMALLOCSPY iface) +{ + _MallocSpy *This = (_MallocSpy *)iface; + TRACE ("(%p)->()\n", This); +} + +static void MallocSpyDumpLeaks(void) { + TRACE("leaks: %u\n", Malloc32.SpyedAllocationsLeft); +} + +static const IMallocSpyVtbl VT_IMallocSpy = +{ + IMallocSpy_fnQueryInterface, + IMallocSpy_fnAddRef, + IMallocSpy_fnRelease, + IMallocSpy_fnPreAlloc, + IMallocSpy_fnPostAlloc, + IMallocSpy_fnPreFree, + IMallocSpy_fnPostFree, + IMallocSpy_fnPreRealloc, + IMallocSpy_fnPostRealloc, + IMallocSpy_fnPreGetSize, + IMallocSpy_fnPostGetSize, + IMallocSpy_fnPreDidAlloc, + IMallocSpy_fnPostDidAlloc, + IMallocSpy_fnPreHeapMinimize, + IMallocSpy_fnPostHeapMinimize +}; + /****************************************************************************** * CoGetMalloc [OLE32.@] * @@ -453,6 +620,9 @@ HRESULT WINAPI CoRegisterMallocSpy(LPMALLOCSPY pMallocSpy) TRACE("\n"); + /* HACK TO ACTIVATE OUT SPY */ + if (pMallocSpy == (LPVOID)-1) pMallocSpy =(IMallocSpy*)&MallocSpy; + if(Malloc32.pSpy) return CO_E_OBJISREG; EnterCriticalSection(&IMalloc32_SpyCS); @@ -491,6 +661,11 @@ HRESULT WINAPI CoRevokeMallocSpy(void) EnterCriticalSection(&IMalloc32_SpyCS); + /* if it's our spy it's time to dump the leaks */ + if (Malloc32.pSpy == (IMallocSpy*)&MallocSpy) { + MallocSpyDumpLeaks(); + } + if (Malloc32.SpyedAllocationsLeft) { TRACE("SpyReleasePending with %u allocations left\n", Malloc32.SpyedAllocationsLeft); Malloc32.SpyReleasePending = TRUE; diff --git a/dll/win32/ole32/moniker.c b/dll/win32/ole32/moniker.c index 2fb03ae6650..a7c5a11c98b 100644 --- a/dll/win32/ole32/moniker.c +++ b/dll/win32/ole32/moniker.c @@ -127,7 +127,6 @@ static BOOL start_rpcss(void) WCHAR cmd[MAX_PATH]; static const WCHAR rpcss[] = {'\\','r','p','c','s','s','.','e','x','e',0}; BOOL rslt; - void *redir; TRACE("\n"); @@ -136,9 +135,7 @@ static BOOL start_rpcss(void) GetSystemDirectoryW( cmd, MAX_PATH - sizeof(rpcss)/sizeof(WCHAR) ); strcatW( cmd, rpcss ); - Wow64DisableWow64FsRedirection( &redir ); rslt = CreateProcessW( cmd, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); - Wow64RevertWow64FsRedirection( redir ); if (rslt) { diff --git a/dll/win32/ole32/ole32.rbuild b/dll/win32/ole32/ole32.rbuild index 85710a6b20f..24f60c87a32 100644 --- a/dll/win32/ole32/ole32.rbuild +++ b/dll/win32/ole32/ole32.rbuild @@ -20,7 +20,6 @@ ole32_irot_client ole32_proxy rpcrt4 - kernel32 ntdll uuid pseh diff --git a/dll/win32/ole32/rpc.c b/dll/win32/ole32/rpc.c index 75b6b1f7ab3..0daa4ab815d 100644 --- a/dll/win32/ole32/rpc.c +++ b/dll/win32/ole32/rpc.c @@ -144,28 +144,6 @@ typedef struct /* [size_is((size+7)&~7)] */ unsigned char data[1]; } WIRE_ORPC_EXTENT; -typedef struct -{ - ULONG size; - ULONG reserved; - unsigned char extent[1]; -} WIRE_ORPC_EXTENT_ARRAY; - -typedef struct -{ - ULONG version; - ULONG flags; - ULONG reserved1; - GUID cid; - unsigned char extensions[1]; -} WIRE_ORPCTHIS; - -typedef struct -{ - ULONG flags; - unsigned char extensions[1]; -} WIRE_ORPCTHAT; - struct channel_hook_entry { struct list entry; @@ -525,10 +503,10 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, extensions_size = ChannelHooks_ServerGetSize(&message_state->channel_hook_info, &channel_hook_data, &channel_hook_count, &extension_count); - msg->BufferLength += FIELD_OFFSET(WIRE_ORPCTHAT, extensions) + sizeof(DWORD); + msg->BufferLength += FIELD_OFFSET(ORPCTHAT, extensions) + 4; if (extensions_size) { - msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent[2*sizeof(DWORD) + extensions_size]); + msg->BufferLength += FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent) + 2*sizeof(DWORD) + extensions_size; if (extension_count & 1) msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT, data[0]); } @@ -545,7 +523,7 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, status = I_RpcGetBuffer(msg); orpcthat = msg->Buffer; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHAT, extensions); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHAT, extensions); orpcthat->flags = ORPCF_NULL /* FIXME? */; @@ -555,10 +533,10 @@ static HRESULT WINAPI ServerRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, if (extensions_size) { - WIRE_ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; + ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; orpc_extent_array->size = extension_count; orpc_extent_array->reserved = 0; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); /* NDR representation of orpc_extent_array->extent */ *(DWORD *)msg->Buffer = 1; msg->Buffer = (char *)msg->Buffer + sizeof(DWORD); @@ -667,10 +645,10 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, extensions_size = ChannelHooks_ClientGetSize(&message_state->channel_hook_info, &channel_hook_data, &channel_hook_count, &extension_count); - msg->BufferLength += FIELD_OFFSET(WIRE_ORPCTHIS, extensions) + sizeof(DWORD); + msg->BufferLength += FIELD_OFFSET(ORPCTHIS, extensions) + 4; if (extensions_size) { - msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent[2*sizeof(DWORD) + extensions_size]); + msg->BufferLength += FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent) + 2*sizeof(DWORD) + extensions_size; if (extension_count & 1) msg->BufferLength += FIELD_OFFSET(WIRE_ORPC_EXTENT, data[0]); } @@ -725,7 +703,7 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, if (status == RPC_S_OK) { orpcthis = msg->Buffer; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHIS, extensions); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHIS, extensions); orpcthis->version.MajorVersion = COM_MAJOR_VERSION; orpcthis->version.MinorVersion = COM_MINOR_VERSION; @@ -742,7 +720,7 @@ static HRESULT WINAPI ClientRpcChannelBuffer_GetBuffer(LPRPCCHANNELBUFFER iface, ORPC_EXTENT_ARRAY *orpc_extent_array = msg->Buffer; orpc_extent_array->size = extension_count; orpc_extent_array->reserved = 0; - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); /* NDR representation of orpc_extent_array->extent */ *(DWORD *)msg->Buffer = 1; msg->Buffer = (char *)msg->Buffer + sizeof(DWORD); @@ -1174,8 +1152,8 @@ static HRESULT unmarshal_ORPC_EXTENT_ARRAY(RPC_MESSAGE *msg, const char *end, DWORD pointer_id; DWORD i; - memcpy(extensions, msg->Buffer, FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPC_EXTENT_ARRAY, extent); + memcpy(extensions, msg->Buffer, FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPC_EXTENT_ARRAY, extent); if ((const char *)msg->Buffer + 2 * sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; @@ -1227,14 +1205,14 @@ static HRESULT unmarshal_ORPCTHIS(RPC_MESSAGE *msg, ORPCTHIS *orpcthis, *first_wire_orpc_extent = NULL; - if (msg->BufferLength < FIELD_OFFSET(WIRE_ORPCTHIS, extensions) + sizeof(DWORD)) + if (msg->BufferLength < FIELD_OFFSET(ORPCTHIS, extensions) + 4) { ERR("invalid buffer length\n"); return RPC_E_INVALID_HEADER; } - memcpy(orpcthis, msg->Buffer, FIELD_OFFSET(WIRE_ORPCTHIS, extensions)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHIS, extensions); + memcpy(orpcthis, msg->Buffer, FIELD_OFFSET(ORPCTHIS, extensions)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHIS, extensions); if ((const char *)msg->Buffer + sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; @@ -1278,14 +1256,14 @@ static HRESULT unmarshal_ORPCTHAT(RPC_MESSAGE *msg, ORPCTHAT *orpcthat, *first_wire_orpc_extent = NULL; - if (msg->BufferLength < FIELD_OFFSET(WIRE_ORPCTHAT, extensions) + sizeof(DWORD)) + if (msg->BufferLength < FIELD_OFFSET(ORPCTHAT, extensions) + 4) { ERR("invalid buffer length\n"); return RPC_E_INVALID_HEADER; } - memcpy(orpcthat, msg->Buffer, FIELD_OFFSET(WIRE_ORPCTHAT, extensions)); - msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(WIRE_ORPCTHAT, extensions); + memcpy(orpcthat, msg->Buffer, FIELD_OFFSET(ORPCTHAT, extensions)); + msg->Buffer = (char *)msg->Buffer + FIELD_OFFSET(ORPCTHAT, extensions); if ((const char *)msg->Buffer + sizeof(DWORD) > end) return RPC_E_INVALID_HEADER; diff --git a/dll/win32/ole32/storage32.c b/dll/win32/ole32/storage32.c index 434d8b24606..f1706da72fb 100644 --- a/dll/win32/ole32/storage32.c +++ b/dll/win32/ole32/storage32.c @@ -2583,7 +2583,6 @@ static HRESULT StorageImpl_Construct( DWORD openFlags, BOOL fileBased, BOOL create, - ULONG sector_size, StorageImpl** result) { StorageImpl* This; @@ -2635,7 +2634,7 @@ static HRESULT StorageImpl_Construct( /* * Initialize the big block cache. */ - This->bigBlockSize = sector_size; + This->bigBlockSize = DEF_BIG_BLOCK_SIZE; This->smallBlockSize = DEF_SMALL_BLOCK_SIZE; This->bigBlockFile = BIGBLOCKFILE_Construct(hFile, pLkbyt, @@ -2666,12 +2665,8 @@ static HRESULT StorageImpl_Construct( This->bigBlockDepotCount = 1; This->bigBlockDepotStart[0] = 0; This->rootStartBlock = 1; - This->smallBlockLimit = LIMIT_TO_USE_SMALL_BLOCK; This->smallBlockDepotStart = BLOCK_END_OF_CHAIN; - if (sector_size == 4096) - This->bigBlockSizeBits = MAX_BIG_BLOCK_SIZE_BITS; - else - This->bigBlockSizeBits = MIN_BIG_BLOCK_SIZE_BITS; + This->bigBlockSizeBits = DEF_BIG_BLOCK_SIZE_BITS; This->smallBlockSizeBits = DEF_SMALL_BLOCK_SIZE_BITS; This->extBigBlockDepotStart = BLOCK_END_OF_CHAIN; This->extBigBlockDepotCount = 0; @@ -2716,8 +2711,6 @@ static HRESULT StorageImpl_Construct( */ This->prevFreeBlock = 0; - This->firstFreeSmallBlock = 0; - /* * Create the block chain abstractions. */ @@ -3355,11 +3348,6 @@ static HRESULT StorageImpl_LoadFileHeader( OFFSET_ROOTSTARTBLOCK, &This->rootStartBlock); - StorageUtl_ReadDWord( - headerBigBlock, - OFFSET_SMALLBLOCKLIMIT, - &This->smallBlockLimit); - StorageUtl_ReadDWord( headerBigBlock, OFFSET_SBDEPOTSTART, @@ -3394,11 +3382,9 @@ static HRESULT StorageImpl_LoadFileHeader( * blocks, just make sure they are what we're expecting. */ if ((This->bigBlockSize != MIN_BIG_BLOCK_SIZE && This->bigBlockSize != MAX_BIG_BLOCK_SIZE) || - This->smallBlockSize != DEF_SMALL_BLOCK_SIZE || - This->smallBlockLimit != LIMIT_TO_USE_SMALL_BLOCK) + This->smallBlockSize != DEF_SMALL_BLOCK_SIZE) { - FIXME("Broken OLE storage file? bigblock=0x%x, smallblock=0x%x, sblimit=0x%x\n", - This->bigBlockSize, This->smallBlockSize, This->smallBlockLimit); + WARN("Broken OLE storage file\n"); hr = STG_E_INVALIDHEADER; } else @@ -3452,6 +3438,7 @@ static void StorageImpl_SaveFileHeader( StorageUtl_WriteWord(headerBigBlock, 0x18, 0x3b); StorageUtl_WriteWord(headerBigBlock, 0x1a, 0x3); StorageUtl_WriteWord(headerBigBlock, 0x1c, (WORD)-2); + StorageUtl_WriteDWord(headerBigBlock, 0x38, (DWORD)0x1000); } /* @@ -3477,11 +3464,6 @@ static void StorageImpl_SaveFileHeader( OFFSET_ROOTSTARTBLOCK, This->rootStartBlock); - StorageUtl_WriteDWord( - headerBigBlock, - OFFSET_SMALLBLOCKLIMIT, - This->smallBlockLimit); - StorageUtl_WriteDWord( headerBigBlock, OFFSET_SBDEPOTSTART, @@ -4359,14 +4341,13 @@ static HRESULT Storage_Construct( DWORD openFlags, BOOL fileBased, BOOL create, - ULONG sector_size, StorageBaseImpl** result) { StorageImpl *newStorage; StorageBaseImpl *newTransactedStorage; HRESULT hr; - hr = StorageImpl_Construct(hFile, pwcsName, pLkbyt, openFlags, fileBased, create, sector_size, &newStorage); + hr = StorageImpl_Construct(hFile, pwcsName, pLkbyt, openFlags, fileBased, create, &newStorage); if (FAILED(hr)) goto end; if (openFlags & STGM_TRANSACTED) @@ -4859,7 +4840,6 @@ static StorageInternalImpl* StorageInternalImpl_Construct( * Initialize the virtual function table. */ newStorage->base.lpVtbl = &Storage32InternalImpl_Vtbl; - newStorage->base.pssVtbl = &IPropertySetStorage_Vtbl; newStorage->base.baseVtbl = &StorageInternalImpl_BaseVtbl; newStorage->base.openFlags = (openFlags & ~STGM_CREATE); @@ -5730,7 +5710,7 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock( ULARGE_INTEGER offsetOfBlockInDepot; DWORD buffer; ULONG bytesRead; - ULONG blockIndex = This->parentStorage->firstFreeSmallBlock; + ULONG blockIndex = 0; ULONG nextBlockIndex = BLOCK_END_OF_CHAIN; HRESULT res = S_OK; ULONG smallBlocksPerBigBlock; @@ -5839,8 +5819,6 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock( } } - This->parentStorage->firstFreeSmallBlock = blockIndex+1; - smallBlocksPerBigBlock = This->parentStorage->bigBlockSize / This->parentStorage->smallBlockSize; @@ -6139,7 +6117,6 @@ static BOOL SmallBlockChainStream_Shrink( &blockIndex))) return FALSE; SmallBlockChainStream_FreeBlock(This, extraBlock); - This->parentStorage->firstFreeSmallBlock = min(This->parentStorage->firstFreeSmallBlock, extraBlock); extraBlock = blockIndex; } @@ -6316,13 +6293,30 @@ static ULARGE_INTEGER SmallBlockChainStream_GetSize(SmallBlockChainStream* This) return chainEntry.size; } -static HRESULT create_storagefile( +/****************************************************************************** + * StgCreateDocfile [OLE32.@] + * Creates a new compound file storage object + * + * PARAMS + * pwcsName [ I] Unicode string with filename (can be relative or NULL) + * grfMode [ I] Access mode for opening the new storage object (see STGM_ constants) + * reserved [ ?] unused?, usually 0 + * ppstgOpen [IO] A pointer to IStorage pointer to the new onject + * + * RETURNS + * S_OK if the file was successfully created + * some STG_E_ value if error + * NOTES + * if pwcsName is NULL, create file with new unique name + * the function can returns + * STG_S_CONVERTED if the specified file was successfully converted to storage format + * (unrealized now) + */ +HRESULT WINAPI StgCreateDocfile( LPCOLESTR pwcsName, DWORD grfMode, - DWORD grfAttrs, - STGOPTIONS* pStgOptions, - REFIID riid, - void** ppstgOpen) + DWORD reserved, + IStorage **ppstgOpen) { StorageBaseImpl* newStorage = 0; HANDLE hFile = INVALID_HANDLE_VALUE; @@ -6333,10 +6327,13 @@ static HRESULT create_storagefile( DWORD fileAttributes; WCHAR tempFileName[MAX_PATH]; + TRACE("(%s, %x, %d, %p)\n", + debugstr_w(pwcsName), grfMode, + reserved, ppstgOpen); + if (ppstgOpen == 0) return STG_E_INVALIDPOINTER; - - if (pStgOptions->ulSectorSize != MIN_BIG_BLOCK_SIZE && pStgOptions->ulSectorSize != MAX_BIG_BLOCK_SIZE) + if (reserved != 0) return STG_E_INVALIDPARAMETER; /* if no share mode given then DENY_NONE is the default */ @@ -6438,7 +6435,6 @@ static HRESULT create_storagefile( grfMode, TRUE, TRUE, - pStgOptions->ulSectorSize, &newStorage); if (FAILED(hr)) @@ -6446,9 +6442,10 @@ static HRESULT create_storagefile( goto end; } - hr = IStorage_QueryInterface((IStorage*)newStorage, riid, ppstgOpen); - - IStorage_Release((IStorage*)newStorage); + /* + * Get an "out" pointer for the caller. + */ + *ppstgOpen = (IStorage*)newStorage; end: TRACE("<-- %p r = %08x\n", *ppstgOpen, hr); @@ -6456,45 +6453,6 @@ end: return hr; } -/****************************************************************************** - * StgCreateDocfile [OLE32.@] - * Creates a new compound file storage object - * - * PARAMS - * pwcsName [ I] Unicode string with filename (can be relative or NULL) - * grfMode [ I] Access mode for opening the new storage object (see STGM_ constants) - * reserved [ ?] unused?, usually 0 - * ppstgOpen [IO] A pointer to IStorage pointer to the new onject - * - * RETURNS - * S_OK if the file was successfully created - * some STG_E_ value if error - * NOTES - * if pwcsName is NULL, create file with new unique name - * the function can returns - * STG_S_CONVERTED if the specified file was successfully converted to storage format - * (unrealized now) - */ -HRESULT WINAPI StgCreateDocfile( - LPCOLESTR pwcsName, - DWORD grfMode, - DWORD reserved, - IStorage **ppstgOpen) -{ - STGOPTIONS stgoptions = {1, 0, 512}; - - TRACE("(%s, %x, %d, %p)\n", - debugstr_w(pwcsName), grfMode, - reserved, ppstgOpen); - - if (ppstgOpen == 0) - return STG_E_INVALIDPOINTER; - if (reserved != 0) - return STG_E_INVALIDPARAMETER; - - return create_storagefile(pwcsName, grfMode, 0, &stgoptions, &IID_IStorage, (void**)ppstgOpen); -} - /****************************************************************************** * StgCreateStorageEx [OLE32.@] */ @@ -6523,10 +6481,10 @@ HRESULT WINAPI StgCreateStorageEx(const WCHAR* pwcsName, DWORD grfMode, DWORD st if (stgfmt == STGFMT_STORAGE || stgfmt == STGFMT_DOCFILE) { - return create_storagefile(pwcsName, grfMode, grfAttrs, pStgOptions, riid, ppObjectOpen); + FIXME("Stub: calling StgCreateDocfile, but ignoring pStgOptions and grfAttrs\n"); + return StgCreateDocfile(pwcsName, grfMode, 0, (IStorage **)ppObjectOpen); } - ERR("Invalid stgfmt argument\n"); return STG_E_INVALIDPARAMETER; } @@ -6749,7 +6707,6 @@ HRESULT WINAPI StgOpenStorage( grfMode, TRUE, FALSE, - 512, &newStorage); if (FAILED(hr)) @@ -6797,7 +6754,6 @@ HRESULT WINAPI StgCreateDocfileOnILockBytes( grfMode, FALSE, TRUE, - 512, &newStorage); if (FAILED(hr)) @@ -6845,7 +6801,6 @@ HRESULT WINAPI StgOpenStorageOnILockBytes( grfMode, FALSE, FALSE, - 512, &newStorage); if (FAILED(hr)) diff --git a/dll/win32/ole32/storage32.h b/dll/win32/ole32/storage32.h index 36a7d679af6..fad5d7766f7 100644 --- a/dll/win32/ole32/storage32.h +++ b/dll/win32/ole32/storage32.h @@ -46,7 +46,6 @@ static const ULONG OFFSET_BIGBLOCKSIZEBITS = 0x0000001e; static const ULONG OFFSET_SMALLBLOCKSIZEBITS = 0x00000020; static const ULONG OFFSET_BBDEPOTCOUNT = 0x0000002C; static const ULONG OFFSET_ROOTSTARTBLOCK = 0x00000030; -static const ULONG OFFSET_SMALLBLOCKLIMIT = 0x00000038; static const ULONG OFFSET_SBDEPOTSTART = 0x0000003C; static const ULONG OFFSET_SBDEPOTCOUNT = 0x00000040; static const ULONG OFFSET_EXTBBDEPOTSTART = 0x00000044; @@ -66,8 +65,6 @@ static const ULONG OFFSET_PS_MTIMEHIGH = 0x00000070; static const ULONG OFFSET_PS_STARTBLOCK = 0x00000074; static const ULONG OFFSET_PS_SIZE = 0x00000078; static const WORD DEF_BIG_BLOCK_SIZE_BITS = 0x0009; -static const WORD MIN_BIG_BLOCK_SIZE_BITS = 0x0009; -static const WORD MAX_BIG_BLOCK_SIZE_BITS = 0x000c; static const WORD DEF_SMALL_BLOCK_SIZE_BITS = 0x0006; static const WORD DEF_BIG_BLOCK_SIZE = 0x0200; static const WORD DEF_SMALL_BLOCK_SIZE = 0x0040; @@ -100,8 +97,6 @@ static const ULONG DIRENTRY_NULL = 0xFFFFFFFF; #define STGTY_ROOT 0x05 #define COUNT_BBDEPOTINHEADER 109 - -/* FIXME: This value is stored in the header, but we hard-code it to 0x1000. */ #define LIMIT_TO_USE_SMALL_BLOCK 0x1000 #define STGM_ACCESS_MODE(stgm) ((stgm)&0x0000f) @@ -356,7 +351,6 @@ struct StorageImpl ULONG smallBlockSize; ULONG bigBlockDepotCount; ULONG rootStartBlock; - ULONG smallBlockLimit; ULONG smallBlockDepotStart; ULONG extBigBlockDepotStart; ULONG extBigBlockDepotCount; @@ -366,9 +360,6 @@ struct StorageImpl ULONG indexBlockDepotCached; ULONG prevFreeBlock; - /* All small blocks before this one are known to be in use. */ - ULONG firstFreeSmallBlock; - /* * Abstraction of the big block chains for the chains of the header. */ diff --git a/dll/win32/oleaut32/olepicture.c b/dll/win32/oleaut32/olepicture.c index c7a3411cf04..7a5bc29a4e5 100644 --- a/dll/win32/oleaut32/olepicture.c +++ b/dll/win32/oleaut32/olepicture.c @@ -1273,7 +1273,7 @@ static HRESULT OLEPictureImpl_LoadEnhMetafile(OLEPictureImpl *This, static HRESULT OLEPictureImpl_LoadAPM(OLEPictureImpl *This, const BYTE *data, ULONG size) { - const APM_HEADER *header = (const APM_HEADER *)data; + APM_HEADER *header = (APM_HEADER *)data; HMETAFILE hmf; if (size < sizeof(APM_HEADER)) diff --git a/dll/win32/oleaut32/regsvr.c b/dll/win32/oleaut32/regsvr.c index f97544f51ed..12f64faa516 100644 --- a/dll/win32/oleaut32/regsvr.c +++ b/dll/win32/oleaut32/regsvr.c @@ -480,12 +480,6 @@ static struct regsvr_coclass const coclass_list[] = { "Obsolete Font", "OldFont" }, - { &IID_ISupportErrorInfo, - "PSSupportErrorInfo", - "ole2disp.dll", - "oleaut32.dll", - NULL - }, { NULL } /* list terminator */ }; diff --git a/dll/win32/oleaut32/typelib.c b/dll/win32/oleaut32/typelib.c index 5792cc51870..b09f7ab64d1 100644 --- a/dll/win32/oleaut32/typelib.c +++ b/dll/win32/oleaut32/typelib.c @@ -283,9 +283,30 @@ static WCHAR *get_lcid_subkey( LCID lcid, SYSKIND syskind, WCHAR *buffer ) static HRESULT TLB_ReadTypeLib(LPCWSTR pszFileName, LPWSTR pszPath, UINT cchPath, ITypeLib2 **ppTypeLib); -/* Get the path to a registered type library. Helper for QueryPathOfRegTypeLib. */ -static HRESULT query_typelib_path( REFGUID guid, WORD wMaj, WORD wMin, - SYSKIND syskind, LCID lcid, LPBSTR path ) +/**************************************************************************** + * QueryPathOfRegTypeLib [OLEAUT32.164] + * + * Gets the path to a registered type library. + * + * PARAMS + * guid [I] referenced guid + * wMaj [I] major version + * wMin [I] minor version + * lcid [I] locale id + * path [O] path of typelib + * + * RETURNS + * Success: S_OK. + * Failure: If the type library is not registered then TYPE_E_LIBNOTREGISTERED + * or TYPE_E_REGISTRYACCESS if the type library registration key couldn't be + * opened. + */ +HRESULT WINAPI QueryPathOfRegTypeLib( + REFGUID guid, + WORD wMaj, + WORD wMin, + LCID lcid, + LPBSTR path ) { HRESULT hr = TYPE_E_LIBNOTREGISTERED; LCID myLCID = lcid; @@ -315,7 +336,7 @@ static HRESULT query_typelib_path( REFGUID guid, WORD wMaj, WORD wMin, { LONG dwPathLen = sizeof(Path); - get_lcid_subkey( myLCID, syskind, buffer ); + get_lcid_subkey( myLCID, SYS_WIN32, buffer ); if (RegQueryValueW(hkey, buffer, Path, &dwPathLen)) { @@ -347,29 +368,6 @@ static HRESULT query_typelib_path( REFGUID guid, WORD wMaj, WORD wMin, return hr; } -/**************************************************************************** - * QueryPathOfRegTypeLib [OLEAUT32.164] - * - * Gets the path to a registered type library. - * - * PARAMS - * guid [I] referenced guid - * wMaj [I] major version - * wMin [I] minor version - * lcid [I] locale id - * path [O] path of typelib - * - * RETURNS - * Success: S_OK. - * Failure: If the type library is not registered then TYPE_E_LIBNOTREGISTERED - * or TYPE_E_REGISTRYACCESS if the type library registration key couldn't be - * opened. - */ -HRESULT WINAPI QueryPathOfRegTypeLib( REFGUID guid, WORD wMaj, WORD wMin, LCID lcid, LPBSTR path ) -{ - return query_typelib_path( guid, wMaj, wMin, SYS_WIN32, lcid, path ); -} - /****************************************************************************** * CreateTypeLib [OLEAUT32.160] creates a typelib * @@ -693,10 +691,7 @@ HRESULT WINAPI RegisterTypeLib( MESSAGE("\n"); } - /* Register all dispinterfaces (which includes dual interfaces) and - oleautomation interfaces */ - if ((kind == TKIND_INTERFACE && (tattr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) || - kind == TKIND_DISPATCH) + if (tattr->wTypeFlags & (TYPEFLAG_FOLEAUTOMATION|TYPEFLAG_FDUAL|TYPEFLAG_FDISPATCHABLE)) { /* register interface<->typelib coupling */ get_interface_key( &tattr->guid, keyName ); @@ -801,7 +796,7 @@ HRESULT WINAPI UnRegisterTypeLib( } /* get the path to the typelib on disk */ - if (query_typelib_path(libid, wVerMajor, wVerMinor, syskind, lcid, &tlibPath) != S_OK) { + if (QueryPathOfRegTypeLib(libid, wVerMajor, wVerMinor, lcid, &tlibPath) != S_OK) { result = E_INVALIDARG; goto end; } @@ -837,23 +832,19 @@ HRESULT WINAPI UnRegisterTypeLib( goto enddeleteloop; } - if ((kind == TKIND_INTERFACE && (typeAttr->wTypeFlags & TYPEFLAG_FOLEAUTOMATION)) || - kind == TKIND_DISPATCH) - { - /* the path to the type */ - get_interface_key( &typeAttr->guid, subKeyName ); - - /* Delete its bits */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) - goto enddeleteloop; + /* the path to the type */ + get_interface_key( &typeAttr->guid, subKeyName ); - RegDeleteKeyW(subKey, ProxyStubClsidW); - RegDeleteKeyW(subKey, ProxyStubClsid32W); - RegDeleteKeyW(subKey, TypeLibW); - RegCloseKey(subKey); - subKey = NULL; - RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName); + /* Delete its bits */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, subKeyName, 0, KEY_WRITE, &subKey) != ERROR_SUCCESS) { + goto enddeleteloop; } + RegDeleteKeyW(subKey, ProxyStubClsidW); + RegDeleteKeyW(subKey, ProxyStubClsid32W); + RegDeleteKeyW(subKey, TypeLibW); + RegCloseKey(subKey); + subKey = NULL; + RegDeleteKeyW(HKEY_CLASSES_ROOT, subKeyName); enddeleteloop: if (typeAttr) ITypeInfo_ReleaseTypeAttr(typeInfo, typeAttr); @@ -1910,7 +1901,7 @@ MSFT_DoFuncs(TLBContext* pcx, { if (!IS_INTRESOURCE(pFuncRec->OptAttr[2])) ERR("ordinal 0x%08x invalid, IS_INTRESOURCE is false\n", pFuncRec->OptAttr[2]); - (*pptfd)->Entry = (BSTR)(DWORD_PTR)LOWORD(pFuncRec->OptAttr[2]); + (*pptfd)->Entry = (BSTR)pFuncRec->OptAttr[2]; } else { @@ -2936,7 +2927,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) else if(td[0] == VT_CARRAY) { /* array descr table here */ - pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)(INT_PTR)td[2]; /* temp store offset in*/ + pTypeLibImpl->pTypeDesc[i].u.lpadesc = (void *)((int) td[2]); /* temp store offset in*/ } else if(td[0] == VT_USERDEFINED) { @@ -2951,7 +2942,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) if(pTypeLibImpl->pTypeDesc[i].vt != VT_CARRAY) continue; if(tlbSegDir.pArrayDescriptions.offset>0) { - MSFT_ReadLEWords(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (INT_PTR)pTypeLibImpl->pTypeDesc[i].u.lpadesc); + MSFT_ReadLEWords(td, sizeof(td), &cx, tlbSegDir.pArrayDescriptions.offset + (int) pTypeLibImpl->pTypeDesc[i].u.lpadesc); pTypeLibImpl->pTypeDesc[i].u.lpadesc = TLB_Alloc(sizeof(ARRAYDESC)+sizeof(SAFEARRAYBOUND)*(td[3]-1)); if(td[1]<0) @@ -4788,7 +4779,13 @@ static HRESULT WINAPI ITypeLibComp_fnBind( &subtypeinfo, &subdesckind, &subbindptr); if (SUCCEEDED(hr) && (subdesckind != DESCKIND_NONE)) { - TYPEDESC tdesc_appobject; + TYPEDESC tdesc_appobject = + { + { + (TYPEDESC *)pTypeInfo->hreftype + }, + VT_USERDEFINED + }; const VARDESC vardesc_appobject = { -2, /* memid */ @@ -4810,9 +4807,6 @@ static HRESULT WINAPI ITypeLibComp_fnBind( VAR_STATIC /* varkind */ }; - tdesc_appobject.u.hreftype = pTypeInfo->hreftype; - tdesc_appobject.vt = VT_USERDEFINED; - TRACE("found in implicit app object: %s\n", debugstr_w(szName)); /* cleanup things filled in by Bind call so we can put our @@ -5702,8 +5696,7 @@ _invoke(FARPROC func,CALLCONV callconv, int nrargs, DWORD *args) { if (TRACE_ON(ole)) { int i; TRACE("Calling %p(",func); - for (i=0;i 30) TRACE("..."); + for (i=0;icParams-1 && rgdispidNamedArgs[j] == DISPID_PROPERTYPUT)) { @@ -6121,10 +6113,9 @@ static HRESULT WINAPI ITypeInfo_fnInvoke( break; } } - - if (!src_arg && vargs_converted + cNamedArgs < pDispParams->cArgs) + else { - src_arg = &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted]; + src_arg = vargs_converted < pDispParams->cArgs ? &pDispParams->rgvarg[pDispParams->cArgs - 1 - vargs_converted] : NULL; vargs_converted++; } @@ -6605,7 +6596,7 @@ static HRESULT WINAPI ITypeInfo_fnGetDllEntry( ITypeInfo2 *iface, MEMBERID memid if (pBstrName) *pBstrName = NULL; if (pwOrdinal) - *pwOrdinal = LOWORD(pFDesc->Entry); + *pwOrdinal = (DWORD)pFDesc->Entry; return S_OK; } return TYPE_E_ELEMENTNOTFOUND; diff --git a/dll/win32/oleaut32/typelib2.c b/dll/win32/oleaut32/typelib2.c index a93e5a4962a..6b1aea062ba 100644 --- a/dll/win32/oleaut32/typelib2.c +++ b/dll/win32/oleaut32/typelib2.c @@ -2456,7 +2456,7 @@ static HRESULT WINAPI ICreateTypeInfo2_fnLayOut( return hres; } - This->typeinfo->cbSizeVft = typeattr->cbSizeVft * 4 / sizeof(void *); + This->typeinfo->cbSizeVft = typeattr->cbSizeVft; ITypeInfo_ReleaseTypeAttr(inherited, typeattr); ITypeInfo_Release(inherited); @@ -2928,7 +2928,7 @@ static HRESULT WINAPI ITypeInfo2_fnGetTypeAttr( (*ppTypeAttr)->cFuncs += 7; (*ppTypeAttr)->cVars = This->typeinfo->cElement>>16; (*ppTypeAttr)->cImplTypes = This->typeinfo->cImplTypes; - (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 7 * sizeof(void*) : This->typeinfo->cbSizeVft; + (*ppTypeAttr)->cbSizeVft = This->typekind==TKIND_DISPATCH ? 28 : This->typeinfo->cbSizeVft; (*ppTypeAttr)->cbAlignment = (This->typeinfo->typekind>>11) & 0x1f; (*ppTypeAttr)->wTypeFlags = This->typeinfo->flags; (*ppTypeAttr)->wMajorVerNum = This->typeinfo->version&0xffff; diff --git a/dll/win32/oleaut32/vartype.c b/dll/win32/oleaut32/vartype.c index cfd5e8f8353..da1288d4a7c 100644 --- a/dll/win32/oleaut32/vartype.c +++ b/dll/win32/oleaut32/vartype.c @@ -3503,7 +3503,7 @@ HRESULT WINAPI VarCyFromR4(FLOAT fltIn, CY* pCyOut) */ HRESULT WINAPI VarCyFromR8(double dblIn, CY* pCyOut) { -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#if defined(__GNUC__) && defined(__i386__) /* This code gives identical results to Win32 on Intel. * Here we use fp exceptions to catch overflows when storing the value. */ diff --git a/dll/win32/rsaenh/rsaenh.c b/dll/win32/rsaenh/rsaenh.c index 8a5be9935c3..74ad392f2f2 100644 --- a/dll/win32/rsaenh/rsaenh.c +++ b/dll/win32/rsaenh/rsaenh.c @@ -3354,33 +3354,6 @@ BOOL WINAPI RSAENH_CPSetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam setup_key(pCryptKey); return TRUE; - case KP_SALT: - switch (pCryptKey->aiAlgid) { - case CALG_RC2: - case CALG_RC4: - if (!pbData) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - /* MSDN: the base provider always sets eleven bytes of - * salt value. - */ - memcpy(pCryptKey->abKeyValue + pCryptKey->dwKeyLen, - pbData, 11); - pCryptKey->dwSaltLen = 11; - setup_key(pCryptKey); - /* Strange but true: salt length reset to 0 after setting - * it via KP_SALT. - */ - pCryptKey->dwSaltLen = 0; - break; - default: - SetLastError(NTE_BAD_KEY); - return FALSE; - } - return TRUE; - case KP_SALT_EX: { CRYPT_INTEGER_BLOB *blob = (CRYPT_INTEGER_BLOB *)pbData; @@ -3513,16 +3486,8 @@ BOOL WINAPI RSAENH_CPGetKeyParam(HCRYPTPROV hProv, HCRYPTKEY hKey, DWORD dwParam pCryptKey->dwBlockLen); case KP_SALT: - switch (pCryptKey->aiAlgid) { - case CALG_RC2: - case CALG_RC4: - return copy_param(pbData, pdwDataLen, - &pCryptKey->abKeyValue[pCryptKey->dwKeyLen], - pCryptKey->dwSaltLen); - default: - SetLastError(NTE_BAD_KEY); - return FALSE; - } + return copy_param(pbData, pdwDataLen, + &pCryptKey->abKeyValue[pCryptKey->dwKeyLen], pCryptKey->dwSaltLen); case KP_PADDING: dwValue = PKCS5_PADDING; diff --git a/dll/win32/rsaenh/sha2.c b/dll/win32/rsaenh/sha2.c index ea5bb28b48f..559323c54e5 100644 --- a/dll/win32/rsaenh/sha2.c +++ b/dll/win32/rsaenh/sha2.c @@ -273,7 +273,7 @@ static const char sha2_hex_digits[] = "0123456789abcdef"; /*** SHA-256: *********************************************************/ void SHA256_Init(SHA256_CTX* context) { - if (context == NULL) { + if (context == (SHA256_CTX*)0) { return; } MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH); @@ -465,7 +465,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != NULL && data != NULL); + assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0); usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; if (usedspace > 0) { @@ -490,7 +490,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA256_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA256_Transform(context, (const sha2_word32*)data); + SHA256_Transform(context, (sha2_word32*)data); context->bitcount += SHA256_BLOCK_LENGTH << 3; len -= SHA256_BLOCK_LENGTH; data += SHA256_BLOCK_LENGTH; @@ -509,10 +509,10 @@ void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) { unsigned int usedspace; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA256_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != NULL) { + if (digest != (sha2_byte*)0) { usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH; #ifndef WORDS_BIGENDIAN /* Convert FROM host byte order */ @@ -572,9 +572,9 @@ char *SHA256_End(SHA256_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA256_CTX*)0); - if (buffer != NULL) { + if (buffer != (char*)0) { SHA256_Final(digest, context); for (i = 0; i < SHA256_DIGEST_LENGTH; i++) { @@ -582,7 +582,7 @@ char *SHA256_End(SHA256_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = 0; + *buffer = (char)0; } else { MEMSET_BZERO(context, sizeof(context)); } @@ -601,7 +601,7 @@ char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_S /*** SHA-512: *********************************************************/ void SHA512_Init(SHA512_CTX* context) { - if (context == NULL) { + if (context == (SHA512_CTX*)0) { return; } MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH); @@ -787,7 +787,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } /* Sanity check: */ - assert(context != NULL && data != NULL); + assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0); usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH; if (usedspace > 0) { @@ -812,7 +812,7 @@ void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) { } while (len >= SHA512_BLOCK_LENGTH) { /* Process as many complete blocks as we can */ - SHA512_Transform(context, (const sha2_word64*)data); + SHA512_Transform(context, (sha2_word64*)data); ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3); len -= SHA512_BLOCK_LENGTH; data += SHA512_BLOCK_LENGTH; @@ -871,10 +871,10 @@ void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA512_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != NULL) { + if (digest != (sha2_byte*)0) { SHA512_Last(context); /* Save the hash data for output: */ @@ -901,9 +901,9 @@ char *SHA512_End(SHA512_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA512_CTX*)0); - if (buffer != NULL) { + if (buffer != (char*)0) { SHA512_Final(digest, context); for (i = 0; i < SHA512_DIGEST_LENGTH; i++) { @@ -911,7 +911,7 @@ char *SHA512_End(SHA512_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = 0; + *buffer = (char)0; } else { MEMSET_BZERO(context, sizeof(context)); } @@ -930,7 +930,7 @@ char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_S /*** SHA-384: *********************************************************/ void SHA384_Init(SHA384_CTX* context) { - if (context == NULL) { + if (context == (SHA384_CTX*)0) { return; } MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH); @@ -946,10 +946,10 @@ void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) { sha2_word64 *d = (sha2_word64*)digest; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA384_CTX*)0); /* If no digest buffer is passed, we don't bother doing this: */ - if (digest != NULL) { + if (digest != (sha2_byte*)0) { SHA512_Last((SHA512_CTX*)context); /* Save the hash data for output: */ @@ -976,9 +976,9 @@ char *SHA384_End(SHA384_CTX* context, char buffer[]) { int i; /* Sanity check: */ - assert(context != NULL); + assert(context != (SHA384_CTX*)0); - if (buffer != NULL) { + if (buffer != (char*)0) { SHA384_Final(digest, context); for (i = 0; i < SHA384_DIGEST_LENGTH; i++) { @@ -986,7 +986,7 @@ char *SHA384_End(SHA384_CTX* context, char buffer[]) { *buffer++ = sha2_hex_digits[*d & 0x0f]; d++; } - *buffer = 0; + *buffer = (char)0; } else { MEMSET_BZERO(context, sizeof(context)); } diff --git a/dll/win32/schannel/lsamode.c b/dll/win32/schannel/lsamode.c index f43150e3d3a..23d85994cc4 100644 --- a/dll/win32/schannel/lsamode.c +++ b/dll/win32/schannel/lsamode.c @@ -109,12 +109,6 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] = NULL, /* SetExtendedInformation */ NULL, /* SetContextAttributes */ NULL, /* SetCredentialsAttributes */ - NULL, /* ChangeAccountPassword */ - NULL, /* QueryMetaData */ - NULL, /* ExchangeMetaData */ - NULL, /* GetCredUIContext */ - NULL, /* UpdateCredentials */ - NULL, /* ValidateTargetInfo */ }, { NULL, /* InitializePackage */ NULL, /* LsaLogonUser */ @@ -145,12 +139,6 @@ static SECPKG_FUNCTION_TABLE secPkgFunctionTable[2] = NULL, /* SetExtendedInformation */ NULL, /* SetContextAttributes */ NULL, /* SetCredentialsAttributes */ - NULL, /* ChangeAccountPassword */ - NULL, /* QueryMetaData */ - NULL, /* ExchangeMetaData */ - NULL, /* GetCredUIContext */ - NULL, /* UpdateCredentials */ - NULL, /* ValidateTargetInfo */ } }; @@ -162,7 +150,7 @@ NTSTATUS WINAPI SpLsaModeInitialize(ULONG LsaVersion, PULONG PackageVersion, { TRACE("(%u, %p, %p, %p)\n", LsaVersion, PackageVersion, ppTables, pcTables); - *PackageVersion = SECPKG_INTERFACE_VERSION_6; + *PackageVersion = SECPKG_INTERFACE_VERSION_3; *pcTables = 2; *ppTables = secPkgFunctionTable; diff --git a/dll/win32/setupapi/interface.c b/dll/win32/setupapi/interface.c index e7556cec75f..1d207097d00 100644 --- a/dll/win32/setupapi/interface.c +++ b/dll/win32/setupapi/interface.c @@ -399,13 +399,7 @@ InstallOneInterface( HeapFree(GetProcessHeap(), 0, Path); } - if (RegCreateKeyExW(hKey, L"Device Parameters", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hRefKey, NULL) != ERROR_SUCCESS) - { - RegCloseKey(hKey); - return FALSE; - } - - return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hRefKey, NULL, 0, NULL, NULL, NULL, NULL); + return SetupInstallFromInfSectionW(NULL, /* FIXME */ hInf, InterfaceSection, SPINST_REGISTRY, hKey, NULL, 0, NULL, NULL, NULL, NULL); } /*********************************************************************** diff --git a/dll/win32/setupapi/lang/cs-CZ.rc b/dll/win32/setupapi/lang/cs-CZ.rc index c1ee9fd7c09..29573ac581d 100644 --- a/dll/win32/setupapi/lang/cs-CZ.rc +++ b/dll/win32/setupapi/lang/cs-CZ.rc @@ -1,7 +1,23 @@ -/* FILE: dll/win32/setupapi/lang/cs-CZ.rc - * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * THANKS TO: David Kredba - * UPDATED: 2010-01-07 +/* Hey, Emacs, open this file with -*- coding: cp1250 -*- + * + * Czech resources for SETUPAPI + * + * Copyright 2001 Andreas Mohr + * Copyright 2004 David Kredba + * + * 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_CZECH, SUBLANG_DEFAULT @@ -23,7 +39,7 @@ END STRINGTABLE DISCARDABLE BEGIN - IDS_QUERY_REBOOT_TEXT "Aby mohla být instalace dokonèena, musí být poèítaè restartován. Pokraèovat?" - IDS_QUERY_REBOOT_CAPTION "Restartovat" - IDS_INF_FILE "Instalaèní informace" + IDS_QUERY_REBOOT_TEXT "Your computer needs to be rebooted to finish installation. Do you want to proceed?" + IDS_QUERY_REBOOT_CAPTION "Reboot" + IDS_INF_FILE "Setup Information" END diff --git a/dll/win32/shell32/dialogs.c b/dll/win32/shell32/dialogs.c index fa09de07916..e5aa28f74e8 100644 --- a/dll/win32/shell32/dialogs.c +++ b/dll/win32/shell32/dialogs.c @@ -344,7 +344,7 @@ static INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPAR else pdir[3] = '\0'; } - if (ShellExecuteA(NULL, NULL, psz, NULL, pdir, SW_SHOWNORMAL) < (HINSTANCE)33) + if (ShellExecuteA(NULL, "open", psz, NULL, pdir, SW_SHOWNORMAL) < (HINSTANCE)33) { char *pszSysMsg = NULL ; FormatMessageA ( @@ -357,7 +357,7 @@ static INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPAR ) ; sprintf (szMsg, "Error: %s", pszSysMsg) ; LocalFree ((HLOCAL)pszSysMsg) ; - MessageBoxA (hwnd, szMsg, NULL, MB_OK | MB_ICONEXCLAMATION) ; + MessageBoxA (hwnd, szMsg, "Nix", MB_OK | MB_ICONEXCLAMATION) ; HeapFree(GetProcessHeap(), 0, psz); HeapFree(GetProcessHeap(), 0, pdir); @@ -612,11 +612,9 @@ int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, D int WINAPI LogoffWindowsDialog(HWND hWndOwner) { - if (ConfirmDialog(hWndOwner, IDS_LOGOFF_PROMPT, IDS_LOGOFF_TITLE)) - { - ExitWindowsEx(EWX_LOGOFF, 0); - } - return 0; + UNIMPLEMENTED; + ExitWindowsEx(EWX_LOGOFF, 0); + return 0; } /************************************************************************* diff --git a/dll/win32/shell32/folder_options.c b/dll/win32/shell32/folder_options.c index 0e8ccbfe93d..c862c79855b 100644 --- a/dll/win32/shell32/folder_options.c +++ b/dll/win32/shell32/folder_options.c @@ -41,13 +41,6 @@ typedef struct WCHAR szFolderPath[MAX_PATH]; }FOLDER_PROPERTIES_CONTEXT, *PFOLDER_PROPERTIES_CONTEXT; -typedef struct -{ - WCHAR FileExtension[30]; - WCHAR FileDescription[100]; - WCHAR ClassKey[MAX_PATH]; -}FOLDER_FILE_TYPE_ENTRY, *PFOLDER_FILE_TYPE_ENTRY; - typedef struct { LPCWSTR szKeyName; @@ -162,49 +155,20 @@ InitializeFileTypesListCtrlColumns(HWND hDlgCtrl) RECT clientRect; LVCOLUMNW col; WCHAR szName[50]; - DWORD dwStyle; - int columnSize = 140; - if (!LoadStringW(shell32_hInstance, IDS_COLUMN_EXTENSION, szName, sizeof(szName) / sizeof(WCHAR))) - { - /* default to english */ - wcscpy(szName, L"Extensions"); - } - - /* make sure its null terminated */ + szName[0] = 0; szName[(sizeof(szName)/sizeof(WCHAR))-1] = 0; GetClientRect(hDlgCtrl, &clientRect); ZeroMemory(&col, sizeof(LV_COLUMN)); - columnSize = 140; //FIXME - col.iSubItem = 0; - col.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM | LVCF_FMT; - col.fmt = LVCFMT_FIXED_WIDTH; - col.cx = columnSize | LVCFMT_LEFT; - col.cchTextMax = wcslen(szName); - col.pszText = szName; + col.mask = LVCF_SUBITEM | LVCF_WIDTH | LVCF_FMT; + col.iSubItem = 0; + col.pszText = szName; + col.fmt = LVCFMT_LEFT; + col.cx = (clientRect.right - clientRect.left) - GetSystemMetrics(SM_CXVSCROLL); (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM)&col); - - if (!LoadStringW(shell32_hInstance, IDS_FILE_TYPES, szName, sizeof(szName) / sizeof(WCHAR))) - { - /* default to english */ - wcscpy(szName, L"FileTypes"); - } - - col.iSubItem = 1; - col.cx = clientRect.right - clientRect.left - columnSize; - col.cchTextMax = wcslen(szName); - col.pszText = szName; - (void)SendMessageW(hDlgCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM)&col); - - /* set full select style */ - dwStyle = (DWORD) SendMessage(hDlgCtrl, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0); - dwStyle = dwStyle | LVS_EX_FULLROWSELECT; - SendMessage(hDlgCtrl, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle); - } - INT FindItem(HWND hDlgCtrl, WCHAR * ItemName) { @@ -217,105 +181,45 @@ FindItem(HWND hDlgCtrl, WCHAR * ItemName) } VOID -InsertFileType(HWND hDlgCtrl, WCHAR * szName, PINT iItem, WCHAR * szFile) +InsertFileType(HWND hDlgCtrl, WCHAR * szName, DWORD Size, INT iItem) { - PFOLDER_FILE_TYPE_ENTRY Entry; + WCHAR szPath[100]; HKEY hKey; LVITEMW lvItem; DWORD dwSize; - if (szName[0] != L'.') - { - /* FIXME handle URL protocol handlers */ - return; - } - - /* allocate file type entry */ - Entry = (PFOLDER_FILE_TYPE_ENTRY)HeapAlloc(GetProcessHeap(), 0, sizeof(FOLDER_FILE_TYPE_ENTRY)); - - if (!Entry) - return; - - /* open key */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szName, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + if (FindItem(hDlgCtrl, szName) != -1) return; - /* FIXME check for duplicates */ - - /* query for the default key */ - dwSize = sizeof(Entry->ClassKey); - if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->ClassKey, &dwSize) != ERROR_SUCCESS) - { - /* no link available */ - Entry->ClassKey[0] = 0; - } - - if (Entry->ClassKey[0]) + wcscpy(szPath, szName); + /* get the name */ + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - HKEY hTemp; - /* try open linked key */ - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, Entry->ClassKey, 0, KEY_READ, &hTemp) == ERROR_SUCCESS) + if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", szName, Size, NULL, 0, NULL) != ERROR_SUCCESS) { - /* use linked key */ - RegCloseKey(hKey); - hKey = hTemp; + dwSize = Size; + if (RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)szName, &dwSize) != ERROR_SUCCESS) + { + wcscpy(szName, szPath); + } } + RegCloseKey(hKey); + szName[(Size/sizeof(WCHAR))-1] = 0; } + wcscat(szPath, L"\\shell"); - /* read friendly type name */ - if (RegLoadMUIStringW(hKey, L"FriendlyTypeName", Entry->FileDescription, sizeof(Entry->FileDescription), NULL, 0, NULL) != ERROR_SUCCESS) - { - /* read file description */ - dwSize = sizeof(Entry->FileDescription); - Entry->FileDescription[0] = 0; - - /* read default key */ - RegQueryValueExW(hKey, NULL, NULL, NULL, (LPBYTE)Entry->FileDescription, &dwSize); - } - - /* close key */ - RegCloseKey(hKey); - - /* convert extension to upper case */ - wcscpy(Entry->FileExtension, szName); - _wcsupr(Entry->FileExtension); + ZeroMemory(&lvItem, sizeof(LVITEMW)); + lvItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; + lvItem.state = LVIS_SELECTED; + lvItem.pszText = szName; + lvItem.iItem = iItem; - if (!Entry->FileDescription[0]) + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szPath, 0, KEY_READ, &hKey) == ERROR_SUCCESS) { - /* construct default 'FileExtensionFile' */ - wcscpy(Entry->FileDescription, &Entry->FileExtension[1]); - wcscat(Entry->FileDescription, L" "); - wcscat(Entry->FileDescription, szFile); + lvItem.lParam = 0; + (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); + RegCloseKey(hKey); } - - ZeroMemory(&lvItem, sizeof(LVITEMW)); - lvItem.mask = LVIF_TEXT | LVIF_PARAM; - lvItem.iSubItem = 0; - lvItem.pszText = &Entry->FileExtension[1]; - lvItem.iItem = *iItem; - lvItem.lParam = (LPARAM)Entry; - (void)SendMessageW(hDlgCtrl, LVM_INSERTITEMW, 0, (LPARAM)&lvItem); - - ZeroMemory(&lvItem, sizeof(LVITEMW)); - lvItem.mask = LVIF_TEXT; - lvItem.pszText = Entry->FileDescription; - lvItem.iItem = *iItem; - lvItem.iSubItem = 1; - - (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem); - (*iItem)++; -} - -int -CALLBACK -ListViewCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) -{ - PFOLDER_FILE_TYPE_ENTRY Entry1, Entry2; - - Entry1 = (PFOLDER_FILE_TYPE_ENTRY)lParam1; - Entry2 = (PFOLDER_FILE_TYPE_ENTRY)lParam2; - - return wcsicmp(Entry1->FileExtension, Entry2->FileExtension); } BOOL @@ -324,70 +228,22 @@ InitializeFileTypesListCtrl(HWND hwndDlg) HWND hDlgCtrl; DWORD dwIndex = 0; WCHAR szName[50]; - WCHAR szFile[100]; DWORD dwName; - LVITEMW lvItem; INT iItem = 0; hDlgCtrl = GetDlgItem(hwndDlg, 14000); InitializeFileTypesListCtrlColumns(hDlgCtrl); - szFile[0] = 0; - if (!LoadStringW(shell32_hInstance, IDS_SHV_COLUMN1, szFile, sizeof(szFile) / sizeof(WCHAR))) - { - /* default to english */ - wcscpy(szFile, L"File"); - } - szFile[(sizeof(szFile)/sizeof(WCHAR))-1] = 0; - dwName = sizeof(szName) / sizeof(WCHAR); while(RegEnumKeyExW(HKEY_CLASSES_ROOT, dwIndex++, szName, &dwName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { - InsertFileType(hDlgCtrl, szName, &iItem, szFile); + InsertFileType(hDlgCtrl, szName, sizeof(szName), iItem++); dwName = sizeof(szName) / sizeof(WCHAR); } - - /* sort list */ - ListView_SortItems(hDlgCtrl, ListViewCompareProc, NULL); - - /* select first item */ - ZeroMemory(&lvItem, sizeof(LVITEMW)); - lvItem.mask = LVIF_STATE; - lvItem.stateMask = (UINT)-1; - lvItem.state = LVIS_FOCUSED|LVIS_SELECTED; - lvItem.iItem = 0; - (void)SendMessageW(hDlgCtrl, LVM_SETITEMW, 0, (LPARAM)&lvItem); - return TRUE; } -PFOLDER_FILE_TYPE_ENTRY -FindSelectedItem( - HWND hDlgCtrl) -{ - UINT Count, Index; - LVITEMW lvItem; - - Count = ListView_GetItemCount(hDlgCtrl); - - for (Index = 0; Index < Count; Index++) - { - ZeroMemory(&lvItem, sizeof(LVITEM)); - lvItem.mask = LVIF_PARAM | LVIF_STATE; - lvItem.iItem = Index; - lvItem.stateMask = (UINT)-1; - - if (ListView_GetItem(hDlgCtrl, &lvItem)) - { - if (lvItem.state & LVIS_SELECTED) - return (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam; - } - } - - return NULL; -} - INT_PTR CALLBACK @@ -395,65 +251,14 @@ FolderOptionsFileTypesDlg( HWND hwndDlg, UINT uMsg, WPARAM wParam, - LPARAM lParam) + LPARAM lParam +) { - LPNMLISTVIEW lppl; - LVITEMW lvItem; - WCHAR Buffer[200], FormatBuffer[100]; - PFOLDER_FILE_TYPE_ENTRY pItem; - OPENASINFO Info; - switch(uMsg) { case WM_INITDIALOG: InitializeFileTypesListCtrl(hwndDlg); return TRUE; - case WM_COMMAND: - switch(LOWORD(wParam)) - { - case 14006: - pItem = FindSelectedItem(GetDlgItem(hwndDlg, 14000)); - if (pItem) - { - Info.oaifInFlags = OAIF_ALLOW_REGISTRATION | OAIF_REGISTER_EXT; - Info.pcszClass = pItem->FileExtension; - SHOpenWithDialog(hwndDlg, &Info); - } - break; - } - - break; - case WM_NOTIFY: - lppl = (LPNMLISTVIEW) lParam; - - if (lppl->hdr.code == LVN_ITEMCHANGING) - { - ZeroMemory(&lvItem, sizeof(LVITEM)); - lvItem.mask = LVIF_PARAM; - lvItem.iItem = lppl->iItem; - if (!SendMessageW(lppl->hdr.hwndFrom, LVM_GETITEMW, 0, (LPARAM)&lvItem)) - return TRUE; - - pItem = (PFOLDER_FILE_TYPE_ENTRY)lvItem.lParam; - if (!pItem) - return TRUE; - - if (!(lppl->uOldState & LVIS_FOCUSED) && (lppl->uNewState & LVIS_FOCUSED)) - { - /* new focused item */ - if (!LoadStringW(shell32_hInstance, IDS_FILE_DETAILS, FormatBuffer, sizeof(FormatBuffer) / sizeof(WCHAR))) - { - /* use default english format string */ - wcscpy(FormatBuffer, L"Details for '%s' extension"); - } - - /* format buffer */ - swprintf(Buffer, FormatBuffer, &pItem->FileExtension[1]); - /* update dialog */ - SendDlgItemMessageW(hwndDlg, 14003, WM_SETTEXT, 0, (LPARAM)Buffer); - } - } - break; } return FALSE; diff --git a/dll/win32/shell32/folders.c b/dll/win32/shell32/folders.c index d1a6c672b51..9b71506a5f0 100644 --- a/dll/win32/shell32/folders.c +++ b/dll/win32/shell32/folders.c @@ -257,7 +257,6 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) case DRIVE_CDROM: icon_idx = IDI_SHELL_CDROM; break; case DRIVE_REMOTE: icon_idx = IDI_SHELL_NETDRIVE; break; case DRIVE_RAMDISK: icon_idx = IDI_SHELL_RAMDISK; break; - case DRIVE_NO_ROOT_DIR: icon_idx = IDI_SHELL_CDROM; break; } } diff --git a/dll/win32/shell32/fprop.c b/dll/win32/shell32/fprop.c index 4d9345c469b..529854ea494 100644 --- a/dll/win32/shell32/fprop.c +++ b/dll/win32/shell32/fprop.c @@ -114,7 +114,7 @@ SH_FileGeneralSetFileType(HWND hwndDlg, WCHAR *filext) { /* the file extension is unknown, so default to string "FileExtension File" */ SendMessageW(hDlgCtrl, WM_GETTEXT, (WPARAM)MAX_PATH, (LPARAM)value); - swprintf(name, L"%s %s", &filext[1], value); + swprintf(name, value, &filext[1]); SendMessageW(hDlgCtrl, WM_SETTEXT, (WPARAM)NULL, (LPARAM)name); return TRUE; } diff --git a/dll/win32/shell32/lang/bg-BG.rc b/dll/win32/shell32/lang/bg-BG.rc index 13a9bdb9f44..fea6d988882 100644 --- a/dll/win32/shell32/lang/bg-BG.rc +++ b/dll/win32/shell32/lang/bg-BG.rc @@ -357,7 +357,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Îòâàðÿíå ñ" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -666,8 +666,6 @@ BEGIN IDS_RESTART_PROMPT "Èñêàòå ëè äà ïðåçàïóñíåòå ñèñòåìàòà?" IDS_SHUTDOWN_TITLE "Èçêëþ÷âàíå" IDS_SHUTDOWN_PROMPT "Èñêàòå ëè äà èçêëþ÷èòå êîìïþòúðà?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" // shell folder path default values IDS_PROGRAMS "Ïóñêîâ èçáîðíèê\\Ïðèëîæåíèÿ" @@ -752,8 +750,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Ïîäðàçáèðàí ðàçïðåäåëèòåëåí ðàçìåð" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/ca-ES.rc b/dll/win32/shell32/lang/ca-ES.rc index 214028e7d8e..df5cb9e4b24 100644 --- a/dll/win32/shell32/lang/ca-ES.rc +++ b/dll/win32/shell32/lang/ca-ES.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/cs-CZ.rc b/dll/win32/shell32/lang/cs-CZ.rc index 1f4fc948540..b08beea99f9 100644 --- a/dll/win32/shell32/lang/cs-CZ.rc +++ b/dll/win32/shell32/lang/cs-CZ.rc @@ -1,7 +1,21 @@ -/* FILE: dll/win32/shell32/lang/cs-CZ.rc - * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2010-04-05 - * THANKS TO: navaraf, who translated major part of this file +/* + * Copyright 1998 Juergen Schmied + * Copyright 2003 Filip Navara + * Copyright 2008 Radek Liska + * + * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -194,18 +208,18 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY - LTEXT "Typ souboru:", 14004, 8, 35, 50, 10 - LTEXT "Složka", 14005, 68, 35, 160, 10 - LTEXT "Umístìní:", 14006, 8, 53, 50, 10 + LTEXT "Type of file:", 14004, 8, 35, 50, 10 + LTEXT "Folder", 14005, 68, 35, 160, 10 + LTEXT "Location:", 14006, 8, 53, 50, 10 LTEXT "", 14007, 68, 53, 315, 10 - LTEXT "Velikost:", 14008, 8, 72, 45, 10 + LTEXT "Size:", 14008, 8, 72, 45, 10 LTEXT "", 14009, 68, 72, 315, 10 - LTEXT "Obsahuje:", 14010, 8, 93, 45, 10 + LTEXT "Contains:", 14010, 8, 93, 45, 10 LTEXT "", 14011, 68, 93, 160, 10 - LTEXT "Vytvoøeno:", 14014, 8, 118, 45, 10 + LTEXT "Created:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - AUTOCHECKBOX "&Jen pro ètení", 14021, 45, 150, 67, 10 - AUTOCHECKBOX "&Skrytý", 14022, 126, 150, 50, 10 + AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 + AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 205 @@ -346,7 +360,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Otevøít v..." FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -532,7 +546,7 @@ END FORMAT_DLG DIALOGEX 50, 50, 184, 218 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Formátování" +CAPTION "Format" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "&Spustit", IDOK, 53, 198, 60, 14 @@ -553,14 +567,14 @@ END CHKDSK_DLG DIALOGEX 50, 50, 194, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Zkontrolovat disk" +CAPTION "Check Disk" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "Start", IDOK, 53, 100, 60, 14 - GROUPBOX "Možnosti kontroly disku", -1, 7, 6, 179, 50 - PUSHBUTTON "Storno", IDCANCEL, 118, 100, 60, 14 - AUTOCHECKBOX "Automaticky opravovat chyby souborového systému", 14000, 16, 15, 155, 10 - AUTOCHECKBOX "&Vyhledat a pokusit se obnovit vadné sektory", 14001, 16, 30, 165, 10 + GROUPBOX "Check disk options", -1, 7, 6, 179, 50 + PUSHBUTTON "Cancel", IDCANCEL, 118, 100, 60, 14 + AUTOCHECKBOX "Automatically fix file system errors", 14000, 16, 15, 155, 10 + AUTOCHECKBOX "&Scan for and attempt recovery of bad sectors", 14001, 16, 30, 165, 10 CONTROL "", 14002, "MSCTLS_PROGRESS32", 16, 7, 60, 170, 8 LTEXT "", 14003, 60, 80, 170, 10 END @@ -593,17 +607,17 @@ BEGIN IDS_SHV_COLUMN9 "Komentáø" IDS_SHV_COLUMN10 "Vlastník" IDS_SHV_COLUMN11 "Skupina" - IDS_SHV_COLUMN12 "Název souboru" - IDS_SHV_COLUMN13 "Kategorie" + IDS_SHV_COLUMN12 "Filename" + IDS_SHV_COLUMN13 "Category" IDS_SHV_COLUMN_DELFROM "Pùvodní umístìní" IDS_SHV_COLUMN_DELDATE "Odstranìno" IDS_SHV_COLUMN_FONTTYPE "Fonttype" - IDS_SHV_COLUMN_WORKGROUP "Pracovní skupina" - IDS_SHV_NETWORKLOCATION "Síové umístìní" - IDS_SHV_COLUMN_DOCUMENTS "Dokumenty" + IDS_SHV_COLUMN_WORKGROUP "Workgroup" + IDS_SHV_NETWORKLOCATION "Network Location" + IDS_SHV_COLUMN_DOCUMENTS "Documents" IDS_SHV_COLUMN_STATUS "Status" - IDS_SHV_COLUMN_COMMENTS "Komentáøe" - IDS_SHV_COLUMN_LOCATION "Umístìní" + IDS_SHV_COLUMN_COMMENTS "Comments" + IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" /* special folders */ @@ -611,7 +625,7 @@ BEGIN IDS_MYCOMPUTER "Tento poèítaè" IDS_RECYCLEBIN_FOLDER_NAME "Koš" IDS_CONTROLPANEL "Ovládací panely" - IDS_ADMINISTRATIVETOOLS "Nástroje správy" + IDS_ADMINISTRATIVETOOLS "Administrative Tools" /* context menus */ IDS_VIEW_LARGE "&Vedle sebe" @@ -620,15 +634,15 @@ BEGIN IDS_VIEW_DETAILS "&Podrobnosti" IDS_SELECT "Vybrat" IDS_OPEN "Otevøít" - IDS_CREATELINK "Vytvoøit zástupc&e" + IDS_CREATELINK "Vytvoøit zástupc&e" IDS_COPY "&Kopírovat" IDS_DELETE "O&dstranit" IDS_PROPERTIES "&Vlastnosti" IDS_CUT "Vyj&mout" - IDS_RESTORE "Obnovit" - IDS_FORMATDRIVE "Formátovat..." - IDS_RENAME "Pøejmenovat" - IDS_INSERT "Vložit" + IDS_RESTORE "Restore" + IDS_FORMATDRIVE "Format..." + IDS_RENAME "Rename" + IDS_INSERT "Insert" IDS_CREATEFOLDER_DENIED "Nelze vytvoøit novou složku, protože pøístup byl odepøen." IDS_CREATEFOLDER_CAPTION "Chyba pøi pokusu vytvoøit nový adresáø" @@ -652,8 +666,6 @@ BEGIN IDS_RESTART_PROMPT "Opravdu chcete restartovat systém?" IDS_SHUTDOWN_TITLE "Vypnout" IDS_SHUTDOWN_PROMPT "Opravdu chcete vypnout poèítaè?" - IDS_LOGOFF_TITLE "Odhlásit se" - IDS_LOGOFF_PROMPT "Opravdu se chcete odhlásit?" /* shell folder path default values */ IDS_PROGRAMS "Nabídka Start\\Programy" @@ -723,21 +735,19 @@ BEGIN IDS_LNK_FILE "Zástupce" IDS_SYS_FILE "Systémový soubor" - IDS_OPEN_VERB "Otevøít" - IDS_RUNAS_VERB "Spustit jako " - IDS_EDIT_VERB "Upravit" - IDS_FIND_VERB "Najít" - IDS_PRINT_VERB "Tisknout" - IDS_PLAY_VERB "Pøehrát" - IDS_PREVIEW_VERB "Náhled" - - IDS_FILE_FOLDER "%u souborù, %u složek" - IDS_PRINTERS "Tiskárny" - IDS_FONTS "Fonty" - IDS_INSTALLNEWFONT "Nainstalovat nový font..." - - IDS_DEFAULT_CLUSTER_SIZE "Výchozí alokaèní velikost" - IDS_COPY_OF "Kopie " - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + IDS_OPEN_VERB "Open" + IDS_RUNAS_VERB "Run as " + IDS_EDIT_VERB "Edit" + IDS_FIND_VERB "Find" + IDS_PRINT_VERB "Print" + IDS_PLAY_VERB "Play" + IDS_PREVIEW_VERB "Preview" + + IDS_FILE_FOLDER "%u Files, %u Folders" + IDS_PRINTERS "Printers" + IDS_FONTS "Fonts" + IDS_INSTALLNEWFONT "Install New Font..." + + IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" + IDS_COPY_OF "Copy of" END diff --git a/dll/win32/shell32/lang/da-DK.rc b/dll/win32/shell32/lang/da-DK.rc index 9ad423c95e4..40e1eabce06 100644 --- a/dll/win32/shell32/lang/da-DK.rc +++ b/dll/win32/shell32/lang/da-DK.rc @@ -347,7 +347,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -654,8 +654,6 @@ BEGIN IDS_RESTART_PROMPT "Ønsker du at Genstarte Systemet?" IDS_SHUTDOWN_TITLE "Luk Ned" IDS_SHUTDOWN_PROMPT "Ønsker du at Lukke Ned?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programmer" @@ -740,6 +738,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/de-DE.rc b/dll/win32/shell32/lang/de-DE.rc index 5610af6fa30..db0fa82a369 100644 --- a/dll/win32/shell32/lang/de-DE.rc +++ b/dll/win32/shell32/lang/de-DE.rc @@ -296,7 +296,7 @@ BEGIN CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - LTEXT "Laufwerk %s", 14009, 100, 170, 50, 10 + LTEXT "Laufwerk %s", 14009, 100, 170, 40, 10 PUSHBUTTON "Bereinigen", 14010, 180, 175, 50, 15, WS_TABSTOP CHECKBOX "Laufwerk komprimieren, um Speicherplatz zu sparen", 14011, 15, 205, 180, 10, WS_DISABLED CHECKBOX "Laufwerk für schnelle Dateisuche indizieren", 14012, 15, 220, 165, 10, WS_DISABLED @@ -361,17 +361,17 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Öffnen mit" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_SHELL_OPEN_WITH, -1, 8, 12, 21, 20 - LTEXT "Wählen Sie das Programm, das zum Öffnen dieser Datei verwendet werden soll:", -1, 44, 12, 211, 18 - LTEXT "Datei: ", 14001, 44, 30, 188, 10 + LTEXT "Wählen Sie das Programm, das zum Öffnen dieser Datei verwendet werden soll:", -1, 44, 12, 211, 10 + LTEXT "Datei: ", 14001, 44, 25, 188, 10 GROUPBOX "&Programme", -1, 7, 42, 249, 187 LISTBOX 14002, 16 ,57, 230, 130, LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP, WS_EX_STATICEDGE AUTOCHECKBOX "&Dateityp &immer mit dem ausgewählten Programm öffnen", 14003, 20, 193, 225, 10 - PUSHBUTTON "&Durchsuchen...", 14004, 188, 207, 60, 14 + PUSHBUTTON "&Durchsuchen..", 14004, 198, 207, 50, 14 PUSHBUTTON "OK", 14005, 150, 236, 50, 14 PUSHBUTTON "Abbrechen", 14006, 206, 236, 50, 14 END @@ -669,8 +669,6 @@ BEGIN IDS_RESTART_PROMPT "Möchten Sie das System neu starten?" IDS_SHUTDOWN_TITLE "Herunterfahren" IDS_SHUTDOWN_PROMPT "Möchten Sie das System herunterfahren?" - IDS_LOGOFF_TITLE "Ausloggen" - IDS_LOGOFF_PROMPT "Möchten Sie sich ausloggen?" /* shell folder path default values */ IDS_PROGRAMS "Startmenü\\Programme" @@ -755,6 +753,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Standardgröße" IDS_COPY_OF "Kopie von" - - IDS_SHLEXEC_NOASSOC "Es ist kein Programm mit diesem Dateityp verknüpft." END diff --git a/dll/win32/shell32/lang/el-GR.rc b/dll/win32/shell32/lang/el-GR.rc index a269d68ed2f..6b35ec3f541 100644 --- a/dll/win32/shell32/lang/el-GR.rc +++ b/dll/win32/shell32/lang/el-GR.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "¢íïéãìá ìå" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -666,8 +666,6 @@ BEGIN IDS_RESTART_PROMPT "Åßóôå óßãïõñïé üôé èÝëåôå íá åðáíåêêéíÞóåôå ôïí õðïëïãéóôÞ óáò;" IDS_SHUTDOWN_TITLE "Áðåíåñãïðïßçóç" IDS_SHUTDOWN_PROMPT "Åßóôå óßãïõñïé üôé èÝëåôå íá áðåíåñãïðïéÞóåôå ôïí õðïëïãéóôÞ óáò;" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -752,6 +750,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/en-GB.rc b/dll/win32/shell32/lang/en-GB.rc index 5d8f02c9a47..38203c24077 100644 --- a/dll/win32/shell32/lang/en-GB.rc +++ b/dll/win32/shell32/lang/en-GB.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/en-US.rc b/dll/win32/shell32/lang/en-US.rc index 04df98d1e60..63d38cba154 100644 --- a/dll/win32/shell32/lang/en-US.rc +++ b/dll/win32/shell32/lang/en-US.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -373,17 +373,6 @@ BEGIN PUSHBUTTON "Cancel", 14006, 206, 236, 50, 14 END -IDD_SH_FILE_COPY DIALOGEX 0, 0, 264, 45 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Copying..." -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -BEGIN - PUSHBUTTON "Cancel", 14002, 195, 14, 60, 16 - CONTROL "", 14000, "MSCTLS_PROGRESS32", 0, 8, 20, 170, 10 - LTEXT "File", 14001, 8, 6, 169, 10 -END - - FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "General" @@ -676,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -762,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/es-ES.rc b/dll/win32/shell32/lang/es-ES.rc index f26e1d4b616..0e20abcf95f 100644 --- a/dll/win32/shell32/lang/es-ES.rc +++ b/dll/win32/shell32/lang/es-ES.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 284, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Abrir con" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -668,8 +668,6 @@ BEGIN IDS_RESTART_PROMPT "¿Desea reiniciar el equipo?" IDS_SHUTDOWN_TITLE "Apagar" IDS_SHUTDOWN_PROMPT "¿Desea apagar el equipo?" - IDS_LOGOFF_TITLE "Cerrar sesión" - IDS_LOGOFF_PROMPT "¿Desea cerrar la sesión?" /* shell folder path default values */ IDS_PROGRAMS "Menú Inicio\\Programas" @@ -754,6 +752,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Tamaño asignado por defecto" IDS_COPY_OF "Copia de" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/fi-FI.rc b/dll/win32/shell32/lang/fi-FI.rc index 6469ce1b7b5..2620c2b4277 100644 --- a/dll/win32/shell32/lang/fi-FI.rc +++ b/dll/win32/shell32/lang/fi-FI.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Haluatko simuloida Windows:n uudelleenkäynnistämistä?" IDS_SHUTDOWN_TITLE "Sammuta" IDS_SHUTDOWN_PROMPT "Haluatko lopettaa Wine:n istunnon?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Käynnistä\\Ohjelmat" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc index 3d4932fc081..98cd95fa6f0 100644 --- a/dll/win32/shell32/lang/fr-FR.rc +++ b/dll/win32/shell32/lang/fr-FR.rc @@ -362,7 +362,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Ouvrir avec" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -669,8 +669,6 @@ BEGIN IDS_RESTART_PROMPT "Voulez-vous redémarrer votre ordinateur ?" IDS_SHUTDOWN_TITLE "Arrêter" IDS_SHUTDOWN_PROMPT "Voulez-vous fermer la session ReactOS ?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Démarrer\\Programmes" @@ -755,6 +753,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Taille d'allocation par défaut" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "Aucun programme Windows n'est configuré pour ouvrir ce type de fichier." END diff --git a/dll/win32/shell32/lang/hu-HU.rc b/dll/win32/shell32/lang/hu-HU.rc index e45819a2d47..7016d5021a8 100644 --- a/dll/win32/shell32/lang/hu-HU.rc +++ b/dll/win32/shell32/lang/hu-HU.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -668,8 +668,6 @@ BEGIN IDS_RESTART_PROMPT "Újra szeretnéd indítani a rendszert?" IDS_SHUTDOWN_TITLE "Kikapcsolás" IDS_SHUTDOWN_PROMPT "Kiakarod kapcsolni számítógépét?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -754,6 +752,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/it-IT.rc b/dll/win32/shell32/lang/it-IT.rc index 8372b351e75..986ecfeeb46 100644 --- a/dll/win32/shell32/lang/it-IT.rc +++ b/dll/win32/shell32/lang/it-IT.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Apri con" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -434,8 +434,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUPWIND CAPTION "Conferma della sovrascrittura dei file" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Sì", IDYES, 20, 122, 60, 14 - PUSHBUTTON "Sì &tutti", 12807, 85, 122, 60, 14 + DEFPUSHBUTTON "&Si", IDYES, 20, 122, 60, 14 + PUSHBUTTON "Si &tutti", 12807, 85, 122, 60, 14 PUSHBUTTON "&No", IDNO, 150, 122, 60, 14 PUSHBUTTON "Annulla", IDCANCEL, 215, 122, 60, 14 ICON 146, -1, 11, 10, 21, 20, SS_REALSIZECONTROL @@ -555,13 +555,13 @@ BEGIN LTEXT "&File system", -1, 7, 35, 170, 9 COMBOBOX 28677, 7, 46, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP CONTROL "", 28678, "MSCTLS_PROGRESS32", 0, 7, 181, 170, 8 - LTEXT "Dimensione dell'unità di &allocazione", -1, 7, 64, 170, 9 + LTEXT "Dimensione dell'unità di &Allocazione", -1, 7, 64, 170, 9 COMBOBOX 28680, 7, 75, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP LTEXT "&Etichetta del Volume", -1, 7, 93, 170, 9 EDITTEXT 28679, 7, 103, 170, 13, ES_AUTOHSCROLL - GROUPBOX "Opzioni di &formattazione", 4610, 7, 121, 170, 49 + GROUPBOX "Opzioni di &Formattazione", 4610, 7, 121, 170, 49 AUTOCHECKBOX "Formattazione &rapida", 28674, 16, 135, 155, 10 - AUTOCHECKBOX "Abilita la &compressione", 28675, 16, 152, 155, 10 + AUTOCHECKBOX "Abilita la &Compressione", 28675, 16, 152, 155, 10 END CHKDSK_DLG DIALOGEX 50, 50, 194, 120 @@ -645,7 +645,7 @@ BEGIN IDS_CREATEFOLDER_DENIED "Impossibile creare la cartella: Accesso negato." IDS_CREATEFOLDER_CAPTION "Errore durante la creazione della cartella" - IDS_DELETEITEM_CAPTION "Confermare la cancellazione del file" + IDS_DELETEITEM_CAPTION "Confermare la cancallazione del file" IDS_DELETEFOLDER_CAPTION "Confermare la cancellazione della cartella" IDS_DELETEITEM_TEXT "Sei sicuro di voler cancellare '%1'?" IDS_DELETEMULTIPLE_TEXT "Sei sicuro di voler cancellare questi %1 elementi?" @@ -664,10 +664,8 @@ BEGIN /* message box strings */ IDS_RESTART_TITLE "Riavvia" IDS_RESTART_PROMPT "Volete riavviare il sistema?" - IDS_SHUTDOWN_TITLE "Arresta sistema" - IDS_SHUTDOWN_PROMPT "Volete arrestare il sistema?" - IDS_LOGOFF_TITLE "Disconnetti" - IDS_LOGOFF_PROMPT "Volete disconnettervi?" + IDS_SHUTDOWN_TITLE "Termina sessione" + IDS_SHUTDOWN_PROMPT "Volete terminare la sessione di ReactOS?" /* shell folder path default values */ IDS_PROGRAMS "Menu Avvio\\Programmi" @@ -751,7 +749,5 @@ BEGIN IDS_INSTALLNEWFONT "Installazione nuovi Font..." IDS_DEFAULT_CLUSTER_SIZE "Dimensione predefinita di allocazione" - IDS_COPY_OF "Copia di" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." + IDS_COPY_OF "Copy of" END diff --git a/dll/win32/shell32/lang/ja-JP.rc b/dll/win32/shell32/lang/ja-JP.rc index c09ba106660..47c5bfb9923 100644 --- a/dll/win32/shell32/lang/ja-JP.rc +++ b/dll/win32/shell32/lang/ja-JP.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "ŠJ‚­ƒvƒƒOƒ‰ƒ€" FONT 9, "MS UI Gothic", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "ƒVƒXƒeƒ€‚ðÄ‹N“®‚µ‚Ü‚·‚©?" IDS_SHUTDOWN_TITLE "ƒVƒƒƒbƒgƒ_ƒEƒ“" IDS_SHUTDOWN_PROMPT "ƒVƒƒƒbƒgƒ_ƒEƒ“‚µ‚Ü‚·‚©?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "ƒXƒ^[ƒg ƒƒjƒ…[\\ƒvƒƒOƒ‰ƒ€" @@ -751,5 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "ƒfƒtƒHƒ‹ƒg ƒAƒƒP[ƒVƒ‡ƒ“ ƒTƒCƒY" IDS_COPY_OF "ƒRƒs[ `" - END diff --git a/dll/win32/shell32/lang/ko-KR.rc b/dll/win32/shell32/lang/ko-KR.rc index 98981f74213..e9e67b71a4e 100644 --- a/dll/win32/shell32/lang/ko-KR.rc +++ b/dll/win32/shell32/lang/ko-KR.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/nl-NL.rc b/dll/win32/shell32/lang/nl-NL.rc index 1689e2a3bae..5ff6c83a59a 100644 --- a/dll/win32/shell32/lang/nl-NL.rc +++ b/dll/win32/shell32/lang/nl-NL.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "Er is geen Windows-programma geconfigureerd om dit soort bestanden te openen." END diff --git a/dll/win32/shell32/lang/no-NO.rc b/dll/win32/shell32/lang/no-NO.rc index f02aa64fecd..90dc27d3aa6 100644 --- a/dll/win32/shell32/lang/no-NO.rc +++ b/dll/win32/shell32/lang/no-NO.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Åpne med" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -668,8 +668,6 @@ BEGIN IDS_RESTART_PROMPT "Vil du starte datamaskinen på nytt?" IDS_SHUTDOWN_TITLE "Avslutt" IDS_SHUTDOWN_PROMPT "Vil du slå av datamaskinen?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start-meny\\Programmer" @@ -752,8 +750,6 @@ BEGIN IDS_FONTS "Skrifttyper" IDS_INSTALLNEWFONT "Installere nye skrifttyper..." - IDS_DEFAULT_CLUSTER_SIZE "Standard tildelingsstørrelse" + IDS_DEFAULT_CLUSTER_SIZE "Standard tildelingsstørrelse" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "Intet Windows-program er satt opp til å åpne denne filtypen." END diff --git a/dll/win32/shell32/lang/pl-PL.rc b/dll/win32/shell32/lang/pl-PL.rc index c9a4d40a48b..b6d33a64fd4 100644 --- a/dll/win32/shell32/lang/pl-PL.rc +++ b/dll/win32/shell32/lang/pl-PL.rc @@ -17,7 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * ReactOS shell32 fork translation updated by Caemyr - - * - Olaf Siejka (Jan,Mar,Apr,Jul, Aug 2008; Apr, 2010) + * - Olaf Siejka (Jan,Mar,Apr,Jul, Aug 2008) * Use ReactOS forum PM or IRC to contact me * http://www.reactos.org * IRC: irc.freenode.net #reactos-pl; @@ -365,7 +365,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Otwórz za pomoc¹" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -672,8 +672,6 @@ BEGIN IDS_RESTART_PROMPT "Czy chcesz zrestartowaæ system?" IDS_SHUTDOWN_TITLE "Wy³¹cz" IDS_SHUTDOWN_PROMPT "Czy chcesz wy³¹czyæ system?" - IDS_LOGOFF_TITLE "Wyloguj" - IDS_LOGOFF_PROMPT "Czy chcesz siê wylogowaæ z systemu?" /* shell folder path default values */ IDS_PROGRAMS "Menu Start\\Programy" @@ -758,6 +756,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Domyœlny rozmiar jednostki alokacji" IDS_COPY_OF "Kopia" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/pt-BR.rc b/dll/win32/shell32/lang/pt-BR.rc index 7679014ff37..048d4c39110 100644 --- a/dll/win32/shell32/lang/pt-BR.rc +++ b/dll/win32/shell32/lang/pt-BR.rc @@ -360,7 +360,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -667,8 +667,6 @@ BEGIN IDS_RESTART_PROMPT "Você quer simular a reinicialização do Windows?" IDS_SHUTDOWN_TITLE "Desligar" IDS_SHUTDOWN_PROMPT "Você quer finalizar a sessão no Wine?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Menu Iniciar\\Programas" @@ -753,6 +751,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "Nici un program Windows nu este configurat sa deschida fi?iere de acest tip." END diff --git a/dll/win32/shell32/lang/pt-PT.rc b/dll/win32/shell32/lang/pt-PT.rc index 2d99ca47e97..c20e670e3a2 100644 --- a/dll/win32/shell32/lang/pt-PT.rc +++ b/dll/win32/shell32/lang/pt-PT.rc @@ -2,7 +2,6 @@ * Copyright 1998 Juergen Schmied * Copyright 2003 Marcelo Duarte * Copyright 2006-2007 Américo José Melo - * Copyright 2010 Manuel D V Silva * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -67,27 +66,27 @@ MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "E&xplorador", FCIDM_SHVIEW_EXPLORE - MENUITEM "&Abrir", FCIDM_SHVIEW_OPEN + MENUITEM "E&xplore", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Open", FCIDM_SHVIEW_OPEN MENUITEM SEPARATOR - MENUITEM "C&ortar", FCIDM_SHVIEW_CUT - MENUITEM "&Copiar", FCIDM_SHVIEW_COPY + MENUITEM "C&ut", FCIDM_SHVIEW_CUT + MENUITEM "&Copy", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "Criar &Link", FCIDM_SHVIEW_CREATELINK - MENUITEM "&Apagar", FCIDM_SHVIEW_DELETE - MENUITEM "&Renomear", FCIDM_SHVIEW_RENAME + MENUITEM "Create &Link", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Delete", FCIDM_SHVIEW_DELETE + MENUITEM "&Rename", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR - MENUITEM "&Propriadades", FCIDM_SHVIEW_PROPERTIES + MENUITEM "&Properties", FCIDM_SHVIEW_PROPERTIES END END SHBRSFORFOLDER_MSGBOX DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Procurar Pastas" +CAPTION "Browse for Folder" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "OK", 1, 60, 175, 60, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Cancelar", 2, 125, 175, 60, 15, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancel", 2, 125, 175, 60, 15, WS_GROUP | WS_TABSTOP LTEXT "", IDD_TITLE, 4, 4, 180, 12 LTEXT "", IDD_STATUS, 4, 25, 180, 12 CONTROL "", IDD_TREEVIEW, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP, 4, 40, 180, 120 @@ -95,28 +94,28 @@ END SHNEWBRSFORFOLDER_MSGBOX DIALOGEX LOADONCALL MOVEABLE DISCARDABLE 15, 40, 218, 196 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU -CAPTION "Procurar Pastas" +CAPTION "Browse for Folder" FONT 8, "MS Shell Dlg" BEGIN LTEXT "", IDD_TITLE, 10, 8, 198, 24 LTEXT "", IDD_STATUS, 10, 25, 198, 12 - LTEXT "Pasta:", IDD_FOLDER, 10, 152, 40, 12 + LTEXT "Folder:", IDD_FOLDER, 10, 152, 40, 12 CONTROL "", IDD_TREEVIEW, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | WS_BORDER | WS_TABSTOP, 12, 38, 194, 105 EDITTEXT IDD_FOLDERTEXT, 46, 150, 160, 14, WS_BORDER | WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Criar Nova Pasta", IDD_MAKENEWFOLDER, 12, 174, 77, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Make New Folder", IDD_MAKENEWFOLDER, 12, 174, 77, 14, WS_GROUP | WS_TABSTOP DEFPUSHBUTTON "OK", IDOK, 102, 174, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Cancelar", IDCANCEL, 156, 174, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 156, 174, 50, 14, WS_GROUP | WS_TABSTOP END SHELL_YESTOALL_MSGBOX DIALOGEX 200, 100, 280, 90 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Mensagem" +CAPTION "Message" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Sim", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "Sim para &todos", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Não", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP - PUSHBUTTON "&Cancelar", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "&Yes", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Yes to &all", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&No", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Cancel", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP ICON "", IDD_ICON, 10, 10, 16, 16 LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 END @@ -128,14 +127,14 @@ FONT 8, "MS Shell Dlg" BEGIN ICON "", IDC_SHELL_ABOUT_ICON, 7, 55, 21, 20 LTEXT "", IDC_SHELL_ABOUT_APPNAME, 35, 55, 200, 10 - LTEXT "Versão " KERNEL_VERSION_STR " (" KERNEL_VERSION_BUILD_STR ")", IDC_STATIC, 35, 65, 235, 10 + LTEXT "Version " KERNEL_VERSION_STR " (" KERNEL_VERSION_BUILD_STR ")", IDC_STATIC, 35, 65, 235, 10 LTEXT REACTOS_DEFAULT_STR_LEGAL_COPYRIGHT, IDC_STATIC, 35, 75, 210, 10 LTEXT "", IDC_SHELL_ABOUT_OTHERSTUFF, 35, 90, 180, 20 - LTEXT "Esta versão do ReactOS é registado a:", IDC_STATIC, 35, 115, 180, 10 + LTEXT "This ReactOS version is registered to:", IDC_STATIC, 35, 115, 180, 10 LTEXT "", IDC_SHELL_ABOUT_REG_USERNAME, 45, 125, 180, 10 LTEXT "", IDC_SHELL_ABOUT_REG_ORGNAME, 45, 135, 180, 10 LTEXT "", IDC_STATIC, 35, 147, 235, 1, SS_ETCHEDHORZ - LTEXT "Memória física instalada:", IDC_STATIC, 35, 152, 130, 10 + LTEXT "Installed physical memory:", IDC_STATIC, 35, 152, 130, 10 LTEXT "", IDC_SHELL_ABOUT_PHYSMEM, 167, 152, 88, 10 DEFPUSHBUTTON "OK", IDOK, 220, 178, 50, 14 @@ -156,7 +155,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" BEGIN ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o ReactOS irá abrí-lo.", 12289, 36, 11, 182, 18 + LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o Wine irá abrí-lo.", 12289, 36, 11, 182, 18 LTEXT "&Abrir:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -166,156 +165,156 @@ END SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 235, 215 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Atalho" +CAPTION "Shortcut" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 4, 30, 30, WS_VISIBLE - LTEXT "Tipo de destino:", 14004, 8, 38, 64, 10 + LTEXT "Target type:", 14004, 8, 38, 64, 10 LTEXT "", 14005, 78, 38, 142, 10 - LTEXT "Localização do destino:", 14006, 8, 58, 64, 10 + LTEXT "Target location:", 14006, 8, 58, 64, 10 LTEXT "", 14007, 79, 58, 141, 10 - LTEXT "Destino:", 14008, 8, 77, 45, 10 + LTEXT "Target:", 14008, 8, 77, 45, 10 EDITTEXT 14009, 79, 75, 150, 14, ES_AUTOHSCROLL - LTEXT "&Iniciar em:", 14010, 8, 96, 57, 10 + LTEXT "&Start in:", 14010, 8, 96, 57, 10 EDITTEXT 14011, 79, 94, 150, 14, ES_AUTOHSCROLL - LTEXT "&Tecla de Atalho:", 14014, 8, 115, 57, 10 + LTEXT "Shortcut &key:", 14014, 8, 115, 57, 10 EDITTEXT 14015, 79, 112, 150, 14, ES_LEFT - LTEXT "Executar:", 14016, 8, 134, 57, 10 + LTEXT "Run:", 14016, 8, 134, 57, 10 EDITTEXT 14017, 79, 131, 150, 14, ES_AUTOHSCROLL - LTEXT "C&omemntário:", 14018, 8, 152, 57, 10 + LTEXT "C&omment:", 14018, 8, 152, 57, 10 EDITTEXT 14019, 79, 149, 150, 14, ES_AUTOHSCROLL - PUSHBUTTON "&Localizar Destino...", 14020, 9, 172, 70, 14, ES_LEFT - PUSHBUTTON "&Trocar Icon...", 14021, 84, 172, 70, 14, ES_LEFT - PUSHBUTTON "A&vançado...", 14022, 159, 172, 70, 14, ES_LEFT + PUSHBUTTON "&Find Target...", 14020, 9, 172, 70, 14, ES_LEFT + PUSHBUTTON "&Change Icon...", 14021, 84, 172, 70, 14, ES_LEFT + PUSHBUTTON "A&dvanced...", 14022, 159, 172, 70, 14, ES_LEFT END SHELL_EXTENDED_SHORTCUT_DLG DIALOGEX 0, 0, 230, 150 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Propriedades Avançadas" +CAPTION "Extended Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Escolha as propriedades avançadas que quer para este atalho.", -1, 5, 30, 210, 10 - CHECKBOX "Executar com diferentes credenciais", 14000, 25, 50, 150, 10 - LTEXT "Esta opção permite executar este atalho como outro utilizador, ou continue com a sua conta enquanto protege o seu computador e dados contra actividade de programas não autorizados.", -1, 50, 60, 175, 40 - CHECKBOX "Executar num espaço de memória separada", 14001, 25, 100, 90, 10, WS_DISABLED + LTEXT "Choose the advanced properties you want for this shortcut.", -1, 5, 30, 210, 10 + CHECKBOX "Run with different credentials", 14000, 25, 50, 150, 10 + LTEXT "This option can allow you to run the this shortcut as another user, or continue as yourself while protecting your computer and data from unauthorized program activity.", -1, 50, 60, 175, 40 + CHECKBOX "Run in seperate memory space", 14001, 25, 100, 90, 10, WS_DISABLED PUSHBUTTON "OK", 1, 63, 124, 50, 15, WS_VISIBLE - PUSHBUTTON "Abortar", 2, 120, 124, 50, 15, WS_VISIBLE + PUSHBUTTON "Abort", 2, 120, 124, 50, 15, WS_VISIBLE END SHELL_FOLDER_GENERAL_DLG DIALOGEX 0, 0, 240, 205 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Geral" +CAPTION "General" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY - LTEXT "Tipo de ficheiro:", 14004, 8, 35, 50, 10 - LTEXT "Pasta", 14005, 68, 35, 160, 10 - LTEXT "Localização:", 14006, 8, 53, 50, 10 + LTEXT "Type of file:", 14004, 8, 35, 50, 10 + LTEXT "Folder", 14005, 68, 35, 160, 10 + LTEXT "Location:", 14006, 8, 53, 50, 10 LTEXT "", 14007, 68, 53, 315, 10 - LTEXT "Tamanho:", 14008, 8, 72, 45, 10 + LTEXT "Size:", 14008, 8, 72, 45, 10 LTEXT "", 14009, 68, 72, 315, 10 - LTEXT "Contém:", 14010, 8, 93, 45, 10 + LTEXT "Contains:", 14010, 8, 93, 45, 10 LTEXT "", 14011, 68, 93, 160, 10 - LTEXT "Criado:", 14014, 8, 118, 45, 10 + LTEXT "Created:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - AUTOCHECKBOX "&Sómente de Leitura", 14021, 45, 150, 67, 10 - AUTOCHECKBOX "&Escondido", 14022, 126, 150, 50, 10 + AUTOCHECKBOX "&Read-only", 14021, 45, 150, 67, 10 + AUTOCHECKBOX "&Hidden", 14022, 126, 150, 50, 10 END SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 205 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "geral" +CAPTION "General" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON "", 14000, 10, 3, 30, 30, WS_VISIBLE EDITTEXT 14001, 70, 9, 158, 14, ES_LEFT | ES_READONLY - LTEXT "Tipo de Ficheiro:", 14004, 8, 35, 50, 10 - LTEXT "Ficheiro", 14005, 68, 35, 160, 10 - LTEXT "Abre com::", 14006, 8, 53, 50, 10 + LTEXT "Type of file:", 14004, 8, 35, 50, 10 + LTEXT "File", 14005, 68, 35, 160, 10 + LTEXT "Opens with:", 14006, 8, 53, 50, 10 LTEXT "", 14007, 68, 53, 160, 10 - LTEXT "Localização:", 14008, 8, 72, 45, 10 + LTEXT "Location:", 14008, 8, 72, 45, 10 LTEXT "", 14009, 68, 72, 315, 10 - LTEXT "Tamanho:", 14010, 8, 93, 45, 10 + LTEXT "Size:", 14010, 8, 93, 45, 10 LTEXT "", 14011, 68, 93, 160, 10 - LTEXT "Criado:", 14014, 8, 118, 45, 10 + LTEXT "Created:", 14014, 8, 118, 45, 10 LTEXT "", 14015, 68, 118, 160, 10 - LTEXT "Modificado:", 14016, 8, 140, 45, 10 + LTEXT "Modified:", 14016, 8, 140, 45, 10 LTEXT "", 14017, 68, 140, 160, 10 - LTEXT "Acedido:", 14018, 8, 160, 45, 10 + LTEXT "Accessed:", 14018, 8, 160, 45, 10 LTEXT "", 14019, 68, 160, 160, 10 - LTEXT "propriedades:", 14020, 8, 189, 45, 10 - CHECKBOX "&Somente de Leitura", 14021, 58, 189, 67, 10 - CHECKBOX "&Oculto", 14022, 126, 189, 50, 10 - CHECKBOX "&Arquivo", 14023, 181, 189, 49, 10 + LTEXT "Attributes:", 14020, 8, 189, 45, 10 + CHECKBOX "&Read-only", 14021, 58, 189, 67, 10 + CHECKBOX "&Hidden", 14022, 126, 189, 50, 10 + CHECKBOX "&Archive", 14023, 181, 189, 49, 10 END SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 235, 215 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Versão" +CAPTION "Version" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Versão do Ficheiro: ", 14000, 10, 10, 55, 10 + LTEXT "File version: ", 14000, 10, 10, 55, 10 LTEXT "", 14001, 77, 10, 152, 10 - LTEXT "Descrição: ", 14002, 10, 27, 45, 10 + LTEXT "Description: ", 14002, 10, 27, 45, 10 LTEXT "", 14003, 77, 27, 152, 10 LTEXT "Copyright: ", 14004, 10, 46, 66, 10 LTEXT "", 14005, 77, 46, 152, 10 - GROUPBOX "Outras informações da versão: ", 14006, 6, 70, 222, 115 - LTEXT "Nome do Item: ", 14007, 13, 82, 50, 10 - LTEXT "Valor: ", 14008, 112, 82, 45, 10 + GROUPBOX "Other version information: ", 14006, 6, 70, 222, 115 + LTEXT "Item name: ", 14007, 13, 82, 50, 10 + LTEXT "Value: ", 14008, 112, 82, 45, 10 LISTBOX 14009, 12, 94, 94, 83, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY EDITTEXT 14010, 112, 93, 109, 83, ES_LEFT | WS_BORDER | WS_VSCROLL | WS_GROUP | ES_MULTILINE | ES_READONLY END DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Geral" +CAPTION "General" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN EDITTEXT 14000, 40, 20, 190, 14, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Tipo:", -1, 15, 55, 40, 10 + LTEXT "Type:", -1, 15, 55, 40, 10 LTEXT "", 14001, 110, 55, 100, 10 - LTEXT "Sistema de Ficheiros:", -1, 15, 70, 100, 10 + LTEXT "File system:", -1, 15, 70, 100, 10 LTEXT "", 14002, 110, 70, 100, 10 CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Espaço utilizado:", -1, 25, 90, 120, 10 + LTEXT "Used space:", -1, 25, 90, 120, 10 LTEXT "", 14003, 110, 90, 120, 10 LTEXT "", 14004, 200, 90, 40, 10 CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Espaço livre:", -1, 25, 105, 70, 10 + LTEXT "Free space:", -1, 25, 105, 70, 10 LTEXT "", 14005, 110, 105, 120, 10 LTEXT "", 14006, 200, 105, 40, 10 - LTEXT "Capacidade:", -1, 25, 125, 80, 10 + LTEXT "Capacity:", -1, 25, 125, 80, 10 LTEXT "", 14007, 110, 125, 120, 10 LTEXT "", 14008, 200, 125, 40, 10 CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - LTEXT "Disco %s", 14009, 100, 170, 40, 10 - PUSHBUTTON "Limpeza do Disco", 14010, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Comprimir unidade para libertar espaço no disco", 14011, 15, 205, 180, 10, WS_DISABLED - CHECKBOX "permitir indexar este disco para acelerar a procura de ficheiros", 14012, 15, 220, 200, 10, WS_DISABLED + LTEXT "Drive %s", 14009, 100, 170, 40, 10 + PUSHBUTTON "Disk Cleanup", 14010, 180, 175, 50, 15, WS_TABSTOP + CHECKBOX "Compress drive to save disk space", 14011, 15, 205, 180, 10, WS_DISABLED + CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED END DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Ferramentas" +CAPTION "Tools" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Verificar por erros...", -1, 5, 5, 230, 60 - LTEXT "Esta opção vai verificar o volume por erros.", -1, 40, 25, 160, 20 - PUSHBUTTON "Verificar agora...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Desfragmentação", -1, 5, 65, 230, 60 - LTEXT "Esta opção vai desfragmentar os ficheiros no volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragmentar Agora...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Cópia de segurança", -1, 5, 130, 230, 60 - LTEXT "Esta opção vai criar os ficheiros do volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Executar Cópia de Segurança...", 14002, 130, 170, 90, 15, WS_TABSTOP + GROUPBOX "Error-checking", -1, 5, 5, 230, 60 + LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 + PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP + GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 + LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 + PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP + GROUPBOX "Backup", -1, 5, 130, 230, 60 + LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 + PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP END DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 230 @@ -327,151 +326,151 @@ END RUN_AS_DIALOG DIALOGEX 0, 0, 240, 190 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Executar Como..." +CAPTION "Run As" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - LTEXT "Que conta de utilizador quer utilizar para executar este programa?", -1, 10, 20, 220, 20 - CHECKBOX "Utilizador actual %s", 14000, 10, 45, 150, 10 - LTEXT "Proteger o meu computador e dados de actividade de programas não autoridados.", -1, 25, 57, 200, 10, WS_DISABLED - CHECKBOX "Esta opção pode prevenir a acção de virus no computador,mas seleccionando-a pode levar a que alguns programas funcionem incorrectamente.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE - CHECKBOX "O seguinte utilizador:", 14002, 10, 100, 90, 10 - LTEXT "Nome do utilizador:", -1, 20, 118, 54, 10 + LTEXT "Which user account do you want to use to run this program?", -1, 10, 20, 220, 20 + CHECKBOX "Current User %s", 14000, 10, 45, 150, 10 + LTEXT "Protect my computer and data from unauthorized program activity", -1, 25, 57, 200, 10, WS_DISABLED + CHECKBOX "This option can prevent computer viruses from harming your computer or personal data, but selecting it might cause the program to function improperly.", 14001, 25, 68, 200, 30, WS_DISABLED | BS_MULTILINE + CHECKBOX "The following user:", 14002, 10, 100, 90, 10 + LTEXT "User name:", -1, 20, 118, 54, 10 COMBOBOX 14003, 75, 115, 100, 15, CBS_DROPDOWNLIST | WS_VSCROLL | WS_VISIBLE | WS_TABSTOP PUSHBUTTON "...", 14004, 180, 115, 30, 14, WS_TABSTOP - LTEXT "Palavra-passe:", -1, 20, 143, 53, 10 + LTEXT "Password:", -1, 20, 143, 53, 10 EDITTEXT 14005, 74, 140, 100, 14, ES_LEFT | WS_BORDER | WS_GROUP PUSHBUTTON "...", 14006, 180, 140, 30, 14, WS_TABSTOP PUSHBUTTON "OK", 14007, 57, 170, 60, 14, WS_TABSTOP - PUSHBUTTON "Cancelar", 14008, 122, 170, 60, 14, WS_TABSTOP + PUSHBUTTON "Cancel", 14008, 122, 170, 60, 14, WS_TABSTOP END BITBUCKET_PROPERTIES_DLG DIALOGEX 0, 0, 240, 190 STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "propriedades da Reciclagem" +CAPTION "Recycle Bin Properties" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 10, 10, 220, 50 - GROUPBOX "propriedades para as localizações seleccionadas", -1, 10, 72, 220, 70 - RADIOBUTTON "&Tamanho personalizado:", 14001, 20, 90, 80, 10, WS_TABSTOP + GROUPBOX "Settings for selected location", -1, 10, 72, 220, 70 + RADIOBUTTON "&Custom size:", 14001, 20, 90, 80, 10, WS_TABSTOP EDITTEXT 14002, 106, 87, 50, 14, WS_TABSTOP | ES_NUMBER - LTEXT "Tamanho M&áximo(MB):", -1, 20, 105, 70, 10 - RADIOBUTTON "Não mover os ficheiros para a &Reciclagem. Apagá-los definitivamente.", 14003, 20, 117, 170, 20, BS_MULTILINE | WS_TABSTOP - AUTOCHECKBOX "&Mostrar ecrân de confirmação de eliminação", 14004, 20, 155, 140, 10, WS_TABSTOP + LTEXT "M&aximum size(MB):", -1, 20, 105, 70, 10 + RADIOBUTTON "Do not move files to the &Recycle Bin. Remove files immediately when deleted.", 14003, 20, 117, 170, 20, BS_MULTILINE | WS_TABSTOP + AUTOCHECKBOX "&Display delete confirmation dialog", 14004, 20, 155, 140, 10, WS_TABSTOP END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Abre com..." +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN ICON IDI_SHELL_OPEN_WITH, -1, 8, 12, 21, 20 - LTEXT "Escolha o programa que quer utilizar para abrir este ficheiro:", -1, 44, 12, 211, 10 - LTEXT "Ficheiro: ", 14001, 44, 25, 188, 10 - GROUPBOX "&Programas", -1, 7, 42, 249, 187 + LTEXT "Choose the program you want to use to open this file:", -1, 44, 12, 211, 10 + LTEXT "File: ", 14001, 44, 25, 188, 10 + GROUPBOX "&Programs", -1, 7, 42, 249, 187 LISTBOX 14002, 16 ,57, 230, 130, LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP, WS_EX_STATICEDGE - AUTOCHECKBOX "&Utilizar sempre o programa seleccionado para abrir este tipo de ficheiros", 14003, 20, 193, 225, 10 - PUSHBUTTON "&Seleccione...", 14004, 198, 207, 50, 14 + AUTOCHECKBOX "&Always use the selected program to open this kind of file", 14003, 20, 193, 225, 10 + PUSHBUTTON "&Browse...", 14004, 198, 207, 50, 14 PUSHBUTTON "OK", 14005, 150, 236, 50, 14 - PUSHBUTTON "Cancelar", 14006, 206, 236, 50, 14 + PUSHBUTTON "Cancel", 14006, 206, 236, 50, 14 END FOLDER_OPTIONS_GENERAL_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Geral" +CAPTION "General" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Tarefas", -1, 7, 10, 249, 45 + GROUPBOX "Tasks", -1, 7, 10, 249, 45 ICON "", 30109, 14, 25, 21, 20, SS_REALSIZECONTROL - AUTORADIOBUTTON "Mostrar tarefas comuns nas &pastas", 14001, 40, 25, 120, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Utilizar pastas class&icas ReactOS", 14002, 40, 37, 120, 10, WS_TABSTOP | WS_GROUP - GROUPBOX "Procurar pastas", -1, 7, 60, 249, 45, WS_TABSTOP + AUTORADIOBUTTON "Show common tasks in &folders", 14001, 40, 25, 120, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Use ReactOS class&ic folders", 14002, 40, 37, 120, 10, WS_TABSTOP | WS_GROUP + GROUPBOX "Browse folders", -1, 7, 60, 249, 45, WS_TABSTOP ICON "", 30110, 14, 70, 21, 20, SS_REALSIZECONTROL - AUTORADIOBUTTON "Abrir cada pasta na &mesma janela", 14004, 40, 70, 140, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Abrir cada pasta na sua &janela", 14005, 40, 82, 140, 10, WS_TABSTOP | WS_GROUP - GROUPBOX "Seleccione a seguinte opção", -1, 7, 110, 249, 60 + AUTORADIOBUTTON "Open each folder in the sa&me window", 14004, 40, 70, 140, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Open each folder in its own &window", 14005, 40, 82, 140, 10, WS_TABSTOP | WS_GROUP + GROUPBOX "Click items as follows", -1, 7, 110, 249, 60 ICON "", 30111, 14, 120, 21, 20, SS_REALSIZECONTROL - AUTORADIOBUTTON "&Click simples para abrir um item", 14007, 40, 120, 170, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Sublinhar os títulos dos ícones mantendo o aspecto do &browser", 14008, 50, 132, 170, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "Sublinhar os títulos dos ícones apenas quando &aponto para eles", 14009, 50, 144, 170, 10, WS_TABSTOP | WS_GROUP - AUTORADIOBUTTON "&Duplo-click para abrir um item (um click para seleccionar)", 14010, 40, 156, 170, 10, WS_TABSTOP | WS_GROUP - PUSHBUTTON "&Restaurar valores por defeito", 14011, 180, 180, 60, 14, WS_TABSTOP + AUTORADIOBUTTON "&Single-click to open an item (point to select)", 14007, 40, 120, 170, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Underline icon titles consistent with my &browser", 14008, 50, 132, 170, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "Underline icon titles only when I &point at them", 14009, 50, 144, 170, 10, WS_TABSTOP | WS_GROUP + AUTORADIOBUTTON "&Double-click to open an item (single-click to select)", 14010, 40, 156, 170, 10, WS_TABSTOP | WS_GROUP + PUSHBUTTON "&Restore Defaults", 14011, 180, 180, 60, 14, WS_TABSTOP END FOLDER_OPTIONS_VIEW_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Ver" +CAPTION "View" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN -GROUPBOX "Vistas das Pastas", -1, 7, 10, 249, 60 +GROUPBOX "Folder views", -1, 7, 10, 249, 60 //ICON -LTEXT "Pode aplicar a vista (como detalhes ou títulos) que\nestá a usar para esta pasta para todas as pastas.", -1, 60, 20, 180, 20 -PUSHBUTTON "Applicar a T&odas as Pastas", 14001, 60, 50, 80, 14, WS_TABSTOP -PUSHBUTTON "&Reiniciar todas as Pastas", 14002, 150, 50, 80, 14, WS_TABSTOP -LTEXT "Definições avançadas:", -1, 7, 80, 100, 10 +LTEXT "You can apply the view(such as Details or Tiles) that\nyou are using for this folder to all folders.", -1, 60, 20, 180, 20 +PUSHBUTTON "Apply to A&ll Folders", 14001, 60, 50, 80, 14, WS_TABSTOP +PUSHBUTTON "&Reset All Folders", 14002, 150, 50, 80, 14, WS_TABSTOP +LTEXT "Advanced settings:", -1, 7, 80, 100, 10 CONTROL "", 14003, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 7, 90, 249, 120 -PUSHBUTTON "Restaurar valores por &Defeito", 14004, 180, 210, 80, 14, WS_TABSTOP +PUSHBUTTON "Restore &Defaults", 14004, 180, 210, 80, 14, WS_TABSTOP END FOLDER_OPTIONS_FILETYPES_DLG DIALOGEX 0, 0, 264, 256 STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION -CAPTION "Tipos de Ficheiros" +CAPTION "File Types" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN -LTEXT "&Tipos de ficheiros registados:", -1, 7, 10, 70, 10 +LTEXT "Registered file &types:", -1, 7, 10, 70, 10 CONTROL "", 14000, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | WS_BORDER | WS_TABSTOP, 7, 20, 249, 80 -PUSHBUTTON "&Novo", 14001, 120, 110, 50, 14, WS_TABSTOP -PUSHBUTTON "&Apagar", 14002, 180, 110, 50, 14, WS_TABSTOP -GROUPBOX "Detalhes para '%s' extensão", 14003, 7, 130, 249, 70 -LTEXT "Abre com:", -1, 12, 140, 40, 10 +PUSHBUTTON "&New", 14001, 120, 110, 50, 14, WS_TABSTOP +PUSHBUTTON "&Delete", 14002, 180, 110, 50, 14, WS_TABSTOP +GROUPBOX "Details for '%s' extension", 14003, 7, 130, 249, 70 +LTEXT "Opens with:", -1, 12, 140, 40, 10 //ICON -LTEXT "Appnome", 14005, 100, 140, 40, 10 -PUSHBUTTON "&Mudar...", 14006, 180, 140, 50, 14, WS_TABSTOP -LTEXT "Ficheiros com extensão '%s' são do tipo '%s'. Para\nmudar definições que afectam todos '%s' ficheiros, click\nAvançado.", 14007, 12, 155, 160, 30 -PUSHBUTTON "A&vançado", 14008, 180, 175, 50, 14, WS_TABSTOP +LTEXT "Appname", 14005, 100, 140, 40, 10 +PUSHBUTTON "&Change...", 14006, 180, 140, 50, 14, WS_TABSTOP +LTEXT "Files with extension '%s' are of type '%s'. To\nchange settings that affect all '%s' files, click\nAdvanced.", 14007, 12, 155, 160, 30 +PUSHBUTTON "Ad&vanced", 14008, 180, 175, 50, 14, WS_TABSTOP END CONFIRM_FILE_REPLACE_DLG DIALOGEX 0, 0, 282, 143 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Confirmar Substituição de Ficheiros" +CAPTION "Confirm File Replace" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Sim", IDYES, 20, 122, 60, 14 - PUSHBUTTON "Sim para &Todos", 12807, 85, 122, 60, 14 - PUSHBUTTON "&Não", IDNO, 150, 122, 60, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 215, 122, 60, 14 + DEFPUSHBUTTON "&Yes", IDYES, 20, 122, 60, 14 + PUSHBUTTON "Yes to &All", 12807, 85, 122, 60, 14 + PUSHBUTTON "&No", IDNO, 150, 122, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 215, 122, 60, 14 ICON 146, -1, 11, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "Esta pasta já contém um ficheiro com o nome '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX - LTEXT "Esta pasta já contém um ficheiro sómente de leitura com o nome '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX - LTEXT "Esta pasta já contém um ficheiro de sistema com o nome '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX - LTEXT "pretende substituir o ficheiro existente", -1, 44, 35, 228, 10, SS_NOPREFIX - LTEXT "(data e tamanho desconhecido)", 12302, 79, 51, 198, 20, SS_NOPREFIX + LTEXT "This folder already contains a file named '%2'.", 12291, 44, 10, 231, 22, SS_NOPREFIX + LTEXT "This folder already contains a read-only file named '%2'.", 12292, 41, 10, 222, 22, SS_NOPREFIX + LTEXT "This folder already contains a system file named '%2'.", 12293, 41, 10, 222, 22, SS_NOPREFIX + LTEXT "Would you like to replace the existing file", -1, 44, 35, 228, 10, SS_NOPREFIX + LTEXT "(unknown date and size)", 12302, 79, 51, 198, 20, SS_NOPREFIX ICON "", 12300, 50, 49, 21, 20, SS_REALSIZECONTROL - LTEXT "por este?", -1, 44, 75, 228, 10, SS_NOPREFIX - LTEXT "(data e tamanho desconhecido)", 12303, 79, 91, 198, 20, SS_NOPREFIX + LTEXT "with this one?", -1, 44, 75, 228, 10, SS_NOPREFIX + LTEXT "(unknown date and size)", 12303, 79, 91, 198, 20, SS_NOPREFIX ICON "", 12301, 50, 89, 21, 20, SS_REALSIZECONTROL END LOGOFF_DLG DIALOGEX 0, 0, 190, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Terminar sessão ReactOS" +CAPTION "Log Off ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 45, 14344, 10, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "Tem a certeza que quer terminar a sessão?", -1, 43, 11, 140, 22 - DEFPUSHBUTTON "&Terminar a sessão", IDOK, 57, 40, 60, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 122, 40, 60, 14 + LTEXT "Are you sure you want to log off?", -1, 43, 11, 140, 22 + DEFPUSHBUTTON "&Log Off", IDOK, 57, 40, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 122, 40, 60, 14 END DISCONNECT_DLG DIALOGEX 0, 0, 190, 60 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Encerrar ReactOS" +CAPTION "Disconnect ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 49, 14346, 10, 10, 21, 20, SS_REALSIZECONTROL - LTEXT "Tem a certeza que quer encerrar?", -1, 49, 12, 137, 23 - DEFPUSHBUTTON "&Encerrar", IDOK, 57, 40, 60, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 123, 40, 60, 14 + LTEXT "Are you sure you want to disconnect?", -1, 49, 12, 137, 23 + DEFPUSHBUTTON "&Disconnect", IDOK, 57, 40, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 123, 40, 60, 14 END AUTOPLAY1_DLG DIALOGEX 0, 0, 227, 218 @@ -479,42 +478,42 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLIN CAPTION "AutoPlay" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Seleccione o tipo de conteúdo, depois escolha uma acção para o RactOS executar automáticamente quando este tipo for usado neste dispositivo:", 1000, 7, 7, 215, 20 + LTEXT "&Select a content type, then choose an action for ReactOS to perform automatically when that type is used in this device:", 1000, 7, 7, 215, 20 CONTROL "", 1001, "COMBOBOXEX32", WS_TABSTOP | 0x00000043, 7, 27, 212, 200 - GROUPBOX "Acções", -1, 7, 45, 212, 146 - AUTORADIOBUTTON "Seleccione uma acção para &executar:", 1005, 14, 54, 202, 10, WS_GROUP + GROUPBOX "Actions", -1, 7, 45, 212, 146 + AUTORADIOBUTTON "Select an action to &perform:", 1005, 14, 54, 202, 10, WS_GROUP CONTROL "LIST2", 1002, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 22, 66, 192, 107 - AUTORADIOBUTTON "pergunte-me sempre para escolher uma &acção", 1006, 14, 177, 202, 10 - PUSHBUTTON "&Restaurar valores por defeito", 1008, 108, 197, 110, 14, WS_DISABLED + AUTORADIOBUTTON "Prompt me each time to &choose an action", 1006, 14, 177, 202, 10 + PUSHBUTTON "&Restore Defaults", 1008, 108, 197, 110, 14, WS_DISABLED END MIXED_CONTENT1_DLG DIALOGEX 0, 0, 227, 207 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION -CAPTION "Conteúdos mistos" +CAPTION "Mixed Content" FONT 8, "MS Shell Dlg" BEGIN ICON "", 1000, 5, 7, 21, 20 - LTEXT "Este disco ou dispositivo contém mais de um tipo de conteúdo.", 1001, 32, 7, 191, 20 - LTEXT "O que pretende que o ReactOS faça?", 1002, 32, 31, 188, 8 + LTEXT "This disk or device contains more than one type of content.", 1001, 32, 7, 191, 20 + LTEXT "What do you want ReactOS to do?", 1002, 32, 31, 188, 8 CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 43, 188, 139 DEFPUSHBUTTON "OK", IDOK, 96, 186, 60, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 160, 186, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 160, 186, 60, 14 END MIXED_CONTENT2_DLG DIALOGEX 0, 0, 227, 206 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CAPTION -CAPTION "Conteúdo misto" +CAPTION "Mixed Content" FONT 8, "MS Shell Dlg" BEGIN ICON "", 1000, 5, 7, 21, 20 - LTEXT "ReactOS pode executar a mesma acção de cada vez que inserir um disco ou um dispositivo com este tipo de ficheiro:", 1001, 30, 7, 193, 20 + LTEXT "ReactOS can perform the same action each time you insert a disk or connect a device with this kind of file:", 1001, 30, 7, 193, 20 ICON "", 1005, 32, 27, 11, 10, SS_REALSIZECONTROL EDITTEXT 1006, 49, 28, 177, 14, ES_AUTOHSCROLL | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP - LTEXT "O que pretende que o ReactOS faça?", 1002, 32, 41, 190, 8 + LTEXT "What do you want ReactOS to do?", 1002, 32, 41, 190, 8 CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 55, 188, 112 - AUTOCHECKBOX "Executar sempre a acção seleccionada.", 1004, 32, 171, 190, 10 + AUTOCHECKBOX "Always do the selected action.", 1004, 32, 171, 190, 10 DEFPUSHBUTTON "OK", IDOK, 96, 185, 60, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 160, 185, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 160, 185, 60, 14 END AUTOPLAY2_DLG DIALOGEX 0, 0, 227, 181 @@ -523,75 +522,75 @@ CAPTION "Autoplay" FONT 8, "MS Shell Dlg" BEGIN ICON "", 1000, 5, 7, 21, 20 - LTEXT "ReactOS pode executar sempre mesma acção de cada vez que inserir um disco ou um dispositivo.", 1001, 32, 7, 190, 22 - LTEXT "&O que pretende que o ReactOS faça?", 1002, 32, 31, 190, 8 + LTEXT "ReactOS can perform the same action each time you connect this device.", 1001, 32, 7, 190, 22 + LTEXT "&What do you want ReactOS to do?", 1002, 32, 31, 190, 8 CONTROL "", 1003, "SYSLISTVIEW32", WS_BORDER | WS_TABSTOP | 0x0000C04D, 32, 43, 187, 96 - AUTOCHECKBOX "&Executar sempre a acção seleccionada", 1004, 32, 143, 190, 8 + AUTOCHECKBOX "&Always perform the selected action", 1004, 32, 143, 190, 8 DEFPUSHBUTTON "OK", IDOK, 94, 160, 60, 14 - PUSHBUTTON "Cancelar", IDCANCEL, 159, 160, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 159, 160, 60, 14 END SHUTDOWN_DLG DIALOGEX 0, 0, 211, 103 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Encerrar ReactOS" +CAPTION "Shut Down ReactOS" FONT 8, "MS Shell Dlg" BEGIN ICON 8240, -1, 6, 6, 21, 20, SS_REALSIZECONTROL | WS_GROUP - LTEXT "O que pretende aue o computador faça?", -1, 39, 7, 167, 10 + LTEXT "What do you want the computer to do?", -1, 39, 7, 167, 10 COMBOBOX 8224, 39, 20, 165, 200, CBS_DROPDOWNLIST | WS_VSCROLL - LTEXT "Manter a sessão, deixando o computador a correr em baixa energia. O computador arranca quando tocar numa tecla ou mover o rato.", 8225, 39, 40, 167, 37 + LTEXT "Maintains your session, keeping the computer running on low power with data still in memory. The computer wakes up when you press a key or move the mouse.", 8225, 39, 40, 167, 37 DEFPUSHBUTTON "OK", 1, 7, 82, 60, 14, WS_GROUP - PUSHBUTTON "Cancelar", IDCANCEL, 75, 82, 60, 14 - PUSHBUTTON "&Ajuda", IDHELP, 144, 82, 60, 14 + PUSHBUTTON "Cancel", IDCANCEL, 75, 82, 60, 14 + PUSHBUTTON "&Help", IDHELP, 144, 82, 60, 14 END FORMAT_DLG DIALOGEX 50, 50, 184, 218 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Formatar" +CAPTION "Format" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Iniciar", IDOK, 53, 198, 60, 14 - PUSHBUTTON "&Fechar", IDCANCEL, 118, 198, 60, 14 - LTEXT "Ca&pacidade:", -1, 7, 6, 169, 9 + DEFPUSHBUTTON "&Start", IDOK, 53, 198, 60, 14 + PUSHBUTTON "&Close", IDCANCEL, 118, 198, 60, 14 + LTEXT "Ca&pacity:", -1, 7, 6, 169, 9 COMBOBOX 28673, 7, 17, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "&Sistema de Ficheiros", -1, 7, 35, 170, 9 + LTEXT "&File system", -1, 7, 35, 170, 9 COMBOBOX 28677, 7, 46, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP CONTROL "", 28678, "MSCTLS_PROGRESS32", 0, 7, 181, 170, 8 - LTEXT "&Tamanho da unidade de alocação", -1, 7, 64, 170, 9 + LTEXT "&Allocation unit size", -1, 7, 64, 170, 9 COMBOBOX 28680, 7, 75, 170, 200, CBS_DROPDOWNLIST | WS_VSCROLL | NOT WS_TABSTOP - LTEXT "&Nome do Volume ", -1, 7, 93, 170, 9 + LTEXT "Volume &label", -1, 7, 93, 170, 9 EDITTEXT 28679, 7, 103, 170, 13, ES_AUTOHSCROLL - GROUPBOX "&Opções", 4610, 7, 121, 170, 49 - AUTOCHECKBOX "Formatação &Rápida", 28674, 16, 135, 155, 10 - AUTOCHECKBOX "&Permitir Compressão", 28675, 16, 152, 155, 10 + GROUPBOX "Format &options", 4610, 7, 121, 170, 49 + AUTOCHECKBOX "&Quick Format", 28674, 16, 135, 155, 10 + AUTOCHECKBOX "&Enable Compression", 28675, 16, 152, 155, 10 END CHKDSK_DLG DIALOGEX 50, 50, 194, 120 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Verificar Disco" +CAPTION "Check Disk" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "Iniciar", IDOK, 53, 100, 60, 14 - GROUPBOX "Opções verificação do disco", -1, 7, 6, 179, 50 - PUSHBUTTON "Cancelar", IDCANCEL, 118, 100, 60, 14 - AUTOCHECKBOX "Reparar automáticamente erros nos ficheiros do sistema", 14000, 16, 15, 155, 10 - AUTOCHECKBOX "&Procurar e tentar reparar sectores danificados", 14001, 16, 30, 165, 10 + DEFPUSHBUTTON "Start", IDOK, 53, 100, 60, 14 + GROUPBOX "Check disk options", -1, 7, 6, 179, 50 + PUSHBUTTON "Cancel", IDCANCEL, 118, 100, 60, 14 + AUTOCHECKBOX "Automatically fix file system errors", 14000, 16, 15, 155, 10 + AUTOCHECKBOX "&Scan for and attempt recovery of bad sectors", 14001, 16, 30, 165, 10 CONTROL "", 14002, "MSCTLS_PROGRESS32", 16, 7, 60, 170, 8 LTEXT "", 14003, 60, 80, 170, 10 END IDD_PICK_ICON_DIALOG DIALOGEX 0, 0, 237, 204 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CONTEXTHELP | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Trocar Icone" +CAPTION "Change Icon" FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - LTEXT "Nome do ficheiro:", -1, 7, 14, 208, 10 - PUSHBUTTON "procurar...",IDC_BUTTON_PATH, 148, 24,67,14 + LTEXT "Filename:", -1, 7, 14, 208, 10 + PUSHBUTTON "Browse...",IDC_BUTTON_PATH, 148, 24,67,14 EDITTEXT IDC_EDIT_PATH, 6, 24, 135, 15, ES_AUTOHSCROLL LTEXT "Icons:", -1, 7, 47, 208, 10 LISTBOX IDC_PICKICON_LIST,7,57,208,119,LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP,WS_EX_STATICEDGE DEFPUSHBUTTON "OK",IDOK, 107, 181,50, 14 - PUSHBUTTON "Cancelar",IDCANCEL, 167, 181, 50, 14 + PUSHBUTTON "Cancel",IDCANCEL, 167, 181, 50, 14 END STRINGTABLE DISCARDABLE @@ -601,32 +600,32 @@ BEGIN IDS_SHV_COLUMN2 "Tamanho" IDS_SHV_COLUMN3 "Tipo" IDS_SHV_COLUMN4 "Modificado" - IDS_SHV_COLUMN5 "propriedades" + IDS_SHV_COLUMN5 "Atributos" IDS_SHV_COLUMN6 "Tamanho" IDS_SHV_COLUMN7 "Disponível" IDS_SHV_COLUMN8 "Nome" IDS_SHV_COLUMN9 "Comentários" IDS_SHV_COLUMN10 "Dono" IDS_SHV_COLUMN11 "Grupo" - IDS_SHV_COLUMN12 "Nome do ficheiro" - IDS_SHV_COLUMN13 "Categoria" - IDS_SHV_COLUMN_DELFROM "Localização original" - IDS_SHV_COLUMN_DELDATE "Data da eliminação" - IDS_SHV_COLUMN_FONTTYPE "Tipo de letra" - IDS_SHV_COLUMN_WORKGROUP "Grupo de trabalho" - IDS_SHV_NETWORKLOCATION "localizações na rede" - IDS_SHV_COLUMN_DOCUMENTS "Documentos" - IDS_SHV_COLUMN_STATUS "Estado" - IDS_SHV_COLUMN_COMMENTS "Commentários" - IDS_SHV_COLUMN_LOCATION "Localização" - IDS_SHV_COLUMN_MODEL "Modelo" + IDS_SHV_COLUMN12 "Filename" + IDS_SHV_COLUMN13 "Category" + IDS_SHV_COLUMN_DELFROM "Original location" + IDS_SHV_COLUMN_DELDATE "Date deleted" + IDS_SHV_COLUMN_FONTTYPE "Fonttype" + IDS_SHV_COLUMN_WORKGROUP "Workgroup" + IDS_SHV_NETWORKLOCATION "Network Location" + IDS_SHV_COLUMN_DOCUMENTS "Documents" + IDS_SHV_COLUMN_STATUS "Status" + IDS_SHV_COLUMN_COMMENTS "Comments" + IDS_SHV_COLUMN_LOCATION "Location" + IDS_SHV_COLUMN_MODEL "Model" /* special folders */ IDS_DESKTOP "Ambiente de trabalho" IDS_MYCOMPUTER "O Meu Computador" - IDS_RECYCLEBIN_FOLDER_NAME "Reciclagem" - IDS_CONTROLPANEL "Painel de Controlo" - IDS_ADMINISTRATIVETOOLS "Ferramentas Administrativas" + IDS_RECYCLEBIN_FOLDER_NAME "Trash" + IDS_CONTROLPANEL "Control Panel" + IDS_ADMINISTRATIVETOOLS "Administrative Tools" /* context menus */ IDS_VIEW_LARGE "Ícones &grandes" @@ -635,15 +634,15 @@ BEGIN IDS_VIEW_DETAILS "&Detalhes" IDS_SELECT "Seleccionar" IDS_OPEN "Abrir" - IDS_CREATELINK "Criar &Atalho" - IDS_COPY "Copiar" - IDS_DELETE "Apagar" - IDS_PROPERTIES "Propriedades" - IDS_CUT "Cortar" - IDS_RESTORE "Restaurar" - IDS_FORMATDRIVE "Formatar..." - IDS_RENAME "Renaomear" - IDS_INSERT "Inserir" + IDS_CREATELINK "Create &Link" + IDS_COPY "Copy" + IDS_DELETE "Delete" + IDS_PROPERTIES "Properties" + IDS_CUT "Cut" + IDS_RESTORE "Restore" + IDS_FORMATDRIVE "Format..." + IDS_RENAME "Rename" + IDS_INSERT "Insert" IDS_CREATEFOLDER_DENIED "Não é possível criar nova pasta: Permissão negada." IDS_CREATEFOLDER_CAPTION "Erro durante a criação da nova pasta" @@ -651,25 +650,23 @@ BEGIN IDS_DELETEFOLDER_CAPTION "Confirmar exclusão da pasta" IDS_DELETEITEM_TEXT "Tem certeza que deseja excluir '%1'?" IDS_DELETEMULTIPLE_TEXT "Tem certeza que deseja excluir estes %1 itens?" - IDS_DELETESELECTED_TEXT "Tem a certeza que quer eliminar os item(s) seleccionado(s)?" - IDS_TRASHITEM_TEXT "Tem a certeza que quer enviar '%1' para a reciclagem?" - IDS_TRASHFOLDER_TEXT "Tem a certeza que quer enviar '%1' e todo o seu conteúdo para a reciclagem?" - IDS_TRASHMULTIPLE_TEXT "Tem a certeza que quer enviar este '%1' item para a reciclagem?" - IDS_CANTTRASH_TEXT "O item '%1' não pode ser enviado para a reciclagem. Em vez disso pretende eliminá-lo?" - IDS_OVERWRITEFILE_TEXT "Esta pasta já contém um ficheiro com o nome '%1'.\n\npretende substituí-lo?" + IDS_DELETESELECTED_TEXT "Are you sure you want to delete the selected item(s)?" + IDS_TRASHITEM_TEXT "Are you sure that you want to send '%1' to the Trash?" + IDS_TRASHFOLDER_TEXT "Are you sure that you want to send '%1' and all its content to the Trash?" + IDS_TRASHMULTIPLE_TEXT "Are you sure that you want to send these %1 items to the Trash?" + IDS_CANTTRASH_TEXT "The item '%1' can't be sent to Trash. Do you want to delete it instead?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" IDS_OVERWRITEFILE_CAPTION "Confirmar substituição de ficheiro" - IDS_OVERWRITEFOLDER_TEXT "Esta pasta já contém uma pasta com o nome '%1'.\n\n"\ - "Se os ficheiros na pasta de destino tiverem o mesmo nome dos ficheiros na\n"\ - "pasta seleccionada, serão substituídos. Ainda assim pretende mover ou copiar\n"\ - "a pasta?" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" /* message box strings */ IDS_RESTART_TITLE "Reiniciar" IDS_RESTART_PROMPT "Deseja simular a reinicialização do Windows?" IDS_SHUTDOWN_TITLE "Desligar" - IDS_SHUTDOWN_PROMPT "Deseja finalizar esta sessão do ReactOS?" - IDS_LOGOFF_TITLE "Terminar a sessão" - IDS_LOGOFF_PROMPT "Pretende terminar a sessão?" + IDS_SHUTDOWN_PROMPT "Deseja finalizar esta sessão do Wine?" /* shell folder path default values */ IDS_PROGRAMS "Menu Iniciar\\Programas" @@ -682,12 +679,12 @@ BEGIN IDS_MYMUSIC "As Minhas Músicas" IDS_MYVIDEO "Os Meus Vídeos" IDS_DESKTOPDIRECTORY "Ambiente de Trabalho" - IDS_NETHOOD "Visinhança na rede" + IDS_NETHOOD "NetHood" IDS_TEMPLATES "Modelos" - IDS_APPDATA "Dados de Aplicação" + IDS_APPDATA "Application Data" IDS_PRINTHOOD "PrintHood" - IDS_LOCAL_APPDATA "Definições locais\\Dados de Aplicação" - IDS_INTERNET_CACHE "Definições locais\\Ficheiros Temporários da Internet" + IDS_LOCAL_APPDATA "Definições locais\\Application Data" + IDS_INTERNET_CACHE "Definições locais\\Temporary Internet Files" IDS_COOKIES "Cookies" IDS_HISTORY "Definições locais\\Histórico" IDS_PROGRAM_FILES "Programas" @@ -698,62 +695,60 @@ BEGIN IDS_COMMON_MUSIC "Os Meus Documentos\\As Minhas Músicas" IDS_COMMON_PICTURES "Os Meus Documentos\\As Minhas Imagens" IDS_COMMON_VIDEO "Os Meus Documentos\\Os Meus Vídeos" - IDS_CDBURN_AREA "Definições locais\\Dados de Aplicação\\Microsoft\\CD Burning" - IDS_NETWORKPLACE "Os Meus Locais da Rede" + IDS_CDBURN_AREA "Definições locais\\Application Data\\Microsoft\\CD Burning" + IDS_NETWORKPLACE "My Network Places" - IDS_NEWFOLDER "Nova Pasta" + IDS_NEWFOLDER "New Folder" - IDS_DRIVE_FIXED "Disco Local" + IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Disco de Rede" + IDS_DRIVE_NETWORK "Network Disk" - IDS_OPEN_WITH "Abre com..." - IDS_OPEN_WITH_CHOOSE "Escolha Programa..." + IDS_OPEN_WITH "Open With" + IDS_OPEN_WITH_CHOOSE "Choose Program..." - IDS_SHELL_ABOUT_AUTHORS "&Autores" - IDS_SHELL_ABOUT_BACK "< &Trás" + IDS_SHELL_ABOUT_AUTHORS "&Authors" + IDS_SHELL_ABOUT_BACK "< &Back" FCIDM_SHVIEW_NEW "Novo" FCIDM_SHVIEW_NEWFOLDER "&Pasta" FCIDM_SHVIEW_NEWLINK "&Atalho" - IDS_FOLDER_OPTIONS "Opções das Pastas" - IDS_RECYCLEBIN_LOCATION "Localização da Reciclagem" - IDS_RECYCLEBIN_DISKSPACE "Espaço Disponível" - IDS_EMPTY_BITBUCKET "Esvaziar Reciclagem" - IDS_PICK_ICON_TITLE "Escolha Ícone" - IDS_PICK_ICON_FILTER "Ficheiros de Ícones(*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0" - IDS_OPEN_WITH_FILTER "Ficheiros Executáveis\0*.exe\0" - IDS_DIRECTORY "Pasta" - IDS_VIRTUAL_DRIVER "Driver de Dispositivo Virtual" + IDS_FOLDER_OPTIONS "Folder Options" + IDS_RECYCLEBIN_LOCATION "Recycle Bin Location" + IDS_RECYCLEBIN_DISKSPACE "Space Available" + IDS_EMPTY_BITBUCKET "Empty Recycle Bin" + IDS_PICK_ICON_TITLE "Choose Icon" + IDS_PICK_ICON_FILTER "Icon Files(*.ico, *.icl, *.exe, *.dll)\0*.ico;*.icl;*.exe;*.dll\0" + IDS_OPEN_WITH_FILTER "Executable Files\0*.exe\0" + IDS_DIRECTORY "Folder" + IDS_VIRTUAL_DRIVER "Virtual Device Driver" IDS_BAT_FILE "ReactOS Batch File" IDS_CMD_FILE "ReactOS Command Script" - IDS_COM_FILE "Aplicação Dos" - IDS_CPL_FILE "Item do Painel de Controle" + IDS_COM_FILE "Dos Application" + IDS_CPL_FILE "Control Panel Item" IDS_CUR_FILE "Cursor" - IDS_DLL_FILE "Extensão da Aplicação" - IDS_DRV_FILE "Driver do Dispositivo" - IDS_EXE_FILE "Aplicação" - IDS_FON_FILE "Ficheiro de tipo de letra" - IDS_TTF_FILE "Tipo de letra TrueType" - IDS_HLP_FILE "Ficheiro de Ajuda" - IDS_INI_FILE "Definições" - IDS_LNK_FILE "Atalho" - IDS_SYS_FILE "Ficheiro de Sistema" - - IDS_OPEN_VERB "Abrir" - IDS_RUNAS_VERB "Executar como " - IDS_EDIT_VERB "Editar" - IDS_FIND_VERB "Procurar" - IDS_PRINT_VERB "Imprimir" - IDS_PLAY_VERB "Reproduzir" - IDS_PREVIEW_VERB "Previzualizar" - - IDS_FILE_FOLDER "%u Ficheiros, %u Pastas" - IDS_PRINTERS "Impressoras" - IDS_FONTS "Tipos de Letras" - IDS_INSTALLNEWFONT "Instalar novo tipo de letra..." - - IDS_DEFAULT_CLUSTER_SIZE "Tamanho da unidade de atribuição" - IDS_COPY_OF "Cópia de" - - IDS_SHLEXEC_NOASSOC "Não existe um programa Windows configurado para abrir este tipo de ficheiro." + IDS_DLL_FILE "Application Extension" + IDS_DRV_FILE "Device Driver" + IDS_EXE_FILE "Application" + IDS_FON_FILE "Font file" + IDS_TTF_FILE "TrueType Font file" + IDS_HLP_FILE "Help File" + IDS_INI_FILE "Configuration Settings" + IDS_LNK_FILE "Shortcut" + IDS_SYS_FILE "System file" + + IDS_OPEN_VERB "Open" + IDS_RUNAS_VERB "Run as " + IDS_EDIT_VERB "Edit" + IDS_FIND_VERB "Find" + IDS_PRINT_VERB "Print" + IDS_PLAY_VERB "Play" + IDS_PREVIEW_VERB "Preview" + + IDS_FILE_FOLDER "%u Files, %u Folders" + IDS_PRINTERS "Printers" + IDS_FONTS "Fonts" + IDS_INSTALLNEWFONT "Install New Font..." + + IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" + IDS_COPY_OF "Copy of" END diff --git a/dll/win32/shell32/lang/ro-RO.rc b/dll/win32/shell32/lang/ro-RO.rc index fb24c2ba437..656bc410bc9 100644 --- a/dll/win32/shell32/lang/ro-RO.rc +++ b/dll/win32/shell32/lang/ro-RO.rc @@ -361,7 +361,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -668,8 +668,6 @@ BEGIN IDS_RESTART_PROMPT "Vreți să reporniți sistemul?" IDS_SHUTDOWN_TITLE "Închidere" IDS_SHUTDOWN_PROMPT "Vreți să închideți computerul?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Meniu Start\\Programe" @@ -753,8 +751,6 @@ BEGIN IDS_INSTALLNEWFONT "Instalare font nou..." IDS_DEFAULT_CLUSTER_SIZE "Mărime de alocare implicită" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END #pragma code_page(default) diff --git a/dll/win32/shell32/lang/ru-RU.rc b/dll/win32/shell32/lang/ru-RU.rc index daf4f2ce16b..7d6e1e1e06e 100644 --- a/dll/win32/shell32/lang/ru-RU.rc +++ b/dll/win32/shell32/lang/ru-RU.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Âûáîð ïðîãðàììû" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -664,8 +664,6 @@ BEGIN IDS_RESTART_PROMPT "Âû äåéñòâèòåëüíî õîòèòå ïåðåçàãðóçèòü ReactOS?" IDS_SHUTDOWN_TITLE "Âûêëþ÷èòü ïèòàíèå" IDS_SHUTDOWN_PROMPT "Çàêîí÷èòü ðàáîòó ñ ReactOS?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Ãëàâíîå ìåíþ\\Ïðîãðàììû" @@ -750,6 +748,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Âûäåëÿåìûé ïî óìîë÷àíèþ ðàçìåð" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc index 897564b799a..2ec58ec12ae 100644 --- a/dll/win32/shell32/lang/sk-SK.rc +++ b/dll/win32/shell32/lang/sk-SK.rc @@ -364,7 +364,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Otvori v programe" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -671,8 +671,6 @@ BEGIN IDS_RESTART_PROMPT "Naozaj chcete reštartova systém?" IDS_SHUTDOWN_TITLE "Vypnú" IDS_SHUTDOWN_PROMPT "Naozaj chcete vypnú poèítaè?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Ponuka Štart\\Programy" @@ -757,6 +755,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Predvolená alokaèná ve¾kos" //Default allocation size IDS_COPY_OF "Kópia" //Copy of - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/sl-SI.rc b/dll/win32/shell32/lang/sl-SI.rc index 9789ec3841c..876be4b4927 100644 --- a/dll/win32/shell32/lang/sl-SI.rc +++ b/dll/win32/shell32/lang/sl-SI.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "Noben Okenski program ni nastavljen, da bi odpiral ta tip datotek." END diff --git a/dll/win32/shell32/lang/sv-SE.rc b/dll/win32/shell32/lang/sv-SE.rc index 4ddd5c36520..e7a520f5ba4 100644 --- a/dll/win32/shell32/lang/sv-SE.rc +++ b/dll/win32/shell32/lang/sv-SE.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/tr-TR.rc b/dll/win32/shell32/lang/tr-TR.rc index 633936f625a..49a154c3408 100644 --- a/dll/win32/shell32/lang/tr-TR.rc +++ b/dll/win32/shell32/lang/tr-TR.rc @@ -358,7 +358,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -665,8 +665,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Oturumu Kapat" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programlar" @@ -751,6 +749,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/uk-UA.rc b/dll/win32/shell32/lang/uk-UA.rc index 807a7c9afa3..3846965c696 100644 --- a/dll/win32/shell32/lang/uk-UA.rc +++ b/dll/win32/shell32/lang/uk-UA.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Âèá³ð ïðîãðàìè" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -666,8 +666,6 @@ BEGIN IDS_RESTART_PROMPT "Âè õî÷åòå ïåðåçàâàíòàæèòè ñèñòåìó?" IDS_SHUTDOWN_TITLE "Âèìêíóòè" IDS_SHUTDOWN_PROMPT "Âè õî÷åòå âèìêíóòè êîìï'þòåð?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -752,6 +750,4 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Ðîçì³ð êëàñòåðà çà ïðîìîâ÷àííÿì" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/zh-CN.rc b/dll/win32/shell32/lang/zh-CN.rc index aa54e3eecb6..5180db558cd 100644 --- a/dll/win32/shell32/lang/zh-CN.rc +++ b/dll/win32/shell32/lang/zh-CN.rc @@ -347,7 +347,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -654,8 +654,6 @@ BEGIN IDS_RESTART_PROMPT "ÊÇ·ñÖØÐÂÆô¶¯ÏµÍ³?" IDS_SHUTDOWN_TITLE "¹Ø»ú" IDS_SHUTDOWN_PROMPT "ÊÇ·ñ¹Ø±Õϵͳ?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -739,7 +737,5 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END diff --git a/dll/win32/shell32/lang/zh-TW.rc b/dll/win32/shell32/lang/zh-TW.rc index fcf7abf9f7b..fc76bf15798 100644 --- a/dll/win32/shell32/lang/zh-TW.rc +++ b/dll/win32/shell32/lang/zh-TW.rc @@ -359,7 +359,7 @@ BEGIN END OPEN_WITH_PROGRAMM_DLG DIALOGEX 0, 0, 264, 256 -STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION CAPTION "Open With" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN @@ -666,8 +666,6 @@ BEGIN IDS_RESTART_PROMPT "Do you want to restart the system?" IDS_SHUTDOWN_TITLE "Shutdown" IDS_SHUTDOWN_PROMPT "Do you want to shutdown?" - IDS_LOGOFF_TITLE "Log Off" - IDS_LOGOFF_PROMPT "Do you want to log off?" /* shell folder path default values */ IDS_PROGRAMS "Start Menu\\Programs" @@ -752,8 +750,6 @@ BEGIN IDS_DEFAULT_CLUSTER_SIZE "Default allocation size" IDS_COPY_OF "Copy of" - - IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file." END #pragma code_page(default) diff --git a/dll/win32/shell32/she_ocmenu.c b/dll/win32/shell32/she_ocmenu.c index 1b6adec94aa..dc66376cdea 100644 --- a/dll/win32/shell32/she_ocmenu.c +++ b/dll/win32/shell32/she_ocmenu.c @@ -719,12 +719,12 @@ static INT_PTR CALLBACK OpenWithProgrammDlg(HWND hwndDlg, UINT uMsg, WPARAM wPar if (lpdis->itemID == index) { - /* paint focused item with standard background colour */ + /* paint focused item with blue background */ HBRUSH hBrush; - hBrush = CreateSolidBrush(RGB(46, 104, 160)); + hBrush = CreateSolidBrush(RGB(0, 0, 255)); FillRect(lpdis->hDC, &lpdis->rcItem, hBrush); DeleteObject(hBrush); - preBkColor = SetBkColor(lpdis->hDC, RGB(46, 104, 160)); + preBkColor = SetBkColor(lpdis->hDC, RGB(255, 255, 255)); } else { @@ -756,10 +756,6 @@ static INT_PTR CALLBACK OpenWithProgrammDlg(HWND hwndDlg, UINT uMsg, WPARAM wPar break; } break; - case WM_CLOSE: - FreeListItems(hwndDlg); - EndDialog(hwndDlg, 0); - return TRUE; default: break; } diff --git a/dll/win32/shell32/shfldr_cpanel.c b/dll/win32/shell32/shfldr_cpanel.c index a7b92512462..57e3701d88f 100644 --- a/dll/win32/shell32/shfldr_cpanel.c +++ b/dll/win32/shell32/shfldr_cpanel.c @@ -1017,8 +1017,8 @@ ExecuteAppletFromCLSID(LPOLESTR pOleStr) dwSize = sizeof(szCmd); if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS) { - wcscpy(szCmd, L"%SystemRoot%\\Explorer.exe ::"); - wcscat(szCmd, pOleStr); + ERR("RegGetValueW failed with %u\n", GetLastError()); + return E_FAIL; } #if 0 @@ -1298,8 +1298,8 @@ static HRESULT WINAPI ICPanel_IContextMenu2_InvokeCommand( sei.hwnd = lpcmi->hwnd; sei.nShow = SW_SHOWNORMAL; sei.lpVerb = L"open"; - - if (ShellExecuteExW(&sei) == FALSE) + ShellExecuteExW(&sei); + if (sei.hInstApp <= (HINSTANCE)32) return E_FAIL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(IDS_CREATELINK)) //FIXME diff --git a/dll/win32/shell32/shfldr_fonts.c b/dll/win32/shell32/shfldr_fonts.c index 4ec244f00ab..d4f87b68b6e 100644 --- a/dll/win32/shell32/shfldr_fonts.c +++ b/dll/win32/shell32/shfldr_fonts.c @@ -979,7 +979,8 @@ static HRESULT WINAPI ISF_Fonts_IContextMenu2_InvokeCommand( pfont = _ILGetFontStruct(This->apidl); sei.lpFile = pfont->szName + pfont->offsFile; - if (ShellExecuteExW(&sei) == FALSE) + ShellExecuteExW(&sei); + if (sei.hInstApp <= (HINSTANCE)32) return E_FAIL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(4)) diff --git a/dll/win32/shell32/shlfileop.c b/dll/win32/shell32/shlfileop.c index defe95facd6..6992d187ee4 100644 --- a/dll/win32/shell32/shlfileop.c +++ b/dll/win32/shell32/shlfileop.c @@ -33,8 +33,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); #define IsDotDir(x) ((x[0] == '.') && ((x[1] == 0) || ((x[1] == '.') && (x[2] == 0)))) #define FO_MASK 0xF -#define WM_FILE (WM_USER + 1) -#define TIMER_ID (100) static const WCHAR wWildcardFile[] = {'*',0}; static const WCHAR wWildcardChars[] = {'*','?',0}; @@ -54,40 +52,6 @@ typedef struct BOOL bCancelled; } FILE_OPERATION; -#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 - -typedef struct -{ - DWORD attributes; - LPWSTR szDirectory; - LPWSTR szFilename; - LPWSTR szFullPath; - BOOL bFromWildcard; - BOOL bFromRelative; - BOOL bExists; -} FILE_ENTRY; - -typedef struct -{ - FILE_ENTRY *feFiles; - DWORD num_alloc; - DWORD dwNumFiles; - BOOL bAnyFromWildcard; - BOOL bAnyDirectories; - BOOL bAnyDontExist; -} FILE_LIST; - -typedef struct -{ - FILE_LIST * from; - FILE_LIST * to; - FILE_OPERATION * op; - DWORD Index; - HWND hDlgCtrl; - HWND hwndDlg; -}FILE_OPERATION_CONTEXT; - - /* Confirm dialogs with an optional "Yes To All" as used in file operations confirmations */ static const WCHAR CONFIRM_MSG_PROP[] = {'W','I','N','E','_','C','O','N','F','I','R','M',0}; @@ -550,163 +514,6 @@ static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest) return GetLastError(); } -static WINAPI DWORD SHOperationProgressRoutine(LARGE_INTEGER TotalFileSize, LARGE_INTEGER TotalBytesTransferred, LARGE_INTEGER StreamSize, LARGE_INTEGER StreamBytesTransferred, DWORD dwStreamNumber, DWORD dwCallbackReason, HANDLE hSourceFile, HANDLE hDestinationFile, LPVOID lpData) -{ - FILE_OPERATION_CONTEXT * Context; - LARGE_INTEGER Progress; - - /* get context */ - Context = (FILE_OPERATION_CONTEXT*)lpData; - - if (TotalBytesTransferred.QuadPart) - { - Progress.QuadPart = (TotalBytesTransferred.QuadPart * 100) / TotalFileSize.QuadPart; - } - else - { - Progress.QuadPart = 1; - } - - /* update progress bar */ - SendMessageW(Context->hDlgCtrl, PBM_SETPOS, (WPARAM)Progress.u.LowPart, 0); - - if (TotalBytesTransferred.QuadPart == TotalFileSize.QuadPart) - { - /* file was copied */ - Context->Index++; - PostMessageW(Context->hwndDlg, WM_FILE, 0, 0); - } - - return PROGRESS_CONTINUE; -} - -BOOL -QueueFile( - FILE_OPERATION_CONTEXT * Context) -{ - FILE_ENTRY * from, *to; - BOOL bRet = FALSE; - - if (Context->Index >= Context->from->dwNumFiles) - return FALSE; - - /* get current file */ - from = &Context->from->feFiles[Context->Index]; - - if (Context->op->req->fFlags != FO_DELETE) - to = &Context->to->feFiles[Context->Index]; - - /* update status */ - SendDlgItemMessageW(Context->hwndDlg, 14001, WM_SETTEXT, 0, (LPARAM)from->szFullPath); - - if (Context->op->req->wFunc == FO_COPY) - { - bRet = CopyFileExW(from->szFullPath, to->szFullPath, SHOperationProgressRoutine, (LPVOID)Context, &Context->op->bCancelled, 0); - } - else if (Context->op->req->wFunc == FO_MOVE) - { - //bRet = MoveFileWithProgressW(from->szFullPath, to->szFullPath, SHOperationProgressRoutine, (LPVOID)Context, MOVEFILE_COPY_ALLOWED); - } - else if (Context->op->req->wFunc == FO_DELETE) - { - bRet = DeleteFile(from->szFullPath); - } - - return bRet; -} - -static INT_PTR CALLBACK SHOperationDialog(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - FILE_OPERATION_CONTEXT * Context; - - Context = (FILE_OPERATION_CONTEXT*) GetWindowLongPtr(hwndDlg, DWLP_USER); - - switch(uMsg) - { - case WM_INITDIALOG: - SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG)lParam); - - /* get context */ - Context = (FILE_OPERATION_CONTEXT*)lParam; - - /* store progress bar handle */ - Context->hDlgCtrl = GetDlgItem(hwndDlg, 14000); - - /* store window handle */ - Context->hwndDlg = hwndDlg; - - /* set progress bar range */ - (void)SendMessageW(Context->hDlgCtrl, (UINT) PBM_SETRANGE, 0, MAKELPARAM(0, 100)); - - /* start file queueing */ - SetTimer(hwndDlg, TIMER_ID, 1000, NULL); - //QueueFile(Context); - - return TRUE; - - case WM_CLOSE: - Context->op->bCancelled = TRUE; - EndDialog(hwndDlg, Context->op->bCancelled); - return TRUE; - case WM_COMMAND: - if (LOWORD(wParam) == 14002) - { - Context->op->bCancelled = TRUE; - EndDialog(hwndDlg, Context->op->bCancelled); - return TRUE; - } - break; - case WM_TIMER: - if (wParam == TIMER_ID) - { - QueueFile(Context); - KillTimer(hwndDlg, TIMER_ID); - } - break; - case WM_FILE: - if (!QueueFile(Context)) - EndDialog(hwndDlg, Context->op->bCancelled); - default: - break; - } - return FALSE; -} - -HRESULT -SHShowFileOperationDialog(FILE_OPERATION *op, FILE_LIST *flFrom, FILE_LIST *flTo) -{ - HWND hwnd; - BOOL bRet; - MSG msg; - FILE_OPERATION_CONTEXT Context; - - Context.from = flFrom; - Context.to = flTo; - Context.op = op; - Context.Index = 0; - Context.op->bCancelled = FALSE; - - hwnd = CreateDialogParam(shell32_hInstance, MAKEINTRESOURCE(IDD_SH_FILE_COPY), NULL, SHOperationDialog, (LPARAM)&Context); - if (hwnd == NULL) - { - ERR("Failed to create dialog\n"); - return E_FAIL; - } - ShowWindow(hwnd, SW_SHOWNORMAL); - - while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) - { - if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - - return NOERROR; -} - - /************************************************************************ * SHNotifyCopyFile [internal] * @@ -1001,7 +808,28 @@ int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp) return retCode; } +#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 +typedef struct +{ + DWORD attributes; + LPWSTR szDirectory; + LPWSTR szFilename; + LPWSTR szFullPath; + BOOL bFromWildcard; + BOOL bFromRelative; + BOOL bExists; +} FILE_ENTRY; + +typedef struct +{ + FILE_ENTRY *feFiles; + DWORD num_alloc; + DWORD dwNumFiles; + BOOL bAnyFromWildcard; + BOOL bAnyDirectories; + BOOL bAnyDontExist; +} FILE_LIST; static void __inline grow_list(FILE_LIST *list) diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index 43e409cbf44..e28efb0e240 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -90,9 +90,6 @@ #define IDS_FONTS 76 #define IDS_PRINTERS 77 -#define IDS_LOGOFF_TITLE 78 -#define IDS_LOGOFF_PROMPT 79 - #define IDS_CREATEFOLDER_DENIED 128 #define IDS_CREATEFOLDER_CAPTION 129 #define IDS_DELETEITEM_CAPTION 130 @@ -139,8 +136,6 @@ #define IDS_SYS_FILE 171 #define IDS_EMPTY_BITBUCKET 172 #define IDS_SHLEXEC_NOASSOC 173 -#define IDS_FILE_TYPES 174 -#define IDS_FILE_DETAILS 175 #define IDS_OPEN_VERB 300 #define IDS_RUNAS_VERB 301 @@ -193,7 +188,6 @@ #define IDD_TREEVIEW 0x3741 #define SHELL_EXTENDED_SHORTCUT_DLG 0x4000 #define OPEN_WITH_PROGRAMM_DLG 0x4001 -#define IDD_SH_FILE_COPY 0x4002 /* ID's of the ShellAbout controls */ // Part 1 - ID's identical to Windows Server 2003 SP1's shell32.dll diff --git a/dll/win32/shell32/shv_def_cmenu.c b/dll/win32/shell32/shv_def_cmenu.c index 08c9c3c9c74..71c25a7d407 100644 --- a/dll/win32/shell32/shv_def_cmenu.c +++ b/dll/win32/shell32/shv_def_cmenu.c @@ -48,7 +48,7 @@ static LPIDefaultContextMenuImpl __inline impl_from_IContextMenu( IContextMenu2 } VOID INewItem_SetCurrentShellFolder(IShellFolder * psfParent); // HACK -WCHAR *build_paths_list(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls); + static HRESULT @@ -1297,12 +1297,12 @@ DoDelete( HRESULT hr; STRRET strTemp; WCHAR szPath[MAX_PATH]; - LPWSTR wszPath, wszPos; SHFILEOPSTRUCTW op; int ret; LPSHELLBROWSER lpSB; HWND hwnd; + hr = IShellFolder2_GetDisplayNameOf(This->dcm.psf, This->dcm.apidl[0], SHGDN_FORPARSING, &strTemp); if(hr != S_OK) { @@ -1316,26 +1316,20 @@ DoDelete( ERR("StrRetToBufW failed with %x\n", hr); return hr; } - - /* Only keep the base path */ - wszPos = strrchrW(szPath, '\\'); - if (wszPos != NULL) - { - *(wszPos + 1) = '\0'; - } - - wszPath = build_paths_list(szPath, This->dcm.cidl, This->dcm.apidl); + /* FIXME + * implement deletion with multiple files + */ ZeroMemory(&op, sizeof(op)); op.hwnd = GetActiveWindow(); op.wFunc = FO_DELETE; - op.pFrom = wszPath; + op.pFrom = szPath; op.fFlags = FOF_ALLOWUNDO; ret = SHFileOperationW(&op); if (ret) { - ERR("SHFileOperation failed with 0x%x for %s\n", GetLastError(), debugstr_w(wszPath)); + TRACE("SHFileOperation failed with %0x%x", GetLastError()); return S_OK; } @@ -1354,7 +1348,6 @@ DoDelete( } NotifyShellViewWindow(lpcmi, TRUE); - HeapFree(GetProcessHeap(), 0, wszPath); return S_OK; } diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c index 332bdb67f79..364bbfe8af8 100644 --- a/dll/win32/shlwapi/ordinal.c +++ b/dll/win32/shlwapi/ordinal.c @@ -42,7 +42,6 @@ #include "mmsystem.h" #include "objbase.h" #include "exdisp.h" -#include "shdeprecated.h" #include "shlobj.h" #include "shlwapi.h" #include "shellapi.h" @@ -310,22 +309,24 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) BSTR property; IEnumFORMATETC* pIEnumFormatEtc = NULL; VARIANTARG var; - HRESULT hr; - IWebBrowserApp* pBrowser; + HRESULT hRet; + IWebBrowserApp* pBrowser = NULL; TRACE("(%p, %p)\n", lpBC, lpUnknown); - hr = IUnknown_QueryService(lpUnknown, &IID_IWebBrowserApp, &IID_IWebBrowserApp, (void**)&pBrowser); - if (FAILED(hr)) - return hr; + /* Get An IWebBrowserApp interface from lpUnknown */ + hRet = IUnknown_QueryService(lpUnknown, &IID_IWebBrowserApp, &IID_IWebBrowserApp, (PVOID)&pBrowser); + if (FAILED(hRet) || !pBrowser) + return E_NOINTERFACE; V_VT(&var) = VT_EMPTY; /* The property we get is the browsers clipboard enumerator */ property = SysAllocString(szProperty); - hr = IWebBrowserApp_GetProperty(pBrowser, property, &var); + hRet = IWebBrowserApp_GetProperty(pBrowser, property, &var); SysFreeString(property); - if (FAILED(hr)) goto exit; + if (FAILED(hRet)) + return hRet; if (V_VT(&var) == VT_EMPTY) { @@ -339,10 +340,7 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) if (!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\Current" "Version\\Internet Settings\\Accepted Documents", &hDocs)) - { - hr = E_FAIL; - goto exit; - } + return E_FAIL; /* Get count of values in key */ while (!dwRet) @@ -357,11 +355,7 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) /* Note: dwCount = number of items + 1; The extra item is the end node */ format = formatList = HeapAlloc(GetProcessHeap(), 0, dwCount * sizeof(FORMATETC)); if (!formatList) - { - RegCloseKey(hDocs); - hr = E_OUTOFMEMORY; - goto exit; - } + return E_OUTOFMEMORY; if (dwNumValues > 1) { @@ -378,12 +372,7 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) dwRet = RegEnumValueA(hDocs, dwCount, szKeyBuff, &dwKeySize, 0, &dwType, (PBYTE)szValueBuff, &dwValueSize); if (!dwRet) - { - HeapFree(GetProcessHeap(), 0, formatList); - RegCloseKey(hDocs); - hr = E_FAIL; - goto exit; - } + return E_FAIL; format->cfFormat = RegisterClipboardFormatA(szValueBuff); format->ptd = NULL; @@ -396,8 +385,6 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) } } - RegCloseKey(hDocs); - /* Terminate the (maybe empty) list, last entry has a cfFormat of 0 */ format->cfFormat = 0; format->ptd = NULL; @@ -406,21 +393,22 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) format->tymed = -1; /* Create a clipboard enumerator */ - hr = CreateFormatEnumerator(dwNumValues, formatList, &pIEnumFormatEtc); - HeapFree(GetProcessHeap(), 0, formatList); - if (FAILED(hr)) goto exit; + hRet = CreateFormatEnumerator(dwNumValues, formatList, &pIEnumFormatEtc); + + if (FAILED(hRet) || !pIEnumFormatEtc) + return hRet; /* Set our enumerator as the browsers property */ V_VT(&var) = VT_UNKNOWN; V_UNKNOWN(&var) = (IUnknown*)pIEnumFormatEtc; property = SysAllocString(szProperty); - hr = IWebBrowserApp_PutProperty(pBrowser, property, var); + hRet = IWebBrowserApp_PutProperty(pBrowser, property, var); SysFreeString(property); - if (FAILED(hr)) + if (FAILED(hRet)) { IEnumFORMATETC_Release(pIEnumFormatEtc); - goto exit; + goto RegisterDefaultAcceptHeaders_Exit; } } @@ -434,26 +422,28 @@ HRESULT WINAPI RegisterDefaultAcceptHeaders(LPBC lpBC, IUnknown *lpUnknown) /* Get an IEnumFormatEtc interface from the variants value */ pIEnumFormatEtc = NULL; - hr = IUnknown_QueryInterface(pIUnknown, &IID_IEnumFORMATETC, (void**)&pIEnumFormatEtc); - if (hr == S_OK && pIEnumFormatEtc) + hRet = IUnknown_QueryInterface(pIUnknown, &IID_IEnumFORMATETC, + (PVOID)&pIEnumFormatEtc); + if (hRet == S_OK && pIEnumFormatEtc) { /* Clone and register the enumerator */ - hr = IEnumFORMATETC_Clone(pIEnumFormatEtc, &pClone); - if (hr == S_OK && pClone) + hRet = IEnumFORMATETC_Clone(pIEnumFormatEtc, &pClone); + if (hRet == S_OK && pClone) { RegisterFormatEnumerator(lpBC, pClone, 0); IEnumFORMATETC_Release(pClone); } + /* Release the IEnumFormatEtc interface */ IEnumFORMATETC_Release(pIUnknown); } IUnknown_Release(V_UNKNOWN(&var)); } -exit: +RegisterDefaultAcceptHeaders_Exit: IWebBrowserApp_Release(pBrowser); - return hr; + return hRet; } /************************************************************************* @@ -510,7 +500,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen) return S_OK; } - /* Did not find a value in the registry or the user buffer is too small */ + /* Did not find a value in the registry or the user buffer is to small */ mylcid = GetUserDefaultLCID(); retval = LcidToRfc1766W(mylcid, mystr, mystrlen); len = lstrlenW(mystr); @@ -1211,7 +1201,7 @@ HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL f /************************************************************************* * @ [SHLWAPI.169] * - * Release an interface and zero a supplied pointer. + * Release an interface. * * PARAMS * lpUnknown [I] Object to release @@ -1219,16 +1209,19 @@ HRESULT WINAPI ConnectToConnectionPoint(IUnknown* lpUnkSink, REFIID riid, BOOL f * RETURNS * Nothing. */ -void WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown) +DWORD WINAPI IUnknown_AtomicRelease(IUnknown ** lpUnknown) { - TRACE("(%p)\n", lpUnknown); + IUnknown *temp; + + TRACE("(%p)\n",lpUnknown); - if(!lpUnknown || !*lpUnknown) return; + if(!lpUnknown || !*((LPDWORD)lpUnknown)) return 0; + temp = *lpUnknown; + *lpUnknown = NULL; TRACE("doing Release\n"); - IUnknown_Release(*lpUnknown); - *lpUnknown = NULL; + return IUnknown_Release(temp); } /************************************************************************* @@ -1265,10 +1258,9 @@ LPCSTR WINAPI PathSkipLeadingSlashesA(LPCSTR lpszSrc) */ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2) { - IUnknown *lpUnknown1, *lpUnknown2; - BOOL ret; + LPVOID lpUnknown1, lpUnknown2; - TRACE("(%p %p)\n", lpInt1, lpInt2); + TRACE("%p %p\n", lpInt1, lpInt2); if (!lpInt1 || !lpInt2) return FALSE; @@ -1276,21 +1268,16 @@ BOOL WINAPI SHIsSameObject(IUnknown* lpInt1, IUnknown* lpInt2) if (lpInt1 == lpInt2) return TRUE; - if (IUnknown_QueryInterface(lpInt1, &IID_IUnknown, (void**)&lpUnknown1) != S_OK) + if (FAILED(IUnknown_QueryInterface(lpInt1, &IID_IUnknown, &lpUnknown1))) return FALSE; - if (IUnknown_QueryInterface(lpInt2, &IID_IUnknown, (void**)&lpUnknown2) != S_OK) - { - IUnknown_Release(lpUnknown1); + if (FAILED(IUnknown_QueryInterface(lpInt2, &IID_IUnknown, &lpUnknown2))) return FALSE; - } - - ret = lpUnknown1 == lpUnknown2; - IUnknown_Release(lpUnknown1); - IUnknown_Release(lpUnknown2); + if (lpUnknown1 == lpUnknown2) + return TRUE; - return ret; + return FALSE; } /************************************************************************* @@ -1350,32 +1337,36 @@ HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd) /************************************************************************* * @ [SHLWAPI.173] * - * Call a SetOwner method of IShellService from specified object. + * Call a method on as as yet unidentified object. * * PARAMS - * iface [I] Object that supports IShellService - * pUnk [I] Argument for the SetOwner call + * pUnk [I] Object supporting the unidentified interface, + * arg [I] Argument for the call on the object. * * RETURNS - * Corresponding return value from last call or E_FAIL for null input + * S_OK. */ -HRESULT WINAPI IUnknown_SetOwner(IUnknown *iface, IUnknown *pUnk) +HRESULT WINAPI IUnknown_SetOwner(IUnknown *pUnk, ULONG arg) { - IShellService *service; - HRESULT hr; + static const GUID guid_173 = { + 0x5836fb00, 0x8187, 0x11cf, { 0xa1,0x2b,0x00,0xaa,0x00,0x4a,0xe8,0x37 } + }; + IMalloc *pUnk2; - TRACE("(%p, %p)\n", iface, pUnk); + TRACE("(%p,%d)\n", pUnk, arg); - if (!iface) return E_FAIL; - - hr = IUnknown_QueryInterface(iface, &IID_IShellService, (void**)&service); - if (hr == S_OK) + /* Note: arg may not be a ULONG and pUnk2 is for sure not an IMalloc - + * We use this interface as its vtable entry is compatible with the + * object in question. + * FIXME: Find out what this object is and where it should be defined. + */ + if (pUnk && + SUCCEEDED(IUnknown_QueryInterface(pUnk, &guid_173, (void**)&pUnk2))) { - hr = IShellService_SetOwner(service, pUnk); - IShellService_Release(service); + IMalloc_Alloc(pUnk2, arg); /* Faked call!! */ + IMalloc_Release(pUnk2); } - - return hr; + return S_OK; } /************************************************************************* @@ -1482,6 +1473,7 @@ HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID ri if (!lpUnknown) return E_FAIL; + /* Get an IServiceProvider interface from the object */ hRet = IUnknown_QueryInterface(lpUnknown, &IID_IServiceProvider, (LPVOID*)&pService); @@ -1494,92 +1486,12 @@ HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID ri TRACE("(IServiceProvider*)%p returned (IUnknown*)%p\n", pService, *lppOut); + /* Release the IServiceProvider interface */ IUnknown_Release(pService); } return hRet; } -/************************************************************************* - * @ [SHLWAPI.484] - * - * Calls IOleCommandTarget::Exec() for specified service object. - * - * PARAMS - * lpUnknown [I] Object to get an IServiceProvider interface from - * service [I] Service ID for IServiceProvider_QueryService() call - * group [I] Group ID for IOleCommandTarget::Exec() call - * cmdId [I] Command ID for IOleCommandTarget::Exec() call - * cmdOpt [I] Options flags for command - * pIn [I] Input arguments for command - * pOut [O] Output arguments for command - * - * RETURNS - * Success: S_OK. lppOut contains an object providing the requested service - * Failure: An HRESULT error code - * - * NOTES - * lpUnknown is expected to support the IServiceProvider interface. - */ -HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *lpUnknown, REFIID service, - const GUID *group, DWORD cmdId, DWORD cmdOpt, VARIANT *pIn, VARIANT *pOut) -{ - IOleCommandTarget *target; - HRESULT hr; - - TRACE("%p %s %s %d %08x %p %p\n", lpUnknown, debugstr_guid(service), - debugstr_guid(group), cmdId, cmdOpt, pIn, pOut); - - hr = IUnknown_QueryService(lpUnknown, service, &IID_IOleCommandTarget, (void**)&target); - if (hr == S_OK) - { - hr = IOleCommandTarget_Exec(target, group, cmdId, cmdOpt, pIn, pOut); - IOleCommandTarget_Release(target); - } - - TRACE("<-- hr=0x%08x\n", hr); - - return hr; -} - -/************************************************************************* - * @ [SHLWAPI.514] - * - * Calls IProfferService methods to proffer/revoke specified service. - * - * PARAMS - * lpUnknown [I] Object to get an IServiceProvider interface from - * service [I] Service ID for IProfferService::Proffer/Revoke calls - * pService [I] Service to proffer. If NULL ::Revoke is called - * pCookie [IO] Group ID for IOleCommandTarget::Exec() call - * - * RETURNS - * Success: S_OK. IProffer method returns S_OK - * Failure: An HRESULT error code - * - * NOTES - * lpUnknown is expected to support the IServiceProvider interface. - */ -HRESULT WINAPI IUnknown_ProfferService(IUnknown *lpUnknown, REFGUID service, IServiceProvider *pService, DWORD *pCookie) -{ - IProfferService *proffer; - HRESULT hr; - - TRACE("%p %s %p %p\n", lpUnknown, debugstr_guid(service), pService, pCookie); - - hr = IUnknown_QueryService(lpUnknown, &IID_IProfferService, &IID_IProfferService, (void**)&proffer); - if (hr == S_OK) - { - if (pService) - hr = IProfferService_ProfferService(proffer, service, pService, pCookie); - else - hr = IProfferService_RevokeService(proffer, *pCookie); - - IProfferService_Release(proffer); - } - - return hr; -} - /************************************************************************* * @ [SHLWAPI.479] * @@ -1634,8 +1546,6 @@ BOOL WINAPI SHLoadMenuPopup(HINSTANCE hInst, LPCWSTR szName) { HMENU hMenu; - TRACE("%p %s\n", hInst, debugstr_w(szName)); - if ((hMenu = LoadMenuW(hInst, szName))) { if (GetSubMenu(hMenu, 0)) @@ -1719,9 +1629,6 @@ void WINAPI SHPropagateMessage(HWND hWnd, UINT uiMsgId, WPARAM wParam, LPARAM lP DWORD WINAPI SHRemoveAllSubMenus(HMENU hMenu) { int iItemCount = GetMenuItemCount(hMenu) - 1; - - TRACE("%p\n", hMenu); - while (iItemCount >= 0) { HMENU hSubMenu = GetSubMenu(hMenu, iItemCount); @@ -1747,7 +1654,6 @@ DWORD WINAPI SHRemoveAllSubMenus(HMENU hMenu) */ UINT WINAPI SHEnableMenuItem(HMENU hMenu, UINT wItemID, BOOL bEnable) { - TRACE("%p, %u, %d\n", hMenu, wItemID, bEnable); return EnableMenuItem(hMenu, wItemID, bEnable ? MF_ENABLED : MF_GRAYED); } @@ -1766,7 +1672,6 @@ UINT WINAPI SHEnableMenuItem(HMENU hMenu, UINT wItemID, BOOL bEnable) */ DWORD WINAPI SHCheckMenuItem(HMENU hMenu, UINT uID, BOOL bCheck) { - TRACE("%p, %u, %d\n", hMenu, uID, bCheck); return CheckMenuItem(hMenu, uID, bCheck ? MF_CHECKED : MF_UNCHECKED); } @@ -1798,8 +1703,6 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY; POINTL pt = { 0, 0 }; - TRACE("%p %p 0x%08x %p %p\n", pDrop, pDataObj, grfKeyState, lpPt, pdwEffect); - if (!lpPt) lpPt = &pt; @@ -1808,7 +1711,7 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, IDropTarget_DragEnter(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect); - if (*pdwEffect != DROPEFFECT_NONE) + if (*pdwEffect) return IDropTarget_Drop(pDrop, pDataObj, grfKeyState, *lpPt, pdwEffect); IDropTarget_DragLeave(pDrop); @@ -1900,7 +1803,7 @@ HRESULT WINAPI IUnknown_OnFocusOCS(IUnknown *lpUnknown, BOOL fGotFocus) IOleControlSite* lpCSite = NULL; HRESULT hRet = E_FAIL; - TRACE("(%p, %d)\n", lpUnknown, fGotFocus); + TRACE("(%p,%s)\n", lpUnknown, fGotFocus ? "TRUE" : "FALSE"); if (lpUnknown) { hRet = IUnknown_QueryInterface(lpUnknown, &IID_IOleControlSite, @@ -2158,10 +2061,12 @@ VOID WINAPI IUnknown_Set(IUnknown **lppDest, IUnknown *lpUnknown) { TRACE("(%p,%p)\n", lppDest, lpUnknown); - IUnknown_AtomicRelease(lppDest); + if (lppDest) + IUnknown_AtomicRelease(lppDest); /* Release existing interface */ if (lpUnknown) { + /* Copy */ IUnknown_AddRef(lpUnknown); *lppDest = lpUnknown; } @@ -2351,6 +2256,12 @@ BOOL WINAPI FDSA_DeleteItem(FDSA_info *info, DWORD where) return TRUE; } + +typedef struct { + REFIID refid; + DWORD indx; +} IFACE_INDEX_TBL; + /************************************************************************* * @ [SHLWAPI.219] * @@ -2361,22 +2272,22 @@ BOOL WINAPI FDSA_DeleteItem(FDSA_info *info, DWORD where) * Failure: E_POINTER or E_NOINTERFACE. */ HRESULT WINAPI QISearch( - void *base, /* [in] Table of interfaces */ - const QITAB *table, /* [in] Array of REFIIDs and indexes into the table */ + LPVOID w, /* [in] Table of interfaces */ + IFACE_INDEX_TBL *x, /* [in] Array of REFIIDs and indexes into the table */ REFIID riid, /* [in] REFIID to get interface for */ - void **ppv) /* [out] Destination for interface pointer */ + LPVOID *ppv) /* [out] Destination for interface pointer */ { HRESULT ret; IUnknown *a_vtbl; - const QITAB *xmove; + IFACE_INDEX_TBL *xmove; - TRACE("(%p %p %s %p)\n", base, table, debugstr_guid(riid), ppv); + TRACE("(%p %p %s %p)\n", w,x,debugstr_guid(riid),ppv); if (ppv) { - xmove = table; - while (xmove->piid) { - TRACE("trying (offset %d) %s\n", xmove->dwOffset, debugstr_guid(xmove->piid)); - if (IsEqualIID(riid, xmove->piid)) { - a_vtbl = (IUnknown*)(xmove->dwOffset + (LPBYTE)base); + xmove = x; + while (xmove->refid) { + TRACE("trying (indx %d) %s\n", xmove->indx, debugstr_guid(xmove->refid)); + if (IsEqualIID(riid, xmove->refid)) { + a_vtbl = (IUnknown*)(xmove->indx + (LPBYTE)w); TRACE("matched, returning (%p)\n", a_vtbl); *ppv = a_vtbl; IUnknown_AddRef(a_vtbl); @@ -2386,7 +2297,7 @@ HRESULT WINAPI QISearch( } if (IsEqualIID(riid, &IID_IUnknown)) { - a_vtbl = (IUnknown*)(table->dwOffset + (LPBYTE)base); + a_vtbl = (IUnknown*)(x->indx + (LPBYTE)w); TRACE("returning first for IUnknown (%p)\n", a_vtbl); *ppv = a_vtbl; IUnknown_AddRef(a_vtbl); @@ -2595,27 +2506,27 @@ HRESULT WINAPI IUnknown_GetSite(LPUNKNOWN lpUnknown, REFIID iid, PVOID *lppSite) * dwExStyle [I] Extra style flags * dwStyle [I] Style flags * hMenu [I] Window menu - * wnd_extra [I] Window extra bytes value + * z [I] Unknown * * RETURNS * Success: The window handle of the newly created window. * Failure: 0. */ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle, - DWORD dwStyle, HMENU hMenu, LONG_PTR wnd_extra) + DWORD dwStyle, HMENU hMenu, LONG z) { static const char szClass[] = "WorkerA"; WNDCLASSA wc; HWND hWnd; - TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08lx)\n", - wndProc, hWndParent, dwExStyle, dwStyle, hMenu, wnd_extra); + TRACE("(0x%08x,%p,0x%08x,0x%08x,%p,0x%08x)\n", + wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); /* Create Window class */ wc.style = 0; wc.lpfnWndProc = DefWindowProcA; wc.cbClsExtra = 0; - wc.cbWndExtra = sizeof(LONG_PTR); + wc.cbWndExtra = 4; wc.hInstance = shlwapi_hInstance; wc.hIcon = NULL; wc.hCursor = LoadCursorA(NULL, (LPSTR)IDC_ARROW); @@ -2623,17 +2534,19 @@ HWND WINAPI SHCreateWorkerWindowA(LONG wndProc, HWND hWndParent, DWORD dwExStyle wc.lpszMenuName = NULL; wc.lpszClassName = szClass; - SHRegisterClassA(&wc); + SHRegisterClassA(&wc); /* Register class */ + + /* FIXME: Set extra bits in dwExStyle */ hWnd = CreateWindowExA(dwExStyle, szClass, 0, dwStyle, 0, 0, 0, 0, hWndParent, hMenu, shlwapi_hInstance, 0); if (hWnd) { - SetWindowLongPtrW(hWnd, 0, wnd_extra); + SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, z); - if (wndProc) SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc); + if (wndProc) + SetWindowLongPtrA(hWnd, GWLP_WNDPROC, wndProc); } - return hWnd; } @@ -2816,7 +2729,7 @@ BOOL WINAPI GUIDFromStringA(LPCSTR idstr, CLSID *id) */ BOOL WINAPI GUIDFromStringW(LPCWSTR idstr, CLSID *id) { - return SUCCEEDED(CLSIDFromString((LPCOLESTR)idstr, id)); + return SUCCEEDED(CLSIDFromString((LPOLESTR)idstr, id)); } /************************************************************************* @@ -2891,21 +2804,18 @@ DWORD WINAPI WhichPlatform(void) * Unicode version of SHCreateWorkerWindowA. */ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle, - DWORD dwStyle, HMENU hMenu, LONG msg_result) + DWORD dwStyle, HMENU hMenu, LONG z) { - static const WCHAR szClass[] = { 'W', 'o', 'r', 'k', 'e', 'r', 'W', 0 }; + static const WCHAR szClass[] = { 'W', 'o', 'r', 'k', 'e', 'r', 'W', '\0' }; WNDCLASSW wc; HWND hWnd; - TRACE("(0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x)\n", - wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result); + TRACE("(0x%08x,%p,0x%08x,0x%08x,%p,0x%08x)\n", + wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); - /* If our OS is natively ANSI, use the ANSI version */ - if (GetVersion() & 0x80000000) /* not NT */ - { - TRACE("fallback to ANSI, ver 0x%08x\n", GetVersion()); - return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu, msg_result); - } + /* If our OS is natively ASCII, use the ASCII version */ + if (!(GetVersion() & 0x80000000)) /* NT */ + return SHCreateWorkerWindowA(wndProc, hWndParent, dwExStyle, dwStyle, hMenu, z); /* Create Window class */ wc.style = 0; @@ -2919,17 +2829,19 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle wc.lpszMenuName = NULL; wc.lpszClassName = szClass; - SHRegisterClassW(&wc); + SHRegisterClassW(&wc); /* Register class */ + + /* FIXME: Set extra bits in dwExStyle */ hWnd = CreateWindowExW(dwExStyle, szClass, 0, dwStyle, 0, 0, 0, 0, hWndParent, hMenu, shlwapi_hInstance, 0); if (hWnd) { - SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, msg_result); + SetWindowLongPtrW(hWnd, DWLP_MSGRESULT, z); - if (wndProc) SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc); + if (wndProc) + SetWindowLongPtrW(hWnd, GWLP_WNDPROC, wndProc); } - return hWnd; } @@ -2949,8 +2861,7 @@ HWND WINAPI SHCreateWorkerWindowW(LONG wndProc, HWND hWndParent, DWORD dwExStyle */ HRESULT WINAPI SHInvokeDefaultCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST lpApidl) { - TRACE("%p %p %p\n", hWnd, lpFolder, lpApidl); - return SHInvokeCommand(hWnd, lpFolder, lpApidl, FALSE); + return SHInvokeCommand(hWnd, lpFolder, lpApidl, FALSE); } /************************************************************************* @@ -3465,12 +3376,12 @@ UINT WINAPI SHDefExtractIconWrapW(LPCWSTR pszIconFile, int iIndex, UINT uFlags, HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST lpApidl, BOOL bInvokeDefault) { IContextMenu *iContext; - HRESULT hRet; + HRESULT hRet = E_FAIL; - TRACE("(%p, %p, %p, %d)\n", hWnd, lpFolder, lpApidl, bInvokeDefault); + TRACE("(%p,%p,%p,%d)\n", hWnd, lpFolder, lpApidl, bInvokeDefault); if (!lpFolder) - return E_FAIL; + return hRet; /* Get the context menu from the shell folder */ hRet = IShellFolder_GetUIObjectOf(lpFolder, hWnd, 1, &lpApidl, @@ -3490,7 +3401,7 @@ HRESULT WINAPI SHInvokeCommand(HWND hWnd, IShellFolder* lpFolder, LPCITEMIDLIST if (SUCCEEDED(hQuery)) { if (bInvokeDefault && - (dwDefaultId = GetMenuDefaultItem(hMenu, 0, 0)) != (UINT)-1) + (dwDefaultId = GetMenuDefaultItem(hMenu, 0, 0)) != 0xFFFFFFFF) { CMINVOKECOMMANDINFO cmIci; /* Invoke the default item */ @@ -3899,7 +3810,7 @@ DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam) */ HRESULT WINAPI CLSIDFromStringWrap(LPCWSTR idstr, CLSID *id) { - return CLSIDFromString((LPCOLESTR)idstr, id); + return CLSIDFromString((LPOLESTR)idstr, id); } /************************************************************************* @@ -4260,24 +4171,18 @@ BOOL WINAPI SHIsLowMemoryMachine (DWORD x) */ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) { - MENUITEMINFOW mi; - INT nCount = GetMenuItemCount(hMenu), nIter = 0; - - TRACE("%p %u\n", hMenu, wID); + MENUITEMINFOW mi; + INT nCount = GetMenuItemCount(hMenu), nIter = 0; - while (nIter < nCount) - { - mi.cbSize = sizeof(mi); - mi.fMask = MIIM_ID; - if (GetMenuItemInfoW(hMenu, nIter, TRUE, &mi) && mi.wID == wID) - { - TRACE("ret %d\n", nIter); - return nIter; - } - nIter++; - } - - return -1; + while (nIter < nCount) + { + mi.cbSize = sizeof(mi); + mi.fMask = MIIM_ID; + if (GetMenuItemInfoW(hMenu, nIter, TRUE, &mi) && mi.wID == wID) + return nIter; + nIter++; + } + return -1; } /************************************************************************* @@ -4287,7 +4192,6 @@ INT WINAPI GetMenuPosFromID(HMENU hMenu, UINT wID) */ DWORD WINAPI SHMenuIndexFromID(HMENU hMenu, UINT uID) { - TRACE("%p %u\n", hMenu, uID); return GetMenuPosFromID(hMenu, uID); } @@ -4366,10 +4270,10 @@ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid) /*********************************************************************** * SHGetShellKey (SHLWAPI.@) */ -HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create) +DWORD WINAPI SHGetShellKey(DWORD a, DWORD b, DWORD c) { - FIXME("(0x%08x, %s, %d): stub\n", flags, debugstr_w(sub_key), create); - return (HKEY)0x50; + FIXME("(%x, %x, %x): stub\n", a, b, c); + return 0x50; } /*********************************************************************** @@ -4518,6 +4422,20 @@ INT WINAPIV ShellMessageBoxWrapW(HINSTANCE hInstance, HWND hWnd, LPCWSTR lpText, return ret; } +HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *unk, REFIID service, REFIID clsid, + DWORD x1, DWORD x2, DWORD x3, void **ppvOut) +{ + FIXME("%p %s %s %08x %08x %08x %p\n", unk, + debugstr_guid(service), debugstr_guid(clsid), x1, x2, x3, ppvOut); + return E_NOTIMPL; +} + +HRESULT WINAPI IUnknown_ProfferService(IUnknown *unk, void *x0, void *x1, void *x2) +{ + FIXME("%p %p %p %p\n", unk, x0, x1, x2); + return E_NOTIMPL; +} + /*********************************************************************** * ZoneComputePaneSize [SHLWAPI.382] */ diff --git a/dll/win32/shlwapi/shlwapi.spec b/dll/win32/shlwapi/shlwapi.spec index 367046b5ebc..d899232f9c5 100644 --- a/dll/win32/shlwapi/shlwapi.spec +++ b/dll/win32/shlwapi/shlwapi.spec @@ -216,7 +216,7 @@ 216 stdcall -noname SHAnsiToUnicodeCP(long str ptr long) 217 stdcall -noname SHUnicodeToAnsi(wstr ptr ptr) 218 stdcall -noname SHUnicodeToAnsiCP(long wstr ptr long) -219 stdcall QISearch(long long long long) +219 stdcall -noname QISearch(long long long long) 220 stdcall -noname SHSetDefaultDialogFont(ptr long) 221 stdcall -noname SHRemoveDefaultDialogFont(ptr) 222 stdcall -noname SHGlobalCounterCreate(long) diff --git a/dll/win32/shlwapi/url.c b/dll/win32/shlwapi/url.c index cd83b457178..958a8429f53 100644 --- a/dll/win32/shlwapi/url.c +++ b/dll/win32/shlwapi/url.c @@ -278,8 +278,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, { HRESULT hr = S_OK; DWORD EscapeFlags; - LPCWSTR wk1, root; - LPWSTR lpszUrlCpy, wk2, mp, mp2; + LPWSTR lpszUrlCpy, wk1, wk2, mp, mp2, root; INT state; DWORD nByteLen, nLen, nWkLen; WCHAR slash = '/'; @@ -323,7 +322,7 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, * 6 have location (found /) save root location */ - wk1 = pszUrl; + wk1 = (LPWSTR)pszUrl; wk2 = lpszUrlCpy; state = 0; @@ -663,7 +662,7 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, } } - /* If there is a '#' and the characters immediately preceding it are + /* If there is a '#' and the characters immediately preceeding it are * ".htm[l]", then begin looking for the last leaf starting from * the '#'. Otherwise the '#' is not meaningful and just start * looking from the end. */ @@ -1719,9 +1718,6 @@ BOOL WINAPI UrlIsA(LPCSTR pszUrl, URLIS Urlis) TRACE("(%s %d)\n", debugstr_a(pszUrl), Urlis); - if(!pszUrl) - return FALSE; - switch (Urlis) { case URLIS_OPAQUE: @@ -1772,9 +1768,6 @@ BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis) TRACE("(%s %d)\n", debugstr_w(pszUrl), Urlis); - if(!pszUrl) - return FALSE; - switch (Urlis) { case URLIS_OPAQUE: diff --git a/dll/win32/sti/regsvr.c b/dll/win32/sti/regsvr.c index 3e582ec4964..018c1781ef6 100644 --- a/dll/win32/sti/regsvr.c +++ b/dll/win32/sti/regsvr.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + #include #include @@ -30,7 +31,6 @@ #include "objbase.h" #include "initguid.h" #include "sti.h" -#include "wia_lh.h" #include "wine/debug.h" #include "wine/unicode.h" @@ -395,11 +395,8 @@ static struct regsvr_interface const interface_list[] = { { NULL } /* list terminator */ }; -extern HRESULT WINAPI STI_DllRegisterServer(void) DECLSPEC_HIDDEN; -extern HRESULT WINAPI STI_DllUnregisterServer(void) DECLSPEC_HIDDEN; - /*********************************************************************** - * DllRegisterServer (STI.@) + * DllRegisterServer (INETCOMM.@) */ HRESULT WINAPI DllRegisterServer(void) { @@ -407,16 +404,14 @@ HRESULT WINAPI DllRegisterServer(void) TRACE("\n"); - hr = STI_DllRegisterServer(); - if (SUCCEEDED(hr)) - hr = register_coclasses(coclass_list); + hr = register_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = register_interfaces(interface_list); return hr; } /*********************************************************************** - * DllUnregisterServer (STI.@) + * DllUnregisterServer (INETCOMM.@) */ HRESULT WINAPI DllUnregisterServer(void) { @@ -427,7 +422,5 @@ HRESULT WINAPI DllUnregisterServer(void) hr = unregister_coclasses(coclass_list); if (SUCCEEDED(hr)) hr = unregister_interfaces(interface_list); - if (SUCCEEDED(hr)) - hr = STI_DllUnregisterServer(); return hr; } diff --git a/dll/win32/sti/sti.c b/dll/win32/sti/sti.c deleted file mode 100644 index 974bd06f693..00000000000 --- a/dll/win32/sti/sti.c +++ /dev/null @@ -1,352 +0,0 @@ -/* - * Copyright (C) 2002 Aric Stewart for CodeWeavers - * Copyright (C) 2009 Damjan Jovanovic - * - * 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 - -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "winerror.h" -#include "objbase.h" -#include "sti.h" - -#include "sti_private.h" - -#include "wine/debug.h" -#include "wine/unicode.h" - -WINE_DEFAULT_DEBUG_CHANNEL(sti); - -static const WCHAR registeredAppsLaunchPath[] = { - 'S','O','F','T','W','A','R','E','\\', - 'M','i','c','r','o','s','o','f','t','\\', - 'W','i','n','d','o','w','s','\\', - 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', - 'S','t','i','l','l','I','m','a','g','e','\\', - 'R','e','g','i','s','t','e','r','e','d',' ','A','p','p','l','i','c','a','t','i','o','n','s',0 -}; - -static inline stillimage *impl_from_StillImageW(IStillImageW *iface) -{ - return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpVtbl)); -} - -static HRESULT WINAPI stillimagew_QueryInterface(IStillImageW *iface, REFIID riid, void **ppvObject) -{ - stillimage *This = impl_from_StillImageW(iface); - TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); - return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); -} - -static ULONG WINAPI stillimagew_AddRef(IStillImageW *iface) -{ - stillimage *This = impl_from_StillImageW(iface); - return IUnknown_AddRef(This->pUnkOuter); -} - -static ULONG WINAPI stillimagew_Release(IStillImageW *iface) -{ - stillimage *This = impl_from_StillImageW(iface); - return IUnknown_Release(This->pUnkOuter); -} - -static HRESULT WINAPI stillimagew_Initialize(IStillImageW *iface, HINSTANCE hinst, DWORD dwVersion) -{ - stillimage *This = impl_from_StillImageW(iface); - TRACE("(%p, %p, 0x%X)\n", This, hinst, dwVersion); - return S_OK; -} - -static HRESULT WINAPI stillimagew_GetDeviceList(IStillImageW *iface, DWORD dwType, DWORD dwFlags, - DWORD *pdwItemsReturned, LPVOID *ppBuffer) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %u, 0x%X, %p, %p): stub\n", This, dwType, dwFlags, pdwItemsReturned, ppBuffer); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_GetDeviceInfo(IStillImageW *iface, LPWSTR pwszDeviceName, - LPVOID *ppBuffer) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), ppBuffer); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_CreateDevice(IStillImageW *iface, LPWSTR pwszDeviceName, DWORD dwMode, - PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %u, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), dwMode, pDevice, pUnkOuter); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_GetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, - LPDWORD pType, LPBYTE pData, LPDWORD cbData) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %s, %p, %p, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), - pType, pData, cbData); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_SetDeviceValue(IStillImageW *iface, LPWSTR pwszDeviceName, LPWSTR pValueName, - DWORD type, LPBYTE pData, DWORD cbData) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %s, %u, %p, %u): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pValueName), - type, pData, cbData); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_GetSTILaunchInformation(IStillImageW *iface, LPWSTR pwszDeviceName, - DWORD *pdwEventCode, LPWSTR pwszEventName) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %p, %p, %p): stub\n", This, pwszDeviceName, - pdwEventCode, pwszEventName); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_RegisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName, - LPWSTR pwszCommandLine) -{ - static const WCHAR format[] = {'%','s',' ','%','s',0}; - static const WCHAR commandLineSuffix[] = { - '/','S','t','i','D','e','v','i','c','e',':','%','1',' ', - '/','S','t','i','E','v','e','n','t',':','%','2',0}; - HKEY registeredAppsKey = NULL; - DWORD ret; - HRESULT hr = S_OK; - stillimage *This = impl_from_StillImageW(iface); - - TRACE("(%p, %s, %s)\n", This, debugstr_w(pwszAppName), debugstr_w(pwszCommandLine)); - - ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, registeredAppsLaunchPath, ®isteredAppsKey); - if (ret == ERROR_SUCCESS) - { - WCHAR *value = HeapAlloc(GetProcessHeap(), 0, - (lstrlenW(pwszCommandLine) + 1 + lstrlenW(commandLineSuffix) + 1) * sizeof(WCHAR)); - if (value) - { - sprintfW(value, format, pwszCommandLine, commandLineSuffix); - ret = RegSetValueExW(registeredAppsKey, pwszAppName, 0, - REG_SZ, (BYTE*)value, (lstrlenW(value)+1)*sizeof(WCHAR)); - if (ret != ERROR_SUCCESS) - hr = HRESULT_FROM_WIN32(ret); - HeapFree(GetProcessHeap(), 0, value); - } - else - hr = E_OUTOFMEMORY; - RegCloseKey(registeredAppsKey); - } - else - hr = HRESULT_FROM_WIN32(ret); - return hr; -} - -static HRESULT WINAPI stillimagew_UnregisterLaunchApplication(IStillImageW *iface, LPWSTR pwszAppName) -{ - stillimage *This = impl_from_StillImageW(iface); - HKEY registeredAppsKey = NULL; - DWORD ret; - HRESULT hr = S_OK; - - TRACE("(%p, %s)\n", This, debugstr_w(pwszAppName)); - - ret = RegCreateKeyW(HKEY_LOCAL_MACHINE, registeredAppsLaunchPath, ®isteredAppsKey); - if (ret == ERROR_SUCCESS) - { - ret = RegDeleteValueW(registeredAppsKey, pwszAppName); - if (ret != ERROR_SUCCESS) - hr = HRESULT_FROM_WIN32(ret); - RegCloseKey(registeredAppsKey); - } - else - hr = HRESULT_FROM_WIN32(ret); - return hr; -} - -static HRESULT WINAPI stillimagew_EnableHwNotifications(IStillImageW *iface, LPCWSTR pwszDeviceName, - BOOL bNewState) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %u): stub\n", This, debugstr_w(pwszDeviceName), bNewState); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_GetHwNotificationState(IStillImageW *iface, LPCWSTR pwszDeviceName, - BOOL *pbCurrentState) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), pbCurrentState); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_RefreshDeviceBus(IStillImageW *iface, LPCWSTR pwszDeviceName) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s): stub\n", This, debugstr_w(pwszDeviceName)); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_LaunchApplicationForDevice(IStillImageW *iface, LPWSTR pwszDeviceName, - LPWSTR pwszAppName, LPSTINOTIFY pStiNotify) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %s, %s, %p): stub\n", This, debugstr_w(pwszDeviceName), debugstr_w(pwszAppName), - pStiNotify); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_SetupDeviceParameters(IStillImageW *iface, PSTI_DEVICE_INFORMATIONW pDevInfo) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %p): stub\n", This, pDevInfo); - return E_NOTIMPL; -} - -static HRESULT WINAPI stillimagew_WriteToErrorLog(IStillImageW *iface, DWORD dwMessageType, LPCWSTR pszMessage) -{ - stillimage *This = impl_from_StillImageW(iface); - FIXME("(%p, %u, %s): stub\n", This, dwMessageType, debugstr_w(pszMessage)); - return E_NOTIMPL; -} - -static const struct IStillImageWVtbl stillimagew_vtbl = -{ - stillimagew_QueryInterface, - stillimagew_AddRef, - stillimagew_Release, - stillimagew_Initialize, - stillimagew_GetDeviceList, - stillimagew_GetDeviceInfo, - stillimagew_CreateDevice, - stillimagew_GetDeviceValue, - stillimagew_SetDeviceValue, - stillimagew_GetSTILaunchInformation, - stillimagew_RegisterLaunchApplication, - stillimagew_UnregisterLaunchApplication, - stillimagew_EnableHwNotifications, - stillimagew_GetHwNotificationState, - stillimagew_RefreshDeviceBus, - stillimagew_LaunchApplicationForDevice, - stillimagew_SetupDeviceParameters, - stillimagew_WriteToErrorLog -}; - -static inline stillimage *impl_from_InternalUnknown(IUnknown *iface) -{ - return (stillimage *)((char*)iface - FIELD_OFFSET(stillimage, lpInternalUnkVtbl)); -} - -static HRESULT WINAPI Internal_QueryInterface(IUnknown *iface, REFIID riid, void **ppvObject) -{ - stillimage *This = impl_from_InternalUnknown(iface); - - TRACE("(%p %s %p)\n", This, debugstr_guid(riid), ppvObject); - - if (IsEqualGUID(riid, &IID_IUnknown)) - *ppvObject = iface; - else if (IsEqualGUID(riid, &IID_IStillImageW)) - *ppvObject = &This->lpVtbl; - else - { - if (IsEqualGUID(riid, &IID_IStillImageA)) - FIXME("interface IStillImageA is unsupported on Windows Vista too, please report if it's needed\n"); - else - FIXME("interface %s not implemented\n", debugstr_guid(riid)); - *ppvObject = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*) *ppvObject); - return S_OK; -} - -static ULONG WINAPI Internal_AddRef(IUnknown *iface) -{ - stillimage *This = impl_from_InternalUnknown(iface); - return InterlockedIncrement(&This->ref); -} - -static ULONG WINAPI Internal_Release(IUnknown *iface) -{ - ULONG ref; - stillimage *This = impl_from_InternalUnknown(iface); - - ref = InterlockedDecrement(&This->ref); - if (ref == 0) - HeapFree(GetProcessHeap(), 0, This); - return ref; -} - -static const struct IUnknownVtbl internal_unk_vtbl = -{ - Internal_QueryInterface, - Internal_AddRef, - Internal_Release -}; - -/****************************************************************************** - * StiCreateInstanceA (STI.@) - */ -HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter) -{ - FIXME("(%p, %u, %p, %p): stub, unimplemented on Windows Vista too, please report if it's needed\n", hinst, dwVer, ppSti, pUnkOuter); - return STG_E_UNIMPLEMENTEDFUNCTION; -} - -/****************************************************************************** - * StiCreateInstanceW (STI.@) - */ -HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter) -{ - stillimage *This; - HRESULT hr; - - TRACE("(%p, %u, %p, %p)\n", hinst, dwVer, ppSti, pUnkOuter); - - This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(stillimage)); - if (This) - { - This->lpVtbl = &stillimagew_vtbl; - This->lpInternalUnkVtbl = &internal_unk_vtbl; - if (pUnkOuter) - This->pUnkOuter = pUnkOuter; - else - This->pUnkOuter = (IUnknown*) &This->lpInternalUnkVtbl; - This->ref = 1; - - hr = IStillImage_Initialize((IStillImageW*) &This->lpVtbl, hinst, dwVer); - if (SUCCEEDED(hr)) - { - if (pUnkOuter) - *ppSti = (IStillImageW*) &This->lpInternalUnkVtbl; - else - *ppSti = (IStillImageW*) &This->lpVtbl; - } - } - else - hr = E_OUTOFMEMORY; - - return hr; -} diff --git a/dll/win32/sti/sti.rbuild b/dll/win32/sti/sti.rbuild index edce67acab8..592c5f123af 100644 --- a/dll/win32/sti/sti.rbuild +++ b/dll/win32/sti/sti.rbuild @@ -8,29 +8,11 @@ include/reactos/wine 0x600 - STI_ - - - regsvr.c - sti.c sti_main.c - sti_wia.idl wine - sti_proxy - ole32 - oleaut32 - rpcrt4 advapi32 - pseh - uuid + ole32 ntdll - - - STI_ - - - sti_wia.idl - diff --git a/dll/win32/sti/sti.spec b/dll/win32/sti/sti.spec index 300e7fac4b7..186f382f195 100644 --- a/dll/win32/sti/sti.spec +++ b/dll/win32/sti/sti.spec @@ -1,7 +1,7 @@ -@ stdcall -private DllCanUnloadNow() -@ stdcall -private DllGetClassObject(ptr ptr ptr) +@ stub DllCanUnloadNow +@ stub DllGetClassObject @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() -@ stdcall StiCreateInstance(ptr long ptr ptr) StiCreateInstanceW +@ stdcall StiCreateInstance(ptr long ptr ptr) @ stdcall StiCreateInstanceA(ptr long ptr ptr) @ stdcall StiCreateInstanceW(ptr long ptr ptr) diff --git a/dll/win32/sti/sti_main.c b/dll/win32/sti/sti_main.c index 711c17f14eb..1d4e6ad0408 100644 --- a/dll/win32/sti/sti_main.c +++ b/dll/win32/sti/sti_main.c @@ -1,6 +1,5 @@ /* * Copyright (C) 2002 Aric Stewart for CodeWeavers - * Copyright (C) 2009 Damjan Jovanovic * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,148 +18,31 @@ #include -#define COBJMACROS - #include "windef.h" #include "winbase.h" #include "winreg.h" #include "winerror.h" -#include "objbase.h" -#include "sti.h" - -#include "wine/debug.h" - -WINE_DEFAULT_DEBUG_CHANNEL(sti); - -extern HRESULT WINAPI STI_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLSPEC_HIDDEN; -extern BOOL WINAPI STI_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN; - -typedef HRESULT (*fnCreateInstance)(REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj); - -typedef struct -{ - const struct IClassFactoryVtbl *vtbl; - fnCreateInstance pfnCreateInstance; -} sti_cf; - -static inline sti_cf *impl_from_IClassFactory( IClassFactory *iface ) -{ - return (sti_cf *)((char *)iface - FIELD_OFFSET( sti_cf, vtbl )); -} - -static HRESULT sti_create( REFIID riid, IUnknown *pUnkOuter, LPVOID *ppObj ) -{ - if (pUnkOuter != NULL && !IsEqualIID(riid, &IID_IUnknown)) - return CLASS_E_NOAGGREGATION; - - if (IsEqualGUID(riid, &IID_IUnknown)) - return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, pUnkOuter); - else if (IsEqualGUID(riid, &IID_IStillImageW)) - return StiCreateInstanceW(GetCurrentProcess(), STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE, (PSTIW*) ppObj, NULL); - else if (IsEqualGUID(riid, &IID_IStillImageA)) - return StiCreateInstanceA(GetCurrentProcess(), STI_VERSION_REAL, (PSTIA*) ppObj, NULL); - else - { - FIXME("no interface %s\n", debugstr_guid(riid)); - return E_NOINTERFACE; - } -} - -static HRESULT WINAPI sti_cf_QueryInterface( IClassFactory *iface, REFIID riid, LPVOID *ppobj ) -{ - if (IsEqualGUID(riid, &IID_IUnknown) || - IsEqualGUID(riid, &IID_IClassFactory)) - { - IClassFactory_AddRef( iface ); - *ppobj = iface; - return S_OK; - } - FIXME("interface %s not implemented\n", debugstr_guid(riid)); - return E_NOINTERFACE; -} -static ULONG WINAPI sti_cf_AddRef( IClassFactory *iface ) -{ - return 2; -} - -static ULONG WINAPI sti_cf_Release( IClassFactory *iface ) -{ - return 1; -} - -static HRESULT WINAPI sti_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN pOuter, - REFIID riid, LPVOID *ppobj ) -{ - sti_cf *This = impl_from_IClassFactory( iface ); - HRESULT r; - IUnknown *punk; - - TRACE("%p %s %p\n", pOuter, debugstr_guid(riid), ppobj); - - *ppobj = NULL; - - r = This->pfnCreateInstance( riid, pOuter, (LPVOID *)&punk ); - if (FAILED(r)) - return r; - - r = IUnknown_QueryInterface( punk, riid, ppobj ); - if (FAILED(r)) - return r; - - IUnknown_Release( punk ); - return r; -} - -static HRESULT WINAPI sti_cf_LockServer( IClassFactory *iface, BOOL dolock ) -{ - FIXME("(%p)->(%d)\n", iface, dolock); - return S_OK; -} - -static const struct IClassFactoryVtbl sti_cf_vtbl = -{ - sti_cf_QueryInterface, - sti_cf_AddRef, - sti_cf_Release, - sti_cf_CreateInstance, - sti_cf_LockServer -}; - -static sti_cf the_sti_cf = { &sti_cf_vtbl, sti_create }; - -BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved) +/****************************************************************************** + * StiCreateInstance (STI.@) + */ +HRESULT WINAPI StiCreateInstance( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) { - TRACE("(0x%p, %d, %p)\n",hInstDLL,fdwReason,lpvReserved); - - if (fdwReason == DLL_WINE_PREATTACH) - return FALSE; - return STI_DllMain(hInstDLL, fdwReason, lpvReserved); + return STG_E_UNIMPLEMENTEDFUNCTION; } /****************************************************************************** - * DllGetClassObject (STI.@) + * StiCreateInstanceA (STI.@) */ -HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) +HRESULT WINAPI StiCreateInstanceA( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) { - IClassFactory *cf = NULL; - - TRACE("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(iid), ppv); - - if (IsEqualGUID( rclsid, &CLSID_Sti )) - { - cf = (IClassFactory *)&the_sti_cf.vtbl; - } - - if (cf) - return IClassFactory_QueryInterface( cf, iid, ppv ); - return STI_DllGetClassObject( rclsid, iid, ppv ); + return STG_E_UNIMPLEMENTEDFUNCTION; } /****************************************************************************** - * DllCanUnloadNow (STI.@) + * StiCreateInstanceW (STI.@) */ -HRESULT WINAPI DllCanUnloadNow( void ) +HRESULT WINAPI StiCreateInstanceW( HINSTANCE a, DWORD b, LPVOID c, LPVOID d) { - return S_FALSE; + return STG_E_UNIMPLEMENTEDFUNCTION; } diff --git a/dll/win32/sti/sti_private.h b/dll/win32/sti/sti_private.h deleted file mode 100644 index b5e106b60b6..00000000000 --- a/dll/win32/sti/sti_private.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * STI private definitions - * - * Copyright 2009 Damjan Jovanovic - * - * 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 __STI_PRIVATE__ -#define __STI_PRIVATE__ - -typedef struct _stillimage -{ - const struct IStillImageWVtbl *lpVtbl; - const struct IUnknownVtbl *lpInternalUnkVtbl; - IUnknown *pUnkOuter; - LONG ref; -} stillimage; - -#endif /* __STI_PRIVATE__ */ diff --git a/dll/win32/sti/sti_wia.idl b/dll/win32/sti/sti_wia.idl deleted file mode 100644 index aaac943445f..00000000000 --- a/dll/win32/sti/sti_wia.idl +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2009 Damjan Jovanovic - * - * 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 "wia_lh.idl" diff --git a/dll/win32/syssetup/lang/it-IT.rc b/dll/win32/syssetup/lang/it-IT.rc index bc76a2eaca5..ba3f9988707 100644 --- a/dll/win32/syssetup/lang/it-IT.rc +++ b/dll/win32/syssetup/lang/it-IT.rc @@ -213,7 +213,7 @@ BEGIN IDS_GAMES "Giochi" IDS_CMT_SOLITAIRE "Solitario" IDS_CMT_WINEMINE "Campo minato" - IDS_CMT_SPIDER "Spider" + IDS_CMT_SPIDER "Spider Solitaire" END STRINGTABLE @@ -235,7 +235,7 @@ BEGIN IDS_SYS_ENTERTAINMENT "Divertimento" IDS_CMT_MPLAY32 "Esegui Multimedia Player" IDS_CMT_SNDVOL32 "Esegui Controllo Volume" - IDS_CMT_SNDREC32 "Esegui il Registratore di suonoi" + IDS_CMT_SNDREC32 "Launch Sound Recorder" END STRINGTABLE @@ -255,7 +255,7 @@ STRINGTABLE BEGIN IDS_SHORT_CMD "Prompt dei comandi.lnk" IDS_SHORT_EXPLORER "ReactOS Explorer.lnk" - IDS_SHORT_DOWNLOADER "ReactOS gestione applicazioni.lnk" + IDS_SHORT_DOWNLOADER "ReactOS Applications Manager.lnk" IDS_SHORT_SERVICE "Service Manager.lnk" IDS_SHORT_DEVICE "Device Manager.lnk" IDS_SHORT_MPLAY32 "Multimedia Player.lnk" @@ -271,12 +271,12 @@ BEGIN IDS_SHORT_RDESKTOP "Remote Desktop.lnk" IDS_SHORT_KBSWITCH "Layout di tastiera.lnk" IDS_SHORT_EVENTVIEW "Visualizzatore Eventi.lnk" - IDS_SHORT_MSCONFIG "Configurazione del sistema.lnk" + IDS_SHORT_MSCONFIG "Configuratione del sistema.lnk" IDS_SHORT_SNDVOL32 "Controllo Volume.lnk" IDS_SHORT_SNDREC32 "Audiorecorder.lnk" IDS_SHORT_DXDIAG "ReactX Diagnostica.lnk" IDS_SHORT_PAINT "Paint.lnk" - IDS_SHORT_SPIDER "Spider.lnk" + IDS_SHORT_SPIDER "Spider Solitaire.lnk" END STRINGTABLE diff --git a/dll/win32/syssetup/wizard.c b/dll/win32/syssetup/wizard.c index 63d6bc2ed88..7a084f56c26 100644 --- a/dll/win32/syssetup/wizard.c +++ b/dll/win32/syssetup/wizard.c @@ -1960,7 +1960,6 @@ FinishDlgProc(HWND hwndDlg, case WM_DESTROY: { SetupIsActive(0); - PostQuitMessage(0); return TRUE; } @@ -2000,7 +1999,7 @@ FinishDlgProc(HWND hwndDlg, break; case PSN_WIZFINISH: - DestroyWindow(GetParent(hwndDlg)); + /* Handle a Finish button click, if necessary */ break; default: @@ -2270,8 +2269,6 @@ InstallWizard(VOID) HPROPSHEETPAGE ahpsp[8]; PROPSHEETPAGE psp = {0}; UINT nPages = 0; - HWND hWnd; - MSG msg; /* Clear setup data */ ZeroMemory(&SetupData, sizeof(SETUPDATA)); @@ -2348,7 +2345,7 @@ InstallWizard(VOID) /* Create the property sheet */ psh.dwSize = sizeof(PROPSHEETHEADER); - psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_MODELESS; + psh.dwFlags = PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER; psh.hInstance = hDllInstance; psh.hwndParent = NULL; psh.nPages = nPages; @@ -2361,17 +2358,7 @@ InstallWizard(VOID) SetupData.hTitleFont = CreateTitleFont(); /* Display the wizard */ - hWnd = (HWND)PropertySheet(&psh); - ShowWindow(hWnd, SW_SHOW); - - while (GetMessage(&msg, NULL, 0, 0)) - { - if(!IsDialogMessage(hWnd, &msg)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } + PropertySheet(&psh); DeleteObject(SetupData.hTitleFont); } diff --git a/dll/win32/urlmon/bindprot.c b/dll/win32/urlmon/bindprot.c index 29b8532b13d..07d6fc2f525 100644 --- a/dll/win32/urlmon/bindprot.c +++ b/dll/win32/urlmon/bindprot.c @@ -155,7 +155,7 @@ HWND get_notif_hwnd(void) NULL }; - wndclass.hInstance = hProxyDll; + wndclass.hInstance = URLMON_hInstance; wnd_class = RegisterClassExW(&wndclass); if (!wnd_class && GetLastError() == ERROR_CLASS_ALREADY_EXISTS) @@ -164,7 +164,7 @@ HWND get_notif_hwnd(void) tls_data->notif_hwnd = CreateWindowExW(0, wszURLMonikerNotificationWindow, wszURLMonikerNotificationWindow, 0, 0, 0, 0, 0, HWND_MESSAGE, - NULL, hProxyDll, NULL); + NULL, URLMON_hInstance, NULL); if(tls_data->notif_hwnd) tls_data->notif_hwnd_cnt++; diff --git a/dll/win32/urlmon/regsvr.c b/dll/win32/urlmon/regsvr.c index 6e417ac9607..9e278259e37 100644 --- a/dll/win32/urlmon/regsvr.c +++ b/dll/win32/urlmon/regsvr.c @@ -560,7 +560,7 @@ static HRESULT register_inf(BOOL doregister) hAdvpack = LoadLibraryW(wszAdvpack); pRegInstall = (void *)GetProcAddress(hAdvpack, "RegInstall"); - hres = pRegInstall(hProxyDll, doregister ? "RegisterDll" : "UnregisterDll", &strtable); + hres = pRegInstall(URLMON_hInstance, doregister ? "RegisterDll" : "UnregisterDll", &strtable); for(i=0; i < sizeof(pse)/sizeof(pse[0]); i++) heap_free(pse[i].pszValue); diff --git a/dll/win32/urlmon/urlmon_main.c b/dll/win32/urlmon/urlmon_main.c index edaad42289f..272884eb2a6 100644 --- a/dll/win32/urlmon/urlmon_main.c +++ b/dll/win32/urlmon/urlmon_main.c @@ -34,6 +34,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(urlmon); LONG URLMON_refCount = 0; +HINSTANCE URLMON_hInstance = 0; static HMODULE hCabinet = NULL; static DWORD urlmon_tls = TLS_OUT_OF_INDEXES; @@ -143,10 +144,9 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) { TRACE("%p 0x%x %p\n", hinstDLL, fdwReason, fImpLoad); - URLMON_DllMain( hinstDLL, fdwReason, fImpLoad ); - switch(fdwReason) { case DLL_PROCESS_ATTACH: + URLMON_hInstance = hinstDLL; init_session(TRUE); break; diff --git a/dll/win32/urlmon/urlmon_main.h b/dll/win32/urlmon/urlmon_main.h index 071af8dd73e..8db786b7d80 100644 --- a/dll/win32/urlmon/urlmon_main.h +++ b/dll/win32/urlmon/urlmon_main.h @@ -36,7 +36,7 @@ #include "wine/unicode.h" #include "wine/list.h" -extern HINSTANCE hProxyDll DECLSPEC_HIDDEN; +extern HINSTANCE URLMON_hInstance; extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT StdURLMoniker_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); @@ -48,7 +48,6 @@ extern HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT MkProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); -extern BOOL WINAPI URLMON_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllRegisterServer(void) DECLSPEC_HIDDEN; extern HRESULT WINAPI URLMON_DllUnregisterServer(void) DECLSPEC_HIDDEN; diff --git a/dll/win32/urlmon/urlmon_urlmon.idl b/dll/win32/urlmon/urlmon_urlmon.idl index d45ba07e456..71a0719d7d9 100644 --- a/dll/win32/urlmon/urlmon_urlmon.idl +++ b/dll/win32/urlmon/urlmon_urlmon.idl @@ -1,5 +1,5 @@ /* - * Copyright 2009 Piotr Caban for CodeWeavers + * Copyright 2009 Piotr 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 diff --git a/dll/win32/urlmon/usrmarshal.c b/dll/win32/urlmon/usrmarshal.c index 6ff8f04ef26..b94556362be 100644 --- a/dll/win32/urlmon/usrmarshal.c +++ b/dll/win32/urlmon/usrmarshal.c @@ -1,5 +1,5 @@ /* - * Copyright 2009 Piotr Caban for CodeWeavers + * Copyright 2009 Piotr 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 diff --git a/dll/win32/user32/controls/button.c b/dll/win32/user32/controls/button.c index 8b4003bbe58..1f448bd1885 100644 --- a/dll/win32/user32/controls/button.c +++ b/dll/win32/user32/controls/button.c @@ -829,7 +829,7 @@ static void BUTTON_DrawLabel(HWND hwnd, HDC hdc, UINT dtFlags, const RECT *rc) */ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) { - RECT rc, r; + RECT rc, focus_rect, r; UINT dtFlags, uState; HPEN hOldPen; HBRUSH hOldBrush; @@ -865,11 +865,13 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); InflateRect( &rc, -1, -1 ); } + + focus_rect = rc; /* completely skip the drawing if only focus has changed */ if (action == ODA_FOCUS) goto draw_focus; - uState = DFCS_BUTTONPUSH; + uState = DFCS_BUTTONPUSH | DFCS_ADJUSTRECT; if (style & BS_FLAT) uState |= DFCS_MONO; @@ -896,6 +898,8 @@ static void PB_Paint( HWND hwnd, HDC hDC, UINT action ) if (pushedState) OffsetRect(&r, 1, 1); + IntersectClipRect(hDC, rc.left, rc.top, rc.right, rc.bottom); + oldTxtColor = SetTextColor( hDC, GetSysColor(COLOR_BTNTEXT) ); BUTTON_DrawLabel(hwnd, hDC, dtFlags, &r); @@ -908,8 +912,9 @@ draw_focus: { if (!(get_ui_state(hwnd) & UISF_HIDEFOCUS)) { - InflateRect( &rc, -2, -2 ); - DrawFocusRect( hDC, &rc ); + InflateRect( &focus_rect, -1, -1 ); + IntersectRect(&focus_rect, &focus_rect, &rc); + DrawFocusRect( hDC, &focus_rect ); } } diff --git a/dll/win32/user32/misc/stubs.c b/dll/win32/user32/misc/stubs.c index 06608d8c6ff..b053f389da9 100644 --- a/dll/win32/user32/misc/stubs.c +++ b/dll/win32/user32/misc/stubs.c @@ -170,11 +170,11 @@ UserRealizePalette ( HDC hDC ) static HPEN SysColorPens[COLOR_MENUBAR + 1]; static HBRUSH SysColorBrushes[COLOR_MENUBAR + 1]; -DWORD_PTR +DWORD WINAPI SetSysColorsTemp(const COLORREF *pPens, const HBRUSH *pBrushes, - DWORD_PTR n) + DWORD n) { DWORD i; @@ -183,7 +183,7 @@ SetSysColorsTemp(const COLORREF *pPens, /* allocate our structure to remember old colors */ LPVOID pOldCol = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD)+n*sizeof(HPEN)+n*sizeof(HBRUSH)); LPVOID p = pOldCol; - *(DWORD_PTR *)p = n; p = (char*)p + sizeof(DWORD); + *(DWORD *)p = n; p = (char*)p + sizeof(DWORD); memcpy(p, SysColorPens, n*sizeof(HPEN)); p = (char*)p + n*sizeof(HPEN); memcpy(p, SysColorBrushes, n*sizeof(HBRUSH)); p = (char*)p + n*sizeof(HBRUSH); @@ -193,7 +193,7 @@ SetSysColorsTemp(const COLORREF *pPens, SysColorBrushes[i] = pBrushes[i]; } - return (DWORD_PTR) pOldCol; + return (DWORD) pOldCol; /* FIXME: pointer truncation */ } if (!pPens && !pBrushes) /* "restore" call */ { diff --git a/dll/win32/user32/windows/menu.c b/dll/win32/user32/windows/menu.c index 1178558dda0..ade437c840a 100644 --- a/dll/win32/user32/windows/menu.c +++ b/dll/win32/user32/windows/menu.c @@ -3524,11 +3524,11 @@ static BOOL FASTCALL MenuInitTracking(HWND hWnd, HMENU hMenu, BOOL bPopup, UINT /*********************************************************************** * MenuExitTracking */ -static BOOL FASTCALL MenuExitTracking(HWND hWnd, BOOL bPopup) +static BOOL FASTCALL MenuExitTracking(HWND hWnd) { TRACE("hwnd=%p\n", hWnd); - SendMessageW( hWnd, WM_EXITMENULOOP, bPopup, 0 ); + SendMessageW( hWnd, WM_EXITMENULOOP, 0, 0 ); ShowCaret(0); top_popup = 0; top_popup_hmenu = NULL; @@ -3558,7 +3558,7 @@ VOID MenuTrackMouseMenuBar( HWND hWnd, ULONG ht, POINT pt) MenuInitTracking(hWnd, hMenu, FALSE, wFlags); MenuTrackMenu(hMenu, wFlags, pt.x, pt.y, hWnd, NULL); - MenuExitTracking(hWnd, FALSE); + MenuExitTracking(hWnd); } } @@ -3633,7 +3633,7 @@ VOID MenuTrackKbdMenuBar(HWND hwnd, UINT wParam, WCHAR wChar) track_menu: MenuTrackMenu( hTrackMenu, wFlags, 0, 0, hwnd, NULL ); - MenuExitTracking( hwnd, FALSE ); + MenuExitTracking( hwnd ); } @@ -3660,7 +3660,7 @@ BOOL WINAPI TrackPopupMenuEx( HMENU Menu, UINT Flags, int x, int y, if (MenuShowPopup(Wnd, Menu, 0, Flags, x, y, 0, 0 )) ret = MenuTrackMenu(Menu, Flags | TPM_POPUPMENU, 0, 0, Wnd, Tpm ? &Tpm->rcExclude : NULL); - MenuExitTracking(Wnd, TRUE); + MenuExitTracking(Wnd); return ret; } diff --git a/dll/win32/userenv/lang/cs-CZ.rc b/dll/win32/userenv/lang/cs-CZ.rc index 4067447b058..a582d533aab 100644 --- a/dll/win32/userenv/lang/cs-CZ.rc +++ b/dll/win32/userenv/lang/cs-CZ.rc @@ -1,6 +1,20 @@ -/* FILE: dll/win32/devmgr/lang/cs-CZ.rc - * TRANSLATOR: Radek Liska aka Black_Fox (radekliska at gmail dot com) - * UPDATED: 2010-01-07 +/* + * Copyright (C) 2004 Eric Kohl + * 2008 Radek Liska + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ LANGUAGE LANG_CZECH, SUBLANG_DEFAULT @@ -22,7 +36,7 @@ BEGIN IDS_TEMPLATES "Šablony" IDS_RECENT "Poslední dokumenty" IDS_SENDTO "SendTo" - IDS_PRINTHOOD "Okolní tiskárny" + IDS_PRINTHOOD "okolní tiskárny" IDS_NETHOOD "Okolní sí" IDS_LOCALSETTINGS "Local Settings" IDS_LOCALAPPDATA "Local Settings\\Data Aplikací" diff --git a/dll/win32/userenv/setup.c b/dll/win32/userenv/setup.c index ca422dd5e9f..796325c7b0c 100644 --- a/dll/win32/userenv/setup.c +++ b/dll/win32/userenv/setup.c @@ -674,6 +674,10 @@ InitializeProfiles(VOID) } } + SetEnvironmentVariableW(L"ProgramFiles", szProfilesPath); + SetEnvironmentVariableW(L"CommonProgramFiles", szCommonFilesDirPath); + + DPRINT("Success\n"); return TRUE; diff --git a/dll/win32/usp10/bidi.c b/dll/win32/usp10/bidi.c deleted file mode 100644 index 28b5d3e76ce..00000000000 --- a/dll/win32/usp10/bidi.c +++ /dev/null @@ -1,893 +0,0 @@ -/* - * Uniscribe BiDirectional handling - * - * Copyright 2003 Shachar Shemesh - * Copyright 2007 Maarten Lankhorst - * Copyright 2010 CodeWeavers, Aric Stewart - * - * 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 - * - * Code derived from the modified reference implementation - * that was found in revision 17 of http://unicode.org/reports/tr9/ - * "Unicode Standard Annex #9: THE BIDIRECTIONAL ALGORITHM" - * - * -- Copyright (C) 1999-2005, ASMUS, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of the Unicode data files and any associated documentation (the - * "Data Files") or Unicode software and any associated documentation (the - * "Software") to deal in the Data Files or Software without restriction, - * including without limitation the rights to use, copy, modify, merge, - * publish, distribute, and/or sell copies of the Data Files or Software, - * and to permit persons to whom the Data Files or Software are furnished - * to do so, provided that (a) the above copyright notice(s) and this - * permission notice appear with all copies of the Data Files or Software, - * (b) both the above copyright notice(s) and this permission notice appear - * in associated documentation, and (c) there is clear notice in each - * modified Data File or in the Software as well as in the documentation - * associated with the Data File(s) or Software that the data or software - * has been modified. - */ - -#include "config.h" - -#include -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winnls.h" -#include "usp10.h" -#include "wine/unicode.h" -#include "wine/debug.h" - -#include "usp10_internal.h" - -WINE_DEFAULT_DEBUG_CHANNEL(bidi); - -#define ASSERT(x) do { if (!(x)) FIXME("assert failed: %s\n", #x); } while(0) -#define MAX_LEVEL 61 - -/* HELPER FUNCTIONS AND DECLARATIONS */ - -/*------------------------------------------------------------------------ - Bidirectional Character Types - - as defined by the Unicode Bidirectional Algorithm Table 3-7. - - Note: - - The list of bidirectional character types here is not grouped the - same way as the table 3-7, since the numberic values for the types - are chosen to keep the state and action tables compact. -------------------------------------------------------------------------*/ -enum directions -{ - /* input types */ - /* ON MUST be zero, code relies on ON = N = 0 */ - ON = 0, /* Other Neutral */ - L, /* Left Letter */ - R, /* Right Letter */ - AN, /* Arabic Number */ - EN, /* European Number */ - AL, /* Arabic Letter (Right-to-left) */ - NSM, /* Non-spacing Mark */ - CS, /* Common Separator */ - ES, /* European Separator */ - ET, /* European Terminator (post/prefix e.g. $ and %) */ - - /* resolved types */ - BN, /* Boundary neutral (type of RLE etc after explicit levels) */ - - /* input types, */ - S, /* Segment Separator (TAB) // used only in L1 */ - WS, /* White space // used only in L1 */ - B, /* Paragraph Separator (aka as PS) */ - - /* types for explicit controls */ - RLO, /* these are used only in X1-X9 */ - RLE, - LRO, - LRE, - PDF, - - /* resolved types, also resolved directions */ - N = ON, /* alias, where ON, WS and S are treated the same */ -}; - -/* HELPER FUNCTIONS */ -/* the character type contains the C1_* flags in the low 12 bits */ -/* and the C2_* type in the high 4 bits */ -static __inline unsigned short get_char_typeW( WCHAR ch ) -{ - WORD CharType; - GetStringTypeW(CT_CTYPE1, &ch, 1, &CharType); - return CharType; -} - -/* Convert the libwine information to the direction enum */ -static void classify(LPCWSTR lpString, WORD *chartype, DWORD uCount, const SCRIPT_CONTROL *c) -{ - static const enum directions dir_map[16] = - { - L, /* unassigned defaults to L */ - L, - R, - EN, - ES, - ET, - AN, - CS, - B, - S, - WS, - ON, - AL, - NSM, - BN, - PDF /* also LRE, LRO, RLE, RLO */ - }; - - unsigned i; - - for (i = 0; i < uCount; ++i) - { - chartype[i] = dir_map[get_char_typeW(lpString[i]) >> 12]; - switch (chartype[i]) - { - case ES: - if (!c->fLegacyBidiClass) break; - switch (lpString[i]) - { - case '-': - case '+': chartype[i] = N; break; - case '/': chartype[i] = CS; break; - } - break; - case PDF: - switch (lpString[i]) - { - case 0x202A: chartype[i] = LRE; break; - case 0x202B: chartype[i] = RLE; break; - case 0x202C: chartype[i] = PDF; break; - case 0x202D: chartype[i] = LRO; break; - case 0x202E: chartype[i] = RLO; break; - } - break; - } - } -} - -/* Set a run of cval values at locations all prior to, but not including */ -/* iStart, to the new value nval. */ -static void SetDeferredRun(WORD *pval, int cval, int iStart, int nval) -{ - int i = iStart - 1; - for (; i >= iStart - cval; i--) - { - pval[i] = nval; - } -} - -/* RESOLVE EXPLICIT */ - -static WORD GreaterEven(int i) -{ - return odd(i) ? i + 1 : i + 2; -} - -static WORD GreaterOdd(int i) -{ - return odd(i) ? i + 2 : i + 1; -} - -static WORD EmbeddingDirection(int level) -{ - return odd(level) ? R : L; -} - -/*------------------------------------------------------------------------ - Function: resolveExplicit - - Recursively resolves explicit embedding levels and overrides. - Implements rules X1-X9, of the Unicode Bidirectional Algorithm. - - Input: Base embedding level and direction - Character count - - Output: Array of embedding levels - - In/Out: Array of direction classes - - - Note: The function uses two simple counters to keep track of - matching explicit codes and PDF. Use the default argument for - the outermost call. The nesting counter counts the recursion - depth and not the embedding level. -------------------------------------------------------------------------*/ - -static int resolveExplicit(int level, int dir, WORD *pcls, WORD *plevel, int cch, int nNest) -{ - /* always called with a valid nesting level - nesting levels are != embedding levels */ - int nLastValid = nNest; - int ich = 0; - - /* check input values */ - ASSERT(nNest >= 0 && level >= 0 && level <= MAX_LEVEL); - - /* process the text */ - for (; ich < cch; ich++) - { - WORD cls = pcls[ich]; - switch (cls) - { - case LRO: - case LRE: - nNest++; - if (GreaterEven(level) <= MAX_LEVEL - (cls == LRO ? 2 : 0)) - { - plevel[ich] = GreaterEven(level); - pcls[ich] = BN; - ich += resolveExplicit(plevel[ich], (cls == LRE ? N : L), - &pcls[ich+1], &plevel[ich+1], - cch - (ich+1), nNest); - nNest--; - continue; - } - cls = pcls[ich] = BN; - break; - - case RLO: - case RLE: - nNest++; - if (GreaterOdd(level) <= MAX_LEVEL - (cls == RLO ? 2 : 0)) - { - plevel[ich] = GreaterOdd(level); - pcls[ich] = BN; - ich += resolveExplicit(plevel[ich], (cls == RLE ? N : R), - &pcls[ich+1], &plevel[ich+1], - cch - (ich+1), nNest); - nNest--; - continue; - } - cls = pcls[ich] = BN; - break; - - case PDF: - cls = pcls[ich] = BN; - if (nNest) - { - if (nLastValid < nNest) - { - nNest--; - } - else - { - cch = ich; /* break the loop, but complete body */ - } - } - } - - /* Apply the override */ - if (dir != N) - { - cls = dir; - } - plevel[ich] = level; - if (pcls[ich] != BN) - pcls[ich] = cls; - } - - return ich; -} - -/* RESOLVE WEAK TYPES */ - -enum states /* possible states */ -{ - xa, /* arabic letter */ - xr, /* right letter */ - xl, /* left letter */ - - ao, /* arabic lett. foll by ON */ - ro, /* right lett. foll by ON */ - lo, /* left lett. foll by ON */ - - rt, /* ET following R */ - lt, /* ET following L */ - - cn, /* EN, AN following AL */ - ra, /* arabic number foll R */ - re, /* european number foll R */ - la, /* arabic number foll L */ - le, /* european number foll L */ - - ac, /* CS following cn */ - rc, /* CS following ra */ - rs, /* CS,ES following re */ - lc, /* CS following la */ - ls, /* CS,ES following le */ - - ret, /* ET following re */ - let, /* ET following le */ -} ; - -static const int stateWeak[][10] = -{ - /* N, L, R, AN, EN, AL,NSM, CS, ES, ET */ -/*xa*/ { ao, xl, xr, cn, cn, xa, xa, ao, ao, ao }, /* arabic letter */ -/*xr*/ { ro, xl, xr, ra, re, xa, xr, ro, ro, rt }, /* right letter */ -/*xl*/ { lo, xl, xr, la, le, xa, xl, lo, lo, lt }, /* left letter */ - -/*ao*/ { ao, xl, xr, cn, cn, xa, ao, ao, ao, ao }, /* arabic lett. foll by ON*/ -/*ro*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* right lett. foll by ON */ -/*lo*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* left lett. foll by ON */ - -/*rt*/ { ro, xl, xr, ra, re, xa, rt, ro, ro, rt }, /* ET following R */ -/*lt*/ { lo, xl, xr, la, le, xa, lt, lo, lo, lt }, /* ET following L */ - -/*cn*/ { ao, xl, xr, cn, cn, xa, cn, ac, ao, ao }, /* EN, AN following AL */ -/*ra*/ { ro, xl, xr, ra, re, xa, ra, rc, ro, rt }, /* arabic number foll R */ -/*re*/ { ro, xl, xr, ra, re, xa, re, rs, rs,ret }, /* european number foll R */ -/*la*/ { lo, xl, xr, la, le, xa, la, lc, lo, lt }, /* arabic number foll L */ -/*le*/ { lo, xl, xr, la, le, xa, le, ls, ls,let }, /* european number foll L */ - -/*ac*/ { ao, xl, xr, cn, cn, xa, ao, ao, ao, ao }, /* CS following cn */ -/*rc*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* CS following ra */ -/*rs*/ { ro, xl, xr, ra, re, xa, ro, ro, ro, rt }, /* CS,ES following re */ -/*lc*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* CS following la */ -/*ls*/ { lo, xl, xr, la, le, xa, lo, lo, lo, lt }, /* CS,ES following le */ - -/*ret*/{ ro, xl, xr, ra, re, xa,ret, ro, ro,ret }, /* ET following re */ -/*let*/{ lo, xl, xr, la, le, xa,let, lo, lo,let }, /* ET following le */ -}; - -enum actions /* possible actions */ -{ - /* primitives */ - IX = 0x100, /* increment */ - XX = 0xF, /* no-op */ - - /* actions */ - xxx = (XX << 4) + XX, /* no-op */ - xIx = IX + xxx, /* increment run */ - xxN = (XX << 4) + ON, /* set current to N */ - xxE = (XX << 4) + EN, /* set current to EN */ - xxA = (XX << 4) + AN, /* set current to AN */ - xxR = (XX << 4) + R, /* set current to R */ - xxL = (XX << 4) + L, /* set current to L */ - Nxx = (ON << 4) + 0xF, /* set run to neutral */ - Axx = (AN << 4) + 0xF, /* set run to AN */ - ExE = (EN << 4) + EN, /* set run to EN, set current to EN */ - NIx = (ON << 4) + 0xF + IX, /* set run to N, increment */ - NxN = (ON << 4) + ON, /* set run to N, set current to N */ - NxR = (ON << 4) + R, /* set run to N, set current to R */ - NxE = (ON << 4) + EN, /* set run to N, set current to EN */ - - AxA = (AN << 4) + AN, /* set run to AN, set current to AN */ - NxL = (ON << 4) + L, /* set run to N, set current to L */ - LxL = (L << 4) + L, /* set run to L, set current to L */ -} ; - -static const int actionWeak[][10] = -{ - /* N, L, R, AN, EN, AL, NSM, CS, ES, ET */ -/*xa*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxR, xxN, xxN, xxN }, /* arabic letter */ -/*xr*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxR, xxN, xxN, xIx }, /* right letter */ -/*xl*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxL, xxN, xxN, xIx }, /* left letter */ - -/*ao*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxN, xxN, xxN, xxN }, /* arabic lett. foll by ON */ -/*ro*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxN, xxN, xxN, xIx }, /* right lett. foll by ON */ -/*lo*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxN, xxN, xxN, xIx }, /* left lett. foll by ON */ - -/*rt*/ { Nxx, Nxx, Nxx, Nxx, ExE, NxR, xIx, NxN, NxN, xIx }, /* ET following R */ -/*lt*/ { Nxx, Nxx, Nxx, Nxx, LxL, NxR, xIx, NxN, NxN, xIx }, /* ET following L */ - -/*cn*/ { xxx, xxx, xxx, xxx, xxA, xxR, xxA, xIx, xxN, xxN }, /* EN, AN following AL */ -/*ra*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxA, xIx, xxN, xIx }, /* arabic number foll R */ -/*re*/ { xxx, xxx, xxx, xxx, xxE, xxR, xxE, xIx, xIx, xxE }, /* european number foll R */ -/*la*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxA, xIx, xxN, xIx }, /* arabic number foll L */ -/*le*/ { xxx, xxx, xxx, xxx, xxL, xxR, xxL, xIx, xIx, xxL }, /* european number foll L */ - -/*ac*/ { Nxx, Nxx, Nxx, Axx, AxA, NxR, NxN, NxN, NxN, NxN }, /* CS following cn */ -/*rc*/ { Nxx, Nxx, Nxx, Axx, NxE, NxR, NxN, NxN, NxN, NIx }, /* CS following ra */ -/*rs*/ { Nxx, Nxx, Nxx, Nxx, ExE, NxR, NxN, NxN, NxN, NIx }, /* CS,ES following re */ -/*lc*/ { Nxx, Nxx, Nxx, Axx, NxL, NxR, NxN, NxN, NxN, NIx }, /* CS following la */ -/*ls*/ { Nxx, Nxx, Nxx, Nxx, LxL, NxR, NxN, NxN, NxN, NIx }, /* CS,ES following le */ - -/*ret*/{ xxx, xxx, xxx, xxx, xxE, xxR, xxE, xxN, xxN, xxE }, /* ET following re */ -/*let*/{ xxx, xxx, xxx, xxx, xxL, xxR, xxL, xxN, xxN, xxL }, /* ET following le */ -}; - -static int GetDeferredType(int action) -{ - return (action >> 4) & 0xF; -} - -static int GetResolvedType(int action) -{ - return action & 0xF; -} - -/* Note on action table: - - States can be of two kinds: - - Immediate Resolution State, where each input token - is resolved as soon as it is seen. These states have - only single action codes (xxN) or the no-op (xxx) - for static input tokens. - - Deferred Resolution State, where input tokens either - either extend the run (xIx) or resolve its Type (e.g. Nxx). - - Input classes are of three kinds - - Static Input Token, where the class of the token remains - unchanged on output (AN, L, N, R) - - Replaced Input Token, where the class of the token is - always replaced on output (AL, BN, NSM, CS, ES, ET) - - Conditional Input Token, where the class of the token is - changed on output in some, but not all, cases (EN) - - Where tokens are subject to change, a double action - (e.g. NxA, or NxN) is _required_ after deferred states, - resolving both the deferred state and changing the current token. -*/ - -/*------------------------------------------------------------------------ - Function: resolveWeak - - Resolves the directionality of numeric and other weak character types - - Implements rules X10 and W1-W6 of the Unicode Bidirectional Algorithm. - - Input: Array of embedding levels - Character count - - In/Out: Array of directional classes - - Note: On input only these directional classes are expected - AL, HL, R, L, ON, BN, NSM, AN, EN, ES, ET, CS, -------------------------------------------------------------------------*/ -static void resolveWeak(int baselevel, WORD *pcls, WORD *plevel, int cch) -{ - int state = odd(baselevel) ? xr : xl; - int cls; - - int level = baselevel; - int action, clsRun, clsNew; - int cchRun = 0; - int ich = 0; - - for (; ich < cch; ich++) - { - /* ignore boundary neutrals */ - if (pcls[ich] == BN) - { - /* must flatten levels unless at a level change; */ - plevel[ich] = level; - - /* lookahead for level changes */ - if (ich + 1 == cch && level != baselevel) - { - /* have to fixup last BN before end of the loop, since - * its fix-upped value will be needed below the assert */ - pcls[ich] = EmbeddingDirection(level); - } - else if (ich + 1 < cch && level != plevel[ich+1] && pcls[ich+1] != BN) - { - /* fixup LAST BN in front / after a level run to make - * it act like the SOR/EOR in rule X10 */ - int newlevel = plevel[ich+1]; - if (level > newlevel) { - newlevel = level; - } - plevel[ich] = newlevel; - - /* must match assigned level */ - pcls[ich] = EmbeddingDirection(newlevel); - level = plevel[ich+1]; - } - else - { - /* don't interrupt runs */ - if (cchRun) - { - cchRun++; - } - continue; - } - } - - ASSERT(pcls[ich] <= BN); - cls = pcls[ich]; - - action = actionWeak[state][cls]; - - /* resolve the directionality for deferred runs */ - clsRun = GetDeferredType(action); - if (clsRun != XX) - { - SetDeferredRun(pcls, cchRun, ich, clsRun); - cchRun = 0; - } - - /* resolve the directionality class at the current location */ - clsNew = GetResolvedType(action); - if (clsNew != XX) - pcls[ich] = clsNew; - - /* increment a deferred run */ - if (IX & action) - cchRun++; - - state = stateWeak[state][cls]; - } - - /* resolve any deferred runs - * use the direction of the current level to emulate PDF */ - cls = EmbeddingDirection(level); - - /* resolve the directionality for deferred runs */ - clsRun = GetDeferredType(actionWeak[state][cls]); - if (clsRun != XX) - SetDeferredRun(pcls, cchRun, ich, clsRun); -} - -/* RESOLVE NEUTRAL TYPES */ - -/* action values */ -enum neutralactions -{ - /* action to resolve previous input */ - nL = L, /* resolve EN to L */ - En = 3 << 4, /* resolve neutrals run to embedding level direction */ - Rn = R << 4, /* resolve neutrals run to strong right */ - Ln = L << 4, /* resolved neutrals run to strong left */ - In = (1<<8), /* increment count of deferred neutrals */ - LnL = (1<<4)+L, /* set run and EN to L */ -}; - -static int GetDeferredNeutrals(int action, int level) -{ - action = (action >> 4) & 0xF; - if (action == (En >> 4)) - return EmbeddingDirection(level); - else - return action; -} - -static int GetResolvedNeutrals(int action) -{ - action = action & 0xF; - if (action == In) - return 0; - else - return action; -} - -/* state values */ -enum resolvestates -{ - /* new temporary class */ - r, /* R and characters resolved to R */ - l, /* L and characters resolved to L */ - rn, /* N preceded by right */ - ln, /* N preceded by left */ - a, /* AN preceded by left (the abbreviation 'la' is used up above) */ - na, /* N preceded by a */ -} ; - - -/*------------------------------------------------------------------------ - Notes: - - By rule W7, whenever a EN is 'dominated' by an L (including start of - run with embedding direction = L) it is resolved to, and further treated - as L. - - This leads to the need for 'a' and 'na' states. -------------------------------------------------------------------------*/ - -static const int actionNeutrals[][5] = -{ -/* N, L, R, AN, EN = cls */ - { In, 0, 0, 0, 0 }, /* r right */ - { In, 0, 0, 0, L }, /* l left */ - - { In, En, Rn, Rn, Rn }, /* rn N preceded by right */ - { In, Ln, En, En, LnL}, /* ln N preceded by left */ - - { In, 0, 0, 0, L }, /* a AN preceded by left */ - { In, En, Rn, Rn, En }, /* na N preceded by a */ -} ; - -static const int stateNeutrals[][5] = -{ -/* N, L, R, AN, EN */ - { rn, l, r, r, r }, /* r right */ - { ln, l, r, a, l }, /* l left */ - - { rn, l, r, r, r }, /* rn N preceded by right */ - { ln, l, r, a, l }, /* ln N preceded by left */ - - { na, l, r, a, l }, /* a AN preceded by left */ - { na, l, r, a, l }, /* na N preceded by la */ -} ; - -/*------------------------------------------------------------------------ - Function: resolveNeutrals - - Resolves the directionality of neutral character types. - - Implements rules W7, N1 and N2 of the Unicode Bidi Algorithm. - - Input: Array of embedding levels - Character count - Baselevel - - In/Out: Array of directional classes - - Note: On input only these directional classes are expected - R, L, N, AN, EN and BN - - W8 resolves a number of ENs to L -------------------------------------------------------------------------*/ -static void resolveNeutrals(int baselevel, WORD *pcls, const WORD *plevel, int cch) -{ - /* the state at the start of text depends on the base level */ - int state = odd(baselevel) ? r : l; - int cls; - - int cchRun = 0; - int level = baselevel; - - int action, clsRun, clsNew; - int ich = 0; - for (; ich < cch; ich++) - { - /* ignore boundary neutrals */ - if (pcls[ich] == BN) - { - /* include in the count for a deferred run */ - if (cchRun) - cchRun++; - - /* skip any further processing */ - continue; - } - - ASSERT(pcls[ich] < 5); /* "Only N, L, R, AN, EN are allowed" */ - cls = pcls[ich]; - - action = actionNeutrals[state][cls]; - - /* resolve the directionality for deferred runs */ - clsRun = GetDeferredNeutrals(action, level); - if (clsRun != N) - { - SetDeferredRun(pcls, cchRun, ich, clsRun); - cchRun = 0; - } - - /* resolve the directionality class at the current location */ - clsNew = GetResolvedNeutrals(action); - if (clsNew != N) - pcls[ich] = clsNew; - - if (In & action) - cchRun++; - - state = stateNeutrals[state][cls]; - level = plevel[ich]; - } - - /* resolve any deferred runs */ - cls = EmbeddingDirection(level); /* eor has type of current level */ - - /* resolve the directionality for deferred runs */ - clsRun = GetDeferredNeutrals(actionNeutrals[state][cls], level); - if (clsRun != N) - SetDeferredRun(pcls, cchRun, ich, clsRun); -} - -/* RESOLVE IMPLICIT */ - -/*------------------------------------------------------------------------ - Function: resolveImplicit - - Recursively resolves implicit embedding levels. - Implements rules I1 and I2 of the Unicode Bidirectional Algorithm. - - Input: Array of direction classes - Character count - Base level - - In/Out: Array of embedding levels - - Note: levels may exceed 15 on output. - Accepted subset of direction classes - R, L, AN, EN -------------------------------------------------------------------------*/ -static const WORD addLevel[][4] = -{ - /* L, R, AN, EN */ -/* even */ { 0, 1, 2, 2, }, -/* odd */ { 1, 0, 1, 1, } - -}; - -static void resolveImplicit(const WORD * pcls, WORD *plevel, int cch) -{ - int ich = 0; - for (; ich < cch; ich++) - { - /* cannot resolve bn here, since some bn were resolved to strong - * types in resolveWeak. To remove these we need the original - * types, which are available again in resolveWhiteSpace */ - if (pcls[ich] == BN) - { - continue; - } - ASSERT(pcls[ich] > 0); /* "No Neutrals allowed to survive here." */ - ASSERT(pcls[ich] < 5); /* "Out of range." */ - plevel[ich] += addLevel[odd(plevel[ich])][pcls[ich] - 1]; - } -} - -/************************************************************* - * BIDI_DeterminLevels - */ -BOOL BIDI_DetermineLevels( - LPCWSTR lpString, /* [in] The string for which information is to be returned */ - INT uCount, /* [in] Number of WCHARs in string. */ - const SCRIPT_STATE *s, - const SCRIPT_CONTROL *c, - WORD *lpOutLevels /* [out] final string levels */ - ) -{ - WORD *chartype; - unsigned baselevel = 0,j; - TRACE("%s, %d", debugstr_wn(lpString, uCount), uCount); - - chartype = HeapAlloc(GetProcessHeap(), 0, uCount * sizeof(WORD)); - if (!chartype) - { - WARN("Out of memory\n"); - return FALSE; - } - - baselevel = s->uBidiLevel; - - classify(lpString, chartype, uCount, c); - - for (j = 0; j < uCount; ++j) - switch(chartype[j]) - { - case B: - case S: - case WS: - case ON: chartype[j] = N; - default: continue; - } - - /* resolve explicit */ - resolveExplicit(baselevel, N, chartype, lpOutLevels, uCount, 0); - - /* resolve weak */ - resolveWeak(baselevel, chartype, lpOutLevels, uCount); - - /* resolve neutrals */ - resolveNeutrals(baselevel, chartype, lpOutLevels, uCount); - - /* resolveImplicit */ - resolveImplicit(chartype, lpOutLevels, uCount); - - HeapFree(GetProcessHeap(), 0, chartype); - return TRUE; -} - -/* reverse cch indexes */ -static void reverse(int *pidx, int cch) -{ - int temp; - int ich = 0; - for (; ich < --cch; ich++) - { - temp = pidx[ich]; - pidx[ich] = pidx[cch]; - pidx[cch] = temp; - } -} - - -/*------------------------------------------------------------------------ - Functions: reorder/reorderLevel - - Recursively reorders the display string - "From the highest level down, reverse all characters at that level and - higher, down to the lowest odd level" - - Implements rule L2 of the Unicode bidi Algorithm. - - Input: Array of embedding levels - Character count - Flag enabling reversal (set to false by initial caller) - - In/Out: Text to reorder - - Note: levels may exceed 15 resp. 61 on input. - - Rule L3 - reorder combining marks is not implemented here - Rule L4 - glyph mirroring is implemented as a display option below - - Note: this should be applied a line at a time --------------------------------------------------------------------------*/ -int BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse) -{ - int ich = 0; - - /* true as soon as first odd level encountered */ - fReverse = fReverse || odd(level); - - for (; ich < cch; ich++) - { - if (plevel[ich] < level) - { - break; - } - else if (plevel[ich] > level) - { - ich += BIDI_ReorderV2lLevel(level + 1, pIndexs + ich, plevel + ich, - cch - ich, fReverse) - 1; - } - } - if (fReverse) - { - reverse(pIndexs, ich); - } - return ich; -} - -/* Applies the reorder in reverse. Taking an already reordered string and returing the original */ -int BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse) -{ - int ich = 0; - int newlevel = -1; - - /* true as soon as first odd level encountered */ - fReverse = fReverse || odd(level); - - for (; ich < cch; ich++) - { - if (plevel[ich] < level) - break; - else if (plevel[ich] > level) - newlevel = ich; - } - if (fReverse) - { - reverse(pIndexs, ich); - } - - if (newlevel > 1) - { - ich = 0; - for (; ich < cch; ich++) - if (plevel[ich] > level) - ich += BIDI_ReorderL2vLevel(level + 1, pIndexs + ich, plevel + ich, - cch - ich, fReverse) - 1; - } - - return ich; -} diff --git a/dll/win32/usp10/usp10.c b/dll/win32/usp10/usp10.c index 85957143557..cdd6d7b2919 100644 --- a/dll/win32/usp10/usp10.c +++ b/dll/win32/usp10/usp10.c @@ -3,7 +3,6 @@ * * Copyright 2005 Steven Edwards for CodeWeavers * Copyright 2006 Hans Leidekker - * Copyright 2010 CodeWeavers, Aric Stewart * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -33,8 +32,6 @@ #include "winnls.h" #include "usp10.h" -#include "usp10_internal.h" - #include "wine/debug.h" #include "wine/unicode.h" @@ -527,7 +524,6 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem int cnt = 0, index = 0; int New_Script = SCRIPT_UNDEFINED; - WORD *levels = NULL; TRACE("%s,%d,%d,%p,%p,%p,%p\n", debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems, psControl, psState, pItems, pcItems); @@ -535,24 +531,6 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem if (!pwcInChars || !cInChars || !pItems || cMaxItems < 2) return E_INVALIDARG; - if (psState && psControl) - { - int i; - levels = heap_alloc_zero(cInChars * sizeof(WORD)); - if (!levels) - return E_OUTOFMEMORY; - - BIDI_DetermineLevels(pwcInChars, cInChars, psState, psControl, levels); - for (i = 0; i < cInChars; i++) - if (levels[i]!=levels[0]) - break; - if (i >= cInChars) - { - heap_free(levels); - levels = NULL; - } - } - pItems[index].iCharPos = 0; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); @@ -571,29 +549,15 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem if (pwcInChars[cnt] >= Latin_start && pwcInChars[cnt] <= Latin_stop) pItems[index].a.eScript = Script_Latin; - if (levels) - { - pItems[index].a.fRTL = odd(levels[cnt]); - pItems[index].a.fLayoutRTL = odd(levels[cnt]); - pItems[index].a.s.uBidiLevel = levels[cnt]; - } - else if (pItems[index].a.eScript == Script_Arabic) - { + if (pItems[index].a.eScript == Script_Arabic) pItems[index].a.s.uBidiLevel = 1; - pItems[index].a.fRTL = 1; - pItems[index].a.fLayoutRTL = 1; - } - - TRACE("New_Level=%i New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n", - levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript, index, cnt, + TRACE("New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n", + New_Script, pItems[index].a.eScript, index, cnt, pItems[index].iCharPos); for (cnt=1; cnt < cInChars; cnt++) { - if (levels && (levels[cnt] == pItems[index].a.s.uBidiLevel)) - continue; - if (pwcInChars[cnt] == '\r') New_Script = Script_CR; else @@ -614,9 +578,9 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem else New_Script = SCRIPT_UNDEFINED; - if ((levels && (levels[cnt] != pItems[index].a.s.uBidiLevel)) || New_Script != pItems[index].a.eScript) + if (New_Script != pItems[index].a.eScript) { - TRACE("New_Level = %i, New_Script=%d, eScript=%d ", levels?levels[cnt]:-1, New_Script, pItems[index].a.eScript); + TRACE("New_Script=%d, eScript=%d ", New_Script, pItems[index].a.eScript); index++; if (index+1 > cMaxItems) return E_OUTOFMEMORY; @@ -624,18 +588,9 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem pItems[index].iCharPos = cnt; memset(&pItems[index].a, 0, sizeof(SCRIPT_ANALYSIS)); - if (levels) - { - pItems[index].a.fRTL = odd(levels[cnt]); - pItems[index].a.fLayoutRTL = odd(levels[cnt]); - pItems[index].a.s.uBidiLevel = levels[cnt]; - } - else if (New_Script == Script_Arabic) - { + if (New_Script == Script_Arabic) pItems[index].a.s.uBidiLevel = 1; - pItems[index].a.fRTL = 1; - pItems[index].a.fLayoutRTL = 1; - } + pItems[index].a.eScript = New_Script; TRACE("index=%d cnt=%d iCharPos=%d\n", index, cnt, pItems[index].iCharPos); @@ -655,7 +610,6 @@ HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItem /* Set SCRIPT_ITEM */ pItems[index+1].iCharPos = cnt; /* the last + 1 item contains the ptr to the lastchar */ - heap_free(levels); return S_OK; } @@ -732,7 +686,7 @@ HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString, int numGlyphsReturned; /* FIXME: non unicode strings */ - const WCHAR* pStr = (const WCHAR*)pString; + WCHAR* pStr = (WCHAR*)pString; hr = ScriptShape(hdc, sc, &pStr[analysis->pItem[i].iCharPos], cChar, numGlyphs, &analysis->pItem[i].a, glyphs, pwLogClust, psva, &numGlyphsReturned); @@ -1332,7 +1286,6 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, { HRESULT hr; unsigned int i; - BOOL rtl; TRACE("(%p, %p, %s, %d, %d, %p, %p, %p, %p, %p)\n", hdc, psc, debugstr_wn(pwcChars, cChars), cChars, cMaxGlyphs, psa, pwOutGlyphs, pwLogClust, psva, pcGlyphs); @@ -1342,7 +1295,6 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, if (!psva || !pcGlyphs) return E_INVALIDARG; if (cChars > cMaxGlyphs) return E_OUTOFMEMORY; - rtl = (!psa->fLogicalOrder && psa->fRTL); *pcGlyphs = cChars; if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; @@ -1352,42 +1304,33 @@ HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, { for (i = 0; i < cChars; i++) { - int idx = i; - if (rtl) idx = cChars - 1 - i; - if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[idx]))) + if (!(pwOutGlyphs[i] = get_cache_glyph(psc, pwcChars[i]))) { WORD glyph; if (!hdc) return E_PENDING; - if (GetGlyphIndicesW(hdc, &pwcChars[idx], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; - pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[idx], glyph); + if (GetGlyphIndicesW(hdc, &pwcChars[i], 1, &glyph, 0) == GDI_ERROR) return S_FALSE; + pwOutGlyphs[i] = set_cache_glyph(psc, pwcChars[i], glyph); } } } else { TRACE("no glyph translation\n"); - for (i = 0; i < cChars; i++) - { - int idx = i; - if (rtl) idx = cChars - 1 - i; - pwOutGlyphs[i] = pwcChars[idx]; - } + for (i = 0; i < cChars; i++) pwOutGlyphs[i] = pwcChars[i]; } /* set up a valid SCRIPT_VISATTR and LogClust for each char in this run */ for (i = 0; i < cChars; i++) { - int idx = i; - if (rtl) idx = cChars - 1 - i; /* FIXME: set to better values */ - psva[i].uJustification = (pwcChars[idx] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; + psva[i].uJustification = (pwcChars[i] == ' ') ? SCRIPT_JUSTIFY_BLANK : SCRIPT_JUSTIFY_CHARACTER; psva[i].fClusterStart = 1; psva[i].fDiacritic = 0; psva[i].fZeroWidth = 0; psva[i].fReserved = 0; psva[i].fShapeReserved = 0; - pwLogClust[i] = idx; + pwLogClust[i] = i; } return S_OK; } @@ -1630,45 +1573,28 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, AB */ HRESULT WINAPI ScriptLayout(int runs, const BYTE *level, int *vistolog, int *logtovis) { - int* indexs; - int ich; + int i, j = runs - 1, k = 0; TRACE("(%d, %p, %p, %p)\n", runs, level, vistolog, logtovis); if (!level || (!vistolog && !logtovis)) return E_INVALIDARG; - indexs = heap_alloc(sizeof(int) * runs); - if (!indexs) - return E_OUTOFMEMORY; - - - if (vistolog) + for (i = 0; i < runs; i++) { - for( ich = 0; ich < runs; ich++) - indexs[ich] = ich; - - ich = 0; - while (ich < runs) - ich += BIDI_ReorderV2lLevel(0, indexs+ich, level+ich, runs - ich, FALSE); - for (ich = 0; ich < runs; ich++) - vistolog[ich] = indexs[ich]; - } - - - if (logtovis) - { - for( ich = 0; ich < runs; ich++) - indexs[ich] = ich; - - ich = 0; - while (ich < runs) - ich += BIDI_ReorderL2vLevel(0, indexs+ich, level+ich, runs - ich, FALSE); - for (ich = 0; ich < runs; ich++) - logtovis[ich] = indexs[ich]; + if (level[i] % 2) + { + if (vistolog) *vistolog++ = j; + if (logtovis) *logtovis++ = j; + j--; + } + else + { + if (vistolog) *vistolog++ = k; + if (logtovis) *logtovis++ = k; + k++; + } } - heap_free(indexs); - return S_OK; } @@ -1913,3 +1839,9 @@ HRESULT WINAPI ScriptJustify(const SCRIPT_VISATTR *sva, const int *advance, for (i = 0; i < num_glyphs; i++) justify[i] = advance[i]; return S_OK; } + +BOOL gbLpkPresent = FALSE; +VOID WINAPI LpkPresent() +{ + gbLpkPresent = TRUE; /* Turn it on this way! Wine is out of control! */ +} diff --git a/dll/win32/usp10/usp10.rbuild b/dll/win32/usp10/usp10.rbuild index 527578c6edd..ad071018a46 100644 --- a/dll/win32/usp10/usp10.rbuild +++ b/dll/win32/usp10/usp10.rbuild @@ -6,7 +6,6 @@ . include/reactos/wine - bidi.c usp10.c wine gdi32 diff --git a/dll/win32/usp10/usp10.spec b/dll/win32/usp10/usp10.spec index 5e358707c41..0f7b0aa87c5 100644 --- a/dll/win32/usp10/usp10.spec +++ b/dll/win32/usp10/usp10.spec @@ -1,4 +1,4 @@ -@ stub LpkPresent +@ stdcall LpkPresent() @ stdcall ScriptApplyDigitSubstitution(ptr ptr ptr) @ stdcall ScriptApplyLogicalWidth(ptr long long ptr ptr ptr ptr ptr ptr) @ stdcall ScriptBreak(ptr long ptr ptr) diff --git a/dll/win32/usp10/usp10_internal.h b/dll/win32/usp10/usp10_internal.h deleted file mode 100644 index 60e4eff14ab..00000000000 --- a/dll/win32/usp10/usp10_internal.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Implementation of Uniscribe Script Processor (usp10.dll) - * - * Copyright 2010 CodeWeavers, Aric Stewart - * - * 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 odd(x) ((x) & 1) - -BOOL BIDI_DetermineLevels( LPCWSTR lpString, INT uCount, const SCRIPT_STATE *s, - const SCRIPT_CONTROL *c, WORD *lpOutLevels ); - -INT BIDI_ReorderV2lLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); -INT BIDI_ReorderL2vLevel(int level, int *pIndexs, const BYTE* plevel, int cch, BOOL fReverse); diff --git a/dll/win32/version/resource.c b/dll/win32/version/resource.c index 16d9eacf83e..e7d34e08a88 100644 --- a/dll/win32/version/resource.c +++ b/dll/win32/version/resource.c @@ -199,11 +199,7 @@ static BOOL find_ne_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) */ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) { - union - { - IMAGE_NT_HEADERS32 nt32; - IMAGE_NT_HEADERS64 nt64; - } pehd; + IMAGE_NT_HEADERS pehd; DWORD pehdoffset; PIMAGE_DATA_DIRECTORY resDataDir; PIMAGE_SECTION_HEADER sections; @@ -212,27 +208,14 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) const void *resDir; const IMAGE_RESOURCE_DIRECTORY *resPtr; const IMAGE_RESOURCE_DATA_ENTRY *resData; - int i, len, nSections; + int i, nSections; BOOL ret = FALSE; /* Read in PE header */ pehdoffset = LZSeek( lzfd, 0, SEEK_CUR ); - len = LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ); - if (len < sizeof(pehd.nt32.FileHeader)) return 0; - if (len < sizeof(pehd)) memset( (char *)&pehd + len, 0, sizeof(pehd) - len ); - - switch (pehd.nt32.OptionalHeader.Magic) - { - case IMAGE_NT_OPTIONAL_HDR32_MAGIC: - resDataDir = pehd.nt32.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE; - break; - case IMAGE_NT_OPTIONAL_HDR64_MAGIC: - resDataDir = pehd.nt64.OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_RESOURCE; - break; - default: - return 0; - } + if ( sizeof(pehd) != LZRead( lzfd, (LPSTR)&pehd, sizeof(pehd) ) ) return 0; + resDataDir = pehd.OptionalHeader.DataDirectory+IMAGE_DIRECTORY_ENTRY_RESOURCE; if ( !resDataDir->Size ) { TRACE("No resources in PE dll\n" ); @@ -240,13 +223,15 @@ static BOOL find_pe_resource( HFILE lzfd, DWORD *resLen, DWORD *resOff ) } /* Read in section table */ - nSections = pehd.nt32.FileHeader.NumberOfSections; + nSections = pehd.FileHeader.NumberOfSections; sections = HeapAlloc( GetProcessHeap(), 0, nSections * sizeof(IMAGE_SECTION_HEADER) ); if ( !sections ) return FALSE; - len = FIELD_OFFSET( IMAGE_NT_HEADERS32, OptionalHeader ) + pehd.nt32.FileHeader.SizeOfOptionalHeader; - LZSeek( lzfd, pehdoffset + len, SEEK_SET ); + LZSeek( lzfd, pehdoffset + + sizeof(DWORD) + /* Signature */ + sizeof(IMAGE_FILE_HEADER) + + pehd.FileHeader.SizeOfOptionalHeader, SEEK_SET ); if ( nSections * sizeof(IMAGE_SECTION_HEADER) != LZRead( lzfd, (LPSTR)sections, nSections * sizeof(IMAGE_SECTION_HEADER) ) ) diff --git a/dll/win32/windowscodecs/bmpdecode.c b/dll/win32/windowscodecs/bmpdecode.c index 854b3374b02..5c805c8c098 100644 --- a/dll/win32/windowscodecs/bmpdecode.c +++ b/dll/win32/windowscodecs/bmpdecode.c @@ -58,14 +58,12 @@ typedef struct { DWORD bc2AppData; } BITMAPCOREHEADER2; -struct BmpDecoder; -typedef HRESULT (*ReadDataFunc)(struct BmpDecoder* This); +struct BmpFrameDecode; +typedef HRESULT (*ReadDataFunc)(struct BmpFrameDecode* This); -typedef struct BmpDecoder { - const IWICBitmapDecoderVtbl *lpVtbl; - const IWICBitmapFrameDecodeVtbl *lpFrameVtbl; +typedef struct BmpFrameDecode { + const IWICBitmapFrameDecodeVtbl *lpVtbl; LONG ref; - BOOL initialized; IStream *stream; BITMAPFILEHEADER bfh; BITMAPV5HEADER bih; @@ -75,17 +73,12 @@ typedef struct BmpDecoder { INT stride; BYTE *imagedata; BYTE *imagedatastart; - CRITICAL_SECTION lock; /* must be held when initialized/imagedata is set or stream is accessed */ -} BmpDecoder; - -static inline BmpDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) -{ - return CONTAINING_RECORD(iface, BmpDecoder, lpFrameVtbl); -} +} BmpFrameDecode; static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, void **ppv) { + BmpFrameDecode *This = (BmpFrameDecode*)iface; TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); if (!ppv) return E_INVALIDARG; @@ -94,7 +87,7 @@ static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface IsEqualIID(&IID_IWICBitmapSource, iid) || IsEqualIID(&IID_IWICBitmapFrameDecode, iid)) { - *ppv = iface; + *ppv = This; } else { @@ -108,22 +101,35 @@ static HRESULT WINAPI BmpFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface static ULONG WINAPI BmpFrameDecode_AddRef(IWICBitmapFrameDecode *iface) { - BmpDecoder *This = impl_from_frame(iface); + BmpFrameDecode *This = (BmpFrameDecode*)iface; + ULONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); - return IUnknown_AddRef((IUnknown*)This); + return ref; } static ULONG WINAPI BmpFrameDecode_Release(IWICBitmapFrameDecode *iface) { - BmpDecoder *This = impl_from_frame(iface); + BmpFrameDecode *This = (BmpFrameDecode*)iface; + ULONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) refcount=%u\n", iface, ref); + + if (ref == 0) + { + IStream_Release(This->stream); + HeapFree(GetProcessHeap(), 0, This->imagedata); + HeapFree(GetProcessHeap(), 0, This); + } - return IUnknown_Release((IUnknown*)This); + return ref; } static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface, UINT *puiWidth, UINT *puiHeight) { - BmpDecoder *This = impl_from_frame(iface); + BmpFrameDecode *This = (BmpFrameDecode*)iface; TRACE("(%p,%p,%p)\n", iface, puiWidth, puiHeight); if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER)) @@ -143,7 +149,7 @@ static HRESULT WINAPI BmpFrameDecode_GetSize(IWICBitmapFrameDecode *iface, static HRESULT WINAPI BmpFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, WICPixelFormatGUID *pPixelFormat) { - BmpDecoder *This = impl_from_frame(iface); + BmpFrameDecode *This = (BmpFrameDecode*)iface; TRACE("(%p,%p)\n", iface, pPixelFormat); memcpy(pPixelFormat, This->pixelformat, sizeof(GUID)); @@ -174,7 +180,7 @@ static HRESULT BmpHeader_GetResolution(BITMAPV5HEADER *bih, double *pDpiX, doubl static HRESULT WINAPI BmpFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, double *pDpiX, double *pDpiY) { - BmpDecoder *This = impl_from_frame(iface); + BmpFrameDecode *This = (BmpFrameDecode*)iface; TRACE("(%p,%p,%p)\n", iface, pDpiX, pDpiY); return BmpHeader_GetResolution(&This->bih, pDpiX, pDpiY); @@ -184,15 +190,13 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, IWICPalette *pIPalette) { HRESULT hr; - BmpDecoder *This = impl_from_frame(iface); + BmpFrameDecode *This = (BmpFrameDecode*)iface; int count; WICColor *wiccolors=NULL; RGBTRIPLE *bgrcolors=NULL; TRACE("(%p,%p)\n", iface, pIPalette); - EnterCriticalSection(&This->lock); - if (This->bih.bV5Size == sizeof(BITMAPCOREHEADER)) { BITMAPCOREHEADER *bch = (BITMAPCOREHEADER*)&This->bih; @@ -234,8 +238,7 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, } else { - hr = WINCODEC_ERR_PALETTEUNAVAILABLE; - goto end; + return WINCODEC_ERR_PALETTEUNAVAILABLE; } } else @@ -253,11 +256,7 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, tablesize = sizeof(WICColor) * count; wiccolors = HeapAlloc(GetProcessHeap(), 0, tablesize); - if (!wiccolors) - { - hr = E_OUTOFMEMORY; - goto end; - } + if (!wiccolors) return E_OUTOFMEMORY; offset.QuadPart = sizeof(BITMAPFILEHEADER) + This->bih.bV5Size; hr = IStream_Seek(This->stream, offset, STREAM_SEEK_SET, NULL); @@ -276,18 +275,13 @@ static HRESULT WINAPI BmpFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, } else { - hr = WINCODEC_ERR_PALETTEUNAVAILABLE; - goto end; + return WINCODEC_ERR_PALETTEUNAVAILABLE; } } -end: - - LeaveCriticalSection(&This->lock); - - if (SUCCEEDED(hr)) - hr = IWICPalette_InitializeCustom(pIPalette, wiccolors, count); + hr = IWICPalette_InitializeCustom(pIPalette, wiccolors, count); +end: HeapFree(GetProcessHeap(), 0, wiccolors); HeapFree(GetProcessHeap(), 0, bgrcolors); return hr; @@ -296,18 +290,16 @@ end: static HRESULT WINAPI BmpFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { - BmpDecoder *This = impl_from_frame(iface); - HRESULT hr=S_OK; + BmpFrameDecode *This = (BmpFrameDecode*)iface; + HRESULT hr; UINT width, height; TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); - EnterCriticalSection(&This->lock); if (!This->imagedata) { hr = This->read_data_func(This); + if (FAILED(hr)) return hr; } - LeaveCriticalSection(&This->lock); - if (FAILED(hr)) return hr; hr = BmpFrameDecode_GetSize(iface, &width, &height); if (FAILED(hr)) return hr; @@ -338,7 +330,7 @@ static HRESULT WINAPI BmpFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, return WINCODEC_ERR_CODECNOTHUMBNAIL; } -static HRESULT BmpFrameDecode_ReadUncompressed(BmpDecoder* This) +static HRESULT BmpFrameDecode_ReadUncompressed(BmpFrameDecode* This) { UINT bytesperrow; UINT width, height; @@ -395,7 +387,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadRLE8(BmpDecoder* This) +static HRESULT BmpFrameDecode_ReadRLE8(BmpFrameDecode* This) { UINT bytesperrow; UINT width, height; @@ -501,7 +493,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadRLE4(BmpDecoder* This) +static HRESULT BmpFrameDecode_ReadRLE4(BmpFrameDecode* This) { UINT bytesperrow; UINT width, height; @@ -622,7 +614,7 @@ fail: return hr; } -static HRESULT BmpFrameDecode_ReadUnsupported(BmpDecoder* This) +static HRESULT BmpFrameDecode_ReadUnsupported(BmpFrameDecode* This) { return E_FAIL; } @@ -645,7 +637,7 @@ static const struct bitfields_format bitfields_formats[] = { {0} }; -static const IWICBitmapFrameDecodeVtbl BmpDecoder_FrameVtbl = { +static const IWICBitmapFrameDecodeVtbl BmpFrameDecode_Vtbl = { BmpFrameDecode_QueryInterface, BmpFrameDecode_AddRef, BmpFrameDecode_Release, @@ -659,6 +651,19 @@ static const IWICBitmapFrameDecodeVtbl BmpDecoder_FrameVtbl = { BmpFrameDecode_GetThumbnail }; +typedef struct { + const IWICBitmapDecoderVtbl *lpVtbl; + LONG ref; + BOOL initialized; + IStream *stream; + BITMAPFILEHEADER bfh; + BITMAPV5HEADER bih; + BmpFrameDecode *framedecode; + const WICPixelFormatGUID *pixelformat; + int bitsperpixel; + ReadDataFunc read_data_func; +} BmpDecoder; + static HRESULT BmpDecoder_ReadHeaders(BmpDecoder* This, IStream *stream) { HRESULT hr; @@ -868,9 +873,7 @@ static ULONG WINAPI BmpDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { if (This->stream) IStream_Release(This->stream); - HeapFree(GetProcessHeap(), 0, This->imagedata); - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); + if (This->framedecode) IUnknown_Release((IUnknown*)This->framedecode); HeapFree(GetProcessHeap(), 0, This); } @@ -883,9 +886,7 @@ static HRESULT WINAPI BmpDecoder_QueryCapability(IWICBitmapDecoder *iface, IStre HRESULT hr; BmpDecoder *This = (BmpDecoder*)iface; - EnterCriticalSection(&This->lock); hr = BmpDecoder_ReadHeaders(This, pIStream); - LeaveCriticalSection(&This->lock); if (FAILED(hr)) return hr; if (This->read_data_func == BmpFrameDecode_ReadUnsupported) @@ -902,7 +903,6 @@ static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p HRESULT hr; BmpDecoder *This = (BmpDecoder*)iface; - EnterCriticalSection(&This->lock); hr = BmpDecoder_ReadHeaders(This, pIStream); if (SUCCEEDED(hr)) @@ -910,7 +910,6 @@ static HRESULT WINAPI BmpDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p This->stream = pIStream; IStream_AddRef(pIStream); } - LeaveCriticalSection(&This->lock); return hr; } @@ -993,8 +992,25 @@ static HRESULT WINAPI BmpDecoder_GetFrame(IWICBitmapDecoder *iface, if (!This->stream) return WINCODEC_ERR_WRONGSTATE; - *ppIBitmapFrame = (IWICBitmapFrameDecode*)&This->lpFrameVtbl; - IWICBitmapDecoder_AddRef(iface); + if (!This->framedecode) + { + This->framedecode = HeapAlloc(GetProcessHeap(), 0, sizeof(BmpFrameDecode)); + if (!This->framedecode) return E_OUTOFMEMORY; + + This->framedecode->lpVtbl = &BmpFrameDecode_Vtbl; + This->framedecode->ref = 1; + This->framedecode->stream = This->stream; + IStream_AddRef(This->stream); + This->framedecode->bfh = This->bfh; + This->framedecode->bih = This->bih; + This->framedecode->pixelformat = This->pixelformat; + This->framedecode->bitsperpixel = This->bitsperpixel; + This->framedecode->read_data_func = This->read_data_func; + This->framedecode->imagedata = NULL; + } + + *ppIBitmapFrame = (IWICBitmapFrameDecode*)This->framedecode; + IWICBitmapFrameDecode_AddRef((IWICBitmapFrameDecode*)This->framedecode); return S_OK; } @@ -1031,13 +1047,10 @@ HRESULT BmpDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) if (!This) return E_OUTOFMEMORY; This->lpVtbl = &BmpDecoder_Vtbl; - This->lpFrameVtbl = &BmpDecoder_FrameVtbl; This->ref = 1; This->initialized = FALSE; This->stream = NULL; - This->imagedata = NULL; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": BmpDecoder.lock"); + This->framedecode = NULL; ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/dll/win32/windowscodecs/clsfactory.c b/dll/win32/windowscodecs/clsfactory.c index 68e0530fbdc..d8d21052d5e 100644 --- a/dll/win32/windowscodecs/clsfactory.c +++ b/dll/win32/windowscodecs/clsfactory.c @@ -50,7 +50,6 @@ static classinfo wic_classes[] = { {&CLSID_WICGifDecoder, GifDecoder_CreateInstance}, {&CLSID_WICIcoDecoder, IcoDecoder_CreateInstance}, {&CLSID_WICJpegDecoder, JpegDecoder_CreateInstance}, - {&CLSID_WICTiffDecoder, TiffDecoder_CreateInstance}, {&CLSID_WICDefaultFormatConverter, FormatConverter_CreateInstance}, {0}}; diff --git a/dll/win32/windowscodecs/converter.c b/dll/win32/windowscodecs/converter.c index b1c0952b9a2..15c7b0f380a 100644 --- a/dll/win32/windowscodecs/converter.c +++ b/dll/win32/windowscodecs/converter.c @@ -71,7 +71,6 @@ typedef struct FormatConverter { WICBitmapDitherType dither; double alpha_threshold; WICBitmapPaletteType palette_type; - CRITICAL_SECTION lock; /* must be held when initialized */ } FormatConverter; static void make_grayscale_palette(WICColor *colors, UINT num_colors) @@ -766,8 +765,6 @@ static ULONG WINAPI FormatConverter_Release(IWICFormatConverter *iface) if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); if (This->source) IWICBitmapSource_Release(This->source); HeapFree(GetProcessHeap(), 0, This); } @@ -844,56 +841,38 @@ static HRESULT WINAPI FormatConverter_Initialize(IWICFormatConverter *iface, const struct pixelformatinfo *srcinfo, *dstinfo; static INT fixme=0; GUID srcFormat; - HRESULT res=S_OK; + HRESULT res; TRACE("(%p,%p,%s,%u,%p,%0.1f,%u)\n", iface, pISource, debugstr_guid(dstFormat), dither, pIPalette, alphaThresholdPercent, paletteTranslate); if (pIPalette && !fixme++) FIXME("ignoring palette\n"); - EnterCriticalSection(&This->lock); - - if (This->source) - { - res = WINCODEC_ERR_WRONGSTATE; - goto end; - } + if (This->source) return WINCODEC_ERR_WRONGSTATE; res = IWICBitmapSource_GetPixelFormat(pISource, &srcFormat); - if (FAILED(res)) goto end; + if (FAILED(res)) return res; srcinfo = get_formatinfo(&srcFormat); - if (!srcinfo) - { - res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; - goto end; - } + if (!srcinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; dstinfo = get_formatinfo(dstFormat); - if (!dstinfo) - { - res = WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; - goto end; - } + if (!dstinfo) return WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT; if (dstinfo->copy_function) { IWICBitmapSource_AddRef(pISource); + This->source = pISource; This->src_format = srcinfo; This->dst_format = dstinfo; This->dither = dither; This->alpha_threshold = alphaThresholdPercent; This->palette_type = paletteTranslate; - This->source = pISource; } else - res = WINCODEC_ERR_UNSUPPORTEDOPERATION; - -end: - - LeaveCriticalSection(&This->lock); + return WINCODEC_ERR_UNSUPPORTEDOPERATION; - return res; + return S_OK; } static HRESULT WINAPI FormatConverter_CanConvert(IWICFormatConverter *iface, @@ -951,8 +930,6 @@ HRESULT FormatConverter_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** p This->lpVtbl = &FormatConverter_Vtbl; This->ref = 1; This->source = NULL; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": FormatConverter.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/dll/win32/windowscodecs/gifformat.c b/dll/win32/windowscodecs/gifformat.c index 3443b2c1ae1..0597b1afbe3 100644 --- a/dll/win32/windowscodecs/gifformat.c +++ b/dll/win32/windowscodecs/gifformat.c @@ -40,7 +40,6 @@ typedef struct { LONG ref; BOOL initialized; GifFileType *gif; - CRITICAL_SECTION lock; } GifDecoder; typedef struct { @@ -303,8 +302,6 @@ static ULONG WINAPI GifDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); DGifCloseFile(This->gif); HeapFree(GetProcessHeap(), 0, This); } @@ -344,12 +341,9 @@ static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); - EnterCriticalSection(&This->lock); - if (This->initialized || This->gif) { WARN("already initialized\n"); - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; } @@ -359,26 +353,16 @@ static HRESULT WINAPI GifDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p /* read all data from the stream */ This->gif = DGifOpen((void*)pIStream, _gif_inputfunc); - if (!This->gif) - { - LeaveCriticalSection(&This->lock); - return E_FAIL; - } + if (!This->gif) return E_FAIL; ret = DGifSlurp(This->gif); - if (ret == GIF_ERROR) - { - LeaveCriticalSection(&This->lock); - return E_FAIL; - } + if (ret == GIF_ERROR) return E_FAIL; /* make sure we don't use the stream after this method returns */ This->gif->UserData = NULL; This->initialized = TRUE; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -518,8 +502,6 @@ HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->ref = 1; This->initialized = FALSE; This->gif = NULL; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": GifDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/dll/win32/windowscodecs/icoformat.c b/dll/win32/windowscodecs/icoformat.c index e1ea7c6c8d6..ab30ab0a8af 100644 --- a/dll/win32/windowscodecs/icoformat.c +++ b/dll/win32/windowscodecs/icoformat.c @@ -62,7 +62,6 @@ typedef struct { BOOL initialized; IStream *stream; ICONHEADER header; - CRITICAL_SECTION lock; /* must be held when accessing stream */ } IcoDecoder; typedef struct { @@ -513,17 +512,15 @@ static HRESULT WINAPI IcoFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) { IcoFrameDecode *This = (IcoFrameDecode*)iface; - HRESULT hr=S_OK; + HRESULT hr; UINT width, height, stride; TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); - EnterCriticalSection(&This->parent->lock); if (!This->bits) { hr = IcoFrameDecode_ReadPixels(This); + if (FAILED(hr)) return hr; } - LeaveCriticalSection(&This->parent->lock); - if (FAILED(hr)) return hr; width = This->entry.bWidth ? This->entry.bWidth : 256; height = This->entry.bHeight ? This->entry.bHeight : 256; @@ -609,8 +606,6 @@ static ULONG WINAPI IcoDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This); } @@ -634,37 +629,23 @@ static HRESULT WINAPI IcoDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p ULONG bytesread; TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); - EnterCriticalSection(&This->lock); - - if (This->initialized) - { - hr = WINCODEC_ERR_WRONGSTATE; - goto end; - } + if (This->initialized) return WINCODEC_ERR_WRONGSTATE; seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) goto end; + if (FAILED(hr)) return hr; hr = IStream_Read(pIStream, &This->header, sizeof(ICONHEADER), &bytesread); - if (FAILED(hr)) goto end; + if (FAILED(hr)) return hr; if (bytesread != sizeof(ICONHEADER) || This->header.idReserved != 0 || - This->header.idType != 1) - { - hr = E_FAIL; - goto end; - } + This->header.idType != 1) return E_FAIL; This->initialized = TRUE; This->stream = pIStream; IStream_AddRef(pIStream); -end: - - LeaveCriticalSection(&This->lock); - - return hr; + return S_OK; } static HRESULT WINAPI IcoDecoder_GetContainerFormat(IWICBitmapDecoder *iface, @@ -734,32 +715,18 @@ static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, UINT index, IWICBitmapFrameDecode **ppIBitmapFrame) { IcoDecoder *This = (IcoDecoder*)iface; - IcoFrameDecode *result=NULL; + IcoFrameDecode *result; LARGE_INTEGER seek; HRESULT hr; ULONG bytesread; TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame); - EnterCriticalSection(&This->lock); - - if (!This->initialized) - { - hr = WINCODEC_ERR_NOTINITIALIZED; - goto fail; - } + if (!This->initialized) return WINCODEC_ERR_NOTINITIALIZED; - if (This->header.idCount < index) - { - hr = E_INVALIDARG; - goto fail; - } + if (This->header.idCount < index) return E_INVALIDARG; result = HeapAlloc(GetProcessHeap(), 0, sizeof(IcoFrameDecode)); - if (!result) - { - hr = E_OUTOFMEMORY; - goto fail; - } + if (!result) return E_OUTOFMEMORY; result->lpVtbl = &IcoFrameDecode_Vtbl; result->ref = 1; @@ -778,12 +745,9 @@ static HRESULT WINAPI IcoDecoder_GetFrame(IWICBitmapDecoder *iface, *ppIBitmapFrame = (IWICBitmapFrameDecode*)result; - LeaveCriticalSection(&This->lock); - return S_OK; fail: - LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, result); if (SUCCEEDED(hr)) hr = E_FAIL; TRACE("<-- %x\n", hr); @@ -825,8 +789,6 @@ HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->ref = 1; This->stream = NULL; This->initialized = FALSE; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IcoDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/dll/win32/windowscodecs/jpegformat.c b/dll/win32/windowscodecs/jpegformat.c index b5676eaacc8..017e6045790 100644 --- a/dll/win32/windowscodecs/jpegformat.c +++ b/dll/win32/windowscodecs/jpegformat.c @@ -103,7 +103,6 @@ typedef struct { struct jpeg_source_mgr source_mgr; BYTE source_buffer[1024]; BYTE *image_data; - CRITICAL_SECTION lock; } JpegDecoder; static inline JpegDecoder *decoder_from_decompress(j_decompress_ptr decompress) @@ -157,8 +156,6 @@ static ULONG WINAPI JpegDecoder_Release(IWICBitmapDecoder *iface) if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); if (This->cinfo_initialized) pjpeg_destroy_decompress(&This->cinfo); if (This->stream) IStream_Release(This->stream); HeapFree(GetProcessHeap(), 0, This->image_data); @@ -228,13 +225,7 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * int ret; TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOptions); - EnterCriticalSection(&This->lock); - - if (This->cinfo_initialized) - { - LeaveCriticalSection(&This->lock); - return WINCODEC_ERR_WRONGSTATE; - } + if (This->cinfo_initialized) return WINCODEC_ERR_WRONGSTATE; This->cinfo.err = pjpeg_std_error(&This->jerr); @@ -258,7 +249,6 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * if (ret != JPEG_HEADER_OK) { WARN("Jpeg image in stream has bad format, read header returned %d.\n",ret); - LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -270,14 +260,11 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * if (!pjpeg_start_decompress(&This->cinfo)) { ERR("jpeg_start_decompress failed\n"); - LeaveCriticalSection(&This->lock); return E_FAIL; } This->initialized = TRUE; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -461,16 +448,10 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, max_row_needed = prc->Y + prc->Height; if (max_row_needed > This->cinfo.output_height) return E_INVALIDARG; - EnterCriticalSection(&This->lock); - if (!This->image_data) { This->image_data = HeapAlloc(GetProcessHeap(), 0, data_size); - if (!This->image_data) - { - LeaveCriticalSection(&This->lock); - return E_OUTOFMEMORY; - } + if (!This->image_data) return E_OUTOFMEMORY; } while (max_row_needed > This->cinfo.output_scanline) @@ -490,7 +471,6 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, if (ret == 0) { ERR("read_scanlines failed\n"); - LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -512,8 +492,6 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, } } - LeaveCriticalSection(&This->lock); - return copy_pixels(bpp, This->image_data, This->cinfo.output_width, This->cinfo.output_height, stride, prc, cbStride, cbBufferSize, pbBuffer); @@ -581,8 +559,6 @@ HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->cinfo_initialized = FALSE; This->stream = NULL; This->image_data = NULL; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": JpegDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/dll/win32/windowscodecs/palette.c b/dll/win32/windowscodecs/palette.c index 40ab190958e..842d3b51c30 100644 --- a/dll/win32/windowscodecs/palette.c +++ b/dll/win32/windowscodecs/palette.c @@ -40,7 +40,6 @@ typedef struct { UINT count; WICColor *colors; WICBitmapPaletteType type; - CRITICAL_SECTION lock; /* must be held when count, colors, or type is accessed */ } PaletteImpl; static HRESULT WINAPI PaletteImpl_QueryInterface(IWICPalette *iface, REFIID iid, @@ -84,8 +83,6 @@ static ULONG WINAPI PaletteImpl_Release(IWICPalette *iface) if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->colors); HeapFree(GetProcessHeap(), 0, This); } @@ -120,12 +117,10 @@ static HRESULT WINAPI PaletteImpl_InitializeCustom(IWICPalette *iface, memcpy(new_colors, pColors, sizeof(WICColor) * colorCount); } - EnterCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->colors); This->colors = new_colors; This->count = colorCount; This->type = WICBitmapPaletteTypeCustom; - LeaveCriticalSection(&This->lock); return S_OK; } @@ -153,9 +148,7 @@ static HRESULT WINAPI PaletteImpl_GetType(IWICPalette *iface, if (!pePaletteType) return E_INVALIDARG; - EnterCriticalSection(&This->lock); *pePaletteType = This->type; - LeaveCriticalSection(&This->lock); return S_OK; } @@ -168,9 +161,7 @@ static HRESULT WINAPI PaletteImpl_GetColorCount(IWICPalette *iface, UINT *pcCoun if (!pcCount) return E_INVALIDARG; - EnterCriticalSection(&This->lock); *pcCount = This->count; - LeaveCriticalSection(&This->lock); return S_OK; } @@ -184,16 +175,12 @@ static HRESULT WINAPI PaletteImpl_GetColors(IWICPalette *iface, UINT colorCount, if (!pColors || !pcActualColors) return E_INVALIDARG; - EnterCriticalSection(&This->lock); - if (This->count < colorCount) colorCount = This->count; memcpy(pColors, This->colors, sizeof(WICColor) * colorCount); *pcActualColors = colorCount; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -205,12 +192,10 @@ static HRESULT WINAPI PaletteImpl_IsBlackWhite(IWICPalette *iface, BOOL *pfIsBla if (!pfIsBlackWhite) return E_INVALIDARG; - EnterCriticalSection(&This->lock); if (This->type == WICBitmapPaletteTypeFixedBW) *pfIsBlackWhite = TRUE; else *pfIsBlackWhite = FALSE; - LeaveCriticalSection(&This->lock); return S_OK; } @@ -223,7 +208,6 @@ static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGray if (!pfIsGrayscale) return E_INVALIDARG; - EnterCriticalSection(&This->lock); switch(This->type) { case WICBitmapPaletteTypeFixedBW: @@ -235,7 +219,6 @@ static HRESULT WINAPI PaletteImpl_IsGrayscale(IWICPalette *iface, BOOL *pfIsGray default: *pfIsGrayscale = FALSE; } - LeaveCriticalSection(&This->lock); return S_OK; } @@ -251,14 +234,12 @@ static HRESULT WINAPI PaletteImpl_HasAlpha(IWICPalette *iface, BOOL *pfHasAlpha) *pfHasAlpha = FALSE; - EnterCriticalSection(&This->lock); for (i=0; icount; i++) if ((This->colors[i]&0xff000000) != 0xff000000) { *pfHasAlpha = TRUE; break; } - LeaveCriticalSection(&This->lock); return S_OK; } @@ -291,8 +272,6 @@ HRESULT PaletteImpl_Create(IWICPalette **palette) This->count = 0; This->colors = NULL; This->type = WICBitmapPaletteTypeCustom; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PaletteImpl.lock"); *palette = (IWICPalette*)This; diff --git a/dll/win32/windowscodecs/pngformat.c b/dll/win32/windowscodecs/pngformat.c index 3dcbd9aeb44..5af680e876c 100644 --- a/dll/win32/windowscodecs/pngformat.c +++ b/dll/win32/windowscodecs/pngformat.c @@ -162,7 +162,6 @@ typedef struct { UINT stride; const WICPixelFormatGUID *format; BYTE *image_bits; - CRITICAL_SECTION lock; /* must be held when png structures are accessed or initialized is set */ } PngDecoder; static inline PngDecoder *impl_from_frame(IWICBitmapFrameDecode *iface) @@ -215,8 +214,6 @@ static ULONG WINAPI PngDecoder_Release(IWICBitmapDecoder *iface) { if (This->png_ptr) ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This->image_bits); HeapFree(GetProcessHeap(), 0, This); } @@ -249,7 +246,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { PngDecoder *This = (PngDecoder*)iface; LARGE_INTEGER seek; - HRESULT hr=S_OK; + HRESULT hr; png_bytep *row_pointers=NULL; UINT image_size; UINT i; @@ -262,23 +259,16 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p TRACE("(%p,%p,%x)\n", iface, pIStream, cacheOptions); - EnterCriticalSection(&This->lock); - /* initialize libpng */ This->png_ptr = ppng_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!This->png_ptr) - { - hr = E_FAIL; - goto end; - } + if (!This->png_ptr) return E_FAIL; This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_read_struct(&This->png_ptr, NULL, NULL); This->png_ptr = NULL; - hr = E_FAIL; - goto end; + return E_FAIL; } This->end_info = ppng_create_info_struct(This->png_ptr); @@ -286,8 +276,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, NULL); This->png_ptr = NULL; - hr = E_FAIL; - goto end; + return E_FAIL; } /* set up setjmp/longjmp error handling */ @@ -296,15 +285,14 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p ppng_destroy_read_struct(&This->png_ptr, &This->info_ptr, &This->end_info); HeapFree(GetProcessHeap(), 0, row_pointers); This->png_ptr = NULL; - hr = E_FAIL; - goto end; + return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); /* seek to the start of the stream */ seek.QuadPart = 0; hr = IStream_Seek(pIStream, seek, STREAM_SEEK_SET, NULL); - if (FAILED(hr)) goto end; + if (FAILED(hr)) return hr; /* set up custom i/o handling */ ppng_set_read_fn(This->png_ptr, pIStream, user_read_data); @@ -352,8 +340,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat16bppGray; break; default: ERR("invalid grayscale bit depth: %i\n", bit_depth); - hr = E_FAIL; - goto end; + return E_FAIL; } break; case PNG_COLOR_TYPE_GRAY_ALPHA: @@ -370,8 +357,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat64bppRGBA; break; default: ERR("invalid RGBA bit depth: %i\n", bit_depth); - hr = E_FAIL; - goto end; + return E_FAIL; } break; case PNG_COLOR_TYPE_PALETTE: @@ -384,8 +370,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 8: This->format = &GUID_WICPixelFormat8bppIndexed; break; default: ERR("invalid indexed color bit depth: %i\n", bit_depth); - hr = E_FAIL; - goto end; + return E_FAIL; } break; case PNG_COLOR_TYPE_RGB: @@ -399,14 +384,12 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p case 16: This->format = &GUID_WICPixelFormat48bppRGB; break; default: ERR("invalid RGB color bit depth: %i\n", bit_depth); - hr = E_FAIL; - goto end; + return E_FAIL; } break; default: ERR("invalid color type %i\n", color_type); - hr = E_FAIL; - goto end; + return E_FAIL; } /* read the image data */ @@ -416,18 +399,10 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p image_size = This->stride * This->height; This->image_bits = HeapAlloc(GetProcessHeap(), 0, image_size); - if (!This->image_bits) - { - hr = E_OUTOFMEMORY; - goto end; - } + if (!This->image_bits) return E_OUTOFMEMORY; row_pointers = HeapAlloc(GetProcessHeap(), 0, sizeof(png_bytep)*This->height); - if (!row_pointers) - { - hr = E_OUTOFMEMORY; - goto end; - } + if (!row_pointers) return E_OUTOFMEMORY; for (i=0; iheight; i++) row_pointers[i] = This->image_bits + i * This->stride; @@ -441,11 +416,7 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p This->initialized = TRUE; -end: - - LeaveCriticalSection(&This->lock); - - return hr; + return S_OK; } static HRESULT WINAPI PngDecoder_GetContainerFormat(IWICBitmapDecoder *iface, @@ -599,8 +570,6 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac png_uint_32 ret, xres, yres; int unit_type; - EnterCriticalSection(&This->lock); - ret = ppng_get_pHYs(This->png_ptr, This->info_ptr, &xres, &yres, &unit_type); if (ret && unit_type == PNG_RESOLUTION_METER) @@ -614,8 +583,6 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac *pDpiX = *pDpiY = 96.0; } - LeaveCriticalSection(&This->lock); - TRACE("(%p)->(%0.2f,%0.2f)\n", iface, *pDpiX, *pDpiY); return S_OK; @@ -633,24 +600,16 @@ static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface, int num_trans; png_color_16p trans_values; int i; - HRESULT hr=S_OK; TRACE("(%p,%p)\n", iface, pIPalette); - EnterCriticalSection(&This->lock); - ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette); - if (!ret) - { - hr = WINCODEC_ERR_PALETTEUNAVAILABLE; - goto end; - } + if (!ret) return WINCODEC_ERR_PALETTEUNAVAILABLE; if (num_palette > 256) { ERR("palette has %i colors?!\n", num_palette); - hr = E_FAIL; - goto end; + return E_FAIL; } for (i=0; ilock); - - if (SUCCEEDED(hr)) - hr = IWICPalette_InitializeCustom(pIPalette, palette, num_palette); - - return hr; + return IWICPalette_InitializeCustom(pIPalette, palette, num_palette); } static HRESULT WINAPI PngDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, @@ -754,8 +706,6 @@ HRESULT PngDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->end_info = NULL; This->initialized = FALSE; This->image_bits = NULL; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PngDecoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); @@ -802,7 +752,6 @@ typedef struct PngEncoder { UINT lines_written; BOOL frame_committed; BOOL committed; - CRITICAL_SECTION lock; } PngEncoder; static inline PngEncoder *encoder_from_frame(IWICBitmapFrameEncode *iface) @@ -851,18 +800,10 @@ static HRESULT WINAPI PngFrameEncode_Initialize(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%p)\n", iface, pIEncoderOptions); - EnterCriticalSection(&This->lock); - - if (This->frame_initialized) - { - LeaveCriticalSection(&This->lock); - return WINCODEC_ERR_WRONGSTATE; - } + if (This->frame_initialized) return WINCODEC_ERR_WRONGSTATE; This->frame_initialized = TRUE; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -872,19 +813,11 @@ static HRESULT WINAPI PngFrameEncode_SetSize(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%u,%u)\n", iface, uiWidth, uiHeight); - EnterCriticalSection(&This->lock); - - if (!This->frame_initialized || This->info_written) - { - LeaveCriticalSection(&This->lock); - return WINCODEC_ERR_WRONGSTATE; - } + if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; This->width = uiWidth; This->height = uiHeight; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -894,19 +827,11 @@ static HRESULT WINAPI PngFrameEncode_SetResolution(IWICBitmapFrameEncode *iface, PngEncoder *This = encoder_from_frame(iface); TRACE("(%p,%0.2f,%0.2f)\n", iface, dpiX, dpiY); - EnterCriticalSection(&This->lock); - - if (!This->frame_initialized || This->info_written) - { - LeaveCriticalSection(&This->lock); - return WINCODEC_ERR_WRONGSTATE; - } + if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; This->xres = dpiX; This->yres = dpiY; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -917,13 +842,7 @@ static HRESULT WINAPI PngFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface int i; TRACE("(%p,%s)\n", iface, debugstr_guid(pPixelFormat)); - EnterCriticalSection(&This->lock); - - if (!This->frame_initialized || This->info_written) - { - LeaveCriticalSection(&This->lock); - return WINCODEC_ERR_WRONGSTATE; - } + if (!This->frame_initialized || This->info_written) return WINCODEC_ERR_WRONGSTATE; for (i=0; formats[i].guid; i++) { @@ -936,8 +855,6 @@ static HRESULT WINAPI PngFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface This->format = &formats[i]; memcpy(pPixelFormat, This->format->guid, sizeof(GUID)); - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -971,24 +888,15 @@ static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, jmp_buf jmpbuf; TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels); - EnterCriticalSection(&This->lock); - if (!This->frame_initialized || !This->width || !This->height || !This->format) - { - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; - } if (lineCount == 0 || lineCount + This->lines_written > This->height) - { - LeaveCriticalSection(&This->lock); return E_INVALIDARG; - } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { - LeaveCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, row_pointers); return E_FAIL; } @@ -1019,10 +927,7 @@ static HRESULT WINAPI PngFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, row_pointers = HeapAlloc(GetProcessHeap(), 0, lineCount * sizeof(png_byte*)); if (!row_pointers) - { - LeaveCriticalSection(&This->lock); return E_OUTOFMEMORY; - } for (i=0; ipng_ptr, row_pointers, lineCount); This->lines_written += lineCount; - LeaveCriticalSection(&This->lock); - HeapFree(GetProcessHeap(), 0, row_pointers); return S_OK; @@ -1116,18 +1019,12 @@ static HRESULT WINAPI PngFrameEncode_Commit(IWICBitmapFrameEncode *iface) jmp_buf jmpbuf; TRACE("(%p)\n", iface); - EnterCriticalSection(&This->lock); - if (!This->info_written || This->lines_written != This->height || This->frame_committed) - { - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; - } /* set up setjmp/longjmp error handling */ if (setjmp(jmpbuf)) { - LeaveCriticalSection(&This->lock); return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); @@ -1136,8 +1033,6 @@ static HRESULT WINAPI PngFrameEncode_Commit(IWICBitmapFrameEncode *iface) This->frame_committed = TRUE; - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -1207,8 +1102,6 @@ static ULONG WINAPI PngEncoder_Release(IWICBitmapEncoder *iface) if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); if (This->png_ptr) ppng_destroy_write_struct(&This->png_ptr, &This->info_ptr); if (This->stream) @@ -1244,28 +1137,19 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOption); - EnterCriticalSection(&This->lock); - if (This->png_ptr) - { - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; - } /* initialize libpng */ This->png_ptr = ppng_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!This->png_ptr) - { - LeaveCriticalSection(&This->lock); return E_FAIL; - } This->info_ptr = ppng_create_info_struct(This->png_ptr); if (!This->info_ptr) { ppng_destroy_write_struct(&This->png_ptr, NULL); This->png_ptr = NULL; - LeaveCriticalSection(&This->lock); return E_FAIL; } @@ -1279,7 +1163,6 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, This->png_ptr = NULL; IStream_Release(This->stream); This->stream = NULL; - LeaveCriticalSection(&This->lock); return E_FAIL; } ppng_set_error_fn(This->png_ptr, &jmpbuf, user_error_fn, user_warning_fn); @@ -1287,8 +1170,6 @@ static HRESULT WINAPI PngEncoder_Initialize(IWICBitmapEncoder *iface, /* set up custom i/o handling */ ppng_set_write_fn(This->png_ptr, This, user_write_data, user_flush); - LeaveCriticalSection(&This->lock); - return S_OK; } @@ -1338,31 +1219,17 @@ static HRESULT WINAPI PngEncoder_CreateNewFrame(IWICBitmapEncoder *iface, HRESULT hr; TRACE("(%p,%p,%p)\n", iface, ppIFrameEncode, ppIEncoderOptions); - EnterCriticalSection(&This->lock); - if (This->frame_count != 0) - { - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_UNSUPPORTEDOPERATION; - } if (!This->stream) - { - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_NOTINITIALIZED; - } hr = CreatePropertyBag2(ppIEncoderOptions); - if (FAILED(hr)) - { - LeaveCriticalSection(&This->lock); - return hr; - } + if (FAILED(hr)) return hr; This->frame_count = 1; - LeaveCriticalSection(&This->lock); - IWICBitmapEncoder_AddRef(iface); *ppIFrameEncode = (IWICBitmapFrameEncode*)&This->lpFrameVtbl; @@ -1374,18 +1241,11 @@ static HRESULT WINAPI PngEncoder_Commit(IWICBitmapEncoder *iface) PngEncoder *This = (PngEncoder*)iface; TRACE("(%p)\n", iface); - EnterCriticalSection(&This->lock); - if (!This->frame_committed || This->committed) - { - LeaveCriticalSection(&This->lock); return WINCODEC_ERR_WRONGSTATE; - } This->committed = TRUE; - EnterCriticalSection(&This->lock); - return S_OK; } @@ -1449,8 +1309,6 @@ HRESULT PngEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) This->lines_written = 0; This->frame_committed = FALSE; This->committed = FALSE; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": PngEncoder.lock"); ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); IUnknown_Release((IUnknown*)This); diff --git a/dll/win32/windowscodecs/regsvr.c b/dll/win32/windowscodecs/regsvr.c index c5828a6b8b9..c87aa4b2458 100644 --- a/dll/win32/windowscodecs/regsvr.c +++ b/dll/win32/windowscodecs/regsvr.c @@ -727,25 +727,25 @@ static struct regsvr_coclass const coclass_list[] = { "WIC Imaging Factory", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICBmpDecoder, "WIC BMP Decoder", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICPngDecoder, "WIC PNG Decoder", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICPngEncoder, "WIC PNG Encoder", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICBmpEncoder, "WIC BMP Encoder", @@ -757,31 +757,25 @@ static struct regsvr_coclass const coclass_list[] = { "WIC GIF Decoder", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICIcoDecoder, "WIC ICO Decoder", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICJpegDecoder, "WIC JPEG Decoder", NULL, "windowscodecs.dll", - "Both" - }, - { &CLSID_WICTiffDecoder, - "WIC TIFF Decoder", - NULL, - "windowscodecs.dll", - "Both" + "Apartment" }, { &CLSID_WICDefaultFormatConverter, "WIC Default Format Converter", NULL, "windowscodecs.dll", - "Both" + "Apartment" }, { NULL } /* list terminator */ }; @@ -874,27 +868,6 @@ static struct decoder_pattern const png_patterns[] = { {0} }; -static const BYTE tiff_magic_le[] = {0x49,0x49,42,0}; -static const BYTE tiff_magic_be[] = {0x4d,0x4d,0,42}; - -static GUID const * const tiff_formats[] = { - &GUID_WICPixelFormatBlackWhite, - &GUID_WICPixelFormat4bppGray, - &GUID_WICPixelFormat8bppGray, - &GUID_WICPixelFormat4bppIndexed, - &GUID_WICPixelFormat8bppIndexed, - &GUID_WICPixelFormat32bppBGR, - &GUID_WICPixelFormat32bppBGRA, - &GUID_WICPixelFormat32bppPBGRA, - NULL -}; - -static struct decoder_pattern const tiff_patterns[] = { - {4,0,tiff_magic_le,mask_all,0}, - {4,0,tiff_magic_be,mask_all,0}, - {0} -}; - static struct regsvr_decoder const decoder_list[] = { { &CLSID_WICBmpDecoder, "The Wine Project", @@ -946,16 +919,6 @@ static struct regsvr_decoder const decoder_list[] = { png_formats, png_patterns }, - { &CLSID_WICTiffDecoder, - "The Wine Project", - "TIFF Decoder", - "1.0.0.0", - &GUID_VendorMicrosoft, - "image/tiff", - ".tif;.tiff", - tiff_formats, - tiff_patterns - }, { NULL } /* list terminator */ }; diff --git a/dll/win32/windowscodecs/stream.c b/dll/win32/windowscodecs/stream.c index bd5592b9f30..c59a9d27861 100644 --- a/dll/win32/windowscodecs/stream.c +++ b/dll/win32/windowscodecs/stream.c @@ -41,8 +41,6 @@ typedef struct StreamOnMemory { BYTE *pbMemory; DWORD dwMemsize; DWORD dwCurPos; - - CRITICAL_SECTION lock; /* must be held when pbMemory or dwCurPos is accessed */ } StreamOnMemory; static HRESULT WINAPI StreamOnMemory_QueryInterface(IStream *iface, @@ -84,8 +82,6 @@ static ULONG WINAPI StreamOnMemory_Release(IStream *iface) TRACE("(%p) refcount=%u\n", iface, ref); if (ref == 0) { - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); HeapFree(GetProcessHeap(), 0, This); } return ref; @@ -100,12 +96,9 @@ static HRESULT WINAPI StreamOnMemory_Read(IStream *iface, if (!pv) return E_INVALIDARG; - EnterCriticalSection(&This->lock); uBytesRead = min(cb, This->dwMemsize - This->dwCurPos); memcpy(pv, This->pbMemory + This->dwCurPos, uBytesRead); This->dwCurPos += uBytesRead; - LeaveCriticalSection(&This->lock); - if (pcbRead) *pcbRead = uBytesRead; return S_OK; @@ -115,24 +108,18 @@ static HRESULT WINAPI StreamOnMemory_Write(IStream *iface, void const *pv, ULONG cb, ULONG *pcbWritten) { StreamOnMemory *This = (StreamOnMemory*)iface; - HRESULT hr; TRACE("(%p)\n", This); if (!pv) return E_INVALIDARG; - EnterCriticalSection(&This->lock); - if (cb > This->dwMemsize - This->dwCurPos) { - hr = STG_E_MEDIUMFULL; - } - else { + if (cb > This->dwMemsize - This->dwCurPos) return STG_E_MEDIUMFULL; + if (cb) { memcpy(This->pbMemory + This->dwCurPos, pv, cb); This->dwCurPos += cb; - hr = S_OK; - if (pcbWritten) *pcbWritten = cb; } - LeaveCriticalSection(&This->lock); + if (pcbWritten) *pcbWritten = cb; - return hr; + return S_OK; } static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface, @@ -140,29 +127,20 @@ static HRESULT WINAPI StreamOnMemory_Seek(IStream *iface, { StreamOnMemory *This = (StreamOnMemory*)iface; LARGE_INTEGER NewPosition; - HRESULT hr=S_OK; TRACE("(%p)\n", This); - EnterCriticalSection(&This->lock); if (dwOrigin == STREAM_SEEK_SET) NewPosition.QuadPart = dlibMove.QuadPart; else if (dwOrigin == STREAM_SEEK_CUR) NewPosition.QuadPart = This->dwCurPos + dlibMove.QuadPart; else if (dwOrigin == STREAM_SEEK_END) NewPosition.QuadPart = This->dwMemsize + dlibMove.QuadPart; - else hr = E_INVALIDARG; - - if (SUCCEEDED(hr)) { - if (NewPosition.u.HighPart) hr = HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - else if (NewPosition.QuadPart > This->dwMemsize) hr = E_INVALIDARG; - else if (NewPosition.QuadPart < 0) hr = E_INVALIDARG; - } + else return E_INVALIDARG; - if (SUCCEEDED(hr)) { - This->dwCurPos = NewPosition.u.LowPart; + if (NewPosition.u.HighPart) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + if (NewPosition.QuadPart > This->dwMemsize) return E_INVALIDARG; + if (NewPosition.QuadPart < 0) return E_INVALIDARG; + This->dwCurPos = NewPosition.u.LowPart; - if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos; - } - LeaveCriticalSection(&This->lock); - - return hr; + if(plibNewPosition) plibNewPosition->QuadPart = This->dwCurPos; + return S_OK; } /* SetSize isn't implemented in the native windowscodecs DLL either */ @@ -472,16 +450,8 @@ static HRESULT WINAPI IWICStreamImpl_InitializeFromMemory(IWICStream *iface, pObject->pbMemory = pbBuffer; pObject->dwMemsize = cbBufferSize; pObject->dwCurPos = 0; - InitializeCriticalSection(&pObject->lock); - pObject->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": StreamOnMemory.lock"); - - if (InterlockedCompareExchangePointer((void**)&This->pStream, pObject, NULL)) - { - /* Some other thread set the stream first. */ - IStream_Release((IStream*)pObject); - return WINCODEC_ERR_WRONGSTATE; - } + This->pStream = (IStream*)pObject; return S_OK; } diff --git a/dll/win32/windowscodecs/tiffformat.c b/dll/win32/windowscodecs/tiffformat.c deleted file mode 100644 index fe87ddd6ba5..00000000000 --- a/dll/win32/windowscodecs/tiffformat.c +++ /dev/null @@ -1,866 +0,0 @@ -/* - * Copyright 2010 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 "wine/port.h" - -#include -#ifdef HAVE_UNISTD_H -#include -#endif -#ifdef HAVE_TIFFIO_H -#include -#endif - -#define COBJMACROS - -#include "windef.h" -#include "winbase.h" -#include "objbase.h" -#include "wincodec.h" - -#include "wincodecs_private.h" - -#include "wine/debug.h" -#include "wine/library.h" - -WINE_DEFAULT_DEBUG_CHANNEL(wincodecs); - -#ifdef SONAME_LIBTIFF - -static CRITICAL_SECTION init_tiff_cs; -static CRITICAL_SECTION_DEBUG init_tiff_cs_debug = -{ - 0, 0, &init_tiff_cs, - { &init_tiff_cs_debug.ProcessLocksList, - &init_tiff_cs_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": init_tiff_cs") } -}; -static CRITICAL_SECTION init_tiff_cs = { &init_tiff_cs_debug, -1, 0, 0, 0, 0 }; - -static void *libtiff_handle; -#define MAKE_FUNCPTR(f) static typeof(f) * p##f -MAKE_FUNCPTR(TIFFClientOpen); -MAKE_FUNCPTR(TIFFClose); -MAKE_FUNCPTR(TIFFCurrentDirectory); -MAKE_FUNCPTR(TIFFGetField); -MAKE_FUNCPTR(TIFFReadDirectory); -MAKE_FUNCPTR(TIFFReadEncodedStrip); -MAKE_FUNCPTR(TIFFSetDirectory); -#undef MAKE_FUNCPTR - -static void *load_libtiff(void) -{ - void *result; - - EnterCriticalSection(&init_tiff_cs); - - if (!libtiff_handle && - (libtiff_handle = wine_dlopen(SONAME_LIBTIFF, RTLD_NOW, NULL, 0)) != NULL) - { - -#define LOAD_FUNCPTR(f) \ - if((p##f = wine_dlsym(libtiff_handle, #f, NULL, 0)) == NULL) { \ - ERR("failed to load symbol %s\n", #f); \ - libtiff_handle = NULL; \ - LeaveCriticalSection(&init_tiff_cs); \ - return NULL; \ - } - LOAD_FUNCPTR(TIFFClientOpen); - LOAD_FUNCPTR(TIFFClose); - LOAD_FUNCPTR(TIFFCurrentDirectory); - LOAD_FUNCPTR(TIFFGetField); - LOAD_FUNCPTR(TIFFReadDirectory); - LOAD_FUNCPTR(TIFFReadEncodedStrip); - LOAD_FUNCPTR(TIFFSetDirectory); -#undef LOAD_FUNCPTR - - } - - result = libtiff_handle; - - LeaveCriticalSection(&init_tiff_cs); - return result; -} - -static tsize_t tiff_stream_read(thandle_t client_data, tdata_t data, tsize_t size) -{ - IStream *stream = (IStream*)client_data; - ULONG bytes_read; - HRESULT hr; - - hr = IStream_Read(stream, data, size, &bytes_read); - if (FAILED(hr)) bytes_read = 0; - return bytes_read; -} - -static tsize_t tiff_stream_write(thandle_t client_data, tdata_t data, tsize_t size) -{ - IStream *stream = (IStream*)client_data; - ULONG bytes_written; - HRESULT hr; - - hr = IStream_Write(stream, data, size, &bytes_written); - if (FAILED(hr)) bytes_written = 0; - return bytes_written; -} - -static toff_t tiff_stream_seek(thandle_t client_data, toff_t offset, int whence) -{ - IStream *stream = (IStream*)client_data; - LARGE_INTEGER move; - DWORD origin; - ULARGE_INTEGER new_position; - HRESULT hr; - - move.QuadPart = offset; - switch (whence) - { - case SEEK_SET: - origin = STREAM_SEEK_SET; - break; - case SEEK_CUR: - origin = STREAM_SEEK_CUR; - break; - case SEEK_END: - origin = STREAM_SEEK_END; - break; - default: - ERR("unknown whence value %i\n", whence); - return -1; - } - - hr = IStream_Seek(stream, move, origin, &new_position); - if (SUCCEEDED(hr)) return new_position.QuadPart; - else return -1; -} - -static int tiff_stream_close(thandle_t client_data) -{ - /* Caller is responsible for releasing the stream object. */ - return 0; -} - -static toff_t tiff_stream_size(thandle_t client_data) -{ - IStream *stream = (IStream*)client_data; - STATSTG statstg; - HRESULT hr; - - hr = IStream_Stat(stream, &statstg, STATFLAG_NONAME); - - if (SUCCEEDED(hr)) return statstg.cbSize.QuadPart; - else return -1; -} - -static int tiff_stream_map(thandle_t client_data, tdata_t *addr, toff_t *size) -{ - /* Cannot mmap streams */ - return 0; -} - -static void tiff_stream_unmap(thandle_t client_data, tdata_t addr, toff_t size) -{ - /* No need to ever do this, since we can't map things. */ -} - -static TIFF* tiff_open_stream(IStream *stream, const char *mode) -{ - return pTIFFClientOpen("", mode, stream, tiff_stream_read, - tiff_stream_write, tiff_stream_seek, tiff_stream_close, - tiff_stream_size, tiff_stream_map, tiff_stream_unmap); -} - -typedef struct { - const IWICBitmapDecoderVtbl *lpVtbl; - LONG ref; - IStream *stream; - CRITICAL_SECTION lock; /* Must be held when tiff is used or initiailzed is set */ - TIFF *tiff; - BOOL initialized; -} TiffDecoder; - -typedef struct { - const WICPixelFormatGUID *format; - int bpp; - int indexed; - int reverse_bgr; - UINT width, height; - UINT tile_width, tile_height; - UINT tile_stride; - UINT tile_size; -} tiff_decode_info; - -typedef struct { - const IWICBitmapFrameDecodeVtbl *lpVtbl; - LONG ref; - TiffDecoder *parent; - UINT index; - tiff_decode_info decode_info; - INT cached_tile_x, cached_tile_y; - BYTE *cached_tile; -} TiffFrameDecode; - -static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl; - -static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info) -{ - uint16 photometric, bps, samples, planar; - int ret; - - decode_info->indexed = 0; - decode_info->reverse_bgr = 0; - - ret = pTIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &photometric); - if (!ret) - { - WARN("missing PhotometricInterpretation tag\n"); - return E_FAIL; - } - - ret = pTIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bps); - if (!ret) bps = 1; - - switch(photometric) - { - case 1: /* BlackIsZero */ - decode_info->bpp = bps; - switch (bps) - { - case 1: - decode_info->format = &GUID_WICPixelFormatBlackWhite; - break; - case 4: - decode_info->format = &GUID_WICPixelFormat4bppGray; - break; - case 8: - decode_info->format = &GUID_WICPixelFormat8bppGray; - break; - default: - FIXME("unhandled greyscale bit count %u\n", bps); - return E_FAIL; - } - break; - case 2: /* RGB */ - if (bps != 8) - { - FIXME("unhandled RGB bit count %u\n", bps); - return E_FAIL; - } - ret = pTIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samples); - if (samples != 3) - { - FIXME("unhandled RGB sample count %u\n", samples); - return E_FAIL; - } - ret = pTIFFGetField(tiff, TIFFTAG_PLANARCONFIG, &planar); - if (!ret) planar = 1; - if (planar != 1) - { - FIXME("unhandled planar configuration %u\n", planar); - return E_FAIL; - } - decode_info->bpp = bps * samples; - decode_info->reverse_bgr = 1; - decode_info->format = &GUID_WICPixelFormat24bppBGR; - break; - case 3: /* RGB Palette */ - decode_info->indexed = 1; - decode_info->bpp = bps; - switch (bps) - { - case 4: - decode_info->format = &GUID_WICPixelFormat4bppIndexed; - break; - case 8: - decode_info->format = &GUID_WICPixelFormat8bppIndexed; - break; - default: - FIXME("unhandled indexed bit count %u\n", bps); - return E_FAIL; - } - break; - case 0: /* WhiteIsZero */ - case 4: /* Transparency mask */ - case 5: /* CMYK */ - case 6: /* YCbCr */ - case 8: /* CIELab */ - default: - FIXME("unhandled PhotometricInterpretation %u\n", photometric); - return E_FAIL; - } - - ret = pTIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &decode_info->width); - if (!ret) - { - WARN("missing image width\n"); - return E_FAIL; - } - - ret = pTIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &decode_info->height); - if (!ret) - { - WARN("missing image length\n"); - return E_FAIL; - } - - ret = pTIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &decode_info->tile_height); - if (ret) - { - decode_info->tile_width = decode_info->width; - decode_info->tile_stride = ((decode_info->bpp * decode_info->tile_width + 7)/8); - decode_info->tile_size = decode_info->tile_height * decode_info->tile_stride; - } - else - { - /* Probably a tiled image */ - FIXME("missing RowsPerStrip value\n"); - return E_FAIL; - } - - return S_OK; -} - -static HRESULT WINAPI TiffDecoder_QueryInterface(IWICBitmapDecoder *iface, REFIID iid, - void **ppv) -{ - TiffDecoder *This = (TiffDecoder*)iface; - TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); - - if (!ppv) return E_INVALIDARG; - - if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IWICBitmapDecoder, iid)) - { - *ppv = This; - } - else - { - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI TiffDecoder_AddRef(IWICBitmapDecoder *iface) -{ - TiffDecoder *This = (TiffDecoder*)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) refcount=%u\n", iface, ref); - - return ref; -} - -static ULONG WINAPI TiffDecoder_Release(IWICBitmapDecoder *iface) -{ - TiffDecoder *This = (TiffDecoder*)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) refcount=%u\n", iface, ref); - - if (ref == 0) - { - if (This->tiff) pTIFFClose(This->tiff); - if (This->stream) IStream_Release(This->stream); - This->lock.DebugInfo->Spare[0] = 0; - DeleteCriticalSection(&This->lock); - HeapFree(GetProcessHeap(), 0, This); - } - - return ref; -} - -static HRESULT WINAPI TiffDecoder_QueryCapability(IWICBitmapDecoder *iface, IStream *pIStream, - DWORD *pdwCapability) -{ - FIXME("(%p,%p,%p): stub\n", iface, pIStream, pdwCapability); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffDecoder_Initialize(IWICBitmapDecoder *iface, IStream *pIStream, - WICDecodeOptions cacheOptions) -{ - TiffDecoder *This = (TiffDecoder*)iface; - TIFF *tiff; - HRESULT hr=S_OK; - - TRACE("(%p,%p,%x): stub\n", iface, pIStream, cacheOptions); - - EnterCriticalSection(&This->lock); - - if (This->initialized) - { - hr = WINCODEC_ERR_WRONGSTATE; - goto exit; - } - - tiff = tiff_open_stream(pIStream, "r"); - - if (!tiff) - { - hr = E_FAIL; - goto exit; - } - - This->tiff = tiff; - This->stream = pIStream; - IStream_AddRef(pIStream); - This->initialized = TRUE; - -exit: - LeaveCriticalSection(&This->lock); - return hr; -} - -static HRESULT WINAPI TiffDecoder_GetContainerFormat(IWICBitmapDecoder *iface, - GUID *pguidContainerFormat) -{ - memcpy(pguidContainerFormat, &GUID_ContainerFormatTiff, sizeof(GUID)); - return S_OK; -} - -static HRESULT WINAPI TiffDecoder_GetDecoderInfo(IWICBitmapDecoder *iface, - IWICBitmapDecoderInfo **ppIDecoderInfo) -{ - FIXME("(%p,%p): stub\n", iface, ppIDecoderInfo); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffDecoder_CopyPalette(IWICBitmapDecoder *iface, - IWICPalette *pIPalette) -{ - FIXME("(%p,%p): stub\n", iface, pIPalette); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffDecoder_GetMetadataQueryReader(IWICBitmapDecoder *iface, - IWICMetadataQueryReader **ppIMetadataQueryReader) -{ - FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffDecoder_GetPreview(IWICBitmapDecoder *iface, - IWICBitmapSource **ppIBitmapSource) -{ - FIXME("(%p,%p): stub\n", iface, ppIBitmapSource); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffDecoder_GetColorContexts(IWICBitmapDecoder *iface, - UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount) -{ - FIXME("(%p,%u,%p,%p)\n", iface, cCount, ppIColorContexts, pcActualCount); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffDecoder_GetThumbnail(IWICBitmapDecoder *iface, - IWICBitmapSource **ppIThumbnail) -{ - TRACE("(%p,%p)\n", iface, ppIThumbnail); - return WINCODEC_ERR_CODECNOTHUMBNAIL; -} - -static HRESULT WINAPI TiffDecoder_GetFrameCount(IWICBitmapDecoder *iface, - UINT *pCount) -{ - TiffDecoder *This = (TiffDecoder*)iface; - - if (!This->tiff) - { - WARN("(%p) <-- WINCODEC_ERR_WRONGSTATE\n", iface); - return WINCODEC_ERR_WRONGSTATE; - } - - EnterCriticalSection(&This->lock); - while (pTIFFReadDirectory(This->tiff)) { } - *pCount = pTIFFCurrentDirectory(This->tiff)+1; - LeaveCriticalSection(&This->lock); - - TRACE("(%p) <-- %i\n", iface, *pCount); - - return S_OK; -} - -static HRESULT WINAPI TiffDecoder_GetFrame(IWICBitmapDecoder *iface, - UINT index, IWICBitmapFrameDecode **ppIBitmapFrame) -{ - TiffDecoder *This = (TiffDecoder*)iface; - TiffFrameDecode *result; - int res; - tiff_decode_info decode_info; - HRESULT hr; - - TRACE("(%p,%u,%p)\n", iface, index, ppIBitmapFrame); - - if (!This->tiff) - return WINCODEC_ERR_WRONGSTATE; - - EnterCriticalSection(&This->lock); - res = pTIFFSetDirectory(This->tiff, index); - if (!res) hr = E_INVALIDARG; - else hr = tiff_get_decode_info(This->tiff, &decode_info); - LeaveCriticalSection(&This->lock); - - if (SUCCEEDED(hr)) - { - result = HeapAlloc(GetProcessHeap(), 0, sizeof(TiffFrameDecode)); - - if (result) - { - result->lpVtbl = &TiffFrameDecode_Vtbl; - result->ref = 1; - result->parent = This; - result->index = index; - result->decode_info = decode_info; - result->cached_tile_x = -1; - result->cached_tile = HeapAlloc(GetProcessHeap(), 0, decode_info.tile_size); - - if (result->cached_tile) - *ppIBitmapFrame = (IWICBitmapFrameDecode*)result; - else - { - hr = E_OUTOFMEMORY; - HeapFree(GetProcessHeap(), 0, result); - } - } - else hr = E_OUTOFMEMORY; - } - - if (FAILED(hr)) *ppIBitmapFrame = NULL; - - return hr; -} - -static const IWICBitmapDecoderVtbl TiffDecoder_Vtbl = { - TiffDecoder_QueryInterface, - TiffDecoder_AddRef, - TiffDecoder_Release, - TiffDecoder_QueryCapability, - TiffDecoder_Initialize, - TiffDecoder_GetContainerFormat, - TiffDecoder_GetDecoderInfo, - TiffDecoder_CopyPalette, - TiffDecoder_GetMetadataQueryReader, - TiffDecoder_GetPreview, - TiffDecoder_GetColorContexts, - TiffDecoder_GetThumbnail, - TiffDecoder_GetFrameCount, - TiffDecoder_GetFrame -}; - -static HRESULT WINAPI TiffFrameDecode_QueryInterface(IWICBitmapFrameDecode *iface, REFIID iid, - void **ppv) -{ - TiffFrameDecode *This = (TiffFrameDecode*)iface; - TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv); - - if (!ppv) return E_INVALIDARG; - - if (IsEqualIID(&IID_IUnknown, iid) || - IsEqualIID(&IID_IWICBitmapSource, iid) || - IsEqualIID(&IID_IWICBitmapFrameDecode, iid)) - { - *ppv = This; - } - else - { - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI TiffFrameDecode_AddRef(IWICBitmapFrameDecode *iface) -{ - TiffFrameDecode *This = (TiffFrameDecode*)iface; - ULONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) refcount=%u\n", iface, ref); - - return ref; -} - -static ULONG WINAPI TiffFrameDecode_Release(IWICBitmapFrameDecode *iface) -{ - TiffFrameDecode *This = (TiffFrameDecode*)iface; - ULONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) refcount=%u\n", iface, ref); - - if (ref == 0) - { - HeapFree(GetProcessHeap(), 0, This->cached_tile); - HeapFree(GetProcessHeap(), 0, This); - } - - return ref; -} - -static HRESULT WINAPI TiffFrameDecode_GetSize(IWICBitmapFrameDecode *iface, - UINT *puiWidth, UINT *puiHeight) -{ - TiffFrameDecode *This = (TiffFrameDecode*)iface; - - *puiWidth = This->decode_info.width; - *puiHeight = This->decode_info.height; - - TRACE("(%p) <-- %ux%u\n", iface, *puiWidth, *puiHeight); - - return S_OK; -} - -static HRESULT WINAPI TiffFrameDecode_GetPixelFormat(IWICBitmapFrameDecode *iface, - WICPixelFormatGUID *pPixelFormat) -{ - TiffFrameDecode *This = (TiffFrameDecode*)iface; - - memcpy(pPixelFormat, This->decode_info.format, sizeof(GUID)); - - TRACE("(%p) <-- %s\n", This, debugstr_guid(This->decode_info.format)); - - return S_OK; -} - -static HRESULT WINAPI TiffFrameDecode_GetResolution(IWICBitmapFrameDecode *iface, - double *pDpiX, double *pDpiY) -{ - FIXME("(%p,%p,%p)\n", iface, pDpiX, pDpiY); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffFrameDecode_CopyPalette(IWICBitmapFrameDecode *iface, - IWICPalette *pIPalette) -{ - FIXME("(%p,%p)\n", iface, pIPalette); - return E_NOTIMPL; -} - -static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT tile_y) -{ - HRESULT hr=S_OK; - tsize_t ret; - - ret = pTIFFSetDirectory(This->parent->tiff, This->index); - - if (ret == -1) - hr = E_FAIL; - - if (hr == S_OK) - { - ret = pTIFFReadEncodedStrip(This->parent->tiff, tile_y, This->cached_tile, This->decode_info.tile_size); - - if (ret == -1) - hr = E_FAIL; - } - - if (hr == S_OK && This->decode_info.reverse_bgr) - { - if (This->decode_info.format == &GUID_WICPixelFormat24bppBGR) - { - UINT i, total_pixels; - BYTE *pixel, temp; - - total_pixels = This->decode_info.tile_width * This->decode_info.tile_height; - pixel = This->cached_tile; - for (i=0; icached_tile_x = tile_x; - This->cached_tile_y = tile_y; - } - - return hr; -} - -static HRESULT WINAPI TiffFrameDecode_CopyPixels(IWICBitmapFrameDecode *iface, - const WICRect *prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) -{ - TiffFrameDecode *This = (TiffFrameDecode*)iface; - UINT min_tile_x, max_tile_x, min_tile_y, max_tile_y; - UINT tile_x, tile_y; - WICRect rc; - HRESULT hr=S_OK; - BYTE *dst_tilepos; - UINT bytesperrow; - - TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); - - if (prc->X < 0 || prc->Y < 0 || prc->X+prc->Width > This->decode_info.width || - prc->Y+prc->Height > This->decode_info.height) - return E_INVALIDARG; - - bytesperrow = ((This->decode_info.bpp * prc->Width)+7)/8; - - if (cbStride < bytesperrow) - return E_INVALIDARG; - - if ((cbStride * prc->Height) > cbBufferSize) - return E_INVALIDARG; - - min_tile_x = prc->X / This->decode_info.tile_width; - min_tile_y = prc->Y / This->decode_info.tile_height; - max_tile_x = (prc->X+prc->Width-1) / This->decode_info.tile_width; - max_tile_y = (prc->Y+prc->Height-1) / This->decode_info.tile_height; - - EnterCriticalSection(&This->parent->lock); - - for (tile_x=min_tile_x; tile_x <= max_tile_x; tile_x++) - { - for (tile_y=min_tile_y; tile_y <= max_tile_y; tile_y++) - { - if (tile_x != This->cached_tile_x || tile_y != This->cached_tile_y) - { - hr = TiffFrameDecode_ReadTile(This, tile_x, tile_y); - } - - if (SUCCEEDED(hr)) - { - if (prc->X < tile_x * This->decode_info.tile_width) - rc.X = 0; - else - rc.X = prc->X - tile_x * This->decode_info.tile_width; - - if (prc->Y < tile_y * This->decode_info.tile_height) - rc.Y = 0; - else - rc.Y = prc->Y - tile_y * This->decode_info.tile_height; - - if (prc->X+prc->Width > (tile_x+1) * This->decode_info.tile_width) - rc.Width = This->decode_info.tile_width - rc.X; - else - rc.Width = prc->Width + rc.X - prc->X; - - if (prc->Y+prc->Height > (tile_y+1) * This->decode_info.tile_height) - rc.Height = This->decode_info.tile_height - rc.Y; - else - rc.Height = prc->Height + rc.Y - prc->Y; - - dst_tilepos = pbBuffer + (cbStride * (rc.Y - prc->Y)) + - ((This->decode_info.bpp * (rc.X - prc->X) + 7) / 8); - - hr = copy_pixels(This->decode_info.bpp, This->cached_tile, - This->decode_info.tile_width, This->decode_info.tile_height, This->decode_info.tile_stride, - &rc, cbStride, cbBufferSize, dst_tilepos); - } - - if (FAILED(hr)) - { - LeaveCriticalSection(&This->parent->lock); - TRACE("<-- 0x%x\n", hr); - return hr; - } - } - } - - LeaveCriticalSection(&This->parent->lock); - - return S_OK; -} - -static HRESULT WINAPI TiffFrameDecode_GetMetadataQueryReader(IWICBitmapFrameDecode *iface, - IWICMetadataQueryReader **ppIMetadataQueryReader) -{ - FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryReader); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffFrameDecode_GetColorContexts(IWICBitmapFrameDecode *iface, - UINT cCount, IWICColorContext **ppIColorContexts, UINT *pcActualCount) -{ - FIXME("(%p,%u,%p,%p): stub\n", iface, cCount, ppIColorContexts, pcActualCount); - return E_NOTIMPL; -} - -static HRESULT WINAPI TiffFrameDecode_GetThumbnail(IWICBitmapFrameDecode *iface, - IWICBitmapSource **ppIThumbnail) -{ - FIXME("(%p,%p): stub\n", iface, ppIThumbnail); - return E_NOTIMPL; -} - -static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl = { - TiffFrameDecode_QueryInterface, - TiffFrameDecode_AddRef, - TiffFrameDecode_Release, - TiffFrameDecode_GetSize, - TiffFrameDecode_GetPixelFormat, - TiffFrameDecode_GetResolution, - TiffFrameDecode_CopyPalette, - TiffFrameDecode_CopyPixels, - TiffFrameDecode_GetMetadataQueryReader, - TiffFrameDecode_GetColorContexts, - TiffFrameDecode_GetThumbnail -}; - -HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) -{ - HRESULT ret; - TiffDecoder *This; - - TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv); - - *ppv = NULL; - - if (pUnkOuter) return CLASS_E_NOAGGREGATION; - - if (!load_libtiff()) - { - ERR("Failed reading TIFF because unable to load %s\n",SONAME_LIBTIFF); - return E_FAIL; - } - - This = HeapAlloc(GetProcessHeap(), 0, sizeof(TiffDecoder)); - if (!This) return E_OUTOFMEMORY; - - This->lpVtbl = &TiffDecoder_Vtbl; - This->ref = 1; - This->stream = NULL; - InitializeCriticalSection(&This->lock); - This->lock.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": TiffDecoder.lock"); - This->tiff = NULL; - This->initialized = FALSE; - - ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv); - IUnknown_Release((IUnknown*)This); - - return ret; -} - -#else /* !SONAME_LIBTIFF */ - -HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv) -{ - ERR("Trying to load TIFF picture, but Wine was compiled without TIFF support.\n"); - return E_FAIL; -} - -#endif diff --git a/dll/win32/windowscodecs/wincodecs_private.h b/dll/win32/windowscodecs/wincodecs_private.h index 0e72793dafc..632f82206da 100644 --- a/dll/win32/windowscodecs/wincodecs_private.h +++ b/dll/win32/windowscodecs/wincodecs_private.h @@ -28,7 +28,6 @@ extern HRESULT BmpEncoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** extern HRESULT GifDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void** ppv); extern HRESULT IcoDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT JpegDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); -extern HRESULT TiffDecoder_CreateInstance(IUnknown *pUnkOuter, REFIID iid, void** ppv); extern HRESULT PaletteImpl_Create(IWICPalette **palette); extern HRESULT StreamImpl_Create(IWICStream **stream); diff --git a/dll/win32/windowscodecs/windowscodecs.rbuild b/dll/win32/windowscodecs/windowscodecs.rbuild index da8e3e46618..563a7a99352 100644 --- a/dll/win32/windowscodecs/windowscodecs.rbuild +++ b/dll/win32/windowscodecs/windowscodecs.rbuild @@ -28,7 +28,6 @@ propertybag.c regsvr.c stream.c - tiffformat.c ungif.c version.rc diff --git a/dll/win32/wininet/internet.c b/dll/win32/wininet/internet.c index 6fc8a212c89..f4b8a0a3abd 100644 --- a/dll/win32/wininet/internet.c +++ b/dll/win32/wininet/internet.c @@ -102,8 +102,8 @@ static CRITICAL_SECTION_DEBUG WININET_cs_debug = static CRITICAL_SECTION WININET_cs = { &WININET_cs_debug, -1, 0, 0, 0, 0 }; static object_header_t **WININET_Handles; -static UINT_PTR WININET_dwNextHandle; -static UINT_PTR WININET_dwMaxHandles; +static UINT WININET_dwNextHandle; +static UINT WININET_dwMaxHandles; typedef struct { @@ -122,7 +122,7 @@ static const WCHAR szProxyEnable[] = { 'P','r','o','x','y','E','n','a','b','l',' HINTERNET WININET_AllocHandle( object_header_t *info ) { object_header_t **p; - UINT_PTR handle = 0, num; + UINT handle = 0, num; list_init( &info->children ); @@ -173,7 +173,7 @@ object_header_t *WININET_AddRef( object_header_t *info ) object_header_t *WININET_GetObject( HINTERNET hinternet ) { object_header_t *info = NULL; - UINT_PTR handle = (UINT_PTR) hinternet; + UINT handle = (UINT) hinternet; EnterCriticalSection( &WININET_cs ); @@ -183,7 +183,7 @@ object_header_t *WININET_GetObject( HINTERNET hinternet ) LeaveCriticalSection( &WININET_cs ); - TRACE("handle %ld -> %p\n", handle, info); + TRACE("handle %d -> %p\n", handle, info); return info; } @@ -218,7 +218,7 @@ BOOL WININET_Release( object_header_t *info ) BOOL WININET_FreeHandle( HINTERNET hinternet ) { BOOL ret = FALSE; - UINT_PTR handle = (UINT_PTR) hinternet; + UINT handle = (UINT) hinternet; object_header_t *info = NULL, *child, *next; EnterCriticalSection( &WININET_cs ); @@ -229,7 +229,7 @@ BOOL WININET_FreeHandle( HINTERNET hinternet ) if( WININET_Handles[handle] ) { info = WININET_Handles[handle]; - TRACE( "destroying handle %ld for object %p\n", handle+1, info); + TRACE( "destroying handle %d for object %p\n", handle+1, info); WININET_Handles[handle] = NULL; ret = TRUE; } @@ -245,8 +245,8 @@ BOOL WININET_FreeHandle( HINTERNET hinternet ) /* Free all children as native does */ LIST_FOR_EACH_ENTRY_SAFE( child, next, &info->children, object_header_t, entry ) { - TRACE( "freeing child handle %ld for parent handle %ld\n", - (UINT_PTR)child->hInternet, handle+1); + TRACE( "freeing child handle %d for parent handle %d\n", + (UINT)child->hInternet, handle+1); WININET_FreeHandle( child->hInternet ); } WININET_Release( info ); diff --git a/dll/win32/wininet/urlcache.c b/dll/win32/wininet/urlcache.c index 6a39c691475..29d26ab0b6b 100644 --- a/dll/win32/wininet/urlcache.c +++ b/dll/win32/wininet/urlcache.c @@ -986,9 +986,9 @@ static DWORD URLCache_CopyEntry( ZeroMemory((LPBYTE)lpCacheEntryInfo + dwRequiredSize, 4 - (dwRequiredSize % 4)); dwRequiredSize = DWORD_ALIGN(dwRequiredSize); if (bUnicode) - lenUrl = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, NULL, 0); + lenUrl = MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, NULL, 0); else - lenUrl = strlen((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); + lenUrl = strlen((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); dwRequiredSize += (lenUrl + 1) * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); /* FIXME: is source url optional? */ @@ -998,9 +998,9 @@ static DWORD URLCache_CopyEntry( lpCacheEntryInfo->lpszSourceUrlName = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenUrlBytes; if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); + MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenUrl + 1); else - memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); + memcpy(lpCacheEntryInfo->lpszSourceUrlName, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl, lenUrlBytes); } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1029,7 +1029,7 @@ static DWORD URLCache_CopyEntry( if (*lpdwBufferSize >= dwRequiredSize) { lpCacheEntryInfo->lpHeaderInfo = (LPBYTE)lpCacheEntryInfo + dwRequiredSize - pUrlEntry->dwHeaderInfoSize - 1; - memcpy(lpCacheEntryInfo->lpHeaderInfo, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo, pUrlEntry->dwHeaderInfoSize); + memcpy(lpCacheEntryInfo->lpHeaderInfo, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo, pUrlEntry->dwHeaderInfoSize); ((LPBYTE)lpCacheEntryInfo)[dwRequiredSize - 1] = '\0'; } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1041,18 +1041,18 @@ static DWORD URLCache_CopyEntry( int lenExtension; if (bUnicode) - lenExtension = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, NULL, 0); + lenExtension = MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, NULL, 0); else - lenExtension = strlen((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension) + 1; + lenExtension = strlen((LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension) + 1; dwRequiredSize += lenExtension * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); if (*lpdwBufferSize >= dwRequiredSize) { lpCacheEntryInfo->lpszFileExtension = (LPSTR)lpCacheEntryInfo + dwRequiredSize - lenExtension; if (bUnicode) - MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenExtension); + MultiByteToWideChar(CP_ACP, 0, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, -1, (LPWSTR)lpCacheEntryInfo->lpszSourceUrlName, lenExtension); else - memcpy(lpCacheEntryInfo->lpszFileExtension, (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, lenExtension * sizeof(CHAR)); + memcpy(lpCacheEntryInfo->lpszFileExtension, (LPSTR)pUrlEntry + pUrlEntry->dwOffsetFileExtension, lenExtension * sizeof(CHAR)); } if ((dwRequiredSize % 4) && (dwRequiredSize < *lpdwBufferSize)) @@ -1175,8 +1175,8 @@ static inline HASH_CACHEFILE_ENTRY * URLCache_HashEntryFromOffset(LPCURLCACHE_HE static inline BOOL URLCache_IsHashEntryValid(LPCURLCACHE_HEADER pHeader, const HASH_CACHEFILE_ENTRY *pHashEntry) { /* check pHashEntry located within acceptable bounds in the URL cache mapping */ - return ((DWORD)((const BYTE*)pHashEntry - (const BYTE*)pHeader) >= ENTRY_START_OFFSET) && - ((DWORD)((const BYTE*)pHashEntry - (const BYTE*)pHeader) < pHeader->dwFileSize); + return ((DWORD)((LPBYTE)pHashEntry - (LPBYTE)pHeader) >= ENTRY_START_OFFSET) && + ((DWORD)((LPBYTE)pHashEntry - (LPBYTE)pHeader) < pHeader->dwFileSize); } static BOOL URLCache_FindHash(LPCURLCACHE_HEADER pHeader, LPCSTR lpszUrl, struct _HASH_ENTRY ** ppHashEntry) @@ -1557,15 +1557,15 @@ BOOL WINAPI GetUrlCacheEntryInfoA( if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); + TRACE("Found URL: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); if (pUrlEntry->dwOffsetHeaderInfo) - TRACE("Header info: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); + TRACE("Header info: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); if (lpdwCacheEntryInfoBufferSize) { @@ -1639,14 +1639,14 @@ BOOL WINAPI GetUrlCacheEntryInfoW(LPCWSTR lpszUrl, if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); - TRACE("Header info: %s\n", debugstr_a((LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); + TRACE("Found URL: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl)); + TRACE("Header info: %s\n", debugstr_a((LPSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo)); if (lpdwCacheEntryInfoBufferSize) { @@ -3265,9 +3265,9 @@ BOOL WINAPI FindNextUrlCacheEntryA( if (pEntry->dwSignature != URL_SIGNATURE) continue; - pUrlEntry = (const URL_CACHEFILE_ENTRY *)pEntry; - TRACE("Found URL: %s\n", (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); - TRACE("Header info: %s\n", (LPCSTR)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo); + pUrlEntry = (URL_CACHEFILE_ENTRY *)pEntry; + TRACE("Found URL: %s\n", (LPSTR)pUrlEntry + pUrlEntry->dwOffsetUrl); + TRACE("Header info: %s\n", (LPBYTE)pUrlEntry + pUrlEntry->dwOffsetHeaderInfo); error = URLCache_CopyEntry( pContainer, @@ -3563,7 +3563,7 @@ BOOL WINAPI IsUrlCacheEntryExpiredA( LPCSTR url, DWORD dwFlags, FILETIME* pftLas if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } @@ -3625,7 +3625,7 @@ BOOL WINAPI IsUrlCacheEntryExpiredW( LPCWSTR url, DWORD dwFlags, FILETIME* pftLa if (pEntry->dwSignature != URL_SIGNATURE) { URLCacheContainer_UnlockIndex(pContainer, pHeader); - FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPCSTR)&pEntry->dwSignature, sizeof(DWORD))); + FIXME("Trying to retrieve entry of unknown format %s\n", debugstr_an((LPSTR)&pEntry->dwSignature, sizeof(DWORD))); SetLastError(ERROR_FILE_NOT_FOUND); return FALSE; } diff --git a/dll/win32/wintrust/asn.c b/dll/win32/wintrust/asn.c index 865926640a3..69c9dd3d604 100644 --- a/dll/win32/wintrust/asn.c +++ b/dll/win32/wintrust/asn.c @@ -1348,7 +1348,7 @@ static BOOL CRYPT_AsnDecodeSPCLinkInternal(DWORD dwCertEncodingType, link->dwLinkChoice = SPC_FILE_LINK_CHOICE; for (i = 0; i < dataLen / sizeof(WCHAR); i++) link->u.pwszFile[i] = - hton16(*(const WORD *)(ptr + i * sizeof(WCHAR))); + hton16(*(WORD *)(ptr + i * sizeof(WCHAR))); link->u.pwszFile[realDataLen / sizeof(WCHAR)] = '\0'; TRACE("returning file %s\n", debugstr_w(link->u.pwszFile)); } diff --git a/dll/win32/ws2_32/misc/ns.c b/dll/win32/ws2_32/misc/ns.c index fee4f032868..bb89eadfb0d 100644 --- a/dll/win32/ws2_32/misc/ns.c +++ b/dll/win32/ws2_32/misc/ns.c @@ -640,199 +640,7 @@ void free_servent(struct servent* s) HFREE(s); } -/* This function is far from perfect but it works enough */ -static -LPHOSTENT -FindEntryInHosts(IN CONST CHAR FAR* name) -{ - BOOL Found = FALSE; - HANDLE HostsFile; - CHAR HostsDBData[BUFSIZ] = { 0 }; - PCHAR SystemDirectory = HostsDBData; - PCHAR HostsLocation = "\\drivers\\etc\\hosts"; - PCHAR AddressStr, DnsName = NULL, AddrTerm, NameSt, NextLine, ThisLine, Comment; - UINT SystemDirSize = sizeof(HostsDBData) - 1, ValidData = 0; - DWORD ReadSize; - ULONG Address; - PWINSOCK_THREAD_BLOCK p = NtCurrentTeb()->WinSockData; - - /* We assume that the parameters are valid */ - - if (!GetSystemDirectoryA(SystemDirectory, SystemDirSize)) - { - WSASetLastError(WSANO_RECOVERY); - WS_DbgPrint(MIN_TRACE, ("Could not get windows system directory.\n")); - return NULL; /* Can't get system directory */ - } - - strncat(SystemDirectory, - HostsLocation, - SystemDirSize ); - - HostsFile = CreateFileA(SystemDirectory, - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, - NULL); - if (HostsFile == INVALID_HANDLE_VALUE) - { - WSASetLastError(WSANO_RECOVERY); - return NULL; - } - - while(!Found && - ReadFile(HostsFile, - HostsDBData + ValidData, - sizeof(HostsDBData) - ValidData, - &ReadSize, - NULL)) - { - ValidData += ReadSize; - ReadSize = 0; - NextLine = ThisLine = HostsDBData; - - /* Find the beginning of the next line */ - while(NextLine < HostsDBData + ValidData && - *NextLine != '\r' && *NextLine != '\n' ) - { - NextLine++; - } - - /* Zero and skip, so we can treat what we have as a string */ - if( NextLine > HostsDBData + ValidData ) - break; - - *NextLine = 0; NextLine++; - - Comment = strchr( ThisLine, '#' ); - if( Comment ) *Comment = 0; /* Terminate at comment start */ - - AddressStr = ThisLine; - /* Find the first space separating the IP address from the DNS name */ - AddrTerm = strchr(ThisLine, ' '); - if (AddrTerm) - { - /* Terminate the address string */ - *AddrTerm = 0; - /* Find the last space before the DNS name */ - NameSt = strrchr(ThisLine, ' '); - - /* If there is only one space (the one we removed above), then just use the address terminator */ - if (!NameSt) - NameSt = AddrTerm; - - /* Move from the space to the first character of the DNS name */ - NameSt++; - - DnsName = NameSt; - - if (!strcmp(name, DnsName)) - { - Found = TRUE; - break; - } - } - - /* Get rid of everything we read so far */ - while( NextLine <= HostsDBData + ValidData && - isspace (*NextLine)) - { - NextLine++; - } - - if (HostsDBData + ValidData - NextLine <= 0) - break; - - WS_DbgPrint(MAX_TRACE,("About to move %d chars\n", - HostsDBData + ValidData - NextLine)); - - memmove(HostsDBData, - NextLine, - HostsDBData + ValidData - NextLine ); - ValidData -= NextLine - HostsDBData; - WS_DbgPrint(MAX_TRACE,("Valid bytes: %d\n", ValidData)); - } - - CloseHandle(HostsFile); - - if (!Found) - { - WS_DbgPrint(MAX_TRACE,("Not found\n")); - WSASetLastError(WSANO_DATA); - return NULL; - } - - if( !p->Hostent ) - { - p->Hostent = HeapAlloc(GlobalHeap, 0, sizeof(*p->Hostent)); - if( !p->Hostent ) - { - WSASetLastError( WSATRY_AGAIN ); - return NULL; - } - } - - p->Hostent->h_name = HeapAlloc(GlobalHeap, 0, strlen(DnsName)); - if( !p->Hostent->h_name ) - { - WSASetLastError( WSATRY_AGAIN ); - return NULL; - } - - RtlCopyMemory(p->Hostent->h_name, - DnsName, - strlen(DnsName)); - - p->Hostent->h_aliases = HeapAlloc(GlobalHeap, 0, sizeof(char *)); - if( !p->Hostent->h_aliases ) - { - WSASetLastError( WSATRY_AGAIN ); - return NULL; - } - - p->Hostent->h_aliases[0] = 0; - - if (strstr(AddressStr, ":")) - { - DbgPrint("AF_INET6 NOT SUPPORTED!\n"); - WSASetLastError(WSAEINVAL); - return NULL; - } - else - p->Hostent->h_addrtype = AF_INET; - - p->Hostent->h_addr_list = HeapAlloc(GlobalHeap, 0, sizeof(char *)); - if( !p->Hostent->h_addr_list ) - { - WSASetLastError( WSATRY_AGAIN ); - return NULL; - } - - Address = inet_addr(AddressStr); - if (Address == INADDR_NONE) - { - WSASetLastError(WSAEINVAL); - return NULL; - } - - p->Hostent->h_addr_list[0] = HeapAlloc(GlobalHeap, 0, sizeof(Address)); - if( !p->Hostent->h_addr_list[0] ) - { - WSASetLastError( WSATRY_AGAIN ); - return NULL; - } - - RtlCopyMemory(p->Hostent->h_addr_list[0], - &Address, - sizeof(Address)); - - p->Hostent->h_length = sizeof(Address); - - return p->Hostent; -} LPHOSTENT EXPORT @@ -853,7 +661,6 @@ gethostbyname(IN CONST CHAR FAR* name) /* include/WinDNS.h -- look up DNS_RECORD on MSDN */ PDNS_RECORD dp = 0; PWINSOCK_THREAD_BLOCK p; - LPHOSTENT Hostent; addr = GH_INVALID; @@ -919,12 +726,6 @@ gethostbyname(IN CONST CHAR FAR* name) case GH_RFC1123_DNS: /* DNS_TYPE_A: include/WinDNS.h */ /* DnsQuery -- lib/dnsapi/dnsapi/query.c */ - - /* Look for the DNS name in the hosts file */ - Hostent = FindEntryInHosts(name); - if (Hostent) - return Hostent; - dns_status = DnsQuery_A(name, DNS_TYPE_A, DNS_QUERY_STANDARD, @@ -1192,7 +993,7 @@ getservbyname(IN CONST CHAR FAR* name, } /* Zero and skip, so we can treat what we have as a string */ - if( NextLine > ServiceDBData + ValidData ) + if( NextLine >= ServiceDBData + ValidData ) break; *NextLine = 0; NextLine++; @@ -1373,7 +1174,7 @@ getservbyport(IN INT port, *NextLine != '\r' && *NextLine != '\n' ) NextLine++; /* Zero and skip, so we can treat what we have as a string */ - if( NextLine > ServiceDBData + ValidData ) + if( NextLine >= ServiceDBData + ValidData ) break; *NextLine = 0; NextLine++; diff --git a/drivers/bus/acpi/acpi.rbuild b/drivers/bus/acpi/acpi.rbuild index 334cdfc7024..c3e5b7dac90 100644 --- a/drivers/bus/acpi/acpi.rbuild +++ b/drivers/bus/acpi/acpi.rbuild @@ -10,7 +10,7 @@ - + @@ -36,4 +36,3 @@ buspdo.c main.c - diff --git a/drivers/bus/directory.rbuild b/drivers/bus/directory.rbuild index fc752ff4e18..11a8fbe3852 100644 --- a/drivers/bus/directory.rbuild +++ b/drivers/bus/directory.rbuild @@ -13,7 +13,4 @@ - - - diff --git a/drivers/bus/isapnp/fdo.c b/drivers/bus/isapnp/fdo.c deleted file mode 100644 index 51a0f4bccaf..00000000000 --- a/drivers/bus/isapnp/fdo.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * PROJECT: ReactOS ISA PnP Bus driver - * FILE: fdo.c - * PURPOSE: FDO-specific code - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - */ -#include - -#define NDEBUG -#include - -NTSTATUS -NTAPI -IsaFdoStartDevice( - IN PISAPNP_FDO_EXTENSION FdoExt, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp) -{ - NTSTATUS Status; - KIRQL OldIrql; - - KeAcquireSpinLock(&FdoExt->Lock, &OldIrql); - - Status = IsaHwDetectReadDataPort(FdoExt); - if (!NT_SUCCESS(Status)) - { - KeReleaseSpinLock(&FdoExt->Lock, OldIrql); - return Status; - } - - FdoExt->Common.State = dsStarted; - - KeReleaseSpinLock(&FdoExt->Lock, OldIrql); - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaFdoQueryDeviceRelations( - IN PISAPNP_FDO_EXTENSION FdoExt, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp) -{ - NTSTATUS Status; - PLIST_ENTRY CurrentEntry; - PISAPNP_LOGICAL_DEVICE IsaDevice; - PDEVICE_RELATIONS DeviceRelations; - KIRQL OldIrql; - ULONG i = 0; - - if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations) - return Irp->IoStatus.Status; - - KeAcquireSpinLock(&FdoExt->Lock, &OldIrql); - - Status = IsaHwFillDeviceList(FdoExt); - if (!NT_SUCCESS(Status)) - { - KeReleaseSpinLock(&FdoExt->Lock, OldIrql); - return Status; - } - - DeviceRelations = ExAllocatePool(NonPagedPool, - sizeof(DEVICE_RELATIONS) + sizeof(DEVICE_OBJECT) * (FdoExt->DeviceCount - 1)); - if (!DeviceRelations) - { - KeReleaseSpinLock(&FdoExt->Lock, OldIrql); - return STATUS_INSUFFICIENT_RESOURCES; - } - - CurrentEntry = FdoExt->DeviceListHead.Flink; - while (CurrentEntry != &FdoExt->DeviceListHead) - { - IsaDevice = CONTAINING_RECORD(CurrentEntry, ISAPNP_LOGICAL_DEVICE, ListEntry); - - DeviceRelations->Objects[i++] = IsaDevice->Common.Self; - - ObReferenceObject(IsaDevice->Common.Self); - - CurrentEntry = CurrentEntry->Flink; - } - - DeviceRelations->Count = FdoExt->DeviceCount; - - KeReleaseSpinLock(&FdoExt->Lock, OldIrql); - - Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaFdoPnp( - IN PISAPNP_FDO_EXTENSION FdoExt, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp) -{ - NTSTATUS Status = Irp->IoStatus.Status; - - switch (IrpSp->MinorFunction) - { - case IRP_MN_START_DEVICE: - Status = IsaForwardIrpSynchronous(FdoExt, Irp); - - if (NT_SUCCESS(Status)) - Status = IsaFdoStartDevice(FdoExt, Irp, IrpSp); - - Irp->IoStatus.Status = Status; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; - - case IRP_MN_STOP_DEVICE: - FdoExt->Common.State = dsStopped; - - Status = STATUS_SUCCESS; - break; - - case IRP_MN_QUERY_DEVICE_RELATIONS: - Status = IsaFdoQueryDeviceRelations(FdoExt, Irp, IrpSp); - - Irp->IoStatus.Status = Status; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; - - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); - break; - - default: - DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction); - break; - } - - IoSkipCurrentIrpStackLocation(Irp); - - return IoCallDriver(FdoExt->Ldo, Irp); -} diff --git a/drivers/bus/isapnp/hardware.c b/drivers/bus/isapnp/hardware.c deleted file mode 100644 index 99e5d44aa33..00000000000 --- a/drivers/bus/isapnp/hardware.c +++ /dev/null @@ -1,579 +0,0 @@ -/* - * PROJECT: ReactOS ISA PnP Bus driver - * FILE: hardware.c - * PURPOSE: Hardware support code - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - */ -#include -#include - -#define NDEBUG -#include - -static -inline -VOID -WriteAddress(USHORT Address) -{ - WRITE_PORT_UCHAR((PUCHAR)ISAPNP_ADDRESS, Address); -} - -static -inline -VOID -WriteData(USHORT Data) -{ - WRITE_PORT_UCHAR((PUCHAR)ISAPNP_WRITE_DATA, Data); -} - -static -inline -UCHAR -ReadData(PUCHAR ReadDataPort) -{ - return READ_PORT_UCHAR(ReadDataPort); -} - -static -inline -VOID -WriteByte(USHORT Address, USHORT Value) -{ - WriteAddress(Address); - WriteData(Value); -} - -static -inline -UCHAR -ReadByte(PUCHAR ReadDataPort, USHORT Address) -{ - WriteAddress(Address); - return ReadData(ReadDataPort); -} - -static -inline -USHORT -ReadWord(PUCHAR ReadDataPort, USHORT Address) -{ - return ((ReadByte(ReadDataPort, Address) << 8) | - (ReadByte(ReadDataPort, Address + 1))); -} - -static -inline -VOID -SetReadDataPort(PUCHAR ReadDataPort) -{ - WriteByte(ISAPNP_READPORT, ((ULONG_PTR)ReadDataPort >> 2)); -} - -static -inline -VOID -EnterIsolationState(VOID) -{ - WriteAddress(ISAPNP_SERIALISOLATION); -} - -static -inline -VOID -WaitForKey(VOID) -{ - WriteByte(ISAPNP_CONFIGCONTROL, ISAPNP_CONFIG_WAIT_FOR_KEY); -} - -static -inline -VOID -ResetCsn(VOID) -{ - WriteByte(ISAPNP_CONFIGCONTROL, ISAPNP_CONFIG_RESET_CSN); -} - -static -inline -VOID -Wake(USHORT Csn) -{ - WriteByte(ISAPNP_WAKE, Csn); -} - -static -inline -USHORT -ReadResourceData(PUCHAR ReadDataPort) -{ - return ReadByte(ReadDataPort, ISAPNP_RESOURCEDATA); -} - -static -inline -USHORT -ReadStatus(PUCHAR ReadDataPort) -{ - return ReadByte(ReadDataPort, ISAPNP_STATUS); -} - -static -inline -VOID -WriteCsn(USHORT Csn) -{ - WriteByte(ISAPNP_CARDSELECTNUMBER, Csn); -} - -static -inline -VOID -WriteLogicalDeviceNumber(USHORT LogDev) -{ - WriteByte(ISAPNP_LOGICALDEVICENUMBER, LogDev); -} - -static -inline -VOID -ActivateDevice(USHORT LogDev) -{ - WriteLogicalDeviceNumber(LogDev); - WriteByte(ISAPNP_ACTIVATE, 1); -} - -static -inline -VOID -DeactivateDevice(USHORT LogDev) -{ - WriteLogicalDeviceNumber(LogDev); - WriteByte(ISAPNP_ACTIVATE, 0); -} - -static -inline -USHORT -ReadIoBase(PUCHAR ReadDataPort, USHORT Index) -{ - return ReadWord(ReadDataPort, ISAPNP_IOBASE(Index)); -} - -static -inline -USHORT -ReadIrqNo(PUCHAR ReadDataPort, USHORT Index) -{ - return ReadByte(ReadDataPort, ISAPNP_IRQNO(Index)); -} - -static -inline -VOID -HwDelay(VOID) -{ - KeStallExecutionProcessor(1000); -} - -static -inline -USHORT -NextLFSR(USHORT Lfsr, USHORT InputBit) -{ - ULONG NextLfsr = Lfsr >> 1; - - NextLfsr |= (((Lfsr ^ NextLfsr) ^ InputBit)) << 7; - - return NextLfsr; -} - -static -VOID -SendKey(VOID) -{ - USHORT i, Lfsr; - - HwDelay(); - WriteAddress(0x00); - WriteAddress(0x00); - - Lfsr = ISAPNP_LFSR_SEED; - for (i = 0; i < 32; i++) - { - WriteAddress(Lfsr); - Lfsr = NextLFSR(Lfsr, 0); - } -} - -static -USHORT -PeekByte(PUCHAR ReadDataPort) -{ - USHORT i; - - for (i = 0; i < 20; i++) - { - if (ReadStatus(ReadDataPort) & 0x01) - return ReadResourceData(ReadDataPort); - - HwDelay(); - } - - return 0xFF; -} - -static -VOID -Peek(PUCHAR ReadDataPort, PVOID Buffer, ULONG Length) -{ - USHORT i, byte; - - for (i = 0; i < Length; i++) - { - byte = PeekByte(ReadDataPort); - if (Buffer) - *((PUCHAR)Buffer + i) = byte; - } -} - -static -USHORT -IsaPnpChecksum(PISAPNP_IDENTIFIER Identifier) -{ - USHORT i,j, Lfsr, Byte; - - Lfsr = ISAPNP_LFSR_SEED; - for (i = 0; i < 8; i++) - { - Byte = *(((PUCHAR)Identifier) + i); - for (j = 0; j < 8; j++) - { - Lfsr = NextLFSR(Lfsr, Byte); - Byte >>= 1; - } - } - - return Lfsr; -} - -static -BOOLEAN -FindTag(PUCHAR ReadDataPort, USHORT WantedTag, PVOID Buffer, ULONG Length) -{ - USHORT Tag, TagLen; - - do - { - Tag = PeekByte(ReadDataPort); - if (ISAPNP_IS_SMALL_TAG(Tag)) - { - TagLen = ISAPNP_SMALL_TAG_LEN(Tag); - Tag = ISAPNP_SMALL_TAG_NAME(Tag); - } - else - { - TagLen = PeekByte(ReadDataPort) + (PeekByte(ReadDataPort) << 8); - Tag = ISAPNP_LARGE_TAG_NAME(Tag); - } - - if (Tag == WantedTag) - { - if (Length > TagLen) - Length = TagLen; - - Peek(ReadDataPort, Buffer, Length); - - return TRUE; - } - else - { - Peek(ReadDataPort, NULL, Length); - } - } while (Tag != ISAPNP_TAG_END); - - return FALSE; -} - -static -BOOLEAN -FindLogDevId(PUCHAR ReadDataPort, USHORT LogDev, PISAPNP_LOGDEVID LogDeviceId) -{ - USHORT i; - - for (i = 0; i <= LogDev; i++) - { - if (!FindTag(ReadDataPort, ISAPNP_TAG_LOGDEVID, LogDeviceId, sizeof(*LogDeviceId))) - return FALSE; - } - - return TRUE; -} - -static -INT -TryIsolate(PUCHAR ReadDataPort) -{ - ISAPNP_IDENTIFIER Identifier; - USHORT i, j; - BOOLEAN Seen55aa, SeenLife; - INT Csn = 0; - USHORT Byte, Data; - - DPRINT("Setting read data port: 0x%x\n", ReadDataPort); - - WaitForKey(); - SendKey(); - - ResetCsn(); - HwDelay(); - HwDelay(); - - WaitForKey(); - SendKey(); - Wake(0x00); - - SetReadDataPort(ReadDataPort); - HwDelay(); - - while (TRUE) - { - EnterIsolationState(); - HwDelay(); - - RtlZeroMemory(&Identifier, sizeof(Identifier)); - - Seen55aa = SeenLife = FALSE; - for (i = 0; i < 9; i++) - { - Byte = 0; - for (j = 0; j < 8; j++) - { - Data = ReadData(ReadDataPort); - HwDelay(); - Data = ((Data << 8) | ReadData(ReadDataPort)); - HwDelay(); - Byte >>= 1; - - if (Data != 0xFFFF) - { - SeenLife = TRUE; - if (Data == 0x55AA) - { - Byte |= 0x80; - Seen55aa = TRUE; - } - } - } - *(((PUCHAR)&Identifier) + i) = Byte; - } - - if (!Seen55aa) - { - if (Csn) - { - DPRINT("Found no more cards\n"); - } - else - { - if (SeenLife) - { - DPRINT("Saw life but no cards, trying new read port\n"); - Csn = -1; - } - else - { - DPRINT("Saw no sign of life, abandoning isolation\n"); - } - } - break; - } - - if (Identifier.Checksum != IsaPnpChecksum(&Identifier)) - { - DPRINT("Bad checksum, trying next read data port\n"); - Csn = -1; - break; - } - - Csn++; - - WriteCsn(Csn); - HwDelay(); - - Wake(0x00); - HwDelay(); - } - - WaitForKey(); - - if (Csn > 0) - { - DPRINT("Found %d cards at read port 0x%x\n", Csn, ReadDataPort); - } - - return Csn; -} - -static -PUCHAR -Isolate(VOID) -{ - PUCHAR ReadPort; - - for (ReadPort = (PUCHAR)ISAPNP_READ_PORT_START; - (ULONG_PTR)ReadPort <= ISAPNP_READ_PORT_MAX; - ReadPort += ISAPNP_READ_PORT_STEP) - { - /* Avoid the NE2000 probe space */ - if ((ULONG_PTR)ReadPort >= 0x280 && - (ULONG_PTR)ReadPort <= 0x380) - continue; - - if (TryIsolate(ReadPort) > 0) - return ReadPort; - } - - return 0; -} - -VOID -DeviceActivation(PISAPNP_LOGICAL_DEVICE IsaDevice, - BOOLEAN Activate) -{ - WaitForKey(); - SendKey(); - Wake(IsaDevice->CSN); - - if (Activate) - ActivateDevice(IsaDevice->LDN); - else - DeactivateDevice(IsaDevice->LDN); - - HwDelay(); - - WaitForKey(); -} - -NTSTATUS -ProbeIsaPnpBus(PISAPNP_FDO_EXTENSION FdoExt) -{ - PISAPNP_LOGICAL_DEVICE LogDevice; - ISAPNP_IDENTIFIER Identifier; - ISAPNP_LOGDEVID LogDevId; - USHORT Csn; - USHORT LogDev; - PDEVICE_OBJECT Pdo; - NTSTATUS Status; - - ASSERT(FdoExt->ReadDataPort); - - for (Csn = 1; Csn <= 0xFF; Csn++) - { - for (LogDev = 0; LogDev <= 0xFF; LogDev++) - { - Status = IoCreateDevice(FdoExt->Common.Self->DriverObject, - sizeof(ISAPNP_LOGICAL_DEVICE), - NULL, - FILE_DEVICE_CONTROLLER, - FILE_DEVICE_SECURE_OPEN, - FALSE, - &Pdo); - if (!NT_SUCCESS(Status)) - return Status; - - Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - - LogDevice = Pdo->DeviceExtension; - - RtlZeroMemory(LogDevice, sizeof(ISAPNP_LOGICAL_DEVICE)); - - LogDevice->Common.Self = Pdo; - LogDevice->Common.IsFdo = FALSE; - LogDevice->Common.State = dsStopped; - - LogDevice->CSN = Csn; - LogDevice->LDN = LogDev; - - WaitForKey(); - SendKey(); - Wake(Csn); - - Peek(FdoExt->ReadDataPort, &Identifier, sizeof(Identifier)); - - if (Identifier.VendorId & 0x80) - { - IoDeleteDevice(LogDevice->Common.Self); - return STATUS_SUCCESS; - } - - if (!FindLogDevId(FdoExt->ReadDataPort, LogDev, &LogDevId)) - break; - - WriteLogicalDeviceNumber(LogDev); - - LogDevice->VendorId = LogDevId.VendorId; - LogDevice->ProdId = LogDevId.ProdId; - LogDevice->IoAddr = ReadIoBase(FdoExt->ReadDataPort, 0); - LogDevice->IrqNo = ReadIrqNo(FdoExt->ReadDataPort, 0); - - DPRINT1("Detected ISA PnP device - VID: 0x%x PID: 0x%x IoBase: 0x%x IRQ:0x%x\n", - LogDevice->VendorId, LogDevice->ProdId, LogDevice->IoAddr, LogDevice->IrqNo); - - WaitForKey(); - - Pdo->Flags &= ~DO_DEVICE_INITIALIZING; - - InsertTailList(&FdoExt->DeviceListHead, &LogDevice->ListEntry); - FdoExt->DeviceCount++; - } - } - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaHwDetectReadDataPort( - IN PISAPNP_FDO_EXTENSION FdoExt) -{ - FdoExt->ReadDataPort = Isolate(); - if (!FdoExt->ReadDataPort) - { - DPRINT1("No read data port found\n"); - return STATUS_UNSUCCESSFUL; - } - - DPRINT1("Detected read data port at 0x%x\n", FdoExt->ReadDataPort); - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaHwActivateDevice( - IN PISAPNP_LOGICAL_DEVICE LogicalDevice) -{ - DeviceActivation(LogicalDevice, - TRUE); - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaHwDeactivateDevice( - IN PISAPNP_LOGICAL_DEVICE LogicalDevice) -{ - DeviceActivation(LogicalDevice, - FALSE); - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaHwFillDeviceList( - IN PISAPNP_FDO_EXTENSION FdoExt) -{ - return ProbeIsaPnpBus(FdoExt); -} diff --git a/drivers/bus/isapnp/isapnp.c b/drivers/bus/isapnp/isapnp.c index 594b5a90541..37262c3aa87 100644 --- a/drivers/bus/isapnp/isapnp.c +++ b/drivers/bus/isapnp/isapnp.c @@ -1,199 +1,1745 @@ +/* $Id$ + * + * PROJECT: ReactOS ISA PnP Bus driver + * FILE: isapnp.c + * PURPOSE: Driver entry + * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net) + * NOTE: Parts adapted from linux ISA PnP driver + * UPDATE HISTORY: + * 01-05-2001 CSH Created + */ +#include + +#ifndef NDEBUG +#define NDEBUG +#endif +#include + + +#ifdef ALLOC_PRAGMA + +// Make the initialization routines discardable, so that they +// don't waste space + +#pragma alloc_text(init, DriverEntry) + + +#endif /* ALLOC_PRAGMA */ + + +PUCHAR IsaPnPReadPort; + + +#define UCHAR2USHORT(v0, v1) \ + ((v1 << 8) | v0) + +#define UCHAR2ULONG(v0, v1, v2, v3) \ + ((UCHAR2USHORT(v2, v3) << 16) | UCHAR2USHORT(v0, v1)) + + +#ifndef NDEBUG + +struct +{ + PCH Name; +} SmallTags[] = { + {"Unknown Small Tag"}, + {"ISAPNP_SRIN_VERSION"}, + {"ISAPNP_SRIN_LDEVICE_ID"}, + {"ISAPNP_SRIN_CDEVICE_ID"}, + {"ISAPNP_SRIN_IRQ_FORMAT"}, + {"ISAPNP_SRIN_DMA_FORMAT"}, + {"ISAPNP_SRIN_START_DFUNCTION"}, + {"ISAPNP_SRIN_END_DFUNCTION"}, + {"ISAPNP_SRIN_IO_DESCRIPTOR"}, + {"ISAPNP_SRIN_FL_IO_DESCRIPOTOR"}, + {"Reserved Small Tag"}, + {"Reserved Small Tag"}, + {"Reserved Small Tag"}, + {"Reserved Small Tag"}, + {"ISAPNP_SRIN_VENDOR_DEFINED"}, + {"ISAPNP_SRIN_END_TAG"} +}; + +struct +{ + PCH Name; +} LargeTags[] = { + {"Unknown Large Tag"}, + {"ISAPNP_LRIN_MEMORY_RANGE"}, + {"ISAPNP_LRIN_ID_STRING_ANSI"}, + {"ISAPNP_LRIN_ID_STRING_UNICODE"}, + {"ISAPNP_LRIN_VENDOR_DEFINED"}, + {"ISAPNP_LRIN_MEMORY_RANGE32"}, + {"ISAPNP_LRIN_FL_MEMORY_RANGE32"} +}; + +PCSZ TagName(ULONG Tag, BOOLEAN Small) +{ + if (Small && (Tag <= ISAPNP_SRIN_END_TAG)) { + return SmallTags[Tag].Name; + } else if (Tag <= ISAPNP_LRIN_FL_MEMORY_RANGE32){ + return LargeTags[Tag].Name; + } + + return NULL; +} + +#endif + +static __inline VOID WriteData(UCHAR Value) +{ + WRITE_PORT_UCHAR((PUCHAR)ISAPNP_WRITE_PORT, Value); +} + +static __inline VOID WriteAddress(UCHAR Value) +{ + WRITE_PORT_UCHAR((PUCHAR)ISAPNP_ADDRESS_PORT, Value); + KeStallExecutionProcessor(20); +} + +static __inline UCHAR ReadData(VOID) +{ + return READ_PORT_UCHAR(IsaPnPReadPort); +} + +static UCHAR ReadUchar(UCHAR Index) +{ + WriteAddress(Index); + return ReadData(); +} + +#if 0 +static USHORT ReadUshort(UCHAR Index) +{ + USHORT Value; + + Value = ReadUchar(Index); + Value = (Value << 8) + ReadUchar(Index + 1); + return Value; +} + +static ULONG ReadUlong(UCHAR Index) +{ + ULONG Value; + + Value = ReadUchar(Index); + Value = (Value << 8) + ReadUchar(Index + 1); + Value = (Value << 8) + ReadUchar(Index + 2); + Value = (Value << 8) + ReadUchar(Index + 3); + return Value; +} +#endif + +static VOID WriteUchar(UCHAR Index, UCHAR Value) +{ + WriteAddress(Index); + WriteData(Value); +} + +#if 0 +static VOID WriteUshort(UCHAR Index, USHORT Value) +{ + WriteUchar(Index, Value >> 8); + WriteUchar(Index + 1, Value); +} + +static VOID WriteUlong(UCHAR Index, ULONG Value) +{ + WriteUchar(Index, Value >> 24); + WriteUchar(Index + 1, Value >> 16); + WriteUchar(Index + 2, Value >> 8); + WriteUchar(Index + 3, Value); +} +#endif + +static __inline VOID SetReadDataPort(ULONG_PTR Port) +{ + IsaPnPReadPort = (PUCHAR)Port; + WriteUchar(0x00, (UCHAR) (Port >> 2)); + KeStallExecutionProcessor(100); +} + +static VOID SendKey(VOID) +{ + ULONG i; + UCHAR msb; + UCHAR code; + + /* FIXME: Is there something better? */ + KeStallExecutionProcessor(1000); + WriteAddress(0x00); + WriteAddress(0x00); + + code = 0x6a; + WriteAddress(code); + for (i = 1; i < 32; i++) { + msb = ((code & 0x01) ^ ((code & 0x02) >> 1)) << 7; + code = (code >> 1) | msb; + WriteAddress(code); + } +} + +/* Place all PnP cards in wait-for-key state */ +static VOID SendWait(VOID) +{ + WriteUchar(0x02, 0x02); +} + +static VOID SendWake(UCHAR csn) +{ + WriteUchar(ISAPNP_CARD_WAKECSN, csn); +} + +#if 0 +static VOID SelectLogicalDevice(UCHAR LogicalDevice) +{ + WriteUchar(ISAPNP_CARD_LOG_DEVICE_NUM, LogicalDevice); +} + +static VOID ActivateLogicalDevice(UCHAR LogicalDevice) +{ + SelectLogicalDevice(LogicalDevice); + WriteUchar(ISAPNP_CONTROL_ACTIVATE, 0x1); + KeStallExecutionProcessor(250); +} + +static VOID DeactivateLogicalDevice(UCHAR LogicalDevice) +{ + SelectLogicalDevice(LogicalDevice); + WriteUchar(ISAPNP_CONTROL_ACTIVATE, 0x0); + KeStallExecutionProcessor(500); +} +#endif + +#define READ_DATA_PORT_STEP 32 /* Minimum is 4 */ + +static ULONG_PTR FindNextReadPort(VOID) +{ + ULONG_PTR Port; + + + + Port = (ULONG_PTR)IsaPnPReadPort; + + while (TRUE) { + + Port += READ_DATA_PORT_STEP; + + + + if (Port > ISAPNP_MAX_READ_PORT) + + { + + return 0; + + } + + + + /* + + * We cannot use NE2000 probe spaces for + + * ISAPnP or we will lock up machines + + */ + + if ((Port < 0x280) || (Port > 0x380)) + + { + + return Port; + + } + + } + +} + +static BOOLEAN IsolateReadDataPortSelect(VOID) +{ + ULONG_PTR Port; + + SendWait(); + SendKey(); + + /* Control: reset CSN and conditionally everything else too */ + WriteUchar(0x02, 0x05); + KeStallExecutionProcessor(2000); + + SendWait(); + SendKey(); + SendWake(0x00); + + Port = FindNextReadPort(); + if (Port == 0) { + SendWait(); + return FALSE; + } + + SetReadDataPort(Port); + KeStallExecutionProcessor(1000); + WriteAddress(0x01); + KeStallExecutionProcessor(1000); + return TRUE; +} + +/* + * Isolate (assign uniqued CSN) to all ISA PnP devices + */ +static ULONG IsolatePnPCards(VOID) +{ + UCHAR checksum = 0x6a; + UCHAR chksum = 0x00; + UCHAR bit = 0x00; + ULONG data; + ULONG csn = 0; + ULONG i; + ULONG iteration = 1; + + DPRINT("Called\n"); + + IsaPnPReadPort = (PUCHAR)(ISAPNP_MIN_READ_PORT - READ_DATA_PORT_STEP); + if (!IsolateReadDataPortSelect()) { + DPRINT("Could not set read data port\n"); + return 0; + } + + while (TRUE) { + for (i = 1; i <= 64; i++) { + data = ReadData() << 8; + KeStallExecutionProcessor(250); + data = data | ReadData(); + KeStallExecutionProcessor(250); + if (data == 0x55aa) + bit = 0x01; + checksum = ((((checksum ^ (checksum >> 1)) & 0x01) ^ bit) << 7) | (checksum >> 1); + bit = 0x00; + } + for (i = 65; i <= 72; i++) { + data = ReadData() << 8; + KeStallExecutionProcessor(250); + data = data | ReadData(); + KeStallExecutionProcessor(250); + if (data == 0x55aa) + chksum |= (1 << (i - 65)); + } + if ((checksum != 0x00) && (checksum == chksum)) { + csn++; + + WriteUchar(0x06, (UCHAR) csn); + KeStallExecutionProcessor(250); + iteration++; + SendWake(0x00); + SetReadDataPort((ULONG_PTR)IsaPnPReadPort); + KeStallExecutionProcessor(1000); + WriteAddress(0x01); + KeStallExecutionProcessor(1000); + goto next; + } + if (iteration == 1) { + if (!IsolateReadDataPortSelect()) { + DPRINT("Could not set read data port\n"); + return 0; + } + } else if (iteration > 1) { + break; + } +next: + checksum = 0x6a; + chksum = 0x00; + bit = 0x00; + } + SendWait(); + return csn; +} + + +static VOID Peek(PUCHAR Data, ULONG Count) +{ + ULONG i, j; + UCHAR d = 0; + + for (i = 1; i <= Count; i++) { + for (j = 0; j < 20; j++) { + d = ReadUchar(0x05); + if (d & 0x1) + break; + KeStallExecutionProcessor(100); + } + if (!(d & 0x1)) { + if (Data != NULL) + *Data++ = 0xff; + continue; + } + d = ReadUchar(0x04); /* PRESDI */ + if (Data != NULL) + *Data++ = d; + } +} + + +/* + * Skip specified number of bytes from stream + */ +static VOID Skip(ULONG Count) +{ + Peek(NULL, Count); +} + + +/* + * Read one tag from stream + */ +static BOOLEAN ReadTag(PUCHAR Type, + PUSHORT Size, + PBOOLEAN Small) +{ + UCHAR tag, tmp[2]; + + Peek(&tag, 1); + if (tag == 0) { + /* Invalid tag */ + DPRINT("Invalid tag with value 0\n"); +#ifndef NDEBUG + for (;;); +#endif + return FALSE; + } + + if (tag & ISAPNP_RESOURCE_ITEM_TYPE) { + /* Large resource item */ + *Type = (tag & 0x7f); + Peek(tmp, 2); + *Size = UCHAR2USHORT(tmp[0], tmp[1]); + *Small = FALSE; +#ifndef NDEBUG + if (*Type > ISAPNP_LRIN_FL_MEMORY_RANGE32) { + DPRINT("Invalid large tag with value 0x%X\n", *Type); + for (;;); + } +#endif + } else { + /* Small resource item */ + *Type = (tag >> 3) & 0x0f; + *Size = tag & 0x07; + *Small = TRUE; +#ifndef NDEBUG + if (*Type > ISAPNP_SRIN_END_TAG) { + DPRINT("Invalid small tag with value 0x%X\n", *Type); + for (;;); + } +#endif + } +#if 0 + DPRINT("Tag = 0x%X, Type = 0x%X, Size = %d (%s)\n", + tag, *Type, *Size, TagName(*Type, *Small)); +#endif + /* Probably invalid data */ + if ((*Type == 0xff) && (*Size == 0xffff)) { + DPRINT("Invalid data (Type 0x%X Size 0x%X)\n", *Type, *Size); + for (;;); + return FALSE; + } + + return TRUE; +} + + +/* + * Parse ANSI name for ISA PnP logical device + */ +static NTSTATUS ParseAnsiName(PUNICODE_STRING Name, PUSHORT Size) +{ + ANSI_STRING AnsiString; + UCHAR Buffer[256]; + USHORT size1; + + size1 = (*Size >= sizeof(Buffer)) ? (sizeof(Buffer) - 1) : *Size; + + Peek(Buffer, size1); + Buffer[size1] = '\0'; + *Size -= size1; + + /* Clean whitespace from end of string */ + while ((size1 > 0) && (Buffer[--size1] == ' ')) + Buffer[size1] = '\0'; + + DPRINT("ANSI name: %s\n", Buffer); + + RtlInitAnsiString(&AnsiString, (PCSZ)&Buffer); + return RtlAnsiStringToUnicodeString(Name, &AnsiString, TRUE); +} + + +/* + * Add a resource list to the + * resource lists of a logical device + */ +static NTSTATUS AddResourceList( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Priority, + PISAPNP_CONFIGURATION_LIST *NewList) +{ + PISAPNP_CONFIGURATION_LIST List; + + DPRINT("Adding resource list for logical device %d on card %d (Priority %d)\n", + LogicalDevice->Number, + LogicalDevice->Card->CardId, + Priority); + + List = (PISAPNP_CONFIGURATION_LIST) + ExAllocatePoolWithTag(PagedPool, sizeof(ISAPNP_CONFIGURATION_LIST), TAG_ISAPNP); + if (!List) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlZeroMemory(List, sizeof(ISAPNP_CONFIGURATION_LIST)); + + List->Priority = Priority; + + InitializeListHead(&List->ListHead); + + InsertTailList(&LogicalDevice->Configuration, &List->ListEntry); + + *NewList = List; + + return STATUS_SUCCESS; +} + + +/* + * Add a resource entry to the + * resource list of a logical device + */ +static NTSTATUS AddResourceDescriptor( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Priority, + ULONG Option, + PISAPNP_DESCRIPTOR *Descriptor) +{ + PLIST_ENTRY CurrentEntry; + PISAPNP_CONFIGURATION_LIST List; + PISAPNP_DESCRIPTOR d; + NTSTATUS Status; + + DPRINT("Adding resource descriptor for logical device %d on card %d (%d of %d)\n", + LogicalDevice->Number, + LogicalDevice->Card->CardId, + LogicalDevice->CurrentDescriptorCount, + LogicalDevice->DescriptorCount); + + d = (PISAPNP_DESCRIPTOR) + ExAllocatePoolWithTag(PagedPool, sizeof(ISAPNP_DESCRIPTOR), TAG_ISAPNP); + if (!d) + return STATUS_NO_MEMORY; + + RtlZeroMemory(d, sizeof(ISAPNP_DESCRIPTOR)); + + d->Descriptor.Option = (UCHAR) Option; + + *Descriptor = d; + + CurrentEntry = LogicalDevice->Configuration.Flink; + while (CurrentEntry != &LogicalDevice->Configuration) { + List = CONTAINING_RECORD( + CurrentEntry, ISAPNP_CONFIGURATION_LIST, ListEntry); + + if (List->Priority == Priority) { + + LogicalDevice->ConfigurationSize += sizeof(IO_RESOURCE_DESCRIPTOR); + InsertTailList(&List->ListHead, &d->ListEntry); + LogicalDevice->CurrentDescriptorCount++; + if (LogicalDevice->DescriptorCount < + LogicalDevice->CurrentDescriptorCount) { + LogicalDevice->DescriptorCount = + LogicalDevice->CurrentDescriptorCount; + } + + return STATUS_SUCCESS; + } + CurrentEntry = CurrentEntry->Flink; + } + + Status = AddResourceList(LogicalDevice, Priority, &List); + if (NT_SUCCESS(Status)) { + LogicalDevice->ConfigurationSize += sizeof(IO_RESOURCE_LIST); + LogicalDevice->CurrentDescriptorCount = 0; + InsertTailList(&List->ListHead, &d->ListEntry); + } + + return Status; +} + + +/* + * Add IRQ resource to resources list + */ +static NTSTATUS AddIrqResource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[3]; + ULONG irq, i, last = 0; + BOOLEAN found; + NTSTATUS Status; + + Peek(tmp, Size); + + irq = UCHAR2USHORT(tmp[0], tmp[0]); + + DPRINT("IRQ bitmask: 0x%X\n", irq); + + found = FALSE; + for (i = 0; i < 16; i++) { + if (!found && (irq & (1 << i))) { + last = i; + found = TRUE; + } + + if ((found && !(irq & (1 << i))) || (irq & (1 << i) && (i == 15))) { + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypeInterrupt; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Interrupt.MinimumVector = last; + + if ((irq & (1 << i)) && (i == 15)) + Descriptor->Descriptor.u.Interrupt.MaximumVector = i; + else + Descriptor->Descriptor.u.Interrupt.MaximumVector = i - 1; + + DPRINT("Found IRQ range %d - %d for logical device %d on card %d\n", + Descriptor->Descriptor.u.Interrupt.MinimumVector, + Descriptor->Descriptor.u.Interrupt.MaximumVector, + LogicalDevice->Number, + LogicalDevice->Card->CardId); + + found = FALSE; + } + } + + return STATUS_SUCCESS; +} + +/* + * Add DMA resource to resources list + */ +static NTSTATUS AddDmaResource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[2]; + ULONG dma, flags, i, last = 0; + BOOLEAN found; + NTSTATUS Status; + + Peek(tmp, Size); + + dma = tmp[0]; + flags = tmp[1]; + + DPRINT("DMA bitmask: 0x%X\n", dma); + + found = FALSE; + for (i = 0; i < 8; i++) { + if (!found && (dma & (1 << i))) { + last = i; + found = TRUE; + } + + if ((found && !(dma & (1 << i))) || (dma & (1 << i) && (i == 15))) { + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypeDma; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Dma.MinimumChannel = last; + + if ((dma & (1 << i)) && (i == 15)) + Descriptor->Descriptor.u.Dma.MaximumChannel = i; + else + Descriptor->Descriptor.u.Dma.MaximumChannel = i - 1; + + /* FIXME: Parse flags */ + + DPRINT("Found DMA range %d - %d for logical device %d on card %d\n", + Descriptor->Descriptor.u.Dma.MinimumChannel, + Descriptor->Descriptor.u.Dma.MaximumChannel, + LogicalDevice->Number, + LogicalDevice->Card->CardId); + + found = FALSE; + } + } + + return STATUS_SUCCESS; +} + +/* + * Add port resource to resources list + */ +static NTSTATUS AddIOPortResource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ +#if 0 + DPRINT("I/O port: size 0x%X\n", Size); + Skip(Size); +#else + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[7]; + NTSTATUS Status; + + Peek(tmp, Size); + + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypePort; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Port.Length = tmp[6]; + /* FIXME: Parse flags */ + Descriptor->Descriptor.u.Port.Alignment = 0; + Descriptor->Descriptor.u.Port.MinimumAddress.QuadPart = UCHAR2USHORT(tmp[1], tmp[2]); + Descriptor->Descriptor.u.Port.MaximumAddress.QuadPart = UCHAR2USHORT(tmp[4], tmp[4]); + + DPRINT("Found I/O port range 0x%X - 0x%X for logical device %d on card %d\n", + Descriptor->Descriptor.u.Port.MinimumAddress, + Descriptor->Descriptor.u.Port.MaximumAddress, + LogicalDevice->Number, + LogicalDevice->Card->CardId); +#endif + return STATUS_SUCCESS; +} + +/* + * Add fixed port resource to resources list + */ +static NTSTATUS AddFixedIOPortResource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ +#if 0 + DPRINT("Fixed I/O port: size 0x%X\n", Size); + Skip(Size); +#else + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[3]; + NTSTATUS Status; + + Peek(tmp, Size); + + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypePort; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Port.Length = tmp[2]; + Descriptor->Descriptor.u.Port.Alignment = 0; + Descriptor->Descriptor.u.Port.MinimumAddress.QuadPart = UCHAR2USHORT(tmp[0], tmp[1]); + Descriptor->Descriptor.u.Port.MaximumAddress.QuadPart = UCHAR2USHORT(tmp[0], tmp[1]); + + DPRINT("Found fixed I/O port range 0x%X - 0x%X for logical device %d on card %d\n", + Descriptor->Descriptor.u.Port.MinimumAddress, + Descriptor->Descriptor.u.Port.MaximumAddress, + LogicalDevice->Number, + LogicalDevice->Card->CardId); +#endif + return STATUS_SUCCESS; +} + +/* + * Add memory resource to resources list + */ +static NTSTATUS AddMemoryResource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ +#if 0 + DPRINT("Memory range: size 0x%X\n", Size); + Skip(Size); +#else + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[9]; + NTSTATUS Status; + + Peek(tmp, Size); + + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypeMemory; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Memory.Length = UCHAR2USHORT(tmp[7], tmp[8]) << 8; + Descriptor->Descriptor.u.Memory.Alignment = UCHAR2USHORT(tmp[5], tmp[6]); + Descriptor->Descriptor.u.Memory.MinimumAddress.QuadPart = UCHAR2USHORT(tmp[1], tmp[2]) << 8; + Descriptor->Descriptor.u.Memory.MaximumAddress.QuadPart = UCHAR2USHORT(tmp[3], tmp[4]) << 8; + + DPRINT("Found memory range 0x%X - 0x%X for logical device %d on card %d\n", + Descriptor->Descriptor.u.Memory.MinimumAddress, + Descriptor->Descriptor.u.Memory.MaximumAddress, + LogicalDevice->Number, + LogicalDevice->Card->CardId); +#endif + return STATUS_SUCCESS; +} + +/* + * Add 32-bit memory resource to resources list + */ +static NTSTATUS AddMemory32Resource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ +#if 0 + DPRINT("Memory32 range: size 0x%X\n", Size); + Skip(Size); +#else + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[17]; + NTSTATUS Status; + + Peek(tmp, Size); + + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypeMemory; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Memory.Length = + UCHAR2ULONG(tmp[13], tmp[14], tmp[15], tmp[16]); + Descriptor->Descriptor.u.Memory.Alignment = + UCHAR2ULONG(tmp[9], tmp[10], tmp[11], tmp[12]); + Descriptor->Descriptor.u.Memory.MinimumAddress.QuadPart = + UCHAR2ULONG(tmp[1], tmp[2], tmp[3], tmp[4]); + Descriptor->Descriptor.u.Memory.MaximumAddress.QuadPart = + UCHAR2ULONG(tmp[5], tmp[6], tmp[7], tmp[8]); + + DPRINT("Found memory32 range 0x%X - 0x%X for logical device %d on card %d\n", + Descriptor->Descriptor.u.Memory.MinimumAddress, + Descriptor->Descriptor.u.Memory.MaximumAddress, + LogicalDevice->Number, + LogicalDevice->Card->CardId); +#endif + return STATUS_SUCCESS; +} + +/* + * Add 32-bit fixed memory resource to resources list + */ +static NTSTATUS AddFixedMemory32Resource( + PISAPNP_LOGICAL_DEVICE LogicalDevice, + ULONG Size, + ULONG Priority, + ULONG Option) +{ +#if 0 + DPRINT("Memory32 range: size 0x%X\n", Size); + Skip(Size); +#else + PISAPNP_DESCRIPTOR Descriptor; + UCHAR tmp[17]; + NTSTATUS Status; + + Peek(tmp, Size); + + Status = AddResourceDescriptor(LogicalDevice, + Priority, Option, &Descriptor); + if (!NT_SUCCESS(Status)) + return Status; + Descriptor->Descriptor.Type = CmResourceTypeMemory; + Descriptor->Descriptor.ShareDisposition = CmResourceShareDeviceExclusive; + Descriptor->Descriptor.u.Memory.Length = + UCHAR2ULONG(tmp[9], tmp[10], tmp[11], tmp[12]); + Descriptor->Descriptor.u.Memory.Alignment = + UCHAR2ULONG(tmp[5], tmp[6], tmp[7], tmp[8]); + Descriptor->Descriptor.u.Memory.MinimumAddress.QuadPart = + UCHAR2ULONG(tmp[1], tmp[2], tmp[3], tmp[4]); + Descriptor->Descriptor.u.Memory.MaximumAddress.QuadPart = + UCHAR2ULONG(tmp[1], tmp[2], tmp[3], tmp[4]); + + DPRINT("Found fixed memory32 range 0x%X - 0x%X for logical device %d on card %d\n", + Descriptor->Descriptor.u.Memory.MinimumAddress, + Descriptor->Descriptor.u.Memory.MaximumAddress, + LogicalDevice->Number, + LogicalDevice->Card->CardId); +#endif + return STATUS_SUCCESS; +} + + +/* + * Parse logical device tag + */ +static PISAPNP_LOGICAL_DEVICE ParseLogicalDevice( + PISAPNP_DEVICE_EXTENSION DeviceExtension, + PISAPNP_CARD Card, + ULONG Size, + USHORT Number) +{ + UCHAR tmp[6]; + PISAPNP_LOGICAL_DEVICE LogicalDevice; + + DPRINT("Card %d Number %d\n", Card->CardId, Number); + + Peek(tmp, Size); + + LogicalDevice = (PISAPNP_LOGICAL_DEVICE)ExAllocatePoolWithTag( + PagedPool, sizeof(ISAPNP_LOGICAL_DEVICE), TAG_ISAPNP); + if (!LogicalDevice) + return NULL; + + RtlZeroMemory(LogicalDevice, sizeof(ISAPNP_LOGICAL_DEVICE)); + + LogicalDevice->Number = Number; + LogicalDevice->VendorId = UCHAR2USHORT(tmp[0], tmp[1]); + LogicalDevice->DeviceId = UCHAR2USHORT(tmp[2], tmp[3]); + LogicalDevice->Regs = tmp[4]; + LogicalDevice->Card = Card; + if (Size > 5) + LogicalDevice->Regs |= tmp[5] << 8; + + InitializeListHead(&LogicalDevice->Configuration); + + ExInterlockedInsertTailList(&Card->LogicalDevices, + &LogicalDevice->CardListEntry, + &Card->LogicalDevicesLock); + + ExInterlockedInsertTailList(&DeviceExtension->DeviceListHead, + &LogicalDevice->DeviceListEntry, + &DeviceExtension->GlobalListLock); + + DeviceExtension->DeviceListCount++; + + return LogicalDevice; +} + + /* - * PROJECT: ReactOS ISA PnP Bus driver - * FILE: isapnp.c - * PURPOSE: Driver entry - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) + * Parse resource map for logical device */ -#include +static BOOLEAN CreateLogicalDevice(PISAPNP_DEVICE_EXTENSION DeviceExtension, + PISAPNP_CARD Card, USHORT Size) +{ + ULONG number = 0, skip = 0, compat = 0; + UCHAR type, tmp[17]; + PISAPNP_LOGICAL_DEVICE LogicalDevice; + BOOLEAN Small; + ULONG Priority = 0; + ULONG Option = IO_RESOURCE_REQUIRED; -#define NDEBUG -#include + DPRINT("Card %d Size %d\n", Card->CardId, Size); -static -NTSTATUS -NTAPI -ForwardIrpCompletion( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PVOID Context) + LogicalDevice = ParseLogicalDevice(DeviceExtension, Card, Size, (USHORT) number++); + if (!LogicalDevice) + return FALSE; + + while (TRUE) { + if (!ReadTag(&type, &Size, &Small)) + return FALSE; + + if (skip && !(Small && ((type == ISAPNP_SRIN_LDEVICE_ID) + || (type == ISAPNP_SRIN_END_TAG)))) + goto skip; + + if (Small) { + switch (type) { + case ISAPNP_SRIN_LDEVICE_ID: + if ((Size >= 5) && (Size <= 6)) { + LogicalDevice = ParseLogicalDevice( + DeviceExtension, Card, Size, (USHORT)number++); + if (!LogicalDevice) + return FALSE; + Size = 0; + skip = 0; + } else { + skip = 1; + } + Priority = 0; + Option = IO_RESOURCE_REQUIRED; + compat = 0; + break; + + case ISAPNP_SRIN_CDEVICE_ID: + if ((Size == 4) && (compat < MAX_COMPATIBLE_ID)) { + Peek(tmp, 4); + LogicalDevice->CVendorId[compat] = UCHAR2USHORT(tmp[0], tmp[1]); + LogicalDevice->CDeviceId[compat] = UCHAR2USHORT(tmp[2], tmp[3]); + compat++; + Size = 0; + } + break; + + case ISAPNP_SRIN_IRQ_FORMAT: + if ((Size < 2) || (Size > 3)) + goto skip; + AddIrqResource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + case ISAPNP_SRIN_DMA_FORMAT: + if (Size != 2) + goto skip; + AddDmaResource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + case ISAPNP_SRIN_START_DFUNCTION: + if (Size > 1) + goto skip; + + if (Size > 0) { + Peek(tmp, Size); + Priority = tmp[0]; + Size = 0; + /* FIXME: Maybe use IO_RESOURCE_PREFERRED for some */ + Option = IO_RESOURCE_ALTERNATIVE; + } else { + Priority = 0; + Option = IO_RESOURCE_ALTERNATIVE; + } + + DPRINT(" Start priority %d \n", Priority); + + LogicalDevice->CurrentDescriptorCount = 0; + + break; + + case ISAPNP_SRIN_END_DFUNCTION: + + DPRINT(" End priority %d \n", Priority); + + if (Size != 0) + goto skip; + Priority = 0; + Option = IO_RESOURCE_REQUIRED; + LogicalDevice->CurrentDescriptorCount = 0; + break; + + case ISAPNP_SRIN_IO_DESCRIPTOR: + if (Size != 7) + goto skip; + AddIOPortResource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + case ISAPNP_SRIN_FL_IO_DESCRIPOTOR: + if (Size != 3) + goto skip; + AddFixedIOPortResource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + case ISAPNP_SRIN_VENDOR_DEFINED: + break; + + case ISAPNP_SRIN_END_TAG: + if (Size > 0) + Skip(Size); + return FALSE; + + default: + DPRINT("Ignoring small tag of type 0x%X for logical device %d on card %d\n", + type, LogicalDevice->Number, Card->CardId); + } + } else { + switch (type) { + case ISAPNP_LRIN_MEMORY_RANGE: + if (Size != 9) + goto skip; + AddMemoryResource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + case ISAPNP_LRIN_ID_STRING_ANSI: + ParseAnsiName(&LogicalDevice->Name, &Size); + break; + + case ISAPNP_LRIN_ID_STRING_UNICODE: + break; + + case ISAPNP_LRIN_VENDOR_DEFINED: + break; + + case ISAPNP_LRIN_MEMORY_RANGE32: + if (Size != 17) + goto skip; + AddMemory32Resource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + case ISAPNP_LRIN_FL_MEMORY_RANGE32: + if (Size != 17) + goto skip; + AddFixedMemory32Resource(LogicalDevice, Size, Priority, Option); + Size = 0; + break; + + default: + DPRINT("Ignoring large tag of type 0x%X for logical device %d on card %d\n", + type, LogicalDevice->Number, Card->CardId); + } + } +skip: + if (Size > 0) + Skip(Size); + } + + return TRUE; +} + + +/* + * Parse resource map for ISA PnP card + */ +static BOOLEAN ParseResourceMap(PISAPNP_DEVICE_EXTENSION DeviceExtension, + PISAPNP_CARD Card) { - if (Irp->PendingReturned) - KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); + UCHAR type, tmp[17]; + USHORT size; + BOOLEAN Small; + + DPRINT("Card %d\n", Card->CardId); + + while (TRUE) { + if (!ReadTag(&type, &size, &Small)) + return FALSE; + + if (Small) { + switch (type) { + case ISAPNP_SRIN_VERSION: + if (size != 2) + goto skip; + Peek(tmp, 2); + Card->PNPVersion = tmp[0]; + Card->ProductVersion = tmp[1]; + size = 0; + break; - return STATUS_MORE_PROCESSING_REQUIRED; + case ISAPNP_SRIN_LDEVICE_ID: + if ((size >= 5) && (size <= 6)) { + if (!CreateLogicalDevice(DeviceExtension, Card, size)) + return FALSE; + size = 0; + } + break; + + case ISAPNP_SRIN_CDEVICE_ID: + /* FIXME: Parse compatible IDs */ + break; + + case ISAPNP_SRIN_END_TAG: + if (size > 0) + Skip(size); + return TRUE; + + default: + DPRINT("Ignoring small tag Type 0x%X for Card %d\n", type, Card->CardId); + } + } else { + switch (type) { + case ISAPNP_LRIN_ID_STRING_ANSI: + ParseAnsiName(&Card->Name, &size); + break; + + default: + DPRINT("Ignoring large tag Type 0x%X for Card %d\n", + type, Card->CardId); + } + } +skip: + if (size > 0) + Skip(size); + } + + return TRUE; } -NTSTATUS -NTAPI -IsaForwardIrpSynchronous( - IN PISAPNP_FDO_EXTENSION FdoExt, - IN PIRP Irp) + +/* + * Compute ISA PnP checksum for first eight bytes + */ +static UCHAR Checksum(PUCHAR data) +{ + ULONG i, j; + UCHAR checksum = 0x6a, bit, b; + + for (i = 0; i < 8; i++) { + b = data[i]; + for (j = 0; j < 8; j++) { + bit = 0; + if (b & (1 << j)) + bit = 1; + checksum = ((((checksum ^ (checksum >> 1)) & + 0x01) ^ bit) << 7) | (checksum >> 1); + } + } + return checksum; +} + + +/* + * Build a resource list for a logical ISA PnP device + */ +static NTSTATUS BuildResourceList(PISAPNP_LOGICAL_DEVICE LogicalDevice, + PIO_RESOURCE_LIST DestinationList, + ULONG Priority) +{ + PLIST_ENTRY CurrentEntry, Entry; + PISAPNP_CONFIGURATION_LIST List; + PISAPNP_DESCRIPTOR Descriptor; + ULONG i; + + if (IsListEmpty(&LogicalDevice->Configuration)) + return STATUS_NOT_FOUND; + + CurrentEntry = LogicalDevice->Configuration.Flink; + while (CurrentEntry != &LogicalDevice->Configuration) { + List = CONTAINING_RECORD( + CurrentEntry, ISAPNP_CONFIGURATION_LIST, ListEntry); + + if (List->Priority == Priority) { + + DPRINT("Logical device %d DestinationList %p\n", + LogicalDevice->Number, + DestinationList); + + DestinationList->Version = 1; + DestinationList->Revision = 1; + DestinationList->Count = LogicalDevice->DescriptorCount; + + i = 0; + Entry = List->ListHead.Flink; + while (Entry != &List->ListHead) { + Descriptor = CONTAINING_RECORD( + Entry, ISAPNP_DESCRIPTOR, ListEntry); + + DPRINT("Logical device %d Destination %p(%d)\n", + LogicalDevice->Number, + &DestinationList->Descriptors[i], + i); + + RtlCopyMemory(&DestinationList->Descriptors[i], + &Descriptor->Descriptor, + sizeof(IO_RESOURCE_DESCRIPTOR)); + + i++; + + Entry = Entry->Flink; + } + + RemoveEntryList(&List->ListEntry); + + ExFreePool(List); + + return STATUS_SUCCESS; + } + + CurrentEntry = CurrentEntry->Flink; + } + + return STATUS_UNSUCCESSFUL; +} + + +/* + * Build resource lists for a logical ISA PnP device + */ +static NTSTATUS BuildResourceLists(PISAPNP_LOGICAL_DEVICE LogicalDevice) +{ + ULONG ListSize; + ULONG Priority; + ULONG SingleListSize; + PIO_RESOURCE_LIST p; + NTSTATUS Status; + + ListSize = sizeof(IO_RESOURCE_REQUIREMENTS_LIST) + - sizeof(IO_RESOURCE_LIST) + + LogicalDevice->ConfigurationSize; + + DPRINT("Logical device %d ListSize 0x%X ConfigurationSize 0x%X DescriptorCount %d\n", + LogicalDevice->Number, ListSize, + LogicalDevice->ConfigurationSize, + LogicalDevice->DescriptorCount); + + LogicalDevice->ResourceLists = + (PIO_RESOURCE_REQUIREMENTS_LIST)ExAllocatePoolWithTag( + PagedPool, ListSize, TAG_ISAPNP); + if (!LogicalDevice->ResourceLists) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlZeroMemory(LogicalDevice->ResourceLists, ListSize); + + SingleListSize = sizeof(IO_RESOURCE_LIST) + + (LogicalDevice->DescriptorCount - 1) * + sizeof(IO_RESOURCE_DESCRIPTOR); + + DPRINT("SingleListSize %d\n", SingleListSize); + + Priority = 0; + p = &LogicalDevice->ResourceLists->List[0]; + do { + Status = BuildResourceList(LogicalDevice, p, Priority); + if (NT_SUCCESS(Status)) { + p = (PIO_RESOURCE_LIST)((ULONG_PTR)p + SingleListSize); + Priority++; + } + } while (Status != STATUS_NOT_FOUND); + + LogicalDevice->ResourceLists->ListSize = ListSize; + LogicalDevice->ResourceLists->AlternativeLists = Priority + 1; + + return STATUS_SUCCESS; +} + + +/* + * Build resource lists for a ISA PnP card + */ +static NTSTATUS BuildResourceListsForCard(PISAPNP_CARD Card) +{ + PISAPNP_LOGICAL_DEVICE LogicalDevice; + PLIST_ENTRY CurrentEntry; + NTSTATUS Status; + + CurrentEntry = Card->LogicalDevices.Flink; + while (CurrentEntry != &Card->LogicalDevices) { + LogicalDevice = CONTAINING_RECORD( + CurrentEntry, ISAPNP_LOGICAL_DEVICE, CardListEntry); + Status = BuildResourceLists(LogicalDevice); + if (!NT_SUCCESS(Status)) + return Status; + CurrentEntry = CurrentEntry->Flink; + } + + return STATUS_SUCCESS; +} + + +/* + * Build resource lists for all present ISA PnP cards + */ +static NTSTATUS BuildResourceListsForAll( + PISAPNP_DEVICE_EXTENSION DeviceExtension) +{ + PLIST_ENTRY CurrentEntry; + PISAPNP_CARD Card; + NTSTATUS Status; + + CurrentEntry = DeviceExtension->CardListHead.Flink; + while (CurrentEntry != &DeviceExtension->CardListHead) { + Card = CONTAINING_RECORD( + CurrentEntry, ISAPNP_CARD, ListEntry); + Status = BuildResourceListsForCard(Card); + if (!NT_SUCCESS(Status)) + return Status; + CurrentEntry = CurrentEntry->Flink; + } + + return STATUS_SUCCESS; +} + + +/* + * Build device list for all present ISA PnP cards + */ +static NTSTATUS BuildDeviceList(PISAPNP_DEVICE_EXTENSION DeviceExtension) +{ + ULONG csn; + UCHAR header[9], checksum; + PISAPNP_CARD Card; + + DPRINT("Called\n"); + + SendWait(); + SendKey(); + for (csn = 1; csn <= 10; csn++) { + SendWake((UCHAR)csn); + Peek(header, 9); + checksum = Checksum(header); + + if (checksum == 0x00 || checksum != header[8]) /* Invalid CSN */ + continue; + + DPRINT("VENDOR: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n", + header[0], header[1], header[2], header[3], + header[4], header[5], header[6], header[7], header[8]); + + Card = (PISAPNP_CARD)ExAllocatePoolWithTag( + PagedPool, sizeof(ISAPNP_CARD), TAG_ISAPNP); + if (!Card) + return STATUS_INSUFFICIENT_RESOURCES; + + RtlZeroMemory(Card, sizeof(ISAPNP_CARD)); + + Card->CardId = (USHORT) csn; + Card->VendorId = (header[1] << 8) | header[0]; + Card->DeviceId = (header[3] << 8) | header[2]; + Card->Serial = (header[7] << 24) | (header[6] << 16) | (header[5] << 8) | header[4]; + + InitializeListHead(&Card->LogicalDevices); + KeInitializeSpinLock(&Card->LogicalDevicesLock); + + ParseResourceMap(DeviceExtension, Card); + + ExInterlockedInsertTailList(&DeviceExtension->CardListHead, + &Card->ListEntry, + &DeviceExtension->GlobalListLock); + } + + return STATUS_SUCCESS; +} + + +static NTSTATUS +ISAPNPQueryBusRelations( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PISAPNP_DEVICE_EXTENSION DeviceExtension; + PISAPNP_LOGICAL_DEVICE LogicalDevice; + PDEVICE_RELATIONS Relations; + PLIST_ENTRY CurrentEntry; + NTSTATUS Status = STATUS_SUCCESS; + ULONG Size; + ULONG i; + + DPRINT("Called\n"); + + DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (Irp->IoStatus.Information) { + /* FIXME: Another bus driver has already created a DEVICE_RELATIONS + structure so we must merge this structure with our own */ + } + + Size = sizeof(DEVICE_RELATIONS) + sizeof(Relations->Objects) * + (DeviceExtension->DeviceListCount - 1); + Relations = (PDEVICE_RELATIONS)ExAllocatePoolWithTag(PagedPool, Size, TAG_ISAPNP); + if (!Relations) + return STATUS_INSUFFICIENT_RESOURCES; + + Relations->Count = DeviceExtension->DeviceListCount; + + i = 0; + CurrentEntry = DeviceExtension->DeviceListHead.Flink; + while (CurrentEntry != &DeviceExtension->DeviceListHead) { + LogicalDevice = CONTAINING_RECORD( + CurrentEntry, ISAPNP_LOGICAL_DEVICE, DeviceListEntry); + + if (!LogicalDevice->Pdo) { + /* Create a physical device object for the + device as it does not already have one */ + Status = IoCreateDevice(DeviceObject->DriverObject, 0, + NULL, FILE_DEVICE_CONTROLLER, 0, FALSE, &LogicalDevice->Pdo); + if (!NT_SUCCESS(Status)) { + DPRINT("IoCreateDevice() failed with status 0x%X\n", Status); + ExFreePool(Relations); + return Status; + } + + LogicalDevice->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; + } + + /* Reference the physical device object. The PnP manager + will dereference it again when it is no longer needed */ + ObReferenceObject(LogicalDevice->Pdo); + + Relations->Objects[i] = LogicalDevice->Pdo; + + i++; + + CurrentEntry = CurrentEntry->Flink; + } + + Irp->IoStatus.Information = (ULONG_PTR)Relations; + + return Status; +} + + +static NTSTATUS +ISAPNPQueryDeviceRelations( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) { - KEVENT Event; + PISAPNP_DEVICE_EXTENSION DeviceExtension; NTSTATUS Status; - KeInitializeEvent(&Event, NotificationEvent, FALSE); - IoCopyCurrentIrpStackLocationToNext(Irp); + DPRINT("Called\n"); + + DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - IoSetCompletionRoutine(Irp, ForwardIrpCompletion, &Event, TRUE, TRUE, TRUE); + if (DeviceExtension->State == dsStopped) + return STATUS_UNSUCCESSFUL; - Status = IoCallDriver(FdoExt->Ldo, Irp); - if (Status == STATUS_PENDING) - { - Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); - if (NT_SUCCESS(Status)) - Status = Irp->IoStatus.Status; + switch (IrpSp->Parameters.QueryDeviceRelations.Type) { + case BusRelations: + Status = ISAPNPQueryBusRelations(DeviceObject, Irp, IrpSp); + break; + + default: + Status = STATUS_NOT_IMPLEMENTED; } return Status; } -static -NTSTATUS +static NTSTATUS +ISAPNPStartDevice( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PISAPNP_DEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + ULONG NumCards; + + DPRINT("Called\n"); + + DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (DeviceExtension->State == dsStarted) + return STATUS_SUCCESS; + + NumCards = IsolatePnPCards(); + + DPRINT("Number of ISA PnP cards found: %d\n", NumCards); + + Status = BuildDeviceList(DeviceExtension); + if (!NT_SUCCESS(Status)) { + DPRINT("BuildDeviceList() failed with status 0x%X\n", Status); + return Status; + } + + Status = BuildResourceListsForAll(DeviceExtension); + if (!NT_SUCCESS(Status)) { + DPRINT("BuildResourceListsForAll() failed with status 0x%X\n", Status); + return Status; + } + + DeviceExtension->State = dsStarted; + + return STATUS_SUCCESS; +} + + +static NTSTATUS +ISAPNPStopDevice( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + PIO_STACK_LOCATION IrpSp) +{ + PISAPNP_DEVICE_EXTENSION DeviceExtension; + + DPRINT("Called\n"); + + DeviceExtension = (PISAPNP_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + + if (DeviceExtension->State != dsStopped) { + /* FIXME: Stop device */ + DeviceExtension->State = dsStopped; + } + + return STATUS_SUCCESS; +} + + +static DRIVER_DISPATCH ISAPNPDispatchOpenClose; +static NTSTATUS NTAPI -IsaCreateClose( +ISAPNPDispatchOpenClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { + DPRINT("Called\n"); + Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} - DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); +static DRIVER_DISPATCH ISAPNPDispatchReadWrite; +static NTSTATUS +NTAPI +ISAPNPDispatchReadWrite( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PIRP Irp) +{ + DPRINT("Called\n"); + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; + return STATUS_UNSUCCESSFUL; } -static -NTSTATUS +static DRIVER_DISPATCH ISAPNPDispatchDeviceControl; +static NTSTATUS NTAPI -IsaIoctl( +ISAPNPDispatchDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); + PIO_STACK_LOCATION IrpSp; NTSTATUS Status; - DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + DPRINT("Called\n"); - switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) - { - default: - DPRINT1("Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); - Status = STATUS_NOT_SUPPORTED; - break; + Irp->IoStatus.Information = 0; + + IrpSp = IoGetCurrentIrpStackLocation(Irp); + switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { + default: + DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); + Status = STATUS_NOT_IMPLEMENTED; + break; } - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + if (Status != STATUS_PENDING) { + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + DPRINT("Leaving. Status 0x%X\n", Status); return Status; } -static -NTSTATUS +static DRIVER_DISPATCH ISAPNPControl; +static NTSTATUS NTAPI -IsaReadWrite( +ISAPNPControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + PIO_STACK_LOCATION IrpSp; + NTSTATUS Status; - Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = 0; + DPRINT("Called\n"); - IoCompleteRequest(Irp, IO_NO_INCREMENT); + IrpSp = IoGetCurrentIrpStackLocation(Irp); + switch (IrpSp->MinorFunction) { + case IRP_MN_QUERY_DEVICE_RELATIONS: + Status = ISAPNPQueryDeviceRelations(DeviceObject, Irp, IrpSp); + break; + + case IRP_MN_START_DEVICE: + Status = ISAPNPStartDevice(DeviceObject, Irp, IrpSp); + break; + + case IRP_MN_STOP_DEVICE: + Status = ISAPNPStopDevice(DeviceObject, Irp, IrpSp); + break; - return STATUS_NOT_SUPPORTED; + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: + /* Nothing to do here */ + DPRINT("IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); + Status = Irp->IoStatus.Status; + break; + + default: + DPRINT("Unknown IOCTL 0x%X\n", IrpSp->MinorFunction); + Status = STATUS_NOT_IMPLEMENTED; + break; + } + + if (Status != STATUS_PENDING) { + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + DPRINT("Leaving. Status 0x%X\n", Status); + + return Status; } -static -NTSTATUS + +static NTSTATUS NTAPI -IsaAddDevice( +ISAPNPAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject) { + PISAPNP_DEVICE_EXTENSION DeviceExtension; PDEVICE_OBJECT Fdo; - PISAPNP_FDO_EXTENSION FdoExt; NTSTATUS Status; - DPRINT("%s(%p, %p)\n", __FUNCTION__, DriverObject, PhysicalDeviceObject); + DPRINT("Called\n"); - Status = IoCreateDevice(DriverObject, - sizeof(*FdoExt), - NULL, - FILE_DEVICE_BUS_EXTENDER, - FILE_DEVICE_SECURE_OPEN, - TRUE, - &Fdo); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create FDO (0x%x)\n", Status); - return Status; + Status = IoCreateDevice(DriverObject, sizeof(ISAPNP_DEVICE_EXTENSION), + NULL, FILE_DEVICE_BUS_EXTENDER, FILE_DEVICE_SECURE_OPEN, TRUE, &Fdo); + if (!NT_SUCCESS(Status)) { + DPRINT("IoCreateDevice() failed with status 0x%X\n", Status); + return Status; } - FdoExt = Fdo->DeviceExtension; - RtlZeroMemory(FdoExt, sizeof(*FdoExt)); + DeviceExtension = (PISAPNP_DEVICE_EXTENSION)Fdo->DeviceExtension; - FdoExt->Common.Self = Fdo; - FdoExt->Common.IsFdo = TRUE; - FdoExt->Common.State = dsStopped; - FdoExt->Pdo = PhysicalDeviceObject; - FdoExt->Ldo = IoAttachDeviceToDeviceStack(Fdo, - PhysicalDeviceObject); + DeviceExtension->Pdo = PhysicalDeviceObject; - InitializeListHead(&FdoExt->DeviceListHead); - KeInitializeSpinLock(&FdoExt->Lock); + DeviceExtension->Ldo = + IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject); - Fdo->Flags &= ~DO_DEVICE_INITIALIZING; + InitializeListHead(&DeviceExtension->CardListHead); + InitializeListHead(&DeviceExtension->DeviceListHead); + DeviceExtension->DeviceListCount = 0; + KeInitializeSpinLock(&DeviceExtension->GlobalListLock); - return STATUS_SUCCESS; -} + DeviceExtension->State = dsStopped; -static -NTSTATUS -NTAPI -IsaPnp( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); - PISAPNP_COMMON_EXTENSION DevExt = DeviceObject->DeviceExtension; + Fdo->Flags &= ~DO_DEVICE_INITIALIZING; - DPRINT("%s(%p, %p)\n", __FUNCTION__, DeviceObject, Irp); + DPRINT("Done AddDevice\n"); - if (DevExt->IsFdo) - { - return IsaFdoPnp((PISAPNP_FDO_EXTENSION)DevExt, - Irp, - IrpSp); - } - else - { - return IsaPdoPnp((PISAPNP_LOGICAL_DEVICE)DevExt, - Irp, - IrpSp); - } + return STATUS_SUCCESS; } + NTSTATUS NTAPI DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { - DPRINT("%s(%p, %wZ)\n", __FUNCTION__, DriverObject, RegistryPath); + DbgPrint("ISA Plug and Play Bus Driver\n"); - DriverObject->MajorFunction[IRP_MJ_CREATE] = IsaCreateClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = IsaCreateClose; - DriverObject->MajorFunction[IRP_MJ_READ] = IsaReadWrite; - DriverObject->MajorFunction[IRP_MJ_WRITE] = IsaReadWrite; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IsaIoctl; - DriverObject->MajorFunction[IRP_MJ_PNP] = IsaPnp; - DriverObject->DriverExtension->AddDevice = IsaAddDevice; + DriverObject->MajorFunction[IRP_MJ_CREATE] = ISAPNPDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = ISAPNPDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_READ] = ISAPNPDispatchReadWrite; + DriverObject->MajorFunction[IRP_MJ_WRITE] = ISAPNPDispatchReadWrite; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ISAPNPDispatchDeviceControl; + DriverObject->MajorFunction[IRP_MJ_PNP] = ISAPNPControl; + DriverObject->DriverExtension->AddDevice = ISAPNPAddDevice; return STATUS_SUCCESS; } diff --git a/drivers/bus/isapnp/isapnp.h b/drivers/bus/isapnp/isapnp.h index 85fcb7887f4..59697b9848e 100644 --- a/drivers/bus/isapnp/isapnp.h +++ b/drivers/bus/isapnp/isapnp.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #ifdef __cplusplus extern "C" { @@ -8,87 +8,330 @@ extern "C" { #define TAG_ISAPNP 'PNPI' -typedef enum { - dsStopped, - dsStarted -} ISAPNP_DEVICE_STATE; +#define IO_RESOURCE_REQUIRED 0x00 //ROS Extension -typedef struct _ISAPNP_COMMON_EXTENSION { - PDEVICE_OBJECT Self; - BOOLEAN IsFdo; - ISAPNP_DEVICE_STATE State; -} ISAPNP_COMMON_EXTENSION, *PISAPNP_COMMON_EXTENSION; +#define ISAPNP_ADDRESS_PORT 0x0279 // ADDRESS (W) +#define ISAPNP_WRITE_PORT 0x0A79 // WRITE_DATA (W) +#define ISAPNP_MIN_READ_PORT 0x0203 // READ_DATA (R) +#define ISAPNP_MAX_READ_PORT 0x03FF // READ_DATA (R) -typedef struct _ISAPNP_FDO_EXTENSION { - ISAPNP_COMMON_EXTENSION Common; - PDEVICE_OBJECT Ldo; - PDEVICE_OBJECT Pdo; - LIST_ENTRY DeviceListHead; - ULONG DeviceCount; - PUCHAR ReadDataPort; - KSPIN_LOCK Lock; -} ISAPNP_FDO_EXTENSION, *PISAPNP_FDO_EXTENSION; +// Card control registers +#define ISAPNP_CARD_READ_DATA_PORT 0x00 // Set READ_DATA port +#define ISAPNP_CARD_ISOLATION 0x01 // Isolation +#define ISAPNP_CARD_CONFIG_COTROL 0x02 // Configuration control +#define ISAPNP_CARD_WAKECSN 0x03 // Wake[CSN] +#define ISAPNP_CARD_RESOUCE_DATA 0x04 // Resource data port +#define ISAPNP_CARD_STATUS 0x05 // Status port +#define ISAPNP_CARD_CSN 0x06 // Card Select Number port +#define ISAPNP_CARD_LOG_DEVICE_NUM 0x07 // Logical Device Number +#define ISAPNP_CARD_RESERVED 0x08 // Card level reserved +#define ISAPNP_CARD_VENDOR_DEFINED 0x20 // Vendor defined + +// Logical device control registers +#define ISAPNP_CONTROL_ACTIVATE 0x30 // Activate logical device +#define ISAPNP_CONTROL_IO_RANGE_CHECK 0x31 // I/O range conflict check +#define ISAPNP_CONTROL_LDC_RESERVED 0x32 // Logical Device Control reserved +#define ISAPNP_CONTROL_LDCV_RESERVED 0x38 // Logical Device Control Vendor reserved + +// Logical device configuration registers +#define ISAPNP_CONFIG_MEMORY_BASE2 0x00 // Memory base address bits 23-16 +#define ISAPNP_CONFIG_MEMORY_BASE1 0x01 // Memory base address bits 15-8 +#define ISAPNP_CONFIG_MEMORY_CONTROL 0x02 // Memory control +#define ISAPNP_CONFIG_MEMORY_LIMIT2 0x03 // Memory limit bits 23-16 +#define ISAPNP_CONFIG_MEMORY_LIMIT1 0x04 // Memory limit bits 15-8 + +#define ISAPNP_CONFIG_MEMORY_DESC0 0x40 // Memory descriptor 0 +#define ISAPNP_CONFIG_MEMORY_DESC1 0x48 // Memory descriptor 1 +#define ISAPNP_CONFIG_MEMORY_DESC2 0x50 // Memory descriptor 2 +#define ISAPNP_CONFIG_MEMORY_DESC3 0x58 // Memory descriptor 3 + +#define ISAPNP_CONFIG_MEMORY32_BASE3 0x00 // 32-bit memory base address bits 31-24 +#define ISAPNP_CONFIG_MEMORY32_BASE2 0x01 // 32-bit memory base address bits 23-16 +#define ISAPNP_CONFIG_MEMORY32_BASE1 0x01 // 32-bit memory base address bits 15-8 +#define ISAPNP_CONFIG_MEMORY32_CONTROL 0x02 // 32-bit memory control +#define ISAPNP_CONFIG_MEMORY32_LIMIT3 0x03 // 32-bit memory limit bits 31-24 +#define ISAPNP_CONFIG_MEMORY32_LIMIT2 0x04 // 32-bit memory limit bits 23-16 +#define ISAPNP_CONFIG_MEMORY32_LIMIT1 0x05 // 32-bit memory limit bits 15-8 + +#define ISAPNP_CONFIG_MEMORY32_DESC0 0x76 // 32-bit memory descriptor 0 +#define ISAPNP_CONFIG_MEMORY32_DESC1 0x80 // 32-bit memory descriptor 1 +#define ISAPNP_CONFIG_MEMORY32_DESC2 0x90 // 32-bit memory descriptor 2 +#define ISAPNP_CONFIG_MEMORY32_DESC3 0xA0 // 32-bit memory descriptor 3 + +#define ISAPNP_CONFIG_IO_BASE1 0x00 // I/O port base address bits 15-8 +#define ISAPNP_CONFIG_IO_BASE0 0x01 // I/O port base address bits 7-0 + +#define ISAPNP_CONFIG_IO_DESC0 0x60 // I/O port descriptor 0 +#define ISAPNP_CONFIG_IO_DESC1 0x62 // I/O port descriptor 1 +#define ISAPNP_CONFIG_IO_DESC2 0x64 // I/O port descriptor 2 +#define ISAPNP_CONFIG_IO_DESC3 0x66 // I/O port descriptor 3 +#define ISAPNP_CONFIG_IO_DESC4 0x68 // I/O port descriptor 4 +#define ISAPNP_CONFIG_IO_DESC5 0x6A // I/O port descriptor 5 +#define ISAPNP_CONFIG_IO_DESC6 0x6C // I/O port descriptor 6 +#define ISAPNP_CONFIG_IO_DESC7 0x6E // I/O port descriptor 7 + +#define ISAPNP_CONFIG_IRQ_LEVEL0 0x70 // Interupt level for descriptor 0 +#define ISAPNP_CONFIG_IRQ_TYPE0 0x71 // Type level for descriptor 0 +#define ISAPNP_CONFIG_IRQ_LEVEL1 0x72 // Interupt level for descriptor 1 +#define ISAPNP_CONFIG_IRQ_TYPE1 0x73 // Type level for descriptor 1 + +#define ISAPNP_CONFIG_DMA_CHANNEL0 0x74 // DMA channel for descriptor 0 +#define ISAPNP_CONFIG_DMA_CHANNEL1 0x75 // DMA channel for descriptor 1 + + +typedef struct _PNPISA_SERIAL_ID +{ + UCHAR VendorId[4]; // Vendor Identifier + UCHAR SerialId[4]; // Serial number + UCHAR Checksum; // Checksum +} PNPISA_SERIAL_ID, *PPNPISA_SERIAL_ID; + + +#define ISAPNP_RES_PRIORITY_PREFERRED 0 +#define ISAPNP_RES_PRIORITY_ACCEPTABLE 1 +#define ISAPNP_RES_PRIORITY_FUNCTIONAL 2 +#define ISAPNP_RES_PRIORITY_INVALID 65535 + + +#define ISAPNP_RESOURCE_ITEM_TYPE 0x80 // 0 = small, 1 = large + +// Small Resource Item Names (SRINs) +#define ISAPNP_SRIN_VERSION 0x1 // PnP version number +#define ISAPNP_SRIN_LDEVICE_ID 0x2 // Logical device id +#define ISAPNP_SRIN_CDEVICE_ID 0x3 // Compatible device id +#define ISAPNP_SRIN_IRQ_FORMAT 0x4 // IRQ format +#define ISAPNP_SRIN_DMA_FORMAT 0x5 // DMA format +#define ISAPNP_SRIN_START_DFUNCTION 0x6 // Start dependant function +#define ISAPNP_SRIN_END_DFUNCTION 0x7 // End dependant function +#define ISAPNP_SRIN_IO_DESCRIPTOR 0x8 // I/O port descriptor +#define ISAPNP_SRIN_FL_IO_DESCRIPOTOR 0x9 // Fixed location I/O port descriptor +#define ISAPNP_SRIN_VENDOR_DEFINED 0xE // Vendor defined +#define ISAPNP_SRIN_END_TAG 0xF // End tag + +typedef struct _ISAPNP_SRI_VERSION +{ + UCHAR Header; + UCHAR Version; // Packed BCD format version number + UCHAR VendorVersion; // Vendor specific version number +} ISAPNP_SRI_VERSION, *PISAPNP_SRI_VERSION; + +typedef struct _ISAPNP_SRI_LDEVICE_ID +{ + UCHAR Header; + USHORT DeviceId; // Logical device id + USHORT VendorId; // Manufacturer id + UCHAR Flags; // Flags +} ISAPNP_SRI_LDEVICE_ID, *PISAPNP_SRI_LDEVICE_ID; + +typedef struct _ISAPNP_SRI_CDEVICE_ID +{ + UCHAR Header; + USHORT DeviceId; // Logical device id + USHORT VendorId; // Manufacturer id +} ISAPNP_SRI_CDEVICE_ID, *PISAPNP_SRI_CDEVICE_ID; + +typedef struct _ISAPNP_SRI_IRQ_FORMAT +{ + UCHAR Header; + USHORT Mask; // IRQ mask (bit 0 = irq 0, etc.) + UCHAR Information; // IRQ information +} ISAPNP_SRI_IRQ_FORMAT, *PISAPNP_SRI_IRQ_FORMAT; + +typedef struct _ISAPNP_SRI_DMA_FORMAT +{ + UCHAR Header; + USHORT Mask; // DMA channel mask (bit 0 = channel 0, etc.) + UCHAR Information; // DMA information +} ISAPNP_SRI_DMA_FORMAT, *PISAPNP_SRI_DMA_FORMAT; + +typedef struct _ISAPNP_SRI_START_DFUNCTION +{ + UCHAR Header; +} ISAPNP_SRI_START_DFUNCTION, *PISAPNP_SRI_START_DFUNCTION; + +typedef struct _ISAPNP_SRI_END_DFUNCTION +{ + UCHAR Header; +} ISAPNP_SRI_END_DFUNCTION, *PISAPNP_SRI_END_DFUNCTION; + +typedef struct _ISAPNP_SRI_IO_DESCRIPTOR +{ + UCHAR Header; + UCHAR Information; // Information + USHORT RangeMinBase; // Minimum base address + USHORT RangeMaxBase; // Maximum base address + UCHAR Alignment; // Base alignment + UCHAR RangeLength; // Length of range +} ISAPNP_SRI_IO_DESCRIPTOR, *PISAPNP_SRI_IO_DESCRIPTOR; + +typedef struct _ISAPNP_SRI_FL_IO_DESCRIPTOR +{ + UCHAR Header; + USHORT RangeBase; // Range base address + UCHAR RangeLength; // Length of range +} ISAPNP_SRI_FL_IO_DESCRIPTOR, *PISAPNP_SRI_FL_IO_DESCRIPTOR; + +typedef struct _PISAPNP_SRI_VENDOR_DEFINED +{ + UCHAR Header; + UCHAR Reserved[0]; // Vendor defined +} ISAPNP_SRI_VENDOR_DEFINED, *PISAPNP_SRI_VENDOR_DEFINED; + +typedef struct _ISAPNP_SRI_END_TAG +{ + UCHAR Header; + UCHAR Checksum; // Checksum +} ISAPNP_SRI_END_TAG, *PISAPNP_SRI_END_TAG; + + +typedef struct _ISAPNP_LRI +{ + UCHAR Header; + USHORT Length; // Length of data items +} ISAPNP_LRI, *PISAPNP_LRI; + +// Large Resource Item Names (LRINs) +#define ISAPNP_LRIN_MEMORY_RANGE 0x1 // Memory range descriptor +#define ISAPNP_LRIN_ID_STRING_ANSI 0x2 // Identifier string (ANSI) +#define ISAPNP_LRIN_ID_STRING_UNICODE 0x3 // Identifier string (UNICODE) +#define ISAPNP_LRIN_VENDOR_DEFINED 0x4 // Vendor defined +#define ISAPNP_LRIN_MEMORY_RANGE32 0x5 // 32-bit memory range descriptor +#define ISAPNP_LRIN_FL_MEMORY_RANGE32 0x6 // 32-bit fixed location memory range descriptor + +typedef struct _ISAPNP_LRI_MEMORY_RANGE +{ + UCHAR Header; + USHORT Length; // Length of data items + UCHAR Information; // Information + USHORT RangeMinBase; // Minimum base address + USHORT RangeMaxBase; // Maximum base address + USHORT Alignment; // Base alignment + USHORT RangeLength; // Length of range +} ISAPNP_LRI_MEMORY_RANGE, *PISAPNP_LRI_MEMORY_RANGE; + +typedef struct _ISAPNP_LRI_ID_STRING_ANSI +{ + UCHAR Header; + USHORT Length; // Length of data items + UCHAR String[0]; // Identifier string +} ISAPNP_LRI_ID_STRING_ANSI, *PISAPNP_LRI_ID_STRING_ANSI; -typedef struct _ISAPNP_LOGICAL_DEVICE { - ISAPNP_COMMON_EXTENSION Common; +typedef struct _ISAPNP_LRI_ID_STRING_UNICODE +{ + UCHAR Header; + USHORT Length; // Length of data items + USHORT CountryId; // Country identifier + USHORT String[0]; // Identifier string +} ISAPNP_LRI_ID_STRING_UNICODE, *PISAPNP_LRI_ID_STRING_UNICODE; + +typedef struct _PISAPNP_LRI_VENDOR_DEFINED +{ + UCHAR Header; + USHORT Length; // Length of data items + UCHAR Reserved[0]; // Vendor defined +} ISAPNP_LRI_VENDOR_DEFINED, *PISAPNP_LRI_VENDOR_DEFINED; + +typedef struct _ISAPNP_LRI_MEMORY_RANGE32 +{ + UCHAR Header; + USHORT Length; // Length of data items + UCHAR Information; // Information + ULONG RangeMinBase; // Minimum base address + ULONG RangeMaxBase; // Maximum base address + ULONG Alignment; // Base alignment + ULONG RangeLength; // Length of range +} ISAPNP_LRI_MEMORY_RANGE32, *PISAPNP_LRI_MEMORY_RANGE32; + +typedef struct _ISAPNP_LRI_FL_MEMORY_RANGE32 +{ + UCHAR Header; + USHORT Length; // Length of data items + UCHAR Information; // Information + ULONG RangeMinBase; // Minimum base address + ULONG RangeMaxBase; // Maximum base address + ULONG RangeLength; // Length of range +} ISAPNP_LRI_FL_MEMORY_RANGE32, *PISAPNP_LRI_FL_MEMORY_RANGE32; + +typedef struct _ISAPNP_CARD +{ + LIST_ENTRY ListEntry; + USHORT CardId; USHORT VendorId; - USHORT ProdId; - USHORT IoAddr; - UCHAR IrqNo; - UCHAR CSN; - UCHAR LDN; + USHORT DeviceId; + ULONG Serial; + UCHAR PNPVersion; + UCHAR ProductVersion; + UNICODE_STRING Name; + LIST_ENTRY LogicalDevices; + KSPIN_LOCK LogicalDevicesLock; +} ISAPNP_CARD, *PISAPNP_CARD; + + +typedef struct _ISAPNP_DESCRIPTOR +{ LIST_ENTRY ListEntry; -} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE; + IO_RESOURCE_DESCRIPTOR Descriptor; +} ISAPNP_DESCRIPTOR, *PISAPNP_DESCRIPTOR; -/* isapnp.c */ -NTSTATUS -NTAPI -DriverEntry( - IN PDRIVER_OBJECT DriverObject, - IN PUNICODE_STRING RegistryPath); +typedef struct _ISAPNP_CONFIGURATION_LIST +{ + LIST_ENTRY ListEntry; + ULONG Priority; + LIST_ENTRY ListHead; +} ISAPNP_CONFIGURATION_LIST, *PISAPNP_CONFIGURATION_LIST; -NTSTATUS -NTAPI -IsaForwardIrpSynchronous( - IN PISAPNP_FDO_EXTENSION FdoExt, - IN PIRP Irp); -/* fdo.c */ -NTSTATUS -NTAPI -IsaFdoPnp( - IN PISAPNP_FDO_EXTENSION FdoExt, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp); +#define MAX_COMPATIBLE_ID 32 -/* pdo.c */ -NTSTATUS -NTAPI -IsaPdoPnp( - IN PISAPNP_LOGICAL_DEVICE LogDev, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp); +typedef struct _ISAPNP_LOGICAL_DEVICE +{ + LIST_ENTRY CardListEntry; + LIST_ENTRY DeviceListEntry; + USHORT Number; + USHORT VendorId; + USHORT DeviceId; + USHORT CVendorId[MAX_COMPATIBLE_ID]; + USHORT CDeviceId[MAX_COMPATIBLE_ID]; + USHORT Regs; + PISAPNP_CARD Card; + UNICODE_STRING Name; + PDEVICE_OBJECT Pdo; + PIO_RESOURCE_REQUIREMENTS_LIST ResourceLists; + LIST_ENTRY Configuration; + ULONG ConfigurationSize; + ULONG DescriptorCount; + ULONG CurrentDescriptorCount; +} ISAPNP_LOGICAL_DEVICE, *PISAPNP_LOGICAL_DEVICE; -/* hardware.c */ -NTSTATUS -NTAPI -IsaHwDetectReadDataPort( - IN PISAPNP_FDO_EXTENSION FdoExt); -NTSTATUS -NTAPI -IsaHwFillDeviceList( - IN PISAPNP_FDO_EXTENSION FdoExt); +typedef enum { + dsStopped, + dsStarted +} ISAPNP_DEVICE_STATE; -NTSTATUS -NTAPI -IsaHwDeactivateDevice( - IN PISAPNP_LOGICAL_DEVICE LogicalDevice); +typedef struct _ISAPNP_DEVICE_EXTENSION +{ + // Physical Device Object + PDEVICE_OBJECT Pdo; + // Lower device object + PDEVICE_OBJECT Ldo; + // List of ISA PnP cards managed by this driver + LIST_ENTRY CardListHead; + // List of devices managed by this driver + LIST_ENTRY DeviceListHead; + // Number of devices managed by this driver + ULONG DeviceListCount; + // Spinlock for the linked lists + KSPIN_LOCK GlobalListLock; + // Current state of the driver + ISAPNP_DEVICE_STATE State; +} ISAPNP_DEVICE_EXTENSION, *PISAPNP_DEVICE_EXTENSION; NTSTATUS NTAPI -IsaHwActivateDevice( - IN PISAPNP_LOGICAL_DEVICE LogicalDevice); +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath); #ifdef __cplusplus } diff --git a/drivers/bus/isapnp/isapnp.rbuild b/drivers/bus/isapnp/isapnp.rbuild index bc8a96acaf7..b0b7919d927 100644 --- a/drivers/bus/isapnp/isapnp.rbuild +++ b/drivers/bus/isapnp/isapnp.rbuild @@ -1,13 +1,9 @@ - . ntoskrnl hal isapnp.c - pdo.c - fdo.c - hardware.c isapnp.rc diff --git a/drivers/bus/isapnp/isapnphw.h b/drivers/bus/isapnp/isapnphw.h deleted file mode 100644 index aec87191fe5..00000000000 --- a/drivers/bus/isapnp/isapnphw.h +++ /dev/null @@ -1,106 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#define ISAPNP_ADDRESS 0x279 -#define ISAPNP_WRITE_DATA 0xA79 - -#define ISAPNP_READ_PORT_MIN 0x203 -#define ISAPNP_READ_PORT_START 0x213 -#define ISAPNP_READ_PORT_MAX 0x3FF -#define ISAPNP_READ_PORT_STEP 0x10 - -#define ISAPNP_CSN_MIN 0x01 -#define ISAPNP_CSN_MAX 0x0F - -#define ISAPNP_READPORT 0x00 -#define ISAPNP_SERIALISOLATION 0x01 -#define ISAPNP_CONFIGCONTROL 0x02 -#define ISAPNP_WAKE 0x03 -#define ISAPNP_RESOURCEDATA 0x04 -#define ISAPNP_STATUS 0x05 -#define ISAPNP_CARDSELECTNUMBER 0x06 -#define ISAPNP_LOGICALDEVICENUMBER 0x07 - -#define ISAPNP_ACTIVATE 0x30 -#define ISAPNP_IORANGECHECK 0x31 - -#define ISAPNP_IOBASE(n) (0x60 + ((n)*2)) -#define ISAPNP_IRQNO(n) (0x70 + ((n)*2)) -#define ISAPNP_IRQTYPE(n) (0x71 + ((n) * 2)) - -#define ISAPNP_CONFIG_RESET (1 << 0) -#define ISAPNP_CONFIG_WAIT_FOR_KEY (1 << 1) -#define ISAPNP_CONFIG_RESET_CSN (1 << 2) - -#define ISAPNP_LFSR_SEED 0x6A - -#define ISAPNP_IS_SMALL_TAG(t) (!((t) & 0x80)) -#define ISAPNP_SMALL_TAG_NAME(t) (((t) >> 3) & 0xF) -#define ISAPNP_SMALL_TAG_LEN(t) (((t) & 0x7)) -#define ISAPNP_TAG_PNPVERNO 0x01 -#define ISAPNP_TAG_LOGDEVID 0x02 -#define ISAPNP_TAG_COMPATDEVID 0x03 -#define ISAPNP_TAG_IRQ 0x04 -#define ISAPNP_TAG_DMA 0x05 -#define ISAPNP_TAG_STARTDEP 0x06 -#define ISAPNP_TAG_ENDDEP 0x07 -#define ISAPNP_TAG_IOPORT 0x08 -#define ISAPNP_TAG_FIXEDIO 0x09 -#define ISAPNP_TAG_RSVDSHORTA 0x0A -#define ISAPNP_TAG_RSVDSHORTB 0x0B -#define ISAPNP_TAG_RSVDSHORTC 0x0C -#define ISAPNP_TAG_RSVDSHORTD 0x0D -#define ISAPNP_TAG_VENDORSHORT 0x0E -#define ISAPNP_TAG_END 0x0F - -#define ISAPNP_IS_LARGE_TAG(t) (((t) & 0x80)) -#define ISAPNP_LARGE_TAG_NAME(t) (t) -#define ISAPNP_TAG_MEMRANGE 0x81 -#define ISAPNP_TAG_ANSISTR 0x82 -#define ISAPNP_TAG_UNICODESTR 0x83 -#define ISAPNP_TAG_VENDORLONG 0x84 -#define ISAPNP_TAG_MEM32RANGE 0x85 -#define ISAPNP_TAG_FIXEDMEM32RANGE 0x86 -#define ISAPNP_TAG_RSVDLONG0 0xF0 -#define ISAPNP_TAG_RSVDLONG1 0xF1 -#define ISAPNP_TAG_RSVDLONG2 0xF2 -#define ISAPNP_TAG_RSVDLONG3 0xF3 -#define ISAPNP_TAG_RSVDLONG4 0xF4 -#define ISAPNP_TAG_RSVDLONG5 0xF5 -#define ISAPNP_TAG_RSVDLONG6 0xF6 -#define ISAPNP_TAG_RSVDLONG7 0xF7 -#define ISAPNP_TAG_RSVDLONG8 0xF8 -#define ISAPNP_TAG_RSVDLONG9 0xF9 -#define ISAPNP_TAG_RSVDLONGA 0xFA -#define ISAPNP_TAG_RSVDLONGB 0xFB -#define ISAPNP_TAG_RSVDLONGC 0xFC -#define ISAPNP_TAG_RSVDLONGD 0xFD -#define ISAPNP_TAG_RSVDLONGE 0xFE -#define ISAPNP_TAG_RSVDLONGF 0xFF -#define ISAPNP_TAG_PSEUDO_NEWBOARD 0x100 - -typedef struct _ISAPNP_IDENTIFIER { - USHORT VendorId; - USHORT ProdId; - ULONG Serial; - UCHAR Checksum; -} ISAPNP_IDENTIFIER, *PISAPNP_IDENTIFIER; - -typedef struct _ISAPNP_LOGDEVID { - USHORT VendorId; - USHORT ProdId; - USHORT Flags; -} ISAPNP_LOGDEVID, *PISAPNP_LOGDEVID; - -typedef struct _ISAPNP_DEVICEID { - CHAR* Name; - USHORT VendorId; - USHORT ProdId; -} ISAPNP_DEVICEID, *PISAPNP_DEVICEID; - -#ifdef __cplusplus -} -#endif diff --git a/drivers/bus/isapnp/pdo.c b/drivers/bus/isapnp/pdo.c deleted file mode 100644 index 0292f20f0f4..00000000000 --- a/drivers/bus/isapnp/pdo.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * PROJECT: ReactOS ISA PnP Bus driver - * FILE: pdo.c - * PURPOSE: PDO-specific code - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - */ -#include - -#define NDEBUG -#include - -NTSTATUS -NTAPI -IsaPdoQueryDeviceRelations( - IN PISAPNP_LOGICAL_DEVICE LogDev, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp) -{ - PDEVICE_RELATIONS DeviceRelations; - - if (IrpSp->Parameters.QueryDeviceRelations.Type != TargetDeviceRelation) - return Irp->IoStatus.Status; - - DeviceRelations = ExAllocatePool(PagedPool, sizeof(*DeviceRelations)); - if (!DeviceRelations) - return STATUS_INSUFFICIENT_RESOURCES; - - DeviceRelations->Count = 1; - DeviceRelations->Objects[0] = LogDev->Common.Self; - ObReferenceObject(LogDev->Common.Self); - - Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -IsaPdoPnp( - IN PISAPNP_LOGICAL_DEVICE LogDev, - IN PIRP Irp, - IN PIO_STACK_LOCATION IrpSp) -{ - NTSTATUS Status = Irp->IoStatus.Status; - - switch (IrpSp->MinorFunction) - { - case IRP_MN_START_DEVICE: - Status = IsaHwActivateDevice(LogDev); - - if (NT_SUCCESS(Status)) - LogDev->Common.State = dsStarted; - break; - - case IRP_MN_STOP_DEVICE: - Status = IsaHwDeactivateDevice(LogDev); - - if (NT_SUCCESS(Status)) - LogDev->Common.State = dsStopped; - break; - - case IRP_MN_QUERY_DEVICE_RELATIONS: - Status = IsaPdoQueryDeviceRelations(LogDev, Irp, IrpSp); - break; - - case IRP_MN_QUERY_RESOURCES: - DPRINT1("IRP_MN_QUERY_RESOURCES is UNIMPLEMENTED!\n"); - break; - - case IRP_MN_QUERY_RESOURCE_REQUIREMENTS: - DPRINT1("IRP_MN_QUERY_RESOURCE_REQUIREMENTS is UNIMPLEMENTED!\n"); - break; - - default: - DPRINT1("Unknown PnP code: %x\n", IrpSp->MinorFunction); - break; - } - - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return Status; -} diff --git a/drivers/bus/pci/fdo.c b/drivers/bus/pci/fdo.c index b6753e10a5e..35fd12536c7 100644 --- a/drivers/bus/pci/fdo.c +++ b/drivers/bus/pci/fdo.c @@ -16,46 +16,6 @@ /*** PRIVATE *****************************************************************/ -static IO_COMPLETION_ROUTINE ForwardIrpAndWaitCompletion; - -static NTSTATUS NTAPI -ForwardIrpAndWaitCompletion( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - IN PVOID Context) -{ - UNREFERENCED_PARAMETER(DeviceObject); - if (Irp->PendingReturned) - KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE); - return STATUS_MORE_PROCESSING_REQUIRED; -} - -NTSTATUS NTAPI -ForwardIrpAndWait( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - KEVENT Event; - NTSTATUS Status; - PDEVICE_OBJECT LowerDevice = ((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->Ldo; - ASSERT(LowerDevice); - - KeInitializeEvent(&Event, NotificationEvent, FALSE); - IoCopyCurrentIrpStackLocationToNext(Irp); - - IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE); - - Status = IoCallDriver(LowerDevice, Irp); - if (Status == STATUS_PENDING) - { - Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL); - if (NT_SUCCESS(Status)) - Status = Irp->IoStatus.Status; - } - - return Status; -} - static NTSTATUS FdoLocateChildDevice( PPCI_DEVICE *Device, @@ -279,6 +239,8 @@ FdoQueryBusRelations( break; } + Device->Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; + Device->Pdo->Flags &= ~DO_DEVICE_INITIALIZING; //Device->Pdo->Flags |= DO_POWER_PAGABLE; @@ -506,7 +468,7 @@ FdoPnpControl( { PFDO_DEVICE_EXTENSION DeviceExtension; PIO_STACK_LOCATION IrpSp; - NTSTATUS Status = Irp->IoStatus.Status; + NTSTATUS Status; DPRINT("Called\n"); @@ -532,13 +494,8 @@ FdoPnpControl( break; #endif case IRP_MN_QUERY_DEVICE_RELATIONS: - if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations) - break; - Status = FdoQueryBusRelations(DeviceObject, Irp, IrpSp); - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + break; #if 0 case IRP_MN_QUERY_PNP_DEVICE_STATE: Status = STATUS_NOT_IMPLEMENTED; @@ -558,37 +515,38 @@ FdoPnpControl( #endif case IRP_MN_START_DEVICE: DPRINT("IRP_MN_START_DEVICE received\n"); - Status = ForwardIrpAndWait(DeviceObject, Irp); - if (NT_SUCCESS(Status)) - Status = FdoStartDevice(DeviceObject, Irp); - - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + Status = FdoStartDevice(DeviceObject, Irp); + break; case IRP_MN_STOP_DEVICE: /* Currently not supported */ Status = STATUS_UNSUCCESSFUL; - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + break; #if 0 case IRP_MN_SURPRISE_REMOVAL: Status = STATUS_NOT_IMPLEMENTED; break; #endif - case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: - break; - case IRP_MN_REMOVE_DEVICE: - DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); - break; default: DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction); + /* fall through */ + + case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: + /* + * Do NOT complete the IRP as it will be processed by the lower + * device object, which will complete the IRP + */ + IoSkipCurrentIrpStackLocation(Irp); + Status = IoCallDriver(DeviceExtension->Ldo, Irp); + return Status; break; } - Irp->IoStatus.Status = Status; - IoSkipCurrentIrpStackLocation(Irp); - Status = IoCallDriver(DeviceExtension->Ldo, Irp); + + if (Status != STATUS_PENDING) { + if (Status != STATUS_NOT_IMPLEMENTED) + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } DPRINT("Leaving. Status 0x%X\n", Status); diff --git a/drivers/bus/pci/pdo.c b/drivers/bus/pci/pdo.c index e5961fbf3a2..f19e45c1f4c 100644 --- a/drivers/bus/pci/pdo.c +++ b/drivers/bus/pci/pdo.c @@ -413,8 +413,8 @@ PdoQueryResourceRequirements( RtlZeroMemory(ResourceList, ListSize); ResourceList->ListSize = ListSize; ResourceList->InterfaceType = PCIBus; - ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber; - ResourceList->SlotNumber = DeviceExtension->PciDevice->SlotNumber.u.AsULONG; + ResourceList->BusNumber = 0; + ResourceList->SlotNumber = 0; ResourceList->AlternativeLists = 1; ResourceList->List[0].Version = 1; @@ -717,7 +717,7 @@ PdoQueryResources( RtlZeroMemory(ResourceList, ListSize); ResourceList->Count = 1; ResourceList->List[0].InterfaceType = PCIBus; - ResourceList->List[0].BusNumber = DeviceExtension->PciDevice->BusNumber; + ResourceList->List[0].BusNumber = 0; PartialList = &ResourceList->List[0].PartialResourceList; PartialList->Version = 1; @@ -775,7 +775,7 @@ PdoQueryResources( Descriptor->ShareDisposition = CmResourceShareShared; Descriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE; Descriptor->u.Interrupt.Level = PciConfig.u.type0.InterruptLine; - Descriptor->u.Interrupt.Vector = PciConfig.u.type0.InterruptLine; + Descriptor->u.Interrupt.Vector = 0; Descriptor->u.Interrupt.Affinity = 0xFFFFFFFF; } } @@ -1186,52 +1186,6 @@ PdoQueryInterface( return Status; } -static NTSTATUS -PdoStartDevice( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PCM_RESOURCE_LIST RawResList = IrpSp->Parameters.StartDevice.AllocatedResources; - PCM_FULL_RESOURCE_DESCRIPTOR RawFullDesc; - PCM_PARTIAL_RESOURCE_DESCRIPTOR RawPartialDesc; - ULONG i, ii; - PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; - UCHAR Irq; - - if (!RawResList) - return STATUS_SUCCESS; - - /* TODO: Assign the other resources we get to the card */ - - for (i = 0; i < RawResList->Count; i++) - { - RawFullDesc = &RawResList->List[i]; - - for (ii = 0; ii < RawFullDesc->PartialResourceList.Count; ii++) - { - RawPartialDesc = &RawFullDesc->PartialResourceList.PartialDescriptors[ii]; - - if (RawPartialDesc->Type == CmResourceTypeInterrupt) - { - DPRINT1("Assigning IRQ %x to PCI device (%x, %x)\n", - RawPartialDesc->u.Interrupt.Vector, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - DeviceExtension->PciDevice->BusNumber); - - Irq = (UCHAR)RawPartialDesc->u.Interrupt.Vector; - HalSetBusDataByOffset(PCIConfiguration, - DeviceExtension->PciDevice->BusNumber, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - &Irq, - 0x3c /* PCI_INTERRUPT_LINE */, - sizeof(UCHAR)); - } - } - } - - return STATUS_SUCCESS; -} static NTSTATUS PdoReadConfig( @@ -1293,33 +1247,6 @@ PdoWriteConfig( return STATUS_SUCCESS; } -static NTSTATUS -PdoQueryDeviceRelations( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, - PIO_STACK_LOCATION IrpSp) -{ - PDEVICE_RELATIONS DeviceRelations; - - /* We only support TargetDeviceRelation for child PDOs */ - if (IrpSp->Parameters.QueryDeviceRelations.Type != TargetDeviceRelation) - return Irp->IoStatus.Status; - - /* We can do this because we only return 1 PDO for TargetDeviceRelation */ - DeviceRelations = ExAllocatePool(PagedPool, sizeof(*DeviceRelations)); - if (!DeviceRelations) - return STATUS_INSUFFICIENT_RESOURCES; - - DeviceRelations->Count = 1; - DeviceRelations->Objects[0] = DeviceObject; - - /* The PnP manager will remove this when it is done with the PDO */ - ObReferenceObject(DeviceObject); - - Irp->IoStatus.Information = (ULONG_PTR)DeviceRelations; - - return STATUS_SUCCESS; -} static NTSTATUS PdoSetPower( @@ -1392,7 +1319,8 @@ PdoPnpControl( break; case IRP_MN_QUERY_DEVICE_RELATIONS: - Status = PdoQueryDeviceRelations(DeviceObject, Irp, IrpSp); + /* FIXME: Possibly handle for RemovalRelations */ + DPRINT("Unimplemented IRP_MN_QUERY_DEVICE_RELATIONS received\n"); break; case IRP_MN_QUERY_DEVICE_TEXT: @@ -1424,9 +1352,6 @@ PdoPnpControl( break; case IRP_MN_START_DEVICE: - Status = PdoStartDevice(DeviceObject, Irp, IrpSp); - break; - case IRP_MN_QUERY_STOP_DEVICE: case IRP_MN_CANCEL_STOP_DEVICE: case IRP_MN_STOP_DEVICE: diff --git a/drivers/bus/pcmcia/fdo.c b/drivers/bus/pcmcia/fdo.c deleted file mode 100644 index 348fd1cf9ea..00000000000 --- a/drivers/bus/pcmcia/fdo.c +++ /dev/null @@ -1,25 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel - * FILE: drivers/bus/pcmcia/fdo.c - * PURPOSE: PCMCIA Bus Driver - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - */ - -#include - -//#define NDEBUG -#include - -NTSTATUS -NTAPI -PcmciaFdoPlugPlay(PPCMCIA_FDO_EXTENSION FdoExt, - PIRP Irp) -{ - UNIMPLEMENTED - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_NOT_SUPPORTED; -} - diff --git a/drivers/bus/pcmcia/pcmcia.c b/drivers/bus/pcmcia/pcmcia.c deleted file mode 100644 index 54d23da7f50..00000000000 --- a/drivers/bus/pcmcia/pcmcia.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel - * FILE: drivers/bus/pcmcia/pcmcia.c - * PURPOSE: PCMCIA Bus Driver - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - */ - -#include - -//#define NDEBUG -#include - -BOOLEAN IoctlEnabled; - -NTSTATUS -NTAPI -PcmciaCreateClose(PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - DPRINT("PCMCIA: Create/Close\n"); - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -PcmciaDeviceControl(PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); - NTSTATUS Status; - - DPRINT("PCMCIA: DeviceIoControl\n"); - - Irp->IoStatus.Information = 0; - - switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) - { - default: - DPRINT1("PCMCIA: Unknown ioctl code: %x\n", IrpSp->Parameters.DeviceIoControl.IoControlCode); - Status = STATUS_NOT_SUPPORTED; - } - - Irp->IoStatus.Status = Status; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return Status; -} - -VOID -NTAPI -PcmciaUnload(PDRIVER_OBJECT DriverObject) -{ - DPRINT("PCMCIA: Unload\n"); -} - -NTSTATUS -NTAPI -PcmciaPlugPlay(PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - PPCMCIA_COMMON_EXTENSION Common = DeviceObject->DeviceExtension; - - DPRINT("PCMCIA: PnP\n"); - if (Common->IsFDO) - { - return PcmciaFdoPlugPlay((PPCMCIA_FDO_EXTENSION)Common, - Irp); - } - else - { - return PcmciaPdoPlugPlay((PPCMCIA_PDO_EXTENSION)Common, - Irp); - } -} - -NTSTATUS -NTAPI -PcmciaPower(PDEVICE_OBJECT DeviceObject, - PIRP Irp) -{ - PPCMCIA_COMMON_EXTENSION Common = DeviceObject->DeviceExtension; - PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation(Irp); - NTSTATUS Status; - - switch (IrpSp->MinorFunction) - { - case IRP_MN_QUERY_POWER: - /* I don't see any reason that we should care */ - DPRINT("PCMCIA: IRP_MN_QUERY_POWER\n"); - Status = STATUS_SUCCESS; - break; - - case IRP_MN_POWER_SEQUENCE: - DPRINT("PCMCIA: IRP_MN_POWER_SEQUENCE\n"); - RtlCopyMemory(IrpSp->Parameters.PowerSequence.PowerSequence, - &Common->PowerSequence, - sizeof(POWER_SEQUENCE)); - Status = STATUS_SUCCESS; - break; - - case IRP_MN_WAIT_WAKE: - /* Not really sure about this */ - DPRINT("PCMCIA: IRP_MN_WAIT_WAKE\n"); - Status = STATUS_NOT_SUPPORTED; - break; - - case IRP_MN_SET_POWER: - DPRINT("PCMCIA: IRP_MN_SET_POWER\n"); - if (IrpSp->Parameters.Power.Type == SystemPowerState) - { - Common->SystemPowerState = IrpSp->Parameters.Power.State.SystemState; - - Status = STATUS_SUCCESS; - } - else - { - Common->DevicePowerState = IrpSp->Parameters.Power.State.DeviceState; - - /* Update the POWER_SEQUENCE struct */ - if (Common->DevicePowerState <= PowerDeviceD1) - Common->PowerSequence.SequenceD1++; - - if (Common->DevicePowerState <= PowerDeviceD2) - Common->PowerSequence.SequenceD2++; - - if (Common->DevicePowerState <= PowerDeviceD3) - Common->PowerSequence.SequenceD3++; - - /* Start the underlying device if we are handling this for a PDO */ - if (!Common->IsFDO) - Status = PcmciaPdoSetPowerState((PPCMCIA_PDO_EXTENSION)Common); - else - Status = STATUS_SUCCESS; - } - - /* Report that we changed state to the Power Manager */ - PoSetPowerState(DeviceObject, IrpSp->Parameters.Power.Type, IrpSp->Parameters.Power.State); - break; - - default: - DPRINT1("PCMCIA: Invalid MN code in MJ_POWER handler %x\n", IrpSp->MinorFunction); - ASSERT(FALSE); - Status = STATUS_INVALID_DEVICE_REQUEST; - break; - } - - Irp->IoStatus.Status = Status; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return Status; -} - -NTSTATUS -NTAPI -PcmciaAddDevice(PDRIVER_OBJECT DriverObject, - PDEVICE_OBJECT PhysicalDeviceObject) -{ - PPCMCIA_FDO_EXTENSION FdoExt; - PDEVICE_OBJECT Fdo; - NTSTATUS Status; - - DPRINT("PCMCIA: AddDevice\n"); - - Status = IoCreateDevice(DriverObject, - sizeof(*FdoExt), - NULL, - FILE_DEVICE_BUS_EXTENDER, - FILE_DEVICE_SECURE_OPEN, - FALSE, - &Fdo); - if (!NT_SUCCESS(Status)) return Status; - - FdoExt = Fdo->DeviceExtension; - - RtlZeroMemory(FdoExt, sizeof(*FdoExt)); - - InitializeListHead(&FdoExt->ChildDeviceList); - KeInitializeSpinLock(&FdoExt->Lock); - - FdoExt->Common.Self = Fdo; - FdoExt->Common.IsFDO = TRUE; - FdoExt->Common.State = dsStopped; - - FdoExt->Ldo = IoAttachDeviceToDeviceStack(Fdo, - PhysicalDeviceObject); - - Fdo->Flags &= ~DO_DEVICE_INITIALIZING; - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -DriverEntry(PDRIVER_OBJECT DriverObject, - PUNICODE_STRING RegistryPath) -{ - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - NTSTATUS Status; - - DPRINT1("PCMCIA: DriverEntry\n"); - - DriverObject->MajorFunction[IRP_MJ_CREATE] = PcmciaCreateClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = PcmciaCreateClose; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = PcmciaDeviceControl; - DriverObject->MajorFunction[IRP_MJ_PNP] = PcmciaPlugPlay; - DriverObject->MajorFunction[IRP_MJ_POWER] = PcmciaPower; - - DriverObject->DriverExtension->AddDevice = PcmciaAddDevice; - DriverObject->DriverUnload = PcmciaUnload; - - RtlZeroMemory(QueryTable, sizeof(RTL_QUERY_REGISTRY_TABLE) * 2); - - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - QueryTable[0].Name = L"IoctlInterface"; - QueryTable[0].EntryContext = &IoctlEnabled; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, - L"Pcmcia\\Parameters", - QueryTable, - NULL, - NULL); - if (!NT_SUCCESS(Status)) - { - /* Key not present so assume disabled */ - IoctlEnabled = FALSE; - } - - DPRINT("PCMCIA: Ioctl interface %s\n", - (IoctlEnabled ? "enabled" : "disabled")); - - return STATUS_SUCCESS; -} diff --git a/drivers/bus/pcmcia/pcmcia.h b/drivers/bus/pcmcia/pcmcia.h deleted file mode 100644 index 32dd5f28a06..00000000000 --- a/drivers/bus/pcmcia/pcmcia.h +++ /dev/null @@ -1,51 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -typedef enum { - dsStopped, - dsStarted, - dsPaused, - dsRemoved, - dsSurpriseRemoved -} PCMCIA_DEVICE_STATE; - -typedef struct _PCMCIA_COMMON_EXTENSION { - PDEVICE_OBJECT Self; - BOOLEAN IsFDO; - POWER_SEQUENCE PowerSequence; - PCMCIA_DEVICE_STATE State; - DEVICE_POWER_STATE DevicePowerState; - SYSTEM_POWER_STATE SystemPowerState; -} PCMCIA_COMMON_EXTENSION, *PPCMCIA_COMMON_EXTENSION; - -typedef struct _PCMCIA_PDO_EXTENSION { - PCMCIA_COMMON_EXTENSION Common; -} PCMCIA_PDO_EXTENSION, *PPCMCIA_PDO_EXTENSION; - -typedef struct _PCMCIA_FDO_EXTENSION { - PCMCIA_COMMON_EXTENSION Common; - PDEVICE_OBJECT Ldo; - LIST_ENTRY ChildDeviceList; - KSPIN_LOCK Lock; -} PCMCIA_FDO_EXTENSION, *PPCMCIA_FDO_EXTENSION; - -/* pdo.c */ -NTSTATUS -NTAPI -PcmciaPdoPlugPlay(PPCMCIA_PDO_EXTENSION PdoExt, - PIRP Irp); - -NTSTATUS -NTAPI -PcmciaPdoSetPowerState(PPCMCIA_PDO_EXTENSION PdoExt); - -/* fdo.c */ -NTSTATUS -NTAPI -PcmciaFdoPlugPlay(PPCMCIA_FDO_EXTENSION FdoExt, - PIRP Irp); - diff --git a/drivers/bus/pcmcia/pcmcia.rbuild b/drivers/bus/pcmcia/pcmcia.rbuild deleted file mode 100644 index 2d33ce5dcd6..00000000000 --- a/drivers/bus/pcmcia/pcmcia.rbuild +++ /dev/null @@ -1,12 +0,0 @@ - - - - - . - ntoskrnl - hal - fdo.c - pcmcia.c - pdo.c - pcmcia.rc - diff --git a/drivers/bus/pcmcia/pcmcia.rc b/drivers/bus/pcmcia/pcmcia.rc deleted file mode 100644 index 13958160676..00000000000 --- a/drivers/bus/pcmcia/pcmcia.rc +++ /dev/null @@ -1,5 +0,0 @@ -#define REACTOS_VERSION_DLL -#define REACTOS_STR_FILE_DESCRIPTION "PCMCIA Bus Driver\0" -#define REACTOS_STR_INTERNAL_NAME "pcmcia\0" -#define REACTOS_STR_ORIGINAL_FILENAME "pcmcia.sys\0" -#include diff --git a/drivers/bus/pcmcia/pdo.c b/drivers/bus/pcmcia/pdo.c deleted file mode 100644 index 0e4d16886ee..00000000000 --- a/drivers/bus/pcmcia/pdo.c +++ /dev/null @@ -1,34 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Kernel - * FILE: drivers/bus/pcmcia/pdo.c - * PURPOSE: PCMCIA Bus Driver - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - */ - -#include - -//#define NDEBUG -#include - -NTSTATUS -NTAPI -PcmciaPdoPlugPlay(PPCMCIA_PDO_EXTENSION PdoExt, - PIRP Irp) -{ - UNIMPLEMENTED - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_NOT_SUPPORTED; -} - -NTSTATUS -NTAPI -PcmciaPdoSetPowerState(PPCMCIA_PDO_EXTENSION PdoExt) -{ - UNIMPLEMENTED - - return STATUS_SUCCESS; -} - diff --git a/drivers/ksfilter/ks/allocators.c b/drivers/ksfilter/ks/allocators.c index 5a4970f1b58..3040a041837 100644 --- a/drivers/ksfilter/ks/allocators.c +++ b/drivers/ksfilter/ks/allocators.c @@ -251,7 +251,7 @@ IKsAllocator_fnDeviceIoControl( } } - /* unhandled request */ + /* unhandeled request */ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); diff --git a/drivers/ksfilter/ks/api.c b/drivers/ksfilter/ks/api.c index 2067de57648..ef83f9dbedf 100644 --- a/drivers/ksfilter/ks/api.c +++ b/drivers/ksfilter/ks/api.c @@ -94,8 +94,6 @@ KsReleaseDeviceSecurityLock( { PKSIDEVICE_HEADER Header = (PKSIDEVICE_HEADER)DevHeader; - DPRINT("KsReleaseDevice\n"); - ExReleaseResourceLite(&Header->SecurityLock); KeLeaveCriticalRegion(); } @@ -1591,7 +1589,7 @@ KsAcquireControl( /* sanity check */ ASSERT(BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); - KeWaitForSingleObject(BasicHeader->ControlMutex, Executive, KernelMode, FALSE, NULL); + KeWaitForSingleObject(&BasicHeader->ControlMutex, Executive, KernelMode, FALSE, NULL); } @@ -1608,7 +1606,7 @@ KsReleaseControl( /* sanity check */ ASSERT(BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); - KeReleaseMutex(BasicHeader->ControlMutex, FALSE); + KeReleaseMutex(&BasicHeader->ControlMutex, FALSE); } @@ -1625,11 +1623,11 @@ KsAcquireDevice( IKsDevice *KsDevice; PKSIDEVICE_HEADER DeviceHeader; - DPRINT("KsAcquireDevice\n"); + DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); /* get device interface*/ - KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; + KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; /* acquire device mutex */ KsDevice->lpVtbl->AcquireDevice(KsDevice); @@ -1647,7 +1645,7 @@ KsReleaseDevice( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); /* get device interface*/ - KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; + KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; /* release device mutex */ KsDevice->lpVtbl->ReleaseDevice(KsDevice); @@ -1670,7 +1668,7 @@ KsTerminateDevice( DeviceHeader = DeviceExtension->DeviceHeader; /* get device interface*/ - KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; + KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; /* now free device header */ KsFreeDeviceHeader((KSDEVICE_HEADER)DeviceHeader); @@ -1960,7 +1958,7 @@ KsDeviceGetBusData( } /* - @implemented + @unimplemented */ KSDDKAPI void @@ -1971,12 +1969,7 @@ KsDeviceRegisterAdapterObject( IN ULONG MaxMappingsByteCount, IN ULONG MappingTableStride) { - PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)CONTAINING_RECORD(Device, KSIDEVICE_HEADER, KsDevice); - - DeviceHeader->AdapterObject = AdapterObject; - DeviceHeader->MaxMappingsByteCount = MaxMappingsByteCount; - DeviceHeader->MappingTableStride = MappingTableStride; - + UNIMPLEMENTED } /* @@ -1989,7 +1982,6 @@ KsGetBusEnumIdentifier( IN PIRP Irp) { UNIMPLEMENTED - return STATUS_UNSUCCESSFUL; } @@ -2102,15 +2094,8 @@ KspCountMethodSets( if (!AutomationTableB) return AutomationTableA->MethodSetsCount; - - DPRINT("AutomationTableA MethodItemSize %lu MethodSetsCount %lu\n", AutomationTableA->MethodItemSize, AutomationTableA->MethodSetsCount); - DPRINT("AutomationTableB MethodItemSize %lu MethodSetsCount %lu\n", AutomationTableB->MethodItemSize, AutomationTableB->MethodSetsCount); - - if (AutomationTableA->MethodItemSize && AutomationTableB->MethodItemSize) - { - /* sanity check */ - ASSERT(AutomationTableA->MethodItemSize == AutomationTableB->MethodItemSize); - } + /* sanity check */ + ASSERT(AutomationTableA->MethodItemSize == AutomationTableB->MethodItemSize); /* now iterate all property sets and compare their guids */ Count = AutomationTableA->MethodSetsCount; @@ -2151,14 +2136,8 @@ KspCountEventSets( if (!AutomationTableB) return AutomationTableA->EventSetsCount; - DPRINT("AutomationTableA EventItemSize %lu EventSetsCount %lu\n", AutomationTableA->EventItemSize, AutomationTableA->EventSetsCount); - DPRINT("AutomationTableB EventItemSize %lu EventSetsCount %lu\n", AutomationTableB->EventItemSize, AutomationTableB->EventSetsCount); - - if (AutomationTableA->EventItemSize && AutomationTableB->EventItemSize) - { - /* sanity check */ - ASSERT(AutomationTableA->EventItemSize == AutomationTableB->EventItemSize); - } + /* sanity check */ + ASSERT(AutomationTableA->EventItemSize == AutomationTableB->EventItemSize); /* now iterate all Event sets and compare their guids */ Count = AutomationTableA->EventSetsCount; @@ -2201,8 +2180,6 @@ KspCountPropertySets( return AutomationTableA->PropertySetsCount; /* sanity check */ - DPRINT("AutomationTableA PropertyItemSize %lu PropertySetsCount %lu\n", AutomationTableA->PropertyItemSize, AutomationTableA->PropertySetsCount); - DPRINT("AutomationTableB PropertyItemSize %lu PropertySetsCount %lu\n", AutomationTableB->PropertyItemSize, AutomationTableB->PropertySetsCount); ASSERT(AutomationTableA->PropertyItemSize == AutomationTableB->PropertyItemSize); /* now iterate all property sets and compare their guids */ @@ -2242,18 +2219,18 @@ KspCopyMethodSets( if (!AutomationTableA) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableB->MethodSets, sizeof(KSMETHOD_SET) * AutomationTableB->MethodSetsCount); + RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableB->MethodSets, Table->MethodItemSize * AutomationTableB->MethodSetsCount); return STATUS_SUCCESS; } else if (!AutomationTableB) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, sizeof(KSMETHOD_SET) * AutomationTableA->MethodSetsCount); + RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, Table->MethodItemSize * AutomationTableA->MethodSetsCount); return STATUS_SUCCESS; } /* first copy all property items from dominant table */ - RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, sizeof(KSMETHOD_SET) * AutomationTableA->MethodSetsCount); + RtlMoveMemory((PVOID)Table->MethodSets, AutomationTableA->MethodSets, Table->MethodItemSize * AutomationTableA->MethodSetsCount); /* set counter */ Count = AutomationTableA->MethodSetsCount; @@ -2276,7 +2253,7 @@ KspCopyMethodSets( if (!bFound) { /* copy new property item set */ - RtlMoveMemory((PVOID)&Table->MethodSets[Count], &AutomationTableB->MethodSets[Index], sizeof(KSMETHOD_SET)); + RtlMoveMemory((PVOID)&Table->MethodSets[Count], &AutomationTableB->MethodSets[Index], Table->MethodItemSize); Count++; } } @@ -2297,18 +2274,18 @@ KspCopyPropertySets( if (!AutomationTableA) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableB->PropertySets, sizeof(KSPROPERTY_SET) * AutomationTableB->PropertySetsCount); + RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableB->PropertySets, Table->PropertyItemSize * AutomationTableB->PropertySetsCount); return STATUS_SUCCESS; } else if (!AutomationTableB) { /* copy of property set */ - RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, sizeof(KSPROPERTY_SET) * AutomationTableA->PropertySetsCount); + RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, Table->PropertyItemSize * AutomationTableA->PropertySetsCount); return STATUS_SUCCESS; } /* first copy all property items from dominant table */ - RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, sizeof(KSPROPERTY_SET) * AutomationTableA->PropertySetsCount); + RtlMoveMemory((PVOID)Table->PropertySets, AutomationTableA->PropertySets, Table->PropertyItemSize * AutomationTableA->PropertySetsCount); /* set counter */ Count = AutomationTableA->PropertySetsCount; @@ -2331,7 +2308,7 @@ KspCopyPropertySets( if (!bFound) { /* copy new property item set */ - RtlMoveMemory((PVOID)&Table->PropertySets[Count], &AutomationTableB->PropertySets[Index], sizeof(KSPROPERTY_SET)); + RtlMoveMemory((PVOID)&Table->PropertySets[Count], &AutomationTableB->PropertySets[Index], Table->PropertyItemSize); Count++; } } @@ -2351,18 +2328,18 @@ KspCopyEventSets( if (!AutomationTableA) { /* copy of Event set */ - RtlMoveMemory((PVOID)Table->EventSets, AutomationTableB->EventSets, sizeof(KSEVENT_SET) * AutomationTableB->EventSetsCount); + RtlMoveMemory((PVOID)Table->EventSets, AutomationTableB->EventSets, Table->EventItemSize * AutomationTableB->EventSetsCount); return STATUS_SUCCESS; } else if (!AutomationTableB) { /* copy of Event set */ - RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, sizeof(KSEVENT_SET) * AutomationTableA->EventSetsCount); + RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, Table->EventItemSize * AutomationTableA->EventSetsCount); return STATUS_SUCCESS; } /* first copy all Event items from dominant table */ - RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, sizeof(KSEVENT_SET) * AutomationTableA->EventSetsCount); + RtlMoveMemory((PVOID)Table->EventSets, AutomationTableA->EventSets, Table->EventItemSize * AutomationTableA->EventSetsCount); /* set counter */ Count = AutomationTableA->EventSetsCount; @@ -2385,7 +2362,7 @@ KspCopyEventSets( if (!bFound) { /* copy new Event item set */ - RtlMoveMemory((PVOID)&Table->EventSets[Count], &AutomationTableB->EventSets[Index], sizeof(KSEVENT_SET)); + RtlMoveMemory((PVOID)&Table->EventSets[Count], &AutomationTableB->EventSets[Index], Table->EventItemSize); Count++; } } @@ -2449,7 +2426,7 @@ KsMergeAutomationTables( } /* now allocate the property sets */ - Table->PropertySets = AllocateItem(NonPagedPool, sizeof(KSPROPERTY_SET) * Table->PropertySetsCount); + Table->PropertySets = AllocateItem(NonPagedPool, Table->PropertyItemSize * Table->PropertySetsCount); if (!Table->PropertySets) { @@ -2492,7 +2469,7 @@ KsMergeAutomationTables( } /* now allocate the property sets */ - Table->MethodSets = AllocateItem(NonPagedPool, sizeof(KSMETHOD_SET) * Table->MethodSetsCount); + Table->MethodSets = AllocateItem(NonPagedPool, Table->MethodItemSize * Table->MethodSetsCount); if (!Table->MethodSets) { @@ -2535,7 +2512,7 @@ KsMergeAutomationTables( } /* now allocate the property sets */ - Table->EventSets = AllocateItem(NonPagedPool, sizeof(KSEVENT_SET) * Table->EventSetsCount); + Table->EventSets = AllocateItem(NonPagedPool, Table->EventItemSize * Table->EventSetsCount); if (!Table->EventSets) { @@ -2706,26 +2683,8 @@ KsRegisterAggregatedClientUnknown( IN PVOID Object, IN PUNKNOWN ClientUnknown) { - PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); - - /* sanity check */ - ASSERT(BasicHeader->Type == KsObjectTypeDevice || BasicHeader->Type == KsObjectTypeFilterFactory || - BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); - - if (BasicHeader->ClientAggregate) - { - /* release existing aggregate */ - BasicHeader->ClientAggregate->lpVtbl->Release(BasicHeader->ClientAggregate); - } - - /* increment reference count */ - ClientUnknown->lpVtbl->AddRef(ClientUnknown); - - /* store client aggregate */ - BasicHeader->ClientAggregate = ClientUnknown; - - /* return objects outer unknown */ - return BasicHeader->OuterUnknown; + UNIMPLEMENTED + return NULL; } /* diff --git a/drivers/ksfilter/ks/bag.c b/drivers/ksfilter/ks/bag.c index 87f7a2bbef0..1b7eec9bc5e 100644 --- a/drivers/ksfilter/ks/bag.c +++ b/drivers/ksfilter/ks/bag.c @@ -41,7 +41,7 @@ KsAllocateObjectBag( return STATUS_INSUFFICIENT_RESOURCES; /* get device interface */ - KsDevice = (IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown; + KsDevice = (IKsDevice*)&DeviceHeader->lpVtblIKsDevice; /* initialize object bag */ return KsDevice->lpVtbl->InitializeObjectBag(KsDevice, Bag, NULL); @@ -89,8 +89,6 @@ KsAddItemToObjectBag( PKSIOBJECT_BAG Bag; PKSIOBJECT_BAG_ENTRY BagEntry; - DPRINT("KsAddItemToObjectBag\n"); - /* get real object bag */ Bag = (PKSIOBJECT_BAG)ObjectBag; @@ -365,8 +363,6 @@ _KsEdit( PVOID Item; NTSTATUS Status; - DPRINT("_KsEdit\n"); - /* get real object bag */ Bag = (PKSIOBJECT_BAG)ObjectBag; diff --git a/drivers/ksfilter/ks/clocks.c b/drivers/ksfilter/ks/clocks.c index 05064be740a..39611935076 100644 --- a/drivers/ksfilter/ks/clocks.c +++ b/drivers/ksfilter/ks/clocks.c @@ -21,235 +21,20 @@ typedef struct PFNKSSETTIMER SetTimer; PFNKSCANCELTIMER CancelTimer; PFNKSCORRELATEDTIME CorrelatedTime; - LONGLONG Granularity; - LONGLONG Error; + KSRESOLUTION* Resolution; ULONG Flags; }KSIDEFAULTCLOCK, *PKSIDEFAULTCLOCK; typedef struct { + IKsClock *lpVtbl; LONG ref; PKSCLOCK_CREATE ClockCreate; PKSIDEFAULTCLOCK DefaultClock; PKSIOBJECT_HEADER ObjectHeader; }KSICLOCK, *PKSICLOCK; -NTSTATUS NTAPI ClockPropertyTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI ClockPropertyPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI ClockPropertyCorrelatedTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI ClockPropertyCorrelatedPhysicalTime(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI ClockPropertyResolution(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI ClockPropertyState(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI ClockPropertyFunctionTable(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); - -DEFINE_KSPROPERTY_CLOCKSET(ClockPropertyTable, ClockPropertyTime, ClockPropertyPhysicalTime, ClockPropertyCorrelatedTime, ClockPropertyCorrelatedPhysicalTime, ClockPropertyResolution, ClockPropertyState, ClockPropertyFunctionTable); - -KSPROPERTY_SET ClockPropertySet[] = -{ - { - &KSPROPSETID_Clock, - sizeof(ClockPropertyTable) / sizeof(KSPROPERTY_ITEM), - (const KSPROPERTY_ITEM*)&ClockPropertyTable, - 0, - NULL - } -}; - -LONGLONG -FASTCALL -ClockGetPhysicalTime( - IN PFILE_OBJECT FileObject) -{ - UNIMPLEMENTED - return 0; -} - -LONGLONG -FASTCALL -ClockGetCorrelatedTime( - IN PFILE_OBJECT FileObject, - OUT PLONGLONG SystemTime) -{ - UNIMPLEMENTED - return 0; -} - -LONGLONG -FASTCALL -ClockGetTime( - IN PFILE_OBJECT FileObject) -{ - UNIMPLEMENTED - return 0; -} - -LONGLONG -FASTCALL -ClockGetCorrelatedPhysicalTime( - IN PFILE_OBJECT FileObject, - OUT PLONGLONG SystemTime) -{ - UNIMPLEMENTED - return 0; -} - -NTSTATUS -NTAPI -ClockPropertyTime( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PLONGLONG Time = (PLONGLONG)Data; - PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("ClockPropertyTime\n"); - - *Time = ClockGetTime(IoStack->FileObject); - - Irp->IoStatus.Information = sizeof(LONGLONG); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ClockPropertyPhysicalTime( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PLONGLONG Time = (PLONGLONG)Data; - PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("ClockPropertyPhysicalTime\n"); - - *Time = ClockGetPhysicalTime(IoStack->FileObject); - - Irp->IoStatus.Information = sizeof(LONGLONG); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ClockPropertyCorrelatedTime( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PKSCORRELATED_TIME Time = (PKSCORRELATED_TIME)Data; - PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("ClockPropertyCorrelatedTime\n"); - - Time->Time = ClockGetCorrelatedTime(IoStack->FileObject, &Time->SystemTime); - - Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ClockPropertyCorrelatedPhysicalTime( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PKSCORRELATED_TIME Time = (PKSCORRELATED_TIME)Data; - PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("ClockPropertyCorrelatedPhysicalTime\n"); - - Time->Time = ClockGetCorrelatedPhysicalTime(IoStack->FileObject, &Time->SystemTime); - - Irp->IoStatus.Information = sizeof(KSCORRELATED_TIME); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ClockPropertyResolution( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PKSICLOCK Clock; - PKSIOBJECT_HEADER ObjectHeader; - PIO_STACK_LOCATION IoStack; - PKSRESOLUTION Resolution = (PKSRESOLUTION)Data; - - DPRINT("ClockPropertyResolution\n"); - - /* get stack location */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - /* sanity check */ - ASSERT(ObjectHeader); - - /* locate ks pin implemention from KSPIN offset */ - Clock = (PKSICLOCK)ObjectHeader->ObjectType; - - Resolution->Error = Clock->DefaultClock->Error; - Resolution->Granularity = Clock->DefaultClock->Granularity; - - Irp->IoStatus.Information = sizeof(KSRESOLUTION); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ClockPropertyState( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PKSICLOCK Clock; - PKSIOBJECT_HEADER ObjectHeader; - PKSSTATE State = (PKSSTATE)Data; - PIO_STACK_LOCATION IoStack; - - DPRINT("ClockPropertyState\n"); - - /* get stack location */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - /* sanity check */ - ASSERT(ObjectHeader); - - /* locate ks pin implemention from KSPIN offset */ - Clock = (PKSICLOCK)ObjectHeader->ObjectType; - - *State = Clock->DefaultClock->State; - Irp->IoStatus.Information = sizeof(KSSTATE); - - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -ClockPropertyFunctionTable( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PKSCLOCK_FUNCTIONTABLE Table = (PKSCLOCK_FUNCTIONTABLE)Data; - - DPRINT("ClockPropertyFunctionTable\n"); - - Table->GetCorrelatedPhysicalTime = ClockGetCorrelatedPhysicalTime; - Table->GetCorrelatedTime = ClockGetCorrelatedTime; - Table->GetPhysicalTime = ClockGetPhysicalTime; - Table->GetTime = ClockGetTime; - - return STATUS_SUCCESS; -} - /* @implemented @@ -311,37 +96,12 @@ IKsClock_DispatchDeviceIoControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PIO_STACK_LOCATION IoStack; - UNICODE_STRING GuidString; - PKSPROPERTY Property; - NTSTATUS Status; - - DPRINT("IKsClock_DispatchDeviceIoControl\n"); - - /* get current io stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - /* FIXME support events */ - ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY); - - /* sanity check */ - ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSPROPERTY)); - - /* call property handler */ - Status = KsPropertyHandler(Irp, 1, ClockPropertySet); - - /* get property from input buffer */ - Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - - RtlStringFromGUID(&Property->Set, &GuidString); - DPRINT("IKsClock_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); - RtlFreeUnicodeString(&GuidString); - + UNIMPLEMENTED - Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -352,12 +112,14 @@ IKsClock_DispatchClose( { UNIMPLEMENTED - Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; + return STATUS_NOT_IMPLEMENTED; } + + static KSDISPATCH_TABLE DispatchTable = { IKsClock_DispatchDeviceIoControl, @@ -385,6 +147,7 @@ KsCreateDefaultClock( NTSTATUS Status; PKSCLOCK_CREATE ClockCreate; PKSICLOCK Clock; + PKSOBJECT_CREATE_ITEM CreateItem; Status = KsValidateClockCreateRequest(Irp, &ClockCreate); if (!NT_SUCCESS(Status)) @@ -408,7 +171,7 @@ KsCreateDefaultClock( /* initialize clock */ /* FIXME IKsClock */ - Clock->ObjectHeader->ObjectType = (PVOID)Clock; + Clock->ObjectHeader->Unknown = (PUNKNOWN)&Clock->lpVtbl; Clock->ref = 1; Clock->ClockCreate = ClockCreate; Clock->DefaultClock = (PKSIDEFAULTCLOCK)DefaultClock; @@ -416,6 +179,9 @@ KsCreateDefaultClock( /* increment reference count */ InterlockedIncrement(&Clock->DefaultClock->ReferenceCount); + /* get create item */ + CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); + return Status; } @@ -464,21 +230,9 @@ KsAllocateDefaultClockEx( Clock->SetTimer = SetTimer; Clock->CancelTimer = CancelTimer; Clock->CorrelatedTime = CorrelatedTime; + Clock->Resolution = (PKSRESOLUTION)Resolution; Clock->Flags = Flags; - if (Resolution) - { - if (SetTimer) - { - Clock->Error = Resolution->Error; - } - - if (CorrelatedTime) - { - Clock->Granularity = Resolution->Granularity; - } - } - *DefaultClock = (PKSDEFAULTCLOCK)Clock; return STATUS_SUCCESS; } diff --git a/drivers/ksfilter/ks/connectivity.c b/drivers/ksfilter/ks/connectivity.c index bcc55cc6f1f..7c9b8226de2 100644 --- a/drivers/ksfilter/ks/connectivity.c +++ b/drivers/ksfilter/ks/connectivity.c @@ -23,7 +23,6 @@ KSPIN_MEDIUM StandardPinMedium = 0 }; -const GUID KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT = {0xf4aeb342, 0x0329, 0x4fdd, {0xa8, 0xfd, 0x4a, 0xff, 0x49, 0x26, 0xc9, 0x78}}; /* @implemented @@ -54,12 +53,16 @@ KsCreatePin( ConnectionHandle); } +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS -KspValidateConnectRequest( - IN PIRP Irp, - IN ULONG DescriptorsCount, - IN PVOID Descriptors, - IN ULONG DescriptorSize, +NTAPI +KsValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN KSPIN_DESCRIPTOR* Descriptor, OUT PKSPIN_CONNECT* Connect) { PKSPIN_CONNECT ConnectDetails; @@ -70,7 +73,6 @@ KspValidateConnectRequest( ULONG Index; ULONG Count; BOOLEAN Found; - PKSPIN_DESCRIPTOR Descriptor; /* did the caller miss the connect parameter */ if (!Connect) @@ -93,24 +95,12 @@ KspValidateConnectRequest( if (ConnectDetails->PinId >= DescriptorsCount) return STATUS_INVALID_PARAMETER; - if (DescriptorSize == sizeof(KSPIN_DESCRIPTOR)) - { - /* standard pin descriptor */ - Descriptor = (PKSPIN_DESCRIPTOR)((ULONG_PTR)Descriptors + sizeof(KSPIN_DESCRIPTOR) * ConnectDetails->PinId); - } - else - { - /* extended / variable pin descriptor */ - Descriptor = &((PKSPIN_DESCRIPTOR_EX)((ULONG_PTR)Descriptors + DescriptorSize * ConnectDetails->PinId))->PinDescriptor; - } - - /* does the pin have interface details filled in */ - if (Descriptor->InterfacesCount && Descriptor->Interfaces) + if (Descriptor[ConnectDetails->PinId].InterfacesCount && Descriptor[ConnectDetails->PinId].Interfaces) { /* use provided pin interface count */ - Count = Descriptor->InterfacesCount; - Interface = (PKSPIN_INTERFACE)Descriptor->Interfaces; + Count = Descriptor[ConnectDetails->PinId].InterfacesCount; + Interface = (PKSPIN_INTERFACE)Descriptor[ConnectDetails->PinId].Interfaces; } else { @@ -124,13 +114,6 @@ KspValidateConnectRequest( Index = 0; do { - UNICODE_STRING GuidString, GuidString2; - RtlStringFromGUID(&Interface[Index].Set, &GuidString); - RtlStringFromGUID(&ConnectDetails->Interface.Set, &GuidString2); - - DPRINT("Driver Interface %S Id %u\n", GuidString.Buffer, Interface[Index].Id); - DPRINT("Connect Interface %S Id %u\n", GuidString2.Buffer, ConnectDetails->Interface.Id); - if (IsEqualGUIDAligned(&Interface[Index].Set, &ConnectDetails->Interface.Set) && Interface[Index].Id == ConnectDetails->Interface.Id) { @@ -149,11 +132,11 @@ KspValidateConnectRequest( } /* does the pin have medium details filled in */ - if (Descriptor->MediumsCount && Descriptor->Mediums) + if (Descriptor[ConnectDetails->PinId].MediumsCount && Descriptor[ConnectDetails->PinId].Mediums) { /* use provided pin interface count */ - Count = Descriptor->MediumsCount; - Medium = (PKSPIN_MEDIUM)Descriptor->Mediums; + Count = Descriptor[ConnectDetails->PinId].MediumsCount; + Medium = (PKSPIN_MEDIUM)Descriptor[ConnectDetails->PinId].Mediums; } else { @@ -167,14 +150,6 @@ KspValidateConnectRequest( Index = 0; do { - UNICODE_STRING GuidString, GuidString2; - RtlStringFromGUID(&Medium[Index].Set, &GuidString); - RtlStringFromGUID(&ConnectDetails->Medium.Set, &GuidString2); - - DPRINT("Driver Medium %S Id %u\n", GuidString.Buffer, Medium[Index].Id); - DPRINT("Connect Medium %S Id %u\n", GuidString2.Buffer, ConnectDetails->Medium.Id); - - if (IsEqualGUIDAligned(&Medium[Index].Set, &ConnectDetails->Medium.Set) && Medium[Index].Id == ConnectDetails->Medium.Id) { @@ -182,9 +157,6 @@ KspValidateConnectRequest( Found = TRUE; break; } - - - /* iterate to next medium */ Index++; }while(Index < Count); @@ -202,20 +174,6 @@ KspValidateConnectRequest( return STATUS_SUCCESS; } -/* - @implemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsValidateConnectRequest( - IN PIRP Irp, - IN ULONG DescriptorsCount, - IN KSPIN_DESCRIPTOR* Descriptor, - OUT PKSPIN_CONNECT* Connect) -{ - return KspValidateConnectRequest(Irp, DescriptorsCount, Descriptor, sizeof(KSPIN_DESCRIPTOR), Connect); -} NTSTATUS KspReadMediaCategory( @@ -307,16 +265,18 @@ KspReadMediaCategory( return Status; } +/* + @implemented +*/ KSDDKAPI NTSTATUS NTAPI -KspPinPropertyHandler( +KsPinPropertyHandler( IN PIRP Irp, IN PKSPROPERTY Property, IN OUT PVOID Data, IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptors, - IN ULONG DescriptorSize) + IN const KSPIN_DESCRIPTOR* Descriptor) { KSP_PIN * Pin; KSMULTIPLE_ITEM * Item; @@ -326,38 +286,12 @@ KspPinPropertyHandler( PKSDATARANGE_AUDIO *WaveFormatOut; PKSDATAFORMAT_WAVEFORMATEX WaveFormatIn; PKEY_VALUE_PARTIAL_INFORMATION KeyInfo; - const KSPIN_DESCRIPTOR *Descriptor; NTSTATUS Status = STATUS_NOT_SUPPORTED; - ULONG Count; - const PKSDATARANGE* DataRanges; IoStack = IoGetCurrentIrpStackLocation(Irp); Buffer = Irp->UserBuffer; - //DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id); - - /* convert to PKSP_PIN */ - Pin = (KSP_PIN*)Property; - - if (Property->Id != KSPROPERTY_PIN_CTYPES) - { - if (Pin->PinId >= DescriptorsCount) - { - /* invalid parameter */ - return STATUS_INVALID_PARAMETER; - } - } - - if (DescriptorSize == sizeof(KSPIN_DESCRIPTOR)) - { - /* it is simple pin descriptor */ - Descriptor = &Descriptors[Pin->PinId]; - } - else - { - /* get offset to pin descriptor */ - Descriptor = &(((PKSPIN_DESCRIPTOR_EX)((ULONG_PTR)Descriptors + Pin->PinId * DescriptorSize))->PinDescriptor); - } + DPRINT("KsPinPropertyHandler Irp %p Property %p Data %p DescriptorsCount %u Descriptor %p OutputLength %u Id %u\n", Irp, Property, Data, DescriptorsCount, Descriptor, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Property->Id); switch(Property->Id) { @@ -367,7 +301,13 @@ KspPinPropertyHandler( Status = STATUS_SUCCESS; break; case KSPROPERTY_PIN_DATAFLOW: - + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } Size = sizeof(KSPIN_DATAFLOW); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) { @@ -376,31 +316,23 @@ KspPinPropertyHandler( break; } - *((KSPIN_DATAFLOW*)Buffer) = Descriptor->DataFlow; + *((KSPIN_DATAFLOW*)Buffer) = Descriptor[Pin->PinId].DataFlow; Irp->IoStatus.Information = sizeof(KSPIN_DATAFLOW); Status = STATUS_SUCCESS; break; case KSPROPERTY_PIN_DATARANGES: - case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: - - Size = sizeof(KSMULTIPLE_ITEM); - DPRINT("Id %lu PinId %lu DataRangesCount %lu ConstrainedDataRangesCount %lu\n", Property->Id, Pin->PinId, Descriptor->DataRangesCount, Descriptor->ConstrainedDataRangesCount); - - if (Property->Id == KSPROPERTY_PIN_DATARANGES || Descriptor->ConstrainedDataRangesCount == 0) - { - DataRanges = Descriptor->DataRanges; - Count = Descriptor->DataRangesCount; - } - else + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) { - DataRanges = Descriptor->ConstrainedDataRanges; - Count = Descriptor->ConstrainedDataRangesCount; + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; } - - for (Index = 0; Index < Count; Index++) + Size = sizeof(KSMULTIPLE_ITEM); + for (Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++) { - Size += ((DataRanges[Index]->FormatSize + 0x7) & ~0x7); + Size += Descriptor[Pin->PinId].DataRanges[Index]->FormatSize; } if (IoStack->Parameters.DeviceIoControl.OutputBufferLength == 0) @@ -422,9 +354,16 @@ KspPinPropertyHandler( break; } + if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(KSMULTIPLE_ITEM)) + { + /* buffer too small */ + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + /* store descriptor size */ Item->Size = Size; - Item->Count = Count; + Item->Count = Descriptor[Pin->PinId].DataRangesCount; if (IoStack->Parameters.DeviceIoControl.OutputBufferLength == sizeof(KSMULTIPLE_ITEM)) { @@ -435,40 +374,28 @@ KspPinPropertyHandler( /* now copy all dataranges */ Data = (PUCHAR)(Item +1); - - /* alignment assert */ - ASSERT(((ULONG_PTR)Data & 0x7) == 0); - - for (Index = 0; Index < Count; Index++) + for (Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++) { - UNICODE_STRING GuidString; - /* convert the guid to string */ - RtlStringFromGUID(&DataRanges[Index]->MajorFormat, &GuidString); - DPRINT("Index %lu MajorFormat %S\n", Index, GuidString.Buffer); - RtlStringFromGUID(&DataRanges[Index]->SubFormat, &GuidString); - DPRINT("Index %lu SubFormat %S\n", Index, GuidString.Buffer); - RtlStringFromGUID(&DataRanges[Index]->Specifier, &GuidString); - DPRINT("Index %lu Specifier %S\n", Index, GuidString.Buffer); - RtlStringFromGUID(&DataRanges[Index]->Specifier, &GuidString); - DPRINT("Index %lu FormatSize %lu Flags %lu SampleSize %lu Reserved %lu KSDATAFORMAT %lu\n", Index, - DataRanges[Index]->FormatSize, DataRanges[Index]->Flags, DataRanges[Index]->SampleSize, DataRanges[Index]->Reserved, sizeof(KSDATAFORMAT)); - - RtlMoveMemory(Data, DataRanges[Index], DataRanges[Index]->FormatSize); - Data = ((PUCHAR)Data + DataRanges[Index]->FormatSize); - /* alignment assert */ - ASSERT(((ULONG_PTR)Data & 0x7) == 0); - Data = (PVOID)(((ULONG_PTR)Data + 0x7) & ~0x7); + RtlMoveMemory(Data, Descriptor[Pin->PinId].DataRanges[Index], Descriptor[Pin->PinId].DataRanges[Index]->FormatSize); + Data = ((PUCHAR)Data + Descriptor[Pin->PinId].DataRanges[Index]->FormatSize); } Status = STATUS_SUCCESS; Irp->IoStatus.Information = Size; break; case KSPROPERTY_PIN_INTERFACES: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } - if (Descriptor->Interfaces) + if (Descriptor[Pin->PinId].Interfaces) { /* use mediums provided by driver */ - return KsHandleSizedListQuery(Irp, Descriptor->InterfacesCount, sizeof(KSPIN_MEDIUM), Descriptor->Interfaces); + return KsHandleSizedListQuery(Irp, Descriptor[Pin->PinId].InterfacesCount, sizeof(KSPIN_MEDIUM), Descriptor[Pin->PinId].Interfaces); } else { @@ -478,11 +405,18 @@ KspPinPropertyHandler( break; case KSPROPERTY_PIN_MEDIUMS: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } - if (Descriptor->MediumsCount) + if (Descriptor[Pin->PinId].MediumsCount) { /* use mediums provided by driver */ - return KsHandleSizedListQuery(Irp, Descriptor->MediumsCount, sizeof(KSPIN_MEDIUM), Descriptor->Mediums); + return KsHandleSizedListQuery(Irp, Descriptor[Pin->PinId].MediumsCount, sizeof(KSPIN_MEDIUM), Descriptor[Pin->PinId].Mediums); } else { @@ -492,6 +426,13 @@ KspPinPropertyHandler( break; case KSPROPERTY_PIN_COMMUNICATION: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } Size = sizeof(KSPIN_COMMUNICATION); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) @@ -501,13 +442,19 @@ KspPinPropertyHandler( break; } - *((KSPIN_COMMUNICATION*)Buffer) = Descriptor->Communication; - + *((KSPIN_COMMUNICATION*)Buffer) = Descriptor[Pin->PinId].Communication; Status = STATUS_SUCCESS; Irp->IoStatus.Information = Size; break; case KSPROPERTY_PIN_CATEGORY: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } Size = sizeof(GUID); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) @@ -516,9 +463,9 @@ KspPinPropertyHandler( Status = STATUS_BUFFER_TOO_SMALL; break; } - if (Descriptor->Category) + if (Descriptor[Pin->PinId].Category) { - RtlMoveMemory(Buffer, Descriptor->Category, sizeof(GUID)); + RtlMoveMemory(Buffer, Descriptor[Pin->PinId].Category, sizeof(GUID)); } Status = STATUS_SUCCESS; @@ -526,20 +473,29 @@ KspPinPropertyHandler( break; case KSPROPERTY_PIN_NAME: - if (!Descriptor->Name) + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } + + if (!Descriptor[Pin->PinId].Name) { Irp->IoStatus.Information = 0; Status = STATUS_SUCCESS; break; } - Status = KspReadMediaCategory((LPGUID)Descriptor->Name, &KeyInfo); + Status = KspReadMediaCategory((LPGUID)Descriptor[Pin->PinId].Name, &KeyInfo); if (!NT_SUCCESS(Status)) { Irp->IoStatus.Information = 0; break; } + Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR); if (KeyInfo->DataLength + sizeof(WCHAR) > IoStack->Parameters.DeviceIoControl.OutputBufferLength) @@ -554,6 +510,13 @@ KspPinPropertyHandler( ExFreePool(KeyInfo); break; case KSPROPERTY_PIN_PROPOSEDATAFORMAT: + Pin = (KSP_PIN*)Property; + if (Pin->PinId >= DescriptorsCount) + { + Status = STATUS_INVALID_PARAMETER; + Irp->IoStatus.Information = 0; + break; + } Size = sizeof(KSDATAFORMAT); if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < Size) { @@ -570,14 +533,14 @@ KspPinPropertyHandler( } WaveFormatIn = (PKSDATAFORMAT_WAVEFORMATEX)Buffer; - if (!Descriptor->DataRanges || !Descriptor->DataRangesCount) + if (!Descriptor[Pin->PinId].DataRanges || !Descriptor[Pin->PinId].DataRangesCount) { Status = STATUS_UNSUCCESSFUL; Irp->IoStatus.Information = 0; break; } - WaveFormatOut = (PKSDATARANGE_AUDIO*)Descriptor->DataRanges; - for(Index = 0; Index < Descriptor->DataRangesCount; Index++) + WaveFormatOut = (PKSDATARANGE_AUDIO*)Descriptor[Pin->PinId].DataRanges; + for(Index = 0; Index < Descriptor[Pin->PinId].DataRangesCount; Index++) { if (WaveFormatOut[Index]->DataRange.FormatSize != sizeof(KSDATARANGE_AUDIO)) { @@ -614,22 +577,6 @@ KspPinPropertyHandler( return Status; } -/* - @implemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsPinPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Property, - IN OUT PVOID Data, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptor) -{ - return KspPinPropertyHandler(Irp, Property, Data, DescriptorsCount, Descriptor, sizeof(KSPIN_DESCRIPTOR)); -} - /* @unimplemented */ diff --git a/drivers/ksfilter/ks/device.c b/drivers/ksfilter/ks/device.c index 432548c6d91..345689f49b8 100644 --- a/drivers/ksfilter/ks/device.c +++ b/drivers/ksfilter/ks/device.c @@ -16,29 +16,15 @@ IKsDevice_fnQueryInterface( REFIID refiid, PVOID* Output) { - NTSTATUS Status; - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->BasicHeader.OuterUnknown; + *Output = &This->lpVtblIKsDevice; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } - if (This->BasicHeader.ClientAggregate) - { - /* using client aggregate */ - Status = This->BasicHeader.ClientAggregate->lpVtbl->QueryInterface(This->BasicHeader.ClientAggregate, refiid, Output); - - if (NT_SUCCESS(Status)) - { - /* client aggregate supports interface */ - return Status; - } - } - - DPRINT("IKsDevice_fnQueryInterface no interface\n"); return STATUS_NOT_SUPPORTED; } @@ -47,7 +33,7 @@ NTAPI IKsDevice_fnAddRef( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); return InterlockedIncrement(&This->ref); } @@ -57,7 +43,7 @@ NTAPI IKsDevice_fnRelease( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); InterlockedDecrement(&This->ref); @@ -71,7 +57,7 @@ NTAPI IKsDevice_fnGetStruct( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); return &This->KsDevice; } @@ -83,7 +69,7 @@ IKsDevice_fnInitializeObjectBag( IN PKSIOBJECT_BAG Bag, IN PRKMUTEX Mutex) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); if (!Mutex) { @@ -107,7 +93,7 @@ NTAPI IKsDevice_fnAcquireDevice( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); return KeWaitForSingleObject(&This->DeviceMutex, Executive, KernelMode, FALSE, NULL); } @@ -117,7 +103,7 @@ NTAPI IKsDevice_fnReleaseDevice( IN IKsDevice * iface) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); return KeReleaseMutex(&This->DeviceMutex, FALSE); } @@ -126,17 +112,14 @@ NTSTATUS NTAPI IKsDevice_fnGetAdapterObject( IN IKsDevice * iface, - IN PADAPTER_OBJECT * Object, - IN PULONG MaxMappingsByteCount, - IN PULONG MappingTableStride) + IN PADAPTER_OBJECT Object, + IN PULONG Unknown1, + IN PULONG Unknown2) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); - - *Object = This->AdapterObject; - *MaxMappingsByteCount = This->MaxMappingsByteCount; - *MappingTableStride = This->MappingTableStride; + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); - return STATUS_SUCCESS; + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; } @@ -147,7 +130,7 @@ IKsDevice_fnAddPowerEntry( IN struct KSPOWER_ENTRY * Entry, IN IKsPowerNotify* Notify) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -159,7 +142,7 @@ IKsDevice_fnRemovePowerEntry( IN IKsDevice * iface, IN struct KSPOWER_ENTRY * Entry) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -175,7 +158,7 @@ IKsDevice_fnPinStateChange( IN KSSTATE OldState, IN KSSTATE NewState) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -186,24 +169,15 @@ NTSTATUS NTAPI IKsDevice_fnArbitrateAdapterChannel( IN IKsDevice * iface, - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, + IN ULONG ControlCode, + IN IO_ALLOCATION_ACTION Action, IN PVOID Context) { - PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); - NTSTATUS Status; - - DPRINT("IKsDevice_fnArbitrateAdapterChannel NumberOfMapRegisters %lu ExecutionRoutine %p Context %p Irql %lu\n", NumberOfMapRegisters, ExecutionRoutine, Context, KeGetCurrentIrql()); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); - /* sanity check */ - ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - ASSERT(This->AdapterObject); - - /* allocate adapter channel */ - Status = IoAllocateAdapterChannel(This->AdapterObject, This->KsDevice.FunctionalDeviceObject, NumberOfMapRegisters, ExecutionRoutine, Context); + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; - /* done */ - return Status; } NTSTATUS @@ -212,7 +186,7 @@ IKsDevice_fnCheckIoCapability( IN IKsDevice * iface, IN ULONG Unknown) { - //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, BasicHeader.OuterUnknown); + //PKSIDEVICE_HEADER This = (PKSIDEVICE_HEADER)CONTAINING_RECORD(iface, KSIDEVICE_HEADER, lpVtblIKsDevice); UNIMPLEMENTED return STATUS_NOT_IMPLEMENTED; @@ -518,7 +492,7 @@ IKsDevice_Pnp( } case IRP_MN_QUERY_INTERFACE: { - Status = STATUS_UNSUCCESSFUL; + Status = STATUS_SUCCESS; /* check for pnp notification support */ if (Dispatch) { @@ -534,7 +508,6 @@ IKsDevice_Pnp( if (NT_SUCCESS(Status)) { /* driver supports a private interface */ - DPRINT1("IRP_MN_QUERY_INTERFACE Device supports interface\n"); Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; @@ -544,6 +517,7 @@ IKsDevice_Pnp( Status = KspForwardIrpSynchronous(DeviceObject, Irp); DPRINT1("IRP_MN_QUERY_INTERFACE Next Device: Status %x\n", Status); + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; @@ -583,12 +557,8 @@ IKsDevice_Pnp( } default: DPRINT1("unhandled function %u\n", IoStack->MinorFunction); - /* pass the irp down the driver stack */ - Status = KspForwardIrpSynchronous(DeviceObject, Irp); - - Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + return STATUS_NOT_SUPPORTED; } } @@ -631,7 +601,7 @@ IKsDevice_Create( DeviceHeader = DeviceExtension->DeviceHeader; /* acquire list lock */ - IKsDevice_fnAcquireDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown); + IKsDevice_fnAcquireDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice); /* sanity check */ ASSERT(IoStack->FileObject); @@ -670,7 +640,7 @@ IKsDevice_Create( } /* acquire list lock */ - IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->BasicHeader.OuterUnknown); + IKsDevice_fnReleaseDevice((IKsDevice*)&DeviceHeader->lpVtblIKsDevice); if (Status != STATUS_PENDING) { @@ -716,23 +686,6 @@ KsInitializeDevice( DPRINT("DeviceHeader %p\n", DeviceExtension->DeviceHeader); - if (Descriptor && Descriptor->Dispatch) - { - DPRINT("Descriptor Add %p\n", Descriptor->Dispatch->Add); - DPRINT("Descriptor Start %p\n", Descriptor->Dispatch->Start); - DPRINT("Descriptor PostStart %p\n", Descriptor->Dispatch->PostStart); - DPRINT("Descriptor QueryStop %p\n", Descriptor->Dispatch->QueryStop); - DPRINT("Descriptor CancelStop %p\n", Descriptor->Dispatch->CancelStop); - DPRINT("Descriptor Stop %p\n", Descriptor->Dispatch->Stop); - DPRINT("Descriptor QueryRemove %p\n", Descriptor->Dispatch->QueryRemove); - DPRINT("Descriptor CancelRemove %p\n", Descriptor->Dispatch->CancelRemove); - DPRINT("Descriptor Remove %p\n", Descriptor->Dispatch->Remove); - DPRINT("Descriptor QueryCapabilities %p\n", Descriptor->Dispatch->QueryCapabilities); - DPRINT("Descriptor SurpriseRemoval %p\n", Descriptor->Dispatch->SurpriseRemoval); - DPRINT("Descriptor QueryPower %p\n", Descriptor->Dispatch->QueryPower); - DPRINT("Descriptor SetPower %p\n", Descriptor->Dispatch->SetPower); - DPRINT("Descriptor QueryInterface %p\n", Descriptor->Dispatch->QueryInterface); - } /* check for success */ if (!NT_SUCCESS(Status)) @@ -742,7 +695,7 @@ KsInitializeDevice( } /* initialize IKsDevice interface */ - Header->BasicHeader.OuterUnknown = (PUNKNOWN)&vt_IKsDevice; + Header->lpVtblIKsDevice = &vt_IKsDevice; Header->ref = 1; /* allocate object bag */ @@ -826,7 +779,7 @@ KsReferenceSoftwareBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { @@ -850,7 +803,7 @@ KsReferenceBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { @@ -875,7 +828,7 @@ KsDereferenceBusObject( PKSIDEVICE_HEADER DeviceHeader = (PKSIDEVICE_HEADER)Header; /* get device interface */ - Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { @@ -899,7 +852,7 @@ KsDereferenceSoftwareBusObject( DPRINT1("KsDereferenceSoftwareBusObject DeviceHeader %p\n", Header); /* get device interface */ - Device = (IKsDevice*)DeviceHeader->BasicHeader.OuterUnknown; + Device = (IKsDevice*)DeviceHeader->lpVtblIKsDevice; if (Device) { diff --git a/drivers/ksfilter/ks/deviceinterface.c b/drivers/ksfilter/ks/deviceinterface.c index c1fdff8470b..cd0ffe274bb 100644 --- a/drivers/ksfilter/ks/deviceinterface.c +++ b/drivers/ksfilter/ks/deviceinterface.c @@ -90,10 +90,6 @@ KspRegisterDeviceInterfaces( /* return result */ return Status; } - - /* copy device class */ - RtlMoveMemory(&SymEntry->DeviceInterfaceClass, &Categories[Index], sizeof(CLSID)); - /* insert symbolic link entry */ InsertTailList(SymbolicLinkList, &SymEntry->Entry); } diff --git a/drivers/ksfilter/ks/driver.c b/drivers/ksfilter/ks/driver.c index c0195a4a97f..409977d63d5 100644 --- a/drivers/ksfilter/ks/driver.c +++ b/drivers/ksfilter/ks/driver.c @@ -39,19 +39,10 @@ KsGetDevice( { PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); - DPRINT("KsGetDevice Type %lu KsDevice %p\n", BasicHeader->Type, BasicHeader->KsDevice); + DPRINT("KsGetDevice %p BasicHeader %p Type %x\n", Object, BasicHeader, BasicHeader->Type); - ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); + ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == BasicHeader->Type); ASSERT(BasicHeader->KsDevice); - ASSERT(BasicHeader->KsDevice->Descriptor); - ASSERT(BasicHeader->KsDevice->Bag); - ASSERT(BasicHeader->KsDevice->Context); - ASSERT(BasicHeader->KsDevice->FunctionalDeviceObject); - ASSERT(BasicHeader->KsDevice->PhysicalDeviceObject); - ASSERT(BasicHeader->KsDevice->NextDeviceObject); - ASSERT(BasicHeader->KsDevice->Started); - ASSERT(BasicHeader->KsDevice->SystemPowerState == PowerSystemWorking); - ASSERT(BasicHeader->KsDevice->DevicePowerState == PowerDeviceD0); return BasicHeader->KsDevice; } @@ -161,8 +152,6 @@ KsInitializeDriver( PKS_DRIVER_EXTENSION DriverObjectExtension; NTSTATUS Status = STATUS_SUCCESS; - DPRINT("KsInitializeDriver\n"); - if (Descriptor) { Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver, sizeof(KS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension); diff --git a/drivers/ksfilter/ks/filter.c b/drivers/ksfilter/ks/filter.c index 5f4a74b9b64..5d06ca2f49d 100644 --- a/drivers/ksfilter/ks/filter.c +++ b/drivers/ksfilter/ks/filter.c @@ -14,15 +14,18 @@ typedef struct KSBASIC_HEADER Header; KSFILTER Filter; + IKsFilterVtbl *lpVtbl; IKsControlVtbl *lpVtblKsControl; IKsFilterFactory * FilterFactory; LONG ref; PKSIOBJECT_HEADER ObjectHeader; KSTOPOLOGY Topology; + KSPIN_DESCRIPTOR_EX * PinDescriptorsEx; + KSPIN_DESCRIPTOR * PinDescriptors; + ULONG PinDescriptorCount; PKSFILTERFACTORY Factory; PFILE_OBJECT FileObject; - KMUTEX ControlMutex; KMUTEX ProcessingMutex; @@ -31,7 +34,7 @@ typedef struct ULONG *PinInstanceCount; PKSPIN * FirstPin; - PKSPROCESSPIN_INDEXENTRY ProcessPinIndex; + KSPROCESSPIN_INDEXENTRY ProcessPinIndex; }IKsFilterImpl; @@ -40,17 +43,9 @@ const GUID IID_IKsFilter = {0x3ef6ee44L, 0x0D41, 0x11d2, {0xbe, 0xDA, 0x00, 0xc const GUID KSPROPSETID_Topology = {0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; const GUID KSPROPSETID_Pin = {0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}}; -VOID -IKsFilter_RemoveFilterFromFilterFactory( - IKsFilterImpl * This, - PKSFILTERFACTORY FilterFactory); - -NTSTATUS NTAPI FilterTopologyPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI FilterPinPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); - -DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, FilterTopologyPropertyHandler); -DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, FilterPinPropertyHandler, FilterPinPropertyHandler, FilterPinPropertyHandler); +DEFINE_KSPROPERTY_TOPOLOGYSET(IKsFilterTopologySet, KspTopologyPropertyHandler); +DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(IKsFilterPinSet, KspPinPropertyHandler, KspPinPropertyHandler, KspPinPropertyHandler); KSPROPERTY_SET FilterPropertySet[] = { @@ -81,7 +76,7 @@ IKsControl_fnQueryInterface( if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->Header.OuterUnknown; + *Output = &This->lpVtbl; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } @@ -184,13 +179,12 @@ IKsFilter_fnQueryInterface( IN REFIID refiid, OUT PVOID* Output) { - NTSTATUS Status; - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); if (IsEqualGUIDAligned(refiid, &IID_IUnknown) || IsEqualGUIDAligned(refiid, &IID_IKsFilter)) { - *Output = &This->Header.OuterUnknown; + *Output = &This->lpVtbl; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } @@ -201,20 +195,7 @@ IKsFilter_fnQueryInterface( return STATUS_SUCCESS; } - if (This->Header.ClientAggregate) - { - /* using client aggregate */ - Status = This->Header.ClientAggregate->lpVtbl->QueryInterface(This->Header.ClientAggregate, refiid, Output); - - if (NT_SUCCESS(Status)) - { - /* client aggregate supports interface */ - return Status; - } - } - - DPRINT("IKsFilter_fnQueryInterface no interface\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_UNSUCCESSFUL; } ULONG @@ -222,7 +203,7 @@ NTAPI IKsFilter_fnAddRef( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); return InterlockedIncrement(&This->ref); } @@ -232,7 +213,7 @@ NTAPI IKsFilter_fnRelease( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); InterlockedDecrement(&This->ref); @@ -251,7 +232,7 @@ NTAPI IKsFilter_fnGetStruct( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); return &This->Filter; } @@ -308,25 +289,23 @@ IKsFilter_fnAddProcessPin( IN PKSPROCESSPIN ProcessPin) { NTSTATUS Status; - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); /* first acquire processing mutex */ KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); - /* sanity check */ - ASSERT(This->Filter.Descriptor->PinDescriptorsCount > ProcessPin->Pin->Id); - - /* allocate new process pin array */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex[ProcessPin->Pin->Id].Pins, - (This->Filter.Descriptor->PinDescriptorsCount + 1) * sizeof(PKSPROCESSPIN), - This->Filter.Descriptor->PinDescriptorsCount * sizeof(PKSPROCESSPIN), + /* edit process pin descriptor */ + Status = _KsEdit(This->Filter.Bag, + (PVOID*)&This->ProcessPinIndex.Pins, + (This->ProcessPinIndex.Count + 1) * sizeof(PKSPROCESSPIN), + (This->ProcessPinIndex.Count) * sizeof(PKSPROCESSPIN), 0); if (NT_SUCCESS(Status)) { - /* store process pin */ - This->ProcessPinIndex[ProcessPin->Pin->Id].Pins[This->ProcessPinIndex[ProcessPin->Pin->Id].Count] = ProcessPin; - This->ProcessPinIndex[ProcessPin->Pin->Id].Count++; + /* add new process pin */ + This->ProcessPinIndex.Pins[This->ProcessPinIndex.Count] = ProcessPin; + This->ProcessPinIndex.Count++; } /* release process mutex */ @@ -342,39 +321,25 @@ IKsFilter_fnRemoveProcessPin( IN PKSPROCESSPIN ProcessPin) { ULONG Index; - ULONG Count; - PKSPROCESSPIN * Pins; - - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); + IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, lpVtbl); /* first acquire processing mutex */ KeWaitForSingleObject(&This->ProcessingMutex, Executive, KernelMode, FALSE, NULL); - /* sanity check */ - ASSERT(ProcessPin->Pin); - ASSERT(ProcessPin->Pin->Id); - - Count = This->ProcessPinIndex[ProcessPin->Pin->Id].Count; - Pins = This->ProcessPinIndex[ProcessPin->Pin->Id].Pins; - - /* search for current process pin */ - for(Index = 0; Index < Count; Index++) + /* iterate through process pin index array and search for the process pin to be removed */ + for(Index = 0; Index < This->ProcessPinIndex.Count; Index++) { - if (Pins[Index] == ProcessPin) + if (This->ProcessPinIndex.Pins[Index] == ProcessPin) { - RtlMoveMemory(&Pins[Index], &Pins[Index + 1], (Count - (Index + 1)) * sizeof(PKSPROCESSPIN)); - break; + /* found process pin */ + if (Index + 1 < This->ProcessPinIndex.Count) + { + /* erase entry */ + RtlMoveMemory(&This->ProcessPinIndex.Pins[Index], &This->ProcessPinIndex.Pins[Index+1], This->ProcessPinIndex.Count - Index - 1); + } + /* decrement process pin count */ + This->ProcessPinIndex.Count--; } - - } - - /* decrement pin count */ - This->ProcessPinIndex[ProcessPin->Pin->Id].Count--; - - if (!This->ProcessPinIndex[ProcessPin->Pin->Id].Count) - { - /* clear entry object bag will delete it */ - This->ProcessPinIndex[ProcessPin->Pin->Id].Pins = NULL; } /* release process mutex */ @@ -429,9 +394,8 @@ NTAPI IKsFilter_fnGetProcessDispatch( IKsFilter * iface) { - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(iface, IKsFilterImpl, Header.OuterUnknown); - - return This->ProcessPinIndex; + UNIMPLEMENTED + return NULL; } static IKsFilterVtbl vt_IKsFilter = @@ -508,13 +472,13 @@ IKsFilter_DispatchClose( return Status; /* get our real implementation */ - This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Header.OuterUnknown); + This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, lpVtbl); /* does the driver support notifications */ - if (This->Filter.Descriptor && This->Filter.Descriptor->Dispatch && This->Filter.Descriptor->Dispatch->Close) + if (This->Factory->FilterDescriptor && This->Factory->FilterDescriptor->Dispatch && This->Factory->FilterDescriptor->Dispatch->Close) { /* call driver's filter close function */ - Status = This->Filter.Descriptor->Dispatch->Close(&This->Filter, Irp); + Status = This->Factory->FilterDescriptor->Dispatch->Close(&This->Filter, Irp); } if (NT_SUCCESS(Status) && Status != STATUS_PENDING) @@ -524,8 +488,8 @@ IKsFilter_DispatchClose( /* complete irp */ IoCompleteRequest(Irp, IO_NO_INCREMENT); - /* remove our instance from the filter factory */ - IKsFilter_RemoveFilterFromFilterFactory(This, This->Factory); + /* FIXME remove our instance from the filter factory */ + ASSERT(0); /* free object header */ KsFreeObjectHeader(This->ObjectHeader); @@ -553,7 +517,7 @@ KspHandlePropertyInstances( KSPIN_CINSTANCES * Instances; KSP_PIN * Pin = (KSP_PIN*)Request; - if (!This->Filter.Descriptor || !This->Filter.Descriptor->PinDescriptorsCount) + if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) { /* no filter / pin descriptor */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -561,12 +525,12 @@ KspHandlePropertyInstances( } /* ignore custom structs for now */ - ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); + ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->PinDescriptorCount > Pin->PinId); Instances = (KSPIN_CINSTANCES*)Data; /* max instance count */ - Instances->PossibleCount = This->Filter.Descriptor->PinDescriptors[Pin->PinId].InstancesPossible; + Instances->PossibleCount = This->PinDescriptorsEx[Pin->PinId].InstancesPossible; /* current instance count */ Instances->CurrentCount = This->PinInstanceCount[Pin->PinId]; @@ -585,7 +549,7 @@ KspHandleNecessaryPropertyInstances( PULONG Result; KSP_PIN * Pin = (KSP_PIN*)Request; - if (!This->Filter.Descriptor || !This->Filter.Descriptor->PinDescriptorsCount) + if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) { /* no filter / pin descriptor */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -593,11 +557,11 @@ KspHandleNecessaryPropertyInstances( } /* ignore custom structs for now */ - ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); + ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->PinDescriptorCount > Pin->PinId); Result = (PULONG)Data; - *Result = This->Filter.Descriptor->PinDescriptors[Pin->PinId].InstancesNecessary; + *Result = This->PinDescriptorsEx[Pin->PinId].InstancesNecessary; IoStatus->Information = sizeof(ULONG); IoStatus->Status = STATUS_SUCCESS; @@ -617,23 +581,13 @@ KspHandleDataIntersection( PKSDATARANGE DataRange; NTSTATUS Status = STATUS_NO_MATCH; ULONG Index, Length; - PIO_STACK_LOCATION IoStack; KSP_PIN * Pin = (KSP_PIN*)Request; - /* get stack location */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - /* sanity check */ - ASSERT(DataLength == IoStack->Parameters.DeviceIoControl.OutputBufferLength); - /* Access parameters */ MultipleItem = (PKSMULTIPLE_ITEM)(Pin + 1); DataRange = (PKSDATARANGE)(MultipleItem + 1); - /* FIXME make sure its 64 bit aligned */ - ASSERT(((ULONG_PTR)DataRange & 0x7) == 0); - - if (!This->Filter.Descriptor || !This->Filter.Descriptor->PinDescriptorsCount) + if (!This->Factory->FilterDescriptor || !This->PinDescriptorCount) { /* no filter / pin descriptor */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -641,12 +595,12 @@ KspHandleDataIntersection( } /* ignore custom structs for now */ - ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - ASSERT(This->Filter.Descriptor->PinDescriptorsCount > Pin->PinId); + ASSERT(This->Factory->FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); + ASSERT(This->PinDescriptorCount > Pin->PinId); - if (This->Filter.Descriptor->PinDescriptors[Pin->PinId].IntersectHandler == NULL || - This->Filter.Descriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges == NULL || - This->Filter.Descriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRangesCount == 0) + if (This->PinDescriptorsEx[Pin->PinId].IntersectHandler == NULL || + This->PinDescriptors[Pin->PinId].DataRanges == NULL || + This->PinDescriptors[Pin->PinId].DataRangesCount == 0) { /* no driver supported intersect handler / no provided data ranges */ IoStatus->Status = STATUS_NOT_IMPLEMENTED; @@ -655,65 +609,31 @@ KspHandleDataIntersection( for(Index = 0; Index < MultipleItem->Count; Index++) { - UNICODE_STRING MajorFormat, SubFormat, Specifier; - /* convert the guid to string */ - RtlStringFromGUID(&DataRange->MajorFormat, &MajorFormat); - RtlStringFromGUID(&DataRange->SubFormat, &SubFormat); - RtlStringFromGUID(&DataRange->Specifier, &Specifier); - - DPRINT("KspHandleDataIntersection Index %lu PinId %lu MajorFormat %S SubFormat %S Specifier %S FormatSize %lu SampleSize %lu Align %lu Flags %lx Reserved %lx DataLength %lu\n", Index, Pin->PinId, MajorFormat.Buffer, SubFormat.Buffer, Specifier.Buffer, - DataRange->FormatSize, DataRange->SampleSize, DataRange->Alignment, DataRange->Flags, DataRange->Reserved, DataLength); - - /* FIXME implement KsPinDataIntersectionEx */ /* Call miniport's properitary handler */ - Status = This->Filter.Descriptor->PinDescriptors[Pin->PinId].IntersectHandler(&This->Filter, - Irp, - Pin, - DataRange, - This->Filter.Descriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges[0], /* HACK */ - DataLength, - Data, - &Length); - DPRINT("KspHandleDataIntersection Status %lx\n", Status); - - if (Status == STATUS_SUCCESS || Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) + Status = This->PinDescriptorsEx[Pin->PinId].IntersectHandler(NULL, /* context */ + Irp, + Pin, + DataRange, + (PKSDATAFORMAT)This->Factory->FilterDescriptor->PinDescriptors[Pin->PinId].PinDescriptor.DataRanges, + DataLength, + Data, + &Length); + + if (Status == STATUS_SUCCESS) { - ASSERT(Length); IoStatus->Information = Length; break; } - DataRange = UlongToPtr(PtrToUlong(DataRange) + DataRange->FormatSize); - /* FIXME make sure its 64 bit aligned */ - ASSERT(((ULONG_PTR)DataRange & 0x7) == 0); } + IoStatus->Status = Status; return Status; } NTSTATUS NTAPI -FilterTopologyPropertyHandler( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - IKsFilterImpl * This; - - /* get filter implementation */ - This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp); - - /* sanity check */ - ASSERT(This); - - return KsTopologyPropertyHandler(Irp, Request, Data, &This->Topology); - -} - - -NTSTATUS -NTAPI -FilterPinPropertyHandler( +KspPinPropertyHandler( IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data) @@ -725,9 +645,6 @@ FilterPinPropertyHandler( /* get filter implementation */ This = (IKsFilterImpl*)KSPROPERTY_ITEM_IRP_STORAGE(Irp); - /* sanity check */ - ASSERT(This); - /* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -741,8 +658,8 @@ FilterPinPropertyHandler( case KSPROPERTY_PIN_COMMUNICATION: case KSPROPERTY_PIN_CATEGORY: case KSPROPERTY_PIN_NAME: - case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: - Status = KspPinPropertyHandler(Irp, Request, Data, This->Filter.Descriptor->PinDescriptorsCount, (const KSPIN_DESCRIPTOR*)This->Filter.Descriptor->PinDescriptors, This->Filter.Descriptor->PinDescriptorSize); + case KSPROPERTY_PIN_PROPOSEDATAFORMAT: + Status = KsPinPropertyHandler(Irp, Request, Data, This->PinDescriptorCount, This->PinDescriptors); break; case KSPROPERTY_PIN_GLOBALCINSTANCES: Status = KspHandlePropertyInstances(&Irp->IoStatus, Request, Data, This, TRUE); @@ -757,11 +674,16 @@ FilterPinPropertyHandler( case KSPROPERTY_PIN_DATAINTERSECTION: Status = KspHandleDataIntersection(Irp, &Irp->IoStatus, Request, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength, This); break; + case KSPROPERTY_PIN_PHYSICALCONNECTION: + case KSPROPERTY_PIN_CONSTRAINEDDATARANGES: + UNIMPLEMENTED + Status = STATUS_NOT_IMPLEMENTED; + break; default: UNIMPLEMENTED - Status = STATUS_NOT_FOUND; + Status = STATUS_UNSUCCESSFUL; } - //DPRINT("KspPinPropertyHandler Pins %lu Request->Id %lu Status %lx\n", This->PinDescriptorCount, Request->Id, Status); + DPRINT("KspPinPropertyHandler Pins %lu Request->Id %lu Status %lx\n", This->PinDescriptorCount, Request->Id, Status); return Status; @@ -778,9 +700,6 @@ IKsFilter_DispatchDeviceIoControl( IKsFilterImpl * This; NTSTATUS Status; PKSFILTER FilterInstance; - UNICODE_STRING GuidString; - PKSPROPERTY Property; - ULONG SetCount = 0; /* obtain filter from object header */ Status = IKsFilter_GetFilterFromIrp(Irp, &Filter); @@ -788,96 +707,45 @@ IKsFilter_DispatchDeviceIoControl( return Status; /* get our real implementation */ - This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Header.OuterUnknown); + This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, lpVtbl); /* current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* get property from input buffer */ - Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - - /* get filter instance */ - FilterInstance = Filter->lpVtbl->GetStruct(Filter); - - /* sanity check */ - ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); - ASSERT(FilterInstance); - ASSERT(FilterInstance->Descriptor); - ASSERT(FilterInstance->Descriptor->AutomationTable); - - /* acquire control mutex */ - KeWaitForSingleObject(This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); - - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_METHOD) + if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_PROPERTY) { - const KSMETHOD_SET *MethodSet = NULL; - ULONG MethodItemSize = 0; + UNIMPLEMENTED; - /* check if the driver supports method sets */ - if (FilterInstance->Descriptor->AutomationTable->MethodSetsCount) - { - SetCount = FilterInstance->Descriptor->AutomationTable->MethodSetsCount; - MethodSet = FilterInstance->Descriptor->AutomationTable->MethodSets; - MethodItemSize = FilterInstance->Descriptor->AutomationTable->MethodItemSize; - } + /* release filter interface */ + Filter->lpVtbl->Release(Filter); - /* call method set handler */ - Status = KspMethodHandlerWithAllocator(Irp, SetCount, MethodSet, NULL, MethodItemSize); + /* complete and forget irp */ + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NOT_IMPLEMENTED; } - else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) - { - const KSPROPERTY_SET *PropertySet = NULL; - ULONG PropertyItemSize = 0; - - /* check if the driver supports method sets */ - if (FilterInstance->Descriptor->AutomationTable->PropertySetsCount) - { - SetCount = FilterInstance->Descriptor->AutomationTable->PropertySetsCount; - PropertySet = FilterInstance->Descriptor->AutomationTable->PropertySets; - PropertyItemSize = FilterInstance->Descriptor->AutomationTable->PropertyItemSize; - } - /* needed for our property handlers */ - KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This; + /* call property handler supported by ks */ + KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This; + Status = KspPropertyHandler(Irp, 2, FilterPropertySet, NULL, sizeof(KSPROPERTY_ITEM)); - /* call property handler */ - Status = KspPropertyHandler(Irp, SetCount, PropertySet, NULL, PropertyItemSize); - } - else + if (Status == STATUS_NOT_FOUND) { - /* sanity check */ - ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT || - IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT); + /* get filter instance */ + FilterInstance = Filter->lpVtbl->GetStruct(Filter); - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT) - { - /* call enable event handlers */ - Status = KspEnableEvent(Irp, - FilterInstance->Descriptor->AutomationTable->EventSetsCount, - (PKSEVENT_SET)FilterInstance->Descriptor->AutomationTable->EventSets, - &This->Header.EventList, - KSEVENTS_SPINLOCK, - (PVOID)&This->Header.EventListLock, - NULL, - FilterInstance->Descriptor->AutomationTable->EventItemSize); - } - else + /* check if the driver supports property sets */ + if (FilterInstance->Descriptor->AutomationTable && FilterInstance->Descriptor->AutomationTable->PropertySetsCount) { - /* disable event handler */ - Status = KsDisableEvent(Irp, &This->Header.EventList, KSEVENTS_SPINLOCK, &This->Header.EventListLock); + /* call driver's filter property handler */ + Status = KspPropertyHandler(Irp, + FilterInstance->Descriptor->AutomationTable->PropertySetsCount, + FilterInstance->Descriptor->AutomationTable->PropertySets, + NULL, + FilterInstance->Descriptor->AutomationTable->PropertyItemSize); } } - RtlStringFromGUID(&Property->Set, &GuidString); - DPRINT("IKsFilter_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); - RtlFreeUnicodeString(&GuidString); - - /* release filter */ - Filter->lpVtbl->Release(Filter); - - /* release control mutex */ - KeReleaseMutex(This->Header.ControlMutex, FALSE); - if (Status != STATUS_PENDING) { Irp->IoStatus.Status = Status; @@ -914,7 +782,9 @@ IKsFilter_CreateDescriptors( /* initialize pin descriptors */ This->FirstPin = NULL; This->PinInstanceCount = NULL; - This->ProcessPinIndex = NULL; + This->PinDescriptors = NULL; + This->PinDescriptorsEx = NULL; + This->PinDescriptorCount = 0; /* initialize topology descriptor */ This->Topology.CategoriesCount = FilterDescriptor->CategoriesCount; @@ -933,8 +803,18 @@ IKsFilter_CreateDescriptors( ASSERT(FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); /* store pin descriptors ex */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->Filter.Descriptor->PinDescriptors, FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount, - FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount, 0); + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptorsEx, sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount, + sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount, 0); + + if (!NT_SUCCESS(Status)) + { + DPRINT("IKsFilter_CreateDescriptors _KsEdit failed %lx\n", Status); + return Status; + } + + /* store pin descriptors */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptors, sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount, + sizeof(KSPIN_DESCRIPTOR) * FilterDescriptor->PinDescriptorsCount, 0); if (!NT_SUCCESS(Status)) { @@ -942,7 +822,7 @@ IKsFilter_CreateDescriptors( return Status; } - /* store pin instance count */ + /* store pin instance count ex */ Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinInstanceCount, sizeof(ULONG) * FilterDescriptor->PinDescriptorsCount, sizeof(ULONG) * FilterDescriptor->PinDescriptorsCount, 0); @@ -962,33 +842,18 @@ IKsFilter_CreateDescriptors( return Status; } - /* add new pin factory */ - RtlMoveMemory((PVOID)This->Filter.Descriptor->PinDescriptors, FilterDescriptor->PinDescriptors, FilterDescriptor->PinDescriptorSize * FilterDescriptor->PinDescriptorsCount); - /* allocate process pin index */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex, sizeof(KSPROCESSPIN_INDEXENTRY) * FilterDescriptor->PinDescriptorsCount, - sizeof(KSPROCESSPIN_INDEXENTRY) * FilterDescriptor->PinDescriptorsCount, 0); - if (!NT_SUCCESS(Status)) + /* add new pin factory */ + RtlMoveMemory(This->PinDescriptorsEx, FilterDescriptor->PinDescriptors, sizeof(KSPIN_DESCRIPTOR_EX) * FilterDescriptor->PinDescriptorsCount); + + for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++) { - DPRINT("IKsFilter_CreateDescriptors _KsEdit failed %lx\n", Status); - return Status; + RtlMoveMemory(&This->PinDescriptors[Index], &FilterDescriptor->PinDescriptors[Index].PinDescriptor, sizeof(KSPIN_DESCRIPTOR)); } - } - - - if (FilterDescriptor->ConnectionsCount) - { - /* modify connections array */ - Status = _KsEdit(This->Filter.Bag, - (PVOID*)&This->Filter.Descriptor->Connections, - FilterDescriptor->ConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION), - FilterDescriptor->ConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION), - 0); - - This->Topology.TopologyConnections = This->Filter.Descriptor->Connections; - This->Topology.TopologyConnectionsCount = ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->ConnectionsCount = FilterDescriptor->ConnectionsCount; + /* store new pin descriptor count */ + This->PinDescriptorCount = FilterDescriptor->PinDescriptorsCount; } if (FilterDescriptor->NodeDescriptorsCount) @@ -1040,7 +905,6 @@ IKsFilter_CopyFilterDescriptor( const KSFILTER_DESCRIPTOR* FilterDescriptor) { NTSTATUS Status; - KSAUTOMATION_TABLE AutomationTable; This->Filter.Descriptor = AllocateItem(NonPagedPool, sizeof(KSFILTER_DESCRIPTOR)); if (!This->Filter.Descriptor) @@ -1057,39 +921,27 @@ IKsFilter_CopyFilterDescriptor( /* copy filter descriptor fields */ RtlMoveMemory((PVOID)This->Filter.Descriptor, FilterDescriptor, sizeof(KSFILTER_DESCRIPTOR)); - /* zero automation table */ - RtlZeroMemory(&AutomationTable, sizeof(KSAUTOMATION_TABLE)); - - /* setup filter property sets */ - AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM); - AutomationTable.PropertySetsCount = 2; - AutomationTable.PropertySets = FilterPropertySet; - - /* merge filter automation table */ - Status = KsMergeAutomationTables((PKSAUTOMATION_TABLE*)&This->Filter.Descriptor->AutomationTable, (PKSAUTOMATION_TABLE)FilterDescriptor->AutomationTable, &AutomationTable, This->Filter.Bag); - return Status; } -VOID +NTSTATUS IKsFilter_AddPin( - PKSFILTER Filter, + IKsFilter * Filter, PKSPIN Pin) { PKSPIN NextPin, CurPin; PKSBASIC_HEADER BasicHeader; - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); + IKsFilterImpl * This = (IKsFilterImpl*)Filter; /* sanity check */ - ASSERT(Pin->Id < This->Filter.Descriptor->PinDescriptorsCount); + ASSERT(Pin->Id < This->PinDescriptorCount); if (This->FirstPin[Pin->Id] == NULL) { /* welcome first pin */ This->FirstPin[Pin->Id] = Pin; - This->PinInstanceCount[Pin->Id]++; - return; + return STATUS_SUCCESS; } /* get first pin */ @@ -1111,58 +963,8 @@ IKsFilter_AddPin( /* store pin */ BasicHeader->Next.Pin = Pin; -} - -VOID -IKsFilter_RemovePin( - PKSFILTER Filter, - PKSPIN Pin) -{ - PKSPIN NextPin, CurPin, LastPin; - PKSBASIC_HEADER BasicHeader; - IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); - - /* sanity check */ - ASSERT(Pin->Id < This->Filter.Descriptor->PinDescriptorsCount); - - /* get first pin */ - CurPin = This->FirstPin[Pin->Id]; - - LastPin = NULL; - do - { - /* get next instantiated pin */ - NextPin = KsPinGetNextSiblingPin(CurPin); - - if (CurPin == Pin) - { - if (LastPin) - { - /* get basic header of last pin */ - BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)LastPin - sizeof(KSBASIC_HEADER)); - BasicHeader->Next.Pin = NextPin; - } - else - { - /* erase last pin */ - This->FirstPin[Pin->Id] = NextPin; - } - /* decrement pin instance count */ - This->PinInstanceCount[Pin->Id]--; - return; - } - - if (!NextPin) - break; - - LastPin = CurPin; - NextPin = CurPin; - - }while(NextPin != NULL); - - /* pin not found */ - ASSERT(0); + return STATUS_SUCCESS; } @@ -1189,39 +991,45 @@ IKsFilter_DispatchCreatePin( ASSERT(This->Header.Type == KsObjectTypeFilter); /* acquire control mutex */ - KeWaitForSingleObject(This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); + KeWaitForSingleObject(&This->Header.ControlMutex, Executive, KernelMode, FALSE, NULL); /* now validate the connect request */ - Status = KspValidateConnectRequest(Irp, This->Filter.Descriptor->PinDescriptorsCount, (PVOID)This->Filter.Descriptor->PinDescriptors, This->Filter.Descriptor->PinDescriptorSize, &Connect); + Status = KsValidateConnectRequest(Irp, This->PinDescriptorCount, This->PinDescriptors, &Connect); DPRINT("IKsFilter_DispatchCreatePin KsValidateConnectRequest %lx\n", Status); if (NT_SUCCESS(Status)) { /* sanity check */ - ASSERT(Connect->PinId < This->Filter.Descriptor->PinDescriptorsCount); + ASSERT(Connect->PinId < This->PinDescriptorCount); DPRINT("IKsFilter_DispatchCreatePin KsValidateConnectRequest PinId %lu CurrentInstanceCount %lu MaxPossible %lu\n", Connect->PinId, This->PinInstanceCount[Connect->PinId], - This->Filter.Descriptor->PinDescriptors[Connect->PinId].InstancesPossible); + This->PinDescriptorsEx[Connect->PinId].InstancesPossible); - if (This->PinInstanceCount[Connect->PinId] < This->Filter.Descriptor->PinDescriptors[Connect->PinId].InstancesPossible) + if (This->PinInstanceCount[Connect->PinId] < This->PinDescriptorsEx[Connect->PinId].InstancesPossible) { /* create the pin */ - Status = KspCreatePin(DeviceObject, Irp, This->Header.KsDevice, This->FilterFactory, (IKsFilter*)&This->Header.OuterUnknown, Connect, (KSPIN_DESCRIPTOR_EX*)&This->Filter.Descriptor->PinDescriptors[Connect->PinId]); + Status = KspCreatePin(DeviceObject, Irp, This->Header.KsDevice, This->FilterFactory, (IKsFilter*)&This->lpVtbl, Connect, &This->PinDescriptorsEx[Connect->PinId]); DPRINT("IKsFilter_DispatchCreatePin KspCreatePin %lx\n", Status); + + if (NT_SUCCESS(Status)) + { + /* successfully created pin, increment pin instance count */ + This->PinInstanceCount[Connect->PinId]++; + } } else { /* maximum instance count reached, bye-bye */ Status = STATUS_UNSUCCESSFUL; - DPRINT("IKsFilter_DispatchCreatePin MaxInstance %lu CurInstance %lu %lx\n", This->Filter.Descriptor->PinDescriptors[Connect->PinId].InstancesPossible, This->PinInstanceCount[Connect->PinId]); + DPRINT("IKsFilter_DispatchCreatePin MaxInstance %lu CurInstance %lu %lx\n", This->PinDescriptorsEx[Connect->PinId].InstancesPossible, This->PinInstanceCount[Connect->PinId]); } } /* release control mutex */ - KeReleaseMutex(This->Header.ControlMutex, FALSE); + KeReleaseMutex(&This->Header.ControlMutex, FALSE); if (Status != STATUS_PENDING) { @@ -1290,72 +1098,12 @@ IKsFilter_AttachFilterToFilterFactory( /* found last entry */ break; } - }while(TRUE); + }while(FilterFactory); /* attach filter factory */ BasicHeader->Next.Filter = &This->Filter; } -VOID -IKsFilter_RemoveFilterFromFilterFactory( - IKsFilterImpl * This, - PKSFILTERFACTORY FilterFactory) -{ - PKSBASIC_HEADER BasicHeader; - PKSFILTER Filter, LastFilter; - - /* get filter factory basic header */ - BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)FilterFactory - sizeof(KSBASIC_HEADER)); - - /* sanity check */ - ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory); - ASSERT(BasicHeader->FirstChild.Filter != NULL); - - - /* set to first entry */ - Filter = BasicHeader->FirstChild.Filter; - LastFilter = NULL; - - do - { - if (Filter == &This->Filter) - { - if (LastFilter) - { - /* get basic header */ - BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)LastFilter - sizeof(KSBASIC_HEADER)); - /* remove filter instance */ - BasicHeader->Next.Filter = This->Header.Next.Filter; - break; - } - else - { - /* remove filter instance */ - BasicHeader->FirstChild.Filter = This->Header.Next.Filter; - break; - } - } - - /* get basic header */ - BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Filter - sizeof(KSBASIC_HEADER)); - /* sanity check */ - ASSERT(BasicHeader->Type == KsObjectTypeFilter); - - LastFilter = Filter; - if (BasicHeader->Next.Filter) - { - /* iterate to next filter factory */ - Filter = BasicHeader->Next.Filter; - } - else - { - /* filter is not in list */ - ASSERT(0); - break; - } - }while(TRUE); -} - NTSTATUS NTAPI KspCreateFilter( @@ -1400,7 +1148,7 @@ KspCreateFilter( DPRINT("KspCreateFilter OutOfMemory\n"); return STATUS_INSUFFICIENT_RESOURCES; } - KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; + KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice; KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->Filter.Bag, NULL); /* copy filter descriptor */ @@ -1428,8 +1176,6 @@ KspCreateFilter( return STATUS_INSUFFICIENT_RESOURCES; } - DPRINT("KspCreateFilter Flags %lx\n", Factory->FilterDescriptor->Flags); - /* initialize pin create item */ CreateItem[0].Create = IKsFilter_DispatchCreatePin; CreateItem[0].Context = (PVOID)This; @@ -1444,9 +1190,10 @@ KspCreateFilter( /* initialize filter instance */ This->ref = 1; - This->Header.OuterUnknown = (PUNKNOWN)&vt_IKsFilter; + This->lpVtbl = &vt_IKsFilter; This->lpVtblKsControl = &vt_IKsControl; + This->Filter.Descriptor = Factory->FilterDescriptor; This->Factory = Factory; This->FilterFactory = iface; This->FileObject = IoStack->FileObject; @@ -1455,8 +1202,7 @@ KspCreateFilter( This->Header.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->Header.Parent.KsFilterFactory = iface->lpVtbl->GetStruct(iface); This->Header.Type = KsObjectTypeFilter; - This->Header.ControlMutex = &This->ControlMutex; - KeInitializeMutex(This->Header.ControlMutex, 0); + KeInitializeMutex(&This->Header.ControlMutex, 0); InitializeListHead(&This->Header.EventList); KeInitializeSpinLock(&This->Header.EventListLock); @@ -1478,9 +1224,8 @@ KspCreateFilter( if (Factory->FilterDescriptor->Dispatch->Create) { /* now let driver initialize the filter instance */ - + DPRINT("Before instantiating filter Filter %p This %p KSBASIC_HEADER %u\n", &This->Filter, This, sizeof(KSBASIC_HEADER)); ASSERT(This->Header.KsDevice); - ASSERT(This->Header.KsDevice->Started); Status = Factory->FilterDescriptor->Dispatch->Create(&This->Filter, Irp); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) @@ -1508,14 +1253,14 @@ KspCreateFilter( /* initialize object header extra fields */ This->ObjectHeader->Type = KsObjectTypeFilter; - This->ObjectHeader->Unknown = (PUNKNOWN)&This->Header.OuterUnknown; + This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl; This->ObjectHeader->ObjectType = (PVOID)&This->Filter; /* attach filter to filter factory */ IKsFilter_AttachFilterToFilterFactory(This, This->Header.Parent.KsFilterFactory); /* completed initialization */ - DPRINT("KspCreateFilter done %lx KsDevice %p\n", Status, This->Header.KsDevice); + DPRINT("KspCreateFilter done %lx\n", Status); return Status; } @@ -1547,7 +1292,6 @@ KsFilterReleaseProcessingMutex( KeReleaseMutex(&This->ProcessingMutex, FALSE); } - /* @implemented */ @@ -1560,42 +1304,40 @@ KsFilterAddTopologyConnections ( IN const KSTOPOLOGY_CONNECTION *const NewTopologyConnections) { ULONG Count; - NTSTATUS Status; + KSTOPOLOGY_CONNECTION * Connections; IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); - DPRINT("KsFilterAddTopologyConnections\n"); - - ASSERT(This->Filter.Descriptor); Count = This->Filter.Descriptor->ConnectionsCount + NewConnectionsCount; + /* allocate array */ + Connections = AllocateItem(NonPagedPool, Count * sizeof(KSTOPOLOGY_CONNECTION)); + if (!Connections) + return STATUS_INSUFFICIENT_RESOURCES; - /* modify connections array */ - Status = _KsEdit(This->Filter.Bag, - (PVOID*)&This->Filter.Descriptor->Connections, - Count * sizeof(KSTOPOLOGY_CONNECTION), - This->Filter.Descriptor->ConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION), - 0); + /* FIXME verify connections */ - if (!NT_SUCCESS(Status)) + if (This->Filter.Descriptor->ConnectionsCount) { - /* failed */ - DPRINT("KsFilterAddTopologyConnections KsEdit failed with %lx\n", Status); - return Status; + /* copy old connections */ + RtlMoveMemory(Connections, This->Filter.Descriptor->Connections, sizeof(KSTOPOLOGY_CONNECTION) * This->Filter.Descriptor->ConnectionsCount); } - /* FIXME verify connections */ + /* add new connections */ + RtlMoveMemory((PVOID)(Connections + This->Filter.Descriptor->ConnectionsCount), NewTopologyConnections, NewConnectionsCount); + + /* add the new connections */ + RtlMoveMemory((PVOID)&This->Filter.Descriptor->ConnectionsCount, &Count, sizeof(ULONG)); /* brain-dead gcc hack */ - /* copy new connections */ - RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections[This->Filter.Descriptor->ConnectionsCount], - NewTopologyConnections, - NewConnectionsCount * sizeof(KSTOPOLOGY_CONNECTION)); + /* free old connections array */ + if (This->Filter.Descriptor->ConnectionsCount) + { + FreeItem((PVOID)This->Filter.Descriptor->Connections); + } - /* update topology */ - This->Topology.TopologyConnectionsCount += NewConnectionsCount; - ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->ConnectionsCount += NewConnectionsCount; - This->Topology.TopologyConnections = This->Filter.Descriptor->Connections; + /* brain-dead gcc hack */ + RtlMoveMemory((PVOID)&This->Filter.Descriptor->Connections, Connections, sizeof(KSTOPOLOGY_CONNECTION*)); - return Status; + return STATUS_SUCCESS; } /* @@ -1644,13 +1386,13 @@ KsFilterCreatePinFactory ( DPRINT("KsFilterCreatePinFactory\n"); /* calculate new count */ - Count = This->Filter.Descriptor->PinDescriptorsCount + 1; + Count = This->PinDescriptorCount + 1; /* sanity check */ ASSERT(This->Filter.Descriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - /* modify pin descriptors ex array */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->Filter.Descriptor->PinDescriptors, Count * This->Filter.Descriptor->PinDescriptorSize, This->Filter.Descriptor->PinDescriptorsCount * This->Filter.Descriptor->PinDescriptorSize, 0); + /* allocate pin descriptors ex array */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptorsEx, Count * sizeof(KSPIN_DESCRIPTOR_EX), This->PinDescriptorCount * sizeof(KSPIN_DESCRIPTOR_EX), 0); if (!NT_SUCCESS(Status)) { /* failed */ @@ -1658,8 +1400,8 @@ KsFilterCreatePinFactory ( return Status; } - /* modify pin instance count array */ - Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->PinInstanceCount, sizeof(ULONG) * Count, sizeof(ULONG) * This->Filter.Descriptor->PinDescriptorsCount, 0); + /* allocate pin descriptors array */ + Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->PinDescriptors, Count * sizeof(KSPIN_DESCRIPTOR), This->PinDescriptorCount * sizeof(KSPIN_DESCRIPTOR), 0); if (!NT_SUCCESS(Status)) { /* failed */ @@ -1667,8 +1409,9 @@ KsFilterCreatePinFactory ( return Status; } - /* modify first pin array */ - Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->FirstPin, sizeof(PKSPIN) * Count, sizeof(PKSPIN) * This->Filter.Descriptor->PinDescriptorsCount, 0); + + /* allocate pin instance count array */ + Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->PinInstanceCount, sizeof(ULONG) * Count, sizeof(ULONG) * This->PinDescriptorCount, 0); if (!NT_SUCCESS(Status)) { /* failed */ @@ -1676,24 +1419,24 @@ KsFilterCreatePinFactory ( return Status; } - /* add new pin factory */ - RtlMoveMemory((PVOID)&This->Filter.Descriptor->PinDescriptors[This->Filter.Descriptor->PinDescriptorsCount], InPinDescriptor, sizeof(KSPIN_DESCRIPTOR_EX)); - - /* allocate process pin index */ - Status = _KsEdit(This->Filter.Bag, (PVOID*)&This->ProcessPinIndex, sizeof(KSPROCESSPIN_INDEXENTRY) * Count, - sizeof(KSPROCESSPIN_INDEXENTRY) * This->Filter.Descriptor->PinDescriptorsCount, 0); - + /* allocate first pin array */ + Status = _KsEdit(This->Filter.Bag,(PVOID*)&This->FirstPin, sizeof(PKSPIN) * Count, sizeof(PKSPIN) * This->PinDescriptorCount, 0); if (!NT_SUCCESS(Status)) { - DPRINT("KsFilterCreatePinFactory _KsEdit failed %lx\n", Status); + /* failed */ + DPRINT("KsFilterCreatePinFactory _KsEdit failed with %lx\n", Status); return Status; } + /* add new pin factory */ + RtlMoveMemory(&This->PinDescriptorsEx[This->PinDescriptorCount], InPinDescriptor, sizeof(KSPIN_DESCRIPTOR_EX)); + RtlMoveMemory(&This->PinDescriptors[This->PinDescriptorCount], &InPinDescriptor->PinDescriptor, sizeof(KSPIN_DESCRIPTOR)); + /* store new pin id */ - *PinID = This->Filter.Descriptor->PinDescriptorsCount; + *PinID = This->PinDescriptorCount; /* increment pin descriptor count */ - ((PKSFILTER_DESCRIPTOR)This->Filter.Descriptor)->PinDescriptorsCount++; + This->PinDescriptorCount++; DPRINT("KsFilterCreatePinFactory done\n"); @@ -1726,7 +1469,7 @@ KsFilterGetChildPinCount( { IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); - if (PinId >= This->Filter.Descriptor->PinDescriptorsCount) + if (PinId >= This->PinDescriptorCount) { /* index is out of bounds */ return 0; @@ -1747,7 +1490,7 @@ KsFilterGetFirstChildPin( { IKsFilterImpl * This = (IKsFilterImpl*)CONTAINING_RECORD(Filter, IKsFilterImpl, Filter); - if (PinId >= This->Filter.Descriptor->PinDescriptorsCount) + if (PinId >= This->PinDescriptorCount) { /* index is out of bounds */ return NULL; @@ -1786,8 +1529,6 @@ KsGetFilterFromIrp( PIO_STACK_LOCATION IoStack; PKSIOBJECT_HEADER ObjectHeader; - DPRINT("KsGetFilterFromIrp\n"); - /* get current irp stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp); diff --git a/drivers/ksfilter/ks/filterfactory.c b/drivers/ksfilter/ks/filterfactory.c index e60bfc41e81..a16b2900069 100644 --- a/drivers/ksfilter/ks/filterfactory.c +++ b/drivers/ksfilter/ks/filterfactory.c @@ -14,14 +14,13 @@ typedef struct KSBASIC_HEADER Header; KSFILTERFACTORY FilterFactory; + IKsFilterFactoryVtbl *lpVtbl; LONG ref; PKSIDEVICE_HEADER DeviceHeader; PFNKSFILTERFACTORYPOWER SleepCallback; PFNKSFILTERFACTORYPOWER WakeCallback; LIST_ENTRY SymbolicLinkList; - KMUTEX ControlMutex; - }IKsFilterFactoryImpl; VOID @@ -58,7 +57,7 @@ IKsFilterFactory_Create( Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(CreateItem->Context, IKsFilterFactoryImpl, FilterFactory); /* get interface */ - iface = (IKsFilterFactory*)&Factory->Header.OuterUnknown; + iface = (IKsFilterFactory*)&Factory->lpVtbl; /* create a filter instance */ Status = KspCreateFilter(DeviceObject, Irp, iface); @@ -83,31 +82,15 @@ IKsFilterFactory_fnQueryInterface( IN REFIID refiid, OUT PVOID* Output) { - NTSTATUS Status; - - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->Header.OuterUnknown; + *Output = &This->lpVtbl; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } - - if (This->Header.ClientAggregate) - { - /* using client aggregate */ - Status = This->Header.ClientAggregate->lpVtbl->QueryInterface(This->Header.ClientAggregate, refiid, Output); - - if (NT_SUCCESS(Status)) - { - /* client aggregate supports interface */ - return Status; - } - } - - DPRINT("IKsFilterFactory_fnQueryInterface no interface\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_UNSUCCESSFUL; } ULONG @@ -115,7 +98,7 @@ NTAPI IKsFilterFactory_fnAddRef( IKsFilterFactory * iface) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); return InterlockedIncrement(&This->ref); } @@ -125,7 +108,7 @@ NTAPI IKsFilterFactory_fnRelease( IKsFilterFactory * iface) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); InterlockedDecrement(&This->ref); @@ -151,7 +134,7 @@ NTAPI IKsFilterFactory_fnGetStruct( IKsFilterFactory * iface) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); return &This->FilterFactory; } @@ -162,7 +145,7 @@ IKsFilterFactory_fnSetDeviceClassesState( IKsFilterFactory * iface, IN BOOLEAN Enable) { - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); return KspSetDeviceInterfacesState(&This->SymbolicLinkList, Enable); } @@ -228,7 +211,7 @@ IKsFilterFactory_fnInitialize( BOOL FreeString = FALSE; IKsDevice * KsDevice; - IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, Header.OuterUnknown); + IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(iface, IKsFilterFactoryImpl, lpVtbl); /* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -242,16 +225,17 @@ IKsFilterFactory_fnInitialize( This->Header.Parent.KsDevice = &DeviceExtension->DeviceHeader->KsDevice; This->DeviceHeader = DeviceExtension->DeviceHeader; - /* initialize filter factory control mutex */ - This->Header.ControlMutex = &This->ControlMutex; - KeInitializeMutex(This->Header.ControlMutex, 0); - /* unused fields */ + KeInitializeMutex(&This->Header.ControlMutex, 0); InitializeListHead(&This->Header.EventList); KeInitializeSpinLock(&This->Header.EventListLock); + InitializeListHead(&This->SymbolicLinkList); + /* initialize filter factory control mutex */ + KeInitializeMutex(&This->Header.ControlMutex, 0); + /* does the device use a reference string */ if (RefString || !Descriptor->ReferenceGuid) { @@ -321,7 +305,7 @@ IKsFilterFactory_fnInitialize( if (This->FilterFactory.Bag) { /* initialize object bag */ - KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; + KsDevice = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice; KsDevice->lpVtbl->InitializeObjectBag(KsDevice, (PKSIOBJECT_BAG)This->FilterFactory.Bag, NULL); } } @@ -372,10 +356,10 @@ KspCreateFilterFactory( /* initialize struct */ This->ref = 1; - This->Header.OuterUnknown = (PUNKNOWN)&vt_IKsFilterFactoryVtbl; + This->lpVtbl = &vt_IKsFilterFactoryVtbl; /* map to com object */ - Filter = (IKsFilterFactory*)&This->Header.OuterUnknown; + Filter = (IKsFilterFactory*)&This->lpVtbl; /* initialize filter */ Status = Filter->lpVtbl->Initialize(Filter, DeviceObject, Descriptor, RefString, SecurityDescriptor, CreateItemFlags, SleepCallback, WakeCallback, FilterFactory); @@ -427,7 +411,7 @@ KsFilterFactorySetDeviceClassesState( IKsFilterFactory * Factory; IKsFilterFactoryImpl * This = (IKsFilterFactoryImpl*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory); - Factory = (IKsFilterFactory*)&This->Header.OuterUnknown; + Factory = (IKsFilterFactory*)&This->lpVtbl; return Factory->lpVtbl->SetDeviceClassesState(Factory, NewState); } @@ -484,261 +468,19 @@ KsFilterFactoryAddCreateItem( return KsAllocateObjectCreateItem((KSDEVICE_HEADER)Factory->DeviceHeader, &CreateItem, TRUE, IKsFilterFactory_ItemFreeCb); } -ULONG -KspCacheAddData( - PKSPCACHE_DESCRIPTOR Descriptor, - LPCVOID Data, - ULONG Length) -{ - ULONG Index; - - for(Index = 0; Index < Descriptor->DataOffset; Index++) - { - if (RtlCompareMemory(Descriptor->DataCache, Data, Length) == Length) - { - if (Index + Length > Descriptor->DataOffset) - { - /* adjust used space */ - Descriptor->DataOffset = Index + Length; - /* return absolute offset */ - return Descriptor->DataLength + Index; - } - } - } - - /* sanity check */ - ASSERT(Descriptor->DataOffset + Length < Descriptor->DataLength); - - /* copy to data blob */ - RtlMoveMemory((Descriptor->DataCache + Descriptor->DataOffset), Data, Length); - - /* backup offset */ - Index = Descriptor->DataOffset; - - /* adjust used space */ - Descriptor->DataOffset += Length; - - /* return absolute offset */ - return Descriptor->DataLength + Index; -} - /* @implemented */ KSDDKAPI NTSTATUS NTAPI -KsFilterFactoryUpdateCacheData( +KsFilterFactoryUpdateCacheData ( IN PKSFILTERFACTORY FilterFactory, IN const KSFILTER_DESCRIPTOR* FilterDescriptor OPTIONAL) { - KSPCACHE_DESCRIPTOR Descriptor; - PKSPCACHE_FILTER_HEADER FilterHeader; - UNICODE_STRING FilterData = RTL_CONSTANT_STRING(L"FilterData"); - PKSPCACHE_PIN_HEADER PinHeader; - ULONG Index, SubIndex; - PLIST_ENTRY Entry; - PSYMBOLIC_LINK_ENTRY SymEntry; - BOOLEAN Found; - HKEY hKey; - NTSTATUS Status = STATUS_SUCCESS; - - IKsFilterFactoryImpl * Factory = (IKsFilterFactoryImpl*)CONTAINING_RECORD(FilterFactory, IKsFilterFactoryImpl, FilterFactory); - + UNIMPLEMENTED DPRINT("KsFilterFactoryUpdateCacheData %p\n", FilterDescriptor); - if (!FilterDescriptor) - FilterDescriptor = Factory->FilterFactory.FilterDescriptor; - - ASSERT(FilterDescriptor); - - /* initialize cache descriptor */ - RtlZeroMemory(&Descriptor, sizeof(KSPCACHE_DESCRIPTOR)); - - /* calculate filter data size */ - Descriptor.FilterLength = sizeof(KSPCACHE_FILTER_HEADER); - - /* FIXME support variable size pin descriptors */ - ASSERT(FilterDescriptor->PinDescriptorSize == sizeof(KSPIN_DESCRIPTOR_EX)); - - for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++) - { - /* add filter descriptor */ - Descriptor.FilterLength += sizeof(KSPCACHE_PIN_HEADER); - - if (FilterDescriptor->PinDescriptors[Index].PinDescriptor.Category) - { - /* add extra ULONG for offset to category */ - Descriptor.FilterLength += sizeof(ULONG); - - /* add size for clsid */ - Descriptor.DataLength += sizeof(CLSID); - } - - /* add space for formats */ - Descriptor.FilterLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount * sizeof(KSPCACHE_DATARANGE); - - /* add space for MajorFormat / MinorFormat */ - Descriptor.DataLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount * sizeof(CLSID) * 2; - - /* add space for mediums */ - Descriptor.FilterLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount * sizeof(ULONG); - - /* add space for the data */ - Descriptor.DataLength += FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount * sizeof(KSPCACHE_MEDIUM); - } - - /* now allocate the space */ - Descriptor.FilterData = (PUCHAR)AllocateItem(NonPagedPool, Descriptor.DataLength + Descriptor.FilterLength); - if (!Descriptor.FilterData) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* initialize data cache */ - Descriptor.DataCache = (PUCHAR)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterLength); - - /* setup filter header */ - FilterHeader = (PKSPCACHE_FILTER_HEADER)Descriptor.FilterData; - - FilterHeader->dwVersion = 2; - FilterHeader->dwMerit = MERIT_DO_NOT_USE; - FilterHeader->dwUnused = 0; - FilterHeader->dwPins = FilterDescriptor->PinDescriptorsCount; - - Descriptor.FilterOffset = sizeof(KSPCACHE_FILTER_HEADER); - - /* write pin headers */ - for(Index = 0; Index < FilterDescriptor->PinDescriptorsCount; Index++) - { - /* get offset to pin */ - PinHeader = (PKSPCACHE_PIN_HEADER)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterOffset); - - /* write pin header */ - PinHeader->Signature = 0x33697030 + Index; - PinHeader->Flags = 0; - PinHeader->Instances = FilterDescriptor->PinDescriptors[Index].InstancesPossible; - if (PinHeader->Instances > 1) - PinHeader->Flags |= REG_PINFLAG_B_MANY; - - - PinHeader->MediaTypes = FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount; - PinHeader->Mediums = FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount; - PinHeader->Category = (FilterDescriptor->PinDescriptors[Index].PinDescriptor.Category ? TRUE : FALSE); - - Descriptor.FilterOffset += sizeof(KSPCACHE_PIN_HEADER); - - if (PinHeader->Category) - { - /* get category offset */ - PULONG Category = (PULONG)(PinHeader + 1); - - /* write category offset */ - *Category = KspCacheAddData(&Descriptor, FilterDescriptor->PinDescriptors[Index].PinDescriptor.Category, sizeof(CLSID)); - - /* adjust offset */ - Descriptor.FilterOffset += sizeof(ULONG); - } - - /* add dataranges */ - for(SubIndex = 0; SubIndex < FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRangesCount; SubIndex++) - { - /* get datarange offset */ - PKSPCACHE_DATARANGE DataRange = (PKSPCACHE_DATARANGE)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterOffset); - - /* initialize data range */ - DataRange->Signature = 0x33797430 + SubIndex; - DataRange->dwUnused = 0; - DataRange->OffsetMajor = KspCacheAddData(&Descriptor, &FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRanges[SubIndex]->MajorFormat, sizeof(CLSID)); - DataRange->OffsetMinor = KspCacheAddData(&Descriptor, &FilterDescriptor->PinDescriptors[Index].PinDescriptor.DataRanges[SubIndex]->SubFormat, sizeof(CLSID)); - - /* adjust offset */ - Descriptor.FilterOffset += sizeof(KSPCACHE_DATARANGE); - } - - /* add mediums */ - for(SubIndex = 0; SubIndex < FilterDescriptor->PinDescriptors[Index].PinDescriptor.MediumsCount; SubIndex++) - { - KSPCACHE_MEDIUM Medium; - PULONG MediumOffset; - - /* get pin medium offset */ - MediumOffset = (PULONG)((ULONG_PTR)Descriptor.FilterData + Descriptor.FilterOffset); - - /* copy medium guid */ - RtlMoveMemory(&Medium.Medium, &FilterDescriptor->PinDescriptors[Index].PinDescriptor.Mediums[SubIndex].Set, sizeof(GUID)); - Medium.dw1 = FilterDescriptor->PinDescriptors[Index].PinDescriptor.Mediums[SubIndex].Id; /* FIXME verify */ - Medium.dw2 = 0; - - *MediumOffset = KspCacheAddData(&Descriptor, &Medium, sizeof(KSPCACHE_MEDIUM)); - - /* adjust offset */ - Descriptor.FilterOffset += sizeof(ULONG); - } - } - - /* sanity checks */ - ASSERT(Descriptor.FilterOffset == Descriptor.FilterLength); - ASSERT(Descriptor.DataOffset <= Descriptor.DataLength); - - - /* now go through all entries and update 'FilterData' key */ - for(Index = 0; Index < FilterDescriptor->CategoriesCount; Index++) - { - /* get first entry */ - Entry = Factory->SymbolicLinkList.Flink; - - /* set status to not found */ - Found = FALSE; - /* loop list until the the current category is found */ - while(Entry != &Factory->SymbolicLinkList) - { - /* fetch symbolic link entry */ - SymEntry = (PSYMBOLIC_LINK_ENTRY)CONTAINING_RECORD(Entry, SYMBOLIC_LINK_ENTRY, Entry); - - if (IsEqualGUIDAligned(&SymEntry->DeviceInterfaceClass, &FilterDescriptor->Categories[Index])) - { - /* found category */ - Found = TRUE; - break; - } - - /* move to next entry */ - Entry = Entry->Flink; - } - - if (!Found) - { - /* filter category is not present */ - Status = STATUS_INVALID_PARAMETER; - break; - } - - /* now open device interface */ - Status = IoOpenDeviceInterfaceRegistryKey(&SymEntry->SymbolicLink, KEY_WRITE, &hKey); - if (!NT_SUCCESS(Status)) - { - /* failed to open interface key */ - break; - } - - /* update filterdata key */ - Status = ZwSetValueKey(hKey, &FilterData, 0, REG_BINARY, Descriptor.FilterData, Descriptor.FilterLength + Descriptor.DataOffset); - - /* close filterdata key */ - ZwClose(hKey); - - if (!NT_SUCCESS(Status)) - { - /* failed to set key value */ - break; - } - } - /* free filter data */ - FreeItem(Descriptor.FilterData); - - /* done */ - return Status; + return STATUS_SUCCESS; } diff --git a/drivers/ksfilter/ks/irp.c b/drivers/ksfilter/ks/irp.c index 0c6036e2059..e50490aad58 100644 --- a/drivers/ksfilter/ks/irp.c +++ b/drivers/ksfilter/ks/irp.c @@ -1360,7 +1360,7 @@ KsRemoveIrpFromCancelableQueue( PLIST_ENTRY CurEntry; KIRQL OldIrql; - //DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation); + DPRINT("KsRemoveIrpFromCancelableQueue ListHead %p SpinLock %p ListLocation %x RemovalOperation %x\n", QueueHead, SpinLock, ListLocation, RemovalOperation); /* check parameters */ if (!QueueHead || !SpinLock) @@ -1719,24 +1719,10 @@ FindMatchingCreateItem( { PLIST_ENTRY Entry; PCREATE_ITEM_ENTRY CreateItemEntry; - UNICODE_STRING RefString; - -#ifndef MS_KSUSER /* remove '\' slash */ Buffer++; BufferSize -= sizeof(WCHAR); -#endif - - if (!wcschr(Buffer, L'\\')) - { - RtlInitUnicodeString(&RefString, Buffer); - } - else - { - RefString.Buffer = Buffer; - RefString.Length = RefString.MaximumLength = ((ULONG_PTR)wcschr(Buffer, L'\\') - (ULONG_PTR)Buffer); - } /* point to first entry */ Entry = ListHead->Flink; @@ -1765,9 +1751,9 @@ FindMatchingCreateItem( ASSERT(CreateItemEntry->CreateItem->ObjectClass.Buffer); - DPRINT("CreateItem %S Length %u Request %wZ %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer, + DPRINT("CreateItem %S Length %u Request %S %u\n", CreateItemEntry->CreateItem->ObjectClass.Buffer, CreateItemEntry->CreateItem->ObjectClass.Length, - &RefString, + Buffer, BufferSize); if (CreateItemEntry->CreateItem->ObjectClass.Length > BufferSize) @@ -1778,7 +1764,7 @@ FindMatchingCreateItem( } /* now check if the object class is the same */ - if (!RtlCompareUnicodeString(&CreateItemEntry->CreateItem->ObjectClass, &RefString, TRUE)) + if (RtlCompareMemory(CreateItemEntry->CreateItem->ObjectClass.Buffer, Buffer, CreateItemEntry->CreateItem->ObjectClass.Length) == CreateItemEntry->CreateItem->ObjectClass.Length) { /* found matching create item */ *OutCreateItem = CreateItemEntry; @@ -2006,7 +1992,7 @@ KsDispatchIrp( PKSIDEVICE_HEADER DeviceHeader; PDEVICE_EXTENSION DeviceExtension; - //DPRINT("KsDispatchIrp DeviceObject %p Irp %p\n", DeviceObject, Irp); + DPRINT("KsDispatchIrp DeviceObject %p Irp %p\n", DeviceObject, Irp); /* get device extension */ DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; @@ -2022,7 +2008,7 @@ KsDispatchIrp( if (IoStack->MajorFunction == IRP_MJ_CREATE) { /* check internal type */ - if (DeviceHeader->BasicHeader.OuterUnknown) /* FIXME improve check */ + if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */ { /* AVStream client */ return IKsDevice_Create(DeviceObject, Irp); @@ -2054,7 +2040,7 @@ KsDispatchIrp( if (IoStack->MajorFunction == IRP_MJ_POWER) { /* check internal type */ - if (DeviceHeader->BasicHeader.OuterUnknown) /* FIXME improve check */ + if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */ { /* AVStream client */ return IKsDevice_Power(DeviceObject, Irp); @@ -2068,7 +2054,7 @@ KsDispatchIrp( else if (IoStack->MajorFunction == IRP_MJ_PNP) /* dispatch pnp */ { /* check internal type */ - if (DeviceHeader->BasicHeader.OuterUnknown) /* FIXME improve check */ + if (DeviceHeader->lpVtblIKsDevice) /* FIXME improve check */ { /* AVStream client */ return IKsDevice_Pnp(DeviceObject, Irp); diff --git a/drivers/ksfilter/ks/ksfunc.h b/drivers/ksfilter/ks/ksfunc.h index 636c616bcb2..8d0836af7d7 100644 --- a/drivers/ksfilter/ks/ksfunc.h +++ b/drivers/ksfilter/ks/ksfunc.h @@ -84,17 +84,19 @@ VOID FreeItem( IN PVOID Item); -KSDDKAPI NTSTATUS NTAPI -KspPinPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Property, - IN OUT PVOID Data, - IN ULONG DescriptorsCount, - IN const KSPIN_DESCRIPTOR* Descriptors, - IN ULONG DescriptorSize); +KspTopologyPropertyHandler( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data); +NTSTATUS +NTAPI +KspPinPropertyHandler( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data); NTSTATUS FindMatchingCreateItem( @@ -120,6 +122,11 @@ KspCreatePin( IN PKSPIN_CONNECT Connect, IN KSPIN_DESCRIPTOR_EX* Descriptor); +NTSTATUS +IKsFilter_AddPin( + IKsFilter * Filter, + PKSPIN Pin); + NTSTATUS KspAddCreateItemToList( OUT PLIST_ENTRY ListHead, @@ -149,40 +156,3 @@ KspSetFilterFactoriesState( IN PKSIDEVICE_HEADER DeviceHeader, IN BOOLEAN NewState); -NTSTATUS -NTAPI -KspMethodHandlerWithAllocator( - IN PIRP Irp, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET *MethodSet, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG MethodItemSize OPTIONAL); - -VOID -IKsFilter_AddPin( - PKSFILTER Filter, - PKSPIN Pin); - -VOID -IKsFilter_RemovePin( - PKSFILTER Filter, - PKSPIN Pin); - -NTSTATUS -KspEnableEvent( - IN PIRP Irp, - IN ULONG EventSetsCount, - IN PKSEVENT_SET EventSet, - IN OUT PLIST_ENTRY EventsList OPTIONAL, - IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, - IN PVOID EventsLock OPTIONAL, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG EventItemSize OPTIONAL); - -NTSTATUS -KspValidateConnectRequest( - IN PIRP Irp, - IN ULONG DescriptorsCount, - IN PVOID Descriptors, - IN ULONG DescriptorSize, - OUT PKSPIN_CONNECT* Connect); diff --git a/drivers/ksfilter/ks/ksiface.h b/drivers/ksfilter/ks/ksiface.h index ad95fc9a922..ffea3ed8a7c 100644 --- a/drivers/ksfilter/ks/ksiface.h +++ b/drivers/ksfilter/ks/ksiface.h @@ -282,9 +282,9 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown) STDMETHOD_(NTSTATUS,ReleaseDevice)(THIS) PURE; STDMETHOD_(NTSTATUS, GetAdapterObject)(THIS_ - IN PADAPTER_OBJECT * Object, - IN PULONG MaxMappingsByteCount, - IN PULONG MappingTableStride) PURE; + IN PADAPTER_OBJECT Object, + IN PULONG Unknown1, + IN PULONG Unknown2) PURE; STDMETHOD_(NTSTATUS, AddPowerEntry)(THIS_ IN struct KSPOWER_ENTRY * Entry, @@ -300,8 +300,8 @@ DECLARE_INTERFACE_(IKsDevice, IUnknown) IN KSSTATE NewState)PURE; STDMETHOD_(NTSTATUS, ArbitrateAdapterChannel)(THIS_ - IN ULONG NumberOfMapRegisters, - IN PDRIVER_CONTROL ExecutionRoutine, + IN ULONG ControlCode, + IN IO_ALLOCATION_ACTION Action, IN PVOID Context)PURE; STDMETHOD_(NTSTATUS, CheckIoCapability)(THIS_ diff --git a/drivers/ksfilter/ks/kstypes.h b/drivers/ksfilter/ks/kstypes.h index 0e64312e095..4bdc04c0bcb 100644 --- a/drivers/ksfilter/ks/kstypes.h +++ b/drivers/ksfilter/ks/kstypes.h @@ -58,11 +58,9 @@ typedef struct { KSOBJECTTYPE Type; PKSDEVICE KsDevice; - PRKMUTEX ControlMutex; + KMUTEX ControlMutex; LIST_ENTRY EventList; KSPIN_LOCK EventListLock; - PUNKNOWN ClientAggregate; - PUNKNOWN OuterUnknown; union { PKSDEVICE KsDevice; @@ -89,6 +87,7 @@ typedef struct { KSBASIC_HEADER BasicHeader; KSDEVICE KsDevice; + IKsDeviceVtbl *lpVtblIKsDevice; LONG ref; ERESOURCE SecurityLock; @@ -109,10 +108,6 @@ typedef struct LIST_ENTRY PowerDispatchList; LIST_ENTRY ObjectBags; - PADAPTER_OBJECT AdapterObject; - ULONG MaxMappingsByteCount; - ULONG MappingTableStride; - }KSIDEVICE_HEADER, *PKSIDEVICE_HEADER; typedef struct @@ -125,7 +120,6 @@ typedef struct { LIST_ENTRY Entry; UNICODE_STRING SymbolicLink; - CLSID DeviceInterfaceClass; }SYMBOLIC_LINK_ENTRY, *PSYMBOLIC_LINK_ENTRY; typedef struct @@ -163,51 +157,3 @@ typedef struct WCHAR BusIdentifier[1]; }BUS_ENUM_DEVICE_EXTENSION, *PBUS_ENUM_DEVICE_EXTENSION; - -typedef struct -{ - PUCHAR FilterData; - ULONG FilterLength; - ULONG FilterOffset; - - PUCHAR DataCache; - ULONG DataLength; - ULONG DataOffset; - -}KSPCACHE_DESCRIPTOR, *PKSPCACHE_DESCRIPTOR; - -typedef struct -{ - DWORD dwVersion; - DWORD dwMerit; - DWORD dwPins; - DWORD dwUnused; -}KSPCACHE_FILTER_HEADER, *PKSPCACHE_FILTER_HEADER; - -typedef struct -{ - ULONG Signature; - ULONG Flags; - ULONG Instances; - ULONG MediaTypes; - ULONG Mediums; - DWORD Category; -}KSPCACHE_PIN_HEADER, *PKSPCACHE_PIN_HEADER; - - -typedef struct -{ - ULONG Signature; - ULONG dwUnused; - ULONG OffsetMajor; - ULONG OffsetMinor; -}KSPCACHE_DATARANGE, *PKSPCACHE_DATARANGE; - - -typedef struct -{ - CLSID Medium; - ULONG dw1; - ULONG dw2; -}KSPCACHE_MEDIUM; - diff --git a/drivers/ksfilter/ks/methods.c b/drivers/ksfilter/ks/methods.c index 6263ce0b7bb..512371a6a29 100644 --- a/drivers/ksfilter/ks/methods.c +++ b/drivers/ksfilter/ks/methods.c @@ -8,183 +8,8 @@ #include "priv.h" -NTSTATUS -FindMethodHandler( - IN PIO_STATUS_BLOCK IoStatus, - IN const KSMETHOD_SET* MethodSet, - IN ULONG MethodSetCount, - IN PKSMETHOD Method, - IN ULONG InputBufferLength, - IN ULONG OutputBufferLength, - OUT PVOID OutputBuffer, - OUT PFNKSHANDLER *MethodHandler, - OUT PKSMETHOD_SET * Set) -{ - ULONG Index, ItemIndex; - - for(Index = 0; Index < MethodSetCount; Index++) - { - ASSERT(MethodSet[Index].Set); - - if (IsEqualGUIDAligned(&Method->Set, MethodSet[Index].Set)) - { - for(ItemIndex = 0; ItemIndex < MethodSet[Index].MethodsCount; ItemIndex++) - { - if (MethodSet[Index].MethodItem[ItemIndex].MethodId == Method->Id) - { - if (MethodSet[Index].MethodItem[ItemIndex].MinMethod > InputBufferLength) - { - /* too small input buffer */ - IoStatus->Information = MethodSet[Index].MethodItem[ItemIndex].MinMethod; - return STATUS_INVALID_PARAMETER; - } - - if (MethodSet[Index].MethodItem[ItemIndex].MinData > OutputBufferLength) - { - /* too small output buffer */ - IoStatus->Information = MethodSet[Index].MethodItem[ItemIndex].MinData; - return STATUS_MORE_ENTRIES; - } - if (Method->Flags & KSMETHOD_TYPE_BASICSUPPORT) - { - PULONG Flags; - PKSPROPERTY_DESCRIPTION Description; - - if (sizeof(ULONG) > OutputBufferLength) - { - /* too small buffer */ - return STATUS_INVALID_PARAMETER; - } - - /* get output buffer */ - Flags = (PULONG)OutputBuffer; - - /* set flags flags */ - *Flags = MethodSet[Index].MethodItem[ItemIndex].Flags; - - IoStatus->Information = sizeof(ULONG); - - if (OutputBufferLength >= sizeof(KSPROPERTY_DESCRIPTION)) - { - /* get output buffer */ - Description = (PKSPROPERTY_DESCRIPTION)OutputBuffer; - - /* store result */ - Description->DescriptionSize = sizeof(KSPROPERTY_DESCRIPTION); - Description->PropTypeSet.Set = KSPROPTYPESETID_General; - Description->PropTypeSet.Id = 0; - Description->PropTypeSet.Flags = 0; - Description->MembersListCount = 0; - Description->Reserved = 0; - - IoStatus->Information = sizeof(KSPROPERTY_DESCRIPTION); - } - return STATUS_SUCCESS; - } - *MethodHandler = MethodSet[Index].MethodItem[ItemIndex].MethodHandler; - *Set = (PKSMETHOD_SET)&MethodSet[Index]; - return STATUS_SUCCESS; - } - } - } - } - return STATUS_NOT_FOUND; -} - -NTSTATUS -NTAPI -KspMethodHandlerWithAllocator( - IN PIRP Irp, - IN ULONG MethodSetsCount, - IN const KSMETHOD_SET *MethodSet, - IN PFNKSALLOCATOR Allocator OPTIONAL, - IN ULONG MethodItemSize OPTIONAL) -{ - PKSMETHOD Method; - PKSMETHOD_SET Set; - PIO_STACK_LOCATION IoStack; - NTSTATUS Status; - PFNKSHANDLER MethodHandler = NULL; - ULONG Index; - LPGUID Guid; - - /* get current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - /* check if inputbuffer at least holds KSMETHOD item */ - if (IoStack->Parameters.DeviceIoControl.InputBufferLength < sizeof(KSMETHOD)) - { - /* invalid parameter */ - Irp->IoStatus.Information = sizeof(KSPROPERTY); - return STATUS_INVALID_BUFFER_SIZE; - } - - /* FIXME probe the input / output buffer if from user mode */ - - /* get input property request */ - Method = (PKSMETHOD)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - -// DPRINT("KspMethodHandlerWithAllocator Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); - - /* sanity check */ - ASSERT(MethodItemSize == 0 || MethodItemSize == sizeof(KSMETHOD_ITEM)); - - /* find the method handler */ - Status = FindMethodHandler(&Irp->IoStatus, MethodSet, MethodSetsCount, Method, IoStack->Parameters.DeviceIoControl.InputBufferLength, IoStack->Parameters.DeviceIoControl.OutputBufferLength, Irp->UserBuffer, &MethodHandler, &Set); - - if (NT_SUCCESS(Status) && MethodHandler) - { - /* call method handler */ - KSMETHOD_SET_IRP_STORAGE(Irp) = Set; - Status = MethodHandler(Irp, Method, Irp->UserBuffer); - - if (Status == STATUS_BUFFER_TOO_SMALL) - { - /* output buffer is too small */ - if (Allocator) - { - /* allocate the requested amount */ - Status = Allocator(Irp, Irp->IoStatus.Information, FALSE); - - /* check if the block was allocated */ - if (!NT_SUCCESS(Status)) - { - /* no memory */ - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* re-call method handler */ - Status = MethodHandler(Irp, Method, Irp->UserBuffer); - } - } - } - else if (IsEqualGUIDAligned(&Method->Set, &GUID_NULL) && Method->Id == 0 && Method->Flags == KSMETHOD_TYPE_SETSUPPORT) - { - // store output size - Irp->IoStatus.Information = sizeof(GUID) * MethodSetsCount; - if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(GUID) * MethodSetsCount) - { - // buffer too small - return STATUS_MORE_ENTRIES; - } - - // get output buffer - Guid = (LPGUID)Irp->UserBuffer; - - // copy property guids from property sets - for(Index = 0; Index < MethodSetsCount; Index++) - { - RtlMoveMemory(&Guid[Index], MethodSet[Index].Set, sizeof(GUID)); - } - return STATUS_SUCCESS; - } - - /* done */ - return Status; -} - /* - @implemented + @unimplemented */ KSDDKAPI NTSTATUS @@ -194,11 +19,12 @@ KsMethodHandler( IN ULONG MethodSetsCount, IN PKSMETHOD_SET MethodSet) { - return KspMethodHandlerWithAllocator(Irp, MethodSetsCount, MethodSet, NULL, 0); + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; } /* - @implemented + @unimplemented */ KSDDKAPI NTSTATUS @@ -210,39 +36,12 @@ KsMethodHandlerWithAllocator( IN PFNKSALLOCATOR Allocator OPTIONAL, IN ULONG MethodItemSize OPTIONAL) { - return KspMethodHandlerWithAllocator(Irp, MethodSetsCount, MethodSet, Allocator, MethodItemSize); + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; } - -NTSTATUS -FindFastMethodHandler( - IN ULONG FastIoCount, - IN const KSFASTMETHOD_ITEM * FastIoTable, - IN PKSMETHOD MethodId, - OUT PFNKSFASTHANDLER * FastPropertyHandler) -{ - ULONG Index; - - /* iterate through all items */ - for(Index = 0; Index < FastIoCount; Index++) - { - if (MethodId->Id == FastIoTable[Index].MethodId) - { - if (FastIoTable[Index].MethodSupported) - { - *FastPropertyHandler = FastIoTable[Index].MethodHandler; - return STATUS_SUCCESS; - } - } - - } - /* no fast property handler found */ - return STATUS_NOT_FOUND; -} - - /* - @implemented + @unimplemented */ KSDDKAPI BOOLEAN @@ -257,68 +56,6 @@ KsFastMethodHandler( IN ULONG MethodSetsCount, IN const KSMETHOD_SET* MethodSet) { - KSMETHOD MethodRequest; - KPROCESSOR_MODE Mode; - NTSTATUS Status = STATUS_SUCCESS; - ULONG Index; - PFNKSFASTHANDLER FastMethodHandler; - - if (MethodLength < sizeof(KSPROPERTY)) - { - /* invalid request */ - return FALSE; - } - - /* get previous mode */ - Mode = ExGetPreviousMode(); - - if (Mode == KernelMode) - { - /* just copy it */ - RtlMoveMemory(&MethodRequest, Method, sizeof(KSMETHOD)); - } - else - { - /* need to probe the buffer */ - _SEH2_TRY - { - ProbeForRead(Method, sizeof(KSPROPERTY), sizeof(UCHAR)); - RtlMoveMemory(&MethodRequest, Method, sizeof(KSMETHOD)); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Exception, get the error code */ - Status = _SEH2_GetExceptionCode(); - }_SEH2_END; - - if (!NT_SUCCESS(Status)) - return FALSE; - } - - /* are there any property sets provided */ - if (MethodSetsCount) - { - /* iterate through all property sets count */ - Index = 0; - do - { - /* does the property id match */ - if (IsEqualGUIDAligned(MethodSet[Index].Set, &MethodRequest.Set)) - { - /* try to find a fast property handler */ - Status = FindFastMethodHandler(MethodSet[Index].FastIoCount, MethodSet[Index].FastIoTable, &MethodRequest, &FastMethodHandler); - - if (NT_SUCCESS(Status)) - { - /* call fast property handler */ - ASSERT(MethodLength == sizeof(KSMETHOD)); /* FIXME check if property length is bigger -> copy params */ - ASSERT(Mode == KernelMode); /* FIXME need to probe usermode output buffer */ - return FastMethodHandler(FileObject, &MethodRequest, sizeof(KSMETHOD), Data, DataLength, IoStatus); - } - } - /* move to next item */ - Index++; - }while(Index < MethodSetsCount); - } + UNIMPLEMENTED; return FALSE; } diff --git a/drivers/ksfilter/ks/misc.c b/drivers/ksfilter/ks/misc.c index dc814eae01e..cc3d2cc9cca 100644 --- a/drivers/ksfilter/ks/misc.c +++ b/drivers/ksfilter/ks/misc.c @@ -175,21 +175,16 @@ KsGetObjectTypeFromIrp( } /* - @implemented + @unimplemented */ PUNKNOWN NTAPI KsGetOuterUnknown( IN PVOID Object) { - PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); - - /* sanity check */ - ASSERT(BasicHeader->Type == KsObjectTypeDevice || BasicHeader->Type == KsObjectTypeFilterFactory || - BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); + UNIMPLEMENTED + return NULL; - /* return objects outer unknown */ - return BasicHeader->OuterUnknown; } /* diff --git a/drivers/ksfilter/ks/pin.c b/drivers/ksfilter/ks/pin.c index 019e5ce6023..5d1ee77a6df 100644 --- a/drivers/ksfilter/ks/pin.c +++ b/drivers/ksfilter/ks/pin.c @@ -11,17 +11,13 @@ typedef struct _KSISTREAM_POINTER { + KSSTREAM_POINTER StreamPointer; PFNKSSTREAMPOINTER Callback; PIRP Irp; KTIMER Timer; KDPC TimerDpc; struct _KSISTREAM_POINTER *Next; - PKSPIN Pin; - PVOID Data; - ULONG Offset; - ULONG Length; - KSSTREAM_POINTER StreamPointer; - KSPIN_LOCK Lock; + }KSISTREAM_POINTER, *PKSISTREAM_POINTER; typedef struct @@ -32,9 +28,9 @@ typedef struct KSPROCESSPIN ProcessPin; LIST_ENTRY Entry; - LONG ref; + IKsPinVtbl *lpVtbl; - IKsFilter * Filter; + LONG ref; KMUTEX ProcessingMutex; PFILE_OBJECT FileObject; @@ -43,11 +39,10 @@ typedef struct LIST_ENTRY IrpList; KSPIN_LOCK IrpListLock; - volatile LONG IrpCount; PKSISTREAM_POINTER ClonedStreamPointer; - KSISTREAM_POINTER LeadingEdgeStreamPointer; - KSISTREAM_POINTER TrailingStreamPointer; + PKSISTREAM_POINTER LeadingEdgeStreamPointer; + PKSISTREAM_POINTER TrailingStreamPointer; PFNKSPINPOWER Sleep; PFNKSPINPOWER Wake; @@ -55,425 +50,8 @@ typedef struct PFNKSPINFRAMERETURN FrameReturn; PFNKSPINIRPCOMPLETION IrpCompletion; - KSCLOCK_FUNCTIONTABLE ClockTable; - PFILE_OBJECT ClockFileObject; - IKsReferenceClockVtbl * lpVtblReferenceClock; - PKSDEFAULTCLOCK DefaultClock; - - PKSWORKER PinWorker; - WORK_QUEUE_ITEM PinWorkQueueItem; - KEVENT FrameComplete; - ULONG FrameSize; - ULONG NumFrames; - PDMA_ADAPTER Dma; - ULONG MapRegisters; - }IKsPinImpl; -NTSTATUS NTAPI IKsPin_PinStatePropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI IKsPin_PinDataFormatPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI IKsPin_PinAllocatorFramingPropertyHandler(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI IKsPin_PinStreamAllocator(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI IKsPin_PinMasterClock(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); -NTSTATUS NTAPI IKsPin_PinPipeId(IN PIRP Irp, IN PKSIDENTIFIER Request, IN OUT PVOID Data); - - - -DEFINE_KSPROPERTY_CONNECTIONSET(PinConnectionSet, IKsPin_PinStatePropertyHandler, IKsPin_PinDataFormatPropertyHandler, IKsPin_PinAllocatorFramingPropertyHandler); -DEFINE_KSPROPERTY_STREAMSET(PinStreamSet, IKsPin_PinStreamAllocator, IKsPin_PinMasterClock, IKsPin_PinPipeId); - -//TODO -// KSPROPSETID_Connection -// KSPROPERTY_CONNECTION_ACQUIREORDERING -// KSPROPSETID_StreamInterface -// KSPROPERTY_STREAMINTERFACE_HEADERSIZE - -KSPROPERTY_SET PinPropertySet[] = -{ - { - &KSPROPSETID_Connection, - sizeof(PinConnectionSet) / sizeof(KSPROPERTY_ITEM), - (const KSPROPERTY_ITEM*)&PinConnectionSet, - 0, - NULL - }, - { - &KSPROPSETID_Stream, - sizeof(PinStreamSet) / sizeof(KSPROPERTY_ITEM), - (const KSPROPERTY_ITEM*)&PinStreamSet, - 0, - NULL - } -}; - -const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; -const GUID KSPROPSETID_Stream = {0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}}; -const GUID KSPROPSETID_Clock = {0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}}; - -NTSTATUS -NTAPI -IKsPin_PinStreamAllocator( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; -} - -NTSTATUS -NTAPI -IKsPin_PinMasterClock( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PIO_STACK_LOCATION IoStack; - PKSIOBJECT_HEADER ObjectHeader; - IKsPinImpl * This; - NTSTATUS Status = STATUS_SUCCESS; - PHANDLE Handle; - PFILE_OBJECT FileObject; - KPROCESSOR_MODE Mode; - KSPROPERTY Property; - ULONG BytesReturned; - - /* get current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("IKsPin_PinMasterClock\n"); - - /* sanity check */ - ASSERT(IoStack->FileObject); - ASSERT(IoStack->FileObject->FsContext2); - - /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - /* sanity check */ - ASSERT(ObjectHeader); - - /* locate ks pin implemention from KSPIN offset */ - This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - - /* sanity check */ - ASSERT(This); - - Handle = (PHANDLE)Data; - - if (Request->Flags & KSPROPERTY_TYPE_GET) - { - if (This->Pin.Descriptor->PinDescriptor.Communication != KSPIN_COMMUNICATION_NONE && - This->Pin.Descriptor->Dispatch && - (This->Pin.Descriptor->Flags & KSPIN_FLAG_IMPLEMENT_CLOCK)) - { - *Handle = NULL; - Status = STATUS_SUCCESS; - } - else - { - /* no clock available */ - Status = STATUS_UNSUCCESSFUL; - } - } - else if (Request->Flags & KSPROPERTY_TYPE_SET) - { - if (This->Pin.ClientState != KSSTATE_STOP) - { - /* can only set in stopped state */ - Status = STATUS_INVALID_DEVICE_STATE; - } - else - { - if (*Handle) - { - Mode = ExGetPreviousMode(); - - Status = ObReferenceObjectByHandle(*Handle, SYNCHRONIZE | DIRECTORY_QUERY, IoFileObjectType, Mode, (PVOID*)&FileObject, NULL); - - DPRINT("IKsPin_PinMasterClock ObReferenceObjectByHandle %lx\n", Status); - if (NT_SUCCESS(Status)) - { - Property.Set = KSPROPSETID_Clock; - Property.Id = KSPROPERTY_CLOCK_FUNCTIONTABLE; - Property.Flags = KSPROPERTY_TYPE_GET; - - Status = KsSynchronousIoControlDevice(FileObject, KernelMode, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), &This->ClockTable, sizeof(KSCLOCK_FUNCTIONTABLE), &BytesReturned); - - DPRINT("IKsPin_PinMasterClock KSPROPERTY_CLOCK_FUNCTIONTABLE %lx\n", Status); - - if (NT_SUCCESS(Status)) - { - This->ClockFileObject = FileObject; - } - else - { - ObDereferenceObject(FileObject); - } - } - } - else - { - /* zeroing clock handle */ - RtlZeroMemory(&This->ClockTable, sizeof(KSCLOCK_FUNCTIONTABLE)); - Status = STATUS_SUCCESS; - if (This->ClockFileObject) - { - FileObject = This->ClockFileObject; - This->ClockFileObject = NULL; - - ObDereferenceObject(This->ClockFileObject); - } - } - } - } - - DPRINT("IKsPin_PinMasterClock Status %lx\n", Status); - return Status; -} - - - -NTSTATUS -NTAPI -IKsPin_PinPipeId( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - UNIMPLEMENTED - return STATUS_NOT_IMPLEMENTED; -} - - -NTSTATUS -NTAPI -IKsPin_PinStatePropertyHandler( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PIO_STACK_LOCATION IoStack; - PKSIOBJECT_HEADER ObjectHeader; - IKsPinImpl * This; - NTSTATUS Status = STATUS_SUCCESS; - KSSTATE OldState; - PKSSTATE NewState; - - /* get current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("IKsPin_PinStatePropertyHandler\n"); - - /* sanity check */ - ASSERT(IoStack->FileObject); - ASSERT(IoStack->FileObject->FsContext2); - - /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - /* locate ks pin implemention from KSPIN offset */ - This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - - /* acquire control mutex */ - KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); - - /* grab state */ - NewState = (PKSSTATE)Data; - - if (Request->Flags & KSPROPERTY_TYPE_GET) - { - *NewState = This->Pin.DeviceState; - Irp->IoStatus.Information = sizeof(KSSTATE); - } - else if (Request->Flags & KSPROPERTY_TYPE_SET) - { - if (This->Pin.Descriptor->Dispatch->SetDeviceState) - { - /* backup old state */ - OldState = This->Pin.ClientState; - - /* set new state */ - This->Pin.ClientState = *NewState; - This->Pin.DeviceState = KSSTATE_RUN; - - /* check if it supported */ - Status = This->Pin.Descriptor->Dispatch->SetDeviceState(&This->Pin, *NewState, OldState); - - DPRINT("IKsPin_PinStatePropertyHandler NewState %lu Result %lx\n", *NewState, Status); - - if (!NT_SUCCESS(Status)) - { - /* revert to old state */ - This->Pin.ClientState = OldState; - This->Pin.DeviceState = OldState; - DPRINT("IKsPin_PinStatePropertyHandler failed to set state %lx Result %lx\n", *NewState, Status); - DbgBreakPoint(); - } - else - { - /* update device state */ - This->Pin.DeviceState = *NewState; - } - } - else - { - /* just set new state */ - This->Pin.DeviceState = *NewState; - This->Pin.ClientState = *NewState; - } - } - - /* release processing mutex */ - KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); - - DPRINT("IKsPin_PinStatePropertyHandler Status %lx\n", Status); - return Status; -} - -NTSTATUS -NTAPI -IKsPin_PinAllocatorFramingPropertyHandler( - IN PIRP Irp, - IN PKSIDENTIFIER Request, - IN OUT PVOID Data) -{ - PIO_STACK_LOCATION IoStack; - PKSIOBJECT_HEADER ObjectHeader; - IKsPinImpl * This; - ULONG Size; - NTSTATUS Status = STATUS_SUCCESS; - - /* get current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - /* sanity check */ - ASSERT(IoStack->FileObject); - ASSERT(IoStack->FileObject->FsContext2); - - /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - /* locate ks pin implemention from KSPIN offset */ - This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - - /* setting allocator flags is not supported */ - ASSERT(!(Request->Flags & KSPROPERTY_TYPE_SET)); - - /* acquire control mutex */ - KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); - - if (This->Pin.Descriptor->AllocatorFraming) - { - /* calculate size */ - Size = FIELD_OFFSET(KSALLOCATOR_FRAMING_EX, FramingItem[0]) + This->Pin.Descriptor->AllocatorFraming->CountItems * sizeof(KS_FRAMING_ITEM); - - if (IoStack->Parameters.DeviceIoControl.OutputBufferLength == 0) - { - /* no buffer */ - Status = STATUS_BUFFER_OVERFLOW; - } - else if (Size > IoStack->Parameters.DeviceIoControl.OutputBufferLength) - { - /* buffer too small */ - Status = STATUS_BUFFER_TOO_SMALL; - } - else - { - /* copy buffer */ - RtlMoveMemory(Data, This->Pin.Descriptor->AllocatorFraming, Size); - } - - /* store size */ - Irp->IoStatus.Information = Size; - } - else - { - /* no allocator framing details */ - Status = STATUS_NOT_FOUND; - } - - /* release processing mutex */ - KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); - - DPRINT("IKsPin_PinAllocatorFramingPropertyHandler Status %lx\n", Status); - - return Status; -} - -NTSTATUS -NTAPI -IKsPin_PinDataFormatPropertyHandler( - IN PIRP Irp, - IN PKSPROPERTY Request, - IN OUT PVOID Data) -{ - PIO_STACK_LOCATION IoStack; - PKSIOBJECT_HEADER ObjectHeader; - IKsPinImpl * This; - NTSTATUS Status = STATUS_SUCCESS; - - /* get current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - DPRINT("IKsPin_PinDataFormatPropertyHandler\n"); - - /* sanity check */ - ASSERT(IoStack->FileObject); - ASSERT(IoStack->FileObject->FsContext2); - - /* get the object header */ - ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - /* locate ks pin implemention from KSPIN offset */ - This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - - /* acquire control mutex */ - KeWaitForSingleObject(This->BasicHeader.ControlMutex, Executive, KernelMode, FALSE, NULL); - - if (Request->Flags & KSPROPERTY_TYPE_GET) - { - if (IoStack->Parameters.DeviceIoControl.OutputBufferLength < This->Pin.ConnectionFormat->FormatSize) - { - /* buffer too small */ - Irp->IoStatus.Information = This->Pin.ConnectionFormat->FormatSize; - Status = STATUS_BUFFER_TOO_SMALL; - } - else - { - /* copy format */ - RtlMoveMemory(Data, This->Pin.ConnectionFormat, This->Pin.ConnectionFormat->FormatSize); - } - } - else if (Request->Flags & KSPROPERTY_TYPE_SET) - { - /* set format */ - if (This->Pin.Descriptor->Flags & KSPIN_FLAG_FIXED_FORMAT) - { - /* format cannot be changed */ - Status = STATUS_INVALID_DEVICE_REQUEST; - } - else - { - /* FIXME check if the format is supported */ - Status = _KsEdit(This->Pin.Bag, (PVOID*)&This->Pin.ConnectionFormat, IoStack->Parameters.DeviceIoControl.OutputBufferLength, This->Pin.ConnectionFormat->FormatSize, 0); - - if (NT_SUCCESS(Status)) - { - /* store new format */ - RtlMoveMemory(This->Pin.ConnectionFormat, Data, IoStack->Parameters.DeviceIoControl.OutputBufferLength); - } - } - } - - /* release processing mutex */ - KeReleaseMutex(This->BasicHeader.ControlMutex, FALSE); - - DPRINT("IKsPin_PinDataFormatPropertyHandler Status %lx\n", Status); - - return Status; -} - NTSTATUS NTAPI IKsPin_fnQueryInterface( @@ -481,31 +59,15 @@ IKsPin_fnQueryInterface( IN REFIID refiid, OUT PVOID* Output) { - NTSTATUS Status; - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, BasicHeader.OuterUnknown); + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtbl); if (IsEqualGUIDAligned(refiid, &IID_IUnknown)) { - *Output = &This->BasicHeader.OuterUnknown; + *Output = &This->lpVtbl; _InterlockedIncrement(&This->ref); return STATUS_SUCCESS; } - - - if (This->BasicHeader.ClientAggregate) - { - /* using client aggregate */ - Status = This->BasicHeader.ClientAggregate->lpVtbl->QueryInterface(This->BasicHeader.ClientAggregate, refiid, Output); - - if (NT_SUCCESS(Status)) - { - /* client aggregate supports interface */ - return Status; - } - } - - DPRINT("IKsPin_fnQueryInterface no interface\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_UNSUCCESSFUL; } ULONG @@ -513,7 +75,7 @@ NTAPI IKsPin_fnAddRef( IKsPin * iface) { - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, BasicHeader.OuterUnknown); + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtbl); return InterlockedIncrement(&This->ref); } @@ -523,7 +85,7 @@ NTAPI IKsPin_fnRelease( IKsPin * iface) { - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, BasicHeader.OuterUnknown); + IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtbl); InterlockedDecrement(&This->ref); @@ -708,219 +270,6 @@ static IKsPinVtbl vt_IKsPin = //============================================================== -NTSTATUS -NTAPI -IKsReferenceClock_fnQueryInterface( - IKsReferenceClock * iface, - IN REFIID refiid, - OUT PVOID* Output) -{ - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - return IKsPin_fnQueryInterface((IKsPin*)&This->BasicHeader.OuterUnknown, refiid, Output); -} - -ULONG -NTAPI -IKsReferenceClock_fnAddRef( - IKsReferenceClock * iface) -{ - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - return IKsPin_fnAddRef((IKsPin*)&This->BasicHeader.OuterUnknown); -} - -ULONG -NTAPI -IKsReferenceClock_fnRelease( - IKsReferenceClock * iface) -{ - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - return IKsPin_fnRelease((IKsPin*)&This->BasicHeader.OuterUnknown); -} - -LONGLONG -NTAPI -IKsReferenceClock_fnGetTime( - IKsReferenceClock * iface) -{ - LONGLONG Result; - - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - - DPRINT1("IKsReferenceClock_fnGetTime\n"); - - if (!This->ClockFileObject || !This->ClockTable.GetTime) - { - Result = 0; - } - else - { - Result = This->ClockTable.GetTime(This->ClockFileObject); - } - - return Result; -} - -LONGLONG -NTAPI -IKsReferenceClock_fnGetPhysicalTime( - IKsReferenceClock * iface) -{ - LONGLONG Result; - - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - DPRINT1("IKsReferenceClock_fnGetPhysicalTime\n"); - - - if (!This->ClockFileObject || !This->ClockTable.GetPhysicalTime) - { - Result = 0; - } - else - { - Result = This->ClockTable.GetPhysicalTime(This->ClockFileObject); - } - - return Result; -} - - -LONGLONG -NTAPI -IKsReferenceClock_fnGetCorrelatedTime( - IKsReferenceClock * iface, - OUT PLONGLONG SystemTime) -{ - LONGLONG Result; - - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - DPRINT1("IKsReferenceClock_fnGetCorrelatedTime\n"); - - if (!This->ClockFileObject || !This->ClockTable.GetCorrelatedTime) - { - Result = 0; - } - else - { - Result = This->ClockTable.GetCorrelatedTime(This->ClockFileObject, SystemTime); - } - - return Result; -} - - -LONGLONG -NTAPI -IKsReferenceClock_fnGetCorrelatedPhysicalTime( - IKsReferenceClock * iface, - OUT PLONGLONG SystemTime) -{ - LONGLONG Result; - - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - DPRINT1("IKsReferenceClock_fnGetCorrelatedPhysicalTime\n"); - - if (!This->ClockFileObject || !This->ClockTable.GetCorrelatedPhysicalTime) - { - Result = 0; - } - else - { - Result = This->ClockTable.GetCorrelatedPhysicalTime(This->ClockFileObject, SystemTime); - } - - return Result; -} - -NTSTATUS -NTAPI -IKsReferenceClock_fnGetResolution( - IKsReferenceClock * iface, - OUT PKSRESOLUTION Resolution) -{ - KSPROPERTY Property; - ULONG BytesReturned; - - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - DPRINT1("IKsReferenceClock_fnGetResolution\n"); - - if (!This->ClockFileObject) - { - Resolution->Error = 0; - Resolution->Granularity = 1; - DPRINT1("IKsReferenceClock_fnGetResolution Using HACK\n"); - return STATUS_SUCCESS; - } - - - if (!This->ClockFileObject) - return STATUS_DEVICE_NOT_READY; - - - Property.Set = KSPROPSETID_Clock; - Property.Id = KSPROPERTY_CLOCK_RESOLUTION; - Property.Flags = KSPROPERTY_TYPE_GET; - - return KsSynchronousIoControlDevice(This->ClockFileObject, KernelMode, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), Resolution, sizeof(KSRESOLUTION), &BytesReturned); - -} - -NTSTATUS -NTAPI -IKsReferenceClock_fnGetState( - IKsReferenceClock * iface, - OUT PKSSTATE State) -{ - KSPROPERTY Property; - ULONG BytesReturned; - - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(iface, IKsPinImpl, lpVtblReferenceClock); - - DPRINT1("IKsReferenceClock_fnGetState\n"); - - if (!This->ClockFileObject) - { - *State = This->Pin.ClientState; - DPRINT1("IKsReferenceClock_fnGetState Using HACK\n"); - return STATUS_SUCCESS; - } - - - if (!This->ClockFileObject) - return STATUS_DEVICE_NOT_READY; - - - Property.Set = KSPROPSETID_Clock; - Property.Id = KSPROPERTY_CLOCK_RESOLUTION; - Property.Flags = KSPROPERTY_TYPE_GET; - - return KsSynchronousIoControlDevice(This->ClockFileObject, KernelMode, IOCTL_KS_PROPERTY, &Property, sizeof(KSPROPERTY), State, sizeof(KSSTATE), &BytesReturned); -} - -static IKsReferenceClockVtbl vt_ReferenceClock = -{ - IKsReferenceClock_fnQueryInterface, - IKsReferenceClock_fnAddRef, - IKsReferenceClock_fnRelease, - IKsReferenceClock_fnGetTime, - IKsReferenceClock_fnGetPhysicalTime, - IKsReferenceClock_fnGetCorrelatedTime, - IKsReferenceClock_fnGetCorrelatedPhysicalTime, - IKsReferenceClock_fnGetResolution, - IKsReferenceClock_fnGetState -}; - - -//============================================================== - - /* @implemented */ @@ -991,7 +340,6 @@ KsPinAttemptProcessing( IN BOOLEAN Asynchronous) { DPRINT("KsPinAttemptProcessing\n"); - DbgBreakPoint(); UNIMPLEMENTED } @@ -1100,26 +448,17 @@ KsPinGetParentFilter( } /* - @implemented + @unimplemented */ NTSTATUS NTAPI -KsPinGetReferenceClockInterface( + KsPinGetReferenceClockInterface( IN PKSPIN Pin, OUT PIKSREFERENCECLOCK* Interface) { - NTSTATUS Status = STATUS_DEVICE_NOT_READY; - IKsPinImpl * This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); - - if (This->ClockFileObject) - { - /* clock is available */ - *Interface = (PIKSREFERENCECLOCK)&This->lpVtblReferenceClock; - Status = STATUS_SUCCESS; - } - - DPRINT("KsPinGetReferenceClockInterface Pin %p Interface %p Status %x\n", Pin, Interface, Status); - return Status; + UNIMPLEMENTED + DPRINT("KsPinGetReferenceClockInterface Pin %p Interface %p\n", Pin, Interface); + return STATUS_UNSUCCESSFUL; } /* @@ -1208,26 +547,15 @@ KsGetPinFromIrp( IN PIRP Irp) { PKSIOBJECT_HEADER ObjectHeader; - PKSPIN Pin; - PKSBASIC_HEADER Header; PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp); DPRINT("KsGetPinFromIrp\n"); /* get object header */ ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; - - if (!ObjectHeader) - return NULL; - - Pin = (PKSPIN)ObjectHeader->ObjectType; - Header = (PKSBASIC_HEADER)((ULONG_PTR)Pin - sizeof(KSBASIC_HEADER)); - - /* sanity check */ - ASSERT(Header->Type == KsObjectTypePin); - /* return object type */ - return Pin; + return (PKSPIN)ObjectHeader->ObjectType; + } @@ -1289,85 +617,6 @@ KsProcessPinUpdate( return FALSE; } -NTSTATUS -IKsPin_PrepareStreamHeader( - IN IKsPinImpl * This, - IN PKSISTREAM_POINTER StreamPointer) -{ - PKSSTREAM_HEADER Header; - ULONG Length; - - /* grab new irp */ - StreamPointer->Irp = KsRemoveIrpFromCancelableQueue(&This->IrpList, &This->IrpListLock, KsListEntryHead, KsAcquireAndRemoveOnlySingleItem); - if (!StreamPointer->Irp) - { - /* run out of mappings */ - DPRINT("OutOfMappings\n"); - return STATUS_DEVICE_NOT_READY; - } - - InterlockedDecrement(&This->IrpCount); - KsDecrementCountedWorker(This->PinWorker); - - /* get stream header */ - if (StreamPointer->Irp->RequestorMode == UserMode) - Header = (PKSSTREAM_HEADER)StreamPointer->Irp->AssociatedIrp.SystemBuffer; - else - Header = (PKSSTREAM_HEADER)StreamPointer->Irp->UserBuffer; - - /* initialize stream pointer */ - StreamPointer->Callback = NULL; - StreamPointer->Length = max(Header->DataUsed, Header->FrameExtent); - StreamPointer->Next = NULL; - StreamPointer->Offset = 0; - StreamPointer->Pin = &This->Pin; - StreamPointer->Data = Header->Data; - - StreamPointer->StreamPointer.Context = NULL; - StreamPointer->StreamPointer.Pin = &This->Pin; - StreamPointer->StreamPointer.StreamHeader = Header; - - if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) - StreamPointer->StreamPointer.Offset = &StreamPointer->StreamPointer.OffsetIn; - else - StreamPointer->StreamPointer.Offset = &StreamPointer->StreamPointer.OffsetOut; - - StreamPointer->StreamPointer.Offset->Alignment = 0; - StreamPointer->StreamPointer.Offset->Count = 0; - StreamPointer->StreamPointer.Offset->Data = NULL; - StreamPointer->StreamPointer.Offset->Remaining = 0; - - ASSERT(StreamPointer->StreamPointer.Offset->Remaining == 0); - - //StreamPointer->Offset += StreamPointer->StreamPointer.Offset->Count; - - ASSERT(StreamPointer->Length > StreamPointer->Offset); - ASSERT(StreamPointer->StreamPointer.StreamHeader); - ASSERT(This->FrameSize); - - /* calculate length */ - /* TODO split into frames */ - Length = StreamPointer->Length; - - /* FIXME */ - ASSERT(Length); - - StreamPointer->StreamPointer.Offset->Alignment = 0; - StreamPointer->StreamPointer.Context = NULL; - StreamPointer->StreamPointer.Pin = &This->Pin; - StreamPointer->StreamPointer.Offset->Count = Length; - StreamPointer->StreamPointer.Offset->Remaining = Length; - StreamPointer->StreamPointer.Offset->Data = (PVOID)((ULONG_PTR)StreamPointer->Data + StreamPointer->Offset); - StreamPointer->StreamPointer.StreamHeader->FrameExtent = Length; - if (StreamPointer->StreamPointer.StreamHeader->DataUsed) - StreamPointer->StreamPointer.StreamHeader->DataUsed = Length; - - StreamPointer->StreamPointer.StreamHeader->Data = StreamPointer->StreamPointer.Offset->Data; - - return STATUS_SUCCESS; -} - - /* @unimplemented */ @@ -1378,31 +627,9 @@ KsPinGetLeadingEdgeStreamPointer( IN PKSPIN Pin, IN KSSTREAM_POINTER_STATE State) { - IKsPinImpl * This; - NTSTATUS Status; - - This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); - - DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x Count %lu Remaining %lu\n", Pin, State, - This->LeadingEdgeStreamPointer.Length, - This->LeadingEdgeStreamPointer.Offset); - - /* sanity check */ - ASSERT(State == KSSTREAM_POINTER_STATE_LOCKED); - - if (State == KSSTREAM_POINTER_STATE_LOCKED) - { - if (!This->LeadingEdgeStreamPointer.Irp || This->LeadingEdgeStreamPointer.StreamPointer.Offset->Remaining == 0) - { - Status = IKsPin_PrepareStreamHeader(This, &This->LeadingEdgeStreamPointer); - if (!NT_SUCCESS(Status)) - return NULL; - } - - DPRINT("KsPinGetLeadingEdgeStreamPointer NewOffset %lu TotalLength %lu\n", This->LeadingEdgeStreamPointer.Offset, This->LeadingEdgeStreamPointer.Length); - } - - return &This->LeadingEdgeStreamPointer.StreamPointer; + UNIMPLEMENTED + DPRINT("KsPinGetLeadingEdgeStreamPointer Pin %p State %x\n", Pin, State); + return NULL; } /* @@ -1456,11 +683,8 @@ KsStreamPointerUnlock( IN PKSSTREAM_POINTER StreamPointer, IN BOOLEAN Eject) { - PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); - - DPRINT("KsStreamPointerUnlock StreamPointer %pEject %lu\n", StreamPointer, Eject); - - Pointer->Irp = NULL; + UNIMPLEMENTED + DPRINT("KsStreamPointerUnlock\n"); } /* @@ -1475,8 +699,8 @@ KsStreamPointerAdvanceOffsetsAndUnlock( IN ULONG OutUsed, IN BOOLEAN Eject) { - DPRINT("KsStreamPointerAdvanceOffsets InUsed %lu OutUsed %lu Eject %lu\n", InUsed, OutUsed, Eject); - DbgBreakPoint(); + DPRINT("KsStreamPointerAdvanceOffsets\n"); + UNIMPLEMENTED } @@ -1491,10 +715,10 @@ KsStreamPointerDelete( { IKsPinImpl * This; PKSISTREAM_POINTER Cur, Last; - PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; + + DPRINT("KsStreamPointerDelete\n"); - DPRINT("KsStreamPointerDelete %p\n", Pointer); -DbgBreakPoint(); This = (IKsPinImpl*)CONTAINING_RECORD(Pointer->StreamPointer.Pin, IKsPinImpl, Pin); /* point to first stream pointer */ @@ -1514,105 +738,39 @@ DbgBreakPoint(); return; } - if (!Last) - { - /* remove first cloned pointer */ - This->ClonedStreamPointer = Pointer->Next; - } - else - { - Last->Next = Pointer->Next; - } - - /* FIXME make sure no timeouts are pending */ - FreeItem(Pointer); -} - -/* - @implemented -*/ -KSDDKAPI -NTSTATUS -NTAPI -KsStreamPointerClone( - IN PKSSTREAM_POINTER StreamPointer, - IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL, - IN ULONG ContextSize, - OUT PKSSTREAM_POINTER* CloneStreamPointer) -{ - IKsPinImpl * This; - PKSISTREAM_POINTER CurFrame; - PKSISTREAM_POINTER NewFrame; - ULONG RefCount; - NTSTATUS Status; - ULONG Size; - - DPRINT("KsStreamPointerClone StreamPointer %p CancelCallback %p ContextSize %p CloneStreamPointer %p\n", StreamPointer, CancelCallback, ContextSize, CloneStreamPointer); - - /* get stream pointer */ - CurFrame = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); - - /* calculate context size */ - Size = sizeof(KSISTREAM_POINTER) + ContextSize; - - /* allocate new stream pointer */ - NewFrame = (PKSISTREAM_POINTER)ExAllocatePool(NonPagedPool, Size); - - if (!NewFrame) - return STATUS_INSUFFICIENT_RESOURCES; - - /* get current irp stack location */ - RefCount = (ULONG)CurFrame->Irp->Tail.Overlay.DriverContext[0]; - - /* increment reference count */ - RefCount++; - CurFrame->Irp->Tail.Overlay.DriverContext[0] = (PVOID)RefCount; - - /* copy stream pointer */ - RtlMoveMemory(NewFrame, CurFrame, sizeof(KSISTREAM_POINTER)); - - /* locate pin */ - This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); - - /* prepare stream header in case required */ - if (CurFrame->StreamPointer.Offset->Remaining == 0) - { - Status = IKsPin_PrepareStreamHeader(This, NewFrame); - if (!NT_SUCCESS(Status)) - { - FreeItem(NewFrame); - return STATUS_DEVICE_NOT_READY; - } - } - - if (ContextSize) - NewFrame->StreamPointer.Context = (NewFrame + 1); - - - if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) - NewFrame->StreamPointer.Offset = &NewFrame->StreamPointer.OffsetIn; - else - NewFrame->StreamPointer.Offset = &NewFrame->StreamPointer.OffsetOut; - - - - NewFrame->StreamPointer.Pin = &This->Pin; - - ASSERT(NewFrame->StreamPointer.Pin); - ASSERT(NewFrame->StreamPointer.Context); - ASSERT(NewFrame->StreamPointer.Offset); - ASSERT(NewFrame->StreamPointer.StreamHeader); - - /* store result */ - *CloneStreamPointer = &NewFrame->StreamPointer; + if (!Last) + { + /* remove first cloned pointer */ + This->ClonedStreamPointer = Pointer->Next; + } + else + { + Last->Next = Pointer->Next; + } - DPRINT("KsStreamPointerClone CloneStreamPointer %p\n", *CloneStreamPointer); + /* FIXME make sure no timeouts are pending */ + FreeItem(Pointer); +} - return STATUS_SUCCESS; +/* + @unimplemented +*/ +KSDDKAPI +NTSTATUS +NTAPI +KsStreamPointerClone( + IN PKSSTREAM_POINTER StreamPointer, + IN PFNKSSTREAMPOINTER CancelCallback OPTIONAL, + IN ULONG ContextSize, + OUT PKSSTREAM_POINTER* CloneStreamPointer) +{ + UNIMPLEMENTED + DPRINT("KsStreamPointerClone\n"); + return STATUS_NOT_IMPLEMENTED; } /* - @implemented + @unimplemented */ KSDDKAPI NTSTATUS @@ -1623,52 +781,8 @@ KsStreamPointerAdvanceOffsets( IN ULONG OutUsed, IN BOOLEAN Eject) { - PKSISTREAM_POINTER CurFrame; - IKsPinImpl * This; - NTSTATUS Status; - - DPRINT("KsStreamPointerAdvanceOffsets StreamPointer %p InUsed %lu OutUsed %lu Eject %lu\n", StreamPointer, InUsed, OutUsed, Eject); - - /* get stream pointer */ - CurFrame = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); - - /* locate pin */ - This = (IKsPinImpl*)CONTAINING_RECORD(CurFrame->Pin, IKsPinImpl, Pin); - - /* TODO */ - ASSERT(InUsed == 0); - ASSERT(Eject == 0); - ASSERT(OutUsed); - - DPRINT("KsStreamPointerAdvanceOffsets Offset %lu Length %lu NewOffset %lu Remaining %lu LeadingEdge %p DataUsed %lu\n", CurFrame->Offset, CurFrame->Length, CurFrame->Offset + OutUsed, -CurFrame->StreamPointer.OffsetOut.Remaining, &This->LeadingEdgeStreamPointer.StreamPointer, CurFrame->StreamPointer.StreamHeader->DataUsed); -DbgBreakPoint(); - - if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) - { - ASSERT(CurFrame->StreamPointer.OffsetIn.Remaining >= InUsed); - CurFrame->StreamPointer.OffsetIn.Remaining -= InUsed; - CurFrame->StreamPointer.OffsetIn.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetIn.Data + InUsed); - } - else - { - if (!CurFrame->StreamPointer.OffsetOut.Remaining) - { - Status = IKsPin_PrepareStreamHeader(This, CurFrame); - if (!NT_SUCCESS(Status)) - { - return STATUS_DEVICE_NOT_READY; - } - } - else - { - ASSERT(CurFrame->StreamPointer.OffsetOut.Remaining >= OutUsed); - CurFrame->StreamPointer.OffsetOut.Remaining -= OutUsed; - CurFrame->StreamPointer.OffsetOut.Data = (PVOID)((ULONG_PTR)CurFrame->StreamPointer.OffsetOut.Data + OutUsed); - } - } - - return STATUS_SUCCESS; + UNIMPLEMENTED + return STATUS_NOT_IMPLEMENTED; } /* @@ -1681,7 +795,6 @@ KsStreamPointerAdvance( IN PKSSTREAM_POINTER StreamPointer) { UNIMPLEMENTED - DbgBreakPoint(); return STATUS_NOT_IMPLEMENTED; } @@ -1725,10 +838,7 @@ KsStreamPointerScheduleTimeout( IN ULONGLONG Interval) { LARGE_INTEGER DueTime; - PKSISTREAM_POINTER Pointer; - - /* get stream pointer */ - Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; /* setup timer callback */ Pointer->Callback = Callback; @@ -1750,10 +860,7 @@ NTAPI KsStreamPointerCancelTimeout( IN PKSSTREAM_POINTER StreamPointer) { - PKSISTREAM_POINTER Pointer; - - /* get stream pointer */ - Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); + PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; KeCancelTimer(&Pointer->Timer); @@ -1773,10 +880,6 @@ KsPinGetFirstCloneStreamPointer( DPRINT("KsPinGetFirstCloneStreamPointer %p\n", Pin); This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); - - if (!This->ClonedStreamPointer) - return NULL; - /* return first cloned stream pointer */ return &This->ClonedStreamPointer->StreamPointer; } @@ -1790,12 +893,9 @@ NTAPI KsStreamPointerGetNextClone( IN PKSSTREAM_POINTER StreamPointer) { - PKSISTREAM_POINTER Pointer; + PKSISTREAM_POINTER Pointer = (PKSISTREAM_POINTER)StreamPointer; DPRINT("KsStreamPointerGetNextClone\n"); -DbgBreakPoint(); - /* get stream pointer */ - Pointer = (PKSISTREAM_POINTER)CONTAINING_RECORD(StreamPointer, KSISTREAM_POINTER, StreamPointer); /* is there a another cloned stream pointer */ if (!Pointer->Next) @@ -1805,174 +905,67 @@ DbgBreakPoint(); return &Pointer->Next->StreamPointer; } -VOID -NTAPI -IKsPin_PinCentricWorker( - IN PVOID Parameter) -{ - NTSTATUS Status; - IKsPinImpl * This = (IKsPinImpl*)Parameter; - - DPRINT("IKsPin_PinCentricWorker\n"); - - /* sanity checks */ - ASSERT(This); - ASSERT(This->Pin.Descriptor); - ASSERT(This->Pin.Descriptor->Dispatch); - ASSERT(This->Pin.Descriptor->Dispatch->Process); - ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL); - ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING)); - ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_GENERATE_MAPPINGS)); - - do - { - DPRINT("IKsPin_PinCentricWorker calling Pin Process Routine\n"); - - Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); - DPRINT("IKsPin_PinCentricWorker Status %lx, Offset %lu Length %lu\n", Status, - This->LeadingEdgeStreamPointer.Offset, - This->LeadingEdgeStreamPointer.Length); - break; - - }while(This->IrpCount); -} - - NTSTATUS -NTAPI -IKsPin_DispatchKsStream( +IKsPin_DispatchKsProperty( PDEVICE_OBJECT DeviceObject, PIRP Irp, IKsPinImpl * This) { - PKSPROCESSPIN_INDEXENTRY ProcessPinIndex; - PKSSTREAM_HEADER Header; - ULONG NumHeaders; - PKSFILTER Filter; + NTSTATUS Status; + PKSPROPERTY Property; PIO_STACK_LOCATION IoStack; - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("IKsPin_DispatchKsStream\n"); + UNICODE_STRING GuidString; + ULONG PropertySetsCount = 0, PropertyItemSize = 0; + const KSPROPERTY_SET* PropertySets = NULL; - /* FIXME handle reset states */ - ASSERT(This->Pin.ResetState == KSRESET_END); + /* sanity check */ + ASSERT(This->Pin.Descriptor); - /* get current stack location */ + /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); - /* probe stream pointer */ - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM) - Status = KsProbeStreamIrp(Irp, KSSTREAM_WRITE | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_SYSTEMADDRESS, This->Pin.StreamHeaderSize); - else - Status = KsProbeStreamIrp(Irp, KSSTREAM_READ | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK | KSPROBE_SYSTEMADDRESS, This->Pin.StreamHeaderSize); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("KsProbeStreamIrp failed with %x\n", Status); - - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; - } - - if (Irp->RequestorMode == UserMode) - Header = (PKSSTREAM_HEADER)Irp->AssociatedIrp.SystemBuffer; - else - Header = (PKSSTREAM_HEADER)Irp->UserBuffer; - if (!Header) + if (This->Pin.Descriptor->AutomationTable) { - DPRINT("NoHeader Canceling Irp %p\n", Irp); - Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + /* use available driver property sets */ + PropertySetsCount = This->Pin.Descriptor->AutomationTable->PropertySetsCount; + PropertySets = This->Pin.Descriptor->AutomationTable->PropertySets; + PropertyItemSize = This->Pin.Descriptor->AutomationTable->PropertyItemSize; } - /* calculate num headers */ - NumHeaders = IoStack->Parameters.DeviceIoControl.OutputBufferLength / Header->Size; - /* assume headers of same length */ - ASSERT(IoStack->Parameters.DeviceIoControl.OutputBufferLength % Header->Size == 0); + /* try driver provided property sets */ + Status = KspPropertyHandler(Irp, + PropertySetsCount, + PropertySets, + NULL, + PropertyItemSize); - /* FIXME support multiple stream headers */ - ASSERT(NumHeaders == 1); + DPRINT("IKsPin_DispatchKsProperty PropertySetCount %lu Status %lu\n", PropertySetsCount, Status); - if (Irp->RequestorMode == UserMode) + if (Status != STATUS_NOT_FOUND) { - /* prepare header */ - ASSERT(Irp->MdlAddress); - Header->Data = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); - - if (!Header->Data) + /* property was handled by driver */ + if (Status != STATUS_PENDING) { - DPRINT("NoHeader->Data Canceling Irp %p\n", Irp); - Irp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES; + Irp->IoStatus.Status = Status; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; } - - } - - - - if (This->Pin.Descriptor->Dispatch->Process) - { - /* it is a pin centric avstream */ - - /* mark irp as pending */ - IoMarkIrpPending(Irp); - - /* add irp to cancelable queue */ - KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); - - /* sanity checks */ - ASSERT(!(This->Pin.Descriptor->Flags & KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING)); - ASSERT(This->PinWorker); - - InterlockedIncrement(&This->IrpCount); - - DPRINT("IKsPin_DispatchKsStream IrpCount %lu\n", This->IrpCount); - - /* start the processing loop */ - KsIncrementCountedWorker(This->PinWorker); - - Status = STATUS_PENDING; + return Status; } - else - { - /* filter-centric avstream */ - ASSERT(This->Filter); - ProcessPinIndex = This->Filter->lpVtbl->GetProcessDispatch(This->Filter); - Filter = This->Filter->lpVtbl->GetStruct(This->Filter); - - ASSERT(ProcessPinIndex); - ASSERT(Filter); - ASSERT(Filter->Descriptor); - ASSERT(Filter->Descriptor->Dispatch); - - if (!Filter->Descriptor->Dispatch->Process) - { - /* invalid device request */ - DPRINT("Filter Centric Processing No Process Routine\n"); - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_UNSUCCESSFUL; - } - - /* mark irp as pending */ - IoMarkIrpPending(Irp); - - /* add irp to cancelable queue */ - KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); + /* property was not handled */ + Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - Status = Filter->Descriptor->Dispatch->Process(Filter, ProcessPinIndex); + RtlStringFromGUID(&Property->Set, &GuidString); + DPRINT("IKsPin_DispatchKsProperty Unhandled property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); + RtlFreeUnicodeString(&GuidString); - DPRINT("IKsPin_DispatchKsStream FilterCentric: Status %lx \n", Status); + Irp->IoStatus.Status = STATUS_NOT_FOUND; + IoCompleteRequest(Irp, IO_NO_INCREMENT); - } + return STATUS_NOT_FOUND; - return Status; } NTSTATUS @@ -1984,10 +977,7 @@ IKsPin_DispatchDeviceIoControl( PIO_STACK_LOCATION IoStack; PKSIOBJECT_HEADER ObjectHeader; IKsPinImpl * This; - NTSTATUS Status; - UNICODE_STRING GuidString; - PKSPROPERTY Property; - ULONG SetCount = 0; + NTSTATUS Status = STATUS_SUCCESS; /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -2002,99 +992,43 @@ IKsPin_DispatchDeviceIoControl( /* locate ks pin implemention from KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); - /* current irp stack */ - IoStack = IoGetCurrentIrpStackLocation(Irp); - - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_READ_STREAM || - IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_WRITE_STREAM) + if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) { - /* handle ks stream packets */ - return IKsPin_DispatchKsStream(DeviceObject, Irp, This); + /* handle ks properties */ + return IKsPin_DispatchKsProperty(DeviceObject, Irp, This); } - /* get property from input buffer */ - Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; - - /* sanity check */ - ASSERT(IoStack->Parameters.DeviceIoControl.InputBufferLength >= sizeof(KSIDENTIFIER)); - ASSERT(This->Pin.Descriptor->AutomationTable); - - RtlStringFromGUID(&Property->Set, &GuidString); - DPRINT("IKsPin_DispatchDeviceIoControl property Set |%S| Id %u Flags %x\n", GuidString.Buffer, Property->Id, Property->Flags); - RtlFreeUnicodeString(&GuidString); - - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_METHOD) + if (IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_WRITE_STREAM && IoStack->Parameters.DeviceIoControl.IoControlCode != IOCTL_KS_READ_STREAM) { - const KSMETHOD_SET *MethodSet = NULL; - ULONG MethodItemSize = 0; - - /* check if the driver supports method sets */ - if (This->Pin.Descriptor->AutomationTable->MethodSetsCount) - { - SetCount = This->Pin.Descriptor->AutomationTable->MethodSetsCount; - MethodSet = This->Pin.Descriptor->AutomationTable->MethodSets; - MethodItemSize = This->Pin.Descriptor->AutomationTable->MethodItemSize; - } - - /* call method set handler */ - Status = KspMethodHandlerWithAllocator(Irp, SetCount, MethodSet, NULL, MethodItemSize); + UNIMPLEMENTED; + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_NOT_IMPLEMENTED; } - else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY) - { - const KSPROPERTY_SET *PropertySet = NULL; - ULONG PropertyItemSize = 0; - /* check if the driver supports method sets */ - if (This->Pin.Descriptor->AutomationTable->PropertySetsCount) - { - SetCount = This->Pin.Descriptor->AutomationTable->PropertySetsCount; - PropertySet = This->Pin.Descriptor->AutomationTable->PropertySets; - PropertyItemSize = This->Pin.Descriptor->AutomationTable->PropertyItemSize; - } + /* mark irp as pending */ + IoMarkIrpPending(Irp); - /* needed for our property handlers */ - KSPROPERTY_ITEM_IRP_STORAGE(Irp) = (KSPROPERTY_ITEM*)This; + /* add irp to cancelable queue */ + KsAddIrpToCancelableQueue(&This->IrpList, &This->IrpListLock, Irp, KsListEntryTail, NULL /* FIXME */); - /* call property handler */ - Status = KspPropertyHandler(Irp, SetCount, PropertySet, NULL, PropertyItemSize); - } - else + if (This->Pin.Descriptor->Dispatch->Process) { - /* sanity check */ - ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT || - IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_DISABLE_EVENT); + /* it is a pin centric avstream */ + Status = This->Pin.Descriptor->Dispatch->Process(&This->Pin); - if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_ENABLE_EVENT) - { - /* call enable event handlers */ - Status = KspEnableEvent(Irp, - This->Pin.Descriptor->AutomationTable->EventSetsCount, - (PKSEVENT_SET)This->Pin.Descriptor->AutomationTable->EventSets, - &This->BasicHeader.EventList, - KSEVENTS_SPINLOCK, - (PVOID)&This->BasicHeader.EventListLock, - NULL, - This->Pin.Descriptor->AutomationTable->EventItemSize); - } - else - { - /* disable event handler */ - Status = KsDisableEvent(Irp, &This->BasicHeader.EventList, KSEVENTS_SPINLOCK, &This->BasicHeader.EventListLock); - } + /* TODO */ } - - RtlStringFromGUID(&Property->Set, &GuidString); - DPRINT("IKsPin_DispatchDeviceIoControl property Set |%S| Id %u Flags %x Status %lx ResultLength %lu\n", GuidString.Buffer, Property->Id, Property->Flags, Status, Irp->IoStatus.Information); - RtlFreeUnicodeString(&GuidString); - - if (Status != STATUS_PENDING) + else { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + /* TODO + * filter-centric avstream + */ + UNIMPLEMENTED } - /* done */ return Status; } @@ -2122,6 +1056,9 @@ IKsPin_Close( /* locate ks pin implemention fro KSPIN offset */ This = (IKsPinImpl*)CONTAINING_RECORD(ObjectHeader->ObjectType, IKsPinImpl, Pin); + /* acquire filter control mutex */ + KsFilterAcquireControl(This->BasicHeader.Parent.KsFilter); + if (This->Pin.Descriptor->Dispatch->Close) { /* call pin close routine */ @@ -2135,8 +1072,7 @@ IKsPin_Close( return Status; } - /* remove pin from filter pin list and decrement reference count */ - IKsFilter_RemovePin(This->Filter->lpVtbl->GetStruct(This->Filter), &This->Pin); + /* FIXME remove pin from filter pin list and decrement reference count */ if (Status != STATUS_PENDING) { @@ -2168,80 +1104,11 @@ IKsPin_DispatchCreateClock( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - PKSPIN Pin; - NTSTATUS Status = STATUS_SUCCESS; - IKsPinImpl * This; - KSRESOLUTION Resolution; - PKSRESOLUTION pResolution = NULL; - PKSOBJECT_CREATE_ITEM CreateItem; - - DPRINT("IKsPin_DispatchCreateClock\n"); - - /* get the create item */ - CreateItem = KSCREATE_ITEM_IRP_STORAGE(Irp); - - /* sanity check */ - ASSERT(CreateItem); - - /* get the pin object */ - Pin = (PKSPIN)CreateItem->Context; - - /* sanity check */ - ASSERT(Pin); - - /* locate ks pin implemention fro KSPIN offset */ - This = (IKsPinImpl*)CONTAINING_RECORD(Pin, IKsPinImpl, Pin); - - /* sanity check */ - ASSERT(This->BasicHeader.Type == KsObjectTypePin); - ASSERT(This->BasicHeader.ControlMutex); - - /* acquire control mutex */ - KsAcquireControl(Pin); - - if ((This->Pin.Descriptor->PinDescriptor.Communication != KSPIN_COMMUNICATION_NONE && - This->Pin.Descriptor->Dispatch) || - (This->Pin.Descriptor->Flags & KSPIN_FLAG_IMPLEMENT_CLOCK)) - { - if (!This->DefaultClock) - { - if (This->Pin.Descriptor->Dispatch && This->Pin.Descriptor->Dispatch->Clock) - { - if (This->Pin.Descriptor->Dispatch->Clock->Resolution) - { - This->Pin.Descriptor->Dispatch->Clock->Resolution(&This->Pin, &Resolution); - pResolution = &Resolution; - } - - Status = KsAllocateDefaultClockEx(&This->DefaultClock, - (PVOID)&This->Pin, - (PFNKSSETTIMER)This->Pin.Descriptor->Dispatch->Clock->SetTimer, - (PFNKSCANCELTIMER)This->Pin.Descriptor->Dispatch->Clock->CancelTimer, - (PFNKSCORRELATEDTIME)This->Pin.Descriptor->Dispatch->Clock->CorrelatedTime, - pResolution, - 0); - } - else - { - Status = KsAllocateDefaultClockEx(&This->DefaultClock, (PVOID)&This->Pin, NULL, NULL, NULL, NULL, 0); - } - } - - if (NT_SUCCESS(Status)) - { - Status = KsCreateDefaultClock(Irp, This->DefaultClock); - } - } - - DPRINT("IKsPin_DispatchCreateClock %lx\n", Status); - - /* release control mutex */ - KsReleaseControl(Pin); + UNIMPLEMENTED; - /* done */ - Irp->IoStatus.Status = Status; + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -2274,7 +1141,7 @@ static KSDISPATCH_TABLE PinDispatchTable = NTSTATUS KspCreatePin( IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp, + IN PIRP Irp, IN PKSDEVICE KsDevice, IN IKsFilterFactory * FilterFactory, IN IKsFilter* Filter, @@ -2288,86 +1155,11 @@ KspCreatePin( PKSOBJECT_CREATE_ITEM CreateItem; NTSTATUS Status; PKSDATAFORMAT DataFormat; - PKSBASIC_HEADER BasicHeader; - ULONG Index; - ULONG FrameSize = 0; - ULONG NumFrames = 0; - KSAUTOMATION_TABLE AutomationTable; /* sanity checks */ ASSERT(Descriptor->Dispatch); - DPRINT("KspCreatePin PinId %lu Flags %x\n", Connect->PinId, Descriptor->Flags); - -//Output Pin: KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY -//Input Pin: KSPIN_FLAG_FIXED_FORMAT|KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT|KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING - - DPRINT("KspCreatePin Dataflow %lu\n", Descriptor->PinDescriptor.DataFlow); - DPRINT("KspCreatePin Communication %lu\n", Descriptor->PinDescriptor.Communication); - if (Descriptor->AllocatorFraming) - { - DPRINT("KspCreatePin CountItems %lu\n", Descriptor->AllocatorFraming->CountItems); - DPRINT("KspCreatePin PinFlags %lx\n", Descriptor->AllocatorFraming->PinFlags); - DPRINT("KspCreatePin OutputCompression RatioNumerator %lu RatioDenominator %lu RatioConstantMargin %lu\n", Descriptor->AllocatorFraming->OutputCompression.RatioNumerator, - Descriptor->AllocatorFraming->OutputCompression.RatioDenominator, Descriptor->AllocatorFraming->OutputCompression.RatioConstantMargin); - DPRINT("KspCreatePin PinWeight %lx\n", Descriptor->AllocatorFraming->PinWeight); - - for(Index = 0; Index < Descriptor->AllocatorFraming->CountItems; Index++) - { - DPRINT("KspCreatePin Index %lu MemoryFlags %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].MemoryFlags); - DPRINT("KspCreatePin Index %lu BusFlags %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].BusFlags); - DPRINT("KspCreatePin Index %lu Flags %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].Flags); - DPRINT("KspCreatePin Index %lu Frames %lu\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].Frames); - DPRINT("KspCreatePin Index %lu FileAlignment %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].FileAlignment); - DPRINT("KspCreatePin Index %lu MemoryTypeWeight %lx\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].MemoryTypeWeight); - DPRINT("KspCreatePin Index %lu PhysicalRange MinFrameSize %lu MaxFrameSize %lu Stepping %lu\n", Index, Descriptor->AllocatorFraming->FramingItem[Index].PhysicalRange.MinFrameSize, - Descriptor->AllocatorFraming->FramingItem[Index].PhysicalRange.MaxFrameSize, - Descriptor->AllocatorFraming->FramingItem[Index].PhysicalRange.Stepping); - - DPRINT("KspCreatePin Index %lu FramingRange MinFrameSize %lu MaxFrameSize %lu Stepping %lu InPlaceWeight %lu NotInPlaceWeight %lu\n", - Index, - Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.MinFrameSize, - Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.MaxFrameSize, - Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.Stepping, - Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.InPlaceWeight, - Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.NotInPlaceWeight); - - FrameSize = Descriptor->AllocatorFraming->FramingItem[Index].FramingRange.Range.MaxFrameSize; - NumFrames = Descriptor->AllocatorFraming->FramingItem[Index].Frames; - } - } - - for (Index = 0; Index < Descriptor->PinDescriptor.DataRangesCount; Index++) - { - UNICODE_STRING GuidString; - /* convert the guid to string */ - RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->MajorFormat, &GuidString); - DPRINT("Index %lu MajorFormat %S\n", Index, GuidString.Buffer); - RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->SubFormat, &GuidString); - DPRINT("Index %lu SubFormat %S\n", Index, GuidString.Buffer); - RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->Specifier, &GuidString); - DPRINT("Index %lu Specifier %S\n", Index, GuidString.Buffer); - RtlStringFromGUID(&Descriptor->PinDescriptor.DataRanges[Index]->Specifier, &GuidString); - DPRINT("Index %lu FormatSize %lu Flags %lu SampleSize %lu Reserved %lu KSDATAFORMAT %lu\n", Index, - Descriptor->PinDescriptor.DataRanges[Index]->FormatSize, Descriptor->PinDescriptor.DataRanges[Index]->Flags, Descriptor->PinDescriptor.DataRanges[Index]->SampleSize, Descriptor->PinDescriptor.DataRanges[Index]->Reserved, sizeof(KSDATAFORMAT)); - - if (IsEqualGUIDAligned(&Descriptor->PinDescriptor.DataRanges[Index]->SubFormat, &KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT)) - { - PKS_DATARANGE_BDA_TRANSPORT Transport = (PKS_DATARANGE_BDA_TRANSPORT)&Descriptor->PinDescriptor.DataRanges[Index]; - DPRINT("KSDATAFORMAT_SUBTYPE_BDA_MPEG2_TRANSPORT AvgTimePerFrame %I64u ulcbPhyiscalFrame %lu ulcbPhyiscalFrameAlignment %lu ulcbPhyiscalPacket %lu\n", Transport->BdaTransportInfo.AvgTimePerFrame, Transport->BdaTransportInfo.ulcbPhyiscalFrame, - Transport->BdaTransportInfo.ulcbPhyiscalFrameAlignment, Transport->BdaTransportInfo.ulcbPhyiscalPacket); - } - } - if (!FrameSize) - { - /* default to 50 * 188 (MPEG2 TS packet size) */ - FrameSize = 9400; - } - - if (!NumFrames) - { - NumFrames = 8; - } + DPRINT("KspCreatePin\n"); /* get current irp stack */ IoStack = IoGetCurrentIrpStackLocation(Irp); @@ -2376,7 +1168,7 @@ KspCreatePin( DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; /* get ks device interface */ - Device = (IKsDevice*)&DeviceExtension->DeviceHeader->BasicHeader.OuterUnknown; + Device = (IKsDevice*)&DeviceExtension->DeviceHeader->lpVtblIKsDevice; /* first allocate pin ctx */ This = AllocateItem(NonPagedPool, sizeof(IKsPinImpl)); @@ -2400,31 +1192,19 @@ KspCreatePin( This->BasicHeader.KsDevice = KsDevice; This->BasicHeader.Type = KsObjectTypePin; This->BasicHeader.Parent.KsFilter = Filter->lpVtbl->GetStruct(Filter); - This->BasicHeader.OuterUnknown = (PUNKNOWN)&vt_IKsPin; - InitializeListHead(&This->BasicHeader.EventList); - KeInitializeSpinLock(&This->BasicHeader.EventListLock); - - ASSERT(This->BasicHeader.Parent.KsFilter); - - BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)This->BasicHeader.Parent.KsFilter - sizeof(KSBASIC_HEADER)); - - This->BasicHeader.ControlMutex = BasicHeader->ControlMutex; - ASSERT(This->BasicHeader.ControlMutex); - + KeInitializeMutex(&This->BasicHeader.ControlMutex, 0); InitializeListHead(&This->BasicHeader.EventList); KeInitializeSpinLock(&This->BasicHeader.EventListLock); /* initialize pin */ - This->FrameSize = FrameSize; - This->NumFrames = NumFrames; - This->lpVtblReferenceClock = &vt_ReferenceClock; + This->lpVtbl = &vt_IKsPin; This->ref = 1; This->FileObject = IoStack->FileObject; - This->Filter = Filter; KeInitializeMutex(&This->ProcessingMutex, 0); InitializeListHead(&This->IrpList); KeInitializeSpinLock(&This->IrpListLock); + /* allocate object bag */ This->Pin.Bag = AllocateItem(NonPagedPool, sizeof(KSIOBJECT_BAG)); if (!This->Pin.Bag) @@ -2436,45 +1216,13 @@ KspCreatePin( } /* initialize object bag */ - Device->lpVtbl->InitializeObjectBag(Device, This->Pin.Bag, NULL); - - /* allocate pin descriptor */ - This->Pin.Descriptor = AllocateItem(NonPagedPool, sizeof(KSPIN_DESCRIPTOR_EX)); - if (!This->Pin.Descriptor) - { - /* not enough memory */ - KsFreeObjectBag(This->Pin.Bag); - FreeItem(This); - FreeItem(CreateItem); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* copy pin descriptor */ - RtlMoveMemory((PVOID)This->Pin.Descriptor, Descriptor, sizeof(KSPIN_DESCRIPTOR_EX)); - - /* initialize automation table */ - RtlZeroMemory(&AutomationTable, sizeof(KSAUTOMATION_TABLE)); - - AutomationTable.PropertyItemSize = sizeof(KSPROPERTY_ITEM); - AutomationTable.PropertySets = PinPropertySet; - AutomationTable.PropertySetsCount = sizeof(PinPropertySet) / sizeof(KSPROPERTY_SET); - - /* merge in pin property sets */ - Status = KsMergeAutomationTables((PKSAUTOMATION_TABLE*)&This->Pin.Descriptor->AutomationTable, (PKSAUTOMATION_TABLE)Descriptor->AutomationTable, &AutomationTable, This->Pin.Bag); - - if (!NT_SUCCESS(Status)) - { - /* not enough memory */ - KsFreeObjectBag(This->Pin.Bag); - FreeItem(This); - FreeItem(CreateItem); - return Status; - } + Device->lpVtbl->InitializeObjectBag(Device, This->Pin.Bag, &This->BasicHeader.ControlMutex); /* is using control mutex right? */ /* get format */ DataFormat = (PKSDATAFORMAT)(Connect + 1); - /* initialize pin descriptor */ + /* initialize ks pin descriptor */ + This->Pin.Descriptor = Descriptor; This->Pin.Context = NULL; This->Pin.Id = Connect->PinId; This->Pin.Communication = Descriptor->PinDescriptor.Communication; @@ -2505,19 +1253,19 @@ KspCreatePin( This->Pin.ClientState = KSSTATE_STOP; /* intialize allocator create item */ - CreateItem[0].Context = (PVOID)&This->Pin; + CreateItem[0].Context = (PVOID)This; CreateItem[0].Create = IKsPin_DispatchCreateAllocator; CreateItem[0].Flags = KSCREATE_ITEM_FREEONSTOP; RtlInitUnicodeString(&CreateItem[0].ObjectClass, KSSTRING_Allocator); /* intialize clock create item */ - CreateItem[1].Context = (PVOID)&This->Pin; + CreateItem[1].Context = (PVOID)This; CreateItem[1].Create = IKsPin_DispatchCreateClock; CreateItem[1].Flags = KSCREATE_ITEM_FREEONSTOP; RtlInitUnicodeString(&CreateItem[1].ObjectClass, KSSTRING_Clock); /* intialize topology node create item */ - CreateItem[2].Context = (PVOID)&This->Pin; + CreateItem[2].Context = (PVOID)This; CreateItem[2].Create = IKsPin_DispatchCreateNode; CreateItem[2].Flags = KSCREATE_ITEM_FREEONSTOP; RtlInitUnicodeString(&CreateItem[2].ObjectClass, KSSTRING_TopologyNode); @@ -2538,24 +1286,18 @@ KspCreatePin( /* add extra info to object header */ This->ObjectHeader->Type = KsObjectTypePin; - This->ObjectHeader->Unknown = (PUNKNOWN)&This->BasicHeader.OuterUnknown; + This->ObjectHeader->Unknown = (PUNKNOWN)&This->lpVtbl; This->ObjectHeader->ObjectType = (PVOID)&This->Pin; + /* setup process pin */ + This->ProcessPin.Pin = &This->Pin; + This->ProcessPin.StreamPointer = (PKSSTREAM_POINTER)This->LeadingEdgeStreamPointer; + if (!Descriptor->Dispatch || !Descriptor->Dispatch->Process) { /* the pin is part of filter-centric processing filter * add process pin to filter */ - This->ProcessPin.BytesAvailable = 0; - This->ProcessPin.BytesUsed = 0; - This->ProcessPin.CopySource = NULL; - This->ProcessPin.Data = NULL; - This->ProcessPin.DelegateBranch = NULL; - This->ProcessPin.Flags = 0; - This->ProcessPin.InPlaceCounterpart = NULL; - This->ProcessPin.Pin = &This->Pin; - This->ProcessPin.StreamPointer = (PKSSTREAM_POINTER)&This->LeadingEdgeStreamPointer.StreamPointer; - This->ProcessPin.Terminate = FALSE; Status = Filter->lpVtbl->AddProcessPin(Filter, &This->ProcessPin); DPRINT("KspCreatePin AddProcessPin %lx\n", Status); @@ -2565,51 +1307,13 @@ KspCreatePin( /* failed to add process pin */ KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag); KsFreeObjectHeader(&This->ObjectHeader); - FreeItem(This); - FreeItem(CreateItem); - /* return failure code */ - return Status; - } - } - else if (Descriptor->Dispatch && Descriptor->Dispatch->Process) - { - /* pin centric processing filter */ - /* initialize work item */ - ExInitializeWorkItem(&This->PinWorkQueueItem, IKsPin_PinCentricWorker, (PVOID)This); - - /* allocate counted work item */ - Status = KsRegisterCountedWorker(HyperCriticalWorkQueue, &This->PinWorkQueueItem, &This->PinWorker); - - if (!NT_SUCCESS(Status)) - { - DPRINT("Failed to register Worker %lx\n", Status); - KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag); - KsFreeObjectHeader(&This->ObjectHeader); - FreeItem(This); - FreeItem(CreateItem); + /* return failure code */ return Status; } - - if (This->Pin.Descriptor->PinDescriptor.DataFlow == KSPIN_DATAFLOW_IN) - This->LeadingEdgeStreamPointer.StreamPointer.Offset = &This->LeadingEdgeStreamPointer.StreamPointer.OffsetIn; - else - This->LeadingEdgeStreamPointer.StreamPointer.Offset = &This->LeadingEdgeStreamPointer.StreamPointer.OffsetOut; - - - KeInitializeEvent(&This->FrameComplete, NotificationEvent, FALSE); - } /* FIXME add pin instance to filter instance */ - IKsFilter_AddPin(Filter->lpVtbl->GetStruct(Filter), &This->Pin); - - if (Descriptor->Dispatch && Descriptor->Dispatch->SetDataFormat) - { - Status = Descriptor->Dispatch->SetDataFormat(&This->Pin, NULL, NULL, This->Pin.ConnectionFormat, NULL); - DPRINT("KspCreatePin SetDataFormat %lx\n", Status); - } - /* does the driver have a pin dispatch */ if (Descriptor->Dispatch && Descriptor->Dispatch->Create) @@ -2619,13 +1323,11 @@ KspCreatePin( DPRINT("KspCreatePin DispatchCreate %lx\n", Status); } - - DPRINT("KspCreatePin Status %lx KsDevice %p\n", Status, KsDevice); + DPRINT("KspCreatePin Status %lx\n", Status); if (!NT_SUCCESS(Status) && Status != STATUS_PENDING) { /* failed to create pin, release resources */ - IKsFilter_RemovePin(Filter->lpVtbl->GetStruct(Filter), &This->Pin); KsFreeObjectHeader((KSOBJECT_HEADER)This->ObjectHeader); KsFreeObjectBag((KSOBJECT_BAG)This->Pin.Bag); FreeItem(This); diff --git a/drivers/ksfilter/ks/priv.h b/drivers/ksfilter/ks/priv.h index 75b514158cc..cc0b8f95fef 100644 --- a/drivers/ksfilter/ks/priv.h +++ b/drivers/ksfilter/ks/priv.h @@ -5,7 +5,6 @@ #include #include #define NDEBUG -//#define YDEBUG #include #include #include @@ -17,12 +16,8 @@ #include "kstypes.h" #include "ksiface.h" -#include "ksmedia.h" -#include "bdamedia.h" #define TAG_DEVICE_HEADER 'KSDH' -#define REG_PINFLAG_B_MANY 0x4 /* strmif.h */ -#define MERIT_DO_NOT_USE 0x200000 /* dshow.h */ #define DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PinSet,\ PropGeneral, PropInstances, PropIntersection)\ @@ -40,24 +35,3 @@ DEFINE_KSPROPERTY_TABLE(PinSet) {\ DEFINE_KSPROPERTY_ITEM_PIN_CONSTRAINEDDATARANGES(PropGeneral),\ DEFINE_KSPROPERTY_ITEM_PIN_PROPOSEDATAFORMAT(PropGeneral)\ } - -#define DEFINE_KSPROPERTY_CONNECTIONSET(PinSet,\ - PropStateHandler, PropDataFormatHandler, PropAllocatorFraming)\ -DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_CONNECTION_STATE(PropStateHandler, PropStateHandler),\ - DEFINE_KSPROPERTY_ITEM_CONNECTION_DATAFORMAT(PropDataFormatHandler, PropDataFormatHandler),\ - DEFINE_KSPROPERTY_ITEM_CONNECTION_ALLOCATORFRAMING_EX(PropAllocatorFraming)\ -} - - -#define DEFINE_KSPROPERTY_STREAMSET(PinSet,\ - PropStreamAllocator, PropMasterClock, PropPipeId)\ -DEFINE_KSPROPERTY_TABLE(PinSet) {\ - DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(PropStreamAllocator, PropStreamAllocator),\ - DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(PropMasterClock, PropMasterClock),\ - DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(PropPipeId, PropPipeId)\ -} - - - - diff --git a/drivers/ksfilter/ks/property.c b/drivers/ksfilter/ks/property.c index b1a17e3ed09..a2e759ca07a 100644 --- a/drivers/ksfilter/ks/property.c +++ b/drivers/ksfilter/ks/property.c @@ -137,7 +137,7 @@ KspPropertyHandler( /* get input property request */ Property = (PKSPROPERTY)IoStack->Parameters.DeviceIoControl.Type3InputBuffer; -// DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); + DPRINT("KspPropertyHandler Irp %p PropertySetsCount %u PropertySet %p Allocator %p PropertyItemSize %u ExpectedPropertyItemSize %u\n", Irp, PropertySetsCount, PropertySet, Allocator, PropertyItemSize, sizeof(KSPROPERTY_ITEM)); /* sanity check */ ASSERT(PropertyItemSize == 0 || PropertyItemSize == sizeof(KSPROPERTY_ITEM)); diff --git a/drivers/ksfilter/ks/topology.c b/drivers/ksfilter/ks/topology.c index cc4a88880e7..87eb1e97c98 100644 --- a/drivers/ksfilter/ks/topology.c +++ b/drivers/ksfilter/ks/topology.c @@ -270,3 +270,13 @@ KsTopologyPropertyHandler( return Status; } +NTSTATUS +NTAPI +KspTopologyPropertyHandler( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data) +{ + + return STATUS_NOT_IMPLEMENTED; +} diff --git a/drivers/multimedia/bdasup/precomp.h b/drivers/multimedia/bdasup/precomp.h index 45a603ddecd..db581728221 100644 --- a/drivers/multimedia/bdasup/precomp.h +++ b/drivers/multimedia/bdasup/precomp.h @@ -3,9 +3,6 @@ #include #include #include -#define NOBITMAP -#include -#include #include #include #include diff --git a/drivers/network/afd/afd/lock.c b/drivers/network/afd/afd/lock.c index dcc4f24089a..7605f8d0774 100644 --- a/drivers/network/afd/afd/lock.c +++ b/drivers/network/afd/afd/lock.c @@ -17,10 +17,6 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) { BOOLEAN LockFailed = FALSE; - ASSERT(IrpSp->Parameters.DeviceIoControl.Type3InputBuffer); - ASSERT(IrpSp->Parameters.DeviceIoControl.InputBufferLength); - ASSERT(!Irp->MdlAddress); - Irp->MdlAddress = IoAllocateMdl( IrpSp->Parameters.DeviceIoControl.Type3InputBuffer, IrpSp->Parameters.DeviceIoControl.InputBufferLength, diff --git a/drivers/network/ndis/ndis.def b/drivers/network/ndis/ndis.def new file mode 100644 index 00000000000..5eba1a29842 --- /dev/null +++ b/drivers/network/ndis/ndis.def @@ -0,0 +1,298 @@ +; NDIS Kernel Module - ReactOS Operating System + +LIBRARY NDIS.SYS + +EXPORTS +ArcFilterDprIndicateReceive@16 +ArcFilterDprIndicateReceiveComplete@4 +EthFilterDprIndicateReceive@32 +EthFilterDprIndicateReceiveComplete@4 +FddiFilterDprIndicateReceive@36 +FddiFilterDprIndicateReceiveComplete@4 +NDIS_BUFFER_TO_SPAN_PAGES@4 +NdisAcquireReadWriteLock@12 +NdisAcquireSpinLock@4 +NdisAdjustBufferLength@8 +NdisAllocateBuffer@20 +NdisAllocateBufferPool@12 +NdisAllocateDmaChannel@20 +NdisAllocateFromBlockPool@4 +NdisAllocateMemory@20 +NdisAllocateMemoryWithTag@12 +NdisAllocatePacket@12 +NdisAllocatePacketPool@16 +NdisAllocatePacketPoolEx@20 +NdisAllocateSharedMemory@20 +NdisAllocateSpinLock@4 +NdisAnsiStringToUnicodeString@8 +NdisBufferLength@4 +NdisBufferVirtualAddress@4 +NdisCancelSendPackets@8 +NdisCancelTimer@8 +NdisClAddParty@16 +NdisClCloseAddressFamily@4 +NdisClCloseCall@16 +NdisClDeregisterSap@4 +NdisClDropParty@12 +NdisClGetProtocolVcContextFromTapiCallId@12 +NdisClIncomingCallComplete@12 +NdisClMakeCall@16 +NdisClModifyCallQoS@8 +NdisClOpenAddressFamily@24 +NdisClRegisterSap@16 +NdisCloseAdapter@8 +NdisCloseConfiguration@4 +NdisCloseFile@4 +NdisCmActivateVc@8 +NdisCmAddPartyComplete@16 +NdisCmCloseAddressFamilyComplete@8 +NdisCmCloseCallComplete@12 +NdisCmDeactivateVc@4 +NdisCmDeregisterSapComplete@8 +NdisCmDispatchCallConnected@4 +NdisCmDispatchIncomingCall@12 +NdisCmDispatchIncomingCallQoSChange@8 +NdisCmDispatchIncomingCloseCall@16 +NdisCmDispatchIncomingDropParty@16 +NdisCmDropPartyComplete@8 +NdisCmMakeCallComplete@20 +NdisCmModifyCallQoSComplete@12 +NdisCmOpenAddressFamilyComplete@12 +NdisCmRegisterAddressFamily@16 +NdisCmRegisterSapComplete@12 +NdisCoAssignInstanceName@12 +NdisCoCreateVc@16 +NdisCoDeleteVc@4 +NdisCoGetTapiCallId@8 +NdisCoRequest@20 +NdisCoRequestComplete@20 +NdisCoSendPackets@12 +NdisCompareAnsiString@12 +NdisCompareUnicodeString@12 +NdisCompleteBindAdapter@12 +NdisCompleteCloseAdapter@8 +NdisCompleteDmaTransfer@24 +NdisCompleteOpenAdapter@12 +NdisCompletePnPEvent@12 +NdisCompleteQueryStatistics@12 +NdisCompleteUnbindAdapter@8 +NdisConvertStringToAtmAddress@12 +NdisCopyBuffer@24 +NdisCopyFromPacketToPacket@24 +NdisCopyFromPacketToPacketSafe@28 +NdisCreateBlockPool@16 +NdisDeregisterAdapter@4 +NdisDeregisterAdapterShutdownHandler@4 +NdisDeregisterMac@8 +NdisDeregisterProtocol@8 +NdisDeregisterTdiCallBack@0 +NdisDestroyBlockPool@4 +NdisDprAcquireSpinLock@4 +NdisDprAllocatePacket@12 +NdisDprAllocatePacketNonInterlocked@12 +NdisDprFreePacket@4 +NdisDprFreePacketNonInterlocked@4 +NdisDprReleaseSpinLock@4 +NdisEqualString@12 +NdisFreeBuffer@4 +NdisFreeBufferPool@4 +NdisFreeDmaChannel@4 +NdisFreeToBlockPool@4 +NdisFreeMemory@12 +NdisFreePacket@4 +NdisFreePacketPool@4 +NdisFreeSharedMemory@24 +NdisFreeSpinLock@4 +NdisGeneratePartialCancelId@0 +NdisGetBufferPhysicalArraySize@8 +NdisGetCurrentProcessorCounts@12 +NdisGetCurrentProcessorCpuUsage@4 +NdisGetCurrentSystemTime@4 +NdisGetDriverHandle@8 +NdisGetFirstBufferFromPacket@20 +NdisGetFirstBufferFromPacketSafe@24 +NdisGetPacketCancelId@4 +NdisGetPoolFromPacket@4 +NdisGetReceivedPacket@8 +NdisGetRoutineAddress@4 +NdisGetSharedDataAlignment@0 +NdisGetSystemUpTime@4 +NdisGetVersion@0 +NdisIMAssociateMiniport@8 +NdisIMCancelInitializeDeviceInstance@8 +NdisIMCopySendCompletePerPacketInfo@8 +NdisIMCopySendPerPacketInfo@8 +NdisIMDeInitializeDeviceInstance@4 +NdisIMDeregisterLayeredMiniport@4 +NdisIMGetBindingContext@4 +NdisIMGetCurrentPacketStack@8 +NdisIMGetDeviceContext@4 +NdisIMInitializeDeviceInstance@8 +NdisIMInitializeDeviceInstanceEx@12 +NdisIMNotifyPnPEvent@8 +NdisImmediateReadPciSlotInformation@20 +NdisImmediateReadPortUchar@12 +NdisImmediateReadPortUlong@12 +NdisImmediateReadPortUshort@12 +NdisImmediateReadSharedMemory@16 +NdisImmediateWritePciSlotInformation@20 +NdisImmediateWritePortUchar@12 +NdisImmediateWritePortUlong@12 +NdisImmediateWritePortUshort@12 +NdisImmediateWriteSharedMemory@16 +NdisIMQueueMiniportCallback@12 +NdisIMRegisterLayeredMiniport@16 +NdisIMRevertBack@8 +NdisIMSwitchToMiniport@8 +NdisInitAnsiString@8 +NdisInitializeEvent@4 +NdisInitializeReadWriteLock@4 +NdisInitializeString@8 +NdisInitializeTimer@12 +NdisInitializeWrapper@16 +NdisInitUnicodeString@8 +NdisInterlockedAddLargeInteger@16 +NdisInterlockedAddUlong@12 +NdisInterlockedDecrement@4 +NdisInterlockedIncrement@4 +NdisInterlockedInsertHeadList@12 +NdisInterlockedInsertTailList@12 +NdisInterlockedPopEntrySList@8 +NdisInterlockedPushEntrySList@12 +NdisInterlockedRemoveHeadList@8 +NdisMAllocateMapRegisters@20 +NdisMAllocateSharedMemory@20 +NdisMAllocateSharedMemoryAsync@16 +NdisMapFile@12 +NdisMapIoSpace@24 +;NdisMatchPdoWithPacket ? +NdisMCancelTimer@8 +NdisMCloseLog@4 +NdisMCmActivateVc@8 +NdisMCmCreateVc@16 +NdisMCmDeactivateVc@4 +NdisMCmDeleteVc@4 +NdisMCmRegisterAddressFamily@16 +NdisMCmRequest@16 +NdisMCoActivateVcComplete@12 +NdisMCoDeactivateVcComplete@8 +NdisMCoIndicateReceivePacket@12 +NdisMCoIndicateStatus@20 +NdisMCompleteBufferPhysicalMapping@12 +NdisMCoReceiveComplete@4 +NdisMCoRequestComplete@12 +NdisMCoSendComplete@12 +NdisMCreateLog@12 +NdisMDeregisterAdapterShutdownHandler@4 +NdisMDeregisterDevice@4 +NdisMDeregisterDmaChannel@4 +NdisMDeregisterInterrupt@4 +NdisMDeregisterIoPortRange@16 +NdisMFlushLog@4 +NdisMFreeMapRegisters@4 +NdisMFreeSharedMemory@24 +NdisMGetDeviceProperty@24 +NdisMGetDmaAlignment@4 +NdisMIndicateStatus@16 +NdisMIndicateStatusComplete@4 +NdisMInitializeScatterGatherDma@12 +NdisMInitializeTimer@16 +NdisMMapIoSpace@20 +NdisMPciAssignResources@12 +NdisMPromoteMiniport@4 +NdisMQueryAdapterInstanceName@8 +NdisMQueryAdapterResources@16 +NdisMQueryInformationComplete@8 +NdisMReadDmaCounter@4 +NdisMRegisterAdapterShutdownHandler@12 +NdisMRegisterDevice@24 +NdisMRegisterDmaChannel@24 +NdisMRegisterInterrupt@28 +NdisMRegisterIoPortRange@16 +NdisMRegisterMiniport@12 +NdisMRegisterUnloadHandler@8 +NdisMRemoveMiniport@4 +NdisMResetComplete@12 +NdisMSendComplete@12 +NdisMSendResourcesAvailable@4 +NdisMSetAttributes@16 +NdisMSetAttributesEx@20 +NdisMSetInformationComplete@8 +NdisMSetMiniportSecondary@8 +NdisMSetPeriodicTimer@8 +NdisMSetTimer@8 +NdisMSleep@4 +NdisMStartBufferPhysicalMapping@24 +NdisMSynchronizeWithInterrupt@12 +NdisMTransferDataComplete@16 +NdisMUnmapIoSpace@12 +NdisMWanIndicateReceive@20 +NdisMWanIndicateReceiveComplete@4 +NdisMWanSendComplete@12 +NdisMWriteLogData@12 +NdisOpenAdapter@44 +NdisOpenConfiguration@12 +NdisOpenConfigurationKeyByIndex@20 +NdisOpenConfigurationKeyByName@16 +NdisOpenFile@24 +NdisOpenProtocolConfiguration@12 +NdisOverrideBusNumber@12 +NdisPacketPoolUsage@4 +NdisPacketSize@4 +NdisPciAssignResources@20 +NdisQueryAdapterInstanceName@8 +NdisQueryBindInstanceName@8 +NdisQueryBuffer@12 +NdisQueryBufferOffset@12 +NdisQueryBufferSafe@16 +NdisQueryMapRegisterCount@8 +NdisQueryPendingIOCount@8 +NdisReadConfiguration@20 +NdisReadEisaSlotInformation@16 +NdisReadEisaSlotInformationEx@20 +NdisReadMcaPosInformation@16 +NdisReadNetworkAddress@16 +NdisReadPciSlotInformation@20 +NdisReadPcmciaAttributeMemory@16 +NdisReEnumerateProtocolBindings@4 +NdisRegisterAdapter@24 +NdisRegisterAdapterShutdownHandler@12 +NdisRegisterProtocol@16 +NdisRegisterTdiCallBack@8 +NdisReleaseAdapterResources@4 +NdisReleaseReadWriteLock@8 +NdisReleaseSpinLock@4 +NdisRequest@12 +NdisReset@8 +NdisResetEvent@4 +NdisReturnPackets@8 +NdisSend@12 +NdisSendPackets@12 +NdisSetEvent@4 +NdisSetPacketCancelId@8 +NdisSetPacketPoolProtocolId@8 +NdisSetPacketStatus@16 +NdisSetProtocolFilter@32 +NdisSetTimer@8 +NdisSetTimerEx@12 +NdisSetupDmaTransfer@24 +NdisSystemProcessorCount@0 +NdisTerminateWrapper@8 +NdisTransferData@28 +NdisUnchainBufferAtBack@8 +NdisUnchainBufferAtFront@8 +NdisUnicodeStringToAnsiString@8 +NdisUnmapFile@4 +NdisUpcaseUnicodeString@8 +NdisUpdateSharedMemory@20 +NdisWaitEvent@8 +NdisWriteConfiguration@16 +NdisWriteErrorLogEntry +NdisWriteEventLogEntry@28 +NdisWritePciSlotInformation@20 +NdisWritePcmciaAttributeMemory@16 +TrFilterDprIndicateReceive@28 +TrFilterDprIndicateReceiveComplete@4 +NdisScheduleWorkItem@4 + +; EOF diff --git a/drivers/network/ndis/ndis.rbuild b/drivers/network/ndis/ndis.rbuild index 38dadeff652..39eab407a43 100644 --- a/drivers/network/ndis/ndis.rbuild +++ b/drivers/network/ndis/ndis.rbuild @@ -1,7 +1,7 @@ - + include diff --git a/drivers/network/ndis/ndis.spec b/drivers/network/ndis/ndis.spec deleted file mode 100644 index bd3eaea56b9..00000000000 --- a/drivers/network/ndis/ndis.spec +++ /dev/null @@ -1,292 +0,0 @@ - - @ stdcall ArcFilterDprIndicateReceive(ptr ptr ptr long) - @ stdcall ArcFilterDprIndicateReceiveComplete(ptr) - @ stdcall EthFilterDprIndicateReceive(ptr ptr ptr ptr long ptr long long) - @ stdcall EthFilterDprIndicateReceiveComplete(ptr) - @ stdcall FddiFilterDprIndicateReceive(ptr ptr ptr long ptr long ptr long long) - @ stdcall FddiFilterDprIndicateReceiveComplete(ptr) - @ stdcall NDIS_BUFFER_TO_SPAN_PAGES(ptr) - @ stdcall NdisAcquireReadWriteLock(ptr long ptr) - @ stdcall NdisAcquireSpinLock(ptr) - @ stdcall NdisAdjustBufferLength(ptr long) - @ stdcall NdisAllocateBuffer(ptr ptr ptr ptr long) - @ stdcall NdisAllocateBufferPool(ptr ptr long) - @ stdcall NdisAllocateDmaChannel(ptr ptr ptr ptr long) - @ stdcall NdisAllocateMemory(ptr long long double) - @ stdcall NdisAllocateFromBlockPool(ptr) - @ stdcall NdisAllocateMemoryWithTag(ptr long long) - @ stdcall NdisAllocatePacket(ptr ptr ptr) - @ stdcall NdisAllocatePacketPool(ptr ptr long long) - @ stdcall NdisAllocatePacketPoolEx(ptr ptr long long long) - @ stdcall NdisAllocateSharedMemory(ptr long long ptr ptr) - @ stdcall NdisAllocateSpinLock(ptr) - @ stdcall NdisAnsiStringToUnicodeString(ptr ptr) - @ stdcall NdisBufferLength(ptr) - @ stdcall NdisBufferVirtualAddress(ptr) - @ stdcall NdisCancelSendPackets(ptr ptr) - @ stdcall NdisCancelTimer(ptr ptr) - @ stdcall NdisClAddParty(ptr ptr ptr ptr) - @ stdcall NdisClCloseAddressFamily(ptr) - @ stdcall NdisClCloseCall(ptr ptr ptr long) - @ stdcall NdisClDeregisterSap(ptr) - @ stdcall NdisClDropParty(ptr ptr long) - @ stdcall NdisClGetProtocolVcContextFromTapiCallId(double ptr) - @ stdcall NdisClIncomingCallComplete(long ptr ptr) - @ stdcall NdisClMakeCall(ptr ptr ptr ptr) - @ stdcall NdisClModifyCallQoS(ptr ptr) - @ stdcall NdisClOpenAddressFamily(ptr ptr ptr ptr long ptr) - @ stdcall NdisClRegisterSap(ptr ptr ptr ptr) - @ stdcall NdisCloseAdapter(ptr ptr) - @ stdcall NdisCloseConfiguration(ptr) - @ stdcall NdisCloseFile(ptr) - @ stdcall NdisCmActivateVc(ptr ptr) - @ stdcall NdisCmAddPartyComplete(long ptr ptr ptr) - @ stdcall NdisCmCloseAddressFamilyComplete(long ptr) - @ stdcall NdisCmCloseCallComplete(long ptr ptr) - @ stdcall NdisCmDeactivateVc(ptr) - @ stdcall NdisCmDeregisterSapComplete(long ptr) - @ stdcall NdisCmDispatchCallConnected(ptr) - @ stdcall NdisCmDispatchIncomingCall(ptr ptr ptr) - @ stdcall NdisCmDispatchIncomingCallQoSChange(ptr ptr) - @ stdcall NdisCmDispatchIncomingCloseCall(long ptr ptr long) - @ stdcall NdisCmDispatchIncomingDropParty(ptr ptr ptr long) - @ stdcall NdisCmDropPartyComplete(long ptr) - @ stdcall NdisCmMakeCallComplete(long ptr ptr ptr ptr) - @ stdcall NdisCmModifyCallQoSComplete(long ptr ptr) - @ stdcall NdisCmOpenAddressFamilyComplete(long ptr ptr) - @ stdcall NdisCmRegisterAddressFamily(ptr ptr ptr long) - @ stdcall NdisCmRegisterSapComplete(long ptr ptr) - @ stdcall NdisCoAssignInstanceName(ptr ptr ptr) - @ stdcall NdisCoCreateVc(ptr ptr ptr ptr) - @ stdcall NdisCoDeleteVc(ptr) - @ stdcall NdisCoGetTapiCallId(ptr ptr) - @ stdcall NdisCoRequest(ptr ptr ptr ptr ptr) - @ stdcall NdisCoRequestComplete(long ptr ptr ptr ptr) - @ stdcall NdisCoSendPackets(ptr ptr long) - @ stdcall NdisCompareAnsiString(ptr ptr long) - @ stdcall NdisCompareUnicodeString(ptr ptr long) - @ stdcall NdisCompleteBindAdapter(ptr long long) - @ stdcall NdisCompleteCloseAdapter(ptr long) - @ stdcall NdisCompleteDmaTransfer(ptr ptr ptr long long long) - @ stdcall NdisCompleteOpenAdapter(ptr long long) - @ stdcall NdisCompletePnPEvent(long ptr ptr) - @ stdcall NdisCompleteQueryStatistics(ptr ptr long) - @ stdcall NdisCompleteUnbindAdapter(ptr long) - @ stdcall NdisConvertStringToAtmAddress(ptr ptr ptr) - @ stdcall NdisCopyBuffer(ptr ptr ptr ptr long long) - @ stdcall NdisCopyFromPacketToPacket(ptr long long ptr long ptr) - @ stdcall NdisCopyFromPacketToPacketSafe(ptr long long ptr long ptr long) - @ stdcall NdisCreateBlockPool(long long long ptr) - @ stdcall NdisDeregisterAdapter(ptr) - @ stdcall NdisDeregisterAdapterShutdownHandler(ptr) - @ stdcall NdisDeregisterMac(ptr ptr) - @ stdcall NdisDeregisterProtocol(ptr ptr) - @ stdcall NdisDeregisterTdiCallBack() - @ stdcall NdisDestroyBlockPool(ptr) - @ stdcall NdisDprAcquireSpinLock(ptr) - @ stdcall NdisDprAllocatePacket(ptr ptr ptr) - @ stdcall NdisDprAllocatePacketNonInterlocked(ptr ptr ptr) - @ stdcall NdisDprFreePacket(ptr) - @ stdcall NdisDprFreePacketNonInterlocked(ptr) - @ stdcall NdisDprReleaseSpinLock(ptr) - @ stdcall NdisEqualString(ptr ptr long) - @ stdcall NdisFreeBuffer(ptr) - @ stdcall NdisFreeBufferPool(ptr) - @ stdcall NdisFreeDmaChannel(ptr) - @ stdcall NdisFreeToBlockPool(ptr) - @ stdcall NdisFreeMemory(ptr long long) - @ stdcall NdisFreePacket(ptr) - @ stdcall NdisFreePacketPool(ptr) - @ stdcall NdisFreeSharedMemory(ptr long long ptr double) - @ stdcall NdisFreeSpinLock(ptr) - @ stdcall NdisGeneratePartialCancelId() - @ stdcall NdisGetBufferPhysicalArraySize(ptr ptr) - @ stdcall NdisGetCurrentProcessorCounts(ptr ptr ptr) - @ stdcall NdisGetCurrentProcessorCpuUsage(ptr) - @ stdcall NdisGetCurrentSystemTime(ptr) - @ stdcall NdisGetDriverHandle(ptr ptr) - @ stdcall NdisGetFirstBufferFromPacket(ptr ptr ptr ptr ptr) - @ stdcall NdisGetFirstBufferFromPacketSafe(ptr ptr ptr ptr ptr long) - @ stdcall NdisGetPacketCancelId(ptr) - @ stdcall NdisGetPoolFromPacket(ptr) - @ stdcall NdisGetReceivedPacket(ptr ptr) - @ stdcall NdisGetRoutineAddress(ptr) - @ stdcall NdisGetSharedDataAlignment() - @ stdcall NdisGetSystemUpTime(ptr) - @ stdcall NdisGetVersion() - @ stdcall NdisIMAssociateMiniport(ptr ptr) - @ stdcall NdisIMCancelInitializeDeviceInstance(ptr ptr) - @ stdcall NdisIMCopySendCompletePerPacketInfo(ptr ptr) - @ stdcall NdisIMCopySendPerPacketInfo(ptr ptr) - @ stdcall NdisIMDeInitializeDeviceInstance(ptr) - @ stdcall NdisIMDeregisterLayeredMiniport(ptr) - @ stdcall NdisIMGetBindingContext(ptr) - @ stdcall NdisIMGetCurrentPacketStack(ptr ptr) - @ stdcall NdisIMGetDeviceContext(ptr) - @ stdcall NdisIMInitializeDeviceInstance(ptr ptr) - @ stdcall NdisIMInitializeDeviceInstanceEx(ptr ptr ptr) - @ stdcall NdisIMNotifyPnPEvent(ptr ptr) - @ stdcall NdisImmediateReadPciSlotInformation(ptr long long ptr long) - @ stdcall NdisImmediateReadPortUchar(ptr long ptr) - @ stdcall NdisImmediateReadPortUlong(ptr long ptr) - @ stdcall NdisImmediateReadPortUshort(ptr long ptr) - @ stdcall NdisImmediateReadSharedMemory(ptr long ptr long) - @ stdcall NdisImmediateWritePciSlotInformation(ptr long long ptr long) - @ stdcall NdisImmediateWritePortUchar(ptr long long) - @ stdcall NdisImmediateWritePortUlong(ptr long long) - @ stdcall NdisImmediateWritePortUshort(ptr long long) - @ stdcall NdisImmediateWriteSharedMemory(ptr long ptr long) - @ stdcall NdisIMQueueMiniportCallback(ptr ptr ptr) - @ stdcall NdisIMRegisterLayeredMiniport(ptr ptr long ptr) - @ stdcall NdisIMRevertBack(ptr ptr) - @ stdcall NdisIMSwitchToMiniport(ptr ptr) - @ stdcall NdisInitAnsiString(ptr ptr) - @ stdcall NdisInitializeEvent(ptr) - @ stdcall NdisInitializeReadWriteLock(ptr) - @ stdcall NdisInitializeString(ptr ptr) - @ stdcall NdisInitializeTimer(ptr ptr ptr) - @ stdcall NdisInitializeWrapper(ptr ptr ptr ptr) - @ stdcall NdisInitUnicodeString(ptr ptr) - @ stdcall NdisInterlockedAddLargeInteger(ptr double ptr) - @ stdcall NdisInterlockedAddUlong(ptr long ptr) - @ stdcall NdisInterlockedDecrement(ptr) - @ stdcall NdisInterlockedIncrement(ptr) - @ stdcall NdisInterlockedInsertHeadList(ptr ptr ptr) - @ stdcall NdisInterlockedInsertTailList(ptr ptr ptr) - @ stdcall NdisInterlockedPopEntrySList(ptr ptr) - @ stdcall NdisInterlockedPushEntrySList(ptr ptr ptr) - @ stdcall NdisInterlockedRemoveHeadList(ptr ptr) - @ stdcall NdisMAllocateMapRegisters(ptr long long long long) - @ stdcall NdisMAllocateSharedMemory(ptr long long ptr ptr) - @ stdcall NdisMAllocateSharedMemoryAsync(ptr long long ptr) - @ stdcall NdisMapFile(ptr ptr ptr) - @ stdcall NdisMapIoSpace(ptr ptr ptr double long) -# @ stdcall NdisMatchPdoWithPacket ? - @ stdcall NdisMCancelTimer(ptr ptr) - @ stdcall NdisMCloseLog(ptr) - @ stdcall NdisMCmActivateVc(ptr ptr) - @ stdcall NdisMCmCreateVc(ptr ptr ptr ptr) - @ stdcall NdisMCmDeactivateVc(ptr) - @ stdcall NdisMCmDeleteVc(ptr) - @ stdcall NdisMCmRegisterAddressFamily(ptr ptr ptr long) - @ stdcall NdisMCmRequest(ptr ptr ptr ptr) - @ stdcall NdisMCoActivateVcComplete(long ptr ptr) - @ stdcall NdisMCoDeactivateVcComplete(long ptr) - @ stdcall NdisMCoIndicateReceivePacket(ptr ptr long) - @ stdcall NdisMCoIndicateStatus(ptr ptr long ptr long) - @ stdcall NdisMCompleteBufferPhysicalMapping(ptr ptr long) - @ stdcall NdisMCoReceiveComplete(ptr) - @ stdcall NdisMCoRequestComplete(long ptr ptr) - @ stdcall NdisMCoSendComplete(ptr ptr ptr) - @ stdcall NdisMCreateLog(ptr long ptr) - @ stdcall NdisMDeregisterAdapterShutdownHandler(ptr) - @ stdcall NdisMDeregisterDevice(ptr) - @ stdcall NdisMDeregisterDmaChannel(ptr) - @ stdcall NdisMDeregisterInterrupt(ptr) - @ stdcall NdisMDeregisterIoPortRange(ptr long long ptr) - @ stdcall NdisMFlushLog(ptr) - @ stdcall NdisMFreeMapRegisters(ptr) - @ stdcall NdisMFreeSharedMemory(ptr long long ptr double) - @ stdcall NdisMGetDeviceProperty(ptr ptr ptr ptr ptr ptr) - @ stdcall NdisMGetDmaAlignment(ptr) - @ stdcall NdisMIndicateStatus(ptr long ptr long) - @ stdcall NdisMIndicateStatusComplete(ptr) - @ stdcall NdisMInitializeScatterGatherDma(ptr long long) - @ stdcall NdisMInitializeTimer(ptr ptr ptr ptr) - @ stdcall NdisMMapIoSpace(ptr ptr double long) - @ stdcall NdisMPciAssignResources(ptr long ptr) - @ stdcall NdisMPromoteMiniport(ptr) - @ stdcall NdisMQueryAdapterInstanceName(ptr ptr) - @ stdcall NdisMQueryAdapterResources(ptr ptr ptr ptr) - @ stdcall NdisMQueryInformationComplete(ptr long) - @ stdcall NdisMReadDmaCounter(ptr) - @ stdcall NdisMRegisterAdapterShutdownHandler(ptr ptr ptr) - @ stdcall NdisMRegisterDevice(ptr ptr ptr ptr ptr ptr) - @ stdcall NdisMRegisterDmaChannel(ptr ptr long long ptr long) - @ stdcall NdisMRegisterInterrupt(ptr ptr long long long long long) - @ stdcall NdisMRegisterIoPortRange(ptr ptr long long) - @ stdcall NdisMRegisterMiniport(ptr ptr long) - @ stdcall NdisMRegisterUnloadHandler(ptr ptr) - @ stdcall NdisMRemoveMiniport(ptr) - @ stdcall NdisMResetComplete(ptr long long) - @ stdcall NdisMSendComplete(ptr ptr long) - @ stdcall NdisMSendResourcesAvailable(ptr) - @ stdcall NdisMSetAttributes(ptr ptr long long) - @ stdcall NdisMSetAttributesEx(ptr ptr long long long) - @ stdcall NdisMSetInformationComplete(ptr long) - @ stdcall NdisMSetMiniportSecondary(ptr ptr) - @ stdcall NdisMSetPeriodicTimer(ptr long) - @ stdcall NdisMSetTimer(ptr long) - @ stdcall NdisMSleep(long) - @ stdcall NdisMStartBufferPhysicalMapping(ptr ptr long long ptr ptr) - @ stdcall NdisMSynchronizeWithInterrupt(ptr ptr ptr) - @ stdcall NdisMTransferDataComplete(ptr ptr long long) - @ stdcall NdisMUnmapIoSpace(ptr ptr long) - @ stdcall NdisMWanIndicateReceive(ptr ptr ptr ptr long) - @ stdcall NdisMWanIndicateReceiveComplete(ptr) - @ stdcall NdisMWanSendComplete(ptr ptr long) - @ stdcall NdisMWriteLogData(ptr ptr long) - @ stdcall NdisOpenAdapter(ptr ptr ptr ptr ptr long ptr ptr ptr long ptr) - @ stdcall NdisOpenConfiguration(ptr ptr ptr) - @ stdcall NdisOpenConfigurationKeyByIndex(ptr ptr long ptr ptr) - @ stdcall NdisOpenConfigurationKeyByName(ptr ptr ptr ptr) - @ stdcall NdisOpenFile(ptr ptr ptr ptr double) - @ stdcall NdisOpenProtocolConfiguration(ptr ptr ptr) - @ stdcall NdisOverrideBusNumber(ptr ptr long) - @ stdcall NdisPacketPoolUsage(ptr) - @ stdcall NdisPacketSize(long) - @ stdcall NdisPciAssignResources(ptr ptr ptr long ptr) - @ stdcall NdisQueryAdapterInstanceName(ptr ptr) - @ stdcall NdisQueryBindInstanceName(ptr ptr) - @ stdcall NdisQueryBuffer(ptr ptr ptr) - @ stdcall NdisQueryBufferOffset(ptr ptr ptr) - @ stdcall NdisQueryBufferSafe(ptr ptr ptr long) - @ stdcall NdisQueryMapRegisterCount(long ptr) - @ stdcall NdisQueryPendingIOCount(ptr ptr) - @ stdcall NdisReadConfiguration(ptr ptr ptr ptr long) - @ stdcall NdisReadEisaSlotInformation(ptr ptr ptr ptr) - @ stdcall NdisReadEisaSlotInformationEx(ptr ptr ptr ptr ptr) - @ stdcall NdisReadMcaPosInformation(ptr ptr ptr ptr) - @ stdcall NdisReadNetworkAddress(ptr ptr ptr ptr) - @ stdcall NdisReadPciSlotInformation(ptr long long ptr long) - @ stdcall NdisReadPcmciaAttributeMemory(ptr long ptr long) - @ stdcall NdisReEnumerateProtocolBindings(ptr) - @ stdcall NdisRegisterAdapter(ptr ptr ptr ptr ptr ptr) - @ stdcall NdisRegisterAdapterShutdownHandler(ptr ptr ptr) - @ stdcall NdisRegisterProtocol(ptr ptr ptr long) - @ stdcall NdisRegisterTdiCallBack(ptr ptr) - @ stdcall NdisReleaseAdapterResources(ptr) - @ stdcall NdisReleaseReadWriteLock(ptr ptr) - @ stdcall NdisReleaseSpinLock(ptr) - @ stdcall NdisRequest(ptr ptr ptr) - @ stdcall NdisReset(ptr ptr) - @ stdcall NdisResetEvent(ptr) - @ stdcall NdisReturnPackets(ptr long) - @ stdcall NdisSend(ptr ptr ptr) - @ stdcall NdisSendPackets(ptr ptr long) - @ stdcall NdisSetEvent(ptr) - @ stdcall NdisSetPacketCancelId(ptr ptr) - @ stdcall NdisSetPacketPoolProtocolId(ptr long) - @ stdcall NdisSetPacketStatus(ptr long ptr long) - @ stdcall NdisSetProtocolFilter(ptr ptr ptr ptr long long long ptr) - @ stdcall NdisSetTimer(ptr long) - @ stdcall NdisSetTimerEx(ptr long ptr) - @ stdcall NdisSetupDmaTransfer(ptr ptr ptr long long long) - @ stdcall NdisSystemProcessorCount() - @ stdcall NdisTerminateWrapper(ptr ptr) - @ stdcall NdisTransferData(ptr ptr ptr long long ptr ptr) - @ stdcall NdisUnchainBufferAtBack(ptr ptr) - @ stdcall NdisUnchainBufferAtFront(ptr ptr) - @ stdcall NdisUnicodeStringToAnsiString(ptr ptr) - @ stdcall NdisUnmapFile(ptr) - @ stdcall NdisUpcaseUnicodeString(ptr ptr) - @ stdcall NdisUpdateSharedMemory(ptr long ptr double) - @ stdcall NdisWaitEvent(ptr long) - @ stdcall NdisWriteConfiguration(ptr ptr ptr ptr) - @ cdecl NdisWriteErrorLogEntry(ptr long long) - @ stdcall NdisWriteEventLogEntry(ptr long long long ptr long ptr) - @ stdcall NdisWritePciSlotInformation(ptr long long ptr long) - @ stdcall NdisWritePcmciaAttributeMemory(ptr long ptr long) - @ stdcall TrFilterDprIndicateReceive(ptr ptr ptr long ptr long long) - @ stdcall TrFilterDprIndicateReceiveComplete(ptr) - @ stdcall NdisScheduleWorkItem(ptr) diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c index daaf7cac1b1..2a9934c355e 100644 --- a/drivers/network/ndis/ndis/miniport.c +++ b/drivers/network/ndis/ndis/miniport.c @@ -1722,20 +1722,6 @@ NdisIForwardIrpAndWait(PLOGICAL_ADAPTER Adapter, PIRP Irp) return Status; } -NTSTATUS -NTAPI -NdisICreateClose( - IN PDEVICE_OBJECT DeviceObject, - IN PIRP Irp) -{ - Irp->IoStatus.Status = STATUS_SUCCESS; - Irp->IoStatus.Information = 0; - - IoCompleteRequest(Irp, IO_NO_INCREMENT); - - return STATUS_SUCCESS; -} - NTSTATUS NTAPI @@ -2513,8 +2499,6 @@ NdisMRegisterMiniport( *MiniportPtr = Miniport; - Miniport->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose; - Miniport->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose; Miniport->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; Miniport->DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = NdisIShutdown; Miniport->DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = NdisIDeviceIoControl; @@ -2976,12 +2960,6 @@ NdisMRegisterDevice( DriverBlock->DriverObject->MajorFunction[IRP_MJ_PNP] = NdisIDispatchPnp; - if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE]) - DriverBlock->DriverObject->MajorFunction[IRP_MJ_CREATE] = NdisICreateClose; - - if (!DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE]) - DriverBlock->DriverObject->MajorFunction[IRP_MJ_CLOSE] = NdisICreateClose; - DeviceBlock->DeviceObject = DeviceObject; DeviceBlock->SymbolicName = SymbolicName; diff --git a/drivers/network/tdi/misc/tdi.def b/drivers/network/tdi/misc/tdi.def new file mode 100644 index 00000000000..4f10551a4e6 --- /dev/null +++ b/drivers/network/tdi/misc/tdi.def @@ -0,0 +1,47 @@ +; $Id$ +; +; TDI.SYS Kernel Module - ReactOS Operating System +; +LIBRARY TDI.SYS + +EXPORTS +CTEAllocateString@8 +CTEBlock@4 +CTEInitEvent@8 +CTEInitString@8 +CTEInitTimer@4 +CTEInitialize@0 +CTELogEvent@28 +CTEScheduleEvent@8 +CTESignal@8 +CTEStartTimer@16 +CTESystemUpTime@0 +TdiBuildNetbiosAddress@12 +TdiBuildNetbiosAddressEa@12 +TdiCopyBufferToMdl@24 +TdiCopyMdlToBuffer@24 +TdiDefaultChainedRcvDatagramHandler@40 +TdiDefaultChainedRcvExpeditedHandler@28 +TdiDefaultChainedReceiveHandler@28 +TdiDefaultConnectHandler@36 +TdiDefaultDisconnectHandler@28 +TdiDefaultErrorHandler@8 +TdiDefaultRcvDatagramHandler@44 +TdiDefaultRcvExpeditedHandler@32 +TdiDefaultReceiveHandler@32 +TdiDefaultSendPossibleHandler@12 +TdiDeregisterAddressChangeHandler@4 +TdiDeregisterDeviceObject@4 +TdiDeregisterNetAddress@4 +TdiDeregisterNotificationHandler@4 +TdiInitialize@4 +TdiMapBuffer@4 +TdiMapUserRequest@12 +TdiOpenNetbiosAddress@16 +TdiRegisterAddressChangeHandler@12 +TdiRegisterDeviceObject@8 +TdiRegisterNetAddress@8 +TdiRegisterNotificationHandler@12 +TdiReturnChainedReceives@8 +TdiUnmapBuffer@4 +; EOF diff --git a/drivers/network/tdi/misc/tdi.spec b/drivers/network/tdi/misc/tdi.spec deleted file mode 100644 index a1810644793..00000000000 --- a/drivers/network/tdi/misc/tdi.spec +++ /dev/null @@ -1,39 +0,0 @@ - @ stdcall CTEAllocateString(long long) - @ stdcall CTEBlock(long) - @ stdcall CTEInitEvent(long long) - @ stdcall CTEInitString(long long) - @ stdcall CTEInitTimer(long) - @ stdcall CTEInitialize() - @ stdcall CTELogEvent(long long long long long long long) - @ stdcall CTEScheduleEvent(long long) - @ stdcall CTESignal(long long) - @ stdcall CTEStartTimer(long long long long) - @ stdcall CTESystemUpTime() - @ stdcall TdiBuildNetbiosAddress(str long ptr) - @ stdcall TdiBuildNetbiosAddressEa(str long str) - @ stdcall TdiCopyBufferToMdl(ptr long long ptr long ptr) - @ stdcall TdiCopyMdlToBuffer(ptr long long ptr long ptr) - @ stdcall TdiDefaultChainedRcvDatagramHandler(ptr long ptr long ptr long long long ptr ptr) - @ stdcall TdiDefaultChainedRcvExpeditedHandler(ptr ptr long long long ptr ptr) - @ stdcall TdiDefaultChainedReceiveHandler(ptr ptr long long long ptr ptr) - @ stdcall TdiDefaultConnectHandler(ptr long ptr long ptr long ptr ptr ptr) - @ stdcall TdiDefaultDisconnectHandler(ptr ptr long ptr long ptr long) - @ stdcall TdiDefaultErrorHandler(ptr long) - @ stdcall TdiDefaultRcvDatagramHandler(ptr long ptr long ptr long long long ptr ptr ptr) - @ stdcall TdiDefaultRcvExpeditedHandler(ptr ptr long long long ptr ptr ptr) - @ stdcall TdiDefaultReceiveHandler(ptr ptr long long long ptr ptr ptr) - @ stdcall TdiDefaultSendPossibleHandler(ptr ptr long) - @ stdcall TdiDeregisterAddressChangeHandler(ptr) - @ stdcall TdiDeregisterDeviceObject(ptr) - @ stdcall TdiDeregisterNetAddress(ptr) - @ stdcall TdiDeregisterNotificationHandler(ptr) - @ stdcall TdiInitialize(ptr) - @ stdcall TdiMapBuffer(ptr) - @ stdcall TdiMapUserRequest(ptr ptr ptr) - @ stdcall TdiOpenNetbiosAddress(long long long long) - @ stdcall TdiRegisterAddressChangeHandler(long long long) - @ stdcall TdiRegisterDeviceObject(long long) - @ stdcall TdiRegisterNetAddress(long long) - @ stdcall TdiRegisterNotificationHandler(long long long) - @ stdcall TdiReturnChainedReceives(ptr long) - @ stdcall TdiUnmapBuffer(ptr) diff --git a/drivers/network/tdi/tdi.rbuild b/drivers/network/tdi/tdi.rbuild index 1c658fa50f2..3a7b059938f 100644 --- a/drivers/network/tdi/tdi.rbuild +++ b/drivers/network/tdi/tdi.rbuild @@ -1,7 +1,7 @@ - + ntoskrnl hal diff --git a/drivers/storage/class/cdrom/cdrom.c b/drivers/storage/class/cdrom/cdrom.c index ef462658d7e..e5a51493139 100644 --- a/drivers/storage/class/cdrom/cdrom.c +++ b/drivers/storage/class/cdrom/cdrom.c @@ -5127,7 +5127,7 @@ Return Value: // The data buffer must be aligned. // - srb->DataBuffer = (PVOID) (((ULONG_PTR) (context + 1) + (alignment - 1)) & + srb->DataBuffer = (PVOID) (((ULONG) (context + 1) + (alignment - 1)) & ~(alignment - 1)); @@ -5877,7 +5877,7 @@ Return Value: irpStack = IoGetCurrentIrpStackLocation(irp); if (irpStack->Parameters.Others.Argument3) { - ULONG_PTR count; + ULONG count; // // Decrement the countdown timer and put the IRP back in the list. @@ -6497,7 +6497,7 @@ Return Value: PIO_STACK_LOCATION irpStack; NTSTATUS status; BOOLEAN retry; - ULONG_PTR retryCount; + ULONG retryCount; ULONG lastSector; PIRP originalIrp; PCDROM_DATA cddata; diff --git a/drivers/storage/class/ramdisk/ramdisk.c b/drivers/storage/class/ramdisk/ramdisk.c index 6a353bc264e..1ebe19664c8 100644 --- a/drivers/storage/class/ramdisk/ramdisk.c +++ b/drivers/storage/class/ramdisk/ramdisk.c @@ -2422,7 +2422,18 @@ DriverEntry(IN PDRIVER_OBJECT DriverObject, 0, &PhysicalDeviceObject); if (NT_SUCCESS(Status)) - { + { + // + // ReactOS Fix + // The ReactOS Plug and Play Manager is broken and does not create + // the required keys when reporting a detected device. + // We hack around this ourselves. + // + RtlCreateUnicodeString(&((PEXTENDED_DEVOBJ_EXTENSION) + PhysicalDeviceObject->DeviceObjectExtension) + ->DeviceNode->InstancePath, + L"Root\\UNKNOWN\\0000"); + // // Create the device object // diff --git a/drivers/storage/ide/uniata/id_ata.cpp b/drivers/storage/ide/uniata/id_ata.cpp index fb2bb028e87..1cace8bd488 100644 --- a/drivers/storage/ide/uniata/id_ata.cpp +++ b/drivers/storage/ide/uniata/id_ata.cpp @@ -537,10 +537,10 @@ WaitOnBaseBusy( { ULONG i; UCHAR Status; - for (i=0; i<20000; i++) { + for (i=0; i<200; i++) { GetBaseStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { - AtapiStallExecution(150); + AtapiStallExecution(10); continue; } else { break; @@ -640,11 +640,11 @@ WaitForDrq( for (i=0; i<1000; i++) { GetStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { - AtapiStallExecution(100); + AtapiStallExecution(10); } else if (Status & IDE_STATUS_DRQ) { break; } else { - AtapiStallExecution(200); + AtapiStallExecution(10); } } return Status; @@ -661,11 +661,11 @@ WaitShortForDrq( for (i=0; i<2; i++) { GetStatus(chan, Status); if (Status & IDE_STATUS_BUSY) { - AtapiStallExecution(100); + AtapiStallExecution(10); } else if (Status & IDE_STATUS_DRQ) { break; } else { - AtapiStallExecution(100); + AtapiStallExecution(10); } } return Status; diff --git a/drivers/usb/usbehci/common.c b/drivers/usb/usbehci/common.c index 7ed7421d8d8..79ecbadf25f 100644 --- a/drivers/usb/usbehci/common.c +++ b/drivers/usb/usbehci/common.c @@ -11,6 +11,8 @@ #include "usbehci.h" #include #include +#define NDEBUG +#include /* PUBLIC AND PRIVATE FUNCTIONS ***********************************************/ diff --git a/drivers/usb/usbehci/fdo.c b/drivers/usb/usbehci/fdo.c index c42ebfd1f56..b1ec5503cb6 100644 --- a/drivers/usb/usbehci/fdo.c +++ b/drivers/usb/usbehci/fdo.c @@ -11,6 +11,26 @@ #include "usbehci.h" #include +//#include "ntstrsafe.h" + +VOID NTAPI +DeviceArrivalWorkItem(PDEVICE_OBJECT DeviceObject, PVOID Context) +{ + PWORKITEM_DATA WorkItemData; + PPDO_DEVICE_EXTENSION PdoDeviceExtension; + + WorkItemData = (PWORKITEM_DATA)Context; + PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension; + + if (PdoDeviceExtension->CallbackRoutine) + PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext); + else + DPRINT1("PdoDeviceExtension->CallbackRoutine is NULL!\n"); + + IoFreeWorkItem(WorkItemData->IoWorkItem); + ExFreePool(WorkItemData); +} + VOID NTAPI EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) { @@ -40,6 +60,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO /* Check for port change on this port */ if (tmp & 0x02) { + PWORKITEM_DATA WorkItemData = NULL; /* Connect or Disconnect? */ if (tmp & 0x01) { @@ -62,11 +83,11 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO DPRINT1("Releasing ownership to companion host controller!\n"); /* Release ownership to companion host controller */ WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), 0x4000); - continue; } } KeStallExecutionProcessor(30); + DPRINT("port tmp %x\n", tmp); /* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */ tmp |= 0x100 | 0x02; @@ -79,12 +100,17 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO tmp = READ_REGISTER_ULONG((PULONG)((Base + EHCI_PORTSC) + (4 * i))); + GetDeviceDescriptor(FdoDeviceExtension, 0, 0, FALSE); PdoDeviceExtension->ChildDeviceCount++; - PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED | USB_PORT_STATUS_CONNECT; - PdoDeviceExtension->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT; - - PdoDeviceExtension->HaltQueue = FALSE; - KeSetEvent(&PdoDeviceExtension->QueueDrainedEvent, 0, FALSE); + PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED | USB_PORT_STATUS_CONNECT | USB_PORT_STATUS_ENABLE; + WorkItemData = ExAllocatePool(NonPagedPool, sizeof(WORKITEM_DATA)); + if (!WorkItemData) ASSERT(FALSE); + WorkItemData->IoWorkItem = IoAllocateWorkItem(PdoDeviceExtension->DeviceObject); + WorkItemData->PdoDeviceExtension = PdoDeviceExtension; + IoQueueWorkItem(WorkItemData->IoWorkItem, + (PIO_WORKITEM_ROUTINE)DeviceArrivalWorkItem, + DelayedWorkQueue, + WorkItemData); } else { @@ -519,7 +545,6 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART StartEhci(DeviceObject); FdoDeviceExtension->DeviceState = DEVICESTARTED; - return STATUS_SUCCESS; } @@ -585,10 +610,6 @@ FdoQueryBusRelations( InitializeListHead(&PdoDeviceExtension->IrpQueue); KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock); - KeInitializeEvent(&PdoDeviceExtension->QueueDrainedEvent, SynchronizationEvent, TRUE); - - ExInitializeFastMutex(&PdoDeviceExtension->ListLock); - Pdo->Flags &= ~DO_DEVICE_INITIALIZING; DeviceExtension->Pdo = Pdo; @@ -793,6 +814,7 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) IoDetachDevice(FdoDeviceExtension->LowerDevice); IoDeleteSymbolicLink(&SymLinkName); IoDeleteDevice(Fdo); + return STATUS_UNSUCCESSFUL; } @@ -818,14 +840,11 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo) if (!NT_SUCCESS(Status)) { DPRINT1("Unable to register device interface!\n"); - ASSERT(FALSE); } else { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); DPRINT1("SetInterfaceState %x\n", Status); - if (!NT_SUCCESS(Status)) - ASSERT(FALSE); } Fdo->Flags &= ~DO_DEVICE_INITIALIZING; diff --git a/drivers/usb/usbehci/irp.c b/drivers/usb/usbehci/irp.c index 99a601d8ebc..06d7c50ab08 100644 --- a/drivers/usb/usbehci/irp.c +++ b/drivers/usb/usbehci/irp.c @@ -62,26 +62,26 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); - while (!IsListEmpty(&DeviceExtension->IrpQueue)) + while(!IsListEmpty(&DeviceExtension->IrpQueue)) { NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue); Irp = CONTAINING_RECORD(NextIrp, IRP, Tail.Overlay.ListEntry); if (!Irp) break; + Stack = IoGetCurrentIrpStackLocation(Irp); ASSERT(Stack); Urb = (PURB) Stack->Parameters.Others.Argument1; - ASSERT(Urb); Information = 0; Status = STATUS_SUCCESS; - DPRINT("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); - DPRINT("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); - DPRINT("UsbdDeviceHandle = %x\n", Urb->UrbHeader.UsbdDeviceHandle); + DPRINT1("TransferBuffer %x\n", Urb->UrbControlDescriptorRequest.TransferBuffer); + DPRINT1("TransferBufferLength %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength); + DPRINT1("UsbdDeviceHandle = %x\n", Urb->UrbHeader.UsbdDeviceHandle); UsbDevice = Urb->UrbHeader.UsbdDeviceHandle; /* UsbdDeviceHandle of 0 is root hub */ @@ -97,15 +97,14 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: { - DPRINT("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); - DPRINT("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); - DPRINT("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer); - DPRINT("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle); - DPRINT("---->(PVOID)&UsbDevice->EndPointDescriptor %x\n", (PVOID)&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor); - DPRINT("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags); - ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); - RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n"); + DPRINT1("--->TransferBufferLength %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); + DPRINT1("--->TransferBuffer %x\n",Urb->UrbBulkOrInterruptTransfer.TransferBuffer); + DPRINT1("--->PipeHandle %x\n",Urb->UrbBulkOrInterruptTransfer.PipeHandle); + DPRINT1("---->(PVOID)&UsbDevice->EndPointDescriptor %x\n", (PVOID)&UsbDevice->EndPointDescriptor); + DPRINT1("--->TransferFlags %x\n", Urb->UrbBulkOrInterruptTransfer.TransferFlags); + RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength); if (UsbDevice == DeviceExtension->UsbDevices[0]) { if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK)) @@ -113,13 +112,10 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) LONG i; for (i = 0; i < 8; i++) { - if (i == 0){ - DPRINT("PortStatus %x\n", DeviceExtension->Ports[i].PortStatus); - DPRINT("PortChange %x\n", DeviceExtension->Ports[i].PortChange);} if (DeviceExtension->Ports[i].PortChange) { DPRINT1("Inform hub driver that port %d has changed\n", i+1); - ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7); + ((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << (i + 1); } } } @@ -127,11 +123,8 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { Urb->UrbHeader.Status = USBD_STATUS_INVALID_PARAMETER; Status = STATUS_UNSUCCESSFUL; - DPRINT1("Invalid transfer flags for SCE\n"); } } - else - DPRINT1("Interrupt Transfer not for hub\n"); break; } case URB_FUNCTION_GET_STATUS_FROM_DEVICE: @@ -139,9 +132,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT("Get Status from Device\n"); DPRINT("Index : %d\n", Urb->UrbControlGetStatusRequest.Index); + /* Copied from pvdrivers */ if (Urb->UrbControlGetStatusRequest.Index == 0) { - ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL); *(PUSHORT)Urb->UrbControlGetStatusRequest.TransferBuffer = USB_PORT_STATUS_CONNECT | USB_PORT_STATUS_ENABLE; } else @@ -163,7 +156,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { Urb->UrbControlDescriptorRequest.TransferBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); } - ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer != NULL); + RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, &UsbDevice->DeviceDescriptor, Urb->UrbControlDescriptorRequest.TransferBufferLength); @@ -171,40 +164,19 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) } case USB_CONFIGURATION_DESCRIPTOR_TYPE: { - PUCHAR BufPtr; - LONG i, j; - DPRINT1("USB CONFIG DESC\n"); + ULONG FullDescriptorLength = sizeof(USB_CONFIGURATION_DESCRIPTOR) + + sizeof(USB_INTERFACE_DESCRIPTOR) + + sizeof(USB_ENDPOINT_DESCRIPTOR); - if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength) - { - Urb->UrbControlDescriptorRequest.TransferBufferLength = UsbDevice->ActiveConfig->ConfigurationDescriptor.wTotalLength; - } - else - { - DPRINT1("Buffer to small!!!\n"); - //ASSERT(FALSE); - } - - ASSERT(Urb->UrbControlDescriptorRequest.TransferBuffer); - BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer; - - /* Copy the Configuration Descriptor */ - RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); - BufPtr += sizeof(USB_CONFIGURATION_DESCRIPTOR); - for (i = 0; i < UsbDevice->ActiveConfig->ConfigurationDescriptor.bNumInterfaces; i++) + if (Urb->UrbControlDescriptorRequest.TransferBufferLength >= FullDescriptorLength) { - /* Copy the Interface Descriptor */ - RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->Interfaces[i]->InterfaceDescriptor, sizeof(USB_INTERFACE_DESCRIPTOR)); - BufPtr += sizeof(USB_INTERFACE_DESCRIPTOR); - for (j = 0; j < UsbDevice->ActiveConfig->Interfaces[i]->InterfaceDescriptor.bNumEndpoints; j++) - { - /* Copy the EndPoint Descriptor */ - RtlCopyMemory(BufPtr, &UsbDevice->ActiveConfig->Interfaces[i]->EndPoints[j]->EndPointDescriptor, sizeof(USB_ENDPOINT_DESCRIPTOR)); - BufPtr += sizeof(USB_ENDPOINT_DESCRIPTOR); - } + Urb->UrbControlDescriptorRequest.TransferBufferLength = FullDescriptorLength; } + RtlCopyMemory(Urb->UrbControlDescriptorRequest.TransferBuffer, + &UsbDevice->ConfigurationDescriptor, + Urb->UrbControlDescriptorRequest.TransferBufferLength); break; } case USB_STRING_DESCRIPTOR_TYPE: @@ -241,7 +213,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT(" MaxPower = %d\n", Urb->UrbSelectConfiguration.ConfigurationDescriptor->MaxPower); - Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ActiveConfig->ConfigurationDescriptor; + Urb->UrbSelectConfiguration.ConfigurationHandle = (PVOID)&DeviceExtension->UsbDevices[0]->ConfigurationDescriptor; DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle); InterfaceInfo = &Urb->UrbSelectConfiguration.Interface; @@ -257,10 +229,10 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT(" Reserved = %02x\n", (ULONG)InterfaceInfo->Reserved); DPRINT(" InterfaceHandle = %p\n", InterfaceInfo->InterfaceHandle); DPRINT(" NumberOfPipes = %d\n", InterfaceInfo->NumberOfPipes); - InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->ActiveInterface->InterfaceDescriptor; - InterfaceInfo->Class = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceClass; - InterfaceInfo->SubClass = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceSubClass; - InterfaceInfo->Protocol = UsbDevice->ActiveInterface->InterfaceDescriptor.bInterfaceProtocol; + InterfaceInfo->InterfaceHandle = (PVOID)&UsbDevice->InterfaceDescriptor; + InterfaceInfo->Class = UsbDevice->InterfaceDescriptor.bInterfaceClass; + InterfaceInfo->SubClass = UsbDevice->InterfaceDescriptor.bInterfaceSubClass; + InterfaceInfo->Protocol = UsbDevice->InterfaceDescriptor.bInterfaceProtocol; InterfaceInfo->Reserved = 0; for (pCount = 0; pCount < InterfaceInfo->NumberOfPipes; pCount++) @@ -273,11 +245,11 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) DPRINT(" PipeHandle = %x\n", InterfaceInfo->Pipes[pCount].PipeHandle); DPRINT(" MaximumTransferSize = %d\n", InterfaceInfo->Pipes[pCount].MaximumTransferSize); DPRINT(" PipeFlags = %08x\n", InterfaceInfo->Pipes[pCount].PipeFlags); - InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.wMaxPacketSize; - InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bEndpointAddress; - InterfaceInfo->Pipes[pCount].Interval = UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor.bInterval; + InterfaceInfo->Pipes[pCount].MaximumPacketSize = UsbDevice->EndPointDescriptor.wMaxPacketSize; + InterfaceInfo->Pipes[pCount].EndpointAddress = UsbDevice->EndPointDescriptor.bEndpointAddress; + InterfaceInfo->Pipes[pCount].Interval = UsbDevice->EndPointDescriptor.bInterval; InterfaceInfo->Pipes[pCount].PipeType = UsbdPipeTypeInterrupt; - InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->ActiveInterface->EndPoints[pCount]->EndPointDescriptor; + InterfaceInfo->Pipes[pCount].PipeHandle = (PVOID)&UsbDevice->EndPointDescriptor; if (InterfaceInfo->Pipes[pCount].MaximumTransferSize == 0) InterfaceInfo->Pipes[pCount].MaximumTransferSize = 4096; /* InterfaceInfo->Pipes[j].PipeFlags = 0; */ @@ -343,12 +315,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) break; } case USB_DEVICE_CLASS_RESERVED: - DPRINT1("Reserved!!!\n"); case USB_DEVICE_CLASS_HUB: { - PUSB_HUB_DESCRIPTOR UsbHubDescr = Urb->UrbControlVendorClassRequest.TransferBuffer; - ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); /* FIXME: Handle more than root hub? */ if(Urb->UrbControlVendorClassRequest.TransferBufferLength >= sizeof(USB_HUB_DESCRIPTOR)) { @@ -359,7 +328,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) /* FIXME: Handle this correctly */ UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); UsbHubDescr->bDescriptorType = 0x29; - break; + return; } DPRINT1("USB_DEVICE_CLASS_HUB request\n"); UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR); @@ -386,7 +355,6 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) if (Urb->UrbControlVendorClassRequest.Index == 1) { - ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); ((PULONG)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = 0; } break; @@ -406,7 +374,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) case USB_REQUEST_GET_STATUS: { DPRINT1("OTHER: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index); - ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0); + ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus; ((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = DeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange; break; @@ -457,6 +425,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) case USB_REQUEST_SET_ADDRESS: { DPRINT1("USB_REQUEST_SET_ADDRESS\n"); + ASSERT(FALSE); break; } case USB_REQUEST_GET_DESCRIPTOR: @@ -497,6 +466,7 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) default: { DPRINT1("Unknown Function Class Unknown request\n"); + ASSERT(FALSE); break; } } @@ -506,10 +476,13 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) { DPRINT1("Unhandled URB %x\n", Urb->UrbHeader.Function); Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION; + ASSERT(FALSE); } } + KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); + Irp->IoStatus.Status = Status; Irp->IoStatus.Information = Information; @@ -520,16 +493,10 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension) Urb->UrbHeader.UsbdFlags = 0; } - KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); IoCompleteRequest(Irp, IO_NO_INCREMENT); KeAcquireSpinLock(&DeviceExtension->IrpQueueLock, &oldIrql); - - if (DeviceExtension->HaltQueue) - break; } KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql); - if (!DeviceExtension->HaltQueue) - KeSetEvent(&DeviceExtension->QueueDrainedEvent, 0, FALSE); } diff --git a/drivers/usb/usbehci/pdo.c b/drivers/usb/usbehci/pdo.c index cf84911afa7..6a0d735e851 100644 --- a/drivers/usb/usbehci/pdo.c +++ b/drivers/usb/usbehci/pdo.c @@ -8,12 +8,11 @@ */ #define INITGUID +#define NDEBUG #include "usbehci.h" -#include -#include -#include "usbiffn.h" #include +#include "usbiffn.h" #include #include @@ -52,11 +51,8 @@ const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] = 6: Self-powered, 5: Remote wakeup, 4..0: reserved */ - 0x00 /* MaxPower; */ -}; + 0x00, /* MaxPower; */ -const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = -{ /* one interface */ 0x09, /* bLength: Interface; */ 0x04, /* bDescriptorType; Interface */ @@ -66,11 +62,8 @@ const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] = 0x09, /* bInterfaceClass; HUB_CLASSCODE */ 0x01, /* bInterfaceSubClass; */ 0x00, /* bInterfaceProtocol: */ - 0x00 /* iInterface; */ -}; + 0x00, /* iInterface; */ -const UCHAR ROOTHUB2_ENDPOINT_DESCRIPTOR [] = -{ /* one endpoint (status change endpoint) */ 0x07, /* bLength; */ 0x05, /* bDescriptorType; Endpoint */ @@ -85,24 +78,38 @@ VOID NTAPI UrbWorkerThread(PVOID Context) { PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)Context; - NTSTATUS Status; - LARGE_INTEGER DueTime; - PVOID PollEvents[] = { (PVOID) &PdoDeviceExtension->QueueDrainedEvent, (PVOID) &PdoDeviceExtension->Timer }; - DueTime.QuadPart = 0; - KeInitializeTimerEx(&PdoDeviceExtension->Timer, SynchronizationTimer); - KeSetTimerEx(&PdoDeviceExtension->Timer, DueTime, 100, NULL); + while (PdoDeviceExtension->HaltUrbHandling == FALSE) + { + CompletePendingURBRequest(PdoDeviceExtension); + KeStallExecutionProcessor(10); + } + DPRINT1("Thread terminated\n"); +} - while (TRUE) +/* FIXME: Do something better */ +PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) +{ + PUSB_DEVICE UsbDevicePointer = NULL; + UsbDevicePointer = ExAllocatePool(NonPagedPool, sizeof(USB_DEVICE)); + if (!UsbDevicePointer) { - Status = KeWaitForMultipleObjects(2, PollEvents, WaitAll, Executive, KernelMode, FALSE, NULL, NULL); + DPRINT1("Out of memory\n"); + return NULL; + } - if (!PdoDeviceExtension->HaltQueue) - KeResetEvent(&PdoDeviceExtension->QueueDrainedEvent); - CompletePendingURBRequest(PdoDeviceExtension); + if ((Hub) && (!Parent)) + { + DPRINT1("This is the root hub\n"); } - DPRINT1("Thread terminated\n"); + UsbDevicePointer->Address = DeviceNumber; + UsbDevicePointer->Port = Port; + UsbDevicePointer->ParentDevice = Parent; + + UsbDevicePointer->IsHub = Hub; + + return UsbDevicePointer; } NTSTATUS NTAPI @@ -130,6 +137,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) Urb = (PURB) Stack->Parameters.Others.Argument1; DPRINT("Header Length %d\n", Urb->UrbHeader.Length); DPRINT("Header Function %d\n", Urb->UrbHeader.Function); + /* Queue all request for now, kernel thread will complete them */ QueueURBRequest(PdoDeviceExtension, Irp); Information = 0; @@ -145,8 +153,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) case IOCTL_INTERNAL_USB_ENABLE_PORT: { DPRINT1("IOCTL_INTERNAL_USB_ENABLE_PORT\n"); - Information = 0; - Status = STATUS_SUCCESS; break; } case IOCTL_INTERNAL_USB_GET_BUS_INFO: @@ -170,27 +176,21 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (Stack->Parameters.Others.Argument1) { /* Return the root hubs devicehandle */ - DPRINT1("Returning RootHub Handle %x\n", PdoDeviceExtension->UsbDevices[0]); *(PVOID *)Stack->Parameters.Others.Argument1 = (PVOID)PdoDeviceExtension->UsbDevices[0]; - Status = STATUS_SUCCESS; } else Status = STATUS_INVALID_DEVICE_REQUEST; - break; - } case IOCTL_INTERNAL_USB_GET_HUB_COUNT: { DPRINT1("IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT); - ASSERT(Stack->Parameters.Others.Argument1 != NULL); if (Stack->Parameters.Others.Argument1) { /* FIXME: Determine the number of hubs between the usb device and root hub */ - DPRINT1("RootHubCount %x\n", *(PULONG)Stack->Parameters.Others.Argument1); - *(PULONG)Stack->Parameters.Others.Argument1 = 0; + /* For now return 1, the root hub */ + *(PVOID *)Stack->Parameters.Others.Argument1 = (PVOID)1; } - Status = STATUS_SUCCESS; break; } case IOCTL_INTERNAL_USB_GET_HUB_NAME: @@ -220,7 +220,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) if (Stack->Parameters.Others.Argument1) *(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo; if (Stack->Parameters.Others.Argument2) - *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDeviceReference(FdoDeviceExtension->DeviceObject); + *(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDevice(FdoDeviceExtension->DeviceObject); Information = 0; Status = STATUS_SUCCESS; @@ -228,18 +228,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) } case IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION: { - PUSB_IDLE_CALLBACK_INFO CallBackInfo; DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n"); - /* FIXME: Set Callback for safe power down */ - CallBackInfo = Stack->Parameters.DeviceIoControl.Type3InputBuffer; - DPRINT1("IdleCallback %x\n", CallBackInfo->IdleCallback); - DPRINT1("IdleContext %x\n", CallBackInfo->IdleContext); - - PdoDeviceExtension->IdleCallback = CallBackInfo->IdleCallback; - PdoDeviceExtension->IdleContext = CallBackInfo->IdleContext; - - Information = 0; - Status = STATUS_SUCCESS; break; } default: @@ -286,7 +275,6 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information) SourceString.Length = SourceString.MaximumLength = Index * sizeof(WCHAR); SourceString.Buffer = Buffer; break; - } case BusQueryCompatibleIDs: { @@ -387,45 +375,13 @@ PdoDispatchPnp( RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId; RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId; - /* FIXME: Do something better below */ - - RootHubDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PVOID) * RootHubDevice->DeviceDescriptor.bNumConfigurations, - USB_POOL_TAG); - - RootHubDevice->Configs[0] = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USB_CONFIGURATION) + sizeof(PVOID) * ROOTHUB2_CONFIGURATION_DESCRIPTOR[5], - USB_POOL_TAG); - - RootHubDevice->Configs[0]->Interfaces[0] = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USB_INTERFACE) + sizeof(PVOID) * ROOTHUB2_INTERFACE_DESCRIPTOR[3], - USB_POOL_TAG); - - RootHubDevice->Configs[0]->Interfaces[0]->EndPoints[0] = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USB_ENDPOINT), - USB_POOL_TAG); - - RootHubDevice->ActiveConfig = RootHubDevice->Configs[0]; - RootHubDevice->ActiveInterface = RootHubDevice->ActiveConfig->Interfaces[0]; - - RtlCopyMemory(&RootHubDevice->ActiveConfig->ConfigurationDescriptor, + RtlCopyMemory(&RootHubDevice->ConfigurationDescriptor, ROOTHUB2_CONFIGURATION_DESCRIPTOR, sizeof(ROOTHUB2_CONFIGURATION_DESCRIPTOR)); - RtlCopyMemory(&RootHubDevice->ActiveConfig->Interfaces[0]->InterfaceDescriptor, - ROOTHUB2_INTERFACE_DESCRIPTOR, - sizeof(ROOTHUB2_INTERFACE_DESCRIPTOR)); - - RtlCopyMemory(&RootHubDevice->ActiveConfig->Interfaces[0]->EndPoints[0]->EndPointDescriptor, - ROOTHUB2_ENDPOINT_DESCRIPTOR, - sizeof(ROOTHUB2_ENDPOINT_DESCRIPTOR)); - RootHubDevice->DeviceSpeed = UsbHighSpeed; - RootHubDevice->DeviceType = Usb20Device; - PdoDeviceExtension->UsbDevices[0] = RootHubDevice; /* Create a thread to handle the URB's */ - Status = PsCreateSystemThread(&PdoDeviceExtension->ThreadHandle, THREAD_ALL_ACCESS, NULL, @@ -441,16 +397,14 @@ PdoDispatchPnp( if (!NT_SUCCESS(Status)) { DPRINT1("Failed to register interface\n"); - ASSERT(FALSE); } else { Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE); DPRINT1("Set interface state %x\n", Status); - if (!NT_SUCCESS(Status)) - ASSERT(FALSE); } + Status = STATUS_SUCCESS; break; } @@ -466,19 +420,7 @@ PdoDispatchPnp( break; } case BusRelations: - { - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - DPRINT1("BusRelations!!!!!\n"); - - /* The hub driver has created the new device object and reported to pnp, as a result the pnp manager - has resent this IRP and type, so leave the next SCE request pending until a new device arrives. - Is there a better way to do this */ - ExAcquireFastMutex(&PdoDeviceExtension->ListLock); - PdoDeviceExtension->HaltQueue = TRUE; - ExReleaseFastMutex(&PdoDeviceExtension->ListLock); - } case RemovalRelations: case EjectionRelations: { @@ -558,101 +500,62 @@ PdoDispatchPnp( { DPRINT1("Failed to create string from GUID!\n"); } + DPRINT1("Interface GUID requested %wZ\n", &GuidString); + DPRINT1("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); + DPRINT1("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); - DPRINT("Interface GUID requested %wZ\n", &GuidString); - DPRINT("QueryInterface.Size %x\n", Stack->Parameters.QueryInterface.Size); - DPRINT("QueryInterface.Version %x\n", Stack->Parameters.QueryInterface.Version); - - /* Assume success */ Status = STATUS_SUCCESS; Information = 0; - if (IsEqualGUIDAligned(Stack->Parameters.QueryInterface.InterfaceType, &USB_BUS_INTERFACE_HUB_GUID)) + /* FIXME: Check the actual Guid */ + if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_USBDI_V2) && (Stack->Parameters.QueryInterface.Version == 2)) + { + InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; + InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2); + InterfaceDI->Version = 2; + InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceDI->GetUSBDIVersion = GetUSBDIVersion; + InterfaceDI->QueryBusTime = QueryBusTime; + InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb; + InterfaceDI->QueryBusInformation = QueryBusInformation; + InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed; + InterfaceDI->EnumLogEntry = EnumLogEntry; + } + /* FIXME: Check the actual Guid */ + else if (Stack->Parameters.QueryInterface.Size == sizeof(USB_BUS_INTERFACE_HUB_V5) && + (Stack->Parameters.QueryInterface.Version == 5)) { InterfaceHub = (PUSB_BUS_INTERFACE_HUB_V5)Stack->Parameters.QueryInterface.Interface; - InterfaceHub->Version = Stack->Parameters.QueryInterface.Version; - if (Stack->Parameters.QueryInterface.Version >= 0) - { - InterfaceHub->Size = Stack->Parameters.QueryInterface.Size; - InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject; - InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; - InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; - } - if (Stack->Parameters.QueryInterface.Version >= 1) - { - InterfaceHub->CreateUsbDevice = CreateUsbDevice; - InterfaceHub->InitializeUsbDevice = InitializeUsbDevice; - InterfaceHub->GetUsbDescriptors = GetUsbDescriptors; - InterfaceHub->RemoveUsbDevice = RemoveUsbDevice; - InterfaceHub->RestoreUsbDevice = RestoreUsbDevice; - InterfaceHub->GetPortHackFlags = GetPortHackFlags; - InterfaceHub->QueryDeviceInformation = QueryDeviceInformation; - } - if (Stack->Parameters.QueryInterface.Version >= 2) - { - InterfaceHub->GetControllerInformation = GetControllerInformation; - InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend; - InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation; - InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName; - InterfaceHub->GetDeviceBusContext = GetDeviceBusContext; - InterfaceHub->Initialize20Hub = Initialize20Hub; - - } - if (Stack->Parameters.QueryInterface.Version >= 3) - { - InterfaceHub->RootHubInitNotification = RootHubInitNotification; - } - if (Stack->Parameters.QueryInterface.Version >= 4) - { - InterfaceHub->FlushTransfers = FlushTransfers; - } - if (Stack->Parameters.QueryInterface.Version >= 5) - { - InterfaceHub->SetDeviceHandleData = SetDeviceHandleData; - } - if (Stack->Parameters.QueryInterface.Version >= 6) - { - DPRINT1("USB_BUS_INTERFACE_HUB_GUID version not supported!\n"); - } - break; + InterfaceHub->Version = 5; + InterfaceHub->Size = sizeof(USB_BUS_INTERFACE_HUB_V5); + InterfaceHub->BusContext = PdoDeviceExtension->DeviceObject; + InterfaceHub->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; + InterfaceHub->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; + InterfaceHub->CreateUsbDevice = CreateUsbDevice; + InterfaceHub->InitializeUsbDevice = InitializeUsbDevice; + InterfaceHub->GetUsbDescriptors = GetUsbDescriptors; + InterfaceHub->RemoveUsbDevice = RemoveUsbDevice; + InterfaceHub->RestoreUsbDevice = RestoreUsbDevice; + InterfaceHub->GetPortHackFlags = GetPortHackFlags; + InterfaceHub->QueryDeviceInformation = QueryDeviceInformation; + InterfaceHub->GetControllerInformation = GetControllerInformation; + InterfaceHub->ControllerSelectiveSuspend = ControllerSelectiveSuspend; + InterfaceHub->GetExtendedHubInformation = GetExtendedHubInformation; + InterfaceHub->GetRootHubSymbolicName = GetRootHubSymbolicName; + InterfaceHub->GetDeviceBusContext = GetDeviceBusContext; + InterfaceHub->Initialize20Hub = Initialize20Hub; + InterfaceHub->RootHubInitNotification = RootHubInitNotification; + InterfaceHub->FlushTransfers = FlushTransfers; + InterfaceHub->SetDeviceHandleData = SetDeviceHandleData; } - - if (IsEqualGUIDAligned(Stack->Parameters.QueryInterface.InterfaceType, &USB_BUS_INTERFACE_USBDI_GUID)) + else { - InterfaceDI = (PUSB_BUS_INTERFACE_USBDI_V2) Stack->Parameters.QueryInterface.Interface; - InterfaceDI->Version = Stack->Parameters.QueryInterface.Version; - if (Stack->Parameters.QueryInterface.Version >= 0) - { - //InterfaceDI->Size = sizeof(USB_BUS_INTERFACE_USBDI_V2); - InterfaceDI->Size = Stack->Parameters.QueryInterface.Size; - InterfaceDI->BusContext = PdoDeviceExtension->DeviceObject; - InterfaceDI->InterfaceReference = (PINTERFACE_REFERENCE)InterfaceReference; - InterfaceDI->InterfaceDereference = (PINTERFACE_DEREFERENCE)InterfaceDereference; - InterfaceDI->GetUSBDIVersion = GetUSBDIVersion; - InterfaceDI->QueryBusTime = QueryBusTime; - InterfaceDI->SubmitIsoOutUrb = SubmitIsoOutUrb; - InterfaceDI->QueryBusInformation = QueryBusInformation; - } - if (Stack->Parameters.QueryInterface.Version >= 1) - { - InterfaceDI->IsDeviceHighSpeed = IsDeviceHighSpeed; - } - if (Stack->Parameters.QueryInterface.Version >= 2) - { - InterfaceDI->EnumLogEntry = EnumLogEntry; - } - - if (Stack->Parameters.QueryInterface.Version >= 3) - { - DPRINT1("SB_BUS_INTERFACE_USBDI_GUID version not supported!\n"); - } - break; + DPRINT1("Not Supported\n"); + Status = Irp->IoStatus.Status; + Information = Irp->IoStatus.Information; } - - DPRINT1("GUID Not Supported\n"); - Status = Irp->IoStatus.Status; - Information = Irp->IoStatus.Information; - break; } case IRP_MN_QUERY_BUS_INFORMATION: @@ -690,3 +593,4 @@ PdoDispatchPnp( IoCompleteRequest(Irp, IO_NO_INCREMENT); return Status; } + diff --git a/drivers/usb/usbehci/urbreq.c b/drivers/usb/usbehci/urbreq.c index cbd18452757..d9a85ba1338 100644 --- a/drivers/usb/usbehci/urbreq.c +++ b/drivers/usb/usbehci/urbreq.c @@ -15,7 +15,7 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD1, PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD2, PQUEUE_TRANSFER_DESCRIPTOR *CtrlTD3, - PUSB_DEFAULT_PIPE_SETUP_PACKET *CtrlSetup, + PEHCI_SETUP_FORMAT *CtrlSetup, PVOID *CtrlData, ULONG Size) { @@ -67,15 +67,15 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, *CtrlTD3 = (PQUEUE_TRANSFER_DESCRIPTOR) (((ULONG)(*CtrlTD2) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0x1F) & ~0x1F); /* Must be Page aligned */ - *CtrlSetup = (PUSB_DEFAULT_PIPE_SETUP_PACKET) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF); - *CtrlData = (PVOID) (( (ULONG)(*CtrlSetup) + sizeof(USB_DEFAULT_PIPE_SETUP_PACKET) + 0xFFF) & ~0xFFF); + *CtrlSetup = (PEHCI_SETUP_FORMAT) (( (ULONG)(*CtrlTD3) + sizeof(QUEUE_TRANSFER_DESCRIPTOR) + 0xFFF) & ~0xFFF); + *CtrlData = (PUSB_DEVICE_DESCRIPTOR) (( (ULONG)(*CtrlSetup) + sizeof(EHCI_SETUP_FORMAT) + 0xFFF) & ~0xFFF); (*CtrlTD1)->NextPointer = TERMINATE_POINTER; (*CtrlTD1)->AlternateNextPointer = TERMINATE_POINTER; (*CtrlTD1)->BufferPointer[0] = (ULONG)MmGetPhysicalAddress((PVOID) (*CtrlSetup)).LowPart; (*CtrlTD1)->Token.Bits.DataToggle = FALSE; (*CtrlTD1)->Token.Bits.InterruptOnComplete = FALSE; - (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(USB_DEFAULT_PIPE_SETUP_PACKET); + (*CtrlTD1)->Token.Bits.TotalBytesToTransfer = sizeof(EHCI_SETUP_FORMAT); (*CtrlTD1)->Token.Bits.ErrorCounter = 0x03; (*CtrlTD1)->Token.Bits.PIDCode = PID_CODE_SETUP_TOKEN; (*CtrlTD1)->Token.Bits.Active = TRUE; @@ -105,48 +105,46 @@ IntializeHeadQueueForStandardRequest(PQUEUE_HEAD QueueHead, } BOOLEAN -ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength) +GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub) { - PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup = NULL; - PVOID CtrlData = NULL; + PEHCI_SETUP_FORMAT CtrlSetup = NULL; + PUSB_DEVICE_DESCRIPTOR CtrlData = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL; PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL; - PQUEUE_HEAD QueueHead; PEHCI_USBCMD_CONTENT UsbCmd; PEHCI_USBSTS_CONTEXT UsbSts; LONG Base; LONG tmp; - DPRINT1("ExecuteControlRequest: Buffer %x, Length %x\n", Buffer, BufferLength); - Base = (ULONG) DeviceExtension->ResourceMemory; /* Set up the QUEUE HEAD in memory */ QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr); - /* Initialize the memory pointers */ IntializeHeadQueueForStandardRequest(QueueHead, &CtrlTD1, &CtrlTD2, &CtrlTD3, &CtrlSetup, (PVOID)&CtrlData, - BufferLength); - - CtrlSetup->bmRequestType._BM.Recipient = SetupPacket->bmRequestType._BM.Recipient; - CtrlSetup->bmRequestType._BM.Type = SetupPacket->bmRequestType._BM.Type; - CtrlSetup->bmRequestType._BM.Dir = SetupPacket->bmRequestType._BM.Dir; - CtrlSetup->bRequest = SetupPacket->bRequest; - CtrlSetup->wValue.LowByte = SetupPacket->wValue.LowByte; - CtrlSetup->wValue.HiByte = SetupPacket->wValue.HiByte; - CtrlSetup->wIndex.W = SetupPacket->wIndex.W; - CtrlSetup->wLength = SetupPacket->wLength; + sizeof(USB_DEVICE_DESCRIPTOR)); - - QueueHead->EndPointCapabilities1.DeviceAddress = Address; - //QueueHead->EndPointCapabilities2.PortNumber = Port; + /* FIXME: Use defines and handle other than Device Desciptors */ + if (Hub) + { + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->wValue = 0x0600; + } + else + { + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->wValue = 0x0100; + } + CtrlSetup->bRequest = 0x06; + CtrlSetup->wIndex = 0; + CtrlSetup->wLength = sizeof(USB_DEVICE_DESCRIPTOR); tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; @@ -192,15 +190,136 @@ ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_S break; } - if (CtrlSetup->bmRequestType._BM.Dir == BMREQUEST_DEVICE_TO_HOST) + if (OutBuffer != NULL) + { + OutBuffer->bLength = CtrlData->bLength; + OutBuffer->bDescriptorType = CtrlData->bDescriptorType; + OutBuffer->bcdUSB = CtrlData->bcdUSB; + OutBuffer->bDeviceClass = CtrlData->bDeviceClass; + OutBuffer->bDeviceSubClass = CtrlData->bDeviceSubClass; + OutBuffer->bDeviceProtocol = CtrlData->bDeviceProtocol; + OutBuffer->bMaxPacketSize0 = CtrlData->bMaxPacketSize0; + OutBuffer->idVendor = CtrlData->idVendor; + OutBuffer->idProduct = CtrlData->idProduct; + OutBuffer->bcdDevice = CtrlData->bcdDevice; + OutBuffer->iManufacturer = CtrlData->iManufacturer; + OutBuffer->iProduct = CtrlData->iProduct; + OutBuffer->iSerialNumber = CtrlData->iSerialNumber; + OutBuffer->bNumConfigurations = CtrlData->bNumConfigurations; + } + + DPRINT1("bLength %d\n", CtrlData->bLength); + DPRINT1("bDescriptorType %x\n", CtrlData->bDescriptorType); + DPRINT1("bcdUSB %x\n", CtrlData->bcdUSB); + DPRINT1("CtrlData->bDeviceClass %x\n", CtrlData->bDeviceClass); + DPRINT1("CtrlData->bDeviceSubClass %x\n", CtrlData->bDeviceSubClass); + DPRINT1("CtrlData->bDeviceProtocal %x\n", CtrlData->bDeviceProtocol); + DPRINT1("CtrlData->bMaxPacketSize %x\n", CtrlData->bMaxPacketSize0); + DPRINT1("CtrlData->idVendor %x\n", CtrlData->idVendor); + DPRINT1("CtrlData->idProduct %x\n", CtrlData->idProduct); + DPRINT1("CtrlData->bcdDevice %x\n", CtrlData->bcdDevice); + DPRINT1("CtrlData->iManufacturer %x\n", CtrlData->iManufacturer); + DPRINT1("CtrlData->iProduct %x\n", CtrlData->iProduct); + DPRINT1("CtrlData->iSerialNumber %x\n", CtrlData->iSerialNumber); + DPRINT1("CtrlData->bNumConfigurations %x\n", CtrlData->bNumConfigurations); + + /* Temporary: Remove */ + if (CtrlData->bLength > 0) + { + /* We got valid data, try for strings */ + UCHAR Manufacturer = CtrlData->iManufacturer; + UCHAR Product = CtrlData->iProduct; + UCHAR SerialNumber = CtrlData->iSerialNumber; + + GetDeviceStringDescriptor(DeviceExtension, Manufacturer); + GetDeviceStringDescriptor(DeviceExtension, Product); + GetDeviceStringDescriptor(DeviceExtension, SerialNumber); + } + + return TRUE; +} + +BOOLEAN +GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index) +{ + PEHCI_SETUP_FORMAT CtrlSetup = NULL; + PSTRING_DESCRIPTOR CtrlData = NULL; + PQUEUE_TRANSFER_DESCRIPTOR CtrlTD1 = NULL; + PQUEUE_TRANSFER_DESCRIPTOR CtrlTD2 = NULL; + PQUEUE_TRANSFER_DESCRIPTOR CtrlTD3 = NULL; + PQUEUE_HEAD QueueHead; + PEHCI_USBCMD_CONTENT UsbCmd; + PEHCI_USBSTS_CONTEXT UsbSts; + LONG Base; + LONG tmp; + + Base = (ULONG) DeviceExtension->ResourceMemory; + + /* Set up the QUEUE HEAD in memory */ + QueueHead = (PQUEUE_HEAD) ((ULONG)DeviceExtension->AsyncListQueueHeadPtr); + + IntializeHeadQueueForStandardRequest(QueueHead, + &CtrlTD1, + &CtrlTD2, + &CtrlTD3, + &CtrlSetup, + (PVOID)&CtrlData, + sizeof(STRING_DESCRIPTOR) + 256); + + /* FIXME: Use defines and handle other than Device Desciptors */ + CtrlSetup->bmRequestType = 0x80; + CtrlSetup->bRequest = 0x06; + CtrlSetup->wValue = 0x0300 | Index; + CtrlSetup->wIndex = 0; + /* 256 pulled from thin air */ + CtrlSetup->wLength = sizeof(STRING_DESCRIPTOR) + 256; + + tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); + UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; + UsbCmd->Run = FALSE; + WRITE_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD), tmp); + + /* Wait for the controller to halt */ + for (;;) { - if ((Buffer) && (BufferLength)) + KeStallExecutionProcessor(10); + tmp = READ_REGISTER_ULONG((PULONG)(Base + EHCI_USBSTS)); + UsbSts = (PEHCI_USBSTS_CONTEXT)&tmp; + DPRINT("Waiting for Halt, USBSTS: %x\n", READ_REGISTER_ULONG ((PULONG)(Base + EHCI_USBSTS))); + if (UsbSts->HCHalted) { - RtlCopyMemory(Buffer, CtrlData, BufferLength); + break; } - else - DPRINT1("Unable to copy data to buffer\n"); } + /* Set to TRUE on interrupt for async completion */ + DeviceExtension->AsyncComplete = FALSE; + QueueHead->QETDPointer = (ULONG) MmGetPhysicalAddress((PVOID)(CtrlTD1)).LowPart; + + tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); + UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; + UsbCmd->AsyncEnable = TRUE; + + WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp); + + tmp = READ_REGISTER_ULONG((PULONG) (Base + EHCI_USBCMD)); + UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp; + + /* Interrupt on Async completion */ + UsbCmd->DoorBell = TRUE; + UsbCmd->Run = TRUE; + WRITE_REGISTER_ULONG((PULONG)(Base + EHCI_USBCMD), tmp); + + for (;;) + { + KeStallExecutionProcessor(10); + DPRINT("Waiting for completion!\n"); + if (DeviceExtension->AsyncComplete == TRUE) + break; + } + + DPRINT1("String %S\n", &CtrlData->bString); + return TRUE; } + diff --git a/drivers/usb/usbehci/usbehci.c b/drivers/usb/usbehci/usbehci.c index 0f35a318f02..15540694bf1 100644 --- a/drivers/usb/usbehci/usbehci.c +++ b/drivers/usb/usbehci/usbehci.c @@ -9,6 +9,11 @@ /* DEFINES *******************************************************************/ #include "usbehci.h" +#define NDEBUG + +/* INCLUDES *******************************************************************/ +#include + static NTSTATUS NTAPI IrpStub(PDEVICE_OBJECT DeviceObject, PIRP Irp) diff --git a/drivers/usb/usbehci/usbehci.h b/drivers/usb/usbehci/usbehci.h index 56f03b5b491..13bfabb3657 100644 --- a/drivers/usb/usbehci/usbehci.h +++ b/drivers/usb/usbehci/usbehci.h @@ -5,12 +5,10 @@ #include #define NDEBUG #include -#include +#include "usbiffn.h" #include #include -#define USB_POOL_TAG (ULONG)'UsbR' - #define DEVICEINTIALIZED 0x01 #define DEVICESTARTED 0x02 #define DEVICEBUSY 0x04 @@ -198,46 +196,21 @@ typedef struct _EHCI_SETUP_FORMAT typedef struct _STRING_DESCRIPTOR { - UCHAR bLength; /* Size of this descriptor in bytes */ + UCHAR bLength; /* Size of this descriptor in bytes */ UCHAR bDescriptorType; /* STRING Descriptor Type */ - UCHAR bString[0]; /* UNICODE encoded string */ + UCHAR bString[0]; /* UNICODE encoded string */ } STRING_DESCRIPTOR, *PSTRING_DESCRIPTOR; -typedef struct _USB_ENDPOINT -{ - ULONG Flags; - LIST_ENTRY UrbList; - struct _USB_INTERFACE *Interface; - USB_ENDPOINT_DESCRIPTOR EndPointDescriptor; -} USB_ENDPOINT, *PUSB_ENDPOINT; - -typedef struct _USB_INTERFACE -{ - struct _USB_CONFIGURATION *Config; - USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; - USB_ENDPOINT *EndPoints[]; -} USB_INTERFACE, *PUSB_INTERFACE; - -typedef struct _USB_CONFIGURATION -{ - struct _USB_DEVICE *Device; - USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; - USB_INTERFACE *Interfaces[]; -} USB_CONFIGURATION, *PUSB_CONFIGURATION; - typedef struct _USB_DEVICE { UCHAR Address; ULONG Port; PVOID ParentDevice; BOOLEAN IsHub; - USB_DEVICE_SPEED DeviceSpeed; - USB_DEVICE_TYPE DeviceType; USB_DEVICE_DESCRIPTOR DeviceDescriptor; - USB_CONFIGURATION *ActiveConfig; - USB_INTERFACE *ActiveInterface; - USB_CONFIGURATION **Configs; - + USB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor; + USB_INTERFACE_DESCRIPTOR InterfaceDescriptor; + USB_ENDPOINT_DESCRIPTOR EndPointDescriptor; } USB_DEVICE, *PUSB_DEVICE; /* USBCMD register 32 bits */ @@ -407,16 +380,11 @@ typedef struct _PDO_DEVICE_EXTENSION PIRP CurrentIrp; HANDLE ThreadHandle; ULONG ChildDeviceCount; - BOOLEAN HaltQueue; + BOOLEAN HaltUrbHandling; PVOID CallbackContext; - RH_INIT_CALLBACK *CallbackRoutine; - USB_IDLE_CALLBACK IdleCallback; - PVOID IdleContext; + PRH_INIT_CALLBACK CallbackRoutine; ULONG NumberOfPorts; EHCIPORTS Ports[32]; - KTIMER Timer; - KEVENT QueueDrainedEvent; - FAST_MUTEX ListLock; } PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION; typedef struct _WORKITEM_DATA @@ -464,7 +432,10 @@ NTSTATUS NTAPI PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); BOOLEAN -ExecuteControlRequest(PFDO_DEVICE_EXTENSION DeviceExtension, PUSB_DEFAULT_PIPE_SETUP_PACKET SetupPacket, UCHAR Address, ULONG Port, PVOID Buffer, ULONG BufferLength); +GetDeviceDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index, PUSB_DEVICE_DESCRIPTOR OutBuffer, BOOLEAN Hub); + +BOOLEAN +GetDeviceStringDescriptor(PFDO_DEVICE_EXTENSION DeviceExtension, UCHAR Index); VOID QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp); diff --git a/drivers/usb/usbehci/usbiffn.c b/drivers/usb/usbehci/usbiffn.c index 4dd98f4212d..47fefb610b3 100644 --- a/drivers/usb/usbehci/usbiffn.c +++ b/drivers/usb/usbehci/usbiffn.c @@ -7,57 +7,11 @@ * Michael Martin */ +/* usbbusif.h and hubbusif.h need to be imported */ #include "usbehci.h" -#include -#include - -PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub) -{ - PUSB_DEVICE UsbDevicePointer = NULL; - UsbDevicePointer = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_DEVICE), USB_POOL_TAG); - - if (!UsbDevicePointer) - { - DPRINT1("Out of memory\n"); - return NULL; - } - - RtlZeroMemory(UsbDevicePointer, sizeof(USB_DEVICE)); - - if ((Hub) && (!Parent)) - { - DPRINT1("This is the root hub\n"); - } - - UsbDevicePointer->Address = DeviceNumber; - UsbDevicePointer->Port = Port; - UsbDevicePointer->ParentDevice = Parent; - - UsbDevicePointer->IsHub = Hub; - - return UsbDevicePointer; -} - -BOOLEAN -IsHandleValid(PVOID BusContext, - PUSB_DEVICE_HANDLE DeviceHandle) -{ - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - LONG i; - - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) BusContext; - - if (!DeviceHandle) - return FALSE; - - for (i = 0; i < 128; i++) - { - if (PdoDeviceExtension->UsbDevices[i] == DeviceHandle) - return TRUE; - } - - return FALSE; -} +#include "usbiffn.h" +#define NDEBUG +#include VOID USB_BUSIFFN @@ -82,157 +36,15 @@ CreateUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, USHORT PortStatus, USHORT PortNumber) { - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PUSB_DEVICE UsbDevice; - LONG i = 0; - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; - DPRINT1("CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber); - - UsbDevice = InternalCreateUsbDevice(PdoDeviceExtension->ChildDeviceCount, PortNumber, HubDeviceHandle, FALSE); - - /* Add it to the list */ - while (TRUE) - { - if (PdoDeviceExtension->UsbDevices[i] == NULL) - { - PdoDeviceExtension->UsbDevices[i] = (PUSB_DEVICE)UsbDevice; - PdoDeviceExtension->UsbDevices[i]->Address = i + 1; - PdoDeviceExtension->UsbDevices[i]->Port = PortNumber; - break; - } - i++; - } - - /* Return it */ - *NewDevice = UsbDevice; + DPRINT1("CreateUsbDevice called\n"); return STATUS_SUCCESS; } -/* Called when SCE reports a change */ -/* FIXME: Do something better for memory */ NTSTATUS USB_BUSIFFN InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle) { - PPDO_DEVICE_EXTENSION PdoDeviceExtension; - PFDO_DEVICE_EXTENSION FdoDeviceExtension; - USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup; - PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc; - PUSB_INTERFACE_DESCRIPTOR InterfaceDesc; - PUSB_ENDPOINT_DESCRIPTOR EndpointDesc; - PUSB_DEVICE UsbDevice; - BOOLEAN ResultOk; - PVOID Buffer; - PUCHAR Ptr; - LONG i, j, k; - - DPRINT1("InitializeUsbDevice called, device %x\n", DeviceHandle); - PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; - FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; - UsbDevice = (PUSB_DEVICE) DeviceHandle; - - Buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, USB_POOL_TAG); - - if (!Buffer) - { - DPRINT1("Out of memory\n"); - return STATUS_NO_MEMORY; - } - - Ptr = Buffer; - /* Set the device address */ - CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; - CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; - CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_HOST_TO_DEVICE; - CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS; - CtrlSetup.wValue.W = UsbDevice->Address; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = 0; - - ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, 0, 0, NULL, 0); - - /* Get the Device Descriptor */ - CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; - CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; - CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST; - CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; - CtrlSetup.wValue.LowByte = 0; - CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR); - - ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, UsbDevice->Address, UsbDevice->Port, - &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); - - DPRINT1("bLength %x\n", UsbDevice->DeviceDescriptor.bLength); - DPRINT1("bDescriptorType %x\n", UsbDevice->DeviceDescriptor.bDescriptorType); - DPRINT1("bNumDescriptors %x\n", UsbDevice->DeviceDescriptor.bNumConfigurations); - - if (UsbDevice->DeviceDescriptor.bNumConfigurations == 0) - return STATUS_DEVICE_DATA_ERROR; - - UsbDevice->Configs = ExAllocatePoolWithTag(NonPagedPool, - sizeof(PVOID) * UsbDevice->DeviceDescriptor.bNumConfigurations, - USB_POOL_TAG); - - if (!UsbDevice->Configs) - { - DPRINT1("Out of memory\n"); - return STATUS_NO_MEMORY; - } - - for (i = 0; i < UsbDevice->DeviceDescriptor.bNumConfigurations; i++) - { - /* Get the Device Configuration Descriptor */ - CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE; - CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD; - CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_DEVICE_TO_HOST; - CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR; - CtrlSetup.wValue.LowByte = 0; - CtrlSetup.wValue.HiByte = USB_CONFIGURATION_DESCRIPTOR_TYPE; - CtrlSetup.wIndex.W = 0; - CtrlSetup.wLength = PAGE_SIZE; - - ResultOk = ExecuteControlRequest(FdoDeviceExtension, &CtrlSetup, UsbDevice->Address, UsbDevice->Port, Buffer, PAGE_SIZE); - - ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)Ptr; - - ASSERT(ConfigDesc->wTotalLength <= PAGE_SIZE); - - UsbDevice->Configs[i] = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USB_CONFIGURATION) + sizeof(PVOID) * ConfigDesc->bNumInterfaces, - USB_POOL_TAG); - UsbDevice->Configs[i]->Device = UsbDevice; - RtlCopyMemory(&UsbDevice->Configs[0]->ConfigurationDescriptor, - ConfigDesc, sizeof(USB_CONFIGURATION_DESCRIPTOR)); - Ptr += ConfigDesc->bLength; - - for (j = 0; j < ConfigDesc->bNumInterfaces; j++) - { - InterfaceDesc = (PUSB_INTERFACE_DESCRIPTOR) Ptr; - UsbDevice->Configs[i]->Interfaces[j] = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USB_INTERFACE) + sizeof(PVOID) * InterfaceDesc->bNumEndpoints, - USB_POOL_TAG); - RtlCopyMemory(&UsbDevice->Configs[i]->Interfaces[j]->InterfaceDescriptor, - InterfaceDesc, - sizeof(USB_INTERFACE_DESCRIPTOR)); - - Ptr += InterfaceDesc->bLength; - - for (k = 0; k < InterfaceDesc->bNumEndpoints; k++) - { - EndpointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Ptr; - UsbDevice->Configs[i]->Interfaces[j]->EndPoints[k] = ExAllocatePoolWithTag(NonPagedPool, sizeof(USB_ENDPOINT), USB_POOL_TAG); - RtlCopyMemory(&UsbDevice->Configs[i]->Interfaces[j]->EndPoints[k]->EndPointDescriptor, - EndpointDesc, sizeof(USB_ENDPOINT_DESCRIPTOR)); - } - - } - } - - UsbDevice->ActiveConfig = UsbDevice->Configs[0]; - UsbDevice->ActiveInterface = UsbDevice->Configs[0]->Interfaces[0]; - + DPRINT1("InitializeUsbDevice called\n"); return STATUS_SUCCESS; } @@ -242,25 +54,10 @@ GetUsbDescriptors(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, PUCHAR DeviceDescriptorBuffer, PULONG DeviceDescriptorBufferLength, - PUCHAR ConfigDescriptorBuffer, + PUCHAR ConfigurationBuffer, PULONG ConfigDescriptorBufferLength) { - PUSB_DEVICE UsbDevice; - DPRINT1("GetUsbDescriptor %x, %d, %x, %d\n", DeviceDescriptorBuffer, DeviceDescriptorBufferLength, ConfigDescriptorBuffer, ConfigDescriptorBufferLength); - - UsbDevice = (PUSB_DEVICE) DeviceHandle; - - if ((DeviceDescriptorBuffer) && (DeviceDescriptorBufferLength)) - { - RtlCopyMemory(DeviceDescriptorBuffer, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); - *DeviceDescriptorBufferLength = sizeof(USB_DEVICE_DESCRIPTOR); - } - if ((ConfigDescriptorBuffer) && (ConfigDescriptorBufferLength)) - { - RtlCopyMemory(ConfigDescriptorBuffer, &UsbDevice->ActiveConfig->ConfigurationDescriptor, sizeof(USB_CONFIGURATION_DESCRIPTOR)); - *ConfigDescriptorBufferLength = sizeof(USB_CONFIGURATION_DESCRIPTOR); - } - + DPRINT1("GetUsbDescriptor called\n"); return STATUS_SUCCESS; } @@ -277,7 +74,7 @@ USB_BUSIFFN RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle) { DPRINT1("RestoreUsbDevice called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS @@ -285,7 +82,7 @@ USB_BUSIFFN GetPortHackFlags(PVOID BusContext, PULONG Flags) { DPRINT1("GetPortHackFlags called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS @@ -296,51 +93,7 @@ QueryDeviceInformation(PVOID BusContext, ULONG DeviceInformationBufferLength, PULONG LengthReturned) { - PUSB_DEVICE_INFORMATION_0 DeviceInfo = DeviceInformationBuffer; - PUSB_DEVICE UsbDevice = (PUSB_DEVICE) DeviceHandle; - ULONG SizeNeeded; - LONG i; - - DPRINT1("QueryDeviceInformation (%x, %x, %x, %d, %x\n", BusContext, DeviceHandle, DeviceInformationBuffer, DeviceInformationBufferLength, LengthReturned); - - /* Search for a valid usb device in this BusContext */ - if (!IsHandleValid(BusContext, DeviceHandle)) - { - DPRINT1("Not a valid DeviceHandle\n"); - return STATUS_INVALID_PARAMETER; - } - - SizeNeeded = FIELD_OFFSET(USB_DEVICE_INFORMATION_0, PipeList[UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints]); - *LengthReturned = SizeNeeded; - - DeviceInfo->ActualLength = SizeNeeded; - - if (DeviceInformationBufferLength < SizeNeeded) - { - DPRINT1("Buffer to small\n"); - return STATUS_BUFFER_TOO_SMALL; - } - - if (DeviceInfo->InformationLevel != 0) - { - DPRINT1("Invalid Param\n"); - return STATUS_INVALID_PARAMETER; - } - - DeviceInfo->PortNumber = UsbDevice->Port; - DeviceInfo->HubAddress = 1; - DeviceInfo->DeviceAddress = UsbDevice->Address; - DeviceInfo->DeviceSpeed = UsbDevice->DeviceSpeed; - DeviceInfo->DeviceType = UsbDevice->DeviceType; - DeviceInfo->CurrentConfigurationValue = UsbDevice->ActiveConfig->ConfigurationDescriptor.bConfigurationValue; - DeviceInfo->NumberOfOpenPipes = UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; - - RtlCopyMemory(&DeviceInfo->DeviceDescriptor, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR)); - - for (i = 0; i < UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; i++) - { - RtlCopyMemory(&DeviceInfo->PipeList[i].EndpointDescriptor, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor, sizeof(USB_ENDPOINT_DESCRIPTOR)); - } + DPRINT1("QueryDeviceInformation called\n"); return STATUS_SUCCESS; } @@ -351,30 +104,7 @@ GetControllerInformation(PVOID BusContext, ULONG ControllerInformationBufferLength, PULONG LengthReturned) { - PUSB_CONTROLLER_INFORMATION_0 ControllerInfo; - DPRINT1("GetControllerInformation called\n"); - - ControllerInfo = ControllerInformationBuffer; - - if (ControllerInformationBufferLength < sizeof(USB_CONTROLLER_INFORMATION_0)) - { - DPRINT1("Buffer to small\n"); - return STATUS_BUFFER_TOO_SMALL; - } - - if (ControllerInfo->InformationLevel != 0) - { - DPRINT1("InformationLevel other than 0 not supported\n"); - return STATUS_NOT_SUPPORTED; - } - - ControllerInfo->ActualLength = sizeof(USB_CONTROLLER_INFORMATION_0); - ControllerInfo->SelectiveSuspendEnabled = FALSE; - ControllerInfo->IsHighSpeedController = TRUE; - - *LengthReturned = ControllerInfo->ActualLength; - return STATUS_SUCCESS; } @@ -383,7 +113,7 @@ USB_BUSIFFN ControllerSelectiveSuspend(PVOID BusContext, BOOLEAN Enable) { DPRINT1("ControllerSelectiveSuspend called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS @@ -399,7 +129,7 @@ GetExtendedHubInformation(PVOID BusContext, PPDO_DEVICE_EXTENSION PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; PFDO_DEVICE_EXTENSION FdoDeviceExntension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension; LONG i; - DPRINT1("GetExtendedHubInformation\n"); + /* Set the default return value */ *LengthReturned = 0; /* Caller must have set InformationLevel to 0 */ @@ -432,12 +162,6 @@ GetRootHubSymbolicName(PVOID BusContext, PULONG HubSymNameActualLength) { DPRINT1("GetRootHubSymbolicName called\n"); - - if (HubSymNameBufferLength < 16) - return STATUS_UNSUCCESSFUL; - RtlCopyMemory(HubSymNameBuffer, L"ROOT_HUB", HubSymNameBufferLength); - *HubSymNameActualLength = 16; - return STATUS_SUCCESS; } @@ -453,11 +177,7 @@ NTSTATUS USB_BUSIFFN Initialize20Hub(PVOID BusContext, PUSB_DEVICE_HANDLE HubDeviceHandle, ULONG TtCount) { - DPRINT1("Initialize20Hub called, HubDeviceHandle: %x\n", HubDeviceHandle); - - /* FIXME: */ - /* Create the Irp Queue for SCE */ - /* Should queue be created for each device or each enpoint??? */ + DPRINT1("Initialize20Hub called\n"); return STATUS_SUCCESS; } @@ -471,17 +191,6 @@ RootHubInitNotification(PVOID BusContext, PVOID CallbackContext, PRH_INIT_CALLBA PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension; PdoDeviceExtension->CallbackContext = CallbackContext; PdoDeviceExtension->CallbackRoutine = CallbackRoutine; - if (PdoDeviceExtension->CallbackRoutine) - { - DPRINT1("Called Callbackrountine\n"); - PdoDeviceExtension->CallbackRoutine(PdoDeviceExtension->CallbackContext); - DPRINT1("Done Callbackrountine\n"); - } - else - { - DPRINT1("PdoDeviceExtension->CallbackRoutine is NULL!\n"); - } - return STATUS_SUCCESS; } @@ -502,12 +211,12 @@ SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevi /* USB_BUS_INTERFACE_USBDI_V2 Functions */ -VOID +NTSTATUS USB_BUSIFFN GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites) { DPRINT1("GetUSBDIVersion called\n"); - return; + return STATUS_SUCCESS; } NTSTATUS @@ -515,7 +224,7 @@ USB_BUSIFFN QueryBusTime(PVOID BusContext, PULONG CurrentFrame) { DPRINT1("QueryBusTime called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS @@ -523,7 +232,7 @@ USB_BUSIFFN SubmitIsoOutUrb(PVOID BusContext, PURB Urb) { DPRINT1("SubmitIsoOutUrb called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } NTSTATUS @@ -535,7 +244,7 @@ QueryBusInformation(PVOID BusContext, PULONG BusInformationActualLength) { DPRINT1("QueryBusInformation called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } BOOLEAN @@ -551,5 +260,6 @@ USB_BUSIFFN EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2) { DPRINT1("EnumLogEntry called\n"); - return STATUS_NOT_SUPPORTED; + return STATUS_SUCCESS; } + diff --git a/drivers/usb/usbehci/usbiffn.h b/drivers/usb/usbehci/usbiffn.h index eff48f0eac7..e9c2de469be 100644 --- a/drivers/usb/usbehci/usbiffn.h +++ b/drivers/usb/usbehci/usbiffn.h @@ -1,12 +1,77 @@ #pragma once +#define USB_BUSIFFN __stdcall #include #include #include -#include -PVOID -InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub); +/* usbbusif.h and hubbusif.h need to be imported */ +typedef PVOID PUSB_DEVICE_HANDLE; + +typedef +VOID +USB_BUSIFFN +RH_INIT_CALLBACK (PVOID CallBackContext); + +typedef RH_INIT_CALLBACK *PRH_INIT_CALLBACK; + +typedef struct _USB_EXTPORT_INFORMATION_0 +{ + ULONG PhysicalPortNumber; + ULONG PortLabelNumber; + USHORT VidOverride; + USHORT PidOverride; + ULONG PortAttributes; +} USB_EXTPORT_INFORMATION_0, *PUSB_EXTPORT_INFORMATION; + +typedef struct _USB_EXTHUB_INFORMATION_0 +{ + ULONG InformationLevel; + ULONG NumberOfPorts; + USB_EXTPORT_INFORMATION_0 Port[255]; +} USB_EXTHUB_INFORMATION_0, *PUSB_EXTHUB_INFORMATION_0; + +typedef struct _USB_BUS_INTERFACE_USBDI_V2 +{ + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + + PVOID GetUSBDIVersion; + PVOID QueryBusTime; + PVOID SubmitIsoOutUrb; + PVOID QueryBusInformation; + PVOID IsDeviceHighSpeed; + PVOID EnumLogEntry; +} USB_BUS_INTERFACE_USBDI_V2, *PUSB_BUS_INTERFACE_USBDI_V2; + +typedef struct _USB_BUS_INTERFACE_HUB_V5 +{ + USHORT Size; + USHORT Version; + PVOID BusContext; + PINTERFACE_REFERENCE InterfaceReference; + PINTERFACE_DEREFERENCE InterfaceDereference; + + PVOID CreateUsbDevice; + PVOID InitializeUsbDevice; + PVOID GetUsbDescriptors; + PVOID RemoveUsbDevice; + PVOID RestoreUsbDevice; + PVOID GetPortHackFlags; + PVOID QueryDeviceInformation; + PVOID GetControllerInformation; + PVOID ControllerSelectiveSuspend; + PVOID GetExtendedHubInformation; + PVOID GetRootHubSymbolicName; + PVOID GetDeviceBusContext; + PVOID Initialize20Hub; + PVOID RootHubInitNotification; + PVOID FlushTransfers; + PVOID SetDeviceHandleData; +} USB_BUS_INTERFACE_HUB_V5, *PUSB_BUS_INTERFACE_HUB_V5; VOID USB_BUSIFFN @@ -33,7 +98,7 @@ GetUsbDescriptors(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, PUCHAR DeviceDescriptorBuffer, PULONG DeviceDescriptorBufferLength, - PUCHAR ConfigDescriptorBuffer, + PUCHAR ConfigurationBuffer, PULONG ConfigDescriptorBufferLength); NTSTATUS @@ -102,7 +167,7 @@ VOID USB_BUSIFFN SetDeviceHandleData(PVOID BusContext, PVOID DeviceHandle, PDEVICE_OBJECT UsbDevicePdo); -VOID +NTSTATUS USB_BUSIFFN GetUSBDIVersion(PVOID BusContext, PUSBD_VERSION_INFORMATION VersionInformation, PULONG HcdCapabilites); diff --git a/drivers/video/displays/vga/objects/pointer.c b/drivers/video/displays/vga/objects/pointer.c index c0d365bb9a4..698f8790fe0 100644 --- a/drivers/video/displays/vga/objects/pointer.c +++ b/drivers/video/displays/vga/objects/pointer.c @@ -272,7 +272,7 @@ DrvSetPointerShape( VGADDI_ShowCursor(ppdev, prcl); } - return SPS_ACCEPT_NOEXCLUDE; + return SPS_ACCEPT_EXCLUDE; } static VOID FASTCALL diff --git a/hal/halx86/directory.rbuild b/hal/halx86/directory.rbuild index 9c8c482a2c7..7cea4c006fa 100644 --- a/hal/halx86/directory.rbuild +++ b/hal/halx86/directory.rbuild @@ -3,15 +3,14 @@ + + - + - - - - + diff --git a/hal/halx86/generic/acpi/halpnpdd.c b/hal/halx86/generic/acpi/halpnpdd.c index 8617b20f1fc..ca85188bcaf 100644 --- a/hal/halx86/generic/acpi/halpnpdd.c +++ b/hal/halx86/generic/acpi/halpnpdd.c @@ -848,6 +848,9 @@ HalpDriverEntry(IN PDRIVER_OBJECT DriverObject, /* Now add us */ if (NT_SUCCESS(Status)) Status = HalpAddDevice(DriverObject, TargetDevice); + + /* Force re-enumeration??? */ + IoInvalidateDeviceRelations(TargetDevice, 0); /* Return to kernel */ return Status; diff --git a/hal/halx86/generic/halinit.c b/hal/halx86/generic/halinit.c index db54eb59d63..4309ac1a16e 100644 --- a/hal/halx86/generic/halinit.c +++ b/hal/halx86/generic/halinit.c @@ -145,31 +145,33 @@ HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress, /* Start at the current HAL heap base */ BaseAddress = HalpHeapStart; - VirtualAddress = BaseAddress; /* Loop until we have all the pages required */ while (UsedPages < PageCount) { - /* If this overflows past the HAL heap, it means there's no space */ - if (VirtualAddress == NULL) return NULL; - - /* Get the PTE for this address */ - PointerPte = HalAddressToPte(VirtualAddress); + /* Begin a new loop cycle */ + UsedPages = 0; + VirtualAddress = BaseAddress; - /* Go to the next page */ - VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); + /* If this overflows past the HAL heap, it means there's no space */ + if (BaseAddress == NULL) return NULL; - /* Check if the page is available */ - if (PointerPte->Valid) + /* Loop until we have all the pages required in a single run */ + while (UsedPages < PageCount) { - /* PTE has data, skip it and start with a new base address */ - BaseAddress = VirtualAddress; - UsedPages = 0; - continue; + /* Get the PTE for this address and check if it's available */ + PointerPte = HalAddressToPte(VirtualAddress); + if (*(PULONG)PointerPte) + { + /* PTE has data, skip it and start with a new base address */ + BaseAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); + break; + } + + /* PTE is available, keep going on this run */ + VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE); + UsedPages++; } - - /* PTE is available, keep going on this run */ - UsedPages++; } /* Take the base address of the page plus the actual offset in the address */ diff --git a/hal/halx86/hal_generic.rbuild b/hal/halx86/hal_generic.rbuild index 8dd5f7bc57d..166bb930404 100644 --- a/hal/halx86/hal_generic.rbuild +++ b/hal/halx86/hal_generic.rbuild @@ -16,6 +16,7 @@ sysbus.c beep.c + bios.c cmos.c display.c dma.c @@ -28,7 +29,6 @@ timer.c usage.c - bios.c portio.c systimer.S @@ -36,16 +36,9 @@ - - . x86bios.c - halinit.c - irq.S - misc.c - apic.c systimer.S - usage.c @@ -53,4 +46,47 @@ hal.h + + + include + include + + + + + + + bushndlr.c + isabus.c + halbus.c + pcibus.c + pcidata.c + sysbus.c + + beep.c + bios.c + cmos.c + dma.c + display.c + drive.c + misc.c + profil.c + reboot.c + spinlock.c + sysinfo.c + timer.c + usage.c + + + portio.c + systimer.S + + + + + halinit_up.c + pic.c + processor.c + + diff --git a/hal/halx86/hal_mini.rbuild b/hal/halx86/hal_mini.rbuild deleted file mode 100644 index a7baed44639..00000000000 --- a/hal/halx86/hal_mini.rbuild +++ /dev/null @@ -1,44 +0,0 @@ - - - - - include - include - - - - - - - bushndlr.c - isabus.c - halbus.c - pcibus.c - pcidata.c - sysbus.c - - beep.c - bios.c - cmos.c - dma.c - display.c - drive.c - misc.c - profil.c - reboot.c - spinlock.c - sysinfo.c - timer.c - usage.c - - portio.c - systimer.S - - - - halinit_up.c - pic.c - processor.c - - - diff --git a/hal/halx86/halamd64.rbuild b/hal/halx86/halamd64.rbuild index ad96c0f1cf9..0b60f7615dc 100644 --- a/hal/halx86/halamd64.rbuild +++ b/hal/halx86/halamd64.rbuild @@ -12,25 +12,17 @@ hal_generic hal_generic_acpi + hal_generic_up ntoskrnl - x86emu + - - spinlock.c - - - - processor.c - - - - + diff --git a/include/ddk/hubbusif.h b/include/ddk/hubbusif.h index cf97c5cf64f..e03f19edbb8 100644 --- a/include/ddk/hubbusif.h +++ b/include/ddk/hubbusif.h @@ -1,14 +1,8 @@ #pragma once -#define _HUBBUSIF_ - -#include "usbdi.h" - #if (NTDDI_VERSION >= NTDDI_WINXP) -#if !defined(_USBBUSIF_) typedef PVOID PUSB_DEVICE_HANDLE; -#endif typedef struct _ROOTHUB_PDO_EXTENSION { ULONG Signature; diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h index 5fd84388d15..73aa6d6f780 100644 --- a/include/ddk/ntddk.h +++ b/include/ddk/ntddk.h @@ -3283,14 +3283,13 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite -#ifdef _X86_ - typedef enum _INTERLOCKED_RESULT { ResultNegative = RESULT_NEGATIVE, ResultZero = RESULT_ZERO, ResultPositive = RESULT_POSITIVE } INTERLOCKED_RESULT; +#ifdef _X86_ NTKERNELAPI INTERLOCKED_RESULT FASTCALL @@ -3309,9 +3308,9 @@ FASTCALL Exfi386InterlockedExchangeUlong( IN PULONG Target, IN ULONG Value); - #endif + #if (NTDDI_VERSION >= NTDDI_WIN2K) NTKERNELAPI NTSTATUS diff --git a/include/ddk/usbbusif.h b/include/ddk/usbbusif.h index 3d1c1f3a337..0483738b18a 100644 --- a/include/ddk/usbbusif.h +++ b/include/ddk/usbbusif.h @@ -1,16 +1,12 @@ #pragma once -#define _USBBUSIF_ - #ifndef USB_BUSIFFN #define USB_BUSIFFN __stdcall #endif #if (NTDDI_VERSION >= NTDDI_WINXP) -#if !defined(_USBBUSIF_) typedef PVOID PUSB_DEVICE_HANDLE; -#endif typedef NTSTATUS (USB_BUSIFFN *PUSB_BUSIFFN_SUBMIT_ISO_OUT_URB) ( diff --git a/include/dxsdk/bdamedia.h b/include/dxsdk/bdamedia.h index f090af5b4c2..3cf12d5617b 100644 --- a/include/dxsdk/bdamedia.h +++ b/include/dxsdk/bdamedia.h @@ -317,20 +317,6 @@ typedef enum { }KSPROPERTY_BDA_SIGNAL_STATS; -typedef struct tagBDA_TRANSPORT_INFO { - ULONG ulcbPhyiscalPacket; - ULONG ulcbPhyiscalFrame; - ULONG ulcbPhyiscalFrameAlignment; - REFERENCE_TIME AvgTimePerFrame; - -} BDA_TRANSPORT_INFO, *PBDA_TRANSPORT_INFO; - -typedef struct tagKS_DATARANGE_BDA_TRANSPORT -{ - KSDATARANGE DataRange; - BDA_TRANSPORT_INFO BdaTransportInfo; -} KS_DATARANGE_BDA_TRANSPORT, *PKS_DATARANGE_BDA_TRANSPORT; - /* ------------------------------------------------------------ BDA Stream Format GUIDs */ diff --git a/include/host/typedefs.h b/include/host/typedefs.h index 07146c48220..42f30ed2294 100644 --- a/include/host/typedefs.h +++ b/include/host/typedefs.h @@ -65,7 +65,6 @@ typedef PVOID HANDLE, HKEY, *PHKEY; typedef INT NTSTATUS, POOL_TYPE; typedef LONG HRESULT; typedef ULONG_PTR SIZE_T, *PSIZE_T; -typedef WORD LANGID; #define MAXUSHORT USHRT_MAX @@ -233,11 +232,6 @@ typedef const UNICODE_STRING *PCUNICODE_STRING; #define RtlCopyMemory(Destination, Source, Length) memcpy(Destination, Source, Length) #define RtlMoveMemory(Destination, Source, Length) memmove(Destination, Source, Length) -#define MAKELANGID(p,s) ((((WORD)(s))<<10)|(WORD)(p)) -#define PRIMARYLANGID(l) ((WORD)(l)&0x3ff) -#define SUBLANGID(l) ((WORD)(l)>>10) -#define SUBLANG_NEUTRAL 0x00 - /* Prevent inclusion of some other headers */ #define __INTERNAL_DEBUG #define RTL_H diff --git a/include/host/wcsfuncs.h b/include/host/wcsfuncs.h index c07679aa34a..bf2c12771f2 100644 --- a/include/host/wcsfuncs.h +++ b/include/host/wcsfuncs.h @@ -11,19 +11,14 @@ #ifdef USE_HOST_WCSFUNCS /* Function prototypes */ - + SIZE_T utf16_wcslen(PCWSTR str); + PWSTR utf16_wcschr(PWSTR str, WCHAR c); + INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count); #else - /* Map str*W functions to wcs* function */ - - #define isspaceW iswspace - #define strchrW wcschr - #define strcmpiW _wcsicmp - #define strcpyW wcscpy - #define strlenW wcslen - #define strncmpW wcsncmp - #define strtolW wcstol - #define strtoulW wcstoul - + /* Define the utf16_ functions to the CRT functions */ + #define utf16_wcslen wcslen + #define utf16_wcschr wcschr + #define utf16_wcsncmp wcsncmp #endif #endif diff --git a/include/ndk/amd64/ketypes.h b/include/ndk/amd64/ketypes.h index 8e4d4215514..b57242055d4 100644 --- a/include/ndk/amd64/ketypes.h +++ b/include/ndk/amd64/ketypes.h @@ -58,14 +58,12 @@ Author: // #define RPL_MASK 0x0003 #define MODE_MASK 0x0001 -#define KGDT64_NULL 0x0000 -#define KGDT64_R0_CODE 0x0010 -#define KGDT64_R0_DATA 0x0018 -#define KGDT64_R3_CMCODE 0x0020 -#define KGDT64_R3_DATA 0x0028 -#define KGDT64_R3_CODE 0x0030 -#define KGDT64_SYS_TSS 0x0040 -#define KGDT64_R3_CMTEB 0x0050 +#define KGDT_64_R0_CODE 0x0010 +#define KGDT_64_R0_SS 0x0018 +#define KGDT_64_DATA 0x0028 // 2b +#define KGDT_64_R3_CODE 0x0030 // 33 +#define KGDT_TSS 0x0040 +#define KGDT_32_R3_TEB 0x0050 // 53 // diff --git a/include/psdk/gdiplusflat.h b/include/psdk/gdiplusflat.h index 8312e16490a..cd97a70332e 100644 --- a/include/psdk/gdiplusflat.h +++ b/include/psdk/gdiplusflat.h @@ -561,9 +561,8 @@ GpStatus WINGDIPAPI GdipSetPathGradientFocusScales(GpPathGradient*,REAL,REAL); GpStatus WINGDIPAPI GdipSetPathGradientGammaCorrection(GpPathGradient*,BOOL); GpStatus WINGDIPAPI GdipSetPathGradientSigmaBlend(GpPathGradient*,REAL,REAL); GpStatus WINGDIPAPI GdipSetPathGradientSurroundColorsWithCount(GpPathGradient*, - GDIPCONST ARGB*,INT*); + ARGB*,INT*); GpStatus WINGDIPAPI GdipSetPathGradientWrapMode(GpPathGradient*,GpWrapMode); -GpStatus WINGDIPAPI GdipGetPathGradientSurroundColorCount(GpPathGradient*,INT*); /* PathIterator */ GpStatus WINGDIPAPI GdipCreatePathIter(GpPathIterator**,GpPath*); diff --git a/include/psdk/ks.h b/include/psdk/ks.h index 2290d7cf4e2..f728bfb0f78 100644 --- a/include/psdk/ks.h +++ b/include/psdk/ks.h @@ -744,99 +744,6 @@ typedef enum KSPROPERTY_STREAM_PIPE_ID } KSPROPERTY_STREAM; -#define DEFINE_KSPROPERTY_ITEM_STREAM_ALLOCATOR(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_ALLOCATOR,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_QUALITY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_QUALITY,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSQUALITY_MANAGER),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_DEGRADATION(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_DEGRADATION,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - 0,\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_MASTERCLOCK(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_MASTERCLOCK,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_TIMEFORMAT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_TIMEFORMAT,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(GUID),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONTIME(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PRESENTATIONTIME,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSTIME),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_PRESENTATIONEXTENT(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PRESENTATIONEXTENT,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_FRAMETIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_FRAMETIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSFRAMETIME),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_RATECAPABILITY(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_RATECAPABILITY,\ - (Handler),\ - sizeof(KSRATE_CAPABILITY),\ - sizeof(KSRATE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_RATE(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_RATE,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(KSRATE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_STREAM_PIPE_ID(GetHandler, SetHandler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_STREAM_PIPE_ID,\ - (GetHandler),\ - sizeof(KSPROPERTY),\ - sizeof(HANDLE),\ - (SetHandler),\ - NULL, 0, NULL, NULL, 0) /* =============================================================== StreamAllocator @@ -2019,76 +1926,6 @@ typedef struct } KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; -#define DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_TIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_PHYSICALTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(LONGLONG),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_CORRELATEDTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCORRELATED_TIME),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_CORRELATEDPHYSICALTIME,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCORRELATED_TIME),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_RESOLUTION,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSRESOLUTION),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_STATE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSSTATE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(Handler)\ - DEFINE_KSPROPERTY_ITEM(\ - KSPROPERTY_CLOCK_FUNCTIONTABLE,\ - (Handler),\ - sizeof(KSPROPERTY),\ - sizeof(KSCLOCK_FUNCTIONTABLE),\ - NULL, NULL, 0, NULL, NULL, 0) - -#define DEFINE_KSPROPERTY_CLOCKSET(ClockSet,\ - PropTime, PropPhysicalTime,\ - PropCorrelatedTime, PropCorrelatedPhysicalTime,\ - PropResolution, PropState, PropFunctionTable)\ -DEFINE_KSPROPERTY_TABLE(ClockSet) {\ - DEFINE_KSPROPERTY_ITEM_CLOCK_TIME(PropTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_PHYSICALTIME(PropPhysicalTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDTIME(PropCorrelatedTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_CORRELATEDPHYSICALTIME(PropCorrelatedPhysicalTime),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_RESOLUTION(PropResolution),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_STATE(PropState),\ - DEFINE_KSPROPERTY_ITEM_CLOCK_FUNCTIONTABLE(PropFunctionTable)\ -} - /* =============================================================== Objects ??? SORT ME! */ diff --git a/include/psdk/ksmedia.h b/include/psdk/ksmedia.h index a1b1c0c314e..da909168afc 100644 --- a/include/psdk/ksmedia.h +++ b/include/psdk/ksmedia.h @@ -14,8 +14,6 @@ KS CATEGORIES */ -typedef LONGLONG REFERENCE_TIME; - #define EXTRACT_WAVEFORMATEX_ID(Guid)\ (USHORT)((Guid)->Data1) diff --git a/include/psdk/ntdef.h b/include/psdk/ntdef.h index 18107cdcbcc..fdc365085b2 100644 --- a/include/psdk/ntdef.h +++ b/include/psdk/ntdef.h @@ -565,9 +565,6 @@ typedef struct _PROCESSOR_NUMBER { UCHAR Reserved; } PROCESSOR_NUMBER, *PPROCESSOR_NUMBER; -struct _CONTEXT; -struct _EXCEPTION_RECORD; - typedef EXCEPTION_DISPOSITION (NTAPI *PEXCEPTION_ROUTINE)( IN struct _EXCEPTION_RECORD *ExceptionRecord, diff --git a/include/psdk/ntsecpkg.h b/include/psdk/ntsecpkg.h index b83d364544b..4de56cc05b0 100644 --- a/include/psdk/ntsecpkg.h +++ b/include/psdk/ntsecpkg.h @@ -19,10 +19,6 @@ #ifndef _NTSECPKG_H #define _NTSECPKG_H -#ifdef __cplusplus -extern "C" { -#endif - /* Flags for the MachineState field in SECPKG_PARAMETERS */ #define SECPKG_STATE_ENCRYPTION_PERMITTED 0x01 #define SECPKG_STATE_STRONG_ENCRYPTION_PERMITTED 0x02 @@ -34,9 +30,6 @@ extern "C" { #define SECPKG_INTERFACE_VERSION 0x10000 #define SECPKG_INTERFACE_VERSION_2 0x20000 #define SECPKG_INTERFACE_VERSION_3 0x40000 -#define SECPKG_INTERFACE_VERSION_4 0x80000 -#define SECPKG_INTERFACE_VERSION_5 0x100000 -#define SECPKG_INTERFACE_VERSION_6 0x200000 /* enum definitions for Secure Service Provider/Authentication Packages */ typedef enum _LSA_TOKEN_INFORMATION_TYPE { @@ -147,11 +140,6 @@ typedef struct _SECPKG_EXTENDED_INFORMATION { } Info; } SECPKG_EXTENDED_INFORMATION, *PSECPKG_EXTENDED_INFORMATION; -typedef struct _SECPKG_TARGETINFO { - PSID DomainSid; - PCWSTR ComputerName; -} SECPKG_TARGETINFO, *PSECPKG_TARGETINFO; - /* callbacks implemented by SSP/AP dlls and called by the LSA */ typedef VOID (NTAPI *PLSA_CALLBACK_FUNCTION)(ULONG_PTR, ULONG_PTR, PSecBuffer, PSecBuffer); @@ -353,18 +341,6 @@ typedef NTSTATUS (NTAPI SpSetContextAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID, ULONG); typedef NTSTATUS (NTAPI SpSetCredentialsAttributesFn)(LSA_SEC_HANDLE, ULONG, PVOID, ULONG); -typedef NTSTATUS (NTAPI SpChangeAccountPasswordFn)(PUNICODE_STRING, - PUNICODE_STRING, PUNICODE_STRING, PUNICODE_STRING, BOOLEAN, PSecBufferDesc); -typedef NTSTATUS (NTAPI SpQueryMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING, - ULONG, PULONG, PUCHAR *, PLSA_SEC_HANDLE); -typedef NTSTATUS (NTAPI SpExchangeMetaDataFn)(LSA_SEC_HANDLE, PUNICODE_STRING, - ULONG, ULONG, PUCHAR, PLSA_SEC_HANDLE); -typedef NTSTATUS (NTAPI SpGetCredUIContextFn)(LSA_SEC_HANDLE, GUID *, PULONG, - PUCHAR *); -typedef NTSTATUS (NTAPI SpUpdateCredentialsFn)(LSA_SEC_HANDLE, GUID *, ULONG, - PUCHAR); -typedef NTSTATUS (NTAPI SpValidateTargetInfoFn)(PLSA_CLIENT_REQUEST, PVOID, - PVOID, ULONG, PSECPKG_TARGETINFO); /* User-mode functions implemented by SSP/AP obtainable by a dispatch table */ typedef NTSTATUS (NTAPI SpInstanceInitFn)(ULONG, PSECPKG_DLL_FUNCTIONS, @@ -426,15 +402,6 @@ typedef struct SECPKG_FUNCTION_TABLE { /* Packages with version SECPKG_INTERFACE_VERSION_2 end here */ SpSetCredentialsAttributesFn *SetCredentialsAttributes; /* Packages with version SECPKG_INTERFACE_VERSION_3 end here */ - SpChangeAccountPasswordFn *ChangeAccountPassword; - /* Packages with version SECPKG_INTERFACE_VERSION_4 end here */ - SpQueryMetaDataFn *QueryMetaData; - SpExchangeMetaDataFn *ExchangeMetaData; - SpGetCredUIContextFn *GetCredUIContext; - SpUpdateCredentialsFn *UpdateCredentials; - /* Packages with version SECPKG_INTERFACE_VERSION_5 end here */ - SpValidateTargetInfoFn *ValidateTargetInfo; - /* Packages with version SECPKG_INTERFACE_VERSION_6 end here */ } SECPKG_FUNCTION_TABLE, *PSECPKG_FUNCTION_TABLE; @@ -465,7 +432,4 @@ typedef NTSTATUS (NTAPI *SpLsaModeInitializeFn)(ULONG, PULONG, typedef NTSTATUS (WINAPI *SpUserModeInitializeFn)(ULONG, PULONG, PSECPKG_USER_FUNCTION_TABLE *, PULONG); -#ifdef __cplusplus -} -#endif #endif /* _NTSECPKG_H */ diff --git a/include/psdk/objbase.h b/include/psdk/objbase.h index e9295de6cf3..57da913bf51 100644 --- a/include/psdk/objbase.h +++ b/include/psdk/objbase.h @@ -225,9 +225,10 @@ #define THIS void #define interface struct -#define DECLARE_INTERFACE(iface) interface DECLSPEC_NOVTABLE iface -#define DECLARE_INTERFACE_(iface,ibase) interface DECLSPEC_NOVTABLE iface : public ibase -#define DECLARE_INTERFACE_IID_(iface, ibase, iid) interface DECLSPEC_UUID(iid) DECLSPEC_NOVTABLE iface : public ibase +#define DECLARE_INTERFACE(iface) interface iface +#define DECLARE_INTERFACE_(iface,ibase) interface iface : public ibase +#define DECLARE_INTERFACE_IID(iface, iid) interface DECLSPEC_UUID(iid) iface +#define DECLARE_INTERFACE_IID_(iface, baseiface, iid) interface DECLSPEC_UUID(iid) iface : public baseiface #define BEGIN_INTERFACE #define END_INTERFACE @@ -267,7 +268,6 @@ struct iface##Vtbl #endif #define DECLARE_INTERFACE_(iface,ibase) DECLARE_INTERFACE(iface) -#define DECLARE_INTERFACE_IID_(iface, ibase, iid) DECLARE_INTERFACE_(iface, ibase) #define BEGIN_INTERFACE #define END_INTERFACE @@ -431,7 +431,7 @@ HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags,DWORD dwTimeout,ULONG cHan * GUID API */ HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR*); -HRESULT WINAPI CLSIDFromString(LPCOLESTR, LPCLSID); +HRESULT WINAPI CLSIDFromString(LPOLESTR, CLSID *); HRESULT WINAPI CLSIDFromProgID(LPCOLESTR progid, LPCLSID riid); HRESULT WINAPI ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *lplpszProgID); diff --git a/include/psdk/psdk.rbuild b/include/psdk/psdk.rbuild index ebf38da2d59..02256ebc338 100644 --- a/include/psdk/psdk.rbuild +++ b/include/psdk/psdk.rbuild @@ -47,7 +47,6 @@ richole.idl sensevts.idl servprov.idl - shdeprecated.idl shldisp.idl shobjidl.idl shtypes.idl @@ -69,8 +68,6 @@ xmldso.idl xmldom.idl xmllite.idl - wia_lh.idl - wia_xp.idl stdole2.idl diff --git a/include/psdk/shdeprecated.idl b/include/psdk/shdeprecated.idl deleted file mode 100644 index 304b0875224..00000000000 --- a/include/psdk/shdeprecated.idl +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Deprecated shell interfaces - * - * Copyright (C) 2010 Nikolay Sivov 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 - */ - -import "objidl.idl"; - -[ - object, - local, - uuid(5836fb00-8187-11cf-a12b-00aa004ae837) -] -interface IShellService : IUnknown -{ - HRESULT SetOwner( [in] IUnknown *pUnk ); -} diff --git a/include/psdk/shlwapi.h b/include/psdk/shlwapi.h index 223bcdd3c05..29e70b76d8c 100644 --- a/include/psdk/shlwapi.h +++ b/include/psdk/shlwapi.h @@ -1028,6 +1028,24 @@ typedef struct _DLLVERSIONINFO2 { HRESULT WINAPI DllInstall(BOOL,LPCWSTR) DECLSPEC_HIDDEN; +#if (_WIN32_IE >= 0x0600) +#define SHGVSPB_PERUSER 0x00000001 +#define SHGVSPB_ALLUSERS 0x00000002 +#define SHGVSPB_PERFOLDER 0x00000004 +#define SHGVSPB_ALLFOLDERS 0x00000008 +#define SHGVSPB_INHERIT 0x00000010 +#define SHGVSPB_ROAM 0x00000020 +#define SHGVSPB_NOAUTODEFAULTS 0x80000000 + +#define SHGVSPB_FOLDER (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER) +#define SHGVSPB_FOLDERNODEFAULTS (SHGVSPB_PERUSER | SHGVSPB_PERFOLDER | SHGVSPB_NOAUTODEFAULTS) +#define SHGVSPB_USERDEFAULTS (SHGVSPB_PERUSER | SHGVSPB_ALLFOLDERS) +#define SHGVSPB_GLOBALDEAFAULTS (SHGVSPB_ALLUSERS | SHGVSPB_ALLFOLDERS) + +HRESULT WINAPI SHGetViewStatePropertyBag(LPCITEMIDLIST pidl, LPWSTR bag_name, DWORD flags, REFIID riid, void **ppv); +#endif /* (_WIN32_IE >= 0x0600) */ + + /* IsOS definitions */ #define OS_WIN32SORGREATER 0x00 @@ -1085,15 +1103,6 @@ BOOL WINAPI IsOS(DWORD); #define FDTF_RTLDATE 0x00000200 #define FDTF_NOAUTOREADINGORDER 0x00000400 - -typedef struct -{ - const IID *piid; - int dwOffset; -} QITAB, *LPQITAB; - -HRESULT WINAPI QISearch(void* base, const QITAB *pqit, REFIID riid, void **ppv); - #include #ifdef __cplusplus diff --git a/include/psdk/sti.h b/include/psdk/sti.h index 204492d9a2f..56650f5a011 100644 --- a/include/psdk/sti.h +++ b/include/psdk/sti.h @@ -31,147 +31,6 @@ extern "C" { DEFINE_GUID(CLSID_Sti, 0xB323F8E0L, 0x2E68, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C); -DEFINE_GUID(IID_IStillImageW, 0x641BD880, 0x2DC8, 0x11D0, 0x90, 0xEA, 0x00, 0xAA, 0x00, 0x60, 0xF8, 0x6C); - -DEFINE_GUID(IID_IStillImageA, 0xA7B1F740, 0x1D7F, 0x11D1, 0xAC, 0xA9, 0x00, 0xA0, 0x24, 0x38, 0xAD, 0x48); - -#define STI_VERSION_REAL 0x00000002 -#define STI_VERSION_FLAG_UNICODE 0x01000000 - -#ifndef WINE_NO_UNICODE_MACROS -# ifdef UNICODE -# define STI_VERSION (STI_VERSION_REAL | STI_VERSION_FLAG_UNICODE) -# else -# define STI_VERSION (STI_VERSION_REAL) -# endif -#endif - -typedef struct IStillImageA *PSTIA; -typedef struct IStillImageW *PSTIW; -DECL_WINELIB_TYPE_AW(PSTI) -typedef struct IStillImageA *LPSTILLIMAGEA; -typedef struct IStillImageW *LPSTILLIMAGEW; -DECL_WINELIB_TYPE_AW(LPSTILLIMAGE) -typedef struct IStiDeviceA *PSTIDEVICEA; -typedef struct IStiDeviceW *PSTIDEVICEW; -DECL_WINELIB_TYPE_AW(PSTIDEVICE) - -HRESULT WINAPI StiCreateInstanceA(HINSTANCE hinst, DWORD dwVer, PSTIA *ppSti, LPUNKNOWN pUnkOuter); -HRESULT WINAPI StiCreateInstanceW(HINSTANCE hinst, DWORD dwVer, PSTIW *ppSti, LPUNKNOWN pUnkOuter); -#define StiCreateInstance WINELIB_NAME_AW(StiCreateInstance) - -typedef DWORD STI_DEVICE_TYPE; -typedef enum _STI_DEVICE_MJ_TYPE -{ - StiDeviceTypeDefault = 0, - StiDeviceTypeScanner = 1, - StiDeviceTypeDigitalCamera = 2, - StiDeviceTypeStreamingVideo = 3 -} STI_DEVICE_MJ_TYPE; - -#define GET_STIDEVICE_TYPE(dwDevType) HIWORD(dwDevType) -#define GET_STIDEVICE_SUBTYPE(dwDevType) LOWORD(dwDevType) - -typedef struct _STI_DEV_CAPS { - DWORD dwGeneric; -} STI_DEV_CAPS, *PSTI_DEV_CAPS; - -#define STI_MAX_INTERNAL_NAME_LENGTH 128 - -typedef struct _STI_DEVICE_INFORMATIONW { - DWORD dwSize; - STI_DEVICE_TYPE DeviceType; - WCHAR szDeviceInternalName[STI_MAX_INTERNAL_NAME_LENGTH]; - STI_DEV_CAPS DeviceCapabilities; - DWORD dwHardwareConfiguration; - LPWSTR pszVendorDescription; - LPWSTR pszDeviceDescription; - LPWSTR pszPortName; - LPWSTR pszPropProvider; - LPWSTR pszLocalName; -} STI_DEVICE_INFORMATIONW, *PSTI_DEVICE_INFORMATIONW; - -typedef STI_DEVICE_INFORMATIONW STI_DEVICE_INFORMATION; -typedef PSTI_DEVICE_INFORMATIONW PSTI_DEVICE_INFORMATION; - -#define MAX_NOTIFICATION_DATA 64 - -typedef struct _STINOTIFY { - DWORD dwSize; - GUID guidNotificationCode; - BYTE abNotificationData[MAX_NOTIFICATION_DATA]; -} STINOTIFY,*LPSTINOTIFY; - -#define INTERFACE IStillImageW -DECLARE_INTERFACE_(IStillImageW, IUnknown) -{ - /*** IUnknown methods ***/ - STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; - STDMETHOD_(ULONG,AddRef)(THIS) PURE; - STDMETHOD_(ULONG,Release)(THIS) PURE; - /*** IStillImageW methods ***/ - STDMETHOD(Initialize)(THIS_ HINSTANCE hinst, DWORD dwVersion) PURE; - STDMETHOD(GetDeviceList)(THIS_ DWORD dwType, DWORD dwFlags, DWORD *pdwItemsReturned, LPVOID *ppBuffer) PURE; - STDMETHOD(GetDeviceInfo)(THIS_ LPWSTR pwszDeviceName, LPVOID *ppBuffer) PURE; - STDMETHOD(CreateDevice)(THIS_ LPWSTR pwszDeviceName, DWORD dwMode, PSTIDEVICEW *pDevice, LPUNKNOWN pUnkOuter) PURE; - STDMETHOD(GetDeviceValue)(THIS_ LPWSTR pwszDeviceName, LPWSTR pValueName, LPDWORD pType, LPBYTE pData, LPDWORD cbData) PURE; - STDMETHOD(SetDeviceValue)(THIS_ LPWSTR pwszDeviceName, LPWSTR pValueName, DWORD type, LPBYTE pData, DWORD cbData) PURE; - STDMETHOD(GetSTILaunchInformation)(THIS_ LPWSTR pwszDeviceName, DWORD *pdwEventCode, LPWSTR pwszEventName) PURE; - STDMETHOD(RegisterLaunchApplication)(THIS_ LPWSTR pwszAppName, LPWSTR pwszCommandLine) PURE; - STDMETHOD(UnregisterLaunchApplication)(THIS_ LPWSTR pwszAppName) PURE; - STDMETHOD(EnableHwNotifications)(THIS_ LPCWSTR pwszDeviceName, BOOL bNewState) PURE; - STDMETHOD(GetHwNotificationState)(THIS_ LPCWSTR pwszDeviceName, BOOL *pbCurrentState) PURE; - STDMETHOD(RefreshDeviceBus)(THIS_ LPCWSTR pwszDeviceName) PURE; - STDMETHOD(LaunchApplicationForDevice)(THIS_ LPWSTR pwszDeviceName, LPWSTR pwszAppName, LPSTINOTIFY pStiNotify); - STDMETHOD(SetupDeviceParameters)(THIS_ PSTI_DEVICE_INFORMATIONW pDevInfo); - STDMETHOD(WriteToErrorLog)(THIS_ DWORD dwMessageType, LPCWSTR pszMessage) PURE; -}; -#undef INTERFACE - -#if !defined(__cplusplus) || defined(CINTERFACE) -/*** IUnknown methods ***/ -#define IStillImage_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) -#define IStillImage_AddRef(p) (p)->lpVtbl->AddRef(p) -#define IStillImage_Release(p) (p)->lpVtbl->Release(p) -/*** IStillImage methods ***/ -#define IStillImage_Initialize(p,a,b) (p)->lpVtbl->Initialize(p,a,b) -#define IStillImage_GetDeviceList(p,a,b,c,d) (p)->lpVtbl->GetDeviceList(p,a,b,c,d) -#define IStillImage_GetDeviceInfo(p,a,b) (p)->lpVtbl->GetDeviceInfo(p,a,b) -#define IStillImage_CreateDevice(p,a,b,c,d) (p)->lpVtbl->CreateDevice(p,a,b,c,d) -#define IStillImage_GetDeviceValue(p,a,b,c,d,e) (p)->lpVtbl->GetDeviceValue(p,a,b,c,d,e) -#define IStillImage_SetDeviceValue(p,a,b,c,d,e) (p)->lpVtbl->SetDeviceValue(p,a,b,c,d,e) -#define IStillImage_GetSTILaunchInformation(p,a,b,c) (p)->lpVtbl->GetSTILaunchInformation(p,a,b,c) -#define IStillImage_RegisterLaunchApplication(p,a,b) (p)->lpVtbl->RegisterLaunchApplication(p,a,b) -#define IStillImage_UnregisterLaunchApplication(p,a) (p)->lpVtbl->UnregisterLaunchApplication(p,a) -#define IStillImage_EnableHwNotifications(p,a,b) (p)->lpVtbl->EnableHwNotifications(p,a,b) -#define IStillImage_GetHwNotificationState(p,a,b) (p)->lpVtbl->GetHwNotificationState(p,a,b) -#define IStillImage_RefreshDeviceBus(p,a) (p)->lpVtbl->RefreshDeviceBus(p,a) -#define IStillImage_LaunchApplicationForDevice(p,a,b,c) (p)->lpVtbl->LaunchApplicationForDevice(p,a,b,c) -#define IStillImage_SetupDeviceParameters(p,a) (p)->lpVtbl->SetupDeviceParameters(p,a) -#define IStillImage_WriteToErrorLog(p,a,b) (p)->lpVtbl->WriteToErrorLog(p,a,b) -#else -/*** IUnknown methods ***/ -#define IStillImage_QueryInterface(p,a,b) (p)->QueryInterface(a,b) -#define IStillImage_AddRef(p) (p)->AddRef() -#define IStillImage_Release(p) (p)->Release() -/*** IStillImage methods ***/ -#define IStillImage_Initialize(p,a,b) (p)->Initialize(a,b) -#define IStillImage_GetDeviceList(p,a,b,c,d) (p)->GetDeviceList(a,b,c,d) -#define IStillImage_GetDeviceInfo(p,a,b) (p)->GetDeviceInfo(a,b) -#define IStillImage_CreateDevice(p,a,b,c,d) (p)->CreateDevice(a,b,c,d) -#define IStillImage_GetDeviceValue(p,a,b,c,d,e) (p)->GetDeviceValue(a,b,c,d,e) -#define IStillImage_SetDeviceValue(p,a,b,c,d,e) (p)->SetDeviceValue(a,b,c,d,e) -#define IStillImage_GetSTILaunchInformation(p,a,b,c) (p)->GetSTILaunchInformation(a,b,c) -#define IStillImage_RegisterLaunchApplication(p,a,b) (p)->RegisterLaunchApplication(a,b) -#define IStillImage_UnregisterLaunchApplication(p,a) (p)->UnregisterLaunchApplication(a) -#define IStillImage_EnableHwNotifications(p,a,b) (p)->EnableHwNotifications(a,b) -#define IStillImage_GetHwNotificationState(p,a,b) (p)->GetHwNotificationState(a,b) -#define IStillImage_RefreshDeviceBus(p,a) (p)->RefreshDeviceBus(a) -#define IStillImage_LaunchApplicationForDevice(p,a,b,c) (p)->LaunchApplicationForDevice(a,b,c) -#define IStillImage_SetupDeviceParameters(p,a) (p)->SetupDeviceParameters(a) -#define IStillImage_WriteToErrorLog(p,a,b) (p)->WriteToErrorLog(a,b) -#endif - #ifdef __cplusplus }; #endif diff --git a/include/psdk/strsafe.h b/include/psdk/strsafe.h deleted file mode 100644 index 7f09e1bd0fe..00000000000 --- a/include/psdk/strsafe.h +++ /dev/null @@ -1,626 +0,0 @@ -#ifndef __STRSAFE_H_ -#define __STRSAFE_H_ - -#include -#include - -#if defined(STRSAFE_NO_CCH_FUNCTIONS) && defined(STRSAFE_NO_CB_FUNCTIONS) -#error Both STRSAFE_NO_CCH_FUNCTIONS and STRSAFE_NO_CB_FUNCTIONS are defined -#endif - -#ifndef SUCCEEDED -#define SUCCEEDED(Status) ((HRESULT)(Status) >= 0) -#endif -#define STRSAFE_MAX_CCH 2147483647 -#define STRSAFE_E_INVALID_PARAMETER ((HRESULT)0x80070057L) -#define STRSAFE_E_INSUFFICIENT_BUFFER ((HRESULT)0x8007007AL) -#define STRSAFE_E_END_OF_FILE ((HRESULT)0x80070026L) - -#define STRSAFE_FILL_BEHIND_NULL 0x00000200 -#define STRSAFE_IGNORE_NULLS 0x00000200 -#define STRSAFE_FILL_ON_FAILURE 0x00000400 -#define STRSAFE_NULL_ON_FAILURE 0x00000800 -#define STRSAFE_NO_TRUNCATION 0x00001000 - -#ifndef S_OK -#define S_OK ((HRESULT)0x00000000L) -#endif - -#define STRSAFE_MIN(a,b) (((a) < (b))?(a):(b)) - -#ifndef _HRESULT_DEFINED -#define _HRESULT_DEFINED -typedef long HRESULT; -#endif - -typedef char * STRSAFE_LPSTR; -typedef const char * STRSAFE_LPCSTR; -typedef wchar_t * STRSAFE_LPWSTR; -typedef const wchar_t * STRSAFE_LPCWSTR; -typedef unsigned long STRSAFE_DWORD; - -#define STRSAFE_PASS2 - -/* Implement Cb functions for ansi and unicode */ -#ifndef STRSAFE_NO_CB_FUNCTIONS -#define STRSAFE_CB -#define STRSAFE_UNICODE 0 -# include -#undef STRSAFE_UNICODE -#define STRSAFE_UNICODE 1 -# include -#undef STRSAFE_UNICODE -#undef STRSAFE_CB -#endif // !STRSAFE_NO_CB_FUNCTIONS - -/* Implement Cch functions for ansi and unicode */ -#ifndef STRSAFE_NO_CCH_FUNCTIONS -#define STRSAFE_UNICODE 0 -# include -#undef STRSAFE_UNICODE -#define STRSAFE_UNICODE 1 -# include -#undef STRSAFE_UNICODE -#endif // !STRSAFE_NO_CCH_FUNCTIONS - -#undef STRSAFE_PASS2 - -/* Now define the functions depending on UNICODE */ -#if defined(UNICODE) -# define STRSAFE_UNICODE 1 -#else -# define STRSAFE_UNICODE 0 -#endif -#include -#undef STRSAFE_UNICODE - -#endif // !__STRSAFE_H_ - -/*****************************************************************************/ - -#if defined(STRSAFE_UNICODE) -#if (STRSAFE_UNICODE == 1) - -#define STRSAFE_LPTSTR STRSAFE_LPWSTR -#define STRSAFE_LPCTSTR STRSAFE_LPCWSTR -#define STRSAFE_TCHAR wchar_t - -#define StringCbCat StringCbCatW -#define StringCbCatEx StringCbCatExW -#define StringCbCatN StringCbCatNW -#define StringCbCatNEx StringCbCatNExW -#define StringCbCatWorker StringCxxCatWorkerW -#define StringCbCopy StringCbCopyW -#define StringCbCopyEx StringCbCopyExW -#define StringCbCopyN StringCbCopyNW -#define StringCbCopyNEx StringCbCopyNExW -#define StringCbGets StringCbGetsW -#define StringCbGetsEx StringCbGetsExW -#define StringCbLength StringCbLengthW -#define StringCbPrintf StringCbPrintfW -#define StringCbPrintfEx StringCbPrintfExW -#define StringCbVPrintf StringCbVPrintfW -#define StringCbVPrintfEx StringCbVPrintfExW -#define StringCchCat StringCchCatW -#define StringCchCatEx StringCchCatExW -#define StringCchCatN StringCchCatNW -#define StringCchCatNEx StringCchCatNExW -#define StringCchCatWorker StringCchCatWorkerW -#define StringCchCopy StringCchCopyW -#define StringCchCopyEx StringCchCopyExW -#define StringCchCopyN StringCchCopyNW -#define StringCchCopyNEx StringCchCopyNExW -#define StringCchGets StringCchGetsW -#define StringCchGetsEx StringCchGetsExW -#define StringCchLength StringCchLengthW -#define StringCchPrintf StringCchPrintfW -#define StringCchPrintfEx StringCchPrintfExW -#define StringCchVPrintf StringCchVPrintfW -#define StringCchVPrintfEx StringCchVPrintfExW -#define _vsnprintfAW _vsnwprintf - -#else // (STRSAFE_UNICODE != 1) - -#define STRSAFE_LPTSTR STRSAFE_LPSTR -#define STRSAFE_LPCTSTR STRSAFE_LPCSTR -#define STRSAFE_TCHAR char - -#define StringCbCat StringCbCatA -#define StringCbCatEx StringCbCatExA -#define StringCbCatN StringCbCatNA -#define StringCbCatNEx StringCbCatNExA -#define StringCbCatWorker StringCxxCatWorkerA -#define StringCbCopy StringCbCopyA -#define StringCbCopyEx StringCbCopyExA -#define StringCbCopyN StringCbCopyNA -#define StringCbCopyNEx StringCbCopyNExA -#define StringCbGets StringCbGetsA -#define StringCbGetsEx StringCbGetsExA -#define StringCbLength StringCbLengthA -#define StringCbPrintf StringCbPrintfA -#define StringCbPrintfEx StringCbPrintfExA -#define StringCbVPrintf StringCbVPrintfA -#define StringCbVPrintfEx StringCbVPrintfExA -#define StringCchCat StringCchCatA -#define StringCchCatEx StringCchCatExA -#define StringCchCatN StringCchCatNA -#define StringCchCatNEx StringCchCatNExA -#define StringCchCatWorker StringCchCatWorkerA -#define StringCchCopy StringCchCopyA -#define StringCchCopyEx StringCchCopyExA -#define StringCchCopyN StringCchCopyNA -#define StringCchCopyNEx StringCchCopyNExA -#define StringCchGets StringCchGetsA -#define StringCchGetsEx StringCchGetsExA -#define StringCchLength StringCchLengthA -#define StringCchPrintf StringCchPrintfA -#define StringCchPrintfEx StringCchPrintfExA -#define StringCchVPrintf StringCchVPrintfA -#define StringCchVPrintfEx StringCchVPrintfExA -#define _vsnprintfAW _vsnprintf - -#endif // (STRSAFE_UNICODE != 1) -#endif // defined(STRSAFE_UNICODE) - -/*****************************************************************************/ - -#if defined (STRSAFE_PASS2) - -#if defined(STRSAFE_CB) - -#define STRSAFE_CXXtoCB(x) (x) -#define STRSAFE_CBtoCXX(x) (x) -#define STRSAFE_CXXtoCCH(x) (x)/sizeof(STRSAFE_TCHAR) -#define STRSAFE_CCHtoCXX(x) (x)*sizeof(STRSAFE_TCHAR) -#define StringCxxCat StringCbCat -#define StringCxxCatEx StringCbCatEx -#define StringCxxCatN StringCbCatN -#define StringCxxCatNEx StringCbCatNEx -#define StringCxxCatWorker StringCbCatWorker -#define StringCxxCopy StringCbCopy -#define StringCxxCopyEx StringCbCopyEx -#define StringCxxCopyN StringCbCopyN -#define StringCxxCopyNEx StringCbCopyNEx -#define StringCxxGets StringCbGets -#define StringCxxGetsEx StringCbGetsEx -#define StringCxxLength StringCbLength -#define StringCxxPrintf StringCbPrintf -#define StringCxxPrintfEx StringCbPrintfEx -#define StringCxxVPrintf StringCbVPrintf -#define StringCxxVPrintfEx StringCbVPrintfEx - -#else // !STRSAFE_CB - -#define STRSAFE_CXXtoCB(x) (x)*sizeof(STRSAFE_TCHAR) -#define STRSAFE_CBtoCXX(x) (x)/sizeof(STRSAFE_TCHAR) -#define STRSAFE_CXXtoCCH(x) (x) -#define STRSAFE_CCHtoCXX(x) (x) -#define StringCxxCat StringCchCat -#define StringCxxCatEx StringCchCatEx -#define StringCxxCatN StringCchCatN -#define StringCxxCatNEx StringCchCatNEx -#define StringCxxCatWorker StringCchCatWorker -#define StringCxxCopy StringCchCopy -#define StringCxxCopyEx StringCchCopyEx -#define StringCxxCopyN StringCchCopyN -#define StringCxxCopyNEx StringCchCopyNEx -#define StringCxxGets StringCchGets -#define StringCxxGetsEx StringCchGetsEx -#define StringCxxLength StringCchLength -#define StringCxxPrintf StringCchPrintf -#define StringCxxPrintfEx StringCchPrintfEx -#define StringCxxVPrintf StringCchVPrintf -#define StringCxxVPrintfEx StringCchVPrintfEx - -#endif // !STRSAFE_CB - -#ifdef STRSAFE_LIB - -/* Normal function prototypes only */ -#define STRSAFEAPI HRESULT __stdcall - -STRSAFEAPI StringCxxCat(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc); -STRSAFEAPI StringCxxCatEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); -STRSAFEAPI StringCxxCatN(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbMaxAppend); -STRSAFEAPI StringCxxCatNEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbMaxAppend, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); -STRSAFEAPI StringCxxCopy(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc); -STRSAFEAPI StringCxxCopyEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); -STRSAFEAPI StringCxxCopyN(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbSrc); -STRSAFEAPI StringCxxCopyNEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszSrc, size_t cbSrc, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); -STRSAFEAPI StringCxxGets(STRSAFE_LPTSTR pszDest, size_t cxDest); -STRSAFEAPI StringCxxGetsEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags); -STRSAFEAPI StringCxxLength(STRSAFE_LPCTSTR psz, size_t cxMax, size_t *pcb); -STRSAFEAPI StringCxxPrintf(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszFormat, ...); -STRSAFEAPI StringCxxPrintfEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, STRSAFE_LPCTSTR pszFormat, ...); -STRSAFEAPI StringCxxVPrintf(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPCTSTR pszFormat, va_list args); -STRSAFEAPI StringCxxVPrintfEx(STRSAFE_LPTSTR pszDest, size_t cxDest, STRSAFE_LPTSTR *ppszDestEnd, size_t *pcbRemaining, STRSAFE_DWORD dwFlags, LPCTSTR pszFormat, va_list args); - -#else // !STRSAFE_LIB - -/* Create inlined versions */ -#define STRSAFEAPI HRESULT static __inline__ - -#define STRSAFE_MAX_CXX STRSAFE_CCHtoCXX(STRSAFE_MAX_CCH) - -STRSAFEAPI -StringCxxCatWorker( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszSrc, - size_t cxMaxAppend, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags, - int UseN) -{ - HRESULT result; - STRSAFE_LPTSTR psz = pszDest; - size_t cch = STRSAFE_CXXtoCCH(cxDest); - - if (!pszDest || !pszSrc || cxDest > STRSAFE_MAX_CXX || cxDest == 0) - { - return STRSAFE_E_INVALID_PARAMETER; - } - - for (--psz; *(++psz) != 0 && --cch > 0;); - if (cch == 0) - { - return STRSAFE_E_INSUFFICIENT_BUFFER; - } - - if (UseN) - { - cch = STRSAFE_MIN(cxDest, STRSAFE_CXXtoCCH(cxMaxAppend)); - } - - for (--pszSrc, --psz; (*(++psz) = *(++pszSrc)) != 0 && --cch > 0;); - if (cch == 0) - { - result = STRSAFE_E_INSUFFICIENT_BUFFER; - } - else - result = S_OK; - - if (ppszDestEnd) - { - *ppszDestEnd = psz; - } - - if (pcbRemaining) - { - *pcbRemaining = STRSAFE_CCHtoCXX(cch); - } - - if (dwFlags & STRSAFE_FILL_BEHIND_NULL) - { - for (--psz, ++cch; --cch; *(++psz) = dwFlags & 0xff); - } - - if (!SUCCEEDED(result)) - { - if (dwFlags & STRSAFE_FILL_ON_FAILURE) - { - cch = STRSAFE_CXXtoCCH(cxDest); - for (--pszDest, ++cch; --cch; *(++pszDest) = dwFlags & 0xff); - } - - if (dwFlags & STRSAFE_NULL_ON_FAILURE) - { - *pszDest = 0; - } - } - - return result; -} - -STRSAFEAPI -StringCxxCatEx( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszSrc, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags) -{ - return StringCxxCatWorker(pszDest, cxDest, pszSrc, 0, ppszDestEnd, pcbRemaining, dwFlags, 0); -} - -STRSAFEAPI -StringCxxCat( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszSrc) -{ - return StringCxxCatWorker(pszDest, cxDest, pszSrc, 0, NULL, NULL, 0, 0); -} - -STRSAFEAPI -StringCxxCatN( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszSrc, - size_t cbMaxAppend) -{ - return StringCxxCatWorker(pszDest, cxDest, pszSrc, cbMaxAppend, NULL, NULL, 0, 1); -} - -STRSAFEAPI -StringCxxCatNEx( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszSrc, - size_t cbMaxAppend, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags) -{ - return StringCxxCatWorker(pszDest, cxDest, pszSrc, cbMaxAppend, ppszDestEnd, pcbRemaining, dwFlags, 1); -} - -STRSAFEAPI -StringCxxCopy( - STRSAFE_LPTSTR pszDest, - size_t cbDest, - STRSAFE_LPCTSTR pszSrc) -{ - return 0; // FIXME -} - -STRSAFEAPI -StringCxxCopyEx( - STRSAFE_LPTSTR pszDest, - size_t cbDest, - STRSAFE_LPCTSTR pszSrc, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags) -{ - return 0; // FIXME -} - -STRSAFEAPI -StringCxxCopyN( - STRSAFE_LPTSTR pszDest, - size_t cbDest, - STRSAFE_LPCTSTR pszSrc, - size_t cbSrc) -{ - return 0; // FIXME -} - -STRSAFEAPI -StringCxxCopyNEx( - STRSAFE_LPTSTR pszDest, - size_t cbDest, - STRSAFE_LPCTSTR pszSrc, - size_t cbSrc, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags) -{ - return 0; // FIXME -} - -STRSAFEAPI -StringCxxGets( - STRSAFE_LPTSTR pszDest, - size_t cbDest) -{ - return 0; // FIXME -} - -STRSAFEAPI -StringCxxGetsEx( - STRSAFE_LPTSTR pszDest, - size_t cbDest, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags) -{ - return 0; // FIXME -} - -STRSAFEAPI -StringCxxLength( - STRSAFE_LPCTSTR psz, - size_t cxMax, - size_t *pcx) -{ - size_t cch = STRSAFE_CXXtoCCH(cxMax); - - /* Default return on error */ - if (pcx) - *pcx = 0; - - if (!psz || cxMax > STRSAFE_MAX_CXX || cxMax == 0) - { - return STRSAFE_E_INVALID_PARAMETER; - } - - for (--psz; *(++psz) != 0 && --cch > 0;); - - if (cch == 0) - { - return STRSAFE_E_INVALID_PARAMETER; - } - - if (pcx) - *pcx = cxMax - STRSAFE_CCHtoCXX(cch); - - return S_OK; -} - -STRSAFEAPI -StringCxxVPrintfEx( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcxRemaining, - STRSAFE_DWORD dwFlags, - STRSAFE_LPCTSTR pszFormat, - va_list args) -{ - size_t cchDest = STRSAFE_CXXtoCCH(cxDest); - size_t cchMax = cchDest - 1; - int iResult; - HRESULT hr; - - if (dwFlags & STRSAFE_IGNORE_NULLS) - { - if (!pszDest) pszDest = (STRSAFE_LPTSTR)L""; - if (!pszFormat) pszFormat = (STRSAFE_LPTSTR)L""; - } - - if (!pszDest || !pszFormat || cxDest > STRSAFE_MAX_CXX || cxDest == 0) - { - return STRSAFE_E_INVALID_PARAMETER; - } - -#if (STRSAFE_USE_SECURE_CRT == 1) - iResult = _vsnprintf_sAW(pszDest, cchDest, cchMax, pszFormat, args); -#else - iResult = _vsnprintfAW(pszDest, cchMax, pszFormat, args); -#endif - - hr = (iResult == -1) ? STRSAFE_E_INSUFFICIENT_BUFFER : S_OK; - - if ((size_t)iResult >= cchMax) - { - pszDest[cchMax] = 0; - iResult = cchMax; - } - - if (ppszDestEnd) *ppszDestEnd = pszDest + iResult; - - if (pcxRemaining) *pcxRemaining = STRSAFE_CCHtoCXX(cchMax - iResult); - - if (SUCCEEDED(hr)) - { - if ((dwFlags & STRSAFE_FILL_BEHIND_NULL) && (iResult + 1 < cchMax)) - { - memset(pszDest + iResult + 1, - dwFlags & 0xff, - (cchMax - iResult - 1) * sizeof(STRSAFE_TCHAR)); - } - } - else - { - if (dwFlags & STRSAFE_FILL_ON_FAILURE) - { - memset(pszDest, dwFlags & 0xff, cchMax * sizeof(STRSAFE_TCHAR)); - } - else if (dwFlags & STRSAFE_NULL_ON_FAILURE) - { - *pszDest = 0; - } - } - - return hr; -} - -STRSAFEAPI -StringCxxVPrintf( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszFormat, - va_list args) -{ - return StringCxxVPrintfEx(pszDest, cxDest, NULL, NULL, 0, pszFormat, args); -} - -STRSAFEAPI -StringCxxPrintf( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPCTSTR pszFormat, ...) -{ - HRESULT result; - va_list args; - va_start(args, pszFormat); - result = StringCxxVPrintf(pszDest, cxDest, pszFormat, args); - va_end(args); - return result; -} - -STRSAFEAPI -StringCxxPrintfEx( - STRSAFE_LPTSTR pszDest, - size_t cxDest, - STRSAFE_LPTSTR *ppszDestEnd, - size_t *pcbRemaining, - STRSAFE_DWORD dwFlags, - STRSAFE_LPCTSTR pszFormat, ...) -{ - HRESULT result; - va_list args; - va_start(args, pszFormat); - result = StringCxxVPrintfEx(pszDest, cxDest, ppszDestEnd, pcbRemaining, dwFlags, pszFormat, args); - va_end(args); - return result; -} - -#endif // !STRSAFE_LIB - -/* Functions are implemented or defined, clear #defines for next pass */ -#undef StringCxxCat -#undef StringCxxCatEx -#undef StringCxxCatN -#undef StringCxxCatNEx -#undef StringCxxCatWorker -#undef StringCxxCopy -#undef StringCxxCopyEx -#undef StringCxxCopyN -#undef StringCxxCopyNEx -#undef StringCxxGets -#undef StringCxxGetsEx -#undef StringCxxLength -#undef StringCxxPrintf -#undef StringCxxPrintfEx -#undef StringCxxVPrintf -#undef StringCxxVPrintfEx - -#undef StringCbCat -#undef StringCbCatEx -#undef StringCbCatN -#undef StringCbCatNEx -#undef StringCbCatWorker -#undef StringCbCopy -#undef StringCbCopyEx -#undef StringCbCopyN -#undef StringCbCopyNEx -#undef StringCbGets -#undef StringCbGetsEx -#undef StringCbLength -#undef StringCbPrintf -#undef StringCbPrintfEx -#undef StringCbVPrintf -#undef StringCbVPrintfEx -#undef StringCchCat -#undef StringCchCatEx -#undef StringCchCatN -#undef StringCchCatNEx -#undef StringCchCatWorker -#undef StringCchCopy -#undef StringCchCopyEx -#undef StringCchCopyN -#undef StringCchCopyNEx -#undef StringCchGets -#undef StringCchGetsEx -#undef StringCchLength -#undef StringCchPrintf -#undef StringCchPrintfEx -#undef StringCchVPrintf -#undef StringCchVPrintfEx -#undef _vsnprintfAW - -#undef STRSAFE_LPTSTR -#undef STRSAFE_LPCTSTR -#undef STRSAFE_TCHAR - -#undef STRSAFE_CXXtoCB -#undef STRSAFE_CBtoCXX -#undef STRSAFE_CXXtoCCH -#undef STRSAFE_CCHtoCXX - -#endif // defined (STRSAFE_PASS2) - diff --git a/include/psdk/wia.h b/include/psdk/wia.h deleted file mode 100644 index 3a0497e6d83..00000000000 --- a/include/psdk/wia.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2009 Damjan Jovanovic - * - * 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 - */ - - -#ifdef __WINESRC__ -#error Specify wia_lh.h or wia_xp.h explicitly in Wine -#endif - -#if (_WIN32_WINNT >= 0x0600) -#include -#elif (_WIN32_WINNT >= 0x0501) -#include -#endif diff --git a/include/psdk/wia_lh.idl b/include/psdk/wia_lh.idl deleted file mode 100644 index 5024787a6fc..00000000000 --- a/include/psdk/wia_lh.idl +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2009 Damjan Jovanovic - * - * 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 - */ - -import "wtypes.idl"; -import "objidl.idl"; - -interface IEnumWIA_DEV_INFO; -interface IWiaItem; -interface IWiaEventCallback; - -cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);") - -[ - object, - uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811) -] -interface IWiaDevMgr : IUnknown -{ - HRESULT EnumDeviceInfo( - [in] LONG lFlag, - [retval, out] IEnumWIA_DEV_INFO **ppIEnum); - - HRESULT CreateDevice( - [in] BSTR bstrDeviceID, - [out] IWiaItem **ppWiaItemRoot); - - HRESULT SelectDeviceDlg( - [in] HWND hwndParent, - [in] LONG lDeviceType, - [in] LONG lFlags, - [in, out] BSTR *pbstrDeviceID, - [retval, out] IWiaItem **ppItemRoot); - - HRESULT SelectDeviceDlgID( - [in] HWND hwndParent, - [in] LONG lDeviceType, - [in] LONG lFlags, - [retval, out] BSTR *pbstrDeviceID); - - HRESULT GetImageDlg( - [in] HWND hwndParent, - [in] LONG lDeviceType, - [in] LONG lFlags, - [in] LONG lIntent, - [in] IWiaItem *pItemRoot, - [in] BSTR bstrFilename, - [in, out] GUID *pguidFormat); - - HRESULT RegisterEventCallbackProgram( - [in] LONG lFlags, - [in] BSTR bstrDeviceID, - [in] const GUID *pEventGUID, - [in] BSTR bstrCommandline, - [in] BSTR bstrName, - [in] BSTR bstrDescription, - [in] BSTR bstrIcon); - - HRESULT RegisterEventCallbackInterface( - [in] LONG lFlags, - [in] BSTR bstrDeviceID, - [in] const GUID *pEventGUID, - [unique, in] IWiaEventCallback *pIWiaEventCallback, - [out] IUnknown **pEventObject); - - HRESULT RegisterEventCallbackCLSID( - [in] LONG lFlags, - [in] BSTR bstrDeviceID, - [in] const GUID *pEventGUID, - [unique, in] const GUID *pClsID, - [in] BSTR bstrName, - [in] BSTR bstrDescription, - [in] BSTR bstrIcon); - - HRESULT AddDeviceDlg( - [in] HWND hwndParent, - [in] LONG lFlags); -} - -[ - object, - uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811) -] -interface IEnumWIA_DEV_INFO : IUnknown -{ - /* fill in */ -} - -[ - object, - uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) -] -interface IWiaItem : IUnknown -{ - /* FIXME: fill in */ -} - -[ - object, - uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e) -] -interface IWiaEventCallback : IUnknown -{ - HRESULT ImageEventCallback( - [in] const GUID *pEventGUID, - [in] BSTR bstrEventDescription, - [in] BSTR bstrDeviceID, - [in] BSTR bstrDeviceDescription, - [in] DWORD dwDeviceType, - [in] BSTR bstrFullItemName, - [in,out] ULONG *pulEventType, - [in] ULONG ulReserved); -} diff --git a/include/psdk/wia_xp.idl b/include/psdk/wia_xp.idl deleted file mode 100644 index 5024787a6fc..00000000000 --- a/include/psdk/wia_xp.idl +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2009 Damjan Jovanovic - * - * 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 - */ - -import "wtypes.idl"; -import "objidl.idl"; - -interface IEnumWIA_DEV_INFO; -interface IWiaItem; -interface IWiaEventCallback; - -cpp_quote("DEFINE_GUID(CLSID_WiaDevMgr, 0xa1f4e726,0x8cf1,0x11d1,0xbf,0x92,0x00,0x60,0x08,0x1e,0xd8,0x11);") - -[ - object, - uuid(5eb2502a-8cf1-11d1-bf92-0060081ed811) -] -interface IWiaDevMgr : IUnknown -{ - HRESULT EnumDeviceInfo( - [in] LONG lFlag, - [retval, out] IEnumWIA_DEV_INFO **ppIEnum); - - HRESULT CreateDevice( - [in] BSTR bstrDeviceID, - [out] IWiaItem **ppWiaItemRoot); - - HRESULT SelectDeviceDlg( - [in] HWND hwndParent, - [in] LONG lDeviceType, - [in] LONG lFlags, - [in, out] BSTR *pbstrDeviceID, - [retval, out] IWiaItem **ppItemRoot); - - HRESULT SelectDeviceDlgID( - [in] HWND hwndParent, - [in] LONG lDeviceType, - [in] LONG lFlags, - [retval, out] BSTR *pbstrDeviceID); - - HRESULT GetImageDlg( - [in] HWND hwndParent, - [in] LONG lDeviceType, - [in] LONG lFlags, - [in] LONG lIntent, - [in] IWiaItem *pItemRoot, - [in] BSTR bstrFilename, - [in, out] GUID *pguidFormat); - - HRESULT RegisterEventCallbackProgram( - [in] LONG lFlags, - [in] BSTR bstrDeviceID, - [in] const GUID *pEventGUID, - [in] BSTR bstrCommandline, - [in] BSTR bstrName, - [in] BSTR bstrDescription, - [in] BSTR bstrIcon); - - HRESULT RegisterEventCallbackInterface( - [in] LONG lFlags, - [in] BSTR bstrDeviceID, - [in] const GUID *pEventGUID, - [unique, in] IWiaEventCallback *pIWiaEventCallback, - [out] IUnknown **pEventObject); - - HRESULT RegisterEventCallbackCLSID( - [in] LONG lFlags, - [in] BSTR bstrDeviceID, - [in] const GUID *pEventGUID, - [unique, in] const GUID *pClsID, - [in] BSTR bstrName, - [in] BSTR bstrDescription, - [in] BSTR bstrIcon); - - HRESULT AddDeviceDlg( - [in] HWND hwndParent, - [in] LONG lFlags); -} - -[ - object, - uuid(5e38b83c-8cf1-11d1-bf92-0060081ed811) -] -interface IEnumWIA_DEV_INFO : IUnknown -{ - /* fill in */ -} - -[ - object, - uuid(4db1ad10-3391-11d2-9a33-00c04fa36145) -] -interface IWiaItem : IUnknown -{ - /* FIXME: fill in */ -} - -[ - object, - uuid(ae6287b0-0084-11d2-973b-00a0c9068f2e) -] -interface IWiaEventCallback : IUnknown -{ - HRESULT ImageEventCallback( - [in] const GUID *pEventGUID, - [in] BSTR bstrEventDescription, - [in] BSTR bstrDeviceID, - [in] BSTR bstrDeviceDescription, - [in] DWORD dwDeviceType, - [in] BSTR bstrFullItemName, - [in,out] ULONG *pulEventType, - [in] ULONG ulReserved); -} diff --git a/include/psdk/winbase.h b/include/psdk/winbase.h index 79c52ac5579..6b38dacb365 100644 --- a/include/psdk/winbase.h +++ b/include/psdk/winbase.h @@ -2301,9 +2301,6 @@ VOID WINAPI WakeConditionVariable(PCONDITION_VARIABLE); VOID WINAPI WakeAllConditionVariable(PCONDITION_VARIABLE); #endif BOOL WINAPI WinLoadTrustProvider(GUID*); -BOOL WINAPI Wow64DisableWow64FsRedirection(PVOID*); -BOOLEAN WINAPI Wow64EnableWow64FsRedirection(BOOLEAN); -BOOL WINAPI Wow64RevertWow64FsRedirection(PVOID); BOOL WINAPI WriteFile(HANDLE,LPCVOID,DWORD,LPDWORD,LPOVERLAPPED); BOOL WINAPI WriteFileEx(HANDLE,LPCVOID,DWORD,LPOVERLAPPED,LPOVERLAPPED_COMPLETION_ROUTINE); BOOL WINAPI WriteFileGather(HANDLE,FILE_SEGMENT_ELEMENT*,DWORD,LPDWORD,LPOVERLAPPED); diff --git a/include/psdk/wingdi.h b/include/psdk/wingdi.h index cad35c7d659..edfbae652f3 100644 --- a/include/psdk/wingdi.h +++ b/include/psdk/wingdi.h @@ -3050,9 +3050,7 @@ UINT WINAPI GetEnhMetaFilePaletteEntries(HENHMETAFILE,UINT,LPPALETTEENTRY); UINT WINAPI GetEnhMetaFilePixelFormat(HENHMETAFILE,UINT,PIXELFORMATDESCRIPTOR*); DWORD WINAPI GetFontData(HDC,DWORD,DWORD,PVOID,DWORD); DWORD WINAPI GetFontLanguageInfo(HDC); -#if (_WIN32_WINNT >= 0x0500) DWORD WINAPI GetFontUnicodeRanges(HDC,LPGLYPHSET); -#endif DWORD WINAPI GetGlyphIndicesA(HDC,LPCSTR,INT,LPWORD,DWORD); DWORD WINAPI GetGlyphIndicesW(HDC,LPCWSTR,INT,LPWORD,DWORD); DWORD WINAPI GetGlyphOutlineA(HDC,UINT,UINT,LPGLYPHMETRICS,DWORD,PVOID,const MAT2*); diff --git a/include/psdk/winnt.h b/include/psdk/winnt.h index 66c94b21d6d..f856b079970 100644 --- a/include/psdk/winnt.h +++ b/include/psdk/winnt.h @@ -63,14 +63,6 @@ extern "C" { #define UNALIGNED #endif -#ifndef DECLSPEC_NOVTABLE -# if defined(_MSC_VER) && (_MSC_VER >= 1100) && defined(__cplusplus) -# define DECLSPEC_NOVTABLE __declspec(novtable) -# else -# define DECLSPEC_NOVTABLE -# endif -#endif - #ifndef DECLSPEC_ADDRSAFE #if (_MSC_VER >= 1200) && (defined(_M_ALPHA) || defined(_M_AXP64)) #define DECLSPEC_ADDRSAFE __declspec(address_safe) diff --git a/include/psdk/winuser.h b/include/psdk/winuser.h index 21cdf040f9d..bea47d14f05 100644 --- a/include/psdk/winuser.h +++ b/include/psdk/winuser.h @@ -4442,7 +4442,7 @@ int WINAPI SetScrollInfo(HWND,int,LPCSCROLLINFO,BOOL); int WINAPI SetScrollPos(HWND,int,int,BOOL); BOOL WINAPI SetScrollRange(HWND,int,int,int,BOOL); BOOL WINAPI SetSysColors(int,const INT *,const COLORREF *); -DWORD_PTR WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD_PTR); +DWORD WINAPI SetSysColorsTemp(const COLORREF *, const HBRUSH *, DWORD); #define SetSysModalWindow(h) (NULL) BOOL WINAPI SetSystemCursor(HCURSOR,DWORD); BOOL WINAPI SetSystemMenu(HWND,HMENU); diff --git a/include/reactos/arm/armddk.h b/include/reactos/arm/armddk.h index 82e6d9fdd72..68262c2b9d7 100644 --- a/include/reactos/arm/armddk.h +++ b/include/reactos/arm/armddk.h @@ -54,16 +54,13 @@ extern ULONG_PTR MmUserProbeAddress; // #define MAXIMUM_VECTOR 16 -#define KERNEL_STACK_SIZE 12288 -#define KERNEL_LARGE_STACK_SIZE 61440 -#define KERNEL_LARGE_STACK_COMMIT 12288 // // Used to contain PFNs and PFN counts // -//typedef ULONG PFN_COUNT; -//typedef ULONG PFN_NUMBER, *PPFN_NUMBER; -//typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; +typedef ULONG PFN_COUNT; +typedef ULONG PFN_NUMBER, *PPFN_NUMBER; +typedef LONG SPFN_NUMBER, *PSPFN_NUMBER; // // Stub @@ -127,25 +124,11 @@ typedef struct _CONTEXT { #ifdef _WINNT_H #define KIRQL ULONG #endif - -typedef struct _NT_TIB_KPCR { - struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList; - PVOID StackBase; - PVOID StackLimit; - PVOID SubSystemTib; - _ANONYMOUS_UNION union { - PVOID FiberData; - ULONG Version; - } DUMMYUNIONNAME; - PVOID ArbitraryUserPointer; - struct _NT_TIB_KPCR *Self; -} NT_TIB_KPCR,*PNT_TIB_KPCR; - typedef struct _KPCR { union { - NT_TIB_KPCR NtTib; + NT_TIB NtTib; struct { struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList; // Unused @@ -184,11 +167,6 @@ struct _TEB* NtCurrentTeb(VOID) return (struct _TEB*)USERPCR->Used_Self; } -NTSYSAPI -PKTHREAD -NTAPI -KeGetCurrentThread(VOID); - #ifndef _WINNT_H // // IRQL Support on ARM is similar to MIPS/ALPHA diff --git a/include/reactos/asm.h b/include/reactos/asm.h index f60a37c79ef..30afca482a0 100644 --- a/include/reactos/asm.h +++ b/include/reactos/asm.h @@ -73,7 +73,7 @@ ENDM .altmacro /* Hex numbers need to be in 0x1AB format */ -#define HEX(y) 0x##y +#define HEX(x) 0x##x /* Macro values need to be marked */ #define VAL(x) \x diff --git a/include/reactos/win32k/ntgdityp.h b/include/reactos/win32k/ntgdityp.h index 1aedf765dbc..2e710ca6bdf 100644 --- a/include/reactos/win32k/ntgdityp.h +++ b/include/reactos/win32k/ntgdityp.h @@ -523,7 +523,10 @@ typedef struct _GDIBSEXTSELCLPRGN { GDIBATCHHDR gbHdr; int fnMode; - RECTL; + LONG right; + LONG bottom; + LONG left; + LONG top; } GDIBSEXTSELCLPRGN, *PGDIBSEXTSELCLPRGN; // // Use with GdiBCSelObj, GdiBCDelObj and GdiBCDelRgn. diff --git a/include/xdk/exfuncs.h b/include/xdk/exfuncs.h index 3f02d3df6e5..a04b7aeed62 100644 --- a/include/xdk/exfuncs.h +++ b/include/xdk/exfuncs.h @@ -299,14 +299,13 @@ ExFreeToZone( #define ExIsResourceAcquired ExIsResourceAcquiredSharedLite #define ExReleaseResourceForThread ExReleaseResourceForThreadLite -#ifdef _X86_ - typedef enum _INTERLOCKED_RESULT { ResultNegative = RESULT_NEGATIVE, ResultZero = RESULT_ZERO, ResultPositive = RESULT_POSITIVE } INTERLOCKED_RESULT; +#ifdef _X86_ NTKERNELAPI INTERLOCKED_RESULT FASTCALL @@ -325,7 +324,6 @@ FASTCALL Exfi386InterlockedExchangeUlong( IN PULONG Target, IN ULONG Value); - #endif $endif (_NTDDK_) diff --git a/lib/cmlib/cminit.c b/lib/cmlib/cminit.c index 1be9b656a80..59b3843432f 100644 --- a/lib/cmlib/cminit.c +++ b/lib/cmlib/cminit.c @@ -21,7 +21,7 @@ CmCreateRootNode( SIZE_T NameSize; /* Allocate the cell */ - NameSize = strlenW(Name) * sizeof(WCHAR); + NameSize = utf16_wcslen(Name) * sizeof(WCHAR); RootCellIndex = HvAllocateCell(Hive, FIELD_OFFSET(CM_KEY_NODE, Name) + NameSize, Stable, diff --git a/lib/cmlib/cmlib.h b/lib/cmlib/cmlib.h index e472fd35c4f..fae049507d2 100644 --- a/lib/cmlib/cmlib.h +++ b/lib/cmlib/cmlib.h @@ -13,7 +13,6 @@ #define _CMLIB_DEBUG_ 1 #ifdef CMLIB_HOST - #include #include #include #include @@ -199,22 +198,6 @@ typedef struct _CMHIVE #endif -typedef struct _HV_HIVE_CELL_PAIR -{ - PHHIVE Hive; - HCELL_INDEX Cell; -} HV_HIVE_CELL_PAIR, *PHV_HIVE_CELL_PAIR; - -#define STATIC_CELL_PAIR_COUNT 4 -typedef struct _HV_TRACK_CELL_REF -{ - USHORT Count; - USHORT Max; - PHV_HIVE_CELL_PAIR CellArray; - HV_HIVE_CELL_PAIR StaticArray[STATIC_CELL_PAIR_COUNT]; - USHORT StaticCount; -} HV_TRACK_CELL_REF, *PHV_TRACK_CELL_REF; - extern ULONG CmlibTraceLevel; /* @@ -289,12 +272,6 @@ HvIsCellDirty( IN HCELL_INDEX Cell ); -BOOLEAN -CMAPI -HvHiveWillShrink( - IN PHHIVE RegistryHive -); - BOOLEAN CMAPI HvSyncHive( PHHIVE RegistryHive); @@ -311,21 +288,6 @@ CmCreateRootNode( VOID CMAPI CmPrepareHive( PHHIVE RegistryHive); - - -BOOLEAN -CMAPI -HvTrackCellRef( - PHV_TRACK_CELL_REF CellRef, - PHHIVE Hive, - HCELL_INDEX Cell -); - -VOID -CMAPI -HvReleaseFreeCellRefArray( - PHV_TRACK_CELL_REF CellRef -); /* * Private functions. diff --git a/lib/cmlib/cmlib.rbuild b/lib/cmlib/cmlib.rbuild index ab81a0256a2..506eef92334 100644 --- a/lib/cmlib/cmlib.rbuild +++ b/lib/cmlib/cmlib.rbuild @@ -14,8 +14,6 @@ hivewrt.c - " " - . diff --git a/lib/cmlib/hivecell.c b/lib/cmlib/hivecell.c index 815165182a5..994ca98170d 100644 --- a/lib/cmlib/hivecell.c +++ b/lib/cmlib/hivecell.c @@ -113,7 +113,7 @@ HvMarkCellDirty( __FUNCTION__, RegistryHive, CellIndex, HoldingLock); if ((CellIndex & HCELL_TYPE_MASK) >> HCELL_TYPE_SHIFT != Stable) - return TRUE; + return FALSE; CellBlock = (CellIndex & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT; CellLastBlock = ((CellIndex + HV_BLOCK_SIZE - 1) & HCELL_BLOCK_MASK) >> HCELL_BLOCK_SHIFT; @@ -525,56 +525,3 @@ HvFreeCell( if (CellType == Stable) HvMarkCellDirty(RegistryHive, CellIndex, FALSE); } - -BOOLEAN -CMAPI -HvTrackCellRef(PHV_TRACK_CELL_REF CellRef, - PHHIVE Hive, - HCELL_INDEX Cell) -{ - /* Sanity checks */ - ASSERT(CellRef); - ASSERT(Hive ); - ASSERT(Cell != HCELL_NIL); - - /* Less than 4? */ - if (CellRef->StaticCount < STATIC_CELL_PAIR_COUNT) - { - /* Add reference */ - CellRef->StaticArray[CellRef->StaticCount].Hive = Hive; - CellRef->StaticArray[CellRef->StaticCount].Cell = Cell; - CellRef->StaticCount++; - return TRUE; - } - - /* FIXME: TODO */ - DPRINT1("ERROR: Too many references\n"); - while (TRUE); - return FALSE; -} - -VOID -CMAPI -HvReleaseFreeCellRefArray(PHV_TRACK_CELL_REF CellRef) -{ - ULONG i; - ASSERT(CellRef); - - /* Any references? */ - if (CellRef->StaticCount > 0) - { - /* Sanity check */ - ASSERT(CellRef->StaticCount <= STATIC_CELL_PAIR_COUNT); - - /* Loop them */ - for (i = 0; i < CellRef->StaticCount;i++) - { - /* Release them */ - HvReleaseCell(CellRef->StaticArray[i].Hive, - CellRef->StaticArray[i].Cell); - } - - /* Free again */ - CellRef->StaticCount = 0; - } -} \ No newline at end of file diff --git a/lib/cmlib/hivewrt.c b/lib/cmlib/hivewrt.c index 7ecadff2062..5cc20cfe503 100644 --- a/lib/cmlib/hivewrt.c +++ b/lib/cmlib/hivewrt.c @@ -265,14 +265,6 @@ HvSyncHive( return TRUE; } -BOOLEAN -CMAPI -HvHiveWillShrink(IN PHHIVE RegistryHive) -{ - /* No shrinking yet */ - return FALSE; -} - BOOLEAN CMAPI HvWriteHive( PHHIVE RegistryHive) diff --git a/lib/drivers/ip/transport/tcp/tcp.c b/lib/drivers/ip/transport/tcp/tcp.c index 187c9a56cc7..ae02e4a2d05 100644 --- a/lib/drivers/ip/transport/tcp/tcp.c +++ b/lib/drivers/ip/transport/tcp/tcp.c @@ -735,24 +735,16 @@ NTSTATUS TCPClose Socket = Connection->SocketContext; Connection->SocketContext = NULL; - /* Don't try to close again if the other side closed us already */ - if (Connection->SignalState != SEL_FIN) - { - /* We need to close here otherwise oskit will never indicate - * SEL_FIN and we will never fully close the connection */ - Status = TCPTranslateError( OskitTCPClose( Socket ) ); + /* We need to close here otherwise oskit will never indicate + * SEL_FIN and we will never fully close the connection + */ + Status = TCPTranslateError( OskitTCPClose( Socket ) ); - if (!NT_SUCCESS(Status)) - { - Connection->SocketContext = Socket; - UnlockObject(Connection, OldIrql); - return Status; - } - } - else + if (!NT_SUCCESS(Status)) { - /* We are already closed by the other end so return success */ - Status = STATUS_SUCCESS; + Connection->SocketContext = Socket; + UnlockObject(Connection, OldIrql); + return Status; } if (Connection->AddressFile) diff --git a/lib/drivers/oskittcp/oskittcp/osenv.c b/lib/drivers/oskittcp/oskittcp/osenv.c index aa8d246c63f..d29fa5fa239 100644 --- a/lib/drivers/oskittcp/oskittcp/osenv.c +++ b/lib/drivers/oskittcp/oskittcp/osenv.c @@ -41,10 +41,5 @@ void* oskit_bufio_create(int len) } void oskit_bufio_map(void *srcbuf, void**dstbuf, int off, int len) { -#if DBG - if (off != 0) - panic("oskit_bufio_map: offset is non-zero"); -#endif - *dstbuf = srcbuf; } diff --git a/lib/drivers/sound/mmixer/wave.c b/lib/drivers/sound/mmixer/wave.c index 0ba0aae41b9..a8b2675cac9 100644 --- a/lib/drivers/sound/mmixer/wave.c +++ b/lib/drivers/sound/mmixer/wave.c @@ -360,17 +360,6 @@ MMixerInitializeWaveInfo( WaveInfo->DeviceId = MixerData->DeviceId; WaveInfo->PinId = PinId; - - /* copy device name */ - if (bWaveIn) - { - wcscpy(WaveInfo->u.InCaps.szPname, DeviceName); - } - else - { - wcscpy(WaveInfo->u.OutCaps.szPname, DeviceName); - } - /* FIXME determine manufacturer / product id */ if (bWaveIn) { @@ -421,8 +410,6 @@ MMixerInitializeWaveInfo( MixerContext->Free(MultipleItem); - - if (bWaveIn) { InsertTailList(&MixerList->WaveInList, &WaveInfo->Entry); diff --git a/lib/host/wcsfuncs/wcsfuncs.c b/lib/host/wcsfuncs/wcsfuncs.c index 58dafe13cd3..fc40b7408c6 100644 --- a/lib/host/wcsfuncs/wcsfuncs.c +++ b/lib/host/wcsfuncs/wcsfuncs.c @@ -18,17 +18,6 @@ SIZE_T utf16_wcslen(PCWSTR str) return i; } - -SIZE_T strlenW(PCWSTR str) -{ - SIZE_T i; - - for(i = 0; str[i]; i++); - - return i; -} - - PWSTR utf16_wcschr(PWSTR str, WCHAR c) { SIZE_T i; @@ -41,18 +30,6 @@ PWSTR utf16_wcschr(PWSTR str, WCHAR c) return NULL; } -PWSTR strchrW(PWSTR str, WCHAR c) -{ - SIZE_T i; - - for(i = 0; str[i] && str[i] != c; i++); - - if(str[i]) - return &str[i]; - else - return NULL; -} - INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count) { while(count--) @@ -69,20 +46,3 @@ INT utf16_wcsncmp(PCWSTR string1, PCWSTR string2, size_t count) return 0; } - -INT strncmpW(PCWSTR string1, PCWSTR string2, size_t count) -{ - while(count--) - { - if(*string1 != *string2) - return 1; - - if(*string1 == 0) - return 0; - - string1++; - string2++; - } - - return 0; -} diff --git a/lib/lib.rbuild b/lib/lib.rbuild index fe9cf995715..42e49d6ab2f 100644 --- a/lib/lib.rbuild +++ b/lib/lib.rbuild @@ -37,9 +37,6 @@ - - - diff --git a/lib/newinflib/README.txt b/lib/newinflib/README.txt deleted file mode 100644 index 5e27e2b0d5e..00000000000 --- a/lib/newinflib/README.txt +++ /dev/null @@ -1,16 +0,0 @@ -Routines to handle .inf files. - -This is the UNICODE-enabled version of inflib. It will be used by usetup and mkhive. - -This library is used to share .inf handling code between build tools and -ReactOS code. Two versions are built, "inflib_host" (for use by build tools) -and "inflib" (for use by ReactOS code). Both depend on the same core source, -with a wrapper for the appropriate interface. -Most of the differences between the host and the ReactOS environment are -abstracted away in builddep.h. Of particular note is that the host version -uses Ansi characters while the ReactOS version uses Unicode. So, the core -source uses TCHARs. builddep.h depends on a preprocessor variable INFLIB_HOST -which is defined when building the host version (inflib.mak) but not defined -when building the ReactOS version (inflib.xml). -The wrappers have "host" or "ros" in their filename. The library interface is -"infhost.h" for the host version, "infros.h" for the ReactOS version. diff --git a/lib/newinflib/builddep.h b/lib/newinflib/builddep.h deleted file mode 100644 index 51b4d4850d7..00000000000 --- a/lib/newinflib/builddep.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * COPYRIGHT: Copyright 2005 Ge van Geldorp - */ - -#ifdef INFLIB_HOST - -/* Definitions native to the host on which we're building */ - -#include -#include - -#include -#include -#include -#include - -#define FREE(Area) free(Area) -#define MALLOC(Size) malloc((size_t)(Size)) -#define ZEROMEMORY(Area, Size) memset((Area), '\0', (size_t)(Size)) -#define MEMCPY(Dest, Src, Size) memcpy((Dest), (Src), (size_t)(Size)) - -#define STATUS_SUCCESS 0 -#define INF_STATUS_SUCCESS 0 -#define INF_STATUS_NO_MEMORY ENOMEM -#define INF_STATUS_INVALID_PARAMETER EINVAL -#define INF_STATUS_NOT_FOUND ENOENT -#define INF_STATUS_BUFFER_OVERFLOW E2BIG -#define INF_SUCCESS(x) (0 == (x)) - -#define STRFMT "%s" - -NTSTATUS NTAPI RtlMultiByteToUnicodeN(IN PWCHAR UnicodeString, - IN ULONG UnicodeSize, IN PULONG ResultSize, IN PCSTR MbString, IN ULONG MbSize); - -BOOLEAN NTAPI RtlIsTextUnicode( PVOID buf, INT len, INT *pf ); - - -#define IS_TEXT_UNICODE_ASCII16 1 -#define IS_TEXT_UNICODE_REVERSE_ASCII16 16 -#define IS_TEXT_UNICODE_STATISTICS 2 -#define IS_TEXT_UNICODE_REVERSE_STATISTICS 32 -#define IS_TEXT_UNICODE_CONTROLS 4 -#define IS_TEXT_UNICODE_REVERSE_CONTROLS 64 -#define IS_TEXT_UNICODE_SIGNATURE 8 -#define IS_TEXT_UNICODE_REVERSE_SIGNATURE 128 -#define IS_TEXT_UNICODE_ILLEGAL_CHARS 256 -#define IS_TEXT_UNICODE_ODD_LENGTH 512 -#define IS_TEXT_UNICODE_NULL_BYTES 4096 -#define IS_TEXT_UNICODE_UNICODE_MASK 15 -#define IS_TEXT_UNICODE_REVERSE_MASK 240 -#define IS_TEXT_UNICODE_NOT_UNICODE_MASK 3840 -#define IS_TEXT_UNICODE_NOT_ASCII_MASK 61440 - -#else /* ! defined(INFLIB_HOST) */ - -/* ReactOS definitions */ - -#define UNICODE -#define _UNICODE -#define WIN32_NO_STATUS -#include -#define NTOS_MODE_USER -#include - -extern PVOID InfpHeap; - -#define FREE(Area) RtlFreeHeap(InfpHeap, 0, (Area)) -#define MALLOC(Size) RtlAllocateHeap(InfpHeap, 0, (Size)) -#define ZEROMEMORY(Area, Size) RtlZeroMemory((Area), (Size)) -#define MEMCPY(Dest, Src, Size) RtlCopyMemory((Dest), (Src), (Size)) - -#define INF_STATUS_SUCCESS STATUS_SUCCESS -#define INF_STATUS_NO_MEMORY STATUS_NO_MEMORY -#define INF_STATUS_INVALID_PARAMETER STATUS_INVALID_PARAMETER -#define INF_STATUS_NOT_FOUND STATUS_NOT_FOUND -#define INF_STATUS_BUFFER_OVERFLOW STATUS_BUFFER_OVERFLOW -#define INF_SUCCESS(x) (0 <= (x)) - -#define STRFMT "%S" - -#endif /* INFLIB_HOST */ - -#include - -/* EOF */ diff --git a/lib/newinflib/infcommon.h b/lib/newinflib/infcommon.h deleted file mode 100644 index a80f2029078..00000000000 --- a/lib/newinflib/infcommon.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -#pragma once - -#define MAX_INF_STRING_LENGTH 512 - -typedef void *HINF, **PHINF; -typedef struct _INFCONTEXT *PINFCONTEXT; - -/* EOF */ diff --git a/lib/newinflib/infcore.c b/lib/newinflib/infcore.c deleted file mode 100644 index 7e187359e2a..00000000000 --- a/lib/newinflib/infcore.c +++ /dev/null @@ -1,832 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" - -#define NDEBUG -#include - -#define CONTROL_Z '\x1a' -#define MAX_SECTION_NAME_LEN 255 -#define MAX_FIELD_LEN 511 /* larger fields get silently truncated */ -/* actual string limit is MAX_INF_STRING_LENGTH+1 (plus terminating null) under Windows */ -#define MAX_STRING_LEN (MAX_INF_STRING_LENGTH+1) - - -/* parser definitions */ - -enum parser_state -{ - LINE_START, /* at beginning of a line */ - SECTION_NAME, /* parsing a section name */ - KEY_NAME, /* parsing a key name */ - VALUE_NAME, /* parsing a value name */ - EOL_BACKSLASH, /* backslash at end of line */ - QUOTES, /* inside quotes */ - LEADING_SPACES, /* leading spaces */ - TRAILING_SPACES, /* trailing spaces */ - COMMENT, /* inside a comment */ - NB_PARSER_STATES -}; - -struct parser -{ - const WCHAR *start; /* start position of item being parsed */ - const WCHAR *end; /* end of buffer */ - PINFCACHE file; /* file being built */ - enum parser_state state; /* current parser state */ - enum parser_state stack[4]; /* state stack */ - int stack_pos; /* current pos in stack */ - - PINFCACHESECTION cur_section; /* pointer to the section being parsed*/ - PINFCACHELINE line; /* current line */ - unsigned int line_pos; /* current line position in file */ - INFSTATUS error; /* error code */ - unsigned int token_len; /* current token len */ - WCHAR token[MAX_FIELD_LEN+1]; /* current token */ -}; - -typedef const WCHAR * (*parser_state_func)( struct parser *parser, const WCHAR *pos ); - -/* parser state machine functions */ -static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ); -static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ); - -static const parser_state_func parser_funcs[NB_PARSER_STATES] = -{ - line_start_state, /* LINE_START */ - section_name_state, /* SECTION_NAME */ - key_name_state, /* KEY_NAME */ - value_name_state, /* VALUE_NAME */ - eol_backslash_state, /* EOL_BACKSLASH */ - quotes_state, /* QUOTES */ - leading_spaces_state, /* LEADING_SPACES */ - trailing_spaces_state, /* TRAILING_SPACES */ - comment_state /* COMMENT */ -}; - - -/* PRIVATE FUNCTIONS ********************************************************/ - -static PINFCACHELINE -InfpFreeLine (PINFCACHELINE Line) -{ - PINFCACHELINE Next; - PINFCACHEFIELD Field; - - if (Line == NULL) - { - return NULL; - } - - Next = Line->Next; - if (Line->Key != NULL) - { - FREE (Line->Key); - Line->Key = NULL; - } - - /* Remove data fields */ - while (Line->FirstField != NULL) - { - Field = Line->FirstField->Next; - FREE (Line->FirstField); - Line->FirstField = Field; - } - Line->LastField = NULL; - - FREE (Line); - - return Next; -} - - -PINFCACHESECTION -InfpFreeSection (PINFCACHESECTION Section) -{ - PINFCACHESECTION Next; - - if (Section == NULL) - { - return NULL; - } - - /* Release all keys */ - Next = Section->Next; - while (Section->FirstLine != NULL) - { - Section->FirstLine = InfpFreeLine (Section->FirstLine); - } - Section->LastLine = NULL; - - FREE (Section); - - return Next; -} - - -PINFCACHESECTION -InfpFindSection(PINFCACHE Cache, - PCWSTR Name) -{ - PINFCACHESECTION Section = NULL; - - if (Cache == NULL || Name == NULL) - { - return NULL; - } - - /* iterate through list of sections */ - Section = Cache->FirstSection; - while (Section != NULL) - { - if (strcmpiW(Section->Name, Name) == 0) - { - return Section; - } - - /* get the next section*/ - Section = Section->Next; - } - - return NULL; -} - - -PINFCACHESECTION -InfpAddSection(PINFCACHE Cache, - PCWSTR Name) -{ - PINFCACHESECTION Section = NULL; - ULONG Size; - - if (Cache == NULL || Name == NULL) - { - DPRINT("Invalid parameter\n"); - return NULL; - } - - /* Allocate and initialize the new section */ - Size = (ULONG)FIELD_OFFSET(INFCACHESECTION, - Name[strlenW(Name) + 1]); - Section = (PINFCACHESECTION)MALLOC(Size); - if (Section == NULL) - { - DPRINT("MALLOC() failed\n"); - return NULL; - } - ZEROMEMORY (Section, - Size); - - /* Copy section name */ - strcpyW(Section->Name, Name); - - /* Append section */ - if (Cache->FirstSection == NULL) - { - Cache->FirstSection = Section; - Cache->LastSection = Section; - } - else - { - Cache->LastSection->Next = Section; - Section->Prev = Cache->LastSection; - Cache->LastSection = Section; - } - - return Section; -} - - -PINFCACHELINE -InfpAddLine(PINFCACHESECTION Section) -{ - PINFCACHELINE Line; - - if (Section == NULL) - { - DPRINT("Invalid parameter\n"); - return NULL; - } - - Line = (PINFCACHELINE)MALLOC(sizeof(INFCACHELINE)); - if (Line == NULL) - { - DPRINT("MALLOC() failed\n"); - return NULL; - } - ZEROMEMORY(Line, - sizeof(INFCACHELINE)); - - /* Append line */ - if (Section->FirstLine == NULL) - { - Section->FirstLine = Line; - Section->LastLine = Line; - } - else - { - Section->LastLine->Next = Line; - Line->Prev = Section->LastLine; - Section->LastLine = Line; - } - Section->LineCount++; - - return Line; -} - - -PVOID -InfpAddKeyToLine(PINFCACHELINE Line, - PCWSTR Key) -{ - if (Line == NULL) - { - DPRINT1("Invalid Line\n"); - return NULL; - } - - if (Line->Key != NULL) - { - DPRINT1("Line already has a key\n"); - return NULL; - } - - Line->Key = (PWCHAR)MALLOC((strlenW(Key) + 1) * sizeof(WCHAR)); - if (Line->Key == NULL) - { - DPRINT1("MALLOC() failed\n"); - return NULL; - } - - strcpyW(Line->Key, Key); - - return (PVOID)Line->Key; -} - - -PVOID -InfpAddFieldToLine(PINFCACHELINE Line, - PCWSTR Data) -{ - PINFCACHEFIELD Field; - ULONG Size; - - Size = (ULONG)FIELD_OFFSET(INFCACHEFIELD, - Data[strlenW(Data) + 1]); - Field = (PINFCACHEFIELD)MALLOC(Size); - if (Field == NULL) - { - DPRINT1("MALLOC() failed\n"); - return NULL; - } - ZEROMEMORY (Field, - Size); - strcpyW(Field->Data, Data); - - /* Append key */ - if (Line->FirstField == NULL) - { - Line->FirstField = Field; - Line->LastField = Field; - } - else - { - Line->LastField->Next = Field; - Field->Prev = Line->LastField; - Line->LastField = Field; - } - Line->FieldCount++; - - return (PVOID)Field; -} - - -PINFCACHELINE -InfpFindKeyLine(PINFCACHESECTION Section, - PCWSTR Key) -{ - PINFCACHELINE Line; - - Line = Section->FirstLine; - while (Line != NULL) - { - if (Line->Key != NULL && strcmpiW(Line->Key, Key) == 0) - { - return Line; - } - - Line = Line->Next; - } - - return NULL; -} - - -/* push the current state on the parser stack */ -__inline static void push_state( struct parser *parser, enum parser_state state ) -{ -// assert( parser->stack_pos < sizeof(parser->stack)/sizeof(parser->stack[0]) ); - parser->stack[parser->stack_pos++] = state; -} - - -/* pop the current state */ -__inline static void pop_state( struct parser *parser ) -{ -// assert( parser->stack_pos ); - parser->state = parser->stack[--parser->stack_pos]; -} - - -/* set the parser state and return the previous one */ -__inline static enum parser_state set_state( struct parser *parser, enum parser_state state ) -{ - enum parser_state ret = parser->state; - parser->state = state; - return ret; -} - - -/* check if the pointer points to an end of file */ -__inline static int is_eof( struct parser *parser, const WCHAR *ptr ) -{ - return (ptr >= parser->end || *ptr == CONTROL_Z || *ptr == 0); -} - - -/* check if the pointer points to an end of line */ -__inline static int is_eol( struct parser *parser, const WCHAR *ptr ) -{ - return (ptr >= parser->end || - *ptr == CONTROL_Z || - *ptr == '\n' || - (*ptr == '\r' && *(ptr + 1) == '\n') || - *ptr == 0); -} - - -/* push data from current token start up to pos into the current token */ -static int push_token( struct parser *parser, const WCHAR *pos ) -{ - UINT len = (UINT)(pos - parser->start); - const WCHAR *src = parser->start; - WCHAR *dst = parser->token + parser->token_len; - - if (len > MAX_FIELD_LEN - parser->token_len) - len = MAX_FIELD_LEN - parser->token_len; - - parser->token_len += len; - for ( ; len > 0; len--, dst++, src++) - { - if (*src) - { - *dst = *src; - } - else - { - *dst = ' '; - } - } - - *dst = 0; - parser->start = pos; - - return 0; -} - - - -/* add a section with the current token as name */ -static PVOID add_section_from_token( struct parser *parser ) -{ - PINFCACHESECTION Section; - - if (parser->token_len > MAX_SECTION_NAME_LEN) - { - parser->error = INF_STATUS_SECTION_NAME_TOO_LONG; - return NULL; - } - - Section = InfpFindSection(parser->file, - parser->token); - if (Section == NULL) - { - /* need to create a new one */ - Section= InfpAddSection(parser->file, - parser->token); - if (Section == NULL) - { - parser->error = INF_STATUS_NOT_ENOUGH_MEMORY; - return NULL; - } - } - - parser->token_len = 0; - parser->cur_section = Section; - - return (PVOID)Section; -} - - -/* add a field containing the current token to the current line */ -static struct field *add_field_from_token( struct parser *parser, int is_key ) -{ - PVOID field; - - if (!parser->line) /* need to start a new line */ - { - if (parser->cur_section == NULL) /* got a line before the first section */ - { - parser->error = INF_STATUS_WRONG_INF_STYLE; - return NULL; - } - - parser->line = InfpAddLine(parser->cur_section); - if (parser->line == NULL) - goto error; - } - else - { -// assert(!is_key); - } - - if (is_key) - { - field = InfpAddKeyToLine(parser->line, parser->token); - } - else - { - field = InfpAddFieldToLine(parser->line, parser->token); - } - - if (field != NULL) - { - parser->token_len = 0; - return field; - } - -error: - parser->error = INF_STATUS_NOT_ENOUGH_MEMORY; - return NULL; -} - - -/* close the current line and prepare for parsing a new one */ -static void close_current_line( struct parser *parser ) -{ - parser->line = NULL; -} - - - -/* handler for parser LINE_START state */ -static const WCHAR *line_start_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eof( parser, p ); p++) - { - switch(*p) - { - case '\r': - continue; - - case '\n': - parser->line_pos++; - close_current_line( parser ); - break; - - case ';': - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); - return p + 1; - - case '[': - parser->start = p + 1; - set_state( parser, SECTION_NAME ); - return p + 1; - - default: - if (!isspaceW(*p)) - { - parser->start = p; - set_state( parser, KEY_NAME ); - return p; - } - break; - } - } - close_current_line( parser ); - return NULL; -} - - -/* handler for parser SECTION_NAME state */ -static const WCHAR *section_name_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == ']') - { - push_token( parser, p ); - if (add_section_from_token( parser ) == NULL) - return NULL; - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); /* ignore everything else on the line */ - return p + 1; - } - } - parser->error = INF_STATUS_BAD_SECTION_NAME_LINE; /* unfinished section name */ - return NULL; -} - - -/* handler for parser KEY_NAME state */ -static const WCHAR *key_name_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p, *token_end = parser->start; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == ',') break; - switch(*p) - { - - case '=': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 1 )) return NULL; - parser->start = p + 1; - push_state( parser, VALUE_NAME ); - set_state( parser, LEADING_SPACES ); - return p + 1; - case ';': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); - return p + 1; - case '"': - push_token( parser, token_end ); - parser->start = p + 1; - push_state( parser, KEY_NAME ); - set_state( parser, QUOTES ); - return p + 1; - case '\\': - push_token( parser, token_end ); - parser->start = p; - push_state( parser, KEY_NAME ); - set_state( parser, EOL_BACKSLASH ); - return p; - default: - if (!isspaceW(*p)) token_end = p + 1; - else - { - push_token( parser, p ); - push_state( parser, KEY_NAME ); - set_state( parser, TRAILING_SPACES ); - return p; - } - break; - } - } - push_token( parser, token_end ); - set_state( parser, VALUE_NAME ); - return p; -} - - -/* handler for parser VALUE_NAME state */ -static const WCHAR *value_name_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p, *token_end = parser->start; - - for (p = pos; !is_eol( parser, p ); p++) - { - switch(*p) - { - case ';': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - push_state( parser, LINE_START ); - set_state( parser, COMMENT ); - return p + 1; - case ',': - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - parser->start = p + 1; - push_state( parser, VALUE_NAME ); - set_state( parser, LEADING_SPACES ); - return p + 1; - case '"': - push_token( parser, token_end ); - parser->start = p + 1; - push_state( parser, VALUE_NAME ); - set_state( parser, QUOTES ); - return p + 1; - case '\\': - push_token( parser, token_end ); - parser->start = p; - push_state( parser, VALUE_NAME ); - set_state( parser, EOL_BACKSLASH ); - return p; - default: - if (!isspaceW(*p)) token_end = p + 1; - else - { - push_token( parser, p ); - push_state( parser, VALUE_NAME ); - set_state( parser, TRAILING_SPACES ); - return p; - } - break; - } - } - push_token( parser, token_end ); - if (!add_field_from_token( parser, 0 )) return NULL; - set_state( parser, LINE_START ); - return p; -} - - -/* handler for parser EOL_BACKSLASH state */ -static const WCHAR *eol_backslash_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eof( parser, p ); p++) - { - switch(*p) - { - case '\r': - continue; - - case '\n': - parser->line_pos++; - parser->start = p + 1; - set_state( parser, LEADING_SPACES ); - return p + 1; - - case '\\': - continue; - - case ';': - push_state( parser, EOL_BACKSLASH ); - set_state( parser, COMMENT ); - return p + 1; - - default: - if (isspaceW(*p)) - continue; - push_token( parser, p ); - pop_state( parser ); - return p; - } - } - parser->start = p; - pop_state( parser ); - - return p; -} - - -/* handler for parser QUOTES state */ -static const WCHAR *quotes_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p, *token_end = parser->start; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == '"') - { - if (p+1 < parser->end && p[1] == '"') /* double quotes */ - { - push_token( parser, p + 1 ); - parser->start = token_end = p + 2; - p++; - } - else /* end of quotes */ - { - push_token( parser, p ); - parser->start = p + 1; - pop_state( parser ); - return p + 1; - } - } - } - push_token( parser, p ); - pop_state( parser ); - return p; -} - - -/* handler for parser LEADING_SPACES state */ -static const WCHAR *leading_spaces_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == '\\') - { - parser->start = p; - set_state( parser, EOL_BACKSLASH ); - return p; - } - if (!isspaceW(*p)) - break; - } - parser->start = p; - pop_state( parser ); - return p; -} - - -/* handler for parser TRAILING_SPACES state */ -static const WCHAR *trailing_spaces_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p; - - for (p = pos; !is_eol( parser, p ); p++) - { - if (*p == '\\') - { - set_state( parser, EOL_BACKSLASH ); - return p; - } - if (!isspaceW(*p)) - break; - } - pop_state( parser ); - return p; -} - - -/* handler for parser COMMENT state */ -static const WCHAR *comment_state( struct parser *parser, const WCHAR *pos ) -{ - const WCHAR *p = pos; - - while (!is_eol( parser, p )) - p++; - pop_state( parser ); - return p; -} - - -/* parse a complete buffer */ -INFSTATUS -InfpParseBuffer (PINFCACHE file, - const WCHAR *buffer, - const WCHAR *end, - PULONG error_line) -{ - struct parser parser; - const WCHAR *pos = buffer; - - parser.start = buffer; - parser.end = end; - parser.file = file; - parser.line = NULL; - parser.state = LINE_START; - parser.stack_pos = 0; - parser.cur_section = NULL; - parser.line_pos = 1; - parser.error = 0; - parser.token_len = 0; - - /* parser main loop */ - while (pos) - pos = (parser_funcs[parser.state])(&parser, pos); - - if (parser.error) - { - if (error_line) - *error_line = parser.line_pos; - return parser.error; - } - - /* find the [strings] section */ - file->StringsSection = InfpFindSection(file, - L"Strings"); - - return INF_STATUS_SUCCESS; -} - -/* EOF */ diff --git a/lib/newinflib/infget.c b/lib/newinflib/infget.c deleted file mode 100644 index e2b360ab22d..00000000000 --- a/lib/newinflib/infget.c +++ /dev/null @@ -1,668 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" - -#define NDEBUG -#include - -static unsigned int -InfpSubstituteString(PINFCACHE Inf, - const WCHAR *text, - WCHAR *buffer, - unsigned int size); - -/* retrieve the string substitution for a given string, or NULL if not found */ -/* if found, len is set to the substitution length */ -static PCWSTR -InfpGetSubstitutionString(PINFCACHE Inf, - PCWSTR str, - unsigned int *len, - BOOL no_trailing_slash) -{ - static const WCHAR percent = '%'; - - INFSTATUS Status = INF_STATUS_NOT_FOUND; - PINFCONTEXT Context = NULL; - PWCHAR Data = NULL; - WCHAR ValueName[MAX_INF_STRING_LENGTH +1]; - WCHAR StringLangId[13]; - - if (!*len) /* empty string (%%) is replaced by single percent */ - { - *len = 1; - return &percent; - } - - memcpy(ValueName, str, *len * sizeof(WCHAR)); - ValueName[*len] = 0; - - DPRINT("Value name: %S\n", ValueName); - - if (Inf->LanguageId != 0) - { - swprintf(StringLangId, - L"Strings.%04hx", - Inf->LanguageId); - - Status = InfpFindFirstLine(Inf, - StringLangId, - ValueName, - &Context); - if (Status != INF_STATUS_SUCCESS) - { - swprintf(StringLangId, - L"Strings.%04hx", - MAKELANGID(PRIMARYLANGID(Inf->LanguageId), SUBLANG_NEUTRAL)); - - Status = InfpFindFirstLine(Inf, - StringLangId, - ValueName, - &Context); - if (Status != INF_STATUS_SUCCESS) - { - Status = InfpFindFirstLine(Inf, - L"Strings", - ValueName, - &Context); - } - } - } - else - { - Status = InfpFindFirstLine(Inf, - L"Strings", - ValueName, - &Context); - } - - if (Status != INF_STATUS_SUCCESS || Context == NULL) - return NULL; - - Status = InfpGetData(Context, - NULL, - &Data); - - InfpFreeContext(Context); - - if (Status == STATUS_SUCCESS) - { - *len = strlenW(Data); - DPRINT("Substitute: %S Length: %ul\n", Data, *len); - return Data; - } - - return NULL; -} - - -/* do string substitutions on the specified text */ -/* the buffer is assumed to be large enough */ -/* returns necessary length not including terminating null */ -static unsigned int -InfpSubstituteString(PINFCACHE Inf, - PCWSTR text, - PWSTR buffer, - unsigned int size) -{ - const WCHAR *start, *subst, *p; - unsigned int len, total = 0; - int inside = 0; - - if (!buffer) size = MAX_INF_STRING_LENGTH + 1; - for (p = start = text; *p; p++) - { - if (*p != '%') continue; - inside = !inside; - if (inside) /* start of a %xx% string */ - { - len = (unsigned int)(p - start); - if (len > size - 1) len = size - 1; - if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); - total += len; - size -= len; - start = p; - } - else /* end of the %xx% string, find substitution */ - { - len = (unsigned int)(p - start - 1); - subst = InfpGetSubstitutionString( Inf, start + 1, &len, p[1] == '\\' ); - if (!subst) - { - subst = start; - len = (unsigned int)(p - start + 1); - } - if (len > size - 1) len = size - 1; - if (buffer) memcpy( buffer + total, subst, len * sizeof(WCHAR) ); - total += len; - size -= len; - start = p + 1; - } - } - - if (start != p) /* unfinished string, copy it */ - { - len = (unsigned int)(p - start); - if (len > size - 1) len = size - 1; - if (buffer) memcpy( buffer + total, start, len * sizeof(WCHAR) ); - total += len; - } - if (buffer && size) buffer[total] = 0; - return total; -} - - -INFSTATUS -InfpFindFirstLine(PINFCACHE Cache, - PCWSTR Section, - PCWSTR Key, - PINFCONTEXT *Context) -{ - PINFCACHESECTION CacheSection; - PINFCACHELINE CacheLine; - - if (Cache == NULL || Section == NULL || Context == NULL) - { - DPRINT1("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - CacheSection = InfpFindSection(Cache, Section); - if (NULL == CacheSection) - { - DPRINT("Section not found\n"); - return INF_STATUS_NOT_FOUND; - } - - if (Key != NULL) - { - CacheLine = InfpFindKeyLine(CacheSection, Key); - } - else - { - CacheLine = CacheSection->FirstLine; - } - - if (NULL == CacheLine) - { - DPRINT("Key not found\n"); - return INF_STATUS_NOT_FOUND; - } - - *Context = MALLOC(sizeof(INFCONTEXT)); - if (NULL == *Context) - { - DPRINT1("MALLOC() failed\n"); - return INF_STATUS_NO_MEMORY; - } - (*Context)->Inf = (PVOID)Cache; - (*Context)->Section = (PVOID)CacheSection; - (*Context)->Line = (PVOID)CacheLine; - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpFindNextLine(PINFCONTEXT ContextIn, - PINFCONTEXT ContextOut) -{ - PINFCACHELINE CacheLine; - - if (ContextIn == NULL || ContextOut == NULL) - return INF_STATUS_INVALID_PARAMETER; - - if (ContextIn->Line == NULL) - return INF_STATUS_INVALID_PARAMETER; - - CacheLine = (PINFCACHELINE)ContextIn->Line; - if (CacheLine->Next == NULL) - return INF_STATUS_NOT_FOUND; - - if (ContextIn != ContextOut) - { - ContextOut->Inf = ContextIn->Inf; - ContextOut->Section = ContextIn->Section; - } - ContextOut->Line = (PVOID)(CacheLine->Next); - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpFindFirstMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut) -{ - PINFCACHELINE CacheLine; - - if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0) - return INF_STATUS_INVALID_PARAMETER; - - if (ContextIn->Inf == NULL || ContextIn->Section == NULL) - return INF_STATUS_INVALID_PARAMETER; - - CacheLine = ((PINFCACHESECTION)(ContextIn->Section))->FirstLine; - while (CacheLine != NULL) - { - if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0) - { - - if (ContextIn != ContextOut) - { - ContextOut->Inf = ContextIn->Inf; - ContextOut->Section = ContextIn->Section; - } - ContextOut->Line = (PVOID)CacheLine; - - return INF_STATUS_SUCCESS; - } - - CacheLine = CacheLine->Next; - } - - return INF_STATUS_NOT_FOUND; -} - - -INFSTATUS -InfpFindNextMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut) -{ - PINFCACHELINE CacheLine; - - if (ContextIn == NULL || ContextOut == NULL || Key == NULL || *Key == 0) - return INF_STATUS_INVALID_PARAMETER; - - if (ContextIn->Inf == NULL || ContextIn->Section == NULL || ContextIn->Line == NULL) - return INF_STATUS_INVALID_PARAMETER; - - CacheLine = (PINFCACHELINE)ContextIn->Line; - while (CacheLine != NULL) - { - if (CacheLine->Key != NULL && strcmpiW (CacheLine->Key, Key) == 0) - { - - if (ContextIn != ContextOut) - { - ContextOut->Inf = ContextIn->Inf; - ContextOut->Section = ContextIn->Section; - } - ContextOut->Line = (PVOID)CacheLine; - - return INF_STATUS_SUCCESS; - } - - CacheLine = CacheLine->Next; - } - - return INF_STATUS_NOT_FOUND; -} - - -LONG -InfpGetLineCount(HINF InfHandle, - PCWSTR Section) -{ - PINFCACHE Cache; - PINFCACHESECTION CacheSection; - - if (InfHandle == NULL || Section == NULL) - { - DPRINT("Invalid parameter\n"); - return -1; - } - - Cache = (PINFCACHE)InfHandle; - - /* Iterate through list of sections */ - CacheSection = Cache->FirstSection; - while (CacheSection != NULL) - { - /* Are the section names the same? */ - if (strcmpiW(CacheSection->Name, Section) == 0) - { - return CacheSection->LineCount; - } - - /* Get the next section */ - CacheSection = CacheSection->Next; - } - - DPRINT("Section not found\n"); - - return -1; -} - - -/* InfpGetLineText */ - - -LONG -InfpGetFieldCount(PINFCONTEXT Context) -{ - if (Context == NULL || Context->Line == NULL) - return 0; - - return ((PINFCACHELINE)Context->Line)->FieldCount; -} - - -INFSTATUS -InfpGetBinaryField(PINFCONTEXT Context, - ULONG FieldIndex, - PUCHAR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize) -{ - PINFCACHELINE CacheLine; - PINFCACHEFIELD CacheField; - ULONG Index; - ULONG Size; - PUCHAR Ptr; - - if (Context == NULL || Context->Line == NULL || FieldIndex == 0) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - if (RequiredSize != NULL) - *RequiredSize = 0; - - CacheLine = (PINFCACHELINE)Context->Line; - - if (FieldIndex > (ULONG)CacheLine->FieldCount) - return INF_STATUS_NOT_FOUND; - - CacheField = CacheLine->FirstField; - for (Index = 1; Index < FieldIndex; Index++) - CacheField = CacheField->Next; - - Size = (ULONG)CacheLine->FieldCount - FieldIndex + 1; - - if (RequiredSize != NULL) - *RequiredSize = Size; - - if (ReturnBuffer != NULL) - { - if (ReturnBufferSize < Size) - return INF_STATUS_BUFFER_OVERFLOW; - - /* Copy binary data */ - Ptr = ReturnBuffer; - while (CacheField != NULL) - { - *Ptr = (UCHAR)strtoulW(CacheField->Data, NULL, 16); - - Ptr++; - CacheField = CacheField->Next; - } - } - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpGetIntField(PINFCONTEXT Context, - ULONG FieldIndex, - PLONG IntegerValue) -{ - PINFCACHELINE CacheLine; - PINFCACHEFIELD CacheField; - ULONG Index; - PWCHAR Ptr; - - if (Context == NULL || Context->Line == NULL || IntegerValue == NULL) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - CacheLine = (PINFCACHELINE)Context->Line; - - if (FieldIndex > (ULONG)CacheLine->FieldCount) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - if (FieldIndex == 0) - { - Ptr = CacheLine->Key; - } - else - { - CacheField = CacheLine->FirstField; - for (Index = 1; Index < FieldIndex; Index++) - CacheField = CacheField->Next; - - Ptr = CacheField->Data; - } - - *IntegerValue = (LONG)strtolW(Ptr, NULL, 0); - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpGetMultiSzField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize) -{ - PINFCACHELINE CacheLine; - PINFCACHEFIELD CacheField; - PINFCACHEFIELD FieldPtr; - ULONG Index; - ULONG Size; - PWCHAR Ptr; - - if (Context == NULL || Context->Line == NULL || FieldIndex == 0) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - if (RequiredSize != NULL) - *RequiredSize = 0; - - CacheLine = (PINFCACHELINE)Context->Line; - - if (FieldIndex > (ULONG)CacheLine->FieldCount) - return INF_STATUS_INVALID_PARAMETER; - - CacheField = CacheLine->FirstField; - for (Index = 1; Index < FieldIndex; Index++) - CacheField = CacheField->Next; - - /* Calculate the required buffer size */ - FieldPtr = CacheField; - Size = 0; - while (FieldPtr != NULL) - { - Size += ((ULONG)strlenW(FieldPtr->Data) + 1); - FieldPtr = FieldPtr->Next; - } - Size++; - - if (RequiredSize != NULL) - *RequiredSize = Size; - - if (ReturnBuffer != NULL) - { - if (ReturnBufferSize < Size) - return INF_STATUS_BUFFER_OVERFLOW; - - /* Copy multi-sz string */ - Ptr = ReturnBuffer; - FieldPtr = CacheField; - while (FieldPtr != NULL) - { - Size = (ULONG)strlenW(FieldPtr->Data) + 1; - - strcpyW(Ptr, FieldPtr->Data); - - Ptr = Ptr + Size; - FieldPtr = FieldPtr->Next; - } - *Ptr = 0; - } - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpGetStringField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize) -{ - PINFCACHELINE CacheLine; - PINFCACHEFIELD CacheField; - ULONG Index; - PWCHAR Ptr; - ULONG Size; - - if (Context == NULL || Context->Line == NULL || FieldIndex == 0) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - if (RequiredSize != NULL) - *RequiredSize = 0; - - CacheLine = (PINFCACHELINE)Context->Line; - - if (FieldIndex > (ULONG)CacheLine->FieldCount) - return INF_STATUS_INVALID_PARAMETER; - - if (FieldIndex == 0) - { - Ptr = CacheLine->Key; - } - else - { - CacheField = CacheLine->FirstField; - for (Index = 1; Index < FieldIndex; Index++) - CacheField = CacheField->Next; - - Ptr = CacheField->Data; - } - -// Size = (ULONG)strlenW(Ptr) + 1; - Size = InfpSubstituteString(Context->Inf, - Ptr, - NULL, - 0); - - if (RequiredSize != NULL) - *RequiredSize = Size + 1; - - if (ReturnBuffer != NULL) - { - if (ReturnBufferSize <= Size) - return INF_STATUS_BUFFER_OVERFLOW; - -// strcpyW(ReturnBuffer, Ptr); - InfpSubstituteString(Context->Inf, - Ptr, - ReturnBuffer, - ReturnBufferSize); - } - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpGetData(PINFCONTEXT Context, - PWCHAR *Key, - PWCHAR *Data) -{ - PINFCACHELINE CacheKey; - - if (Context == NULL || Context->Line == NULL || Data == NULL) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - CacheKey = (PINFCACHELINE)Context->Line; - if (Key != NULL) - *Key = CacheKey->Key; - - if (Data != NULL) - { - if (CacheKey->FirstField == NULL) - { - *Data = NULL; - } - else - { - *Data = CacheKey->FirstField->Data; - } - } - - return INF_STATUS_SUCCESS; -} - - -INFSTATUS -InfpGetDataField(PINFCONTEXT Context, - ULONG FieldIndex, - PWCHAR *Data) -{ - PINFCACHELINE CacheLine; - PINFCACHEFIELD CacheField; - ULONG Index; - - if (Context == NULL || Context->Line == NULL || Data == NULL) - { - DPRINT("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - CacheLine = (PINFCACHELINE)Context->Line; - - if (FieldIndex > (ULONG)CacheLine->FieldCount) - return INF_STATUS_INVALID_PARAMETER; - - if (FieldIndex == 0) - { - *Data = CacheLine->Key; - } - else - { - CacheField = CacheLine->FirstField; - for (Index = 1; Index < FieldIndex; Index++) - CacheField = CacheField->Next; - - *Data = CacheField->Data; - } - - return INF_STATUS_SUCCESS; -} - -VOID -InfpFreeContext(PINFCONTEXT Context) -{ - FREE(Context); -} - -/* EOF */ diff --git a/lib/newinflib/infhost.h b/lib/newinflib/infhost.h deleted file mode 100644 index b1dfaaf8a86..00000000000 --- a/lib/newinflib/infhost.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "infcommon.h" - -extern int InfHostOpenBufferedFile(PHINF InfHandle, - void *Buffer, - ULONG BufferSize, - LANGID LanguageId, - ULONG *ErrorLine); -extern int InfHostOpenFile(PHINF InfHandle, - const CHAR *FileName, - LANGID LanguageId, - ULONG *ErrorLine); -extern int InfHostWriteFile(HINF InfHandle, - const CHAR *FileName, - const CHAR *HeaderComment); -extern void InfHostCloseFile(HINF InfHandle); -extern int InfHostFindFirstLine(HINF InfHandle, - const WCHAR *Section, - const WCHAR *Key, - PINFCONTEXT *Context); -extern int InfHostFindNextLine(PINFCONTEXT ContextIn, - PINFCONTEXT ContextOut); -extern int InfHostFindFirstMatchLine(PINFCONTEXT ContextIn, - const WCHAR *Key, - PINFCONTEXT ContextOut); -extern int InfHostFindNextMatchLine(PINFCONTEXT ContextIn, - const WCHAR *Key, - PINFCONTEXT ContextOut); -extern LONG InfHostGetLineCount(HINF InfHandle, - const WCHAR *Section); -extern LONG InfHostGetFieldCount(PINFCONTEXT Context); -extern int InfHostGetBinaryField(PINFCONTEXT Context, - ULONG FieldIndex, - UCHAR *ReturnBuffer, - ULONG ReturnBufferSize, - ULONG *RequiredSize); -extern int InfHostGetIntField(PINFCONTEXT Context, - ULONG FieldIndex, - ULONG *IntegerValue); -extern int InfHostGetMultiSzField(PINFCONTEXT Context, - ULONG FieldIndex, - WCHAR *ReturnBuffer, - ULONG ReturnBufferSize, - ULONG *RequiredSize); -extern int InfHostGetStringField(PINFCONTEXT Context, - ULONG FieldIndex, - WCHAR *ReturnBuffer, - ULONG ReturnBufferSize, - ULONG *RequiredSize); -extern int InfHostGetData(PINFCONTEXT Context, - WCHAR **Key, - WCHAR **Data); -extern int InfHostGetDataField(PINFCONTEXT Context, - ULONG FieldIndex, - WCHAR **Data); -extern int InfHostFindOrAddSection(HINF InfHandle, - const WCHAR *Section, - PINFCONTEXT *Context); -extern int InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key); -extern int InfHostAddField(PINFCONTEXT Context, const WCHAR *Data); -extern void InfHostFreeContext(PINFCONTEXT Context); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/* EOF */ diff --git a/lib/newinflib/infhostgen.c b/lib/newinflib/infhostgen.c deleted file mode 100644 index e6269ff6318..00000000000 --- a/lib/newinflib/infhostgen.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infhost.h" - -#define NDEBUG -#include - -/* PUBLIC FUNCTIONS *********************************************************/ - -int -InfHostOpenBufferedFile(PHINF InfHandle, - void *Buffer, - ULONG BufferSize, - LANGID LanguageId, - ULONG *ErrorLine) -{ - INFSTATUS Status; - PINFCACHE Cache; - WCHAR *FileBuffer; - ULONG FileBufferSize; - - *InfHandle = NULL; - *ErrorLine = (ULONG)-1; - - /* Allocate file buffer */ - FileBufferSize = BufferSize + 2; - FileBuffer = MALLOC(FileBufferSize); - if (FileBuffer == NULL) - { - DPRINT1("MALLOC() failed\n"); - return(INF_STATUS_INSUFFICIENT_RESOURCES); - } - - MEMCPY(FileBuffer, Buffer, BufferSize); - - /* Append string terminator */ - FileBuffer[BufferSize] = 0; - FileBuffer[BufferSize + 1] = 0; - - /* Allocate infcache header */ - Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); - if (Cache == NULL) - { - DPRINT1("MALLOC() failed\n"); - FREE(FileBuffer); - return(INF_STATUS_INSUFFICIENT_RESOURCES); - } - - /* Initialize inicache header */ - ZEROMEMORY(Cache, - sizeof(INFCACHE)); - - Cache->LanguageId = LanguageId; - - /* Parse the inf buffer */ - if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferSize, NULL)) - { -// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; - WCHAR *new_buff; -// UINT codepage = CP_ACP; - UINT offset = 0; - -// if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) -// { -// codepage = CP_UTF8; -// offset = sizeof(utf8_bom); -// } - - new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); - if (new_buff != NULL) - { - ULONG len; - Status = RtlMultiByteToUnicodeN(new_buff, - FileBufferSize * sizeof(WCHAR), - &len, - (char *)FileBuffer + offset, - FileBufferSize - offset); - - Status = InfpParseBuffer(Cache, - new_buff, - new_buff + len / sizeof(WCHAR), - ErrorLine); - FREE(new_buff); - } - else - Status = INF_STATUS_INSUFFICIENT_RESOURCES; - } - else - { - WCHAR *new_buff = (WCHAR *)FileBuffer; - /* UCS-16 files should start with the Unicode BOM; we should skip it */ - if (*new_buff == 0xfeff) - { - new_buff++; - FileBufferSize -= sizeof(WCHAR); - } - Status = InfpParseBuffer(Cache, - new_buff, - (WCHAR*)((char*)new_buff + FileBufferSize), - ErrorLine); - } - - if (!INF_SUCCESS(Status)) - { - FREE(Cache); - Cache = NULL; - } - - /* Free file buffer */ - FREE(FileBuffer); - - *InfHandle = (HINF)Cache; - - return INF_SUCCESS(Status) ? 0 : -1; -} - - -int -InfHostOpenFile(PHINF InfHandle, - const CHAR *FileName, - LANGID LanguageId, - ULONG *ErrorLine) -{ - FILE *File; - CHAR *FileBuffer; - ULONG FileLength; - ULONG FileBufferLength; - PINFCACHE Cache; - INFSTATUS Status = INF_STATUS_SUCCESS; - - *InfHandle = NULL; - *ErrorLine = (ULONG)-1; - - /* Open the inf file */ - File = fopen(FileName, "rb"); - if (NULL == File) - { - DPRINT1("fopen() failed (errno %d)\n", errno); - return -1; - } - - DPRINT("fopen() successful\n"); - - /* Query file size */ - if (fseek(File, (size_t)0, SEEK_END)) - { - DPRINT1("fseek() to EOF failed (errno %d)\n", errno); - fclose(File); - return -1; - } - - FileLength = (ULONG)ftell(File); - if ((ULONG) -1 == FileLength) - { - DPRINT1("ftell() failed (errno %d)\n", errno); - fclose(File); - return -1; - } - DPRINT("File size: %u\n", (UINT)FileLength); - - /* Rewind */ - if (fseek(File, (size_t)0, SEEK_SET)) - { - DPRINT1("fseek() to BOF failed (errno %d)\n", errno); - fclose(File); - return -1; - } - - /* Allocate file buffer */ - FileBufferLength = FileLength + 2; - FileBuffer = MALLOC(FileBufferLength); - if (FileBuffer == NULL) - { - DPRINT1("MALLOC() failed\n"); - fclose(File); - return -1; - } - - /* Read file */ - if (FileLength != fread(FileBuffer, (size_t)1, (size_t)FileLength, File)) - { - DPRINT1("fread() failed (errno %d)\n", errno); - fclose(File); - return -1; - } - - fclose(File); - - /* Append string terminator */ - FileBuffer[FileLength] = 0; - FileBuffer[FileLength + 1] = 0; - - /* Allocate infcache header */ - Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); - if (Cache == NULL) - { - DPRINT1("MALLOC() failed\n"); - FREE(FileBuffer); - return -1; - } - - /* Initialize inicache header */ - ZEROMEMORY(Cache, - sizeof(INFCACHE)); - - Cache->LanguageId = LanguageId; - - /* Parse the inf buffer */ - if (!RtlIsTextUnicode(FileBuffer, (INT)FileBufferLength, NULL)) - { -// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; - WCHAR *new_buff; -// UINT codepage = CP_ACP; - UINT offset = 0; - -// if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) -// { -// codepage = CP_UTF8; -// offset = sizeof(utf8_bom); -// } - - new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); - if (new_buff != NULL) - { - ULONG len; - Status = RtlMultiByteToUnicodeN(new_buff, - FileBufferLength * sizeof(WCHAR), - &len, - (char *)FileBuffer + offset, - FileBufferLength - offset); - - Status = InfpParseBuffer(Cache, - new_buff, - new_buff + len / sizeof(WCHAR), - ErrorLine); - - FREE(new_buff); - } - else - Status = INF_STATUS_INSUFFICIENT_RESOURCES; - } - else - { - WCHAR *new_buff = (WCHAR *)FileBuffer; - /* UCS-16 files should start with the Unicode BOM; we should skip it */ - if (*new_buff == 0xfeff) - { - new_buff++; - FileBufferLength -= sizeof(WCHAR); - } - Status = InfpParseBuffer(Cache, - new_buff, - (WCHAR*)((char*)new_buff + FileBufferLength), - ErrorLine); - } - - if (!INF_SUCCESS(Status)) - { - FREE(Cache); - Cache = NULL; - } - - /* Free file buffer */ - FREE(FileBuffer); - - *InfHandle = (HINF)Cache; - - return INF_SUCCESS(Status) ? 0 : -1; -} - - -void -InfHostCloseFile(HINF InfHandle) -{ - PINFCACHE Cache; - - Cache = (PINFCACHE)InfHandle; - - if (Cache == NULL) - { - return; - } - - while (Cache->FirstSection != NULL) - { - Cache->FirstSection = InfpFreeSection(Cache->FirstSection); - } - Cache->LastSection = NULL; - - FREE(Cache); -} - -/* EOF */ diff --git a/lib/newinflib/infhostget.c b/lib/newinflib/infhostget.c deleted file mode 100644 index bd49be17002..00000000000 --- a/lib/newinflib/infhostget.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infhost.h" - -#define NDEBUG -#include - -int -InfHostFindFirstLine(HINF InfHandle, - const WCHAR *Section, - const WCHAR *Key, - PINFCONTEXT *Context) -{ - INFSTATUS Status; - - Status = InfpFindFirstLine(InfHandle, Section, Key, Context); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostFindNextLine(PINFCONTEXT ContextIn, - PINFCONTEXT ContextOut) -{ - INFSTATUS Status; - - Status = InfpFindNextLine(ContextIn, ContextOut); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostFindFirstMatchLine(PINFCONTEXT ContextIn, - const WCHAR *Key, - PINFCONTEXT ContextOut) -{ - INFSTATUS Status; - - Status = InfpFindFirstMatchLine(ContextIn, Key, ContextOut); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostFindNextMatchLine(PINFCONTEXT ContextIn, - const WCHAR *Key, - PINFCONTEXT ContextOut) -{ - INFSTATUS Status; - - Status = InfpFindNextMatchLine(ContextIn, Key, ContextOut); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -LONG -InfHostGetLineCount(HINF InfHandle, - PCWSTR Section) -{ - return InfpGetLineCount(InfHandle, Section); -} - - -/* InfGetLineText */ - - -LONG -InfHostGetFieldCount(PINFCONTEXT Context) -{ - return InfpGetFieldCount(Context); -} - - -int -InfHostGetBinaryField(PINFCONTEXT Context, - ULONG FieldIndex, - UCHAR *ReturnBuffer, - ULONG ReturnBufferSize, - ULONG *RequiredSize) -{ - INFSTATUS Status; - - Status = InfpGetBinaryField(Context, FieldIndex, ReturnBuffer, - ReturnBufferSize, RequiredSize); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostGetIntField(PINFCONTEXT Context, - ULONG FieldIndex, - ULONG *IntegerValue) -{ - INFSTATUS Status; - - Status = InfpGetIntField(Context, FieldIndex, (PLONG)IntegerValue); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostGetMultiSzField(PINFCONTEXT Context, - ULONG FieldIndex, - WCHAR *ReturnBuffer, - ULONG ReturnBufferSize, - ULONG *RequiredSize) -{ - INFSTATUS Status; - - Status = InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, - ReturnBufferSize, RequiredSize); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostGetStringField(PINFCONTEXT Context, - ULONG FieldIndex, - WCHAR *ReturnBuffer, - ULONG ReturnBufferSize, - ULONG *RequiredSize) -{ - INFSTATUS Status; - - Status = InfpGetStringField(Context, FieldIndex, ReturnBuffer, - ReturnBufferSize, RequiredSize); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostGetData(PINFCONTEXT Context, - WCHAR **Key, - WCHAR **Data) -{ - INFSTATUS Status; - - Status = InfpGetData(Context, Key, Data); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - - -int -InfHostGetDataField(PINFCONTEXT Context, - ULONG FieldIndex, - WCHAR **Data) -{ - INFSTATUS Status; - - Status = InfpGetDataField(Context, FieldIndex, Data); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - -VOID -InfHostFreeContext(PINFCONTEXT Context) -{ - InfpFreeContext(Context); -} - -/* EOF */ diff --git a/lib/newinflib/infhostput.c b/lib/newinflib/infhostput.c deleted file mode 100644 index a5233e50545..00000000000 --- a/lib/newinflib/infhostput.c +++ /dev/null @@ -1,115 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * COPYRIGHT: Copyright 2005 Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infhost.h" - -#define NDEBUG -#include - -int -InfHostWriteFile(HINF InfHandle, - const CHAR *FileName, - const CHAR *HeaderComment) -{ - WCHAR *Buffer; - ULONG BufferSize; - INFSTATUS Status; - FILE *File; - - Status = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); - if (! INF_SUCCESS(Status)) - { - errno = Status; - return -1; - } - - File = fopen(FileName, "wb"); - if (NULL == File) - { - FREE(Buffer); - DPRINT1("fopen() failed (errno %d)\n", errno); - return -1; - } - - DPRINT("fopen() successful\n"); - - if (NULL != HeaderComment && '\0' != *HeaderComment) - { -// fprintf(File, "; %s\r\n\r\n", HeaderComment); - } - - if (BufferSize != fwrite(Buffer, (size_t)1, (size_t)BufferSize, File)) - { - DPRINT1("fwrite() failed (errno %d)\n", errno); - fclose(File); - FREE(Buffer); - return -1; - } - - fclose(File); - - FREE(Buffer); - - return 0; -} - -int -InfHostFindOrAddSection(HINF InfHandle, - const WCHAR *Section, - PINFCONTEXT *Context) -{ - INFSTATUS Status; - - Status = InfpFindOrAddSection((PINFCACHE) InfHandle, Section, Context); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - -int -InfHostAddLine(PINFCONTEXT Context, const WCHAR *Key) -{ - INFSTATUS Status; - - Status = InfpAddLineWithKey(Context, Key); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - -int -InfHostAddField(PINFCONTEXT Context, const WCHAR *Data) -{ - INFSTATUS Status; - - Status = InfpAddField(Context, Data); - if (INF_SUCCESS(Status)) - { - return 0; - } - else - { - errno = Status; - return -1; - } -} - -/* EOF */ diff --git a/lib/newinflib/infhostrtl.c b/lib/newinflib/infhostrtl.c deleted file mode 100644 index c62d40a8d56..00000000000 --- a/lib/newinflib/infhostrtl.c +++ /dev/null @@ -1,151 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infhost.h" - -#define NDEBUG -#include - -NTSTATUS NTAPI -RtlMultiByteToUnicodeN( - IN PWCHAR UnicodeString, - IN ULONG UnicodeSize, - IN PULONG ResultSize, - IN PCSTR MbString, - IN ULONG MbSize) -{ - ULONG Size = 0; - ULONG i; - PUCHAR WideString; - - /* single-byte code page */ - if (MbSize > (UnicodeSize / sizeof(WCHAR))) - Size = UnicodeSize / sizeof(WCHAR); - else - Size = MbSize; - - if (ResultSize != NULL) - *ResultSize = Size * sizeof(WCHAR); - - WideString = (PUCHAR)UnicodeString; - for (i = 0; i <= Size; i++) - { - WideString[2 * i + 0] = (UCHAR)MbString[i]; - WideString[2 * i + 1] = 0; - } - - return STATUS_SUCCESS; -} - - -BOOLEAN -NTAPI -RtlIsTextUnicode( PVOID buf, INT len, INT *pf ) -{ - static const WCHAR std_control_chars[] = {'\r','\n','\t',' ',0x3000,0}; - static const WCHAR byterev_control_chars[] = {0x0d00,0x0a00,0x0900,0x2000,0}; - const WCHAR *s = buf; - int i; - unsigned int flags = MAXULONG, out_flags = 0; - - if (len < sizeof(WCHAR)) - { - /* FIXME: MSDN documents IS_TEXT_UNICODE_BUFFER_TOO_SMALL but there is no such thing... */ - if (pf) *pf = 0; - return FALSE; - } - if (pf) - flags = (unsigned int)*pf; - /* - * Apply various tests to the text string. According to the - * docs, each test "passed" sets the corresponding flag in - * the output flags. But some of the tests are mutually - * exclusive, so I don't see how you could pass all tests ... - */ - - /* Check for an odd length ... pass if even. */ - if (len & 1) out_flags |= IS_TEXT_UNICODE_ODD_LENGTH; - - if (((char *)buf)[len - 1] == 0) - len--; /* Windows seems to do something like that to avoid e.g. false IS_TEXT_UNICODE_NULL_BYTES */ - - len /= (INT)sizeof(WCHAR); - /* Windows only checks the first 256 characters */ - if (len > 256) len = 256; - - /* Check for the special byte order unicode marks. */ - if (*s == 0xFEFF) out_flags |= IS_TEXT_UNICODE_SIGNATURE; - if (*s == 0xFFFE) out_flags |= IS_TEXT_UNICODE_REVERSE_SIGNATURE; - - /* apply some statistical analysis */ - if (flags & IS_TEXT_UNICODE_STATISTICS) - { - int stats = 0; - /* FIXME: checks only for ASCII characters in the unicode stream */ - for (i = 0; i < len; i++) - { - if (s[i] <= 255) stats++; - } - if (stats > len / 2) - out_flags |= IS_TEXT_UNICODE_STATISTICS; - } - - /* Check for unicode NULL chars */ - if (flags & IS_TEXT_UNICODE_NULL_BYTES) - { - for (i = 0; i < len; i++) - { - if (!(s[i] & 0xff) || !(s[i] >> 8)) - { - out_flags |= IS_TEXT_UNICODE_NULL_BYTES; - break; - } - } - } - - if (flags & IS_TEXT_UNICODE_CONTROLS) - { - for (i = 0; i < len; i++) - { - if (strchrW(std_control_chars, s[i])) - { - out_flags |= IS_TEXT_UNICODE_CONTROLS; - break; - } - } - } - - if (flags & IS_TEXT_UNICODE_REVERSE_CONTROLS) - { - for (i = 0; i < len; i++) - { - if (strchrW(byterev_control_chars, s[i])) - { - out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS; - break; - } - } - } - - if (pf) - { - out_flags &= (unsigned int)*pf; - *pf = (INT)out_flags; - } - /* check for flags that indicate it's definitely not valid Unicode */ - if (out_flags & (IS_TEXT_UNICODE_REVERSE_MASK | IS_TEXT_UNICODE_NOT_UNICODE_MASK)) return FALSE; - /* now check for invalid ASCII, and assume Unicode if so */ - if (out_flags & IS_TEXT_UNICODE_NOT_ASCII_MASK) return TRUE; - /* now check for Unicode flags */ - if (out_flags & IS_TEXT_UNICODE_UNICODE_MASK) return TRUE; - /* no flags set */ - return FALSE; -} diff --git a/lib/newinflib/inflib.h b/lib/newinflib/inflib.h deleted file mode 100644 index 7dff17fa035..00000000000 --- a/lib/newinflib/inflib.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * COPYRIGHT: Copyright 2005 Ge van Geldorp - */ - -#include -#include -#include - -#include "builddep.h" -#include "infcommon.h" -#include "infpriv.h" - -/* EOF */ diff --git a/lib/newinflib/inflib.mak b/lib/newinflib/inflib.mak deleted file mode 100644 index a0edbe26b96..00000000000 --- a/lib/newinflib/inflib.mak +++ /dev/null @@ -1,76 +0,0 @@ -INFLIB_BASE = $(LIB_BASE_)newinflib -INFLIB_BASE_ = $(INFLIB_BASE)$(SEP) -INFLIB_INT = $(INTERMEDIATE_)$(INFLIB_BASE)_host -INFLIB_INT_ = $(INTERMEDIATE_)$(INFLIB_BASE)_host$(SEP) -INFLIB_OUT = $(OUTPUT_)$(INFLIB_BASE)_host -INFLIB_OUT_ = $(OUTPUT_)$(INFLIB_BASE)_host$(SEP) - -$(INFLIB_INT): | $(LIB_INT) - $(ECHO_MKDIR) - ${mkdir} $@ - -ifneq ($(INTERMEDIATE),$(OUTPUT)) -$(INFLIB_OUT): | $(OUTPUT_)$(LIB_BASE) - $(ECHO_MKDIR) - ${mkdir} $@ -endif - -INFLIB_HOST_TARGET = \ - $(INFLIB_OUT)$(SEP)newinflib.a - -INFLIB_HOST_SOURCES = $(addprefix $(INFLIB_BASE_), \ - infcore.c \ - infget.c \ - infput.c \ - infhostgen.c \ - infhostget.c \ - infhostput.c \ - infhostrtl.c \ - ) - -INFLIB_HOST_OBJECTS = \ - $(subst $(INFLIB_BASE), $(INFLIB_INT), $(INFLIB_HOST_SOURCES:.c=.o)) - -INFLIB_HOST_CFLAGS = -O3 -Wall -Wpointer-arith -Wconversion \ - -Wstrict-prototypes -Wmissing-prototypes -DINFLIB_HOST \ - -Iinclude/reactos -Iinclude $(HOST_CFLAGS) - -$(INFLIB_HOST_TARGET): $(INFLIB_HOST_OBJECTS) | $(INFLIB_OUT) - $(ECHO_HOSTAR) - $(host_ar) -r $@ $(INFLIB_HOST_OBJECTS) - -$(INFLIB_INT_)infcore.o: $(INFLIB_BASE_)infcore.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -$(INFLIB_INT_)infget.o: $(INFLIB_BASE_)infget.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -$(INFLIB_INT_)infput.o: $(INFLIB_BASE_)infput.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -$(INFLIB_INT_)infhostgen.o: $(INFLIB_BASE_)infhostgen.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -$(INFLIB_INT_)infhostget.o: $(INFLIB_BASE_)infhostget.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -$(INFLIB_INT_)infhostput.o: $(INFLIB_BASE_)infhostput.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -$(INFLIB_INT_)infhostrtl.o: $(INFLIB_BASE_)infhostrtl.c | $(INFLIB_INT) - $(ECHO_HOSTCC) - ${host_gcc} $(INFLIB_HOST_CFLAGS) -c $< -o $@ - -.PHONY: newinflib_host -newinflib_host: $(INFLIB_HOST_TARGET) - -.PHONY: newinflib_host_clean -newinflib_host_clean: - -@$(rm) $(INFLIB_HOST_TARGET) $(INFLIB_HOST_OBJECTS) 2>$(NUL) -clean: newinflib_host_clean diff --git a/lib/newinflib/inflib.rbuild b/lib/newinflib/inflib.rbuild deleted file mode 100644 index 7c758a7c332..00000000000 --- a/lib/newinflib/inflib.rbuild +++ /dev/null @@ -1,32 +0,0 @@ - - - - - . - infcore.c - infget.c - infput.c - infrosgen.c - infrosget.c - infrosput.c - - - " " - - . - - - - -Wwrite-strings - -Wpointer-arith - - - infcore.c - infget.c - infput.c - infhostgen.c - infhostget.c - infhostput.c - infhostrtl.c - - diff --git a/lib/newinflib/infpriv.h b/lib/newinflib/infpriv.h deleted file mode 100644 index c7adededd5d..00000000000 --- a/lib/newinflib/infpriv.h +++ /dev/null @@ -1,145 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -#pragma once - -#ifndef FIELD_OFFSET -#define FIELD_OFFSET(t,f) ((ptrdiff_t)&(((t*)0)->f)) -#endif - -#define INF_STATUS_INSUFFICIENT_RESOURCES ((INFSTATUS)0xC000009A) -#define INF_STATUS_BAD_SECTION_NAME_LINE ((INFSTATUS)0xC0700001) -#define INF_STATUS_SECTION_NAME_TOO_LONG ((INFSTATUS)0xC0700002) -#define INF_STATUS_WRONG_INF_STYLE ((INFSTATUS)0xC0700003) -#define INF_STATUS_NOT_ENOUGH_MEMORY ((INFSTATUS)0xC0700004) - -typedef struct _INFCACHEFIELD -{ - struct _INFCACHEFIELD *Next; - struct _INFCACHEFIELD *Prev; - - WCHAR Data[1]; -} INFCACHEFIELD, *PINFCACHEFIELD; - -typedef struct _INFCACHELINE -{ - struct _INFCACHELINE *Next; - struct _INFCACHELINE *Prev; - - LONG FieldCount; - - PWCHAR Key; - - PINFCACHEFIELD FirstField; - PINFCACHEFIELD LastField; - -} INFCACHELINE, *PINFCACHELINE; - -typedef struct _INFCACHESECTION -{ - struct _INFCACHESECTION *Next; - struct _INFCACHESECTION *Prev; - - PINFCACHELINE FirstLine; - PINFCACHELINE LastLine; - - LONG LineCount; - - WCHAR Name[1]; -} INFCACHESECTION, *PINFCACHESECTION; - -typedef struct _INFCACHE -{ - LANGID LanguageId; - PINFCACHESECTION FirstSection; - PINFCACHESECTION LastSection; - - PINFCACHESECTION StringsSection; -} INFCACHE, *PINFCACHE; - -typedef struct _INFCONTEXT -{ - PINFCACHE Inf; - PINFCACHESECTION Section; - PINFCACHELINE Line; -} INFCONTEXT; - -typedef int INFSTATUS; - -/* FUNCTIONS ****************************************************************/ - -extern INFSTATUS InfpParseBuffer(PINFCACHE file, - const WCHAR *buffer, - const WCHAR *end, - PULONG error_line); -extern PINFCACHESECTION InfpFreeSection(PINFCACHESECTION Section); -extern PINFCACHESECTION InfpAddSection(PINFCACHE Cache, - PCWSTR Name); -extern PINFCACHELINE InfpAddLine(PINFCACHESECTION Section); -extern PVOID InfpAddKeyToLine(PINFCACHELINE Line, - PCWSTR Key); -extern PVOID InfpAddFieldToLine(PINFCACHELINE Line, - PCWSTR Data); -extern PINFCACHELINE InfpFindKeyLine(PINFCACHESECTION Section, - PCWSTR Key); -extern PINFCACHESECTION InfpFindSection(PINFCACHE Cache, - PCWSTR Section); - -extern INFSTATUS InfpBuildFileBuffer(PINFCACHE InfHandle, - PWCHAR *Buffer, - PULONG BufferSize); - -extern INFSTATUS InfpFindFirstLine(PINFCACHE InfHandle, - PCWSTR Section, - PCWSTR Key, - PINFCONTEXT *Context); -extern INFSTATUS InfpFindNextLine(PINFCONTEXT ContextIn, - PINFCONTEXT ContextOut); -extern INFSTATUS InfpFindFirstMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut); -extern INFSTATUS InfpFindNextMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut); -extern LONG InfpGetLineCount(HINF InfHandle, - PCWSTR Section); -extern LONG InfpGetFieldCount(PINFCONTEXT Context); -extern INFSTATUS InfpGetBinaryField(PINFCONTEXT Context, - ULONG FieldIndex, - PUCHAR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize); -extern INFSTATUS InfpGetIntField(PINFCONTEXT Context, - ULONG FieldIndex, - PLONG IntegerValue); -extern INFSTATUS InfpGetMultiSzField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize); -extern INFSTATUS InfpGetStringField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize); -extern INFSTATUS InfpGetData(PINFCONTEXT Context, - PWCHAR *Key, - PWCHAR *Data); -extern INFSTATUS InfpGetDataField(PINFCONTEXT Context, - ULONG FieldIndex, - PWCHAR *Data); - -extern INFSTATUS InfpFindOrAddSection(PINFCACHE Cache, - PCWSTR Section, - PINFCONTEXT *Context); -extern INFSTATUS InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key); -extern INFSTATUS InfpAddField(PINFCONTEXT Context, PCWSTR Data); - -extern VOID InfpFreeContext(PINFCONTEXT Context); - -/* EOF */ diff --git a/lib/newinflib/infput.c b/lib/newinflib/infput.c deleted file mode 100644 index c049f3fdcf5..00000000000 --- a/lib/newinflib/infput.c +++ /dev/null @@ -1,264 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * COPYRIGHT: Copyright 2005 Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" - -#define NDEBUG -#include - -#define EOL L"\r\n" -#define SIZE_INC 1024 - -typedef struct _OUTPUTBUFFER -{ - PWCHAR Buffer; - PWCHAR Current; - ULONG TotalSize; - ULONG FreeSize; - INFSTATUS Status; -} OUTPUTBUFFER, *POUTPUTBUFFER; - -static void -Output(POUTPUTBUFFER OutBuf, PCWSTR Text) -{ - ULONG Length; - PWCHAR NewBuf; - ULONG NewSize; - - /* Skip mode? */ - if (! INF_SUCCESS(OutBuf->Status)) - { - return; - } - - /* Doesn't fit? */ - Length = (ULONG)strlenW(Text) * sizeof(WCHAR); - if (OutBuf->FreeSize < Length + 1 && INF_SUCCESS(OutBuf->Status)) - { - DPRINT("Out of free space. TotalSize %u FreeSize %u Length %u\n", - (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize, (UINT)Length); - /* Round up to next SIZE_INC */ - NewSize = OutBuf->TotalSize + - (((Length + 1) - OutBuf->FreeSize + (SIZE_INC - 1)) / - SIZE_INC) * SIZE_INC; - DPRINT("NewSize %u\n", (UINT)NewSize); - NewBuf = MALLOC(NewSize); - /* Abort if failed */ - if (NULL == NewBuf) - { - DPRINT1("MALLOC() failed\n"); - OutBuf->Status = INF_STATUS_NO_MEMORY; - return; - } - - /* Need to copy old contents? */ - if (NULL != OutBuf->Buffer) - { - DPRINT("Copying %u bytes from old content\n", - (UINT)(OutBuf->TotalSize - OutBuf->FreeSize)); - MEMCPY(NewBuf, OutBuf->Buffer, OutBuf->TotalSize - OutBuf->FreeSize); - OutBuf->Current = NewBuf + (OutBuf->Current - OutBuf->Buffer); - FREE(OutBuf->Buffer); - } - else - { - OutBuf->Current = NewBuf; - } - OutBuf->Buffer = NewBuf; - OutBuf->FreeSize += NewSize - OutBuf->TotalSize; - OutBuf->TotalSize = NewSize; - DPRINT("After reallocation TotalSize %u FreeSize %u\n", - (UINT)OutBuf->TotalSize, (UINT)OutBuf->FreeSize); - } - - /* We're guaranteed to have enough room now. Copy char by char because of - possible "conversion" from Unicode to Ansi */ - while (Length--) - { - *OutBuf->Current++ = *Text++; - OutBuf->FreeSize--; - } - *OutBuf->Current = '\0'; -} - -INFSTATUS -InfpBuildFileBuffer(PINFCACHE Cache, - PWCHAR *Buffer, - PULONG BufferSize) -{ - OUTPUTBUFFER OutBuf; - PINFCACHESECTION CacheSection; - PINFCACHELINE CacheLine; - PINFCACHEFIELD CacheField; - PWCHAR p; - BOOLEAN NeedQuotes; - - OutBuf.Buffer = NULL; - OutBuf.Current = NULL; - OutBuf.FreeSize = 0; - OutBuf.TotalSize = 0; - OutBuf.Status = INF_STATUS_SUCCESS; - - /* Iterate through list of sections */ - CacheSection = Cache->FirstSection; - while (CacheSection != NULL) - { - DPRINT("Processing section %S\n", CacheSection->Name); - if (CacheSection != Cache->FirstSection) - { - Output(&OutBuf, EOL); - } - Output(&OutBuf, L"["); - Output(&OutBuf, CacheSection->Name); - Output(&OutBuf, L"]"); - Output(&OutBuf, EOL); - - /* Iterate through list of lines */ - CacheLine = CacheSection->FirstLine; - while (CacheLine != NULL) - { - if (NULL != CacheLine->Key) - { - DPRINT("Line with key %S\n", CacheLine->Key); - Output(&OutBuf, CacheLine->Key); - Output(&OutBuf, L" = "); - } - else - { - DPRINT("Line without key\n"); - } - - /* Iterate through list of lines */ - CacheField = CacheLine->FirstField; - while (CacheField != NULL) - { - if (CacheField != CacheLine->FirstField) - { - Output(&OutBuf, L","); - } - p = CacheField->Data; - NeedQuotes = FALSE; - while (L'\0' != *p && ! NeedQuotes) - { - NeedQuotes = (BOOLEAN)(L',' == *p || L';' == *p || - L'\\' == *p); - p++; - } - if (NeedQuotes) - { - Output(&OutBuf, L"\""); - Output(&OutBuf, CacheField->Data); - Output(&OutBuf, L"\""); - } - else - { - Output(&OutBuf, CacheField->Data); - } - - /* Get the next field */ - CacheField = CacheField->Next; - } - - Output(&OutBuf, EOL); - /* Get the next line */ - CacheLine = CacheLine->Next; - } - - /* Get the next section */ - CacheSection = CacheSection->Next; - } - - if (INF_SUCCESS(OutBuf.Status)) - { - *Buffer = OutBuf.Buffer; - *BufferSize = OutBuf.TotalSize - OutBuf.FreeSize; - } - else if (NULL != OutBuf.Buffer) - { - FREE(OutBuf.Buffer); - } - - return INF_STATUS_SUCCESS; -} - -INFSTATUS -InfpFindOrAddSection(PINFCACHE Cache, - PCWSTR Section, - PINFCONTEXT *Context) -{ - DPRINT("InfpFindOrAddSection section %S\n", Section); - - *Context = MALLOC(sizeof(INFCONTEXT)); - if (NULL == *Context) - { - DPRINT1("MALLOC() failed\n"); - return INF_STATUS_NO_MEMORY; - } - - (*Context)->Inf = Cache; - (*Context)->Section = InfpFindSection(Cache, Section); - (*Context)->Line = NULL; - if (NULL == (*Context)->Section) - { - DPRINT("Section not found, creating it\n"); - (*Context)->Section = InfpAddSection(Cache, Section); - if (NULL == (*Context)->Section) - { - DPRINT("Failed to create section\n"); - FREE(*Context); - return INF_STATUS_NO_MEMORY; - } - } - - return INF_STATUS_SUCCESS; -} - -INFSTATUS -InfpAddLineWithKey(PINFCONTEXT Context, PCWSTR Key) -{ - if (NULL == Context) - { - DPRINT1("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - Context->Line = InfpAddLine(Context->Section); - if (NULL == Context->Line) - { - DPRINT("Failed to create line\n"); - return INF_STATUS_NO_MEMORY; - } - - if (NULL != Key && NULL == InfpAddKeyToLine(Context->Line, Key)) - { - DPRINT("Failed to add key\n"); - return INF_STATUS_NO_MEMORY; - } - - return INF_STATUS_SUCCESS; -} - -INFSTATUS -InfpAddField(PINFCONTEXT Context, PCWSTR Data) -{ - if (NULL == Context || NULL == Context->Line) - { - DPRINT1("Invalid parameter\n"); - return INF_STATUS_INVALID_PARAMETER; - } - - if (NULL == InfpAddFieldToLine(Context->Line, Data)) - { - DPRINT("Failed to add field\n"); - return INF_STATUS_NO_MEMORY; - } - - return INF_STATUS_SUCCESS; -} - -/* EOF */ diff --git a/lib/newinflib/infros.h b/lib/newinflib/infros.h deleted file mode 100644 index 92dbc5133db..00000000000 --- a/lib/newinflib/infros.h +++ /dev/null @@ -1,81 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include - -extern VOID InfSetHeap(PVOID Heap); -extern NTSTATUS InfOpenBufferedFile(PHINF InfHandle, - PVOID Buffer, - ULONG BufferSize, - LANGID LanguageId, - PULONG ErrorLine); -extern NTSTATUS InfOpenFile(PHINF InfHandle, - PUNICODE_STRING FileName, - LANGID LanguageId, - PULONG ErrorLine); -extern NTSTATUS InfWriteFile(HINF InfHandle, - PUNICODE_STRING FileName, - PUNICODE_STRING HeaderComment); -extern VOID InfCloseFile(HINF InfHandle); -extern BOOLEAN InfFindFirstLine(HINF InfHandle, - PCWSTR Section, - PCWSTR Key, - PINFCONTEXT *Context); -extern BOOLEAN InfFindNextLine(PINFCONTEXT ContextIn, - PINFCONTEXT ContextOut); -extern BOOLEAN InfFindFirstMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut); -extern BOOLEAN InfFindNextMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut); -extern LONG InfGetLineCount(HINF InfHandle, - PCWSTR Section); -extern LONG InfGetFieldCount(PINFCONTEXT Context); -extern BOOLEAN InfGetBinaryField(PINFCONTEXT Context, - ULONG FieldIndex, - PUCHAR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize); -extern BOOLEAN InfGetIntField(PINFCONTEXT Context, - ULONG FieldIndex, - PLONG IntegerValue); -extern BOOLEAN InfGetMultiSzField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize); -extern BOOLEAN InfGetStringField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize); -extern BOOLEAN InfGetData(PINFCONTEXT Context, - PWCHAR *Key, - PWCHAR *Data); -extern BOOLEAN InfGetDataField(PINFCONTEXT Context, - ULONG FieldIndex, - PWCHAR *Data); -extern BOOLEAN InfFindOrAddSection(HINF InfHandle, - PCWSTR Section, - PINFCONTEXT *Context); -extern BOOLEAN InfAddLine(PINFCONTEXT Context, PCWSTR Key); -extern BOOLEAN InfAddField(PINFCONTEXT Context, PCWSTR Data); -extern VOID InfFreeContext(PINFCONTEXT Context); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/* EOF */ diff --git a/lib/newinflib/infrosgen.c b/lib/newinflib/infrosgen.c deleted file mode 100644 index b23403b96c0..00000000000 --- a/lib/newinflib/infrosgen.c +++ /dev/null @@ -1,365 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infros.h" - -#define NDEBUG -#include - -/* PRIVATE FUNCTIONS ********************************************************/ - -static int InfpHeapRefCount; - -static VOID -CheckHeap() -{ - if (NULL == InfpHeap) - { - InfpHeap = RtlCreateHeap(HEAP_GROWABLE, NULL, 0, 0, NULL, NULL); - } - if (0 <= InfpHeapRefCount) - { - InfpHeapRefCount++; - } -} - - -/* PUBLIC FUNCTIONS *********************************************************/ - -PVOID InfpHeap; - -VOID -InfSetHeap(PVOID Heap) -{ - if (NULL == InfpHeap) - { - InfpHeap = Heap; - InfpHeapRefCount = -1; - } -} - - -NTSTATUS -InfOpenBufferedFile(PHINF InfHandle, - PVOID Buffer, - ULONG BufferSize, - LANGID LanguageId, - PULONG ErrorLine) -{ - INFSTATUS Status; - PINFCACHE Cache; - PCHAR FileBuffer; - ULONG FileBufferSize; - - CheckHeap(); - - *InfHandle = NULL; - *ErrorLine = (ULONG)-1; - - /* Allocate file buffer */ - FileBufferSize = BufferSize + 2; - FileBuffer = MALLOC(FileBufferSize); - if (FileBuffer == NULL) - { - DPRINT1("MALLOC() failed\n"); - return(INF_STATUS_INSUFFICIENT_RESOURCES); - } - - MEMCPY(FileBuffer, Buffer, BufferSize); - - /* Append string terminator */ - FileBuffer[BufferSize] = 0; - FileBuffer[BufferSize + 1] = 0; - - /* Allocate infcache header */ - Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); - if (Cache == NULL) - { - DPRINT("MALLOC() failed\n"); - FREE(FileBuffer); - return(INF_STATUS_INSUFFICIENT_RESOURCES); - } - - /* Initialize inicache header */ - ZEROMEMORY(Cache, - sizeof(INFCACHE)); - - Cache->LanguageId = LanguageId; - - /* Parse the inf buffer */ - if (!RtlIsTextUnicode(FileBuffer, FileBufferSize, NULL)) - { -// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; - WCHAR *new_buff; -// UINT codepage = CP_ACP; - UINT offset = 0; - -// if (BufferSize > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) -// { -// codepage = CP_UTF8; -// offset = sizeof(utf8_bom); -// } - - new_buff = MALLOC(FileBufferSize * sizeof(WCHAR)); - if (new_buff != NULL) - { - ULONG len; - Status = RtlMultiByteToUnicodeN(new_buff, - FileBufferSize * sizeof(WCHAR), - &len, - (char *)FileBuffer + offset, - FileBufferSize - offset); - - Status = InfpParseBuffer(Cache, - new_buff, - new_buff + len / sizeof(WCHAR), - ErrorLine); - FREE(new_buff); - } - else - Status = INF_STATUS_INSUFFICIENT_RESOURCES; - } - else - { - WCHAR *new_buff = (WCHAR *)FileBuffer; - /* UCS-16 files should start with the Unicode BOM; we should skip it */ - if (*new_buff == 0xfeff) - { - new_buff++; - FileBufferSize -= sizeof(WCHAR); - } - Status = InfpParseBuffer(Cache, - new_buff, - (WCHAR*)((char*)new_buff + FileBufferSize), - ErrorLine); - } - - if (!INF_SUCCESS(Status)) - { - FREE(Cache); - Cache = NULL; - } - - /* Free file buffer */ - FREE(FileBuffer); - - *InfHandle = (HINF)Cache; - - return(Status); -} - - -NTSTATUS -InfOpenFile(PHINF InfHandle, - PUNICODE_STRING FileName, - LANGID LanguageId, - PULONG ErrorLine) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - FILE_STANDARD_INFORMATION FileInfo; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE FileHandle; - NTSTATUS Status; - PCHAR FileBuffer; - ULONG FileLength; - ULONG FileBufferLength; - LARGE_INTEGER FileOffset; - PINFCACHE Cache; - - CheckHeap(); - - *InfHandle = NULL; - *ErrorLine = (ULONG)-1; - - /* Open the inf file */ - InitializeObjectAttributes(&ObjectAttributes, - FileName, - 0, - NULL, - NULL); - - Status = NtOpenFile(&FileHandle, - GENERIC_READ | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_READ, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); - if (!INF_SUCCESS(Status)) - { - DPRINT("NtOpenFile() failed (Status %lx)\n", Status); - return(Status); - } - - DPRINT("NtOpenFile() successful\n"); - - /* Query file size */ - Status = NtQueryInformationFile(FileHandle, - &IoStatusBlock, - &FileInfo, - sizeof(FILE_STANDARD_INFORMATION), - FileStandardInformation); - if (!INF_SUCCESS(Status)) - { - DPRINT("NtQueryInformationFile() failed (Status %lx)\n", Status); - NtClose(FileHandle); - return(Status); - } - - FileLength = FileInfo.EndOfFile.u.LowPart; - - DPRINT("File size: %lu\n", FileLength); - - /* Allocate file buffer */ - FileBufferLength = FileLength + 2; - FileBuffer = MALLOC(FileBufferLength); - if (FileBuffer == NULL) - { - DPRINT1("MALLOC() failed\n"); - NtClose(FileHandle); - return(INF_STATUS_INSUFFICIENT_RESOURCES); - } - - /* Read file */ - FileOffset.QuadPart = 0ULL; - Status = NtReadFile(FileHandle, - NULL, - NULL, - NULL, - &IoStatusBlock, - FileBuffer, - FileLength, - &FileOffset, - NULL); - - /* Append string terminator */ - FileBuffer[FileLength] = 0; - FileBuffer[FileLength + 1] = 0; - - NtClose(FileHandle); - - if (!INF_SUCCESS(Status)) - { - DPRINT("NtReadFile() failed (Status %lx)\n", Status); - FREE(FileBuffer); - return(Status); - } - - /* Allocate infcache header */ - Cache = (PINFCACHE)MALLOC(sizeof(INFCACHE)); - if (Cache == NULL) - { - DPRINT("MALLOC() failed\n"); - FREE(FileBuffer); - return(INF_STATUS_INSUFFICIENT_RESOURCES); - } - - /* Initialize inicache header */ - ZEROMEMORY(Cache, - sizeof(INFCACHE)); - - Cache->LanguageId = LanguageId; - - /* Parse the inf buffer */ - if (!RtlIsTextUnicode(FileBuffer, FileBufferLength, NULL)) - { -// static const BYTE utf8_bom[3] = { 0xef, 0xbb, 0xbf }; - WCHAR *new_buff; -// UINT codepage = CP_ACP; - UINT offset = 0; - -// if (FileLength > sizeof(utf8_bom) && !memcmp(FileBuffer, utf8_bom, sizeof(utf8_bom) )) -// { -// codepage = CP_UTF8; -// offset = sizeof(utf8_bom); -// } - - new_buff = MALLOC(FileBufferLength * sizeof(WCHAR)); - if (new_buff != NULL) - { - ULONG len; - Status = RtlMultiByteToUnicodeN(new_buff, - FileBufferLength * sizeof(WCHAR), - &len, - (char *)FileBuffer + offset, - FileBufferLength - offset); - - Status = InfpParseBuffer(Cache, - new_buff, - new_buff + len / sizeof(WCHAR), - ErrorLine); - FREE(new_buff); - } - else - Status = INF_STATUS_INSUFFICIENT_RESOURCES; - } - else - { - WCHAR *new_buff = (WCHAR *)FileBuffer; - /* UCS-16 files should start with the Unicode BOM; we should skip it */ - if (*new_buff == 0xfeff) - { - new_buff++; - FileBufferLength -= sizeof(WCHAR); - } - Status = InfpParseBuffer(Cache, - new_buff, - (WCHAR*)((char*)new_buff + FileBufferLength), - ErrorLine); - } - - if (!INF_SUCCESS(Status)) - { - FREE(Cache); - Cache = NULL; - } - - /* Free file buffer */ - FREE(FileBuffer); - - *InfHandle = (HINF)Cache; - - return(Status); -} - - -VOID -InfCloseFile(HINF InfHandle) -{ - PINFCACHE Cache; - - Cache = (PINFCACHE)InfHandle; - - if (Cache == NULL) - { - return; - } - - while (Cache->FirstSection != NULL) - { - Cache->FirstSection = InfpFreeSection(Cache->FirstSection); - } - Cache->LastSection = NULL; - - FREE(Cache); - - if (0 < InfpHeapRefCount) - { - InfpHeapRefCount--; - if (0 == InfpHeapRefCount) - { - RtlDestroyHeap(InfpHeap); - InfpHeap = NULL; - } - } -} - - -/* EOF */ diff --git a/lib/newinflib/infrosget.c b/lib/newinflib/infrosget.c deleted file mode 100644 index 9f3e7b06abf..00000000000 --- a/lib/newinflib/infrosget.c +++ /dev/null @@ -1,140 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * PROGRAMMER: Royce Mitchell III - * Eric Kohl - * Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infros.h" - -#define NDEBUG -#include - - -BOOLEAN -InfFindFirstLine(HINF InfHandle, - PCWSTR Section, - PCWSTR Key, - PINFCONTEXT *Context) -{ - return INF_SUCCESS(InfpFindFirstLine(InfHandle, Section, Key, Context)); -} - - -BOOLEAN -InfFindNextLine(PINFCONTEXT ContextIn, - PINFCONTEXT ContextOut) -{ - return INF_SUCCESS(InfpFindNextLine(ContextIn, ContextOut)); -} - - -BOOLEAN -InfFindFirstMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut) -{ - return INF_SUCCESS(InfpFindFirstMatchLine(ContextIn, Key, ContextOut)); -} - - -BOOLEAN -InfFindNextMatchLine(PINFCONTEXT ContextIn, - PCWSTR Key, - PINFCONTEXT ContextOut) -{ - return INF_SUCCESS(InfpFindNextMatchLine(ContextIn, Key, ContextOut)); -} - - -LONG -InfGetLineCount(HINF InfHandle, - PCWSTR Section) -{ - return InfpGetLineCount(InfHandle, Section); -} - - -/* InfGetLineText */ - - -LONG -InfGetFieldCount(PINFCONTEXT Context) -{ - return InfpGetFieldCount(Context); -} - - -BOOLEAN -InfGetBinaryField(PINFCONTEXT Context, - ULONG FieldIndex, - PUCHAR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize) -{ - return INF_SUCCESS(InfpGetBinaryField(Context, FieldIndex, ReturnBuffer, - ReturnBufferSize, RequiredSize)); -} - - -BOOLEAN -InfGetIntField(PINFCONTEXT Context, - ULONG FieldIndex, - PLONG IntegerValue) -{ - return INF_SUCCESS(InfpGetIntField(Context, FieldIndex, IntegerValue)); -} - - -BOOLEAN -InfGetMultiSzField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize) -{ - return INF_SUCCESS(InfpGetMultiSzField(Context, FieldIndex, ReturnBuffer, - ReturnBufferSize, RequiredSize)); -} - - -BOOLEAN -InfGetStringField(PINFCONTEXT Context, - ULONG FieldIndex, - PWSTR ReturnBuffer, - ULONG ReturnBufferSize, - PULONG RequiredSize) -{ - return INF_SUCCESS(InfpGetStringField(Context, FieldIndex, ReturnBuffer, - ReturnBufferSize, RequiredSize)); -} - - -BOOLEAN -InfGetData(PINFCONTEXT Context, - PWCHAR *Key, - PWCHAR *Data) -{ - return INF_SUCCESS(InfpGetData(Context, Key, Data)); -} - - -BOOLEAN -InfGetDataField (PINFCONTEXT Context, - ULONG FieldIndex, - PWCHAR *Data) -{ - return INF_SUCCESS(InfpGetDataField(Context, FieldIndex, Data)); -} - -VOID -InfFreeContext(PINFCONTEXT Context) -{ - InfpFreeContext(Context); -} - -/* EOF */ diff --git a/lib/newinflib/infrosput.c b/lib/newinflib/infrosput.c deleted file mode 100644 index f5d3df9399e..00000000000 --- a/lib/newinflib/infrosput.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * PROJECT: .inf file parser - * LICENSE: GPL - See COPYING in the top level directory - * COPYRIGHT: Copyright 2005 Ge van Geldorp - */ - -/* INCLUDES *****************************************************************/ - -#include "inflib.h" -#include "infros.h" - -#define NDEBUG -#include - -NTSTATUS -InfWriteFile(HINF InfHandle, - PUNICODE_STRING FileName, - PUNICODE_STRING HeaderComment) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE FileHandle; - NTSTATUS Status; - INFSTATUS InfStatus; - PWCHAR Buffer; - ULONG BufferSize; - PWCHAR HeaderBuffer; - ULONG HeaderBufferSize; - UINT Index; - - InfStatus = InfpBuildFileBuffer((PINFCACHE) InfHandle, &Buffer, &BufferSize); - if (! INF_SUCCESS(InfStatus)) - { - DPRINT("Failed to create buffer (Status 0x%lx)\n", InfStatus); - return InfStatus; - } - - /* Open the inf file */ - InitializeObjectAttributes(&ObjectAttributes, - FileName, - 0, - NULL, - NULL); - - Status = NtOpenFile(&FileHandle, - GENERIC_WRITE | SYNCHRONIZE, - &ObjectAttributes, - &IoStatusBlock, - 0, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE); - if (!INF_SUCCESS(Status)) - { - DPRINT1("NtOpenFile() failed (Status %lx)\n", Status); - FREE(Buffer); - return Status; - } - - DPRINT("NtOpenFile() successful\n"); - - if (NULL != HeaderComment && 0 != HeaderComment->Length) - { - /* This is just a comment header, don't abort on errors here */ - HeaderBufferSize = HeaderComment->Length + 7 * sizeof(WCHAR); - HeaderBuffer = MALLOC(HeaderBufferSize); - if (NULL != HeaderBuffer) - { - strcpyW(HeaderBuffer, L"; "); - for (Index = 0; Index < HeaderComment->Length / sizeof(WCHAR); Index++) - { - HeaderBuffer[2 + Index] = HeaderComment->Buffer[Index]; - } - strcpyW(HeaderBuffer + (2 + HeaderComment->Length / sizeof(WCHAR)), - L"\r\n\r\n"); - NtWriteFile(FileHandle, - NULL, - NULL, - NULL, - &IoStatusBlock, - HeaderBuffer, - HeaderBufferSize, - NULL, - NULL); - FREE(HeaderBuffer); - } - } - - /* Write main contents */ - Status = NtWriteFile(FileHandle, - NULL, - NULL, - NULL, - &IoStatusBlock, - Buffer, - BufferSize, - NULL, - NULL); - - NtClose(FileHandle); - FREE(Buffer); - - if (!INF_SUCCESS(Status)) - { - DPRINT1("NtWriteFile() failed (Status %lx)\n", Status); - FREE(Buffer); - return(Status); - } - - return STATUS_SUCCESS; -} - -BOOLEAN -InfFindOrAddSection(HINF InfHandle, - PCWSTR Section, - PINFCONTEXT *Context) -{ - return INF_SUCCESS(InfpFindOrAddSection((PINFCACHE) InfHandle, - Section, Context)); -} - -BOOLEAN -InfHostAddLine(PINFCONTEXT Context, PCWSTR Key) -{ - return INF_SUCCESS(InfpAddLineWithKey(Context, Key)); -} - -BOOLEAN -InfHostAddField(PINFCONTEXT Context, PCWSTR Data) -{ - return INF_SUCCESS(InfpAddField(Context, Data)); -} - -/* EOF */ diff --git a/lib/rtl/message.c b/lib/rtl/message.c index 065e260bf0b..a2b17839324 100644 --- a/lib/rtl/message.c +++ b/lib/rtl/message.c @@ -17,109 +17,105 @@ /* * @implemented */ -NTSTATUS -NTAPI -RtlFindMessage( - PVOID BaseAddress, - ULONG Type, - ULONG Language, - ULONG MessageId, - PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry) +NTSTATUS NTAPI +RtlFindMessage(PVOID BaseAddress, + ULONG Type, + ULONG Language, + ULONG MessageId, + PRTL_MESSAGE_RESOURCE_ENTRY *MessageResourceEntry) { - LDR_RESOURCE_INFO ResourceInfo; - PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; - PRTL_MESSAGE_RESOURCE_DATA MessageTable; - NTSTATUS Status; - ULONG EntryOffset = 0, IdOffset = 0; - PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; - ULONG i; - - DPRINT("RtlFindMessage()\n"); - - ResourceInfo.Type = Type; - ResourceInfo.Name = 1; - ResourceInfo.Language = Language; - - Status = LdrFindResource_U(BaseAddress, - &ResourceInfo, - RESOURCE_DATA_LEVEL, - &ResourceDataEntry); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry); - - Status = LdrAccessResource(BaseAddress, - ResourceDataEntry, - (PVOID*)&MessageTable, - NULL); - if (!NT_SUCCESS(Status)) - { - return Status; - } - - DPRINT("MessageTable: %p\n", MessageTable); - - DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); - for (i = 0; i < MessageTable->NumberOfBlocks; i++) - { - DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", - MessageTable->Blocks[i].LowId, - MessageTable->Blocks[i].HighId, - MessageTable->Blocks[i].OffsetToEntries); - } - - for (i = 0; i < MessageTable->NumberOfBlocks; i++) - { - if ((MessageId >= MessageTable->Blocks[i].LowId) && - (MessageId <= MessageTable->Blocks[i].HighId)) - { - EntryOffset = MessageTable->Blocks[i].OffsetToEntries; - IdOffset = MessageId - MessageTable->Blocks[i].LowId; - break; - } - - if (MessageId < MessageTable->Blocks[i].LowId) - { - return STATUS_MESSAGE_NOT_FOUND; - } - } - - if (MessageTable->NumberOfBlocks <= i) - { - return STATUS_MESSAGE_NOT_FOUND; - } - - MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY) - ((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries); - - DPRINT("EntryOffset 0x%08lx\n", EntryOffset); - DPRINT("IdOffset 0x%08lx\n", IdOffset); - - DPRINT("MessageEntry: %p\n", MessageEntry); - for (i = 0; i < IdOffset; i++) - { - MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY) - ((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); - } - - if (MessageEntry->Flags == 0) - { - DPRINT("AnsiText: %s\n", MessageEntry->Text); - } - else - { - DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); - } - - if (MessageResourceEntry != NULL) - { - *MessageResourceEntry = MessageEntry; - } - - return STATUS_SUCCESS; + LDR_RESOURCE_INFO ResourceInfo; + PIMAGE_RESOURCE_DATA_ENTRY ResourceDataEntry; + PRTL_MESSAGE_RESOURCE_DATA MessageTable; + NTSTATUS Status; + ULONG EntryOffset = 0, IdOffset = 0; + PRTL_MESSAGE_RESOURCE_ENTRY MessageEntry; + ULONG i; + + DPRINT("RtlFindMessage()\n"); + + ResourceInfo.Type = Type; + ResourceInfo.Name = 1; + ResourceInfo.Language = Language; + + Status = LdrFindResource_U(BaseAddress, + &ResourceInfo, + RESOURCE_DATA_LEVEL, + &ResourceDataEntry); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + DPRINT("ResourceDataEntry: %p\n", ResourceDataEntry); + + Status = LdrAccessResource(BaseAddress, + ResourceDataEntry, + (PVOID*)&MessageTable, + NULL); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + DPRINT("MessageTable: %p\n", MessageTable); + + DPRINT("NumberOfBlocks %lu\n", MessageTable->NumberOfBlocks); + for (i = 0; i < MessageTable->NumberOfBlocks; i++) + { + DPRINT("LoId 0x%08lx HiId 0x%08lx Offset 0x%08lx\n", + MessageTable->Blocks[i].LowId, + MessageTable->Blocks[i].HighId, + MessageTable->Blocks[i].OffsetToEntries); + } + + for (i = 0; i < MessageTable->NumberOfBlocks; i++) + { + if ((MessageId >= MessageTable->Blocks[i].LowId) && + (MessageId <= MessageTable->Blocks[i].HighId)) + { + EntryOffset = MessageTable->Blocks[i].OffsetToEntries; + IdOffset = MessageId - MessageTable->Blocks[i].LowId; + break; + } + + if (MessageId < MessageTable->Blocks[i].LowId) + { + return STATUS_MESSAGE_NOT_FOUND; + } + } + + if (MessageTable->NumberOfBlocks <= i) + { + return STATUS_MESSAGE_NOT_FOUND; + } + + MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageTable + MessageTable->Blocks[i].OffsetToEntries); + + DPRINT("EntryOffset 0x%08lx\n", EntryOffset); + DPRINT("IdOffset 0x%08lx\n", IdOffset); + + DPRINT("MessageEntry: %p\n", MessageEntry); + for (i = 0; i < IdOffset; i++) + { + MessageEntry = (PRTL_MESSAGE_RESOURCE_ENTRY)((PUCHAR)MessageEntry + (ULONG)MessageEntry->Length); + } + + if (MessageEntry->Flags == 0) + { + DPRINT("AnsiText: %s\n", MessageEntry->Text); + } + else + { + DPRINT("UnicodeText: %S\n", (PWSTR)MessageEntry->Text); + } + + if (MessageResourceEntry != NULL) + { + *MessageResourceEntry = MessageEntry; + } + + return STATUS_SUCCESS; } @@ -143,24 +139,22 @@ RtlFindMessage( * * @unimplemented */ -NTSTATUS -NTAPI -RtlFormatMessage( - PWSTR Message, - UCHAR MaxWidth, - BOOLEAN IgnoreInserts, - BOOLEAN Ansi, - BOOLEAN ArgumentIsArray, - va_list *Arguments, - PWSTR Buffer, - ULONG BufferSize) +NTSTATUS NTAPI +RtlFormatMessage(PWSTR Message, + UCHAR MaxWidth, + BOOLEAN IgnoreInserts, + BOOLEAN Ansi, + BOOLEAN ArgumentIsArray, + va_list *Arguments, + PWSTR Buffer, + ULONG BufferSize) { - DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n", - Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE", - ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize); + DPRINT1("RtlFormatMessage(%S, %u, %s, %s, %s, %s, %p, %lu)\n", + Message, MaxWidth, IgnoreInserts ? "TRUE" : "FALSE", Ansi ? "TRUE" : "FALSE", + ArgumentIsArray ? "TRUE" : "FALSE", (PSTR)Arguments, Buffer, BufferSize); - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* EOF */ diff --git a/lib/rtl/sprintf.c b/lib/rtl/sprintf.c index 52f46f8a3d3..42aca6c3511 100644 --- a/lib/rtl/sprintf.c +++ b/lib/rtl/sprintf.c @@ -27,40 +27,33 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; +typedef union { + struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; + }; + long long AsLongLong; } double_t; +/* We depend on this being true */ +C_ASSERT(sizeof(double_t) == sizeof(double)); + static __inline int -_isinf(double __x) +_isinf(double_t x) { - union - { - double* __x; - double_t* x; - } x; - - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); } static __inline int -_isnan(double __x) +_isnan(double_t x) { - union - { - double* __x; - double_t* x; - } x; - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); } @@ -180,14 +173,13 @@ number(char * buf, char * end, long long num, int base, int size, int precision, } static char * -numberf(char * buf, char * end, double num, int base, int size, int precision, int type) +numberf(char * buf, char * end, double_t num, int base, int size, int precision, int type) { char c,sign,tmp[66]; const char *digits; const char *small_digits = "0123456789abcdefghijklmnopqrstuvwxyz"; const char *large_digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; - long long x; /* FIXME the float version of number is direcly copy of number @@ -201,9 +193,9 @@ numberf(char * buf, char * end, double num, int base, int size, int precision, i c = (type & ZEROPAD) ? '0' : ' '; sign = 0; if (type & SIGN) { - if (num < 0) { + if (num.sign) { sign = '-'; - num = -num; + num.sign = 0; size--; } else if (type & PLUS) { sign = '+'; @@ -220,15 +212,11 @@ numberf(char * buf, char * end, double num, int base, int size, int precision, i size--; } i = 0; - if (num == 0) + if (num.AsLongLong == 0) tmp[i++] = '0'; - else while (num != 0) + else while (num.AsLongLong != 0) { - x = num; - tmp[i++] = digits[do_div(&x,base)]; -#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4 - num=x; -#endif + tmp[i++] = digits[do_div(&num.AsLongLong,base)]; } if (i > precision) precision = i; @@ -389,7 +377,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) { int len; unsigned long long num; - double _double; + double_t _double; int base; char *str, *end; @@ -603,7 +591,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) case 'f': case 'g': case 'G': - _double = (double)va_arg(args, double); + _double = va_arg(args, double_t); if ( _isnan(_double) ) { s = "Nan"; len = 3; @@ -634,7 +622,7 @@ int __cdecl _vsnprintf(char *buf, size_t cnt, const char *fmt, va_list args) } else { if ( precision == -1 ) precision = 6; - str = numberf(str, end, (int)_double, base, field_width, precision, flags); + str = numberf(str, end, _double, base, field_width, precision, flags); } continue; diff --git a/lib/rtl/swprintf.c b/lib/rtl/swprintf.c index 64d7d65397a..3d6488b92b6 100644 --- a/lib/rtl/swprintf.c +++ b/lib/rtl/swprintf.c @@ -27,40 +27,33 @@ #define SPECIAL 32 /* 0x */ #define LARGE 64 /* use 'ABCDEF' instead of 'abcdef' */ #define REMOVEHEX 256 /* use 256 as remve 0x frim BASE 16 */ -typedef struct { - unsigned int mantissal:32; - unsigned int mantissah:20; - unsigned int exponent:11; - unsigned int sign:1; +typedef union { + struct { + unsigned int mantissal:32; + unsigned int mantissah:20; + unsigned int exponent:11; + unsigned int sign:1; + }; + long long AsLongLong; } double_t; +/* We depend on this being true */ +C_ASSERT(sizeof(double_t) == sizeof(double)); + static __inline int -_isinf(double __x) +_isinf(double_t x) { - union - { - double* __x; - double_t* x; - } x; - - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah == 0 && x.x->mantissal == 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah == 0 && x.mantissal == 0 )); } static __inline int -_isnan(double __x) +_isnan(double_t x) { - union - { - double* __x; - double_t* x; - } x; - x.__x = &__x; - return ( x.x->exponent == 0x7ff && ( x.x->mantissah != 0 || x.x->mantissal != 0 )); + return ( x.exponent == 0x7ff && ( x.mantissah != 0 || x.mantissal != 0 )); } @@ -179,14 +172,13 @@ number(wchar_t * buf, wchar_t * end, long long num, int base, int size, int prec } static wchar_t * -numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precision, int type) +numberf(wchar_t * buf, wchar_t * end, double_t num, int base, int size, int precision, int type) { wchar_t c, sign, tmp[66]; const wchar_t *digits; const wchar_t *small_digits = L"0123456789abcdefghijklmnopqrstuvwxyz"; const wchar_t *large_digits = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int i; - long long x; /* FIXME the float version of number is direcly copy of number @@ -201,9 +193,9 @@ numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precis c = (type & ZEROPAD) ? L'0' : L' '; sign = 0; if (type & SIGN) { - if (num < 0) { + if (num.sign) { sign = L'-'; - num = -num; + num.sign = 0; size--; } else if (type & PLUS) { sign = L'+'; @@ -220,15 +212,11 @@ numberf(wchar_t * buf, wchar_t * end, double num, int base, int size, int precis size--; } i = 0; - if (num == 0) + if (num.AsLongLong == 0) tmp[i++] = L'0'; - else while (num != 0) + else while (num.AsLongLong != 0) { - x = num; - tmp[i++] = digits[do_div(&x,base)]; -#ifndef _M_ARM // Missing __floatdidf in CeGCC 0.55 -- GCC 4.4 - num = x; -#endif + tmp[i++] = digits[do_div(&num.AsLongLong,base)]; } if (i > precision) precision = i; @@ -394,7 +382,7 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar const char *s; const wchar_t *sw; const wchar_t *ss; - double _double; + double_t _double; int flags; /* flags to number() */ @@ -600,7 +588,7 @@ int __cdecl _vsnwprintf(wchar_t *buf, size_t cnt, const wchar_t *fmt, va_list ar case 'f': case 'g': case 'G': - _double = (double)va_arg(args, double); + _double = va_arg(args, double_t); if ( _isnan(_double) ) { ss = L"Nan"; diff --git a/media/doc/README.WINE b/media/doc/README.WINE index a1fbc15d694..828e413dbc1 100644 --- a/media/doc/README.WINE +++ b/media/doc/README.WINE @@ -52,13 +52,13 @@ reactos/dll/win32/comctl32 # Autosync ?? reactos/dll/win32/comdlg32 # Autosync reactos/dll/win32/compstui # Autosync reactos/dll/win32/credui # Autosync -reactos/dll/win32/crypt32 # Synced to Wine-1_1_43 +reactos/dll/win32/crypt32 # Synced to Wine-1_1_40 reactos/dll/win32/cryptdlg # Autosync reactos/dll/win32/cryptdll # Autosync reactos/dll/win32/cryptnet # Autosync reactos/dll/win32/cryptui # Autosync reactos/dll/win32/dbghelp # Synced to Wine-20080802 -reactos/dll/win32/dciman32 # Synced to Wine-1_1_43 +reactos/dll/win32/dciman32 # Synced to Wine-1_0-rc2 reactos/dll/win32/dwmapi # Autosync reactos/dll/win32/fusion # Autosync reactos/dll/win32/gdiplus # Autosync @@ -113,7 +113,7 @@ reactos/dll/win32/mstask # Autosync reactos/dll/win32/msvcrt20 # Autosync reactos/dll/win32/msvfw32 # Autosync reactos/dll/win32/msvidc32 # Autosync -reactos/dll/win32/msxml3 # Synced to Wine-1_1_43 +reactos/dll/win32/msxml3 # Synced to Wine-1_1_40 reactos/dll/win32/nddeapi # Autosync reactos/dll/win32/netapi32 # Autosync reactos/dll/win32/ntdsapi # Autosync @@ -144,8 +144,6 @@ reactos/dll/win32/rsabase # Autosync reactos/dll/win32/rsaenh # Autosync reactos/dll/win32/sccbase # Autosync reactos/dll/win32/schannel # Autosync ?? -reactos/dll/win32/secur32 # Forked -reactos/dll/win32/security # Forked (different .spec) reactos/dll/win32/sensapi # Autosync reactos/dll/win32/setupapi # Forked at Wine-20050524 reactos/dll/win32/shell32 # Forked at Wine-20071011 @@ -156,7 +154,7 @@ reactos/dll/win32/slbcsp # Autosync reactos/dll/win32/softpub # Autosync reactos/dll/win32/spoolss # Autosync reactos/dll/win32/stdole2.tlb # Autosync -reactos/dll/win32/sti # Autosync +reactos/dll/win32/sti # Autosync ?? reactos/dll/win32/sxs # Autosync reactos/dll/win32/tapi32 # Autosync reactos/dll/win32/traffic # Autosync @@ -205,7 +203,7 @@ In addition the following libs, dlls and source files are mostly based on code p from Winehq CVS. If you are looking to update something in these files check Wine current souces first as it may already be fixed. -reactos/lib/sdk/uuid # Synced to Wine-1.1.42 +reactos/lib/uuid # Synced to Wine-20080114 advapi32 - reactos/dll/win32/advapi32/crypt/*.c # ekohl says we're not sharing this diff --git a/media/drivers/etc/etc.rbuild b/media/drivers/etc/etc.rbuild index 1ed562ed2ba..5302cc6ccd0 100644 --- a/media/drivers/etc/etc.rbuild +++ b/media/drivers/etc/etc.rbuild @@ -1,8 +1,6 @@ - hosts - hosts services services diff --git a/media/drivers/etc/hosts b/media/drivers/etc/hosts deleted file mode 100644 index f8352ba6721..00000000000 --- a/media/drivers/etc/hosts +++ /dev/null @@ -1,3 +0,0 @@ -# ReactOS hosts file - -127.0.0.1 localhost diff --git a/media/inf/cpu.inf b/media/inf/cpu.inf index 087ab209a62bbb576bcdd7d96e6af75c4ca0e27d..bc2517dcaa0b033934898b49310ad15b7598b138 100644 GIT binary patch delta 19 acmeC`W9;f<+@PVfSxf1j3d{e0Tnqq7GzU2V delta 19 acmeC`W9;f<+@PVv$h%ox>AngR7Xtu3odre! diff --git a/media/inf/display.inf b/media/inf/display.inf index f2179abb9c1045bb69ebabda5dfc0e28c68d0d19..a9469631e79220346346aa9b12f60a0a41ff6762 100644 GIT binary patch delta 20 ccmZoOK4Y|@f@AUq4x`C&98#PAadZd(09F_W$p8QV delta 52 tcmX?O)MmV)fW?Wr-06HWE#{d8T delta 16 XcmX?Pc))Oj9M|MuTw~q1bN&-7V)oTEK=_Pm}$Vg8|rVe70_N`rIMbCzam*H$S8=epY3bNU$Z(h5t`><~Db2BAYX z7&w%#F|NZ6DVom1wd7^A`yoA@)fQ-Io2VgsG-R-iV>8+}Xn1FPHCYu$WA(CgOARE-5m5W7bo|@o*a8J1we5QwkbKn1seEQ+y`|KC@Zl!0%2Y&ch zFE>*0f$Dp~H;J2|sf`8*?~8h&QzAAv5akMe(HG^@4;%Y<0{fzVxYIYEt#e*@{v2oT zJGY6R^Zv%qKKYz?{w0a~q0^)G8~8gHwW|>3-t86Nu6 z_Pr}_xHOB98CsRre{h$27v`y)L+92{NmaH?GeR@*ypGF1k}m@F&S=L+JhPmGz2HF7 zOM}h{iHV^2!T-dL)}6im^miDE$qGzV?a zc!hhf_{0nOk2zAjtC#teX1ryF5msK|4l6$K!?i2CPuU93v?ug_7`m$Bv>&uiLv}FF zBFX2|Ip9-2G~eYF5wCN+^;j|VDG!~kRiEkBwS*O~Oh(W)ot^5L=4c*n$`Uyc3tD0C z9G*P|EZ2+Fo^rtbxQ7lU&B91HS=bECL(5Z0&kgqah9^VU4U&=Ng{ru2xt}z`#W)|2jMqHr zfOxzJ4i57k>KlHAp2Ii&Q2&&ja2H(rw+VW0GB z3L*Z(G>lIdK2*|0`tI|B0#qXKnhV1tL>|@&LA6vcLh247c#%088y^!T7#Sr-VO$6! zZXO}%VAT`5Fg`+5C4D2rYK?esswhecdENgkhjeuh3-_9z9tMT^Jad zP{ENUE{vr3)x_7NCHX)&9nYlceS2}?gMzL*Zq$phgzd*w>4LU1<9<+<+Ogq5@_Y{o zT5tyG=21D%Pc*J_l+O8~LkD}3Ai75D84Dr0jJh11>?*p<2$5%v7&PgfvBn7TXB`+b z-L2bL=fH+B5~EWw8zRfBp!`%~d6;ibP9i7Rs}o05f+BLDb%hm`v4VE~(bZ#xmo9#! zPe1l3jHz~QhU|oKP=02|*f^1fzOllFp-f>$k427lIFrIQTBKCkrp$y5reCCn^=9f3 zJE?{gAGESq?#G&X50|iD-NQoOXtYOb>J=EOFJjz$^xDIsmA|3z=B=r>!p7Ay`4kn} zwMM~myO4KByK~nX3wGFr{7%816=#f3ayAGz+AuJc#uIkZe!V=NceP9$SQAVkRyo9* zdU`9YUu#cr{A$oqTM8}fj2Ll>C&>SC4$V}{x-4v*K=TvM;$g6ej(6sYF_10SjBTiW z&VkV^q2T#!;noB&q=VHi9W2Ebm!7>89XY!Ff*MnbX15L%!|4|s*y0v+0ataqV<G;FZIz*fSGWF5+#yJxbXBbDbh8^YTrLU=p>8ZlyMvarL5Hk-zw;t`8d zeA3#n)g$I4cyA&PDqcaPH-+@2kUo(IrdQ-uj5R)C#X+C2>uKD6d6sDHC=lG?(%Ug% zzh5}?USm5g=nBZuvltr#g6?{C9I>6gWYCmiL93|}(Iz{*++<6V2a07znm8}Ui}}i+ zdp;XlcPhBDg!@mp7n806R;(@+A&m_|Q8MAxQm!VWqT5Vx5mMS;I7N0s#nw_oa*IHi*N_%t0yNZmFg{J>!@zMKsR&YEbUpAv&OEl3$%$kf_yQm;wIOxD7e=bDT?j=O zFO#>5ED)--@?E$_FWB^|hp#{zx*nyMyZ=$Cr1blBL8#V-v7ii)-OzOyR=M0gGejeq za;+Mgee`oHALBEGRm0FdQ!FQ&2a5YHaY1WY_AY& zoNhyb;roUaBybx_3<3F9Xvi~+F^qyu`!g|ADXPY?=oyl%FjN>8(0_^mZ2ReznN6?o zsY+3lagP#jREnMVhn@Jl*<#WCxY=UG{oqRaHL(2;^!Cga4%|0K6xr`7r*>}mKh?as ACIA2c delta 4148 zcmZu!eQZm$6c8}#c8s!>W^PwDzSiyBk7paf zACUVy=XZYh+;i`__xZ}U5hu5daGxXhG!C1y|9SH4Z=vwM0m>U|Z^o6zbTx#eifGWOW|Dq3So`EEtAM- zD*WSZDU{JP=*Y&fY*C1hRrcS=Muu~c99Ij&>((91^dAeq>kvI z9AO1#HnubDuLiNOfxa4Wj~d+Om_b;3w7nR+dVC1X4>X7ztCfD_AB*#G(zLlRdc20? z!f_q6hjg^fl32{+m>SsC2IuyDAaY=~{=3)~JS=#z6D3~wL>t$0YYgb9(YQ`xuoBLn z5IN;*L>`I3ddbt_(4dHMOcj(`wtfXVa{<`&p|=iZuYkc1OFXO2n(=DjO$Hmh4eW z%wv8ma%J4UJ8TBr`dGwdC)s>`{ilO)@RXRB?0e;Cs#o4X>TnWq$aa{SD^oN zLvgJE`!-v5gATiFJhf+=7==M=N)dv2_8A^&H`wKrndf*?jNN~3u@~5UzBmj_XBxQr zb3D`T1`Rr=8RaHOHtI0=7qPfxqXAYUFLL)MVr`j5USkh3_WVb9$;wTqK4Ahr+B=n~ zT(LdRE+LJN3o}HCcYSIVZOKndet%QB-xK+)gOioVY{+~zlaKRAO#hWH4%k?|D8{La zf}6UiL*jA0$Y(h7H;<#k=2@Q4o5ax}Fk8pX3BsvM;s7MkW_>Q3&M{!`=j;m5Amgx& zzn!<|vd6=izn8{)%EpD}JM}xCxYK5R!Qy>%;|!wX>Qr#QSi%ihQ>@QCtlgI;th>V6 z!2tIPYjeWNuin;%2R&rWdJj=%%DPw>C?G zTe#S#aI3D?!m@8GVb#qV;YchB!r7SDW2B_h{75ecH=)t4O0rbUl}~VLn6``}vgB?e2&o?!Y{D>2RFMjLW)zXT&wPR9 zC0|*{&N6caEmW0-Q0HEiVdA5OF+`)=6cXhv=dRJ{ zkV0;8kY8h!aq>YDq=_JY%(31?4Z0^tL`O40<%cD~8rnIAu)7n{ z(yye0I<7N5PHb$1X2ucTqY+50ub`$u7BfCWl~BJPpH4i}S%XXyR(E}vTbu_-gU9oM zyFr10KN^hZr)M4@zbU$?8zL>3IKM?hklv_L`$1{B7RG5Z8$&&HM4>O%5wpmn%6Otu zD_kO4Fz{nu3Y(KKbb~j*qdHy^FPqp!A+sFymLUYJB zw9zlZ@D&KriG~m z4}Q9#o*zyh<>urIJ~~)W=5u}4JKevip>5wGeQZk&YFknR%V9vGYi3Ur^Y=}XSs$E? zTWW5pzpGV&3tNo4dVF+sl+5K*a)rPznF8K-lX-vnsI>ZM$K(?4IWJ%a_+K)pGKJ`L zkB!~V>W2|ga9`4xnKd)F)Y6VAvZCm(g@JA1o(6eOa6@5x1!T8Z&_n}aO(=tM4YIKi(j0V?y9=S7_5To}2)CJfMI|cN-*8t}|ydYit9)34O^RwjA zxhJOw*^lRioZB^<^oRr5ZtCzaB$7=91Pjn4gQU ky)%z&L!kg2nnzafL2Mp2R_A;YD*%VfQST>fCU(nP#y@A)*IH7c$N;5m;|%D Y92^{zyc{T!IU18-D=4x#EO`P7067>J5dZ)H diff --git a/ntoskrnl/config/cmapi.c b/ntoskrnl/config/cmapi.c index 538c3e5b560..85f2ed9fe14 100644 --- a/ntoskrnl/config/cmapi.c +++ b/ntoskrnl/config/cmapi.c @@ -14,67 +14,6 @@ /* FUNCTIONS *****************************************************************/ -BOOLEAN -NTAPI -CmpIsHiveAlreadyLoaded(IN HANDLE KeyHandle, - IN POBJECT_ATTRIBUTES SourceFile, - OUT PCMHIVE *CmHive) -{ - NTSTATUS Status; - PCM_KEY_BODY KeyBody; - PCMHIVE Hive; - BOOLEAN Loaded = FALSE; - PAGED_CODE(); - - /* Sanity check */ - CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK(); - - /* Reference the handle */ - Status = ObReferenceObjectByHandle(KeyHandle, - 0, - CmpKeyObjectType, - KernelMode, - (PVOID)&KeyBody, - NULL); - if (!NT_SUCCESS(Status)) return Loaded; - - /* Don't touch deleted KCBs */ - if (KeyBody->KeyControlBlock->Delete) return Loaded; - - Hive = CONTAINING_RECORD(KeyBody->KeyControlBlock->KeyHive, CMHIVE, Hive); - - /* Must be the root key */ - if (!(KeyBody->KeyControlBlock->Flags & KEY_HIVE_ENTRY) || - !(Hive->FileUserName.Buffer)) - { - /* It isn't */ - ObDereferenceObject(KeyBody); - return Loaded; - } - - /* Now compare the name of the file */ - if (!RtlCompareUnicodeString(&Hive->FileUserName, - SourceFile->ObjectName, - TRUE)) - { - /* Same file found */ - Loaded = TRUE; - *CmHive = Hive; - - /* If the hive is frozen, not sure what to do */ - if (Hive->Frozen) - { - /* FIXME: TODO */ - DPRINT1("ERROR: Hive is frozen\n"); - while (TRUE); - } - } - - /* Dereference and return result */ - ObDereferenceObject(KeyBody); - return Loaded; - } - BOOLEAN NTAPI CmpDoFlushAll(IN BOOLEAN ForceFlush) @@ -100,35 +39,16 @@ CmpDoFlushAll(IN BOOLEAN ForceFlush) if (!(Hive->Hive.HiveFlags & HIVE_NOLAZYFLUSH)) { /* Acquire the flusher lock */ - CmpLockHiveFlusherExclusive(Hive); - - /* Check for illegal state */ - if ((ForceFlush) && (Hive->UseCount)) - { - /* Registry needs to be locked down */ - CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK(); - DPRINT1("FIXME: Hive is damaged and needs fixup\n"); - while (TRUE); - } - - /* Only sync if we are forced to or if it won't cause a hive shrink */ - if ((ForceFlush) || (!HvHiveWillShrink(&Hive->Hive))) - { - /* Do the sync */ - Status = HvSyncHive(&Hive->Hive); + ExAcquirePushLockExclusive((PVOID)&Hive->FlusherLock); - /* If something failed - set the flag and continue looping */ - if (!NT_SUCCESS(Status)) Result = FALSE; - } - else - { - /* We won't flush if the hive might shrink */ - Result = FALSE; - CmpForceForceFlush = TRUE; - } + /* Do the sync */ + Status = HvSyncHive(&Hive->Hive); + + /* If something failed - set the flag and continue looping*/ + if (!NT_SUCCESS(Status)) Result = FALSE; /* Release the flusher lock */ - CmpUnlockHiveFlusher(Hive); + ExReleasePushLock((PVOID)&Hive->FlusherLock); } /* Try the next entry */ @@ -161,14 +81,10 @@ CmpSetValueKeyNew(IN PHHIVE Hive, { /* Then make sure it's valid and dirty it */ ASSERT(Parent->ValueList.List != HCELL_NIL); - if (!HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE)) - { - /* Fail if we're out of space for log changes */ - return STATUS_NO_LOG_SPACE; - } + HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE); } - /* Allocate a value cell */ + /* Allocate avalue cell */ ValueCell = HvAllocateCell(Hive, FIELD_OFFSET(CM_KEY_VALUE, Name) + CmpNameSize(Hive, ValueName), @@ -186,33 +102,16 @@ CmpSetValueKeyNew(IN PHHIVE Hive, /* Set it up and copy the name */ CellData->u.KeyValue.Signature = CM_KEY_VALUE_SIGNATURE; - _SEH2_TRY - { - /* This can crash since the name is coming from user-mode */ - CellData->u.KeyValue.NameLength = CmpCopyName(Hive, - CellData->u.KeyValue.Name, - ValueName); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Fail */ - DPRINT1("Invalid user data!\n"); - HvFreeCell(Hive, ValueCell); - _SEH2_YIELD(return _SEH2_GetExceptionCode()); - } - _SEH2_END; - - /* Check for compressed name */ + CellData->u.KeyValue.Flags = 0; + CellData->u.KeyValue.Type = Type; + CellData->u.KeyValue.NameLength = CmpCopyName(Hive, + CellData->u.KeyValue.Name, + ValueName); if (CellData->u.KeyValue.NameLength < ValueName->Length) { /* This is a compressed name */ CellData->u.KeyValue.Flags = VALUE_COMP_NAME; } - else - { - /* No flags to set */ - CellData->u.KeyValue.Flags = 0; - } /* Check if this is a normal key */ if (DataSize > CM_KEY_VALUE_SMALL) @@ -241,9 +140,6 @@ CmpSetValueKeyNew(IN PHHIVE Hive, CellData->u.KeyValue.DataLength = DataSize + CM_KEY_VALUE_SPECIAL_SIZE; CellData->u.KeyValue.Data = SmallData; } - - /* Set the type now */ - CellData->u.KeyValue.Type = Type; /* Add this value cell to the child list */ Status = CmpAddValueToList(Hive, @@ -253,12 +149,7 @@ CmpSetValueKeyNew(IN PHHIVE Hive, &Parent->ValueList); /* If we failed, free the entire cell, including the data */ - if (!NT_SUCCESS(Status)) - { - /* Overwrite the status with a known one */ - CmpFreeValue(Hive, ValueCell); - Status = STATUS_INSUFFICIENT_RESOURCES; - } + if (!NT_SUCCESS(Status)) CmpFreeValue(Hive, ValueCell); /* Return Status */ return Status; @@ -279,12 +170,9 @@ CmpSetValueKeyExisting(IN PHHIVE Hive, PCELL_DATA CellData; ULONG Length; BOOLEAN WasSmall, IsSmall; - - /* Registry writes must be blocked */ - CMP_ASSERT_FLUSH_LOCK(Hive); /* Mark the old child cell dirty */ - if (!HvMarkCellDirty(Hive, OldChild, FALSE)) return STATUS_NO_LOG_SPACE; + HvMarkCellDirty(Hive, OldChild, FALSE); /* See if this is a small or normal key */ WasSmall = CmpIsKeyValueSmall(&Length, Value->DataLength); @@ -297,7 +185,7 @@ CmpSetValueKeyExisting(IN PHHIVE Hive, ASSERT_VALUE_BIG(Hive, DataSize); /* Mark the old value dirty */ - if (!CmpMarkValueDataDirty(Hive, Value)) return STATUS_NO_LOG_SPACE; + CmpMarkValueDataDirty(Hive, Value); /* Check if we have a small key */ if (IsSmall) @@ -315,273 +203,60 @@ CmpSetValueKeyExisting(IN PHHIVE Hive, Value->Type = Type; return STATUS_SUCCESS; } - - /* We have a normal key. Was the old cell also normal and had data? */ - if (!(WasSmall) && (Length > 0)) - { - /* Get the current data cell and actual data inside it */ - DataCell = Value->Data; - ASSERT(DataCell != HCELL_NIL); - CellData = HvGetCell(Hive, DataCell); - if (!CellData) return STATUS_INSUFFICIENT_RESOURCES; - - /* Immediately release the cell */ - HvReleaseCell(Hive, DataCell); - - /* Make sure that the data cell actually has a size */ - ASSERT(HvGetCellSize(Hive, CellData) > 0); - - /* Check if the previous data cell could fit our new data */ - if (DataSize <= (ULONG)(HvGetCellSize(Hive, CellData))) - { - /* Re-use it then */ - NewCell = DataCell; - } - else - { - /* Otherwise, re-allocate the current data cell */ - NewCell = HvReallocateCell(Hive, DataCell, DataSize); - if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; - } - } else { - /* This was a small key, or a key with no data, allocate a cell */ - NewCell = HvAllocateCell(Hive, DataSize, StorageType, HCELL_NIL); - if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Now get the actual data for our data cell */ - CellData = HvGetCell(Hive, NewCell); - if (!CellData) ASSERT(FALSE); - - /* Release it immediately */ - HvReleaseCell(Hive, NewCell); - - /* Copy our data into the data cell's buffer, and set up the value */ - RtlCopyMemory(CellData, Data, DataSize); - Value->Data = NewCell; - Value->DataLength = DataSize; - Value->Type = Type; - - /* Return success */ - ASSERT(HvIsCellDirty(Hive, NewCell)); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -CmpQueryKeyData(IN PHHIVE Hive, - IN PCM_KEY_NODE Node, - IN KEY_INFORMATION_CLASS KeyInformationClass, - IN OUT PVOID KeyInformation, - IN ULONG Length, - IN OUT PULONG ResultLength) -{ - NTSTATUS Status; - ULONG Size, SizeLeft, MinimumSize; - PKEY_INFORMATION Info = (PKEY_INFORMATION)KeyInformation; - USHORT NameLength; - - /* Check if the value is compressed */ - if (Node->Flags & KEY_COMP_NAME) - { - /* Get the compressed name size */ - NameLength = CmpCompressedNameSize(Node->Name, Node->NameLength); - } - else - { - /* Get the real size */ - NameLength = Node->NameLength; - } - - /* Check what kind of information is being requested */ - switch (KeyInformationClass) - { - /* Basic information */ - case KeyBasicInformation: - - /* This is the size we need */ - Size = FIELD_OFFSET(KEY_BASIC_INFORMATION, Name) + NameLength; - - /* And this is the minimum we can work with */ - MinimumSize = FIELD_OFFSET(KEY_BASIC_INFORMATION, Name); - - /* Let the caller know and assume success */ - *ResultLength = Size; - Status = STATUS_SUCCESS; - - /* Check if the bufer we got is too small */ - if (Length < MinimumSize) - { - /* Let the caller know and fail */ - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Copy the basic information */ - Info->KeyBasicInformation.LastWriteTime = Node->LastWriteTime; - Info->KeyBasicInformation.TitleIndex = 0; - Info->KeyBasicInformation.NameLength = NameLength; - - /* Only the name is left */ - SizeLeft = Length - MinimumSize; - Size = NameLength; - - /* Check if we don't have enough space for the name */ - if (SizeLeft < Size) - { - /* Truncate the name we'll return, and tell the caller */ - Size = SizeLeft; - Status = STATUS_BUFFER_OVERFLOW; - } - - /* Check if this is a compressed key */ - if (Node->Flags & KEY_COMP_NAME) - { - /* Copy the compressed name */ - CmpCopyCompressedName(Info->KeyBasicInformation.Name, - SizeLeft, - Node->Name, - Node->NameLength); - } - else - { - /* Otherwise, copy the raw name */ - RtlCopyMemory(Info->KeyBasicInformation.Name, - Node->Name, - Size); - } - break; - - /* Node information */ - case KeyNodeInformation: - - /* Calculate the size we need */ - Size = FIELD_OFFSET(KEY_NODE_INFORMATION, Name) + - NameLength + - Node->ClassLength; - - /* And the minimum size we can support */ - MinimumSize = FIELD_OFFSET(KEY_NODE_INFORMATION, Name); - - /* Return the size to the caller and assume succes */ - *ResultLength = Size; - Status = STATUS_SUCCESS; - - /* Check if the caller's buffer is too small */ - if (Length < MinimumSize) - { - /* Let them know, and fail */ - Status = STATUS_BUFFER_TOO_SMALL; - break; - } - - /* Copy the basic information */ - Info->KeyNodeInformation.LastWriteTime = Node->LastWriteTime; - Info->KeyNodeInformation.TitleIndex = 0; - Info->KeyNodeInformation.ClassLength = Node->ClassLength; - Info->KeyNodeInformation.NameLength = NameLength; - - /* Now the name is left */ - SizeLeft = Length - MinimumSize; - Size = NameLength; + /* We have a normal key. Was the old cell also normal and had data? */ + if (!(WasSmall) && (Length > 0)) + { + /* Get the current data cell and actual data inside it */ + DataCell = Value->Data; + ASSERT(DataCell != HCELL_NIL); + CellData = HvGetCell(Hive, DataCell); + if (!CellData) return STATUS_INSUFFICIENT_RESOURCES; - /* Check if the name can fit entirely */ - if (SizeLeft < Size) - { - /* It can't, we'll have to truncate. Tell the caller */ - Size = SizeLeft; - Status = STATUS_BUFFER_OVERFLOW; - } + /* Immediately release the cell */ + HvReleaseCell(Hive, DataCell); - /* Check if the key node name is compressed */ - if (Node->Flags & KEY_COMP_NAME) - { - /* Copy the compressed name */ - CmpCopyCompressedName(Info->KeyNodeInformation.Name, - SizeLeft, - Node->Name, - Node->NameLength); - } - else - { - /* It isn't, so copy the raw name */ - RtlCopyMemory(Info->KeyNodeInformation.Name, - Node->Name, - Size); - } + /* Make sure that the data cell actually has a size */ + ASSERT(HvGetCellSize(Hive, CellData) > 0); - /* Check if the node has a class */ - if (Node->ClassLength > 0) + /* Check if the previous data cell could fit our new data */ + if (DataSize <= (ULONG)(HvGetCellSize(Hive, CellData))) { - /* It does. We don't support these yet */ - ASSERTMSG("Classes not supported\n", FALSE); + /* Re-use it then */ + NewCell = DataCell; } else { - /* It doesn't, so set offset to -1, not 0! */ - Info->KeyNodeInformation.ClassOffset = 0xFFFFFFFF; - } - break; - - /* Full information requsted */ - case KeyFullInformation: - - /* This is the size we need */ - Size = FIELD_OFFSET(KEY_FULL_INFORMATION, Class) + - Node->ClassLength; - - /* This is what we can work with */ - MinimumSize = FIELD_OFFSET(KEY_FULL_INFORMATION, Class); - - /* Return it to caller and assume success */ - *ResultLength = Size; - Status = STATUS_SUCCESS; - - /* Check if the caller's buffer is to small */ - if (Length < MinimumSize) - { - /* Let them know and fail */ - Status = STATUS_BUFFER_TOO_SMALL; - break; + /* Otherwise, re-allocate the current data cell */ + NewCell = HvReallocateCell(Hive, DataCell, DataSize); + if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; } + } + else + { + /* This was a small key, or a key with no data, allocate a cell */ + NewCell = HvAllocateCell(Hive, DataSize, StorageType, HCELL_NIL); + if (NewCell == HCELL_NIL) return STATUS_INSUFFICIENT_RESOURCES; + } - /* Now copy all the basic information */ - Info->KeyFullInformation.LastWriteTime = Node->LastWriteTime; - Info->KeyFullInformation.TitleIndex = 0; - Info->KeyFullInformation.ClassLength = Node->ClassLength; - Info->KeyFullInformation.SubKeys = Node->SubKeyCounts[Stable] + - Node->SubKeyCounts[Volatile]; - Info->KeyFullInformation.Values = Node->ValueList.Count; - Info->KeyFullInformation.MaxNameLen = Node->MaxNameLen; - Info->KeyFullInformation.MaxClassLen = Node->MaxClassLen; - Info->KeyFullInformation.MaxValueNameLen = Node->MaxValueNameLen; - Info->KeyFullInformation.MaxValueDataLen = Node->MaxValueDataLen; + /* Now get the actual data for our data cell */ + CellData = HvGetCell(Hive, NewCell); + if (!CellData) ASSERT(FALSE); - /* Check if we have a class */ - if (Node->ClassLength > 0) - { - /* We do, but we currently don't support this */ - ASSERTMSG("Classes not supported\n", FALSE); - } - else - { - /* We don't have a class, so set offset to -1, not 0! */ - Info->KeyNodeInformation.ClassOffset = 0xFFFFFFFF; - } - break; + /* Release it immediately */ + HvReleaseCell(Hive, NewCell); - /* Any other class that got sent here is invalid! */ - default: + /* Copy our data into the data cell's buffer, and set up the value */ + RtlCopyMemory(CellData, Data, DataSize); + Value->Data = NewCell; + Value->DataLength = DataSize; + Value->Type = Type; - /* Set failure code */ - Status = STATUS_INVALID_PARAMETER; - break; + /* Return success */ + ASSERT(HvIsCellDirty(Hive, NewCell)); + return STATUS_SUCCESS; } - - /* Return status */ - return Status; } NTSTATUS @@ -592,7 +267,7 @@ CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, IN PVOID Data, IN ULONG DataLength) { - PHHIVE Hive = NULL; + PHHIVE Hive; PCM_KEY_NODE Parent; PCM_KEY_VALUE Value = NULL; HCELL_INDEX CurrentChild, Cell; @@ -600,10 +275,8 @@ CmSetValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, BOOLEAN Found, Result; ULONG Count, ChildIndex, SmallData, Storage; VALUE_SEARCH_RETURN_TYPE SearchResult; - BOOLEAN FirstTry = TRUE, FlusherLocked = FALSE; - HCELL_INDEX ParentCell = HCELL_NIL, ChildCell = HCELL_NIL; - /* Acquire hive and KCB lock */ + /* Acquire hive lock */ CmpLockRegistry(); CmpAcquireKcbLockShared(Kcb); @@ -629,119 +302,84 @@ DoAgain: Status = STATUS_ACCESS_DENIED; goto Quickie; } + + /* Search for the value */ + SearchResult = CmpCompareNewValueDataAgainstKCBCache(Kcb, + ValueName, + Type, + Data, + DataLength); + if (SearchResult == SearchNeedExclusiveLock) + { + /* Try again with the exclusive lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + else if (SearchResult == SearchSuccess) + { + /* We don't actually need to do anything! */ + Status = STATUS_SUCCESS; + goto Quickie; + } - /* Check if this is the first attempt */ - if (FirstTry) + /* We need the exclusive KCB lock now */ + if (!(CmpIsKcbLockedExclusive(Kcb)) && !(CmpTryToConvertKcbSharedToExclusive(Kcb))) { - /* Search for the value in the cache */ - SearchResult = CmpCompareNewValueDataAgainstKCBCache(Kcb, - ValueName, - Type, - Data, - DataLength); - if (SearchResult == SearchNeedExclusiveLock) - { - /* Try again with the exclusive lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - else if (SearchResult == SearchSuccess) + /* Acquire exclusive lock */ + CmpConvertKcbSharedToExclusive(Kcb); + } + + /* Get pointer to key cell */ + Hive = Kcb->KeyHive; + Cell = Kcb->KeyCell; + + /* Prepare to scan the key node */ + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); + Count = Parent->ValueList.Count; + Found = FALSE; + if (Count > 0) + { + /* Try to find the existing name */ + Result = CmpFindNameInList(Hive, + &Parent->ValueList, + ValueName, + &ChildIndex, + &CurrentChild); + if (!Result) { - /* We don't actually need to do anything! */ - Status = STATUS_SUCCESS; + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; goto Quickie; } - /* We need the exclusive KCB lock now */ - if (!(CmpIsKcbLockedExclusive(Kcb)) && - !(CmpTryToConvertKcbSharedToExclusive(Kcb))) - { - /* Acquire exclusive lock */ - CmpConvertKcbSharedToExclusive(Kcb); - } - - /* Cache lookup failed, so don't try it next time */ - FirstTry = FALSE; - - /* Now grab the flush lock since the key will be modified */ - ASSERT(FlusherLocked == FALSE); - CmpLockHiveFlusherShared((PCMHIVE)Kcb->KeyHive); - FlusherLocked = TRUE; - goto DoAgain; - } - else - { - /* Get pointer to key cell */ - Hive = Kcb->KeyHive; - Cell = Kcb->KeyCell; - - /* Get the parent */ - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); - ASSERT(Parent); - ParentCell = Cell; - - /* Prepare to scan the key node */ - Count = Parent->ValueList.Count; - Found = FALSE; - if (Count > 0) + /* Check if we found something */ + if (CurrentChild != HCELL_NIL) { - /* Try to find the existing name */ - Result = CmpFindNameInList(Hive, - &Parent->ValueList, - ValueName, - &ChildIndex, - &CurrentChild); - if (!Result) + /* Get its value */ + Value = (PCM_KEY_VALUE)HvGetCell(Hive, CurrentChild); + if (!Value) { /* Fail */ Status = STATUS_INSUFFICIENT_RESOURCES; goto Quickie; } - - /* Check if we found something */ - if (CurrentChild != HCELL_NIL) - { - /* Release existing child */ - if (ChildCell != HCELL_NIL) - { - HvReleaseCell(Hive, ChildCell); - ChildCell = HCELL_NIL; - } - - /* Get its value */ - Value = (PCM_KEY_VALUE)HvGetCell(Hive, CurrentChild); - if (!Value) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Remember that we found it */ - ChildCell = CurrentChild; - Found = TRUE; - } - } - else - { - /* No child list, we'll need to add it */ - ChildIndex = 0; + + /* Remember that we found it */ + Found = TRUE; } } - - /* Should only get here on the second pass */ - ASSERT(FirstTry == FALSE); + else + { + /* No child list, we'll need to add it */ + ChildIndex = 0; + } /* The KCB must be locked exclusive at this point */ - CMP_ASSERT_KCB_LOCK(Kcb); + ASSERT((CmpIsKcbLockedExclusive(Kcb) == TRUE) || + (CmpTestRegistryLockExclusive() == TRUE)); /* Mark the cell dirty */ - if (!HvMarkCellDirty(Hive, Cell, FALSE)) - { - /* Not enough log space, fail */ - Status = STATUS_NO_LOG_SPACE; - goto Quickie; - } + HvMarkCellDirty(Hive, Cell, FALSE); /* Get the storage type */ Storage = HvGetCellType(Cell); @@ -750,19 +388,8 @@ DoAgain: SmallData = 0; if ((DataLength <= CM_KEY_VALUE_SMALL) && (DataLength > 0)) { - /* Need SEH because user data may be invalid */ - _SEH2_TRY - { - /* Copy it */ - RtlCopyMemory(&SmallData, Data, DataLength); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Return failure code */ - Status = _SEH2_GetExceptionCode(); - _SEH2_YIELD(goto Quickie); - } - _SEH2_END; + /* Copy it */ + RtlCopyMemory(&SmallData, Data, DataLength); } /* Check if we didn't find a matching key */ @@ -815,7 +442,7 @@ DoAgain: /* Save the write time */ KeQuerySystemTime(&Parent->LastWriteTime); - Kcb->KcbLastWriteTime = Parent->LastWriteTime; + KeQuerySystemTime(&Kcb->KcbLastWriteTime); /* Check if the cell is cached */ if ((Found) && (CMP_IS_CELL_CACHED(Kcb->ValueCache.ValueList))) @@ -836,21 +463,10 @@ DoAgain: Kcb->ValueCache.Count = Parent->ValueList.Count; Kcb->ValueCache.ValueList = Parent->ValueList.List; } - - /* Notify registered callbacks */ - CmpReportNotify(Kcb, - Hive, - Kcb->KeyCell, - REG_NOTIFY_CHANGE_LAST_SET); } - /* Release the cells */ Quickie: - if ((ParentCell != HCELL_NIL) && (Hive)) HvReleaseCell(Hive, ParentCell); - if ((ChildCell != HCELL_NIL) && (Hive)) HvReleaseCell(Hive, ChildCell); - /* Release the locks */ - if (FlusherLocked) CmpUnlockHiveFlusher((PCMHIVE)Hive); CmpReleaseKcbLock(Kcb); CmpUnlockRegistry(); return Status; @@ -888,13 +504,15 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Get the hive and the cell index */ Hive = Kcb->KeyHive; Cell = Kcb->KeyCell; - - /* Lock flushes */ - CmpLockHiveFlusherShared((PCMHIVE)Hive); /* Get the parent key node */ Parent = (PCM_KEY_NODE)HvGetCell(Hive, Cell); - ASSERT(Parent); + if (!Parent) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } /* Get the value list and check if it has any entries */ ChildList = &Parent->ValueList; @@ -917,26 +535,16 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, if (ChildCell == HCELL_NIL) goto Quickie; /* We found the value, mark all relevant cells dirty */ - if (!((HvMarkCellDirty(Hive, Cell, FALSE)) && - (HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE)) && - (HvMarkCellDirty(Hive, ChildCell, FALSE)))) - { - /* Not enough log space, fail */ - Status = STATUS_NO_LOG_SPACE; - goto Quickie; - } + HvMarkCellDirty(Hive, Cell, FALSE); + HvMarkCellDirty(Hive, Parent->ValueList.List, FALSE); + HvMarkCellDirty(Hive, ChildCell, FALSE); /* Get the key value */ Value = (PCM_KEY_VALUE)HvGetCell(Hive,ChildCell); - ASSERT(Value); + if (!Value) ASSERT(FALSE); /* Mark it and all related data as dirty */ - if (!CmpMarkValueDataDirty(Hive, Value)) - { - /* Not enough log space, fail */ - Status = STATUS_NO_LOG_SPACE; - goto Quickie; - } + CmpMarkValueDataDirty(Hive, Value); /* Ssanity checks */ ASSERT(HvIsCellDirty(Hive, Parent->ValueList.List)); @@ -944,12 +552,7 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Remove the value from the child list */ Status = CmpRemoveValueFromList(Hive, ChildIndex, ChildList); - if (!NT_SUCCESS(Status)) - { - /* Set known error */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } + if(!NT_SUCCESS(Status)) goto Quickie; /* Remove the value and its data itself */ if (!CmpFreeValue(Hive, ChildCell)) @@ -961,7 +564,7 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Set the last write time */ KeQuerySystemTime(&Parent->LastWriteTime); - Kcb->KcbLastWriteTime = Parent->LastWriteTime; + KeQuerySystemTime(&Kcb->KcbLastWriteTime); /* Sanity check */ ASSERT(Parent->MaxValueNameLen == Kcb->KcbMaxValueNameLen); @@ -988,9 +591,6 @@ CmDeleteValueKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Set the value cache */ Kcb->ValueCache.Count = ChildList->Count; Kcb->ValueCache.ValueList = ChildList->List; - - /* Notify registered callbacks */ - CmpReportNotify(Kcb, Hive, Cell, REG_NOTIFY_CHANGE_LAST_SET); /* Change default Status to success */ Status = STATUS_SUCCESS; @@ -1009,7 +609,6 @@ Quickie: } /* Release locks */ - CmpUnlockHiveFlusher((PCMHIVE)Hive); CmpReleaseKcbLock(Kcb); CmpUnlockRegistry(); return Status; @@ -1084,38 +683,22 @@ DoAgain: /* Sanity check */ ASSERT(ValueData != NULL); - /* User data, protect against exceptions */ - _SEH2_TRY - { - /* Query the information requested */ - Result = CmpQueryKeyValueData(Kcb, - CachedValue, - ValueData, - ValueCached, - KeyValueInformationClass, - KeyValueInformation, - Length, - ResultLength, - &Status); - if (Result == SearchNeedExclusiveLock) - { - /* Release the value cell */ - if (CellToRelease != HCELL_NIL) - { - HvReleaseCell(Hive, CellToRelease); - CellToRelease = HCELL_NIL; - } - - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); + /* Query the information requested */ + Result = CmpQueryKeyValueData(Kcb, + CachedValue, + ValueData, + ValueCached, + KeyValueInformationClass, + KeyValueInformation, + Length, + ResultLength, + &Status); + if (Result == SearchNeedExclusiveLock) + { + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; } - _SEH2_END; } else { @@ -1168,138 +751,328 @@ DoAgain: return STATUS_KEY_DELETED; } - /* Get the hive and parent */ - Hive = Kcb->KeyHive; - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); - ASSERT(Parent); + /* Get the hive and parent */ + Hive = Kcb->KeyHive; + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); + if (!Parent) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Make sure the index is valid */ + //if (Index >= Kcb->ValueCache.Count) + if (Index >= Parent->ValueList.Count) + { + /* Release the cell and fail */ + HvReleaseCell(Hive, Kcb->KeyCell); + Status = STATUS_NO_MORE_ENTRIES; + goto Quickie; + } + + /* We don't deal with this yet */ + if (Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND) + { + /* Shouldn't happen */ + ASSERT(FALSE); + } + + /* Find the value list */ + Result = CmpGetValueListFromCache(Kcb, + &CellData, + &IndexIsCached, + &CellToRelease); + if (Result == SearchNeedExclusiveLock) + { + /* Check if we need an exclusive lock */ + ASSERT(CellToRelease == HCELL_NIL); + ASSERT(ValueData == NULL); + + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + else if (Result != SearchSuccess) + { + /* Sanity check */ + ASSERT(CellData == NULL); + + /* Release the cell and fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Now get the key value */ + Result = CmpGetValueKeyFromCache(Kcb, + CellData, + Index, + &CachedValue, + &ValueData, + IndexIsCached, + &ValueIsCached, + &CellToRelease2); + if (Result == SearchNeedExclusiveLock) + { + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + else if (Result != SearchSuccess) + { + /* Sanity check */ + ASSERT(ValueData == NULL); + + /* Release the cells and fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + + /* Query the information requested */ + Result = CmpQueryKeyValueData(Kcb, + CachedValue, + ValueData, + ValueIsCached, + KeyValueInformationClass, + KeyValueInformation, + Length, + ResultLength, + &Status); + if (Result == SearchNeedExclusiveLock) + { + /* Try with exclusive KCB lock */ + CmpConvertKcbSharedToExclusive(Kcb); + goto DoAgain; + } + +Quickie: + /* If we have a cell to release, do so */ + if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease); + + /* Release the parent cell */ + HvReleaseCell(Hive, Kcb->KeyCell); + + /* If we have a cell to release, do so */ + if (CellToRelease2 != HCELL_NIL) HvReleaseCell(Hive, CellToRelease2); + + /* Release locks */ + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return Status; +} + +NTSTATUS +NTAPI +CmpQueryKeyData(IN PHHIVE Hive, + IN PCM_KEY_NODE Node, + IN KEY_INFORMATION_CLASS KeyInformationClass, + IN OUT PVOID KeyInformation, + IN ULONG Length, + IN OUT PULONG ResultLength) +{ + NTSTATUS Status; + ULONG Size, SizeLeft, MinimumSize; + PKEY_INFORMATION Info = (PKEY_INFORMATION)KeyInformation; + USHORT NameLength; + + /* Check if the value is compressed */ + if (Node->Flags & KEY_COMP_NAME) + { + /* Get the compressed name size */ + NameLength = CmpCompressedNameSize(Node->Name, Node->NameLength); + } + else + { + /* Get the real size */ + NameLength = Node->NameLength; + } + + /* Check what kind of information is being requested */ + switch (KeyInformationClass) + { + /* Basic information */ + case KeyBasicInformation: + + /* This is the size we need */ + Size = FIELD_OFFSET(KEY_BASIC_INFORMATION, Name) + NameLength; + + /* And this is the minimum we can work with */ + MinimumSize = FIELD_OFFSET(KEY_BASIC_INFORMATION, Name); + + /* Let the caller know and assume success */ + *ResultLength = Size; + Status = STATUS_SUCCESS; + + /* Check if the bufer we got is too small */ + if (Length < MinimumSize) + { + /* Let the caller know and fail */ + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + /* Copy the basic information */ + Info->KeyBasicInformation.LastWriteTime = Node->LastWriteTime; + Info->KeyBasicInformation.TitleIndex = 0; + Info->KeyBasicInformation.NameLength = NameLength; + + /* Only the name is left */ + SizeLeft = Length - MinimumSize; + Size = NameLength; + + /* Check if we don't have enough space for the name */ + if (SizeLeft < Size) + { + /* Truncate the name we'll return, and tell the caller */ + Size = SizeLeft; + Status = STATUS_BUFFER_OVERFLOW; + } + + /* Check if this is a compressed key */ + if (Node->Flags & KEY_COMP_NAME) + { + /* Copy the compressed name */ + CmpCopyCompressedName(Info->KeyBasicInformation.Name, + SizeLeft, + Node->Name, + Node->NameLength); + } + else + { + /* Otherwise, copy the raw name */ + RtlCopyMemory(Info->KeyBasicInformation.Name, + Node->Name, + Size); + } + break; + + /* Node information */ + case KeyNodeInformation: + + /* Calculate the size we need */ + Size = FIELD_OFFSET(KEY_NODE_INFORMATION, Name) + + NameLength + + Node->ClassLength; + + /* And the minimum size we can support */ + MinimumSize = FIELD_OFFSET(KEY_NODE_INFORMATION, Name); + + /* Return the size to the caller and assume succes */ + *ResultLength = Size; + Status = STATUS_SUCCESS; + + /* Check if the caller's buffer is too small */ + if (Length < MinimumSize) + { + /* Let them know, and fail */ + Status = STATUS_BUFFER_TOO_SMALL; + break; + } + + /* Copy the basic information */ + Info->KeyNodeInformation.LastWriteTime = Node->LastWriteTime; + Info->KeyNodeInformation.TitleIndex = 0; + Info->KeyNodeInformation.ClassLength = Node->ClassLength; + Info->KeyNodeInformation.NameLength = NameLength; + + /* Now the name is left */ + SizeLeft = Length - MinimumSize; + Size = NameLength; - /* FIXME: Lack of cache? */ - if (Kcb->ValueCache.Count != Parent->ValueList.Count) - { - DPRINT1("HACK: Overriding value cache count\n"); - Kcb->ValueCache.Count = Parent->ValueList.Count; - } + /* Check if the name can fit entirely */ + if (SizeLeft < Size) + { + /* It can't, we'll have to truncate. Tell the caller */ + Size = SizeLeft; + Status = STATUS_BUFFER_OVERFLOW; + } - /* Make sure the index is valid */ - if (Index >= Kcb->ValueCache.Count) - { - /* Release the cell and fail */ - HvReleaseCell(Hive, Kcb->KeyCell); - Status = STATUS_NO_MORE_ENTRIES; - goto Quickie; - } - - /* We don't deal with this yet */ - if (Kcb->ExtFlags & CM_KCB_SYM_LINK_FOUND) - { - /* Shouldn't happen */ - ASSERT(FALSE); - } + /* Check if the key node name is compressed */ + if (Node->Flags & KEY_COMP_NAME) + { + /* Copy the compressed name */ + CmpCopyCompressedName(Info->KeyNodeInformation.Name, + SizeLeft, + Node->Name, + Node->NameLength); + } + else + { + /* It isn't, so copy the raw name */ + RtlCopyMemory(Info->KeyNodeInformation.Name, + Node->Name, + Size); + } - /* Find the value list */ - Result = CmpGetValueListFromCache(Kcb, - &CellData, - &IndexIsCached, - &CellToRelease); - if (Result == SearchNeedExclusiveLock) - { - /* Check if we need an exclusive lock */ - ASSERT(CellToRelease == HCELL_NIL); - HvReleaseCell(Hive, Kcb->KeyCell); - - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - else if (Result != SearchSuccess) - { - /* Sanity check */ - ASSERT(CellData == NULL); + /* Check if the node has a class */ + if (Node->ClassLength > 0) + { + /* It does. We don't support these yet */ + ASSERTMSG("Classes not supported\n", FALSE); + } + else + { + /* It doesn't, so set offset to -1, not 0! */ + Info->KeyNodeInformation.ClassOffset = 0xFFFFFFFF; + } + break; - /* Release the cell and fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } + /* Full information requsted */ + case KeyFullInformation: - /* Now get the key value */ - Result = CmpGetValueKeyFromCache(Kcb, - CellData, - Index, - &CachedValue, - &ValueData, - IndexIsCached, - &ValueIsCached, - &CellToRelease2); - if (Result == SearchNeedExclusiveLock) - { - /* Cleanup state */ - ASSERT(CellToRelease2 == HCELL_NIL); - if (CellToRelease) - { - HvReleaseCell(Hive, CellToRelease); - CellToRelease = HCELL_NIL; - } - HvReleaseCell(Hive, Kcb->KeyCell); + /* This is the size we need */ + Size = FIELD_OFFSET(KEY_FULL_INFORMATION, Class) + + Node->ClassLength; - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - else if (Result != SearchSuccess) - { - /* Sanity check */ - ASSERT(ValueData == NULL); + /* This is what we can work with */ + MinimumSize = FIELD_OFFSET(KEY_FULL_INFORMATION, Class); - /* Release the cells and fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* User data, need SEH */ - _SEH2_TRY - { - /* Query the information requested */ - Result = CmpQueryKeyValueData(Kcb, - CachedValue, - ValueData, - ValueIsCached, - KeyValueInformationClass, - KeyValueInformation, - Length, - ResultLength, - &Status); - if (Result == SearchNeedExclusiveLock) - { - /* Cleanup state */ - if (CellToRelease2) HvReleaseCell(Hive, CellToRelease2); - HvReleaseCell(Hive, Kcb->KeyCell); - if (CellToRelease) HvReleaseCell(Hive, CellToRelease); + /* Return it to caller and assume success */ + *ResultLength = Size; + Status = STATUS_SUCCESS; - /* Try with exclusive KCB lock */ - CmpConvertKcbSharedToExclusive(Kcb); - goto DoAgain; - } - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Get exception code */ - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; + /* Check if the caller's buffer is to small */ + if (Length < MinimumSize) + { + /* Let them know and fail */ + Status = STATUS_BUFFER_TOO_SMALL; + break; + } -Quickie: - /* If we have a cell to release, do so */ - if (CellToRelease != HCELL_NIL) HvReleaseCell(Hive, CellToRelease); + /* Now copy all the basic information */ + Info->KeyFullInformation.LastWriteTime = Node->LastWriteTime; + Info->KeyFullInformation.TitleIndex = 0; + Info->KeyFullInformation.ClassLength = Node->ClassLength; + Info->KeyFullInformation.SubKeys = Node->SubKeyCounts[Stable] + + Node->SubKeyCounts[Volatile]; + Info->KeyFullInformation.Values = Node->ValueList.Count; + Info->KeyFullInformation.MaxNameLen = Node->MaxNameLen; + Info->KeyFullInformation.MaxClassLen = Node->MaxClassLen; + Info->KeyFullInformation.MaxValueNameLen = Node->MaxValueNameLen; + Info->KeyFullInformation.MaxValueDataLen = Node->MaxValueDataLen; - /* Release the parent cell */ - HvReleaseCell(Hive, Kcb->KeyCell); + /* Check if we have a class */ + if (Node->ClassLength > 0) + { + /* We do, but we currently don't support this */ + ASSERTMSG("Classes not supported\n", FALSE); + } + else + { + /* We don't have a class, so set offset to -1, not 0! */ + Info->KeyNodeInformation.ClassOffset = 0xFFFFFFFF; + } + break; - /* If we have a cell to release, do so */ - if (CellToRelease2 != HCELL_NIL) HvReleaseCell(Hive, CellToRelease2); + /* Any other class that got sent here is invalid! */ + default: - /* Release locks */ - CmpReleaseKcbLock(Kcb); - CmpUnlockRegistry(); + /* Set failure code */ + Status = STATUS_INVALID_PARAMETER; + break; + } + + /* Return status */ return Status; } @@ -1314,7 +1087,6 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, NTSTATUS Status; PHHIVE Hive; PCM_KEY_NODE Parent; - HV_TRACK_CELL_REF CellReferences = {0}; /* Acquire hive lock */ CmpLockRegistry(); @@ -1322,6 +1094,16 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Lock KCB shared */ CmpAcquireKcbLockShared(Kcb); + /* Get the hive and parent */ + Hive = Kcb->KeyHive; + Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); + if (!Parent) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } + /* Don't touch deleted keys */ if (Kcb->Delete) { @@ -1338,27 +1120,13 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, case KeyBasicInformation: case KeyNodeInformation: - /* Get the hive and parent */ - Hive = Kcb->KeyHive; - Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); - ASSERT(Parent); - - /* Track cell references */ - if (!HvTrackCellRef(&CellReferences, Hive, Kcb->KeyCell)) - { - /* Not enough memory to track references */ - Status = STATUS_INSUFFICIENT_RESOURCES; - } - else - { - /* Call the internal API */ - Status = CmpQueryKeyData(Hive, - Parent, - KeyInformationClass, - KeyInformation, - Length, - ResultLength); - } + /* Call the internal API */ + Status = CmpQueryKeyData(Hive, + Parent, + KeyInformationClass, + KeyInformation, + Length, + ResultLength); break; /* Unsupported classes for now */ @@ -1381,9 +1149,6 @@ CmQueryKey(IN PCM_KEY_CONTROL_BLOCK Kcb, } Quickie: - /* Release references */ - HvReleaseFreeCellRefArray(&CellReferences); - /* Release locks */ CmpReleaseKcbLock(Kcb); CmpUnlockRegistry(); @@ -1403,7 +1168,6 @@ CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, PHHIVE Hive; PCM_KEY_NODE Parent, Child; HCELL_INDEX ChildCell; - HV_TRACK_CELL_REF CellReferences = {0}; /* Acquire hive lock */ CmpLockRegistry(); @@ -1415,14 +1179,20 @@ CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, if (Kcb->Delete) { /* Undo everything */ - Status = STATUS_KEY_DELETED; - goto Quickie; + CmpReleaseKcbLock(Kcb); + CmpUnlockRegistry(); + return STATUS_KEY_DELETED; } /* Get the hive and parent */ Hive = Kcb->KeyHive; Parent = (PCM_KEY_NODE)HvGetCell(Hive, Kcb->KeyCell); - ASSERT(Parent); + if (!Parent) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } /* Get the child cell */ ChildCell = CmpFindSubKeyByNumber(Hive, Parent, Index); @@ -1440,39 +1210,22 @@ CmEnumerateKey(IN PCM_KEY_CONTROL_BLOCK Kcb, /* Now get the actual child node */ Child = (PCM_KEY_NODE)HvGetCell(Hive, ChildCell); - ASSERT(Child); - - /* Track references */ - if (!HvTrackCellRef(&CellReferences, Hive, ChildCell)) + if (!Child) { - /* Can't allocate memory for tracking */ + /* Fail */ Status = STATUS_INSUFFICIENT_RESOURCES; goto Quickie; } - /* Data can be user-mode, use SEH */ - _SEH2_TRY - { - /* Query the data requested */ - Status = CmpQueryKeyData(Hive, - Child, - KeyInformationClass, - KeyInformation, - Length, - ResultLength); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Fail with exception code */ - Status = _SEH2_GetExceptionCode(); - _SEH2_YIELD(goto Quickie); - } - _SEH2_END; + /* Query the data requested */ + Status = CmpQueryKeyData(Hive, + Child, + KeyInformationClass, + KeyInformation, + Length, + ResultLength); Quickie: - /* Release references */ - HvReleaseFreeCellRefArray(&CellReferences); - /* Release locks */ CmpReleaseKcbLock(Kcb); CmpUnlockRegistry(); @@ -1518,12 +1271,14 @@ CmDeleteKey(IN PCM_KEY_BODY KeyBody) Hive = Kcb->KeyHive; Cell = Kcb->KeyCell; - /* Lock flushes */ - CmpLockHiveFlusherShared((PCMHIVE)Hive); - /* Get the key node */ Node = (PCM_KEY_NODE)HvGetCell(Hive, Cell); - ASSERT(Node); + if (!Node) + { + /* Fail */ + Status = STATUS_INSUFFICIENT_RESOURCES; + goto Quickie; + } /* Sanity check */ ASSERT(Node->Flags == Kcb->Flags); @@ -1532,17 +1287,11 @@ CmDeleteKey(IN PCM_KEY_BODY KeyBody) if (!(Node->SubKeyCounts[Stable] + Node->SubKeyCounts[Volatile]) && !(Node->Flags & KEY_NO_DELETE)) { - /* Send notification to registered callbacks */ - CmpReportNotify(Kcb, Hive, Cell, REG_NOTIFY_CHANGE_NAME); - /* Get the parent and free the cell */ ParentCell = Node->Parent; Status = CmpFreeKeyByCell(Hive, Cell, TRUE); if (NT_SUCCESS(Status)) { - /* Flush any notifications */ - CmpFlushNotifiesOnKeyBodyList(Kcb, FALSE); - /* Clean up information we have on the subkey */ CmpCleanUpSubKeyInfo(Kcb->ParentKcb); @@ -1578,12 +1327,10 @@ CmDeleteKey(IN PCM_KEY_BODY KeyBody) Status = STATUS_CANNOT_DELETE; } +Quickie: /* Release the cell */ HvReleaseCell(Hive, Cell); - - /* Release flush lock */ - CmpUnlockHiveFlusher((PCMHIVE)Hive); - + /* Release the KCB locks */ Quickie2: CmpReleaseTwoKcbLockByKey(Kcb->ConvKey, Kcb->ParentKcb->ConvKey); @@ -1617,36 +1364,12 @@ CmFlushKey(IN PCM_KEY_CONTROL_BLOCK Kcb, } else { - /* Don't touch the hive */ - CmpLockHiveFlusherExclusive(CmHive); - ASSERT(CmHive->ViewLock); - KeAcquireGuardedMutex(CmHive->ViewLock); - CmHive->ViewLockOwner = KeGetCurrentThread(); - - /* Will the hive shrink? */ - if (HvHiveWillShrink(Hive)) - { - /* I don't believe the current Hv does shrinking */ - ASSERT(FALSE); - } - else - { - /* Now we can release views */ - ASSERT(CmHive->ViewLock); - CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK_OR_LOADING(CmHive); - ASSERT(KeGetCurrentThread() == CmHive->ViewLockOwner); - KeReleaseGuardedMutex(CmHive->ViewLock); - } - /* Flush only this hive */ if (!HvSyncHive(Hive)) { /* Fail */ Status = STATUS_REGISTRY_IO_FAILED; } - - /* Release the flush lock */ - CmpUnlockHiveFlusher((PCMHIVE)Hive); } /* Return the status */ @@ -1664,9 +1387,8 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, SECURITY_CLIENT_CONTEXT ClientSecurityContext; HANDLE KeyHandle; BOOLEAN Allocate = TRUE; - PCMHIVE CmHive, LoadedHive; + PCMHIVE CmHive; NTSTATUS Status; - CM_PARSE_CONTEXT ParseContext; /* Check if we have a trust key */ if (KeyBody) @@ -1693,21 +1415,9 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, } /* Open the target key */ -#if 0 Status = ZwOpenKey(&KeyHandle, KEY_READ, TargetKey); -#else - RtlZeroMemory(&ParseContext, sizeof(ParseContext)); - ParseContext.CreateOperation = FALSE; - Status = ObOpenObjectByName(TargetKey, - CmpKeyObjectType, - KernelMode, - NULL, - KEY_READ, - &ParseContext, - &KeyHandle); -#endif if (!NT_SUCCESS(Status)) KeyHandle = NULL; - + /* Open the hive */ Status = CmpCmdHiveOpen(SourceFile, &ClientSecurityContext, @@ -1727,29 +1437,21 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, /* Lock the registry */ CmpLockRegistryExclusive(); - /* Check if we are already loaded */ - if (CmpIsHiveAlreadyLoaded(KeyHandle, SourceFile, &LoadedHive)) - { - /* That's okay then */ - ASSERT(LoadedHive); - Status = STATUS_SUCCESS; - } - + /* FIXME: Check if we are already loaded */ + /* Release the registry */ CmpUnlockRegistry(); } /* Close the key handle if we had one */ if (KeyHandle) ZwClose(KeyHandle); + DPRINT1("Failed: %lx\n", Status); return Status; } /* Lock the registry shared */ CmpLockRegistry(); - /* Lock loading */ - ExAcquirePushLockExclusive(&CmpLoadHiveLock); - /* Lock the hive to this thread */ CmHive->Hive.HiveFlags |= HIVE_IS_UNLOADING; CmHive->CreatorOwner = KeGetCurrentThread(); @@ -1765,37 +1467,23 @@ CmLoadKey(IN POBJECT_ATTRIBUTES TargetKey, TargetKey->SecurityDescriptor); if (NT_SUCCESS(Status)) { - /* Add to HiveList key */ - CmpAddToHiveFileList(CmHive); + /* FIXME: Add to HiveList key */ /* Sync the hive if necessary */ if (Allocate) { - /* Sync it under the flusher lock */ - CmpLockHiveFlusherExclusive(CmHive); + /* Sync it */ HvSyncHive(&CmHive->Hive); - CmpUnlockHiveFlusher(CmHive); } /* Release the hive */ CmHive->Hive.HiveFlags &= ~HIVE_IS_UNLOADING; CmHive->CreatorOwner = NULL; - - /* Allow loads */ - ExReleasePushLock(&CmpLoadHiveLock); } else { /* FIXME: TODO */ - ASSERT(FALSE); - } - - /* Is this first profile load? */ - if (!(CmpProfileLoaded) && !(CmpWasSetupBoot)) - { - /* User is now logged on, set quotas */ - CmpProfileLoaded = TRUE; - CmpSetGlobalQuotaAllowed(); + } /* Unlock the registry */ diff --git a/ntoskrnl/config/cmboot.c b/ntoskrnl/config/cmboot.c index 50c6815866f..f1dcc347a20 100644 --- a/ntoskrnl/config/cmboot.c +++ b/ntoskrnl/config/cmboot.c @@ -1,19 +1,20 @@ /* * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory + * LICENSE: GPL - See COPYING in the top level directory * FILE: ntoskrnl/config/cmboot.c * PURPOSE: Configuration Manager - Boot Initialization - * PROGRAMMERS: ReactOS Portable Systems Group - * Alex Ionescu (alex.ionescu@reactos.org) + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ -/* INCLUDES *******************************************************************/ +/* INCLUDES ******************************************************************/ #include "ntoskrnl.h" #define NDEBUG #include "debug.h" - -/* FUNCTIONS ******************************************************************/ + +/* GLOBALS *******************************************************************/ + +/* FUNCTIONS *****************************************************************/ HCELL_INDEX NTAPI @@ -123,559 +124,3 @@ CmpFindControlSet(IN PHHIVE SystemHive, /* Return the CCS Cell */ return ControlSetCell; } - -ULONG -NTAPI -CmpFindTagIndex(IN PHHIVE Hive, - IN HCELL_INDEX TagCell, - IN HCELL_INDEX GroupOrderCell, - IN PUNICODE_STRING GroupName) -{ - PCM_KEY_VALUE TagValue, Value; - HCELL_INDEX OrderCell; - PULONG TagOrder, DriverTag; - ULONG CurrentTag, Length; - PCM_KEY_NODE Node; - BOOLEAN BufferAllocated; - ASSERT(Hive->ReleaseCellRoutine == NULL); - - /* Get the tag */ - Value = HvGetCell(Hive, TagCell); - ASSERT(Value); - DriverTag = (PULONG)CmpValueToData(Hive, Value, &Length); - ASSERT(DriverTag); - - /* Get the order array */ - Node = HvGetCell(Hive, GroupOrderCell); - ASSERT(Node); - OrderCell = CmpFindValueByName(Hive, Node, GroupName); - if (OrderCell == HCELL_NIL) return -2; - - /* And read it */ - TagValue = HvGetCell(Hive, OrderCell); - CmpGetValueData(Hive, TagValue, &Length, (PVOID*)&TagOrder, &BufferAllocated, &OrderCell); - ASSERT(TagOrder); - - /* Parse each tag */ - for (CurrentTag = 1; CurrentTag <= TagOrder[0]; CurrentTag++) - { - /* Find a match */ - if (TagOrder[CurrentTag] == *DriverTag) - { - /* Found it -- return the tag */ - if (BufferAllocated) ExFreePool(TagOrder); - return CurrentTag; - } - } - - /* No matches, so assume next to last ordering */ - if (BufferAllocated) ExFreePool(TagOrder); - return -2; -} - -BOOLEAN -NTAPI -CmpAddDriverToList(IN PHHIVE Hive, - IN HCELL_INDEX DriverCell, - IN HCELL_INDEX GroupOrderCell, - IN PUNICODE_STRING RegistryPath, - IN PLIST_ENTRY BootDriverListHead) -{ - PBOOT_DRIVER_NODE DriverNode; - PBOOT_DRIVER_LIST_ENTRY DriverEntry; - PCM_KEY_NODE Node; - ULONG NameLength, Length; - HCELL_INDEX ValueCell, TagCell; - PCM_KEY_VALUE Value; - PUNICODE_STRING FileName, RegistryString; - UNICODE_STRING UnicodeString; - PULONG ErrorControl; - PWCHAR Buffer; - ASSERT(Hive->ReleaseCellRoutine == NULL); - - /* Allocate a driver node and initialize it */ - DriverNode = CmpAllocate(sizeof(BOOT_DRIVER_NODE), FALSE, TAG_CM); - if (!DriverNode) return FALSE; - DriverEntry = &DriverNode->ListEntry; - DriverEntry->RegistryPath.Buffer = NULL; - DriverEntry->FilePath.Buffer = NULL; - - /* Get the driver cell */ - Node = HvGetCell(Hive, DriverCell); - ASSERT(Node); - - /* Get the name from the cell */ - DriverNode->Name.Length = Node->Flags & KEY_COMP_NAME ? - CmpCompressedNameSize(Node->Name, Node->NameLength) : - Node->NameLength; - DriverNode->Name.MaximumLength = DriverNode->Name.Length; - NameLength = DriverNode->Name.Length; - - /* Now allocate the buffer for it and copy the name */ - DriverNode->Name.Buffer = CmpAllocate(NameLength, FALSE, TAG_CM); - if (!DriverNode->Name.Buffer) return FALSE; - if (Node->Flags & KEY_COMP_NAME) - { - /* Compressed name */ - CmpCopyCompressedName(DriverNode->Name.Buffer, - DriverNode->Name.Length, - Node->Name, - Node->NameLength); - } - else - { - /* Normal name */ - RtlCopyMemory(DriverNode->Name.Buffer, Node->Name, Node->NameLength); - } - - /* Now find the image path */ - RtlInitUnicodeString(&UnicodeString, L"ImagePath"); - ValueCell = CmpFindValueByName(Hive, Node, &UnicodeString); - if (ValueCell == HCELL_NIL) - { - /* Couldn't find it, so assume the drivers path */ - Length = sizeof(L"System32\\Drivers\\") + NameLength + sizeof(L".sys"); - - /* Allocate the path name */ - FileName = &DriverEntry->FilePath; - FileName->Length = 0; - FileName->MaximumLength = Length; - FileName->Buffer = CmpAllocate(Length, FALSE,TAG_CM); - if (!FileName->Buffer) return FALSE; - - /* Write the path name */ - RtlAppendUnicodeToString(FileName, L"System32\\Drivers\\"); - RtlAppendUnicodeStringToString(FileName, &DriverNode->Name); - RtlAppendUnicodeToString(FileName, L".sys"); - } - else - { - /* Path name exists, so grab it */ - Value = HvGetCell(Hive, ValueCell); - ASSERT(Value); - - /* Allocate and setup the path name */ - FileName = &DriverEntry->FilePath; - Buffer = (PWCHAR)CmpValueToData(Hive, Value, &Length); - FileName->MaximumLength = FileName->Length = Length; - FileName->Buffer = CmpAllocate(Length, FALSE, TAG_CM); - - /* Transfer the data */ - if (!(FileName->Buffer) || !(Buffer)) return FALSE; - RtlCopyMemory(FileName->Buffer, Buffer, Length); - } - - /* Now build the registry path */ - RegistryString = &DriverEntry->RegistryPath; - RegistryString->Length = 0; - RegistryString->MaximumLength = RegistryPath->Length + NameLength; - RegistryString->Buffer = CmpAllocate(RegistryString->MaximumLength, FALSE, TAG_CM); - if (!RegistryString->Buffer) return FALSE; - - /* Add the driver name to it */ - RtlAppendUnicodeStringToString(RegistryString, RegistryPath); - RtlAppendUnicodeStringToString(RegistryString, &DriverNode->Name); - - /* The entry is done, add it */ - InsertHeadList(BootDriverListHead, &DriverEntry->Link); - - /* Now find error control settings */ - RtlInitUnicodeString(&UnicodeString, L"ErrorControl"); - ValueCell = CmpFindValueByName(Hive, Node, &UnicodeString); - if (ValueCell == HCELL_NIL) - { - /* Couldn't find it, so assume default */ - DriverNode->ErrorControl = NormalError; - } - else - { - /* Otherwise, read whatever the data says */ - Value = HvGetCell(Hive, ValueCell); - ASSERT(Value); - ErrorControl = (PULONG)CmpValueToData(Hive, Value, &Length); - ASSERT(ErrorControl); - DriverNode->ErrorControl = *ErrorControl; - } - - /* Next, get the group cell */ - RtlInitUnicodeString(&UnicodeString, L"group"); - ValueCell = CmpFindValueByName(Hive, Node, &UnicodeString); - if (ValueCell == HCELL_NIL) - { - /* Couldn't find, so set an empty string */ - RtlInitEmptyUnicodeString(&DriverNode->Group, NULL, 0); - } - else - { - /* Found it, read the group value */ - Value = HvGetCell(Hive, ValueCell); - ASSERT(Value); - - /* Copy it into the node */ - DriverNode->Group.Buffer = (PWCHAR)CmpValueToData(Hive, Value, &Length); - if (!DriverNode->Group.Buffer) return FALSE; - DriverNode->Group.Length = Length - sizeof(UNICODE_NULL); - DriverNode->Group.MaximumLength = DriverNode->Group.Length; - } - - /* Finally, find the tag */ - RtlInitUnicodeString(&UnicodeString, L"Tag"); - TagCell = CmpFindValueByName(Hive, Node, &UnicodeString); - if (TagCell == HCELL_NIL) - { - /* No tag, so load last */ - DriverNode->Tag = -1; - } - else - { - /* Otherwise, decode it based on tag order */ - DriverNode->Tag = CmpFindTagIndex(Hive, - TagCell, - GroupOrderCell, - &DriverNode->Group); - } - - /* All done! */ - return TRUE; -} - -BOOLEAN -NTAPI -CmpIsLoadType(IN PHHIVE Hive, - IN HCELL_INDEX Cell, - IN SERVICE_LOAD_TYPE LoadType) -{ - PCM_KEY_NODE Node; - HCELL_INDEX ValueCell; - UNICODE_STRING ValueString = RTL_CONSTANT_STRING(L"Start"); - PCM_KEY_VALUE Value; - ULONG Length; - PLONG Data; - ASSERT(Hive->ReleaseCellRoutine == NULL); - - /* Open the start cell */ - Node = HvGetCell(Hive, Cell); - ASSERT(Node); - ValueCell = CmpFindValueByName(Hive, Node, &ValueString); - if (ValueCell == HCELL_NIL) return FALSE; - - /* Read the start value */ - Value = HvGetCell(Hive, ValueCell); - ASSERT(Value); - Data = (PLONG)CmpValueToData(Hive, Value, &Length); - ASSERT(Data); - - /* Return if the type matches */ - return (*Data == LoadType); -} - -BOOLEAN -NTAPI -CmpFindDrivers(IN PHHIVE Hive, - IN HCELL_INDEX ControlSet, - IN SERVICE_LOAD_TYPE LoadType, - IN PWCHAR BootFileSystem OPTIONAL, - IN PLIST_ENTRY DriverListHead) -{ - HCELL_INDEX ServicesCell, ControlCell, GroupOrderCell, DriverCell; - UNICODE_STRING Name; - ULONG i; - WCHAR Buffer[128]; - UNICODE_STRING UnicodeString, KeyPath; - PBOOT_DRIVER_NODE FsNode; - PCM_KEY_NODE ControlNode, ServicesNode, Node; - ASSERT(Hive->ReleaseCellRoutine == NULL); - - /* Open the control set key */ - ControlNode = HvGetCell(Hive, ControlSet); - ASSERT(ControlNode); - - /* Get services cell */ - RtlInitUnicodeString(&Name, L"Services"); - ServicesCell = CmpFindSubKeyByName(Hive, ControlNode, &Name); - if (ServicesCell == HCELL_NIL) return FALSE; - - /* Open services key */ - ServicesNode = HvGetCell(Hive, ServicesCell); - ASSERT(ServicesNode); - - /* Get control cell */ - RtlInitUnicodeString(&Name, L"Control"); - ControlCell = CmpFindSubKeyByName(Hive, ControlNode, &Name); - if (ControlCell == HCELL_NIL) return FALSE; - - /* Get the group order cell and read it */ - RtlInitUnicodeString(&Name, L"GroupOrderList"); - Node = HvGetCell(Hive, ControlCell); - ASSERT(Node); - GroupOrderCell = CmpFindSubKeyByName(Hive, Node, &Name); - if (GroupOrderCell == HCELL_NIL) return FALSE; - - /* Build the root registry path */ - RtlInitEmptyUnicodeString(&KeyPath, Buffer, sizeof(Buffer)); - RtlAppendUnicodeToString(&KeyPath, L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); - - /* Find the first subkey (ie: the first driver or service) */ - i = 0; - DriverCell = CmpFindSubKeyByNumber(Hive, ServicesNode, i); - while (DriverCell != HCELL_NIL) - { - /* Make sure it's a driver of this start type */ - if (CmpIsLoadType(Hive, DriverCell, LoadType)) - { - /* Add it to the list */ - CmpAddDriverToList(Hive, - DriverCell, - GroupOrderCell, - &KeyPath, - DriverListHead); - - } - - /* Try the next subkey */ - DriverCell = CmpFindSubKeyByNumber(Hive, ServicesNode, ++i); - } - - /* Check if we have a boot file system */ - if (BootFileSystem) - { - /* Find it */ - RtlInitUnicodeString(&UnicodeString, BootFileSystem); - DriverCell = CmpFindSubKeyByName(Hive, ServicesNode, &UnicodeString); - if (DriverCell != HCELL_NIL) - { - /* Always add it to the list */ - CmpAddDriverToList(Hive, - DriverCell, - GroupOrderCell, - &KeyPath, - DriverListHead); - - /* Mark it as critical so it always loads */ - FsNode = CONTAINING_RECORD(DriverListHead->Flink, - BOOT_DRIVER_NODE, - ListEntry.Link); - FsNode->ErrorControl = SERVICE_ERROR_CRITICAL; - } - } - - /* We're done! */ - return TRUE; -} - -BOOLEAN -NTAPI -CmpDoSort(IN PLIST_ENTRY DriverListHead, - IN PUNICODE_STRING OrderList) -{ - PWCHAR Current, End = NULL; - PLIST_ENTRY NextEntry; - UNICODE_STRING GroupName; - PBOOT_DRIVER_NODE CurrentNode; - - /* We're going from end to start, so get to the last group and keep going */ - Current = &OrderList->Buffer[OrderList->Length / sizeof(WCHAR)]; - while (Current > OrderList->Buffer) - { - /* Scan the current string */ - do - { - if (*Current == UNICODE_NULL) End = Current; - } while ((*(--Current - 1) != UNICODE_NULL) && (Current != OrderList->Buffer)); - - /* This is our cleaned up string for this specific group */ - ASSERT(End != NULL); - GroupName.Length = (End - Current) * sizeof(WCHAR); - GroupName.MaximumLength = GroupName.Length; - GroupName.Buffer = Current; - - /* Now loop the driver list */ - NextEntry = DriverListHead->Flink; - while (NextEntry != DriverListHead) - { - /* Get this node */ - CurrentNode = CONTAINING_RECORD(NextEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - - /* Get the next entry now since we'll do a relink */ - NextEntry = CurrentNode->ListEntry.Link.Flink; - - /* Is there a group name and does it match the current group? */ - if ((CurrentNode->Group.Buffer) && - (RtlEqualUnicodeString(&GroupName, &CurrentNode->Group, TRUE))) - { - /* Remove from this location and re-link in the new one */ - RemoveEntryList(&CurrentNode->ListEntry.Link); - InsertHeadList(DriverListHead, &CurrentNode->ListEntry.Link); - } - } - - /* Move on */ - Current--; - } - - /* All done */ - return TRUE; -} - -BOOLEAN -NTAPI -CmpSortDriverList(IN PHHIVE Hive, - IN HCELL_INDEX ControlSet, - IN PLIST_ENTRY DriverListHead) -{ - HCELL_INDEX Controls, GroupOrder, ListCell; - UNICODE_STRING Name, DependList; - PCM_KEY_VALUE ListNode; - ULONG Length; - PCM_KEY_NODE Node; - ASSERT(Hive->ReleaseCellRoutine == NULL); - - /* Open the control key */ - Node = HvGetCell(Hive, ControlSet); - ASSERT(Node); - RtlInitUnicodeString(&Name, L"Control"); - Controls = CmpFindSubKeyByName(Hive, Node, &Name); - if (Controls == HCELL_NIL) return FALSE; - - /* Open the service group order */ - Node = HvGetCell(Hive, Controls); - ASSERT(Node); - RtlInitUnicodeString(&Name, L"ServiceGroupOrder"); - GroupOrder = CmpFindSubKeyByName(Hive, Node, &Name); - if (GroupOrder == HCELL_NIL) return FALSE; - - /* Open the list key */ - Node = HvGetCell(Hive, GroupOrder); - ASSERT(Node); - RtlInitUnicodeString(&Name, L"list"); - ListCell = CmpFindValueByName(Hive, Node, &Name); - if (ListCell == HCELL_NIL) return FALSE; - - /* Now read the actual list */ - ListNode = HvGetCell(Hive, ListCell); - ASSERT(ListNode); - if (ListNode->Type != REG_MULTI_SZ) return FALSE; - - /* Copy it into a buffer */ - DependList.Buffer = (PWCHAR)CmpValueToData(Hive, ListNode, &Length); - if (!DependList.Buffer) return FALSE; - DependList.Length = DependList.MaximumLength = Length - sizeof(UNICODE_NULL); - - /* And start the recurive sort algorithm */ - return CmpDoSort(DriverListHead, &DependList); -} - -BOOLEAN -NTAPI -CmpOrderGroup(IN PBOOT_DRIVER_NODE StartNode, - IN PBOOT_DRIVER_NODE EndNode) -{ - PBOOT_DRIVER_NODE CurrentNode, PreviousNode; - PLIST_ENTRY ListEntry; - - /* Base case, nothing to do */ - if (StartNode == EndNode) return TRUE; - - /* Loop the nodes */ - CurrentNode = StartNode; - do - { - /* Save this as the previous node */ - PreviousNode = CurrentNode; - - /* And move to the next one */ - ListEntry = CurrentNode->ListEntry.Link.Flink; - CurrentNode = CONTAINING_RECORD(ListEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - - /* Check if the previous driver had a bigger tag */ - if (PreviousNode->Tag > CurrentNode->Tag) - { - /* Check if we need to update the tail */ - if (CurrentNode == EndNode) - { - /* Update the tail */ - ListEntry = CurrentNode->ListEntry.Link.Blink; - EndNode = CONTAINING_RECORD(ListEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - } - - /* Remove this driver since we need to move it */ - RemoveEntryList(&CurrentNode->ListEntry.Link); - - /* Keep looping until we find a driver with a lower tag than ours */ - while ((PreviousNode->Tag > CurrentNode->Tag) && (PreviousNode != StartNode)) - { - /* We'll be re-inserted at this spot */ - ListEntry = PreviousNode->ListEntry.Link.Blink; - PreviousNode = CONTAINING_RECORD(ListEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - } - - /* Do the insert in the new location */ - InsertTailList(&PreviousNode->ListEntry.Link, &CurrentNode->ListEntry.Link); - - /* Update the head, if needed */ - if (PreviousNode == StartNode) StartNode = CurrentNode; - } - } while (CurrentNode != EndNode); - - /* All done */ - return TRUE; -} - -BOOLEAN -NTAPI -CmpResolveDriverDependencies(IN PLIST_ENTRY DriverListHead) -{ - PLIST_ENTRY NextEntry; - PBOOT_DRIVER_NODE StartNode, EndNode, CurrentNode; - - /* Loop the list */ - NextEntry = DriverListHead->Flink; - while (NextEntry != DriverListHead) - { - /* Find the first entry */ - StartNode = CONTAINING_RECORD(NextEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - do - { - /* Find the last entry */ - EndNode = CONTAINING_RECORD(NextEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - - /* Get the next entry */ - NextEntry = NextEntry->Flink; - CurrentNode = CONTAINING_RECORD(NextEntry, - BOOT_DRIVER_NODE, - ListEntry.Link); - - /* If the next entry is back to the top, break out */ - if (NextEntry == DriverListHead) break; - - /* Otherwise, check if this entry is equal */ - if (!RtlEqualUnicodeString(&StartNode->Group, - &CurrentNode->Group, - TRUE)) - { - /* It is, so we've detected a cycle, break out */ - break; - } - } while (NextEntry != DriverListHead); - - /* Now we have the correct start and end pointers, so do the sort */ - CmpOrderGroup(StartNode, EndNode); - } - - /* We're done */ - return TRUE; -} - -/* EOF */ diff --git a/ntoskrnl/config/cmdata.c b/ntoskrnl/config/cmdata.c index 6dbf2a0380d..b3df10ce438 100644 --- a/ntoskrnl/config/cmdata.c +++ b/ntoskrnl/config/cmdata.c @@ -11,8 +11,7 @@ #include "ntoskrnl.h" #define NDEBUG #include "debug.h" -#include "./../mm/ARM3/miarm.h" - + /* GLOBALS *******************************************************************/ ULONG DummyData; @@ -253,7 +252,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"DynamicMemory", - &MmDynamicPfn, + &DummyData, NULL, NULL }, @@ -261,7 +260,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"Mirroring", - &MmMirroring, + &DummyData, NULL, NULL }, @@ -274,6 +273,14 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = NULL }, + { + L"Session Manager\\Memory Management", + L"SessionViewSize", + &DummyData, + NULL, + NULL + }, + { L"Session Manager\\Memory Management", L"SessionImageSize", @@ -293,7 +300,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"PoolUsageMaximum", - &MmConsumedPoolPercentage, + &DummyData, NULL, NULL }, @@ -301,7 +308,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"MapAllocationFragment", - &MmAllocationFragment, + &DummyData, NULL, NULL }, @@ -309,7 +316,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"PagedPoolSize", - &MmSizeOfPagedPoolInBytes, + &DummyData, NULL, NULL }, @@ -317,7 +324,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"NonPagedPoolSize", - &MmSizeOfNonPagedPoolInBytes, + &DummyData, NULL, NULL }, @@ -333,7 +340,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"LargeSystemCache", - &MmLargeSystemCache, + &DummyData, NULL, NULL }, @@ -349,7 +356,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"SystemPages", - &MmNumberOfSystemPtes, + &DummyData, NULL, NULL }, @@ -357,7 +364,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"LowMemoryThreshold", - &MmLowMemoryThreshold, + &DummyData, NULL, NULL }, @@ -365,7 +372,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"HighMemoryThreshold", - &MmHighMemoryThreshold, + &DummyData, NULL, NULL }, @@ -389,7 +396,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"SecondLevelDataCache", - &MmSecondaryColors, + &DummyData, NULL, NULL }, @@ -397,7 +404,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"ClearPageFileAtShutdown", - &MmZeroPageFile, + &DummyData, NULL, NULL }, @@ -445,7 +452,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"ProtectNonPagedPool", - &MmProtectFreedNonPagedPool, + &DummyData, NULL, NULL }, @@ -453,7 +460,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"TrackLockedPages", - &MmTrackLockedPages, + &DummyData, NULL, NULL }, @@ -461,7 +468,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"TrackPtes", - &MmTrackPtes, + &DummyData, NULL, NULL }, @@ -469,15 +476,15 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"VerifyDrivers", - MmVerifyDriverBuffer, - &MmVerifyDriverBufferLength, - &MmVerifyDriverBufferType + &DummyData, + &DummyData, + &DummyData }, { L"Session Manager\\Memory Management", L"VerifyDriverLevel", - &MmVerifyDriverLevel, + &DummyData, NULL, NULL }, @@ -501,7 +508,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"EnforceWriteProtection", - &MmEnforceWriteProtection, + &DummyData, NULL, NULL }, @@ -509,7 +516,7 @@ CM_SYSTEM_CONTROL_VECTOR CmControlVector[] = { L"Session Manager\\Memory Management", L"MakeLowMemory", - &MmMakeLowMemory, + &DummyData, NULL, NULL }, diff --git a/ntoskrnl/config/cmhvlist.c b/ntoskrnl/config/cmhvlist.c index 8fb2636f3dc..f4e97814bbd 100644 --- a/ntoskrnl/config/cmhvlist.c +++ b/ntoskrnl/config/cmhvlist.c @@ -14,11 +14,4 @@ /* FUNCTIONS *****************************************************************/ -NTSTATUS -NTAPI -CmpAddToHiveFileList(IN PCMHIVE Hive) -{ - return STATUS_SUCCESS; -} - /* EOF */ \ No newline at end of file diff --git a/ntoskrnl/config/cminit.c b/ntoskrnl/config/cminit.c index be7efc1660f..154ba1530b6 100644 --- a/ntoskrnl/config/cminit.c +++ b/ntoskrnl/config/cminit.c @@ -119,10 +119,12 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, if (!Hive->ViewLock) return STATUS_INSUFFICIENT_RESOURCES; /* Allocate the flush lock */ +#if 0 Hive->FlusherLock = ExAllocatePoolWithTag(NonPagedPool, sizeof(ERESOURCE), TAG_CM); if (!Hive->FlusherLock) return STATUS_INSUFFICIENT_RESOURCES; +#endif /* Setup the handles */ Hive->FileHandles[HFILE_TYPE_PRIMARY] = Primary; @@ -134,7 +136,7 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, Hive->ViewLockOwner = NULL; /* Initialize the flush lock */ - ExInitializeResourceLite(Hive->FlusherLock); + ExInitializePushLock((PULONG_PTR)&Hive->FlusherLock); /* Setup hive locks */ ExInitializePushLock((PULONG_PTR)&Hive->HiveLock); @@ -191,7 +193,9 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, { /* Clear allocations and fail */ ExFreePool(Hive->ViewLock); +#if 0 ExFreePool(Hive->FlusherLock); +#endif ExFreePool(Hive); return Status; } @@ -207,7 +211,9 @@ CmpInitializeHive(OUT PCMHIVE *RegistryHive, { /* Free all alocations */ ExFreePool(Hive->ViewLock); +#if 0 ExFreePool(Hive->FlusherLock); +#endif ExFreePool(Hive); return STATUS_REGISTRY_CORRUPT; } diff --git a/ntoskrnl/config/cmkcbncb.c b/ntoskrnl/config/cmkcbncb.c index a26de07cf1b..5e7060d61c4 100644 --- a/ntoskrnl/config/cmkcbncb.c +++ b/ntoskrnl/config/cmkcbncb.c @@ -1135,62 +1135,3 @@ DelistKeyBodyFromKCB(IN PCM_KEY_BODY KeyBody, /* Unlock it it if we did a manual lock */ if (!LockHeld) CmpReleaseKcbLock(KeyBody->KeyControlBlock); } - -VOID -NTAPI -CmpFlushNotifiesOnKeyBodyList(IN PCM_KEY_CONTROL_BLOCK Kcb, - IN BOOLEAN LockHeld) -{ - PLIST_ENTRY NextEntry, ListHead; - PCM_KEY_BODY KeyBody; - - /* Sanity check */ - LockHeld ? CMP_ASSERT_EXCLUSIVE_REGISTRY_LOCK() : CmpIsKcbLockedExclusive(Kcb); - while (TRUE) - { - /* Is the list empty? */ - ListHead = &Kcb->KeyBodyListHead; - if (!IsListEmpty(ListHead)) - { - /* Loop the list */ - NextEntry = ListHead->Flink; - while (NextEntry != ListHead) - { - /* Get the key body */ - KeyBody = CONTAINING_RECORD(NextEntry, CM_KEY_BODY, KeyBodyList); - ASSERT(KeyBody->Type == '20yk'); - - /* Check for notifications */ - if (KeyBody->NotifyBlock) - { - /* Is the lock held? */ - if (LockHeld) - { - /* Flush it */ - CmpFlushNotify(KeyBody, LockHeld); - ASSERT(KeyBody->NotifyBlock == NULL); - continue; - } - - /* Lock isn't held, so we need to take a reference */ - if (ObReferenceObjectSafe(KeyBody)) - { - /* Now we can flush */ - CmpFlushNotify(KeyBody, LockHeld); - ASSERT(KeyBody->NotifyBlock == NULL); - - /* Release the reference we took */ - ObDereferenceObjectDeferDelete(KeyBody); - continue; - } - } - - /* Try the next entry */ - NextEntry = NextEntry->Flink; - } - } - - /* List has been parsed, exit */ - break; - } -} diff --git a/ntoskrnl/config/cmparse.c b/ntoskrnl/config/cmparse.c index 82635445dda..42d737908a0 100644 --- a/ntoskrnl/config/cmparse.c +++ b/ntoskrnl/config/cmparse.c @@ -414,6 +414,15 @@ CmpDoCreate(IN PHHIVE Hive, LARGE_INTEGER TimeStamp; PCM_KEY_NODE KeyNode; + /* Sanity check */ +#if 0 + ASSERT((CmpIsKcbLockedExclusive(ParentKcb) == TRUE) || + (CmpTestRegistryLockExclusive() == TRUE)); +#endif + + /* Acquire the flusher lock */ + ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock); + /* Check if the parent is being deleted */ if (ParentKcb->Delete) { @@ -546,6 +555,7 @@ CmpDoCreate(IN PHHIVE Hive, Exit: /* Release the flusher lock and return status */ + ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock); return Status; } @@ -737,6 +747,9 @@ CmpCreateLinkNode(IN PHHIVE Hive, LARGE_INTEGER TimeStamp; PCM_KEY_NODE KeyNode; PCM_KEY_CONTROL_BLOCK Kcb = ParentKcb; +#if 0 + CMP_ASSERT_REGISTRY_LOCK(); +#endif /* Link nodes only allowed on the master */ if (Hive != &CmiVolatileHive->Hive) @@ -746,6 +759,10 @@ CmpCreateLinkNode(IN PHHIVE Hive, return STATUS_ACCESS_DENIED; } + /* Acquire the flusher locks */ + ExAcquirePushLockShared((PVOID)&((PCMHIVE)Hive)->FlusherLock); + ExAcquirePushLockShared((PVOID)&((PCMHIVE)Context->ChildHive.KeyHive)->FlusherLock); + /* Check if the parent is being deleted */ if (ParentKcb->Delete) { @@ -947,6 +964,8 @@ CmpCreateLinkNode(IN PHHIVE Hive, Exit: /* Release the flusher locks and return status */ + ExReleasePushLock((PVOID)&((PCMHIVE)Context->ChildHive.KeyHive)->FlusherLock); + ExReleasePushLock((PVOID)&((PCMHIVE)Hive)->FlusherLock); return Status; } diff --git a/ntoskrnl/config/cmsysini.c b/ntoskrnl/config/cmsysini.c index 3587efe7326..0326e88e619 100644 --- a/ntoskrnl/config/cmsysini.c +++ b/ntoskrnl/config/cmsysini.c @@ -1,13 +1,12 @@ /* * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory + * LICENSE: GPL - See COPYING in the top level directory * FILE: ntoskrnl/config/cmsysini.c * PURPOSE: Configuration Manager - System Initialization Code - * PROGRAMMERS: ReactOS Portable Systems Group - * Alex Ionescu (alex.ionescu@reactos.org) + * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) */ -/* INCLUDES *******************************************************************/ +/* INCLUDES ******************************************************************/ #include "ntoskrnl.h" #define NDEBUG @@ -34,7 +33,7 @@ ULONG CmpTraceLevel = 0; extern LONG CmpFlushStarveWriters; extern BOOLEAN CmFirstTime; -/* FUNCTIONS ******************************************************************/ +/* FUNCTIONS *****************************************************************/ VOID NTAPI @@ -1575,162 +1574,6 @@ CmInitSystem1(VOID) return TRUE; } -VOID -NTAPI -CmpFreeDriverList(IN PHHIVE Hive, - IN PLIST_ENTRY DriverList) -{ - PLIST_ENTRY NextEntry, OldEntry; - PBOOT_DRIVER_NODE DriverNode; - PAGED_CODE(); - - /* Parse the current list */ - NextEntry = DriverList->Flink; - while (NextEntry != DriverList) - { - /* Get the driver node */ - DriverNode = CONTAINING_RECORD(NextEntry, BOOT_DRIVER_NODE, ListEntry.Link); - - /* Get the next entry now, since we're going to free it later */ - OldEntry = NextEntry; - NextEntry = NextEntry->Flink; - - /* Was there a name? */ - if (DriverNode->Name.Buffer) - { - /* Free it */ - CmpFree(DriverNode->Name.Buffer, DriverNode->Name.Length); - } - - /* Was there a registry path? */ - if (DriverNode->ListEntry.RegistryPath.Buffer) - { - /* Free it */ - CmpFree(DriverNode->ListEntry.RegistryPath.Buffer, - DriverNode->ListEntry.RegistryPath.MaximumLength); - } - - /* Was there a file path? */ - if (DriverNode->ListEntry.FilePath.Buffer) - { - /* Free it */ - CmpFree(DriverNode->ListEntry.FilePath.Buffer, - DriverNode->ListEntry.FilePath.MaximumLength); - } - - /* Now free the node, and move on */ - CmpFree(OldEntry, sizeof(BOOT_DRIVER_NODE)); - } -} - -PUNICODE_STRING* -NTAPI -CmGetSystemDriverList(VOID) -{ - LIST_ENTRY DriverList; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS Status; - PCM_KEY_BODY KeyBody; - PHHIVE Hive; - HCELL_INDEX RootCell, ControlCell; - HANDLE KeyHandle; - UNICODE_STRING KeyName; - PLIST_ENTRY NextEntry; - ULONG i; - PUNICODE_STRING* ServicePath = NULL; - BOOLEAN Success, AutoSelect; - PBOOT_DRIVER_LIST_ENTRY DriverEntry; - PAGED_CODE(); - - /* Initialize the driver list */ - InitializeListHead(&DriverList); - - /* Open the system hive key */ - RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\System"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes); - if (!NT_SUCCESS(Status)) return NULL; - - /* Reference the key object to get the root hive/cell to access directly */ - Status = ObReferenceObjectByHandle(KeyHandle, - KEY_QUERY_VALUE, - CmpKeyObjectType, - KernelMode, - (PVOID*)&KeyBody, - NULL); - if (!NT_SUCCESS(Status)) - { - /* Fail */ - NtClose(KeyHandle); - return NULL; - } - - /* Do all this under the registry lock */ - CmpLockRegistryExclusive(); - - /* Get the hive and key cell */ - Hive = KeyBody->KeyControlBlock->KeyHive; - RootCell = KeyBody->KeyControlBlock->KeyCell; - - /* Open the current control set key */ - RtlInitUnicodeString(&KeyName, L"Current"); - ControlCell = CmpFindControlSet(Hive, RootCell, &KeyName, &AutoSelect); - if (ControlCell == HCELL_NIL) goto EndPath; - - /* Find all system drivers */ - Success = CmpFindDrivers(Hive, ControlCell, SystemLoad, NULL, &DriverList); - if (!Success) goto EndPath; - - /* Sort by group/tag */ - if (!CmpSortDriverList(Hive, ControlCell, &DriverList)) goto EndPath; - - /* Remove circular dependencies (cycles) and sort */ - if (!CmpResolveDriverDependencies(&DriverList)) goto EndPath; - - /* Loop the list to count drivers */ - for (i = 0, NextEntry = DriverList.Flink; - NextEntry != &DriverList; - i++, NextEntry = NextEntry->Flink); - - /* Allocate the array */ - ServicePath = ExAllocatePool(NonPagedPool, (i + 1) * sizeof(PUNICODE_STRING)); - if (!ServicePath) KeBugCheckEx(CONFIG_INITIALIZATION_FAILED, 2, 1, 0, 0); - - /* Loop the driver list */ - for (i = 0, NextEntry = DriverList.Flink; - NextEntry != &DriverList; - i++, NextEntry = NextEntry->Flink) - { - /* Get the entry */ - DriverEntry = CONTAINING_RECORD(NextEntry, BOOT_DRIVER_LIST_ENTRY, Link); - - /* Allocate the path for the caller and duplicate the registry path */ - ServicePath[i] = ExAllocatePool(NonPagedPool, sizeof(UNICODE_STRING)); - RtlDuplicateUnicodeString(RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE, - &DriverEntry->RegistryPath, - ServicePath[i]); - } - - /* Terminate the list */ - ServicePath[i] = NULL; - -EndPath: - /* Free the driver list if we had one */ - if (!IsListEmpty(&DriverList)) CmpFreeDriverList(Hive, &DriverList); - - /* Unlock the registry */ - CmpUnlockRegistry(); - - /* Close the key handle and dereference the object, then return the path */ - ObDereferenceObject(KeyBody); - NtClose(KeyHandle); - return ServicePath; -} - VOID NTAPI CmpLockRegistryExclusive(VOID) @@ -1928,5 +1771,3 @@ CmShutdownSystem(VOID) if (!CmFirstTime) CmpShutdownWorkers(); CmpDoFlushAll(TRUE); } - -/* EOF */ diff --git a/ntoskrnl/include/internal/cm.h b/ntoskrnl/include/internal/cm.h index 62f4010f20b..4880dc08026 100644 --- a/ntoskrnl/include/internal/cm.h +++ b/ntoskrnl/include/internal/cm.h @@ -1522,40 +1522,6 @@ CmSetLazyFlushState( IN BOOLEAN Enable ); -// -// Driver List Routines -// -PUNICODE_STRING* -NTAPI -CmGetSystemDriverList( - VOID -); - -BOOLEAN -NTAPI -CmpFindDrivers( - IN PHHIVE Hive, - IN HCELL_INDEX ControlSet, - IN SERVICE_LOAD_TYPE LoadType, - IN PWSTR BootFileSystem OPTIONAL, - IN PLIST_ENTRY DriverListHead -); - - -BOOLEAN -NTAPI -CmpSortDriverList( - IN PHHIVE Hive, - IN HCELL_INDEX ControlSet, - IN PLIST_ENTRY DriverListHead -); - -BOOLEAN -NTAPI -CmpResolveDriverDependencies( - IN PLIST_ENTRY DriverListHead -); - // // Global variables accessible from all of Cm // diff --git a/ntoskrnl/include/internal/i386/intrin_i.h b/ntoskrnl/include/internal/i386/intrin_i.h index 6cb2a7cbf0a..a78497b1871 100644 --- a/ntoskrnl/include/internal/i386/intrin_i.h +++ b/ntoskrnl/include/internal/i386/intrin_i.h @@ -42,11 +42,11 @@ Ke386SaveFpuState(IN PFX_SAVE_AREA SaveArea) extern ULONG KeI386FxsrPresent; if (KeI386FxsrPresent) { - __asm__ __volatile__ ("fxsave %0\n" : : "m"(*SaveArea)); + __asm__ __volatile__ ("fxsave %0\n" : : "m"(SaveArea)); } else { - __asm__ __volatile__ ("fnsave %0\n wait\n" : : "m"(*SaveArea)); + __asm__ __volatile__ ("fnsave %0\n wait\n" : : "m"(SaveArea)); } } @@ -136,27 +136,17 @@ Ke386FnInit(VOID) FORCEINLINE VOID -__sgdt(OUT PVOID Descriptor) +Ke386GetGlobalDescriptorTable(OUT PVOID Descriptor) { - __asm - { - mov eax, Descriptor - sgdt [eax] - } + __asm sgdt [Descriptor]; } -#define Ke386GetGlobalDescriptorTable __sgdt FORCEINLINE VOID -__lgdt(IN PVOID Descriptor) +Ke386SetGlobalDescriptorTable(IN PVOID Descriptor) { - __asm - { - mov eax, Descriptor - lgdt [eax] - } + __asm lgdt [Descriptor]; } -#define Ke386SetGlobalDescriptorTable __lgdt FORCEINLINE USHORT diff --git a/ntoskrnl/include/internal/io.h b/ntoskrnl/include/internal/io.h index 9398ef1d7ff..2519a8134d2 100644 --- a/ntoskrnl/include/internal/io.h +++ b/ntoskrnl/include/internal/io.h @@ -88,6 +88,21 @@ #define IopFreeMdlFromLookaside \ ObpFreeCapturedAttributes +// +// Returns the size of a CM_RESOURCE_LIST +// +#define CM_RESOURCE_LIST_SIZE(ResList) \ + (ResList->Count == 1) ? \ + FIELD_OFFSET( \ + CM_RESOURCE_LIST, \ + List[0].PartialResourceList. \ + PartialDescriptors[(ResList)-> \ + List[0]. \ + PartialResourceList. \ + Count]) \ + : \ + FIELD_OFFSET(CM_RESOURCE_LIST, List) + // // Determines if the IRP is Synchronous // @@ -380,33 +395,6 @@ typedef struct _LOAD_UNLOAD_PARAMS PDRIVER_OBJECT DriverObject; } LOAD_UNLOAD_PARAMS, *PLOAD_UNLOAD_PARAMS; -// -// Boot Driver List Entry -// -typedef struct _DRIVER_INFORMATION -{ - LIST_ENTRY Link; - PDRIVER_OBJECT DriverObject; - PBOOT_DRIVER_LIST_ENTRY DataTableEntry; - HANDLE ServiceHandle; - USHORT TagPosition; - ULONG Failed; - ULONG Processed; - NTSTATUS Status; -} DRIVER_INFORMATION, *PDRIVER_INFORMATION; - -// -// Boot Driver Node -// -typedef struct _BOOT_DRIVER_NODE -{ - BOOT_DRIVER_LIST_ENTRY ListEntry; - UNICODE_STRING Group; - UNICODE_STRING Name; - ULONG Tag; - ULONG ErrorControl; -} BOOT_DRIVER_NODE, *PBOOT_DRIVER_NODE; - // // List of Bus Type GUIDs // @@ -491,35 +479,11 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT PVOID Context; } DEVICETREE_TRAVERSE_CONTEXT, *PDEVICETREE_TRAVERSE_CONTEXT; -// -// Resource code -// -ULONG -NTAPI -IopCalculateResourceListSize( - IN PCM_RESOURCE_LIST ResourceList -); - -NTSTATUS -NTAPI -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode -); - // // PNP Routines // -NTSTATUS -NTAPI -PipCallDriverAddDevice( - IN PDEVICE_NODE DeviceNode, - IN BOOLEAN LoadDriver, - IN PDRIVER_OBJECT DriverObject -); - -NTSTATUS -NTAPI -IopInitializePlugPlayServices( +VOID +PnpInit( VOID ); @@ -558,12 +522,6 @@ IopGetSystemPowerDeviceObject( IN PDEVICE_OBJECT *DeviceObject ); -PDEVICE_NODE -NTAPI -PipAllocateDeviceNode( - IN PDEVICE_OBJECT PhysicalDeviceObject -); - NTSTATUS IopCreateDeviceNode( IN PDEVICE_NODE ParentNode, @@ -578,15 +536,6 @@ IopFreeDeviceNode( ); NTSTATUS -NTAPI -IopSynchronousCall( - IN PDEVICE_OBJECT DeviceObject, - IN PIO_STACK_LOCATION IoStackLocation, - OUT PVOID *Information -); - -NTSTATUS -NTAPI IopInitiatePnpIrp( IN PDEVICE_OBJECT DeviceObject, IN PIO_STATUS_BLOCK IoStatusBlock, @@ -651,66 +600,11 @@ IopOpenRegistryKeyEx( NTSTATUS NTAPI -IopGetRegistryValue( - IN HANDLE Handle, - IN PWSTR ValueName, - OUT PKEY_VALUE_FULL_INFORMATION *Information -); +IopGetRegistryValue(IN HANDLE Handle, + IN PWSTR ValueName, + OUT PKEY_VALUE_FULL_INFORMATION *Information); -NTSTATUS -NTAPI -IopCreateRegistryKeyEx( - OUT PHANDLE Handle, - IN HANDLE BaseHandle OPTIONAL, - IN PUNICODE_STRING KeyName, - IN ACCESS_MASK DesiredAccess, - IN ULONG CreateOptions, - OUT PULONG Disposition OPTIONAL -); -// -// PnP Routines -// -NTSTATUS -NTAPI -IopUpdateRootKey( - VOID -); - -NTSTATUS -NTAPI -PiInitCacheGroupInformation( - VOID -); - -USHORT -NTAPI -PpInitGetGroupOrderIndex( - IN HANDLE ServiceHandle -); - -USHORT -NTAPI -PipGetDriverTagPriority( - IN HANDLE ServiceHandle -); - -NTSTATUS -NTAPI -PnpRegMultiSzToUnicodeStrings( - IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation, - OUT PUNICODE_STRING *UnicodeStringList, - OUT PULONG UnicodeStringCount -); - -BOOLEAN -NTAPI -PnpRegSzToString( - IN PWCHAR RegSzData, - IN ULONG RegSzLength, - OUT PUSHORT StringLength OPTIONAL -); - // // Initialization Routines // @@ -736,12 +630,6 @@ IoInitSystem( // // Device/Volume Routines // -VOID -NTAPI -IopReadyDeviceObjects( - IN PDRIVER_OBJECT Driver -); - NTSTATUS FASTCALL IopInitializeDevice( @@ -1163,7 +1051,6 @@ IopStartRamdisk( // extern POBJECT_TYPE IoCompletionType; extern PDEVICE_NODE IopRootDeviceNode; -extern KSPIN_LOCK IopDeviceTreeLock; extern ULONG IopTraceLevel; extern GENERAL_LOOKASIDE IopMdlLookasideList; extern GENERIC_MAPPING IopCompletionMapping; @@ -1173,8 +1060,6 @@ extern HAL_DISPATCH _HalDispatchTable; extern LIST_ENTRY IopErrorLogListHead; extern ULONG IopNumTriageDumpDataBlocks; extern PVOID IopTriageDumpDataBlocks[64]; -extern PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList; -extern PDRIVER_OBJECT IopRootDriverObject; // // Inlined Functions diff --git a/ntoskrnl/io/iomgr/device.c b/ntoskrnl/io/iomgr/device.c index b9176ce276b..7434970734f 100644 --- a/ntoskrnl/io/iomgr/device.c +++ b/ntoskrnl/io/iomgr/device.c @@ -25,24 +25,6 @@ extern LIST_ENTRY IopTapeFsListHead; /* PRIVATE FUNCTIONS **********************************************************/ -VOID -NTAPI -IopReadyDeviceObjects(IN PDRIVER_OBJECT Driver) -{ - PAGED_CODE(); - PDEVICE_OBJECT DeviceObject; - - /* Set the driver as initialized */ - Driver->Flags |= DRVO_INITIALIZED; - DeviceObject = Driver->DeviceObject; - while (DeviceObject) - { - /* Set every device as initialized too */ - DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - DeviceObject = DeviceObject->NextDevice; - } -} - VOID NTAPI IopDeleteDevice(IN PVOID ObjectBody) diff --git a/ntoskrnl/io/iomgr/deviface.c b/ntoskrnl/io/iomgr/deviface.c index a9b5e475705..2b0789b5a60 100644 --- a/ntoskrnl/io/iomgr/deviface.c +++ b/ntoskrnl/io/iomgr/deviface.c @@ -20,180 +20,6 @@ static PWCHAR BaseKeyString = L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\DeviceClasses\\"; -static -NTSTATUS -OpenRegistryHandlesFromSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, - IN ACCESS_MASK DesiredAccess, - IN OPTIONAL PHANDLE GuidKey, - IN OPTIONAL PHANDLE DeviceKey, - IN OPTIONAL PHANDLE InstanceKey) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - WCHAR PathBuffer[MAX_PATH]; - UNICODE_STRING BaseKeyU; - UNICODE_STRING GuidString, SubKeyName, ReferenceString; - PWCHAR StartPosition, EndPosition; - HANDLE ClassesKey; - PHANDLE GuidKeyRealP, DeviceKeyRealP, InstanceKeyRealP; - HANDLE GuidKeyReal, DeviceKeyReal, InstanceKeyReal; - NTSTATUS Status; - - SubKeyName.Buffer = NULL; - - if (GuidKey != NULL) - GuidKeyRealP = GuidKey; - else - GuidKeyRealP = &GuidKeyReal; - - if (DeviceKey != NULL) - DeviceKeyRealP = DeviceKey; - else - DeviceKeyRealP = &DeviceKeyReal; - - if (InstanceKey != NULL) - InstanceKeyRealP = InstanceKey; - else - InstanceKeyRealP = &InstanceKeyReal; - - *GuidKeyRealP = INVALID_HANDLE_VALUE; - *DeviceKeyRealP = INVALID_HANDLE_VALUE; - *InstanceKeyRealP = INVALID_HANDLE_VALUE; - - BaseKeyU.Buffer = PathBuffer; - BaseKeyU.Length = 0; - BaseKeyU.MaximumLength = MAX_PATH * sizeof(WCHAR); - - RtlAppendUnicodeToString(&BaseKeyU, BaseKeyString); - - /* Open the DeviceClasses key */ - InitializeObjectAttributes(&ObjectAttributes, - &BaseKeyU, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - NULL, - NULL); - Status = ZwOpenKey(&ClassesKey, - DesiredAccess | KEY_ENUMERATE_SUB_KEYS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to open %wZ\n", &BaseKeyU); - goto cleanup; - } - - StartPosition = wcschr(SymbolicLinkName->Buffer, L'{'); - EndPosition = wcschr(SymbolicLinkName->Buffer, L'}'); - if (!StartPosition || !EndPosition || StartPosition > EndPosition) - { - DPRINT1("Bad symbolic link: %wZ\n", SymbolicLinkName); - return STATUS_INVALID_PARAMETER_1; - } - GuidString.Buffer = StartPosition; - GuidString.MaximumLength = GuidString.Length = (USHORT)((ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)StartPosition); - - InitializeObjectAttributes(&ObjectAttributes, - &GuidString, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - ClassesKey, - NULL); - Status = ZwOpenKey(GuidKeyRealP, - DesiredAccess | KEY_ENUMERATE_SUB_KEYS, - &ObjectAttributes); - ZwClose(ClassesKey); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to open %wZ%wZ (%x)\n", &BaseKeyU, &GuidString, Status); - goto cleanup; - } - - SubKeyName.Buffer = ExAllocatePool(PagedPool, SymbolicLinkName->Length); - if (!SubKeyName.Buffer) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - SubKeyName.MaximumLength = SymbolicLinkName->Length; - SubKeyName.Length = 0; - - RtlAppendUnicodeStringToString(&SubKeyName, - SymbolicLinkName); - - SubKeyName.Buffer[0] = L'#'; - SubKeyName.Buffer[1] = L'#'; - SubKeyName.Buffer[2] = L'?'; - SubKeyName.Buffer[3] = L'#'; - - ReferenceString.Buffer = wcsrchr(SubKeyName.Buffer, '\\'); - if (ReferenceString.Buffer != NULL) - { - ReferenceString.Buffer[0] = L'#'; - - SubKeyName.Length = (USHORT)((ULONG_PTR)(ReferenceString.Buffer) - (ULONG_PTR)SubKeyName.Buffer); - ReferenceString.Length = SymbolicLinkName->Length - SubKeyName.Length; - } - else - { - RtlInitUnicodeString(&ReferenceString, L"#"); - } - - InitializeObjectAttributes(&ObjectAttributes, - &SubKeyName, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - *GuidKeyRealP, - NULL); - Status = ZwOpenKey(DeviceKeyRealP, - DesiredAccess | KEY_ENUMERATE_SUB_KEYS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to open %wZ%wZ\\%wZ\n", &BaseKeyU, &GuidString, &SubKeyName); - goto cleanup; - } - - InitializeObjectAttributes(&ObjectAttributes, - &ReferenceString, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - *DeviceKeyRealP, - NULL); - Status = ZwOpenKey(InstanceKeyRealP, - DesiredAccess, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to open %wZ%wZ\\%wZ%\\%wZ (%x)\n", &BaseKeyU, &GuidString, &SubKeyName, &ReferenceString, Status); - goto cleanup; - } - - Status = STATUS_SUCCESS; - -cleanup: - if (SubKeyName.Buffer != NULL) - ExFreePool(SubKeyName.Buffer); - - if (NT_SUCCESS(Status)) - { - if (!GuidKey) - ZwClose(*GuidKeyRealP); - - if (!DeviceKey) - ZwClose(*DeviceKeyRealP); - - if (!InstanceKey) - ZwClose(*InstanceKeyRealP); - } - else - { - if (*GuidKeyRealP != INVALID_HANDLE_VALUE) - ZwClose(*GuidKeyRealP); - - if (*DeviceKeyRealP != INVALID_HANDLE_VALUE) - ZwClose(*DeviceKeyRealP); - - if (*InstanceKeyRealP != INVALID_HANDLE_VALUE) - ZwClose(*InstanceKeyRealP); - } - - return Status; -} /*++ * @name IoOpenDeviceInterfaceRegistryKey * @unimplemented @@ -224,37 +50,169 @@ IoOpenDeviceInterfaceRegistryKey(IN PUNICODE_STRING SymbolicLinkName, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DeviceInterfaceKey) { - HANDLE InstanceKey, DeviceParametersKey; - NTSTATUS Status; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING DeviceParametersU = RTL_CONSTANT_STRING(L"Device Parameters"); - - Status = OpenRegistryHandlesFromSymbolicLink(SymbolicLinkName, - KEY_CREATE_SUB_KEY, - NULL, - NULL, - &InstanceKey); - if (!NT_SUCCESS(Status)) - return Status; - - InitializeObjectAttributes(&ObjectAttributes, - &DeviceParametersU, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - InstanceKey, - NULL); - Status = ZwCreateKey(&DeviceParametersKey, - DesiredAccess, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_NON_VOLATILE, - NULL); - ZwClose(InstanceKey); - - if (NT_SUCCESS(Status)) - *DeviceInterfaceKey = DeviceParametersKey; - - return Status; + WCHAR StrBuff[MAX_PATH], PathBuff[MAX_PATH]; + PWCHAR Guid; + UNICODE_STRING EnumU = RTL_CONSTANT_STRING(ENUM_ROOT L"\\"); + UNICODE_STRING DevParamU = RTL_CONSTANT_STRING(L"\\Device Parameters"); + UNICODE_STRING PrefixU = RTL_CONSTANT_STRING(L"\\??\\"); + UNICODE_STRING KeyPath, KeyName; + UNICODE_STRING MatchableGuid; + HANDLE GuidKey, ChildKey; + ULONG Index = 0; + PKEY_BASIC_INFORMATION KeyInformation; + ULONG KeyInformationLength; + PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; + ULONG KeyValueInformationLength; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS Status; + ULONG RequiredLength; + + MatchableGuid.Length = 0; + MatchableGuid.Length += swprintf(StrBuff, + L"##?#%ls", + &SymbolicLinkName->Buffer[PrefixU.Length / sizeof(WCHAR)]); + StrBuff[++MatchableGuid.Length] = UNICODE_NULL; + + MatchableGuid.Buffer = StrBuff; + MatchableGuid.MaximumLength = MAX_PATH * sizeof(WCHAR); + MatchableGuid.Length = (MatchableGuid.Length-1) * sizeof(WCHAR); + + Guid = wcsstr(StrBuff, L"{"); + if (!Guid) + return STATUS_OBJECT_NAME_NOT_FOUND; + + KeyPath.Buffer = PathBuff; + KeyPath.Length = 0; + KeyPath.MaximumLength = MAX_PATH * sizeof(WCHAR); + + RtlAppendUnicodeToString(&KeyPath, BaseKeyString); + RtlAppendUnicodeToString(&KeyPath, Guid); + + InitializeObjectAttributes(&ObjectAttributes, + &KeyPath, + OBJ_CASE_INSENSITIVE, + 0, + NULL); + + Status = ZwOpenKey(&GuidKey, KEY_CREATE_SUB_KEY, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + return Status; + + while (TRUE) + { + Status = ZwEnumerateKey(GuidKey, + Index, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + ZwClose(GuidKey); + return STATUS_INSUFFICIENT_RESOURCES; + } + + Status = ZwEnumerateKey(GuidKey, + Index, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + { + ZwClose(GuidKey); + return STATUS_OBJECT_PATH_NOT_FOUND; + } + Index++; + + if (!NT_SUCCESS(Status)) + { + ZwClose(GuidKey); + return Status; + } + + KeyName.Length = KeyName.MaximumLength = KeyInformation->NameLength; + KeyName.Buffer = KeyInformation->Name; + + if (!RtlEqualUnicodeString(&KeyName, &MatchableGuid, TRUE)) + continue; + + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + GuidKey, + NULL); + Status = ZwOpenKey(&ChildKey, KEY_QUERY_VALUE, &ObjectAttributes); + ZwClose(GuidKey); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, L"DeviceInstance"); + Status = ZwQueryValueKey(ChildKey, + &KeyName, + KeyValuePartialInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyValueInformationLength = RequiredLength; + KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); + if (!KeyValueInformation) + { + ZwClose(ChildKey); + return Status; + } + + Status = ZwQueryValueKey(ChildKey, + &KeyName, + KeyValuePartialInformation, + KeyValueInformation, + KeyValueInformationLength, + &RequiredLength); + } + else + { + ZwClose(ChildKey); + return STATUS_OBJECT_PATH_NOT_FOUND; + } + ZwClose(ChildKey); + + if (!NT_SUCCESS(Status)) + return Status; + + KeyPath.Length = 0; + + KeyName.Length = KeyName.MaximumLength = KeyValueInformation->DataLength; + KeyName.Buffer = (PWCHAR)KeyValueInformation->Data; + + RtlAppendUnicodeStringToString(&KeyPath, &EnumU); + RtlAppendUnicodeStringToString(&KeyPath, &KeyName); + RtlAppendUnicodeStringToString(&KeyPath, &DevParamU); + + InitializeObjectAttributes(&ObjectAttributes, + &KeyPath, + OBJ_CASE_INSENSITIVE, + 0, + NULL); + Status = ZwCreateKey(DeviceInterfaceKey, + DesiredAccess, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_NON_VOLATILE, + NULL); + return Status; + } + + return STATUS_OBJECT_PATH_NOT_FOUND; } /*++ @@ -447,11 +405,10 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, PKEY_BASIC_INFORMATION DeviceBi = NULL; PKEY_BASIC_INFORMATION ReferenceBi = NULL; PKEY_VALUE_PARTIAL_INFORMATION bip = NULL; - PKEY_VALUE_PARTIAL_INFORMATION PartialInfo; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; BOOLEAN FoundRightPDO = FALSE; - ULONG i = 0, j, Size, NeededLength, ActualLength, LinkedValue; + ULONG i = 0, j, Size; UNICODE_STRING ReturnBuffer = { 0, 0, NULL }; NTSTATUS Status; @@ -605,6 +562,7 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, /* We have to check if the interface is enabled, by * reading the Linked value in the Control subkey */ +#if 0 InitializeObjectAttributes( &ObjectAttributes, &Control, @@ -624,63 +582,17 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, } else if (!NT_SUCCESS(Status)) { - DPRINT1("ZwOpenKey() failed with status 0x%08lx\n", Status); - goto cleanup; - } - - RtlInitUnicodeString(&KeyName, L"Linked"); - Status = ZwQueryValueKey(ControlKey, - &KeyName, - KeyValuePartialInformation, - NULL, - 0, - &NeededLength); - if (Status == STATUS_BUFFER_TOO_SMALL) - { - ActualLength = NeededLength; - PartialInfo = ExAllocatePool(NonPagedPool, ActualLength); - if (!PartialInfo) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwQueryValueKey(ControlKey, - &KeyName, - KeyValuePartialInformation, - PartialInfo, - ActualLength, - &NeededLength); - if (!NT_SUCCESS(Status)) - { - DPRINT1("ZwQueryValueKey #2 failed (%x)\n", Status); - ExFreePool(PartialInfo); - goto cleanup; - } - - if (PartialInfo->Type != REG_DWORD || PartialInfo->DataLength != sizeof(ULONG)) - { - DPRINT1("Bad registry read\n"); - ExFreePool(PartialInfo); - goto cleanup; - } - - RtlCopyMemory(&LinkedValue, - PartialInfo->Data, - PartialInfo->DataLength); - - ExFreePool(PartialInfo); - if (LinkedValue == 0) - { - /* This interface isn't active */ - goto NextReferenceString; - } - } - else - { - DPRINT1("ZwQueryValueKey #1 failed (%x)\n", Status); + DPRINT("ZwOpenKey() failed with status 0x%08lx\n", Status); goto cleanup; } +#endif + /* FIXME: Read the Linked value + * If it doesn't exist => ERROR + * If it is not a REG_DWORD or Size != sizeof(ULONG) => ERROR + * If its value is 0, go to NextReferenceString + * At the moment, do as if it is active... + */ + DPRINT1("Checking if device is enabled is not implemented yet!\n"); } /* Read the SymbolicLink string and add it into SymbolicLinkList */ @@ -759,17 +671,16 @@ IoGetDeviceInterfaces(IN CONST GUID *InterfaceClassGuid, DPRINT("RtlAppendUnicodeStringToString() failed with status 0x%08lx\n", Status); goto cleanup; } - /* RtlAppendUnicodeStringToString added a NULL at the end of the - * destination string, but didn't increase the Length field. - * Do it for it. - */ - ReturnBuffer.Length += sizeof(WCHAR); + /* RtlAppendUnicodeStringToString added a NULL at the end of the + * destination string, but didn't increase the Length field. + * Do it for it. + */ + ReturnBuffer.Length += sizeof(WCHAR); NextReferenceString: ExFreePool(ReferenceBi); ReferenceBi = NULL; - if (bip) - ExFreePool(bip); + ExFreePool(bip); bip = NULL; if (ReferenceKey != INVALID_HANDLE_VALUE) { @@ -806,11 +717,8 @@ NextReferenceString: Status = STATUS_INSUFFICIENT_RESOURCES; goto cleanup; } - if (ReturnBuffer.Buffer) - { - RtlCopyMemory(NewBuffer, ReturnBuffer.Buffer, ReturnBuffer.Length); - ExFreePool(ReturnBuffer.Buffer); - } + RtlCopyMemory(NewBuffer, ReturnBuffer.Buffer, ReturnBuffer.Length); + ExFreePool(ReturnBuffer.Buffer); ReturnBuffer.Buffer = NewBuffer; } ReturnBuffer.Buffer[ReturnBuffer.Length / sizeof(WCHAR)] = UNICODE_NULL; @@ -1226,10 +1134,7 @@ IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, PWCHAR EndPosition; NTSTATUS Status; LPCGUID EventGuid; - HANDLE InstanceHandle, ControlHandle; - UNICODE_STRING KeyName; - OBJECT_ATTRIBUTES ObjectAttributes; - ULONG LinkedValue; + if (SymbolicLinkName == NULL) return STATUS_INVALID_PARAMETER_1; @@ -1251,51 +1156,6 @@ IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, SymLink.Buffer = SymbolicLinkName->Buffer; SymLink.MaximumLength = SymLink.Length = (USHORT)((ULONG_PTR)(EndPosition + 1) - (ULONG_PTR)SymLink.Buffer); DPRINT("IoSetDeviceInterfaceState('%wZ', %d)\n", SymbolicLinkName, Enable); - - Status = OpenRegistryHandlesFromSymbolicLink(SymbolicLinkName, - KEY_CREATE_SUB_KEY, - NULL, - NULL, - &InstanceHandle); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, L"Control"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - InstanceHandle, - NULL); - Status = ZwCreateKey(&ControlHandle, - KEY_SET_VALUE, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - NULL); - ZwClose(InstanceHandle); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to create the Control subkey\n"); - return Status; - } - - LinkedValue = (Enable ? 1 : 0); - - RtlInitUnicodeString(&KeyName, L"Linked"); - Status = ZwSetValueKey(ControlHandle, - &KeyName, - 0, - REG_DWORD, - &LinkedValue, - sizeof(ULONG)); - ZwClose(ControlHandle); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to write the Linked value\n"); - return Status; - } - /* Get pointer to the PDO */ Status = IoGetDeviceObjectPointer( &SymLink, diff --git a/ntoskrnl/io/iomgr/driver.c b/ntoskrnl/io/iomgr/driver.c index 1ab54458526..ef1b78969fb 100644 --- a/ntoskrnl/io/iomgr/driver.c +++ b/ntoskrnl/io/iomgr/driver.c @@ -34,9 +34,6 @@ POBJECT_TYPE IoDriverObjectType = NULL; extern BOOLEAN ExpInTextModeSetup; extern BOOLEAN PnpSystemInit; -USHORT IopGroupIndex; -PLIST_ENTRY IopGroupTable; - /* PRIVATE FUNCTIONS **********************************************************/ NTSTATUS NTAPI @@ -200,7 +197,6 @@ IopDisplayLoadingMessage(PUNICODE_STRING ServiceName) UNICODE_STRING DotSys = RTL_CONSTANT_STRING(L".SYS"); if (ExpInTextModeSetup) return; - if (!KeLoaderBlock) return; RtlUpcaseUnicodeString(ServiceName, ServiceName, FALSE); snprintf(TextBuffer, sizeof(TextBuffer), "%s%sSystem32\\Drivers\\%wZ%s\n", @@ -438,6 +434,7 @@ IopInitializeDriverModule( UNICODE_STRING RegistryKey; PDRIVER_INITIALIZE DriverEntry; PDRIVER_OBJECT Driver; + PDEVICE_OBJECT DeviceObject; NTSTATUS Status; DriverEntry = ModuleObject->EntryPoint; @@ -494,7 +491,14 @@ IopInitializeDriverModule( } /* Set the driver as initialized */ - IopReadyDeviceObjects(Driver); + Driver->Flags |= DRVO_INITIALIZED; + DeviceObject = Driver->DeviceObject; + while (DeviceObject) + { + /* Set every device as initialized too */ + DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + DeviceObject = DeviceObject->NextDevice; + } if (PnpSystemInit) IopReinitializeDrivers(); @@ -876,17 +880,14 @@ VOID FASTCALL IopInitializeBootDrivers(VOID) { - PLIST_ENTRY ListHead, NextEntry, NextEntry2; + PLIST_ENTRY ListHead, NextEntry; PLDR_DATA_TABLE_ENTRY LdrEntry; PDEVICE_NODE DeviceNode; PDRIVER_OBJECT DriverObject; LDR_DATA_TABLE_ENTRY ModuleObject; NTSTATUS Status; UNICODE_STRING DriverName; - ULONG i, Index; - PDRIVER_INFORMATION DriverInfo, DriverInfoTag; - HANDLE KeyHandle; - PBOOT_DRIVER_LIST_ENTRY BootEntry; + DPRINT("IopInitializeBootDrivers()\n"); /* Use IopRootDeviceNode for now */ @@ -930,19 +931,6 @@ IopInitializeBootDrivers(VOID) return; } - /* Get highest group order index */ - IopGroupIndex = PpInitGetGroupOrderIndex(NULL); - if (IopGroupIndex == 0xFFFF) ASSERT(FALSE); - - /* Allocate the group table */ - IopGroupTable = ExAllocatePoolWithTag(PagedPool, - IopGroupIndex * sizeof(LIST_ENTRY), - TAG_IO); - if (IopGroupTable == NULL) ASSERT(FALSE); - - /* Initialize the group table lists */ - for (i = 0; i < IopGroupIndex; i++) InitializeListHead(&IopGroupTable[i]); - /* Loop the boot modules */ ListHead = &KeLoaderBlock->LoadOrderListHead; NextEntry = ListHead->Flink; @@ -952,83 +940,19 @@ IopInitializeBootDrivers(VOID) LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - - /* Check if the DLL needs to be initialized */ - if (LdrEntry->Flags & LDRP_DRIVER_DEPENDENT_DLL) - { - /* Call its entrypoint */ - MmCallDllInitialize(LdrEntry, NULL); - } - - /* Go to the next driver */ - NextEntry = NextEntry->Flink; - } - - /* Loop the boot drivers */ - ListHead = &KeLoaderBlock->BootDriverListHead; - NextEntry = ListHead->Flink; - while (ListHead != NextEntry) - { - /* Get the entry */ - BootEntry = CONTAINING_RECORD(NextEntry, - BOOT_DRIVER_LIST_ENTRY, - Link); - - /* Get the driver loader entry */ - LdrEntry = BootEntry->LdrEntry; - - /* Allocate our internal accounting structure */ - DriverInfo = ExAllocatePoolWithTag(PagedPool, - sizeof(DRIVER_INFORMATION), - TAG_IO); - if (DriverInfo) + + /* + * HACK: Make sure we're loading a driver + * (we should be using BootDriverListHead!) + */ + if (wcsstr(_wcsupr(LdrEntry->BaseDllName.Buffer), L".SYS")) { - /* Zero it and initialize it */ - RtlZeroMemory(DriverInfo, sizeof(DRIVER_INFORMATION)); - InitializeListHead(&DriverInfo->Link); - DriverInfo->DataTableEntry = BootEntry; - - /* Open the registry key */ - Status = IopOpenRegistryKeyEx(&KeyHandle, - NULL, - &BootEntry->RegistryPath, - KEY_READ); - if ((NT_SUCCESS(Status)) || /* ReactOS HACK for SETUPLDR */ - ((KeLoaderBlock->SetupLdrBlock) && (KeyHandle = (PVOID)1))) + /* Make sure we didn't load this driver already */ + if (!(LdrEntry->Flags & LDRP_ENTRY_INSERTED)) { - /* Save the handle */ - DriverInfo->ServiceHandle = KeyHandle; - - /* Get the group oder index */ - Index = PpInitGetGroupOrderIndex(KeyHandle); - - /* Get the tag position */ - DriverInfo->TagPosition = PipGetDriverTagPriority(KeyHandle); - - /* Insert it into the list, at the right place */ - ASSERT(Index < IopGroupIndex); - NextEntry2 = IopGroupTable[Index].Flink; - while (NextEntry2 != &IopGroupTable[Index]) - { - /* Get the driver info */ - DriverInfoTag = CONTAINING_RECORD(NextEntry2, - DRIVER_INFORMATION, - Link); - - /* Check if we found the right tag position */ - if (DriverInfoTag->TagPosition > DriverInfo->TagPosition) - { - /* We're done */ - break; - } - - /* Next entry */ - NextEntry2 = NextEntry2->Flink; - } - - /* Insert us right before the next entry */ - NextEntry2 = NextEntry2->Blink; - InsertHeadList(NextEntry2, &DriverInfo->Link); + DPRINT("Initializing bootdriver %wZ\n", &LdrEntry->BaseDllName); + /* Initialize it */ + IopInitializeBuiltinDriver(LdrEntry); } } @@ -1036,65 +960,10 @@ IopInitializeBootDrivers(VOID) NextEntry = NextEntry->Flink; } - /* Loop each group index */ - for (i = 0; i < IopGroupIndex; i++) - { - /* Loop each group table */ - NextEntry = IopGroupTable[i].Flink; - while (NextEntry != &IopGroupTable[i]) - { - /* Get the entry */ - DriverInfo = CONTAINING_RECORD(NextEntry, - DRIVER_INFORMATION, - Link); - - /* Get the driver loader entry */ - LdrEntry = DriverInfo->DataTableEntry->LdrEntry; - - /* Initialize it */ - IopInitializeBuiltinDriver(LdrEntry); - - /* Next entry */ - NextEntry = NextEntry->Flink; - } - } - /* In old ROS, the loader list became empty after this point. Simulate. */ InitializeListHead(&KeLoaderBlock->LoadOrderListHead); } -VOID -FASTCALL -IopInitializeSystemDrivers(VOID) -{ - PUNICODE_STRING *DriverList, *SavedList; - - /* No system drivers on the boot cd */ - if (KeLoaderBlock->SetupLdrBlock) return; - - /* Get the driver list */ - SavedList = DriverList = CmGetSystemDriverList(); - ASSERT(DriverList); - - /* Loop it */ - while (*DriverList) - { - /* Load the driver */ - ZwLoadDriver(*DriverList); - - /* Free the entry */ - RtlFreeUnicodeString(*DriverList); - ExFreePool(*DriverList); - - /* Next entry */ - InbvIndicateProgress(); - DriverList++; - } - - /* Free the list */ - ExFreePool(SavedList); -} - /* * IopUnloadDriver * @@ -1816,8 +1685,6 @@ IopLoadUnloadDriver(PLOAD_UNLOAD_PARAMS LoadParams) cur--; } - IopDisplayLoadingMessage(&ServiceName); - /* * Get service type. */ diff --git a/ntoskrnl/io/iomgr/drvrlist.c b/ntoskrnl/io/iomgr/drvrlist.c new file mode 100644 index 00000000000..e15aab2a2cd --- /dev/null +++ b/ntoskrnl/io/iomgr/drvrlist.c @@ -0,0 +1,561 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: GPL - See COPYING in the top level directory + * FILE: ntoskrnl/io/iomgr/drvrlist.c + * PURPOSE: Driver List support for Grouping, Tagging, Sorting, etc. + * PROGRAMMERS: + */ + +/* INCLUDES *******************************************************************/ + +#include +#define NDEBUG +#include + +typedef struct _SERVICE_GROUP +{ + LIST_ENTRY GroupListEntry; + UNICODE_STRING GroupName; + BOOLEAN ServicesRunning; + ULONG TagCount; + PULONG TagArray; +} SERVICE_GROUP, *PSERVICE_GROUP; + +typedef struct _SERVICE +{ + LIST_ENTRY ServiceListEntry; + UNICODE_STRING ServiceName; + UNICODE_STRING RegistryPath; + UNICODE_STRING ServiceGroup; + UNICODE_STRING ImagePath; + + ULONG Start; + ULONG Type; + ULONG ErrorControl; + ULONG Tag; + +/* BOOLEAN ServiceRunning;*/ // needed ?? +} SERVICE, *PSERVICE; + +#define TAG_RTLREGISTRY 'vrqR' + +/* GLOBALS ********************************************************************/ + +LIST_ENTRY GroupListHead = {NULL, NULL}; +LIST_ENTRY ServiceListHead = {NULL, NULL}; +extern BOOLEAN NoGuiBoot; + +VOID +FASTCALL +INIT_FUNCTION +IopDisplayLoadingMessage(PUNICODE_STRING ServiceName); + +/* PRIVATE FUNCTIONS **********************************************************/ + +static NTSTATUS NTAPI +IopGetGroupOrderList(PWSTR ValueName, + ULONG ValueType, + PVOID ValueData, + ULONG ValueLength, + PVOID Context, + PVOID EntryContext) +{ + PSERVICE_GROUP Group; + + DPRINT("IopGetGroupOrderList(%S, %x, 0x%p, %x, 0x%p, 0x%p)\n", + ValueName, ValueType, ValueData, ValueLength, Context, EntryContext); + + if (ValueType == REG_BINARY && + ValueData != NULL && + ValueLength >= sizeof(ULONG) && + ValueLength >= (*(PULONG)ValueData + 1) * sizeof(ULONG)) + { + Group = (PSERVICE_GROUP)Context; + Group->TagCount = ((PULONG)ValueData)[0]; + if (Group->TagCount > 0) + { + if (ValueLength >= (Group->TagCount + 1) * sizeof(ULONG)) + { + Group->TagArray = ExAllocatePool(NonPagedPool, Group->TagCount * sizeof(ULONG)); + if (Group->TagArray == NULL) + { + Group->TagCount = 0; + return STATUS_INSUFFICIENT_RESOURCES; + } + memcpy(Group->TagArray, (PULONG)ValueData + 1, Group->TagCount * sizeof(ULONG)); + } + else + { + Group->TagCount = 0; + return STATUS_UNSUCCESSFUL; + } + } + } + return STATUS_SUCCESS; +} + +static NTSTATUS NTAPI +IopCreateGroupListEntry(PWSTR ValueName, + ULONG ValueType, + PVOID ValueData, + ULONG ValueLength, + PVOID Context, + PVOID EntryContext) +{ + PSERVICE_GROUP Group; + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + NTSTATUS Status; + + + if (ValueType == REG_SZ) + { + DPRINT("GroupName: '%S'\n", (PWCHAR)ValueData); + + Group = ExAllocatePool(NonPagedPool, + sizeof(SERVICE_GROUP)); + if (Group == NULL) + { + return(STATUS_INSUFFICIENT_RESOURCES); + } + + RtlZeroMemory(Group, sizeof(SERVICE_GROUP)); + + if (!RtlCreateUnicodeString(&Group->GroupName, (PWSTR)ValueData)) + { + ExFreePool(Group); + return(STATUS_INSUFFICIENT_RESOURCES); + } + + RtlZeroMemory(&QueryTable, sizeof(QueryTable)); + QueryTable[0].Name = (PWSTR)ValueData; + QueryTable[0].QueryRoutine = IopGetGroupOrderList; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, + L"GroupOrderList", + QueryTable, + (PVOID)Group, + NULL); + DPRINT("%x %d %S\n", Status, Group->TagCount, (PWSTR)ValueData); + + InsertTailList(&GroupListHead, + &Group->GroupListEntry); + } + + return(STATUS_SUCCESS); +} + + +static NTSTATUS NTAPI +IopCreateServiceListEntry(PUNICODE_STRING ServiceName) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[7]; + PSERVICE Service; + NTSTATUS Status; + ULONG DefaultTag = MAXULONG; + + DPRINT("ServiceName: '%wZ'\n", ServiceName); + + /* Allocate service entry */ + Service = (PSERVICE)ExAllocatePool(NonPagedPool, sizeof(SERVICE)); + if (Service == NULL) + { + DPRINT1("ExAllocatePool() failed\n"); + return(STATUS_INSUFFICIENT_RESOURCES); + } + RtlZeroMemory(Service, sizeof(SERVICE)); + + /* Get service data */ + RtlZeroMemory(&QueryTable, + sizeof(QueryTable)); + + QueryTable[0].Name = L"Start"; + QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[0].EntryContext = &Service->Start; + + QueryTable[1].Name = L"Type"; + QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[1].EntryContext = &Service->Type; + + QueryTable[2].Name = L"ErrorControl"; + QueryTable[2].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; + QueryTable[2].EntryContext = &Service->ErrorControl; + + QueryTable[3].Name = L"Group"; + QueryTable[3].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[3].EntryContext = &Service->ServiceGroup; + + QueryTable[4].Name = L"ImagePath"; + QueryTable[4].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[4].EntryContext = &Service->ImagePath; + + QueryTable[5].Name = L"Tag"; + QueryTable[5].Flags = RTL_QUERY_REGISTRY_DIRECT; + QueryTable[5].EntryContext = &Service->Tag; + QueryTable[5].DefaultData = &DefaultTag; + QueryTable[5].DefaultType = REG_DWORD; + QueryTable[5].DefaultLength = sizeof(DefaultTag); + + Status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, + ServiceName->Buffer, + QueryTable, + NULL, + NULL); + if (!NT_SUCCESS(Status) || Service->Start > 1) + { + /* + * If something goes wrong during RtlQueryRegistryValues + * it'll just drop everything on the floor and return, + * so you have to check if the buffers were filled. + * Luckily we zerofilled the Service. + */ + if (Service->ServiceGroup.Buffer) + { + ExFreePoolWithTag(Service->ServiceGroup.Buffer, TAG_RTLREGISTRY); + } + if (Service->ImagePath.Buffer) + { + ExFreePoolWithTag(Service->ImagePath.Buffer, TAG_RTLREGISTRY); + } + ExFreePool(Service); + return(Status); + } + + /* Copy service name */ + Service->ServiceName.Length = ServiceName->Length; + Service->ServiceName.MaximumLength = ServiceName->Length + sizeof(WCHAR); + Service->ServiceName.Buffer = ExAllocatePool(NonPagedPool, + Service->ServiceName.MaximumLength); + RtlCopyMemory(Service->ServiceName.Buffer, + ServiceName->Buffer, + ServiceName->Length); + Service->ServiceName.Buffer[ServiceName->Length / sizeof(WCHAR)] = 0; + + /* Build registry path */ + Service->RegistryPath.MaximumLength = MAX_PATH * sizeof(WCHAR); + Service->RegistryPath.Buffer = ExAllocatePool(NonPagedPool, + MAX_PATH * sizeof(WCHAR)); + wcscpy(Service->RegistryPath.Buffer, + L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); + wcscat(Service->RegistryPath.Buffer, + Service->ServiceName.Buffer); + Service->RegistryPath.Length = wcslen(Service->RegistryPath.Buffer) * sizeof(WCHAR); + + DPRINT("ServiceName: '%wZ'\n", &Service->ServiceName); + DPRINT("RegistryPath: '%wZ'\n", &Service->RegistryPath); + DPRINT("ServiceGroup: '%wZ'\n", &Service->ServiceGroup); + DPRINT("ImagePath: '%wZ'\n", &Service->ImagePath); + DPRINT("Start %lx Type %lx Tag %lx ErrorControl %lx\n", + Service->Start, Service->Type, Service->Tag, Service->ErrorControl); + + /* Append service entry */ + InsertTailList(&ServiceListHead, + &Service->ServiceListEntry); + + return(STATUS_SUCCESS); +} + + +NTSTATUS INIT_FUNCTION +IoCreateDriverList(VOID) +{ + RTL_QUERY_REGISTRY_TABLE QueryTable[2]; + PKEY_BASIC_INFORMATION KeyInfo = NULL; + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING ServicesKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services"); + UNICODE_STRING SubKeyName; + HANDLE KeyHandle; + NTSTATUS Status; + ULONG Index; + + ULONG KeyInfoLength = 0; + ULONG ReturnedLength; + + DPRINT("IoCreateDriverList() called\n"); + + /* Initialize basic variables */ + InitializeListHead(&GroupListHead); + InitializeListHead(&ServiceListHead); + + /* Build group order list */ + RtlZeroMemory(&QueryTable, + sizeof(QueryTable)); + + QueryTable[0].Name = L"List"; + QueryTable[0].QueryRoutine = IopCreateGroupListEntry; + + Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL, + L"ServiceGroupOrder", + QueryTable, + NULL, + NULL); + if (!NT_SUCCESS(Status)) + return(Status); + + /* Enumerate services and create the service list */ + InitializeObjectAttributes(&ObjectAttributes, + &ServicesKeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = ZwOpenKey(&KeyHandle, + KEY_ENUMERATE_SUB_KEYS, + &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + + KeyInfoLength = sizeof(KEY_BASIC_INFORMATION) + MAX_PATH * sizeof(WCHAR); + KeyInfo = ExAllocatePool(NonPagedPool, KeyInfoLength); + if (KeyInfo == NULL) + { + ZwClose(KeyHandle); + return(STATUS_INSUFFICIENT_RESOURCES); + } + + Index = 0; + while (TRUE) + { + Status = ZwEnumerateKey(KeyHandle, + Index, + KeyBasicInformation, + KeyInfo, + KeyInfoLength, + &ReturnedLength); + if (NT_SUCCESS(Status)) + { + if (KeyInfo->NameLength < MAX_PATH * sizeof(WCHAR)) + { + + SubKeyName.Length = (USHORT)KeyInfo->NameLength; + SubKeyName.MaximumLength = (USHORT)KeyInfo->NameLength + sizeof(WCHAR); + SubKeyName.Buffer = KeyInfo->Name; + SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0; + + DPRINT("KeyName: '%wZ'\n", &SubKeyName); + IopCreateServiceListEntry(&SubKeyName); + } + } + + if (!NT_SUCCESS(Status)) + break; + + Index++; + } + + ExFreePool(KeyInfo); + ZwClose(KeyHandle); + + DPRINT("IoCreateDriverList() done\n"); + + return(STATUS_SUCCESS); +} + +NTSTATUS INIT_FUNCTION +IoDestroyDriverList(VOID) +{ + PSERVICE_GROUP CurrentGroup; + PSERVICE CurrentService; + PLIST_ENTRY NextEntry, TempEntry; + + DPRINT("IoDestroyDriverList() called\n"); + + /* Destroy the Group List */ + for (NextEntry = GroupListHead.Flink, TempEntry = NextEntry->Flink; + NextEntry != &GroupListHead; + NextEntry = TempEntry, TempEntry = NextEntry->Flink) + { + /* Get the entry */ + CurrentGroup = CONTAINING_RECORD(NextEntry, + SERVICE_GROUP, + GroupListEntry); + + /* Remove it from the list */ + RemoveEntryList(&CurrentGroup->GroupListEntry); + + /* Free buffers */ + ExFreePool(CurrentGroup->GroupName.Buffer); + if (CurrentGroup->TagArray) + ExFreePool(CurrentGroup->TagArray); + ExFreePool(CurrentGroup); + } + + /* Destroy the Service List */ + for (NextEntry = ServiceListHead.Flink, TempEntry = NextEntry->Flink; + NextEntry != &ServiceListHead; + NextEntry = TempEntry, TempEntry = NextEntry->Flink) + { + /* Get the entry */ + CurrentService = CONTAINING_RECORD(NextEntry, + SERVICE, + ServiceListEntry); + + /* Remove it from the list */ + RemoveEntryList(&CurrentService->ServiceListEntry); + + /* Free buffers */ + ExFreePool(CurrentService->ServiceName.Buffer); + ExFreePool(CurrentService->RegistryPath.Buffer); + if (CurrentService->ServiceGroup.Buffer) + ExFreePool(CurrentService->ServiceGroup.Buffer); + if (CurrentService->ImagePath.Buffer) + ExFreePool(CurrentService->ImagePath.Buffer); + ExFreePool(CurrentService); + } + + DPRINT("IoDestroyDriverList() done\n"); + + /* Return success */ + return STATUS_SUCCESS; +} + +static INIT_FUNCTION NTSTATUS +IopLoadDriver(PSERVICE Service) +{ + NTSTATUS Status = STATUS_UNSUCCESSFUL; + PUNICODE_STRING ImagePath = &Service->ImagePath; + PWCHAR ImageName; + UNICODE_STRING ImageNameU; + + ImageName = wcsrchr(ImagePath->Buffer, L'\\'); + if (!ImageName) + ImageName = ImagePath->Buffer; + else + ImageName++; + + RtlInitUnicodeString(&ImageNameU, ImageName); + + IopDisplayLoadingMessage(&ImageNameU); + + Status = ZwLoadDriver(&Service->RegistryPath); + IopBootLog(&Service->ImagePath, NT_SUCCESS(Status) ? TRUE : FALSE); + if (!NT_SUCCESS(Status)) + { + DPRINT("IopLoadDriver() failed (Status %lx)\n", Status); +#if 0 + if (Service->ErrorControl == 1) + { + /* Log error */ + } + else if (Service->ErrorControl == 2) + { + if (IsLastKnownGood == FALSE) + { + /* Boot last known good configuration */ + } + } + else if (Service->ErrorControl == 3) + { + if (IsLastKnownGood == FALSE) + { + /* Boot last known good configuration */ + } + else + { + /* BSOD! */ + } + } +#endif + } + return Status; +} + +/* + * IopInitializeSystemDrivers + * + * Load drivers marked as system start. + * + * Parameters + * None + * + * Return Value + * None + */ +VOID +FASTCALL +IopInitializeSystemDrivers(VOID) +{ + PSERVICE_GROUP CurrentGroup; + PSERVICE CurrentService; + NTSTATUS Status; + ULONG i; + PLIST_ENTRY NextGroupEntry, NextServiceEntry; + + DPRINT("IopInitializeSystemDrivers()\n"); + + /* Start looping */ + for (NextGroupEntry = GroupListHead.Flink; + NextGroupEntry != &GroupListHead; + NextGroupEntry = NextGroupEntry->Flink) + { + /* Get the entry */ + CurrentGroup = CONTAINING_RECORD(NextGroupEntry, + SERVICE_GROUP, + GroupListEntry); + + DPRINT("Group: %wZ\n", &CurrentGroup->GroupName); + + /* Load all drivers with a valid tag */ + for (i = 0; i < CurrentGroup->TagCount; i++) + { + /* Start looping */ + for (NextServiceEntry = ServiceListHead.Flink; + NextServiceEntry != &ServiceListHead; + NextServiceEntry = NextServiceEntry->Flink) + { + /* Get the entry */ + CurrentService = CONTAINING_RECORD(NextServiceEntry, + SERVICE, + ServiceListEntry); + + if ((!RtlCompareUnicodeString(&CurrentGroup->GroupName, + &CurrentService->ServiceGroup, + TRUE)) && + (CurrentService->Start == SERVICE_SYSTEM_START) && + (CurrentService->Tag == CurrentGroup->TagArray[i])) + + { + DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath); + Status = IopLoadDriver(CurrentService); + InbvIndicateProgress(); + } + } + } + + /* Load all drivers without a tag or with an invalid tag */ + for (NextServiceEntry = ServiceListHead.Flink; + NextServiceEntry != &ServiceListHead; + NextServiceEntry = NextServiceEntry->Flink) + { + /* Get the entry */ + CurrentService = CONTAINING_RECORD(NextServiceEntry, + SERVICE, + ServiceListEntry); + + if ((!RtlCompareUnicodeString(&CurrentGroup->GroupName, + &CurrentService->ServiceGroup, + TRUE)) && + (CurrentService->Start == SERVICE_SYSTEM_START)) + { + for (i = 0; i < CurrentGroup->TagCount; i++) + { + if (CurrentGroup->TagArray[i] == CurrentService->Tag) + { + break; + } + } + + if (i >= CurrentGroup->TagCount) + { + DPRINT(" Path: %wZ\n", &CurrentService->RegistryPath); + Status = IopLoadDriver(CurrentService); + InbvIndicateProgress(); + } + + } + } + } + + DPRINT("IopInitializeSystemDrivers() done\n"); +} diff --git a/ntoskrnl/io/iomgr/iomgr.c b/ntoskrnl/io/iomgr/iomgr.c index a0f16bb15a4..cb32297d25c 100644 --- a/ntoskrnl/io/iomgr/iomgr.c +++ b/ntoskrnl/io/iomgr/iomgr.c @@ -488,7 +488,10 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (!IopCreateRootDirectories()) return FALSE; /* Initialize PnP manager */ - IopInitializePlugPlayServices(); + PnpInit(); + + /* Create the group driver list */ + IoCreateDriverList(); /* Load boot start drivers */ IopInitializeBootDrivers(); @@ -527,6 +530,9 @@ IoInitSystem(IN PLOADER_PARAMETER_BLOCK LoaderBlock) IopInitializeSystemDrivers(); PnpSystemInit = TRUE; + /* Destroy the group driver list */ + IoDestroyDriverList(); + /* Reinitialize drivers that requested it */ IopReinitializeDrivers(); diff --git a/ntoskrnl/io/pnpmgr/pnpinit.c b/ntoskrnl/io/pnpmgr/pnpinit.c deleted file mode 100644 index deced326832..00000000000 --- a/ntoskrnl/io/pnpmgr/pnpinit.c +++ /dev/null @@ -1,502 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: ntoskrnl/io/pnpmgr/pnpinit.c - * PURPOSE: PnP Initialization Code - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include - -/* GLOBALS ********************************************************************/ - -typedef struct _IOPNP_DEVICE_EXTENSION -{ - PWCHAR CompatibleIdList; - ULONG CompatibleIdListSize; -} IOPNP_DEVICE_EXTENSION, *PIOPNP_DEVICE_EXTENSION; - -PUNICODE_STRING PiInitGroupOrderTable; -ULONG PiInitGroupOrderTableCount; -INTERFACE_TYPE PnpDefaultInterfaceType; - -/* FUNCTIONS ******************************************************************/ - -INTERFACE_TYPE -NTAPI -IopDetermineDefaultInterfaceType(VOID) -{ - /* FIXME: ReactOS doesn't support MicroChannel yet */ - return Isa; -} - -NTSTATUS -NTAPI -IopInitializeArbiters(VOID) -{ - /* FIXME: TODO */ - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -PiInitCacheGroupInformation(VOID) -{ - HANDLE KeyHandle; - NTSTATUS Status; - PKEY_VALUE_FULL_INFORMATION KeyValueInformation; - PUNICODE_STRING GroupTable; - ULONG Count; - UNICODE_STRING GroupString = - RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet" - L"\\Control\\ServiceGroupOrder"); - - /* ReactOS HACK for SETUPLDR */ - if (KeLoaderBlock->SetupLdrBlock) - { - /* Bogus data */ - PiInitGroupOrderTableCount = 0; - PiInitGroupOrderTable = (PVOID)0xBABEB00B; - return STATUS_SUCCESS; - } - - /* Open the registry key */ - Status = IopOpenRegistryKeyEx(&KeyHandle, - NULL, - &GroupString, - KEY_READ); - if (NT_SUCCESS(Status)) - { - /* Get the list */ - Status = IopGetRegistryValue(KeyHandle, L"List", &KeyValueInformation); - ZwClose(KeyHandle); - - /* Make sure we got it */ - if (NT_SUCCESS(Status)) - { - /* Make sure it's valid */ - if ((KeyValueInformation->Type == REG_MULTI_SZ) && - (KeyValueInformation->DataLength)) - { - /* Convert it to unicode strings */ - Status = PnpRegMultiSzToUnicodeStrings(KeyValueInformation, - &GroupTable, - &Count); - - /* Cache it for later */ - PiInitGroupOrderTable = GroupTable; - PiInitGroupOrderTableCount = Count; - } - else - { - /* Fail */ - Status = STATUS_UNSUCCESSFUL; - } - - /* Free the information */ - ExFreePool(KeyValueInformation); - } - } - - /* Return status */ - return Status; -} - -USHORT -NTAPI -PpInitGetGroupOrderIndex(IN HANDLE ServiceHandle) -{ - NTSTATUS Status; - PKEY_VALUE_FULL_INFORMATION KeyValueInformation; - ULONG i; - PVOID Buffer; - UNICODE_STRING Group; - PAGED_CODE(); - - /* Make sure we have a cache */ - if (!PiInitGroupOrderTable) return -1; - - /* If we don't have a handle, the rest is easy -- return the count */ - if (!ServiceHandle) return PiInitGroupOrderTableCount + 1; - - /* Otherwise, get the group value */ - Status = IopGetRegistryValue(ServiceHandle, L"Group", &KeyValueInformation); - if (!NT_SUCCESS(Status)) return PiInitGroupOrderTableCount; - - /* Make sure we have a valid string */ - ASSERT(KeyValueInformation->Type == REG_SZ); - ASSERT(KeyValueInformation->DataLength); - - /* Convert to unicode string */ - Buffer = (PVOID)((ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset); - PnpRegSzToString(Buffer, KeyValueInformation->DataLength, &Group.Length); - Group.MaximumLength = KeyValueInformation->DataLength; - Group.Buffer = Buffer; - - /* Loop the groups */ - for (i = 0; i < PiInitGroupOrderTableCount; i++) - { - /* Try to find a match */ - if (RtlEqualUnicodeString(&Group, &PiInitGroupOrderTable[i], TRUE)) break; - } - - /* We're done */ - ExFreePool(KeyValueInformation); - return i; -} - -USHORT -NTAPI -PipGetDriverTagPriority(IN HANDLE ServiceHandle) -{ - NTSTATUS Status; - HANDLE KeyHandle = NULL; - PKEY_VALUE_FULL_INFORMATION KeyValueInformation = NULL; - PKEY_VALUE_FULL_INFORMATION KeyValueInformationTag; - PKEY_VALUE_FULL_INFORMATION KeyValueInformationGroupOrderList; - PVOID Buffer; - UNICODE_STRING Group; - PULONG GroupOrder; - ULONG i = -1, Count, Tag = 0; - UNICODE_STRING GroupString = - RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet" - L"\\Control\\ServiceGroupOrder"); - - /* Open the key */ - Status = IopOpenRegistryKeyEx(&KeyHandle, NULL, &GroupString, KEY_READ); - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Read the group */ - Status = IopGetRegistryValue(ServiceHandle, L"Group", &KeyValueInformation); - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Make sure we have a group */ - if ((KeyValueInformation->Type == REG_SZ) && - (KeyValueInformation->DataLength)) - { - /* Convert to unicode string */ - Buffer = (PVOID)((ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset); - PnpRegSzToString(Buffer, KeyValueInformation->DataLength, &Group.Length); - Group.MaximumLength = KeyValueInformation->DataLength; - Group.Buffer = Buffer; - } - - /* Now read the tag */ - Status = IopGetRegistryValue(ServiceHandle, L"Tag", &KeyValueInformationTag); - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Make sure we have a tag */ - if ((KeyValueInformationTag->Type == REG_DWORD) && - (KeyValueInformationTag->DataLength)) - { - /* Read it */ - Tag = *(PULONG)((ULONG_PTR)KeyValueInformationTag + - KeyValueInformationTag->DataOffset); - } - - /* We can get rid of this now */ - ExFreePool(KeyValueInformationTag); - - /* Now let's read the group's tag order */ - Status = IopGetRegistryValue(KeyHandle, - Group.Buffer, - &KeyValueInformationGroupOrderList); - - /* We can get rid of this now */ -Quickie: - if (KeyValueInformation) ExFreePool(KeyValueInformation); - if (KeyHandle) NtClose(KeyHandle); - if (!NT_SUCCESS(Status)) return -1; - - /* We're on the success path -- validate the tag order*/ - if ((KeyValueInformationGroupOrderList->Type == REG_BINARY) && - (KeyValueInformationGroupOrderList->DataLength)) - { - /* Get the order array */ - GroupOrder = (PULONG)((ULONG_PTR)KeyValueInformationGroupOrderList + - KeyValueInformationGroupOrderList->DataOffset); - - /* Get the count */ - Count = *GroupOrder; - ASSERT(((Count + 1) * sizeof(ULONG)) <= - KeyValueInformationGroupOrderList->DataLength); - - /* Now loop each tag */ - GroupOrder++; - for (i = 1; i <= Count; i++) - { - /* If we found it, we're out */ - if (Tag == *GroupOrder) break; - - /* Try the next one */ - GroupOrder++; - } - } - - /* Last buffer to free */ - ExFreePool(KeyValueInformationGroupOrderList); - return i; -} - -NTSTATUS -NTAPI -PipCallDriverAddDevice(IN PDEVICE_NODE DeviceNode, - IN BOOLEAN LoadDriver, - IN PDRIVER_OBJECT DriverObject) -{ - NTSTATUS Status; - HANDLE EnumRootKey, SubKey, ControlKey, ClassKey, PropertiesKey; - UNICODE_STRING ClassGuid, Properties; - UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT); - UNICODE_STRING ControlClass = - RTL_CONSTANT_STRING(L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\Class"); - PKEY_VALUE_FULL_INFORMATION KeyValueInformation = NULL; - PWCHAR Buffer; - - /* Open enumeration root key */ - Status = IopOpenRegistryKeyEx(&EnumRootKey, - NULL, - &EnumRoot, - KEY_READ); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); - return Status; - } - - /* Open instance subkey */ - Status = IopOpenRegistryKeyEx(&SubKey, - EnumRootKey, - &DeviceNode->InstancePath, - KEY_READ); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); - ZwClose(EnumRootKey); - return Status; - } - - /* Get class GUID */ - Status = IopGetRegistryValue(SubKey, - REGSTR_VAL_CLASSGUID, - &KeyValueInformation); - if (NT_SUCCESS(Status)) - { - /* Convert to unicode string */ - Buffer = (PVOID)((ULONG_PTR)KeyValueInformation + KeyValueInformation->DataOffset); - PnpRegSzToString(Buffer, KeyValueInformation->DataLength, &ClassGuid.Length); - ClassGuid.MaximumLength = KeyValueInformation->DataLength; - ClassGuid.Buffer = Buffer; - - /* Open the key */ - Status = IopOpenRegistryKeyEx(&ControlKey, - NULL, - &ControlClass, - KEY_READ); - if (!NT_SUCCESS(Status)) - { - /* No class key */ - DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); - ClassKey = NULL; - } - else - { - /* Open the class key */ - Status = IopOpenRegistryKeyEx(&ClassKey, - ControlKey, - &ClassGuid, - KEY_READ); - ZwClose(ControlKey); - if (!NT_SUCCESS(Status)) - { - /* No class key */ - DPRINT1("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); - ClassKey = NULL; - } - } - - /* Check if we made it till here */ - if (ClassKey) - { - /* Get the device properties */ - RtlInitUnicodeString(&Properties, REGSTR_KEY_DEVICE_PROPERTIES); - Status = IopOpenRegistryKeyEx(&PropertiesKey, - ClassKey, - &Properties, - KEY_READ); - if (!NT_SUCCESS(Status)) - { - /* No properties */ - DPRINT("IopOpenRegistryKeyEx() failed with Status %08X\n", Status); - PropertiesKey = NULL; - } - } - - /* Free the registry data */ - ExFreePool(KeyValueInformation); - } - - /* Do ReactOS-style setup */ - IopAttachFilterDrivers(DeviceNode, TRUE); - Status = IopInitializeDevice(DeviceNode, DriverObject); - if (NT_SUCCESS(Status)) - { - IopAttachFilterDrivers(DeviceNode, FALSE); - Status = IopStartDevice(DeviceNode); - } - - /* Return status */ - return Status; -} - -NTSTATUS -NTAPI -IopInitializePlugPlayServices(VOID) -{ - NTSTATUS Status; - ULONG Disposition; - HANDLE KeyHandle, EnumHandle, ParentHandle, TreeHandle; - UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET"); - PDEVICE_OBJECT Pdo; - - /* Initialize locks and such */ - KeInitializeSpinLock(&IopDeviceTreeLock); - - /* Get the default interface */ - PnpDefaultInterfaceType = IopDetermineDefaultInterfaceType(); - - /* Initialize arbiters */ - Status = IopInitializeArbiters(); - if (!NT_SUCCESS(Status)) return Status; - - /* Setup the group cache */ - Status = PiInitCacheGroupInformation(); - if (!NT_SUCCESS(Status)) return Status; - - /* Open the current control set */ - Status = IopOpenRegistryKeyEx(&KeyHandle, - NULL, - &KeyName, - KEY_ALL_ACCESS); - if (!NT_SUCCESS(Status)) return Status; - - /* Create the enum key */ - RtlInitUnicodeString(&KeyName, REGSTR_KEY_ENUM); - Status = IopCreateRegistryKeyEx(&EnumHandle, - KeyHandle, - &KeyName, - KEY_ALL_ACCESS, - REG_OPTION_NON_VOLATILE, - &Disposition); - if (!NT_SUCCESS(Status)) return Status; - - /* Check if it's a new key */ - if (Disposition == REG_CREATED_NEW_KEY) - { - /* FIXME: DACLs */ - DPRINT1("Need to build DACL\n"); - } - - /* Create the root key */ - ParentHandle = EnumHandle; - RtlInitUnicodeString(&KeyName, REGSTR_KEY_ROOTENUM); - Status = IopCreateRegistryKeyEx(&EnumHandle, - ParentHandle, - &KeyName, - KEY_ALL_ACCESS, - REG_OPTION_NON_VOLATILE, - &Disposition); - NtClose(ParentHandle); - if (!NT_SUCCESS(Status)) return Status; - NtClose(EnumHandle); - - /* Open the root key now */ - RtlInitUnicodeString(&KeyName, L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET\\ENUM"); - Status = IopOpenRegistryKeyEx(&EnumHandle, - NULL, - &KeyName, - KEY_ALL_ACCESS); - if (NT_SUCCESS(Status)) - { - /* Create the root dev node */ - RtlInitUnicodeString(&KeyName, REGSTR_VAL_ROOT_DEVNODE); - Status = IopCreateRegistryKeyEx(&TreeHandle, - EnumHandle, - &KeyName, - KEY_ALL_ACCESS, - REG_OPTION_NON_VOLATILE, - NULL); - NtClose(EnumHandle); - if (NT_SUCCESS(Status)) NtClose(TreeHandle); - } - - /* Create the root driver */ - Status = IoCreateDriver(NULL, PnpRootDriverEntry); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoCreateDriverObject() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - /* Create the root PDO */ - Status = IoCreateDevice(IopRootDriverObject, - sizeof(IOPNP_DEVICE_EXTENSION), - NULL, - FILE_DEVICE_CONTROLLER, - 0, - FALSE, - &Pdo); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IoCreateDevice() failed\n"); - KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); - } - - /* This is a bus enumerated device */ - Pdo->Flags |= DO_BUS_ENUMERATED_DEVICE; - - /* Create the root device node */ - IopRootDeviceNode = PipAllocateDeviceNode(Pdo); - - /* Set flags */ - IopRootDeviceNode->Flags |= DNF_STARTED + DNF_PROCESSED + DNF_ENUMERATED + - DNF_MADEUP + DNF_NO_RESOURCE_REQUIRED + - DNF_ADDED; - - /* Create instance path */ - RtlCreateUnicodeString(&IopRootDeviceNode->InstancePath, - REGSTR_VAL_ROOT_DEVNODE); - - /* Call the add device routine */ - IopRootDriverObject->DriverExtension->AddDevice(IopRootDriverObject, - IopRootDeviceNode->PhysicalDeviceObject); - - /* Initialize PnP-Event notification support */ - Status = IopInitPlugPlayEvents(); - if (!NT_SUCCESS(Status)) return Status; - - /* Report the device to the user-mode pnp manager */ - IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, - &IopRootDeviceNode->InstancePath); - - /* Initialize the Bus Type GUID List */ - PnpBusTypeGuidList = ExAllocatePool(PagedPool, sizeof(IO_BUS_TYPE_GUID_LIST)); - RtlZeroMemory(PnpBusTypeGuidList, sizeof(IO_BUS_TYPE_GUID_LIST)); - ExInitializeFastMutex(&PnpBusTypeGuidList->Lock); - - /* Launch the firmware mapper */ - Status = IopUpdateRootKey(); - if (!NT_SUCCESS(Status)) return Status; - - /* Close the handle to the control set */ - NtClose(KeyHandle); - - /* We made it */ - return STATUS_SUCCESS; -} - -/* EOF */ diff --git a/ntoskrnl/io/pnpmgr/pnpmgr.c b/ntoskrnl/io/pnpmgr/pnpmgr.c index 645b837de81..44283968d0c 100644 --- a/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -29,7 +29,8 @@ extern BOOLEAN PnpSystemInit; /* DATA **********************************************************************/ PDRIVER_OBJECT IopRootDriverObject; -PIO_BUS_TYPE_GUID_LIST PnpBusTypeGuidList = NULL; +FAST_MUTEX IopBusTypeGuidListLock; +PIO_BUS_TYPE_GUID_LIST IopBusTypeGuidList = NULL; #if defined (ALLOC_PRAGMA) #pragma alloc_text(INIT, PnpInit) @@ -44,10 +45,24 @@ typedef struct _INVALIDATE_DEVICE_RELATION_DATA } INVALIDATE_DEVICE_RELATION_DATA, *PINVALIDATE_DEVICE_RELATION_DATA; /* FUNCTIONS *****************************************************************/ + +NTSTATUS +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode, + OUT ULONG *pRequiredSize); + +NTSTATUS +IopTranslateDeviceResources( + IN PDEVICE_NODE DeviceNode, + IN ULONG RequiredSize); + +NTSTATUS +IopUpdateResourceMapForPnPDevice( + IN PDEVICE_NODE DeviceNode); + NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, - IN ULONG CreateOptions, OUT PHANDLE Handle); PDEVICE_NODE @@ -66,20 +81,19 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, NTSTATUS Status; if (!DriverObject->DriverExtension->AddDevice) - { - DeviceNode->Flags |= DNF_LEGACY_DRIVER; - } - - if (DeviceNode->Flags & DNF_LEGACY_DRIVER) - { - DeviceNode->Flags |= DNF_ADDED + DNF_STARTED; return STATUS_SUCCESS; - } /* This is a Plug and Play driver */ DPRINT("Plug and Play driver found\n"); ASSERT(DeviceNode->PhysicalDeviceObject); + /* Check if this plug-and-play driver is used as a legacy one for this device node */ + if (IopDeviceNodeHasFlag(DeviceNode, DNF_LEGACY_DRIVER)) + { + IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); + return STATUS_SUCCESS; + } + DPRINT("Calling %wZ->AddDevice(%wZ)\n", &DriverObject->DriverName, &DeviceNode->InstancePath); @@ -119,161 +133,100 @@ IopInitializeDevice(PDEVICE_NODE DeviceNode, ObDereferenceObject(Fdo); IopDeviceNodeSetFlag(DeviceNode, DNF_ADDED); + IopDeviceNodeSetFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); return STATUS_SUCCESS; } -VOID -NTAPI -IopSendRemoveDevice(IN PDEVICE_OBJECT DeviceObject) -{ - IO_STACK_LOCATION Stack; - PVOID Dummy; - - RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION)); - Stack.MajorFunction = IRP_MJ_PNP; - Stack.MinorFunction = IRP_MN_REMOVE_DEVICE; - - /* Drivers should never fail a IRP_MN_REMOVE_DEVICE request */ - IopSynchronousCall(DeviceObject, &Stack, &Dummy); -} - -VOID -NTAPI -IopStartDevice2(IN PDEVICE_OBJECT DeviceObject) -{ - IO_STACK_LOCATION Stack; - PDEVICE_NODE DeviceNode; - NTSTATUS Status; - PVOID Dummy; - - /* Get the device node */ - DeviceNode = IopGetDeviceNode(DeviceObject); - - /* Build the I/O stack locaiton */ - RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION)); - Stack.MajorFunction = IRP_MJ_PNP; - Stack.MinorFunction = IRP_MN_START_DEVICE; - - /* Check if we didn't already report the resources */ - if (!(DeviceNode->Flags & DNF_RESOURCE_REPORTED)) - { - /* Report them */ - Stack.Parameters.StartDevice.AllocatedResources = - DeviceNode->ResourceList; - Stack.Parameters.StartDevice.AllocatedResourcesTranslated = - DeviceNode->ResourceListTranslated; - } - - /* I don't think we set this flag yet */ - ASSERT(!(DeviceNode->Flags & DNF_STOPPED)); - - /* Do the call */ - Status = IopSynchronousCall(DeviceObject, &Stack, &Dummy); - if (!NT_SUCCESS(Status)) - { - /* Send an IRP_MN_REMOVE_DEVICE request */ - IopSendRemoveDevice(DeviceObject); - - /* Set the appropriate flag */ - DeviceNode->Flags |= DNF_START_FAILED; - - DPRINT1("Warning: PnP Start failed (%wZ)\n", &DeviceNode->InstancePath); - return; - } - - /* Otherwise, mark us as started */ - DeviceNode->Flags |= DNF_STARTED; - - /* We now need enumeration */ - DeviceNode->Flags |= DNF_NEED_ENUMERATION_ONLY; -} - -NTSTATUS -NTAPI -IopStartAndEnumerateDevice(IN PDEVICE_NODE DeviceNode) -{ - PDEVICE_OBJECT DeviceObject; - NTSTATUS Status; - PAGED_CODE(); - - /* Sanity check */ - ASSERT((DeviceNode->Flags & DNF_ADDED)); - ASSERT((DeviceNode->Flags & (DNF_RESOURCE_ASSIGNED | - DNF_RESOURCE_REPORTED | - DNF_NO_RESOURCE_REQUIRED))); - ASSERT((!(DeviceNode->Flags & (DNF_HAS_PROBLEM | - DNF_STARTED | - DNF_START_REQUEST_PENDING)))); - - /* Get the device object */ - DeviceObject = DeviceNode->PhysicalDeviceObject; - - /* Check if we're not started yet */ - if (!(DeviceNode->Flags & DNF_STARTED)) - { - /* Start us */ - IopStartDevice2(DeviceObject); - } - - /* Do we need to query IDs? This happens in the case of manual reporting */ -#if 0 - if (DeviceNode->Flags & DNF_NEED_QUERY_IDS) - { - DPRINT1("Warning: Device node has DNF_NEED_QUERY_IDS\n"); - /* And that case shouldn't happen yet */ - ASSERT(FALSE); - } -#endif - - /* Make sure we're started, and check if we need enumeration */ - if ((DeviceNode->Flags & DNF_STARTED) && - (DeviceNode->Flags & DNF_NEED_ENUMERATION_ONLY)) - { - /* Enumerate us */ - IoSynchronousInvalidateDeviceRelations(DeviceObject, BusRelations); - IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); - Status = STATUS_SUCCESS; - } - else - { - /* Nothing to do */ - Status = STATUS_SUCCESS; - } - - /* Return */ - return Status; -} - NTSTATUS IopStartDevice( PDEVICE_NODE DeviceNode) { + IO_STATUS_BLOCK IoStatusBlock; + IO_STACK_LOCATION Stack; + ULONG RequiredLength; NTSTATUS Status; - HANDLE InstanceHandle = INVALID_HANDLE_VALUE, ControlHandle = INVALID_HANDLE_VALUE; + HANDLE InstanceHandle, ControlHandle; UNICODE_STRING KeyName; OBJECT_ATTRIBUTES ObjectAttributes; - if (DeviceNode->Flags & (DNF_STARTED | DNF_START_REQUEST_PENDING)) + IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n"); + Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements; + Status = IopInitiatePnpIrp( + DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_FILTER_RESOURCE_REQUIREMENTS, + &Stack); + if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) { - /* Nothing to do here */ - return STATUS_SUCCESS; + DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); + return Status; } + DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - Status = IopAssignDeviceResources(DeviceNode); - if (!NT_SUCCESS(Status)) - goto ByeBye; + Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); + if (NT_SUCCESS(Status)) + { + Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); + if (NT_SUCCESS(Status)) + { + Status = IopUpdateResourceMapForPnPDevice(DeviceNode); + if (!NT_SUCCESS(Status)) + { + DPRINT("IopUpdateResourceMap() failed (Status 0x%08lx)\n", Status); + } + } + else + { + DPRINT("IopTranslateDeviceResources() failed (Status 0x%08lx)\n", Status); + } + } + else + { + DPRINT("IopAssignDeviceResources() failed (Status 0x%08lx)\n", Status); + } + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + + DPRINT("Sending IRP_MN_START_DEVICE to driver\n"); + Stack.Parameters.StartDevice.AllocatedResources = DeviceNode->ResourceList; + Stack.Parameters.StartDevice.AllocatedResourcesTranslated = DeviceNode->ResourceListTranslated; + + /* + * Windows NT Drivers receive IRP_MN_START_DEVICE in a critical region and + * actually _depend_ on this!. This is because NT will lock the Device Node + * with an ERESOURCE, which of course requires APCs to be disabled. + */ + KeEnterCriticalRegion(); + + Status = IopInitiatePnpIrp( + DeviceNode->PhysicalDeviceObject, + &IoStatusBlock, + IRP_MN_START_DEVICE, + &Stack); - /* New PnP ABI */ - IopStartAndEnumerateDevice(DeviceNode); + KeLeaveCriticalRegion(); - /* FIX: Should be done in new device instance code */ - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceHandle); if (!NT_SUCCESS(Status)) - goto ByeBye; + { + DPRINT("IopInitiatePnpIrp() failed\n"); + } + else + { + if (IopDeviceNodeHasFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY)) + { + DPRINT("Device needs enumeration, invalidating bus relations\n"); + /* Invalidate device relations synchronously + (otherwise there will be dirty read of DeviceNode) */ + IopEnumerateDevice(DeviceNode->PhysicalDeviceObject); + IopDeviceNodeClearFlag(DeviceNode, DNF_NEED_ENUMERATION_ONLY); + } + } + + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, &InstanceHandle); + if (!NT_SUCCESS(Status)) + return Status; - /* FIX: Should be done in IoXxxPrepareDriverLoading */ - // { RtlInitUnicodeString(&KeyName, L"Control"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, @@ -282,18 +235,19 @@ IopStartDevice( NULL); Status = ZwCreateKey(&ControlHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); if (!NT_SUCCESS(Status)) - goto ByeBye; + { + ZwClose(InstanceHandle); + return Status; + } RtlInitUnicodeString(&KeyName, L"ActiveService"); Status = ZwSetValueKey(ControlHandle, &KeyName, 0, REG_SZ, DeviceNode->ServiceName.Buffer, DeviceNode->ServiceName.Length); - // } -ByeBye: - if (ControlHandle != INVALID_HANDLE_VALUE) - ZwClose(ControlHandle); + if (NT_SUCCESS(Status)) + IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); - if (InstanceHandle != INVALID_HANDLE_VALUE) - ZwClose(InstanceHandle); + ZwClose(ControlHandle); + ZwClose(InstanceHandle); return Status; } @@ -366,14 +320,14 @@ IopGetBusTypeGuidIndex(LPGUID BusTypeGuid) PVOID NewList; /* Acquire the lock */ - ExAcquireFastMutex(&PnpBusTypeGuidList->Lock); + ExAcquireFastMutex(&IopBusTypeGuidListLock); /* Loop all entries */ - while (i < PnpBusTypeGuidList->GuidCount) + while (i < IopBusTypeGuidList->GuidCount) { /* Try to find a match */ if (RtlCompareMemory(BusTypeGuid, - &PnpBusTypeGuidList->Guids[i], + &IopBusTypeGuidList->Guids[i], sizeof(GUID)) == sizeof(GUID)) { /* Found it */ @@ -384,43 +338,43 @@ IopGetBusTypeGuidIndex(LPGUID BusTypeGuid) } /* Check if we have to grow the list */ - if (PnpBusTypeGuidList->GuidCount) + if (IopBusTypeGuidList->GuidCount) { /* Calculate the new size */ NewSize = sizeof(IO_BUS_TYPE_GUID_LIST) + - (sizeof(GUID) * PnpBusTypeGuidList->GuidCount); + (sizeof(GUID) * IopBusTypeGuidList->GuidCount); /* Allocate the new copy */ NewList = ExAllocatePool(PagedPool, NewSize); if (!NewList) { /* Fail */ - ExFreePool(PnpBusTypeGuidList); + ExFreePool(IopBusTypeGuidList); goto Quickie; } /* Now copy them, decrease the size too */ NewSize -= sizeof(GUID); - RtlCopyMemory(NewList, PnpBusTypeGuidList, NewSize); + RtlCopyMemory(NewList, IopBusTypeGuidList, NewSize); /* Free the old list */ - ExFreePool(PnpBusTypeGuidList); + ExFreePool(IopBusTypeGuidList); /* Use the new buffer */ - PnpBusTypeGuidList = NewList; + IopBusTypeGuidList = NewList; } /* Copy the new GUID */ - RtlCopyMemory(&PnpBusTypeGuidList->Guids[PnpBusTypeGuidList->GuidCount], + RtlCopyMemory(&IopBusTypeGuidList->Guids[IopBusTypeGuidList->GuidCount], BusTypeGuid, sizeof(GUID)); /* The new entry is the index */ - FoundIndex = (USHORT)PnpBusTypeGuidList->GuidCount; - PnpBusTypeGuidList->GuidCount++; + FoundIndex = (USHORT)IopBusTypeGuidList->GuidCount; + IopBusTypeGuidList->GuidCount++; Quickie: - ExReleaseFastMutex(&PnpBusTypeGuidList->Lock); + ExReleaseFastMutex(&IopBusTypeGuidListLock); return FoundIndex; } @@ -450,13 +404,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, UNICODE_STRING FullServiceName; UNICODE_STRING LegacyPrefix = RTL_CONSTANT_STRING(L"LEGACY_"); UNICODE_STRING UnknownDeviceName = RTL_CONSTANT_STRING(L"UNKNOWN"); - UNICODE_STRING KeyName, ClassName; - PUNICODE_STRING ServiceName1; - ULONG LegacyValue; -#if 0 - UNICODE_STRING ClassGUID; -#endif - HANDLE InstanceHandle; + HANDLE TempHandle; DPRINT("ParentNode 0x%p PhysicalDeviceObject 0x%p ServiceName %wZ\n", ParentNode, PhysicalDeviceObject, ServiceName); @@ -470,13 +418,11 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, RtlZeroMemory(Node, sizeof(DEVICE_NODE)); if (!ServiceName) - ServiceName1 = &UnknownDeviceName; - else - ServiceName1 = ServiceName; + ServiceName = &UnknownDeviceName; if (!PhysicalDeviceObject) { - FullServiceName.MaximumLength = LegacyPrefix.Length + ServiceName1->Length; + FullServiceName.MaximumLength = LegacyPrefix.Length + ServiceName->Length; FullServiceName.Length = 0; FullServiceName.Buffer = ExAllocatePool(PagedPool, FullServiceName.MaximumLength); if (!FullServiceName.Buffer) @@ -486,7 +432,7 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, } RtlAppendUnicodeStringToString(&FullServiceName, &LegacyPrefix); - RtlAppendUnicodeStringToString(&FullServiceName, ServiceName1); + RtlAppendUnicodeStringToString(&FullServiceName, ServiceName); Status = PnpRootCreateDevice(&FullServiceName, &PhysicalDeviceObject, &Node->InstancePath); if (!NT_SUCCESS(Status)) @@ -497,71 +443,15 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode, } /* Create the device key for legacy drivers */ - Status = IopCreateDeviceKeyPath(&Node->InstancePath, REG_OPTION_VOLATILE, &InstanceHandle); - if (!NT_SUCCESS(Status)) - { - ZwClose(InstanceHandle); - ExFreePool(Node); - ExFreePool(FullServiceName.Buffer); - return Status; - } - - Node->ServiceName.Buffer = ExAllocatePool(PagedPool, ServiceName1->Length); - if (!Node->ServiceName.Buffer) - { - ZwClose(InstanceHandle); - ExFreePool(Node); - ExFreePool(FullServiceName.Buffer); - return Status; - } - - Node->ServiceName.MaximumLength = ServiceName1->Length; - Node->ServiceName.Length = 0; - - RtlAppendUnicodeStringToString(&Node->ServiceName, ServiceName1); - - if (ServiceName) - { - RtlInitUnicodeString(&KeyName, L"Service"); - Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ServiceName->Buffer, ServiceName->Length); - } - + Status = IopCreateDeviceKeyPath(&Node->InstancePath, &TempHandle); if (NT_SUCCESS(Status)) - { - RtlInitUnicodeString(&KeyName, L"Legacy"); - - LegacyValue = 1; - Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_DWORD, &LegacyValue, sizeof(LegacyValue)); - if (NT_SUCCESS(Status)) - { - RtlInitUnicodeString(&KeyName, L"Class"); - - RtlInitUnicodeString(&ClassName, L"LegacyDriver"); - Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ClassName.Buffer, ClassName.Length); -#if 0 - if (NT_SUCCESS(Status)) - { - RtlInitUnicodeString(&KeyName, L"ClassGUID"); + ZwClose(TempHandle); - RtlInitUnicodeString(&ClassGUID, L"{8ECC055D-047F-11D1-A537-0000F8753ED1}"); - Status = ZwSetValueKey(InstanceHandle, &KeyName, 0, REG_SZ, ClassGUID.Buffer, ClassGUID.Length); - } -#endif - } - } - - ZwClose(InstanceHandle); ExFreePool(FullServiceName.Buffer); - if (!NT_SUCCESS(Status)) - { - ExFreePool(Node); - return Status; - } - - IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER); - IopDeviceNodeSetFlag(Node, DNF_ADDED); + /* This is for drivers passed on the command line to ntoskrnl.exe */ IopDeviceNodeSetFlag(Node, DNF_STARTED); + IopDeviceNodeSetFlag(Node, DNF_LEGACY_DRIVER); } Node->PhysicalDeviceObject = PhysicalDeviceObject; @@ -659,91 +549,70 @@ IopFreeDeviceNode(PDEVICE_NODE DeviceNode) } NTSTATUS -NTAPI -IopSynchronousCall(IN PDEVICE_OBJECT DeviceObject, - IN PIO_STACK_LOCATION IoStackLocation, - OUT PVOID *Information) +IopInitiatePnpIrp(PDEVICE_OBJECT DeviceObject, + PIO_STATUS_BLOCK IoStatusBlock, + ULONG MinorFunction, + PIO_STACK_LOCATION Stack OPTIONAL) { - PIRP Irp; - PIO_STACK_LOCATION IrpStack; - IO_STATUS_BLOCK IoStatusBlock; - KEVENT Event; - NTSTATUS Status; - PDEVICE_OBJECT TopDeviceObject; - PAGED_CODE(); - - /* Call the top of the device stack */ - TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject); - - /* Allocate an IRP */ - Irp = IoAllocateIrp(TopDeviceObject->StackSize, FALSE); - if (!Irp) return STATUS_INSUFFICIENT_RESOURCES; - - /* Initialize to failure */ - Irp->IoStatus.Status = IoStatusBlock.Status = STATUS_NOT_SUPPORTED; - Irp->IoStatus.Information = IoStatusBlock.Information = 0; - - /* Initialize the event */ - KeInitializeEvent(&Event, SynchronizationEvent, FALSE); - - /* Set them up */ - Irp->UserIosb = &IoStatusBlock; - Irp->UserEvent = &Event; - - /* Queue the IRP */ - Irp->Tail.Overlay.Thread = PsGetCurrentThread(); - IoQueueThreadIrp(Irp); - - /* Copy-in the stack */ - IrpStack = IoGetNextIrpStackLocation(Irp); - *IrpStack = *IoStackLocation; - - /* Call the driver */ - Status = IoCallDriver(TopDeviceObject, Irp); - if (Status == STATUS_PENDING) - { - /* Wait for it */ - KeWaitForSingleObject(&Event, - Executive, - KernelMode, - FALSE, - NULL); - Status = IoStatusBlock.Status; - } - - /* Return the information */ - *Information = (PVOID)IoStatusBlock.Information; - return Status; -} + PDEVICE_OBJECT TopDeviceObject; + PIO_STACK_LOCATION IrpSp; + NTSTATUS Status; + KEVENT Event; + PIRP Irp; + + /* Always call the top of the device stack */ + TopDeviceObject = IoGetAttachedDeviceReference(DeviceObject); + + KeInitializeEvent( + &Event, + NotificationEvent, + FALSE); + + Irp = IoBuildSynchronousFsdRequest( + IRP_MJ_PNP, + TopDeviceObject, + NULL, + 0, + NULL, + &Event, + IoStatusBlock); + + /* PNP IRPs are initialized with a status code of STATUS_NOT_SUPPORTED */ + Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; + Irp->IoStatus.Information = 0; + + if (MinorFunction == IRP_MN_FILTER_RESOURCE_REQUIREMENTS) + { + Irp->IoStatus.Information = (ULONG_PTR)Stack->Parameters.FilterResourceRequirements.IoResourceRequirementList; + } -NTSTATUS -NTAPI -IopInitiatePnpIrp(IN PDEVICE_OBJECT DeviceObject, - IN OUT PIO_STATUS_BLOCK IoStatusBlock, - IN ULONG MinorFunction, - IN PIO_STACK_LOCATION Stack OPTIONAL) -{ - IO_STACK_LOCATION IoStackLocation; - - /* Fill out the stack information */ - RtlZeroMemory(&IoStackLocation, sizeof(IO_STACK_LOCATION)); - IoStackLocation.MajorFunction = IRP_MJ_PNP; - IoStackLocation.MinorFunction = MinorFunction; - if (Stack) - { - /* Copy the rest */ - RtlCopyMemory(&IoStackLocation.Parameters, - &Stack->Parameters, - sizeof(Stack->Parameters)); - } - - /* Do the PnP call */ - IoStatusBlock->Status = IopSynchronousCall(DeviceObject, - &IoStackLocation, - (PVOID)&IoStatusBlock->Information); - return IoStatusBlock->Status; + IrpSp = IoGetNextIrpStackLocation(Irp); + IrpSp->MinorFunction = (UCHAR)MinorFunction; + + if (Stack) + { + RtlCopyMemory(&IrpSp->Parameters, + &Stack->Parameters, + sizeof(Stack->Parameters)); + } + + Status = IoCallDriver(TopDeviceObject, Irp); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, + Executive, + KernelMode, + FALSE, + NULL); + Status = IoStatusBlock->Status; + } + + ObDereferenceObject(TopDeviceObject); + + return Status; } + NTSTATUS IopTraverseDeviceTreeNode(PDEVICETREE_TRAVERSE_CONTEXT Context) { @@ -824,7 +693,6 @@ IopTraverseDeviceTree(PDEVICETREE_TRAVERSE_CONTEXT Context) NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, - IN ULONG CreateOptions, OUT PHANDLE Handle) { UNICODE_STRING EnumU = RTL_CONSTANT_STRING(ENUM_ROOT); @@ -875,7 +743,7 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, &ObjectAttributes, 0, NULL, - CreateOptions, + 0, NULL); /* Close parent key handle, we don't need it anymore */ @@ -897,114 +765,916 @@ IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, return STATUS_SUCCESS; } - /* Start with this new parent key */ - hParent = hKey; - Current++; - KeyName.Buffer = (LPWSTR)Current; - } + /* Start with this new parent key */ + hParent = hKey; + Current++; + KeyName.Buffer = (LPWSTR)Current; + } + + return STATUS_UNSUCCESSFUL; +} + +NTSTATUS +IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key) +{ + NTSTATUS Status; + ULONG Disposition; + HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey; + UNICODE_STRING KeyName; + OBJECT_ATTRIBUTES ObjectAttributes; + + RtlInitUnicodeString(&KeyName, + L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + 0, + NULL); + Status = ZwCreateKey(&ResourceMapKey, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, Level1Key); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + ResourceMapKey, + NULL); + Status = ZwCreateKey(&PnpMgrLevel1, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + ZwClose(ResourceMapKey); + if (!NT_SUCCESS(Status)) + return Status; + + RtlInitUnicodeString(&KeyName, Level2Key); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE | OBJ_OPENIF, + PnpMgrLevel1, + NULL); + Status = ZwCreateKey(&PnpMgrLevel2, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + REG_OPTION_VOLATILE, + &Disposition); + ZwClose(PnpMgrLevel1); + if (!NT_SUCCESS(Status)) + return Status; + + if (DeviceNode->ResourceList) + { + WCHAR NameBuff[256]; + UNICODE_STRING NameU; + UNICODE_STRING Suffix; + ULONG OldLength; + + ASSERT(DeviceNode->ResourceListTranslated); + + NameU.Buffer = NameBuff; + NameU.Length = 0; + NameU.MaximumLength = 256 * sizeof(WCHAR); + + Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, + DevicePropertyPhysicalDeviceObjectName, + NameU.MaximumLength, + NameU.Buffer, + &OldLength); + ASSERT(Status == STATUS_SUCCESS); + + NameU.Length = (USHORT)OldLength; + + RtlInitUnicodeString(&Suffix, L".Raw"); + RtlAppendUnicodeStringToString(&NameU, &Suffix); + + Status = ZwSetValueKey(PnpMgrLevel2, + &NameU, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceList, + CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceList)); + if (!NT_SUCCESS(Status)) + { + ZwClose(PnpMgrLevel2); + return Status; + } + + /* "Remove" the suffix by setting the length back to what it used to be */ + NameU.Length = (USHORT)OldLength; + + RtlInitUnicodeString(&Suffix, L".Translated"); + RtlAppendUnicodeStringToString(&NameU, &Suffix); + + Status = ZwSetValueKey(PnpMgrLevel2, + &NameU, + 0, + REG_RESOURCE_LIST, + DeviceNode->ResourceListTranslated, + CM_RESOURCE_LIST_SIZE(DeviceNode->ResourceListTranslated)); + ZwClose(PnpMgrLevel2); + if (!NT_SUCCESS(Status)) + return Status; + } + else + { + ZwClose(PnpMgrLevel2); + } + + IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); + + return STATUS_SUCCESS; +} + +NTSTATUS +IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode) +{ + return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager"); +} + +NTSTATUS +IopSetDeviceInstanceData(HANDLE InstanceKey, + PDEVICE_NODE DeviceNode) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + HANDLE LogConfKey; + ULONG ResCount; + ULONG ListSize, ResultLength; + NTSTATUS Status; + HANDLE ControlHandle; + + DPRINT("IopSetDeviceInstanceData() called\n"); + + /* Create the 'LogConf' key */ + RtlInitUnicodeString(&KeyName, L"LogConf"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + InstanceKey, + NULL); + Status = ZwCreateKey(&LogConfKey, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + 0, + NULL); + if (NT_SUCCESS(Status)) + { + /* Set 'BootConfig' value */ + if (DeviceNode->BootResources != NULL) + { + ResCount = DeviceNode->BootResources->Count; + if (ResCount != 0) + { + ListSize = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); + + RtlInitUnicodeString(&KeyName, L"BootConfig"); + Status = ZwSetValueKey(LogConfKey, + &KeyName, + 0, + REG_RESOURCE_LIST, + DeviceNode->BootResources, + ListSize); + } + } + + /* Set 'BasicConfigVector' value */ + if (DeviceNode->ResourceRequirements != NULL && + DeviceNode->ResourceRequirements->ListSize != 0) + { + RtlInitUnicodeString(&KeyName, L"BasicConfigVector"); + Status = ZwSetValueKey(LogConfKey, + &KeyName, + 0, + REG_RESOURCE_REQUIREMENTS_LIST, + DeviceNode->ResourceRequirements, + DeviceNode->ResourceRequirements->ListSize); + } + + ZwClose(LogConfKey); + } + + /* Set the 'ConfigFlags' value */ + RtlInitUnicodeString(&KeyName, L"ConfigFlags"); + Status = ZwQueryValueKey(InstanceKey, + &KeyName, + KeyValueBasicInformation, + NULL, + 0, + &ResultLength); + if (Status == STATUS_OBJECT_NAME_NOT_FOUND) + { + /* Write the default value */ + ULONG DefaultConfigFlags = 0; + Status = ZwSetValueKey(InstanceKey, + &KeyName, + 0, + REG_DWORD, + &DefaultConfigFlags, + sizeof(DefaultConfigFlags)); + } + + /* Create the 'Control' key */ + RtlInitUnicodeString(&KeyName, L"Control"); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + InstanceKey, + NULL); + Status = ZwCreateKey(&ControlHandle, 0, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); + + if (NT_SUCCESS(Status)) + ZwClose(ControlHandle); + + DPRINT("IopSetDeviceInstanceData() done\n"); + + return Status; +} + +BOOLEAN +IopCheckForResourceConflict( + IN PCM_RESOURCE_LIST ResourceList1, + IN PCM_RESOURCE_LIST ResourceList2) +{ + ULONG i1, i2, ii1, ii2; + BOOLEAN Result = FALSE; + + for (i1 = 0; i1 < ResourceList1->Count; i1++) + { + PCM_PARTIAL_RESOURCE_LIST ResList1 = &ResourceList1->List[i1].PartialResourceList; + for (i2 = 0; i2 < ResourceList2->Count; i2++) + { + PCM_PARTIAL_RESOURCE_LIST ResList2 = &ResourceList2->List[i2].PartialResourceList; + for (ii1 = 0; ii1 < ResList1->Count; ii1++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc1 = &ResList1->PartialDescriptors[ii1]; + + if (ResDesc1->ShareDisposition == CmResourceShareShared) + continue; + + for (ii2 = 0; ii2 < ResList2->Count; ii2++) + { + PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList2->PartialDescriptors[ii2]; + + /* We don't care about shared resources */ + if (ResDesc2->ShareDisposition == CmResourceShareShared) + continue; + + /* Make sure we're comparing the same types */ + if (ResDesc1->Type != ResDesc2->Type) + continue; + + switch (ResDesc1->Type) + { + case CmResourceTypeMemory: + if ((ResDesc1->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && + ResDesc1->u.Memory.Start.QuadPart + ResDesc1->u.Memory.Length > + ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < + ResDesc1->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + + ResDesc2->u.Memory.Length > ResDesc1->u.Memory.Start.QuadPart)) + { + DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc1->u.Memory.Start.QuadPart, ResDesc1->u.Memory.Start.QuadPart + + ResDesc1->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, + ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypePort: + if ((ResDesc1->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && + ResDesc1->u.Port.Start.QuadPart + ResDesc1->u.Port.Length > + ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < + ResDesc1->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + + ResDesc2->u.Port.Length > ResDesc1->u.Port.Start.QuadPart)) + { + DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc1->u.Port.Start.QuadPart, ResDesc1->u.Port.Start.QuadPart + + ResDesc1->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, + ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeInterrupt: + if (ResDesc1->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) + { + DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc1->u.Interrupt.Vector, ResDesc1->u.Interrupt.Level, + ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeBusNumber: + if ((ResDesc1->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && + ResDesc1->u.BusNumber.Start + ResDesc1->u.BusNumber.Length > + ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < + ResDesc1->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + + ResDesc2->u.BusNumber.Length > ResDesc1->u.BusNumber.Start)) + { + DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", + ResDesc1->u.BusNumber.Start, ResDesc1->u.BusNumber.Start + + ResDesc1->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, + ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); + + Result = TRUE; + + goto ByeBye; + } + break; + + case CmResourceTypeDma: + if (ResDesc1->u.Dma.Channel == ResDesc2->u.Dma.Channel) + { + DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", + ResDesc1->u.Dma.Channel, ResDesc1->u.Dma.Port, + ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); + + Result = TRUE; + + goto ByeBye; + } + break; + } + } + } + } + } + +ByeBye: + +#ifdef ENABLE_RESOURCE_CONFLICT_DETECTION + return Result; +#else + return FALSE; +#endif +} + +NTSTATUS +IopDetectResourceConflict( + IN PCM_RESOURCE_LIST ResourceList) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + HANDLE ResourceMapKey = INVALID_HANDLE_VALUE, ChildKey2 = INVALID_HANDLE_VALUE, ChildKey3 = INVALID_HANDLE_VALUE; + ULONG KeyInformationLength, RequiredLength, KeyValueInformationLength, KeyNameInformationLength; + PKEY_BASIC_INFORMATION KeyInformation; + PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; + PKEY_VALUE_BASIC_INFORMATION KeyNameInformation; + ULONG ChildKeyIndex1 = 0, ChildKeyIndex2 = 0, ChildKeyIndex3 = 0; + NTSTATUS Status; + + RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); + InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, 0, NULL); + Status = ZwOpenKey(&ResourceMapKey, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); + if (!NT_SUCCESS(Status)) + { + /* The key is missing which means we are the first device */ + return STATUS_SUCCESS; + } + + while (TRUE) + { + Status = ZwEnumerateKey(ResourceMapKey, + ChildKeyIndex1, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateKey(ResourceMapKey, + ChildKeyIndex1, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + goto cleanup; + ChildKeyIndex1++; + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyName.Buffer = KeyInformation->Name; + KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ResourceMapKey, + NULL); + Status = ZwOpenKey(&ChildKey2, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); + ExFreePool(KeyInformation); + if (!NT_SUCCESS(Status)) + goto cleanup; + + while (TRUE) + { + Status = ZwEnumerateKey(ChildKey2, + ChildKeyIndex2, + KeyBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyInformationLength = RequiredLength; + KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); + if (!KeyInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateKey(ChildKey2, + ChildKeyIndex2, + KeyBasicInformation, + KeyInformation, + KeyInformationLength, + &RequiredLength); + } + else + goto cleanup; + ChildKeyIndex2++; + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyName.Buffer = KeyInformation->Name; + KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ChildKey2, + NULL); + Status = ZwOpenKey(&ChildKey3, KEY_QUERY_VALUE, &ObjectAttributes); + ExFreePool(KeyInformation); + if (!NT_SUCCESS(Status)) + goto cleanup; + + while (TRUE) + { + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValuePartialInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_NO_MORE_ENTRIES) + break; + else if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyValueInformationLength = RequiredLength; + KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); + if (!KeyValueInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValuePartialInformation, + KeyValueInformation, + KeyValueInformationLength, + &RequiredLength); + } + else + goto cleanup; + if (!NT_SUCCESS(Status)) + goto cleanup; + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValueBasicInformation, + NULL, + 0, + &RequiredLength); + if (Status == STATUS_BUFFER_TOO_SMALL) + { + KeyNameInformationLength = RequiredLength; + KeyNameInformation = ExAllocatePool(PagedPool, KeyNameInformationLength + sizeof(WCHAR)); + if (!KeyNameInformation) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } + + Status = ZwEnumerateValueKey(ChildKey3, + ChildKeyIndex3, + KeyValueBasicInformation, + KeyNameInformation, + KeyNameInformationLength, + &RequiredLength); + } + else + goto cleanup; + + ChildKeyIndex3++; + + if (!NT_SUCCESS(Status)) + goto cleanup; + + KeyNameInformation->Name[KeyNameInformation->NameLength / sizeof(WCHAR)] = UNICODE_NULL; + + /* Skip translated entries */ + if (wcsstr(KeyNameInformation->Name, L".Translated")) + { + ExFreePool(KeyNameInformation); + continue; + } + + ExFreePool(KeyNameInformation); + + if (IopCheckForResourceConflict(ResourceList, + (PCM_RESOURCE_LIST)KeyValueInformation->Data)) + { + ExFreePool(KeyValueInformation); + Status = STATUS_CONFLICTING_ADDRESSES; + goto cleanup; + } + + ExFreePool(KeyValueInformation); + } + } + } + +cleanup: + if (ResourceMapKey != INVALID_HANDLE_VALUE) + ZwClose(ResourceMapKey); + if (ChildKey2 != INVALID_HANDLE_VALUE) + ZwClose(ChildKey2); + if (ChildKey3 != INVALID_HANDLE_VALUE) + ZwClose(ChildKey3); + + if (Status == STATUS_NO_MORE_ENTRIES) + Status = STATUS_SUCCESS; + + return Status; +} + +NTSTATUS +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode, + OUT ULONG *pRequiredSize) +{ + PIO_RESOURCE_LIST ResourceList; + PIO_RESOURCE_DESCRIPTOR ResourceDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw; + PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; + ULONG NumberOfResources = 0; + ULONG Size; + ULONG i, j; + NTSTATUS Status; + + if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) + { + /* No resource needed for this device */ + DeviceNode->ResourceList = NULL; + *pRequiredSize = 0; + return STATUS_SUCCESS; + } + + /* Fill DeviceNode->ResourceList + * FIXME: the PnP arbiter should go there! + * Actually, use the BootResources if provided, else the resource list #0 + */ + + if (DeviceNode->BootResources) + { + /* Browse the boot resources to know if we have some custom structures */ + Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); + for (i = 0; i < DeviceNode->BootResources->Count; i++) + { + pPartialResourceList = &DeviceNode->BootResources->List[i].PartialResourceList; + Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + + pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + for (j = 0; j < pPartialResourceList->Count; j++) + { + if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) + Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; + } + } + + DeviceNode->ResourceList = ExAllocatePool(PagedPool, Size); + if (!DeviceNode->ResourceList) + { + Status = STATUS_NO_MEMORY; + goto ByeBye; + } + RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, Size); + + Status = IopDetectResourceConflict(DeviceNode->ResourceList); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + *pRequiredSize = Size; + return STATUS_SUCCESS; + } + + /* Ok, here, we have to use the device requirement list */ + ResourceList = &DeviceNode->ResourceRequirements->List[0]; + if (ResourceList->Version != 1 || ResourceList->Revision != 1) + { + Status = STATUS_REVISION_MISMATCH; + goto ByeBye; + } + + Size = sizeof(CM_RESOURCE_LIST) + ResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + DeviceNode->ResourceList = ExAllocatePool(PagedPool, Size); + if (!DeviceNode->ResourceList) + { + Status = STATUS_NO_MEMORY; + goto ByeBye; + } + + DeviceNode->ResourceList->Count = 1; + DeviceNode->ResourceList->List[0].InterfaceType = DeviceNode->ResourceRequirements->InterfaceType; + DeviceNode->ResourceList->List[0].BusNumber = DeviceNode->ResourceRequirements->BusNumber; + DeviceNode->ResourceList->List[0].PartialResourceList.Version = 1; + DeviceNode->ResourceList->List[0].PartialResourceList.Revision = 1; + + for (i = 0; i < ResourceList->Count; i++) + { + ResourceDescriptor = &ResourceList->Descriptors[i]; + + if (ResourceDescriptor->Option == 0 || ResourceDescriptor->Option == IO_RESOURCE_PREFERRED) + { + DescriptorRaw = &DeviceNode->ResourceList->List[0].PartialResourceList.PartialDescriptors[NumberOfResources]; + NumberOfResources++; + + /* Copy ResourceDescriptor to DescriptorRaw and DescriptorTranslated */ + DescriptorRaw->Type = ResourceDescriptor->Type; + DescriptorRaw->ShareDisposition = ResourceDescriptor->ShareDisposition; + DescriptorRaw->Flags = ResourceDescriptor->Flags; + switch (ResourceDescriptor->Type) + { + case CmResourceTypePort: + { + DescriptorRaw->u.Port.Start = ResourceDescriptor->u.Port.MinimumAddress; + DescriptorRaw->u.Port.Length = ResourceDescriptor->u.Port.Length; + break; + } + case CmResourceTypeInterrupt: + { + INTERFACE_TYPE BusType; + ULONG SlotNumber; + ULONG ret; + UCHAR Irq; + + DescriptorRaw->u.Interrupt.Level = 0; + DescriptorRaw->u.Interrupt.Vector = ResourceDescriptor->u.Interrupt.MinimumVector; + /* FIXME: HACK: if we have a PCI device, we try + * to keep the IRQ assigned by the BIOS */ + if (NT_SUCCESS(IoGetDeviceProperty( + DeviceNode->PhysicalDeviceObject, + DevicePropertyLegacyBusType, + sizeof(INTERFACE_TYPE), + &BusType, + &ret)) && BusType == PCIBus) + { + /* We have a PCI bus */ + if (NT_SUCCESS(IoGetDeviceProperty( + DeviceNode->PhysicalDeviceObject, + DevicePropertyAddress, + sizeof(ULONG), + &SlotNumber, + &ret)) && SlotNumber > 0) + { + /* We have a good slot number */ + ret = HalGetBusDataByOffset(PCIConfiguration, + DeviceNode->ResourceRequirements->BusNumber, + SlotNumber, + &Irq, + 0x3c /* PCI_INTERRUPT_LINE */, + sizeof(UCHAR)); + if (ret != 0 && ret != 2 + && ResourceDescriptor->u.Interrupt.MinimumVector <= Irq + && ResourceDescriptor->u.Interrupt.MaximumVector >= Irq) + { + /* The device already has an assigned IRQ */ + DescriptorRaw->u.Interrupt.Vector = Irq; + } + else + { + DPRINT1("Trying to assign IRQ 0x%lx to %wZ\n", + DescriptorRaw->u.Interrupt.Vector, + &DeviceNode->InstancePath); + Irq = (UCHAR)DescriptorRaw->u.Interrupt.Vector; + ret = HalSetBusDataByOffset(PCIConfiguration, + DeviceNode->ResourceRequirements->BusNumber, + SlotNumber, + &Irq, + 0x3c /* PCI_INTERRUPT_LINE */, + sizeof(UCHAR)); + if (ret == 0 || ret == 2) + ASSERT(FALSE); + } + } + } + break; + } + case CmResourceTypeMemory: + { + DescriptorRaw->u.Memory.Start = ResourceDescriptor->u.Memory.MinimumAddress; + DescriptorRaw->u.Memory.Length = ResourceDescriptor->u.Memory.Length; + break; + } + case CmResourceTypeDma: + { + DescriptorRaw->u.Dma.Channel = ResourceDescriptor->u.Dma.MinimumChannel; + DescriptorRaw->u.Dma.Port = 0; /* FIXME */ + DescriptorRaw->u.Dma.Reserved1 = 0; + break; + } + case CmResourceTypeBusNumber: + { + DescriptorRaw->u.BusNumber.Start = ResourceDescriptor->u.BusNumber.MinBusNumber; + DescriptorRaw->u.BusNumber.Length = ResourceDescriptor->u.BusNumber.Length; + DescriptorRaw->u.BusNumber.Reserved = ResourceDescriptor->u.BusNumber.Reserved; + break; + } + /*CmResourceTypeDevicePrivate: + case CmResourceTypePcCardConfig: + case CmResourceTypeMfCardConfig: + { + RtlCopyMemory( + &DescriptorRaw->u.DevicePrivate, + &ResourceDescriptor->u.DevicePrivate, + sizeof(ResourceDescriptor->u.DevicePrivate)); + RtlCopyMemory( + &DescriptorTranslated->u.DevicePrivate, + &ResourceDescriptor->u.DevicePrivate, + sizeof(ResourceDescriptor->u.DevicePrivate)); + break; + }*/ + default: + DPRINT1("IopAssignDeviceResources(): unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type); + NumberOfResources--; + } + } + + } + + DeviceNode->ResourceList->List[0].PartialResourceList.Count = NumberOfResources; + + Status = IopDetectResourceConflict(DeviceNode->ResourceList); + if (!NT_SUCCESS(Status)) + goto ByeBye; + + *pRequiredSize = Size; + return STATUS_SUCCESS; - return STATUS_UNSUCCESSFUL; +ByeBye: + if (DeviceNode->ResourceList) + { + ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; + } + *pRequiredSize = 0; + return Status; } + NTSTATUS -IopSetDeviceInstanceData(HANDLE InstanceKey, - PDEVICE_NODE DeviceNode) +IopTranslateDeviceResources( + IN PDEVICE_NODE DeviceNode, + IN ULONG RequiredSize) { - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - HANDLE LogConfKey; - ULONG ResCount; - ULONG ResultLength; + PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; + PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated; + ULONG i, j; NTSTATUS Status; - HANDLE ControlHandle; - DPRINT("IopSetDeviceInstanceData() called\n"); + if (!DeviceNode->ResourceList) + { + DeviceNode->ResourceListTranslated = NULL; + return STATUS_SUCCESS; + } - /* Create the 'LogConf' key */ - RtlInitUnicodeString(&KeyName, L"LogConf"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - InstanceKey, - NULL); - Status = ZwCreateKey(&LogConfKey, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - 0, - NULL); - if (NT_SUCCESS(Status)) + /* That's easy to translate a resource list. Just copy the + * untranslated one and change few fields in the copy + */ + DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, RequiredSize); + if (!DeviceNode->ResourceListTranslated) { - /* Set 'BootConfig' value */ - if (DeviceNode->BootResources != NULL) + Status =STATUS_NO_MEMORY; + goto cleanup; + } + RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, RequiredSize); + + for (i = 0; i < DeviceNode->ResourceList->Count; i++) + { + pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; + for (j = 0; j < pPartialResourceList->Count; j++) { - ResCount = DeviceNode->BootResources->Count; - if (ResCount != 0) + DescriptorRaw = &pPartialResourceList->PartialDescriptors[j]; + DescriptorTranslated = &DeviceNode->ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j]; + switch (DescriptorRaw->Type) { - RtlInitUnicodeString(&KeyName, L"BootConfig"); - Status = ZwSetValueKey(LogConfKey, - &KeyName, - 0, - REG_RESOURCE_LIST, - DeviceNode->BootResources, - IopCalculateResourceListSize(DeviceNode->BootResources)); - } - } + case CmResourceTypePort: + { + ULONG AddressSpace = 1; /* IO space */ + if (!HalTranslateBusAddress( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Port.Start, + &AddressSpace, + &DescriptorTranslated->u.Port.Start)) + { + Status = STATUS_UNSUCCESSFUL; + goto cleanup; + } + break; + } + case CmResourceTypeInterrupt: + { + DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Interrupt.Level, + DescriptorRaw->u.Interrupt.Vector, + (PKIRQL)&DescriptorTranslated->u.Interrupt.Level, + &DescriptorRaw->u.Interrupt.Affinity); + break; + } + case CmResourceTypeMemory: + { + ULONG AddressSpace = 0; /* Memory space */ + if (!HalTranslateBusAddress( + DeviceNode->ResourceList->List[i].InterfaceType, + DeviceNode->ResourceList->List[i].BusNumber, + DescriptorRaw->u.Memory.Start, + &AddressSpace, + &DescriptorTranslated->u.Memory.Start)) + { + Status = STATUS_UNSUCCESSFUL; + goto cleanup; + } + } - /* Set 'BasicConfigVector' value */ - if (DeviceNode->ResourceRequirements != NULL && - DeviceNode->ResourceRequirements->ListSize != 0) - { - RtlInitUnicodeString(&KeyName, L"BasicConfigVector"); - Status = ZwSetValueKey(LogConfKey, - &KeyName, - 0, - REG_RESOURCE_REQUIREMENTS_LIST, - DeviceNode->ResourceRequirements, - DeviceNode->ResourceRequirements->ListSize); + case CmResourceTypeDma: + case CmResourceTypeBusNumber: + case CmResourceTypeDeviceSpecific: + /* Nothing to do */ + break; + default: + DPRINT1("Unknown resource descriptor type 0x%x\n", DescriptorRaw->Type); + Status = STATUS_NOT_IMPLEMENTED; + goto cleanup; + } } - - ZwClose(LogConfKey); } + return STATUS_SUCCESS; - /* Set the 'ConfigFlags' value */ - RtlInitUnicodeString(&KeyName, L"ConfigFlags"); - Status = ZwQueryValueKey(InstanceKey, - &KeyName, - KeyValueBasicInformation, - NULL, - 0, - &ResultLength); - if (Status == STATUS_OBJECT_NAME_NOT_FOUND) - { - /* Write the default value */ - ULONG DefaultConfigFlags = 0; - Status = ZwSetValueKey(InstanceKey, - &KeyName, - 0, - REG_DWORD, - &DefaultConfigFlags, - sizeof(DefaultConfigFlags)); - } - - /* Create the 'Control' key */ - RtlInitUnicodeString(&KeyName, L"Control"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - InstanceKey, - NULL); - Status = ZwCreateKey(&ControlHandle, 0, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); - - if (NT_SUCCESS(Status)) - ZwClose(ControlHandle); - - DPRINT("IopSetDeviceInstanceData() done\n"); - - return Status; +cleanup: + /* Yes! Also delete ResourceList because ResourceList and + * ResourceListTranslated should be a pair! */ + ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; + if (DeviceNode->ResourceListTranslated) + { + ExFreePool(DeviceNode->ResourceListTranslated); + DeviceNode->ResourceList = NULL; + } + return Status; } + /* * IopGetParentIdPrefix * @@ -1289,7 +1959,7 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, /* * Create registry key for the instance id, if it doesn't exist yet */ - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceKey); + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, &InstanceKey); if (!NT_SUCCESS(Status)) { DPRINT1("Failed to create the instance key! (Status %lx)\n", Status); @@ -1519,7 +2189,7 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, { DeviceNode->BootResources = (PCM_RESOURCE_LIST)IoStatusBlock.Information; - IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); + DeviceNode->Flags |= DNF_HAS_BOOT_CONFIG; } else { @@ -1538,6 +2208,10 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, { DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; + if (IoStatusBlock.Information) + IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_REPORTED); + else + IopDeviceNodeSetFlag(DeviceNode, DNF_NO_RESOURCE_REQUIRED); } else { @@ -1545,6 +2219,7 @@ IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, DeviceNode->ResourceRequirements = NULL; } + if (InstanceKey != NULL) { IopSetDeviceInstanceData(InstanceKey, DeviceNode); @@ -1808,8 +2483,14 @@ IopActionConfigureChildServices(PDEVICE_NODE DeviceNode, DPRINT1("%wZ is using parent bus driver (%wZ)\n", &DeviceNode->InstancePath, &ParentDeviceNode->ServiceName); DeviceNode->ServiceName.Length = 0; - DeviceNode->ServiceName.MaximumLength = 0; - DeviceNode->ServiceName.Buffer = NULL; + DeviceNode->ServiceName.MaximumLength = ParentDeviceNode->ServiceName.MaximumLength; + DeviceNode->ServiceName.Buffer = ExAllocatePool(PagedPool, DeviceNode->ServiceName.MaximumLength); + if (!DeviceNode->ServiceName.Buffer) + return STATUS_SUCCESS; + + RtlCopyUnicodeString(&DeviceNode->ServiceName, &ParentDeviceNode->ServiceName); + + IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER); } else if (ClassGUID.Length != 0) { @@ -1888,23 +2569,10 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, return STATUS_UNSUCCESSFUL; } #endif - if (IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED) || - IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) || - IopDeviceNodeHasFlag(DeviceNode, DNF_DISABLED)) - return STATUS_SUCCESS; - if (DeviceNode->ServiceName.Buffer == NULL) - { - /* We don't need to worry about loading the driver because we're - * being driven in raw mode so our parent must be loaded to get here */ - Status = IopStartDevice(DeviceNode); - if (!NT_SUCCESS(Status)) - { - DPRINT1("IopStartDevice(%wZ) failed with status 0x%08x\n", - &DeviceNode->InstancePath, Status); - } - } - else + if (!IopDeviceNodeHasFlag(DeviceNode, DNF_DISABLED) && + !IopDeviceNodeHasFlag(DeviceNode, DNF_ADDED) && + !IopDeviceNodeHasFlag(DeviceNode, DNF_STARTED)) { PLDR_DATA_TABLE_ENTRY ModuleObject; PDRIVER_OBJECT DriverObject; @@ -1947,8 +2615,24 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, /* Driver is loaded and initialized at this point */ if (NT_SUCCESS(Status)) { - /* Initialize the device, including all filters */ - Status = PipCallDriverAddDevice(DeviceNode, FALSE, DriverObject); + /* Attach lower level filter drivers. */ + IopAttachFilterDrivers(DeviceNode, TRUE); + /* Initialize the function driver for the device node */ + Status = IopInitializeDevice(DeviceNode, DriverObject); + + if (NT_SUCCESS(Status)) + { + /* Attach upper level filter drivers. */ + IopAttachFilterDrivers(DeviceNode, FALSE); + IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); + + Status = IopStartDevice(DeviceNode); + } + else + { + DPRINT1("IopInitializeDevice(%wZ) failed with status 0x%08x\n", + &DeviceNode->InstancePath, Status); + } } else { @@ -1965,6 +2649,11 @@ IopActionInitChildServices(PDEVICE_NODE DeviceNode, } } } + else + { + DPRINT("Device %wZ is disabled or already initialized\n", + &DeviceNode->InstancePath); + } return STATUS_SUCCESS; } @@ -2007,6 +2696,7 @@ IopEnumerateDetectedDevices( IN ULONG ParentBootResourcesLength) { UNICODE_STRING IdentifierU = RTL_CONSTANT_STRING(L"Identifier"); + UNICODE_STRING DeviceDescU = RTL_CONSTANT_STRING(L"DeviceDesc"); UNICODE_STRING HardwareIDU = RTL_CONSTANT_STRING(L"HardwareID"); UNICODE_STRING ConfigurationDataU = RTL_CONSTANT_STRING(L"Configuration Data"); UNICODE_STRING BootConfigU = RTL_CONSTANT_STRING(L"BootConfig"); @@ -2053,8 +2743,7 @@ IopEnumerateDetectedDevices( UNICODE_STRING HardwareIdKey; PUNICODE_STRING pHardwareId; ULONG DeviceIndex = 0; - PUCHAR CmResourceList; - ULONG ListCount; + BOOLEAN IsDeviceDesc; if (RelativePath) { @@ -2161,7 +2850,7 @@ IopEnumerateDetectedDevices( BootResourcesLength = pValueInformation->DataLength; else BootResourcesLength = ParentBootResourcesLength - + pValueInformation->DataLength + + pValueInformation->DataLength - Header; BootResources = ExAllocatePool(PagedPool, BootResourcesLength); if (!BootResources) @@ -2169,7 +2858,7 @@ IopEnumerateDetectedDevices( DPRINT("ExAllocatePool() failed\n"); goto nextdevice; } - if (ParentBootResourcesLength < sizeof(CM_FULL_RESOURCE_DESCRIPTOR)) + if (ParentBootResourcesLength == 0) { RtlCopyMemory(BootResources, pValueInformation->Data, pValueInformation->DataLength); } @@ -2281,26 +2970,31 @@ IopEnumerateDetectedDevices( { pHardwareId = &HardwareIdSerial; DeviceIndex = DeviceIndexSerial++; + IsDeviceDesc = TRUE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierKeyboard, FALSE) == 0) { pHardwareId = &HardwareIdKeyboard; DeviceIndex = DeviceIndexKeyboard++; + IsDeviceDesc = FALSE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierMouse, FALSE) == 0) { pHardwareId = &HardwareIdMouse; DeviceIndex = DeviceIndexMouse++; + IsDeviceDesc = FALSE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierParallel, FALSE) == 0) { pHardwareId = &HardwareIdParallel; DeviceIndex = DeviceIndexParallel++; + IsDeviceDesc = FALSE; } else if (RelativePath && RtlCompareUnicodeString(RelativePath, &IdentifierFloppy, FALSE) == 0) { pHardwareId = &HardwareIdFloppy; DeviceIndex = DeviceIndexFloppy++; + IsDeviceDesc = FALSE; } else if (NT_SUCCESS(Status)) { @@ -2309,11 +3003,13 @@ IopEnumerateDetectedDevices( { pHardwareId = &HardwareIdPci; DeviceIndex = DeviceIndexPci++; + IsDeviceDesc = FALSE; } else if (RtlCompareUnicodeString(&ValueName, &IdentifierIsa, FALSE) == 0) { pHardwareId = &HardwareIdIsa; DeviceIndex = DeviceIndexIsa++; + IsDeviceDesc = FALSE; } else { @@ -2365,6 +3061,16 @@ IopEnumerateDetectedDevices( goto nextdevice; } DPRINT("Found %wZ #%lu (%wZ)\n", &ValueName, DeviceIndex, &HardwareIdKey); + if (IsDeviceDesc) + { + Status = ZwSetValueKey(hLevel2Key, &DeviceDescU, 0, REG_SZ, ValueName.Buffer, ValueName.MaximumLength); + if (!NT_SUCCESS(Status)) + { + DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status); + ZwDeleteKey(hLevel2Key); + goto nextdevice; + } + } Status = ZwSetValueKey(hLevel2Key, &HardwareIDU, 0, REG_MULTI_SZ, pHardwareId->Buffer, pHardwareId->MaximumLength); if (!NT_SUCCESS(Status)) { @@ -2388,29 +3094,10 @@ IopEnumerateDetectedDevices( ZwDeleteKey(hLevel2Key); goto nextdevice; } - if (BootResourcesLength >= sizeof(CM_FULL_RESOURCE_DESCRIPTOR)) + if (BootResourcesLength > 0) { - CmResourceList = ExAllocatePool(PagedPool, BootResourcesLength + sizeof(ULONG)); - if (!CmResourceList) - { - ZwClose(hLogConf); - ZwDeleteKey(hLevel2Key); - goto nextdevice; - } - - /* Add the list count (1st member of CM_RESOURCE_LIST) */ - ListCount = 1; - RtlCopyMemory(CmResourceList, - &ListCount, - sizeof(ULONG)); - - /* Now add the actual list (2nd member of CM_RESOURCE_LIST) */ - RtlCopyMemory(CmResourceList + sizeof(ULONG), - BootResources, - BootResourcesLength); - /* Save boot resources to 'LogConf\BootConfig' */ - Status = ZwSetValueKey(hLogConf, &BootConfigU, 0, REG_RESOURCE_LIST, CmResourceList, BootResourcesLength + sizeof(ULONG)); + Status = ZwSetValueKey(hLogConf, &BootConfigU, 0, REG_FULL_RESOURCE_DESCRIPTOR, BootResources, BootResourcesLength); if (!NT_SUCCESS(Status)) { DPRINT("ZwSetValueKey() failed with status 0x%08lx\n", Status); @@ -2423,10 +3110,7 @@ IopEnumerateDetectedDevices( nextdevice: if (BootResources && BootResources != ParentBootResources) - { ExFreePool(BootResources); - BootResources = NULL; - } if (hLevel2Key) { ZwClose(hLevel2Key); @@ -2593,8 +3277,7 @@ cleanup: #endif } -NTSTATUS -NTAPI +static NTSTATUS INIT_FUNCTION IopUpdateRootKey(VOID) { UNICODE_STRING EnumU = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Enum"); @@ -2701,131 +3384,6 @@ IopOpenRegistryKeyEx(PHANDLE KeyHandle, return Status; } -NTSTATUS -NTAPI -IopCreateRegistryKeyEx(OUT PHANDLE Handle, - IN HANDLE RootHandle OPTIONAL, - IN PUNICODE_STRING KeyName, - IN ACCESS_MASK DesiredAccess, - IN ULONG CreateOptions, - OUT PULONG Disposition OPTIONAL) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - ULONG KeyDisposition, RootHandleIndex = 0, i = 1, NestedCloseLevel = 0, Length; - HANDLE HandleArray[2]; - BOOLEAN Recursing = TRUE; - PWCHAR pp, p, p1; - UNICODE_STRING KeyString; - NTSTATUS Status = STATUS_SUCCESS; - PAGED_CODE(); - - /* P1 is start, pp is end */ - p1 = KeyName->Buffer; - pp = (PVOID)((ULONG_PTR)p1 + KeyName->Length); - - /* Create the target key */ - InitializeObjectAttributes(&ObjectAttributes, - KeyName, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - RootHandle, - NULL); - Status = ZwCreateKey(&HandleArray[i], - DesiredAccess, - &ObjectAttributes, - 0, - NULL, - CreateOptions, - &KeyDisposition); - - /* Now we check if this failed */ - if ((Status == STATUS_OBJECT_NAME_NOT_FOUND) && (RootHandle)) - { - /* Target key failed, so we'll need to create its parent. Setup array */ - HandleArray[0] = NULL; - HandleArray[1] = RootHandle; - - /* Keep recursing for each missing parent */ - while (Recursing) - { - /* And if we're deep enough, close the last handle */ - if (NestedCloseLevel > 1) ZwClose(HandleArray[RootHandleIndex]); - - /* We're setup to ping-pong between the two handle array entries */ - RootHandleIndex = i; - i = (i + 1) & 1; - - /* Clear the one we're attempting to open now */ - HandleArray[i] = NULL; - - /* Process the parent key name */ - for (p = p1; ((p < pp) && (*p != OBJ_NAME_PATH_SEPARATOR)); p++); - Length = (p - p1) * sizeof(WCHAR); - - /* Is there a parent name? */ - if (Length) - { - /* Build the unicode string for it */ - KeyString.Buffer = p1; - KeyString.Length = KeyString.MaximumLength = Length; - - /* Now try opening the parent */ - InitializeObjectAttributes(&ObjectAttributes, - &KeyString, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - HandleArray[RootHandleIndex], - NULL); - Status = ZwCreateKey(&HandleArray[i], - DesiredAccess, - &ObjectAttributes, - 0, - NULL, - CreateOptions, - &KeyDisposition); - if (NT_SUCCESS(Status)) - { - /* It worked, we have one more handle */ - NestedCloseLevel++; - } - else - { - /* Parent key creation failed, abandon loop */ - Recursing = FALSE; - continue; - } - } - else - { - /* We don't have a parent name, probably corrupted key name */ - Status = STATUS_INVALID_PARAMETER; - Recursing = FALSE; - continue; - } - - /* Now see if there's more parents to create */ - p1 = p + 1; - if ((p == pp) || (p1 == pp)) - { - /* We're done, hopefully successfully, so stop */ - Recursing = FALSE; - } - } - - /* Outer loop check for handle nesting that requires closing the top handle */ - if (NestedCloseLevel > 1) ZwClose(HandleArray[RootHandleIndex]); - } - - /* Check if we broke out of the loop due to success */ - if (NT_SUCCESS(Status)) - { - /* Return the target handle (we closed all the parent ones) and disposition */ - *Handle = HandleArray[i]; - if (Disposition) *Disposition = KeyDisposition; - } - - /* Return the success state */ - return Status; -} - NTSTATUS NTAPI IopGetRegistryValue(IN HANDLE Handle, @@ -2871,6 +3429,95 @@ IopGetRegistryValue(IN HANDLE Handle, return STATUS_SUCCESS; } +static NTSTATUS INIT_FUNCTION +NTAPI +PnpDriverInitializeEmpty(IN struct _DRIVER_OBJECT *DriverObject, IN PUNICODE_STRING RegistryPath) +{ + return STATUS_SUCCESS; +} + +VOID INIT_FUNCTION +PnpInit(VOID) +{ + PDEVICE_OBJECT Pdo; + NTSTATUS Status; + + DPRINT("PnpInit()\n"); + + KeInitializeSpinLock(&IopDeviceTreeLock); + ExInitializeFastMutex(&IopBusTypeGuidListLock); + + /* Initialize the Bus Type GUID List */ + IopBusTypeGuidList = ExAllocatePool(NonPagedPool, sizeof(IO_BUS_TYPE_GUID_LIST)); + if (!IopBusTypeGuidList) { + DPRINT1("ExAllocatePool() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 0, 0, 0); + } + + RtlZeroMemory(IopBusTypeGuidList, sizeof(IO_BUS_TYPE_GUID_LIST)); + ExInitializeFastMutex(&IopBusTypeGuidList->Lock); + + /* Initialize PnP-Event notification support */ + Status = IopInitPlugPlayEvents(); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopInitPlugPlayEvents() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + /* + * Create root device node + */ + + Status = IopCreateDriver(NULL, PnpDriverInitializeEmpty, NULL, 0, 0, &IopRootDriverObject); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateDriverObject() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + Status = IoCreateDevice(IopRootDriverObject, 0, NULL, FILE_DEVICE_CONTROLLER, + 0, FALSE, &Pdo); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IoCreateDevice() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + Status = IopCreateDeviceNode(NULL, Pdo, NULL, &IopRootDeviceNode); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Insufficient resources\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } + + if (!RtlCreateUnicodeString(&IopRootDeviceNode->InstancePath, + L"HTREE\\ROOT\\0")) + { + DPRINT1("Failed to create the instance path!\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, STATUS_NO_MEMORY, 0, 0, 0); + } + + /* Report the device to the user-mode pnp manager */ + IopQueueTargetDeviceEvent(&GUID_DEVICE_ARRIVAL, + &IopRootDeviceNode->InstancePath); + + IopRootDeviceNode->PhysicalDeviceObject->Flags |= DO_BUS_ENUMERATED_DEVICE; + PnpRootDriverEntry(IopRootDriverObject, NULL); + IopRootDeviceNode->PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; + IopRootDriverObject->DriverExtension->AddDevice( + IopRootDriverObject, + IopRootDeviceNode->PhysicalDeviceObject); + + /* Move information about devices detected by Freeloader to SYSTEM\CurrentControlSet\Root\ */ + Status = IopUpdateRootKey(); + if (!NT_SUCCESS(Status)) + { + DPRINT1("IopUpdateRootKey() failed\n"); + KeBugCheckEx(PHASE1_INITIALIZATION_FAILED, Status, 0, 0, 0); + } +} + RTL_GENERIC_COMPARE_RESULTS NTAPI PiCompareInstancePath(IN PRTL_AVL_TABLE Table, @@ -2958,49 +3605,6 @@ PpInitSystem(VOID) } } -LONG IopNumberDeviceNodes; - -PDEVICE_NODE -NTAPI -PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject) -{ - PDEVICE_NODE DeviceNode; - PAGED_CODE(); - - /* Allocate it */ - DeviceNode = ExAllocatePoolWithTag(NonPagedPool, sizeof(DEVICE_NODE), 'donD'); - if (!DeviceNode) return DeviceNode; - - /* Statistics */ - InterlockedIncrement(&IopNumberDeviceNodes); - - /* Set it up */ - RtlZeroMemory(DeviceNode, sizeof(DEVICE_NODE)); - DeviceNode->InterfaceType = InterfaceTypeUndefined; - DeviceNode->BusNumber = -1; - DeviceNode->ChildInterfaceType = InterfaceTypeUndefined; - DeviceNode->ChildBusNumber = -1; - DeviceNode->ChildBusTypeIndex = -1; -// KeInitializeEvent(&DeviceNode->EnumerationMutex, SynchronizationEvent, TRUE); - InitializeListHead(&DeviceNode->DeviceArbiterList); - InitializeListHead(&DeviceNode->DeviceTranslatorList); - InitializeListHead(&DeviceNode->TargetDeviceNotify); - InitializeListHead(&DeviceNode->DockInfo.ListEntry); - InitializeListHead(&DeviceNode->PendedSetInterfaceState); - - /* Check if there is a PDO */ - if (PhysicalDeviceObject) - { - /* Link it and remove the init flag */ - DeviceNode->PhysicalDeviceObject = PhysicalDeviceObject; - ((PEXTENDED_DEVOBJ_EXTENSION)PhysicalDeviceObject->DeviceObjectExtension)->DeviceNode = DeviceNode; - PhysicalDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; - } - - /* Return the node */ - return DeviceNode; -} - /* PUBLIC FUNCTIONS **********************************************************/ /* @@ -3041,7 +3645,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, case DevicePropertyBusTypeGuid: /* Sanity check */ if ((DeviceNode->ChildBusTypeIndex != 0xFFFF) && - (DeviceNode->ChildBusTypeIndex < PnpBusTypeGuidList->GuidCount)) + (DeviceNode->ChildBusTypeIndex < IopBusTypeGuidList->GuidCount)) { /* Return the GUID */ *ResultLength = sizeof(GUID); @@ -3054,7 +3658,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, /* Copy the GUID */ RtlCopyMemory(PropertyBuffer, - &(PnpBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), + &(IopBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), sizeof(GUID)); return STATUS_SUCCESS; } @@ -3210,7 +3814,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, Length = 0; if (DeviceNode->BootResources->Count != 0) { - Length = IopCalculateResourceListSize(DeviceNode->BootResources); + Length = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); } Data = DeviceNode->BootResources; break; @@ -3220,7 +3824,7 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, Length = 0; if (DeviceNode->BootResources->Count != 0) { - Length = IopCalculateResourceListSize(DeviceNode->BootResources); + Length = CM_RESOURCE_LIST_SIZE(DeviceNode->BootResources); } Data = DeviceNode->BootResources; break; diff --git a/ntoskrnl/io/pnpmgr/pnpnotify.c b/ntoskrnl/io/pnpmgr/pnpnotify.c index f19f986e4e3..c328c80965f 100644 --- a/ntoskrnl/io/pnpmgr/pnpnotify.c +++ b/ntoskrnl/io/pnpmgr/pnpnotify.c @@ -42,8 +42,6 @@ IopNotifyPlugPlayNotification( PLIST_ENTRY ListEntry; PVOID NotificationStructure; BOOLEAN CallCurrentEntry; - UNICODE_STRING GuidString; - NTSTATUS Status; ASSERT(DeviceObject); @@ -73,13 +71,6 @@ IopNotifyPlugPlayNotification( RtlCopyMemory(&NotificationInfos->Event, Event, sizeof(GUID)); RtlCopyMemory(&NotificationInfos->InterfaceClassGuid, EventCategoryData1, sizeof(GUID)); NotificationInfos->SymbolicLinkName = (PUNICODE_STRING)EventCategoryData2; - Status = RtlStringFromGUID(&NotificationInfos->InterfaceClassGuid, &GuidString); - if (!NT_SUCCESS(Status)) - { - KeReleaseGuardedMutex(&PnpNotifyListLock); - ExFreePool(NotificationStructure); - return; - } break; } case EventCategoryHardwareProfileChange: @@ -134,17 +125,12 @@ IopNotifyPlugPlayNotification( ChangeEntry = CONTAINING_RECORD(ListEntry, PNP_NOTIFY_ENTRY, PnpNotifyList); CallCurrentEntry = FALSE; - if (ChangeEntry->EventCategory != EventCategory) - { - ListEntry = ListEntry->Flink; - continue; - } - switch (EventCategory) { case EventCategoryDeviceInterfaceChange: { - if (RtlCompareUnicodeString(&ChangeEntry->Guid, &GuidString, FALSE) == 0) + if (ChangeEntry->EventCategory == EventCategory + && RtlCompareUnicodeString(&ChangeEntry->Guid, (PUNICODE_STRING)EventCategoryData1, FALSE) == 0) { CallCurrentEntry = TRUE; } @@ -188,8 +174,6 @@ IopNotifyPlugPlayNotification( } KeReleaseGuardedMutex(&PnpNotifyListLock); ExFreePoolWithTag(NotificationStructure, TAG_PNP_NOTIFY); - if (EventCategory == EventCategoryDeviceInterfaceChange) - RtlFreeUnicodeString(&GuidString); } /* PUBLIC FUNCTIONS **********************************************************/ diff --git a/ntoskrnl/io/pnpmgr/pnpreport.c b/ntoskrnl/io/pnpmgr/pnpreport.c index f69bce02721..c75e566b0d4 100644 --- a/ntoskrnl/io/pnpmgr/pnpreport.c +++ b/ntoskrnl/io/pnpmgr/pnpreport.c @@ -15,17 +15,30 @@ NTSTATUS NTAPI IopCreateDeviceKeyPath(IN PCUNICODE_STRING RegistryPath, - IN ULONG CreateOptions, OUT PHANDLE Handle); +NTSTATUS +IopAssignDeviceResources( + IN PDEVICE_NODE DeviceNode, + OUT ULONG *pRequiredSize); + NTSTATUS IopSetDeviceInstanceData(HANDLE InstanceKey, PDEVICE_NODE DeviceNode); +NTSTATUS +IopTranslateDeviceResources( + IN PDEVICE_NODE DeviceNode, + IN ULONG RequiredSize); + NTSTATUS IopActionInterrogateDeviceStack(PDEVICE_NODE DeviceNode, PVOID Context); +NTSTATUS +IopUpdateResourceMapForPnPDevice( + IN PDEVICE_NODE DeviceNode); + NTSTATUS IopDetectResourceConflict( IN PCM_RESOURCE_LIST ResourceList); @@ -175,11 +188,6 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, /* We don't send IRP_MN_START_DEVICE */ IopDeviceNodeSetFlag(DeviceNode, DNF_STARTED); - /* We need to get device IDs */ -#if 0 - IopDeviceNodeSetFlag(DeviceNode, DNF_NEED_QUERY_IDS); -#endif - /* This is a legacy driver for this device */ IopDeviceNodeSetFlag(DeviceNode, DNF_LEGACY_DRIVER); @@ -188,7 +196,7 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, IopActionConfigureChildServices(DeviceNode, DeviceNode->Parent); /* Open a handle to the instance path key */ - Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, 0, &InstanceKey); + Status = IopCreateDeviceKeyPath(&DeviceNode->InstancePath, &InstanceKey); if (!NT_SUCCESS(Status)) return Status; @@ -249,29 +257,38 @@ IoReportDetectedDevice(IN PDRIVER_OBJECT DriverObject, if (DeviceNode->BootResources) IopDeviceNodeSetFlag(DeviceNode, DNF_HAS_BOOT_CONFIG); - if (!DeviceNode->ResourceRequirements && !DeviceNode->BootResources) + if (DeviceNode->ResourceRequirements) + IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_REPORTED); + else IopDeviceNodeSetFlag(DeviceNode, DNF_NO_RESOURCE_REQUIRED); /* Write the resource information to the registry */ IopSetDeviceInstanceData(InstanceKey, DeviceNode); + /* Close the instance key handle */ + ZwClose(InstanceKey); + /* If the caller didn't get the resources assigned for us, do it now */ if (!ResourceAssigned) { - Status = IopAssignDeviceResources(DeviceNode); + IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); + Status = IopAssignDeviceResources(DeviceNode, &RequiredLength); + if (NT_SUCCESS(Status)) + { + Status = IopTranslateDeviceResources(DeviceNode, RequiredLength); + if (NT_SUCCESS(Status)) + Status = IopUpdateResourceMapForPnPDevice(DeviceNode); + } + IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); /* See if we failed */ if (!NT_SUCCESS(Status)) { DPRINT("Assigning resources failed: 0x%x\n", Status); - ZwClose(InstanceKey); return Status; } } - /* Close the instance key handle */ - ZwClose(InstanceKey); - /* Report the device's enumeration to umpnpmgr */ IopQueueTargetDeviceEvent(&GUID_DEVICE_ENUMERATED, &DeviceNode->InstancePath); diff --git a/ntoskrnl/io/pnpmgr/pnpres.c b/ntoskrnl/io/pnpmgr/pnpres.c deleted file mode 100644 index 88148901112..00000000000 --- a/ntoskrnl/io/pnpmgr/pnpres.c +++ /dev/null @@ -1,1159 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * COPYRIGHT: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/io/pnpmgr/pnpres.c - * PURPOSE: Resource handling code - * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org) - * ReactOS Portable Systems Group - */ - -#include - -#define NDEBUG -#include - -NTSTATUS -IopDetectResourceConflict( - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor); - -ULONG -NTAPI -IopCalculateResourceListSize( - IN PCM_RESOURCE_LIST ResourceList) -{ - ULONG Size, i, j; - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < ResourceList->Count; i++) - { - pPartialResourceList = &ResourceList->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + - pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - for (j = 0; j < pPartialResourceList->Count; j++) - { - if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) - Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; - } - } - - return Size; -} - -static -BOOLEAN -IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - CM_RESOURCE_LIST CmList; - NTSTATUS Status; - - CmList.Count = 1; - CmList.List[0].InterfaceType = InterfaceTypeUndefined; - CmList.List[0].BusNumber = 0; - CmList.List[0].PartialResourceList.Version = 1; - CmList.List[0].PartialResourceList.Revision = 1; - CmList.List[0].PartialResourceList.Count = 1; - CmList.List[0].PartialResourceList.PartialDescriptors[0] = *CmDesc; - - Status = IopDetectResourceConflict(&CmList, TRUE, ConflictingDescriptor); - if (Status == STATUS_CONFLICTING_ADDRESSES) - return TRUE; - - return FALSE; -} - -static -BOOLEAN -IopFindBusNumberResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeBusNumber); - - for (Start = IoDesc->u.BusNumber.MinBusNumber; - Start < IoDesc->u.BusNumber.MaxBusNumber; - Start++) - { - CmDesc->u.BusNumber.Length = IoDesc->u.BusNumber.Length; - CmDesc->u.BusNumber.Start = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.BusNumber.Start + ConflictingDesc.u.BusNumber.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -static -BOOLEAN -IopFindMemoryResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONGLONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeMemory); - - for (Start = IoDesc->u.Memory.MinimumAddress.QuadPart; - Start < IoDesc->u.Memory.MaximumAddress.QuadPart; - Start++) - { - CmDesc->u.Memory.Length = IoDesc->u.Memory.Length; - CmDesc->u.Memory.Start.QuadPart = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.Memory.Start.QuadPart + ConflictingDesc.u.Memory.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -static -BOOLEAN -IopFindPortResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONGLONG Start; - CM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDesc; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypePort); - - for (Start = IoDesc->u.Port.MinimumAddress.QuadPart; - Start < IoDesc->u.Port.MaximumAddress.QuadPart; - Start++) - { - CmDesc->u.Port.Length = IoDesc->u.Port.Length; - CmDesc->u.Port.Start.QuadPart = Start; - - if (IopCheckDescriptorForConflict(CmDesc, &ConflictingDesc)) - { - Start += ConflictingDesc.u.Port.Start.QuadPart + ConflictingDesc.u.Port.Length; - } - else - { - return TRUE; - } - } - - return FALSE; -} - -static -BOOLEAN -IopFindDmaResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Channel; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeDma); - - for (Channel = IoDesc->u.Dma.MinimumChannel; - Channel < IoDesc->u.Dma.MaximumChannel; - Channel++) - { - CmDesc->u.Dma.Channel = Channel; - CmDesc->u.Dma.Port = 0; - - if (!IopCheckDescriptorForConflict(CmDesc, NULL)) - return TRUE; - } - - return FALSE; -} - -static -BOOLEAN -IopFindInterruptResource( - IN PIO_RESOURCE_DESCRIPTOR IoDesc, - OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc) -{ - ULONG Vector; - - ASSERT(IoDesc->Type == CmDesc->Type); - ASSERT(IoDesc->Type == CmResourceTypeInterrupt); - - for (Vector = IoDesc->u.Interrupt.MinimumVector; - Vector < IoDesc->u.Interrupt.MaximumVector; - Vector++) - { - CmDesc->u.Interrupt.Vector = Vector; - CmDesc->u.Interrupt.Level = Vector; - CmDesc->u.Interrupt.Affinity = (KAFFINITY)-1; - - if (!IopCheckDescriptorForConflict(CmDesc, NULL)) - return TRUE; - } - - return FALSE; -} - -static -NTSTATUS -IopCreateResourceListFromRequirements( - IN PIO_RESOURCE_REQUIREMENTS_LIST RequirementsList, - OUT PCM_RESOURCE_LIST *ResourceList) -{ - ULONG i, ii, Size; - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < RequirementsList->AlternativeLists; i++) - { - PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) - + ResList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - } - - *ResourceList = ExAllocatePool(PagedPool, Size); - if (!*ResourceList) - return STATUS_INSUFFICIENT_RESOURCES; - - (*ResourceList)->Count = 1; - (*ResourceList)->List[0].BusNumber = RequirementsList->BusNumber; - (*ResourceList)->List[0].InterfaceType = RequirementsList->InterfaceType; - (*ResourceList)->List[0].PartialResourceList.Version = 1; - (*ResourceList)->List[0].PartialResourceList.Revision = 1; - (*ResourceList)->List[0].PartialResourceList.Count = 0; - - ResDesc = &(*ResourceList)->List[0].PartialResourceList.PartialDescriptors[0]; - - for (i = 0; i < RequirementsList->AlternativeLists; i++) - { - PIO_RESOURCE_LIST ResList = &RequirementsList->List[i]; - for (ii = 0; ii < ResList->Count; ii++) - { - PIO_RESOURCE_DESCRIPTOR ReqDesc = &ResList->Descriptors[ii]; - - /* FIXME: Handle alternate ranges */ - if (ReqDesc->Option == IO_RESOURCE_ALTERNATIVE) - continue; - - ResDesc->Type = ReqDesc->Type; - ResDesc->Flags = ReqDesc->Flags; - ResDesc->ShareDisposition = ReqDesc->ShareDisposition; - - switch (ReqDesc->Type) - { - case CmResourceTypeInterrupt: - if (!IopFindInterruptResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available interrupt resource (0x%x to 0x%x)\n", - ReqDesc->u.Interrupt.MinimumVector, ReqDesc->u.Interrupt.MaximumVector); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypePort: - if (!IopFindPortResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available port resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.Port.MinimumAddress.QuadPart, ReqDesc->u.Port.MaximumAddress.QuadPart, - ReqDesc->u.Port.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeMemory: - if (!IopFindMemoryResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available memory resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.Memory.MinimumAddress.QuadPart, ReqDesc->u.Memory.MaximumAddress.QuadPart, - ReqDesc->u.Memory.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeBusNumber: - if (!IopFindBusNumberResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available bus number resource (0x%x to 0x%x length: 0x%x)\n", - ReqDesc->u.BusNumber.MinBusNumber, ReqDesc->u.BusNumber.MaxBusNumber, - ReqDesc->u.BusNumber.Length); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - case CmResourceTypeDma: - if (!IopFindDmaResource(ReqDesc, ResDesc)) - { - DPRINT1("Failed to find an available dma resource (0x%x to 0x%x)\n", - ReqDesc->u.Dma.MinimumChannel, ReqDesc->u.Dma.MaximumChannel); - - if (ReqDesc->Option == 0) - { - ExFreePool(*ResourceList); - return STATUS_CONFLICTING_ADDRESSES; - } - } - break; - - default: - DPRINT1("Unsupported resource type: %x\n", ReqDesc->Type); - break; - } - - (*ResourceList)->List[0].PartialResourceList.Count++; - ResDesc++; - } - } - - return STATUS_SUCCESS; -} - -static -BOOLEAN -IopCheckResourceDescriptor( - IN PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc, - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - ULONG i, ii; - BOOLEAN Result = FALSE; - - if (ResDesc->ShareDisposition == CmResourceShareShared) - return FALSE; - - for (i = 0; i < ResourceList->Count; i++) - { - PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList->List[i].PartialResourceList; - for (ii = 0; ii < ResList->Count; ii++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc2 = &ResList->PartialDescriptors[ii]; - - /* We don't care about shared resources */ - if (ResDesc->ShareDisposition == CmResourceShareShared && - ResDesc2->ShareDisposition == CmResourceShareShared) - continue; - - /* Make sure we're comparing the same types */ - if (ResDesc->Type != ResDesc2->Type) - continue; - - switch (ResDesc->Type) - { - case CmResourceTypeMemory: - if ((ResDesc->u.Memory.Start.QuadPart < ResDesc2->u.Memory.Start.QuadPart && - ResDesc->u.Memory.Start.QuadPart + ResDesc->u.Memory.Length > - ResDesc2->u.Memory.Start.QuadPart) || (ResDesc2->u.Memory.Start.QuadPart < - ResDesc->u.Memory.Start.QuadPart && ResDesc2->u.Memory.Start.QuadPart + - ResDesc2->u.Memory.Length > ResDesc->u.Memory.Start.QuadPart)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Memory (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.Memory.Start.QuadPart, ResDesc->u.Memory.Start.QuadPart + - ResDesc->u.Memory.Length, ResDesc2->u.Memory.Start.QuadPart, - ResDesc2->u.Memory.Start.QuadPart + ResDesc2->u.Memory.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypePort: - if ((ResDesc->u.Port.Start.QuadPart < ResDesc2->u.Port.Start.QuadPart && - ResDesc->u.Port.Start.QuadPart + ResDesc->u.Port.Length > - ResDesc2->u.Port.Start.QuadPart) || (ResDesc2->u.Port.Start.QuadPart < - ResDesc->u.Port.Start.QuadPart && ResDesc2->u.Port.Start.QuadPart + - ResDesc2->u.Port.Length > ResDesc->u.Port.Start.QuadPart)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Port (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.Port.Start.QuadPart, ResDesc->u.Port.Start.QuadPart + - ResDesc->u.Port.Length, ResDesc2->u.Port.Start.QuadPart, - ResDesc2->u.Port.Start.QuadPart + ResDesc2->u.Port.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeInterrupt: - if (ResDesc->u.Interrupt.Vector == ResDesc2->u.Interrupt.Vector) - { - if (!Silent) - { - DPRINT1("Resource conflict: IRQ (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc->u.Interrupt.Vector, ResDesc->u.Interrupt.Level, - ResDesc2->u.Interrupt.Vector, ResDesc2->u.Interrupt.Level); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeBusNumber: - if ((ResDesc->u.BusNumber.Start < ResDesc2->u.BusNumber.Start && - ResDesc->u.BusNumber.Start + ResDesc->u.BusNumber.Length > - ResDesc2->u.BusNumber.Start) || (ResDesc2->u.BusNumber.Start < - ResDesc->u.BusNumber.Start && ResDesc2->u.BusNumber.Start + - ResDesc2->u.BusNumber.Length > ResDesc->u.BusNumber.Start)) - { - if (!Silent) - { - DPRINT1("Resource conflict: Bus number (0x%x to 0x%x vs. 0x%x to 0x%x)\n", - ResDesc->u.BusNumber.Start, ResDesc->u.BusNumber.Start + - ResDesc->u.BusNumber.Length, ResDesc2->u.BusNumber.Start, - ResDesc2->u.BusNumber.Start + ResDesc2->u.BusNumber.Length); - } - - Result = TRUE; - - goto ByeBye; - } - break; - - case CmResourceTypeDma: - if (ResDesc->u.Dma.Channel == ResDesc2->u.Dma.Channel) - { - if (!Silent) - { - DPRINT1("Resource conflict: Dma (0x%x 0x%x vs. 0x%x 0x%x)\n", - ResDesc->u.Dma.Channel, ResDesc->u.Dma.Port, - ResDesc2->u.Dma.Channel, ResDesc2->u.Dma.Port); - } - - Result = TRUE; - - goto ByeBye; - } - break; - } - } - } - -ByeBye: - - if (Result && ConflictingDescriptor) - { - RtlCopyMemory(ConflictingDescriptor, - ResDesc, - sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)); - } - - return Result; -} - -static -NTSTATUS -IopUpdateControlKeyWithResources(IN PDEVICE_NODE DeviceNode) -{ - UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT); - UNICODE_STRING Control = RTL_CONSTANT_STRING(L"Control"); - UNICODE_STRING ValueName = RTL_CONSTANT_STRING(L"AllocConfig"); - HANDLE EnumKey, InstanceKey, ControlKey; - NTSTATUS Status; - OBJECT_ATTRIBUTES ObjectAttributes; - - /* Open the Enum key */ - Status = IopOpenRegistryKeyEx(&EnumKey, NULL, &EnumRoot, KEY_ENUMERATE_SUB_KEYS); - if (!NT_SUCCESS(Status)) - return Status; - - /* Open the instance key (eg. Root\PNP0A03) */ - Status = IopOpenRegistryKeyEx(&InstanceKey, EnumKey, &DeviceNode->InstancePath, KEY_ENUMERATE_SUB_KEYS); - ZwClose(EnumKey); - - if (!NT_SUCCESS(Status)) - return Status; - - /* Create/Open the Control key */ - InitializeObjectAttributes(&ObjectAttributes, - &Control, - OBJ_CASE_INSENSITIVE, - InstanceKey, - NULL); - Status = ZwCreateKey(&ControlKey, - KEY_SET_VALUE, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - NULL); - ZwClose(InstanceKey); - - if (!NT_SUCCESS(Status)) - return Status; - - /* Write the resource list */ - Status = ZwSetValueKey(ControlKey, - &ValueName, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceList, - IopCalculateResourceListSize(DeviceNode->ResourceList)); - ZwClose(ControlKey); - - if (!NT_SUCCESS(Status)) - return Status; - - return STATUS_SUCCESS; -} - -static -NTSTATUS -IopFilterResourceRequirements(IN PDEVICE_NODE DeviceNode) -{ - IO_STACK_LOCATION Stack; - IO_STATUS_BLOCK IoStatusBlock; - NTSTATUS Status; - - DPRINT("Sending IRP_MN_FILTER_RESOURCE_REQUIREMENTS to device stack\n"); - - Stack.Parameters.FilterResourceRequirements.IoResourceRequirementList = DeviceNode->ResourceRequirements; - Status = IopInitiatePnpIrp( - DeviceNode->PhysicalDeviceObject, - &IoStatusBlock, - IRP_MN_FILTER_RESOURCE_REQUIREMENTS, - &Stack); - if (!NT_SUCCESS(Status) && Status != STATUS_NOT_SUPPORTED) - { - DPRINT("IopInitiatePnpIrp(IRP_MN_FILTER_RESOURCE_REQUIREMENTS) failed\n"); - return Status; - } - else if (NT_SUCCESS(Status)) - { - DeviceNode->ResourceRequirements = (PIO_RESOURCE_REQUIREMENTS_LIST)IoStatusBlock.Information; - } - - return STATUS_SUCCESS; -} - - -NTSTATUS -IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2Key) -{ - NTSTATUS Status; - ULONG Disposition; - HANDLE PnpMgrLevel1, PnpMgrLevel2, ResourceMapKey; - UNICODE_STRING KeyName; - OBJECT_ATTRIBUTES ObjectAttributes; - - RtlInitUnicodeString(&KeyName, - L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - 0, - NULL); - Status = ZwCreateKey(&ResourceMapKey, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, Level1Key); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - ResourceMapKey, - NULL); - Status = ZwCreateKey(&PnpMgrLevel1, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - ZwClose(ResourceMapKey); - if (!NT_SUCCESS(Status)) - return Status; - - RtlInitUnicodeString(&KeyName, Level2Key); - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE | OBJ_OPENIF, - PnpMgrLevel1, - NULL); - Status = ZwCreateKey(&PnpMgrLevel2, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - REG_OPTION_VOLATILE, - &Disposition); - ZwClose(PnpMgrLevel1); - if (!NT_SUCCESS(Status)) - return Status; - - if (DeviceNode->ResourceList) - { - WCHAR NameBuff[256]; - UNICODE_STRING NameU; - UNICODE_STRING Suffix; - ULONG OldLength; - - ASSERT(DeviceNode->ResourceListTranslated); - - NameU.Buffer = NameBuff; - NameU.Length = 0; - NameU.MaximumLength = 256 * sizeof(WCHAR); - - Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, - DevicePropertyPhysicalDeviceObjectName, - NameU.MaximumLength, - NameU.Buffer, - &OldLength); - ASSERT(Status == STATUS_SUCCESS); - - NameU.Length = (USHORT)OldLength; - - RtlInitUnicodeString(&Suffix, L".Raw"); - RtlAppendUnicodeStringToString(&NameU, &Suffix); - - Status = ZwSetValueKey(PnpMgrLevel2, - &NameU, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceList, - IopCalculateResourceListSize(DeviceNode->ResourceList)); - if (!NT_SUCCESS(Status)) - { - ZwClose(PnpMgrLevel2); - return Status; - } - - /* "Remove" the suffix by setting the length back to what it used to be */ - NameU.Length = (USHORT)OldLength; - - RtlInitUnicodeString(&Suffix, L".Translated"); - RtlAppendUnicodeStringToString(&NameU, &Suffix); - - Status = ZwSetValueKey(PnpMgrLevel2, - &NameU, - 0, - REG_RESOURCE_LIST, - DeviceNode->ResourceListTranslated, - IopCalculateResourceListSize(DeviceNode->ResourceListTranslated)); - ZwClose(PnpMgrLevel2); - if (!NT_SUCCESS(Status)) - return Status; - } - else - { - ZwClose(PnpMgrLevel2); - } - - return STATUS_SUCCESS; -} - -NTSTATUS -IopUpdateResourceMapForPnPDevice(IN PDEVICE_NODE DeviceNode) -{ - return IopUpdateResourceMap(DeviceNode, L"PnP Manager", L"PnpManager"); -} - -static -NTSTATUS -IopTranslateDeviceResources( - IN PDEVICE_NODE DeviceNode) -{ - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - PCM_PARTIAL_RESOURCE_DESCRIPTOR DescriptorRaw, DescriptorTranslated; - ULONG i, j, ListSize; - NTSTATUS Status; - - if (!DeviceNode->ResourceList) - { - DeviceNode->ResourceListTranslated = NULL; - return STATUS_SUCCESS; - } - - /* That's easy to translate a resource list. Just copy the - * untranslated one and change few fields in the copy - */ - ListSize = IopCalculateResourceListSize(DeviceNode->ResourceList); - - DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize); - if (!DeviceNode->ResourceListTranslated) - { - Status =STATUS_NO_MEMORY; - goto cleanup; - } - RtlCopyMemory(DeviceNode->ResourceListTranslated, DeviceNode->ResourceList, ListSize); - - for (i = 0; i < DeviceNode->ResourceList->Count; i++) - { - pPartialResourceList = &DeviceNode->ResourceList->List[i].PartialResourceList; - for (j = 0; j < pPartialResourceList->Count; j++) - { - DescriptorRaw = &pPartialResourceList->PartialDescriptors[j]; - DescriptorTranslated = &DeviceNode->ResourceListTranslated->List[i].PartialResourceList.PartialDescriptors[j]; - switch (DescriptorRaw->Type) - { - case CmResourceTypePort: - { - ULONG AddressSpace = 1; /* IO space */ - if (!HalTranslateBusAddress( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Port.Start, - &AddressSpace, - &DescriptorTranslated->u.Port.Start)) - { - Status = STATUS_UNSUCCESSFUL; - goto cleanup; - } - break; - } - case CmResourceTypeInterrupt: - { - DescriptorTranslated->u.Interrupt.Vector = HalGetInterruptVector( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Interrupt.Level, - DescriptorRaw->u.Interrupt.Vector, - (PKIRQL)&DescriptorTranslated->u.Interrupt.Level, - &DescriptorRaw->u.Interrupt.Affinity); - break; - } - case CmResourceTypeMemory: - { - ULONG AddressSpace = 0; /* Memory space */ - if (!HalTranslateBusAddress( - DeviceNode->ResourceList->List[i].InterfaceType, - DeviceNode->ResourceList->List[i].BusNumber, - DescriptorRaw->u.Memory.Start, - &AddressSpace, - &DescriptorTranslated->u.Memory.Start)) - { - Status = STATUS_UNSUCCESSFUL; - goto cleanup; - } - } - - case CmResourceTypeDma: - case CmResourceTypeBusNumber: - case CmResourceTypeDeviceSpecific: - /* Nothing to do */ - break; - default: - DPRINT1("Unknown resource descriptor type 0x%x\n", DescriptorRaw->Type); - Status = STATUS_NOT_IMPLEMENTED; - goto cleanup; - } - } - } - return STATUS_SUCCESS; - -cleanup: - /* Yes! Also delete ResourceList because ResourceList and - * ResourceListTranslated should be a pair! */ - ExFreePool(DeviceNode->ResourceList); - DeviceNode->ResourceList = NULL; - if (DeviceNode->ResourceListTranslated) - { - ExFreePool(DeviceNode->ResourceListTranslated); - DeviceNode->ResourceList = NULL; - } - return Status; -} - -NTSTATUS -NTAPI -IopAssignDeviceResources( - IN PDEVICE_NODE DeviceNode) -{ - NTSTATUS Status; - ULONG ListSize; - - IopDeviceNodeSetFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - - Status = IopFilterResourceRequirements(DeviceNode); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - if (!DeviceNode->BootResources && !DeviceNode->ResourceRequirements) - { - DeviceNode->Flags |= DNF_NO_RESOURCE_REQUIRED; - DeviceNode->Flags &= ~DNF_ASSIGNING_RESOURCES; - - /* No resource needed for this device */ - DeviceNode->ResourceList = NULL; - DeviceNode->ResourceListTranslated = NULL; - - return STATUS_SUCCESS; - } - - /* Fill DeviceNode->ResourceList - * FIXME: the PnP arbiter should go there! - * Actually, use the BootResources if provided, else the resource requirements - */ - - if (DeviceNode->BootResources) - { - ListSize = IopCalculateResourceListSize(DeviceNode->BootResources); - - DeviceNode->ResourceList = ExAllocatePool(PagedPool, ListSize); - if (!DeviceNode->ResourceList) - { - Status = STATUS_NO_MEMORY; - goto ByeBye; - } - RtlCopyMemory(DeviceNode->ResourceList, DeviceNode->BootResources, ListSize); - - Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); - if (NT_SUCCESS(Status) || !DeviceNode->ResourceRequirements) - { - if (!NT_SUCCESS(Status) && !DeviceNode->ResourceRequirements) - { - DPRINT1("Using conflicting boot resources because no requirements were supplied!\n"); - } - - goto Finish; - } - else - { - DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); - ExFreePool(DeviceNode->ResourceList); - } - } - - Status = IopCreateResourceListFromRequirements(DeviceNode->ResourceRequirements, - &DeviceNode->ResourceList); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - Status = IopDetectResourceConflict(DeviceNode->ResourceList, FALSE, NULL); - if (!NT_SUCCESS(Status)) - goto ByeBye; - -Finish: - Status = IopTranslateDeviceResources(DeviceNode); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - Status = IopUpdateResourceMapForPnPDevice(DeviceNode); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - Status = IopUpdateControlKeyWithResources(DeviceNode); - if (!NT_SUCCESS(Status)) - goto ByeBye; - - IopDeviceNodeSetFlag(DeviceNode, DNF_RESOURCE_ASSIGNED); - - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - - return STATUS_SUCCESS; - -ByeBye: - if (DeviceNode->ResourceList) - { - ExFreePool(DeviceNode->ResourceList); - DeviceNode->ResourceList = NULL; - } - - DeviceNode->ResourceListTranslated = NULL; - - IopDeviceNodeClearFlag(DeviceNode, DNF_ASSIGNING_RESOURCES); - - return Status; -} - -static -BOOLEAN -IopCheckForResourceConflict( - IN PCM_RESOURCE_LIST ResourceList1, - IN PCM_RESOURCE_LIST ResourceList2, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - ULONG i, ii; - BOOLEAN Result = FALSE; - - for (i = 0; i < ResourceList1->Count; i++) - { - PCM_PARTIAL_RESOURCE_LIST ResList = &ResourceList1->List[i].PartialResourceList; - for (ii = 0; ii < ResList->Count; ii++) - { - PCM_PARTIAL_RESOURCE_DESCRIPTOR ResDesc = &ResList->PartialDescriptors[ii]; - - Result = IopCheckResourceDescriptor(ResDesc, - ResourceList2, - Silent, - ConflictingDescriptor); - if (Result) goto ByeBye; - } - } - - -ByeBye: - - return Result; -} - -NTSTATUS -IopDetectResourceConflict( - IN PCM_RESOURCE_LIST ResourceList, - IN BOOLEAN Silent, - OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) -{ - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING KeyName; - HANDLE ResourceMapKey = INVALID_HANDLE_VALUE, ChildKey2 = INVALID_HANDLE_VALUE, ChildKey3 = INVALID_HANDLE_VALUE; - ULONG KeyInformationLength, RequiredLength, KeyValueInformationLength, KeyNameInformationLength; - PKEY_BASIC_INFORMATION KeyInformation; - PKEY_VALUE_PARTIAL_INFORMATION KeyValueInformation; - PKEY_VALUE_BASIC_INFORMATION KeyNameInformation; - ULONG ChildKeyIndex1 = 0, ChildKeyIndex2 = 0, ChildKeyIndex3 = 0; - NTSTATUS Status; - - RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\RESOURCEMAP"); - InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, 0, NULL); - Status = ZwOpenKey(&ResourceMapKey, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); - if (!NT_SUCCESS(Status)) - { - /* The key is missing which means we are the first device */ - return STATUS_SUCCESS; - } - - while (TRUE) - { - Status = ZwEnumerateKey(ResourceMapKey, - ChildKeyIndex1, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateKey(ResourceMapKey, - ChildKeyIndex1, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - goto cleanup; - ChildKeyIndex1++; - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyName.Buffer = KeyInformation->Name; - KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ResourceMapKey, - NULL); - Status = ZwOpenKey(&ChildKey2, KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE, &ObjectAttributes); - ExFreePool(KeyInformation); - if (!NT_SUCCESS(Status)) - goto cleanup; - - while (TRUE) - { - Status = ZwEnumerateKey(ChildKey2, - ChildKeyIndex2, - KeyBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyInformationLength = RequiredLength; - KeyInformation = ExAllocatePool(PagedPool, KeyInformationLength); - if (!KeyInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateKey(ChildKey2, - ChildKeyIndex2, - KeyBasicInformation, - KeyInformation, - KeyInformationLength, - &RequiredLength); - } - else - goto cleanup; - ChildKeyIndex2++; - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyName.Buffer = KeyInformation->Name; - KeyName.MaximumLength = KeyName.Length = KeyInformation->NameLength; - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ChildKey2, - NULL); - Status = ZwOpenKey(&ChildKey3, KEY_QUERY_VALUE, &ObjectAttributes); - ExFreePool(KeyInformation); - if (!NT_SUCCESS(Status)) - goto cleanup; - - while (TRUE) - { - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValuePartialInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_NO_MORE_ENTRIES) - break; - else if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyValueInformationLength = RequiredLength; - KeyValueInformation = ExAllocatePool(PagedPool, KeyValueInformationLength); - if (!KeyValueInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValuePartialInformation, - KeyValueInformation, - KeyValueInformationLength, - &RequiredLength); - } - else - goto cleanup; - if (!NT_SUCCESS(Status)) - goto cleanup; - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValueBasicInformation, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_BUFFER_TOO_SMALL) - { - KeyNameInformationLength = RequiredLength; - KeyNameInformation = ExAllocatePool(PagedPool, KeyNameInformationLength + sizeof(WCHAR)); - if (!KeyNameInformation) - { - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - - Status = ZwEnumerateValueKey(ChildKey3, - ChildKeyIndex3, - KeyValueBasicInformation, - KeyNameInformation, - KeyNameInformationLength, - &RequiredLength); - } - else - goto cleanup; - - ChildKeyIndex3++; - - if (!NT_SUCCESS(Status)) - goto cleanup; - - KeyNameInformation->Name[KeyNameInformation->NameLength / sizeof(WCHAR)] = UNICODE_NULL; - - /* Skip translated entries */ - if (wcsstr(KeyNameInformation->Name, L".Translated")) - { - ExFreePool(KeyNameInformation); - continue; - } - - ExFreePool(KeyNameInformation); - - if (IopCheckForResourceConflict(ResourceList, - (PCM_RESOURCE_LIST)KeyValueInformation->Data, - Silent, - ConflictingDescriptor)) - { - ExFreePool(KeyValueInformation); - Status = STATUS_CONFLICTING_ADDRESSES; - goto cleanup; - } - - ExFreePool(KeyValueInformation); - } - } - } - -cleanup: - if (ResourceMapKey != INVALID_HANDLE_VALUE) - ZwClose(ResourceMapKey); - if (ChildKey2 != INVALID_HANDLE_VALUE) - ZwClose(ChildKey2); - if (ChildKey3 != INVALID_HANDLE_VALUE) - ZwClose(ChildKey3); - - if (Status == STATUS_NO_MORE_ENTRIES) - Status = STATUS_SUCCESS; - - return Status; -} - diff --git a/ntoskrnl/io/pnpmgr/pnproot.c b/ntoskrnl/io/pnpmgr/pnproot.c index 6f1834e5298..a5fa2a04f0c 100644 --- a/ntoskrnl/io/pnpmgr/pnproot.c +++ b/ntoskrnl/io/pnpmgr/pnproot.c @@ -33,6 +33,7 @@ typedef struct _PNPROOT_DEVICE UNICODE_STRING DeviceDescription; // Resource requirement list PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirementsList; + ULONG ResourceRequirementsListSize; // Associated resource list PCM_RESOURCE_LIST ResourceList; ULONG ResourceListSize; @@ -139,19 +140,29 @@ PnpRootCreateDevice( WCHAR InstancePath[5]; PPNPROOT_DEVICE Device = NULL; NTSTATUS Status; + ULONG i; UNICODE_STRING PathSep = RTL_CONSTANT_STRING(L"\\"); - ULONG NextInstance; - UNICODE_STRING EnumKeyName = RTL_CONSTANT_STRING(L"\\Registry\\Machine\\" REGSTR_PATH_SYSTEMENUM); - HANDLE EnumHandle, DeviceKeyHandle = INVALID_HANDLE_VALUE; - RTL_QUERY_REGISTRY_TABLE QueryTable[2]; - OBJECT_ATTRIBUTES ObjectAttributes; DeviceExtension = PnpRootDeviceObject->DeviceExtension; KeAcquireGuardedMutex(&DeviceExtension->DeviceListLock); DPRINT("Creating a PnP root device for service '%wZ'\n", ServiceName); + /* Search for a free instance ID */ _snwprintf(DevicePath, sizeof(DevicePath) / sizeof(WCHAR), L"%s\\%wZ", REGSTR_KEY_ROOTENUM, ServiceName); + for (i = 0; i < 9999; i++) + { + _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu", i); + Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device); + if (Status == STATUS_NO_SUCH_DEVICE) + break; + } + if (i == 9999) + { + DPRINT1("Too much legacy devices reported for service '%wZ'\n", ServiceName); + Status = STATUS_INSUFFICIENT_RESOURCES; + goto cleanup; + } /* Initialize a PNPROOT_DEVICE structure */ Device = ExAllocatePoolWithTag(PagedPool, sizeof(PNPROOT_DEVICE), TAG_PNP_ROOT); @@ -167,74 +178,6 @@ PnpRootCreateDevice( Status = STATUS_NO_MEMORY; goto cleanup; } - - Status = IopOpenRegistryKeyEx(&EnumHandle, NULL, &EnumKeyName, KEY_READ); - if (NT_SUCCESS(Status)) - { - InitializeObjectAttributes(&ObjectAttributes, &Device->DeviceID, OBJ_CASE_INSENSITIVE, EnumHandle, NULL); - Status = ZwCreateKey(&DeviceKeyHandle, KEY_SET_VALUE, &ObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL); - ZwClose(EnumHandle); - } - - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to open registry key\n"); - goto cleanup; - } - -tryagain: - RtlZeroMemory(QueryTable, sizeof(QueryTable)); - QueryTable[0].Name = L"NextInstance"; - QueryTable[0].EntryContext = &NextInstance; - QueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT | RTL_QUERY_REGISTRY_REQUIRED; - - Status = RtlQueryRegistryValues(RTL_REGISTRY_HANDLE, - (PWSTR)DeviceKeyHandle, - QueryTable, - NULL, - NULL); - if (!NT_SUCCESS(Status)) - { - for (NextInstance = 0; NextInstance <= 9999; NextInstance++) - { - _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu", NextInstance); - Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device); - if (Status == STATUS_NO_SUCH_DEVICE) - break; - } - - if (NextInstance > 9999) - { - DPRINT1("Too many legacy devices reported for service '%wZ'\n", ServiceName); - Status = STATUS_INSUFFICIENT_RESOURCES; - goto cleanup; - } - } - - _snwprintf(InstancePath, sizeof(InstancePath) / sizeof(WCHAR), L"%04lu", NextInstance); - Status = LocateChildDevice(DeviceExtension, DevicePath, InstancePath, &Device); - if (Status != STATUS_NO_SUCH_DEVICE || NextInstance > 9999) - { - DPRINT1("NextInstance value is corrupt! (%d)\n", NextInstance); - RtlDeleteRegistryValue(RTL_REGISTRY_HANDLE, - (PWSTR)DeviceKeyHandle, - L"NextInstance"); - goto tryagain; - } - - NextInstance++; - Status = RtlWriteRegistryValue(RTL_REGISTRY_HANDLE, - (PWSTR)DeviceKeyHandle, - L"NextInstance", - REG_DWORD, - &NextInstance, - sizeof(NextInstance)); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to write new NextInstance value! (0x%x)\n", Status); - goto cleanup; - } - if (!RtlCreateUnicodeString(&Device->InstanceID, InstancePath)) { Status = STATUS_NO_MEMORY; @@ -301,8 +244,6 @@ cleanup: RtlFreeUnicodeString(&Device->InstanceID); ExFreePoolWithTag(Device, TAG_PNP_ROOT); } - if (DeviceKeyHandle != INVALID_HANDLE_VALUE) - ZwClose(DeviceKeyHandle); return Status; } @@ -736,27 +677,24 @@ PnpRootFdoPnpControl( if (NT_SUCCESS(Status)) DeviceExtension->State = dsStarted; } - - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + break; case IRP_MN_STOP_DEVICE: DPRINT("IRP_MJ_PNP / IRP_MN_STOP_DEVICE\n"); /* Root device cannot be stopped */ - Irp->IoStatus.Status = Status = STATUS_INVALID_DEVICE_REQUEST; - IoCompleteRequest(Irp, IO_NO_INCREMENT); - return Status; + Status = STATUS_NOT_SUPPORTED; + break; default: DPRINT("IRP_MJ_PNP / Unknown minor function 0x%lx\n", IrpSp->MinorFunction); + Status = STATUS_NOT_IMPLEMENTED; break; } if (Status != STATUS_PENDING) { - Irp->IoStatus.Status = Status; - IoCompleteRequest(Irp, IO_NO_INCREMENT); + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); } return Status; @@ -769,25 +707,48 @@ PdoQueryDeviceRelations( IN PIO_STACK_LOCATION IrpSp) { PDEVICE_RELATIONS Relations; + DEVICE_RELATION_TYPE RelationType; NTSTATUS Status = Irp->IoStatus.Status; - if (IrpSp->Parameters.QueryDeviceRelations.Type != TargetDeviceRelation) - return Status; + RelationType = IrpSp->Parameters.QueryDeviceRelations.Type; - DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n"); - Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); - if (!Relations) - { - DPRINT("ExAllocatePoolWithTag() failed\n"); - Status = STATUS_NO_MEMORY; - } - else + switch (RelationType) { - ObReferenceObject(DeviceObject); - Relations->Count = 1; - Relations->Objects[0] = DeviceObject; - Status = STATUS_SUCCESS; - Irp->IoStatus.Information = (ULONG_PTR)Relations; + /* FIXME: remove */ + case BusRelations: + { + if (IoGetAttachedDevice(DeviceObject) != DeviceObject) + { + /* We're not alone in the stack */ + DPRINT1("PnP is misbehaving ; don't know how to handle IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n"); + } + break; + } + + case TargetDeviceRelation: + { + DPRINT("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / TargetDeviceRelation\n"); + Relations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS)); + if (!Relations) + { + DPRINT("ExAllocatePoolWithTag() failed\n"); + Status = STATUS_NO_MEMORY; + } + else + { + ObReferenceObject(DeviceObject); + Relations->Count = 1; + Relations->Objects[0] = DeviceObject; + Status = STATUS_SUCCESS; + Irp->IoStatus.Information = (ULONG_PTR)Relations; + } + break; + } + + default: + { + DPRINT1("IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / unknown relation type 0x%lx\n", RelationType); + } } return Status; @@ -825,29 +786,35 @@ PdoQueryResources( DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - if (DeviceExtension->DeviceInfo->ResourceList) + if (DeviceExtension->DeviceInfo->ResourceList == NULL) + { + /* Create an empty resource list */ + ResourceList = ExAllocatePool(PagedPool, sizeof(CM_RESOURCE_LIST)); + if (!ResourceList) + return STATUS_NO_MEMORY; + + ResourceList->Count = 0; + + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; + } + else { /* Copy existing resource requirement list */ ResourceList = ExAllocatePool( PagedPool, - DeviceExtension->DeviceInfo->ResourceListSize); + FIELD_OFFSET(CM_RESOURCE_LIST, List) + DeviceExtension->DeviceInfo->ResourceListSize); if (!ResourceList) return STATUS_NO_MEMORY; + ResourceList->Count = 1; RtlCopyMemory( - ResourceList, + &ResourceList->List, DeviceExtension->DeviceInfo->ResourceList, DeviceExtension->DeviceInfo->ResourceListSize); - - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - - return STATUS_SUCCESS; - } - else - { - /* No resources so just return without changing the status */ - return Irp->IoStatus.Status; + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; } + + return STATUS_SUCCESS; } static NTSTATUS @@ -858,10 +825,23 @@ PdoQueryResourceRequirements( { PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension; PIO_RESOURCE_REQUIREMENTS_LIST ResourceList; + ULONG ResourceListSize = FIELD_OFFSET(IO_RESOURCE_REQUIREMENTS_LIST, List); DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - if (DeviceExtension->DeviceInfo->ResourceRequirementsList) + if (DeviceExtension->DeviceInfo->ResourceRequirementsList == NULL) + { + /* Create an empty resource list */ + ResourceList = ExAllocatePool(PagedPool, ResourceListSize); + if (!ResourceList) + return STATUS_NO_MEMORY; + + RtlZeroMemory(ResourceList, ResourceListSize); + ResourceList->ListSize = ResourceListSize; + + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; + } + else { /* Copy existing resource requirement list */ ResourceList = ExAllocatePool(PagedPool, DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize); @@ -872,16 +852,10 @@ PdoQueryResourceRequirements( ResourceList, DeviceExtension->DeviceInfo->ResourceRequirementsList, DeviceExtension->DeviceInfo->ResourceRequirementsList->ListSize); - - Irp->IoStatus.Information = (ULONG_PTR)ResourceList; - - return STATUS_SUCCESS; - } - else - { - /* No resource requirements so just return without changing the status */ - return Irp->IoStatus.Status; + Irp->IoStatus.Information = (ULONG_PTR)ResourceList; } + + return STATUS_SUCCESS; } static NTSTATUS @@ -1069,11 +1043,6 @@ PnpRootPdoPnpControl( DPRINT("IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n"); break; - case IRP_MN_REMOVE_DEVICE: - DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); - Status = STATUS_SUCCESS; - break; - case IRP_MN_QUERY_ID: /* 0x13 */ Status = PdoQueryId(DeviceObject, Irp, IrpSp); break; @@ -1190,8 +1159,6 @@ PnpRootDriverEntry( { DPRINT("PnpRootDriverEntry(%p %wZ)\n", DriverObject, RegistryPath); - IopRootDriverObject = DriverObject; - DriverObject->DriverExtension->AddDevice = PnpRootAddDevice; DriverObject->MajorFunction[IRP_MJ_PNP] = PnpRootPnpControl; diff --git a/ntoskrnl/io/pnpmgr/pnputil.c b/ntoskrnl/io/pnpmgr/pnputil.c deleted file mode 100644 index f274f3db679..00000000000 --- a/ntoskrnl/io/pnpmgr/pnputil.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: ntoskrnl/io/pnpmgr/pnputil.c - * PURPOSE: PnP Utility Code - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include - -/* GLOBALS ********************************************************************/ - -/* FUNCTIONS ******************************************************************/ - -VOID -NTAPI -PnpFreeUnicodeStringList(IN PUNICODE_STRING UnicodeStringList, - IN ULONG StringCount) -{ - ULONG i; - - /* Go through the list */ - if (UnicodeStringList) - { - /* Go through each string */ - for (i = 0; i < StringCount; i++) - { - /* Check if it exists */ - if (UnicodeStringList[i].Buffer) - { - /* Free it */ - ExFreePool(UnicodeStringList[i].Buffer); - } - } - - /* Free the whole list */ - ExFreePool(UnicodeStringList); - } -} - -NTSTATUS -NTAPI -PnpRegMultiSzToUnicodeStrings(IN PKEY_VALUE_FULL_INFORMATION KeyValueInformation, - OUT PUNICODE_STRING *UnicodeStringList, - OUT PULONG UnicodeStringCount) -{ - PWCHAR p, pp, ps; - ULONG i = 0, n; - ULONG Count = 0; - - /* Validate the key information */ - if (KeyValueInformation->Type != REG_MULTI_SZ) return STATUS_INVALID_PARAMETER; - - /* Set the pointers */ - p = (PWCHAR)((ULONG_PTR)KeyValueInformation + - KeyValueInformation->DataOffset); - pp = (PWCHAR)((ULONG_PTR)p + KeyValueInformation->DataLength); - - /* Loop the data */ - while (p != pp) - { - /* If we find a NULL, that means one string is done */ - if (!*p) - { - /* Add to our string count */ - Count++; - - /* Check for a double-NULL, which means we're done */ - if (((p + 1) == pp) || !(*(p + 1))) break; - } - - /* Go to the next character */ - p++; - } - - /* If we looped the whole list over, we missed increment a string, do it */ - if (p == pp) Count++; - - /* Allocate the list now that we know how big it is */ - *UnicodeStringList = ExAllocatePoolWithTag(PagedPool, - sizeof(UNICODE_STRING) * Count, - 'sUpP'); - if (!(*UnicodeStringList)) return STATUS_INSUFFICIENT_RESOURCES; - - /* Set pointers for second loop */ - ps = p = (PWCHAR)((ULONG_PTR)KeyValueInformation + - KeyValueInformation->DataOffset); - - /* Loop again, to do the copy this time */ - while (p != pp) - { - /* If we find a NULL, that means one string is done */ - if (!*p) - { - /* Check how long this string is */ - n = (ULONG_PTR)p - (ULONG_PTR)ps + sizeof(UNICODE_NULL); - - /* Allocate the buffer */ - (*UnicodeStringList)[i].Buffer = ExAllocatePoolWithTag(PagedPool, - n, - 'sUpP'); - if (!(*UnicodeStringList)[i].Buffer) - { - /* Back out of everything */ - PnpFreeUnicodeStringList(*UnicodeStringList, i); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Copy the string into the buffer */ - RtlCopyMemory((*UnicodeStringList)[i].Buffer, ps, n); - - /* Set the lengths */ - (*UnicodeStringList)[i].MaximumLength = n; - (*UnicodeStringList)[i].Length = n - sizeof(UNICODE_NULL); - - /* One more entry done */ - i++; - - /* Check for a double-NULL, which means we're done */ - if (((p + 1) == pp) || !(*(p + 1))) break; - - /* New string */ - ps = p + 1; - } - - /* New string */ - p++; - } - - /* Check if we've reached the last string */ - if (p == pp) - { - /* Calculate the string length */ - n = (ULONG_PTR)p - (ULONG_PTR)ps; - - /* Allocate the buffer for it */ - (*UnicodeStringList)[i].Buffer = ExAllocatePoolWithTag(PagedPool, - n + - sizeof(UNICODE_NULL), - 'sUpP'); - if (!(*UnicodeStringList)[i].Buffer) - { - /* Back out of everything */ - PnpFreeUnicodeStringList(*UnicodeStringList, i); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Make sure there's an actual string here */ - if (n) RtlCopyMemory((*UnicodeStringList)[i].Buffer, ps, n); - - /* Null-terminate the string ourselves */ - (*UnicodeStringList)[i].Buffer[n / sizeof(WCHAR)] = UNICODE_NULL; - - /* Set the lenghts */ - (*UnicodeStringList)[i].Length = n; - (*UnicodeStringList)[i].MaximumLength = n + sizeof(UNICODE_NULL); - } - - /* And we're done */ - *UnicodeStringCount = Count; - return STATUS_SUCCESS; -} - -BOOLEAN -NTAPI -PnpRegSzToString(IN PWCHAR RegSzData, - IN ULONG RegSzLength, - OUT PUSHORT StringLength OPTIONAL) -{ - PWCHAR p, pp; - - /* Find the end */ - pp = RegSzData + RegSzLength; - for (p = RegSzData; p < pp; p++) if (!*p) break; - - /* Return it */ - if (StringLength) *StringLength = p - RegSzData; - return TRUE; -} - -/* EOF */ diff --git a/ntoskrnl/kdbg/kdb_cli.c b/ntoskrnl/kdbg/kdb_cli.c index 4c469fd3721..fa42826c9fa 100644 --- a/ntoskrnl/kdbg/kdb_cli.c +++ b/ntoskrnl/kdbg/kdb_cli.c @@ -823,8 +823,7 @@ KdbpCmdBackTrace( break; } - /* Print the location of the call instruction */ - if (!KdbSymPrintAddress((PVOID)(Address - 5))) + if (!KdbSymPrintAddress((PVOID)Address)) KdbpPrint("<%08x>\n", Address); else KdbpPrint("\n"); diff --git a/ntoskrnl/ke/i386/exp.c b/ntoskrnl/ke/i386/exp.c index 38dded77062..284ff19e3bf 100644 --- a/ntoskrnl/ke/i386/exp.c +++ b/ntoskrnl/ke/i386/exp.c @@ -584,7 +584,7 @@ KeContextToTrapFrame(IN PCONTEXT Context, } /* Handle the Debug Registers */ - if (0 && (ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) + if ((ContextFlags & CONTEXT_DEBUG_REGISTERS) == CONTEXT_DEBUG_REGISTERS) { /* Loop DR registers */ for (i = 0; i < 4; i++) diff --git a/ntoskrnl/ke/i386/traphdlr.c b/ntoskrnl/ke/i386/traphdlr.c index b9033c2069e..f9a954ec298 100644 --- a/ntoskrnl/ke/i386/traphdlr.c +++ b/ntoskrnl/ke/i386/traphdlr.c @@ -240,7 +240,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, } /* User or kernel trap -- get ready to issue an exception */ - //if (Thread->NpxState == NPX_STATE_NOT_LOADED) + if (Thread->NpxState == NPX_STATE_NOT_LOADED) { /* Update CR0 */ Cr0 = __readcr0(); @@ -248,7 +248,7 @@ KiNpxHandler(IN PKTRAP_FRAME TrapFrame, __writecr0(Cr0); /* Save FPU state */ - Ke386SaveFpuState(SaveArea); + //Ke386SaveFpuState(SaveArea); /* Mark CR0 state dirty */ Cr0 |= NPX_STATE_NOT_LOADED; @@ -1082,64 +1082,64 @@ KiTrap0DHandler(IN PKTRAP_FRAME TrapFrame) * we should probably table this for now since it's not a "real" issue. */ - /* - * NOTE2: Another scenario is the IRET during a V8086 restore (BIOS Call) - * which will cause a GPF since the trap frame is a total mess (on purpose) - * as built in KiEnterV86Mode. - * - * The idea is to scan for IRET, scan for the known EIP adress, validate CS - * and then manually issue a jump to the V8086 return EIP. - */ - Instructions = (PUCHAR)TrapFrame->Eip; - if (Instructions[0] == 0xCF) - { - /* - * Some evil shit is going on here -- this is not the SS:ESP you're - * looking for! Instead, this is actually CS:EIP you're looking at! - * Why? Because part of the trap frame actually corresponds to the IRET - * stack during the trap exit! - */ - if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) && - (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) - { - /* Exit the V86 trap! */ - Ki386BiosCallReturnAddress(TrapFrame); - } - else - { - /* Otherwise, this is another kind of IRET fault */ - UNIMPLEMENTED; - while (TRUE); - } - } + /* + * NOTE2: Another scenario is the IRET during a V8086 restore (BIOS Call) + * which will cause a GPF since the trap frame is a total mess (on purpose) + * as built in KiEnterV86Mode. + * + * The idea is to scan for IRET, scan for the known EIP adress, validate CS + * and then manually issue a jump to the V8086 return EIP. + */ + Instructions = (PUCHAR)TrapFrame->Eip; + if (Instructions[0] == 0xCF) + { + /* + * Some evil shit is going on here -- this is not the SS:ESP you're + * looking for! Instead, this is actually CS:EIP you're looking at! + * Why? Because part of the trap frame actually corresponds to the IRET + * stack during the trap exit! + */ + if ((TrapFrame->HardwareEsp == (ULONG)Ki386BiosCallReturnAddress) && + (TrapFrame->HardwareSegSs == (KGDT_R0_CODE | RPL_MASK))) + { + /* Exit the V86 trap! */ + Ki386BiosCallReturnAddress(TrapFrame); + } + else + { + /* Otherwise, this is another kind of IRET fault */ + UNIMPLEMENTED; + while (TRUE); + } + } /* So since we're not dealing with the above case, check for RDMSR/WRMSR */ - if ((Instructions[0] == 0xF) && // 2-byte opcode + if ((Instructions[0] == 0xF) && // 2-byte opcode (((Instructions[1] >> 8) == 0x30) || // RDMSR ((Instructions[2] >> 8) == 0x32))) // WRMSR - { + { /* Unknown CPU MSR, so raise an access violation */ KiDispatchException0Args(STATUS_ACCESS_VIOLATION, TrapFrame->Eip, TrapFrame); - } - - /* Check for lazy segment load */ - if (TrapFrame->SegDs != (KGDT_R3_DATA | RPL_MASK)) - { - /* Fix it */ - TrapFrame->SegDs = (KGDT_R3_DATA | RPL_MASK); - } - else if (TrapFrame->SegEs != (KGDT_R3_DATA | RPL_MASK)) - { + } + + /* Check for lazy segment load */ + if (TrapFrame->SegDs != (KGDT_R3_DATA | RPL_MASK)) + { + /* Fix it */ + TrapFrame->SegDs = (KGDT_R3_DATA | RPL_MASK); + } + else if (TrapFrame->SegEs != (KGDT_R3_DATA | RPL_MASK)) + { /* Fix it */ TrapFrame->SegEs = (KGDT_R3_DATA | RPL_MASK); - } - else - { - /* Whatever it is, we can't handle it */ - KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); - } + } + else + { + /* Whatever it is, we can't handle it */ + KiSystemFatalException(EXCEPTION_GP_FAULT, TrapFrame); + } /* Return to where we came from */ KiTrapReturn(TrapFrame); @@ -1353,7 +1353,7 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) __writecr0(Cr0); /* Save FPU state */ - Ke386SaveFpuState(SaveArea); + //Ke386SaveFpuState(SaveArea); /* Mark CR0 state dirty */ Cr0 |= NPX_STATE_NOT_LOADED; @@ -1379,7 +1379,7 @@ KiTrap13Handler(IN PKTRAP_FRAME TrapFrame) FSW_UNDERFLOW | FSW_PRECISION); Error &= MxCsrMask; - + /* Now handle any of those legal errors */ if (Error & (FSW_INVALID_OPERATION | FSW_DENORMAL | diff --git a/ntoskrnl/mm/ARM3/drvmgmt.c b/ntoskrnl/mm/ARM3/drvmgmt.c index ad85c479ca5..4811a441dd4 100644 --- a/ntoskrnl/mm/ARM3/drvmgmt.c +++ b/ntoskrnl/mm/ARM3/drvmgmt.c @@ -21,12 +21,55 @@ MM_DRIVER_VERIFIER_DATA MmVerifierData; LIST_ENTRY MiVerifierDriverAddedThunkListHead; ULONG MiActiveVerifierThunks; -WCHAR MmVerifyDriverBuffer[512] = {0}; -ULONG MmVerifyDriverBufferLength = sizeof(MmVerifyDriverBuffer); -ULONG MmVerifyDriverBufferType = REG_NONE; -ULONG MmVerifyDriverLevel = -1; -PVOID MmTriageActionTaken; -PVOID KernelVerifier; + +/* PRIVATE FUNCTIONS *********************************************************/ + +PLDR_DATA_TABLE_ENTRY +NTAPI +MiLookupDataTableEntry(IN PVOID Address) +{ + PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; + PLIST_ENTRY NextEntry; + PAGED_CODE(); + + // + // Loop entries + // + NextEntry = PsLoadedModuleList.Flink; + do + { + // + // Get the loader entry + // + LdrEntry = CONTAINING_RECORD(NextEntry, + LDR_DATA_TABLE_ENTRY, + InLoadOrderLinks); + + // + // Check if the address matches + // + if ((Address >= LdrEntry->DllBase) && + (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + + LdrEntry->SizeOfImage))) + { + // + // Found a match + // + FoundEntry = LdrEntry; + break; + } + + // + // Move on + // + NextEntry = NextEntry->Flink; + } while(NextEntry != &PsLoadedModuleList); + + // + // Return the entry + // + return FoundEntry; +} /* PUBLIC FUNCTIONS ***********************************************************/ @@ -64,6 +107,68 @@ MmLockPageableDataSection(IN PVOID AddressWithinSection) return AddressWithinSection; } +/* + * @unimplemented + */ +PVOID +NTAPI +MmPageEntireDriver(IN PVOID AddressWithinSection) +{ + //PMMPTE StartPte, EndPte; + PLDR_DATA_TABLE_ENTRY LdrEntry; + PAGED_CODE(); + + // + // Get the loader entry + // + LdrEntry = MiLookupDataTableEntry(AddressWithinSection); + if (!LdrEntry) return NULL; + + // + // Check if paging of kernel mode is disabled or if the driver is mapped as + // an image + // + if ((MmDisablePagingExecutive & 0x1) || (LdrEntry->SectionPointer)) + { + // + // Don't do anything, just return the base address + // + return LdrEntry->DllBase; + } + + // + // Wait for active DPCs to finish before we page out the driver + // + KeFlushQueuedDpcs(); + + // + // Get the PTE range for the whole driver image + // + //StartPte = MiGetPteAddress(LdrEntry->DllBase); + //EndPte = MiGetPteAddress(LdrEntry->DllBase + + // LdrEntry->SizeOfImage); + + // + // Enable paging for the PTE range + // + //MiSetPagingOfDriver(StartPte, EndPte); + + // + // Return the base address + // + return LdrEntry->DllBase; +} + +/* + * @unimplemented + */ +VOID +NTAPI +MmResetDriverPaging(IN PVOID AddressWithinSection) +{ + UNIMPLEMENTED; +} + /* * @unimplemented */ diff --git a/ntoskrnl/mm/ARM3/largepag.c b/ntoskrnl/mm/ARM3/largepag.c deleted file mode 100644 index 0cd1e502f2e..00000000000 --- a/ntoskrnl/mm/ARM3/largepag.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: BSD - See COPYING.ARM in the top level directory - * FILE: ntoskrnl/mm/ARM3/largepag.c - * PURPOSE: ARM Memory Manager Large Page Support - * PROGRAMMERS: ReactOS Portable Systems Group - */ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include - -#line 15 "ARM³::LARGEPAGE" -#define MODULE_INVOLVED_IN_ARM3 -#include "../ARM3/miarm.h" - -/* GLOBALS ********************************************************************/ - -LIST_ENTRY MmProcessList; -PMMPTE MiLargePageHyperPte; -ULONG MiLargePageRangeIndex; -MI_LARGE_PAGE_RANGES MiLargePageRanges[64]; -WCHAR MmLargePageDriverBuffer[512] = {0}; -ULONG MmLargePageDriverBufferLength = -1; -LIST_ENTRY MiLargePageDriverList; -BOOLEAN MiLargePageAllDrivers; - -/* FUNCTIONS ******************************************************************/ - -VOID -NTAPI -MiInitializeLargePageSupport(VOID) -{ -#if _MI_PAGING_LEVELS > 2 -#error "PAE/x64 Not Implemented" -#else - /* Initialize the large-page hyperspace PTE used for initial mapping */ - MiLargePageHyperPte = MiReserveSystemPtes(1, SystemPteSpace); - ASSERT(MiLargePageHyperPte); - MiLargePageHyperPte->u.Long = 0; - - /* Initialize the process tracking list, and insert the system process */ - InitializeListHead(&MmProcessList); - InsertTailList(&MmProcessList, &PsGetCurrentProcess()->MmProcessLinks); -#endif -} - -VOID -NTAPI -MiSyncCachedRanges(VOID) -{ - ULONG i; - - /* Scan every range */ - for (i = 0; i < MiLargePageRangeIndex; i++) - { - DPRINT1("No support for large pages\n"); - while (TRUE); - } -} - -VOID -NTAPI -MiInitializeDriverLargePageList(VOID) -{ - PWCHAR p, pp; - - /* Initialize the list */ - InitializeListHead(&MiLargePageDriverList); - - /* Bail out if there's nothing */ - if (MmLargePageDriverBufferLength == 0xFFFFFFFF) return; - - /* Loop from start to finish */ - p = MmLargePageDriverBuffer; - pp = MmLargePageDriverBuffer + (MmLargePageDriverBufferLength / sizeof(WCHAR)); - while (p < pp) - { - /* Skip whitespaces */ - if ((*p == L' ') || (*p == L'\n') || (*p == L'\r') || (*p == L'\t')) - { - /* Skip the character */ - p++; - continue; - } - - /* A star means everything */ - if (*p == L'*') - { - /* No need to keep going */ - MiLargePageAllDrivers = TRUE; - break; - } - - DPRINT1("Large page drivers not supported\n"); - ASSERT(FALSE); - } -} - -/* EOF */ diff --git a/ntoskrnl/mm/ARM3/mdlsup.c b/ntoskrnl/mm/ARM3/mdlsup.c index 1b95448fc43..0100040f1c7 100644 --- a/ntoskrnl/mm/ARM3/mdlsup.c +++ b/ntoskrnl/mm/ARM3/mdlsup.c @@ -16,9 +16,6 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" -BOOLEAN MmTrackPtes; -BOOLEAN MmTrackLockedPages; - /* PUBLIC FUNCTIONS ***********************************************************/ /* diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h index 11d4189a958..389781cbb04 100644 --- a/ntoskrnl/mm/ARM3/miarm.h +++ b/ntoskrnl/mm/ARM3/miarm.h @@ -40,10 +40,7 @@ /* Make the code cleaner with some definitions for size multiples */ #define _1KB (1024) -#define _1MB (1024 * _1KB) - -/* Are mapped by a PDE */ -#define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) +#define _1MB (1000 * _1KB) /* Size of a PDE directory, and size of a page table */ #define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) @@ -62,40 +59,6 @@ #error Define these please! #endif -#ifdef _M_IX86 -#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_I386 -#elif _M_ARM -#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_ARM -#elif _M_AMD64 -#define IMAGE_FILE_MACHINE_NATIVE IMAGE_FILE_MACHINE_AMD64 -#else -#error Define these please! -#endif - -// -// Protection Bits part of the internal memory manager Protection Mask -// Taken from http://www.reactos.org/wiki/Techwiki:Memory_management_in_the_Windows_XP_kernel -// and public assertions. -// -#define MM_ZERO_ACCESS 0 -#define MM_READONLY 1 -#define MM_EXECUTE 2 -#define MM_EXECUTE_READ 3 -#define MM_READWRITE 4 -#define MM_WRITECOPY 5 -#define MM_EXECUTE_READWRITE 6 -#define MM_EXECUTE_WRITECOPY 7 -#define MM_NOCACHE 8 -#define MM_DECOMMIT 0x10 -#define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE) - -// -// Special values for LoadedImports -// -#define MM_SYSLDR_NO_IMPORTS (PVOID)0xFFFFFFFE -#define MM_SYSLDR_BOOT_LOADED (PVOID)0xFFFFFFFF -#define MM_SYSLDR_SINGLE_ENTRY 0x1 - // // PFN List Sentinel // @@ -164,12 +127,6 @@ extern PVOID PoolTrackTable; // END FIXFIX // -typedef struct _MI_LARGE_PAGE_DRIVER_ENTRY -{ - LIST_ENTRY Links; - UNICODE_STRING BaseName; -} MI_LARGE_PAGE_DRIVER_ENTRY, *PMI_LARGE_PAGE_DRIVER_ENTRY; - typedef enum _MMSYSTEM_PTE_POOL_TYPE { SystemPteSpace, @@ -205,34 +162,10 @@ typedef struct _MMCOLOR_TABLES PFN_NUMBER Count; } MMCOLOR_TABLES, *PMMCOLOR_TABLES; -typedef struct _MI_LARGE_PAGE_RANGES -{ - PFN_NUMBER StartFrame; - PFN_NUMBER LastFrame; -} MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES; - extern MMPTE HyperTemplatePte; extern MMPTE ValidKernelPde; extern MMPTE ValidKernelPte; -extern BOOLEAN MmLargeSystemCache; -extern BOOLEAN MmZeroPageFile; -extern BOOLEAN MmProtectFreedNonPagedPool; -extern BOOLEAN MmTrackLockedPages; -extern BOOLEAN MmTrackPtes; -extern BOOLEAN MmDynamicPfn; -extern BOOLEAN MmMirroring; -extern BOOLEAN MmMakeLowMemory; -extern BOOLEAN MmEnforceWriteProtection; -extern ULONG MmAllocationFragment; -extern ULONG MmConsumedPoolPercentage; -extern ULONG MmVerifyDriverBufferType; -extern ULONG MmVerifyDriverLevel; -extern WCHAR MmVerifyDriverBuffer[512]; -extern WCHAR MmLargePageDriverBuffer[512]; -extern LIST_ENTRY MiLargePageDriverList; -extern BOOLEAN MiLargePageAllDrivers; -extern ULONG MmVerifyDriverBufferLength; -extern ULONG MmLargePageDriverBufferLength; + extern ULONG MmSizeOfNonPagedPoolInBytes; extern ULONG MmMaximumNonPagedPoolInBytes; extern PFN_NUMBER MmMaximumNonPagedPoolInPages; @@ -302,34 +235,10 @@ extern PFN_NUMBER MiLowNonPagedPoolThreshold; extern PFN_NUMBER MiHighNonPagedPoolThreshold; extern PFN_NUMBER MmMinimumFreePages; extern PFN_NUMBER MmPlentyFreePages; -extern PFN_NUMBER MiExpansionPoolPagesInitialCharge; -extern PFN_NUMBER MmResidentAvailablePages; -extern PFN_NUMBER MmResidentAvailableAtInit; -extern ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]; -extern PFN_NUMBER MmTotalSystemDriverPages; -extern PVOID MiSessionImageStart; -extern PVOID MiSessionImageEnd; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) -#define MI_IS_SESSION_IMAGE_ADDRESS(Address) \ - (((Address) >= MiSessionImageStart) && ((Address) < MiSessionImageEnd)) - -#define MI_IS_SESSION_ADDRESS(Address) \ - (((Address) >= MmSessionBase) && ((Address) < MiSessionSpaceEnd)) - -FORCEINLINE -BOOLEAN -MI_IS_PHYSICAL_ADDRESS(IN PVOID Address) -{ - PMMPDE PointerPde; - - /* Large pages are never paged out, always physically resident */ - PointerPde = MiAddressToPde(Address); - return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid)); -} - NTSTATUS NTAPI MmArmInitSystem( @@ -539,28 +448,4 @@ MiInsertPageInFreeList( IN PFN_NUMBER PageFrameIndex ); -PLDR_DATA_TABLE_ENTRY -NTAPI -MiLookupDataTableEntry( - IN PVOID Address -); - -VOID -NTAPI -MiInitializeDriverLargePageList( - VOID -); - -VOID -NTAPI -MiInitializeLargePageSupport( - VOID -); - -VOID -NTAPI -MiSyncCachedRanges( - VOID -); - /* EOF */ diff --git a/ntoskrnl/mm/ARM3/mminit.c b/ntoskrnl/mm/ARM3/mminit.c index d21adc08758..89d082e4f95 100644 --- a/ntoskrnl/mm/ARM3/mminit.c +++ b/ntoskrnl/mm/ARM3/mminit.c @@ -301,20 +301,6 @@ PFN_NUMBER MmPlentyFreePages = 400; ULONG MmProductType; MM_SYSTEMSIZE MmSystemSize; -/* - * These values store the cache working set minimums and maximums, in pages - * - * The minimum value is boosted on systems with more than 24MB of RAM, and cut - * down to only 32 pages on embedded (<24MB RAM) systems. - * - * An extra boost of 2MB is given on systems with more than 33MB of RAM. - */ -PFN_NUMBER MmSystemCacheWsMinimum = 288; -PFN_NUMBER MmSystemCacheWsMaximum = 350; - -/* FIXME: Move to cache/working set code later */ -BOOLEAN MmLargeSystemCache; - /* PRIVATE FUNCTIONS **********************************************************/ // @@ -756,7 +742,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) else { /* Next PDE mapped address */ - BaseAddress += PDE_MAPPED_VA; + BaseAddress += PTE_COUNT * PAGE_SIZE; } /* Next PTE */ @@ -1173,61 +1159,6 @@ MiInitializeMemoryEvents(VOID) return TRUE; } -VOID -NTAPI -MiAddHalIoMappings(VOID) -{ - PVOID BaseAddress; - PMMPTE PointerPde; - PMMPTE PointerPte; - ULONG i, j, PdeCount; - PFN_NUMBER PageFrameIndex; - - /* HAL Heap address -- should be on a PDE boundary */ - BaseAddress = (PVOID)0xFFC00000; - ASSERT(MiAddressToPteOffset(BaseAddress) == 0); - - /* Check how many PDEs the heap has */ - PointerPde = MiAddressToPde(BaseAddress); - PdeCount = PDE_COUNT - ADDR_TO_PDE_OFFSET(BaseAddress); - for (i = 0; i < PdeCount; i++) - { - /* Does the HAL own this mapping? */ - if ((PointerPde->u.Hard.Valid == 1) && - (PointerPde->u.Hard.LargePage == 0)) - { - /* Get the PTE for it and scan each page */ - PointerPte = MiAddressToPte(BaseAddress); - for (j = 0 ; j < PTE_COUNT; j++) - { - /* Does the HAL own this page? */ - if (PointerPte->u.Hard.Valid == 1) - { - /* Is the HAL using it for device or I/O mapped memory? */ - PageFrameIndex = PFN_FROM_PTE(PointerPte); - if (!MiGetPfnEntry(PageFrameIndex)) - { - /* FIXME: For PAT, we need to track I/O cache attributes for coherency */ - DPRINT1("HAL I/O Mapping at %p is unsafe\n", BaseAddress); - } - } - - /* Move to the next page */ - BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PAGE_SIZE); - PointerPte++; - } - } - else - { - /* Move to the next address */ - BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PDE_MAPPED_VA); - } - - /* Move to the next PDE */ - PointerPde++; - } -} - VOID NTAPI MmDumpArmPfnDatabase(VOID) @@ -1882,26 +1813,11 @@ MmArmInitSystem(IN ULONG Phase, } } - /* Look for large page cache entries that need caching */ - MiSyncCachedRanges(); - - /* Loop for HAL Heap I/O device mappings that need coherency tracking */ - MiAddHalIoMappings(); - - /* Set the initial resident page count */ - MmResidentAvailablePages = MmAvailablePages - 32; - - /* Initialize large page structures on PAE/x64, and MmProcessList on x86 */ - MiInitializeLargePageSupport(); - - /* Check if the registry says any drivers should be loaded with large pages */ - MiInitializeDriverLargePageList(); - - /* Relocate the boot drivers into system PTE space and fixup their PFNs */ - MiReloadBootLoadedDrivers(LoaderBlock); - - /* FIXME: Call out into Driver Verifier for initialization */ - + // + // Size up paged pool and build the shadow system page directory + // + MiBuildPagedPool(); + /* Check how many pages the system has */ if (MmNumberOfPhysicalPages <= (13 * _1MB)) { @@ -1910,22 +1826,13 @@ MmArmInitSystem(IN ULONG Phase, } else if (MmNumberOfPhysicalPages <= (19 * _1MB)) { - /* Set small system and add 100 pages for the cache */ + /* Set small system */ MmSystemSize = MmSmallSystem; - MmSystemCacheWsMinimum += 100; } else { - /* Set medium system and add 400 pages for the cache */ + /* Set medium system */ MmSystemSize = MmMediumSystem; - MmSystemCacheWsMinimum += 400; - } - - /* Check for less than 24MB */ - if (MmNumberOfPhysicalPages < ((24 * _1MB) / PAGE_SIZE)) - { - /* No more than 32 pages */ - MmSystemCacheWsMinimum = 32; } /* Check for more than 32MB */ @@ -1947,14 +1854,7 @@ MmArmInitSystem(IN ULONG Phase, } } } - - /* Check for more than 33 MB */ - if (MmNumberOfPhysicalPages > ((33 * _1MB) / PAGE_SIZE)) - { - /* Add another 500 pages to the cache */ - MmSystemCacheWsMinimum += 500; - } - + /* Now setup the shared user data fields */ ASSERT(SharedUserData->NumberOfPhysicalPages == 0); SharedUserData->NumberOfPhysicalPages = MmNumberOfPhysicalPages; @@ -1988,20 +1888,6 @@ MmArmInitSystem(IN ULONG Phase, /* Update working set tuning parameters */ MiAdjustWorkingSetManagerParameters(!MmProductType); - - /* Finetune the page count by removing working set and NP expansion */ - MmResidentAvailablePages -= MiExpansionPoolPagesInitialCharge; - MmResidentAvailablePages -= MmSystemCacheWsMinimum; - MmResidentAvailableAtInit = MmResidentAvailablePages; - if (MmResidentAvailablePages <= 0) - { - /* This should not happen */ - DPRINT1("System cache working set too big\n"); - return FALSE; - } - - /* Size up paged pool and build the shadow system page directory */ - MiBuildPagedPool(); } // diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c index f42abdc82c9..58043400af6 100644 --- a/ntoskrnl/mm/ARM3/pfnlist.c +++ b/ntoskrnl/mm/ARM3/pfnlist.c @@ -18,9 +18,6 @@ /* GLOBALS ********************************************************************/ -BOOLEAN MmDynamicPfn; -BOOLEAN MmMirroring; - MMPFNLIST MmZeroedPageListHead = {0, ZeroedPageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmFreePageListHead = {0, FreePageList, LIST_HEAD, LIST_HEAD}; MMPFNLIST MmStandbyPageListHead = {0, StandbyPageList, LIST_HEAD, LIST_HEAD}; diff --git a/ntoskrnl/mm/ARM3/pool.c b/ntoskrnl/mm/ARM3/pool.c index 10a585e8912..bd2f826c6d2 100644 --- a/ntoskrnl/mm/ARM3/pool.c +++ b/ntoskrnl/mm/ARM3/pool.c @@ -26,8 +26,6 @@ KGUARDED_MUTEX MmPagedPoolMutex; MM_PAGED_POOL_INFO MmPagedPoolInfo; SIZE_T MmAllocatedNonPagedPool; ULONG MmSpecialPoolTag; -ULONG MmConsumedPoolPercentage; -BOOLEAN MmProtectFreedNonPagedPool; /* PRIVATE FUNCTIONS **********************************************************/ diff --git a/ntoskrnl/mm/freelist.c b/ntoskrnl/mm/freelist.c index 6f5df91a1cc..7f2646f7452 100644 --- a/ntoskrnl/mm/freelist.c +++ b/ntoskrnl/mm/freelist.c @@ -36,9 +36,8 @@ /* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */ PPHYSICAL_PAGE MmPfnDatabase[2]; -PFN_NUMBER MmAvailablePages; -PFN_NUMBER MmResidentAvailablePages; -PFN_NUMBER MmResidentAvailableAtInit; +ULONG MmAvailablePages; +ULONG MmResidentAvailablePages; SIZE_T MmTotalCommitLimit; SIZE_T MmTotalCommittedPages; diff --git a/ntoskrnl/mm/mminit.c b/ntoskrnl/mm/mminit.c index a03ce8ed3de..8a9fd4297c3 100644 --- a/ntoskrnl/mm/mminit.c +++ b/ntoskrnl/mm/mminit.c @@ -398,12 +398,15 @@ MmInitSystem(IN ULONG Phase, /* Initialize paged pool */ MmInitializePagedPool(); - /* Initialize the loaded module list */ - MiInitializeLoadedModuleList(LoaderBlock); - /* Initialize working sets */ MiInitializeUserPfnBitmap(); MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); + + /* Reload boot drivers */ + MiReloadBootLoadedDrivers(LoaderBlock); + + /* Initialize the loaded module list */ + MiInitializeLoadedModuleList(LoaderBlock); } else if (Phase == 1) { diff --git a/ntoskrnl/mm/pagefile.c b/ntoskrnl/mm/pagefile.c index 1ea2c41c29f..1af2faccaa5 100644 --- a/ntoskrnl/mm/pagefile.c +++ b/ntoskrnl/mm/pagefile.c @@ -86,8 +86,6 @@ ULONG MiFreeSwapPages; /* Number of pages that have been allocated for swapping */ ULONG MiUsedSwapPages; -BOOLEAN MmZeroPageFile; - /* * Number of pages that have been reserved for swapping but not yet allocated */ diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index fc708953a00..582af62037d 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -71,8 +71,6 @@ MM_SECTION_PAGEOUT_CONTEXT; POBJECT_TYPE MmSectionObjectType = NULL; -BOOLEAN MmAllocationFragment; - ULONG_PTR MmSubsectionBase; static GENERIC_MAPPING MmpSectionMapping = { diff --git a/ntoskrnl/mm/sysldr.c b/ntoskrnl/mm/sysldr.c index fcecf3c8da5..281a3966bb2 100644 --- a/ntoskrnl/mm/sysldr.c +++ b/ntoskrnl/mm/sysldr.c @@ -39,17 +39,10 @@ ERESOURCE PsLoadedModuleResource; ULONG_PTR PsNtosImageBase; KMUTANT MmSystemLoadLock; -PFN_NUMBER MmTotalSystemDriverPages; - PVOID MmUnloadedDrivers; PVOID MmLastUnloadedDrivers; - -BOOLEAN MmMakeLowMemory; -BOOLEAN MmEnforceWriteProtection = TRUE; - -PMMPTE MiKernelResourceStartPte, MiKernelResourceEndPte; -ULONG_PTR ExPoolCodeStart, ExPoolCodeEnd, MmPoolCodeStart, MmPoolCodeEnd; -ULONG_PTR MmPteCodeStart, MmPteCodeEnd; +PVOID MmTriageActionTaken; +PVOID KernelVerifier; /* FUNCTIONS ******************************************************************/ @@ -195,6 +188,120 @@ MiLoadImageSection(IN OUT PVOID *SectionPtr, return Status; } +NTSTATUS +NTAPI +MiDereferenceImports(IN PLOAD_IMPORTS ImportList) +{ + SIZE_T i; + + /* Check if there's no imports or if we're a boot driver */ + if ((ImportList == (PVOID)-1) || + (ImportList == (PVOID)-2) || + (ImportList->Count == 0)) + { + /* Then there's nothing to do */ + return STATUS_SUCCESS; + } + + /* Otherwise, FIXME */ + DPRINT1("%u imports not dereferenced!\n", ImportList->Count); + for (i = 0; i < ImportList->Count; i++) + { + DPRINT1("%wZ <%wZ>\n", &ImportList->Entry[i]->FullDllName, &ImportList->Entry[i]->BaseDllName); + } + return STATUS_UNSUCCESSFUL; +} + +VOID +NTAPI +MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) +{ + PAGED_CODE(); + + /* Check if there's no imports or we're a boot driver or only one entry */ + if ((LdrEntry->LoadedImports == (PVOID)-1) || + (LdrEntry->LoadedImports == (PVOID)-2) || + ((ULONG_PTR)LdrEntry->LoadedImports & 1)) + { + /* Nothing to do */ + return; + } + + /* Otherwise, free the import list */ + ExFreePool(LdrEntry->LoadedImports); +} + +PVOID +NTAPI +MiFindExportedRoutineByName(IN PVOID DllBase, + IN PANSI_STRING ExportName) +{ + PULONG NameTable; + PUSHORT OrdinalTable; + PIMAGE_EXPORT_DIRECTORY ExportDirectory; + LONG Low = 0, Mid = 0, High, Ret; + USHORT Ordinal; + PVOID Function; + ULONG ExportSize; + PULONG ExportTable; + PAGED_CODE(); + + /* Get the export directory */ + ExportDirectory = RtlImageDirectoryEntryToData(DllBase, + TRUE, + IMAGE_DIRECTORY_ENTRY_EXPORT, + &ExportSize); + if (!ExportDirectory) return NULL; + + /* Setup name tables */ + NameTable = (PULONG)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfNames); + OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfNameOrdinals); + + /* Do a binary search */ + High = ExportDirectory->NumberOfNames - 1; + while (High >= Low) + { + /* Get new middle value */ + Mid = (Low + High) >> 1; + + /* Compare name */ + Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); + if (Ret < 0) + { + /* Update high */ + High = Mid - 1; + } + else if (Ret > 0) + { + /* Update low */ + Low = Mid + 1; + } + else + { + /* We got it */ + break; + } + } + + /* Check if we couldn't find it */ + if (High < Low) return NULL; + + /* Otherwise, this is the ordinal */ + Ordinal = OrdinalTable[Mid]; + + /* Resolve the address and write it */ + ExportTable = (PULONG)((ULONG_PTR)DllBase + + ExportDirectory->AddressOfFunctions); + Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); + + /* We found it! */ + ASSERT(!(Function > (PVOID)ExportDirectory) && + (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); + return Function; +} + PVOID NTAPI MiLocateExportName(IN PVOID DllBase, @@ -333,200 +440,6 @@ MmCallDllInitialize(IN PLDR_DATA_TABLE_ENTRY LdrEntry, return Status; } -BOOLEAN -NTAPI -MiCallDllUnloadAndUnloadDll(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - NTSTATUS Status; - PMM_DLL_UNLOAD Func; - PAGED_CODE(); - - /* Get the unload routine */ - Func = (PMM_DLL_UNLOAD)MiLocateExportName(LdrEntry->DllBase, "DllUnload"); - if (!Func) return FALSE; - - /* Call it and check for success */ - Status = Func(); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Lie about the load count so we can unload the image */ - ASSERT(LdrEntry->LoadCount == 0); - LdrEntry->LoadCount = 1; - - /* Unload it and return true */ - MmUnloadSystemImage(LdrEntry); - return TRUE; -} - -NTSTATUS -NTAPI -MiDereferenceImports(IN PLOAD_IMPORTS ImportList) -{ - SIZE_T i; - LOAD_IMPORTS SingleEntry; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PVOID CurrentImports; - PAGED_CODE(); - - /* Check if there's no imports or if we're a boot driver */ - if ((ImportList == MM_SYSLDR_NO_IMPORTS) || - (ImportList == MM_SYSLDR_BOOT_LOADED) || - (ImportList->Count == 0)) - { - /* Then there's nothing to do */ - return STATUS_SUCCESS; - } - - /* Check for single-entry */ - if ((ULONG_PTR)ImportList & MM_SYSLDR_SINGLE_ENTRY) - { - /* Set it up */ - SingleEntry.Count = 1; - SingleEntry.Entry[0] = (PVOID)((ULONG_PTR)ImportList &~ MM_SYSLDR_SINGLE_ENTRY); - - /* Use this as the import list */ - ImportList = &SingleEntry; - } - - /* Loop the import list */ - for (i = 0; (i < ImportList->Count) && (ImportList->Entry[i]); i++) - { - /* Get the entry */ - LdrEntry = ImportList->Entry[i]; - DPRINT1("%wZ <%wZ>\n", &LdrEntry->FullDllName, &LdrEntry->BaseDllName); - - /* Skip boot loaded images */ - if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) continue; - - /* Dereference the entry */ - ASSERT(LdrEntry->LoadCount >= 1); - if (!--LdrEntry->LoadCount) - { - /* Save the import data in case unload fails */ - CurrentImports = LdrEntry->LoadedImports; - - /* This is the last entry */ - LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; - if (MiCallDllUnloadAndUnloadDll(LdrEntry)) - { - /* Unloading worked, parse this DLL's imports too */ - MiDereferenceImports(CurrentImports); - - /* Check if we had valid imports */ - if ((CurrentImports != MM_SYSLDR_BOOT_LOADED) || - (CurrentImports != MM_SYSLDR_NO_IMPORTS) || - !((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) - { - /* Free them */ - ExFreePool(CurrentImports); - } - } - else - { - /* Unload failed, restore imports */ - LdrEntry->LoadedImports = CurrentImports; - } - } - } - - /* Done */ - return STATUS_SUCCESS; -} - -VOID -NTAPI -MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - PAGED_CODE(); - - /* Check if there's no imports or we're a boot driver or only one entry */ - if ((LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) || - (LdrEntry->LoadedImports == MM_SYSLDR_NO_IMPORTS) || - ((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) - { - /* Nothing to do */ - return; - } - - /* Otherwise, free the import list */ - ExFreePool(LdrEntry->LoadedImports); - LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; -} - -PVOID -NTAPI -MiFindExportedRoutineByName(IN PVOID DllBase, - IN PANSI_STRING ExportName) -{ - PULONG NameTable; - PUSHORT OrdinalTable; - PIMAGE_EXPORT_DIRECTORY ExportDirectory; - LONG Low = 0, Mid = 0, High, Ret; - USHORT Ordinal; - PVOID Function; - ULONG ExportSize; - PULONG ExportTable; - PAGED_CODE(); - - /* Get the export directory */ - ExportDirectory = RtlImageDirectoryEntryToData(DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ExportSize); - if (!ExportDirectory) return NULL; - - /* Setup name tables */ - NameTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNames); - OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNameOrdinals); - - /* Do a binary search */ - High = ExportDirectory->NumberOfNames - 1; - while (High >= Low) - { - /* Get new middle value */ - Mid = (Low + High) >> 1; - - /* Compare name */ - Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); - if (Ret < 0) - { - /* Update high */ - High = Mid - 1; - } - else if (Ret > 0) - { - /* Update low */ - Low = Mid + 1; - } - else - { - /* We got it */ - break; - } - } - - /* Check if we couldn't find it */ - if (High < Low) return NULL; - - /* Otherwise, this is the ordinal */ - Ordinal = OrdinalTable[Mid]; - - /* Validate the ordinal */ - if (Ordinal >= ExportDirectory->NumberOfFunctions) return NULL; - - /* Resolve the address and write it */ - ExportTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfFunctions); - Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); - - /* We found it! */ - ASSERT(!(Function > (PVOID)ExportDirectory) && - (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); - return Function; -} - VOID NTAPI MiProcessLoaderEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry, @@ -561,9 +474,9 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, ULONG_PTR OldBaseTop, Delta; PLDR_DATA_TABLE_ENTRY LdrEntry; PLIST_ENTRY NextEntry; - ULONG ImportSize, i; - PULONG_PTR ImageThunk; + ULONG ImportSize; PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; + PULONG ImageThunk; /* Calculate the top and delta */ OldBaseTop = (ULONG_PTR)OldBase + Size - 1; @@ -578,30 +491,8 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, LdrEntry = CONTAINING_RECORD(NextEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); -#ifdef _WORKING_LINKER_ - /* Get the IAT */ - ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IAT, - &ImportSize); - if (!ImageThunk) continue; - /* Make sure we have an IAT */ - DPRINT("[Mm0]: Updating thunks in: %wZ\n", &LdrEntry->BaseDllName); - for (i = 0; i < ImportSize; i++, ImageThunk++) - { - /* Check if it's within this module */ - if ((*ImageThunk >= (ULONG_PTR)OldBase) && (*ImageThunk <= OldBaseTop)) - { - /* Relocate it */ - DPRINT("[Mm0]: Updating IAT at: %p. Old Entry: %p. New Entry: %p.\n", - ImageThunk, *ImageThunk, *ImageThunk + Delta); - *ImageThunk += Delta; - } - } -#else /* Get the import table */ - i = ImportSize; ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, @@ -634,7 +525,6 @@ MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, /* Go to the next import */ ImportDescriptor++; } -#endif } } @@ -702,7 +592,7 @@ MiSnapThunk(IN PVOID DllBase, /* Get the hint and check if it's valid */ Hint = NameImport->Hint; if ((Hint < ExportDirectory->NumberOfNames) && - !(strcmp((PCHAR)NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) + !(strcmp((PCHAR) NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) { /* We have a match, get the ordinal number from here */ Ordinal = OrdinalTable[Hint]; @@ -873,7 +763,7 @@ MmUnloadSystemImage(IN PVOID ImageHandle) NULL); /* Check if this driver was loaded at boot and didn't get imports parsed */ - if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) goto Done; + if (LdrEntry->LoadedImports == (PVOID)-1) goto Done; /* We should still be alive */ ASSERT(LdrEntry->LoadCount != 0); @@ -900,7 +790,6 @@ MmUnloadSystemImage(IN PVOID ImageHandle) } /* FIXME: Free the driver */ - DPRINT1("Leaking driver: %wZ\n", &LdrEntry->BaseDllName); //MmFreeSection(LdrEntry->DllBase); /* Check if we're linked in */ @@ -971,7 +860,7 @@ MiResolveImageReferences(IN PVOID ImageBase, __FUNCTION__, ImageBase, ImageFileDirectory); /* Assume no imports */ - *LoadImports = MM_SYSLDR_NO_IMPORTS; + *LoadImports = (PVOID)-2; /* Get the import descriptor */ ImportDescriptor = RtlImageDirectoryEntryToData(ImageBase, @@ -996,12 +885,11 @@ MiResolveImageReferences(IN PVOID ImageBase, LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); LoadedImports = ExAllocatePoolWithTag(PagedPool, LoadedImportsSize, - 'TDmM'); + TAG_LDR_WSTR); if (LoadedImports) { /* Zero it */ RtlZeroMemory(LoadedImports, LoadedImportsSize); - LoadedImports->Count = ImportCount; } } else @@ -1021,12 +909,10 @@ MiResolveImageReferences(IN PVOID ImageBase, GdiLink = GdiLink | !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)); - /* We can also allow dxapi (for Windows compat, allow IRT and coverage )*/ + /* We can also allow dxapi */ NormalLink = NormalLink | ((_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) && - (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1)) && - (_strnicmp(ImportName, "coverage", sizeof("coverage") - 1)) && - (_strnicmp(ImportName, "irt", sizeof("irt") - 1))); + (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1))); /* Check if this is a valid GDI driver */ if ((GdiLink) && (NormalLink)) @@ -1037,20 +923,6 @@ MiResolveImageReferences(IN PVOID ImageBase, return STATUS_PROCEDURE_NOT_FOUND; } - /* Check for user-mode printer or video card drivers, which don't belong */ - if (!(_strnicmp(ImportName, "ntdll", sizeof("ntdll") - 1)) || - !(_strnicmp(ImportName, "winsrv", sizeof("winsrv") - 1)) || - !(_strnicmp(ImportName, "advapi32", sizeof("advapi32") - 1)) || - !(_strnicmp(ImportName, "kernel32", sizeof("kernel32") - 1)) || - !(_strnicmp(ImportName, "user32", sizeof("user32") - 1)) || - !(_strnicmp(ImportName, "gdi32", sizeof("gdi32") - 1))) - { - /* This is not kernel code */ - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePool(LoadedImports); - return STATUS_PROCEDURE_NOT_FOUND; - } - /* Check if this is a "core" import, which doesn't get referenced */ if (!(_strnicmp(ImportName, "ntoskrnl", sizeof("ntoskrnl") - 1)) || !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) || @@ -1127,7 +999,7 @@ CheckDllState: sizeof(UNICODE_NULL); DllName.Buffer = ExAllocatePoolWithTag(NonPagedPool, DllName.MaximumLength, - 'TDmM'); + TAG_LDR_WSTR); if (DllName.Buffer) { /* Setup the base length and copy it */ @@ -1139,13 +1011,13 @@ CheckDllState: /* Now add the import name and null-terminate it */ RtlAppendStringToString((PSTRING)&DllName, (PSTRING)&NameString); - DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; + DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; /* Load the image */ Status = MmLoadSystemImage(&DllName, NamePrefix, NULL, - FALSE, + 0, (PVOID)&DllEntry, &DllBase); if (NT_SUCCESS(Status)) @@ -1208,8 +1080,8 @@ CheckDllState: if (!(LdrEntry->Flags & LDRP_LOAD_IN_PROGRESS)) { /* Add the entry */ - LoadedImports->Entry[ImportCount] = LdrEntry; - ImportCount++; + LoadedImports->Entry[LoadedImports->Count] = LdrEntry; + LoadedImports->Count++; } } @@ -1278,8 +1150,7 @@ CheckDllState: if (LoadedImports->Entry[i]) { /* Got an entry, OR it with 1 in case it's the single entry */ - ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | - MM_SYSLDR_SINGLE_ENTRY); + ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | 1); ImportCount++; } } @@ -1289,7 +1160,7 @@ CheckDllState: { /* Free the list and set it to no imports */ ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - LoadedImports = MM_SYSLDR_NO_IMPORTS; + LoadedImports = (PVOID)-2; } else if (ImportCount == 1) { @@ -1303,7 +1174,7 @@ CheckDllState: LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); NewImports = ExAllocatePoolWithTag(PagedPool, LoadedImportsSize, - 'TDmM'); + TAG_LDR_WSTR); if (NewImports) { /* Set count */ @@ -1512,331 +1383,6 @@ MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } } -NTSTATUS -NTAPI -MiBuildImportsForBootDrivers(VOID) -{ - PLIST_ENTRY NextEntry, NextEntry2; - PLDR_DATA_TABLE_ENTRY LdrEntry, KernelEntry, HalEntry, LdrEntry2, LastEntry; - PLDR_DATA_TABLE_ENTRY* EntryArray; - UNICODE_STRING KernelName = RTL_CONSTANT_STRING(L"ntoskrnl.exe"); - UNICODE_STRING HalName = RTL_CONSTANT_STRING(L"hal.dll"); - PLOAD_IMPORTS LoadedImports; - ULONG LoadedImportsSize, ImportSize; - PULONG_PTR ImageThunk; - ULONG_PTR DllBase, DllEnd; - ULONG Modules = 0, i, j = 0; - PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; - - /* Initialize variables */ - KernelEntry = HalEntry = LastEntry = NULL; - - /* Loop the loaded module list... we are early enough that no lock is needed */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Check if it's the kernel or HAL */ - if (RtlEqualUnicodeString(&KernelName, &LdrEntry->BaseDllName, TRUE)) - { - /* Found it */ - KernelEntry = LdrEntry; - } - else if (RtlEqualUnicodeString(&HalName, &LdrEntry->BaseDllName, TRUE)) - { - /* Found it */ - HalEntry = LdrEntry; - } - - /* Check if this is a driver DLL */ - if (LdrEntry->Flags & LDRP_DRIVER_DEPENDENT_DLL) - { - /* Check if this is the HAL or kernel */ - if ((LdrEntry == HalEntry) || (LdrEntry == KernelEntry)) - { - /* Add a reference */ - LdrEntry->LoadCount = 1; - } - else - { - /* No referencing needed */ - LdrEntry->LoadCount = 0; - } - } - else - { - /* No referencing needed */ - LdrEntry->LoadCount = 0; - } - - /* Remember this came from the loader */ - LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; - - /* Keep looping */ - NextEntry = NextEntry->Flink; - Modules++; - } - - /* We must have at least found the kernel and HAL */ - if (!(HalEntry) || (!KernelEntry)) return STATUS_NOT_FOUND; - - /* Allocate the list */ - EntryArray = ExAllocatePoolWithTag(PagedPool, Modules * sizeof(PVOID), 'TDmM'); - if (!EntryArray) return STATUS_INSUFFICIENT_RESOURCES; - - /* Loop the loaded module list again */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); -#ifdef _WORKING_LOADER_ - /* Get its imports */ - ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IAT, - &ImportSize); - if (!ImageThunk) -#else - /* Get its imports */ - ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - &ImportSize); - if (!ImportDescriptor) -#endif - { - /* None present */ - LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; - NextEntry = NextEntry->Flink; - continue; - } - - /* Clear the list and count the number of IAT thunks */ - RtlZeroMemory(EntryArray, Modules * sizeof(PVOID)); -#ifdef _WORKING_LOADER_ - ImportSize /= sizeof(ULONG_PTR); - - /* Scan the thunks */ - for (i = 0, DllBase = 0, DllEnd = 0; i < ImportSize; i++, ImageThunk++) -#else - i = DllBase = DllEnd = 0; - while ((ImportDescriptor->Name) && - (ImportDescriptor->OriginalFirstThunk)) - { - /* Get the image thunk */ - ImageThunk = (PVOID)((ULONG_PTR)LdrEntry->DllBase + - ImportDescriptor->FirstThunk); - while (*ImageThunk) -#endif - { - /* Do we already have an address? */ - if (DllBase) - { - /* Is the thunk in the same address? */ - if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) - { - /* Skip it, we already have a reference for it */ - ASSERT(EntryArray[j]); - ImageThunk++; - continue; - } - } - - /* Loop the loaded module list to locate this address owner */ - j = 0; - NextEntry2 = PsLoadedModuleList.Flink; - while (NextEntry2 != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry2 = CONTAINING_RECORD(NextEntry2, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Get the address range for this module */ - DllBase = (ULONG_PTR)LdrEntry2->DllBase; - DllEnd = DllBase + LdrEntry2->SizeOfImage; - - /* Check if this IAT entry matches it */ - if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) - { - /* Save it */ - //DPRINT1("Found imported dll: %wZ\n", &LdrEntry2->BaseDllName); - EntryArray[j] = LdrEntry2; - break; - } - - /* Keep searching */ - NextEntry2 = NextEntry2->Flink; - j++; - } - - /* Do we have a thunk outside the range? */ - if ((*ImageThunk < DllBase) || (*ImageThunk >= DllEnd)) - { - /* Could be 0... */ - if (*ImageThunk) - { - /* Should not be happening */ - DPRINT1("Broken IAT entry for %p at %p (%lx)\n", - LdrEntry, ImageThunk, *ImageThunk); - ASSERT(FALSE); - } - - /* Reset if we hit this */ - DllBase = 0; - } -#ifndef _WORKING_LOADER_ - ImageThunk++; - } - - i++; - ImportDescriptor++; -#endif - } - - /* Now scan how many imports we really have */ - for (i = 0, ImportSize = 0; i < Modules; i++) - { - /* Skip HAL and kernel */ - if ((EntryArray[i]) && - (EntryArray[i] != HalEntry) && - (EntryArray[i] != KernelEntry)) - { - /* A valid reference */ - LastEntry = EntryArray[i]; - ImportSize++; - } - } - - /* Do we have any imports after all? */ - if (!ImportSize) - { - /* No */ - LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; - } - else if (ImportSize == 1) - { - /* A single entry import */ - LdrEntry->LoadedImports = (PVOID)((ULONG_PTR)LastEntry | MM_SYSLDR_SINGLE_ENTRY); - LastEntry->LoadCount++; - } - else - { - /* We need an import table */ - LoadedImportsSize = ImportSize * sizeof(PVOID) + sizeof(SIZE_T); - LoadedImports = ExAllocatePoolWithTag(PagedPool, - LoadedImportsSize, - 'TDmM'); - ASSERT(LoadedImports); - - /* Save the count */ - LoadedImports->Count = ImportSize; - - /* Now copy all imports */ - for (i = 0, j = 0; i < Modules; i++) - { - /* Skip HAL and kernel */ - if ((EntryArray[i]) && - (EntryArray[i] != HalEntry) && - (EntryArray[i] != KernelEntry)) - { - /* A valid reference */ - //DPRINT1("Found valid entry: %p\n", EntryArray[i]); - LoadedImports->Entry[j] = EntryArray[i]; - EntryArray[i]->LoadCount++; - j++; - } - } - - /* Should had as many entries as we expected */ - ASSERT(j == ImportSize); - LdrEntry->LoadedImports = LoadedImports; - } - - /* Next */ - NextEntry = NextEntry->Flink; - } - - /* Free the initial array */ - ExFreePool(EntryArray); - - /* FIXME: Might not need to keep the HAL/Kernel imports around */ - - /* Kernel and HAL are loaded at boot */ - KernelEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; - HalEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; - - /* All worked well */ - return STATUS_SUCCESS; -} - -VOID -NTAPI -MiLocateKernelSections(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - ULONG_PTR DllBase; - PIMAGE_NT_HEADERS NtHeaders; - PIMAGE_SECTION_HEADER SectionHeader; - ULONG Sections, Size; - - /* Get the kernel section header */ - DllBase = (ULONG_PTR)LdrEntry->DllBase; - NtHeaders = RtlImageNtHeader((PVOID)DllBase); - SectionHeader = IMAGE_FIRST_SECTION(NtHeaders); - - /* Loop all the sections */ - Sections = NtHeaders->FileHeader.NumberOfSections; - while (Sections) - { - /* Grab the size of the section */ - Size = max(SectionHeader->SizeOfRawData, SectionHeader->Misc.VirtualSize); - - /* Check for .RSRC section */ - if (*(PULONG)SectionHeader->Name == 'rsr.') - { - /* Remember the PTEs so we can modify them later */ - MiKernelResourceStartPte = MiAddressToPte(DllBase + - SectionHeader->VirtualAddress); - MiKernelResourceEndPte = MiKernelResourceStartPte + - BYTES_TO_PAGES(SectionHeader->VirtualAddress + Size); - } - else if (*(PULONG)SectionHeader->Name == 'LOOP') - { - /* POOLCODE vs. POOLMI */ - if (*(PULONG)&SectionHeader->Name[4] == 'EDOC') - { - /* Found Ex* Pool code */ - ExPoolCodeStart = DllBase + SectionHeader->VirtualAddress; - ExPoolCodeEnd = ExPoolCodeStart + Size; - } - else if (*(PUSHORT)&SectionHeader->Name[4] == 'MI') - { - /* Found Mm* Pool code */ - MmPoolCodeStart = DllBase + SectionHeader->VirtualAddress; - MmPoolCodeEnd = ExPoolCodeStart + Size; - } - } - else if ((*(PULONG)SectionHeader->Name == 'YSIM') && - (*(PULONG)&SectionHeader->Name[4] == 'ETPS')) - { - /* Found MISYSPTE (Mm System PTE code)*/ - MmPteCodeStart = DllBase + SectionHeader->VirtualAddress; - MmPteCodeEnd = ExPoolCodeStart + Size; - } - - /* Keep going */ - Sections--; - SectionHeader++; - } -} - BOOLEAN NTAPI MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -1857,9 +1403,6 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase; - - /* Locate resource section, pool code, and system pte code */ - MiLocateKernelSections(LdrEntry); /* Loop the loader block */ while (NextEntry != ListHead) @@ -1873,7 +1416,7 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (!RtlImageNtHeader(LdrEntry->DllBase)) { /* Skip this entry */ - NextEntry = NextEntry->Flink; + NextEntry= NextEntry->Flink; continue; } @@ -1916,441 +1459,12 @@ MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Build the import lists for the boot drivers */ - MiBuildImportsForBootDrivers(); + //MiBuildImportsForBootDrivers(); /* We're done */ return TRUE; } -LOGICAL -NTAPI -MiUseLargeDriverPage(IN ULONG NumberOfPtes, - IN OUT PVOID *ImageBaseAddress, - IN PUNICODE_STRING BaseImageName, - IN BOOLEAN BootDriver) -{ - PLIST_ENTRY NextEntry; - BOOLEAN DriverFound = FALSE; - PMI_LARGE_PAGE_DRIVER_ENTRY LargePageDriverEntry; - ASSERT(KeGetCurrentIrql () <= APC_LEVEL); - ASSERT(*ImageBaseAddress >= MmSystemRangeStart); - -#ifdef _X86_ - if (!(KeFeatureBits & KF_LARGE_PAGE)) return FALSE; - if (!(__readcr4() & CR4_PSE)) return FALSE; -#endif - - /* Make sure there's enough system PTEs for a large page driver */ - if (MmTotalFreeSystemPtes[SystemPteSpace] < (16 * (PDE_MAPPED_VA >> PAGE_SHIFT))) - { - return FALSE; - } - - /* This happens if the registry key had a "*" (wildcard) in it */ - if (MiLargePageAllDrivers == 0) - { - /* It didn't, so scan the list */ - NextEntry = MiLargePageDriverList.Flink; - while (NextEntry != &MiLargePageDriverList) - { - /* Check if the driver name matches */ - LargePageDriverEntry = CONTAINING_RECORD(NextEntry, - MI_LARGE_PAGE_DRIVER_ENTRY, - Links); - if (RtlEqualUnicodeString(BaseImageName, - &LargePageDriverEntry->BaseName, - TRUE)) - { - /* Enable large pages for this driver */ - DriverFound = TRUE; - break; - } - - /* Keep trying */ - NextEntry = NextEntry->Flink; - } - - /* If we didn't find the driver, it doesn't need large pages */ - if (DriverFound == FALSE) return FALSE; - } - - /* Nothing to do yet */ - DPRINT1("Large pages not supported!\n"); - return FALSE; -} - -ULONG -NTAPI -MiComputeDriverProtection(IN BOOLEAN SessionSpace, - IN ULONG SectionProtection) -{ - ULONG Protection = MM_ZERO_ACCESS; - - /* Check if the caller gave anything */ - if (SectionProtection) - { - /* Always turn on execute access */ - SectionProtection |= IMAGE_SCN_MEM_EXECUTE; - - /* Check if the registry setting is on or not */ - if (!MmEnforceWriteProtection) - { - /* Turn on write access too */ - SectionProtection |= (IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_EXECUTE); - } - } - - /* Convert to internal PTE flags */ - if (SectionProtection & IMAGE_SCN_MEM_EXECUTE) Protection |= MM_EXECUTE; - if (SectionProtection & IMAGE_SCN_MEM_READ) Protection |= MM_READONLY; - - /* Check for write access */ - if (SectionProtection & IMAGE_SCN_MEM_WRITE) - { - /* Session space is not supported */ - if (SessionSpace) - { - DPRINT1("Session drivers not supported\n"); - ASSERT(SessionSpace == FALSE); - } - else - { - /* Convert to internal PTE flag */ - Protection = (Protection & MM_EXECUTE) ? MM_EXECUTE_READWRITE : MM_READWRITE; - } - } - - /* If there's no access at all by now, convert to internal no access flag */ - if (Protection == MM_ZERO_ACCESS) Protection = MM_NOACCESS; - - /* Return the computed PTE protection */ - return Protection; -} - -VOID -NTAPI -MiSetSystemCodeProtection(IN PMMPTE FirstPte, - IN PMMPTE LastPte, - IN ULONG ProtectionMask) -{ - /* I'm afraid to introduce regressions at the moment... */ - return; -} - -VOID -NTAPI -MiWriteProtectSystemImage(IN PVOID ImageBase) -{ - PIMAGE_NT_HEADERS NtHeaders; - PIMAGE_SECTION_HEADER Section; - PFN_NUMBER DriverPages; - ULONG CurrentProtection, SectionProtection, CombinedProtection, ProtectionMask; - ULONG Sections, Size; - ULONG_PTR BaseAddress, CurrentAddress; - PMMPTE PointerPte, StartPte, LastPte, CurrentPte, ComboPte = NULL; - ULONG CurrentMask, CombinedMask = 0; - PAGED_CODE(); - - /* No need to write protect physical memory-backed drivers (large pages) */ - if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; - - /* Get the image headers */ - NtHeaders = RtlImageNtHeader(ImageBase); - if (!NtHeaders) return; - - /* Check if this is a session driver or not */ - if (!MI_IS_SESSION_ADDRESS(ImageBase)) - { - /* Don't touch NT4 drivers */ - if (NtHeaders->OptionalHeader.MajorOperatingSystemVersion < 5) return; - if (NtHeaders->OptionalHeader.MajorImageVersion < 5) return; - } - else - { - /* Not supported */ - DPRINT1("Session drivers not supported\n"); - ASSERT(FALSE); - } - - /* These are the only protection masks we care about */ - ProtectionMask = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE; - - /* Calculate the number of pages this driver is occupying */ - DriverPages = BYTES_TO_PAGES(NtHeaders->OptionalHeader.SizeOfImage); - - /* Get the number of sections and the first section header */ - Sections = NtHeaders->FileHeader.NumberOfSections; - ASSERT(Sections != 0); - Section = IMAGE_FIRST_SECTION(NtHeaders); - - /* Loop all the sections */ - CurrentAddress = (ULONG_PTR)ImageBase; - while (Sections) - { - /* Get the section size */ - Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); - - /* Get its virtual address */ - BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; - if (BaseAddress < CurrentAddress) - { - /* Windows doesn't like these */ - DPRINT1("Badly linked image!\n"); - return; - } - - /* Remember the current address */ - CurrentAddress = BaseAddress + Size - 1; - - /* Next */ - Sections--; - Section++; - } - - /* Get the number of sections and the first section header */ - Sections = NtHeaders->FileHeader.NumberOfSections; - ASSERT(Sections != 0); - Section = IMAGE_FIRST_SECTION(NtHeaders); - - /* Set the address at the end to initialize the loop */ - CurrentAddress = (ULONG_PTR)Section + Sections - 1; - CurrentProtection = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ; - - /* Set the PTE points for the image, and loop its sections */ - StartPte = MiAddressToPte(ImageBase); - LastPte = StartPte + DriverPages; - while (Sections) - { - /* Get the section size */ - Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); - - /* Get its virtual address and PTE */ - BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; - PointerPte = MiAddressToPte(BaseAddress); - - /* Check if we were already protecting a run, and found a new run */ - if ((ComboPte) && (PointerPte > ComboPte)) - { - /* Compute protection */ - CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); - - /* Set it */ - MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); - - /* Check for overlap */ - if (ComboPte == StartPte) StartPte++; - - /* One done, reset variables */ - ComboPte = NULL; - CombinedProtection = 0; - } - - /* Break out when needed */ - if (PointerPte >= LastPte) break; - - /* Get the requested protection from the image header */ - SectionProtection = Section->Characteristics & ProtectionMask; - if (SectionProtection == CurrentProtection) - { - /* Same protection, so merge the request */ - CurrentAddress = BaseAddress + Size - 1; - - /* Next */ - Sections--; - Section++; - continue; - } - - /* This is now a new section, so close up the old one */ - CurrentPte = MiAddressToPte(CurrentAddress); - - /* Check for overlap */ - if (CurrentPte == PointerPte) - { - /* Skip the last PTE, since it overlaps with us */ - CurrentPte--; - - /* And set the PTE we will merge with */ - ASSERT((ComboPte == NULL) || (ComboPte == PointerPte)); - ComboPte = PointerPte; - - /* Get the most flexible protection by merging both */ - CombinedMask |= (SectionProtection | CurrentProtection); - } - - /* Loop any PTEs left */ - if (CurrentPte >= StartPte) - { - /* Sanity check */ - ASSERT(StartPte < LastPte); - - /* Make sure we don't overflow past the last PTE in the driver */ - if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; - ASSERT(CurrentPte >= StartPte); - - /* Compute the protection and set it */ - CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); - MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); - } - - /* Set new state */ - StartPte = PointerPte; - CurrentAddress = BaseAddress + Size - 1; - CurrentProtection = SectionProtection; - - /* Next */ - Sections--; - Section++; - } - - /* Is there a leftover section to merge? */ - if (ComboPte) - { - /* Compute and set the protection */ - CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); - MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); - - /* Handle overlap */ - if (ComboPte == StartPte) StartPte++; - } - - /* Finally, handle the last section */ - CurrentPte = MiPteToAddress(CurrentAddress); - if ((StartPte < LastPte) && (CurrentPte >= StartPte)) - { - /* Handle overlap */ - if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; - ASSERT(CurrentPte >= StartPte); - - /* Compute and set the protection */ - CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); - MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); - } -} - -VOID -NTAPI -MiSetPagingOfDriver(IN PMMPTE PointerPte, - IN PMMPTE LastPte) -{ - PVOID ImageBase; - PETHREAD CurrentThread; - PFN_NUMBER PageCount = 0, PageFrameIndex; - PMMPFN Pfn1; - PAGED_CODE(); - - /* Get the driver's base address */ - ImageBase = MiPteToAddress(PointerPte); - ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(ImageBase) == FALSE); - - /* If this is a large page, it's stuck in physical memory */ - if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; - - /* We should lock the system working set -- we don't have one yet, so just be consistent */ - CurrentThread = PsGetCurrentThread(); - KeEnterGuardedRegion(); - ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && - (CurrentThread->OwnsSystemWorkingSetShared == 0)); - CurrentThread->OwnsSystemWorkingSetExclusive = 1; - - /* Loop the PTEs */ - while (PointerPte <= LastPte) - { - /* Check for valid PTE */ - if (PointerPte->u.Hard.Valid == 1) - { - PageFrameIndex = PFN_FROM_PTE(PointerPte); - Pfn1 = MiGetPfnEntry(PageFrameIndex); - ASSERT(Pfn1->u2.ShareCount == 1); - - /* No working sets in ReactOS yet */ - PageCount++; - } - - ImageBase = (PVOID)((ULONG_PTR)ImageBase + PAGE_SIZE); - PointerPte++; - } - - /* Release the working set "lock" */ - ASSERT(KeAreAllApcsDisabled() == TRUE); - CurrentThread->OwnsSystemWorkingSetExclusive = 0; - KeLeaveGuardedRegion(); - - /* Do we have any driver pages? */ - if (PageCount) - { - /* Update counters */ - InterlockedExchangeAdd((PLONG)&MmTotalSystemDriverPages, PageCount); - } -} - -VOID -NTAPI -MiEnablePagingOfDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - ULONG_PTR ImageBase; - PIMAGE_NT_HEADERS NtHeaders; - ULONG Sections, Alignment, Size; - PIMAGE_SECTION_HEADER Section; - PMMPTE PointerPte = NULL, LastPte = NULL; - if (MmDisablePagingExecutive) return; - - /* Get the driver base address and its NT header */ - ImageBase = (ULONG_PTR)LdrEntry->DllBase; - NtHeaders = RtlImageNtHeader((PVOID)ImageBase); - if (!NtHeaders) return; - - /* Get the sections and their alignment */ - Sections = NtHeaders->FileHeader.NumberOfSections; - Alignment = NtHeaders->OptionalHeader.SectionAlignment - 1; - - /* Loop each section */ - Section = IMAGE_FIRST_SECTION(NtHeaders); - while (Sections) - { - /* Find PAGE or .edata */ - if ((*(PULONG)Section->Name == 'EGAP') || - (*(PULONG)Section->Name == 'ade.')) - { - /* Had we already done some work? */ - if (!PointerPte) - { - /* Nope, setup the first PTE address */ - PointerPte = MiAddressToPte(ROUND_TO_PAGES(ImageBase + - Section-> - VirtualAddress)); - } - - /* Compute the size */ - Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); - - /* Find the last PTE that maps this section */ - LastPte = MiAddressToPte(ImageBase + - Section->VirtualAddress + - Alignment + - Size - - PAGE_SIZE); - } - else - { - /* Had we found a section before? */ - if (PointerPte) - { - /* Mark it as pageable */ - MiSetPagingOfDriver(PointerPte, LastPte); - PointerPte = NULL; - } - } - - /* Keep searching */ - Sections--; - Section++; - } - - /* Handle the straggler */ - if (PointerPte) MiSetPagingOfDriver(PointerPte, LastPte); -} - BOOLEAN NTAPI MmVerifyImageIsOkForMpUse(IN PVOID BaseAddress) @@ -2387,24 +1501,15 @@ MmCheckSystemImage(IN HANDLE ImageHandle, IO_STATUS_BLOCK IoStatusBlock; FILE_STANDARD_INFORMATION FileStandardInfo; KAPC_STATE ApcState; - PIMAGE_NT_HEADERS NtHeaders; - OBJECT_ATTRIBUTES ObjectAttributes; PAGED_CODE(); - - /* Setup the object attributes */ - InitializeObjectAttributes(&ObjectAttributes, - NULL, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - NULL, - NULL); /* Create a section for the DLL */ Status = ZwCreateSection(&SectionHandle, SECTION_MAP_EXECUTE, - &ObjectAttributes, + NULL, NULL, PAGE_EXECUTE, - SEC_IMAGE, + SEC_COMMIT, ImageHandle); if (!NT_SUCCESS(Status)) return Status; @@ -2436,35 +1541,17 @@ MmCheckSystemImage(IN HANDLE ImageHandle, &FileStandardInfo, sizeof(FileStandardInfo), FileStandardInformation); - if (NT_SUCCESS(Status)) + if ( NT_SUCCESS(Status) ) { /* First, verify the checksum */ if (!LdrVerifyMappedImageMatchesChecksum(ViewBase, - ViewSize, + FileStandardInfo. + EndOfFile.LowPart, FileStandardInfo. EndOfFile.LowPart)) { /* Set checksum failure */ Status = STATUS_IMAGE_CHECKSUM_MISMATCH; - goto Fail; - } - - /* Make sure it's a real image */ - NtHeaders = RtlImageNtHeader(ViewBase); - if (!NtHeaders) - { - /* Set checksum failure */ - Status = STATUS_IMAGE_CHECKSUM_MISMATCH; - goto Fail; - } - - /* Make sure it's for the correct architecture */ - if ((NtHeaders->FileHeader.Machine != IMAGE_FILE_MACHINE_NATIVE) || - (NtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)) - { - /* Set protection failure */ - Status = STATUS_INVALID_IMAGE_PROTECT; - goto Fail; } /* Check that it's a valid SMP image if we have more then one CPU */ @@ -2476,7 +1563,6 @@ MmCheckSystemImage(IN HANDLE ImageHandle, } /* Unmap the section, close the handle, and return status */ -Fail: ZwUnmapViewOfSection(NtCurrentProcess(), ViewBase); KeUnstackDetachProcess(&ApcState); ZwClose(SectionHandle); @@ -2501,7 +1587,7 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, UNICODE_STRING BaseName, BaseDirectory, PrefixName, UnicodeTemp; PLDR_DATA_TABLE_ENTRY LdrEntry = NULL; ULONG EntrySize, DriverSize; - PLOAD_IMPORTS LoadedImports = MM_SYSLDR_NO_IMPORTS; + PLOAD_IMPORTS LoadedImports = (PVOID)-2; PCHAR MissingApiName, Buffer; PWCHAR MissingDriverName; HANDLE SectionHandle; @@ -2525,7 +1611,7 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, } /* Allocate a buffer we'll use for names */ - Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, 'nLmM'); + Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, TAG_LDR_WSTR); if (!Buffer) return STATUS_INSUFFICIENT_RESOURCES; /* Check for a separator */ @@ -2569,14 +1655,6 @@ MmLoadSystemImage(IN PUNICODE_STRING FileName, /* Check if we already have a name, use it instead */ if (LoadedName) BaseName = *LoadedName; - - /* Check for loader snap debugging */ - if (NtGlobalFlag & FLG_SHOW_LDR_SNAPS) - { - /* Print out standard string */ - DPRINT1("MM:SYSLDR Loading %wZ (%wZ) %s\n", - &PrefixName, &BaseName, Flags ? "in session space" : ""); - } /* Acquire the load lock */ LoaderScan: @@ -2672,7 +1750,7 @@ LoaderScan: Status = MmCheckSystemImage(FileHandle, FALSE); if ((Status == STATUS_IMAGE_CHECKSUM_MISMATCH) || (Status == STATUS_IMAGE_MP_UP_MISMATCH) || - (Status == STATUS_INVALID_IMAGE_PROTECT)) + (Status == STATUS_INVALID_IMAGE_FORMAT)) { /* Fail loading */ goto Quickie; @@ -2751,20 +1829,16 @@ LoaderScan: /* Check for success */ if (NT_SUCCESS(Status)) { - /* Support large pages for drivers */ - MiUseLargeDriverPage(DriverSize / PAGE_SIZE, - &ModuleLoadBase, - &BaseName, - TRUE); + /* FIXME: Support large pages for drivers */ } /* Dereference the section */ ObDereferenceObject(Section); Section = NULL; } - - /* Check for failure of the load earlier */ - if (!NT_SUCCESS(Status)) goto Quickie; + + /* Get the NT Header */ + NtHeader = RtlImageNtHeader(ModuleLoadBase); /* Relocate the driver */ Status = LdrRelocateImageWithBias(ModuleLoadBase, @@ -2775,10 +1849,6 @@ LoaderScan: STATUS_INVALID_IMAGE_FORMAT); if (!NT_SUCCESS(Status)) goto Quickie; - - /* Get the NT Header */ - NtHeader = RtlImageNtHeader(ModuleLoadBase); - /* Calculate the size we'll need for the entry and allocate it */ EntrySize = sizeof(LDR_DATA_TABLE_ENTRY) + BaseName.Length + @@ -2886,10 +1956,9 @@ LoaderScan: LdrEntry->Flags &= ~LDRP_LOAD_IN_PROGRESS; LdrEntry->LoadedImports = LoadedImports; - /* FIXME: Call driver verifier's loader function */ + /* FIXME: Apply driver verifier */ - /* Write-protect the system image */ - MiWriteProtectSystemImage(LdrEntry->DllBase); + /* FIXME: Write-protect the system image */ /* Check if notifications are enabled */ if (PsImageNotifyEnabled) @@ -2943,15 +2012,17 @@ LoaderScan: LdrEntry->Flags |= LDRP_DEBUG_SYMBOLS_LOADED; } - /* Page the driver */ + /* FIXME: Page the driver */ ASSERT(Section == NULL); - MiEnablePagingOfDriver(LdrEntry); /* Return pointers */ *ModuleObject = LdrEntry; *ImageBaseAddress = LdrEntry->DllBase; Quickie: + /* If we have a file handle, close it */ + if (FileHandle) ZwClose(FileHandle); + /* Check if we have the lock acquired */ if (LockOwned) { @@ -2961,9 +2032,6 @@ Quickie: LockOwned = FALSE; } - /* If we have a file handle, close it */ - if (FileHandle) ZwClose(FileHandle); - /* Check if we had a prefix */ if (NamePrefix) ExFreePool(PrefixName.Buffer); @@ -2972,90 +2040,6 @@ Quickie: return Status; } -PLDR_DATA_TABLE_ENTRY -NTAPI -MiLookupDataTableEntry(IN PVOID Address) -{ - PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; - PLIST_ENTRY NextEntry; - PAGED_CODE(); - - /* Loop entries */ - NextEntry = PsLoadedModuleList.Flink; - do - { - /* Get the loader entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Check if the address matches */ - if ((Address >= LdrEntry->DllBase) && - (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + - LdrEntry->SizeOfImage))) - { - /* Found a match */ - FoundEntry = LdrEntry; - break; - } - - /* Move on */ - NextEntry = NextEntry->Flink; - } while(NextEntry != &PsLoadedModuleList); - - /* Return the entry */ - return FoundEntry; -} - -/* PUBLIC FUNCTIONS ***********************************************************/ - -/* - * @implemented - */ -PVOID -NTAPI -MmPageEntireDriver(IN PVOID AddressWithinSection) -{ - PMMPTE StartPte, EndPte; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PAGED_CODE(); - - /* Get the loader entry */ - LdrEntry = MiLookupDataTableEntry(AddressWithinSection); - if (!LdrEntry) return NULL; - - /* Check if paging of kernel mode is disabled or if the driver is mapped as an image */ - if ((MmDisablePagingExecutive) || (LdrEntry->SectionPointer)) - { - /* Don't do anything, just return the base address */ - return LdrEntry->DllBase; - } - - /* Wait for active DPCs to finish before we page out the driver */ - KeFlushQueuedDpcs(); - - /* Get the PTE range for the whole driver image */ - StartPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase); - EndPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage); - - /* Enable paging for the PTE range */ - ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(AddressWithinSection) == FALSE); - MiSetPagingOfDriver(StartPte, EndPte); - - /* Return the base address */ - return LdrEntry->DllBase; -} - -/* - * @unimplemented - */ -VOID -NTAPI -MmResetDriverPaging(IN PVOID AddressWithinSection) -{ - UNIMPLEMENTED; -} - /* * @implemented */ diff --git a/ntoskrnl/ntoskrnl-generic.rbuild b/ntoskrnl/ntoskrnl-generic.rbuild index 5dc63c62e56..a605ee1b147 100644 --- a/ntoskrnl/ntoskrnl-generic.rbuild +++ b/ntoskrnl/ntoskrnl-generic.rbuild @@ -244,6 +244,7 @@ device.c deviface.c driver.c + drvrlist.c error.c file.c iocomp.c @@ -266,13 +267,10 @@ plugplay.c pnpdma.c - pnpinit.c pnpmgr.c pnpnotify.c pnpreport.c - pnpres.c pnproot.c - pnputil.c @@ -395,7 +393,6 @@ expool.c hypermap.c iosup.c - largepag.c mdlsup.c mminit.c mmsup.c diff --git a/ntoskrnl/ntoskrnl.pspec b/ntoskrnl/ntoskrnl.pspec index 12973661b81..5016dbd2b87 100644 --- a/ntoskrnl/ntoskrnl.pspec +++ b/ntoskrnl/ntoskrnl.pspec @@ -1,10 +1,5 @@ #include #undef i386 -#ifndef __x86_64__ -#define FASTCALL fastcall -#else -#define FASTCALL stdcall -#endif @ stdcall CcCanIWrite(ptr long long long) @ stdcall CcCopyRead(ptr ptr long long ptr ptr) @@ -62,13 +57,13 @@ @ stdcall DbgQueryDebugFilterState(long long) @ stdcall DbgSetDebugFilterState(long long long) @ stdcall -arch=x86_64 ExAcquireFastMutex(ptr) -@ FASTCALL ExAcquireFastMutexUnsafe(ptr) +@ fastcall ExAcquireFastMutexUnsafe(ptr) @ stdcall ExAcquireResourceExclusiveLite(ptr long) @ stdcall ExAcquireResourceSharedLite(ptr long) -@ FASTCALL ExAcquireRundownProtection(ptr) ExfAcquireRundownProtection -@ FASTCALL ExAcquireRundownProtectionCacheAware(ptr) ExfAcquireRundownProtectionCacheAware -@ FASTCALL ExAcquireRundownProtectionCacheAwareEx(ptr long) ExfAcquireRundownProtectionCacheAwareEx -@ FASTCALL ExAcquireRundownProtectionEx(ptr long) ExfAcquireRundownProtectionEx +@ fastcall ExAcquireRundownProtection(ptr) ExfAcquireRundownProtection +@ fastcall ExAcquireRundownProtectionCacheAware(ptr) ExfAcquireRundownProtectionCacheAware +@ fastcall ExAcquireRundownProtectionCacheAwareEx(ptr long) ExfAcquireRundownProtectionCacheAwareEx +@ fastcall ExAcquireRundownProtectionEx(ptr long) ExfAcquireRundownProtectionEx @ stdcall ExAcquireSharedStarveExclusive(ptr long) @ stdcall ExAcquireSharedWaitForExclusive(ptr long) @ stdcall ExAllocateCacheAwareRundownProtection(long long) @@ -85,7 +80,7 @@ @ stdcall ExDeleteResourceLite(ptr) @ extern ExDesktopObjectType @ stdcall ExDisableResourceBoostLite(ptr) -@ FASTCALL ExEnterCriticalRegionAndAcquireFastMutexUnsafe(ptr) +@ fastcall ExEnterCriticalRegionAndAcquireFastMutexUnsafe(ptr) @ stdcall ExEnterCriticalRegionAndAcquireResourceExclusive(ptr) @ stdcall ExEnterCriticalRegionAndAcquireResourceShared(ptr) @ stdcall ExEnterCriticalRegionAndAcquireSharedWaitForExclusive(ptr) @@ -104,33 +99,33 @@ @ stdcall ExInitializeNPagedLookasideList(ptr ptr ptr long long long long) @ stdcall ExInitializePagedLookasideList(ptr ptr ptr long long long long) @ stdcall ExInitializeResourceLite(ptr) -@ FASTCALL ExInitializeRundownProtection(ptr) ExfInitializeRundownProtection +@ fastcall ExInitializeRundownProtection(ptr) ExfInitializeRundownProtection @ stdcall ExInitializeRundownProtectionCacheAware(ptr long) @ stdcall ExInitializeZone(ptr long ptr long) @ stdcall ExInterlockedAddLargeInteger(ptr long long ptr) #ifndef __x86_64__ -@ FASTCALL ExInterlockedAddLargeStatistic(ptr long) +@ fastcall ExInterlockedAddLargeStatistic(ptr long) #endif @ stdcall ExInterlockedAddUlong(ptr long ptr) #ifndef __x86_64__ -@ FASTCALL ExInterlockedCompareExchange64(ptr ptr ptr ptr) +@ fastcall ExInterlockedCompareExchange64(ptr ptr ptr ptr) @ stdcall ExInterlockedDecrementLong(ptr ptr) @ stdcall ExInterlockedExchangeUlong(ptr long ptr) #endif @ stdcall ExInterlockedExtendZone(ptr ptr long ptr) #ifndef __x86_64__ -@ FASTCALL ExInterlockedFlushSList(ptr) +@ fastcall ExInterlockedFlushSList(ptr) @ stdcall ExInterlockedIncrementLong(ptr ptr) #endif @ stdcall ExInterlockedInsertHeadList(ptr ptr ptr) @ stdcall ExInterlockedInsertTailList(ptr ptr ptr) @ stdcall ExInterlockedPopEntryList(ptr ptr) #ifndef __x86_64__ -@ FASTCALL ExInterlockedPopEntrySList(ptr ptr) +@ fastcall ExInterlockedPopEntrySList(ptr ptr) #endif @ stdcall ExInterlockedPushEntryList(ptr ptr ptr) #ifndef __x86_64__ -@ FASTCALL ExInterlockedPushEntrySList(ptr ptr ptr) +@ fastcall ExInterlockedPushEntrySList(ptr ptr ptr) #endif @ stdcall ExInterlockedRemoveHeadList(ptr ptr) @ stdcall ExIsProcessorFeaturePresent(long) @@ -146,22 +141,22 @@ @ stdcall ExRaiseException(ptr) RtlRaiseException @ stdcall ExRaiseHardError(long long long ptr long ptr) @ stdcall ExRaiseStatus(long) RtlRaiseStatus -@ FASTCALL ExReInitializeRundownProtection(ptr) ExfReInitializeRundownProtection -@ FASTCALL ExReInitializeRundownProtectionCacheAware(ptr) ExfReInitializeRundownProtectionCacheAware +@ fastcall ExReInitializeRundownProtection(ptr) ExfReInitializeRundownProtection +@ fastcall ExReInitializeRundownProtectionCacheAware(ptr) ExfReInitializeRundownProtectionCacheAware @ stdcall ExRegisterCallback(ptr ptr ptr) @ stdcall ExReinitializeResourceLite(ptr) @ stdcall -arch=x86_64 ExReleaseFastMutex(ptr) -@ FASTCALL ExReleaseFastMutexUnsafe(ptr) -@ FASTCALL ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(ptr) -@ FASTCALL ExReleaseResourceAndLeaveCriticalRegion(ptr) +@ fastcall ExReleaseFastMutexUnsafe(ptr) +@ fastcall ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(ptr) +@ fastcall ExReleaseResourceAndLeaveCriticalRegion(ptr) @ stdcall ExReleaseResourceForThreadLite(ptr long) -@ FASTCALL ExReleaseResourceLite(ptr) -@ FASTCALL ExReleaseRundownProtection(ptr) ExfReleaseRundownProtection -@ FASTCALL ExReleaseRundownProtectionCacheAware(ptr) ExfReleaseRundownProtectionCacheAware -@ FASTCALL ExReleaseRundownProtectionCacheAwareEx(ptr long) ExfReleaseRundownProtectionCacheAwareEx -@ FASTCALL ExReleaseRundownProtectionEx(ptr long) ExfReleaseRundownProtectionEx -@ FASTCALL ExRundownCompleted(ptr) ExfRundownCompleted -@ FASTCALL ExRundownCompletedCacheAware(ptr) ExfRundownCompletedCacheAware +@ fastcall ExReleaseResourceLite(ptr) +@ fastcall ExReleaseRundownProtection(ptr) ExfReleaseRundownProtection +@ fastcall ExReleaseRundownProtectionCacheAware(ptr) ExfReleaseRundownProtectionCacheAware +@ fastcall ExReleaseRundownProtectionCacheAwareEx(ptr long) ExfReleaseRundownProtectionCacheAwareEx +@ fastcall ExReleaseRundownProtectionEx(ptr long) ExfReleaseRundownProtectionEx +@ fastcall ExRundownCompleted(ptr) ExfRundownCompleted +@ fastcall ExRundownCompletedCacheAware(ptr) ExfRundownCompletedCacheAware @ extern ExSemaphoreObjectType _ExSemaphoreObjectType @ stdcall ExSetResourceOwnerPointer(ptr ptr) @ stdcall ExSetTimerResolution(long long) @@ -172,37 +167,37 @@ @ stdcall ExUnregisterCallback(ptr) @ stdcall ExUuidCreate(ptr) @ stdcall ExVerifySuite(long) -@ FASTCALL ExWaitForRundownProtectionRelease(ptr) ExfWaitForRundownProtectionRelease -@ FASTCALL ExWaitForRundownProtectionReleaseCacheAware(ptr) ExfWaitForRundownProtectionReleaseCacheAware +@ fastcall ExWaitForRundownProtectionRelease(ptr) ExfWaitForRundownProtectionRelease +@ fastcall ExWaitForRundownProtectionReleaseCacheAware(ptr) ExfWaitForRundownProtectionReleaseCacheAware @ extern ExWindowStationObjectType -@ FASTCALL ExfAcquirePushLockExclusive(ptr) -@ FASTCALL ExfAcquirePushLockShared(ptr) +@ fastcall ExfAcquirePushLockExclusive(ptr) +@ fastcall ExfAcquirePushLockShared(ptr) #ifndef __x86_64__ -@ FASTCALL ExfInterlockedAddUlong(ptr long ptr) -@ FASTCALL ExfInterlockedCompareExchange64(ptr ptr ptr) -@ FASTCALL ExfInterlockedInsertHeadList(ptr ptr ptr) -@ FASTCALL ExfInterlockedInsertTailList(ptr ptr ptr) -@ FASTCALL ExfInterlockedPopEntryList(ptr ptr) -@ FASTCALL ExfInterlockedPushEntryList(ptr ptr ptr) -@ FASTCALL ExfInterlockedRemoveHeadList(ptr ptr) +@ fastcall ExfInterlockedAddUlong(ptr long ptr) +@ fastcall ExfInterlockedCompareExchange64(ptr ptr ptr) +@ fastcall ExfInterlockedInsertHeadList(ptr ptr ptr) +@ fastcall ExfInterlockedInsertTailList(ptr ptr ptr) +@ fastcall ExfInterlockedPopEntryList(ptr ptr) +@ fastcall ExfInterlockedPushEntryList(ptr ptr ptr) +@ fastcall ExfInterlockedRemoveHeadList(ptr ptr) #endif -@ FASTCALL ExfReleasePushLock(ptr) -@ FASTCALL ExfReleasePushLockExclusive(ptr) -@ FASTCALL ExfReleasePushLockShared(ptr) -@ FASTCALL ExfTryToWakePushLock(ptr) -@ FASTCALL ExfUnblockPushLock(ptr ptr) +@ fastcall ExfReleasePushLock(ptr) +@ fastcall ExfReleasePushLockExclusive(ptr) +@ fastcall ExfReleasePushLockShared(ptr) +@ fastcall ExfTryToWakePushLock(ptr) +@ fastcall ExfUnblockPushLock(ptr ptr) @ stdcall -arch=x86_64 ExpInterlockedFlushSList(ptr) @ stdcall -arch=x86_64 ExpInterlockedPopEntrySList(ptr ptr) @ stdcall -arch=x86_64 ExpInterlockedPushEntrySList(ptr ptr) -@ FASTCALL -arch=i386 Exfi386InterlockedDecrementLong(ptr) -@ FASTCALL -arch=i386 Exfi386InterlockedExchangeUlong(ptr long) -@ FASTCALL -arch=i386 Exfi386InterlockedIncrementLong(ptr) +@ fastcall -arch=i386 Exfi386InterlockedDecrementLong(ptr) +@ fastcall -arch=i386 Exfi386InterlockedExchangeUlong(ptr long) +@ fastcall -arch=i386 Exfi386InterlockedIncrementLong(ptr) @ stdcall -arch=i386 Exi386InterlockedDecrementLong(ptr) @ stdcall -arch=i386 Exi386InterlockedExchangeUlong(ptr long long) @ stdcall -arch=i386 Exi386InterlockedIncrementLong(ptr) -@ FASTCALL -arch=i386 ExiAcquireFastMutex(ptr) ExAcquireFastMutex -@ FASTCALL -arch=i386 ExiReleaseFastMutex(ptr) ExReleaseFastMutex -@ FASTCALL -arch=i386 ExiTryToAcquireFastMutex(ptr) ExTryToAcquireFastMutex +@ fastcall -arch=i386 ExiAcquireFastMutex(ptr) ExAcquireFastMutex +@ fastcall -arch=i386 ExiReleaseFastMutex(ptr) ExReleaseFastMutex +@ fastcall -arch=i386 ExiTryToAcquireFastMutex(ptr) ExTryToAcquireFastMutex @ stdcall FsRtlAcquireFileExclusive(ptr) ;FsRtlAddBaseMcbEntry @ stdcall FsRtlAddLargeMcbEntry(ptr long long long long long long) @@ -323,7 +318,7 @@ @ stdcall FsRtlUninitializeMcb(ptr) @ stdcall FsRtlUninitializeOplock(ptr) @ extern HalDispatchTable _HalDispatchTable -@ FASTCALL HalExamineMBR(ptr long long ptr) +@ fastcall HalExamineMBR(ptr long long ptr) @ extern HalPrivateDispatchTable ;HeadlessDispatch @ stdcall InbvAcquireDisplayOwnership() @@ -340,13 +335,13 @@ @ stdcall InbvSolidColorFill(long long long long long) @ extern InitSafeBootMode #ifndef __x86_64__ -@ FASTCALL InterlockedCompareExchange(ptr long long) -@ FASTCALL InterlockedDecrement(ptr) -@ FASTCALL InterlockedExchange(ptr long) -@ FASTCALL InterlockedExchangeAdd(ptr long) -@ FASTCALL InterlockedIncrement(ptr) -@ FASTCALL InterlockedPopEntrySList(ptr) -@ FASTCALL InterlockedPushEntrySList(ptr ptr) +@ fastcall InterlockedCompareExchange(ptr long long) +@ fastcall InterlockedDecrement(ptr) +@ fastcall InterlockedExchange(ptr long) +@ fastcall InterlockedExchangeAdd(ptr long) +@ fastcall InterlockedIncrement(ptr) +@ fastcall InterlockedPopEntrySList(ptr) +@ fastcall InterlockedPushEntrySList(ptr ptr) #else @ stdcall InitializeSListHead(ptr) RtlInitializeSListHead #endif @@ -361,7 +356,7 @@ @ stdcall IoAllocateIrp(long long) @ stdcall IoAllocateMdl(ptr long long long ptr) @ stdcall IoAllocateWorkItem(ptr) -@ FASTCALL IoAssignDriveLetters(ptr ptr ptr ptr) +@ fastcall IoAssignDriveLetters(ptr ptr ptr ptr) @ stdcall IoAssignResources(ptr ptr ptr ptr ptr ptr) @ stdcall IoAttachDevice(ptr ptr ptr) @ stdcall IoAttachDeviceByPointer(ptr ptr) @@ -442,7 +437,7 @@ @ stdcall IoGetFileObjectGenericMapping() @ stdcall IoGetInitialStack() @ stdcall IoGetLowerDeviceObject(ptr) -@ FASTCALL IoGetPagingIoPriority(ptr) +@ fastcall IoGetPagingIoPriority(ptr) @ stdcall IoGetRelatedDeviceObject(ptr) @ stdcall IoGetRequestorProcess(ptr) @ stdcall IoGetRequestorProcessId(ptr) @@ -474,7 +469,7 @@ @ stdcall IoRaiseInformationalHardError(long ptr ptr) @ stdcall IoReadDiskSignature(ptr long ptr) @ extern IoReadOperationCount -@ FASTCALL IoReadPartitionTable(ptr long long ptr) +@ fastcall IoReadPartitionTable(ptr long long ptr) @ stdcall IoReadPartitionTableEx(ptr ptr) @ extern IoReadTransferCount @ stdcall IoRegisterBootDriverReinitialization(ptr ptr ptr) @@ -505,7 +500,7 @@ @ stdcall IoSetHardErrorOrVerifyDevice(ptr ptr) @ stdcall IoSetInformation(ptr ptr long ptr) @ stdcall IoSetIoCompletion(ptr ptr ptr long ptr long) -@ FASTCALL IoSetPartitionInformation(ptr long long long) +@ fastcall IoSetPartitionInformation(ptr long long long) @ stdcall IoSetPartitionInformationEx(ptr long ptr) @ stdcall IoSetShareAccess(long long ptr ptr) @ stdcall IoSetStartIoAttributes(ptr long long) @@ -548,11 +543,11 @@ @ stdcall IoWMIWriteEvent(ptr) @ stdcall IoWriteErrorLogEntry(ptr) @ extern IoWriteOperationCount -@ FASTCALL IoWritePartitionTable(ptr long long long ptr) +@ fastcall IoWritePartitionTable(ptr long long long ptr) @ stdcall IoWritePartitionTableEx(ptr ptr) @ extern IoWriteTransferCount -@ FASTCALL IofCallDriver(ptr ptr) -@ FASTCALL IofCompleteRequest(ptr long) +@ fastcall IofCallDriver(ptr ptr) +@ fastcall IofCompleteRequest(ptr long) @ stdcall KdChangeOption(long long ptr long ptr ptr) @ extern KdDebuggerEnabled _KdDebuggerEnabled @ extern KdDebuggerNotPresent _KdDebuggerNotPresent @@ -567,13 +562,13 @@ @ stdcall -arch=i386 Ke386IoSetAccessProcess(ptr long) @ stdcall -arch=i386 Ke386QueryIoAccessMap(long ptr) @ stdcall -arch=i386 Ke386SetIoAccessMap(long ptr) -@ FASTCALL KeAcquireGuardedMutex(ptr) -@ FASTCALL KeAcquireGuardedMutexUnsafe(ptr) -@ FASTCALL KeAcquireInStackQueuedSpinLockAtDpcLevel(ptr ptr) -@ FASTCALL KeAcquireInStackQueuedSpinLockForDpc(ptr ptr) +@ fastcall KeAcquireGuardedMutex(ptr) +@ fastcall KeAcquireGuardedMutexUnsafe(ptr) +@ fastcall KeAcquireInStackQueuedSpinLockAtDpcLevel(ptr ptr) +@ fastcall KeAcquireInStackQueuedSpinLockForDpc(ptr ptr) @ stdcall KeAcquireInterruptSpinLock(ptr) @ stdcall KeAcquireSpinLockAtDpcLevel(ptr) -@ FASTCALL KeAcquireSpinLockForDpc(ptr) +@ fastcall KeAcquireSpinLockForDpc(ptr) @ stdcall -arch=x86_64 KeAcquireSpinLockRaiseToDpc(ptr) @ stdcall KeAddSystemServiceTable(ptr ptr long ptr long) @ stdcall KeAreAllApcsDisabled() @@ -617,7 +612,7 @@ @ stdcall KeInitializeDeviceQueue(ptr) @ stdcall KeInitializeDpc(ptr ptr ptr) @ stdcall KeInitializeEvent(ptr long long) -@ FASTCALL KeInitializeGuardedMutex(ptr) +@ fastcall KeInitializeGuardedMutex(ptr) @ stdcall KeInitializeInterrupt(ptr ptr ptr ptr long long long long long long long) @ stdcall KeInitializeMutant(ptr long) @ stdcall KeInitializeMutex(ptr long) @@ -668,10 +663,10 @@ @ stdcall KeRegisterBugCheckCallback(ptr ptr ptr long ptr) @ stdcall KeRegisterBugCheckReasonCallback(ptr ptr ptr ptr) @ stdcall KeRegisterNmiCallback(ptr ptr) -@ FASTCALL KeReleaseGuardedMutex(ptr) -@ FASTCALL KeReleaseGuardedMutexUnsafe(ptr) -@ FASTCALL KeReleaseInStackQueuedSpinLockForDpc(ptr) -@ FASTCALL KeReleaseInStackQueuedSpinLockFromDpcLevel(ptr) +@ fastcall KeReleaseGuardedMutex(ptr) +@ fastcall KeReleaseGuardedMutexUnsafe(ptr) +@ fastcall KeReleaseInStackQueuedSpinLockForDpc(ptr) +@ fastcall KeReleaseInStackQueuedSpinLockFromDpcLevel(ptr) @ stdcall KeReleaseInterruptSpinLock(ptr long) @ stdcall KeReleaseMutant(ptr long long long) @ stdcall KeReleaseMutex(ptr long) @@ -679,7 +674,7 @@ #ifdef __x86_64__ @ stdcall KeReleaseSpinLock(ptr long) #endif -@ FASTCALL KeReleaseSpinLockForDpc(ptr long) +@ fastcall KeReleaseSpinLockForDpc(ptr long) @ stdcall KeReleaseSpinLockFromDpcLevel(ptr) @ stdcall KeRemoveByKeyDeviceQueue(ptr long) @ stdcall KeRemoveByKeyDeviceQueueIfBusy(ptr long) @@ -715,10 +710,10 @@ @ stdcall KeStackAttachProcess(ptr ptr) @ stdcall KeSynchronizeExecution(ptr ptr ptr) @ stdcall KeTerminateThread(long) -@ FASTCALL KeTestSpinLock(ptr) +@ fastcall KeTestSpinLock(ptr) @ extern KeTickCount -@ FASTCALL KeTryToAcquireGuardedMutex(ptr) -@ FASTCALL KeTryToAcquireSpinLockAtDpcLevel(ptr) +@ fastcall KeTryToAcquireGuardedMutex(ptr) +@ fastcall KeTryToAcquireSpinLockAtDpcLevel(ptr) @ stdcall KeUnstackDetachProcess(ptr) @ stdcall KeUpdateRunTime(ptr long) @ fastcall KeUpdateSystemTime(ptr long long) @@ -726,11 +721,11 @@ @ stdcall KeWaitForMultipleObjects(long ptr long long long long ptr ptr) @ stdcall KeWaitForMutexObject(ptr long long long ptr) KeWaitForSingleObject @ stdcall KeWaitForSingleObject(ptr long long long ptr) -@ FASTCALL KefAcquireSpinLockAtDpcLevel(ptr) -@ FASTCALL KefReleaseSpinLockFromDpcLevel(ptr) +@ fastcall KefAcquireSpinLockAtDpcLevel(ptr) +@ fastcall KefReleaseSpinLockFromDpcLevel(ptr) @ stdcall -arch=i386 Kei386EoiHelper() @ fastcall -arch=i386 KiEoiHelper(ptr) /* FIXME: Evaluate decision */ -@ FASTCALL KiAcquireSpinLock(ptr) +@ fastcall KiAcquireSpinLock(ptr) @ extern KiBugCheckData @ stdcall KiCheckForKernelApcDelivery() ;KiCheckForSListAddress @@ -739,7 +734,7 @@ @ stdcall -arch=i386 KiDispatchInterrupt() @ extern KiEnableTimerWatchdog @ stdcall KiIpiServiceRoutine(ptr ptr) -@ FASTCALL KiReleaseSpinLock(ptr) +@ fastcall KiReleaseSpinLock(ptr) @ cdecl KiUnexpectedInterrupt() #ifdef _M_IX86 @ stdcall Kii386SpinOnSpinLock(ptr long) @@ -933,8 +928,8 @@ ;ObSetHandleAttributes@12 @ stdcall ObSetSecurityDescriptorInfo(ptr ptr ptr ptr long ptr) @ stdcall ObSetSecurityObjectByPointer(ptr long ptr) -@ FASTCALL ObfDereferenceObject(ptr) -@ FASTCALL ObfReferenceObject(ptr) +@ fastcall ObfDereferenceObject(ptr) +@ fastcall ObfReferenceObject(ptr) ;PfxFindPrefix ;PfxInitialize ;PfxInsertPrefix @@ -1256,7 +1251,7 @@ @ stdcall RtlOemStringToUnicodeString(ptr ptr long) @ stdcall RtlOemToUnicodeN(wstr long ptr ptr long) @ stdcall RtlPinAtomInAtomTable(ptr ptr) -@ FASTCALL RtlPrefetchMemoryNonTemporal(ptr long) +@ fastcall RtlPrefetchMemoryNonTemporal(ptr long) @ stdcall RtlPrefixString(ptr ptr long) @ stdcall RtlPrefixUnicodeString(ptr ptr long) @ stdcall RtlQueryAtomInAtomTable(ptr ptr ptr ptr ptr ptr) @@ -1303,8 +1298,8 @@ ;RtlTraceDatabaseUnlock ;RtlTraceDatabaseValidate #ifndef __x86_64__ -@ FASTCALL RtlUlongByteSwap(long) -@ FASTCALL RtlUlonglongByteSwap(long long) +@ fastcall RtlUlongByteSwap(long) +@ fastcall RtlUlonglongByteSwap(long long) #endif @ stdcall RtlUnicodeStringToAnsiSize(ptr) RtlxUnicodeStringToAnsiSize @ stdcall RtlUnicodeStringToAnsiString(ptr ptr long) @@ -1329,7 +1324,7 @@ @ stdcall RtlUpperChar(long) @ stdcall RtlUpperString(ptr ptr) #ifndef __x86_64__ -@ FASTCALL RtlUshortByteSwap(long) +@ fastcall RtlUshortByteSwap(long) #endif @ stdcall RtlValidRelativeSecurityDescriptor(ptr long long) @ stdcall RtlValidSecurityDescriptor(ptr) diff --git a/ntoskrnl/rtl/libsupp.c b/ntoskrnl/rtl/libsupp.c index 4a6c8bc55ea..27f78952c72 100644 --- a/ntoskrnl/rtl/libsupp.c +++ b/ntoskrnl/rtl/libsupp.c @@ -317,7 +317,7 @@ RtlWalkFrameChain(OUT PVOID *Callers, &StackBegin, &StackEnd); if (!Result) return 0; - } + } /* Use a SEH block for maximum protection */ _SEH2_TRY @@ -331,11 +331,12 @@ RtlWalkFrameChain(OUT PVOID *Callers, /* Make sure we can trust the TEB and trap frame */ if (!(Teb) || + !(Thread->SystemThread) || (KeIsAttachedProcess()) || (KeGetCurrentIrql() >= DISPATCH_LEVEL)) { /* Invalid or unsafe attempt to get the stack */ - _SEH2_YIELD(return 0;) + return 0; } /* Get the stack limits */ diff --git a/ntoskrnl/se/semgr.c b/ntoskrnl/se/semgr.c index de374473139..d06fb04bbb6 100644 --- a/ntoskrnl/se/semgr.c +++ b/ntoskrnl/se/semgr.c @@ -314,31 +314,6 @@ SepSidInToken(PACCESS_TOKEN _Token, return FALSE; } -static BOOLEAN -SepTokenIsOwner(PACCESS_TOKEN Token, - PSECURITY_DESCRIPTOR SecurityDescriptor) -{ - NTSTATUS Status; - PSID Sid = NULL; - BOOLEAN Defaulted; - - Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, - &Sid, - &Defaulted); - if (!NT_SUCCESS(Status)) - { - DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); - return FALSE; - } - - if (Sid == NULL) - { - DPRINT1("Owner Sid is NULL\n"); - return FALSE; - } - - return SepSidInToken(Token, Sid); -} VOID NTAPI SeQuerySecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, @@ -377,9 +352,6 @@ SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, } } - -#define OLD_ACCESS_CHECK - BOOLEAN NTAPI SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, @@ -392,13 +364,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, OUT PNTSTATUS AccessStatus) { LUID_AND_ATTRIBUTES Privilege; -#ifdef OLD_ACCESS_CHECK ACCESS_MASK CurrentAccess, AccessMask; -#endif - ACCESS_MASK RemainingAccess; - ACCESS_MASK TempAccess; - ACCESS_MASK TempGrantedAccess = 0; - ACCESS_MASK TempDeniedAccess = 0; PACCESS_TOKEN Token; ULONG i; PACL Dacl; @@ -432,44 +398,14 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, if (PreviouslyGrantedAccess) RtlMapGenericMask(&PreviouslyGrantedAccess, GenericMapping); -#ifdef OLD_ACCESS_CHECK - CurrentAccess = PreviouslyGrantedAccess; -#endif - /* Initialize remaining access rights */ - RemainingAccess = DesiredAccess; - Token = SubjectSecurityContext->ClientToken ? - SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; - /* Check for system security access */ - if (RemainingAccess & ACCESS_SYSTEM_SECURITY) - { - Privilege.Luid = SeSecurityPrivilege; - Privilege.Attributes = SE_PRIVILEGE_ENABLED; - - /* Fail if we do not the SeSecurityPrivilege */ - if (!SepPrivilegeCheck(Token, - &Privilege, - 1, - PRIVILEGE_SET_ALL_NECESSARY, - AccessMode)) - { - *AccessStatus = STATUS_PRIVILEGE_NOT_HELD; - return FALSE; - } + CurrentAccess = PreviouslyGrantedAccess; - /* Adjust access rights */ - RemainingAccess &= ~ACCESS_SYSTEM_SECURITY; - PreviouslyGrantedAccess |= ACCESS_SYSTEM_SECURITY; - /* Succeed if there are no more rights to grant */ - if (RemainingAccess == 0) - { - *GrantedAccess = PreviouslyGrantedAccess; - *AccessStatus = STATUS_SUCCESS; - return TRUE; - } - } + + Token = SubjectSecurityContext->ClientToken ? + SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; /* Get the DACL */ Status = RtlGetDaclSecurityDescriptor(SecurityDescriptor, @@ -499,54 +435,57 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return TRUE; } -#ifdef OLD_ACCESS_CHECK CurrentAccess = PreviouslyGrantedAccess; -#endif /* RULE 2: Check token for 'take ownership' privilege */ - if (DesiredAccess & WRITE_OWNER) - { - Privilege.Luid = SeTakeOwnershipPrivilege; - Privilege.Attributes = SE_PRIVILEGE_ENABLED; - - if (SepPrivilegeCheck(Token, - &Privilege, - 1, - PRIVILEGE_SET_ALL_NECESSARY, - AccessMode)) + Privilege.Luid = SeTakeOwnershipPrivilege; + Privilege.Attributes = SE_PRIVILEGE_ENABLED; + + if (SepPrivilegeCheck(Token, + &Privilege, + 1, + PRIVILEGE_SET_ALL_NECESSARY, + AccessMode)) + { + CurrentAccess |= WRITE_OWNER; + if ((DesiredAccess & ~VALID_INHERIT_FLAGS) == + (CurrentAccess & ~VALID_INHERIT_FLAGS)) { - /* Adjust access rights */ - RemainingAccess &= ~WRITE_OWNER; - PreviouslyGrantedAccess |= WRITE_OWNER; -#ifdef OLD_ACCESS_CHECK - CurrentAccess |= WRITE_OWNER; -#endif - - /* Succeed if there are no more rights to grant */ - if (RemainingAccess == 0) - { - *GrantedAccess = PreviouslyGrantedAccess; - *AccessStatus = STATUS_SUCCESS; - return TRUE; - } + *GrantedAccess = CurrentAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; } } /* Deny access if the DACL is empty */ if (Dacl->AceCount == 0) { - if (RemainingAccess == MAXIMUM_ALLOWED && PreviouslyGrantedAccess != 0) + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; + } + + /* RULE 3: Check whether the token is the owner */ + Status = RtlGetOwnerSecurityDescriptor(SecurityDescriptor, + &Sid, + &Defaulted); + if (!NT_SUCCESS(Status)) + { + DPRINT1("RtlGetOwnerSecurityDescriptor() failed (Status %lx)\n", Status); + *AccessStatus = Status; + return FALSE; + } + + if (Sid && SepSidInToken(Token, Sid)) + { + CurrentAccess |= (READ_CONTROL | WRITE_DAC); + if ((DesiredAccess & ~VALID_INHERIT_FLAGS) == + (CurrentAccess & ~VALID_INHERIT_FLAGS)) { - *GrantedAccess = PreviouslyGrantedAccess; + *GrantedAccess = CurrentAccess; *AccessStatus = STATUS_SUCCESS; return TRUE; } - else - { - *GrantedAccess = 0; - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; - } } /* Fail if DACL is absent */ @@ -557,134 +496,50 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, return FALSE; } - /* Determine the MAXIMUM_ALLOWED access rights according to the DACL */ - if (DesiredAccess & MAXIMUM_ALLOWED) + /* RULE 4: Grant rights according to the DACL */ + CurrentAce = (PACE)(Dacl + 1); + for (i = 0; i < Dacl->AceCount; i++) { - CurrentAce = (PACE)(Dacl + 1); - for (i = 0; i < Dacl->AceCount; i++) + Sid = (PSID)(CurrentAce + 1); + if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) { - if (!(CurrentAce->Header.AceFlags & INHERIT_ONLY_ACE)) + if (SepSidInToken(Token, Sid)) { - Sid = (PSID)(CurrentAce + 1); - if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) - { - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); - - /* Deny access rights that have not been granted yet */ - TempDeniedAccess |= (TempAccess & ~TempGrantedAccess); - } - } - else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) - { - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); - - /* Grant access rights that have not been denied yet */ - TempGrantedAccess |= (TempAccess & ~TempDeniedAccess); - } - } - else - { - DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); - } + *GrantedAccess = 0; + *AccessStatus = STATUS_ACCESS_DENIED; + return FALSE; } - - /* Get the next ACE */ - CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); - } - - /* Fail if some rights have not been granted */ - RemainingAccess &= ~(MAXIMUM_ALLOWED | TempGrantedAccess); - if (RemainingAccess != 0) - { - *GrantedAccess = 0; - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; } - /* Set granted access right and access status */ - *GrantedAccess = TempGrantedAccess | PreviouslyGrantedAccess; - if (*GrantedAccess != 0) + else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) { - *AccessStatus = STATUS_SUCCESS; - return TRUE; + if (SepSidInToken(Token, Sid)) + { + AccessMask = CurrentAce->AccessMask; + RtlMapGenericMask(&AccessMask, GenericMapping); + CurrentAccess |= AccessMask; + } } else { - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; - } - } - - /* RULE 4: Grant rights according to the DACL */ - CurrentAce = (PACE)(Dacl + 1); - for (i = 0; i < Dacl->AceCount; i++) - { - if (!(CurrentAce->Header.AceFlags & INHERIT_ONLY_ACE)) - { - Sid = (PSID)(CurrentAce + 1); - if (CurrentAce->Header.AceType == ACCESS_DENIED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) - { -#ifdef OLD_ACCESS_CHECK - *GrantedAccess = 0; - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; -#else - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); - - /* Leave if a remaining right must be denied */ - if (RemainingAccess & TempAccess) - break; -#endif - } - } - else if (CurrentAce->Header.AceType == ACCESS_ALLOWED_ACE_TYPE) - { - if (SepSidInToken(Token, Sid)) - { -#ifdef OLD_ACCESS_CHECK - AccessMask = CurrentAce->AccessMask; - RtlMapGenericMask(&AccessMask, GenericMapping); - CurrentAccess |= AccessMask; -#else - /* Map access rights from the ACE */ - TempAccess = CurrentAce->AccessMask; - RtlMapGenericMask(&TempAccess, GenericMapping); - - /* Remove granted rights */ - RemainingAccess &= ~TempAccess; -#endif - } - } - else - { - DPRINT1("Unsupported ACE type 0x%lx\n", CurrentAce->Header.AceType); - } + DPRINT1("Unknown Ace type 0x%lx\n", CurrentAce->Header.AceType); } - - /* Get the next ACE */ CurrentAce = (PACE)((ULONG_PTR)CurrentAce + CurrentAce->Header.AceSize); } -#ifdef OLD_ACCESS_CHECK DPRINT("CurrentAccess %08lx\n DesiredAccess %08lx\n", CurrentAccess, DesiredAccess); *GrantedAccess = CurrentAccess & DesiredAccess; - if ((*GrantedAccess & ~VALID_INHERIT_FLAGS) == - (DesiredAccess & ~VALID_INHERIT_FLAGS)) + if (DesiredAccess & MAXIMUM_ALLOWED) + { + *GrantedAccess = CurrentAccess; + *AccessStatus = STATUS_SUCCESS; + return TRUE; + } + else if ((*GrantedAccess & ~VALID_INHERIT_FLAGS) == + (DesiredAccess & ~VALID_INHERIT_FLAGS)) { *AccessStatus = STATUS_SUCCESS; return TRUE; @@ -698,33 +553,6 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, *AccessStatus = STATUS_SUCCESS; return TRUE; } -#else - DPRINT("DesiredAccess %08lx\nPreviouslyGrantedAccess %08lx\nRemainingAccess %08lx\n", - DesiredAccess, PreviouslyGrantedAccess, RemainingAccess); - - /* Fail if some rights have not been granted */ - if (RemainingAccess != 0) - { - *GrantedAccess = 0; - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; - } - - /* Set granted access rights */ - *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; - - DPRINT("GrantedAccess %08lx\n", *GrantedAccess); - - /* Fail if no rights have been granted */ - if (*GrantedAccess == 0) - { - *AccessStatus = STATUS_ACCESS_DENIED; - return FALSE; - } - - *AccessStatus = STATUS_SUCCESS; - return TRUE; -#endif } static PSID @@ -821,43 +649,16 @@ SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, if (!SubjectContextLocked) SeLockSubjectContext(SubjectSecurityContext); - /* Check if the token is the owner and grant WRITE_DAC and READ_CONTROL rights */ - if (DesiredAccess & (WRITE_DAC | READ_CONTROL | MAXIMUM_ALLOWED)) - { - PACCESS_TOKEN Token = SubjectSecurityContext->ClientToken ? - SubjectSecurityContext->ClientToken : SubjectSecurityContext->PrimaryToken; - - if (SepTokenIsOwner(Token, - SecurityDescriptor)) - { - if (DesiredAccess & MAXIMUM_ALLOWED) - PreviouslyGrantedAccess |= (WRITE_DAC | READ_CONTROL); - else - PreviouslyGrantedAccess |= (DesiredAccess & (WRITE_DAC | READ_CONTROL)); - - DesiredAccess &= ~(WRITE_DAC | READ_CONTROL); - } - } - - if (DesiredAccess == 0) - { - *GrantedAccess = PreviouslyGrantedAccess; - *AccessStatus = STATUS_SUCCESS; - ret = TRUE; - } - else - { - /* Call the internal function */ - ret = SepAccessCheck(SecurityDescriptor, - SubjectSecurityContext, - DesiredAccess, - PreviouslyGrantedAccess, - Privileges, - GenericMapping, - AccessMode, - GrantedAccess, - AccessStatus); - } + /* Call the internal function */ + ret = SepAccessCheck(SecurityDescriptor, + SubjectSecurityContext, + DesiredAccess, + PreviouslyGrantedAccess, + Privileges, + GenericMapping, + AccessMode, + GrantedAccess, + AccessStatus); /* Release the lock if needed */ if (!SubjectContextLocked) @@ -885,7 +686,6 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, PSECURITY_DESCRIPTOR CapturedSecurityDescriptor = NULL; SECURITY_SUBJECT_CONTEXT SubjectSecurityContext; KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); - ACCESS_MASK PreviouslyGrantedAccess = 0; PTOKEN Token; NTSTATUS Status; PAGED_CODE(); @@ -1001,38 +801,16 @@ NtAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, SubjectSecurityContext.ProcessAuditId = NULL; SeLockSubjectContext(&SubjectSecurityContext); - /* Check if the token is the owner and grant WRITE_DAC and READ_CONTROL rights */ - if (DesiredAccess & (WRITE_DAC | READ_CONTROL | MAXIMUM_ALLOWED)) - { - if (SepTokenIsOwner(Token, SecurityDescriptor)) // FIXME: use CapturedSecurityDescriptor - { - if (DesiredAccess & MAXIMUM_ALLOWED) - PreviouslyGrantedAccess |= (WRITE_DAC | READ_CONTROL); - else - PreviouslyGrantedAccess |= (DesiredAccess & (WRITE_DAC | READ_CONTROL)); - - DesiredAccess &= ~(WRITE_DAC | READ_CONTROL); - } - } - - if (DesiredAccess == 0) - { - *GrantedAccess = PreviouslyGrantedAccess; - *AccessStatus = STATUS_SUCCESS; - } - else - { - /* Now perform the access check */ - SepAccessCheck(SecurityDescriptor, // FIXME: use CapturedSecurityDescriptor - &SubjectSecurityContext, - DesiredAccess, - PreviouslyGrantedAccess, - &PrivilegeSet, //FIXME - GenericMapping, - PreviousMode, - GrantedAccess, - AccessStatus); - } + /* Now perform the access check */ + SepAccessCheck(SecurityDescriptor, // FIXME: use CapturedSecurityDescriptor + &SubjectSecurityContext, + DesiredAccess, + 0, + &PrivilegeSet, //FIXME + GenericMapping, + PreviousMode, + GrantedAccess, + AccessStatus); /* Unlock subject context */ SeUnlockSubjectContext(&SubjectSecurityContext); diff --git a/rosbuild.bat b/rosbuild.bat index c8f5a7ce6c5..21f814b33a3 100644 --- a/rosbuild.bat +++ b/rosbuild.bat @@ -41,7 +41,7 @@ set "_ROSBE_FULL_PATH_=%_ROSBE_PATH_DIR%%_ROSBE_PATH_%" ::echo RosBE insall path = %_ROSBE_FULL_PATH_% :: Set the path which contains our build tools -set _ROSBE_BIN_PATH=%_ROSBE_FULL_PATH_%Tools +set _ROSBE_BIN_PATH=%_ROSBE_FULL_PATH_%i386\bin :: Add the path to the search path path=%path%;%_ROSBE_BIN_PATH% diff --git a/subsystems/ntvdm/ntvdm.c b/subsystems/ntvdm/ntvdm.c index 5a9a29a8e58..afa44ef23de 100644 --- a/subsystems/ntvdm/ntvdm.c +++ b/subsystems/ntvdm/ntvdm.c @@ -282,8 +282,8 @@ WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nSho WCHAR PromptMsg[RC_STRING_MAX_SIZE]; CHAR InputBuffer[255]; - LoadStringW( GetModuleHandle(NULL), STRING_WelcomeMsg, WelcomeMsg,sizeof(WelcomeMsg) / sizeof(WelcomeMsg[0])); - LoadStringW( GetModuleHandle(NULL), STRING_PromptMsg, PromptMsg ,sizeof(PromptMsg) / sizeof(PromptMsg[0])); + LoadString( GetModuleHandle(NULL), STRING_WelcomeMsg, (LPTSTR) WelcomeMsg,sizeof(WelcomeMsg) / sizeof(WelcomeMsg[0])); + LoadString( GetModuleHandle(NULL), STRING_PromptMsg, (LPTSTR) PromptMsg ,sizeof(PromptMsg) / sizeof(PromptMsg[0])); AllocConsole(); SetConsoleTitleW(L"ntvdm"); diff --git a/subsystems/win32/csrss/win32csr/dllmain.c b/subsystems/win32/csrss/win32csr/dllmain.c index e1fc421ff7c..2b3c6b7a1a4 100644 --- a/subsystems/win32/csrss/win32csr/dllmain.c +++ b/subsystems/win32/csrss/win32csr/dllmain.c @@ -180,6 +180,402 @@ Win32CsrInitComplete(void) return TRUE; } +static BOOL WINAPI +Win32CsrHardError(IN PCSRSS_PROCESS_DATA ProcessData, + IN PHARDERROR_MSG HardErrorMessage) +{ + UINT responce = MB_OK; + NTSTATUS Status; + HANDLE hProcess; + OBJECT_ATTRIBUTES ObjectAttributes; + ULONG nParam = 0; + PRTL_MESSAGE_RESOURCE_ENTRY MessageResource; + ULONG_PTR ParameterList[MAXIMUM_HARDERROR_PARAMETERS]; + LPSTR CaptionText, MessageBody; + LPWSTR szxCaptionText, szxMessageBody; + DWORD SizeOfAllUnicodeStrings = 0; + PROCESS_BASIC_INFORMATION ClientBasicInfo; + UNICODE_STRING ClientFileNameU; + UNICODE_STRING TempStringU; + UNICODE_STRING ParameterStringU; + ANSI_STRING ParamStringA; + ULONG UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; + int MessageBoxResponse; + + HardErrorMessage->Response = ResponseNotHandled; + + DPRINT("NumberOfParameters = %d\n", HardErrorMessage->NumberOfParameters); + DPRINT("Status = %lx\n", HardErrorMessage->Status); + + // open client process + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); + Status = NtOpenProcess(&hProcess, PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, &ObjectAttributes, &HardErrorMessage->h.ClientId); + if( !NT_SUCCESS(Status) ) { + DPRINT1("NtOpenProcess failed with code: %lx\n", Status); + return FALSE; + } + + // let's get a name of the client process to display it in the caption of a message box + + ClientFileNameU.MaximumLength = 0; + ClientFileNameU.Length = 0; + ClientFileNameU.Buffer = NULL; + Status = NtQueryInformationProcess(hProcess, + ProcessBasicInformation, + &ClientBasicInfo, + sizeof(ClientBasicInfo), + NULL); + if( NT_SUCCESS(Status) ) { + PLIST_ENTRY ModuleListHead; + PLIST_ENTRY Entry; + PLDR_DATA_TABLE_ENTRY Module; + PPEB_LDR_DATA Ldr; + PPEB Peb = ClientBasicInfo.PebBaseAddress; + + if( Peb ) + { + Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL); + if( NT_SUCCESS(Status) ) { + ModuleListHead = &Ldr->InLoadOrderModuleList; + Status = NtReadVirtualMemory( + hProcess, + &ModuleListHead->Flink, + &Entry, + sizeof(Entry), + NULL + ); + + if( NT_SUCCESS(Status) ) + { + if (Entry != ModuleListHead) + { + LDR_DATA_TABLE_ENTRY ModuleData; + Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); + + Status = NtReadVirtualMemory(hProcess, Module, &ModuleData, sizeof(ModuleData), NULL); + if( NT_SUCCESS(Status) ) { + PVOID ClientDllBase; + + Status = NtReadVirtualMemory( + hProcess, + &Peb->ImageBaseAddress, + &ClientDllBase, + sizeof(ClientDllBase), + NULL + ); + if( NT_SUCCESS(Status) && (ClientDllBase == ModuleData.DllBase) ) { + + ClientFileNameU.MaximumLength = ModuleData.BaseDllName.MaximumLength; + ClientFileNameU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength); + Status = NtReadVirtualMemory( + hProcess, + ModuleData.BaseDllName.Buffer, + ClientFileNameU.Buffer, + ClientFileNameU.MaximumLength, + NULL + ); + if( NT_SUCCESS(Status) ) { + ClientFileNameU.Length = wcslen(ClientFileNameU.Buffer)*sizeof(wchar_t); + } + else { + RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); + ClientFileNameU.Buffer = NULL; + } + + DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU); + } + } + } + } + } + } + } + + // read all unicode strings from client space + for(nParam = 0; nParam < HardErrorMessage->NumberOfParameters; nParam++, UnicodeStringParameterMask >>= 1) + { + if( UnicodeStringParameterMask & 0x01 ) { + Status = NtReadVirtualMemory(hProcess, + (PVOID)HardErrorMessage->Parameters[nParam], + (PVOID)&TempStringU, + sizeof(TempStringU), + NULL); + + if( NT_SUCCESS(Status) ) { + ParameterStringU.Buffer = (PWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, TempStringU.MaximumLength); + if( !ParameterStringU.Buffer ) { + DPRINT1("Cannot allocate memory %d\n", TempStringU.MaximumLength); + NtClose(hProcess); + if( ClientFileNameU.Buffer ) { + RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); + } + return FALSE; + } + + Status = NtReadVirtualMemory(hProcess, + (PVOID)TempStringU.Buffer, + (PVOID)ParameterStringU.Buffer, + TempStringU.MaximumLength, + NULL); + if( !NT_SUCCESS(Status) ) { + DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status); + RtlFreeHeap (RtlGetProcessHeap(), 0, ParameterStringU.Buffer); + if( ClientFileNameU.Buffer ) { + RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); + } + NtClose(hProcess); + return FALSE; + } + ParameterStringU.Length = TempStringU.Length; + ParameterStringU.MaximumLength = TempStringU.MaximumLength; + DPRINT("ParameterStringU=\'%wZ\'\n", &ParameterStringU); + RtlUnicodeStringToAnsiString(&ParamStringA, &ParameterStringU, TRUE); + ParameterList[nParam] = (ULONG_PTR)ParamStringA.Buffer; + SizeOfAllUnicodeStrings += ParamStringA.MaximumLength; + } + } + else { + // it's not a unicode string + ParameterList[nParam] = HardErrorMessage->Parameters[nParam]; + } + } + + NtClose(hProcess); + + // get text string of the error code + Status = RtlFindMessage( + (PVOID)GetModuleHandle(TEXT("ntdll")), + (ULONG_PTR)RT_MESSAGETABLE, + LANG_NEUTRAL, + HardErrorMessage->Status, + &MessageResource ); + if( !NT_SUCCESS(Status) ) { + // WE HAVE TO DISPLAY HERE: "Unknown hard error" + if( ClientFileNameU.Buffer ) { + szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength+64); + wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, "Application Error"); + } else { + szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 64); + wsprintfW(szxCaptionText, L"System - Application Error"); + } + MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 38); + wsprintfA(MessageBody, "Unknown hard error"); + } + else { + LPSTR NtStatusString; + UNICODE_STRING MessageU; + ANSI_STRING MessageA; + USHORT CaptionSize = 0; + + if( !MessageResource->Flags ) { + /* we've got an ansi string */ + DPRINT("MessageResource->Text=%s\n", (PSTR)MessageResource->Text); + RtlInitAnsiString(&MessageA, MessageResource->Text); + } + else { + /* we've got a unicode string */ + DPRINT("MessageResource->Text=%S\n", (PWSTR)MessageResource->Text); + RtlInitUnicodeString(&MessageU, (PWSTR)MessageResource->Text); + RtlUnicodeStringToAnsiString(&MessageA, &MessageU, TRUE); + } + + // check whether a caption exists + if( *MessageA.Buffer == '{' ) { + // get size of the caption + for( CaptionSize = 0; (CaptionSize < MessageA.Length) && ('}' != MessageA.Buffer[CaptionSize]); CaptionSize++); + + CaptionText = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, CaptionSize); + RtlCopyMemory(CaptionText, MessageA.Buffer+1, CaptionSize-1); + CaptionSize += 2; // "}\r\n" - 3 + + szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*CaptionSize+ClientFileNameU.MaximumLength+128); + if( ClientFileNameU.Buffer ) { + wsprintfW(szxCaptionText, L"%s - %hs", ClientFileNameU.Buffer, CaptionText); + } else { + wsprintfW(szxCaptionText, L"System - %hs", CaptionText); + } + RtlFreeHeap (RtlGetProcessHeap(), 0, CaptionText); + } + else { + if( ClientFileNameU.Buffer ) { + szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, ClientFileNameU.MaximumLength); + wsprintfW(szxCaptionText, L"%s", ClientFileNameU.Buffer); + } else { + szxCaptionText = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, 14); // 14 - "System\0\0" + wsprintfW(szxCaptionText, L"System"); + } + } + DPRINT("ParameterList[0]=0x%lx\n", ParameterList[0]); + if( STATUS_UNHANDLED_EXCEPTION == HardErrorMessage->Status ) + { + PRTL_MESSAGE_RESOURCE_ENTRY MsgResException; + MessageBody = NULL; + Status = RtlFindMessage( + (PVOID)GetModuleHandle(TEXT("ntdll")), + (ULONG_PTR)RT_MESSAGETABLE, + LANG_NEUTRAL, + ParameterList[0], + &MsgResException); + + if( NT_SUCCESS(Status) ) + { + UNICODE_STRING ExcMessageU; + ANSI_STRING ExcMessageA; + if( !MsgResException->Flags ) { + /* we've got an ansi string */ + DPRINT("MsgResException->Text=%s\n", (PSTR)MsgResException->Text); + RtlInitAnsiString(&ExcMessageA, MsgResException->Text); + } + else { + /* we've got a unicode string */ + DPRINT("MsgResException->Text=%S\n", (PWSTR)MsgResException->Text); + RtlInitUnicodeString(&ExcMessageU, (PWSTR)MsgResException->Text); + RtlUnicodeStringToAnsiString(&ExcMessageA, &ExcMessageU, TRUE); + } + + MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MsgResException->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough + if( STATUS_ACCESS_VIOLATION == ParameterList[0] ) { + LPSTR pOperationType; + if( ParameterList[2] ) pOperationType = "written"; + else pOperationType = "read"; + wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], pOperationType); + } + else if( STATUS_IN_PAGE_ERROR == ParameterList[0] ) { + wsprintfA(MessageBody, ExcMessageA.Buffer, ParameterList[1], ParameterList[3], ParameterList[2]); + } + } + if( !MessageBody ) { + NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize); + RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1); + + MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough + + wsprintfA(MessageBody, NtStatusString, + L"Unknown software exception", + ParameterList[0], + ParameterList[1]); + + RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString); + } + } + else + { + NtStatusString = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length-CaptionSize); + RtlCopyMemory(NtStatusString, MessageA.Buffer+CaptionSize, (MessageResource->Length-CaptionSize)-1); + + MessageBody = (LPSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, MessageResource->Length+SizeOfAllUnicodeStrings+1024); // 1024 is a magic number I think it should be enough + + wsprintfA(MessageBody, NtStatusString, + ParameterList[0], + ParameterList[1], + ParameterList[2], + ParameterList[3]); + + RtlFreeHeap (RtlGetProcessHeap(), 0, NtStatusString); + } + if( MessageResource->Flags ) { + /* we've got a unicode string */ + RtlFreeAnsiString(&MessageA); + } + } + if( ClientFileNameU.Buffer ) { + RtlFreeHeap (RtlGetProcessHeap(), 0, ClientFileNameU.Buffer); + } + + szxMessageBody = (LPWSTR)RtlAllocateHeap(RtlGetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(wchar_t)*(strlen(MessageBody)+1)); + wsprintfW(szxMessageBody, L"%hs", MessageBody); + RtlFreeHeap (RtlGetProcessHeap(), 0, MessageBody); + + switch ( HardErrorMessage->ValidResponseOptions ) + { + case OptionAbortRetryIgnore: + responce = MB_ABORTRETRYIGNORE; + break; + + case OptionOk: + responce = MB_OK; + break; + + case OptionOkCancel: + responce = MB_OKCANCEL; + break; + + case OptionRetryCancel: + responce = MB_RETRYCANCEL; + break; + + case OptionYesNo: + responce = MB_YESNO; + break; + + case OptionYesNoCancel: + responce = MB_YESNOCANCEL; + break; + + case OptionShutdownSystem: + // XZ?? + break; + + default: + DPRINT1("Wrong option: ValidResponseOptions = %d\n", HardErrorMessage->ValidResponseOptions); + ASSERT(FALSE); + break; + } + + // FIXME: We should not use MessageBox !!!! + DPRINT1("%S\n", szxMessageBody); + MessageBoxResponse = MessageBoxW(0, szxMessageBody, szxCaptionText, responce|MB_ICONERROR|MB_SYSTEMMODAL|MB_SETFOREGROUND); + + RtlFreeHeap (RtlGetProcessHeap(), 0, szxMessageBody); + RtlFreeHeap (RtlGetProcessHeap(), 0, szxCaptionText); + + switch( MessageBoxResponse ) + { + case IDOK: + HardErrorMessage->Response = ResponseOk; + break; + + case IDCANCEL: + HardErrorMessage->Response = ResponseCancel; + break; + + case IDYES: + HardErrorMessage->Response = ResponseYes; + break; + + case IDNO: + HardErrorMessage->Response = ResponseNo; + break; + + case IDABORT: + HardErrorMessage->Response = ResponseAbort; + break; + + case IDIGNORE: + HardErrorMessage->Response = ResponseIgnore; + break; + + case IDRETRY: + HardErrorMessage->Response = ResponseRetry; + break; + + case 10://IDTRYAGAIN: + HardErrorMessage->Response = ResponseTryAgain; + break; + + case 11://IDCONTINUE: + HardErrorMessage->Response = ResponseContinue; + break; + + default: + ASSERT(FALSE); + break; + } + + return TRUE; +} + + BOOL WINAPI Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRSS_OBJECT_DEFINITION *ObjectDefinitions, diff --git a/subsystems/win32/csrss/win32csr/harderror.c b/subsystems/win32/csrss/win32csr/harderror.c deleted file mode 100644 index a1b5a5dc5d3..00000000000 --- a/subsystems/win32/csrss/win32csr/harderror.c +++ /dev/null @@ -1,552 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS system libraries - * FILE: subsys/csrss/win32csr/dllmain.c - * PURPOSE: Initialization - * PROGRAMMERS: Dmitry Philippov (shedon@mail.ru) - * Timo Kreuzer (timo.kreuzer@reactos.org) - */ - -/* INCLUDES ******************************************************************/ - -#define NDEBUG -#include "w32csr.h" -#include -#include - -#define IDTRYAGAIN 10 -#define IDCONTINUE 11 - -/* FUNCTIONS *****************************************************************/ - -static -NTSTATUS -CsrpGetClientFileName( - OUT PUNICODE_STRING ClientFileNameU, - HANDLE hProcess) -{ - PLIST_ENTRY ModuleListHead; - PLIST_ENTRY Entry; - PLDR_DATA_TABLE_ENTRY Module; - PPEB_LDR_DATA Ldr; - PROCESS_BASIC_INFORMATION ClientBasicInfo; - LDR_DATA_TABLE_ENTRY ModuleData; - PVOID ClientDllBase; - NTSTATUS Status; - PPEB Peb; - - /* Initialize string */ - ClientFileNameU->MaximumLength = 0; - ClientFileNameU->Length = 0; - ClientFileNameU->Buffer = NULL; - - /* Query process information */ - Status = NtQueryInformationProcess(hProcess, - ProcessBasicInformation, - &ClientBasicInfo, - sizeof(ClientBasicInfo), - NULL); - if (!NT_SUCCESS(Status)) return Status; - - Peb = ClientBasicInfo.PebBaseAddress; - if (!Peb) return STATUS_UNSUCCESSFUL; - - Status = NtReadVirtualMemory(hProcess, &Peb->Ldr, &Ldr, sizeof(Ldr), NULL); - if (!NT_SUCCESS(Status)) return Status; - - ModuleListHead = &Ldr->InLoadOrderModuleList; - Status = NtReadVirtualMemory(hProcess, - &ModuleListHead->Flink, - &Entry, - sizeof(Entry), - NULL); - if (!NT_SUCCESS(Status)) return Status; - - if (Entry == ModuleListHead) return STATUS_UNSUCCESSFUL; - - Module = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); - - Status = NtReadVirtualMemory(hProcess, - Module, - &ModuleData, - sizeof(ModuleData), - NULL); - if (!NT_SUCCESS(Status)) return Status; - - Status = NtReadVirtualMemory(hProcess, - &Peb->ImageBaseAddress, - &ClientDllBase, - sizeof(ClientDllBase), - NULL); - if (!NT_SUCCESS(Status)) return Status; - - if (ClientDllBase != ModuleData.DllBase) return STATUS_UNSUCCESSFUL; - - ClientFileNameU->MaximumLength = ModuleData.BaseDllName.MaximumLength; - ClientFileNameU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - ClientFileNameU->MaximumLength); - - Status = NtReadVirtualMemory(hProcess, - ModuleData.BaseDllName.Buffer, - ClientFileNameU->Buffer, - ClientFileNameU->MaximumLength, - NULL); - if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, ClientFileNameU->Buffer); - ClientFileNameU->Buffer = NULL; - ClientFileNameU->MaximumLength = 0; - return Status; - } - - ClientFileNameU->Length = wcslen(ClientFileNameU->Buffer)*sizeof(wchar_t); - DPRINT("ClientFileNameU=\'%wZ\'\n", &ClientFileNameU); - - return STATUS_SUCCESS; -} - - -static -NTSTATUS -CsrpCaptureStringParameters( - OUT PULONG_PTR Parameters, - OUT PULONG SizeOfAllUnicodeStrings, - IN PHARDERROR_MSG HardErrorMessage, - HANDLE hProcess) -{ - ULONG nParam, UnicodeStringParameterMask, Size = 0; - NTSTATUS Status; - UNICODE_STRING TempStringU; - PWSTR ParamString; - - UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; - - /* Read all strings from client space */ - for (nParam = 0; - nParam < HardErrorMessage->NumberOfParameters; - nParam++, UnicodeStringParameterMask >>= 1) - { - Parameters[nParam] = 0; - - /* Check if the current parameter is a unicode string */ - if (UnicodeStringParameterMask & 0x01) - { - /* Read the UNICODE_STRING from the process memory */ - Status = NtReadVirtualMemory(hProcess, - (PVOID)HardErrorMessage->Parameters[nParam], - &TempStringU, - sizeof(TempStringU), - NULL); - - if (!NT_SUCCESS(Status)) return Status; - - /* Allocate a buffer for the string */ - ParamString = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - TempStringU.Length + sizeof(WCHAR)); - - if (!ParamString) - { - DPRINT1("Cannot allocate memory %d\n", TempStringU.Length); - return STATUS_NO_MEMORY; - } - - /* Read the string buffer from the process memory */ - Status = NtReadVirtualMemory(hProcess, - TempStringU.Buffer, - ParamString, - TempStringU.Length, - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtReadVirtualMemory failed with code: %lx\n", Status); - RtlFreeHeap(RtlGetProcessHeap(), 0, ParamString); - return Status; - } - - /* Zero terminate the string */ - ParamString[TempStringU.Length / sizeof(WCHAR)] = 0; - DPRINT("ParamString=\'%S\'\n", ParamString); - - Parameters[nParam] = (ULONG_PTR)ParamString; - Size += TempStringU.Length; - } - else - { - /* It's not a unicode string */ - Parameters[nParam] = HardErrorMessage->Parameters[nParam]; - } - } - - *SizeOfAllUnicodeStrings = Size; - return STATUS_SUCCESS; -} - -static -VOID -CsrpFreeStringParameters( - IN OUT PULONG_PTR Parameters, - IN PHARDERROR_MSG HardErrorMessage) -{ - ULONG nParam, UnicodeStringParameterMask; - - UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; - - /* Loop all parameters */ - for (nParam = 0; - nParam < HardErrorMessage->NumberOfParameters; - nParam++, UnicodeStringParameterMask >>= 1) - { - /* Check if the current parameter is a string */ - if (UnicodeStringParameterMask & 0x01) - { - /* Free the string buffer */ - RtlFreeHeap(RtlGetProcessHeap(), 0, (PVOID)Parameters[nParam]); - } - } -} - - -static -NTSTATUS -CsrpFormatMessages( - OUT PUNICODE_STRING TextStringU, - OUT PUNICODE_STRING CaptionStringU, - IN PULONG_PTR Parameters, - IN ULONG SizeOfStrings, - IN PHARDERROR_MSG Message, - IN HANDLE hProcess) -{ - NTSTATUS Status; - UNICODE_STRING FileNameU, TempStringU, FormatU; - ANSI_STRING FormatA; - PRTL_MESSAGE_RESOURCE_ENTRY MessageResource; - PWSTR FormatString; - ULONG Size; - - /* Get the file name of the client process */ - CsrpGetClientFileName(&FileNameU, hProcess); - - /* Check if we have a file name */ - if (!FileNameU.Buffer) - { - /* No, use system */ - RtlInitUnicodeString(&FileNameU, L"System"); - } - - /* Get text string of the error code */ - Status = RtlFindMessage(GetModuleHandleW(L"ntdll"), - (ULONG_PTR)RT_MESSAGETABLE, - LANG_NEUTRAL, - Message->Status, - &MessageResource); - - if (NT_SUCCESS(Status)) - { - if (MessageResource->Flags) - { - RtlInitUnicodeString(&FormatU, (PWSTR)MessageResource->Text); - FormatA.Buffer = NULL; - } - else - { - RtlInitAnsiString(&FormatA, MessageResource->Text); - RtlAnsiStringToUnicodeString(&FormatU, &FormatA, TRUE); - } - } - else - { - /* Fall back to hardcoded value */ - RtlInitUnicodeString(&FormatU, L"Unknown Hard Error"); - FormatA.Buffer = NULL; - } - - FormatString = FormatU.Buffer; - - /* Check whether a caption exists */ - if (FormatString[0] == L'{') - { - /* Set caption start */ - TempStringU.Buffer = ++FormatString; - - /* Get size of the caption */ - for (Size = 0; *FormatString != 0 && *FormatString != L'}'; Size++) - FormatString++; - - /* Skip '}', '\r', '\n' */ - FormatString += 3; - - TempStringU.Length = Size * sizeof(WCHAR); - TempStringU.MaximumLength = TempStringU.Length; - } - else - { - /* FIXME: Set string based on severity */ - RtlInitUnicodeString(&TempStringU, L"Application Error"); - } - - /* Calculate buffer length for the caption */ - CaptionStringU->MaximumLength = FileNameU.Length + TempStringU.Length + - 4 * sizeof(WCHAR); - - /* Allocate a buffer for the caption */ - CaptionStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - CaptionStringU->MaximumLength); - - /* Append the file name, seperator and the caption text */ - CaptionStringU->Length = 0; - RtlAppendUnicodeStringToString(CaptionStringU, &FileNameU); - RtlAppendUnicodeToString(CaptionStringU, L" - "); - RtlAppendUnicodeStringToString(CaptionStringU, &TempStringU); - - /* Zero terminate the buffer */ - CaptionStringU->Buffer[CaptionStringU->Length] = 0; - - /* Free the file name buffer */ - RtlFreeUnicodeString(&FileNameU); - - /* Check if this is an exception message */ - if (Message->Status == STATUS_UNHANDLED_EXCEPTION) - { - /* Handle special cases */ - if (Parameters[0] == STATUS_ACCESS_VIOLATION) - { - Parameters[0] = Parameters[1]; - Parameters[1] = Parameters[3]; - if (Parameters[2]) Parameters[2] = (ULONG_PTR)L"written"; - else Parameters[2] = (ULONG_PTR)L"read"; - MessageResource = NULL; - } - else if (Parameters[0] == STATUS_IN_PAGE_ERROR) - { - Parameters[0] = Parameters[1]; - Parameters[1] = Parameters[3]; - MessageResource = NULL; - } - else - { - /* Fall back to hardcoded value */ - Parameters[2] = Parameters[1]; - Parameters[1] = Parameters[0]; - Parameters[0] = (ULONG_PTR)L"unknown software exception"; - } - - if (!MessageResource) - { - /* Get text string of the exception code */ - Status = RtlFindMessage(GetModuleHandleW(L"ntdll"), - (ULONG_PTR)RT_MESSAGETABLE, - LANG_NEUTRAL, - Parameters[0], - &MessageResource); - - if (NT_SUCCESS(Status)) - { - if (FormatA.Buffer) RtlFreeUnicodeString(&FormatU); - - if (MessageResource->Flags) - { - RtlInitUnicodeString(&FormatU, (PWSTR)MessageResource->Text); - FormatA.Buffer = NULL; - } - else - { - RtlInitAnsiString(&FormatA, MessageResource->Text); - RtlAnsiStringToUnicodeString(&FormatU, &FormatA, TRUE); - } - } - else - { - /* Fall back to hardcoded value */ - Parameters[2] = Parameters[1]; - Parameters[1] = Parameters[0]; - Parameters[0] = (ULONG_PTR)L"unknown software exception"; - } - } - } - - /* Calculate length of text buffer */ - TextStringU->MaximumLength = wcslen(FormatString) * sizeof(WCHAR) + - SizeOfStrings + 42 * sizeof(WCHAR); - - /* Allocate a buffer for the text */ - TextStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - TextStringU->MaximumLength); - - /* Wrap in SEH to protect from invalid string parameters */ - _SEH2_TRY - { - /* Print the string into the buffer */ - StringCbPrintfW(TextStringU->Buffer, - TextStringU->MaximumLength, - FormatString, - Parameters[0], - Parameters[1], - Parameters[2], - Parameters[3], - Parameters[4]); - Status = STATUS_SUCCESS; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Set error and free buffers */ - Status = _SEH2_GetExceptionCode(); - RtlFreeHeap(RtlGetProcessHeap(), 0, TextStringU->Buffer); - RtlFreeHeap(RtlGetProcessHeap(), 0, CaptionStringU->Buffer); - } - _SEH2_END - - if (NT_SUCCESS(Status)) - { - TextStringU->Length = wcslen(TextStringU->Buffer) * sizeof(WCHAR); - } - - if (FormatA.Buffer) RtlFreeUnicodeString(&FormatU); - - return Status; -} - -static -ULONG -CsrpMessageBox( - PWSTR Text, - PWSTR Caption, - ULONG ValidResponseOptions, - ULONG Severity) -{ - ULONG Type, MessageBoxResponse; - - /* Set the message box type */ - switch (ValidResponseOptions) - { - case OptionAbortRetryIgnore: - Type = MB_ABORTRETRYIGNORE; - break; - case OptionOk: - Type = MB_OK; - break; - case OptionOkCancel: - Type = MB_OKCANCEL; - break; - case OptionRetryCancel: - Type = MB_RETRYCANCEL; - break; - case OptionYesNo: - Type = MB_YESNO; - break; - case OptionYesNoCancel: - Type = MB_YESNOCANCEL; - break; - case OptionShutdownSystem: - Type = MB_RETRYCANCEL; // FIXME??? - break; - /* Anything else is invalid */ - default: - return ResponseNotHandled; - } - - /* Set severity */ - if (Severity == STATUS_SEVERITY_INFORMATIONAL) Type |= MB_ICONINFORMATION; - else if (Severity == STATUS_SEVERITY_WARNING) Type |= MB_ICONWARNING; - else if (Severity == STATUS_SEVERITY_ERROR) Type |= MB_ICONERROR; - - Type |= MB_SYSTEMMODAL | MB_SETFOREGROUND; - - DPRINT("Text = '%S', Caption = '%S', Severity = %d, Type = 0x%lx\n", - Text, Caption, Severity, Type); - - /* Display a message box */ - MessageBoxResponse = MessageBoxW(0, Text, Caption, Type); - - /* Return response value */ - switch (MessageBoxResponse) - { - case IDOK: return ResponseOk; - case IDCANCEL: return ResponseCancel; - case IDYES: return ResponseYes; - case IDNO: return ResponseNo; - case IDABORT: return ResponseAbort; - case IDIGNORE: return ResponseIgnore; - case IDRETRY: return ResponseRetry; - case IDTRYAGAIN: return ResponseTryAgain; - case IDCONTINUE: return ResponseContinue; - } - - return ResponseNotHandled; -} - -BOOL -WINAPI -Win32CsrHardError( - IN PCSRSS_PROCESS_DATA ProcessData, - IN PHARDERROR_MSG Message) -{ - ULONG_PTR Parameters[MAXIMUM_HARDERROR_PARAMETERS]; - OBJECT_ATTRIBUTES ObjectAttributes; - UNICODE_STRING TextU, CaptionU; - NTSTATUS Status; - HANDLE hProcess; - ULONG Size; - - /* Default to not handled */ - Message->Response = ResponseNotHandled; - - /* Make sure we don't have too many parameters */ - if (Message->NumberOfParameters > MAXIMUM_HARDERROR_PARAMETERS) - Message->NumberOfParameters = MAXIMUM_HARDERROR_PARAMETERS; - - /* Initialize object attributes */ - InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); - - /* Open client process */ - Status = NtOpenProcess(&hProcess, - PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, - &ObjectAttributes, - &Message->h.ClientId); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtOpenProcess failed with code: %lx\n", Status); - return FALSE; - } - - /* Capture all string parameters from the process memory */ - Status = CsrpCaptureStringParameters(Parameters, &Size, Message, hProcess); - if (!NT_SUCCESS(Status)) - { - NtClose(hProcess); - return FALSE; - } - - /* Format the caption and message box text */ - Status = CsrpFormatMessages(&TextU, - &CaptionU, - Parameters, - Size, - Message, - hProcess); - - /* Cleanup */ - CsrpFreeStringParameters(Parameters, Message); - NtClose(hProcess); - - if (!NT_SUCCESS(Status)) - { - return FALSE; - } - - /* Display the message box */ - Message->Response = CsrpMessageBox(TextU.Buffer, - CaptionU.Buffer, - Message->ValidResponseOptions, - (ULONG)Message->Status >> 30); - - RtlFreeUnicodeString(&TextU); - RtlFreeUnicodeString(&CaptionU); - - return TRUE; -} - diff --git a/subsystems/win32/csrss/win32csr/w32csr.h b/subsystems/win32/csrss/win32csr/w32csr.h index 5ecc378a7c7..f6f0f4e649c 100644 --- a/subsystems/win32/csrss/win32csr/w32csr.h +++ b/subsystems/win32/csrss/win32csr/w32csr.h @@ -35,11 +35,4 @@ /* shared header with console.dll */ #include "console.h" - -BOOL -WINAPI -Win32CsrHardError( - IN PCSRSS_PROCESS_DATA ProcessData, - IN PHARDERROR_MSG Message); - /* EOF */ diff --git a/subsystems/win32/csrss/win32csr/win32csr.rbuild b/subsystems/win32/csrss/win32csr/win32csr.rbuild index eec81fcba60..7a14f63f806 100644 --- a/subsystems/win32/csrss/win32csr/win32csr.rbuild +++ b/subsystems/win32/csrss/win32csr/win32csr.rbuild @@ -14,7 +14,6 @@ advapi32 win32ksys psapi - pseh w32csr.h alias.c conio.c @@ -22,7 +21,6 @@ dllmain.c exitros.c guiconsole.c - harderror.c tuiconsole.c appswitch.c win32csr.rc diff --git a/subsystems/win32/win32k/dib/dib.c b/subsystems/win32/win32k/dib/dib.c index 30591d3d27d..c0e8bbf26bf 100644 --- a/subsystems/win32/win32k/dib/dib.c +++ b/subsystems/win32/win32k/dib/dib.c @@ -7,7 +7,7 @@ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib16bpp.c b/subsystems/win32/win32k/dib/dib16bpp.c index de569716586..cbc0129903b 100644 --- a/subsystems/win32/win32k/dib/dib16bpp.c +++ b/subsystems/win32/win32k/dib/dib16bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib1bpp.c b/subsystems/win32/win32k/dib/dib1bpp.c index ebea73d3326..35ee87047b6 100644 --- a/subsystems/win32/win32k/dib/dib1bpp.c +++ b/subsystems/win32/win32k/dib/dib1bpp.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib24bpp.c b/subsystems/win32/win32k/dib/dib24bpp.c index 3810024a6f8..2106d9b4e1d 100644 --- a/subsystems/win32/win32k/dib/dib24bpp.c +++ b/subsystems/win32/win32k/dib/dib24bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib24bppc.c b/subsystems/win32/win32k/dib/dib24bppc.c index ca09cee518b..79a71c9b4aa 100644 --- a/subsystems/win32/win32k/dib/dib24bppc.c +++ b/subsystems/win32/win32k/dib/dib24bppc.c @@ -7,7 +7,7 @@ * Magnus Olsen */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib32bpp.c b/subsystems/win32/win32k/dib/dib32bpp.c index 6c4704b1c96..edf3f63aa35 100644 --- a/subsystems/win32/win32k/dib/dib32bpp.c +++ b/subsystems/win32/win32k/dib/dib32bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib32bppc.c b/subsystems/win32/win32k/dib/dib32bppc.c index 859e9507e0e..da86647367f 100644 --- a/subsystems/win32/win32k/dib/dib32bppc.c +++ b/subsystems/win32/win32k/dib/dib32bppc.c @@ -7,7 +7,7 @@ * Magnus Olsen */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib4bpp.c b/subsystems/win32/win32k/dib/dib4bpp.c index 1626b8e8397..4ae4f8b8f47 100644 --- a/subsystems/win32/win32k/dib/dib4bpp.c +++ b/subsystems/win32/win32k/dib/dib4bpp.c @@ -7,7 +7,7 @@ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/dib8bpp.c b/subsystems/win32/win32k/dib/dib8bpp.c index 95b09cbb73c..cfbdb0a2db8 100644 --- a/subsystems/win32/win32k/dib/dib8bpp.c +++ b/subsystems/win32/win32k/dib/dib8bpp.c @@ -8,7 +8,7 @@ * Gregor Anich */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/floodfill.c b/subsystems/win32/win32k/dib/floodfill.c index c31c262d9fc..21bd2c306ab 100644 --- a/subsystems/win32/win32k/dib/floodfill.c +++ b/subsystems/win32/win32k/dib/floodfill.c @@ -6,7 +6,7 @@ * PROGRAMMER: Gregor Schneider, */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/dib/stretchblt.c b/subsystems/win32/win32k/dib/stretchblt.c index b6d479d8703..579014ace91 100644 --- a/subsystems/win32/win32k/dib/stretchblt.c +++ b/subsystems/win32/win32k/dib/stretchblt.c @@ -8,7 +8,7 @@ * Gregor Schneider */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/alphablend.c b/subsystems/win32/win32k/eng/alphablend.c index 34b2930cd68..30ba88fd386 100644 --- a/subsystems/win32/win32k/eng/alphablend.c +++ b/subsystems/win32/win32k/eng/alphablend.c @@ -6,7 +6,7 @@ * PROGRAMER: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/bitblt.c b/subsystems/win32/win32k/eng/bitblt.c index afac0e8a7d3..3c65aaa6862 100644 --- a/subsystems/win32/win32k/eng/bitblt.c +++ b/subsystems/win32/win32k/eng/bitblt.c @@ -9,7 +9,7 @@ * 2/10/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/clip.c b/subsystems/win32/win32k/eng/clip.c index 0235d0f27b7..d9bfe0e0960 100644 --- a/subsystems/win32/win32k/eng/clip.c +++ b/subsystems/win32/win32k/eng/clip.c @@ -27,7 +27,7 @@ * 21/8/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/copybits.c b/subsystems/win32/win32k/eng/copybits.c index 73a477dd13d..1cabfb955f2 100644 --- a/subsystems/win32/win32k/eng/copybits.c +++ b/subsystems/win32/win32k/eng/copybits.c @@ -26,7 +26,7 @@ * 8/18/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/debug.c b/subsystems/win32/win32k/eng/debug.c index 9e2e7226a0e..91b39820db1 100644 --- a/subsystems/win32/win32k/eng/debug.c +++ b/subsystems/win32/win32k/eng/debug.c @@ -27,7 +27,7 @@ * 11/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/device.c b/subsystems/win32/win32k/eng/device.c index 0e51ea05eef..301497afcc7 100644 --- a/subsystems/win32/win32k/eng/device.c +++ b/subsystems/win32/win32k/eng/device.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/driverobj.c b/subsystems/win32/win32k/eng/driverobj.c index cb6ff389450..900812eeabd 100644 --- a/subsystems/win32/win32k/eng/driverobj.c +++ b/subsystems/win32/win32k/eng/driverobj.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/engbrush.c b/subsystems/win32/win32k/eng/engbrush.c index 3c3d1d7b151..1337e298024 100644 --- a/subsystems/win32/win32k/eng/engbrush.c +++ b/subsystems/win32/win32k/eng/engbrush.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/engevent.c b/subsystems/win32/win32k/eng/engevent.c index d38c32ae2d1..e978786bdb3 100644 --- a/subsystems/win32/win32k/eng/engevent.c +++ b/subsystems/win32/win32k/eng/engevent.c @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/engmisc.c b/subsystems/win32/win32k/eng/engmisc.c index af544c95d55..bb65ef6e733 100644 --- a/subsystems/win32/win32k/eng/engmisc.c +++ b/subsystems/win32/win32k/eng/engmisc.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/engwindow.c b/subsystems/win32/win32k/eng/engwindow.c index 5628610e58e..aed25f0e8b8 100644 --- a/subsystems/win32/win32k/eng/engwindow.c +++ b/subsystems/win32/win32k/eng/engwindow.c @@ -29,7 +29,7 @@ /* TODO: Check how the WNDOBJ implementation should behave with a driver on windows. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/error.c b/subsystems/win32/win32k/eng/error.c index d78da06d545..d81b3822d84 100644 --- a/subsystems/win32/win32k/eng/error.c +++ b/subsystems/win32/win32k/eng/error.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/float.c b/subsystems/win32/win32k/eng/float.c index 2ca5fe9b796..ebee480c728 100644 --- a/subsystems/win32/win32k/eng/float.c +++ b/subsystems/win32/win32k/eng/float.c @@ -28,7 +28,7 @@ /* INCLUDES *****************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/gradient.c b/subsystems/win32/win32k/eng/gradient.c index c3ef6535c04..7559b17ddba 100644 --- a/subsystems/win32/win32k/eng/gradient.c +++ b/subsystems/win32/win32k/eng/gradient.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/lineto.c b/subsystems/win32/win32k/eng/lineto.c index a67b47af5b1..049c0a9e79c 100644 --- a/subsystems/win32/win32k/eng/lineto.c +++ b/subsystems/win32/win32k/eng/lineto.c @@ -19,7 +19,7 @@ * $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/mapping.c b/subsystems/win32/win32k/eng/mapping.c index 7e445d7c631..39de58264d1 100644 --- a/subsystems/win32/win32k/eng/mapping.c +++ b/subsystems/win32/win32k/eng/mapping.c @@ -6,7 +6,7 @@ * PROGRAMER: */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/mem.c b/subsystems/win32/win32k/eng/mem.c index a49e4fe5cab..3beb023572c 100644 --- a/subsystems/win32/win32k/eng/mem.c +++ b/subsystems/win32/win32k/eng/mem.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/mouse.c b/subsystems/win32/win32k/eng/mouse.c index f5f6b2f30ca..d96e8dd4ed2 100644 --- a/subsystems/win32/win32k/eng/mouse.c +++ b/subsystems/win32/win32k/eng/mouse.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/paint.c b/subsystems/win32/win32k/eng/paint.c index 29cd723d4b0..81d1e67b40c 100644 --- a/subsystems/win32/win32k/eng/paint.c +++ b/subsystems/win32/win32k/eng/paint.c @@ -27,7 +27,7 @@ * 3/7/1999: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/perfcnt.c b/subsystems/win32/win32k/eng/perfcnt.c index 381abc40c20..e69ff02a921 100644 --- a/subsystems/win32/win32k/eng/perfcnt.c +++ b/subsystems/win32/win32k/eng/perfcnt.c @@ -25,7 +25,7 @@ * PROGRAMER: Ge van Geldorp */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/semaphor.c b/subsystems/win32/win32k/eng/semaphor.c index d09d4c9022b..5ef403d8670 100644 --- a/subsystems/win32/win32k/eng/semaphor.c +++ b/subsystems/win32/win32k/eng/semaphor.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/sort.c b/subsystems/win32/win32k/eng/sort.c index 0b9354bc599..df6a1dab97a 100644 --- a/subsystems/win32/win32k/eng/sort.c +++ b/subsystems/win32/win32k/eng/sort.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/stretchblt.c b/subsystems/win32/win32k/eng/stretchblt.c index 932d93d5cb4..ee5711c6d15 100644 --- a/subsystems/win32/win32k/eng/stretchblt.c +++ b/subsystems/win32/win32k/eng/stretchblt.c @@ -6,7 +6,7 @@ * PROGRAMER: Jason Filby */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/string.c b/subsystems/win32/win32k/eng/string.c index 14cbc5be3bf..6ab902a1bb9 100644 --- a/subsystems/win32/win32k/eng/string.c +++ b/subsystems/win32/win32k/eng/string.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/surface.c b/subsystems/win32/win32k/eng/surface.c index c081ed51571..5a85d1ac1b6 100644 --- a/subsystems/win32/win32k/eng/surface.c +++ b/subsystems/win32/win32k/eng/surface.c @@ -12,7 +12,7 @@ * refer to \test\microwin\src\engine\devdraw.c for info on correct pixel plotting for various formats */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/transblt.c b/subsystems/win32/win32k/eng/transblt.c index bca22440edd..4ef59544680 100644 --- a/subsystems/win32/win32k/eng/transblt.c +++ b/subsystems/win32/win32k/eng/transblt.c @@ -27,7 +27,7 @@ * 4/6/2004: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/eng/xlate.c b/subsystems/win32/win32k/eng/xlate.c index 27d06846fe8..fcdd0b89b4b 100644 --- a/subsystems/win32/win32k/eng/xlate.c +++ b/subsystems/win32/win32k/eng/xlate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #include diff --git a/subsystems/win32/win32k/include/coord.h b/subsystems/win32/win32k/include/coord.h index 83f3a355eaa..c241b9eb9b6 100644 --- a/subsystems/win32/win32k/include/coord.h +++ b/subsystems/win32/win32k/include/coord.h @@ -18,6 +18,4 @@ IntGdiModifyWorldTransform(PDC pDc, DWORD Mode); VOID FASTCALL IntMirrorWindowOrg(PDC); -void FASTCALL IntFixIsotropicMapping(PDC); -LONG FASTCALL IntCalcFillOrigin(PDC); -PPOINTL FASTCALL IntptlBrushOrigin(PDC pdc,LONG,LONG); \ No newline at end of file +void FASTCALL IntFixIsotropicMapping(PDC dc); diff --git a/subsystems/win32/win32k/include/dc.h b/subsystems/win32/win32k/include/dc.h index 48b0e921400..b616bdc0ba6 100644 --- a/subsystems/win32/win32k/include/dc.h +++ b/subsystems/win32/win32k/include/dc.h @@ -177,8 +177,6 @@ HDC FASTCALL IntGdiCreateDisplayDC(HDEV hDev, ULONG DcType, BOOL EmptyDC); BOOL FASTCALL IntGdiCleanDC(HDC hDC); VOID FASTCALL IntvGetDeviceCaps(PPDEVOBJ, PDEVCAPS); INT FASTCALL IntGdiGetDeviceCaps(PDC,INT); -BOOL FASTCALL MakeInfoDC(PDC,BOOL); -BOOL FASTCALL IntSetDefaultRegion(PDC); extern PPDEVOBJ pPrimarySurface; @@ -230,5 +228,6 @@ DC_vSelectPalette(PDC pdc, PPALETTE ppal) pdc->dclevel.ppal = ppal; } -BOOL FASTCALL IntPrepareDriverIfNeeded(VOID); +BOOL FASTCALL +IntPrepareDriverIfNeeded(VOID); extern PDEVOBJ PrimarySurface; diff --git a/subsystems/win32/win32k/include/gdiobj.h b/subsystems/win32/win32k/include/gdiobj.h index 6b9a7fd8aa8..50ed2e6163f 100644 --- a/subsystems/win32/win32k/include/gdiobj.h +++ b/subsystems/win32/win32k/include/gdiobj.h @@ -131,6 +131,3 @@ GDIOBJ_IncrementShareCount(POBJ Object) #endif INT FASTCALL GreGetObjectOwner(HGDIOBJ, GDIOBJTYPE); - -#define GDIOBJ_GetKernelObj(Handle) \ - ((PGDI_TABLE_ENTRY)&GdiHandleTable->Entries[GDI_HANDLE_GET_INDEX(Handle)])->KernelData diff --git a/subsystems/win32/win32k/include/msgqueue.h b/subsystems/win32/win32k/include/msgqueue.h index c751f3a911d..5752481c9d4 100644 --- a/subsystems/win32/win32k/include/msgqueue.h +++ b/subsystems/win32/win32k/include/msgqueue.h @@ -248,16 +248,6 @@ VOID APIENTRY MsqRemoveWindowMessagesFromQueue(PVOID pWindow); /* F*(&$ headers, (message) == WM_NCRBUTTON##code || \ (message) == WM_NCXBUTTON##code ) -#define WM_NCMOUSEFIRST WM_NCMOUSEMOVE -#define WM_NCMOUSELAST (WM_NCMOUSEFIRST+(WM_MOUSELAST-WM_MOUSEFIRST)) - -#define IS_MOUSE_MESSAGE(message) \ - ((message >= WM_NCMOUSEFIRST && message <= WM_NCMOUSELAST) || \ - (message >= WM_MOUSEFIRST && message <= WM_MOUSELAST)) - -#define IS_KBD_MESSAGE(message) \ - (message == WM_KEYDOWN || message == WM_KEYUP) - HANDLE FASTCALL IntMsqSetWakeMask(DWORD WakeMask); diff --git a/subsystems/win32/win32k/include/pdevobj.h b/subsystems/win32/win32k/include/pdevobj.h index ca0c3fa0821..4124509fbe5 100644 --- a/subsystems/win32/win32k/include/pdevobj.h +++ b/subsystems/win32/win32k/include/pdevobj.h @@ -88,8 +88,8 @@ typedef struct _PDEVOBJ // PVOID TypeOneInfo; PVOID pvGammaRamp; /* Gamma ramp pointer. */ // PVOID RemoteTypeOne; - ULONG ulHorzRes; - ULONG ulVertRes; +// ULONG ulHorzRes; +// ULONG ulVertRes; // PFN_DrvSetPointerShape pfnDrvSetPointerShape; // PFN_DrvMovePointer pfnDrvMovePointer; PFN_DrvMovePointer pfnMovePointer; @@ -107,7 +107,7 @@ typedef struct _PDEVOBJ // HANDLE hSpooler; /* Handle to spooler, if spooler dev driver. */ // PVOID pDesktopId; PGRAPHICS_DEVICE pGraphicsDevice; - POINTL ptlOrigion; +// POINTL ptlOrigion; PVOID pdmwDev; /* Ptr->DEVMODEW.dmSize + dmDriverExtra == alloc size. */ // DWORD Unknown3; FLONG DxDd_Flags; /* DxDD active status flags. */ @@ -141,6 +141,4 @@ typedef struct _PDEVEDD EDD_DIRECTDRAW_GLOBAL EDDgpl; } PDEVEDD, *PPDEVEDD; -PSIZEL FASTCALL PDEV_sizl(PPDEVOBJ, PSIZEL); - extern ULONG gdwDirectDrawContext; diff --git a/subsystems/win32/win32k/include/surface.h b/subsystems/win32/win32k/include/surface.h index 3fe90540467..57a5ec24f85 100644 --- a/subsystems/win32/win32k/include/surface.h +++ b/subsystems/win32/win32k/include/surface.h @@ -3,8 +3,6 @@ #include "win32.h" #include "gdiobj.h" -#define PDEV_SURFACE 0x80000000 - /* GDI surface object */ typedef struct _SURFACE { diff --git a/subsystems/win32/win32k/include/win32kp.h b/subsystems/win32/win32k/include/win32k.h similarity index 100% rename from subsystems/win32/win32k/include/win32kp.h rename to subsystems/win32/win32k/include/win32k.h diff --git a/subsystems/win32/win32k/ldr/loader.c b/subsystems/win32/win32k/ldr/loader.c index 50a87560e6a..9803c8d4009 100644 --- a/subsystems/win32/win32k/ldr/loader.c +++ b/subsystems/win32/win32k/ldr/loader.c @@ -20,7 +20,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/main/dllmain.c b/subsystems/win32/win32k/main/dllmain.c index 040d3cc76ed..8d106e725a3 100644 --- a/subsystems/win32/win32k/main/dllmain.c +++ b/subsystems/win32/win32k/main/dllmain.c @@ -20,7 +20,7 @@ * Entry Point for win32k.sys */ -#include +#include #include #define NDEBUG diff --git a/subsystems/win32/win32k/misc/copy.c b/subsystems/win32/win32k/misc/copy.c index a40a5be6ffb..5668ade27b5 100644 --- a/subsystems/win32/win32k/misc/copy.c +++ b/subsystems/win32/win32k/misc/copy.c @@ -1,4 +1,4 @@ -#include "win32k.h" +#include "w32k.h" NTSTATUS _MmCopyFromCaller( PVOID Target, PVOID Source, UINT Bytes ) { NTSTATUS Status = STATUS_SUCCESS; diff --git a/subsystems/win32/win32k/misc/driver.c b/subsystems/win32/win32k/misc/driver.c index 1219f94effa..e713f323e7b 100644 --- a/subsystems/win32/win32k/misc/driver.c +++ b/subsystems/win32/win32k/misc/driver.c @@ -23,7 +23,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/misc/err.c b/subsystems/win32/win32k/misc/err.c index b7fcb2cde31..c1c66eaac94 100644 --- a/subsystems/win32/win32k/misc/err.c +++ b/subsystems/win32/win32k/misc/err.c @@ -27,7 +27,7 @@ * 06-06-2001 CSH Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/misc/file.c b/subsystems/win32/win32k/misc/file.c index 1e2281aa517..263ed12e0b7 100644 --- a/subsystems/win32/win32k/misc/file.c +++ b/subsystems/win32/win32k/misc/file.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/misc/math.c b/subsystems/win32/win32k/misc/math.c index 11ffc1ed847..6b4fc0c9013 100644 --- a/subsystems/win32/win32k/misc/math.c +++ b/subsystems/win32/win32k/misc/math.c @@ -19,7 +19,7 @@ Boston, MA 02110-1301, USA. */ -#include +#include /* * FIXME! Is there a better algorithm. like FT_MulDiv diff --git a/subsystems/win32/win32k/misc/registry.c b/subsystems/win32/win32k/misc/registry.c index fcaefabb62f..f03de06e5f6 100644 --- a/subsystems/win32/win32k/misc/registry.c +++ b/subsystems/win32/win32k/misc/registry.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/misc/rtlstr.c b/subsystems/win32/win32k/misc/rtlstr.c index 06f8d3eff80..7e1da4b7672 100644 --- a/subsystems/win32/win32k/misc/rtlstr.c +++ b/subsystems/win32/win32k/misc/rtlstr.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include /* FUNCTIONS *****************************************************************/ VOID diff --git a/subsystems/win32/win32k/misc/usrheap.c b/subsystems/win32/win32k/misc/usrheap.c index c371121c657..e8b1908fcfc 100644 --- a/subsystems/win32/win32k/misc/usrheap.c +++ b/subsystems/win32/win32k/misc/usrheap.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntddraw/d3d.c b/subsystems/win32/win32k/ntddraw/d3d.c index f30f08cdae9..8371ff1a882 100644 --- a/subsystems/win32/win32k/ntddraw/d3d.c +++ b/subsystems/win32/win32k/ntddraw/d3d.c @@ -13,7 +13,7 @@ * NtGdiDdUnlock and NtGdiDdUnlockD3D ultimately call the same function in dxg.sys */ -#include +#include #include diff --git a/subsystems/win32/win32k/ntddraw/dd.c b/subsystems/win32/win32k/ntddraw/dd.c index a1207ed33a2..9cccbce1ef0 100644 --- a/subsystems/win32/win32k/ntddraw/dd.c +++ b/subsystems/win32/win32k/ntddraw/dd.c @@ -8,7 +8,7 @@ * 19/1-2006 Magnus Olsen */ -#include +#include #include /************************************************************************/ diff --git a/subsystems/win32/win32k/ntddraw/ddraw.c b/subsystems/win32/win32k/ntddraw/ddraw.c index 19b6931b01b..3abbd18eed4 100644 --- a/subsystems/win32/win32k/ntddraw/ddraw.c +++ b/subsystems/win32/win32k/ntddraw/ddraw.c @@ -8,7 +8,7 @@ * 19/1-2006 Magnus Olsen */ -#include +#include #include PGD_DXDDSTARTUPDXGRAPHICS gpfnStartupDxGraphics = NULL; diff --git a/subsystems/win32/win32k/ntddraw/ddsurf.c b/subsystems/win32/win32k/ntddraw/ddsurf.c index ae46f887e11..388be271343 100644 --- a/subsystems/win32/win32k/ntddraw/ddsurf.c +++ b/subsystems/win32/win32k/ntddraw/ddsurf.c @@ -8,7 +8,7 @@ * 19/7-2006 Magnus Olsen */ -#include +#include #include /************************************************************************/ diff --git a/subsystems/win32/win32k/ntddraw/dvp.c b/subsystems/win32/win32k/ntddraw/dvp.c index a03be0fa30c..de5fe6ad926 100644 --- a/subsystems/win32/win32k/ntddraw/dvp.c +++ b/subsystems/win32/win32k/ntddraw/dvp.c @@ -9,7 +9,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/subsystems/win32/win32k/ntddraw/dxeng.c b/subsystems/win32/win32k/ntddraw/dxeng.c index 58413a584ff..586c496bdff 100644 --- a/subsystems/win32/win32k/ntddraw/dxeng.c +++ b/subsystems/win32/win32k/ntddraw/dxeng.c @@ -6,7 +6,7 @@ * PROGRAMMERS: Magnus Olsen (magnus@greatlord.com) */ -#include +#include #include HSEMAPHORE ghsemShareDevLock = NULL; diff --git a/subsystems/win32/win32k/ntddraw/eng.c b/subsystems/win32/win32k/ntddraw/eng.c index f55525a6b51..675b5965710 100644 --- a/subsystems/win32/win32k/ntddraw/eng.c +++ b/subsystems/win32/win32k/ntddraw/eng.c @@ -11,7 +11,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/subsystems/win32/win32k/ntddraw/mocomp.c b/subsystems/win32/win32k/ntddraw/mocomp.c index bc80584faa9..08c3f9488c4 100644 --- a/subsystems/win32/win32k/ntddraw/mocomp.c +++ b/subsystems/win32/win32k/ntddraw/mocomp.c @@ -9,7 +9,7 @@ */ -#include +#include #include /************************************************************************/ diff --git a/subsystems/win32/win32k/ntuser/accelerator.c b/subsystems/win32/win32k/ntuser/accelerator.c index b59f1d1b7de..544ecedcfc7 100644 --- a/subsystems/win32/win32k/ntuser/accelerator.c +++ b/subsystems/win32/win32k/ntuser/accelerator.c @@ -49,7 +49,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/callback.c b/subsystems/win32/win32k/ntuser/callback.c index eb4db061d10..9a8de743c54 100644 --- a/subsystems/win32/win32k/ntuser/callback.c +++ b/subsystems/win32/win32k/ntuser/callback.c @@ -14,7 +14,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/callproc.c b/subsystems/win32/win32k/ntuser/callproc.c index dc8496dd431..866bac1afbf 100644 --- a/subsystems/win32/win32k/ntuser/callproc.c +++ b/subsystems/win32/win32k/ntuser/callproc.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/caret.c b/subsystems/win32/win32k/ntuser/caret.c index c75dc05c074..ee5e33ba565 100644 --- a/subsystems/win32/win32k/ntuser/caret.c +++ b/subsystems/win32/win32k/ntuser/caret.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/class.c b/subsystems/win32/win32k/ntuser/class.c index b24b26f4199..f1755fecd54 100644 --- a/subsystems/win32/win32k/ntuser/class.c +++ b/subsystems/win32/win32k/ntuser/class.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/clipboard.c b/subsystems/win32/win32k/ntuser/clipboard.c index a44bbab169a..55032c44e61 100644 --- a/subsystems/win32/win32k/ntuser/clipboard.c +++ b/subsystems/win32/win32k/ntuser/clipboard.c @@ -7,7 +7,7 @@ * Pablo Borobia */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/csr.c b/subsystems/win32/win32k/ntuser/csr.c index 9487af53689..a1e425e629b 100644 --- a/subsystems/win32/win32k/ntuser/csr.c +++ b/subsystems/win32/win32k/ntuser/csr.c @@ -7,7 +7,7 @@ * PROGRAMER: Ge van Geldorp (ge@gse.nl) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/cursoricon.c b/subsystems/win32/win32k/ntuser/cursoricon.c index 3fe0211ea53..6c9532caae9 100644 --- a/subsystems/win32/win32k/ntuser/cursoricon.c +++ b/subsystems/win32/win32k/ntuser/cursoricon.c @@ -36,7 +36,7 @@ * CURICON_PROCESS structs starting at CurIcon->ProcessList. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/defwnd.c b/subsystems/win32/win32k/ntuser/defwnd.c index f5e2bd1fc1d..2a59f10f94b 100644 --- a/subsystems/win32/win32k/ntuser/defwnd.c +++ b/subsystems/win32/win32k/ntuser/defwnd.c @@ -7,7 +7,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/desktop.c b/subsystems/win32/win32k/ntuser/desktop.c index c5d76b215a5..0f635d0cb7c 100644 --- a/subsystems/win32/win32k/ntuser/desktop.c +++ b/subsystems/win32/win32k/ntuser/desktop.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/display.c b/subsystems/win32/win32k/ntuser/display.c index 561171dedeb..c652e30e45a 100644 --- a/subsystems/win32/win32k/ntuser/display.c +++ b/subsystems/win32/win32k/ntuser/display.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/event.c b/subsystems/win32/win32k/ntuser/event.c index d170983d088..2dc8eae7376 100644 --- a/subsystems/win32/win32k/ntuser/event.c +++ b/subsystems/win32/win32k/ntuser/event.c @@ -6,7 +6,7 @@ * PROGRAMER: James Tabor (james.tabor@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/focus.c b/subsystems/win32/win32k/ntuser/focus.c index 90702b41c00..0f39b96674d 100644 --- a/subsystems/win32/win32k/ntuser/focus.c +++ b/subsystems/win32/win32k/ntuser/focus.c @@ -18,7 +18,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/guicheck.c b/subsystems/win32/win32k/ntuser/guicheck.c index e3766d8c4b2..f0ee364f9d8 100644 --- a/subsystems/win32/win32k/ntuser/guicheck.c +++ b/subsystems/win32/win32k/ntuser/guicheck.c @@ -33,7 +33,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/hook.c b/subsystems/win32/win32k/ntuser/hook.c index a71ea9bebf2..bca944e4ce7 100644 --- a/subsystems/win32/win32k/ntuser/hook.c +++ b/subsystems/win32/win32k/ntuser/hook.c @@ -10,7 +10,7 @@ * Copyright (C) 2002 Alexandre Julliard */ -#include +#include #define NDEBUG #include @@ -1050,12 +1050,6 @@ NtUserCallNextHookEx(int Code, if (!HookObj) RETURN( 0); - /* Check that the first hook in the chain is not this hook */ - NextObj = IntGetFirstHook(IntGetTable(HookObj), HookObj->HookId); - - /* Its the same so it has already been called */ - if (HookObj == NextObj) RETURN(0); - UserReferenceObject(HookObj); Ansi = HookObj->Ansi; diff --git a/subsystems/win32/win32k/ntuser/hotkey.c b/subsystems/win32/win32k/ntuser/hotkey.c index 4ec1f1b5658..c2585f3db7e 100644 --- a/subsystems/win32/win32k/ntuser/hotkey.c +++ b/subsystems/win32/win32k/ntuser/hotkey.c @@ -40,7 +40,7 @@ windows/threads on destops not belonging to WinSta0 to set hotkeys (recieve noti /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/input.c b/subsystems/win32/win32k/ntuser/input.c index e86d14a33bc..f0790e19a7b 100644 --- a/subsystems/win32/win32k/ntuser/input.c +++ b/subsystems/win32/win32k/ntuser/input.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #include #define NDEBUG @@ -204,16 +204,6 @@ MouseThreadMain(PVOID StartContext) NTSTATUS Status; MOUSE_ATTRIBUTES MouseAttr; - Status = Win32kInitWin32Thread(PsGetCurrentThread()); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Win32K: Failed making keyboard thread a win32 thread.\n"); - return; //(Status); - } - - KeSetPriorityThread(&PsGetCurrentThread()->Tcb, - LOW_REALTIME_PRIORITY + 3); - InitializeObjectAttributes(&MouseObjectAttributes, &MouseDeviceName, 0, @@ -723,7 +713,6 @@ KeyboardThreadMain(PVOID StartContext) for (;NumKeys;memcpy(&KeyInput, &NextKeyInput, sizeof(KeyInput)), NumKeys--) { - PKBL keyboardLayout = NULL; lParam = 0; IntKeyboardUpdateLeds(KeyboardDeviceHandle, @@ -794,30 +783,29 @@ KeyboardThreadMain(PVOID StartContext) } /* Find the target thread whose locale is in effect */ - FocusQueue = IntGetFocusMessageQueue(); - - if (FocusQueue) - { - msg.hwnd = FocusQueue->FocusWindow; + FocusQueue = IntGetFocusMessageQueue(); - FocusThread = FocusQueue->Thread; - if (FocusThread && FocusThread->Tcb.Win32Thread) - { - keyboardLayout = ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout; - } - } - if (!keyboardLayout) - { - keyboardLayout = W32kGetDefaultKeyLayout(); - } + /* This might cause us to lose hot keys, which are important + * (ctrl-alt-del secure attention sequence). Not sure if it + * can happen though. + */ + if (!FocusQueue) + continue; msg.lParam = lParam; + msg.hwnd = FocusQueue->FocusWindow; + + FocusThread = FocusQueue->Thread; + + if (!(FocusThread && FocusThread->Tcb.Win32Thread && + ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout)) + continue; /* This function uses lParam to fill wParam according to the * keyboard layout in use. */ W32kKeyProcessMessage(&msg, - keyboardLayout->KBTables, + ((PTHREADINFO)FocusThread->Tcb.Win32Thread)->KeyboardLayout->KBTables, KeyInput.Flags & KEY_E0 ? 0xE0 : (KeyInput.Flags & KEY_E1 ? 0xE1 : 0)); @@ -839,11 +827,6 @@ KeyboardThreadMain(PVOID StartContext) continue; /* Eat key up motion too */ } - if (!FocusQueue) - { - /* There is no focused window to receive a keyboard message */ - continue; - } /* * Post a keyboard message. */ @@ -1111,7 +1094,7 @@ IntMouseInput(MOUSEINPUT *mi) /* * Insert the messages into the system queue */ - Msg.wParam = 0; + Msg.wParam = CurInfo->ButtonsDown; Msg.lParam = MAKELPARAM(MousePos.x, MousePos.y); Msg.pt = MousePos; @@ -1134,7 +1117,6 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_LBUTTON] |= 0xc0; Msg.message = SwapBtnMsg[0][SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[SwapButtons]; - Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_LEFTUP) @@ -1142,7 +1124,6 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_LBUTTON] &= ~0x80; Msg.message = SwapBtnMsg[1][SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[SwapButtons]; - Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } if(mi->dwFlags & MOUSEEVENTF_MIDDLEDOWN) @@ -1150,7 +1131,6 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_MBUTTON] |= 0xc0; Msg.message = WM_MBUTTONDOWN; CurInfo->ButtonsDown |= MK_MBUTTON; - Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_MIDDLEUP) @@ -1158,7 +1138,6 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_MBUTTON] &= ~0x80; Msg.message = WM_MBUTTONUP; CurInfo->ButtonsDown &= ~MK_MBUTTON; - Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } if(mi->dwFlags & MOUSEEVENTF_RIGHTDOWN) @@ -1166,7 +1145,6 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_RBUTTON] |= 0xc0; Msg.message = SwapBtnMsg[0][!SwapButtons]; CurInfo->ButtonsDown |= SwapBtn[!SwapButtons]; - Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } else if(mi->dwFlags & MOUSEEVENTF_RIGHTUP) @@ -1174,7 +1152,6 @@ IntMouseInput(MOUSEINPUT *mi) gQueueKeyStateTable[VK_RBUTTON] &= ~0x80; Msg.message = SwapBtnMsg[1][!SwapButtons]; CurInfo->ButtonsDown &= ~SwapBtn[!SwapButtons]; - Msg.wParam |= CurInfo->ButtonsDown; MsqInsertSystemMessage(&Msg); } @@ -1191,15 +1168,15 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->mouseData & XBUTTON1) { gQueueKeyStateTable[VK_XBUTTON1] |= 0xc0; - CurInfo->ButtonsDown |= MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); + CurInfo->ButtonsDown |= XBUTTON1; MsqInsertSystemMessage(&Msg); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] |= 0xc0; - CurInfo->ButtonsDown |= MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); + CurInfo->ButtonsDown |= XBUTTON2; MsqInsertSystemMessage(&Msg); } } @@ -1209,15 +1186,15 @@ IntMouseInput(MOUSEINPUT *mi) if(mi->mouseData & XBUTTON1) { gQueueKeyStateTable[VK_XBUTTON1] &= ~0x80; - CurInfo->ButtonsDown &= ~MK_XBUTTON1; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON1); + CurInfo->ButtonsDown &= ~XBUTTON1; MsqInsertSystemMessage(&Msg); } if(mi->mouseData & XBUTTON2) { gQueueKeyStateTable[VK_XBUTTON2] &= ~0x80; - CurInfo->ButtonsDown &= ~MK_XBUTTON2; Msg.wParam = MAKEWPARAM(CurInfo->ButtonsDown, XBUTTON2); + CurInfo->ButtonsDown &= ~XBUTTON2; MsqInsertSystemMessage(&Msg); } } diff --git a/subsystems/win32/win32k/ntuser/kbdlayout.c b/subsystems/win32/win32k/ntuser/kbdlayout.c index 8ee11dc3983..ec07d34a82a 100644 --- a/subsystems/win32/win32k/ntuser/kbdlayout.c +++ b/subsystems/win32/win32k/ntuser/kbdlayout.c @@ -12,7 +12,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/keyboard.c b/subsystems/win32/win32k/ntuser/keyboard.c index 242147c6659..0c935a478e0 100644 --- a/subsystems/win32/win32k/ntuser/keyboard.c +++ b/subsystems/win32/win32k/ntuser/keyboard.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -88,12 +88,12 @@ static VOID APIENTRY SetKeyState(DWORD key, DWORD vk, DWORD ext, BOOL down) gQueueKeyStateTable[vk] ^= KS_LOCK_BIT; } - if (vk == VK_SHIFT) - vk = ext ? VK_RSHIFT : VK_LSHIFT; - if (vk == VK_CONTROL) - vk = ext ? VK_RCONTROL : VK_LCONTROL; - if (vk == VK_MENU) - vk = ext ? VK_RMENU : VK_LMENU; + if (ext && vk == VK_LSHIFT) + vk = VK_RSHIFT; + if (ext && vk == VK_LCONTROL) + vk = VK_RCONTROL; + if (ext && vk == VK_LMENU) + vk = VK_RMENU; if (down) gQueueKeyStateTable[vk] |= KS_DOWN_BIT; diff --git a/subsystems/win32/win32k/ntuser/menu.c b/subsystems/win32/win32k/ntuser/menu.c index 3b1cd6a740b..9bdbe026cf8 100644 --- a/subsystems/win32/win32k/ntuser/menu.c +++ b/subsystems/win32/win32k/ntuser/menu.c @@ -9,7 +9,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/message.c b/subsystems/win32/win32k/ntuser/message.c index 3bd92011346..1b244b0e038 100644 --- a/subsystems/win32/win32k/ntuser/message.c +++ b/subsystems/win32/win32k/ntuser/message.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -645,74 +645,6 @@ co_IntTranslateMouseMessage( return FALSE; } -BOOL ProcessMouseMessage(MSG* Msg, USHORT HitTest, UINT RemoveMsg) -{ - MOUSEHOOKSTRUCT MHook; - EVENTMSG Event; - - Event.message = Msg->message; - Event.time = Msg->time; - Event.hwnd = Msg->hwnd; - Event.paramL = Msg->pt.x; - Event.paramH = Msg->pt.y; - co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); - - - MHook.pt = Msg->pt; - MHook.hwnd = Msg->hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - if (co_HOOK_CallHooks( WH_MOUSE, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, - Msg->message, - (LPARAM)&MHook )) - { - if (ISITHOOKED(WH_CBT)) - { - MHook.pt = Msg->pt; - MHook.hwnd = Msg->hwnd; - MHook.wHitTestCode = HitTest; - MHook.dwExtraInfo = 0; - co_HOOK_CallHooks( WH_CBT, - HCBT_CLICKSKIPPED, - Msg->message, - (LPARAM)&MHook); - } - return FALSE; - } - - return TRUE; -} - -BOOL ProcessKeyboardMessage(MSG* Msg, UINT RemoveMsg) -{ - EVENTMSG Event; - - Event.message = Msg->message; - Event.hwnd = Msg->hwnd; - Event.time = Msg->time; - Event.paramL = (Msg->wParam & 0xFF) | (HIWORD(Msg->lParam) << 8); - Event.paramH = Msg->lParam & 0x7FFF; - if (HIWORD(Msg->lParam) & 0x0100) Event.paramH |= 0x8000; - co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); - - if (co_HOOK_CallHooks( WH_KEYBOARD, - RemoveMsg ? HC_ACTION : HC_NOREMOVE, - LOWORD(Msg->wParam), - Msg->lParam)) - { - if (ISITHOOKED(WH_CBT)) - { - /* skip this message */ - co_HOOK_CallHooks( WH_CBT, - HCBT_KEYSKIPPED, - LOWORD(Msg->wParam), - Msg->lParam ); - } - return FALSE; - } - return TRUE; -} /* * Internal version of PeekMessage() doing all the work */ @@ -730,6 +662,7 @@ co_IntPeekMessage( PUSER_MESSAGE Msg, BOOL Present, RemoveMessages; USER_REFERENCE_ENTRY Ref; USHORT HitTest; + MOUSEHOOKSTRUCT MHook; /* The queues and order in which they are checked are documented in the MSDN article on GetMessage() */ @@ -934,20 +867,52 @@ MessageFound: } MsgExit: - if ( ISITHOOKED(WH_MOUSE) && IS_MOUSE_MESSAGE(Msg->Msg.message)) - { - if(!ProcessMouseMessage(&Msg->Msg, HitTest, RemoveMsg)) - { - return FALSE; - } - } + if ( ISITHOOKED(WH_MOUSE) && + Msg->Msg.message >= WM_MOUSEFIRST && + Msg->Msg.message <= WM_MOUSELAST ) + { + MHook.pt = Msg->Msg.pt; + MHook.hwnd = Msg->Msg.hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + if (co_HOOK_CallHooks( WH_MOUSE, + RemoveMsg ? HC_ACTION : HC_NOREMOVE, + Msg->Msg.message, + (LPARAM)&MHook )) + { + if (ISITHOOKED(WH_CBT)) + { + MHook.pt = Msg->Msg.pt; + MHook.hwnd = Msg->Msg.hwnd; + MHook.wHitTestCode = HitTest; + MHook.dwExtraInfo = 0; + co_HOOK_CallHooks( WH_CBT, + HCBT_CLICKSKIPPED, + Msg->Msg.message, + (LPARAM)&MHook); + } + return FALSE; + } + } - if ( ISITHOOKED(WH_KEYBOARD) && IS_KBD_MESSAGE(Msg->Msg.message)) + if ( ISITHOOKED(WH_KEYBOARD) && + (Msg->Msg.message == WM_KEYDOWN || Msg->Msg.message == WM_KEYUP) ) { - if(!ProcessKeyboardMessage(&Msg->Msg, RemoveMsg)) - { - return FALSE; - } + if (co_HOOK_CallHooks( WH_KEYBOARD, + RemoveMsg ? HC_ACTION : HC_NOREMOVE, + LOWORD(Msg->Msg.wParam), + Msg->Msg.lParam)) + { + if (ISITHOOKED(WH_CBT)) + { + /* skip this message */ + co_HOOK_CallHooks( WH_CBT, + HCBT_KEYSKIPPED, + LOWORD(Msg->Msg.wParam), + Msg->Msg.lParam ); + } + return FALSE; + } } // The WH_GETMESSAGE hook enables an application to monitor messages about to // be returned by the GetMessage or PeekMessage function. diff --git a/subsystems/win32/win32k/ntuser/metric.c b/subsystems/win32/win32k/ntuser/metric.c index be2b1a10367..4519ff811ef 100644 --- a/subsystems/win32/win32k/ntuser/metric.c +++ b/subsystems/win32/win32k/ntuser/metric.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/misc.c b/subsystems/win32/win32k/ntuser/misc.c index 48ef50b7ae6..27faa8fc9e3 100644 --- a/subsystems/win32/win32k/ntuser/misc.c +++ b/subsystems/win32/win32k/ntuser/misc.c @@ -8,7 +8,7 @@ * 2003/05/22 Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/monitor.c b/subsystems/win32/win32k/ntuser/monitor.c index 541b3bfeb41..072bad97df4 100644 --- a/subsystems/win32/win32k/ntuser/monitor.c +++ b/subsystems/win32/win32k/ntuser/monitor.c @@ -27,7 +27,7 @@ /* INCLUDES ******************************************************************/ -#include +#include /* FIXME: find include file for these */ #define MONITORINFOF_PRIMARY 1 diff --git a/subsystems/win32/win32k/ntuser/msgqueue.c b/subsystems/win32/win32k/ntuser/msgqueue.c index 16323aeb5c4..2b1fedae85a 100644 --- a/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/subsystems/win32/win32k/ntuser/msgqueue.c @@ -28,7 +28,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -174,41 +174,8 @@ MsqInsertSystemMessage(MSG* Msg) LARGE_INTEGER LargeTickCount; KIRQL OldIrql; ULONG Prev; - MSLLHOOKSTRUCT MouseHookData; + EVENTMSG Event; - KeQueryTickCount(&LargeTickCount); - Msg->time = MsqCalculateMessageTime(&LargeTickCount); - - MouseHookData.pt.x = LOWORD(Msg->lParam); - MouseHookData.pt.y = HIWORD(Msg->lParam); - switch(Msg->message) - { - case WM_MOUSEWHEEL: - MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg->wParam)); - break; - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_XBUTTONDBLCLK: - case WM_NCXBUTTONDOWN: - case WM_NCXBUTTONUP: - case WM_NCXBUTTONDBLCLK: - MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg->wParam)); - break; - default: - MouseHookData.mouseData = 0; - break; - } - MouseHookData.flags = 0; - MouseHookData.time = Msg->time; - MouseHookData.dwExtraInfo = 0; - if( co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, Msg->message, (LPARAM) &MouseHookData)) - return; - - /* - * If we got WM_MOUSEMOVE and there are already messages in the - * system message queue, check if the last message is mouse move - * and if it is then just overwrite it. - */ IntLockSystemMessageQueue(OldIrql); /* @@ -222,6 +189,22 @@ MsqInsertSystemMessage(MSG* Msg) return; } + KeQueryTickCount(&LargeTickCount); + Msg->time = MsqCalculateMessageTime(&LargeTickCount); + + Event.message = Msg->message; + Event.time = Msg->time; + Event.hwnd = Msg->hwnd; + Event.paramL = Msg->pt.x; + Event.paramH = Msg->pt.y; + co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); + + /* + * If we got WM_MOUSEMOVE and there are already messages in the + * system message queue, check if the last message is mouse move + * and if it is then just overwrite it. + */ + if (Msg->message == WM_MOUSEMOVE && SystemMessageQueueCount) { if (SystemMessageQueueTail == 0) @@ -640,6 +623,7 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo { PUSER_MESSAGE UserMsg; MSG Msg; + BOOL ProcessMessage; ASSERT(SystemMessageQueueHead < SYSTEM_MESSAGE_QUEUE_SIZE); Msg = SystemMessageQueue[SystemMessageQueueHead]; @@ -647,14 +631,48 @@ co_MsqPeekHardwareMessage(PUSER_MESSAGE_QUEUE MessageQueue, PWINDOW_OBJECT Windo (SystemMessageQueueHead + 1) % SYSTEM_MESSAGE_QUEUE_SIZE; SystemMessageQueueCount--; IntUnLockSystemMessageQueue(OldIrql); + if (WM_MOUSEFIRST <= Msg.message && Msg.message <= WM_MOUSELAST) + { + MSLLHOOKSTRUCT MouseHookData; - UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); - /* What to do if out of memory? For now we just panic a bit in debug */ - ASSERT(UserMsg); - UserMsg->FreeLParam = FALSE; - UserMsg->Msg = Msg; - InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); - + MouseHookData.pt.x = LOWORD(Msg.lParam); + MouseHookData.pt.y = HIWORD(Msg.lParam); + switch(Msg.message) + { + case WM_MOUSEWHEEL: + MouseHookData.mouseData = MAKELONG(0, GET_WHEEL_DELTA_WPARAM(Msg.wParam)); + break; + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_XBUTTONDBLCLK: + case WM_NCXBUTTONDOWN: + case WM_NCXBUTTONUP: + case WM_NCXBUTTONDBLCLK: + MouseHookData.mouseData = MAKELONG(0, HIWORD(Msg.wParam)); + break; + default: + MouseHookData.mouseData = 0; + break; + } + MouseHookData.flags = 0; + MouseHookData.time = Msg.time; + MouseHookData.dwExtraInfo = 0; + ProcessMessage = (0 == co_HOOK_CallHooks(WH_MOUSE_LL, HC_ACTION, + Msg.message, (LPARAM) &MouseHookData)); + } + else + { + ProcessMessage = TRUE; + } + if (ProcessMessage) + { + UserMsg = ExAllocateFromPagedLookasideList(&MessageLookasideList); + /* What to do if out of memory? For now we just panic a bit in debug */ + ASSERT(UserMsg); + UserMsg->FreeLParam = FALSE; + UserMsg->Msg = Msg; + InsertTailList(&HardwareMessageQueueHead, &UserMsg->ListEntry); + } IntLockSystemMessageQueue(OldIrql); } HardwareMessageQueueStamp++; @@ -749,6 +767,7 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) MSG Msg; LARGE_INTEGER LargeTickCount; KBDLLHOOKSTRUCT KbdHookData; + EVENTMSG Event; BOOLEAN Entered = FALSE; DPRINT("MsqPostKeyboardMessage(uMsg 0x%x, wParam 0x%x, lParam 0x%x)\n", @@ -776,6 +795,14 @@ co_MsqPostKeyboardMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) KeQueryTickCount(&LargeTickCount); Msg.time = MsqCalculateMessageTime(&LargeTickCount); + Event.message = Msg.message; + Event.hwnd = Msg.hwnd; + Event.time = Msg.time; + Event.paramL = (Msg.wParam & 0xFF) | (HIWORD(Msg.lParam) << 8); + Event.paramH = Msg.lParam & 0x7FFF; + if (HIWORD(Msg.lParam) & 0x0100) Event.paramH |= 0x8000; + co_HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, (LPARAM)&Event); + /* We can't get the Msg.pt point here since we don't know thread (and thus the window station) the message will end up in yet. */ diff --git a/subsystems/win32/win32k/ntuser/ntstubs.c b/subsystems/win32/win32k/ntuser/ntstubs.c index 2430a4df7ac..f9104fe5faa 100644 --- a/subsystems/win32/win32k/ntuser/ntstubs.c +++ b/subsystems/win32/win32k/ntuser/ntstubs.c @@ -7,7 +7,7 @@ * REVISION HISTORY: * 04-06-2001 CSH Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/ntuser.c b/subsystems/win32/win32k/ntuser/ntuser.c index 569acfdc54c..e51db8eb9a4 100644 --- a/subsystems/win32/win32k/ntuser/ntuser.c +++ b/subsystems/win32/win32k/ntuser/ntuser.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/object.c b/subsystems/win32/win32k/ntuser/object.c index 2ccc4356f75..cd5f59101ed 100644 --- a/subsystems/win32/win32k/ntuser/object.c +++ b/subsystems/win32/win32k/ntuser/object.c @@ -22,7 +22,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/painting.c b/subsystems/win32/win32k/ntuser/painting.c index ce612a5076a..66977db106f 100644 --- a/subsystems/win32/win32k/ntuser/painting.c +++ b/subsystems/win32/win32k/ntuser/painting.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/prop.c b/subsystems/win32/win32k/ntuser/prop.c index c596c0e02a5..cf41600c224 100644 --- a/subsystems/win32/win32k/ntuser/prop.c +++ b/subsystems/win32/win32k/ntuser/prop.c @@ -27,7 +27,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/scrollbar.c b/subsystems/win32/win32k/ntuser/scrollbar.c index 8efd8721d76..065c7ccaeb0 100644 --- a/subsystems/win32/win32k/ntuser/scrollbar.c +++ b/subsystems/win32/win32k/ntuser/scrollbar.c @@ -10,7 +10,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/session.c b/subsystems/win32/win32k/ntuser/session.c index 88e453164cb..1a8cddc0e49 100644 --- a/subsystems/win32/win32k/ntuser/session.c +++ b/subsystems/win32/win32k/ntuser/session.c @@ -24,7 +24,7 @@ * PROGRAMER: Gunnar */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/simplecall.c b/subsystems/win32/win32k/ntuser/simplecall.c index 77d8fb9d237..f0dcc3a755b 100644 --- a/subsystems/win32/win32k/ntuser/simplecall.c +++ b/subsystems/win32/win32k/ntuser/simplecall.c @@ -8,7 +8,7 @@ * 2008/03/20 Split from misc.c */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/sysparams.c b/subsystems/win32/win32k/ntuser/sysparams.c index c39d06a4894..4768cb0d9a5 100644 --- a/subsystems/win32/win32k/ntuser/sysparams.c +++ b/subsystems/win32/win32k/ntuser/sysparams.c @@ -11,7 +11,7 @@ // - does setting invalid fonts work? // - save appropriate text metrics -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/timer.c b/subsystems/win32/win32k/ntuser/timer.c index 6ad4ddeb8ca..c706805a9c8 100644 --- a/subsystems/win32/win32k/ntuser/timer.c +++ b/subsystems/win32/win32k/ntuser/timer.c @@ -11,7 +11,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -279,7 +279,7 @@ PostTimerMessages(PWINDOW_OBJECT Window) if (!pTmr) return FALSE; - if (Window && ((ULONG_PTR)Window != 1)) + if (Window && (int)Window != 1) { if (!Window->Wnd) return FALSE; } @@ -294,7 +294,6 @@ PostTimerMessages(PWINDOW_OBJECT Window) (pTmr->pti == pti) && (pTmr->pWnd == Window)) { - ASSERT((ULONG_PTR)Window != 1); Msg.hwnd = Window->hSelf; Msg.message = (pTmr->flags & TMRF_SYSTEM) ? WM_SYSTIMER : WM_TIMER; Msg.wParam = (WPARAM) pTmr->nID; @@ -527,8 +526,6 @@ IntKillTimer(HWND Wnd, UINT_PTR IDEvent, BOOL SystemTimer) ASSERT(RtlAreBitsSet(&WindowLessTimersBitMap, IDEvent - 1, 1)); RtlClearBits(&WindowLessTimersBitMap, IDEvent - 1, 1); - HintIndex = IDEvent - 1; - IntUnlockWindowlessTimerBitmap(); } diff --git a/subsystems/win32/win32k/ntuser/useratom.c b/subsystems/win32/win32k/ntuser/useratom.c index ca72f6143d5..61b41648600 100644 --- a/subsystems/win32/win32k/ntuser/useratom.c +++ b/subsystems/win32/win32k/ntuser/useratom.c @@ -24,7 +24,7 @@ * PROGRAMER: Filip Navara */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/vis.c b/subsystems/win32/win32k/ntuser/vis.c index d82e384cbf2..f82ed555b72 100644 --- a/subsystems/win32/win32k/ntuser/vis.c +++ b/subsystems/win32/win32k/ntuser/vis.c @@ -24,7 +24,7 @@ * PROGRAMMER: Ge van Geldorp (ge@gse.nl) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/windc.c b/subsystems/win32/win32k/ntuser/windc.c index ed49ac6a920..bde42e1396c 100644 --- a/subsystems/win32/win32k/ntuser/windc.c +++ b/subsystems/win32/win32k/ntuser/windc.c @@ -9,7 +9,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -736,7 +736,7 @@ DceFreeWindowDCE(PWINDOW_OBJECT Window) else { DPRINT1("Not POWNED or CLASSDC hwndCurrent -> %x \n", pDCE->hwndCurrent); - //ASSERT(FALSE); + ASSERT(FALSE); } } else diff --git a/subsystems/win32/win32k/ntuser/window.c b/subsystems/win32/win32k/ntuser/window.c index f22c6dce047..4445fff8fed 100644 --- a/subsystems/win32/win32k/ntuser/window.c +++ b/subsystems/win32/win32k/ntuser/window.c @@ -10,7 +10,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -2333,11 +2333,6 @@ AllocErr: IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0); - /* By setting the flag below it can be examined to determine if the window - was created successfully and a valid pwnd was passed back to caller since - from here the function has to succeed. */ - Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED; - /* Send move and size messages. */ if (!(Window->state & WINDOWOBJECT_NEED_SIZE)) { @@ -2619,7 +2614,6 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) BOOLEAN isChild; PWND Wnd; HWND hWnd; - PTHREADINFO ti; ASSERT_REFS_CO(Window); // FIXME: temp hack? @@ -2639,8 +2633,8 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) return FALSE; } - /* If window was created successfully and it is hooked */ - if ((Wnd->state2 & WNDS2_WMCREATEMSGPROCESSED) && (ISITHOOKED(WH_CBT))) + /* Call hooks */ + if (ISITHOOKED(WH_CBT)) { if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hWnd, 0)) return FALSE; } @@ -2663,21 +2657,6 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) if (Window->pti->MessageQueue->CaptureWindow == Window->hSelf) Window->pti->MessageQueue->CaptureWindow = NULL; - /* - * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL - */ - - ti = PsGetCurrentThreadWin32Thread(); - - if ((ti != NULL) & (ti->pDeskInfo != NULL)) - { - if (ti->pDeskInfo->hShellWindow == hWnd) - { - DPRINT1("Destroying the ShellWindow!\n"); - ti->pDeskInfo->hShellWindow = NULL; - } - } - IntDereferenceMessageQueue(Window->pti->MessageQueue); IntEngWindowChanged(Window, WOC_DELETE); @@ -4284,8 +4263,8 @@ NtUserRegisterWindowMessage(PUNICODE_STRING MessageNameUnsafe) } Ret = (UINT)IntAddAtom(SafeMessageName.Buffer); - if (SafeMessageName.Buffer) - ExFreePoolWithTag(SafeMessageName.Buffer, TAG_STRING); + + ExFreePoolWithTag(SafeMessageName.Buffer, TAG_STRING); RETURN( Ret); CLEANUP: diff --git a/subsystems/win32/win32k/ntuser/winpos.c b/subsystems/win32/win32k/ntuser/winpos.c index ab45d978c41..13c58617279 100644 --- a/subsystems/win32/win32k/ntuser/winpos.c +++ b/subsystems/win32/win32k/ntuser/winpos.c @@ -27,7 +27,7 @@ */ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/ntuser/winsta.c b/subsystems/win32/win32k/ntuser/winsta.c index 2d26c8d39b7..a379a2f2655 100644 --- a/subsystems/win32/win32k/ntuser/winsta.c +++ b/subsystems/win32/win32k/ntuser/winsta.c @@ -33,7 +33,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/arc.c b/subsystems/win32/win32k/objects/arc.c index 58393036608..e1bbc89ea65 100644 --- a/subsystems/win32/win32k/objects/arc.c +++ b/subsystems/win32/win32k/objects/arc.c @@ -1,4 +1,4 @@ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/bezier.c b/subsystems/win32/win32k/objects/bezier.c index 3e20c292590..0071015ebe2 100644 --- a/subsystems/win32/win32k/objects/bezier.c +++ b/subsystems/win32/win32k/objects/bezier.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/bitblt.c b/subsystems/win32/win32k/objects/bitblt.c index 6261ab46697..a02d652ce1e 100644 --- a/subsystems/win32/win32k/objects/bitblt.c +++ b/subsystems/win32/win32k/objects/bitblt.c @@ -18,7 +18,7 @@ */ /* $Id: bitmaps.c 28300 2007-08-12 15:20:09Z tkreuzer $ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/bitmaps.c b/subsystems/win32/win32k/objects/bitmaps.c index f471a67e502..658b53dbb17 100644 --- a/subsystems/win32/win32k/objects/bitmaps.c +++ b/subsystems/win32/win32k/objects/bitmaps.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/brush.c b/subsystems/win32/win32k/objects/brush.c index c8682f6a849..6e827fa7bae 100644 --- a/subsystems/win32/win32k/objects/brush.c +++ b/subsystems/win32/win32k/objects/brush.c @@ -6,7 +6,7 @@ * PROGRAMER: */ -#include +#include #define NDEBUG #include @@ -709,7 +709,6 @@ NtGdiSetBrushOrg(HDC hDC, INT XOrg, INT YOrg, LPPOINT Point) pdcattr->ptlBrushOrigin.x = XOrg; pdcattr->ptlBrushOrigin.y = YOrg; - IntptlBrushOrigin(dc, XOrg, YOrg ); DC_UnlockDc(dc); return TRUE; diff --git a/subsystems/win32/win32k/objects/cliprgn.c b/subsystems/win32/win32k/objects/cliprgn.c index c5297c38ba2..acfc99b9a3f 100644 --- a/subsystems/win32/win32k/objects/cliprgn.c +++ b/subsystems/win32/win32k/objects/cliprgn.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/coord.c b/subsystems/win32/win32k/objects/coord.c index 7310dcb1adc..6b80f1d463e 100644 --- a/subsystems/win32/win32k/objects/coord.c +++ b/subsystems/win32/win32k/objects/coord.c @@ -27,7 +27,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include @@ -1133,16 +1133,6 @@ IntCalcFillOrigin(PDC pdc) return pdc->ptlFillOrigin.y; } -PPOINTL -FASTCALL -IntptlBrushOrigin(PDC pdc, LONG x, LONG y ) -{ - pdc->dclevel.ptlBrushOrigin.x = x; - pdc->dclevel.ptlBrushOrigin.y = y; - IntCalcFillOrigin(pdc); - return &pdc->dclevel.ptlBrushOrigin; -} - VOID APIENTRY GdiSetDCOrg(HDC hDC, LONG Left, LONG Top, PRECTL prc) diff --git a/subsystems/win32/win32k/objects/dcattr.c b/subsystems/win32/win32k/objects/dcattr.c index 9b445b1490c..562d75473d6 100644 --- a/subsystems/win32/win32k/objects/dcattr.c +++ b/subsystems/win32/win32k/objects/dcattr.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/dclife.c b/subsystems/win32/win32k/objects/dclife.c index 3791a6aaeb8..3837b78567d 100644 --- a/subsystems/win32/win32k/objects/dclife.c +++ b/subsystems/win32/win32k/objects/dclife.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #include #define NDEBUG @@ -119,8 +119,6 @@ DC_AllocDC(PUNICODE_STRING Driver) pdcattr->hlfntNew = NtGdiGetStockObject(SYSTEM_FONT); TextIntRealizeFont(pdcattr->hlfntNew,NULL); - NewDC->hlfntCur = pdcattr->hlfntNew; - NewDC->dclevel.plfnt = GDIOBJ_GetKernelObj(pdcattr->hlfntNew); NewDC->dclevel.hpal = NtGdiGetStockObject(DEFAULT_PALETTE); NewDC->dclevel.ppal = PALETTE_ShareLockPalette(NewDC->dclevel.hpal); @@ -588,59 +586,8 @@ DC_InitDC(HDC DCHandle) NtGdiSetVirtualResolution(DCHandle, 0, 0, 0, 0); } -BOOL -FASTCALL -MakeInfoDC(PDC pdc, BOOL bSet) -{ - PSURFACE pSurface; - SIZEL sizl; - - /* Can not be a display DC. */ - if (pdc->fs & DC_FLAG_DISPLAY) return FALSE; - if (bSet) - { - if (pdc->fs & DC_FLAG_TEMPINFODC || pdc->dctype == DC_TYPE_DIRECT) - return FALSE; - - pSurface = pdc->dclevel.pSurface; - pdc->fs |= DC_FLAG_TEMPINFODC; - pdc->pSurfInfo = pSurface; - pdc->dctype = DC_TYPE_INFO; - pdc->dclevel.pSurface = NULL; - - PDEV_sizl(pdc->ppdev, &sizl); - - if ( sizl.cx == pdc->dclevel.sizl.cx && - sizl.cy == pdc->dclevel.sizl.cy ) - return TRUE; - - pdc->dclevel.sizl.cx = sizl.cx; - pdc->dclevel.sizl.cy = sizl.cy; - } - else - { - if (!(pdc->fs & DC_FLAG_TEMPINFODC) || pdc->dctype != DC_TYPE_INFO) - return FALSE; - - pSurface = pdc->pSurfInfo; - pdc->fs &= ~DC_FLAG_TEMPINFODC; - pdc->dclevel.pSurface = pSurface; - pdc->dctype = DC_TYPE_DIRECT; - pdc->pSurfInfo = NULL; - - if ( !pSurface || - (pSurface->SurfObj.sizlBitmap.cx == pdc->dclevel.sizl.cx && - pSurface->SurfObj.sizlBitmap.cy == pdc->dclevel.sizl.cy) ) - return TRUE; - - pdc->dclevel.sizl.cx = pSurface->SurfObj.sizlBitmap.cx; - pdc->dclevel.sizl.cy = pSurface->SurfObj.sizlBitmap.cy; - } - return IntSetDefaultRegion(pdc); -} - /* -* @implemented +* @unimplemented */ BOOL APIENTRY @@ -648,14 +595,7 @@ NtGdiMakeInfoDC( IN HDC hdc, IN BOOL bSet) { - BOOL Ret; - PDC pdc = DC_LockDc(hdc); - if (pdc) - { - Ret = MakeInfoDC(pdc, bSet); - DC_UnlockDc(pdc); - return Ret; - } + UNIMPLEMENTED; return FALSE; } @@ -765,14 +705,32 @@ BOOL APIENTRY NtGdiDeleteObjectApp(HANDLE DCHandle) { - GDIOBJTYPE ObjType; + /* Complete all pending operations */ + NtGdiFlushUserBatch(); - /* Complete all pending operations */ - NtGdiFlushUserBatch(); + if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; - if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; + if (GDI_HANDLE_GET_TYPE(DCHandle) != GDI_OBJECT_TYPE_DC) + return GreDeleteObject((HGDIOBJ) DCHandle); - if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; + if (IsObjectDead((HGDIOBJ)DCHandle)) return TRUE; + + if (!GDIOBJ_OwnedByCurrentProcess(DCHandle)) + { + SetLastWin32Error(ERROR_INVALID_HANDLE); + return FALSE; + } + + return IntGdiDeleteDC(DCHandle, FALSE); +} + +BOOL +APIENTRY +NewNtGdiDeleteObjectApp(HANDLE DCHandle) +{ + GDIOBJTYPE ObjType; + + if (GDI_HANDLE_IS_STOCKOBJ(DCHandle)) return TRUE; ObjType = GDI_HANDLE_GET_TYPE(DCHandle) >> GDI_ENTRY_UPPER_SHIFT; diff --git a/subsystems/win32/win32k/objects/dcobjs.c b/subsystems/win32/win32k/objects/dcobjs.c index 0bafaadd159..e35fa717bdd 100644 --- a/subsystems/win32/win32k/objects/dcobjs.c +++ b/subsystems/win32/win32k/objects/dcobjs.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include @@ -110,9 +110,6 @@ DC_vUpdateTextBrush(PDC pdc) { PDC_ATTR pdcattr = pdc->pdcattr; - if(pdcattr->ulDirty_ & DIRTY_TEXT) - EBRUSHOBJ_vUpdate(&pdc->eboText, pdc->eboText.pbrush, pdc); - /* Update the eboText's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboText, pdcattr->crForegroundClr); @@ -126,9 +123,6 @@ DC_vUpdateBackgroundBrush(PDC pdc) { PDC_ATTR pdcattr = pdc->pdcattr; - if(pdcattr->ulDirty_ & DIRTY_BACKGROUND) - EBRUSHOBJ_vUpdate(&pdc->eboBackground, pdc->eboBackground.pbrush, pdc); - /* Update the eboBackground's solid color */ EBRUSHOBJ_vSetSolidBrushColor(&pdc->eboBackground, pdcattr->crBackgroundClr); diff --git a/subsystems/win32/win32k/objects/dcstate.c b/subsystems/win32/win32k/objects/dcstate.c index 1b97ae7aca9..9e491a4f0b1 100644 --- a/subsystems/win32/win32k/objects/dcstate.c +++ b/subsystems/win32/win32k/objects/dcstate.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/dcutil.c b/subsystems/win32/win32k/objects/dcutil.c index f856ea19bda..9721af3147f 100644 --- a/subsystems/win32/win32k/objects/dcutil.c +++ b/subsystems/win32/win32k/objects/dcutil.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include @@ -125,71 +125,6 @@ IntIsPrimarySurface(SURFOBJ *SurfObj) } #endif -BOOL -FASTCALL -IntSetDefaultRegion(PDC pdc) -{ - PSURFACE pSurface; - PROSRGNDATA prgn; - RECTL rclWnd, rclClip; - - IntGdiReleaseRaoRgn(pdc); - - rclWnd.left = 0; - rclWnd.top = 0; - rclWnd.right = pdc->dclevel.sizl.cx; - rclWnd.bottom = pdc->dclevel.sizl.cy; - rclClip = rclWnd; - -// EngAcquireSemaphoreShared(pdc->ppdev->hsemDevLock); - if (pdc->ppdev->flFlags & PDEV_META_DEVICE) - { - pSurface = pdc->dclevel.pSurface; - if (pSurface && pSurface->flFlags & PDEV_SURFACE) - { - rclClip.left += pdc->ppdev->ptlOrigion.x; - rclClip.top += pdc->ppdev->ptlOrigion.y; - rclClip.right += pdc->ppdev->ptlOrigion.x; - rclClip.bottom += pdc->ppdev->ptlOrigion.y; - } - } -// EngReleaseSemaphore(pdc->ppdev->hsemDevLock); - - prgn = pdc->prgnVis; - - if (prgn && prgn != prgnDefault) - { - REGION_SetRectRgn( prgn, - rclClip.left, - rclClip.top, - rclClip.right , - rclClip.bottom ); - } - else - { - prgn = IntSysCreateRectpRgn( rclClip.left, - rclClip.top, - rclClip.right , - rclClip.bottom ); - pdc->prgnVis = prgn; - } - - if (prgn) - { - pdc->ptlDCOrig.x = 0; - pdc->ptlDCOrig.y = 0; - pdc->erclWindow = rclWnd; - pdc->erclClip = rclClip; - /* Might be an InitDC or DCE....*/ - pdc->ptlFillOrigin.x = pdc->dcattr.VisRectRegion.Rect.right; - pdc->ptlFillOrigin.y = pdc->dcattr.VisRectRegion.Rect.bottom; - return TRUE; - } - - pdc->prgnVis = prgnDefault; - return FALSE; -} - BOOL APIENTRY NtGdiCancelDC(HDC hDC) diff --git a/subsystems/win32/win32k/objects/device.c b/subsystems/win32/win32k/objects/device.c index b8d322f09ac..40a79562ede 100644 --- a/subsystems/win32/win32k/objects/device.c +++ b/subsystems/win32/win32k/objects/device.c @@ -6,7 +6,7 @@ * PROGRAMER: Timo Kreuzer (timo.kreuzer@rectos.org) */ -#include +#include #define NDEBUG #include @@ -19,22 +19,6 @@ static KEVENT VideoDriverNeedsPreparation; static KEVENT VideoDriverPrepared; PDC defaultDCstate = NULL; -PSIZEL -FASTCALL -PDEV_sizl(PPDEVOBJ ppdev, PSIZEL psizl) -{ - if (ppdev->flFlags & PDEV_META_DEVICE) - { - psizl->cx = ppdev->ulHorzRes; - psizl->cy = ppdev->ulVertRes; - } - else - { - psizl->cx = ppdev->gdiinfo.ulHorzRes; - psizl->cy = ppdev->gdiinfo.ulVertRes; - } - return psizl; -} NTSTATUS FASTCALL InitDcImpl(VOID) diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c index 2ec35e6ee4a..cc2a16efb2f 100644 --- a/subsystems/win32/win32k/objects/dibobj.c +++ b/subsystems/win32/win32k/objects/dibobj.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/drawing.c b/subsystems/win32/win32k/objects/drawing.c index 0cc9a23200d..073ee1a97f7 100755 --- a/subsystems/win32/win32k/objects/drawing.c +++ b/subsystems/win32/win32k/objects/drawing.c @@ -49,7 +49,7 @@ SUCH DAMAGE. Modified for ReactOS */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/fillshap.c b/subsystems/win32/win32k/objects/fillshap.c index aa133f87f52..7da05400637 100644 --- a/subsystems/win32/win32k/objects/fillshap.c +++ b/subsystems/win32/win32k/objects/fillshap.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/font.c b/subsystems/win32/win32k/objects/font.c index a0837e1d24a..41a75cdb43f 100644 --- a/subsystems/win32/win32k/objects/font.c +++ b/subsystems/win32/win32k/objects/font.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include @@ -251,49 +251,6 @@ RealizeFontInit(HFONT hFont) return pTextObj; } -HFONT -FASTCALL -GreSelectFont( HDC hDC, HFONT hFont) -{ - PDC pdc; - PDC_ATTR pdcattr; - PTEXTOBJ pOrgFnt, pNewFnt = NULL; - HFONT hOrgFont = NULL; - - if (!hDC || !hFont) return NULL; - - pdc = DC_LockDc(hDC); - if (!pdc) - { - return NULL; - } - - if (NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL))) - { - /* LFONTOBJ use share and locking. */ - pNewFnt = TEXTOBJ_LockText(hFont); - pdcattr = pdc->pdcattr; - pOrgFnt = pdc->dclevel.plfnt; - if (pOrgFnt) - { - hOrgFont = pOrgFnt->BaseObject.hHmgr; - } - else - { - hOrgFont = pdcattr->hlfntNew; - } - pdc->dclevel.plfnt = pNewFnt; - pdc->hlfntCur = hFont; - pdcattr->hlfntNew = hFont; - pdcattr->ulDirty_ |= DIRTY_CHARSET; - pdcattr->ulDirty_ &= ~SLOW_WIDTHS; - } - - if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt); - DC_UnlockDc(pdc); - return hOrgFont; -} - /** Functions ******************************************************************/ INT @@ -976,7 +933,30 @@ NtGdiSelectFont( IN HDC hDC, IN HFONT hFont) { - return GreSelectFont(hDC, hFont); + PDC pDC; + PDC_ATTR pdcattr; + HFONT hOrgFont = NULL; + + if (hDC == NULL || hFont == NULL) return NULL; + + pDC = DC_LockDc(hDC); + if (!pDC) + { + return NULL; + } + + pdcattr = pDC->pdcattr; + + /* FIXME: what if not successful? */ + if(NT_SUCCESS(TextIntRealizeFont((HFONT)hFont,NULL))) + { + hOrgFont = pdcattr->hlfntNew; + pdcattr->hlfntNew = hFont; + } + + DC_UnlockDc(pDC); + + return hOrgFont; } diff --git a/subsystems/win32/win32k/objects/freetype.c b/subsystems/win32/win32k/objects/freetype.c index 478863d6c13..fea0c101ee9 100644 --- a/subsystems/win32/win32k/objects/freetype.c +++ b/subsystems/win32/win32k/objects/freetype.c @@ -35,7 +35,7 @@ /** Includes ******************************************************************/ -#include +#include #include #include FT_FREETYPE_H diff --git a/subsystems/win32/win32k/objects/gdibatch.c b/subsystems/win32/win32k/objects/gdibatch.c index 11d3628b67d..b958ad4835d 100644 --- a/subsystems/win32/win32k/objects/gdibatch.c +++ b/subsystems/win32/win32k/objects/gdibatch.c @@ -1,5 +1,5 @@ -#include +#include #define NDEBUG #include @@ -106,10 +106,9 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) case GdiBCSetBrushOrg: { PGDIBSSETBRHORG pgSBO; - if (!dc) break; + if(!dc) break; pgSBO = (PGDIBSSETBRHORG) pHdr; pdcattr->ptlBrushOrigin = pgSBO->ptlBrushOrigin; - IntptlBrushOrigin(dc, pgSBO->ptlBrushOrigin.x, pgSBO->ptlBrushOrigin.y); break; } case GdiBCExtSelClipRgn: @@ -117,34 +116,10 @@ GdiFlushUserBatch(PDC dc, PGDIBATCHHDR pHdr) case GdiBCSelObj: { PGDIBSOBJECT pgO; - PTEXTOBJ pOrgFnt, pNewFnt = NULL; - HFONT hOrgFont = NULL; - - if (!dc) break; + if(!dc) break; pgO = (PGDIBSOBJECT) pHdr; - - if (NT_SUCCESS(TextIntRealizeFont((HFONT)pgO->hgdiobj,NULL))) - { - /* LFONTOBJ use share and locking. */ - pNewFnt = TEXTOBJ_LockText(pgO->hgdiobj); - - pOrgFnt = dc->dclevel.plfnt; - if (pOrgFnt) - { - hOrgFont = pOrgFnt->BaseObject.hHmgr; - } - else - { - hOrgFont = pdcattr->hlfntNew; - } - dc->dclevel.plfnt = pNewFnt; - dc->hlfntCur = pgO->hgdiobj; - pdcattr->hlfntNew = pgO->hgdiobj; - pdcattr->ulDirty_ |= DIRTY_CHARSET; - pdcattr->ulDirty_ &= ~SLOW_WIDTHS; - } - if (pNewFnt) TEXTOBJ_UnlockText(pNewFnt); - break; + TextIntRealizeFont((HFONT) pgO->hgdiobj, NULL); + pdcattr->ulDirty_ &= ~(DIRTY_CHARSET); } case GdiBCDelRgn: DPRINT("Delete Region Object!\n"); diff --git a/subsystems/win32/win32k/objects/gdidbg.c b/subsystems/win32/win32k/objects/gdidbg.c index efa686fc06b..a9991ad3610 100644 --- a/subsystems/win32/win32k/objects/gdidbg.c +++ b/subsystems/win32/win32k/objects/gdidbg.c @@ -3,48 +3,23 @@ #define KeRosDumpStackFrames(Frames, Count) KdSystemDebugControl('DsoR', (PVOID)Frames, Count, NULL, 0, NULL, KernelMode) NTSYSAPI ULONG APIENTRY RtlWalkFrameChain(OUT PVOID *Callers, IN ULONG Count, IN ULONG Flags); -#define GDI_STACK_LEVELS 20 -static ULONG_PTR GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG_PTR GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG_PTR GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; -static ULONG_PTR GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static int leak_reported = 0; +#define GDI_STACK_LEVELS 12 +static ULONG GDIHandleAllocator[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG GDIHandleLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG GDIHandleShareLocker[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; +static ULONG GDIHandleDeleter[GDI_HANDLE_COUNT][GDI_STACK_LEVELS+1]; struct DbgOpenGDIHandle { ULONG idx; int count; }; -#define MAX_BACKTRACES 1024 -static struct DbgOpenGDIHandle AllocatorTable[MAX_BACKTRACES]; - -static -BOOL -CompareBacktraces(ULONG idx1, ULONG idx2) -{ - ULONG iLevel; - - /* Loop all stack levels */ - for (iLevel = 0; iLevel < GDI_STACK_LEVELS; iLevel++) - { - if (GDIHandleAllocator[idx1][iLevel] - != GDIHandleAllocator[idx2][iLevel]) -// if (GDIHandleShareLocker[idx1][iLevel] -// != GDIHandleShareLocker[idx2][iLevel]) - { - return FALSE; - } - } - - return TRUE; -} - -#define IS_HANDLE_VALID(idx) \ - ((GdiHandleTable->Entries[idx].Type & GDI_ENTRY_BASETYPE_MASK) != 0) +#define H 1024 +static struct DbgOpenGDIHandle h[H]; void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) { - static int leak_reported = 0; - int i, j, idx, nTraces = 0; - KIRQL OldIrql; + int i, n = 0, j, k, J; if (leak_reported) { @@ -55,79 +30,68 @@ void IntDumpHandleTable(PGDI_HANDLE_TABLE HandleTable) leak_reported = 1; DPRINT1("reporting gdi handle abusers:\n"); - /* We've got serious business to do */ - KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - - /* Step through GDI handle table and find out who our culprit is... */ - for (idx = RESERVE_ENTRIES_COUNT; idx < GDI_HANDLE_COUNT; idx++) + /* step through GDI handle table and find out who our culprit is... */ + for (i = RESERVE_ENTRIES_COUNT; i < GDI_HANDLE_COUNT; i++) { - /* If the handle is free, continue */ - if (!IS_HANDLE_VALID(idx)) continue; - - /* Step through all previous backtraces */ - for (j = 0; j < nTraces; j++) + for (j = 0; j < n; j++) { - /* Check if the backtrace matches */ - if (CompareBacktraces(idx, AllocatorTable[j].idx)) +next: + J = h[j].idx; + for (k = 0; k < GDI_STACK_LEVELS; k++) { - /* It matches, increment count and break out */ - AllocatorTable[j].count++; - break; + if (GDIHandleAllocator[i][k] + != GDIHandleAllocator[J][k]) + { + if (++j == n) + goto done; + else + goto next; + } } + goto done; } - - /* Did we find a new backtrace? */ - if (j == nTraces) +done: + if (j < H) { - /* Break out, if we reached the maximum */ - if (nTraces == MAX_BACKTRACES) break; - - /* Initialize this entry */ - AllocatorTable[j].idx = idx; - AllocatorTable[j].count = 1; - nTraces++; + if (j == n) + { + h[j].idx = i; + h[j].count = 1; + n = n + 1; + } + else + h[j].count++; } } - /* bubble sort time! weeeeee!! */ - for (i = 0; i < nTraces-1; i++) + for (i = 0; i < n-1; i++) { - if (AllocatorTable[i].count < AllocatorTable[i+1].count) + if (h[i].count < h[i+1].count) { - struct DbgOpenGDIHandle temp; - - temp = AllocatorTable[i+1]; - AllocatorTable[i+1] = AllocatorTable[i]; + struct DbgOpenGDIHandle t; + t = h[i+1]; + h[i+1] = h[i]; j = i; - while (j > 0 && AllocatorTable[j-1].count < temp.count) + while (j > 0 && h[j-1].count < t.count) j--; - AllocatorTable[j] = temp; + h[j] = t; } } - - /* Print the worst offenders... */ - DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", nTraces); - for (i = 0; i < nTraces && AllocatorTable[i].count > 1; i++) + /* print the worst offenders... */ + DbgPrint("Worst GDI Handle leak offenders (out of %i unique locations):\n", n); + for (i = 0; i < n && h[i].count > 1; i++) { /* Print out the allocation count */ - DbgPrint(" %i allocs, type = 0x%lx:\n", - AllocatorTable[i].count, - GdiHandleTable->Entries[AllocatorTable[i].idx].Type); + DbgPrint(" %i allocs: ", h[i].count); /* Dump the frames */ - KeRosDumpStackFrames(GDIHandleAllocator[AllocatorTable[i].idx], GDI_STACK_LEVELS); - //KeRosDumpStackFrames(GDIHandleShareLocker[AllocatorTable[i].idx], GDI_STACK_LEVELS); + KeRosDumpStackFrames(GDIHandleAllocator[h[i].idx], GDI_STACK_LEVELS); /* Print new line for better readability */ DbgPrint("\n"); } - - if (i < nTraces) + if (i < n && h[i].count == 1) DbgPrint("(list terminated - the remaining entries have 1 allocation only)\n"); - - KeLowerIrql(OldIrql); - - ASSERT(FALSE); } ULONG @@ -137,13 +101,11 @@ CaptureStackBackTace(PVOID* pFrames, ULONG nFramesToCapture) memset(pFrames, 0x00, (nFramesToCapture + 1) * sizeof(PVOID)); - nFrameCount = RtlWalkFrameChain(pFrames, nFramesToCapture, 0); + nFrameCount = RtlCaptureStackBackTrace(1, nFramesToCapture, pFrames, NULL); if (nFrameCount < nFramesToCapture) { - nFrameCount += RtlWalkFrameChain(pFrames + nFrameCount, - nFramesToCapture - nFrameCount, - 1); + nFrameCount += RtlWalkFrameChain(pFrames + nFrameCount, nFramesToCapture - nFrameCount, 1); } return nFrameCount; diff --git a/subsystems/win32/win32k/objects/gdiobj.c b/subsystems/win32/win32k/objects/gdiobj.c index 0f73d9b57cf..5af1413e69a 100644 --- a/subsystems/win32/win32k/objects/gdiobj.c +++ b/subsystems/win32/win32k/objects/gdiobj.c @@ -10,7 +10,7 @@ //#define GDI_DEBUG -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/icm.c b/subsystems/win32/win32k/objects/icm.c index dd99ea3d89d..7a32146c0cb 100644 --- a/subsystems/win32/win32k/objects/icm.c +++ b/subsystems/win32/win32k/objects/icm.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/line.c b/subsystems/win32/win32k/objects/line.c index 173b3f91b25..bbf60f426c4 100644 --- a/subsystems/win32/win32k/objects/line.c +++ b/subsystems/win32/win32k/objects/line.c @@ -17,7 +17,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/metafile.c b/subsystems/win32/win32k/objects/metafile.c index dbc62840154..573dde4b9dd 100644 --- a/subsystems/win32/win32k/objects/metafile.c +++ b/subsystems/win32/win32k/objects/metafile.c @@ -8,7 +8,7 @@ /* INCLUDES ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/palette.c b/subsystems/win32/win32k/objects/palette.c index 8fcbbe4077c..61a50ec7ea7 100644 --- a/subsystems/win32/win32k/objects/palette.c +++ b/subsystems/win32/win32k/objects/palette.c @@ -7,7 +7,7 @@ * Timo Kreuzer */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/path.c b/subsystems/win32/win32k/objects/path.c index 7d6c796bdce..1dfca39b381 100644 --- a/subsystems/win32/win32k/objects/path.c +++ b/subsystems/win32/win32k/objects/path.c @@ -32,7 +32,7 @@ * PROGRAMMER: */ -#include +#include #include "math.h" #define NDEBUG diff --git a/subsystems/win32/win32k/objects/pen.c b/subsystems/win32/win32k/objects/pen.c index 8d02e9bdb0a..6f604658107 100644 --- a/subsystems/win32/win32k/objects/pen.c +++ b/subsystems/win32/win32k/objects/pen.c @@ -20,7 +20,7 @@ * $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/polyfill.c b/subsystems/win32/win32k/objects/polyfill.c index 1f6196a53af..f5fdc53ed3f 100644 --- a/subsystems/win32/win32k/objects/polyfill.c +++ b/subsystems/win32/win32k/objects/polyfill.c @@ -27,7 +27,7 @@ * 21/2/2003: Created */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/print.c b/subsystems/win32/win32k/objects/print.c index bf21047292f..bc56a2f3845 100644 --- a/subsystems/win32/win32k/objects/print.c +++ b/subsystems/win32/win32k/objects/print.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/rect.c b/subsystems/win32/win32k/objects/rect.c index ea58e63f0a9..d98e79ca2dd 100644 --- a/subsystems/win32/win32k/objects/rect.c +++ b/subsystems/win32/win32k/objects/rect.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/region.c b/subsystems/win32/win32k/objects/region.c index 165f86a1625..3922016c338 100644 --- a/subsystems/win32/win32k/objects/region.c +++ b/subsystems/win32/win32k/objects/region.c @@ -113,7 +113,7 @@ SOFTWARE. * the y-x-banding that's so nice to have... */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/stockobj.c b/subsystems/win32/win32k/objects/stockobj.c index 5499a6fd956..40708b6ea1b 100644 --- a/subsystems/win32/win32k/objects/stockobj.c +++ b/subsystems/win32/win32k/objects/stockobj.c @@ -22,7 +22,7 @@ * */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/text.c b/subsystems/win32/win32k/objects/text.c index 07cf12dcf21..14376a131ae 100644 --- a/subsystems/win32/win32k/objects/text.c +++ b/subsystems/win32/win32k/objects/text.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/wingl.c b/subsystems/win32/win32k/objects/wingl.c index 72add55b52b..150a762a151 100644 --- a/subsystems/win32/win32k/objects/wingl.c +++ b/subsystems/win32/win32k/objects/wingl.c @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/objects/xformobj.c b/subsystems/win32/win32k/objects/xformobj.c index 9ba7311ef06..74453d58168 100644 --- a/subsystems/win32/win32k/objects/xformobj.c +++ b/subsystems/win32/win32k/objects/xformobj.c @@ -8,7 +8,7 @@ /** Includes ******************************************************************/ -#include +#include #define NDEBUG #include diff --git a/subsystems/win32/win32k/pch.h b/subsystems/win32/win32k/pch.h index 90075c80058..4bbbeb9c148 100644 --- a/subsystems/win32/win32k/pch.h +++ b/subsystems/win32/win32k/pch.h @@ -60,7 +60,7 @@ typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES; #include /* Internal Win32K Header */ -#include "include/win32kp.h" +#include "include/win32k.h" /* Undocumented stuff */ typedef DRIVEROBJ *PDRIVEROBJ; diff --git a/subsystems/win32/win32k/stubs/stubs.c b/subsystems/win32/win32k/stubs/stubs.c index 82a8555354a..a1e610bbd6c 100644 --- a/subsystems/win32/win32k/stubs/stubs.c +++ b/subsystems/win32/win32k/stubs/stubs.c @@ -2,7 +2,7 @@ * Stubs for unimplemented WIN32K.SYS exports */ -#include +#include #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/subsystems/win32/win32k/stubs/umpdstubs.c b/subsystems/win32/win32k/stubs/umpdstubs.c index 9ecafb906af..3ceadbb6e8c 100644 --- a/subsystems/win32/win32k/stubs/umpdstubs.c +++ b/subsystems/win32/win32k/stubs/umpdstubs.c @@ -1,4 +1,4 @@ -#include +#include #define UNIMPLEMENTED DbgPrint("(%s:%i) WIN32K: %s UNIMPLEMENTED\n", __FILE__, __LINE__, __FUNCTION__ ) diff --git a/subsystems/win32/win32k/win32k.h b/subsystems/win32/win32k/w32k.h similarity index 100% rename from subsystems/win32/win32k/win32k.h rename to subsystems/win32/win32k/w32k.h -- 2.17.1